在u盘中安装ubuntu
你是否因为经常使用不同的电脑,但是编程环境不同而苦恼呢,今天的文章会教你把ubuntu装入移动固态中,现在SSD的价格已经很便宜了,这里我会用1T的移动固态为例,教会你如何将ubuntu装入移动其中(同时支持UEFI和BIOS)。
在开始之前,有几点需要提醒:
操作不当可能会导致数据损失,严重的操作失误甚至可能破坏你的电脑,所以要慎重操作。
每一步都要经可能谨慎的操作,一个粗心可能就会导致前功尽弃。
建议有一定基础的人来完成。
使用Vmware
首先安装vmware,https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
虽然是收费的,但是网上激活码简直不要太多,这里自己搜索解决。
(如果之前没有使用虚拟机或者安装系统的经验接下来操作要更加小心)
在安装完成之后,我们用管理员权限打开vmware(在左下角的搜索栏中找到vmware,右键点击后用管理员打开),创建虚拟机,除了下面出现的内容,其他的都选择默认即可。
选择稍后安装操作系统,我们需要后面自定义的配置
使用 ...
如何阅读一本书
阅读的四个阶段
基础阅读
检视阅读
分析阅读
主题阅读
阅读中我们应该对下面四个问题有自己的答案
整体来说,这本书在谈什么
作者说了什么,是怎么说的
这本书说的有道理吗,是部分有道理还是全部有道理
这本书和你有什么关系吗
基础阅读
基础阅读就是有着阅读的基本能力
检视阅读
用于判断一本书是否应该精读,如果判断一本书有精读的价值,就继续采用下面的阅读方法。
首先整本书采用粗读的方法,对整本书有一个整体的了解,然后遵循下面6个步骤
了解书籍的主题
了解书籍架构
了解关键词目
了解作者介绍
了解章节重点
了解逻辑线索
在判断一本书值得精读以后,我们执行分析阅读
分析阅读
一阶段
给书分类
找到书的骨架
为书拟大纲
发现作者意图
一阶段总结回答问题1——整体来说,这本书在谈什么
二阶段
判断作者主旨
书中的各种定义
理解作者想让你关注的
本书如何推导
作者自己的观点是怎么样的
总结回答——作者是如何讨论清楚一个问题的
三阶段
公正的评价一本书
主题阅读
通过多本书相同主题的横向比较来加深理解。
自己的理解
阅读一章或者一段之后要总结,刚开始阅读可以粗读或者说 ...
C语言声明
C语言的声明可以嵌套,所以可以构成一些相当复杂的嵌套,这种过于复杂的声明并不推荐,但是我们应该学会如何去阅读这些声明。并在后面的部分会讲述如何利用typedef去简化这些声明
left-right rule
"left-right" rule是解读C语言声明的强力规则,掌握这个规则足够让我们解决几乎所有的C声明,而且规则并不复杂,分为下面几步
从变量名开始阅读
从包含变量名的最内部的括号由内而外解释,对于每个括号的内部,先往右边解释,再往左边解释,层层解释> 直至结束。
第一条规则告诉你如何开始,第二条规则告诉你如何解释,然后,我们要记住一些规则,你可以理解为这是规定的内容,是死的。
* 读作 “指向…的指针” ,接下里的标识符修饰指针指向的内容
[] 读作 “…的数组” ,接下来的标识符修饰数组的元素
() 读作 “返回…的函数”,接下来的标识符修饰函数返回值
读作...是用语言的方式去将声明一层层定义出来,就是反映了接下来修饰的内容,理解后面的部分我认为会更加直接。
好的,看了上面的内容你大概了还是相当模糊的,不要急,上面的内容暂时不 ...
C语言的数据存储
C语言允许类型之间进行转换,包括隐式的转换和强制转换,为了我们能更好的理解这些特性,我们需要了解C语言的数据在计算机中到底是如何存储的。
整型数据
我们先从简单的整型数据开始。
无符号整数的储存比较简单,直接以二进制形式储存,64位机的signed int存储形式如下
而有符号整数的表示稍复杂,有符号整数的最高位是符号位,0代表整数,1代表负数。
在计算机中,有符号整数以补码的形式储存。关于补码,我们只需要理解它的设计的目的是为了简化有符号整数的计算,通过自然溢出实现正确的运算的结果。
可以简单的记忆如下:
(x)补码+(−x)补码=0(x)补码+(−x)补码=2w(w是存储的位数)−x的补码可以用2w−x计算得出(−x)补码=2w−(x)补码(x)_{补码}+(-x)_{补码}=0 \\
(x)_{补码}+(-x)_{补码}=2^w(w是存储的位数) \\
-x的补码可以用2^w-x计算得出 \\
(-x)_{补码}=2^w-(x)_{补码}
(x)补码+(−x)补码=0(x)补码+(−x)补码=2w(w是存储的位数)−x的补码可以用2w−x计算得出(−x)补码=2w ...
C语言的弱类型性
C语言是一个强类型的语言,变量必须先定义再使用,而且变量如果不经过转换,那么将永远保持原来的类型。但强和弱是相对的,如果我们把C语言和其它的一些强类型语言相比较,我们会发现C语言的一些弱类型特性,这些特性会在某些时候坑害我们。当然,讨论强类型还是弱类型是没有意义的事情,重要的是从这些对比中学到一些东西,避免因此而犯下错误。
隐式类型转换——梦开始的地方
众所周知,对两个类型不同类型的数据操作时,如果这两个数据在一定的兼容范围内,C语言会对其中一个数据进行隐式的类型转换,优先级如下。
我们拿经典的JAVA语言举例,JAVA禁止了boolean与整型数据之间的类型转换,也禁止了整型与浮点型数据的转换,为语言提供了更高的安全性。如此丰富的类型转换,反映了C语言的"弱类型"特性,一方面是C语言为我们的编程提供了更高的自由度,另一方面也增大了隐患。
来看一个简单的例子。
1234567int a = -1;unsigned int b = 1;if(a > b) { printf("a > b");} else & ...
GDB快速入门
GDB全称GNU symbolic debugger,诞生于GNU计划,是一款程序调试器,如果脱离IDE环境,GDB将会是你强大的帮手。
GDB下载和使用
在windows环境中只要下载过C语言应该就会有GDB,这里主要介绍linux环境,也很简单
12345# centos$ sudo yum install gdb# ubuntu$ sudo apt install gdb# 其它系统类似
调试一个程序,例如我们现在要调试可执行程序a.out
1$ gdb a.out
此外,如果我们要调试一个C语言的程序,我们需要在gcc编译时增加-g选项,这个选项告诉编译器添加调试信息
1$ gcc -g main.c
GDB调试常用命令
下面是一些常用的命令,括号里面是命令的缩写,使用两者都可以
run(r)
启动程序,如果有断点则运行至第一断点,如果没有则运行到结束
next(n)
让程序往下执行一步
list(l)
列出程序源代码及其行号
break(b)
给程序打断点,可以给某一行打断点,也可以给一个函数打断点
12$ b 行号$ b 函数名
info(i)
查看调试信息, ...
指针和数组并不相同——C语言
在我们初学C语言时,我们会有这样一个认知或者感觉:指针和数组是相同的。我们也经常干着这样的事情,比如下面这样代码。
123456789int main() { int a[3] = {1, 2, 3}; int *p = a; printf("%d\n", p[0]); printf("%d",*(a+1)); return 0;}
这样看起来两者似乎确实没有差别,指针可以像数组一样使用[],而数组名也可以解引用,而且它们的结果是一致的。
或者在我们定义函数时,也可能会把两者当成一种处理。
1234567891011void foo(int *p) { printf("foo: %d", p[1]);}int main() { int a[3] = {1, 2, 3}; foo(a); return 0;}
一切看起来都是那么自然。
首先我们要肯定,两者之前确实有相似 ...
Dosbox和masm搭建汇编环境
学习汇编语言之前,需要有一个环境来运行汇编代码,所以此文记录下自己的环境搭建过程
下载Dosbox和masm
Dosbox提供32位机环境,masm负责编译汇编代码
Doxbox下载地址
Dos官网
点击Download下载即可
接下来安装masm
https://github.com/xDarkLemon/DOSBox_MASM/tree/master
下载解压以后我们只需要这个masm文件夹
配置Dosbox
接下来我们需要把masm配置到Dosbox中,我们打开DOSBox 0.74-3 Options.bat文件
在文件的底部加入如下内容,把D:\1Packages\Debug换成你自己masm文件夹所在位置,此外我们在相同目录下可以新建一个asm目录作为工作目录
1234MOUNT F D:\1Packages\Debugset PATH=%PATH%;F:\masm;F:cd F:\ASM
意思是把本机的D:\1Packages\Debug目录挂载到Dosbox的F盘,这样我们就可以在Dosbox下的F盘直接使用masm命令了
这样就配置完成了,如果觉得窗口太小 ...
(二)docker的基本使用
在第一节的内容中,我们了解了docker的作用,以及完成了docker的安装和docker的hello world,初步进入了docker的时间,这一节内容会从docker的基本架构出发,讲解组成架构中组成部分的关系以及如何操作它们。
Docker的架构
接下来我会讲解docker的基本使用方式,在学习之前,我们先来看看docker的整体架构。
我们来看看docker的组成部分,首先docker是有一个客户端的,是一个C/S架构。
然后我们来看看docker最核心的部分——容器,镜像,仓库。我们之前说了docker把软件和环境打包到一起,那么这个打包的结果就是一个镜像,这个镜像是一个模板,如果我们要运行这个应用,docker会按照这个模板,生成一个容器去运行这个应用。
与创建一个虚拟机相对比,镜像就类似于iso文件,而容器就类似于虚拟机,镜像只是充当了一个不变的模板,而根据这个模板,我们可以运行任意数量的“容器”。
那么仓库这个概念也就好理解了,仓库就是用于存放镜像的,我们可以从仓库去下载我们需要的镜像,那么接下来我们就先从容器,镜像这两个方面来讲述docker的操作。
镜像的 ...
(一)开启docker的旅程
天下苦环境久矣
printf("Hello World!"),这也许是你学习C语言时打印的第一行语句,C语言作为大多数人的入门语言,Hello World开始了我们的代码生涯。对于过去初学的我们而言,要打印出这一行代码并不轻松,我们要安装一个集成开发环境,可能是CodeBlocks,可能是visual studio等等,有些可能会给我们安装好C语言的环境,有些则要自己安装或者是配置环境变量。可能我们千辛万苦安装好了运行环境,结果要运行一个项目,我们可能还需要下载这个项目所需要的依赖。不管具体的情况如何,配置环境,这短短的四个字可能将会在接下来的几年时间里一直折磨我们。
环境给我们带来了很大的痛苦,但我们显然不会就此认命,有了疼点,就会有相应的解决方案,我们手里可是握着代码的程序员。那么到底应该如何解决这个问题呢。在起初,我们首先解决的是依赖问题,对于各种语言,都有了自己对应的包(依赖)管理机制,例如Java的Maven,javascript的npm等,这些包管理工具记录了我们项目所需要的依赖,借助于这些工具,我们在下次运行这些程序时可以快速下载好所需要的依赖。依赖 ...