自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 收藏
  • 关注

原创 调试运行第一个xv6程序

原文可在调试运行第一个Xv6程序查看到,后续的更新将会更新到个人博客Xv6 刚启动的时候处于 Machine Mode,完成基本配置工作后就会尽快跳转到 Supervisor Mode,在这个模式下,main 会尽快完成系统的配置工作并创建出第一个用户程序。前置知识Xv6 是一个支持多进程的操作系统,在 Makefile 中可以看到 CPUS 会被默认设置为 3,为了调试方便,在启动的时候,可以将其设置为 1。这样就只会在一个 CPU 上运行程序,单个断点就可以阻止整个操作系统的运行。环境准备

2022-02-11 23:55:52 1360

原创 内核链接脚本解析

原文可在[内核链接脚本解析](https://wzzzx.github.io/6-S081/kernel-link-file/)查看到,后续的更新将会更新到[个人博客](https://wzzzx.github.io)具体的代码可以见仓库,这里挑选几个说一下。输出架构OUTPUT_ARCH 这个命令用于指定输出文件的系统架构,这里采用的是 riscv。入口点ENTRY 则定义了程序的入口点,xv6 的默认入口点是 _entry。入口点代码在 entry.S 内。

2022-01-23 20:50:04 355

原创 调试xv6

原文可在[调试Xv6](https://wzzzx.github.io/6-S081/debug-xv6/)查看到,后续的更新将会更新到[个人博客](https://wzzzx.github.io)调试是一个比较麻烦的事情,需要倒腾的东西有点多,而且有些问题我现在也没搞清楚调试工具现在已知的调试工具有三种,暂时也还没搞清楚它们之间具体有什么区别。

2022-01-23 20:49:08 1712

原创 运行xv6系统

第二次倒腾这个操作系统了。整个过程其实很简单。我使用的操作系统是 Ubuntu Server 18.04.1 LTS 64bit,但是按照学院官网的指导去操作似乎有点问题?总之就是没成功。系统下载首先就是源码的下载,通过 git 可以直接下载到git clone git://github.com/mit-pdos/xv6-riscv.git组件下载但是通过最底下的操作可以看出,这个操作系统的启动其实就是需要两个组件。riscv64-unknown-elf-gcc 用来编译操作系统,qemu-sy

2022-01-23 20:47:09 736 2

原创 二分搜索全攻略

个人站点个人独立博客站点:https://wzzzx.github.io/后续考虑以维护独立博客为主。二分搜索全攻略在一个有序数组中查找特定值的时候,二分搜索法是一个很常见且高效的思路,该方法也称为折半查找(Binary Search),它是一种效率较高的查找方法,可以在数据规模的对数时间复杂度内完成查找。但是在实现二分搜索法的时候,边界条件判断,下标变更计算等地方都很容易出现问题,这些错误会直接导致代码进入死循环或者崩溃。所以,除了在算法层面了解该算法,在代码层面也需要为什么,才能完整掌握该算法。

2021-12-16 23:25:59 600

翻译 [翻译]X窗口管理器的原理剖析(一)

窗口管理器是现在Linux系统的最为核心的组件之一了。因为窗口管理器的职责是去管理每个独立窗口如何显示/移动,怎样反馈输入,怎样组织各个窗口,可以不夸张地说,窗口管理器决定了日常的使用体验。因此,即便第一个X窗口管理器已经存在近30年了,我们还可以去讨论不同的窗口管理器的优势。而许多不一样的新式窗口管理器正在不断地创造出来并且改变着生活。在接下来的章节里,希望能够把窗口管理器的工作原理解释清晰,并且你能够以此制作一个属于自己的窗口管理器。在这系列文章中,我会大量地也引用Xlib Programming

2021-02-04 13:37:29 1193 2

原创 单一职责原则

释义初看这个原则时,很容易将其错误地理解为:函数或类只应该保持有一种能力。这固然也是一个重要的设计原则,但是并不是单一职责原则所想表达的意思。这个原则最初的描述是:任何一个软件模块都应该有且仅有一个被修改的原因。这里可能有点难以理解,对于软件而言,修改是永无止境的。如果只有一个原因能修改它,那设计之初就应该避免这个原因,做到十全十美。所以,这里的原因并不是指某个更改的意图。而是指,该模块所服务的对象,才是修改模块的原因。更进一步的解释就是:任何一个软件模块都应该只对某一类行为者负责。这也是原则名称里的职

2020-12-16 22:56:03 157

原创 SOLID原则

在软件架构设计方面,有一个绕不出去的大原则,那就是SOLID原则。该大原则由五个原则的首字母所组成,分别如下所示:单一职责原则(The Single Responsibility Prinlciple):任何一个软件模块都应该只对某一类行为负责开闭原则(The Open/Closed Principle):设计良好的软件应该易于扩展,同时抗拒修改里氏替换原则(The Liskov Substitution Principle):如果想用可替换的组件来构建软件,那么这些组件应该遵守相同的接口,以便能够

2020-12-16 22:55:07 722 1

原创 编译构建,从底层到高层

上古时期最初的时候,我们手头上就只有一个gcc。不管干什么都一把梭,直接调用gcc来编译项目。项目文件不多的时候确实能够满足需求。但是多人协作,项目大了起来以后,这种方法及其容易造成混乱,并且工作量太大。封建时期后来我们就有了make和makefile。这是一套全自动化的解决方案,它能根据我们所定义的规则,自动化的去编译构建。一个工程会按照不同的功能,模块,类型等方式分门别类的放置各类源代...

2020-05-05 16:56:04 343

原创 POST提交数据的方式

当谈论到上传数据时,我们会很自然的说出Json/XML,但这些都是数据格式。但数据上传的方式却一直以来都被我忽略了。目前的了解是,普遍会使用四种常见方案编码本地数据,通过Content-Type来指定数据的上传方式,同时通过Content-Length来指定数据长度。application/x-www-form-urlencoded这应该是最常见的一种提交方式了。在原生的表单From,如果不...

2020-04-13 23:56:05 322

原创 非托管C++使用托管C++的句柄

当我们学会了使用C++调用C#,也学会注入回调函数到C#中之后,下一步,也是最重要的事就是,把我们的托管C++封装为一个C++的接口,提供给Native C++使用。PImpl这里我们需要使用一种名为Pimpl的编程思想。Pimpl的思想如下图所示:简要的说,我们需要将所有的细节隐藏起来,暴露给外面的,仅仅有行为接口。在CPP实现中,我们可以做任何事情,但是对一切引用我们的头文件的类而言...

2019-09-06 21:13:34 3206 5

原创 C++注入回调函数到C# Dll

从C#注入回调函数到C++编写的Dll中网上可以看到很多方法,但是反过来就麻烦多了。回调函数的本质就是传递一个函数地址给相应的函数进行处理。所以C++往C#中注入回调函数,所需要解决的问题就是,C++的函数要怎么传到C#中。在网上的资料虽然都是C#往C++中注入回调函数,但是可以看到都是采用委托来实现的。所以在这里我们可以...

2019-09-06 20:40:51 1029 2

原创 Linux下QtCreator和应用输入中文

原先在Debian系下的Qtcreator无法输入中文时,可以直接在软件源下载fcitx-libs-qt和fcitx-libs-qt5,然后复制到相应的目录下即可实现输入中文,但是现在Qtcreator已经发布了很多新版本了,软件园的fcitx已经太旧,下载下来也没有什么用了。所以得自己编译最新的的版本才能让Qtcreator支持中文。系统环境介绍我的系统是Deepin 15.11,Qt 5....

2019-08-23 17:54:05 1999

原创 C++调用C#

现在手上有一个需求,需要通过C++去调用C#的方法。整个过程还是挺纷繁复杂的,在这做一点小小的记录。整体的思路如下:非托管C++ --> 托管C++ --> C#因为非托管C++缺乏一些运行时的类库支持,所以需要借助于托管C++做一个wrapper的活。首先完成C#的开发,此时我们创建的是一个C#的动态链接库的项目namespace CSharp{ publi...

2019-07-29 22:02:28 7333

原创 qBreakpad在Linux下的编译和使用

Google家的Breakpad因为其跨平台的特性,在崩溃信息收集上报方面有着挺广泛的应用。但是在Qt有一个更好的封装库,该库将Breakpad多进行了一层的封装,使得开发者仅需进行一次编写,代码就可以处处运行。当然,不同的平台还是需要分别的编译的。现在qBreakpad的官方readme有点过期,并且说的也不是很详细,所以此处就着重讲一下Linux平台下的编译吧。clone源代码git...

2019-07-29 09:14:37 1198 2

原创 工程的艺术(3):代码健壮性之函数之间不要互相依赖

我的代码有三个文件,一个负责产生SVG字符串,一个负责存储该字符串,一个负责绘制代码大体如下所示,并且三个分处不同的文件class Producer { void createSvgString(); ...};class Storage { void setSvgStying(); ...};class Draw { void drawSvgFigure(); ...}...

2019-05-24 09:23:27 133

原创 工程的艺术(2):通用类型到特定类型的转换,需要检测合法性

void foo() { QVariant a = 10; QVariant b = 20; int c = add(a, b); return c;}int add(const QVariant &a, const QVariant &b) { int left = a.value<int>(); int right = b.value<int&...

2019-05-13 16:59:51 129

原创 工程的艺术

这一系列文章用于记录自己在工作中遇到的一些重要的编程思想

2019-05-13 16:21:41 188

原创 工程的艺术(1):不需要暴露出去的东西尽量封装起来

#ifndef _TEST_H_#define _TEST_H_#define SUCCESS 1/*** do Something*/#endif // _TEST_H_这是一个极为普通的头文件,我们在其中定义了一个宏。按照以往的经验,在头文件中定义宏是很常见的操作,但实际上此处有一个安全隐患。此处我们给出一个原则,即:对于不需要给外界知道的东西,都应该想办法将其隐藏起来...

2019-05-13 16:19:40 135

原创 effective C++条款27,28

27. 尽量少做转型动作c++规则的设计目标之一是,保证“类型错误”绝不可能发生。即,如果我们的程序能顺利的通过编译,那么就意味着它一定不会在任何对象身上致谢任何不安全的操作。类型转换的底层工作任何的一次类型转换,编译器都会编译出运行时期执行的码。int x, y;double z = static_cast<double>(x) / y ;如这段代码所示,在计算机的...

2019-05-09 13:17:41 205

原创 类的设计缺陷

这是一个很无意识的错误。class Example {public: void detectString(std::string str); bool success(); String getResult();private: std::string str; bool success;}需求是这样的。我有一个输入,我需要对其进行合法性的检测,然后给出处理结果。我之前的认知...

2019-04-28 22:49:53 169

原创 redis内存分配分析

简述redis的内存分配相关的代码存储与zmalloc.h和zmalloc.c之中,整体的分配策略非常的简单,需要额外注意HAVE_MALLOC_SIZE这个宏zmalloc.h在这里,一开始让我很疑惑的是开头的这一系列条件编译#if defined(USE_TCMALLOC) #define ZMALLOC_LIB ("tcmalloc-" __xstr(TC_VERSION_M...

2019-01-06 16:40:31 1103

原创 Python捕捉MySQL的警告导致的事物锁等待超时问题

当有多个进程相对高并发的读取删除数据库的时候,经常会出现事物锁锁死,导致锁等待时间超时的致命错误。 翻看日志,可以查看到最早出现的是以下错误InternalError(1205, 'Lock wait timeout exceeded; try restarting transaction')但是该错误提示仅仅出现了几次,之后会不断的出现下面的错误提示OperationalError(2013,

2017-12-02 00:15:16 3182

原创 TinyHttpd源码感悟

花了好一会儿的时间去阅读了TinyHttpd的源码,读完了确实对HTTP和http服务器有了一些不一样的见解。HTTP之前一直在想,浏览器发起一个HTTP请求的时候,到底在发送些什么。定义了那么多有的没有的东西,对于服务器来说,他是怎么根据HTTP头去知道的。现在总算是知道了。 对于HTTP协议而言,其本质上就是一系列的文本,浏览器在进行HTTP请求的时候,实际上就是在发生一系列的文本信息。服务器

2017-11-26 16:19:08 396

原创 multiprocessing对僵尸进程的处理

关于僵尸进程的相关资料,这篇博客讲的挺透彻的,可以参考进行学习了解。 之所以想写这么一篇博客,是在学TCP/IP网络编程时,讲到多进程服务器的构建时,父进程需要对子进程进行处理,不然的话会产生一堆的僵尸进程,最后会危害整个系统。然后想到我之前写的爬虫,Dwonloader使用的就是多进程的方式来并发下载数据。在Downloader中,我的做法是凑够一定数量的请求,然后开启一个进程,让这个进程去处理

2017-11-22 16:37:21 7679 2

原创 TCP/IP网络编程(二)

本文将介绍在计算机网络编程中如何协议和地址进行通讯。 对于计算机网络而言,协议是一个绕不开的东西。我们需要定义好各种各样的协议来适应不同的通信环境。因此在进行网络编程的时候,我们需要和对方互相协商好,我们使用什么协议来进行通讯。回到我们一开始所创建的socket上,对于上一节所介绍的socket函数,他的几个参数便分别说明了该socket的协议类型int socket(int domain, in

2017-11-16 23:12:12 523 1

原创 TCP/IP网络编程(一)

这一系列博客将用于记录学习《TCP/IP网络编程》的笔记。 先上代码。下面是服务器端的代码#include <stdio.h>#include <stdlib.h>#include <string.h>//提供针对系统调用的封装#include <unistd.h>//提供用于网络字节序转换的函数#include <arpa/inet.h>#include <sys/socket.h

2017-11-16 20:44:08 8175 3

原创 新浪微博爬虫阶段总结

首先还是自我检讨一下,做这个破爬虫花了我好长一段时间,整体的效率实在是太低了。这是项目地址。 做这个爬虫的过程中,遇到了无数的坑,但是还好都填补上了,但是还是有几个问题实在是难以解决。暂时先记录如下。MySQL的bug?python执行时传入了正确的语句,但是却出现了插入了错误的数据分属不同文件的消费者生产者不把队列赋值给类的属性,并作为参数传入子进程无法进行通信cannot serial

2017-11-13 23:57:05 1234

原创 Ubuntu16配置LAMP

这篇文章算是给自己看的吧,也可以给大家作为配置参考。 首先需要升级一下系统的仓库(是这么叫吧),不然apt-get 可能就是个残疾的东西,啥都下不了。使用以下命令来升级仓库sudo apt-get update && sudo apt-get -y upgrade为了方便,我所使用的都是root账户,所以有些命令直接就无视sudo了,你们需要注意一下这点。安装apache2首先使用以下命令来安装a

2017-11-04 21:34:20 354 2

原创 cannot serialize _io.BufferedReader object问题总结反思

照例先上代码。这份代码跟我的爬虫代码犯了一样的错。class Text: def __init__(self): self.num = 10 def Start(self): read = Process(target = self.read) write = Process(target = self.write) rea

2017-10-21 23:36:31 14961 2

原创 python统计学习相关琐碎知识点

np.cov 用于求协方差,当rowvar=1时,按行求协方差,为0时按列求

2017-08-10 20:47:09 267

原创 (笔记)初步了解监督学习

今天开始初步的涉猎统计学习方法,以该系列博客作为自己学习的成果吧 简介统计学习(statistical learning)是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测和分析的学科。由这段话我们可以看出,统计学习建立在数据的基础上,我们获取数据,对数据进行一定的探究,提取数据的特征,抽象出数据的模型,来发现数据之间的关系,从而能够对我们想要探究的问题进行预测。 统计学习关于数据

2017-08-06 19:31:42 518

原创 pandas琐碎知识点

Series的切片与普通python切片不同,为一个封闭区间 DataFrame里用axis表示轴,其中0表示行,1表示列利用groupby分组求平均值 people.groupby(key).mean() 该方法能够利用key分组,并得到均值,但是会创建一个新的视图,key为行,列不变people.groupby(key).transform(np.mean)该方法得到的均值按照原来的样子展

2017-08-01 17:09:36 352

原创 Pands函数相关

pandas的琐碎知识点,给自己看的而已

2017-08-01 16:46:57 604

原创 微分方程建模实例:对药剂量开处方

对于制药人员而言,决定一种药什么时候吃一次吃多少是一件非常严肃的问题。当体内的药物浓度高于一定值会给人体带来伤害,过低又起不到治病的效果。所以产生了如下问题: 药的剂量和给药间隔应该如何调节,才能保证体内的药物浓度处于一个安全有效的范围内?

2017-07-22 20:34:02 3711 1

原创 完全冲突博弈的线性规划模型之混合策略建模

简介在棒球比赛中,投球手和击球手进行一种混合策略的博弈。考虑下面的表,击球手如果预测投球手会投出快球,按照投球手实际投出的快球或是弧线球,他击球将分别的得到0.4分或0.2分。同样,如果击球手预测投球手将投出弧线球,而按照投球手实际投出的球是快球或是弧线球,击球手分别可以得到0.1分或0.3分。 显然,在一场比赛中,投球手希望击球手的平均得分最小,而击球手希望自己的评分得分最高。

2017-07-19 19:57:59 2851

原创 Python各类插值拟合方式及画图

简要的记录了numpy和scipy中常用的用于数据拟合的相关函数

2017-07-14 16:02:27 5820 2

原创 光滑化:构建低阶多项式模型

高阶多项式能够完美的拟合所提供的数据,但如我们们上一章,其摆动的倾向过大,超过实测点的函数图像变化幅度过大,这点一直令人所诟病。因此,需要寻找一种方式来减少多项式模型的摆动,或者称为光滑化多项式模型。 关于光滑化,一个通用的技术是选取一个低阶多项式,而不管数据点的个数。

2017-07-12 17:54:53 2032

原创 初探高阶多项式模型

之前我们探究的模型大多数简单的单项模型,由于其简单方便,在粗略的描述问题的时候,单项模型的应用并无太大问题,但是在现实生活中,单项模型因为其过于简单粗略,其应用范围,可用性是极其有限的。因此我们常常考虑一种有多项的模型,即高阶多项式模型。因为多项式容易进行积分,微分,其应用非常广泛。

2017-07-11 22:40:41 8134

原创 初步选择一个好模型

我们有多种方案来对模型进行数据拟合,来得到模型中国的未知参数值,因此存在着一个问题,我们如何去挑选一个合适的模型。

2017-07-11 17:03:15 345

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除