系统编程之命令行编译

一、前言 本文将简单介绍在Linux系统下的命令行编译流程。介绍gcc、gdb、make等工具的简单使用。 二、GCC 基本操作 编译选项 无选项编译链接 用法:gcc test.c 作用:将 test.c 预处理、编译、汇编并链接形成可执行文件。这里未指定输出文件,默认输出为 a.out。 选项 -o 用法:gcc test.c -o test 作用:将 test.c 预处理、编译、汇编并链接形成可执行文件 test。-o 选项用来指定输出文件的文件名。 选项 -E 用法:gcc -E test.c -o test.i 作用:将 test.c 预处理输出 test.i 文件。 选项 -S 用法:gcc -S test.i 作用:将预处理输出文件 test.i 编译成 test.s 文件。 选项 -c 用法:gcc -c test.s 作用:将汇编语言文件 test.s 汇编成目标代码 test.o 文件。 无选项链接 用法:gcc test.o -o test 作用:将目标代码文件 test.o 链接成最终可执行文件 test。 选项 -O 用法:gcc -O1 test.c -o test 作用:使用编译优化级别 1 编译程序。级别为 1~3,级别越大优化效果越好,但编译时间越长。 官方文档:GCC, the GNU Compiler Collection...

九月 12, 2022 · 3 分钟 · 589 字 · Wokron

Hexo 个人博客搭建及主题配置教程

一、前言 本文是作者对于Hexo搭建的阶段总结。汇总了一些搭建过程中找到的资料。希望能够较为全面的记录博客搭建的全过程。给自己备忘,为他人提供帮助。 二、搭建阶段 (1)Hexo简介 Hexo是一款基于Node.js的静态博客框架,依赖少易于安装使用,可以方便的生成静态网页托管在GitHub和Coding上,是搭建博客的首选框架。大家可以进入hexo官网进行详细查看,因为Hexo的创建者是台湾人,对中文的支持很友好,可以选择中文进行查看。 (2)前期安装 安装Git Git是目前世界上最先进的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。也就是用来管理你的hexo博客文章,上传到GitHub的工具。 windows:到git官网上下载,Download git,下载后会有一个Git Bash的命令行工具,以后就用这个工具来使用git。windows在git安装完后,就可以直接使用git bash来敲命令行了。 linux:对linux来说实在是太简单了,因为最早的git就是在linux上编写的,只需要一行代码 sudo apt-get install git 安装好后,用git --version来查看一下版本。 安装nodejs Hexo是基于nodeJS编写的,所以需要安装一下nodeJs和里面的npm工具。 windows:nodejs选择LTS版本就行了。 linux: sudo apt-get install nodejs sudo apt-get install npm 安装完后,打开命令行 node -v npm -v 检查一下有没有安装成功 安装Hexo 前面git和nodejs安装好后,就可以安装hexo了,可以先创建一个文件夹blog,然后cd到这个文件夹下(或者在这个文件夹下直接右键git bash打开)。 输入命令 npm install -g hexo-cli 用hexo -v查看一下版本,至此就全部安装完了。 接下来初始化一下hexo hexo init myblog 这个myblog可以自己取什么名字都行,然后 cd myblog //进入这个myblog文件夹 npm install 新建完成后,指定文件夹目录下有: node_modules: 依赖包 public:存放生成的页面 scaffolds:生成文章的一些模板 source:用来存放你的文章 themes:主题 _config.yml: 博客的配置文件** 打开hexo的服务 hexo g hexo server 在浏览器输入localhost:4000就可以看到你生成的博客了。...

九月 11, 2022 · 4 分钟 · 640 字 · Wokron

FunctionSketch 说明文档

一、简述 本文档将介绍程序函数画板的主要功能和基本操作。函数画板是一款轻量的函数绘制软件。支持单变量函数、参数方程、隐函数的绘制。可以采用直角坐标和极坐标绘制简单图像,并带有求导、积分、二维线性变换等功能。 二、函数绘制 1、添加函数 运行exe文件后,将进入程序的主界面。如下图所示。 点击右侧“函数列表”栏内的加号按钮,将出现表达式的输入框。 输入函数表达式后按回车键(或采取使输入框不再被选中的操作),若表达式正确,则会将该表达式所对应的函数绘制到主界面左侧的窗口上。 其中正确的表达式包括如下几种情况: 表示单变量函数 此时表达式请以x为自变量,不忽略运算符(特别注意,对数如logm(n)请写作mlogn)。表达式前可忽略“y=”。例如“y=x+x^2”或“x*(elogx)” 表示参数方程 此时请同时输入两个单变量函数表达式,以x或t为自变量,两表达式间以逗号间隔。注意请不要在两个表达式前添加“x=”或“y=”。例如“t^2,t”或“sinx,cosx” 表示隐函数(或一般的方程) 此时请以x,y表示横纵两坐标轴对应的变量。表达式中必须包含等号。例如“x^2+y^2=1”。当等式左侧为“y=”时自动转换为单变量函数计算。 另外,一次输入可以绘制多个图像。若要输入多个表达式,请将各表达式以分号间隔。 2、函数属性设置 添加函数后,函数图像将在左侧窗口内显示,同时右侧函数列表栏内也会出现记录该函数信息的卡片(超出范围的卡片可以滑动滚轮以查看)。 每一个函数信息卡右侧有两个按钮。上面标有“x"字的按钮点击后可关闭该函数卡并删除左侧窗口内对应的函数图像。下面显示“···”符号的按钮,点击后可以设置该函数相关的属性。主要包括如下内容。 坐标形式 单变量函数和参数方程共有。设置图像以直角坐标或极坐标形式呈现。 线性变换 单变量函数和参数方程共有。表示一个2*2矩阵。在绘制过程中,图像的每一个坐标点会与该矩阵相乘。 位移 单变量函数和参数方程共有。表示一个二维矢量。在绘制过程中,图像的每一个坐标点会与该矢量相加。 积分 单变量函数特有。表示一个积分区间。默认不计算积分(积分范围NaN->NaN)。若输入正确的积分范围,则会在左侧窗口内将求积分的面积涂色。并在信息卡上显示积分结果。 求导 单变量函数特有。点击求导按钮后会求一阶导数,并将得到的新函数添加到函数列表栏的末尾。图像也会在左侧窗口内显示。 参数范围 参数方程特有。用以表示参数的范围。左侧窗口内只会绘制参数范围内的图像。 三、保存文件 1、保存当前函数图像 点击主窗口上侧菜单栏“文件”选项。其中第一项“保存”可以将当前绘制的图像保存为图片格式(当前暂时只支持jpg格式)。 2、查看默认保存位置 第二项“打开默认保存路径”会打开exe所在路径之下的SaveImage文件夹。可用于作为保存文件的位置。 四、设置 1、绘制设置 点击菜单栏“设置”选项,会打开一个设置窗口。 其中前三项用于绘制设置。 显示范围 相对位置用于设置当前显示位置与默认位置的偏移量。可以理解该值为一个表示当前窗口显示的位置相对于原点的坐标。 显示宽度用于设置当前窗口宽度下,横坐标数值的变化范围。 (该项设置也可以在主界面显示窗口用鼠标拖动和滚轮实现。) 线条颜色 设置图像曲线、坐标轴、积分区域的颜色。 线条宽度 设置图像曲线、坐标轴线条的粗细。注意该粗细不会随着窗口的缩放而发生变化。 2、算法设置 设置窗口第四项用于设置算法相关参数。算法原理详见设计文档。 基本 最小绘制间隔即生成基本绘制点时自变量的间隔。 平滑算法 平滑算法用于处理曲率较大的情况。平滑率表示连点绘制的曲线的“尖锐度”的阈值,过于“尖锐”的部分将被试图平滑。最大递归层数用于避免过深的递归,减少绘制时间。 Marching Square算法 Marching Square算法用于处理一般方程,能较有效地绘制隐函数图像。但计算量较大,以dx为单位长度绘制速度较慢。因此以dx乘以某一常数得到的长度作为新的单位长度,该常数即方块比例。 五、帮助 1、查看源代码 点击菜单栏“帮助”选项,第一项“源代码”点击后会转到保存该程序源代码的github仓库。 2、操作说明 第二项“操作说明”可以打开一个新的帮助窗口,其中记录了一些较为常见的操作的提示。可在使用时随时查看。

九月 10, 2022 · 1 分钟 · 62 字 · Wokron

FunctionSketch 设计文档

一、程序简述 本软件是一个轻量级的图像绘制软件。在实现较为丰富的函数绘制功能的同时,避免了庞大的体量。与Matlab、Mathematica等专业软件的二维图像绘制功能相比,更方便上手,便于使用。可用于满足学习和简单研究的二维绘图需要。 二、实现思路 1、表达式字符串解析 (1)解析目标 本程序的主要输入内容为表达式字符串,用以表示单变量函数、参数方程或是隐函数。为了进行计算,我们需要将其转化为可使用计算机计算的函数。我们可以将三种方程分别看成单参数、单返回值的函数;单参数、双返回值的函数;双参数,单返回值的函数(即f(x,y)=0)。这可以利用C#的delegate实现。C#中预先定义了Func<>委托。利用泛型可分别存储三种类型的方法。 因此现在的问题便是,如何依据不同的字符串,构造出对应的可反映该表达式计算过程的方法。这里采取表达式树的结构。 (2)FunctionParser类——字符串转表达式树 字符串转表达式树的基本算法已经在大一的数据结构课上讲过了。这里不赘述。 不同的地方在于面向对象可以方便的利用多态代替判断。因此对于表达式树,不再需要节点内储存数据表示不同的节点类型。只需要所有的节点继承共同的抽象父类ExpressionElement,同时ExpressionElement具有函数Calculate,子类,包括Value、ArgumentX、ArgumentY、Operator等等,各自实现不同的Calculate操作。 最后,将Calculate方法赋给Func<>类型的变量,就可以实现表达式的存储了。 (3)FunctionFactory类——字符串转函数封装信息 但是,不同类型的函数有着不同的信息,比如单变量函数可以方便地求导、积分;参数方程需要指定参数的范围。因此在绘制图像之前,还需要对函数的信息做一次封装。 FunctionFactory读入字符串,判断其类型,将其封装为不同的类(SingleVarFuncStorage 、DoubleVarFuncStorage和ParamVarFuncStorage。其中各自具有对应函数的属性和方法),并以FunctionStorage[]父类数组的形式返回。 2、FunctionDrawing类——图像绘制 (1)基础算法 FunctionStorage类的成员将传入FunctionDrawing类中,成员被存储在一个List<FunctionStorage>内。每次调用Refresh函数重绘,都将对列表内的每一个元素调用绘制。 不同的函数类型将采取不同的绘制策略。绘制时先用里氏转换将函数转换会真正的子类。随后调用多态方法DrawFunction。 虽然绘制算法并不相同,但本质上都采取了取点描线的方式。绘制利用了WPF的绘图API,主要是运用了DrawingGroup、DrawingContext类。并将绘制结果以DrawingImage的形式作为位于主界面左侧窗口的Image的Source。 (2)平滑算法 单变量函数和参数方程的基本绘制,就是简单的以某一小间隔dx为单位,从自变量初值递增到终值,对每一个自变量,计算对应的坐标。最后将所有在绘制范围内的坐标点连接起来。 而平滑算法是用于改善一些极端情况,如y=sin(1/x),的绘制效果的算法。用于平滑过于“尖锐”的图像。这是一个递归算法,具体操作如下 输入参数为三个点,构成两条线段 如果这两条线段较为“平滑”(本程序采用斜率之差的绝对值小于某一值),则退出 否则,分别对于两条线段,各自取端点参数的中值,算出坐标,将原线段的端点和中值的坐标作为参数,重复1。 (3)Marching Square算法 对于图像一般形式f(x,y)=0,就算遍历全部绘制范围也较难恰好取到等于0的情况。另外如果以某一确定的eps作为误差范围,也会因为不同的梯度导致绘制的曲线误差较大。因此需要采用新的算法。 Marching Square算法一定程度上解决了这一问题。该算法通过将绘制区域划分成等大的方块,并取样方块顶点上的函数值,根据函数值的正负估计曲线的走向。最后利用线性插值估计f(x,y)=0在方块边上的位置,连线得出图像。 3、UI设计 (1)图像尺寸自适应 软件需要能实现尺寸的自由变化,而如果只绘制某一特定尺寸的图像,那么就无法实现较好的变化效果。 采取的解决方式是在FunctionDrawing类内添加属性AspectRatio用于表示长宽比。同时监听窗口的尺寸变化事件。在尺寸变化后,获取新的长宽比,更新AspectRatio并调用Refresh方法重绘界面。 (2)UserControl自定义控件 在添加函数后,主界面右侧函数列表会出现记录该函数的信息卡片。并具有删除和设置函数的按钮。该卡片集成了该函数所能做的所有操作,是FunctionStorage在UI的反映。 如果每创建一个新的函数,都要执行一大段生成包括Button、Label、TextBlock PopUp等控件的代码,很显然是不明智的。因此采用用户控件UserControl在新的窗口设计信息卡片需要的功能。主页面则只需要在添加函数时创建关于该函数的卡片实例即可。类似的,表达式输入框等内容也是如此。 (3)Frame——Page实现单窗口多页面 点击菜单栏的设置选项,会出现一个用于设置的新窗口。选择左侧边栏的不同设置选项,右侧会显示不同的页面。这个单窗口多页面的功能,由Frame加Page控件实现。 主设置页添加一个Frame控件,在打开该窗口时,Frame加载显示不同设置的Page。在点击左侧边栏按钮的时候,调用Frame的Navigate方法导航到对应的设置页。 三、运行环境 编写时使用Visual Studio版本为VS2019 16.11.17 .NET版本为netcoreapp3.1 c#版本为C#8.0 四、收获 学习了面向对象编程的思想,实践了简单的代码重构。 获得了开发近4000行代码的项目的经验。 学习了一些图形学算法。 对C#的理解更加深入,并获得了简单的WPF经验。

九月 10, 2022 · 1 分钟 · 53 字 · Wokron

关于 Git 推送失败

问题背景 其实这个问题出现过许多次了,可每次的解决方法都不尽相同。因此这里做一个简单的汇总,也为之后再次出现提供一个总结的位置。 曾经出现该问题的情况: VS推送失败 hexo推送失败 问题形式类似于fatal: unable to access 'https://github.com/.../.git':... 问题原因 貌似是代理产生的问题。根据网上资料,通过取消代理就可以解决问题。但本人也曾有过通过更换VPN线路解决的情况,不知是否仅仅是凑巧解决。 问题解决 查看代理: git config --global --get http.proxy git config --global --get https.proxy 如果发现git使用了代理,则取消代理: git config --global --unset http.proxy git config --global --unset https.proxy 需要再次设置代理请使用如下命令(设置当前代理为 http://127.0.0.1:1080): git config --global http.proxy 'http://127.0.0.1:1080' git config --global https.proxy 'http://127.0.0.1:1080' 值得注意的是,git还可以对单一网站设置代理,例如只对github使用代理http://127.0.0.1:58591: git config --global http.https://github.com.proxy http://127.0.0.1:58591 该类代理无法通过前面的查看代理命令查看,需要明确指出网站才可查询到: git config --global --get http.https://github.com.proxy 取消对github的代理: git config --global --unset http.https://github.com.proxy 另外代理设置也可以直接在git配置文件中查看,为C:\Users\{用户名}\.gitconfig。也可以在其中直接修改。

九月 10, 2022 · 1 分钟 · 66 字 · Wokron

Test

Article Test 测试,第一篇推文 I wonder if this can be seen… // this is what a string cat can do. StringCat.new("black").meow(2).jump().sleep(1000);

九月 10, 2022 · 1 分钟 · 20 字 · Wokron