软件开发基础知识

版本:v1.2

Crifan Li

摘要

本文主要介绍了软件开发的相关基础知识,主要包括上层软件和嵌入式方面的,比如Cygwin,Windows中的cmd,环境变量,注册表编辑器regedit,Linux的shell,开源协议,Java等。并且推荐了一些值得看的资料。

[提示] 本文提供多种格式供:
在线阅读 HTML HTMLs PDF CHM TXT RTF WEBHELP
下载(7zip压缩包) HTML HTMLs PDF CHM TXT RTF WEBHELP

HTML版本的在线地址为:

http://www.crifan.com/files/doc/docbook/soft_dev_basic/release/html/soft_dev_basic.html

有任何意见,建议,提交bug等,都欢迎去讨论组发帖讨论:

http://www.crifan.com/bbs/categories/soft_dev_basic/

2015-04-24

修订历史
修订 1.2 2015-04-24 crl
  1. 将Cygwin单独整理出独立的book
  2. 添加其他一些软件开发基础知识
  3. 把部分图片从skydrive地址改为本地地址
  4. 更新嵌入式系列教程
修订 0.8 2012-11-26 crl
  1. 完成此文逻辑框架
  2. 添加了windows下的环境变量部分的内容
  3. 添加了Cygwin的内容
  4. 添加了Cygwin中的工具和小技巧
  5. 添加了Windows的regedit和cmd
  6. 添加了Windows的Microsoft .NET Framework

目录

前言
1. 本文目的
2. 待完成
1. 软件开发简介
1.1. 常见的计算机语言简介和总结
1.2. 计算机编程语言基础知识
2. 通用软件开发基础知识
2.1. Cygwin
2.2. Windows
2.2.1. Windows的注册表编辑器:regedit
2.2.2. Windows的命令行工具: cmd
2.2.2.1. cmd简介
2.2.2.2. cmd的基本用法
2.2.2.2.1. 快速编辑:选取,复制,粘贴等操作
2.2.2.2.2. 字体
2.2.2.2.3. 布局
2.2.2.2.4. 颜色
2.2.2.3. cmd的高级用法
2.2.2.3.1. 命令历史列表
2.2.2.3.2. 开启/关闭自动补全
2.2.2.3.3. 设置字符编码:简体中文GBK/英文
2.2.2.4. 右键快速打开cmd并且定位到该文件夹所在路径
2.2.3. Windows下的程序所常用的运行库:Microsoft .NET Framework
2.2.3.1. Microsoft .NET Framework简介
2.2.3.2. 0xC0000135错误是由于缺少了Microsoft .NET Framework
2.3. Linux
2.3.1. 脚本程序中最开始的那两个字符: #!,叫做shebang
2.4. 开源协议
2.4.1. GPL
2.4.2. 署名-非商业性使用(CC BY-NC)
2.5. 环境变量
2.5.1. Windows中的环境变量
2.5.1.1. 编辑/添加/修改windows中的环境变量
2.5.1.2. windows中新建一个环境变量
2.5.2. Linux中的环境变量
2.6. Java
2.6.1. Java安装后的环境变量的设置
2.7. 各种图片的尺寸
3. 嵌入式开发基础知识
3.1. 嵌入式领域的基本概念
3.2. 交叉编译
4. 上层软件开发基础知识
4.1. 轻量级数据交换格式:JSON
4.2. 字符编码
4.3. 正则表达式
4.4. 网站抓取和模拟登陆
A. 个人推荐资料合集
A.1. 推荐书目
A.2. 推荐资料
参考书目

插图清单

2.1. png小,但gif大的图片
2.2. jpg很小,gif很大,png非常大的图片

前言

1. 本文目的

本文目的在于,介绍软件开发的各种基础知识

以实现,看了之后,对于软件开发的很多领域的基础知识有所了解

如此在进行后续的真正的软件开发时,遇到各种细节知识,才会明白由来和背景知识

2. 待完成

第 1 章 软件开发简介

计算机软件开发,涉及到很多基础方面的背景知识

只有搞懂了了这些基础方面的知识之后

后续的软件开发,才可能得心应手

1.1. 常见的计算机语言简介和总结

计算机世界中,现存很多种计算机语言

比如常见的C,C++,Java,C#,Python,Ruby,等等

对于这些常见的语言的一些总结,可以参考教程:

各种计算机语言简介和总结

1.2. 计算机编程语言基础知识

而对于这些常见的计算机语言

其实很多核心的概念和逻辑是相同的,通用的

所以,后来又专门写教程,去总结这些基本的,核心的,通用的概念和逻辑

感兴趣的可参考:

计算机编程语言基础知识

第 2 章 通用软件开发基础知识

摘要

2.1. Cygwin

如果想要在Windows下折腾Linux方面的开发,往往要用到Cywgin

Cygwin是用来在Windows平台下模拟Linux环境的

关于Cygwin的详细解释,可参考教程:

Cygwin详解

2.2. Windows

2.2.1. Windows的注册表编辑器:regedit

通过windows的查找,找到regedit:

其对应的位置在:C:\Windows

点击打开regedit:

[提示] regedit会记住上次打开的位置

打开regedit,其默认会自动定位到上次关闭时所在的位置。

2.2.2. Windows的命令行工具: cmd

2.2.2.1. cmd简介

Windows下面的命令行界面,命令工具,是对应的cmd程序。

其对应的位置在:C:\Windows\System32

在win7下,可以通过开始的查找,找到cmd

其全称为:Windows Command Processor

其运行时的截图为:

[提示] cmd下运行的bat脚本文件

在Windows的cmd下面,支持运行后缀为bat或cmd的文件,成为windows下的(bat)脚本文件/批处理文件

关于Windows下的Bat脚本,详情参看Windows Batch File

2.2.2.2. cmd的基本用法

右击cmd的左上角的图标 cmd的图标,会出现对应的菜单:

可以看到,有两个配置,一个是默认配置Defaults,一个是当前窗口的属性配置properties,两者基本的操作,都是一样的。

下面来介绍一下,常见的配置:

2.2.2.2.1. 快速编辑:选取,复制,粘贴等操作

上图:

默认的cmd,一般是关闭了编辑选项中的快速编辑模式的。

  • 非快速编辑模式

    当关闭了快速编辑模式的话:

    • 粘贴文字

      如果你系统剪贴板中已经拷贝了一些字符,然后想要粘贴到cmd中,那么就需要点击右键:

      选择对应的粘贴,才可以粘贴对应的字符:

    • 复制文字

      鼠标是无法直接选择对应的文字的,需要:

      即右键,选择标记,然后再选择一些文字:

      然后点击右键或输入键盘的Enter键,就可以实现复制对应所选内容了。

  • 快速编辑模式

    此时:

    • 粘贴文字

      而如果启用了快速编辑模式的话,那么就不会再出现上述的右键菜单了,不需要选择粘贴,通过直接点击右键,就可以实现上述字符的粘贴了。

    • 复制文字

      同理,对于复制cmd中的文字,用鼠标选择后:

      然后直接通过键盘上的Enter键或点击鼠标右键,即可实现将选中的文字,拷贝到系统剪贴板中,然后就可以粘贴到别的地方/别的程序中了。

2.2.2.2.2. 字体
2.2.2.2.3. 布局

需要说明一下的是,关于屏幕缓冲区大小,指的是系统本身最大所存储的内容,

而窗口大小,指的是你当前的cmd的窗口大小。

屏幕缓冲区的大小,肯定是要大于等于窗口大小的设置的。

屏幕缓冲区大小的设置,决定了你的cmd窗口,最大能多大,即用鼠标拖拉窗口的话,最大能变成多大。

对于屏幕缓冲区:

  • 宽度

    自己试试,改成不超过你的屏幕的宽度为宜,否则横向太长,输出的内容,就不容易看清了。

  • 高度

    一般设置为大于窗口的大小,这样方便窗口在上下的高度方面,可以随时进行调整。

2.2.2.2.4. 颜色

2.2.2.3. cmd的高级用法

2.2.2.3.1. 命令历史列表

cmd中按F7,可以调出(之前所输入的)命令的历史列表

直接上图:

用法是,在cmd中,按F7,即可出现上图的效果。

其实,默认的通过键盘上的上线箭头,可以输入之前/后输入过的命令的。

但是之前不知道,原来F7可以跳出命令历史列表的窗口的。

2.2.2.3.2. 开启/关闭自动补全

win7默认的cmd,是支持自动补全的(就像Linux中shell中的效果一样)

即你输入字母后,按TAB键,则会自动帮你匹配出相应的支持的命令(或当前文件夹下面的文件名)

但是之前不知道,此功能,还是可以自己设置开启或关闭的。

直接上图:

即,cmd中,右键窗口左上角的图标,选择 默认值,然后打开了 控制台窗口的属性 的对话框,对于其中的编辑选项中的自动完成,可以自己开启或关闭。

我之前就遇到过一次,不小心,不知道系统怎么出了异怪的事情,cmd中自动补全功能失效了,按TAB键不起作用了,只是光标向右跳动一个TAB的距离,变成了输入TAB键的功能了。后来才找到此选项,关闭后,再启用,才折腾好,TAB才可以继续实现自动补全的功能的。

2.2.2.3.3. 设置字符编码:简体中文GBK/英文

即 控制台窗口 属性中的默认代码页的设置:

此处中文的win7,一般已经默认设置为了936了,这样显示出来的文字,是对应的中文GBK的编码的。

因此,如果你使用其他程序向控制台输出中文字符的话,比如之前用过python的logging.info输入中文信息到cmd中,此时如果你输出的汉字的编码也是GBK的话,和cmd中的GBK一致,则汉字是可以正确显示的。

如果你输出的汉字是其他编码,比如UTF-8,那么和cmd中的GBK编码不一致,就导致cmd中显示出来的汉字,是乱码了。对于python中,输入汉字是unicode话,logging.info会自动输出匹配的汉字,使得其可以正确显示的。

2.2.2.4. 右键快速打开cmd并且定位到该文件夹所在路径

有两种方法:

  1. 手动添加注册表项
    1. 打开注册表编辑regedit,且定位至HKEY_CLASSES_ROOT\Directory\shell
      [提示] 提示
      对注册表不了解的,请参考第 2.2.1 节 “Windows的注册表编辑器:regedit
    2. 在shell下新建一个项(目录),命名为OpenCmd
    3. OpenCmd下新建一个项(目录),名为command
    4. command下面那个ab图标的,REG_SZ类型的值,设置为
    5. cmd.exe /k pushd %L
  2. 直接导入注册表文件

    上述步骤,也可通过导入注册表的方式来实现统一功能。

    把下面的内容:

    Windows Registry Editor Version 5.00
    [HKEY_CLASSES_ROOT\Directory\shell\OpenCmd\command]
    @="cmd.exe /k pushd %L"
    					

    保存为OpenCmd.reg,然后双击运行OpenCmd.reg,即可。

无意间,从Windows 7使用技巧:在当前路径下打开命令行(cmd)命令窗口中发现,原来Win7中已经支持了此功能了。

即,在Win7中,在右击某文件夹的之前,先按Shift,然后再右击

此时就会多出一个“在此处打开命令行窗口”,"Open command window here"

同样可以实现快速打开cmd并定位到该文件夹所在路径。

2.2.3. Windows下的程序所常用的运行库:Microsoft .NET Framework

2.2.3.1. Microsoft .NET Framework简介

Microsoft .NET Framework是windows操作系统下很常见的一个和开发人员有关的组件。

Microsoft .NET Framework的作用是为了提供此平台,此平台包含很多功能,供其他软件调用,而不需要关心细节,实现程序可移植性更好。

Microsoft .NET Framework目前已有很多个版本。大家最常见的有这几个:

  1. Microsoft .NET Framework 2.0
  2. Microsoft .NET Framework 3.0
  3. Microsoft .NET Framework 3.5
  4. Microsoft .NET Framework 4.0

其不同的版本,新版本兼容旧版本。

现在很多人常用的很多软件,也是利用到Microsoft .NET Framework里面的功能了。

某个程序如果用到了Microsoft .NET Framework,会在程序发布的时候,说明最低需要哪个版本的Microsoft .NET Framework的。

比如,如果你安装的Microsoft .NET Framework 3.5,而程序要求最低是Microsoft .NET Framework 2.0,则你是完全满足了程序要求的,可以正常运行程序的。

目前最常见的Windows的操作系统是XP和Win7

  1. XP

    XP系统默认情况下,是没有安装Microsoft .NET Framework

    只不过,由于其他很多程序的运行也需要Microsoft .NET Framework,所以之前运行某软件的时候,就已经安装了Microsoft .NET Framework。

    另外还由于目前很多人安装的XP系统,是通过别人制作的GHOST版本的XP,其内在也已经集成了Microsoft .NET Framework了

    所以,换句话说,对于绝大多数人来说,此时此刻,你的XP中极有可能也已经安装了Microsoft .NET Framework了。

  2. Win7

    而Win7默认本身已经集成了Microsoft .NET Framework 3.5了。

2.2.3.2. 0xC0000135错误是由于缺少了Microsoft .NET Framework

综上所述,你的XP或Win7中,多数情况下,都已经支持Microsoft .NET Framework了。

而再去运行一般的软件的时候,也都可以正常运行的。

但是,凡事总有例外,如果遇到系统上没有装Microsoft .NET Framework,而去运行那些需要Microsoft .NET Framework支持的程序的时候,就会遇到0xC0000135错误

比如,我的一个小程序:downloadSongtasteMusic,别人在XP上运行,结果出错:

即显示:应用程序正常初始化(0xc0000135)失败。请单击"确定",终止应用程序。

解决办法是:

可以去网上随便下载一个,比如非凡软件网站的Microsoft .NET Framework v2.0 简体中文版

然后安装即可。

当然,如果本身程序所依赖的Microsoft .NET Framework版本很高,比如要求必须是Microsoft .NET Framework 3.5以上,那么你就必须去找Microsoft .NET Framework 3.5或Microsoft .NET Framework 4.0去安装,才可以的

2.3. Linux

2.3.1. 脚本程序中最开始的那两个字符: #!,叫做shebang

http://en.wikipedia.org/wiki/Shebang_(Unix)

2.4. 开源协议

很多软件,书籍,文章等,在发布的时候,都声明遵从某种协议。

Linux/Unix世界中,多数软件都是遵循GPL等协议的。

最新看到很多的书籍,文章等,声明说是遵循“署名-非商业性使用(CC BY-NC)”的。

下面就对一些常见的协议,做个最简单的介绍。

2.4.1. GPL

简单说就是:如果你写程序用了开源的GPL的代码,那么你的程序也必须开源

2.4.2. 署名-非商业性使用(CC BY-NC)

署名-非商业性使用(CC BY-NC)有很多个版本,之前的有2.0的,后来又2.5的,最新的有3.0

关于2.5的中文版的,官网的解释,请参见:署名-非商业性使用 2.5 中国大陆(CC BY-NC 2.5)

关于其含义,此处借用简明Python教程-前言-约定条款中的说明:

简单地说,你只要署上我的名字,就可以免费复制、分发和展示本书。

未得到我的允许,你禁止把本书用于商业目的。

你在修改本书的时候,必须清楚地标明所有做了改动的地方,

你发布修改后的作品时也必须遵照与本书相同的约定。

如此,CC BY NC的含义,就很清晰明了。

其基本等价于如此的声明:

  • 欢迎转载,但请著名出处
  • 未经作者允许,禁止商业使用

2.5. 环境变量

在应用程序不修改的前提下,支持更多的平台。

是程序和操作系统之间信息沟通的一种方式。

2.5.1. Windows中的环境变量

2.5.1.1. 编辑/添加/修改windows中的环境变量

下面,通过,把xsltproc所在的路径:E:\DevRoot\docbook\tools\xslt\bin,添加到windows中的Path环境变量中去,为例

详细详解每一步是如何操作的:

右键桌面上的我的电脑,选择属性

高级⇒环境变量:

可以看到,一个是当前用户的环境变量,一个是系统的全局的环境变量:

其中:

  • 当前用户的环境变量

    从作用范围来说,只是针对当前用户有效,所以可称为是局部的环境变量

  • 系统环境变量

    从作用范围来说,针对所有用户都有效,所以可称为全局的环境变量

    一般设置环境变量,是希望所有用户都有效,所以往往都是去设置系统的环境变量。

然后去找到系统的Path环境变量:

双击后,可以编辑对应环境变量的值:

关于windows中的环境变量的值,此处简单说明一下。

其某个环境变量的值,比如此处的path,其值可以有很多个部分,对应的每个部分之间,都是以分号;来分隔开的:

然后对于想要编辑环境变量的值的话,除了可以左右键移动之外,也可以通过使用Home和End键,分别定为到最开始和最后的位置。

Ctrl+←Ctrl+→可以实现一次移动一个单词(word)。

此处,通过End键移动到最后,可以看出,对于变量值的最后,可以没有分号分隔:

当前为了方便后续再添加其他的只,也可以写上。

而此处需要在后面添加新的一部分的值,所以是必须要加上冒号来分隔开。

然后加上此处的xsltproc的路径:E:\DevRoot\docbook\tools\xslt\bin

然后再点击确定

其会稍微停顿一下,那是由于系统去更新此环境变量的值了。

最后再点击确定,即可完成对环境变量的修改:

之后,你再重新打开windows的命令行cmd,此时的环境变量,就真正生效了。

[提示] 如何在windows中查看某个环境变量的值

在windows中,打开命令行cmd后,输入

echo %PATH%

即可查看名为path的环境变量的值。查看其他变量,方法类似。

2.5.1.2. windows中新建一个环境变量

在系统变量中,点击新建

填入变量名和值:

可以看到新建好了一个系统环境变量FOP_HOME了:

如此,即可建立一个环境变量了,然后点击确定,去让系统保存,生效,即可。

2.5.2. Linux中的环境变量

2.6. Java

  • JRE:普通使用者,只需要安装此Java Runtime Environment即可。
  • JDK:Java程序的开发者,才需要安装此JDK,用于开发各种Java相关的程序。

2.6.1. Java安装后的环境变量的设置

在Windows系统中,Java安装完毕之后,需要去设置必要的环境变量:

  • JAVA_HOME

    新建JAVA_HOME,设置值为jdk的安装路径,比如:

    C:\Program Files\Java\jdk1.7.0

  • CLASSPATH

    新建CLASSPATH,设置值为

    .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
  • PATH

    修改PATH环境变量,(往往是在最后的位置去)添加:

    %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

然后再去重新打开一个Windows中的命令行cmd,去输入javac即可验证是否已正常安装了java了。

2.7. 各种图片的尺寸

其实关于常见图片格式的大小问题,之前就写过一个帖子,整理了向word中粘贴不同格式的图片,导致word大小不同的问题。

当时好像是发现,gif是相对尺寸最小的。

此处,之所以在软件开发中提及到各种图片的尺寸,是因为,在有些和软件开发相关的过程中,会希望在不降低图片的视觉效果的前提下,而使用最小的图片。

比如docbook等开发过程中,遇到在写xml源码中,用到对应的figure图片,想要在生成的html中显示的话,则希望图片的文件大小,尽量小,以减少服务器的负荷。

而经过折腾发现,同样一副图片,分辨率相同和看起来肉眼分辨不出差距的前提下,不同的格式的图片的文件大小,很多时候,还是差距很大的。

所以,就希望在不影响视觉的前提下,仅保留图片大小是最小的那种格式。

此时,最小的格式,并不一定完全是gif格式。目前已经发现的规律是:

  1. 多数情况下,png是最小的

    多数时候,将图片从jpf和gif转换为png的时候,图片尺寸都会减少的。

    之前用PhotoFiltre转换过很多的图片,比如从gif转换为png,很多图片尺寸,都是降低40%左右,比如从49K变成34K

    [注意] word另存为html而获得的png图片的文件大小是相对比较大的,可以转换为更小的

    我刚开始遇到的情况,其实和上述结果相反。因为是用PhotoFiltre将png图片转换为gif,结果尺寸是降低了50%。

    后来才发现,把转换后的gif再去转换为png,结果又在gif基础上降低了40%左右。

    然后才想起来,原来那些png格式的图片,都是从word另存为html而导出的,所以好像是其故意保留了较高的颜色等内在参数,而使得图片大小相对较大。

    经过PhotoFiltre转换后,可以在另存为的时候,选择默认配置,就可以只包括基本内容,大大降低了图片的尺寸。

    而转换后的图片,至少肉眼是看不出前后的差距的。

    所以,对于自己觉得尺寸大的图片,还是要通过PhotoFiltre去转换为png试试,看看是否可以降低图片尺寸。

  2. 有些内容简单的图片,png反而比gif小,而gif却很大

    比如这样的图片,本身图片所包含内容不多:

    图 2.1. png小,但gif大的图片

    png小,但gif大的图片

  3. 有些内容复杂,但是低分辨率的图片,jpg很小,gif很大,png非常大

    比如这张图片,本身图片包含不少,但是是低分辨率:

    图 2.2. jpg很小,gif很大,png非常大的图片

    jpg很小,gif很大,png非常大的图片

第 3 章 嵌入式开发基础知识

3.1. 嵌入式领域的基本概念

关于嵌入式开发,其实也有很多的背景知识。

只有了解了背景知识、整体概念后,才能真正搞懂每个细节内部具体实现的原因。

关于嵌入式方面的知识,目前已整理出系列的教程:

  1. 先去看嵌入式软件开发以便了解嵌入式软件领域的背景知识和通用知识。
  2. 而在嵌入式软件领域内,和驱动开发相关的内容,可以参考:嵌入式驱动开发
  3. 而在嵌入式软件领域内,和Linux软件相关的知识,可以参考:嵌入式Linux软件开发
  4. 而在嵌入式的软件驱动领域内,和Linux驱动相关的知识,可以参考:嵌入式Linux驱动开发

3.2. 交叉编译

嵌入式开发中,对于交叉编译的概念,是第一个需要去搞懂的。

以及,搞清楚,如何得到交叉编译器,是使用已有的,还是自己编一个自己的

关于这方面的内容,可参考教程:

交叉编译详解

其中关于如何用crosstool-ng去制作交叉编译器方面的知识,也专门整理出了教程:

crosstool-ng详解

第 4 章 上层软件开发基础知识

有些软件开发的基础知识,是主要用于上层软件领域的。

此处,就来介绍这些软件基础知识。

4.1. 轻量级数据交换格式:JSON

在折腾网络方面的东西,往往会涉及到数据交换

JSON是其中一种

相对来说,属于比较轻量级的

且容易实现。

关于JSON的详细解释,参见教程:

JSON详解

4.2. 字符编码

上层软件开发时,很多时候,会遇到和字符的编码格式方面的处理

比如用C#,Python处理抓取的网页时,就涉及到对应的charset

就要用正确的编码去编码,解码对应的字符串。

此时,就需要对字符编码,这个相对比较通用的基础知识,有个了解。

关于字符编码,之前写了个极其详尽的教程:

字符编码详解

后来发现,该教程,还是内容太多,太繁琐。

所以,后来为了更容易看懂常见的字符编码,了解常见的字符编码之间的关系

又去写了个相对简要的介绍:

字符编码简明教程

4.3. 正则表达式

如果是在上层软件开发期间,涉及到复杂的字符串处理的话

尤其是查找,替换等操作的话

很多时候,都可以利用,正则表达式,这个工具,或者说语言,去高效的实现你要的操作

关于正则表达式,可参见教程:

正则表达式学习心得

正则表达式学习心得

4.4. 网站抓取和模拟登陆

在折腾,网络抓取,模拟登陆,动态网页等等期间

总结了很多基本的原理,逻辑,以及示例代码等等

然后整理出来称为一个独立的教程

对于这方面的需要参考的,可以去看:

详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)

附录 A. 个人推荐资料合集

A.1. 推荐书目

《程序员的自我修养》 编译、链接与库 - 潘爱民

linux设备驱动开发详解 - 宋宝华

A.2. 推荐资料

参考书目