观自在书院

海纳百川有容则大 壁立千仞无欲则刚

博客园 首页 新随笔 联系 订阅 管理
  13 Posts :: 32 Stories :: 144 Comments :: 6 Trackbacks

2005年3月24日 #

这两天天涯杂谈里很热闹,一场围绕着城市女人和农村男人的砖头大战愈演愈烈,不少帖子半天回复量就超了一千。砸砖的人个个情绪激动,大体来说,城市女人大谈生活悲情和现实压力,老的现身说法,小的恍然大悟,城市男人则一幅素质高高在上的样子,显然忘记了自己还站在地球上;农村的看起来就很复杂,不过大部分都是很厚道的承认现实,只是认为某些人的观点太片面了,生活质量不仅靠物质,当然也有愤青走向另一个极端,将城市人贬的一文不值。

    其实这些对我来说都没什么新意了,记得半年多前就看过一篇《姐们,嫁人不嫁农村的》,在CSDN我看完了两千多条评论,又写了很长的回复,并把它转到了学校的BBS上,被学校不少人臭骂。回头想起来,这种帖真的太没意思了,真的不必去争一时的意气,和她们砸来砸去的,毕竟,人都有选择的自由。生活的重压谁都不愿意承担,选择一种轻松的生活,那是个人自由,虽然写出来哗众取宠并强烈的伤害别人的心不厚道,不过也没办法,毕竟网络是自由的。

    但从这件事,我倒是看到了希望,看到了中国的二元结构终于走到了尽头,因为正是在非常快的城市化过程中,才会出现了比较普遍的这种问题,也正因为其普遍性,这种问题才能成为焦点。世界潮流浩浩荡荡,顺之者昌,逆之者亡,照目前情况看来,距离户籍这个枷锁彻底打开的时间也不远了,但愿我们的下一代能够不再受这种煎熬,但愿到时候中国不会在一个国家有两种公民,中国社会能够真正的成为一个和谐社会。 

posted @ 2005-03-24 20:16 观自在书院 阅读(776) | 评论 (1)编辑

2005年3月23日 #

很早就听说在南方神鬼很有市场,到深圳才发现果然名不虚传。很多居民楼的住房的门口都摆着个小神龛,里面放着土地神,财神等种种,有的甚至将土地神和财神放在一起,也不怕两个神仙闹意见:)

     说中国现在有信仰危机,看来也不尽然,这些年各种崇拜在经济发达点的农村很是风行,建庙立祠无所不为,这且不说,还有一个全民族共同的人民币的信仰。所以我觉得,好的信仰应该是形而上的具有终极意义的那种,而不是为了解决人们的某种需要如钱而存在着,就像西方对上帝的信仰。其实中国人一向都是很功利的,一向没有一个真正的信仰,从我们崇拜的对象就可以看出来。据说明代国外的传教士来到中国都很迷惑,因为他们很难理解中国人究竟信仰什么,几乎大多中国家庭里供奉的神都是很驳杂的,有财神等国产的道教的神,还有释迦牟尼等进口的,读书的人家再供上孔圣人,再加上各种各样的地方神。而你传教士说基督好,能给我们带来福音,那好吧,咱再把基督也供奉上。

     西方人没法理解中国人,正像中国人无法理解西方人一样,因为我们生活的环境完全不同。在中国这样一个实用主义传统悠久的国度里,真正的终极意义很少有人考虑的。

posted @ 2005-03-23 17:51 观自在书院 阅读(386) | 评论 (0)编辑

2004年11月7日 #

近来在一些网站看文章,经常可以看到“点此复制文章到剪贴板”,“点此复制链接到剪贴板”的链接,看了之后觉得很有意思,就VIEW SOURCE研究了一下,发现就是一段很小的JS代码,但真的很有用。

[复制到剪贴板]


posted @ 2004-11-07 11:45 观自在书院 阅读(644) | 评论 (0)编辑

2004年10月10日 #

这个需求比较特殊,在网页中要调用一个GetArticleList(1,1,True)来生成一个文章列表表格(我没法控制这个表格里的内容,它是一个DLL生成的),它提供了两个css属性,listbg和listbg2,现在我想让表格中的每一行在鼠标经过时背景都变色,试用了这样的方法<table><tr><td>GetArticleList(1,1,True)</td></tr></table>,我在外面的<tr>或者<td>里放入

 

onmouseover="this.style.backgroundColor='#CCCCCC';return true;" onmouseout="this.style.backgroundColor=''"

 

但在这种情况下,每次鼠标经过,发生变化的都是全部表格的一半,而不是单独的行,看过关于DOM模型的文章,但在这种情况下好像也不行。唉,真麻烦!

posted @ 2004-10-10 13:36 观自在书院 阅读(2335) | 评论 (2)编辑

2004年9月21日 #

这两天在看《ASP.NET服务器控件与组件开发》,解决了不少困惑。
从ASP转到ASP.NET的一个很大的原因就是服务器控件的易用性,自动的状态保持,以及方便的事件注册,但当时并不明白是怎么实现的。因为HTTP请求是无状态的,所以在ASP中我们需要将要保存的值在隐藏域里提交回去或者放入SESSION或者COOKIE中。而在.NET中,页面框架实际上是模拟了一个有状态的类似桌面程序的过程。每一个后续的请求都是在前一个请求中断的地方恢复并继续执行。而这种模拟是靠以下几个逻辑阶段实现的。
拿一个TextBox做为例子(别的控件甚至页面和它也差不多),当请求到达页面时,如果它被列入了要生成的控件树,那它就会被页面或者别的控件调用它的构造器来实例化。控件树的生成也是很有意思的,所有派生自Control类的控件(页面也是间接派生自Control),都有可重载的Render和RenderChildren方法和RenderControl(写程序时可以重载这些方法,加入自己的处理逻辑),页面控件首先会建立一个HtmlTextWriter的实例,然后将这个对象传给RenderControl方法,RenderControl方法会检查控件的Visible属性,如果为真,就调用Render方法,Render方法默认的实现会调用RenderChildren方法,而这个方法默认会调用每个子控件的RenderControl方法,这样通过递归,就完成了控件树的生成。下面是从书中看到的代码。
public void RenderContrl(HtmlTextWriter writer){
if(Visible)
{Render(Writer);}
}

protected virtual void Render(HtmlTextWriter writer)
{
RenderChildren(writer);
}

protected virtual void RenderChildren(HtmlTextWriter writer)
{
foreach (Control c in Controls)
{c.RenderControl(writer);}
}


而HtmlTextWriter是什么东东呢?查一下MSDN,可以看到它们于System.Web.UI命名空间中,其解释是“在 Web 窗体页上写出一系列连续的 HTML 特定字符和文本。此类提供 ASP.NET 服务器控件在将 HTML 内容呈现给客户端时所使用的格式化功能”。
回到页面模型,每个控件实例化时都会默认调用OnInit方法(引发Init事件),在此过程中可以重载OnInit方法来添加自己的初始化逻辑。然后就到了实现有状态的WEB程序的最重要的几步,最先是页面自动调用TrackViewState方法,跟踪视图状态的更改,并保存到控件的StateTag对象中。如果是回传,则会调用LoadViewState方法,用来恢复ViewState字典,像TextBox这样实现了IPostBackDataHandler接口,则会通过LoadPostData方法更新控件数据状态。再接送就是加载(load),这时所有控件的所有最后状态已经保留。下一步如果是回传,则会触发RaisePostDataChangedEvent方法,如果不是,则进入PreRender,然后保存视图状态,生成控件(Render),卸载(Unload)(清除工作),释放(Dispose)(释放所有资源)。
至此,页面处理完成,处理程序会将生成的HTML流输出到客户端。
posted @ 2004-09-21 22:41 观自在书院 阅读(2200) | 评论 (5)编辑

2004年9月11日 #

这些天一直在看Rainbow,现在基本上看了一遍它的代码,感觉很震撼,改变了很多以前自己的编程思想。也许RainBow的效率不高,但它的代码太优雅了。前面不少朋友的BLOG已经介绍了它的一些基本特征,下面随便写一下自己的几点经验和困惑。

1.因为RainBow中大量使用的是从FRAMEWORK基类中自己扩展的类,所以一定要注意继承关系。比如开发RAINBOW的模块时一定要继承PortalModuleControl,否则您的控件将无法正常使用

2.删除一个模块时一定要所有页面里用过的这个模块,否则会导致触发器冲突,无法正常删除,但这种情况下好像数据库相关的存储过程一般都被删掉了,也许可以算RainBow的一个BUG。

3.RAINBOW大量使用了自定义的数据类型,像HtmlEditorDataType之类的,它的类定义位于UI文件夹下的DataTypes文件夹下,一般都继承自BaseDataType

4.当使用多站点的配置时,系统会默认的建立一个用户名和密码都为admin的帐户,并给予管理权限,还建立home和admin栏目,这些都是硬编码在Configuration/portalDb.cs中,需要更改的可以到这里进行修改。

5.不要轻易改动admins用户组名,因为它的源码里有些地方使用了PortalSecurity.IsInRoles("Admins") 这样的判断来判定管理员权限,改动后会造成不一致

6.workflow无法工作的问题。从国外的论坛上找到了答案

  You have to make to changes in 2 different files:
  Admin/ModuleSetting.aspx.cs & UI/WebControls/PortalModuleControl.cs

   In PortalModuleControl.cs +- Line 56
   from: private bool _supportsWorkflow = false;
   to: public bool _supportsWorkflow = false;

   In ModuleSetting.aspx.cs +- Line 365
   from: if ( pm.SupportsWorkflow )
    to: if ( pm._supportsWorkflow )
   另外你需要在每个模块的类的构造函数里加上这么一句SupportsWorkflow = true;

一些困惑:

1.默认的内容页面布局是三栏,简单页面下还是能适应的,但稍微复杂一点的就很麻烦了,比如说上面是两栏,下面是三栏的那种,上面两栏倒好办,左边的宽些,右边的窄些,放在左窗格和中窗格里它会自动向右扩展,但底下的就不行了,因为上面的左边比较宽,所以下面的三栏会有两栏被挤到右方,非常难看,除了自己将窗格改成5个(上面两个,下面三个,但这样后面的简单页面又没法办了),不知道还有什么别的办法没有?(http://bbs.xzfad.com/jsj/

2.如果页面做的比较花哨,每个页面中每个标签中的title和背景的风格都不一样,这种情况下好像根本没法处理,因为好像Rainbow中没提供这种到标签级的用户自定义风格。(如http://bbs.xzfad.com/demo/

3.模块的访问权限控制好像有问题,新建一个模块加到页面时guest访问没问题,但如果改一次访问权限后即使把所有用户组和未验证用户都可以访问选上,用GUEST访问时还是无法显示,我从代码里也没找出问题,不知道有人遇到过这种情况吗?

posted @ 2004-09-11 11:59 观自在书院 阅读(1394) | 评论 (1)编辑

2004年5月23日 #

预防SQL注射攻击
Michael Otey
所有的关系型数据库——包括SQL  SERVER,ORACLE,IBM DB2和MYSQL都容易受到SQL注射攻击。你可以购买一些产品来保护你的系统免受SQL注射攻击,但在大多数商务中,预防SQL注射必须是基于代码级的。SQL注射攻击主要来自WEB应用程序将用户的包含动态SQL代码的输入转换成了SQL 命令给数据库执行。你可以采用下面的四个重要的步骤来保护你的WEB应用程序免受攻击。除此之外,上个月我在强调的MSDN中模式与训练也提出了一些保护数据库驱动的WEB应用程序的建议。
4.最小权力法则
应用程序使用的去连接数据库的帐户应该只拥有必须的特权,这样有助于保护整个系统尽可能少的受到入侵者的危害。应用程序不应该用SA或者管理员帐户去连接数据库。作为替代,它应该只有访问它要调用的单个库的权力。
3.验证所有的输入
如果一个输入框只可能包括数字,那么要通过验证确保用户输入的都是数字。如果可以接受字母,那就要检查是不是存在不可接受的字符。确保你的应用程序要检查以下字符:分号,等号,破折号,括号以及SQL关键字。.NET FRAMEWORK提供了正则表达式来进行复杂的模式匹配,运用它可以达到良好的效果。另外限制用户输入的字符的长度也是一个好主意。验证用户输入是必须的,因为入侵者可以利用WEB的开放性对应用程序进行SQL注射攻击。
2.避免动态的SQL语句
动态的SQL语句是一个进行数据库查询的强大的工具,但把它和用户输入混合在一起就使SQL注射成为了可能。将动态的SQL语句替换成预编译的SQL或者存储过程对大多数应用程序是可行的。预编译的SQL或者存储过程可以将用户的输入做为参数而不是SQL命令来接收,这样就限制了入侵者的行动。当然,它不适用于你的存储过程中是利用用户输入来生成SQL命令的情况。在这种情况下,用户输入的SQL命令仍可能得到执行,你的数据库仍然有受SQL注射攻击的危险。
1.使用双引号
使用双引号替换掉所有用户输入的单引号,这个简单的预防措施将在很大程序上预防SQL注射攻击,单引号常常结束掉SQL语句,可能给于输入者不必要的权力。用双引号替换掉单引号可以使许多SQL注射攻击失败。
第一次翻译文章,不好的地方大家不要见怪:)
posted @ 2004-05-23 11:56 观自在书院 阅读(1937) | 评论 (4)编辑

2004年4月23日 #

在写一个计算贷款利息的语句时发现的。strsql="UPDATE plus_bank SET savemoney=savemoney(1+@lixi)-@qukuan,savedate=@savedate where userid=" + userid;
这句在ExecuteNonQuery时出错,报找不到函数savemoney,而下面的则可以,觉得有点奇怪,难道SQL语句还有这种局限性。
strsql="UPDATE plus_bank SET savemoney=savemoney+savemoney*@lixi-@qukuan,savedate=@savedate where userid=" + userid;
     SqlCommand cmd3 = new SqlCommand(strsql,myConn);
     cmd3.Parameters.Add("@lixi",SqlDbType.Float,4).Value = rate*(DateTime.Now.Year-mysavedate.Year+(DateTime.Now.Month-mysavedate.Month));
     cmd3.Parameters.Add("@qukuan",SqlDbType.Int,4).Value = myqukuan;
     cmd3.Parameters.Add("@savedate",SqlDbType.DateTime,4).Value = DateTime.Now;
     try
     {
      dr.Close();
      cmd3.ExecuteNonQuery();
     }
     catch(Exception Ex)
     {
      Response.Write("Q异常捕获!"+Ex);
      Response.End();
     }
posted @ 2004-04-23 09:41 观自在书院 阅读(1153) | 评论 (3)编辑

2004年3月29日 #

活靶子.Net 提供的: http://www.cnblogs.com/huobazi/archive/2004/03/26/4245.aspx

http://www.loveyuki.com/attachments/month_0403/li!p_AntiActiveXnags1.02.rar

posted @ 2004-03-29 11:24 观自在书院 阅读(699) | 评论 (0)编辑

2004年3月23日 #

工资不高,但也算是和自己喜欢的东西有关吧。自己学习编程一向太浮了,要借这个机会好好打打基础。以前一直认为自己很聪明,但这学期发现与好多身边的牛人比起来就差了好多,只好勤能补拙了:)。
posted @ 2004-03-23 16:34 观自在书院 阅读(621) | 评论 (0)编辑