算法训练

刘先毅提到 现在的成绩与最初选拔时有很大的进步,练习是有意义的。
1.从有语法错语,无法调通程序到可以AC题目;
2.对提高工程能力有作用;
3.对其他科目实验有作用。关怡然提到 应该如何训练。
关健问题不在于理解与否,而在于速度。
1.反复做同一道典型题,直至可以在规定时间内完成某个算法。
  如在半小时写出最小生成树算法。
2.对比
  1)大量语法错误,需要实验语法;
  2)不知道某功能应用何种函数实现,函数的参数表,需要实验函数的执行效果(作用);
  3)不知道经典算法,需要现场考虑算法;
  4)不能熟练写出经典算法,需要现场调试。

Byte array <=> String in C# .Net

Byte myBytes1[]   =   myMemoryStream.ToArray();
String str   =   System.Text.Encoding.Default.GetString( myBytes1  );
Byte myBytes2[]=System.Text.Encoding.Default.GetBytes( str )   ;

Byte   myBytes1[]   =   myMemoryStream.ToArray   ();
String   str   =   (new   UnicodeEncoding()).GetString( myBytes1 );
Byte   myBytes2[]   =   (new   UnicodeEncoding()).GetBytes( str )   ;

Windows中的计时器(SetTimer和CreateWaitableTimer)

Windows中的计时器(SetTimer和CreateWaitableTimer)   
Timers (SetTimer and CreateWaitableTimer) in Windows
       
1.SetTimer
下面的例子创建了一个计时器(不与窗口相关联),该计时器过程函数建了20个消息框。
The following example creates a timer (that is not attached to a window) whose Timer Procedure creates 20 Message Boxes

#include <windows.h>

class foo_class {
  static int counter;
public:
  //static函数,相当于全局
  static void  __stdcall timer_proc(HWND,unsigned int, unsigned int, unsigned long) {
    if (counter++ < 20)
      MessageBox(0,"Hello","MessageBox",0);
    else
      PostQuitMessage(0);
  }
};

int foo_class::counter=0;

WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {

//第1个参数,MSDN中指出如果置为NULL,即0,不与窗口相关联。
//If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.
//第2个参数会被忽略
//第3个参数,300毫秒触发一次
//第4个参数,触发时由函数foo_class::timer_proc响应
int iTimerID = SetTimer(0, 0, 300, foo_class::timer_proc);
  MSG m;
//这是消息循环
  while (GetMessage(&m,0,0,0)) {
    TranslateMessage(&m);
    DispatchMessage(&m);

   }
  return 1;
}

2.CreateWaitableTimer
这个例子演示如何在windows中使用计时器。
计时器被设计为(1)在第1次调用CreateWaitableTimer后2秒触发,(2)此后每3/4秒触发一次。
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include <process.h>
#include <stdio.h>

unsigned __stdcall TF(void* arg) {
  HANDLE timer=(HANDLE) arg;

  while (1) {
    //此处,进程间通信的接收方
    //timer是命名的,因此进程间或线程间没有区别
    WaitForSingleObject(timer,INFINITE);
    printf(".");
  }

}

int main(int argc, char* argv[]) {
  //创建,命名为0,也可以是LPCTSTR,字符串
  //其他进程可以通过OpenWaitableTimer获得此timer的句柄,并对之进行SetWaitableTimer
  HANDLE timer = CreateWaitableTimer(
    0,
    false, // false=>will be automatically reset
    0);    // name

  LARGE_INTEGER li;

  const int unitsPerSecond=10*1000*1000; // 100 nano seconds

  // Set the event the first time 2 seconds
  // after calling SetWaitableTimer
  //2秒
  li.QuadPart=-(2*unitsPerSecond);
  //通过句柄设置timer
  SetWaitableTimer(
    timer,
    &li,
    750,   // Set the event every 750 milli Seconds
    0,
    0,
    false);
  //用TF函数启动worker线程
  _beginthreadex(0,0,TF,(void*) timer,0,0);

  // Wait forever,
  while (1) ;

  return 0;
}

参考:
1.[http://www.adp-gmbh.ch/win/misc/timer.html ]
2.[http://support.microsoft.com/kb/184796],中文的

MIT开放课程 Structure and Interpretation of Computer Programs video下载

MIT开放课程 Structure and Interpretation of Computer Programs video下载:

  教材Structure And Interpretation Of Computer Programs - Mit Press,
  使用Scheme语言
  有免费工具MIT Scheme,
  在[ http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-001Spring-2005/Tools/detail/Guide-to-MIT-Scheme.htm]
  支持Windows和Linux。

视频下载:
1.flash或mp4
MIT OCW - 6.001 Structure and Interpretation of Computer Programs (1986)
[http://www.archive.org/details/MIT_Structure_of_Computer_Programs_1986]

[ http://ia350602.us.archive.org/3/items/MIT_Structure_of_Computer_Programs_1986/]

2.avi(Divx)或mpg, bit torrent supported
[http://swiss.csail.mit.edu/classes/6.001/abelson-sussman-lectures/ ]

  感谢刘典先生推荐[Structure And Interpretation Of Computer Programs - Mit Press],
他告诉我这本书能帮助确定"机制与策略"的分离。
  感谢李粲先生同意刘典先生推荐这本书,李粲先生与刘典先生一同指出《Unix程序设计艺术》中的"机制与策略"正符合我所说的原则。
  感谢不记得什么时间谁请的烤牛肉,它让我们的交流很畅快。

Total Commander - Addons分类

Total Commander - Addons:
"Plugins

Packer plugins
Packer plugins offer additional pack formats inside of Total Commander, or allow access to special file formats like CD-ROM images, or list files.
File system plugins
File system plugins allow access to whole file systems via the Network Neighborhood, e.g. to a PocketPC device or a Linux file partition.
Lister Plugins
Lister-Plugins allow to show specific file types via F3, e.g. program code with syntax highlighting.
Content Plugins
Content plugins allow to extract specific data from files, like mp3 tags or photo information (e.g. exposure time). This data can be displayed in file lists, or used in the search and multi-rename functions."

对面向对象设计原则的总结(转载)

[http://dev.csdn.net/author/hotmailmsn/67b483ad2819482682f1cd2f542bcd67.html#]
对面向对象设计原则的总结 - 其他 - CSDN技术中心

 
正如牛顿三大定律在经典力学中的位置一样,"开-闭"原则(Open-Closed Principle)是面向对象的可复用设计(Object Oriented Design或OOD)的基石。其他设计原则(里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则)是实现"开-闭"原则的手段和工具。
 
一、"开-闭"原则(Open-Closed Principle,OCP
       1.1"开-闭"原则的定义及优点
1)定义:一个软件实体应当对扩展开放,对修改关闭( Software entities should be open for extension,but closed for modification.)。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
2)满足"开-闭"原则的系统的优点
a)通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。
b)已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。
c)这样的系统同时满足了可复用性与可维护性。
1.2如何实现"开-闭"原则
在面向对象设计中,不允许更改的是系统的抽象层,而允许扩展的是系统的实现层。换言之,定义一个一劳永逸的抽象设计层,允许尽可能多的行为在实现层被实现。
解决问题关键在于抽象化,抽象化是面向对象设计的第一个核心本质。
对一个事物抽象化,实质上是在概括归纳总结它的本质。抽象让我们抓住最最重要的东西,从更高一层去思考。这降低了思考的复杂度,我们不用同时考虑那么多的东西。换言之,我们封装了事物的本质,看不到任何细节。
在面向对象编程中,通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需更改,从而满足"对修改关闭";而从抽象类导出的具体类可以改变系统的行为,从而满足"对扩展开放"。
对实体进行扩展时,不必改动软件的源代码或者二进制代码。关键在于抽象。
1.3对可变性的封装原则
"开-闭"原则也就是"对可变性的封装原则"(Principle of Encapsulation of Variation ,EVP)。即找到一个系统的可变因素,将之封装起来。换言之,在你的设计中什么可能会发生变化,应使之成为抽象层而封装,而不是什么会导致设计改变才封装。
      "对可变性的封装原则"意味着:
a)一种可变性不应当散落在代码的许多角落,而应当被封装到一个对象里面。同一可变性的不同表象意味着同一个继承等级结构中的具体子类。因此,此处可以期待继承关系的出现。继承是封装变化的方法,而不仅仅是从一般的对象生成特殊的对象。
b)一种可变性不应当与另一种可变性混合在一起。作者认为类图的继承结构如果超过两层,很可能意味着两种不同的可变性混合在了一起。
使用"可变性封装原则"来进行设计可以使系统遵守"开-闭"原则。
即使无法百分之百的做到"开-闭"原则,但朝这个方向努力,可以显著改善一个系统的结构。
二、里氏代换原则(Liskov Substitution Principle, LSP
 
2.1 概念
定义: 如果对每一个类型为T1的对象O1,都有类型为T2 的对象O2,使得以T1定义的所有程序P 在所有的对象O1都代换为O2时,程序P 的行为没有变化,那么类型T2是类型T1的子类型。
即,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类。而且它觉察不出基类对象和子类对象的区别。也就是说,在软件里面,把基类都替换成它的子类,程序的行为没有变化。
反过来的代换不成立,如果一个软件实体使用的是一个子类的话,那么它不一定适用于基类。
任何基类可以出现的地方,子类一定可以出现。
基于契约的设计、抽象出公共部分作为抽象基类的设计。
2.2里氏代换原则与"开-闭"原则的关系
    实现"开-闭"原则的关键步骤是抽象化。基类与子类之间的继承关系就是抽象化的体现。因此里氏代换原则是对实现抽象化的具体步骤的规范。
    违反里氏代换原则意味着违反了"开-闭"原则,反之未必。
三、 依赖倒转原则dependence inversion principle, DIP
       3.1概念
   依赖倒转原则就是要依赖于抽象,不要依赖于实现。(Abstractions should not depend upon details. Details should depend upon abstractions.)要针对接口编程,不要针对实现编程。(Program to an interface, not an implementation.)
也就是说应当使用接口和抽象类进行变量类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等。而不要用具体类进行变量的类型声明、参数类型声明、方法返还类型说明,以及数据类型的转换等。要保证做到这一点,一个具体类应当只实现接口和抽象类中声明过的方法,而不要给出多余的方法。
传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块,抽象层次依赖于具体层次。倒转原则就是把这个错误的依赖关系倒转过来。
面向对象设计的重要原则是创建抽象化,并且从抽象化导出具体化,具体化给出不同的实现。继承关系就是一种从抽象化到具体化的导出。
抽象层包含的应该是应用系统的商务逻辑和宏观的、对整个系统来说重要的战略性决定,是必然性的体现。具体层次含有的是一些次要的与实现有关的算法和逻辑,以及战术性的决定,带有相当大的偶然性选择。具体层次的代码是经常变动的,不能避免出现错误。
从复用的角度来说,高层次的模块是应当复用的,而且是复用的重点,因为它含有一个应用系统最重要的宏观商务逻辑,是较为稳定的。而在传统的过程性设计中,复用则侧重于具体层次模块的复用。
依赖倒转原则则是对传统的过程性设计方法的"倒转",是高层次模块复用及其可维护性的有效规范。
特例:对象的创建过程是违背"开―闭"原则以及依赖倒转原则的,但通过工厂模式,能很好地解决对象创建过程中的依赖倒转问题。
3.2关系
"开-闭"原则与依赖倒转原则是目标和手段的关系。如果说开闭原则是目标,依赖倒转原则是到达"开闭"原则的手段。如果要达到最好的"开闭"原则,就要尽量的遵守依赖倒转原则,依赖倒转原则是对"抽象化"的最好规范。
里氏代换原则是依赖倒转原则的基础,依赖倒转原则是里氏代换原则的重要补充。
3.3耦合(或者依赖)关系的种类:
零耦合(Nil Coupling)关系:两个类没有耦合关系
具体耦合(Concrete Coupling)关系:发生在两个具体的(可实例化的)类之间,经由一个类对另一个具体类的直接引用造成。
抽象耦合(Abstract Coupling)关系:发生在一个具体类和一个抽象类(或接口)之间,使两个必须发生关系的类之间存有最大的灵活性。
3.3.1如何把握耦合
我们应该尽可能的避免实现继承,原因如下:
1 失去灵活性,使用具体类会给底层的修改带来麻烦。
2 耦合问题,耦合是指两个实体相互依赖于对方的一个量度。程序员每天都在(有意识地或者无意识地)做出影响耦合的决定:类耦合、API耦合、应用程序耦合等等。在一个用扩展的继承实现系统中,派生类是非常紧密的与基类耦合,而且这种紧密的连接可能是被不期望的。如B extends A ,当B不全用A中的所有methods时,这时候,B调用的方法可能会产生错误!
我们必须客观的评价耦合度,系统之间不可能总是松耦合的,那样肯定什么也做不了。
3.3.2我们决定耦合的程度的依据何在呢
简单的说,就是根据需求的稳定性,来决定耦合的程度。对于稳定性高的需求,不容易发生变化的需求,我们完全可以把各类设计成紧耦合的(我们虽然讨论类之间的耦合度,但其实功能块、模块、包之间的耦合度也是一样的),因为这样可以提高效率,而且我们还可以使用一些更好的技术来提高效率或简化代码,例如c# 中的内部类技术。可是,如果需求极有可能变化,我们就需要充分的考虑类之间的耦合问题,我们可以想出各种各样的办法来降低耦合程度,但是归纳起来,不外乎增加抽象的层次来隔离不同的类,这个抽象层次可以是抽象的类、具体的类,也可以是接口,或是一组的类。我们可以用一句话来概括降低耦合度的思想:"针对接口编程,而不是针对实现编程。
在我们进行编码的时候,都会留下我们的指纹,如public的多少,代码的格式等等。我们可以耦合度量评估重新构建代码的风险。因为重新构建实际上是维护编码的一种形式,维护中遇到的那些麻烦事在重新构建时同样会遇到。我们知道在重新构建之后,最常见的随机bug大部分都是不当耦合造成的 。
如果不稳定因素越大,它的耦合度也就越大。
某类的不稳定因素=依赖的类个数/被依赖的类个数
依赖的类个数= 在编译此类的时被编译的其它类的个数总和
3.3.3怎样将大系统拆分成小系统
解决这个问题的一个思路是将许多类集合成一个更高层次的单位,形成一个高内聚、低耦合的类的集合,这是我们设计过程中应该着重考虑的问题!
耦合的目标是维护依赖的单向性,有时我们也会需要使用坏的耦合。在这种情况下,应当小心记录下原因,以帮助日后该代码的用户了解使用耦合真正的原因。
3.4怎样做到依赖倒转?
以抽象方式耦合是依赖倒转原则的关键。抽象耦合关系总要涉及具体类从抽象类继承,并且需要保证在任何引用到基类的地方都可以改换成其子类,因此,里氏代换原则是依赖倒转原则的基础。
在抽象层次上的耦合虽然有灵活性,但也带来了额外的复杂性,如果一个具体类发生变化的可能性非常小,那么抽象耦合能发挥的好处便十分有限,这时可以用具体耦合反而会更好。
层次化:所有结构良好的面向对象构架都具有清晰的层次定义,每个层次通过一个定义良好的、受控的接口向外提供一组内聚的服务。
依赖于抽象:建议不依赖于具体类,即程序中所有的依赖关系都应该终止于抽象类或者接口。尽量做到:
1、任何变量都不应该持有一个指向具体类的指针或者引用。
2、任何类都不应该从具体类派生。
3、任何方法都不应该覆写它的任何基类中的已经实现的方法。
3.5依赖倒转原则的优缺点
依赖倒转原则虽然很强大,但却最不容易实现。因为依赖倒转的缘故,对象的创建很可能要使用对象工厂,以避免对具体类的直接引用,此原则的使用可能还会导致产生大量的类,对不熟悉面向对象技术的工程师来说,维护这样的系统需要较好地理解面向对象设计。
依赖倒转原则假定所有的具体类都是会变化的,这也不总是正确。有一些具体类可能是相当稳定,不会变化的,使用这个具体类实例的应用完全可以依赖于这个具体类型,而不必为此创建一个抽象类型。
四、合成/聚合复用原则(Composite/Aggregate Reuse PrincipleCARP
       4.1概念
定义:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的。
应首先使用合成/聚合,合成/聚合则使系统灵活,其次才考虑继承,达到复用的目的。而使用继承时,要严格遵循里氏代换原则。有效地使用继承会有助于对问题的理解,降低复杂度,而滥用继承会增加系统构建、维护时的难度及系统的复杂度。
如果两个类是"Has-a"关系应使用合成、聚合,如果是"Is-a"关系可使用继承。"Is-A"是严格的分类学意义上定义,意思是一个类是另一个类的"一种"。而"Has-A"则不同,它表示某一个角色具有某一项责任。
4.2什么是合成?什么是聚合?
合成(Composition)和聚合(Aggregation)都是关联(Association)的特殊种类。
聚合表示整体和部分的关系,表示"拥有"。如奔驰S360汽车,对奔驰S360引擎、奔驰S360轮胎的关系是聚合关系,离开了奔驰S360汽车,引擎、轮胎就失去了存在的意义。在设计中, 聚合不应该频繁出现,这样会增大设计的耦合度。
合成则是一种更强的"拥有",部分和整体的生命周期一样。合成的新的对象完全支配其组成部分,包括它们的创建和湮灭等。一个合成关系的成分对象是不能与另一个合成关系共享的。
    换句话说,合成是值的聚合(Aggregation by Value),而一般说的聚合是引用的聚合(Aggregation by Reference)。
明白了合成和聚合关系,再来理解合成/聚合原则应该就清楚了,要避免在系统设计中出现,一个类的继承层次超过3层,则需考虑重构代码,或者重新设计结构。当然最好的办法就是考虑使用合成/聚合原则。
4.3通过合成/聚合的优缺点
优点:
1) 新对象存取成分对象的唯一方法是通过成分对象的接口。
2) 这种复用是黑箱复用,因为成分对象的内部细节是新对象所看不见的。
3) 这种复用支持包装。
4) 这种复用所需的依赖较少。
5) 每一个新的类可以将焦点集中在一个任务上。
6) 这种复用可以在运行时间内动态进行,新对象可以动态的引用与成分对象类型相同的对象。
7) 作为复用手段可以应用到几乎任何环境中去。
缺点:就是系统中会有较多的对象需要管理。
4.4通过继承来进行复用的优缺点
优点:
新的实现较为容易,因为超类的大部分功能可以通过继承的关系自动进入子类。
修改和扩展继承而来的实现较为容易。
    缺点
继承复用破坏包装,因为继承将超类的实现细节暴露给子类。由于超类的内部细节常常是对于子类透明的,所以这种复用是透明的复用,又称"白箱"复用。
如果超类发生改变,那么子类的实现也不得不发生改变。
从超类继承而来的实现是静态的,不可能在运行时间内发生改变,没有足够的灵活性。
继承只能在有限的环境中使用。
五、 迪米特法则(Law of DemeterLoD
       5.1概述
    定义:一个软件实体应当尽可能少的与其他实体发生相互作用。
    这样,当一个模块修改时,就会尽量少的影响其他的模块。扩展会相对容易。
    这是对软件实体之间通信的限制。它要求限制软件实体之间通信的宽度和深度。
5.2迪米特法则的其他表述:
1)只与你直接的朋友们通信。
2)不要跟"陌生人"说话。
3)每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
5.3狭义的迪米特法则
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
朋友圈的确定
"朋友"条件:
1)当前对象本身(this)
2)以参量形式传入到当前对象方法中的对象
3)当前对象的实例变量直接引用的对象
4)当前对象的实例变量如果是一个聚集,那么聚集中的元素也都是朋友
5)当前对象所创建的对象
任何一个对象,如果满足上面的条件之一,就是当前对象的"朋友";否则就是"陌生人"。
缺点:会在系统里造出大量的小方法,散落在系统的各个角落。
与依赖倒转原则互补使用
5.4狭义的迪米特法则的缺点:
在系统里造出大量的小方法,这些方法仅仅是传递间接的调用,与系统的商务逻辑无关。
遵循类之间的迪米特法则会是一个系统的局部设计简化,因为每一个局部都不会和远距离的对象有直接的关联。但是,这也会造成系统的不同模块之间的通信效率降低,也会使系统的不同模块之间不容易协调。
5.5迪米特法则与设计模式
门面(外观)模式和调停者(中介者)模式实际上就是迪米特法则的具体应用。
5.6广义的迪米特法则
迪米特法则的主要用意是控制信息的过载。在将迪米特法则运用到系统设计中时,要注意下面的几点:
1)在类的划分上,应当创建有弱耦合的类。
2)在类的结构设计上,每一个类都应当尽量降低成员的访问权限。
3)在类的设计上,只要有可能,一个类应当设计成不变类。
4)在对其他类的引用上,一个对象对其对象的引用应当降到最低。
5.7广义迪米特法则在类的设计上的体现
1)优先考虑将一个类设置成不变类
2)尽量降低一个类的访问权限
3)谨慎使用Serializable
4)尽量降低成员的访问权限
5)取代C Struct
迪米特法则又叫作最少知识原则(Least Knowledge Principle或简写为LKP),就是说一个对象应当对其他对象有尽可能少的了解。
5.8如何实现迪米特法则
迪米特法则的主要用意是控制信息的过载,在将其运用到系统设计中应注意以下几点:
1) 在类的划分上,应当创建有弱耦合的类。类之间的耦合越弱,就越有利于复用。
2) 在类的结构设计上,每一个类都应当尽量降低成员的访问权限。一个类不应当public自己的属性,而应当提供取值和赋值的方法让外界间接访问自己的属性。
3) 在类的设计上,只要有可能,一个类应当设计成不变类。
4) 在对其它对象的引用上,一个类对其它对象的引用应该降到最低。
六、 接口隔离原则(interface separate principle, ISP
      6.1概念
    接口隔离原则:使用多个专门的接口比使用单一的总接口要好。也就是说,一个类对另外一个类的依赖性应当是建立在最小的接口上。     
这里的"接口"往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象;另外一种是指某种语言具体的"接口"定义,有严格的定义和结构。比如c# 语言里面的Interface结构。对于这两种不同的含义,ISP的表达方式以及含义都有所不同。(上面说的一个类型,可以理解成一个类,我们定义了一个类,也就是定义了一种新的类型)      
当我们把"接口"理解成一个类所提供的所有方法的特征集合的时候,这就是一种逻辑上的概念。接口的划分就直接带来类型的划分。这里,我们可以把接口理解成角色,一个接口就只是代表一个角色,每个角色都有它特定的一个接口,这里的这个原则可以叫做"角色隔离原则"。
如果把"接口"理解成狭义的特定语言的接口,那么ISP表达的意思是说,对不同的客户端,同一个角色提供宽窄不同的接口,也就是定制服务,个性化服务。就是仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来。
    应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。
  这也是对软件实体之间通信的限制。但它限制的只是通信的宽度,就是说通信要尽可能的窄。
遵循迪米特法则和接口隔离原则,会使一个软件系统功能扩展时,修改的压力不会传到别的对象那里。
6.2如何实现接口隔离原则
不应该强迫用户依赖于他们不用的方法。
1、利用委托分离接口。
2、利用多继承分离接口。

不使用backtick处理参数

  backtick, the grave accent ( ` ) is a diacritic mark [wikipeida]。
  如果使用backtick,那么在unix shell中,可以方便地用'cat ini_file.ini'把配置文件中的内容取出,对于配置文件只有一行的情况。如果配置文件有多行,也可以使用shell工具取出某行的数据。
  放弃backtick方案。 仍使用GUI部分从配置文件读入参数,再作为批处理的命令行参数。配置文件准备使用多个,每个参数一个文件,方便使用fstream读入,避免使用windows api。
放弃backtick方案的原因如下。
  需要重写所用已用批处理实现的场景 ;

已经与袁福宇一起测试了可行性。
1.在shell中的使用方法。不是原文引用,可能有错。
  >test.exe -para `cat device_name.txt`
等同于执行
  >test.exe -para .EmeterDevice0
其中,'.EmeterDevice0'是device_name.txt的内容。
需要注意当前目录、配置文件目录。

2.在shell之外,由GUI调用的方法。
----引用开始
d:msys1.0bin>sh
sh-2.04$ exit
exit

d:msys1.0bin>sh test.sh
ok

d:msys1.0bin>cat test.sh
echo ok
d:msys1.0bin>
----引用结束

备忘,免得哪天又把这个方案想起来,然后再花上大半天否定它。

用键盘断开U盘的几个方法(转载)

发信人: qjchen (飞马), 信区: TotalCommander
标 题: 用键盘断开U盘的几个方法,感谢younggift兄
发信站: 水木社区 (Thu Apr 26 06:57:38 2007), 站内用usb disks插件好久了,好像用的是那个06.8.28的版本,却一直忘记了在哪里下载了,今天总算知道了,非常感谢younggift兄。以前写过如下一段,发文灌水一下。
用键盘断开U盘的几个方法
不少电脑爱好者都喜欢采用键盘来控制电脑。但是要断开U盘的时候,一般情况下需要用鼠标去点击系统右下角的图标点击"安全删除硬件"图标来安全删除硬件。有没有什么方法可以用键盘来断开U盘连接呢?经过研究及搜索,得到如下的几个解决方法。
第一个方法:命令调出法
用WIN +R调出运行窗口,输入如下中括号内的文字,不包括中括号["C:WINDOWSsystem32rundll32.exe"
shell32.dll,Control_RunDLL
hotplug.dll],注意,C:WINDOWS需要按照你的操作系统改成相应的名称。那么就会跳出常见的安全删除硬件的窗口,按Alt+s,假如只有一个U盘的话,再按一次回车就可以了。这段文字在再次调用WIN+R时一般就会存在列表中了。操作起来其实很快。
对于喜欢键盘操作的朋友, hoekey是一个绝好的软件。下载安装后,在Hoekey的安装目录中找到hoekey.ini文件,在最后加上如下中括号内的文字,不包括中括号:
[F9=Run|"C:WINDOWSsystem32rundll32.exe" shell32.dll,Control_RunDLL
hotplug.dll; F9: close u
disk],以后按F9就可以出现安全删除硬件的窗口了。假如利用可定义键盘、鼠标动作的Autohotkey脚本软件应可更快。第二个方法:利用Total Commander的Usb disks插件
Total commander是一个著名的文件管理程序,此处不赘述。
此时,下载一个TC的Wfx插件――Usb disks,此插件应该是水木younggift的作品,具体下载地址可见后文。
进入TC中的Configuration(配置)-Option(选项)-Plugins(插件)-Wfx,在Wfx旁边的configure里面添加这个
usb disks即可。重启tc让之生效。假如采用鼠标时,在TC里面点击网络邻居的磁盘图标,可以看到有一个叫Usb
disks的目录,进入可以看到相应的usb设备。比如我电脑中就有Microsoft USB Wheel Mouse
Optical――Usb鼠标,还有Usb Mass Storage的――就是U盘。此时,对Usb Mass
Storage按del键,就断开了U盘的连接了,试试看,还可以断开鼠标的。
那么,如何才能用键盘进入这个Usb Disk的目录呢?可以借助TC中的start(开始菜单)菜单,start(开始)-change
start menu(改变开始菜单)-add items(添加项目),给个名字比如叫exit U,在窗口下方的command命令行中键入cd
USB Disks,再在Shortcut
key中定义一个如ctrl+alt+F3的快捷方式,那么以后就可以按Ctrl+Alt+F3键进入这个Usb
Disk的界面,按Del键退出U盘了。第三个方法:借助Unplug.exe软件
这个软件叫unplug.exe, 是专门退出U盘的,解压到一个目录中,如D:program filesunplug,接着,打开记事本键入如下内容
@echo off
cd D:program filesunplug
unplug J:
unplug K:
注意,第二行中,地址改为相应的unplug地址,第三第四行中,是对应机器的U盘盘符,可以是多个。存这个文本文件为一个批处理文件,如removej.bat。
接下来就可以按win+R来运行这个批处理文件了,也可以类似上文一般,用hoekey,定义一个[F10=Run|"d:program
filesunplugremovej.bat"],不包括中括号。以后,按一个F10键就可以一次性关闭几个U盘了。
不记得是不是在DRL,有位大哥说要配合UNLOCK一起用会更好,有空试试。可能你会觉得,不就是退出U盘嘛,用得着大惊小怪搞得这么复杂么,但事情嘛,多个解决方法总不是坏处,是吧。
以上软件的下载地址。
Totalcmd: http://ghisler.fileburst.com/655a/tcmd655a.exe
TC的Usb Disks插件: http://www.newsmth.net/bbscon.php?bid=837&id=27274
Hoekey: http://www.bcheck.net/apps/HoeKey113Inst.exe
Unplug.exe: http://hp.vector.co.jp/authors/VA009794/UPLG0098.zip本文也记在这里:https://younggift.net/2007/04/26/u/
--结构分析、CAD Autolisp技术、软件使用技巧http://chenqj.blogspot.com
※ 修改:・qjchen 于 Apr 26 07:01:57 修改本文・[FROM: 59.41.189.*]
※ 来源:・水木社区 http://newsmth.net・[FROM: 59.41.189.*]
newsmth上的补充:
1.用键盘移动焦点,向鼠标一样删除U盘
  Ctrl-Esc,Esc,Shift-Tab,Shift-Tab,Left or Right,Space,Up,Enter
2.我比较喜欢用前面有人贴过的那个deveject.exe的程序
3.直接拔
  win默认就是可以直接拔的
4.把焦点移到SysTray,直接Win+B

Emacs用于编程环境

  • download
  • install
    • Emacs
    • djgpp
  • IDE
    • auto indent
      • Language (auto-indent) Modes
        • c++-mode
    • 变量、函数、类的 定义,cross reference
      • etags
    • beautifier
      • astyle
      • cc-mode
        • 选择文本块,ESC C-,M-X c-set-style,可以设置不同的缩进风格
    • symtax highlight
      • font-lock-mode
    • Include File Searching
      • FFAP mode
      • dired mode
    • 后缀自动识别
      • auto-mode-alist entry
      • font-lock-auto-mode-list
    • refactoring
      • Xrefactory
        • 官方8天试用
    • 智能补齐
      • CEDET
      • Sematic
    • 括号匹配
      • C-M-n和C-M-p则可以将光标定位在两个匹配的括号上
    • debug
      • dbg
      • dbx
    • 自动定位到语法错误的行
      • 内置
    • compiler
      • 内置
        • make -k
      • g++ hello.cpp -o hello.exe
    • 调用stack
      • Ebrowse is a parser that generates browsable tree files from C++ source code. It is part of the emacs release starting with version 21.2. etags, 最简单 ecb(emacs code browser),最复杂 cscope, 位于中间的是
    • 代码折叠
      • foldout(内置)
      • folding-mode
      • fold-mode
      • hs-minor-mode
    • 模板
      • http://emacs-template.sourceforge.net
      • auto-insert(内置autoinsert)
    • IDE plugin
      • ELSE(Emacs Language Sensitive Editor)
      • JDE
      • VIP
    • block comment
      • comment-region
      • cc-mode
        • comment-region
        • Multi-Line Comments
    • MISC
      • 看函数体时,函数头能否常驻屏幕顶端
        • 装了 semantic 后, `M-x global-semantic-stickyfunc-mode'
      • 工程管理
        • cedet
  • sh
    • GNU Bash
    • win-bash
    • UWIN(at&t)
  • unix utilities
    • ~ gnuwin32
      • ls
      • grep
      • cat
    • http://unxutils.sourceforge.net/
    • msys @ mingw32
  • compiler
    • g++
      • mingw32
      • Cygwin (GNU+Cygnus+Windows)
  • documentation
    • doxygen

excel在项目中

备忘。
1.利用 XY散点图 检验数据的线性
  曾经用在ECC硬件调试时,检验电压的映射公式。
2.利用 公式求值 检验公式的有效范围/函数图形
  曾经用于检验SPR的 电机与角度关系。
3.利用透视表(pivot table) 汇总、分类、对比
4.选择图表类型时参考《用图表来说话》中的5种类型。