自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

海风林影

一个代码可以创造一个世界,也能毁灭一个世界~

  • 博客(79)
  • 资源 (8)
  • 收藏
  • 关注

原创 Pycharm 下远程调试 Neutron 简介

实验背景及环境介绍众所周知要深入学习一款开源软件就去阅读它的源码吧,但如果只是阅读冷冰冰的代码,往往是一头雾水,你肯定希望知道代码运行起来的上下文、变量值的变化,那么你需要调试。对于 Openstack 来说,大多代码都是开源 Python 编写的,这对于学习来说成本低很多,因为你可以随时修改它的代码,重启下进程你的代码就开始运行了。即使这样,对于调试 Openstack 这样大型的软件还

2017-09-23 00:29:38 1987 1

原创 搭建私有 Docker 仓库服务器

Docker Hub 是 Docker 官方的公共仓库服务器,用户在 DockerHub 上只能创建一个私有仓库,这对于有些用户是不够用的,而且 DockerHub 服务器的访问速度也是个很大问题,那么我们希望能在自己本地的服务器上创建一个类似于 DockerHub 仓库服务器供团队使用,这也是可以的。我测试的环境是 Mac OSX 下,已经通过 Boot2Docker 工具安装好 Doc

2015-04-19 14:58:12 19703

原创 最小 Docker 镜像 hello-world 剖析

开始学习 Docker 的同学基本上都是按照官方的 guide 来安装,之后要测试是否已经安装成功,官方会让你 pull 一个 hello-world 示例镜像下来并运行,如下命令: guohl@ghl-MBP ⮀ ~ ⮀ docker pull hello-world31cbccb51277: Pull completee45a5af57b00: Pull complete511136ea3

2015-04-18 10:29:03 26906 2

原创 Windows 更新导致 VirtualBox 启动失败

我的虚拟机版本是 4.3.20, Windows 版本是 Windows 8,但今天突然发现 VirtualBox 启动不了,报的错误如下:为了搜索引擎能检索到此错误信息,我将错误信息的文本贴在下面: NtCreateFile(\Device\VBoxDrvStub) failed: Unkown Status - 5600 (0xffffea20) (rcNt=0xe986ea20) V

2015-04-17 23:56:55 13115

原创 Linux 磁盘管理实践

问题描述研一的小伙伴向我反应实验室的 Confluence 知识管理系统上传不了附件,经过排查发现是磁盘空间不足了,使用 df 命令查看磁盘使用量如下图:实验室的文件服务器有三块硬盘,分别为 250GB、1TB、1TB,对应的设备文件名分别为 /dev/sda1、/dev/sda2、/dev/sda3,但图中看到只有两块硬盘的信息,是因为第二块磁盘作为物理的 RAID1 备份第三块磁盘。现在文件系统

2015-04-17 18:53:09 2221

原创 make 学习笔记

make 是用来构建和管理工程的工具,它是一个命令,需要解释一个称为 makefile 中的指令,makefile 是描述工程中所有文件的编译、链接的规则。make 可以根据依赖文件和目标文件的最后修改时间,来决定哪些文件需要更新,哪些文件不需要更新,这样能高效地构建工程。makefile基本规则描述makefile 主要是由规则来组成的,一个基本的规则描述如下:

2015-04-01 11:07:21 1604

原创 从12306帐号泄漏谈用户密码安全

新闻回顾12月25日圣诞节,据漏洞反馈平台乌云网显示,大量12306用户数据在互联网疯传。本次泄露的用户数据包括用户帐号、明文密码、身份证、邮箱等。随后,12306官方发表公告,称经过认真核查,此泄露信息全部含有用户的明文密码。12306网站数据库所有用户密码均为非明文转换码,网上泄露的用户信息系经其他网站或渠道流出。12月26日,中国铁路官方微博发消息,铁路公安机关将涉嫌窃取

2014-12-27 21:12:22 2173 2

原创 编程语言的类型系统

每学一门新的编程语言时,在看到介绍该门编程语言的特点时,经常会遇到 静态、动态、强、弱 、隐式、显式 类型等字样,似懂非懂,这里结合网上的资料总结一下它们的含义以及区别,描述不一定专业、准确,但求能进一步理解这些词的概念即可。类型系统(Type System)用于定义如何将编程语言中的数值和表达式归类为许多不同的类型,如何操作这些类型,这些类型如何互相作用。根据这些种种不同,可以将编程语言

2014-12-21 15:56:21 1563

原创 Python Socket 编程——聊天室示例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型。本文再通过一个例子来加强一下对 Socket 编程的理解。聊天室程序需求我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天。如下图

2014-12-17 10:37:34 5071 1

原创 Python Socket 网络编程

Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,

2014-12-11 19:46:00 2128

翻译 为什么 C++ 中成员函数指针是 16 字节?

当我们讨论指针时,通常假设它是一种可以用 void * 指针来表示的东西,在 x86_64 平台下是 8 个字节大小。例如,下面是来自 维基百科中关于 x86_64 的文章 的摘录:Pushes and pops on the stack are always in 8-byte strides, and pointers are 8 bytes wide.从 CPU 的角

2014-12-09 22:37:13 1573

原创 GNU Readline 库及编程简介

用过 Bash 命令行的一定知道,Bash 有几个特性:TAB 键可以用来命令补全↑ 或 ↓ 键可以用来快速输入历史命令还有一些交互式行编辑快捷键:C-A / C-E 将光标移到行首/行尾C-B / C-F 将光标向左/向右移动一个位置C-D 删除光标下的一个字符C-K 删除光标及光标到行尾的所有字符C-U 删除光标到行首的所有字符...同样的操作在很多交互式程序都有类似的

2014-12-09 22:22:03 5244

原创 C/C++ 中头文件相互包含引发的问题

C/C++ 中头文件相互包含引发的问题今天下午遇到一个头文件相互包含而导致的编译问题,花了我不少时间去调试没找到问题,最后晚上跟师兄讨论不少时间,突然有所顿悟!问题重现我把问题脱离于项目简单描述一下:我写了一个函数 bool func(ClassA* CA) 需要加到项目中,我就把这个函数的声明放到 head1.h 中,函数参数类型 ClassA 定义在另一个头文件 hea

2014-08-16 00:39:34 68143 15

原创 浅谈 C++ 中的 new/delete 和 new[]/delete[]

在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢?new 和 delete 是函数吗?new [] 和 delete [] 又是什么?什么时候用它们?你知道 operator new 和 operator delete 吗?为什么 new [] 出来的数组有时可以用 delete 释放有时又不行?…如果你对这些问题都有疑问的话,

2014-03-17 22:49:32 159808 45

翻译 什么是 Web 框架?

Web 应用框架,或者简单的说是“Web 框架”,其实是建立 web 应用的一种方式。从简单的博客系统到复杂的富 AJAX 应用,web 上每个页面都是通过写代码来生成的。我发现很多人都热衷于学习 web 框架技术,例如 Flask 或这 Django 之类的,但是很多人并不理解什么是 web 框架,或者它们是如何工作的。这篇文章中,我将探索反复被忽略的 web 框架基础的话题。阅读完这篇文章,你

2014-03-06 13:02:15 2755

翻译 Getting Physical With Memory

当我们试图去了解复杂系统时,去除其抽象层,直接关注最底层,我们会更容易去理解。使用这种方法,我们来看一下内存和 I/O 接口的最简单和基础的层:处理器和总线的接口。这些细节是更上层问题的基础,例如线程同步、Core i7 的需求等。然而,由于我是一个程序员,我将忽略一些 EE 人关注的问题。下面展示的是典型的 Core 2 架构:Core 2 处理器有 775 个引脚,大约一半仅仅

2014-01-20 11:19:33 1377

翻译 例解 Linux 下 make 命令

Linux 下 make 命令是系统管理员和程序员用的最频繁的命令之一。管理员用它通过命令行来编译和安装很多开源的工具,程序员用它来管理他们大型复杂的项目编译问题。本文我们将用一些实例来讨论 make 命令背后的工作机制。Make 如何工作的对于不知道背后机理的人来说,make 命令像命令行参数一样接收目标。这些目标通常存放在以 “Makefile” 来命名的特殊文件中,同时文

2014-01-17 15:12:55 1586

翻译 Hash 函数及其重要性

不时会爆出网站的服务器和数据库被盗取,考虑到这点,就要确保用户一些敏感数据(例如密码)的安全性。今天,我们要学的是 hash 背后的基础知识,以及如何用它来保护你的 web 应用的密码。申明密码学是非常复杂的一门学科,我不是这方面的专家,在很多大学和安全机构,在这个领域都有长期的研究。本文我试图使事情简单化,呈现给大家的是一个 web 应用中安全存储密码的合理方法。

2014-01-16 18:36:04 7329

原创 破解 Windows 下Markdown 编辑器 MarkdownPad 2

MarkdownPad 是 Windows 平台下一款优秀的 Markdown 编辑器,本文简单介绍 Markdown 以及使用一种方法破解 MarkdownPad 使其升级到专业版。该方法仅限于教育用途,我不为滥用该方法导致的商业纠纷负责!Markdown 简介Markdown 是一种轻量级标记语言,有着及其简单、易学易用的语法,任何人在几分钟之内都可以掌握其基本语法并用来写作,

2013-11-29 12:58:37 18461 22

原创 Linux 内核版本命名

Linux 内核版本命名在不同的时期有其不同的规范,我们熟悉的也许是 2.x 版本奇数表示开发版、偶数表示稳定版,但到 2.6.x 以及 3.x 甚至将来的 4.x ,内核版本命名都不遵守这样的约定。本文就简单总结一下关于 Linux 内核版本号那点事:Linux 内核版本号命名四个不同的阶段从内核第一个0.01 版本发布到 1.0 版本。接下来是 0.02, 0.03, 0.

2013-11-13 09:25:54 15434

原创 C 语言中 setjmp 和 longjmp

在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处;但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转。后面我们会看到这两个函数在处理异常上面的非常有用。setjmp 和 longjmp 使用方法我们都知道要想在一个函数内进行跳转,可以使用 goto 语句(不知怎么该语句在中国学生眼中就是臭名昭著,几乎所有国内教材都一刀

2013-11-03 15:56:56 1566 1

原创 GCC 中零长数组与变长数组

前两天看程序,发现在某个函数中有下面这段程序:int n; //define a variable nint array[n]; //define an array with length n在我所学的C语言知识中,这种数组的定义在编译时就应该有问题的,因为定义数组时,数组的长度必须要是一个大于0的整型字面值或定义为 const 的常量

2013-10-27 10:19:51 2010

原创 Linux Core Dump

当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump

2013-10-22 15:06:22 1439

原创 Linux 系统中僵尸进程

Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动。僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸。配图源自 Flickr 僵尸进程如何产生的?如果一个进程在其终止的时候,自己就回收所有分配给它的资源,系统就不会产生所谓的僵尸进程了。那么我们说一个进程终止之后,还保留哪些信息?为什么终

2013-10-17 22:42:45 10929 2

原创 Linux 内核进程管理之进程ID

Linux 内核使用 task_struct 数据结构来关联所有与进程有关的数据和结构,Linux 内核所有涉及到进程和程序的所有算法都是围绕该数据结构建立的,是内核中最重要的数据结构之一。该数据结构在内核文件 include/linux/sched.h 中定义,在Linux 3.8 的内核中,该数据结构足足有 380 行之多,在这里我不可能逐项去描述其表示的含义,本篇文章只关注该数据结构

2013-10-03 17:01:32 2744 1

原创 Linux Kernel代码艺术——数组初始化

前几天看内核中系统调用代码,在系统调用向量表初始化中,有下面这段代码写的让我有点摸不着头脑:const sys_call_ptr_t sys_call_table[__NR_syscall_max+1] = { /* * Smells like a compiler bug -- it doesn't work * when the & below is rem

2013-09-26 15:18:14 3143

原创 Linux 下系统调用的三种方法

系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU、磁盘、打印机等)进行交互提供的一组接口。当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系统调用函数。下面介绍Linux 下三种发生系统调用的方法:通过 glibc 提供的库函数glibc 是 Linux 下使用的开源的标准 C 库,它是 GNU 发布的 libc 库,即运行时

2013-09-22 12:16:20 3178 1

原创 sudo 命令情景分析

sudo 命令情景分析Linux 下使用 sudo 命令,可以让普通用户也能执行一些或者全部的 root 命令。本文就对我们常用到 sudo 操作情景进行简单分析,通过一些例子来了解 sudo 命令相关的技巧。情景一:用户无权限执行 root 命令普通用户登录 shell 之后,如果自身没有权限访问某个文件或执行某个命令时,若该用户获得root授权,那么就可以在需要执行的命

2013-09-20 22:38:15 1503

原创 Linux Kernel代码艺术——系统调用宏定义

我们习惯在SI(Source Insight)中阅读Linux内核,SI会建立符号表数据库,能非常方便地跳转到变量、宏、函数等的定义处。但在处理系统调用的函数时,却会遇到一些麻烦:我们知道系统调用函数名的特点是sys_×××,例如我们想找open函数的内核系统调用代码,在SI提供的符号表中搜索sys_open,能找到函数的声明:asmlinkage long sys_open(const

2013-09-19 21:51:21 4984 3

原创 内核探测工具systemtap简介

systemtap是内核开发者必须要掌握的一个工具,本文我将简单介绍一下此工具,后续将会有系列文章介绍systemtap的用法。什么是systemtap假如现在有这么一个需求:需要获取正在运行的 Linux 系统的信息,如我想知道系统什么时候发生系统调用,发生的是什么系统调用等这些信息,有什么解决方案呢?最原始的方法是,找到内核系统调用的代码,加上我们需要获得信息的代码、重

2013-09-17 19:17:53 2000

原创 Python 数据类型及其用法

本文总结一下Python中用到的各种数据类型,以及如何使用可以使得我们的代码变得简洁。基本结构我们首先要看的是几乎任何语言都具有的数据类型,包括字符串、整型、浮点型以及布尔类型。这些基本数据类型组成了基本控制块,从而创建我们的Python应用程序。字符串字符串(String) 是一段文本字符,通常以某种形式向用户输出。如果我们打开Python的解释器,我们试着最常见

2013-08-21 18:54:17 19306 1

原创 C语言中结构体赋值的讨论

今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题。那么就总结一下C语言中结构体赋值的问题吧:结构体直接赋值的实现下面是一个实例:#include struct Foo { char a; int b; double c

2013-07-23 22:04:35 32356 1

原创 Linux吃掉我的内存

在Windows下资源管理器查看内存使用的情况,如果使用率达到80%以上,再运行大程序就能感觉到系统不流畅了,因为在内存紧缺的情况下使用交换分区,频繁地从磁盘上换入换出页会极大地影响系统的性能。而当我们使用free命令查看Linux系统内存使用情况时,会发现内存使用一直处于较高的水平,即使此时系统并没有运行多少软件。这正是Windows和Linux在内存管理上的区别,乍一看,Linux系统吃掉我们

2013-07-16 22:42:50 1776

原创 Linux Kernel 代码艺术——编译时断言

本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码片段(不关注OS的各个模块的设计思想,此部分我准备写在“深入理解Linux Kernel” 系列文章中),一来通过内核代码复习一下C语言及汇编语言的语法,二来学习内核开发大牛们书写代码的风格及思路。在内核文件 include/linux/bug.h中,有下面两行的宏定义:1 2 

2013-07-15 21:14:16 2418 2

翻译 天河2号荣膺第41届TOP500榜首

国际TOP500组织在6月17日公布最新全球超级计算机500强榜单,由中国国防科技大学研制的“天河二号”以每秒33.86千万亿次的浮点运算速度成为全球最快的超级计算机。天河2号(又称银河2号),将在今年年底部署在广州的国家超级计算机中心。天河2号的惊艳表现标志着时隔两年半后,中国超级计算机运算速度重返世界之巅,2010年11月天河1A曾荣登top500榜首。天河2号有16 000个

2013-06-17 21:18:38 1653

原创 五个好的C语言编程实践

前几天,我看到一个关于编程语言的调查,我发现到目前为止,C 编程语言在全球开发者中仍然稳居前三。如此多的代码使用C来编写,我想分享我多年学习总结的一些好的C语言编程实践。不要使用gets()和strcpy()再也不要使用诸如gets()、strcpy()、sprintf()等等这些函数,这已经是一个广为人知的一个事实,但这些函数仍然在库中,以用来支持那些已经使用这些函数的代码。如果

2013-05-22 19:08:37 3762 1

原创 教程:建立自己的私有云存储

现在云计算已经算不上一个新鲜词了,各大IT公司的产品都会套上一个“云”字来忽悠用户。相信大家都用过网盘,现在更流行的词应该叫“云存储”,像用的比较多国外的有Dropbox、SkyDrive,国内也有百度云网盘、sina微盘、腾讯微云网盘等等,我们可以用这些网盘在不同的设备上来存储/获取数据,如PC、智能手机、平板电脑等等,同时我们希望不同设备间的数据是同步的。我们将要搭建自己的云系统平台,更精

2013-05-09 22:31:01 13754 1

原创 RTEMS 进程切换分析(基于i386体系)

在支持多任务操作系统中,进程切换是不可避免的,以使进程能在单个CPU上并发执行。进程的调度涉及到的东西较多,例如调度的时机、调度的策略等等,在这里我们只讨论RTEMS任务调度中进程切换的细节,通过分析以明白操作系统如何做到使一个CPU的使用权如何从一个任务上切换到另一个任务。下面假设两个任务TASK1和TASK2,当前正在执行的任务executing = TASK1,需要切换到的任务 heir

2013-05-07 10:42:06 1793 2

原创 从IEEE754标准谈C语言浮点数据类型

先看下面几个问题,如果你能准确地回答,那么此篇文章将不适合你:计算机中怎样表示浮点数的,与整型的表示方法有什么不同? 32位精度的float类型和64位精度的double类型能表示浮点数最大范围是多少? 该C语言语句 printf("%d\n", 2.5);  输出结果是什么,为什么? 我先说在此之前我如果回答,答案如下:计算机中有符号整型采用补码进行表示,浮点型怎么表示没想过

2012-12-07 10:55:09 4667

原创 建立自己的函数调用帧

本文从最简单的打印“hello world!”的C程序开始,写出其汇编程序(在汇编中使用C库函数),讲解怎样建立自己的函数调用帧,接着使用jmp指令替代call完成函数的调转与返回。在linux内核中这种技巧被大量使用,最后举出内核中使用到的两个实例。首先,下面的C程序完成的功能,相信大家学大多数语言,都是用来讲解的第一个示例://helloworld1.c #include

2012-11-26 22:30:09 1047

Linux调试技术制kprobes

Kprobe是linux的一种动态调试的技术

2012-11-18

signal-deliver

重点分析了信号处理过程中,进程从内核态切换到用户态,再由用户态切换到内核态的整个过程。

2012-11-05

Linux switch_to

switch_to 汇编宏是linux内核完成进程切换的核心代码

2012-11-05

linux-task_struct

深入解析task_struct 结构体的几个字段

2012-11-05

2012年中科大考研复试离散数学、编译原理试题

2012年中科大考研复试离散数学、编译原理试题

2012-04-04

一个数组子数组的最大和

求一个数组子数组的最大和,这是一道非常经典的公司面试或笔试题目,我分别使用了暴力枚举、分枝界定、动态规划三种算法实现。

2011-05-08

排序算法之基数排序源代码

基数排序是另一种线性的排序算法,但比起计数排序,更适用于排序的元素比较大的情况,其关键之处在于对于每一位的排序必须使用稳定的排序算法,而计数排序是较好的选择。

2011-05-05

排序算法之计数排序源代码另附博客地址

排序算法之计数排序,计数排序是一种线性的排序算法,比基于比较的排序算法效率高,但其应用有特定的领域。我给出了两种策略的计数排序算法,欢迎下载~~如程序中有Bug,恳请指正!

2011-05-04

空空如也

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

TA关注的人

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