|
用户名:larryzhu 笔名:朱之光 地区: 上海 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
记录人生点点滴滴
Staged Event Driven Architecture (SEDA) 介绍
Emacs 基本概念和基本命令
Emacs 基本概念和基本命令
作者:朱之光
Emacs有两个最重要的概念:Buffer和Window。
Buffer表示一份数据。可以是文件加载到内存后形成,也可以是一个尚未命名的草稿;(类似MFC中的CDocument)
Window是显示Buffer的界面区,同时也是用户编辑Buffer的界面。整个Emacs界面就是由多个Window组成。(类似MFC中的View)
Emacs可以同时打开多个Buffer,用户可以自己确定哪些Buffer显示/隐藏。一个Window同一时间只能显示一个Buffer,但一个Buffer可以同时显示在多个Window上。(类似MFC中的多文档/多视图)
如下图所示:

Emacs提供了丰富的命令来进行相关操作。
Buffer commands:
C-x C-f Find file
C-x C-s Save file
C-x k Close file
C-x s Save some buffers
C-x C-b List buffers
C-x b Switch buffer
Editing commands:
C-x u Undo
C-_ Undo
C-s forward search
C-r reverse search
M-x replace-string/replace-regexp
replace string/regexp
M-% replace while searching
Window commands:
C-x o Switch between windows
C-x 1 Delete all but one window
C-x 2 HSplit current window into 2 windows
C-x 3 VSplit current window into 2 windows
System commands:
C-x C-c Quit Emacs
Vim编辑器配合ctags实现函数原型快速定位介绍 (摘)
Vim编辑器配合ctags实现函数原型快速定位介绍 (摘)
找一个源码目录,在终端上运行如下命令,会生成一个tags文件。
ctags -R
然后打开vi,输入类似如下的指令,tags=后面为刚才生成的tags文件的全路径名。
:set tags=/Your/Path/To/tags
或者 vim -t /Your/Path/To/tags
然后就可以尝试跳转了。如果是经常使用的工程,将上面的set一行写在你的.vimrc文件里即可。
查阅标识符原型:
光标移动到标识符上,按下Ctrl-]键。Vim会打开原型声明所在的文件,并定位到具体的行列。
Ctrl-t键,Vim将跳回刚才的位置。
g]键(先按g再按]):如果有同名的多个tag,可以用这两个键进行跳转,会提示选择序号。
vi 替换命令用法详解 (转)
vi 替换命令用法详解 (转)
转自:http://www.domsn.net/exurl.php/reply/641.html
格式
:[range]s/[pattern1]/[pattern2]/[g]
说明:
1、range 是命令执行范围的指定,可以使用百分号(%)表示所有行,使用点(.)表示当前行,使用美元符号($)表示最后一行。你还可以使用行号,例如10,20表 示第10到20行,.,$表示当前行到最后一行,.+2,$-5表示当前行后两行直到全文的倒数第五行,等等。
2、s 表示其后是一个替换命令。
3、pattern1 这是要查找的一个正则表达式,这篇文章中有一大堆例子。
4、pattern2 这是希望把匹配串变成的模式的正则表达式,这篇文章中有一大堆例子。
5、g 可选标志,带这个标志表示替换将针对行中每个匹配的串进行,否则则只替换行中第一个匹配串。
apt-get 介绍
apt的镜像源存放在/etc/apt/sources.list中。可以根据所在地区网络情况对文件进行修改。
http://ubuntu.cn99.com/ubuntu/对于中国地区速度非常理想。
apt-get命令介绍
apt-get update
更新同步本地package数据库。(每次修改/etc/apt/sources.list后需要执行)
apt-get clean && apt-get autoclean
清除本地package缓存
apt-get upgrade
尝试更新本地已经安装的所有package
apt-get dist-upgrade
更新整个发布版本到另外一个版本
apt-get dselect-upgrade
dselect更新
apt-get install mozilla-firefox
安装package
apt-get remove mozilla-firefox
删除package
apt-get --purge remove mozilla-firefox
删除package,包括所有配置文件
apt-get source mozilla-firefox
获取源码
apt-get build-dep mozilla-firefox
更新源码包依赖的源码
OpenSSL 编译
OpenSSL 编译
作者:朱之光
步骤:
1、安装Perl;
2、下载OpenSSL并解压到e:\work\openssl;
3、启动VS command prompt控制台;
4、cd e:\work\openssl
5、perl Configure VC-WIN32 --prefix=d:\openssl
6、ms\do_ms.bat
7、修改ms\nt.mak和ms\ntdll.mak
去掉CFLAG定义中的/WX。(/WX表示treat warning as error,该开关会导致openssl无法编译)
8、执行编译
nmake -f ms\nt.mak install <-- Static Library
nmake -f ms\ntdll.mak install <-- Dynamic Library
注意:
如果跳过第7步,会导致编译错误。如下:
.\crypto\cversion.c(105) : error C2220: warning treated as error - no 'object' file generated
.Net Framework自带的微型WebServer
.Net Framework自带的微型WebServer
在调试Asp.net网站程序的时候VS会启动一个WebServer协助调试,而不需要使用IIS。
这个WebServer就是随同.Net Framework一起发布的WebDev.WebServer。下面是其使用方法。
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\WebDev.WebServer.EXE /port:1091 /path:"
这个WebServer甚至可以随同你自己的应用程序一起发布:)。
使用限制:
WebDev.WebServer.exe仅接受本机访问。
Singleton -- fully lazy instantiation
Singleton -- fully lazy instantiation
public sealed class Singleton { Singleton() { } public static Singleton Instance { get { return Nested.instance; } } class Nested { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Nested() { } internal static readonly Singleton instance = new Singleton(); } } |
OpenMP 介绍
OpenMP 介绍
作者:朱之光 (larry1zhu@gmail.com)
1、 简介
2、 Hello world!
3、 循环优化
4、 其他
5、 参考网址
简介
OpenMP是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程接口。
由SGI发起。官方网站www.openmp.org
Microsoft VC++ 从版本2005起加入了OpenMP支持。使得我们可以很轻易的写出并行运算的程序。
先看一个简单例子(Hello world!)
1、 创建一个简单的Windows Console工程;

2、 启用OpenMP支持
工程属性->C/C++->Language->OpenMP Support: Yes

3、 编写如下代码
4、 执行结果

5、 调整并行执行数量
设置环境变量:OMP_NUM_THREADS=10
(设置10个并行执行线程,也可以在程序内部调用omp_set_threads_num(10);实现。)

6、 再执行一次
下面对程序进一步说明。
1、 OpenMP需要包含omp.h,启用OpenMP支持后,编译器会自动引用vcomp.lib
2、 #pragma omp parallel是一个编译器指引,指导编译器生成相应代码;
3、 #pragma omp parallel
#pragma omp parallel
{
//此处的程序块会被多个线程并行执行
}
4、 进入程序块后OpenMP库代码会被执行,最终产生OMP_NUM_THREADS个工作线程,并行执行程序块中的代码;
5、 只有所有线程都执行完后才会结束程序块,执行后面的代码。后面的代码将是单线程执行;
循环优化
循环优化是并行计算中的重要课题。OpenMP对循环优化提供了部分支持。
参看如下代码:

由于程序设置了并行线程数量为3,所以0-100的循环会被分割为三个部分:0-33,34-66,67-100。分别由三个线程并发执行。
结果如下:

其他
并行计算和多线程编程一样,主要需要考虑两个问题:数据访问的互斥和线程间的同步。
OpenMP对此提供了相应的支持。请参考文后提供的网址。
参考网址
http://msdn.microsoft.com/en-us/library/tt15eb9t.aspx
英文中精确时间表示
second 1 sec
millisecond 10^-3 sec
microsecond 10^-6 sec
nanosecond 10^-9 sec
Windows消息机制要点 (转)
.Net下使用脚本技术
.Net下使用脚本技术
作者:朱之光 http://larryzhu.bokee.com
脚本技术可以带来极大的灵活性。可以代替配置文件,可以支持用户自定义业务流程。
本文将讨论其中两种脚本技术:Microsoft Script Control 和 Vsa。
1. 基于Microsoft Script Control
该方法通过引入Microsoft Script Control,来负责执行VBScript或Jscript脚本。
优点:易于使用,可以很方便的访问其他COM组件。支持常用的vbscrip, jscript脚本语法。
缺点:不能直接访问.Net对象,仅可访问具有COM Visible属性的类的实例。
下面是操作示例:
第一步,建立一个C# Windows Form Application工程;
第二步,添加COM引用;

效果

接下来就可以在工程中使用了。
实例代码:
[ComVisible(true)] //Form1具有ComVisible属性
[ClassInterface(ClassInterfaceType.AutoDispatch)]
public partial class Form1 : Form
{
ScriptControlClass script = new ScriptControlClass(); //创建script引擎对象
public Form1()
{
InitializeComponent();
script.Language = "jscript"; //设置语言
}
private void button2_Click(object sender, EventArgs e)
{
script.ExecuteStatement(richTextBox1.Text);
}
private void button1_Click(object sender, EventArgs e)
{
script.AddObject("form", this, true); //将this加入script引用范围。
script.ExecuteStatement("form.Left = form.Left - 100;"); //执行该脚本会让当前窗口左移100像素。
}
}
2. 基于VSA (Visual Studio for Applications)
VSA是微软提出的用于代替VBA的一套新的脚本程序架构。参考:http://msdn2.microsoft.com/en-us/magazine/cc301954.aspx
VSA建立在强大的.Net平台之上,实际的脚本语言为Jscript.Net。脚本会被动态编译为assembly再执行。
优点:脚本将被编译成assembly,可以无缝访问.Net对象;assembly会被JIT成为本地代码,执行效率高;
缺点:使用较为复杂;脚本必须写成符合Jscript.Net语法。
首先需要添加如下引用
将以下代码保存为ScriptingHost.cs
http://cid-a1aae4940c5d7eca.skydrive.live.com/self.aspx/larryzhu_blog/ScriptHost.cs
调用代码:
// create a new host factory
VsaScriptingHostFactory _factory = new VsaScriptingHostFactory();
// create a new set of hosts
//test1.js将会被加载执行
VsaScriptingHost[] hosts = _factory.Create(@"MyScriptingHost", @"Scripting", true, Application.StartupPath + "\\" + "test1.js");
// wire up to the events of each host
foreach(VsaScriptingHost host in hosts)
{
//event处理
host.AssemblyReferencesNeeded += new ScriptingHostEventHandler(OnAssemblyReferencesNeeded);
host.CompilerException += new ScriptingHostCompilerExceptionEventHandler(OnCompilerException);
host.GlobalItemsNeeded += new ScriptingHostEventHandler(OnGlobalItemsNeeded);
}
// execute the hosts
foreach (VsaScriptingHost host in hosts)
{
host.Execute();
}
以下是test1.js文件内容。Jscript.Net语法
==============================
import System;
import System.Diagnostics;
import System.ComponentModel;
import System.Windows.Forms;
// declare an instance of the Scriptlet type, and create a new instance all at once
var scriptlet : Scriptlet = new Scriptlet;
// call the main method to get things running inside the class,
// i just don't like top-down sequential execution
// outside of classes, it just seems archaic to me
scriptlet.Main();
///
/// The Scriptlet class contains methods to redirect script flow from sequential into a class controlled flow
///
public class Scriptlet // extends Scriptlet
{
///
/// Initializes a new instance of the Scriptlet class
///
function Scriptlet()
{
}
///
/// The main method that channels script flow into the class
///
function Main() : void
{
Debug.WriteLine("This information is being written to the Debug output from a script!!!");
Debug.WriteLine(_scriptingHost.VsaEngine.RootMoniker);
// change the title of the window
_scriptableForm.Text = "Scriptable Window";
// add a menu item
_scriptableForm.FileMenu.MenuItems[0].MenuItems.Add("Scripted Menu Item");
// wire up to some events on the form
_scriptableForm.add_Closing(this.ScriptableForm_Closing);
MessageBox.Show("aaa");
}
///
/// Intercepts the closing event from the form
///
function ScriptableForm_Closing(sender : Object, e : CancelEventArgs) : void
{
// prompts the user and confirms
if (MessageBox.Show("Are you sure you want to exit?", "Exit Confirmation",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question) == DialogResult.No)
e.Cancel = true;
}
}
==============================
TCP 协议中的流量控制 (转)
TCP 协议中的流量控制 (转)
TCP协议上的网络协议特别多
1)交互数据类型,例如telet,ssh,这种类型的协议在大多数情况下只是做小流量的数据交换,比如说按一下键盘,回显一些文字等等。
(2)数据成块类型,例如ftp,这种类型的协议要求TCP能尽量的运载数据,把数据的吞吐量做到最大,并尽可能的提高效率。针对这两种情况,TCP给出了两种不同的策略来进行数据传输。
1. TCP的交互数据流
1.1.捎带ACK的发送方式
这个策略是说,当主机收到远程主机的TCP数据报之后,通常不马上发送ACK数据报,而是等上一个短暂的时间,如果这段时间里面主机还有发送到远程主机的TCP数据报,那么就把这个ACK数据报“捎带”着发送出去,把本来两个TCP数据报整合成一个发送。一般的,这个时间是200ms。可以明显地看到这个策略可以把TCP数据报的利用率提高很多。
当主机A给主机B发送了一个TCP数据报并进入等待主机B的ACK数据报的状态时,TCP的输出缓冲区里面只能有一个TCP数据报,并且,这个数据报不断地收集后来的数据,整合成一个大的数据报,等到B主机的ACK包一到,就把这些数据“一股脑”的发送出去。
2.TCP的成块数据