做了一个太阳罐

使用了一块太阳能电池(黑色部分),一块普通充电电池(自己做的电池盒,手艺生疏了),配合QX5252芯片。选用的是焊接好的QX5252电路板,在淘宝上搜索 “太阳能串灯 圣诞灯 灯具用充电升压电路板 太阳能LED驱动器 独家” 可以找到这个卖家。美中不足的是这家卖的太阳能电池都是苏联风格的----功能不差,外观粗糙。太阳能电池比较小,就这样平放,晒一天估计能让我这个LED工作4小时左右。

俯视:
x1

阳光下充电中:
2

环境暗下来之后LED会自动点亮:
3

QX5252典型应用的电路图(来自 QX5252 SPEC):

sche

多说两句QX5252是专门设计为LED草坪灯的,它的DC升压之后应该是脉冲形式的供电,我买的电路板上多了一个陶片电容应该就是为了让电压输出平稳一些(具体如何我没用使用示波器查看过)。因此,如果你想把这个芯片当作一个DC升压电路来用的话,有可能会出现问题。比如:那种随着时间颜色不断变化的LED玩具,用这个东西供电之后会始终停留在最初的颜色上。QX5252的一个功能是只有环境光线暗下来来的时候才会点亮LED,这应该是通过判断太阳能电池电压来实现的。

如果不使用QX5252芯片,自己构建电路的话我们需要解决如下问题:

1.DC 的升压 (电池电压通常无法点亮LED)
2.电池的防止过充过放 (充电电池的要求,如果你不使用充电电池那么无需考虑)
3.防止电流倒灌(据说加入肖特基二极管就可以了)
4.环境光线的感知 (应该没人想做一只有阳光才会亮,没有阳光绝对不亮的“太阳能电筒”吧)

QX5252 SPEC

QX5252

前年有段时间对linux0.11感兴趣,顺便用masm翻译了下代码,也没精力去更新它了,现在放出给大家玩玩

运行my目录中的bat文件生成linux.img,然后启动bochsrc.bxrc(2.4.1)可以看到运行的linux0.11啦,因为启动读取了硬盘的文件,所以hdc-0.11.img不能删除。

http://www.lab-z.com/wp-content/uploads/alinux/linux0112013.rar

编写一个最简单的Linux程序

代码如下:

#include <stdio.h>
main()
{
        printf("Hello, A !\n");
}


 

命名为 lab-z.com

gcc -o lab-z lab-z.c

./lab-z 即可运行

1

另外,还可以定义一个宏,输出当前运行到的位置(在Debug Firmware时会很有用)

#include <stdio.h>
#define	dprint( args...) printf(args);printf("%s  %d\n",__FILE__,__LINE__);
main()
{
	printf("Hello,A\n");
	dprint("Hello,B\n");
}

 

就像 http://www.lab-z.com/vc-%E4%B8%AD%E8%BE%93%E5%87%BA%E5%BD%93%E5%89%8D%E8%BF%90%E8%A1%8C%E7%9A%84%E6%96%87%E4%BB%B6%E5%92%8C%E6%89%80%E5%A4%84%E7%9A%84%E8%A1%8C%E6%95%B0%E4%BB%A5%E5%8F%8A%E6%89%80%E5%9C%A8%E5%87%BD/ 这篇文章提到的一样

2

参考:
1.http://ggmmchou.blog.163.com/blog/static/59333149201021512218461/ linux c 002 一个gcc的最简单例子
2.http://www.uml.org.cn/c++/200902104.asp C中的预编译宏定义

海量中文分词 Delphi 例子

简单说“分词”就是指将一个句子拆分为一个个词语。调用的是“海量分词”的DLL库。

海量分词官方网站 http://www.hylanda.com/ (没看到有下载的地方)
试用装下载 http://www.onlinedown.net/soft/39759.htm
例子程序实际来自 https://code.google.com/p/jamessrc/source/checkout

这里我将上面的例子修改为动态调用。其中的 HLSSplit.dat 是DLL自带的分词库,在使用时需要通过 HLSplitInit 来指定这个库的路径。

主要代码例子如下

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
SHLSegWord=record
  s_szWord:pchar  ; //字符串
  s_dwPOS:longint ; //词性标志
  s_fWeight:single; //关键词权重,如果不是关键词,权重为0
end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  THLSplitInit = function (lpszDataFilePath:pchar):boolean;cdecl;
  THLFreeSplit = function (): string;cdecl;
  THLOpenSplit = function ():THANDLE;cdecl;
  THLCloseSplit = function (hHandle:THANDLE ):boolean ;cdecl;
  THLSplitWord = function  (hHandle:tHANDLE ; b:LPCSTR ; iExtraCalcFlag:integer = 0):boolean;stdcall;
  THLGetWordCnt = function (hHandle:tHANDLE ): integer;cdecl;
  THLGetWordAt = function (hHandle:tHANDLE; iIndex:integer):Pointer ;cdecl;

var
  Form1: TForm1;

const HL_CAL_OPT_KEYWORD:Integer = $1; //计算关键词附加标识
const HL_CAL_OPT_FINGER: Integer = $2; //计算文章语义指纹标识
const HL_CAL_OPT_POS: Integer = $4; //计算词性标识
const HL_CAL_OPT_SEARCH: Integer = $8;//输出面向检索的分词结果
const NATURE_D_A:Integer = $40000000; // 形容词 形语素
const NATURE_D_B:Integer = $20000000; // 区别词 区别语素
const NATURE_D_C:Integer = $10000000; // 连词 连语素
const NATURE_D_D:Integer = $08000000; // 副词 副语素
const NATURE_D_E:Integer = $04000000; // 叹词 叹语素
const NATURE_D_F:Integer = $02000000; // 方位词 方位语素
const NATURE_D_I:Integer = $01000000; // 成语
const NATURE_D_L:Integer = $00800000; // 习语
const NATURE_A_M:Integer = $00400000; // 数词 数语素
const NATURE_D_MQ:Integer = $00200000; // 数量词
const NATURE_D_N:Integer = $00100000; // 名词 名语素
const NATURE_D_O:Integer = $00080000; // 拟声词
const NATURE_D_P:Integer = $00040000; // 介词
const NATURE_A_Q:Integer = $00020000; // 量词 量语素
const NATURE_D_R:Integer = $00010000; // 代词 代语素
const NATURE_D_S:Integer = $00008000; // 处所词
const NATURE_D_T:Integer = $00004000; // 时间词
const NATURE_D_U:Integer = $00002000; // 助词 助语素
const NATURE_D_V:Integer = $00001000; // 动词 动语素
const NATURE_D_W:Integer = $00000800; // 标点符号
const NATURE_D_X:Integer = $00000400; // 非语素字
const NATURE_D_Y:Integer = $00000200; // 语气词 语气语素
const NATURE_D_Z:Integer = $00000100; // 状态词
const NATURE_A_NR:Integer = $00000080; // 人名
const NATURE_A_NS:Integer = $00000040; // 地名
const NATURE_A_NT:Integer = $00000020; // 机构团体
const NATURE_A_NX:Integer = $00000010; // 外文字符
const NATURE_A_NZ:Integer = $00000008; // 其他专名
const NATURE_D_H:Integer = $00000004; // 前接成分
const NATURE_D_K:Integer = $00000002; // 后接成分


implementation

{$R *.dfm}

function AddNatureString(strWord:string; dwPos:longint):string;
begin
if((dwPos and NATURE_D_A) = NATURE_D_A) then
strWord := strWord +('/a')//形容词
else if((dwPos and NATURE_D_B) = NATURE_D_B) then
strWord := strWord +('/b')//区别词
else if((dwPos and NATURE_D_C) = NATURE_D_C) then
strWord := strWord +('/c')//连词
else if((dwPos and NATURE_D_D) = NATURE_D_D) then
strWord := strWord +('/d')//副词
else if((dwPos and NATURE_D_E) = NATURE_D_E) then
strWord := strWord +('/e')//叹词
else if((dwPos and NATURE_D_F) = NATURE_D_F) then
strWord := strWord +('/f')//方位词
else if((dwPos and NATURE_D_I) = NATURE_D_I) then
strWord := strWord +('/i')//成语
else if((dwPos and NATURE_D_L) = NATURE_D_L) then
strWord := strWord +('/l')//习语
else if((dwPos and NATURE_A_M) = NATURE_A_M) then
strWord := strWord +('/m')//数词
else if((dwPos and NATURE_D_MQ) = NATURE_D_MQ) then
strWord := strWord +('/mq')//数量词
else if((dwPos and NATURE_D_N) = NATURE_D_N) then
strWord := strWord + ('/n')//名词
else if((dwPos and NATURE_D_O) = NATURE_D_O) then
strWord := strWord +('/o')//拟声词
else if((dwPos and NATURE_D_P) = NATURE_D_P) then
strWord := strWord +('/p')//介词
else if((dwPos and NATURE_A_Q) = NATURE_A_Q) then
strWord := strWord +('/q')//量词
else if((dwPos and NATURE_D_R) = NATURE_D_R) then
strWord := strWord +('/r')//代词
else if((dwPos and NATURE_D_S) = NATURE_D_S) then
strWord := strWord +('/s')//处所词
else if((dwPos and NATURE_D_T) = NATURE_D_T) then
strWord := strWord +('/t')//时间词
else if((dwPos and NATURE_D_U) = NATURE_D_U) then
strWord := strWord +('/u')//助词
else if((dwPos and NATURE_D_V) = NATURE_D_V) then
strWord := strWord +('/v')//动词
else if((dwPos and NATURE_D_W) = NATURE_D_W) then
strWord := strWord +('/w')//标点符号
else if((dwPos and NATURE_D_X) = NATURE_D_X) then
strWord := strWord +('/x')//非语素字
else if((dwPos and NATURE_D_Y) = NATURE_D_Y) then
strWord := strWord +('/y')//语气词
else if((dwPos and NATURE_D_Z) = NATURE_D_Z) then
strWord := strWord +('/z')//状态词
else if((dwPos and NATURE_A_NR) = NATURE_A_NR) then
strWord := strWord +('/nr')//人名
else if((dwPos and NATURE_A_NS) = NATURE_A_NS) then
strWord := strWord +('/ns')//地名
else if((dwPos and NATURE_A_NT) = NATURE_A_NT) then
strWord := strWord +('/nt')//机构团体
else if((dwPos and NATURE_A_NX) = NATURE_A_NX) then
strWord := strWord +('/nx')//外文字符
else if((dwPos and NATURE_A_NZ) = NATURE_A_NZ) then
strWord := strWord +('/nz')//其他专名
else if((dwPos and NATURE_D_H) = NATURE_D_H) then
strWord := strWord +('/h')//前接成分
else if((dwPos and NATURE_D_K) = NATURE_D_K) then
strWord := strWord +('/k')//后接成分
else
strWord := strWord +('/?');//未知词性
Result:=strWord;
end;

procedure TForm1.Button1Click(Sender: TObject); //stdcall;
var
bSuccess:bool;
b:LPCSTR;
hHandle,DllHandle:tHANDLE;
i,iExtraCalcFlag,nResultCnt:integer;
strResult,strWord:string ;
pWord:^SHLSegWord ;
  HLSplitInit:THLSplitInit;
  HLFreeSplit:THLFreeSplit;
  HLOpenSplit:THLOpenSplit;
  HLCloseSplit:THLCloseSplit;
  HLSplitWord:THLSplitWord;
  HLGetWordCnt:THLGetWordCnt;
  HLGetWordAt:THLGetWordAt;

begin
  DllHandle:=LoadLibrary(PAnsiChar('HLSSplit.dll'));
  if DllHandle=0 then
    begin
      ShowMessage('Loading DLL Error!');
      exit;
    end;
	
  @HLSplitInit:=GetProcAddress(DllHandle,'HLSplitInit');
  @HLFreeSplit:=GetProcAddress(DllHandle,'HLFreeSplit');
  @HLOpenSplit:=GetProcAddress(DllHandle,'HLOpenSplit');
  @HLCloseSplit:=GetProcAddress(DllHandle,'HLCloseSplit');
  @HLSplitWord:=GetProcAddress(DllHandle,'HLSplitWord');
  @HLGetWordCnt:=GetProcAddress(DllHandle,'HLGetWordCnt');
  @HLGetWordAt:=GetProcAddress(DllHandle,'HLGetWordAt');

    if  (Not Assigned(@HLSplitInit)) or
        (Not Assigned(@HLOpenSplit)) or
        (Not Assigned(@HLCloseSplit)) or
        (Not Assigned(@HLSplitWord)) or
        (Not Assigned(@HLGetWordCnt)) or
        (Not Assigned(@HLGetWordAt))
    then  
      begin
	    showmessage('Loading function Error!');
	    exit;
	 end;  

     //这里说的是词库文件的路径,空表示当前路径
    if(not HLSplitInit('')) then
	 begin
       ShowMessage('海量分词初始化失败!');
	   Exit;	
	 end;

	//创建分词句柄
	hHandle:= HLOpenSplit ();
	if(hHandle = INVALID_HANDLE_VALUE) then
		begin
		  //创建分词句柄失败
		  ShowMessage('创建分词句柄失败!') ;
		  HLFreeSplit () ;//卸载分词字典
		  exit;
		end ;

	//分词并对分词结果进行处理
	iExtraCalcFlag:=HL_CAL_OPT_POS; //附加计算标志,词性计算
	b:=pchar(Memo1.Text);
	bSuccess:= HLSplitWord (hHandle, b, iExtraCalcFlag);

	strResult:= ' ' ;
	if(bSuccess) then
		//分词成功
		begin
			nResultCnt := HLGetWordCnt (hHandle);//取得分词个数
			Label1.Caption:=inttostr(nResultCnt);

			for i:=0 to nResultCnt-1 do
				//取得分词结果
				begin
					pWord:= HLGetWordAt(hHandle , i);//取得一个分词结果
					if pWord.s_szWord<>'' then
						begin
							strWord:=(pWord.s_szWord); //PChar(pWord.s_szWord);
							if(iExtraCalcFlag=HL_CAL_OPT_POS) then//词性
							strWord :=AddNatureString(strWord,pWord.s_dwPOS); //显示词性标准
							strResult := strResult+strWord;
							strResult :=strResult+ (' ') ; //以空格分割分词结果中的每个词
						end
				end
		end
	else
	//分词失败
		begin
		  ShowMessage('分词失败!') ;
		end;
		//卸载分词词典
		//关闭分词句柄
		HLCloseSplit(hHandle);
		//卸载海量分词
		HLFreeSplit();
	Memo2.Text:=strResult;
  FreeLibrary(DllHandle);
end;

end.

 

slip

下载 http://www.lab-z.com/wp-content/uploads/delphi/hlzw.zip

介绍一个反汇编引擎 BeaEngine

介绍一个反编译引擎 BeaEngine

来自 http://www.beaengine.org/ 是一个免费的反汇编引擎,能够支持多种语言,比如:Python VC MASM32 Delphi 等等

主要函数

1.Disasm 函数

语法:

int Disasm(
pDisasmStruc pMonDisasm
);

参数:

pMonDisasm

[out] 返回指向 DisasmStruc 结构体的指针

函数返回值:

返回值有3种可能。如果遇到无法识别的opcode,返回 UNKNOWN_OPCODE (-1);如果读取出界(也就是读取超过安全区范围),那么返回OUT_OF_RANGE (0);其余情况返回指令长度。

--------------------------------------------------------------------------------
2.BeaEngineVersion 函数

返回当前引擎的版本信息

语法:

char* BeaEngineVersion(void);

返回值:

返回一个指向以0结尾的字符串,其中是当前版本信息。

--------------------------------------------------------------------------------
2.BeaEngineVersion 函数

返回当前引擎的修订版信息。(我不清楚 version和revision的差别.也许是因为我不用SVN之类的版本控制软件吧:)

The BeaEngineRevision function allows you to retrieve the current revision of the engine. Revisions come from our google SVN and can be considered like indicators about last bug fixes.

语法

char* BeaEngineRevision(void);Return

返回一个指向以0结尾的字符串,其中是当前修订版信息。

一些用到的结构体

_Disasm = packed record
EIP : longint; //引擎开始Decode的位置
VirtualAddr : int64; //反编译起始处的虚拟IP
SecurityBlock : longint; //为了防止在反编译过程中出现溢出,需要多指定一些字节作为缓冲
CompleteInstr : array[0..(INSTRUCT_LENGTH)-1] of AnsiChar; //输出的完整指令
Archi : longint; //指定指令集的类型
Options : int64; //定义一些指令显示的方法
Instruction : TINSTRTYPE;
Argument1 : TARGTYPE;
Argument2 : TARGTYPE;
Argument3 : TARGTYPE;
Prefix : TPREFIXINFO;
Reserved_ : array[0..39] of longint;
end;
TDISASM = _Disasm;
PDISASM = ^_Disasm;
LPDISASM = ^_Disasm;

TINSTRTYPE = packed record
Category : longint; //指令集的家族,比如:MMX
Opcode : longint; //OPcode
Mnemonic : array[0..15] of AnsiChar; //助记符
BranchType : longint; //如果是分支指令,那么给出跳转条件,例如:无条件跳转
Flags : TEFLStruct; //对 EFLAGS 的影响
AddrValue : int64; //如果解码之后的指令是一个分支指令,并且目标地址能够计算出(非运行期才能计算出来的),例如: jmp eax 会让这个位置为0
Immediat : int64; //指令中使用的常数
ImplicitModifiedRegs : longint; //该指令影响的寄存器
end;

TARGTYPE = packed record
ArgMnemonic : array[0..31] of AnsiChar; //返回ASCII形式的参数
ArgType : longint; //返回参数类型
ArgSize : longint; //返回参数大小
ArgPosition : longint; //参数类型为 REGISTER_TYPE 并且只使用了8位
//寄存器(Legacy模式)。ArgPosition=1 表示使用的是
//AH CH BH或者DH,反之为 AL BL CL 或者DL
AccessMode : longint; //表明参数是否为可修改(WRITE=0x02)或者(READ=0x01)
Memory : TMEMORYTYPE; //返回寻址模式
SegmentReg : longint; //寻址使用的段寄存器
end;

下载:

32位 beaengine-win32

64位 beaengine-win64

帮助文档(为了防止某天,这个网站被墙) beahelp

bea

给WordPress加上文章阅读次数功能

安装完WordPress后(WordPress 3.5.1),默认已经有 WP-PostViews 插件,可以直接在“插件”-->;“已安装的插件”中看到。确定这个功能是启用之后,可以在“外观”-->;当前主题的“小工具”中配置“第一小工具区”中 Views。这样就能够在边栏显示阅读数量最多的文章。具体的配置方法在网上都能搜索到,这里不再重复。重点说一下 Twenty Ten 这个主题如何显示每篇文章的阅读数量。非常抱歉的是这个主题和其他网上教程中讲述的都不同,无法找到给出的“主循环”。因此,选择插入在 Single.php 文件中(可以从“仪表盘”-->“外观”-->“编辑”直接选择编辑文件)。注意要加入到下面指定的位置中

之后就是这样的效果了.........

参考如下文章:

http://wordpress.org.cn/thread-143947-2-1.html