河西走廊历史变迁

河西走廊是今甘肃西北部狭长的堆积平原,位于祁连山以东,乌鞘岭以北,在中国的历史长河中,河西走廊无论在文化、宗教、经贸以及军事战略地位上都起着重要的作用,对于中国历史上历代中原王朝来说,河西走廊的安危几乎就决定了华夏腹地平原的安危,中国历史上几乎所有盛世王朝都牢牢的掌握着河西走廊咽喉要道,进而西出新疆、经略西域。从河西走廊的历史变迁可以一窥中国代代盛世兴衰的演化史,从西汉开始到如今,数千年的历史风云,历经历代名士大家,河西走廊洗尽铅华,给我们留下无与伦比的敦煌莫高窟,历经金戈铁马黄沙漫漫,玉门阳关犹在,不见当年骠骑司马。河西走廊的风如今依然萧萧,浩瀚星空下的这片土地,似乎也有着记忆,记忆着曾经的驼铃阵阵,记忆着繁华盛世商旅如潮,也同样记忆着曾经的萧瑟寂寥。

模拟MFC关键技术

MFC也就是Microsoft Foundation Class之前一直都是Windows平台软件开发的主要软件框架(Application Framework), 随着新技术的不断产生,MFC也渐渐消失在主流开发者的眼中。诚然,MFC设计的晦涩确实是其一大弊端,正如《深入浅出MFC》的作者侯杰所提到的很多敌视者将MFC这个Application Framework视作Minotaur(希腊神话中的牛头怪,会吃掉迷失在迷宫中的人),但是考虑到MFC设计的时间,其很多设计思想其实很有意思,《深入浅出MFC》中所提到的MFC设计的六大关键技术在现在可能已经有了更好的实现方式,比如说运行时类型识别RTTI,MFC设计之初C++还没有引入运行时类型识别,所以对于此MFC便设计了一套专门的宏以及相应的数据结构进行处理,在今天看来,这着实很麻烦,因为现在C++的特性早已经可以直接进行运行时类型的识别以及转换了。无论怎样,相对于直接调用Windows的api进行界面程序的实现,MFC程序确实是有着相当大的进步,虽然这种进步在当今看来早已落伍,但是MFC作为一个Application Framework的设计思想却值得进行探究。

手写识别综述

关于手写识别已经有很多方法被研究使用,近年来随着深度学习的应用越来越广泛,RNN以及MDLSTM循环神经网络等方法在手写识别中取得了很好的效果,逐渐取代以前的HMM隐马尔可夫或CRF条件随机场的方法,主要得益于RNN在序列标注问题上的几个关键部分得到解决,包括CTC和MDRNN的提出。本文将从手写识别的描述、方法进行介绍,主要介绍深度学习方法在手写识别中的应用。

从卷积到 Convolutional Neural Network

卷积神经网络cnn中最基本的操作是卷积和池化,而卷积操作又赋予了特征提取的功能,本文将从卷积操作的具体运算过程入手总结cnn的相关应用。我使用的数据集为mnist手写数字的dataset,每一个样本为28x28的数字灰度图像。卷积神经网络不仅在图像处理上应用广泛,现在在NLP领域也越来越多的使用cnn进行包括分类在内的各种应用。写这篇文章的目的主要是在学习的过程中同时对卷积cnn做一个梳理,如有不正之处敬请指出。本文涉及到的主要内容包括:

中缀表达式转后缀求值并打印树结构

题目内容:众所周知,任何一个表达式,都可以用一棵表达式树来表示。例如,表达式a+b*c,可以表示为如下的表达式树。现在,给你一个中缀表达式,这个中缀表达式用变量来表示(不含数字),请你将这个中缀表达式用表达式二叉树的形式输出出来。

sharix 3 process and thread

The task switch method in sharix is software switch, so it is mainly about context switch and the change of the register value and there's nothing about TSS segments at the first time. When it is time to add the user process model in sharix, the TSS will be needed because we need it to change the esp0 and ss0 to change the privilege from ring3 to ring0.

sharix 2 memory management

As we have mentioned before, the sharix os kernel part has been divided to several segment, which combines just like a big and complex program. And then we will come with memory paging and virtual memory.

sharix 1 boot a simple os

Sharix has the meaning of sharing, which means it is for everyone to learn and improve. The sharix os is mainly based on the ucore os of the tsinghua university, you can find it on github. So what i am doing is mainly about adding a graphical subsystem to it, and also makes some part of ucore as simple as possible.

libevent cpp 5 封装epoll及epoll内核实现原理

前面介绍了poll和select在内核中的实现原理,可以说本质上两者都是相同的,都是将用户空间的文件描述符及对应事件复制到内核空间,然后在内核空间轮询,如果轮询没有事件,则将当前进程置于该文件描述符的等待队列,如此,在之后该文件进行读写操作时就可以唤醒其等待队列,然后再次轮询时会发现发生了读或者写事件。但是轮询机制在大规模IO复用时会有着明显的缺陷,首先因为poll和select要不断的轮询,所以其时间复杂度为O(n),随着文件描述符的增多会越来越慢,另外文件描述符的增多也会导致要从用户态拷贝到内核态的数据越来越多,在大规模IO复用中,这种拷贝多次执行显然是难以忍受的,可以说基于poll种种缺点,在Linux-2.6版本左右加入了epoll机制,能够非常高高效的进行IO复用。

libevent cpp 4 封装poll及poll内核实现原理

随着Linux的更新在linux-2.1.23版本中加入了poll机制,因为poll的加入导致select的实现变得基于poll了,本文在上一个版本的基础上在libevent-cpp中加入了对poll机制的封装。总的来说,主要介绍libevent-cpp poll机制以及Linux内核对poll机制的实现原理,另外还会介绍到内核中select实现因为poll而做的改变。

libevent cpp 3 读写事件及Linux内核select机制实现原理

关于libevent除了对于信号和超时的处理,最核心的部分其实是对于多路IO复用的封装。IO复用存在多种方式,包括select、poll、kqueue及epoll等多种接口。libevent的实现中用C语言以类似面向对象的方式来将这多种IO复用方式进行封装,对于我们的libevent-cpp而言,可以直接使用父子继承来实现各种不同的IO方式。本文主要介绍一下select机制以及libevent中使用select来处理IO读写事件的方式,然后深入Linux内核介绍一下select的实现机制。

libevent cpp 2 事件重构及时间处理

上一篇介绍主要关于libevent的基本架构,并以C++的方式重写了其中的信号机制,在事件本身的结构还没有进行过多的抽象。在原本的libevent中,事件的类型是由 ev_events 来决定的,而事件所处的状态是由 ev_flags 来决定的。但是客观上来说,不同类型的事件之间的处理方式差别还是挺大的,因而可以分别以不同类进行抽象处理。这篇文章主要在进行事件抽象的基础上增加了时间处理,能够对超时事件进行响应。

libevent cpp 1 基本架构及信号处理

Libevent是一个事件通知库,其API提供了一种机制用于在文件描述符上发生特定事件或者超时之后执行回调函数,此外,libevent还支持因为信号或常规超时引起的回调操作。libevent 旨在替换事件驱动的网络f服务器中的事件循环,应用程序只需要调用 event_dispatch ,然后动态添加或删除事件,而不需要更改事件循环。

application of max network flow

You have some different computers and jobs. For each job, it can only be done on one of two specified computers. The load of a computer is the number of jobs which have been done on the computer. Give the number of jobs and two computer ID for each job. You task is to minimize the max load.

algorithm max network flow

The network flow problem is to seek the max flow of a network, there are several property of a network.

algorithm dynamic programing

Given a set of distinct positive integers, find the largest subset such that every pair \((Si, Sj)\) of elements in this subset satisfies:Si%Sj = 0 or Sj%Si = 0.