Home

Previous 10

Jul. 14th, 2009

fedora 蓝色小药丸

zz:retrospect

转自 http://blog.csdn.net/lfhfut/archive/2007/11/20/1895560.aspx

Read more... )


// 到了这一步,读到这一段,觉得正是半年来的写照,为什么当初信心满满,觉得自己足以完成这样一个项目,现在却有那么多内容没有完成,竟然连优先级和任务安排都搞不出来?为什么新的设计仍然是“一个人的头脑风暴”,而并不是可靠的工业化生产?如果要在计算机行业继续下去,要经历的东西还太多。而且不经历不行啊!如果半年前读到这一段,也许没有任何感觉?该死的计算机行业。今天什么都是该死的,这种 rant 最好发到 twitter。
Tags: ,

Apr. 14th, 2009

fedora 蓝色小药丸

过年后一直在学用WPF

WPF 用 XAML 来写,再加上 LINQ 表达式有种 XSLT 的味道,再加上 WPF 的模型与 XSLFO 类似:这个工作对我来说还真是挺对口的。

不过魔鬼在细节里,所以还是折腾了很久。目前还在转变观念中,MVVM
解耦得太厉害,吹捧它的文章都有点过火了,可是并不是什么地方都合适:那么什么模式适合什么呢?最好是什么模式和工具都可以灵活运用,那就不是几个月能搞定的事情了。

WPF 的优势:强调对数据/命令的呈现应当解耦合,拥有完整的系统。这样系统地学习一个东西,希望对以后做其他的开发有所帮助。

Read more... )
Tags:

Dec. 5th, 2008

fedora 蓝色小药丸

功能测试工具?

公司在用 SilkTest 做功能测试,录制东西很有意思,只是 windows 下的控件类型太多,而且没法像 pygtk 里那样动态地操作,所以真正用起来不够方便。如果有 .net 版本,想必会非常好用吧。

就想起了 dogtail,Fedora 6 里初次引入的测试工具,利用 at-spi 来得到控件内容,真是个不错的创意。现在的开源程序越发注重 Accessibility,可是 dogtail 却还是很少有人用似的?RH Magazine 文章http://en.wikipedia.org/wiki/Dogtail ,少有的一篇中文的使用(失败)体验

觉得很多东西都是老外用得多,而这里用得很少。与水平低有关系,与技术太高深——不适合大规模应用(复制粘贴)也有关系。

edit:
突然看到改头换面的利用 Accessibility 做测试的工具在 fd.o: LDTP (Linux Desktop Testing Project) http://lists.freedesktop.org/archives/ldtp-dev/2008-December/000745.html [info]lavixu
Tags:

Nov. 18th, 2008

fedora 蓝色小药丸

TFS 真垃圾

1. 提交代码,写了半天 comment,然后提示需要 resolve conflict,然后重新提交,又得把 comment
重写一遍。我最讨厌这种不把人当人的工具了。TMD 不能有个 save draft 么?

2. 刚才为什么会提示 resolve conflict 呢,我的本地代码是通过 git pull 过来的,确实在最新的代码基础上修改的,可是 TFS 只认自己的数据库,觉得代码不是最新的(它应该通过历史就可以知道些什么吧?)。问题是我不知道怎么让 TFS 只刷新数据库而不是本地代码。明明和 git 是同样的东西,都是 remote + index + working folder 的结构,偏偏不像 git 那样来刷新。那个 get latest version,说白了就是 HEAD,一个 pull remote HEAD 的操作无比麻烦,无论是只更新 index(cache) 还是同时更新工作目录。让人心烦的倒不是这些,是 resolve conflict 之后,虽然我本地代码没有任何变化,代码时间戳却变了,编译又得半天。

3. 还是没找到 merge a changeset 操作怎么搞。
Tags:

Oct. 10th, 2008

fedora 蓝色小药丸

timestamp

COleDateTime: 秒级
SYSTEMTIME: 毫秒
FILETIME: 微秒(?)
DosFILETIME(?): 两秒


	inline static CString ShowTimestampPrefix()
	{
		if(!bTimestamp)
			return NULL;

		SYSTEMTIME sysdtNow;
		::GetLocalTime(&sysdtNow);
		COleDateTime dtNow = sysdtNow;
		CString strResult = dtNow.Format(DEFAULT_TIMEFORMAT);
		if(strResult.Find(_T("%_")))
		{
			CString strMillSecond;
			strMillSecond.Format(_T("%03d"), sysdtNow.wMilliseconds);
			strResult.Replace(_T("%_"), strMillSecond);
		}
		return strResult;
	}

Tags:

Oct. 8th, 2008

fedora 蓝色小药丸

写 Log

老师讲 c++ 的时候不认真听,花了一个星期时间重学 templates 那一段,写出来的代码稀里糊涂的。

需求:一个 Log 接口,可以生成 容易解析的 输出,然后不用有太多功能了。结果我搞了个有六个参数的模板,叫做
"Logger",有三个参数是必需的:输入类型 LogItem,输出类型 CString,一个 Level 类型。可是这个 Level
类型不加也可以,函数参数加个 level 枚举就可以了,加上了的结果就是下面的乱七八糟:感觉是完全失掉了模板的本意 :(


	template<ILogPolicy::Level level>
	class Level_traits
	{
	public:
		enum{value = level};
		typedef Level_traits<level> type;
		static LPCTSTR name;
	};

	typedef Level_traits<ILogPolicy::LEVEL_ALL> LEVEL_ALL;
	LPCTSTR LEVEL_ALL::name = _T("NOTIFICATION");

	typedef Level_traits<ILogPolicy::LEVEL_VERBOSE> LEVEL_VERBOSE;
	LPCTSTR LEVEL_VERBOSE::name = _T("DEBUG");

	typedef Level_traits<ILogPolicy::LEVEL_INFO> LEVEL_INFO;
	LPCTSTR LEVEL_INFO::name = _T("INFO");

	typedef Level_traits<ILogPolicy::LEVEL_WARNING> LEVEL_WARNING;
	LPCTSTR LEVEL_WARNING::name = _T("WARNING");

	typedef Level_traits<ILogPolicy::LEVEL_FATAL> LEVEL_FATAL;
	LPCTSTR LEVEL_FATAL::name = _T("FATAL");


	template<class LogItem>
	void LogT(const LogItem& item)
	{
		switch(item.eLevel)
		{
		case ILogPolicy::LEVEL_FATAL:
			typedef LEVEL_FATAL LEVEL;
			Logger<LogItem, CString, LEVEL_FATAL>::WriteLog(item);
			break;
		case ILogPolicy::LEVEL_WARNING:
			Logger<LogItem, CString, LEVEL_WARNING>::WriteLog(item);
			break;
		case ILogPolicy::LEVEL_INFO:
			Logger<LogItem, CString, LEVEL_INFO>::WriteLog(item);
			break;
		case ILogPolicy::LEVEL_VERBOSE:
			Logger<LogItem, CString, LEVEL_VERBOSE>::WriteLog(item);
			break;
		case ILogPolicy::LEVEL_ALL:
			Logger<LogItem, CString, LEVEL_ALL>::WriteLog(item);
			break;
		}
	}


Tags:

Jul. 22nd, 2008

fedora 蓝色小药丸

保密协议

保密协议还要搞个象征性的签字。签字前,先象征性地偷一点代码出来。

这两段就是最近一周以来折腾的结果。从网上搜搜看,凡是在 asp+vbscript 里用了 xml 的人都疯了,不管他们抱着多么简单的目的。我也是。

BTW, 还是觉得这些 API 都好烂,不管是微软的 msxml,COM 的 BSTR 编码约定,vbscript
提供的函数,别人设计的国际化参数传递接口,还是自己定义的…… 软件就是一堆堆狗屎 stackup 的结果,一大堆狗屎。



' transformNode() returns BSTR which is always UTF-16. The result may be invalid
' because xslt may specified another encoding (thus header says UTF-16
but content
' is not in result). To use the result, need to use
fso.opentextfile(strPath, ForWriting, True)
' to save to file instead of calling WriteToFile(strPath, resultXml).
' To get correct encoding (specified in xslt), use
transformNodeToObject to avoid
' wrong header, no need to use fso now.
' DO NOT use LoadXmlDOMDoc to load xslDoc, use load() directly because
of the same
' reason: baseOBJ returns BSTR whose header is invalid.
' If transform fails, also check if path is converted to absolute ones.
function TransformXmlDOMDoc(byRef xmlDoc,byRef xslDoc)
    On Error Resume Next
	call InsertG11nParams(xslDoc)
	call SetDefaultDecimalFormat(xslDoc)
	xslDoc.loadXml(xslDoc.xml) ' reload as a workaround to msxml. It is
up to the caller to handle relative path to absolute conversion
	dim result, resultDoc
	set resultDoc = MakeDOM
	result = xmlDoc.transformNodeToObject(xslDoc, resultDoc)
	TransformXmlDOMDoc = "" & resultDoc.xml
	if xslDoc.parseError.errorCode <> 0 then
	    call ReportErrorEx(xslDoc.parseError.errorCode,
xslDoc.parseError.reason, xslDoc.parseError.line & " of file/url " &
xslDoc.url)
	 end If
	if TransformXmlDOMDoc = "" then
	   call ReportError
	end if
end function





' this is essential for us, since now we can use "nothing" as the end
of an array. can only be used in conditional statements.
' if using "var = var" then "resume" is only required(limited) in this function
' if using "var is nothing and not(var is nothing)" then "resume" is
also required in caller if caller is a function. If not in a function,
"resume" is the default action.
' not possible to use "var is var" or "var = "" & var" even with "resume"
function IsString(var)
    On Error Resume Next
    'IsString = var is nothing and not(var is nothing)
    IsString = var = var
    Err.Clear
end function




问题的关键是我们的代码为了绕开 IE 对 ActiveX 的限制(用户可能在 regedt 中设置各个 ActiveX 的 Compatibility Flag 为禁用),尽量不使用系统的 ActiveX,而是自己写了一个 COM 用来读写文件,而这个 COM 的行为与已有的不一致。我在注释里写不许用 LoadXmlDOMDoc() 或者 WriteToFile(),与设计者的意图背道而驰。可是难道要我去维护那个 COM 吗?(我不知道找谁或者怎么找……群发邮件吧)
Tags:

May. 10th, 2008

fedora 蓝色小药丸

逛街……

挺复杂的,上周从周日开始上班,今天周六据说要 release Direct 3.4 所以需要加班,但是我很不想动弹,于是逃了一天……

这周基本上是磨洋工,所以任务没完成。下周又有很多任务,按照周六加班周一休假的要求,相当于我旷工是双重的罪过……对不起大家了。一个人少干活儿必然有别人多干活儿,我对不起大家了。

今天先是去了赛格,听了 HD215 耳机,又问了其他耳机的报价,最后还是没有买,而是很理智的买了一条 1m 的延长线(80 元),比以前那根短得多也轻得多。

星之导报价情况:MX360 200, MX660 450 只有黑色, MX760 520 只有白色, MX90 620(?), PX200 420, PMX200 缺货,CX300 缺货,HD215 580。在卓越数码反而有 420 的 MX660,可见星之导作为总代的不厚道 :( 要是在东宇,大概不会这样吧?而且耳机没有中文标识,店员说是新西兰进来的,锦艺正品保修。看起来网上的价格和实体店的价格的确有差别,而且不但价格,物品的种类数量也有差别:为什么不肯像另一种方式一样做,而是“蛇有蛇道”互不干涉各赚各钱,这里有什么经济学的原理吗,难道就是混饱肚子或者吃不下?森海耳机是块小饼,话说回来,只是星之导代理的内容之一了,和运作的人有关系,这个人作为一个城市的代理,不会有本钱/精力做大。不同的城市有不同的代理,想想这种渠道网络还真是微妙,可是有施展不开/掣肘的感觉大概也不会很爽吧。

赛格三楼F区星之导,第一个试听的地方。里面有个牛X哄哄的小妹,声音特别让人讨厌,京味,还好后来是一个男的跟我讲,也很好说话。HD215 不如 PX200 好推。PX200 戴着有点热,HD215 反而戴着不热——然而头带一定要调整到合适位置,不合适的话会夹耳朵,合适位置就很舒服。隔音的效果刚刚好。我都心动了。用来试音的曲子有点不合适,偶尔有一种听起来像筛铁砂的低音乐器,不舒服。线沉甸甸的。单边耳线会拽耳朵,怪不得有人不喜欢。倒是不讨厌那个螺旋线。在卓越数码戴了 AKG K24P 和 KOSS PP,一样都很夹耳朵,那种头带缩放的方式实在很别扭。而且 KOSS PP 的耳棉蜇人。用一个很烂的 mp3 听了下 PP,重音确实很强劲,就是整体声音糊里糊涂的——我恨 mp3... DT231 的佩戴感觉怪怪的,因为会压住耳垂。老板不肯给试任何一个盒装的耳机,不拆。最后在赛博二楼的星之导听了 HD465,用那么好的功放搭配马兰仕 CD 机,声音竟然是嘈杂的,让人烦躁,大约与电脑城的环境也有关系,或者不适合那个女人/流行音乐,或者我看错了,播放的根本不是 CD 而是 mp3。最后,看到耳机外表可以被蹂躏成那个丑样子,顿时觉得“DTX900 容易被刮花”的传言不是不可忍受。卓越数码还有 k66 在卖,亲爱的高斯……

下午又去了宜家,头一次去,见识了很多稀罕的东西/做法/名字。很有意思,打算下次和张丽再去。

做法确实不同,让人觉得合理,有种专业和体贴/交流的感觉。把什么都讲清楚,说得明明白白。

1. 一进门,看到的是铅笔头,购物单=地图+流程+空白小页,还有纸尺,黄色很大的蛇皮袋……
2. 瑞典风味餐厅,那么大,那么多人……还有那么多供小孩玩的地方,不只餐厅,还有楼上楼
餐厅的“为什么要自己收拾餐具”非常入情入理
3. 才知道宜家的家具需要自己组装,并且解释说,这是价格低的一部分原因
4. 急救包,别处都没有卖的
5. 很多产品来自越南!和一些衣服一样!虽然邻居国家应该富起来,然而他们抢了这里的生意。真是矛盾呀!
6. 关闭时不会有响动的厨具抽屉,诸如此类
很喜欢那些书桌,书架,电脑桌,工作台,各种椅子,茶几…… 倒不喜欢小用具,玻璃花瓶,杯盘和灯等等,样式都很单调,可以挑的不多。藤具等等也是如此。烛台倒是蛮有味道。
7. 写着“请试着躺一下”的大床,好多好多,好软。到处都有沙发和床。
8. 超大仓库,得仰着头看,而且一条条小巷深深的进去,都来不及挨个看完。
9. 处理品专区……

从宜家出来,旁边还有一个运动品超市,还有顺电和百安居。这样逛逛还是蛮容易打发时间的,呵呵。顺电里的人都是狗眼看人低呢,不如顺电华强北那里热情了。看到一个贝尔金的笔记本垫很好,防滑,可调节高度,节能风扇;在宜家也有一种笔记本垫,很大一块月牙形板,比较薄也比较轻,下面用按扣方式粘了个抱枕一般的东西——放在腿上还是蛮舒服的呢

另外的一个发现就是 Nokia 手机的输入法,在 S60 系统中和在 S40 中不一样,而 S60 中也有不同的版本。在 S40 系统(我的 3110c)中,不可能通过输入法切换键来切换t9拼音和t9英文,必须在菜单里选择中文模式还是英文模式……这简直没法忍受,发展了这么多年的手机连最低端的西门子手机都比不上…… 在 S60 中,6300 不锈钢壳手机是与 S40 一样的... 而 6120 就可以只按一个键轮换。在 N81 中,又出现了第三个版本,感觉和 6120 不一样,也许是因为屏幕显示和按键分布的差别,容易误按数字键,不容易误按控制键。6120 和 N81 的控制键都很别扭:标点符号,删除或者取消输入,切换,空格确认输入,这几个功能很容易按错。这么多机型,搞出这么多输入法版本,简直是笨死了。——可是用了一下旁边两千多块的索爱,觉得诺基亚的还算理性呢,索爱的输入法相比多年前用过的那台机器,差得一塌糊涂:需要切换中英文模式才可以用 t9英文 + 简直让人疯掉的按键分布 - -! 再次缅怀西门子!


在世界之窗地铁站的一个小书店里,一眼扫到了“战争”两个字,竟然是“战争风云”和“战争与回忆”!这两本书我盼了很久了,前两个版本分别是人民文学出版社和?——总之分别是二十年和十年前的印本,现在根本买不到的……没想到今天碰上。大收获!陕西师范大学出版社,仍然是施咸荣等人的译本。

Mar. 10th, 2008

fedora 蓝色小药丸

2008-03-30

如果希望有线性的历史,就必须用 rebase

public tree 不可以用 rebase

是不是有个假设是不断 merge 后一定可以得到完整的内容

尝试:

从分支去 merge 或者 cherry-pick 主干的 changes,只有在最后才 rebase,再从主干 merge


刚才

做了错事,想修改一个历史的 commit,于是新签出来一个分支,修改,rebase,然后把新分支删掉,目前仍然位于分支上,又想合并到主干,rebase,发现合不进去,忘记了 rebase --abort 就执行了 checkout master,结果自己辛辛苦苦干了一天的分支找不到了…… T_T

幸好编辑器还有历史记录……


所以,rebase 时一定要在临时分支上做备份……

rebase 的混乱中,又 hit 到了 Git win32 的另一个严重问题:大小写

git add a 和 git add A 是不一样的,会创建两条记录,然而 a 和 A 又是同一个文件。所以,git add 要小心使用,把文件名记得清楚一点,多用 shell 的 tab 补全……



又几天过去了,发现分支很好用,不必把修改同步到多个分支上去,留在那里就可以了:分支才是保留历史的好场所,而主干则是 merge 的结果之一,是某个 merge 策略的结果,这个策略很可能不关心具体的历史细节。

而分支的数量,则是与 topic 有关,不应将多个 topic 的修改都提交到同一个分支,否则混合的 changeset 几乎没法分开,也不容易看到一致的,意义相通的 log。拆分很难,而 merge 很容易,所以个人的仓库里可以有很多很多分支。

保持 topic branch 的线性,制定合适的 merge 策略。我们既然是与 VSS 搭配,我感觉不需要做任何 merge...
Tags:

Mar. 9th, 2008

fedora 蓝色小药丸

策略

Git 的 branch 概念就是那么简单,HEAD 的指向变化而已 <= 我其实不知道自己对不对,姑妄言之

(HEAD 指向的是一个 commit,一个 commit 一定是完整的一棵树。这棵树大概长不出特殊的效果了?)

(如果我是个园丁也好)


不同的项目(不同的部署方案)涉及不同的角色,每个角色要对付 2~3 种不同的 branch (逻辑上),每个 branch 上都有不同的操作流程。各种教程里,我觉得 20 commands or more 最值得看,因为很容易定位自己的项目和角色,只记住自己的操作流程就很容易上手。我的上一封邮件 描述的就是对 tracking 和 topic 两种 branch 的操作,在我们的 tracking branch 中,我们要做的是找到一个可以编译和使用的 tree,而不是完整复制上游混乱的代码的 snapshot;而我们的 topic branch 则和一般的 git topic branch 无异。
Tags:

Previous 10