Soul Orbit

I'll take a quiet life. A handshake of carbon monoxide.

文章链接是写博客时一个非常常用的东西,因为如果每次写博客都需要在文章前后加上一个几乎格式一模一样的东西,还是很烦人的,特别如果你突然决定改变文章的永久链接,那么就更加烦人了,因为默认在Hexo里面,我们需要一篇文章一篇文章的把所有的文章链接改了(虽然这种情况我们需要尽量避免),所以这里我写了一个小插件来帮我们简化这个步骤————hexo-tag-post-link。

项目地址:https://github.com/r12f/hexo-tag-post-link

1. 安装

和其他的hexo插件一样,hexo-tag-post-link安装起来十分简单,只需要在博客目录下执行如下命令即可:

1
npm install hexo-tag-post-link --save

2. 使用方法

2.1. 插入标签

hexo-tag-post-link使用起来非常的直观,我们需要做的主要就是在博客里面你喜欢的位置加入一个标签,格式如下:

1
{% post_link <template_name> %}

这里template_name是我们指定的模板名字,比如,如果我们的模板名字叫做header,那么我们只需要插入如下标签:

1
{% post_link header %}
Read more »

终于把博客搬迁了个大概,虽然已经有不少文章在说怎么用github和hexo搭建博客了,但是真正在做的时候还是依然觉得走了不少弯路,所以决定还是写一篇文章做个记录吧。

1. 事先准备

要使用Hexo,在开始之前,我们需要安装nodejs和git。如何安装这里就不再赘述了,我比较推荐使用chocolatey。至于为什么?方便啊!

chocolatey的工程在这里:https://chocolatey.org/,安装需要在powershell下,但是安装完之后就可以在cmd下执行了。

1
2
3
4
5
:: 安装git
choco install git

:: 安装nodejs
choco install nodejs
Read more »

最后还是打算把博客迁移到github上来托管了,自己管理主机是挺好玩,但是实在没时间折腾了。。。没有CDN,不是墙外加载慢,就是墙内加载慢,而且还时不时的有人来攻击一下。。。不明白呀,我一个小博客,里面能有啥。。。现在全部换成静态网页挂在github上,CDN也有了,也不用怎么担心被攻击了~

Hexo确实相当好使啊,而且用Markdown写博客,用git管理实在是太对我的口味了,现在麻烦的事情还有两个,一个是设置CI,自己老在本机编译实在是太土了;另外就是怎么把老的内容迁移过来,这么多年下来写的杂七杂八虽然现在看起来简直就是黑历史,但是就这么扔掉还是怪可惜的。。。再折腾一下,看看怎么才能解决Hexo导入Wordpress遇到的各种异常好了。

自从上次换了工作,新工作,新环境,新文化,新语言,适应起来果然还是需要时间,一段时间忙的焦头烂额,博客就再次长草了,这次先来篇简单的文章除除草。

之前使用Linux的时候觉得有样东西特别的方便——.bashrc,每次打开命令行这个文件都会被加载,这样你就可以把你常用的命令放在这个文件里面,从而简化操作。那Windows下,有没有类似的东西呢?

当然是有的,虽然没有Linux下那么的直接,有一个固定的文件,但是在Windows下可以通过注册表来指定加载命令行时需要先加载什么文件。只需要在运行在管理员模式下的命令行中运行如下命令即可:

1
reg add "HKLM\Software\Microsoft\Command Processor" /v "AutoRun" /t REG_SZ /d "<file path>" /f

举个栗子,我们创建一个cmd-init.cmd,用来在启动命令行时设置一个环境变量:

1
2
3
echo @echo off > C:\Users\Riff\config\cmd-init.cmd
echo set test=1 >> C:\Users\Riff\config\cmd-init.cmd
reg add "HKLM\Software\Microsoft\Command Processor" /v "AutoRun" /t REG_SZ /d "C:\Users\Riff\config\cmd-init.cmd" /f

接下来,我们启动命令行之后,就可以输出这个环境变量了:
cmd-init-result

原创文章,转载请标明出处:Soul Orbit
本文链接地址:Windows命令行的“.bashrc”

在前面的两篇文章里,我们已经使用WPA的多个图表找到了两个平时经常遇到的问题的真正原因,但是实际上WPA的图表功能远比我们看上去的强大。这一篇,我们来说一些只和图表有关的内容吧,也许这些内容看上去比较乱,而且没有那么有直接的用处,但是也许通过查看经过你自己调整后的图表,你能更好的了解系统里面发生的事情。

1. 数据表(Data table)

数据表是WPA中非常重要的部分,经过解析后的数据会被存放在各个表中,再通过一定的规则生成各种图来更加直观的展示表格中的数据。在WPA里面,所有的数据表都可以通过Graph Explorer来访问。

和普通的表格一样,数据表中的原始数据只是一行一行的记录,但是这样的数据对我们来说非常的难理解,所以为了方便大家更加容易理解这些数据,在数据表中,WPA通过一根黄线和一根蓝线,将表格分为三种不同的区域,并将数据按照我们的需要组织起来,这三个区域分别是:

  • 关键字(Key Area):这部分在黄线之前,放在这个区域里面的列,如果具有相同的值,会被聚合起来变成一条记录,方便我们查看到底有多少类记录,其数据总量是多少,当然,我们也可以展开被聚合的记录来看里面都有哪些具体的记录。另外这部分还会被当作绘制图形时的分组。
  • 数据区(Data Area):这部分在黄线和蓝线的中间,放在这个区域里面的列不会被聚合,展开时所有的记录会和普通的表一样被平铺开来。
  • 绘图区(Graphing Element Area):这部分在蓝线之后,放在这个区域里面的列会被用来绘制当前表格对应的图形。

现在让我们再打开第一篇中我们使用过的Trace,查看Disk IO,重新看看我们已经看过的数据表吧。
wpa-disk-io-default-view

Read more »

上回我们说道记事本怒开大文件,WPA奋勇显神威。通过CPU Sampling Graph和Disk IO Graph,我们很快的定位到了记事本打开大文件缓慢的真正原因。但是就和硬盘里和生活中的女神们一样,现实往往都是残酷的。很多时候不是程序本身消耗了很多的CPU和磁盘资源,最后导致了程序运行的缓慢,甚至我们通过任务管理器查看,会发现CPU,硬盘的使用其实都不高,似乎整个系统是空闲的,但是却就是不干活,这又是为什么呢?这一次,让我们来看一个稍稍复杂一点点的问题吧。

1. 线程状态

为了让我们更加好的理解接下来的内容,首先,我们需要先补充一点和Windows下线程调度相关的背景知识,当然如果你已经知道了,可以跳过这一节。

Windows下线程在被调度的过程中,如性能相关的状态主要有三个:

  • 运行中(Running):该线程正在运行中。
  • 就绪中(Ready):该线程已经可以运行了,但是暂时还没有得到CPU。
  • 等待中(Waiting):该线程正在等待某个资源,暂时还无法运行。

他们之间可以相互转化,其状态转化图和转化原因如下:
thread-state

Read more »

2013年10月20日,WPT终于迎来了新一轮的更新,在这次更新之后,我们在WPT的目录下已经找不到xperfview的身影了,而WPA则添加了多项新的功能。由于平时用WPA还算用的比较多,而且这工具实在相当好用,所以在这里打算写一些文章介绍一下它。

1. WPT简介

WPT的全名是Windows Performance Toolkit,是Windows下用来进行性能分析的一套工具,它的功能非常强大,你可以使用它来监控CPU,内存,磁盘和网络等等的活动,从而来确定当前系统的性能瓶颈。虽然它功能强大,但是却完全免费。它包含在Windows Assessment and Deployment Kit (Windows ADK)中,最新的版本是8.1,你可以通过MSDN来下载并随意使用它:http://www.microsoft.com/en-US/download/details.aspx?id=39982

WPT主要包含两个部分:Windows Performance Recorder (WPR)和Windows Performance Analyzer (WPA)。从名字我们就很容易看出来,前者是用来记录性能数据的,后者是用来分析性能数据的了,后面我们会更加详细的介绍这两个工具。

2. 这东西怎么做到的?

原理,我们喜欢原理。和其他的性能分析工具不同,它是由Windows本身的事件机制来提供支持的——Event Tracing for Windows (ETW)。

2.1. Event Tracing for Windows (ETW)

ETW是从Windows 2000开始就引入的一种高速的事件记录机制,而在Vista之后,Windows又对其进行了完善,使其可以记录比之前多的多的信息,比如系统CPU上正在运行的堆栈,而现在它已经成为Windows中最主要的一种分析性能问题的方法了。

下面这张图来自MSDN,展现了ETW的主要基本架构,主要分成4个部分:Session,Controller,Provider和Consumer。

  • Provider:ETW的事件提供者,我们在最后的记录文件中看到的事件就是来自于他们。
  • Consumer:ETW的事件接收者,比如我们实现一个实时的Consumer来查看系统中当前有那些事件正在发生。
  • Controller:用于开关ETW的事件。
  • Session:它存在在内核中,用于表示一个ETW事件记录会话。系统中可以存在多个Session,每个Session都可以接收来自于多个Provider的事件,最后我们可以将多个Session中的事件写入一个日志文件中,这个日志文件就叫做Trace。
    etw-overview

通过ETW,我们可以将系统所有关键的地方都加入事件,记录其行为和堆栈,比如CPU执行,线程切换和读写磁盘,这样我们就可以利用这些信息来进行分析了。

Read more »

最近突然对Go语言产生了兴趣,主要是因为在使用python的时候遇到了一些不爽的问题,然后发现了Go。Go是Google出的一个动态语言,语法和C++接近性能也非常的好,而且还支持编译成exe发布,并且不依赖任何虚拟机(其实是打包在exe里面了),这种好语言怎么能够错过?所以便一时兴起,开始学习了起来。由于本人还处于异常小白的阶段,所以文章中可能不免有些错误,欢迎大家各种指正。

1. 安装Go

前往Go语言的官方网站:http://golang.org/,下载对应平台的安装包。如果是x86的系统可以就下载i386的,如果是x64的系统,那么就安装amd64的就可以了。另外Go语言在Windows下的的安装包有两种:msi和zip的。zip的是免安装的,解压在配置一些环境变量之后就可以使用,msi的则是安装包版本的,安装的时候会设置好对应的环境变量。为了方便,我就下了x64上的msi安装包:go1.1.2.windows-amd64.msi。下好安装包后,安装过程就很简单了,下一步到底就好了。 虽然msi会自动配置一些环境变量,但是本人在安装完之后还是遇到了部分环境变量丢失的情况,所以在安装完Go之后,我们最后还是检查一些所有的环境变量是否正常。主要的环境变量有以下几个:

  • GOROOT:Go的安装目录
  • GOPATH:用于存放Go语言Package的目录,这个目录不能在Go的安装目录中
  • GOBIN:Go二进制文件存放目录,写成%GOROOT%\bin就好
  • GOOS:操作系统
  • GOARCH:指定系统环境,i386表示x86,amd64表示x64
  • PATH:需要将%GOBIN%加在PATH变量的最后,方便在命令行下运行Go
  • 我们还可以使用go env来查看所有其他的环境变量的定义
    go-env

当环境变量都配置正常之后,Go就已经安装完毕了。现在打开命令行,运行go,大家应该就可以看到如下的提示了。

Read more »

最近突然想学习一下PE文件的结构,所以就写了一个PE文件的解析库,纯属好玩。于是经过了1个月的业余时间的折腾,LibPE v0.1 Preview终于诞生了。

项目名称:LibPE
项目地址:https://github.com/r1f/libpe
License:The BSD 2-Clause License

欢迎大家去围观,如果有人参与那就更加的Happy鸟~Licese是BSD的,所以基本上大家可以拿来随便用了。

1. 功能

现在这个库到底能做什么呢?说出来真的是太简单了,所以才把这个版本定位v0.1 Preview,供围观之用。

  • 解析磁盘上的PE文件,暂时不支持解析映射好的PE。
  • 支持解析32位(PE32)和64位(PE32+)的PE文件。
  • RVA,VA,FOA转换
  • 解析PE基本头部信息,段表,导出表,导入表,资源表,重定向表和导入函数地址表
  • 支持获取PE文件的原始数据结构,并且对结构中的字段提供想对应的getter,如IPEOptionalHeader::GetFieldDllCharacteristics
    (注意:这里拿到的是原始数据,在文件中和在映射好后的映像中可能会不一样)

好了,围观完了之后,我们现在再大概描述一下LibPE想做什么吧~

Read more »

前段时间对皮肤引擎比较感兴趣,于是在VS第一人称快的无法直视的dot大神推荐下,看了一个小巧又好用的皮肤引擎:duilib。

1. duilib简介

duilib是一个开源的DirectUI界面库,简洁但是功能强大。而且还是BSD的license,所以即便是在商业上,大家也可以安心使用。

现在大家可以从这个网站获取到他们所有的源码:http://code.google.com/p/duilib/

为了让我们能更简单的了解其机制,我们按照如下顺序一步一步的来对他进行观察:

  1. 工具库:用于支撑整个项目的基础
  2. 控件库:这是dui最关键的部分之一,相信也是大家最关注的部分之一,另外这里也来看看它是如何管理这些控件的
  3. 消息流转:有了控件库,我们需要将Windows窗口的原生消息流转给这些控件,另外在这里也来看看Focus,Capture等等的实现
  4. 资源组织和皮肤加载:有了上面所有的这些,我们再来看看它是如何自动创建皮肤的
  5. 简单使用:最后,来看看到底要如何使用它

以下是duilib工程带的一副总体设计图,在看代码之前看看这幅图,对看代码会很有帮助。
duilib

Read more »
0%