nobugs

江湖无辈,哥们可能满目皆是; 社会有序,朋友也许屈指可数。

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  16 Posts :: 5 Stories :: 3 Comments :: 0 Trackbacks

2008年10月22日 #

当用户拷贝其它网站上的文章时,可能存在一些图片。在保存后,图片仍是链接该网站上,而会导致以后该连接失效的可能。所以增加在发新贴时,将远程图片抓到本地,改为本地链接。

 

其实涉及一些概念:
forums_Posts中Body和FormattdBody有什么区别?


Body:是存储用户上贴的真实内容
FormattedBody:顾名思义,是经过HTML语法格式化后的Body内容,可以直接输出到页面上.

但由于FTB可以使用HTML语法,这样导致了很多Body内容和FormattedBody内容是相同的.

主要目的是:以空间换时间(宝玉语)


Body是在编辑帖子的时候
FormattedBody是在显示帖子的时候


步骤:

1)、创建图片抓取类RemoteImageGather.cs
2)、在Posts.cs中的public static Post AddPost(Post post, User postAuthor)修改

post.Body = Formatter.FormatIrcCommands(post.Body, postAuthor.Nickname);

            //抓取贴子中的远程图片 add by zs.tan 2008-10-20
            post.Body = RemoteImageGather.RemoteImagesSave( Formatter.FormatIrcCommands(post.Body, postAuthor.Nickname));


RemoteImageGather.cs的关键点是找出图片的URL
        /// <summary>
        /// 取HTML代码中的图片路径
        /// </summary>
        /// <param name="htmlCode"></param>
        /// <returns></returns>
        public static ArrayList GetImageLinks(string htmlCode)
        {
            ArrayList al = new ArrayList();

            //匹配全路径
            Match match = Regex.Match(htmlCode, @"http(s)?://+(((/?)+[\w-.]+(/))*)+[\w-./]+\.+(jpg|jpeg|png|bmp|gif)", RegexOptions.IgnoreCase);

            while (match.Success)
            {
                //过滤相同的图片
                if (!al.Contains(match.Value)) al.Add(match.Value);
                match = match.NextMatch();
            }

            return al;

        }

posted @ 2008-10-22 15:38 Zero.Tan 阅读(10) | 评论 (0)编辑

2008年10月14日 #

决定在公司内部搭建一个论坛,以配合PDM系统上线,方便员工交流和一些资料的共享。

选择版本:Asp.Net Forums v2.3.2130 中文本地版

由于该版本是基于Asp.net V1.1的,需要转化为能在VS2005处理的版本。为了配合版本的管理,新版本定为v2.4.0001

转化后,就涌现一大堆以前没有的错误,郁闷4。

下面是一些处理过程的摘要。

1、版本转化时的处理

  • 解决冲突
    “Roles”是“System.Web.Security.Roles”和“AspNetForums.Components.Roles”之间的不明确的引用
    “PasswordRecovery”是“System.Web.UI.WebControls.PasswordRecovery”和“AspNetForums.Enumerations.PasswordRecovery”之间的不明确的引用 
    还有SortOrder
  • 不存在的themes文件
    将它们从项目中排除
  •  组件属性不存在
    去除属性
  • 配置web.config
  • 补skin文件
    主贴子的“移动”、“合并”、“分割“
    View-ThreadJoin.ascx
    View-ThreadMove.ascx
    View-ThreadSplit.ascx

2、初步调试成功。公司本机/家的电脑可以运行。布署后出现不知名的错误,导致打不开站点。(人品问题呀~~)

经在服务器上调试,发现是程序问题诱发"WebDev.WebServer.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。"的致命错误

位置:

User.cs中

private static int Instr(string strA, string strB)
  {
   if (string.Compare(strA, strA.Replace(strB, "")) > 0)
   {
    return 1;
   }
   else
   {
    return 0;
   }
  }

更改为:

private static bool Instr(string strA, string strB)
        {
            return string.Compare(strA, strA.Replace(strB, "")) > 0;
        }

posted @ 2008-10-14 15:20 Zero.Tan 阅读(22) | 评论 (0)编辑

2008年9月27日 #

前言

我们公司属于LCD的制造厂,属于来订单提需求生产的方式。企业内部没有相关的管理软件进行管理企业内部事务(包括部门协同、客户管理、进销存、财务、研发等)。存在开发资料不可控、物料不可控、物料编码混乱等情况,所以领导层决定改革管理方式。
制定目标:
1、统一物料编码
2、集中管理所有研发资料

最高领导人改革的意愿很强,决心很大(按他说法:企业的任何管理流程都可以改,只告诉我这个流程是错的),而且对经费不是很看重,该花的一定不会抠门(他的说法:不要将服务商压得太死[不像一些老板出于各种原因,会压榨对方的底线,期望对方吃的是草抓出的是奶。其实,个人觉得很多时候都会得到小利,以前付出的更多,毕竟是破坏大家合作的基础,令对方有保留]。估计产品利润大吧,呵呵。)

新来的CIO,决定在公司推行PDM系统,解决研发部门的问题。而我作为小兵参与了服务商筛选的过程。(由软件开发沦为系统管理员-悲!)

服务商
CIO挑了3家的PDM服务商。
其中:
服A:
全国知名的IT企业,GZ有办事处,有PDM、PLM、ERP等系统;
PDM系统是收购棒棒的,据他们自己人员说,在棒棒中市场占有率第一,国内市也很大;
PDM系统采用Oracle + Java,可以动态建模、自定义表字段名称、二次开发提供接口(一句话:技术不错!模块化)

服B:
华南的IT企业,总部在GZ,研发部设在我们的城市,专注PDM、PLM
系统是自己研发,在华南地区市场占有率第一,客户群主要在珠三角
PDMt系统采用Delphi,PLM采用.net;PDM系统模块化一般、二次开发只开放数据库

服C:
某城市的IT企业,市场也主要在华南地区,有ERP、PDM系统,但策略是PDM作为ERP的一个功能;
PDM是.net开发
(由于功能问题,很快给排除了。)



posted @ 2008-09-27 17:46 Zero.Tan 阅读(218) | 评论 (0)编辑

2008年9月11日 #

环境:Project Server + Outlook 2007

       服务器有AD,但客户机没加入到域中.

任务:Project任务与 Outlook 同步

操作位置:服务器、客户机

问题现象:

按MS的文章http://technet.microsoft.com/zh-cn/library/cc197453.aspx,配置好Outlook的PWA集成参数后,点击"测试连接"时,却弹出信息:"已成功连接服务器",但是登录尝试失败". 连接使用"使用Project Server 帐户(p)",而且用户名在PWA网页上可能登录.

状态:未解决

posted @ 2008-09-11 11:57 Zero.Tan 阅读(44) | 评论 (1)编辑

2008年9月10日 #

Deploy software updates for Office Project Server 2007
 
http://technet2.microsoft.com/Office/en-us/library/c3b86049-7cba-4b9c-8335-e37fb6e7518a1033.mspx?mfr=true
 
Deploy software updates for Windows SharePoint Services 3.0

 

http://technet2.microsoft.com/windowsserver/WSS/en/library/91649a7e-6b5a-4e5a-9ee5-51951f4b857f1033.mspx?mfr=true

posted @ 2008-09-10 10:03 Zero.Tan 阅读(14) | 评论 (0)编辑

2008年9月9日 #

平台环境:Moss + Project Server 2007 + SQL 2005

任务:创建多维数据集的视图

操作位置:服务器、客户机

发生问题:

按MS的文章(http://technet.microsoft.com/zh-cn/library/cc197552.aspx),安装完Analysis Services和多维数据集存储库后,在进行创建新的视图时,却出现错误:必须使用有效的 Analysis Services 数据库名称和多维数据集名称。“Analysis Services 数据库”和“多维数据集”都没有显示数据,在刷新数据列表时,弹出信息框:未能连接到Analysis Services 服务器。请验证服务器名称

 

查找网上资料,在MS上找到相同的问题(http://support.microsoft.com/kb/927159/en-us?spid=11388&sid=global),但问题是:按上述步骤处理了,问题仍然存在。


状态:未解决

posted @ 2008-09-09 18:19 Zero.Tan 阅读(117) | 评论 (2)编辑

2008年5月26日 #

匹配中文字符的正则表达式: ^[\u4e00-\u9fa5]{0,}$

匹配双字节字符(包括汉字在内):[^\x00-\xff]  
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:< (\S*?)[^>]*>.*?|< .*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^\s*|\s*$ 
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

匹配网址URL的正则表达式:^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
评注:表单验证时很实用

验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"
正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。

匹配腾讯QQ号:^[1-9][0-9]{4,}$
评注:腾讯QQ号从10000开始

匹配中国邮政编码:^[1-9]\d{5}(?!\d)$
评注:中国邮政编码为6位数字

匹配身份证:^\d{15}$|^\d{17}(\d|X)$
评注:中国的身份证为15位或18位

匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]\d*$     //匹配正整数
^-[1-9]\d*$   //匹配负整数
^-?[1-9]\d*$    //匹配整数
^[1-9]\d*|0$   //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$    //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$    //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$   //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$   //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$    //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$   //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$   //匹配由26个英文字母组成的字符串
^[A-Z]+$   //匹配由26个英文字母的大写组成的字符串
^[a-z]+$   //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$   //匹配由数字和26个英文字母组成的字符串
^\w+$   //匹配由数字、26个英文字母或者下划线组成的字符串


整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$
只能输入数字:"^[0-9]*$"。
只能输入n位的数字:"^\d{n}$"。
只能输入至少n位的数字:"^\d{n,}$"。
只能输入m~n位的数字:。"^\d{m,n}$"
只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。
只能输入有两位小数的正实数:"^[0-9]+(.[0-9]{2})?$"。
只能输入有1~3位小数的正实数:"^[0-9]+(.[0-9]{1,3})?$"。
只能输入非零的正整数:"^\+?[1-9][0-9]*$"。
只能输入非零的负整数:"^\-[1-9][]0-9"*$。
只能输入长度为3的字符:"^.{3}$"。
只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。
只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。
只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。
只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。
只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。
验证用户密码:"^[a-zA-Z]\w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
验证是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。
只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"
验证Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
验证InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
验证电话号码:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
验证身份证号(15位或18位数字):"^\d{15}|\d{18}$"。
验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"1"~"12"。
验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"和"1"~"31"。 

"^\d+$" //非负整数(正整数 + 0) 
"^[0-9]*[1-9][0-9]*$"  //正整数 
"^((-\d+)|(0+))$"  //非正整数(负整数 + 0) 
"^-[0-9]*[1-9][0-9]*$"  //负整数 
"^-?\d+$"    //整数 
"^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0) 
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数 
"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0) 
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数 
"^(-?\d+)(\.\d+)?$"  //浮点数 
"^[A-Za-z]+$"  //由26个英文字母组成的字符串 
"^[A-Z]+$"  //由26个英文字母的大写组成的字符串 
"^[a-z]+$"  //由26个英文字母的小写组成的字符串 
"^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串 
"^\w+$"  //由数字、26个英文字母或者下划线组成的字符串 
"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址 
"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url 
如何检查当TextBox设置为多行时是不是超长了? 
< asp:RegularExpressionValidator id="revTextBox1" runat="server" ForeColor= "Red" Display="Dynamic" ControlToValidate="textBox1" ValidationExpression ="(\w|\W){1,100}">格式错误-只能输入不超过100个字符</asp: RegularExpressionValidator>

用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,’’) " onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\u4E00-\u9FA5]/g,’’))"
 
  用正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,’’)" onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\uFF00-\uFFFF]/g,’’))"
 
  用正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^\d]/g,’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))"
 
  用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[\W]/g,’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))"

posted @ 2008-05-26 17:45 Zero.Tan 阅读(35) | 评论 (0)编辑

2008年5月5日 #

在程序开发时,需要在系统运行时获取页面中某个控件进行动态处理。如在权限控制中,根据当前用户的可操作权限进行屏蔽某些操作功能或数据。

一般来说,经常这样写代码:this.FindControl(xxx)就可以找到相关的控件;但在ASP.NET 2.0中,如果当前页使用MasterPage的机制后,放在 contentplaceholder这样的内容页的控件就无法用Page.FindControl来查找了,总是返回null。

PS:FindeControl所有容器有关(只搜索当前的容器)
MSDN的解释:
FindControl 方法可用于访问在设计时其 ID 不可用的控件。此方法只搜索页的直接或顶级容器;它不在页所包含的命名容器中递归搜索控件。若要访问从属命名容器中的控件,请调用该容器的 FindControl 方法。


估计是使用了MasterPage后,引起命名容器发生变化。
在没有使用
MasterPage之前,页面this访问到的对象就是他自己,所以使用this.FindControl也就没什么问题。
但用了
MasterPage之后,this指向的内容就发生了变化(未找相关的信息

这时候就需要先使用this.Master.FindControl("contentPlaceHolderID")来找到在MasterPage上相对的位置,再用
FindControl("控件ID")来查找控件

或使用递归,找出控件(参考网上资料:http://www.west-wind.com/WebLog/posts/5127.aspx)
    protected Control FindControlRecursive(Control root, string id)
    {
        if (root.ID == id)
            return root;

        foreach (Control ctrl in root.Controls)
        {
            Control foundCtl = FindControlRecursive(ctrl, id);

            if (foundCtl != null)
                return foundCtl;
        }

        return null;
    }

但该方法存在不足之处:只能查找第一个符合条件的控件。如果页面控件中出现多个控件共用一个ID(UniqueID不同),则可能返回一个所期望的控件。
而且,存在效率低效的问题。

在这是里,就封装第一种方法进行调用
    protected Control FindControl(string controlID)
    {
        return Page.FindControl(controlID);
    }

    protected Control FindControl(string contentPlaceHolderID, string controlID)
    {
        return Page.Master.FindControl(contentPlaceHolderID).FindControl(controlID);
    }
posted @ 2008-05-05 18:47 Zero.Tan 阅读(49) | 评论 (0)编辑

2008年3月26日 #

1. 进入“本地安全策略”。
2. 单击“软件限制策略”。

注意:如果未列出软件限制,请右击“软件限制策略”,然后单击“新建策略”。
3. 在“对象类型”下,双击“强制”。
4. 单击“除本地管理员以外的所有用户”,然后单击“确定”。
5. 重新启动计算机。

posted @ 2008-03-26 19:22 Zero.Tan 阅读(35) | 评论 (0)编辑

2007年12月25日 #

1.获取所有数据库名:
Select Name FROM Master..SysDatabases orDER BY Name
2.获取所有表名:
Select Name FROM DatabaseName..SysObjects Where XType='U' orDER BY Name
XType='U':表示所有用户表;
XType='S':表示所有系统表;
3.获取所有字段名:
Select Name FROM SysColumns Where id=Object_Id('TableName')
4、表字段的长度
select
 table_name ,
 column_name,
 isnull(column_default,'') default_value,
 is_nullable,
 data_type,
 isnull(isnull(isnull(character_maximum_length,numeric_precision),datetime_precision),1) length
from information_schema.columns
where not table_name in('sysdiagrams','dtproperties')
posted @ 2007-12-25 10:29 Zero.Tan 阅读(418) | 评论 (0)编辑