博文

重拾博客

时光荏苒。难以置信,今年已经是 2018 年了。

回望过去的日子,感慨良多。总感觉有很多话想说,但又不知从何说起。

我已经好长时间没有写这个博客了。上一篇博文貌似还是 2015 年写的,那时我还在上高中呢,而现在的我已经大三了。现在回头去看之前我写过的那些博文,感觉真的是幼稚至极,充满了无数的想当然和幼稚的所谓「思考」,很多文章现在读来甚至让我羞赧不已。现在想来,几年前,在我这个博客最多产的时期,我几乎每天都要写一篇博文,最终积累了有 200 多篇文章。其中有的是我从网上看到的比较好的内容的摘抄和总结,但更多的是我的日常思考、想法和感悟。后者其实就是日记,它们其实并不适合放在博客上向所有人公开。我已经把它们从博客上撤下,收进了自己的日记本,作为永远的留念;虽然这些文章幼稚得我都不忍去读它们,但它们对我来说却非常宝贵——它们是那段时光的见证,见证了至少我也曾经幼稚过 :) 现在这个博客上剩下的之前的文章,基本都是一些摘抄和技术总结之类的文章,其实现在看来也没什么太大的价值了。
很多次我都想给这个博客来个大清理,把过去我那段「幼稚时期」写的博文全部撤下,忘掉过去那段不堪回首的时光,从头开始。但每当我想要动手的时候,看到它们,却又不忍心去做——那些文章,它们就像是那段时光的印记,见证了我这个博客的历史,我不忍心将它们从这个博客上抹除,即便只是给它们搬一个家而已。
最近,我又重燃起了写博客的想法。我写博客,就是记录一下自己的一些感悟、思考和看法,没有什么目的性,就是纯粹地享受写作的过程,这就够了。我觉得,这才是回归了博客的本质吧。
2018 年 9 月 30 日 上午 10:00 于家中

★★★===【新旧博文分界线】===★★★

本文为新旧博文分界线。

本文以下(以前)的博文均为我上大学之前(高中期间)写的博文,本文以上(之后)的博文均为我上大学之后写的博文。

安装 Windows 7 家庭高级版以及一些设置

今天给我的笔记本电脑安装好了 Windows 7 家庭高级版(Home Premium Edition) 64-bit。这里记录下安装过程。

一、去MSDN下载系统镜像 如果购买正版光盘,这一步就可以跳过了。
去MSDN下载 简体中文版 Windows 7 Home Premium Edition with SP1 的 ISO 镜像。

二、刻录U盘安装盘 如果购买正版光盘,这一步就可以跳过了。
根据编程随想的推荐,使用 rufus 将ISO镜像刻录到U盘上。

三、安装win7 使用U盘安装系统。

四、安装驱动 首先下载自己电脑厂商提供的驱动管理软件。比如我的笔记本是联想的,就去联想官网下载联想驱动管理,然后一键检测安装必要的驱动程序。当然诸如联想通行证之类的东西就不用装了。然后去硬件厂商官网下载显卡和声卡驱动并安装。尤其是 NVIDIA 显卡驱动,太重要了,一定要从官网下载来之后单独装。

五、升级IE,安装中文输入法 去微软官网升级IE浏览器到最新版本;下载并安装中文输入法,如必应拼音输入法、谷歌拼音输入法。

六、安装 EasyBCD 并修复 bootloader 如果电脑上只有 Windows 这一个系统,这一步就可以跳过了。
我的电脑是 Windows + Ubuntu 双系统,因此在安装完 Windows 后 grub 引导程序会不见,因此需要使用 EasyBCD 修复 bootloader 。

七、OEM7激活 如果购买正版光盘,这一步就可以跳过了。
使用 OEM7(小马激活)激活 Windows 7。

八、系统更新 打开 Windows Update,下载并安装全部更新。

九、制作系统备份 使用 Windows 7 自带的系统备份功能制作一个备份,以便日后需要时恢复。

十、安装常用软件 我安装的软件如下:
7-Zip
Chrome
网易云音乐
ADSafe
迅雷
foobar2000
sublime text
notepad++

C语言学习笔记:为什么&相当于升级而*相当于降级?

最近一直在学习北京大学李戈老师在Coursera上的MOOC课程《计算概论A》。在课程的后半部分讲到了C语言的指针运算符&和*在数组中的应用。课程中李戈老师通过分析讲解和引用C语言规范文档清晰地讲清楚了这两个运算符的含义,并给出了三条非常重要的结论:

1. 数组名相当于指向数组第一个元素的指针;

2. &E相当于把E的管辖范围上升了一个级别;

3. *E相当于把E的管辖范围下降了一个级别。

利用这三条结论,我们可以非常方便且准确地分析指针运算符在数组中应用时的含义,因此这三条结论十分重要。这三条结论不仅值得花时间记下来,也值得花时间真正搞清楚为什么是这样的,这样才不至于死记硬背。在这里,我根据李戈老师的讲解,用中文将此处知识整理一下,便于学习和复习。

两条事实
由于多维数组实质上就是嵌套(nested)数组,所谓的“多维”不过是基于这样一个事实:数组也可以作为数组之中的元素。

&运算符只能用在实体(就是变量)前面,*运算符只能用在指针前面。

什么是“表达式E的管辖范围(级别)”?
上述结论中涉及到了这样一个概念:“表达式E的管辖范围”,也就是“表达式E的级别”。那么,什么是所谓的“管辖范围”和“级别”呢?

以整型二维数组a[i][j]为例。以下表达式的“管辖范围”(“级别”)依次降低:

&a 指针,指向整个二维数组a
a 指针,指向二维数组a的第一个元素(一维数组a[0])
*a 指针,指向二维数组a的第一个元素(一维数组a[0])中的第一个元素(int变量 a[0][0])
*a[0] int变量,就是a[0][0]

其中前三者(都是指针)存储的值都是该二维数组a的第一行的首个元素的起始地址,但区别在于所指的“范围”不同。当对它们进行+1运算的时候,跨过的范围是不同的。

通俗地说,指针化的程度越高,表示的范围越大,级别越高。

为什么&表示升级?
首先,当&用在多维数组中最基本的元素(而不是数组名,如本例中的a[0][0])前面的时候,情况是最简单的:整个表达式表示指向这个元素的指针。

而当&用在一个数组名前面的时候,由于&运算符只能用在实体(变量)前面,而根据结论1,一个数组的名字(如本例中二维数组的名字a和一维数组的名字a[0])实质上就是指向该数组第一个元素的指针,因此在&后接一个数组名(如本例中…

Android应用为什么这么喜欢驻留后台?

我的Nexus 5上安装了许多应用,最近却发觉手机掉电非常厉害,在待机状态下后盖居然都发热,于是安装了广受好评的“绿色守护”应用,并在搜索引擎上找到并读了这篇文章,学到了不少东西。

  关于Android的后台运行机制,其中涉及到一些技术层面的细节,对于一般用户来说确实比较难以理解。它和其他学科一样,也有着自己的知识体系结构。要想透彻地理解并掌握其中的原理,同样需要系统而认真的学习,因此指望着用一两句话就给一个不懂技术的普通用户讲明白这些知识是不大可能的。事实上,这本来也不应该是用户去操心的事——在这一点上,iOS的处理机制就完胜Android了:iOS通过在系统层面强制统一管理消息推送并禁止应用自行驻留后台的处理方式,完美地解决了消息推送与驻留后台这对矛盾。

  值得一提的是,iOS为了实现统一管理消息推送,Apple需要自己掏钱来维护自家的消息推送服务器。虽然Google也为Android平台提供了类似的服务(即GCM,全称为Google Cloud Messaging for Android),但由于Google并未对Android应用的消息推送方式实行强制的统一管理(事实上,由于Android系统的开源特性,这种做法也不现实),再加上Google在中国大陆的特殊情况,Android应用都喜欢通过自己驻留后台的方式来接收消息推送也就不足为奇了。

别用Windows了,拥抱开源操作系统

图片
为啥不再用Windows
价格太高
微软向来被戏称为“M$”,其Windows操作系统和Office系列办公软件贵得离谱,而这两种软件恰好又是我们每天用的最多的软件。虽然在中国,盗版操作系统和软件相当普及:随便去一家电脑城装个系统,一键GHOST,连Windows和Office都有了,但系统更新和维护又没有保障。既然有开源、免费、社区维护的Linux操作系统,为什么还要用Windows呢?

太臃肿
  Windows系统有个人尽皆知的特点:越用越慢。当时我买的正版Windows 7家庭版操作系统,用了这一年多,现在都慢成什么样子了,简直不忍直视:开机进入桌面后要等上10~20秒钟才能开始操作;打字的时候键盘都按完了,好几秒钟之后屏幕上才跳出字来。原先还不太明显,最近一阵子卡得我实在是没耐心了,说什么也换了Ubuntu,实在是受不了Win7的迟钝反应了!

开发环境不如类UNIX系统
  这一点对于非开发者来说倒是不太明显。不过最近我在Udacity上学习一些软件和Web开发课程时,才深切体会到“Windows是最烂的开发平台”这句话的含意。有兴趣的去搜索引擎上搜一下“为什么说Windows是最烂的开发平台”,自己看一看吧。
不过……
  Windows也不是一无是处。好多游戏都是针对Windows平台开发的,如果你喜欢玩游戏的话,就一定要用Windows了。另外,如果你喜欢经常打开XX卫士给电脑扫描、体检、评分,那Linux也是不适合你滴。 :) 此外,我实在是想不出还要用Windows而不用Linux的理由了。
安装Ubuntu操作系统
  在众多的Linux发行版(distributions)中,最受大众欢迎、操作最简单、体验也最好的版本当属Ubuntu了。这个系统在国外的普及率是相当高的(估计大家也都不愿意花钱,或者是受够了M$的压榨了:)),而在国内知名度并不高。Ubuntu的安装方法很多,但最省心的办法还是从光盘安装,就像装Windows一样。下面开始安装。
  首先登录Ubuntu的官网(www.ubuntu.com),进入Download栏目,下载Ubuntu操作系统的光盘镜像(.iso)文件(32位和64位随意)。下载完毕后把光盘镜像文件刻录到DVD光盘上。(刻录的时候注意,不能把.iso文件解压缩之后再刻录,必须再刻录软件中选择“刻录光盘镜像文件”…

Learning at Udacity: My First Applied Python Code!

Woo-hoo! I've just finished my first applied Python code -- the code below returns the days between two given dates.

Congratulations to myself! :) I think this is a really tricky problem for a newbie programmer. However, with the instructions by my instructor Dave at Udacity, I finally made it! :D

The most important thing I've learned through this project is that we should break big, scaring problems down to smaller sections, then focus on solving those sections. This is pretty familiar to everyone, but I must say that I've never experienced the importance of this principle until I've done this project.


def isLeapYear(year):     if year % 100 == 0:         if year % 400 == 0:             return True     else:         if year % 4 == 0:             return True     return False def daysInMonth(year, month):     if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12:         return 31     if month == 4 or month == 6 or month == 9 or month ==…