小鬼之家

流浪,游走于文明与原始之间. 关注底层技术,实现美好生活。QQ: 886988

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  51 Posts :: 0 Stories :: 48 Comments :: 1 Trackbacks

2008年7月4日 #

Declare myCurrsor Cursor Local For
    
select isnull(First_Name,''+ ' ' + isnull(Last_Name,''as InvestigatorName from dbo.Investigator where Study_ID = @StudyId
    
open myCurrsor
    
Fetch Next from myCurrsor into @InvestigatorName
    
While @@Fetch_Status = 0
    
begin
        
if(@count > 0)
        
begin
            
select @ResultVar = @ResultVar + ''
        
end

        
select @ResultVar = @ResultVar + @InvestigatorName

    
Fetch Next from myCurrsor into @InvestigatorName
    
end
posted @ 2008-07-04 11:02 黄志强 阅读(1) | 评论 (0)编辑

2008年7月3日 #

  BS应用和CS应用的最大的区别是BS应用面向的是众多的浏览器,而CS应用面向的是自己所专有的客户程序.

      目前能在各大浏览器里使用的原素还是html/xhtml, css, javascript, 但这些东西的使用形式却在不断地变化着.

      2004年以前,或者说更早一些时候,各大网站的布局还是大量地使用table进行布局,而现在,几乎技术实力略好一点的网站都已经采用div+CSS的方式进行布局了.

      AJAX流行之前,javascript所做的最主要的任务是进行表单的客户端较验,而现在,它却成为了网站开发中极为重要的一点,大量的动态效果被开发了出来,众多的JS库层出不穷. prototype, mootools, jquery等优秀的脚本库也越来越为广大程序员所熟悉,并且开始大量地在项目中应用.

      前台的变化是推陈出新,而后台的变化却是百家争鸣了.从最初的业务逻辑和表现的混合开发方式到微软所推崇的控件快速开发方式,再到被广大追求进步的程序员所认可的MVC开发方式.

      无论前台后台怎么变,不变是却是最基本的东西,那就是一个正常程序员应该有的最基础的知识.只要你精确的掌握了html/xhtml和css的标签和属性,你就能在不同的应用中发挥出它们的特色与优点, 只要你掌握了javascript和DOM对象结构,那实现什么样的动态效果就只是看你想不想去实现它而已了.后台的变化虽然不是那么好把握,但如果你看得明了一点,在大量的应用中后台要实现的其实也就是读写数据库的功能而已,只是不同的开发方式实现这些东西的形式不一样,方便程度不一样而已.当你熟练地掌握了面向对象的封装,继承,多态等知识你就会明白为什么一些框架会这样子进行组织,而另一些框架却使用的是完全不同的组织方式.

    把握开发的本质是把我们从烦琐的开发中解放出来的根本,所以我们应该努力地去掌握事物的本质,只有这样我们才能不断地总结开发经验,改进开发方式,使自己不断地解放出来.

posted @ 2008-07-03 13:17 黄志强 阅读(14) | 评论 (0)编辑

2008年7月2日 #

FileStream fs = new FileStream(Server.MapPath("Web.config"), FileMode.Open, FileAccess.Read, FileShare.Read, 8192);
SHA256 hasher 
= SHA256.Create();
byte[] data = hasher.ComputeHash(fs);

StringBuilder sb 
= new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
    sb.Append(data[i].ToString(
"x2"));
}

posted @ 2008-07-02 20:59 黄志强 阅读(10) | 评论 (0)编辑

2008年6月29日 #

      当今社会,信息是多了而不是少了,但人们却常常会感觉自己缺乏信息,准确地说是缺少在适当的时候出现的合适的信息.

      网络的兴起已经有好长的一段时间了,在还没有网络和电视电台的时候,我们的信息主要来源于人们的口头传播,这时候信息是动态的,是有选择性地传播的.当网络兴起,我们的主要信息主要来源于各大网站或通过baidu google等进行主动搜索,这时候信息是静态的.

      动态信息的传播是挟带信息的人为主动,拥有信息的人往往知道谁会对这个信息感兴趣,所以信息会是有针对性地进行传播的,不会造成信息的泛滥.静态信息的获取往往是以需要信息的人为主动,人们常常需要从极为杂乱的信息海洋中寻找自己需要的东西,这就要求用户要对使用baidu google之类的工具极为熟练,即使如此,这也需要花掉相当多的寻找信息的时间.我们能不能像在没有网络的时候那样让自己在网络中自己流动起来呢?答案当然是确定的,而且也有不少的人在进行着这样的尝试.例如sns,wiki等,但这些都未让信息真正地流动起来.

      我认为信息是可以自己流动起来的,在现实社会,信息已经建立了很健全的公众信息流动机制,一些热点信息很快就能像流行病毒一样扩展开来,它的流动速度之快几乎可以达到几分之一的光速.但针对小众的信息流动机制却从来都没有被有效地建立过,信息被局限在一个极小的范围.网络这样的一个现代化的平台的建立本来应该能很好的实现信息有针对性地流动,但利益的划分却使它到目前为止也未能实现这样的功能.

      有人说网络的最终形式是只有一个网站,如果真的是这样的话,我想信息就会自然而然地流动起来了.当所有的网站都建立在统一的规范下的时候,信息的共享与交流就是自然而然的事情,这样人们在网络上的行为就能促成信息的自然流动.

posted @ 2008-06-29 18:35 黄志强 阅读(16) | 评论 (0)编辑

2008年6月28日 #

因为在做大文件上传的分析中需要用到一段字符串的匹配算法,所以重新学习了一次KMP算法.

        private int[] GetNextVal(string t)
        
{
            
int j = 0, k = -1;
            
int[] nextVal =  new int[t.Length];

            nextVal[
0= -1;

            
while (j < t.Length-1)
            
{
                
if (k == -1 || t[j] == t[k])
                
{
                    j
++;
                    k
++;
                    
if (t[j] != t[k])
                    
{
                        nextVal[j] 
= k;
                    }

                    
else
                    
{
                        nextVal[j] 
= nextVal[k];
                    }

                }

                
else
                
{
                    k 
= nextVal[k];
                }

            }


            
return nextVal;
        }


        private int KmpIndexOf(string s, string t)
        
{
            
int i = 0, j = 0, v;
            
int[] nextVal = GetNextVal(t);

            
while (i < s.Length && j < t.Length)
            
{
                
if (j == -1 || s[i] == t[j])
                
{
                    i
++;
                    j
++;
                }

                
else
                
{
                    j 
= nextVal[j];
                }

            }


            
if (j >= t.Length)
                v 
= i - t.Length;
            
else
                v 
= -1;

            
return v;
        }
posted @ 2008-06-28 23:00 黄志强 阅读(9) | 评论 (0)编辑

2008年6月19日 #

在优化模板分析代码的时候突然想到了一个关键字:block

使用的形式是:
block("blockName"){
    //Anything you like.
}

主要是实现模板文件的部分重用.
posted @ 2008-06-19 22:46 黄志强 阅读(6) | 评论 (0)编辑

2008年6月9日 #

      有得必有失,这是一条至理名言,但我们往往不愿意相信这样的观点,而事实却往往不得不让我们信服.

      人总是在选择中失去,在失去中选择.

    
posted @ 2008-06-09 00:47 黄志强 阅读(11) | 评论 (0)编辑

2008年5月23日 #

 

MVC框架可以分为MVC,这不用我说大家也知道。M代表的也就是通常所说的实体类(Model),主要用来传递数据的;V也就是表现层(View),在本框架中是用一个html页面来实现;C也就是控制类(Controller),它是我们实现后台数据与前台表现相结合的地方。

View主管数据的呈现逻辑,所有与展示有关的事情应该在这里实现(为什么说是应该,因为有些逻辑如果用模板目前所支持的语法不能实现的话,那只好在C里去实现了)。View目前支持的语句有ifforeachwritewrite语句支持两种形式,一种是write(“something”)一种是直接在html里输出内容的<%=”something”%>if语句与C#的类似,但目前不支持if()elseif()else这样的形式,只支持if()else()这样的形式;foreach语句也类似于C#里的foreach,但不支持强类型,而应该写成foreach(var table in tables).下面举一个例子:

if语句的运用:

(例1

说明:$a 为控制类C里设置的变量,建议所有后台设置的变量名都用$开头,这里我们阅读模板的时候能很容易清楚哪些变量是在控制类里设置的。

foreach语句的运用:

(例2

说明:目前$tables只能是Array或者是实现了IListICollection 接口的对象。

从上面的两个语句的运用中我们能看到write语句的两种运用形式,需要特别说明的是目前write语句只支持输出单个简单对象,不支持运算表达式,如果这个限制对我们的使用影响比较大的话,日后会改造它。

Controller主要用来做数据填充和数据接收,具体的业务逻辑建议写到BLL层里。所有的页面控制类必需要继承PageController,不过我已经在项目里加了两个页面控制基类BasePageControllerRestrictedPageController他们都继承于PageController,所以我们在实际的开发中可以根据需要继承于这两个类,也可以根据需要建自己的基础控制类。所有的页面控制类都应该有一个public void Run()的方法,Run()方法是默认执行的方法,也就是说在访问这个页面的时候如果不指定方法名就会执行这个方法。页面控制类有一条严格的限制,也就是它和它的基类都不可以有重名的公有函数,也就是说不支持重载

页面控制类支持三种方法,以Setup开头的设置方法,以Teardown开头的卸载方法,以Ajax开头的Ajax方法,另一种就是不以以上三种符号做前缀的普通方法。设置方法会在普通方法之前执行,卸载方法会在普通方法之后执行;如果请求Ajax方法,不会导致设置方法和卸载方法的执行。

控制类的方法支持单类型的参数和Array还有实现IListIDictionary接口的对象,从前台传过来的字符串只要符合JSON格式,就会自动被反序列化到对应的参数中。

一个完整的后台控制类的例子:

(例3

说明:ViewData[“$a”]代表的是前台模板里的变量$a,参见例1ViewData[“$tables”]代表的是前台模板里的变量$tables,我们在控制类里给它设置数据源。

3未提供参数执行后输出的结果:

说明:因为aRun的参数,我们未在请求这个页面的时候给提供参数,所以它的默认值为0,因此它大于10的这个判断为假,所以输出的是这个结果。

提供参数a=20后的执行结果:

请求路径与CV的对应关系:

应用程序根目录下的default.aspx对应的页面控制类为Cvv.WebApp根命名空间下的控制类Default类,对应的模板文件为default.html,如果带有目录,如helpers/codehelper.aspx,对应的控制类为Cvv.WebApp.helpers命名空间下的CodeHelper类,对应的模板为helpers/codehelper.html

先说到这里吧,不明白的可以直接问我。谢谢合作。
posted @ 2008-05-23 11:45 黄志强 阅读(25) | 评论 (0)编辑

2008年5月11日 #

      本文是一篇关于开发文化方的形成与构建的文章,将谈到怎么去构建自己团队的开发文化,谈到怎么样在形成自己团队的开发文化的同时不去摸杀个人的表现空间。当今社会,谈公司文化的不少,但谈开发文化的好像不多,不知道是不是因为我孤陋寡闻。

      相信大家对团队开发这个词已经不陌生了,而且相信大家知道,一个稍稍大一点的项目也绝不会是一两个强人所能完成的,所以团队开发是完成大型项目的必然形式。团队开发强调的是协作与交流,而优秀的团队往往有一套行之有效的交流手段。在这样的团队的成员大家都清楚一个有争议的问题的决策会出自哪里,大家都清楚在遇到某个类型的问题时从哪里会得到最有效的帮助,大家都清楚自己的团队的其他成员的开发习惯与代码偏好;最重要的一点是,优秀团队的成员愿意为实现一个优秀的团队产品而放弃一些个人偏好而以比较一致的形式进行编码。

      一个优秀团队的形成可能会是一件自然而然的事情,合适的人走到一起的时候就会形成一种合式的协作形式,但我认为要实现一个优秀的团队必须要先了解团队成员的需求。任何一名程序员参加工作最直接也是最自然的目标就是要实现自己美好的生活,只是一些人把眼前的生活看得重一些,一些人把未来的生活看得重一些;因此满足他们对金钱的基本追求是必要条件,另一个重要条件是满足程序员对知识的渴望和对未来的向往。只有这样我们才有可能去构建一个比较稳定的团队,也只有在团队稳定的时候我们才有可能也才有必要去构建团队的开发文化。

     一个优秀团队的形成的首要条件是必须建立一个机制让团队的成员都勇于表达自己的观点与思想,只有这样我们才有可能知道大家在想什么,才可能知道大家需要什么。那我们应该怎么样去构建这样的一种机制呢?不同的人会有不同的实现方式,但以下的几点我认为是必要的。

      首先,我们要尊重团队中的每一个成员,人是一种需要自尊的动物,而自尊只有在自己的工作不断被别人肯定的时候才会体现出来,而人只有在自己的工作受到肯定的时候才会更为主动地更为自信地在别人面前表达自己的观点和思想。

      其次,把适当的工作安排给合适的人来做,尽量发挥和拓深个人的特色与修为。我相信一个优秀的团队一定是一个互补型的团队而不会是一个全能型的团队,只有这样大家才可能感觉到自己被团队认同,也只有这样他才有可能认同团队。 

      再者,不适合的人要尽早从团队中除名。人是一种爱对比的动物,如果团队中存在一些做事能力差而又没有上进心而且不愿意主动学习的人,那一定会影团队其他成员的热情,特别是当这种人的收入比其他人还高的时候。当然这件事情也不能做得太过了,否则人人自危也不利于团队的建设.
 
      最为重要的一点是,给予团队成员犯错误的机会。人总是在自己犯下严重错误的时候才能真正地体会到问题的严重性,也只有这样才会记忆深刻。而且也只有给予犯错的机会,团队的其他成员才有可能更进一步地了解各成成员的优点和弱项,也只有这样才有可能知识互补共同进步。当然这是有风险的,我们不能拿公司的前途来开玩笑,也不应该拿公司的声誉来冒险,所以我们要做这么一件事情的时候,首先应该建立一个强有力的救火队,这或许不是一般公司所能实现的,也不是一般公司愿意实现的;但即使不支持这一点,也绝对不要规定一个人如果犯多少次什么样的错误就降级就除名,否则你得到的将是一个十分保守的团队,而且随着问题的进一步发展,这样的团队最终只能是解散。

      前面说了这么多,其实只是说了形成一个优秀团队的外因,而真正能形成一个优秀团队的内因却在团队的所有成员。
posted @ 2008-05-11 02:27 黄志强 阅读(17) | 评论 (0)编辑

2008年5月2日 #

     摘要: 网上已经有很多JSON的反序列化的代码了,但自以为自己能写出更好的,所以就写了一个这方面的东西.实现的思路是,先把JSON字符串分析成JSON结点树,再根据传进来的实体的类型从结点树上取内容. 核心算法如下:构建分析树#region构建分析树privateTree<JSONNode>ReadTokens(char[]jsonChars){Tree<JSONNode>roo...  阅读全文
posted @ 2008-05-02 20:42 黄志强 阅读(60) | 评论 (0)编辑

小鬼之家