@ZEAL Blog·厉
We stand alone,
TOGETHER.
+ 0 - 0 | §scp Executing ssh1 in compatibility mode failed

执行远程文件复制时提示:

scp: warning: Executing scp1.
scp: FATAL: Executing ssh1 in compatibility mode failed (Check that scp1 is in your PATH).

原因是scp的客户端与服务器端所用的版本不同。最简单的方法是用sftp命令来替代(不过sftp的-P参数不是用来设置ssh端口的,要连接非标准端口服务器的最好统一使用 -o Port=XXXX 参数来设置)。

Quote 1:

This problem is often quite perplexing, since a ssh -V trace may show that you're using SSH-2 - so what is a message about "ssh1 compatibility mode " doing in there?

What's happening is this:

  1. On the OpenSSH client, you run say, scp foo server:bar
  2. scp runs ssh in a subprocess to connnect to the server, and run the remote command scp -t bar. This is intend to start an instance of the scp program on the server, and the two scp's will cooperate by speaking over the SSH connection, to retrieve the file.
  3. ssh connects to the server (using either protocol 1 or 2, it doesn't matter), and runs the remote scp command. However, the "scp" that gets run on the server is the SSH2 scp program (scp2), not the OpenSSH one. The crux of the problem is: besides the name, these two scp's have exactly nothing in common. scp2 cannot speak the file-transfer protocol that OpenSSH scp does. However, scp2 recognizes from the "-t" flag what's expected, and tries exec scp1 to service the connection (this is the extent of SSH2's SSH-1 compatibility; where OpenSSH has code for both protocols in a single set of programs, SSH2 expects to execute programs from a parallel SSH1 installation). It fails (presumably because you don't have SSH1 installed), and reports the problem.

The solution is to install either the OpenSSH or SSH1 version of scp on the server under the name "scp1", somewhere in the sshd2's PATH.

Quote 2:

OpenSSH implements "scp" via RCP over an SSH channel.
ssh.com implement "scp" via FTP over an SSH channel.

OpenSSH's server has both implementations, but it's client only uses the RCP version.

So if the client is OpenSSH, use "sftp" to get to an ssh.com server.

标签 ( 开发/理论 ) :
+ 0 - 0 | §win7下TortoiseSVN图标覆盖不显示

终于用上win7了。在安装了TortoiseSVN之后,发现本应在windows资源管理器出现的版本状态显示图标覆盖并没有出现。但能够正常进行各种svn操作。

查看了各种设置都没什么问题。最后发现直接重新安装一次TortoiseSVN,电脑重启之后这些图标覆盖效果就自动正常显示了。

怀疑是第一次安装好的时候网络还不正常导致没有及时连接到svn服务器的原因。

标签 ( 开发/理论 ) :
+ 0 - 0 | §MSSQL错误15466:解密过程中出错

问题起因:

服务器切换,直接把 MS SQL Server 2005 所有库的mdf文件复制到新机器上挂载。重新启动新服务器的数据库服务之后其它一切正常,但数据库邮件无法正常发送,尝试重新配置数据库邮件的smtp,结果在重新输入smtp验证密码后保存时报T-SQL错误:解密过程中出错,错误号 15466 。

解决方法:

在原来的数据库服务器上新建查询,执行T-SQL脚本:

BACKUP SERVICE MASTER KEY TO FILE = 'path_to_file'
    ENCRYPTION BY PASSWORD = 'AnyPasswordULike'

将SMK导出来之后复制到新的服务器上,然后执行:

RESTORE SERVICE MASTER KEY FROM FILE = 'path_to_file'
    DECRYPTION BY PASSWORD = 'ThePasswordWhenUBackup' FORCE

注意在restore的时候必须使用 FORCE 选项,否则无法强制刷新SMK。这样restore之后,那些保存在数据库里面需要进行加解密(通常是密码)的信息就可以被正常读取了。

如果你知道那些跟service相关的配置密码的话,也可以不通过backup&restore的方式,而是直接强制重新生成一个随机SMK:

ALTER SERVICE MASTER KEY FORCE REGENERATE

然后重新再去配置一遍(比如数据库邮件帐号信息)就行了。

SMK的详细解释:SQL Server 2005: A look at the master keys , and Part 2

Service Master Key (SMK)

This key is used to encrypt all database master keys as well as all server-level secrets such as credential secrets or linked server login passwords. The key itself is a 128bit 3DES key. The 3DES algorithm was chosen because of its availability on all Windows platforms supported by SQL Server 2005. The SMK is encrypted using DPAPI and the service account credentials. A second encryption of the SMK will be added in future builds.

Database Master Keys (DMK)

There can be only one such key per each database. Like the SMK, each DMK is a 128bit 3DES key. The DMKs are encrypted using a password and by default an additional encryption by the SMK is also made. A DMK is used to protect database level secrets such as the private keys of certificates or asymmetric keys. The purpose of the encryption by the SMK is to allow the server to be able to internally decrypt the DMK without requiring a password from the user. If this is not desired (because every sysadmin would have access to the DMK), the SMK encryption can be removed, but then the DMK can only be opened by specifying the password that was used to encrypt it.

+ 0 - 0 | §BOXI CMC 数据库配置无法保存?

使用 BusinessObjects Enterprise XI 3 中央管理控制台 (CMC) 发布水晶报表 rpt 文件,打算通过 CMC 的计划功能每天定时执行水晶报表并生成Excel发送到指定邮箱里。

其他测试都OK,结果想把测试好的报表数据源指向正式数据库的时候发现死活改不了数据库配置了。网上所能找到的都是说直接进入属性修改数据库配置,然后选择“使用此处指定的自定义数据库登录信息(Use custom database logon information specified here)”重新配置数据库连接信息保存就行了。

问题是我选择之后填好内容保存,CMC没有给我任何报错信息,但再打开数据库配置对话框看到的配置信息仍然是修改前的初始信息(即设计rpt报表使用默认使用的测试数据源),甚至即便使用缺省的初始化连接信息也无法保存用户密码信息,只有在建立计划的时候输入密码。网上也有人在问跟我同样的问题,却没看到有正确解答的。

然后不停的看官方文档、试验、Google ... (省去N行失败吐血的过程描述)... 连百度和Bing也用上了,仍然无解。唯一能找到的解释是BOXI Release Notes里面关于 Central Management Control 的 General Issues :In the Central Management Console, you cannot set custom database logon information for a report that is based on a universe. 但没有任何更进一步的说明。

最后小武童鞋横空出世,一次机缘巧合的测试发现了问题所在。

原来从安全角度考虑,我们的测试MS SQL Server数据库启用TCP/IP协议的时候把缺省的1433端口改成了一个其他的端口数字9393,这样SQL Server的连接地址就变成了 xxx.xxx.xxx.xxx,9393 。就是这里这个MS SQL Server特有的逗号端口分隔符导致了 CMC 抽筋。把rpt文件的默认连接指向一个不使用特殊端口号的地址 xxx.xxx.xxx.xxx 再发布,一切就都正常了!如果尝试在自定义数据库登录信息里面再填写成 xxx.xxx.xxx.xxx,9393 保存刷新之后可以看到 9393 这个数字跑到了数据库名一栏。整个配置信息从逗号开始全部错位,貌似是 CMC 内部保存配置信息时候使用了逗号作为字段分隔符,导致在解析的时候就把 MS SQL Server 这个特有的IP和端口之间的这个逗号分隔符当作了字段分隔符。所以一开始rpt文件的连接信息包含了自定义端口就会导致无论如何都没法再修改数据库配置。

真不知该骂微软为嘛非要特立独行用逗号而不是冒号来分隔ip和端口,还是该骂 BusinessObjects Enterprise XI 做得烂连这个问题都没考虑到。总之无可奈何,只好把我们的数据库端口改回默认端口,让rpt的默认连接信息里面没有逗号的出现。

然后又发现, CMC 虽然可以指定计划按天执行,但在配置传入参数的时候是直接调用rpt的接口,并不提供宏定义允许设定传入参数为当时计划执行时的日期。这对于发送日报表来说完全不能接受,目前暂时只能在水晶报表里面设置公式转换来解决。。。

+ 0 - 0 | §SQL Server不靠谱的isnumeric函数

MS SQL Server 的 isnumeric 函数返回为1的字符串有时候并不能被直接 CAST 成数值型字段。比如包含逗号(12,345)、制表符的字符串用isnumeric来判断的话返回都是1。所以在进行某些数据转化的时候想靠 isnumeric 来保证转化脚本不报数据类型转换失败的错误是不保险的。

解决办法只有用额外的字符串校验来做判断:

IF OBJECT_ID(N'dbo.isReallyNumeric', N'FN') IS NOT NULL
DROP FUNCTION dbo.isReallyNumeric;
GO

CREATE FUNCTION dbo.isReallyNumeric
(
    @num VARCHAR(128)
)
RETURNS BIT
BEGIN
    set @num = LTRIM(RTRIM(@num))
    IF LEFT(@num, 1) = '-'
        SET @num = SUBSTRING(@num, 2, LEN(@num))

    DECLARE @pos INTEGER

    SET @pos = 1 + LEN(@num) - CHARINDEX('.', REVERSE(@num))

    RETURN CASE
    WHEN PATINDEX('%[^0-9.-]%', @num) = 0
        AND @num NOT IN ('.', '-', '+', '^')
        AND LEN(@num)>0
        AND @num NOT LIKE '%-%'
        AND
        (
            ((@pos = LEN(@num)+1)
            OR @pos = CHARINDEX('.', @num))
        )
    THEN
        1
    ELSE
    0
    END
END
GO
IF OBJECT_ID(N'dbo.isReallyInteger', N'FN') IS NOT NULL
DROP FUNCTION dbo.isReallyInteger;
GO

CREATE FUNCTION dbo.isReallyInteger
(
    @num VARCHAR(128)
)
RETURNS BIT
BEGIN
    set @num = LTRIM(RTRIM(@num))
    IF LEFT(@num, 1) = '-'
        SET @num = SUBSTRING(@num, 2, LEN(@num))

    RETURN CASE
    WHEN PATINDEX('%[^0-9-]%', @num) = 0
        AND CHARINDEX('-', @num) <= 1
        AND @num NOT IN ('.', '-', '+', '^')
        AND LEN(@num)>0
        AND @num NOT LIKE '%-%'
    THEN
        1
    ELSE
        0
    END
END
GO

通过创建以上的自定义函数来检查字符串是否确实可以被CAST到数值型字段来保存,替换掉调用 isnumeric 的地方即可(因为带前后导空格的字符串可以被自动CAST,所以先做TRIM处理)。

+ 0 - 0 | §DSI Short Test Fail 1000-0146

晚上回家开本本,莫名其妙就进不了Windows了。下班时候正常关的机,重新开系统就只能到 Windows 启动画面,过几秒钟蓝屏一闪而过,然后就开始重新启动进入到启动模式选择了。试遍了安全模式/上次成功配置方式启动,照样进不去。

进入 D610 的系统自检程序,测到硬盘的时候哔哔乱叫,出现错误信息:

Start DSI Short Test
Test Results: Fail
Error Code: 1000-0146 ... ...

心里一凉,难道用了几年的硬盘要挂了?最邪门的是刚刚中午还跟同事说咱这本本买了几年就没出过问题连系统都没重装过,保养的好啊。立马给我颜色看。

上网查这个错误信息,大部分都在说是硬盘坏了,如果是插口什么松了还好,否则就只好保修了。数据能不能保留就看自己的造化了。。

这还了得,上面的东西好久没备份了。要是硬盘废了不知道得费多少功夫才能把数据弄回来。尤其现在正急着上服务器去,没有私钥只能干着急。

把本本整个拆开来看了一遍,没发现哪里线路松动,只好原样装回去。重新启动,自然是状况依旧。

抱着一线生机在网上继续搜索,发现一个达人Teis建议

1. Do you have access to a Windows CD?
If so you can try to boot to the recovery console and run chkdsk /r.
Hopefully you can get it to boot, backup what you need, - then replace the drive.

2. Another solution could bee, - a bit more aggressive,
Reinstall your OS.

3. or - it could just be an error that can’t be fixed. I would get a new disk, install my OS, set the other as slave, and get the needed files.

Windows的安装盘就在手边,于是插上进入安装程序的修复模式,成功登录到 Windows 的命令行模式。看到几个盘下的文件还能dir出来,顿觉有戏。赶紧运行 chkdsk /r ,经过漫长等待之后,磁盘修复结束,Windows 告诉我至少发现了一个问题并进行了修复。

重新启动,俺可爱女儿的桌面又出来了!虚惊一场,赶紧备份数据先~~~

标签 ( 开发/理论 ) :
+ 0 - 0 | §Windows下文件换行符替换

有这么些数据文件,一行一条数据。然后在某些时候需要合并成一整行,数据之间用逗号分隔。

如果在 Linux 下是有N种方法来处理; Windows 下如果使用 EditPlus 或 UltraEdit 等文本编辑器直接进行正则替换也就行了。可碰巧问这个问题的同志从来没听说过这些东西,想在 Windows 下想找个比较便捷的内建工具来做,兜了一圈又一圈,发现还是得靠命令行来“曲线救国”:

for /f "delims=" %i in (src.txt) do @(set /p=%i,<nul) >>des.txt

把src.txt和des.txt分别改成需要处理的源文件和处理之后的目标文件即可。

标签 ( 开发/理论 ) :
+ 1 - 1 | §终端服务临时客户端许可证过期

解决方法:在客户端电脑打开命令行提示符,输入命令

reg delete "HKLM\SOFTWARE\Microsoft\MSLicensing" /f

标签 ( 开发/理论 ) :
+ 0 - 0 | §MS SQL Server 表数据更新时间查询
有时候需要检查数据库表最近一次被INSERT/UPDATE/DELETE的时间来了解各个表的数据写入情况。这里通过一个脚本给每个表加上触发器来记录表数据最后修改时间等信息。  查看全文
+ 0 - 0 | §ssh2 publickey验证失败问题

之前配的几台服务器之间通过ssh2的public key验证方式进行自动登录工作,忽然之间 Public-Key Authentication 的方式失效了,用 ssh 从 client 连 server 总是停滞几秒之后出现要求输入密码的 Password Authentication 方式。

去检查公钥私钥都是很早之前的文件没变动过。直到 cat ~/.ssh2/identification ,发现 cat 不出来了。 重新 echo "IdKey MyDSA2048" > ~/.ssh2/identification 生成一次 identification 文件之后,一切恢复正常。

出问题之前磁盘空间满了,不知道是不是因为这个导致 identification 文件出现这种莫名的问题。

附: SSH & SSH2 Public-Key Authentication HOWTO

标签 ( 开发/理论 ) :
+ 1 - 0 | §mod_rewrite中的REQUEST_URI

如下规则:

RewriteEngine on

# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ /sitemap/$1
# redirected all invalid request the the index bootstrap
RewriteRule !\.(htm|txt|xml|css|js|swf|gif|jpg|png|ico)$ index.php [L]

假设访问 sitemap_index.xml ,当经过两次RewriteRule之后,传给bootstrap程序 index.php 的 $_SERVER['REQUEST_URI'] 值仍然是 /sitemap_index.xml ,但实际上希望是 /sitemap/index ,这样 index.php 才能正确的进行 url route 。

要达到这个目的,有两个方法。

第一种方式,配合 mod_proxy ,将第一条重写规则改为

# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ /sitemap/$1 [P,L]

这样将在内部产生一个新的URL请求, REQUEST_URI 的值也就变成了新的 /sitemap/index 。但这种方法制造了额外的一次 http 请求。

第二种方法,将第一条规则改为

# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ /sitemap/$1 [E=REQUEST_URI:/sitemap/$1]

或者

# sitemap index xml rewrite
RewriteRule ^sitemap_([a-zA-Z0-9_\-]+)\.xml$ index.php [E=REQUEST_URI:/sitemap/$1,L]

然后通过 $_SERVER['REDIRECT_REQUEST_URI'] 变量得到 值 /sitemap/index (注意使用 E 设置环境变量的时候,mod_rewrite 自动给变量加上 REDIRECT_ 前缀)。

有趣的是在 Rewrite 的过程中 REQUEST_URI 的值始终保持是原始的请求URI,但在 mod_setenvif 中提供的 SetEnvIf / SetEnvIfNoCase 中所使用的 Request_URI 属性得到的却是经过 rewrite 之后的地址而非原始 GET/POST 中的 URI。

所以如果在 httpd.conf / httpd-vhosts.conf 中想使用

SetEnvIfNoCase Request_URI "sitemap" ...

来针对 sitemap 设置环境变量的话是不起作用的,因为这时候传给 SetEnvIfNoCase 进行判断的 Request_URI 是 index.php 而不是 sitemap_index.xml 或 sitemap/index 。想要得到原始的 Request_URI 信息就必须在 rewrite 规则的最开始进行保存,比如在 rewrite 规则开头加入

SetEnvIfNoCase Request_URI "(^/sitemap_.*\.xml)" MY_REQUEST_URI_BF_REWRITE=$1

然后在需要的地方使用

SetEnvIfNoCase MY_REQUEST_URI_BF_REWRITE "sitemap" ...

+ 0 - 0 | §getcwd cannot access parent directories

[root@web-server php]# /etc/init.d/httpd restart
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory

该错误表示 getcwd 命令无法定位到当前工作目录。一般来说是因为你 cd 到了某个目录之后 rm 了这个目录,这时去执行某些 service 脚本的时候就会报 getcwd 错误。只需要 cd 到任何一个实际存在的目录下在执行命令即可。

标签 ( 开发/理论 ) :
+ 0 - 0 | §LInux系统时间和硬件时间

一直以来都是使用 date 命令设置Linux服务器的系统时间,向来也没发现有什么问题。前几天突然有一台服务器重启之后系统时间直接跳回几个月前,实在是诡异。

在Windows下,设置了系统时间之后会自动同步更新CMOS时钟时间。Linux却是将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟。系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的主板硬件时钟。这两个时钟互不影响异步运行,据说在Linux系统启动过程中这两个时钟并不会发生冲突,以前用过无数台服务器也没碰到过这种事情;偏偏这次系统时间就是在重启之后被重置成了硬件时钟的时间。不知道是不是跟ntpd有些干系。

所以现在除了使用ntpd同步系统时间外,再加一个定时执行 clock --systohc 把系统时间同步更新到硬件时钟。

标签 ( 开发/理论 ) :
+ 0 - 0 | §Firefox扩展开发学习杂记

最近玩了一把Firefox的扩展开发,感觉不错。倒腾出来一个ChinaStock,有兴趣的可以瞧瞧(现在还被放在Sandbox里面,必须登录才能下载安装;同时因为被放在sandbox里面,暂时还不能被自动更新版本)。如果您愿意的话,也可以直接在本站下载安装

扩展开发中用得着的扩展(有点拗口):

Extension Developer's Extension  (xpi download / install address) 快速将扩展目录打包成xpi文件,在不重启Firefox的情况下重新载入所有扩展以及其他实用小功能。必备!如果不使用该扩展快速重载扩展的话,每次修改代码之后都必须从Firefox的菜单栏选择“退出”关闭Firefox再打开才有99%的几率保证该Chrome内容是最新修改后的,那叫一个痛苦。即使设置参数 nglayout.debug.disable_xul_cache = true ,也只是减少了修改窗口或对话框之后的重启而已。

Chrome List + Extension Manager Extended 学习其他人写的扩展总是最快入门的方法。 Chrome List 提供了扩展浏览功能,可以查看扩展安装之后存在的问题和jar包里面的源代码;Extension Manager Extended 则扩展了Firefox的扩展软件列表功能,直接显示每个扩展的ID,通过右键可以直接打开扩展存放的目录,再不需要去资源管理器找深埋在 Application Data\Mozilla\Firefox\Profiles\!@#$%^.default\extensions 里的jar包,也不需要去猜测使用UUID作为ID的扩展到底对应在哪个子目录了。

DebugLogger + Console2 DebugLogger 是 dump() 的优化版本。可以按照每个项目分别查看各自的dump信息。像 Firebug 这样的大师级扩展属于开发必备不需多讲,这个 DebugLogger 相较而言属于轻量级并且原始的调试辅助工具。配合它,至少不需要再用alert来简单粗暴了。 Console2 则是错误控制台的加强版,实现了 Firefox 3 错误控制台的一些特性。

现有HTML代码的利用:

虽然并不被鼓励,但对于更熟悉HTML语法的开发者来说, 最快捷编写扩展界面的方法是在 XUL 中引入 HTML 命名空间(为根标签增加属性 xmlns:html="http://www.w3.org/1999/xhtml"),然后给所有使用到的HTML标签添加 html: 前缀(比如 <div>...</div> 应该写成 <html:div>...</html:div>)即可。当然,因为 XUL 是基于 XML 的语言,所以所有的标签属性都应该是小写格式,并且空tag必须进行关闭。

相应的,由于上述定义方式下HTML 元素标签定义不在主命名空间内,当进行 DOM 操作的 js 代码在创建 HTML 元素的时候,也不能直接使用 createElement ,而必须使用 createElementNS 。比如 document.createElementNS("http://www.w3.org/1999/xhtml","html:div");

关于扩展ID:

每个扩展软件都必须有个唯一的标识ID,建议是使用UUID,也可以使用形如 extensionname@my.domain(必须有@符号但不必是真实的域名) 的字符串。生成UUID的方法很多:windows下可以安装微软自己提供的GUID Generator,*nix 下直接敲命令 uuidgen ,或者访问这里在线生成一个。个人觉得虽然UUID不会造成ID冲突,但 @ 形式的可读性更强一些,否则不靠前面提到的扩展帮忙要把ID跟功能对应起来还真是件费力的事情。 

扩展描述的本地化:

在 Firefox 扩展管理器中,每个扩展的名字下面都有一段简短的描述(description),这段描述来自扩展根目录下的 install.rdf 文件。将这段描述进行本地化处理的方法是在扩展目录下创建子目录 defaults/preferences ,在子目录下新建一个 js 文件 myextname.js ,包含以下内容:

pref("extensions.ReplaceWithExtensionIDHere.description", "chrome://myextname/locale/myextname.properties");

同时在 locale 语言包文件 myextname.properties 中添加一行:

extensions.ReplaceWithExtensionIDHere.description = 经过本地化的描述内容

扩展的打包发布:

如果使用 Extension Developer's Extension 提供的extension builder 进行打包,它会在build的过程中自动将chrome.manifest中的目录配置替换成jar:chrome的形式,而不需要自己来回切换不同的chrome.manifest配置。当然前提是你的扩展工作目录按照约定的结构进行组织。如果你没有把content / skin / locale 目录放在工作根目录而是放在了 chrome 子目录下的话,打包之后xpi文件会同时包含jar文件和chrome整个目录。生成xpi文件之后,到 Firefox Add-ons 的开发者工具界面进行注册/登录/上传即可。

如果代码实际是兼容Firefox的最新版本的,只是因为在install.rdf里面的em:maxVersion设置了过老的版本号而导致你发布在AMO上的扩展被认为不兼容而无法下载的话,可以登录AMO后进入开发者工具管理界面,选择相应的扩展,点击版本历史列出的版本号链接进去,就可以快速修改该版本xpi的兼容版本范围(找这个修改的地方找了N久,OrZ)。

参考文档:
+ 0 - 0 | §SQL Server数据库复制

很少摸 Windows 环境下的东西,最近被个 MS SQL Server 的数据库搞得头大。实在不像 MySQL 那样用起来轻车熟路, OrZ ...

本来以为企业管理器里面既然提供了 DTS 数据导入/导出 的功能,直接使用 DTS 指定源和目标库就可以完全复制数据库到远程服务器上了。结果发现除了表的基本结构和数据,字段约束、键值、默认值等都没过去。最终还是要靠直接磁盘拷贝数据文件了事。

如果数据库服务可以停下来的话,最快的方法是直接拷贝对应的 .mdf 和 .ldf 文件(在企业管理器选择数据库右键看属性的“数据文件”项确定文件名);然后执行T-SQL命令(比如新的目标数据库名为 test ):

-- 如果 test 数据库已经存在,需要先把其分离。
-- 如果已经有应用连接到该数据库的话,使用以下语句强制断开现有连接
ALTER DATABASE test
      SET SINGLE_USER
      WITH ROLLBACK IMMEDIATE; 
-- 分离tst数据库
EXEC sp_detach_db
      @dbname = 'test',
      @skipchecks = 'true'

-- 把拷贝出来的 .mdf 文件和 .ldf 文件作为 test 数据库的数据文件挂上去
EXEC sp_attach_db
      @dbname = 'test',
      @filename1 = 'e:\db\test.mdf',
      @filename2 = 'e:\db\test.ldf'

-- 如果不想使用原来的 .ldf 文件,也可以单独挂 .mdf 文件
EXEC sp_attach_single_file_db
      @dbname = 'test',
      @physname = 'e:\db\test.mdf'

如果当前数据库处于生产环境不允许关闭服务的话,可以使用 BACKUP / RESTORE 的方法来完成复制工作:

-- 把数据库名为realdb的数据库备份到指定的磁盘文件
-- 用 WITH FORMAT 参数对bak文件进行格式化,以便进行完整重写
BACKUP DATABASE realdb TO DISK = 'E:\db\BAK_FOR_realdb.bak' WITH FORMAT
-- 用 RESTORE FILELISTONLY 命令查看数据库备份文件里面的
-- 数据文件和日志文件的逻辑名称,用于下一步的命令
RESTORE FILELISTONLY FROM DISK = 'E:\db\BAK_FOR_realdb.bak'

-- 使用备份文件创建一个新的数据库, realdb_dat 和 realdb_log
-- 分别是上面使用 RESTORE FILELISTONLY 命令查出的数据文件逻辑
-- 名称
RESTORE DATABASE test
    FROM DISK = 'E:\db\BAK_FOR_realdb.bak'
    WITH MOVE 'realdb_dat' TO 'E:\db\test.mdf',
    MOVE 'realdb_log' TO 'E:\db\test.ldf'
GO

+ 0 - 0 | §rsync时自动创建目录

一直以来都习惯用 rsync + ssh 作服务器文件同步,但之前都没有在命令参数里面找到类似 mkdir -p 的功能,可以在同步某个指定文件的时候自动在目标服务器上根据需要创建完整的父级目录。比如某些按年月日自动生成的目录型文件需要在文件生成的时候即时同步:

rsync -lprztW --rsh="/usr/bin/ssh -l rsyncuser" /var/2007/12/13/1001.gif 10.0.0.1:/var/2007/12/13/1001.gif

如果/var/2007/12/13目录没有预先在目标服务器上创建的话,该同步操作将报错:rsync: push_dir#3 "/var/2007/12/13" failed: No such file or directory (2)

之前的解决方法是在目标服务器上预先先创建所有可能产生的新目录结构,或者在源服务器上创建新目录的时候即时把目录rsync到目标服务器上。

偶然看到其实 rsync 有个 -R 参数(-R, --relative  use relative path names),用来把相对目录下的整个目录结构同步到目标服务器指定目录下。利用这个参数就可以自动达到 mkdir -p 的效果,只需要把同步命令改成:

cd /var
rsync -lprRztW --rsh="/usr/bin/ssh -l rsyncuser" 2007/12/13/1001.gif 10.0.0.1:/var/

标签 ( 开发/理论 ) :
+ 0 - 0 | §SVN错误“Cannot replace ...”

打算从 svn 服务器上 export 出来一个单独的文件(https方式),结果发现若干台 CentOS server 中有一台无法正常导出,提示错误:

svn: REPORT request failed on '/!svn/vcc/default'
svn:
Cannot replace a directory from within

从 apache 的 error_log 看,有两条错误信息:

[error] A failure occurred while driving the update report editor 
[error] [ Cannot replace a directory from within 

奇怪的是所有的服务器配置应该都是一样的,之前 export 整个工程目录的时候也没发生过任何错误。这次单单有一台死活拉不下来那单个文件。从 Google 上能搜到的原因说是可能指定了一个不存在的目标文件或者需要用svn switch 命令重新定位一次工作副本的位置;但显然这两种都不是我碰到的状况。

抱着死马当活马医的想法查看了一下几台服务器的 svn 版本(svn help | grep -a "Subversion"),居然发现除了这台问题机器装的是 1.1.4 (svn help 的输出信息中根本就没有版本信息,只发现yum list 出来的是这个老古董版本)之外,其他都是 1.4.4 的版本!同样都是用 yum install subversion 安装的东西竟然出现这等怪事,郁闷ing。更想不通的是把那台服务器的 yum repo 配置改到一致重新装,抓下来的版本还是老掉牙的 1.1.4 。没办法只好用最原始的方法把 1.4.4 装上,再执行 svn export ,一切OK!

标签 ( 开发/理论 ) :
+ 0 - 0 | §Apache编译libexpat.so错误

编译Apache时出错:fixed: /usr/lib/libexpat.so: could not read symbols: File in wrong format

解决方法:编译时增加编译参数 --with-expat=builtin 。貌似在64位服务器下编译脚本在定位系统 expat 支持时有些问题。使用自带的expat来编译就不存在这个问题了。

标签 ( 开发/理论 ) :
+ 1 - 0 | §scp拷贝文件失败问题

当在 shell startup script (比如 profile , bashrc)自动执行过程中产生了任何内容输出时, scp / sftp 会把这些 echo 回来的东西认作协议包进行解析,结果自然是无法读懂这些内容,最终导致文件拷贝失败。

如果能够明确知道在自己的 /etc/bashrc 等文件里面哪些语句会产生 echo 的内容的话,可以通过条件判断进行 echo :

if [ $(expr index "$-" i) -ne 0 ]; then
    echo "welcome to interactive shell , Current is"
    date +'%Y-%m-%d %T'
fi

这样只有在真正交互登录的时候才会 echo 信息, scp 的时候自动忽略。

标签 ( 开发/理论 ) :
+ 0 - 0 | §ERROR 2013 (HY000) of MySQL

当通过 TCP/IP 连接 MySQL 远程主机时,出现 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104

如果是在linux shell命令行中直接打 mysql 命令,能够顺利连上 MySQL,执行查询语句也比较正常,但如果执行 STOP SLAVE; 命令时就随机出现 ERROR 2013 (HY000): Lost connection to MySQL server during query 问题。而如果把操作命令写到脚本文件再去执行该脚本文件的话,则必然出现 Lost connection to MySQL server at 'reading initial communication packet', system error: 111

要是无论通过什么途径远程访问都出现错误可以认为是系统有防火墙之类的限制,但现在这种奇怪的抽筋现象让人百思不得其解。最后找到的解决方法是在 my.cnf 里面的 [mysqld] 段增加一个启动参数

skip-name-resolve

问题消失。但原因还是想不出所以然。

标签 ( 开发/理论 ) :
+ 0 - 0 | §svn post-commit中文转码

svn hooks 目录下缺省的 post-commit 脚本模板通过调用 commit-email.pl 来分析当次提交的内容并根据参数设置把修改信息 email 给项目相关人员。脚本支持使用 -m 参数进行正则过滤,当修改不同目录的内容时可以分别 email 给不同的邮件地址。

不过当项目中存在中文文件名的时候,由于 svn 会把非ascii码字符转义成形如 ?\325 的格式,所以在发出来的 email 里面这些中文都变成了不可读的数字。

要把这些编码转回原来的字符,只需要在 commit-email.pl 脚本处理 email body 信息的地方加上一段转码处理即可。比如在 my @difflines; (行487) 的前面加上:

for (my $i=0; $i<@body; ++$i){
    my @rsa = split( /\?\\/, $body[$i] );
    $body[$i] = "";
    for (my $j=0; $j<@rsa; ++$j) {
        my $val = $rsa[$j];
        $val =~ /(^[0-9]{3})(.*)/;
        if($j > 0 and defined $1 and $1 gt 0){
            #print "\n[".$1 . "," . $2."]";
            $body[$i] .= chr($1) . $2;
        }
        else{
            $body[$i] .= $val;
        }
    }
}

把之前 push 到 @body 变量的所有内容重新进行处理,发现 ?\ 后面跟三个数字就替换为相应的字符。

另外在 post-commit 模板脚本中没有写 commit-email.pl 的绝对路径,需要写上才能正常被调用。

附: 转码的shell实现->>

echo "?\232?\167?\163?\229?\134?\179?\230?\150?\185?\230?\161?\136" | \
awk --re-interval '{print gensub(/?\\([0-9]{1,3})/,"\\1\n","g");}' | \
awk --re-interval '{if($0 ~ /^[0-9]{1,3}$/) {printf("%c",$0)} else {printf("%s",$0)}}'

该示例转出来的对应中文应该是:解决方案

+ 1 - 0 | §svn pre-commit hook 的加载

SVN 服务如果是配合 apache 通过 http/https 提供的话,可以通过配置AuthzSVNAccessFile文件来控制每一个项目目录的访问权限;但如果是通过内置的 svnserve 提供服务的话,就必须自己编写权限控制脚本作为 pre-commit hook 挂到版本库下面才能做到针对子目录和文件的访问权限控制。另一个最常在 pre-commit hook 中实现的功能是检查提交信息是否为空,可以养成自己每次提交都写说明信息的好习惯。

pre-commit hook 的脚本可以是 shell, perl, python, exe 等多种格式,相应的功能实现在网上也能很容易搜到。比如一个简单的防止提交说明信息为空的 shell 脚本

#!/bin/sh
REPOS="$1"
TXN="$2"
RES="OK"

# Make sure that the log message contains some text.
SVNLOOK=svnlook

$SVNLOOK log -t "$TXN" "$REPOS" \
| egrep  "[^[:space:]]+" >/dev/null  || unset RES
if [ "$RES" != "OK" ] ; then
 echo "You must input some comments for you commit" 1>&2
 exit 1
fi
# All checks passed, so allow the commit.
exit 0

把写好的脚本文件放置到相应的版本库目录下的 hooks 文件夹中即可(在 hooks 目录下也已经有各种 hook 脚本的模板供参考)。

需要注意的两点

  1. echo 错误提示信息的时候必须重定向到 stderr ,即 1>&2
  2. pre-commit 文件拷贝到 hooks 目录之后,需要 chmod 0755 pre-commit ,给 pre-commit 文件增加可执行权限(或者至少把文件owner改为 svn 服务运行用户并加上ownerx权限)

没做这两步的话,当你在客户端提交空信息的时候,相应的错误提示信息并不会被输出反馈到客户端上。

+ 0 - 0 | §SSL自签署证书生成脚本
启用 apache 的 mod_ssl 之后需要有证书才能正常运作。写了个脚本来操作。首先要确定机器上已经有 openssl 。  查看全文
+ 0 - 0 | §Avoid Unwanted Copies 问题

  OracleAS Web Cache 里面可以设置 Global URL Parameters to Ignore 来让 webcache 把多个带不同参数的 URL 作为同一个对象来缓存。比如说当利用 Dynamic Javascript 来进行跨域的数据调用的时候,对于 Firefox 来说不存在浏览器缓存过时数据的问题,但对于 IE 来说就会在多次动态加载某个 js URL 的时候总是缓存老的数据内容。

  这时候如果服务端提供 js 数据输出的 URL 是纯动态页面的话,可以设置 header 来强制客户端不缓存数据;如果是纯静态页面的话,可以在 URL 后面添加一个随机的字符串(比如 sURL+'?'+((new Date()).getTime()) ,不过对于这样的静态内容来说浏览器做本地缓存也很应该)。

  但如果你提供服务的是经过 Web Cache 做了 Cache 的内容,只有在内容发生变化的时候才通知 Oracle Web Cache 清除当前缓存,这时候想让 IE 浏览器即时抓到变化的内容就有点麻烦了。如果在 URL 后面增加一个随机的字符串参数的话, IE 固然不会错误的进行缓存,但 Web Cache 内存中就保留了无数个不同的 URL 对象,而实际上这些对象都是相同的东西。

  好在 Web Cache 控制台可以通过设置 Global URL Parameters to Ignore 来 Avoid unwanted copies ,让 Web Cache 在遇到 URL 中特定的 query 参数时进行忽略,以便把这些URL过滤成相同的一个。

  挺好用的一个功能,但似乎应用了这个过滤规则以后似乎无法即时清除指定的 URL cache 了。到后台查看 web cache 里面的对象,原来这个过滤规则的处理方法是把指定的参数的值用 @ 符号代替(比如 myservice.php?a=1&sid=45&rnd=4837281828 , 如果把 rnd 设置为 Global URL Parameters to Ignore 的话,过滤之后的 URL 就变成 myservice.php?a=1&rnd=@&sid=45),并且会对所有的参数按字母重新排序( sid 参数被放到了 rnd 参数的后面)。因此如果按照假定的 URL 来写清除规则( myservice.php\?a=1&sid=.* )的话就无法正确定位 cache 对象,需要把清除规则的参数也进行相应的调整才行。

+ 1 - 0 | §删除超大目录下所有文件

Linux 系统中当单个目录中文件数过多时,试图用 rm * 来删除所有文件会报错 /bin/rm: Argument list too long.

据说这是因为 Linux 内核中所有 exec 系函数(execl, execlp, execle 等)最终调用的都是 execve() , 而 execve 是通过一块 128k 的内存空间来保存用以传递给新进程的命令参数和环境变量。当像 rm 这些命令产生的命令行参数超过 128k 的时候, Linux kernel 就报 E2BIG 错误了。

解决方法是用 find 命令先找出希望删除的文件名再用管道批次传递给 rm 去删除。比如要删除 sendmail 堆积起来的 mqueue 目录下的文件:

find /var/spool/mqueue/ -type f -name '*' -print0 | xargs -0 rm

(-0 参数防止文件名中有空格导致被 rm 认作是两个不同的文件。)

标签 ( 开发/理论 ) :
+ 0 - 0 | §Google Gears让你离线冲浪

Google 刚推出一款 Firefox 1.5+ / Internet Explorer 6.0+ 开源浏览器插件  Google Gears ( Google Gears API Blog ) ,以帮助开发人员通过 JavaScript API 创建具有离线浏览功能的web应用。现在 Google Reader 主界面上已经出现了新增加的 Offline 功能链接。

在万维网的静态页面时代,各种离线浏览器曾经风行一时。发展到现在站点的互动性越来越高,单纯通过整站抓取根本就达不到离线浏览的目地了。 Google 这次又玩起老树开新花的招数,最终目标是离线/在线的无缝结合,比起 Adobe Apollo 所构想的纯桌面应用框架来显得圆滑得多,应该也更容易被目前的 web 开发人员所接受吧。

+ 0 - 0 | §10大已死(将死)的电脑技能

Computerworld的一篇文章列出了计算机领域已经消亡或正走向消亡的10种技术。对于里面提及的几种计算机语言,想必每个人心中都有一个TOP10,就像 Computerworld 读者的质疑声一样。从 TIOBE 五月份的编程语言排名来看,这几种语言的热度确实不高。但适用领域的多寡自然会造成流行程度的不同,会不会消亡谁说得准? Ruby 要不是搭了 Rails 的快车,也不见得有多少人知道。

1. Cobol
    虽然写起来挺折磨人的,但还是存在于不少健壮性要求高的系统里面。想必会在以后的系统升级中逐渐被其他实现方式所替代。

2. Nonrelational DBMS
    大学里面学的课程就已经是RDBMS了,非关系型的数据库管理系统只是在教材的第一章浮光掠影介绍了一下。

3. Non-IP networks

4. cc:Mail

5. ColdFusion
    在我看来属于比较小众的语言类型,但小众和消亡应该不能划等号。就像金属朋克,再小众也自有一片天空。

6. C programming
    这个好像有点不可思议。据我所知还是有大把的程序员在写C代码 -- 尤其是彪悍的程序员们。。

7. PowerBuilder
    毕业后第一份工作就是在PowerBuilder里面画数据窗口,现在似乎确实没什么人在谈这个东西了。谁让 Sybase 转型了呢。

8. Certified NetWare Engineers

9. PC network administrators

10.OS/2
    传说中的操作系统,从来没接触过。

+ 0 - 0 | §我习惯加在.bash_profile的10个alias
echo "1. myos 查看本机操作系统、内核信息"
alias myos="cat /proc/version && cat /etc/redhat-release && cat /etc/issue"
echo "2. myip 查看本机ip地址信息"
alias myip="/sbin/ifconfig | grep -a 'inet addr' | sed -e '/127\\.0\\.0\\.1/d;s/.*inet addr:\\([0-9\\.]\\+\\).*/\\1/'"
echo "3. myps 查看系统中运行的进程完整命令行信息"
alias myps="ps -A -eo pid,ppid,args --width=2048"
echo "4. mydate 按照格式显示当前日期及时间戳"
alias mydate="date +'%Y-%m-%d %H:%M:%S , tp=%s'"
echo "5. myls 列出当前目录内容,按时间排序"
alias myls="ls -althr"
echo "6. mybf 查找当前目录下大于100M的文件"
alias mybf="find . -size +102400k -printf '%kk\t%p\n'"
echo "7. mynf 查找当前目录下最近5分钟内修改过的文件"
alias mynf="find . -mmin -5 -printf '%TY-%Tm-%Td %TH:%TM:%TS\t%p\n'"
echo "8. mydf 查看磁盘空间和inode使用情况"
alias mydf="df -h && df -ih"
echo "9. mymd 快速创建多层目录"
alias mymd="mkdir -p"
echo "10.rmsvn 删除当前目录下所有的 .svn 目录"
alias rmsvn="find . -type d -name '.svn' -exec rm -rf {} \\; 2>/dev/null"
+ 0 - 0 | §获得Shell脚本所在目录的绝对路径

要得到正在执行的程序/脚本自身所存放的绝对路径,在 PHP 里面可以用 dirname(realpath(__FILE__)) ; C# 则有 System.Windows.Forms.Application.StartupPath ; java 似乎没有什么比较直接的方法,只能利用 CodeSource 来间接获取 。而在 linux shell 脚本里面如果想得到当前脚本文件存放的绝对路径,也没有太现成的命令可以调用,不过可以通过下面的语句来获取:

baseDirForScriptSelf=$(cd "$(dirname "$0")"; pwd)
echo "full path to currently executed script is : ${baseDirForScriptSelf}"

虽说大部分情况下我们并不需要这样的绝对路径来完成工作;但如果要把多个脚本、数据文件等内容打包作为一个整体来交付别人使用,又希望不论用户拷贝到哪个目录下执行脚本都能够正确的找到这个包里面的其他内容的话,用这样的脚本来自动定位包的根目录应该是个比较鲁棒的做法。

标签 ( 开发/理论 ) :
+ 1 - 0 | §UNIX Timestamp in C#
C# 中的 DateTime 值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和时间;而 Unix 的时间戳则表示的是自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。 C# 中似乎并没有内置的方法来完成两者之间的转换。  查看全文
+ 0 - 0 | §在C#中解析JavaScript代码
大部分的解释型脚本语言都提供 eval 方法来完成动态代码的解释执行, C# 却并不提供(向 Java 学习)。不过在 .NET Framework 类库里面提供的 Microsoft.JScript 命名空间倒是包含了支持使用JScript 语言编译和生成代码的类。  查看全文
+ 0 - 0 | §No space left on device的原因

  看到这个错误,第一个反应是磁盘空间满了;但 df 一看,每个分区的空间都还富余的很。从 munin 的监控图表上看 Filesystem usage 也很平稳,但下面的 Inode usage 就有问题了,其中一个分区的 usage 已经到了100%。赶紧跑到服务器上 df -i 检查,果然是 Inode 耗尽。原来这个分区是用来扔各种日志和临时文件的,其中有某个程序产生的临时文件又小又多,又没有进行定时回滚,造成在磁盘空间耗尽之前文件系统的 Inode 就被用光了。

  Linux/Unix like OS 的文件系统中每个目录树中的节点并不是像 Windows 那样直接包含文件的具体信息,而只包含了文件名和 Inode number 。通过 Inode number 所找到对应于文件名的 Inode 节点中才真正记录了文件的大小/物理地址/所有者/访问权限/时间戳/被硬链接的次数等实际的 metadata 。因此你可以在 Linux 系统中通过硬链接( hard link ) 的方式给某个文件创建无数个位于不同目录下的文件名,而实际的文件数据只需要一份拷贝。

  但也正因为这种文件系统的结构,当你在 Linux 中进行 IO 操作的时候,需要的资源除了磁盘空间以外,还要有剩余的 Inode 才行。缺省情况下, Linux 在系统安装过程中按照1个 Inode 对应 2k 磁盘空间来计算每个分区的最大 Inode 数。一旦文件系统创建之后,每个分区可用 Inode 数就无法进行动态调整。

  正常来说,一般不太会出现某个分区的 Inode 耗尽而磁盘空间尚余的情况,除非像我碰到的这样垃圾小文件疯长而又没进行有效的清理。但如果确实需要的话,可以在创建文件系统(比如用 mke2fs )的时候根据实际需要来调整这个参数(比如分区如果用于存放超大视频文件的话 Inode 的数量可以少一些;如果打算存放的文件是大量小于 2k 的迷你文件的话就要考虑多创建一些 Inode)。

  附:Inode Definition by The Linux Information Project

  其它人碰到的 No space left on device 原因:

  超出系统中同时运行的最大 message queue 个数限制 : 在 root 下用 sysctl kernel.msgmni 检查该参数, sysctl -w kernel.msgmni=XXX 重新设定即可。

  cvs 异常断开的连接在 /tmp 目录下留下大量的临时文件导致 /tmp 目录满

标签 ( 开发/理论 ) :
+ 0 - 0 | §RunAsUser for MSP ignored 错误

sendmail 不知道啥时候又不工作了,上次是 unknown user smmsp ,这回是 RunAsUser for MSP ignored

WARNING: RunAsUser for MSP ignored, check group ids (egid=502, want=51)
can not chdir(/var/spool/clientmqueue/): Permission denied
Program mode requires special privileges, e.g., root or TrustedUser.

据说是因为 sendmail 有时候会在对用户/组名进行对应的时候出错,所以需要把 /etc/mail/submit.cf 里面缺省的配置行

O RunAsUser=smmsp

改成直接使用 smmsp 对应的用户/组 ID的形式:

O RunAsUser=51:51

照方抓药,结果是错误依旧。看来这个问题应该是老版本 sendmail 的问题 ... OrZ

Google 来 Google 去,终于找到个新鲜的说法

It would be worth a careful examination of ${SOURCE}/sendmail/SECURITY,
especially the recommended perms :

--- begin quote ---
-r-xr-sr-x root  smmsp ... /PATH/TO/sendmail
drwxrwx--- smmsp smmsp ... /var/spool/clientmqueue
drwx------ root  wheel ... /var/spool/mqueue
-r--r--r-- root  wheel ... /etc/mail/sendmail.cf
-r--r--r-- root  wheel ... /etc/mail/submit.cf


[Notice: On some OS "wheel" is not used but "bin" or "root" instead,
however, this is not important here.]

That is, the owner of sendmail is root, the group is smmsp, and the binary
is set-group-ID. The client mail queue is owned by smmsp with group smmsp
and is group writable. The client mail queue directory must be writable by
smmsp, but it must not be accessible for others. That is, do not use world
read or execute permissions. In submit.cf the option UseMSP must be set,
and QueueFileMode must be set to 0660
.
--- end quote ---

检查下来,clientmqueuemqueue 目录的权限都没问题,唯独 sendmail 的主程序经过了几次 link :

which sendmail
/usr/sbin/sendmail    -> /etc/alternatives/mta
/etc/alternatives/mta -> /usr/sbin/sendmail.sendmail

而这个 /usr/sbin/sendmail.sendmail 的权限竟然是

-rwxr-xr-x  1 root root ... /usr/sbin/sendmail.sendmail

于是

chown root.smmsp /usr/sbin/sendmail.sendmail
chmod g+s /usr/sbin/sendmail.sendmail
/etc/init.d/sendmail stop
/etc/init.d/sendmail start

再尝试发邮件,搞定。

+ 0 - 0 | §C#调用VC++.net托管库程序集DLL
Could not load file or assembly '... ...' or one of its dependencies. 由于应用程序配置不正确,应用程序未能启动 ...  查看全文
标签 ( 开发/理论 ) :
+ 0 - 0 | §Windows下以其他用户身份运行程序

  从 Windows 2000 开始,微软的视窗操作系统开始提供给当前登录用户以不同的用户身份来运行程序的功能。前提是系统的 RunAs 服务(Windows 2000 下) / Secondary Logon 服务(Windows XP 下)没有被禁用并处于已启动状态。

  在必需的 RunAs / Secondary Logon 服务已经启动之后,就可以为程序设定用户身份。对于一般的可执行程序来说,只需要创建指向该可执行文件的快捷方式,然后在按住 Shift 键的同时鼠标右键单击快捷方式,然后单击“运行方式 ...”,在弹出的对话框中设置指定的用户及密码信息即可。这里是微软官方的 HOW TO 指南。

  但对于某些特殊类型的快捷方式来说,用 Shift + 鼠标右键 唤出的菜单中并没有“运行方式 ...”的设置选项,比如说一些批处理文件 (.bat)等有缺省文件类型打开方式的快捷连接。对于这种文件如果需要使用到 RunAs 的功能,可以新建一个空的快捷方式,在快捷方式向导对话框中键入项目的位置为 runas /savecred /usr:administrator "command line to the real application" 即可。其中 /usr: 后面的 administrator 表示以 administrator 用户身份运行程序;command line to the real application 填写实际程序的执行命令; /savecred 参数将自动保存输入的密码,这样在下一次运行快捷方式的时候就不需要再输入密码(该参数在 XP Home Edition 版本中无效),如果不希望系统保存密码去掉该参数即可。

+ 1 - 0 | §批处理控制VMWare虚拟机
VMWare 确实是好东西,不过安装之后会增加四个自动启动的服务以及两个虚拟的网络连接。我是比较讨厌这种没事就占着系统资源的东西,何况也不是经常要用着 VMWare ,所以写了个批处理脚本来自动启动/关闭 VMWare 虚拟机以及相关的服务和网络连接。  查看全文
+ 1 - 1 | §在MySQL查询结果集中得到记录行号

如果需要在查询语句返回的列中包含一列表示该条记录在整个结果集中的行号, ISO SQL:2003 标准提出的方法是提供 ROW_NUMBER() / RANK() 函数。 Oracle 中可以使用标准方法(8i版本以上),也可以使用非标准的 ROWNUM ; MS SQL Server 则在 2005 版本中提供了 ROW_NUMBER() 函数;但在 MySQL 中似乎还没有这样的系统自带功能。虽然 LIMIT 可以很方便的对返回的结果集数量和位置进行过滤,但过滤出来的记录的行号却没办法被 SELECT 到。据说 MySQL 是早就想增加这个功能了,但我是还没找到。

解决方法是通过预定义用户变量来实现:

set @mycnt = 0;
select (@mycnt := @mycnt + 1) as ROWNUM , othercol from tblname order by othercol;

这样查询出来的结果集中 ROWNUM 就保存了行编号信息。这个行编号信息的某种用途在于当你需要根据需要对数据按照某种规则排序并取出排序之后的某一行数据,并且希望知道这行数据在之前排序中的位置时就用得着了。比如:

set @mycnt = 0;
select * from (
    select (@mycnt := @mycnt + 1) as ROWNUM , othercol
     from tblname order by othercol
) as A where othercol=OneKeyID;

当然你也可以通过创建临时表的方法把查询结果写到某个拥有 auto_increment 字段的临时表中再做查询,但考虑到临时表在 MySQL master / slave 模式下可能产生的问题,用这样临时用户定义变量的方式来计算查询结果集每一行对应的行号还是更为简洁 -- 除非你愿意在 PHP 或其他语言脚本中对返回的整个结果集再作处理。

+ 0 - 0 | §在Modal Dialog中操作Modless Form

当使用 form.ShowDialog(); 创建一个模式对话框的时候,如果在这个 Modal Dialog Form 的构造函数又创建了一个新的 Form 并调用 form.Show() 来显示它,然后在 模式对话框的 Load 事件或其它后续的事件触发时把新创建的 modless form 给 Close 掉的话(比如当对话框创建过程中需要比较长的数据加载过程而调用了一个进度条窗口来体现数据加载的进度),会发现当这个由 modal dialog 自己创建的 form 被 Close 的时候, modal dialog 本身也同时被 Close 掉了。

导致模式对话框被自动 Close 的原因是 form.ShowDialog() 的行为模式是将当前活动窗口设置为它的所有者( Owner ),这在一般情况下自然就是调用 ShowDialog 方法的那个 Form 。但如果在这个模式对话框的构造函数里面又创建了一个新的 Form 并 Show 出来的话,当前活动窗口就变成这个新创建的子 Form 而不是事实上希望的那个 Form 了。这就使得 Modal Dialog 所创建的子 Form 变成了它的 Owner ,Owner 一旦被关闭,这个 Modal Dialog 自然也就被销毁了。

所以更为保险的调用方法是显式的指出该模式对话框的所有者: form.ShowDialog(this); 把调用窗口的引用作为参数传递,防止在模式对话框被构建之前有其他的窗体变成活动窗体。

标签 ( 开发/理论 ) :
+ 1 - 0 | §[存]VS2005无法启动调试问题

在 Visual Studio 2005 里面试图调试项目的时候出现错误信息:“无法启动调试 绑定句柄无效”。

有三种解决方法:

  1. 开启 Terminal Services 服务。天知道为什么调试器还需要这个服务?我向来都是禁用此服务的。
  2. 在项目属性的 “Debug” (调试) 一项里,把 “Enable the Visual Studio hosting process” (启用Visual Studio 宿主进程) 选项禁掉(该项缺省是被启用的,用于提供经过优化的调试)。
  3. 在项目属性的 “Debug” (调试) 一项里,把 “启动非托管代码调试” 选项选中。
标签 ( 开发/理论 ) :
+ 0 - 0 | §[存] 如何乱序排列文件内容
洗牌问题:洗一副扑克,有什么好办法?既能洗得均匀,又能洗得快?即相对于一个文件来说怎样高效率的实现乱序排列?  查看全文
标签 ( 开发/理论 ) :
+ 1 - 0 | §升级Linux Kernel导致fork异常

实践再次证明“永远不要轻易去升级系统”这句至理名言的正确性。然而原有系统的不稳定使得我们不得不尝试如此做。

继几个还算可以能够接受的升级后遗症之后,又发现一个用 c 写的服务程序出了异常。这个接受客户端连接请求的服务程序理论上来说 fork 出来的处理子进程不会超过个位数;但现在跑了一段时间后 fork 出来的进程会突然线性增加,直到资源耗尽。

本来以为是恶意程序在攻击端口,但查看日志并没有发现任何异常的ip连入。在找不到问题的情况下,只好在服务器上把源代码重新编译连接了一次,结果这个疯狂的 fork 居然就消失了!

虽然在这里很多人对于 “Each version of the kernel requires applications to be compiled specifically for it” 的说话嗤之以鼻,但我现在好像就碰到了类似的现象。谁来告诉我这是为什么?

标签 ( 开发/理论 ) :
+ 0 - 0 | §CentOS下su的提示信息问题

  最近重装服务器,顺便把系统换成了 CentOS 4.3 。结果发现终端登录的时候如果想 su 到 root 用户的时候会出现一段要求用户交互的文字:

$ su -
Password:
Your default context is root:system_r:unconfined_t.
Do you want to choose a different one? [n]

  这是因为安装的时候启用了 SELinux ;而 CentOS 新版本对于 su 的处理除了要求输入 root 的密码之外,还要求确认 SELinux 的上下文信息。这句确认信息虽然基本上可以直接按回车忽略过去,但对于一些需要 su 的自动脚本来说就是不必要的麻烦了。

  解决方法是修改 /etc/pam.d/su 文件,把其中的

session    required     /lib/security/$ISA/pam_selinux.so open multiple
  这行改成
session    required     /lib/security/$ISA/pam_selinux.so open

  也就是去掉 multiple 选项即可。当然如果觉得完全不需要 SELinux 提供的内核保护的话,也可以修改 /etc/selinux/config 配置文件,把 SELLINUX 参数改为:

SELINUX=disabled

  该配置文件将被 init 读取,当你重启系统之后使用 getenforce 命令查看 SELinux 的状态应该就可以看到已经是 disabled 了。据说也可以把 SELINUXTYPE 参数改为 SELINUXTYPE=strict 来解决。

  这个问题似乎在 CentOS 4 / RHEL4 的某些版本上都存在。之前用的老版系统则不需要修改任何配置。

  附: Introducing SELinux , rhel4-tut , Think before deploying Security-Enhanced Linux in RHEL 4

标签 ( 开发/理论 ) :
+ 1 - 0 | §SVN PROPFIND Request Failed

PROPFIND Request Failed - Error 405 HTTP Method Not Allowed

This message comes in different flavours. You might be seeing this error when:

  • PROPFIND Request Failed
    You tried to browse the parent path of a repository instead of the repository itself using an older version of TortoiseSVN. Try appending the name of the repository you wish to access, or upgrade TortoiseSVN to 1.2.3 or newer.
  • PROPFIND Request Failed
    You forgot to append a '/' slash to the end of the URL you entered. Older versions of TSVN requires that there be a '/' after the repository name. If you forget this, TSVN will strip the repository name from the URL and therefore try to access the parent directory.
  • Lock Request Failed
    You tried to lock a file in your working copy which no longer exists in the repository. Update your working copy before trying to lock files.

For more information about what actually caused the error, seek out the Apache error log.

这是 TortoiseSVN 对于 PROPFIND Request Failed 错误的说明。 实际上,除了上面提到的几个与 TortoiseSVN 版本有关的原因之外,也可能是你根本就敲错了 repository 所在的路径。理论上来说返回的错误码如果是 404 Not Found 更容易让人理解一些,但确实就是返回 405 的错误。一个小小的键盘键入错误也许就会让你误以为是 svn 的服务器出了什么问题。。

标签 ( 开发/理论 ) :
+ 0 - 1 | §[存] Scripting.Decoder 代码
Windows Script Encoder 对 asp / vbscript / jscript 等脚本进行编码混淆。收集些解码相关的资料。  查看全文
+ 1 - 0 | §Links 2006-08-29: myisamchk
  • Checking and repairing MySQL tables
  • 使用myisamchk进行崩溃恢复
  • MySQL 5.1 Table Maintenance Statements
  • MySQL 5.1 Table Maintenance and Crash Recovery
    MySQL 虽然提供了 myisamchk 工具和 CHECK/REPAIR/ANALYZE/OPTIMIZE TABLE 命令来完成大部分的数据库表修复操作,但却没有把这些功能给自动化。这大概也算是开源软件与商业软件之间的差别之一吧。越是成熟的商业软件对用户来说越傻瓜式;开源软件则把主动权都扔在使用者手里,再好的功能也需要使用者自己去编写更多的脚本才能全面的利用。先 Mark 一把,等忙完了手头的工作,早晚得把 MySQL Table 的自动修复和优化脚本给整出来,不然冷不丁半夜三更给叫醒实在受不了。
标签 ( 开发/理论 ) :
+ 1 - 0 | §[z]SHMMAX and SHMALL

On Linux, the default shared memory limit (both SHMMAX and SHMALL) is 32 MB in 2.2 kernels, but it can be changed in the proc file system (without reboot). For example, to allow 128 MB run these commands:

$ echo 134217728 >/proc/sys/kernel/shmall
$ echo 134217728 >/proc/sys/kernel/shmmax


These commands could also be put into a script to run at boot-time.

Alternatively, sysctl can be used, if available, to control these parameters. Look for a file called /etc/sysctl.conf and add the following lines to it:

kernel.shmall = 134217728
kernel.shmmax = 134217728


The sysctl.conf file is usually processed at system boot-up, but sysctl can also be called explicitly.

标签 ( 开发/理论 ) :
+ 0 - 0 | §MySQL启动失败的另类原因

  毫无预兆的, MySQL 罢工了。 用 mysql.server 启动脚本启动之后,没有任何提示信息就结束,mysqld进程自然是没有起来。

  把 mysql.server 里面 $bindir/mysqld_safe --datadir=$datadir --pid-file=$server_pid_file >/dev/null 2>&1 这句的输出重定向去掉后运行,结果发现报错: File size limit exceedednohup ... ...

  这样看来自然是有文件太大了。但查看了 mysql 数据目录下相关的数据库文件和日志文件,最大的也就几百兆。 ulimit -a 查看也没有对文件大小做任何限制。

  经过 N 分钟的郁闷之后,决定用 find / -size +2048000k 查找整个硬盘上面的可疑文件。结果是: /var/log/pacct 这个2G多的大文件冒了出来。很显然,这是 SA 激活了 accton 之后产生的日志文件,没给做回滚。二话不说,清空 /var/log/pacct 再启动一次 MySQL ,一切恢复正常!

  搞不懂的是为什么 mysql 的启动脚本会受这样一个无关痛痒的进程统计日志的影响而导致 mysqld 进程完全无法启动。估计还是 mysql.server / mysqld_safe 脚本逻辑的问题。。

标签 ( 开发/理论 ) :
+ 0 - 0 | §sendmail Error: unknown user smmsp

sendmail突然不能用了。错误信息:

/etc/mail/submit.cf: line 423: readcf: option RunAsUser: unknown user smmsp
/etc/mail/submit.cf: line 442: readcf: option TrustedUser: unknown user smmsp
Mail submission program must have RunAsUser set to non root user

原来 sendmail 用来查询排队邮件目录的用户/组给删掉了。yjnet 在 sendmail 安装笔记中说: sendmail 必须有一个set-group-id(默认是smmsp组)的程序来在一个组可写的目录中查询 排队邮件。所以我们要建立一个smmsp用户和组。并建立如下目录并设置相应的权限,具体设置要求可查询源码目录树下sendmail/SECURITY文档。
# groupadd smmsp 
# useradd smmsp -d /var/spool/clientmqueue -s /dev/null
# mkdir /var/spool/clientmqueue
# chown -R smmsp:smmsp /var/spool/clientmqueue  
# chmod -R 770 /var/spool/clientmqueue  
# mkdir /etc/mail
# mkdir /var/spool/mqueue
# chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
# chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue

把用户和相应的组加回去在之后,问题解决。

+ 0 - 0 | §Oracle Web Cache 进程监控
OracleAS Web Cache 有个 Auto-restart 的功能,可以自动监控 web cache 进程的状态,发现异常自动重启。但在 Web Cache Manager 管理界面配置好了以后就发现 web cache 进程会被 auto-restart 进程不断的重启,发疯了一样。  查看全文
+ 0 - 1 | §Links 2006-06-01: svn DB Format
  • How FSFS is Better
    如果你打算开始使用 svn 来进行源代码版本控制,那么除了需要了解 svn 的一般特性之外,还需要决定到底采用 FSFS 还是 Berkeley DB 作为 svn repositories 的存储格式。由于历史原因, svn 开发团队最初使用了比较大众化的 Berkeley DB 。直到2004年以后,才引入了基于文本文件的 FSFS系统。相比而言, FSFS 似乎具有更多的优点。
标签 ( 开发/理论 ) :
+ 1 - 1 | §ftok 函数的 Shell 脚本实现
“古老的 Sys IPC 仍然有好几种有效的用途。三种 IPC 对象是共享内存,信号灯和消息。”当使用到 IPC 的这些对象时,你需要为每个对象创建一个 Key。虽然理论上来说我们在定义一个 IPC Key 的时候可以使用任意自己喜欢的 Key ,但为了避免与其他的程序产生定义重复,在 UNIX/Linux 中一般会使用 key_t ftok(const char *path, int id) 函数来生成一个比较唯一的 Key 值。然而,“每个人都讨厌 System V IPC。它比打孔纸带还慢,使用与文件系统完全无关少得可怜的名字空间,使用人类讨厌的数字给它的对象命名,并且还常常自己忘记自己的对象,你的系统管理员经常需要用 ipcs(1) 查找那些丢失了的对象并且用 ipcrm(1) 删除它们,还得求老天保佑不要在用光内存以后才发现问题。” 对于来实现进程监控/自动重启Bash Shell 脚本来说,在脚本里面硬编码进当前程序用到的 Key 值肯定不是个好办法,最好是实现相同算法的 ftok 函数。  查看全文
+ 1 - 0 | §Links 2006-05-26: 语言革命
  • How to Love a Framework You've Never Used
    以前的编程语言把大量的工作留给程序员,那是因为当时的电脑是非常昂贵的设备,只有最重要的东西才可以交给它去处理。随着技术的发展,编程语言的智能化程度越来越高,程序员需要做的工作则越来越少。所有的这些语言上的革命只有一个目的:经济利益最大化。或许有一天,程序完全可以自动完成所有的工作,程序员这个职业随之成为历史。
  • Rails-inspired PHP frameworks
  • XML for <SCRIPT> Cross Platform XML Parser in JavaScript
    Powerful, standards-compliant JavaScript XML parser that is designed to help web application designers implement cross platform applications that take advantage of client-side manipulation of XML data.
  • 几个有用的音频文件处理软件
标签 ( 开发/理论 ) :
+ 1 - 0 | §修改 Linux 的 LANG 环境变量

一般来说要设置 Linux 系统的环境变量只需要在 /etc/profile (全局) 或者 ~/.bashrc (单个用户) 即可。但是对于 LANG 变量来说,有时候你即使在所有这些初始化脚本里面 export 过了,LANG 的值还是纹丝不动。实际上,你需要去修改 /etc/sysconfig/i18n 文件里面的内容。

标签 ( 开发/理论 ) :
+ 0 - 0 | §Linux 下的 Oracle 启动脚本
Usage: sh oracled [start|stop|restart] SIDs 其中SIDs是数据库名,多个名称之间用逗号分隔。缺省的操作是 restart ,也可以指定需要进行的操作( start | stop | restart )  查看全文
+ 1 - 1 | §MySQL的大小写敏感性

在 MySQL 中,数据库和表对就于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。

奇怪的是列名与列的别名在所有的情况下均是忽略大小写的,而表的别名又是区分大小写的。

要避免这个问题,你最好在定义数据库命名规则的时候就全部采用小写字母加下划线的组合,而不使用任何的大写字母。

或者也可以强制以 -O lower_case_table_names=1 参数启动 mysqld(如果使用 --defaults-file=...\my.cnf 参数来读取指定的配置文件启动 mysqld 的话,你需要在配置文件的 [mysqld] 区段下增加一行 lower_case_table_names=1)。这样MySQL 将在创建与查找时将所有的表名自动转换为小写字符(这个选项缺省地在 Windows 中为 1 ,在 Unix 中为 0。从 MySQL 4.0.2 开始,这个选项同样适用于数据库名)。

当你更改这个选项时,你必须在启动 mysqld 前首先将老的表名转换为小写字母。

换句话说,如果你希望在数据库里面创建表的时候保留大小写字符状态,则应该把这个参数置0: lower_case_table_names=1 。否则的话你会发现同样的sqldump脚本在不同的操作系统下最终导入的结果不一样(在Windows下所有的大写字符都变成小写了)。

标签 ( 开发/理论 ) :
+ 2 - 0 | §SVN 初体验

要在新服务器上装版本控制系统了。本来打算和以前一样用 CVS 来进行源代码管理,碰巧看到 duduwolf 对 SVN 大力推荐,加上这篇文章对于各种版本控制系统功能的完整比较,一直为 CVS 的各种缺陷感到郁闷的我自然毫不犹豫投奔了 SVN 的怀抱。

安装过程算不上一帆风顺,但我不打算在这里写出一篇完整的安装手册来,只简单记录几点体会。

服务模式

SVN 可以通过内置的 svnserve 提供服务,也可以和 Apache 配合通过标准的 http/https 来提供服务。用 svnserve 的好处是配置相对简单,但不足是 svnserve 所能提供的权限管理最小粒度只能到版本库(和 CVS 一样)。这对于开源软件的开发使用可能问题不大,但对于用作公司内部源代码控制来说就太简单了。所以我选择用 Apache + SSL + SVN 。

当初使用 CVS 最让我觉得美中不足的就是它的目录权限控制。因为针对每个用户只能控制其访问整个版本库的读写权限,以至于我不得不创建了N个独立的版本库。即便这样,每个版本库下面还是有许多项目是希望能分别控制权限的。当时采用的方法是禁用了CVS的目录浏览功能,并对每个项目目录名增加随机编号。只有知道确切的目录名称才可以访问到该项目。现在既然改用 SVN ,如果还是无法对版本库里面的每一个子目录进行精确的权限控制的话,还不如用 CVS 。通过配置AuthzSVNAccessFile文件来控制每一个项目目录的访问权限虽然算不上特别方便,但总比 CVS 那样完全没办法好。

数据存储

SVN 同样可以使用两种数据存储方式: Berkeley DB 和 FSFS 。在我看来, Berkeley DB 的优势在于其成熟性,但需要更多的日常管理和维护,并且是平台依赖的。所以我选择更简便的 FSFS 。

APR libraries

安装 SVN 的时候最好指定 --with-apr=  和 --with-apr-util= 参数到 Apache 安装的根目录(ServerRoot)下,而不是使用缺省的 SVN 安装包中自带的 apr 。否则如果你安装的 Apache 版本不同有可能导致 APR 库不匹配,出现类似 Can't set position pointer in file '/svn/test/db/revs/1': Invalid argument 的错误。Updated 2006-04-20 16:30 -- 比如说如果你安装的是apache 2.2.0版本,就需要在编译安装svn的时候指定--with-apxs和--with-apr参数到你的apache2.2.0安装目录下:
./configure --prefix=${subversionInstallFolder} /
--with-apxs=${apacheInstallFolder}/bin/apxs /
--with-apr=${apacheInstallFolder} /
--with-apr-util=${apacheInstallFolder} /
--with-ssl /
--with-zlib /
--enable-maintainer-mode

make clean && make && make install

签署证书

既然是公司内部的源码控制系统,通过 SSL 来加密保护登录信息还是很有必要的。证书的制作所填写的信息其他都关系不大,只要注意生成根证书和服务器请求签证文件时的两次 Common Name 不能一样(理论上Common Name 应该是用户将会用来访问的完整域名字符串),否则会导致证书生成的时候出现 error 18 at 0 depth lookup:self signed certificate 错误。

Updated 2006-06-29 12:52 -- 似乎还是有不少朋友在安装svn的时候碰到各种各样的问题,所以我把自己用来进行 svn server 恢复的完整脚本提供给大家下载( 点击下载 svn_recover.rar 13,473 字节),仅供大家参考。需要说明的几点:

  1. 不要直接运行 reinstall.sh 脚本。因为这个脚本是针对我自己的 svn 服务器的情况来写的,目的是在重装服务器的时候可以完全实现自动化。所以如果你不去了解脚本的实际工作就放服务器上执行,由此造成的任何后果我可不负责 :)
  2. 我的 svn server 不需要提供其他的服务,所以我的安装脚本是完全以 svn 服务为中心的,如果你的服务器还需要提供 php / mysql 等服务的话,这个脚本可能并不适合你。
  3. 为了 recover 的方便,我把 svn 所需要的一些关键文件放在了 resource 目录下面,安装脚本自动从 resource 目录下读取相关的文件拷贝到对应的目标目录下。你如果想用这个脚本,需要在 resource 目录下提供你自己服务器环境下的真实文件。本压缩包中的资源文件仅作示例。

标签 ( 开发/理论 ) :
+ 0 - 1 | §开始招人

如果你拥有以下特长之一,同时愿意与我们同甘共苦共同发展,或者凑巧对体育有着狂热的爱好,请联系我(工作地点:上海)。

  1. 熟悉LAMP环境下的web应用开发 + Ajax + PHP frameworks
  2. C/C++/Java + 网络编程 + Linux Shell
  3. C# GUI + MySQL
我的联系方式
+ 0 - 0 | §用BAT批处理快速删除CVS目录
Windows 下的 BAT 批处理命令行脚本虽然不像 Linux Shell 那样灵活强大,不过在某些情况下你还是可以利用它来完成一些事情。比如用 来对项目源代码进行控制的时候。  查看全文
标签 ( 开发/理论 ) :
+ 0 - 0 | §[转]用Erwin进行MySQL数据建模

为了能够使用 ERWin 能够进行基于 MYSQL 数据库的物理设计,可以采用以下方法步骤(假定你已经有了一个设计好的LOGICAL MODEL):

  1. 安装MYSQL的ODBC DRIVER,可以去MYSQL.COM,有链接可以下载。
  2. 在ODBC的管理程序中建立一个连接你的MYSQL数据库的USER DSN。
  3. 从已建立好的LOGICAL MODEL生成一个基于ODBC 2.0的PHYSICAL MODEL。
  4. 这步是重点:
      因为基于ODBC生成的数据库脚本并不完全兼容MYSQL的SQL语法,所以还需要做些其他的工作。
      例如,有时候需要用到DATETIME TYPE,但是只能生成DATE TYPE,我们可以采用SQL脚本来完成。
      ERWIN支持的脚本有两种:MODEL-LEVEL, TABLE-LEVEL.前者是针对整个PHYSICAL MODEL,而后者可以用于1个或多个TABLE。根据运行顺序,又分两种:Pre Script, Post Script。看名字就知道意思了。
      如果我们想把表里的"CREATE_ON"的TYPE设置为DATETIME,可以生成一个TABLE-LEVEL SCRIPT:
    ALTER TABLE %TableName MODIFY CREATE_ON DATETIME
      %TableName是ERWIN自带的宏,还有许多其他的宏,关于这方面的,可以看帮助。你也可以根据自己的需要,定义不同的SCRIPT(例如,需要设置一个字段为AUTO_INCREMENT)。
  5. 在FORWARD ENGINEER里根据实际情况选择Pre Script/Post Script,然后生成即可。

+ 1 - 1 | §高效程序员应该养成的七个习惯

对于软件工程师来说,工作也许意味着许多东西 -- 稳定的收入、做自己感兴趣的项目、找一份更好工作的跳板,或者你只是喜欢与其他程序员共事。但说到“效率”,强调的是在一定时间内按质完成项目的能力。Phil Chu根据自己的经验提出了高效程序员应该养成的七个习惯。建议去看看作者的原文(可能需要代理才能正常访问)。

  • 理解你的需求
    成为一个有效率的程序员首先要知道如何正确的支配自己的时间。对时间最大的浪费莫过于去做那些没有用处或者永远不会上线的项目。而导致这种结果的根源往往是对需求理解的偏差。
    要最大程度避免这种情况的发生,最好的办法是快速建模,尽可能让演示系统早点出来。对于客户来说,只有看得到摸得着的产品摆在面前,他们才会有兴趣去试用观察,才会在实际的操作中发现供需双方在需求理解上的偏差。否则即使你写上几百页的需求分析文档也只能是自己的一面之词,客户可没耐心去检查这些文档写的是否准确。
    另一方面,你应该让每一个阶段的开发成果都能够尽早的提交给客户。让他们以完全不考虑操作合理性和业务逻辑性的傻瓜级操作来发现程序员编程中的固有思维局限。尤其必须让QA尽早的介入到项目开发中来。如果能够每天提交一份测试版本给QA自然是最理想的了,但大多数项目开发做不到这样的粒度,那么就争取每周提交一份可测试版本。重要的是应该让QA和开发能够保持交错并行状态。只有这样,才能让QA尽早发现bug,降低每个bug的修复成本,同时缩减独立测试周期的跨度。
    程序员往往不愿意把半成品代码交付给测试人员,相反他们更喜欢在所有代码都完工,达到自己满意的程度之后再让别人来测试。因为在这之前的代码往往存在很多程序员自己知道需要修改(或者故意留待后续补全)的流程缺失和Bug,测试人员并不知道哪些是真正的Bug,哪些只是临时性的运行错误,每次都会一股脑儿作为Bug反馈给程序员。这往往让程序员们心烦。同时测试人员有时候也不喜欢测试这种很多分支都走不通的中间版本。
    但不管喜不喜欢,测试并发现问题是测试人员的工作;程序员则应该认识到,Bug反馈得越早就越是件好事情。QA和开发之间的关系往往很敌对,可实际上双方的目标是一致的。“忠言逆耳”古训有之,对于程序员来说就应该“有则改之,无则加勉”。总好过项目完成之后才发现一堆的问题,到那时候再要做修改,基本上都会牵一发而动全身,痛苦的还是程序员自己。
  • 保持真实性
    尽可能让你的系统运行在最接近真实环境配置下面,使用有实际意义的数据和真实的编译版本,并经常性进行模块整合。如果你的测试环境使用的数据都是些胡乱添加的东西,那么将来和测试数据大相径庭的真实数据这块大冰山早晚会撞沉你的程序。另一方面如果你只在开发环境来编译运行测试,会发现正式发布之后有各种各样莫名其妙的问题产生,到最后原来都是因为环境配置与开发环境有些不起眼的差异所导致。把所有模块整合进行编译联调,看上去应该是最后作的一项附加工作,但实际上这是一项需要在开发过程中经常性进行的工作。只有这样QA才能有最完整的东西拿来测试,得到更多的Bug反馈,同时降低模块整合的难度。
  • 理解你的代码
    书写规范的代码,并保持代码的整洁。Coding是一门艺术。正如写作一样,同样的文字在文豪的笔下就能够熠熠生辉,读起来赏心悦目;在普通人的笔下大概就只是词能达意的效果了;在某些人的笔下或许就需要研究半天才能猜出个大概来。当然不可能人人都成为艺术家,但至少你可以学会欣赏艺术、学习艺术。书写漂亮的代码是对自己工作的尊重,也是对其他程序员的尊重。如果你的代码中间充斥着大段过时的注释、可读性差的变量/函数,怎么去要求别人或者自己以后能够理解它们?
  • 最优编程
    把你的时间花在代码的功能上, 而不是去把现有的代码改得对自己胃口(尤其对于那些copy/paste过来的代码);要找到系统的瓶颈进行优化,而不是对那些无益于系统整体性能提高的地方做无用功。
  • 管理好你自己
    也许有人会说计划和进度控制是PM的事情,但一个好的程序员应该比PM更了解自己目前工作的进度。不论上头给的进度计划是否合理,你都应该有自己的原则和概念,清楚知道每天该做什么怎么去做。
  • 持续教育
    只有不断的学习、实践、犯错误,你才会真正有所提高。在我看来,对于程序员来说最好的老师不在学校,而在书本、网络、社区。学会自我学习才能保持与时俱进。
  • R-E-S-P-E-C-T
    互相尊重是一切的基础。
+ 0 - 0 | §项目开发的内部竞标机制

之前开发上碰到的问题:

需求过多,开发人员疲于应付
开发效率低
缺乏项目后期跟踪,很多项目做完之后变得无人问津

尝试过的解决方案:

项目外包 - 验收和后续维护上出现不少问题。进行需求的沟通也花费了大量的精力。
控制需求量 - 由于所有的商务内容提需求的时候都认为这个项目非常重要,往往造成需求控制失效。

一方面,开发人员抱怨需求像雪片一样飘过来,到最后却被证明做的不少项目都是无用功;
另一方面,市场、内容方面的策划人员抱怨提出来的需求没人来做,做出来的东西又质量不高。

现在想来,采用公司内部的项目竞标机制可以比较折衷的解决这些矛盾。

内部竞标机制:

需求方提供项目需求、开发周期与项目报酬等信息提出竞标;
开发人员自愿组合或者由高级分析设计人员点将组成项目小组来接受项目任务;

由于开发人员来自公司内部,对业务需求更加熟悉,同时限以公司统一的开发规范,有利于验收维护。
组队接受项目争取项目报酬的方式更能激发开发人员的创造力和主动性。

对于需求方来说,要考虑项目报酬成本,会更加谨慎的考虑需求的提出是否合理。

对于绩效考察来说,开发人员的能力贡献更加一目了然。

标签 ( 开发/理论 ) :
+ 0 - 0 | §Links 2006-01-15: engineer
标签 ( 开发/理论 ) :
+ 0 - 0 | §自动生成代码的可维护性

  slashdot上kale77in提出一个问题:“Ruby on Rails的自动代码生成(scaffolding)机制是否会使以后的代码变得难以维护?”

  实际上问题的关键并不在于RoR。看看Black Parrot的反问:“Do you have a beef with compilers and assemblers?”当我们使用C/C++/Java等各种语言的编译器把高级语言进行编译之后交付机器运行解释的时候,并不会去担心编译之后的东西是否具有“可维护性”,因为没几个程序员会去阅读这些汇编语言的内容。这样一个事实建立的基础在于各种编译器已经足够鲁棒,能够准确地翻译我们所使用的高级语言。kale77in之所以有那样的疑问,在于他对这些自动代码的不信任,基于可能会出问题的假设之上才会有需要去维护的担忧。

  这种担心当然是有理由存在的。毕竟RoR也才刚刚发布了1.0版本,功能缺陷不可避免。也许不久的将来会出现真正的“高高级语言”,将目前手工实现的大部分编码工作自动化(程序员们要么学习新语言,要么失业 ^_^);但在目前来说,正如不少回复者所提到的那样:scaffolding在Rails中并未占据着举足轻重的地位,你完全可以不去使用这项功能。

  在Rails之前,类似或者不似的代码生成功能在各种IDE之中并不鲜见。VC++的那些项目向导也曾经让我颇感迷茫:一个字还没写目录下面已经有成堆的源文件了;直到后来理解了MFC的来龙去脉,摒弃向导去白手起家完成整个VC++项目的编写,才明白原来那些大段大段的自动生成代码也就那么回事而已。甚至你使用UltraEdit/EditPlus之类的文本编辑器也可以设置自己的文件模板,从某种角度来说Rails的自动代码生成和这些没太大区别。而数据建模中应用到的代码生成更是广泛(ROSE, Erwin, PowerDesigner)。

  对于不成熟的东西,可以去尝试、促进,但不要依赖。目前来说,Rails的scaffolding充其量也只是一个辅助工具 -- 帮助新手热身或者用来创建那些临时性、生命周期很短的Web应用 -- 只要使用得当,完全谈不上会否影响项目代码的可维护性。

  说到可维护性,不得不提一句:人类的破坏力绝对要比任何机器强,手写代码难以维护的可能性远比程序自动生成的要高 >>。希望有一天,程序员这个职业会完全消失。

+ 0 - 1 | §Ferite:取代PHP的脚本语言?

Pixelcarnage介绍了一个新的脚本语言: Ferite(其实2001年的时候已经作为开源项目在进行开发,只是直到今年才发布了它的1.0版本)。

该脚本语言糅合了C/C++/Java/PHP等现有编程语言的特点,作为轻量级、线程安全的脚本解释引擎对其上层应用提供接口支持。该文作者甚至兴奋的宣布从此可以和PHP说再见了。当然语言的优劣是一回事,能不能得到各种上层应用和广大开发者的采纳又是另外一回事 -- 现在谈Ferite取代PHP的地位似乎为时尚早。但至少里面提到的Ferite语言所提供的modifies特性很有意思。

如果Ferite能够比先天不足加上后天局限的PHP吸收更多的OO高级语言特性同时保持轻便高效的优点,对于Web开发者来说,又多了一种选择,乐哉。

+ 0 - 0 | §程序员何苦为难程序员
程序员是不是天生憎恨同行们?如果不是的话,为什么会有那么多较劲的代码(特别是API、库函数中)产生出来,让使用这些代码的其他程序员们抓狂?  查看全文
+ 0 - 0 | §11点建议:让你的Web开发更专业
Web开发相关的各种标准和规范也许会让不少被IE给宠坏了的程序员及美工们抓狂。学习这些条条框框的过程总是伴随着枯燥和阵痛,但是当你把知识汲取成为一种潜意识的习惯之后,你会发现事情变得更简单了 -- 至少不用担心哪天冒出个Firefox来就会让你的页面变得面目全非!正如红灯停绿灯行才是保障道路通畅的好方法,而不是大家一起乱穿马路。Muffin Research Labs提出了一些值得在Web开发中作为习惯去养成的建议。  查看全文
标签 ( 开发/理论 ) :
+ 0 - 0 | §纯工作状态的误区
积极进取是好事,有目标也是好事。但有时候当你沉迷于自己给自己砌起来的思维壁垒之后,事情往往变得不那么妙了。  查看全文
标签 ( 开发/理论 ) :
+ 0 - 0 | §[转]Cpper,Javaer,Rubyer的得意
“就因为同一样事情还有着C++模板、传统Delegate和新兴动态Minxin的选择,让我们这些工蚁,还觉得有些许的自由和左顾右盼的乐趣。” -- 江南白衣@ITO  查看全文
+ 0 - 0 | §Shell找字串某字符最后出现处
需要对字符串查找其中某个字符最后出现的位置,这个在PHP (strrpos)或者Perl (rindex)里面都有现成函数可用的功能,在Shell里面居然一时想不出个道道来。在论坛上发贴也没人解答(不知道是问题太简单还是真的很高深...)。  查看全文
+ 0 - 1 | §软件模式成功的五大关键

自从面向对象编程方法被广泛使用以来,软件设计模式的使用大大增强了代码的复用性。但是跟其它的新概念一样,只有基于正确的想法和努力所创造出来的模式策略才可能是成功的模式。Peter Varhol提出了5点有助于设计出成功模式的关键

  1. 不耻下问
    不要让先入为主的成见妨碍你去发现好的设计模式。也许从你的开发团队甚至是网络开发社区你都能找到适合自己的模式。
  2. 谨慎定义模式的作用范围和局限性
    一个模式策略常见的问题是使用户搞不清楚它到底能做什么不能做什么。对于功能界限的划定不清晰将是致命的。
  3. 为模式提供一个具体的实现示例
    对于解决方案的描述很重要。但对于大多数开发人员来说他们更喜欢在已经现成的例子上面做些修改来满足特定的需求。抽象的东西往往不如具体可见的模型更有说服力。
  4. 提高模式的实用性
    对于一个模式策略来说,如果很少有人了解它,或者没有什么现成的功能库可供调用的话,要想取得成功只能是空中楼阁。因此当你设计出了一个觉得不错的模式之后,别忘了去推广它,让更多的人了解、使用它。
  5. 在实际的应用中测试模式并根据需要进行改进
    很多模式在理论上的表现要远胜于实际应用中的表现。所以必须在实际的应用中去检验模式的优缺点,不断进行改进优化。

About the Author
Peter Varhol is principal product manager of developer tools at Progress Software. He writes about software development topics in a variety of different technology publications, and speaks about application architecture and design at industry conferences.

+ 1 - 0 | §MS Sparkle, Flash终结者?

Sparkle screenshot
  近日,微软在年度专业开发者大会(Professional Developer's Conference , 简称PDC)宣布了其一款名叫Expression Sparkle Interactive Designer的产品。Sparkle则是这套工具包里面的一个图形设计开发工具。

  据说Sparkle将完全支持3D模型,并且能够和C#之类的编程语言集成在一起,设计和开发之间可以通过XAML数据格式共享资源。而现在的Flash文件只能通过编写复杂的脚本代码或其他的产品像eRain的Swift 3D生成的动画来支持3D,脚本的执行速度也不够理想,无法跟其他编程语言整合,使得现在Flash的应用范围受到很大局限。Sparkle的前开发经理Jon Meyer在他的Blog上说

“Today many developers view Flash as a tool best suited for web video and advertising, and not for the "heavy lifting" required in substantial applications. I see this trend continuing, unless Adobe significantly enhances Flash, e.g. with 3D, more audio and video formats, access to native code, a revised security model, more sophisticated text, faster script execution speed, and an open runtime of the breadth and richness of .NET.”

  看来这又是微软一款雄心勃勃的产品,大有试图取代现在Flash在web应用中位置的意思。当然肯定不会轻易步Netscape的后尘,何况Adobe刚刚完成了对Macromedia的收购,强强合作之下鹿死谁手定论尚早。加上Sparkle系列产品是基于Windows Vista平台的开发工具,只有在Vista发布之后才能够真正进入市场。终结者的角色,不是每次都能随便就当好的。在这之前Macromedia可以做很多事情了。实际上Macromedia新发布的8系列已经在大大强化富客户端的功能以及与服务器之间的通讯。

  Matthew David 详细分析了Flash和Sparkle之间的关系和优劣之处。

  怎么说都好,从使用者的角度,我倒是希望微软的这款Sparkle别出来惹事生非了。我还刚刚开始构思基于Macromedia的一套内容互动平台呢。

+ 0 - 0 | §dd command of Linux
Few linux newbies know much about the standard GNU untilities found in /bin. One of the most useful, and least understood of these commands is dd. Even people who have been using linux for years mostly don't know about the dd command. dd is found on every linux installation, and has been a standard since the 1970's in UNIX. There is a man page for dd, which gives a brief description, but no useful examples. Here are some things you need to know about dd.  查看全文
+ 0 - 1 | §优秀程序员的两大要素:懒 + 笨
这两个词和优秀联系起来,似乎有些不可思议。但从辩证的角度来看,这两项要素确实是成为一名好的程序员所应该具备的。Philipp Lenssen的原文请看这里。本文并非完全原文直译,但对于作者的观点,本人基本赞同。  查看全文
+ 0 - 0 | §用EditPlus转化文件格式到UTF-8
前几天给phpXplorer做汉化,做完之后发现网页编码都是UTF-8的,导致显示出来的汉化后的中文全是乱码。一时之间找不到GB2312->UTF-8批量转化的工具,又急着要把这套东西给运维人员使用,还好phpXplorer的网页编码统一使用的配置文件的信息,所以临时性把编码改成GB2312解决问题。今天看到七楼的日志,才知道原来自己用了几年的EditPlus就有这个功能,真是众里寻她千百度,蓦然回首,那人却在灯火阑珊处。  查看全文
+ 1 - 0 | §编程语言流行趋势

TIOBE根据在全球范围内的被使用程度以及各大搜索引擎(Google,MSN,Yahoo!)的数据计算出各种编程语言的当前流行指数。Java]在屈居次席10个月之后,重新回到排行榜老大的位置。

这个排名并不表示哪个语言是最好的,也不表示用哪个语言写的实际代码行数最多。但对于广大的程序员或者系统架构师来说,根据语言的流行趋势来考虑接下来做项目的时候采用何种技术架构和语言实现,是一件很实际的事情。

C#看来是势不可当了:剽窃别人的劳动成果并发扬光大向来是微软的拿手好戏;PHP的式微让我有点伤感。

Position (Position) Programming Language Ratings (Ratings) Status
1 = Java 21.206% +4.21% A
2 = C 19.473% +3.14% A
3 = C++ 10.514% -4.79% A
4 ↑↑ Perl 9.884% +1.44% A
5 PHP 7.873% -2.55% A
6 (Visual) Basic 7.757% -2.38% A
7 ↑↑↑ C# 3.485% +1.85% A
8 = Python 2.883% -1.82% A
9 = JavaScript 1.921% +0.24% A
10 ↓↓↓ Delphi/Kylix 1.763% -3.05% A
11 SAS 1.296% +0.57% A
12 COBOL 1.039% +0.51% A
13 ↓↓ PL/SQL 0.966% -0.46% A
14 ↑↑↑ Lisp 0.688% +0.36% A-
15 VB.NET 0.678% +0.01% A-
16 ↑↑ Fortran 0.591% +0.26% A-
17 ↓↓ IDL 0.559% +0.21% A-
18 Ada 0.502% +0.18% B
19 ↓↓↓↓↓ Pascal 0.493% -0.26% B
20 ↑↑↑↑ ABAP 0.428% +0.18% B

原始的排名原则和计算方式以及前50名的排行榜可以参考TIOBE Programming Community Index for August 2005

标签 ( 开发/理论 ) :
+ 0 - 0 | §HTTP Response中的Chunked编码
有时候,Web服务器生成HTTP Response是无法在Header就确定消息大小的,这时一般来说服务器将不会提供Content-Length的头信息,而采用Chunked编码动态的提供body内容的长度。  查看全文
标签 ( 开发/理论 ) :
+ 0 - 0 | §我们需要什么样的管理?
目标管理:不择手段,杀鸡取蛋;戴明管理:君子爱财,取之有方。
为什么要建立领导力企业文化?
要变成狼必须要改变本性,先有狼的思想,那就是企业核心价值下的领导力企业文化。
同样在中国,同样是中国人;没有管理是军阀混战;控制管理是蒋介石的方法;毛泽东用领导力带领中国人民打败了蒋介石,迫使美国人退回了三八线,这就是为什么要建立领导力企业文化的原因。  查看全文
+ 1 - 0 | §XML_RPC Vulnerability
pivot发布了XML RPC patch,修补了之前存在安全漏洞的版本。可以到pivot站点或者点击下载 我的站点下载补丁。这个补丁对于pivot 1.0及以上版本都有效。下载之后解压缩,把里面的两个inc文件上传到你的pivot/includes/xmlrpc-1.0.99.2/文件夹下覆盖原来的两个文件即可。此补丁无需rebuild文件或rebuild索引。同时这个补丁不会修改pivot的版本号。详细信息请到这里察看。同时感谢 Nio 在blog上提到了这个安全漏洞,才使我知道这回事 :)
+ 0 - 1 | §Apache启动时httpd进程数量变多
前几个月把需要在后台自动运行以及处理一些编辑操作请求队列的脚本统统集中到了一台巨牛的服务器上面跑,结果发现再牛的机器处理那么多并发的操作还是会吃不消。于是让老查再腾一台服务器出来分摊任务,同时还可以作为互备。下午老查找过来了,说新弄的那台服务器起来之后ps出来有几十个httpd,很奇怪。httpd.conf的配置是和原来服务器一样的,启动的时候按照配置的数量应该是只有5个才对。  查看全文
+ 1 - 0 | §也来说说Hackathon这玩意
今天在PoseShow上看到了关于的介绍,从herock介绍中大致明白了Hackathon是怎么回事。有些个人的看法,先记下来。看看以后对它进一步了解之后的想法是否还是如此 :)  查看全文
+ 0 - 1 | §TNS-03505: Failed to resolve name
Oracle数据库连接错误信息。出现这个问题的原因基本上是因为tnsnames.ora没有为连接配置正确的SERVICE_NAME,通过编辑tnsnames.ora文件添加相应的服务信息即可。不过今天被问到一个比较有意思的情况。记下来以后参考。  查看全文
+ 0 - 0 | §保证shell脚本执行唯一性
很多用cron定时执行的shell脚本可能会由于各种原因执行很久,会有必要在运行的时候先检查一下自身是否还在运行。本文提供的linux shell脚本用以检查以命令sh ...来执行的shell脚本。要对其他东西进行唯一性检查,可以稍微修改一下源代码。  查看全文
+ 0 - 0 | §查杀子进程的脚本
核心服务器上跑了一堆的脚本、程序,难免有时候会出现僵尸进程,死不死活不活的在那里占用资源,最初只是写了个根据关键字查杀进程的linux shell脚本,后来发现很多时候进程死在那里的时候其实是内部调用子进程的时候出现了问题,这时候光杀父进程根本没解决根本问题。比如说rsync的时候通过ssh来连接,rsync本身没问题,但可能ssh死掉了。因此重新写了脚本,递归查找子进程。  查看全文
+ 0 - 0 | §查看Redhat版本的方法

cat /proc/version或者cat /etc/redhat-release或者cat /etc/issue

+ 1 - 0 | §Too many open files 错误
打开的文件过多,一般来说是由于应用程序对资源使用不当造成,比如没有及时关闭Socket或数据库连接等。但也可能应用确实需要打开比较多的文件句柄,而系统本身的设置限制了这一数量。  查看全文
+ 1 - 0 | §linux下进行文件夹打包

把整个文件夹 folderTared 的内容打包成一个gz文件:
tar czvf folderTared.tar.gz /theDir/folderTared
把压缩的gz文件恢复到指定目录下:
tar xzvf folderTared.tar.gz /theDir/

+ 1 - 0 | §[存] MySQL中文排序问题

在MySQL中,进行中文排序和查找的时候,对汉字的排序和查找结果是错误的。 这种情况在的很多版本中都存在。如果这个问题不解决,那么MySQL将无法实际处理中文。 出现这个问题的原因是因为MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象。

解决方法:

  1. 对于包含中文的字段加上"binary"属性,使之作为二进制比较,例如将"name char(10)"改成"name char(10)binary"。
  2. 如果你使用源码编译MySQL,可以编译MySQL时使用 --with--charset=gbk 参数,这样MySQL就会直接支持中文查找和排序了(默认的是latin1)。也可以用 extra-charsets=gb2312,gbk 来加入多个字符集。

来源: http://www.douzhe.com/linuxtips/1820.html

Updated 2006-12-26 11:09 -- 如果不想对表结构进行修改或者重新编译MySQL,也可以在查询语句的 order by 部分使用 CONVERT 函数。比如 select * from mytable order by CONVERT(chineseColumnName USING gbk);

 

+ 0 - 0 | §TortoiseCVS缺省设置问题

  cvs客户端我偏爱这只乌龟,其集成于Windows资源管理器的操作方式用起来很方便。但如果安装了乌龟以后不对其缺省设置进行修改的话,用它从cvs上取出unix格式的文件的时候会自动把文件格式变成Windows格式的。如果文件恰好是要在Unix/linux下执行的shell脚本文件的话,就会有问题。

  我现在使用的TortoiseCVS的版本是1.8.13,文件格式的问题在之前的版本似乎一直存在,有些版本甚至进行了设置也会发生错误。所以如果你使用乌龟,强烈建议使用1.8.13或者之后的版本。

  使用此版本安装之后,需要进行以下首选项设置:

  1. 选择语言为简体中文 (如果你觉得e文无所谓,可以忽略这个设置)
  2. 高级选项里面的 "SandBox DOS/UNIX" 选择为 "AutoDetect (default to UNIX)" (就是这个选项会捣鬼)

  进行了以上的设置之后,乌龟才不会把本来是unix格式的文件自动转化成windows格式的。这个问题对于一般的文本文件或者二进制文件都不会造成不良影响,但对于那些"\r\n" / "\n" 敏感的文件,比如运行在linux环境下的shell脚本,错误的回车换行方式将会导致脚本运行出错,无法被正常解析。所以在安装完乌龟以后请首先进行以上选项设置修改,以免带来不必要的错误。

  在本文完成之时,TortoiseCVS的最新稳定版本是1.8.16,对于这个版本是否仍然存在上述问题尚未进行测试。希望可爱的乌龟可以越做越好。不过既然1.8.13除了这个问题之外用起来都挺顺手的,我也就懒得升级到1.8.16了,有兴趣的朋友可以去测试一下看看。

  乌龟的下载地址: http://sourceforge.net/projects/tortoisecvs/

+ 5 - 1 | §[存] Unicode/UTF-8的区别
被同事问到这个问题,突然发现自己原来对这些概念实在是很模糊,只记得好像两者在编码的字节使用上有区别。赶紧恶补一下基础知识。  查看全文
+ 0 - 0 | §[转]Dreamweaver中使网页符合XHTML
通过在 HTML 文档中使用结构化的标记以及层叠式样式表来排版,我们可以使页面的实际内容与它们呈现的格式相分离。比之使用表格,把页面中的外观标记去除以后,重新设计现有的站点和内容将变得非常节省人力 (同时便宜得多)。如果想改变站点的输出,你只需要改动一下样式表就行了,而完全不必改动页面本身。对于网页设计人员来说, Dreamweaver可能是最常用的工具了。  查看全文
+ 0 - 1 | §正则表达式语法介绍
在类Unix的程序(PHP, Perl, Shell等)编写中,如果能够灵活的使用来进行字符串的分析处理,可以达到事半功倍的效果。  查看全文
+ 1 - 1 | §pivot blog发布系统中文优化包
本压缩包是本人基于pivot blog发布系统 ver 1.24.1 (Arcee) 的中文修改版。在pivot基础上增加了bbclone访问统计包、访问次数统计显示、帖子总数统计、中文字符串处理、中文分类显示、留言板功能。由于发布后台本身的汗化个人觉得没什么必要,所以管理后台本身还是英文的,但对于发布的内容来说完全支持中文。同时为了精简,把其他语言的支持文件都去掉了。  查看全文
+ 0 - 1 | §Foxmail邮箱目录配置修改工具
这是自己几年前用VC写的一个小工具,用来修改Foxmail配置文件以改变Foxmail邮箱的目录。有需要的网友可以下下来用用看。  查看全文
Since 2005.04.27  梦想 就像鸡蛋 要么孵化 要么臭掉RSS Feed (Entries) | Back To Home | @ZEAL | 沪ICP备05024379号