删除多余的备份
Sat, 19 Sep 2009 01:38:55 +0800

当初的server-backup.pl不太完善,因为不会自动删除已经备份的文件,所以日积月累会很多多余的文件。现在改进一下。

#now, we delete the file created at 7 days ago.
($sec,$min,$hour,$mday,$mon,$year,
          $wday,$yday,$isdst) = localtime(time()-7*24*60*60);
$bto = sprintf("/data/backup/%4d%02d%02d.tar.gz", $year+1900, $mon+1, $mday);
system("rm -f ".$bto);
system("echo \"".localtime(time)." delete $bto OK.\" >> /data/log/backup.log");

这样,就会删除7天以前的备份档了。

评论(0) | 阅读
使用批处理转换FLV
Sat, 02 May 2009 02:11:56 +0800

经常有一些电影,要转换成FLV,以在MP4查看(或者其它原因,如大小),所以,写了个脚本进行转换。

前提有mencoder,这在mplayer的官网有下载。

配置好mencoder,使得在CMD方式下可以转换。

再使用以下BAT处理文件进行批量转换。

SET OPS=-of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=200:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=-1:cmp=6:vb_strategy=1 -vf scale=320:240 -ofps 12 -srate 22050
FOR %%i IN (*.rmvb *.avi) do (mencoder %%i -o %%i.flv %OPS%)

OPS变量是mencoder的转换参数。详情参考mencoder的说明即可

评论(0) | 阅读
提高 Linux 上 socket 性能
Fri, 10 Apr 2009 16:39:03 +0800
来自于IBM developerWorks的文章,转来这里做个记录 http://www.ibm.com/developerworks/cn/linux/l-hisock.html
评论(0) | 阅读
Makefile Need an operator错误
Thu, 09 Apr 2009 16:12:47 +0800
Makefile里用了vpath,引起了这个错误。这个问题有待解决。
评论(0) | 阅读
禁掉百度MP3
Wed, 25 Mar 2009 01:54:21 +0800

百度MP3够无耻的,泛滥引用MP3,搞得流量大增。所以写了个小脚本,用脚本来生成播放器,好让百度蜘蛛再也找不着我的MP3~~哼哼

用法:

<script type="text/javascript">
<!--//

//第一参数为文件目录,第二参数为文件名,第三参数为文件类型
var p200903250135 = new MultimediaClass("/uploads/music/misc/", "dgdt", 0);

//输出播放器
p200903250135.flushPlayer();
//-->
</script>

点此下载

评论(0) | 阅读
Install DBD::mysql on windows
Tue, 24 Feb 2009 04:59:15 +0800

我的PERL是ActivePerl 5.10的,所以使用ppm就可以安装mysql接口。但是,要加入以下地址的repository

http://cpan.uwinnipeg.ca/PPMPackages/10xx/package.xml

评论(0) | 阅读
让Subversion自动加上ID等Tags
Mon, 19 Jan 2009 02:20:17 +0800

  从CVS中转过来的时候,Subversion的Id等Tag不能自动加上。有点不太适应,不过,我们可以稍微配置一下,让Subversion自动加上。

  在CVS,只要文档中存在$Id: filename.c Exp $这样的串,CVS都会改写并加上修改日期和修改人的串:$Id: filename.c, v 1.1 2006/11/09 13:58:50 rory Exp $

  在Subversion里,也是这样的。不过要配置一下(客户端)。

在你的Subversion配置文件里(~/.subversion/config,WIN下是C:\Documents and Settings\~\Application Data\Subversion\config),找到[auto-props],添加*.c= svn:keywords=Id Reversion Date,这样成了:

[auto-props]

#...

#....

*.c= svn:keywords=Id Reversion Date

*.h= svn:keywords=Id Reversion Date

 

还有,还要启用auto-props:

[miscellany]
enable-auto-props = yes

经过以上配置,以后的文件中,只要存在$Id$这样的字符,都会替换成Subversion的版本串说明了。

另,关于UTF8的文件(如一些XML文件之类的),不能正确加上,上次在SVN的网站上看到相关说明,不过我一时找不出来,稍后再提这个问题吧。

评论(0) | 阅读
创建WINDOWS服务程序
Sat, 13 Dec 2008 17:11:38 +0800
1.安装和删除服务
首先向服务控制管理器安装服务:

int
install_service()
{
SC_HANDLE sc, sv;
SERVICE_DESCRIPTION scsc;
char str[MAX_PATH];

GetModuleFileName(NULL, str, MAX_PATH);

scsc.lpDescription = "Service test";

sc = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (sc == NULL) {
printf("Install service error.");
return 0;
}

strcat(str, " -runserver");

sv = CreateService(sc, "TestSrv", "Test service",
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,
str,
NULL, NULL, NULL, NULL, NULL);

if (sv != NULL){
ChangeServiceConfig2(sv, SERVICE_CONFIG_DESCRIPTION, &scsc);
CloseServiceHandle(sv);
}else{
CloseServiceHandle(sc);
}

printf("Service Installed");

return 0;
}


删除服务为以下程序:

int
delete_service()
{
SC_HANDLE sc, sv;
SERVICE_STATUS ss;

sc = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (sc == NULL) {
printf("OpenSCManage error.");
return 0;
}

sv = OpenService(sc, "TestSrv", SERVICE_ALL_ACCESS);
if (sv != NULL) {
QueryServiceStatus(sv, &ss);
if(ss.dwCurrentState != SERVICE_STOPPED)
ControlService(sv, SERVICE_CONTROL_STOP, &ss);

DeleteService(sv);
CloseServiceHandle(sv);
}

CloseServiceHandle(sc);

printf("Service Deleted");

return 0;
}


2.服务主线程程序和服务控制程序:

void WINAPI TestServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
SERVICE_STATUS_HANDLE hStatus;
SERVICE_STATUS ServiceStatus;

hStatus = RegisterServiceCtrlHandler("TestSrv",
(LPHANDLER_FUNCTION)ControlHandle);

if (hStatus == (SERVICE_STATUS_HANDLE)0) return;

ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted= SERVICE_ACCEPT_STOP |
SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;

SetServiceStatus(hStatus, &ServiceStatus);

/**/

ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hStatus, &ServiceStatus);

/*开始*/
begin_session();
}

void
ControlHandle(DWORD dwControl)
{
switch (dwControl) {
case SERVICE_CONTROL_SHUTDOWN:
case SERVICE_CONTROL_STOP:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
break;
}
}


3.从程序入口启动服务

int
startup_service()
{
SERVICE_TABLE_ENTRY ServiceTable[2];

ServiceTable[0].lpServiceName = "TestSrv";
ServiceTable[0].lpServiceProc =
(LPSERVICE_MAIN_FUNCTION)TestServiceMain;

ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;

// 启动服务的控制分派机线程
StartServiceCtrlDispatcher(ServiceTable);

return 0;
}
评论(0) | 阅读
WINDOWS 下获取本机 DNS
Sat, 13 Dec 2008 17:06:49 +0800
以下是我用于提取本机DNS的代码,使用WIN32 API GetNetworkParams函数。
另,获取DNS的方法也有读取REGEDIT的方法。

int get_dns_servers(char* hostlist, int hsize)
{
FIXED_INFO *fi;
unsigned long s;
DWORD ret;

memset(hostlist, 0, sizeof(char)*hsize);

s = sizeof(fi);
fi= (FIXED_INFO*)malloc(sizeof(char)*s);
memset(fi, 0, sizeof(char)*s);

ret = GetNetworkParams(fi, &s);
if( ret == ERROR_BUFFER_OVERFLOW )
{
free(fi);
fi= (FIXED_INFO*)malloc(sizeof(char)*s);
}

ret = GetNetworkParams(fi, &s);
sprintf(hostlist, "%s,%s", fi->DnsServerList.IpAddress.String, (fi->DnsServerList.Next)->IpAddress.String);

free(fi);

return 0;
}
评论(0) | 阅读
全屏模式的开发
Sat, 13 Dec 2008 16:57:07 +0800
近日,在使用SDK开发全屏程序时,遇到一些奇怪的问题。

一般我们要全屏时,首先要获取屏幕最大像素,使用GetSystemMetrics可以达到目的。

int iX, iY;


iX = GetSystemMetrics(SM_CXSCREEN);
iY = GetSystemMetrics(SM_CYSCREEN);


获取当前窗口位置。其实这一步骤只是获取一个有效WINDOWPLACEMENT结构以后填充。

WINDOWPLACEMENT		wpc;


GetWindowPlacement(hWnd, &wpc);


再次,我们要设置窗口的属性不要包含WS_CAPTION和WS_THICKFRAME风格。

SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE)

& ~(WS_CAPTION|WS_THICKFRAME));


重算客户区并设置窗口新Placement:
AdjustWindowRectEx(&rc, GetWindowLong(hWnd, GWL_STYLE),

FALSE, GetWindowLong(hWnd, GWL_EXSTYLE));

wpc.rcNormalPosition = rc;
wpc.showCmd = SW_SHOWNORMAL;
SetWindowPlacement(hWnd, &wpc);


这样,全屏就完成了。当然恢复一般窗口模式就不用多说了吧,反操作就成。
有些资料说要处理WM_GETMINMAXINFO消息,这要看个人需要,你不处理也OK,处理更好。
评论(0) | 阅读
标签
最近发表
最新评论
连接
版权说明
任何转载,无需经过许可,但必须注明来源地址。如有任何建议或意见,请联系
Copyright©2007-2009 lewphee.com All rights reserved.