cnblogs.com

March 2007 - Posts

博客园3月份访问量统计图
     摘要: 根据dudu老大在这个随笔中发布的数据来看,首先,咱们园子的被访问量还是很大的.单纯的数字也许无法说明问题,那么,我们再从数据中建立统计图来看一下访问量这些数据的规律.
以下图标根据dudu老大所提供的数据建立透视图分析所得.  阅读全文

aspnetx 2007-04-01 12:16 发表评论
社会主义国家真的不用保护私有财产,只晓得保护共有财产
      今天晚上,和老婆出去耍,没有想到回到家中确实相当意外,家中来了不速之客,把我们吃肉的钱拿走了,难道是为了帮助我们减肥?放在桌子上的笔记本电脑确是没有动,不然我现在也写不了这篇文章.打110这是当然的,警察来了,过程化的,程序化的工作.把家中的东西拍了一下,简单的记录了一下,然后就走了.我当时就问他们说需要对这栋楼的人进行排查吗?他们说不需要,他们只能并案处理,这么说来破案的机会看来真的是很渺茫了.
      我感觉到现在的犯罪率越来越高,特别是小偷,强盗现在已经是很普遍的,难道这就是社会主义国家特有的产物,或者说国家对于这些无可奈何?觉得一个国家的统治最基本的也该有维持社会治安吧,但是,我看到的,听到的,却全不是这样的.社会治安那是相当不好,我本人已经被小偷光顾了3次了,不是我不小心,我总不可能天天呆在家中看家吧.天天看新闻说要构件和谐社会,请问发生这样的情况,这个和谐社会怎么构造?小偷为什么那么张狂?强盗为什么敢拗开门入室偷盗,我觉得应该是入室抢劫.可能也跟我们社会主义的法制有关系吧,大家都知道我们是社会主义国家,社会主义国家是公有制国家,既然是大家的嘛,那些小偷偷的也是自己的嘛,偷自己的问题不大撒,于是那些小偷的处罚就太藐小了,我说藐小小,不说轻.既然没有多大的责任就可以获得暴利,为什么不做呢?难道我们辛苦所得就不应该是国家要保护的嘛?每个月我不是还交了保护费的吗?这样也不行?如果说国家确实对保护我们的劳动所得很看重,那么又是谁没有做好这个工作呢?我不知道那里可以知道答案,我只知道自己交的保护费没有起到保护的作用,那么为什么还是要强迫我们交保护费呢?这么多的问题没有谁可以回答,我只有沉浸在丢失财物的伤痛中继续着自己的生命,因为我无助.......

chaochao 2007-04-01 06:01 发表评论
nhibernate学习之三级联(Ternary Associations)篇
     摘要: 园子里面的兄弟们好,由于工作和身体的原因,几天来都没有写有关nhibernate学习系列了。看了看前几篇大家的回复,首先想要多谢兄弟们对小弟的关注和支持,可小弟水平有限,写出来的也只是入门级的心得。只是有一个心愿,那就是抛砖引玉,希望能和大家更多更好的互动。技术无极限,而我更想要得是能在园子里面认识更多的兄弟,更多的朋友  阅读全文

jillzhang 2007-04-01 01:00 发表评论
Scrum 过程实践小记
     摘要: 从去年8月份到现在,在我负责的项目中进行了一些scrum实践的尝试,做个小结。
严格来说,不能算是真正的scrum实践,但实践敏捷的过程本身也是一种敏捷实践,所以就算是“敏捷实践之敏捷开发方法-scrum过程”吧。  阅读全文

Jessica.kjm 2007-04-01 01:00 发表评论
《天气与生活》修正近日总是显示数据有误的问题
下载新文件
由于匆忙中开发,只是简单的测试,所以如果还有问题,请及时通知我,谢谢

THIN 2007-03-31 23:49 发表评论
项目管理第四讲
项目管理第四讲做成了纯音频格式。请在

水果阿生 2007-03-31 23:07 发表评论
轻松打造个人网站-关于整站配置和关键字定制

写在最前面:
        很高兴能继续编写《轻松打造个人网站》系列文章,在之前的文章中,许多朋友提出了忠恳的意见和善意的指点,让我更加有信心完成之后的文章。写这个系列文章的初衷就是与大家分享建站经验,并且在交流中互相促进,共同提高。再次重申,老刘水平有限,只是希望把自己建站中的实际经历分享给大家,如有不正之处,请各位指正,如果老刘的文章能给你带来一丝灵感,老刘会感到非常开心。这次有所不同的是,收回之前欢迎拍砖之云云,有些朋友很实在,哈哈。
      依然贴出站点地址,欢迎各位光临指导:
            http://www.024so.com
      ok,进入正题吧,这次的主题是整站配置和关键字定制。

         反复思量了一番,还是决定把整站配置和关键字定制两个主题放到一起来写,因为两个主题的实现方式大体相似,都是通过配置文件实现。提到Asp.net中的配置文件,首先会想到web.config,并且强大的Framework本身提供了丰富的API对web.config进行操作。同时Asp.net项目中还允许用户创建自定义的.xml配置文件,System.Xml命名空间同样提供了强大的API,让用户可以舒适的对配置文件进行操作,在我的项目中更多的采用了自定义配置文件,因为在自定义配置文件中可以让信息按照我所希望的格式搭建,同时我也可以创建一些API对指定格式的配置文件进行操作,相对更自由一些:)

首先说说整站配置:
         每个页面需要显示的内容大体都有多个数据块组成:
               其中包括列表块,比如文章列表;
               还有就是信息块,其中包括文章标题,列表,发布者,发布时间,浏览次数,评论次数等内容。
         拿一个列表块来说,我需要考虑以下因素:
               a.这些数据出现在哪个页面;
               b.会有多少行数据出现在这个列表中;
               c.如果标题过长,需要截取字符串,需要截取多少个字符;
               d.如果数据需要进行缓存,需要缓存多长时间。
         如果把每个数据块的参数都在配置文件中进行合理配置,那么当需要显示的数据块发生变化时(比如显示标题的行数)  ,就可以通过简单的修改配置文件,而不是通过硬编码的方式轻松搞定 。看一下我的配置文件吧,以下是网站首页的配置文件片段:

<setting>
  
<page id="1" title="index" desc="首页" duration="0">
    
<channel title="topgroup" desc="推荐圈子" duration="5" code="130">3</channel>
    
<channel title="topiclist" desc="文章列表" duration="0" code="130">8</channel>
    
<channel title="fevergroup" desc="热门圈子列表" duration="5" code="100">12</channel>
    
<channel title="lasteduser" desc="最新会员列表" duration="0" code="250">9</channel>
    
<channel title="grouplist" desc="最新圈子列表" duration="0" code="100">5</channel>
  
</page>
</setting>

         解释一下吧:
               page节点,顾名思义,代表的就是某某页面,
                     title属性代表页面的标题,用于唯一标识页面。              
               channel节点代表的就是某个数据块,
                     title属性代表块的标题,用于唯一标识数据块;
                     duration代表缓存时间;
                     code代表每行数据显示的字符数;
                     channel节点的文本值代表显示数据的数量。

         这样通过page的title和channel的title就可以唯一定位某数据块,只要通过API对某数据块节点进行数据访问操作就可以获得相应的信息了。
         简单谈一下配置文件API吧,其中包括如下方法:

               // 通过标题返回缓存时间,单位 秒 - public int GetPageDurationByTitle(string title);
               // 通过标题返回栏目缓存时间,单位 秒 - public int GetChannelDurationByTitle(string page, string title);
               // 获得显示行数量 - public int GetCourseTypeCount();
               // 通过栏目标题返回标题显示字符数量 - public int GetCodeByChannel(string page, string title);

         随便选一个,看看代码样例吧:
 

#region // 通过标题返回栏目缓存时间,单位 秒 - public int GetChannelDurationByTitle(string title)
        
/// <summary>
        
/// 通过标题返回栏目缓存时间,单位 秒
        
/// </summary>
        
/// <param name="page">页面名称</param>
        
/// <param name="title">栏目名称</param>        
        
/// <returns>还存时间</returns>
        public int GetChannelDurationByTitle(string page, string title)
        {
            
int second = -1;
            
if (base.IsFileExsited(filePath))
            {
                
try
                {
                    XmlElement root 
= base.GetDocumentRoot(filePath);
                    
string xpath = string.Format("/setting/page[@title='{0}']/channel[@title='{1}']", page, title);
                    XmlNode node 
= root.SelectSingleNode(xpath);
                    second 
= int.Parse(node.Attributes["duration"].Value);
                }
                
catch (Exception ex)
                {
                    
throw ex;
                }
            }
            
return second;
        }
        
#endregion

          

         很清晰明了了,通过xpath定位到需要得到的数据,然后将数据取出并返回。需要提示的是这一系列方法都需要验证配置文件路径是否有效和获得根节点引用的过程,所以把这些处理写到了基类中,在派生类中直接调用,于是出现了base.IsFileExisted(filePath)和base.GetDocumentRoot(filePath)的代码片段。

         ok,这样轻松的实现了访问数据配置。你也可以把你所需要配置的属性归纳一下,总结出你自己的配置文件和操作API,那么接下来我们一起谈谈关键字定制吧,套路都差不多:)

关于关键字定制:
         关于SEO,老刘就不多聊了,在这里只简单谈一谈如何实现动态加载页面title和meta标记,至于大家有什么好的搜索引擎优化方案,同样欢迎在这里讨论:)
         看配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<pages>
  
<page id="1" key="index" detail="首页">
    
<title>活在沈阳-活在沈阳的网上社区(024so.com)</title>
    
<keywords>沈阳,社区,论坛,生活,咨询,信息,资源,web2.0</keywords>
    
<description>活在沈阳,社区,论坛,开放,生活,咨询,信息,资源</description>
  
</page>
  
<page id="7" key="topic" detail="文章内容">
    
<title>{0}-活在沈阳网(024so.com)</title>
    
<keywords>沈阳,社区,论坛,生活,咨询,信息,资源,web2.0</keywords>
    
<description>活在沈阳,社区,论坛,开放,生活,咨询,信息,资源</description>
  
</page>
</pages>

         这里摘取了两个配置片段,一个是网站首页,一个是文章页,其中文章页中的title节点包括一个占位符,有了他,就可以实现动态添加文章标题了。当然如果要实现动态加载标记,只需要用数据访问API从配置文件中读取相应页面的数据就可以了,把这个调用过程写到MasterPage中就比较好,千万不要每个页面都写一次哦。。。
         看代码会更直观:

private void InitMeta()
    {
        PageSettingDAL dal 
= new PageSettingDAL();
        
// 截取 访问 url, 获得配置文件中的 key
        string source = Request.Path;
        
int begin = source.LastIndexOf('/');
        
int end = source.LastIndexOf('.');
        
string key = source.Substring(begin + 1, end - begin - 1).ToLower();
        
// 获得页面信息
        PageInfo info = dal.GetPageInfoByID(key);
        
// 初始化页面 title
        if (!string.IsNullOrEmpty(info.Title))
        {
            
if (info.Title.StartsWith("{0}"))
            {
                
this.Page.Title = string.Format(info.Title, _title);
            }
            
else
            {
                
this.Page.Title = info.Title;
            }
            
// 获得 htmlhead 引用
            HtmlHead head = (HtmlHead)Page.Header;
            
// 初始化 meta keyword
            HtmlMeta keywordMeta = new HtmlMeta();
            keywordMeta.Name 
= "keywords";
            keywordMeta.Content 
= info.KeyWord;
            head.Controls.Add(keywordMeta);
            
// 初始化 meta description
            HtmlMeta descMeta = new HtmlMeta();
            descMeta.Name 
= "description";
            descMeta.Content 
= Description;
            
// 添加 meta 到 htmlhead
            head.Controls.Add(descMeta);
        }
    }
      
         在MasterPage中的PageLoad()方法中调用之即可,如果是VS 2003,写一个PageBase也是一样的。老刘之前写过一篇《用MasterPage代替PageBase》对MasterPage和PaseBase有更详细的阐述,在此链接一下:
         http://www.cnblogs.com/ayuan/archive/2006/11/02/548295.html
         ok,解释一下上面的代码片段吧,首先通过字符串处理获得了页面的名称,这个名称就是配置文件中页面的Title,用这个名称可以进行页面唯一定位,之后获得某页面的标记信息。通过HtmlHead类可以操作页面头部信息,HtmlMeta的实例包括Name属性和Content属性,一看就知道是键值对的关系,附上keywords和description的名头并且添加相应内容就可以了,最后添加到HtmlHead实例中,就实现了动态加载Meta标记。
         要实现动态加载Title还要使一些小计量,判断一下配置文件中的title节点属性是不是以占位符开始的,如果以占位符开始,就需要从属性中获得Title值了,需要自己定义PageTitle属性,这次需要在.aspx.cs类中把从数据库中获得的文章标题传入MasterPage中了,是这样做的:
         在.aspx.cs类中:
             SYMasterPage master = (SYMasterPage)this.Master;
             master.PageTitle = title;
         首先获得MasterPage的引用,然后将标题通过自定义属性传入,ok,动态添加Title也就实现了:)


         这篇文章也就谈到这里了,希望给各位带来写灵感,希望给各位站长带来些实惠。和非著名相声演员郭德纲老师艺术家俩礼拜差不多,非资深程序开发人员老刘也站长差不多俩礼拜了,在这两个星期中,老刘体会了程序开发人员和网站推广人员的双重艰辛,我想园子里许朋友都有意打造自己的个站,老刘衷心希望给各位准站长提供竭诚的帮助,毕竟这年头,自己想干成点什么事,是多么的不容易啊,如果老刘微薄的帮助可以成为你成功路上的一个足迹,老刘将非常的欣喜。

老刘. 2007-03-31 23:06 发表评论
签了北京中油瑞飞,不知道人生的第一个全职舞台表现如何,期待各位兄弟指导。

我是西南石油大学计算机03级的学生,上周和好朋友一起签了中油瑞飞,事后查了很多资料,了解了一些公司的信息,有听刘刚(HR)前辈说还有一些兄弟也签了,不知道各位对公司是否有所了解。
以后有一堆一个战壕奋斗的兄弟了,真希望有个好的发展平台,好好生活,加油。
有签中油瑞飞的兄弟们,可以加我QQ:187229531,MSN:SYS72@163.com
也期待中油瑞飞的前辈们光临指导。
嘿嘿:)
兄弟伙,加油!



Ekin.S.Sun 2007-03-31 22:03 发表评论
用 PIL 写了个简单的缩略图生成程序
最近刚刚学了简单的 PIL (Python Image Library) 的使用方法,感觉比较简单好用!结合最近我要在 web 中做缩略图的需求,写了个函数。这个程序的思路是截取源图中间一块正方形区域,然后做缩放生成缩略图。

啥也不说了,上代码:

#!/usr/bin/env python
#
coding=utf-8
import Image
import os

# 缩略图生成程序
#
 sizes 参数传递要生成的尺寸,可以生成多种尺寸
def make_thumb(path, sizes=(753216)):
    
try:
        im 
= Image.open(path)
    
except IOError:
        
return    
    width, height 
= im.size
    
if width == height:
        region 
= im
    
else:
        
if width > height:
            delta 
= (width - height)/2
            box 
= (delta, 0, delta+height, height)
        
else:
            delta 
= (height - width)/2
            box 
= (0, delta, width, delta+width)            
        region 
= im.crop(box)
    base, ext 
= os.path.splitext(path)
    
for size in sizes:
        filename 
= base + "_" + "%sx%s" % (str(size), str(size)) + ".jpg"
        thumb 
= region.resize((size,size))
        thumb.save(filename, quality
=100# 默认 JPEG 保存质量是 75, 不太清楚。可选值(0~100)

if __name__ == '__main__':    
    make_thumb(r
"c:/testimg/test.jpg")
    make_thumb(r
"c:/testimg/test2.jpg")
    make_thumb(r
"c:/testimg/a.jpg")
    make_thumb(r
"c:/testimg/DSCF0111.jpg")
    make_thumb(r
"c:/testimg/test3.jpg")
    

效果:
pil_thumb.JPG

木野狐 2007-03-31 20:15 发表评论
向大家汇报一下3月份博客园的访问量情况
     摘要: 大家都很关注博客园的发展,所以我觉得有必要向大家汇报一下博客园的访问量情况。  阅读全文

dudu 2007-03-31 19:59 发表评论
基于Gettext的asp.net网站多语言解决方案
     摘要: 介绍一下偶所使用的asp.net网站多语言方案,基于开源的Gettext,而不是默认的资源文件。  阅读全文

问天 2007-03-31 17:59 发表评论
模仿手机的程序界面
     摘要: 今天闲着无事,打开Visual Studio随便看看。由于最近泡论坛比较多,经常灌水,忽然来了灵感,何不做一个在界面上类似手机的程序呢,在界面上模仿,操作方式上模仿,并不是真正的模拟器。拿出自己的小灵通,对照着在上面拉起了界面,嘿嘿,还是蛮好玩的,最后在屏幕上放了一张美女照片,运行起来还真是有点不一样的感觉。  阅读全文

swnuwangyun 2007-03-31 17:07 发表评论
[讨论] 关于插件框架式程序的讨论
     摘要: 插件框架式程序已经不是一个新话题了,发现大家在平日讨论或者在大家的文章中都讨论到了通讯协议、版本控制等。但是我们的插件也是有可能发生错误,而对于插件内发生的错误如果没有进行处理的话,就会导致整个程序崩溃。

虽说可以与开发插件的程序员约定要进行可能的错误捕获,但是人为失误还是可以存在。是否可以实现在主程序中对未处理的插件错误进行统一处理,提供错误宽容度等设定呢?  阅读全文

U2U 2007-03-31 17:05 发表评论
asp.net控件设计时支持(1)
       大家好象对控件设计时的讨论不多,是不是感觉功能实现就可以了,当然设计时支持是可有可无的.我敢说没有设计时支持的话,可能很多人不喜欢.net,正因为有设计时支持,更降低了.net学习的门槛.这次就简单的来看看,如果简单的实现你常用的几个功能.

一.ControlDesigner类

ControlDesigner作为web服务器控件的设计器的基类,你可以扩展此类. 总之你了解这个类以后你会发现原来你平时看到的控件能够在VS2005设计时中完美的呈现也是微软帮你做的.既然如此,作为一个完美的控件也应该配有设计时的支持,有时候可以让开发达到事半功倍的效果.这里先不介绍这个类其中具体的方法和属性了.我们接了会具体使用的.

二.获取设计时关联控件HTML

(1) 定义控件

让我们来定义两个最简单的控件

  public class DesginControl : Control
    
{

        
public string Text
        
{
            
get
            
{
                String s 
= (String)ViewState["Text"];
                
return ((s == null? String.Empty : s);
            }


            
set
            
{
                ViewState[
"Text"= value;
            }

        }

        
protected override void Render(HtmlTextWriter writer)
        
{
            writer.Write(Text);
        }

    }


    
public class DesginWebControl :WebControl
    
{
        
public string Text
        
{
            
get
            
{
                String s 
= (String)ViewState["Text"];
                
return ((s == null? String.Empty : s);
            }


            
set
            
{
                ViewState[
"Text"= value;
            }

        }

        
protected override void RenderContents(HtmlTextWriter writer)
        
{
            writer.Write(Text);
        }

    }

(2)第一次测试

好了,两个控件一个派生自Control,一个派生于WebControl,编译后把他们一起拖到设计器上吧,看看效果


图一

DesignControl在Text属性为空的时候,即没有呈现任何内容的时候,设计器上会出现上面这样的文字

DesignWebControl更离谱,看到DesignWebControl文字右边的小方框了没,这个就是其默认呈现的效果.

(2)第二次测试

下面再次给他们两加上Text属性后的效果,再看效果


图二

DesignControl显示效果很好,
DesignWebControl也可以达到跟DesignControl一样的效果,但多了项功能.
其可以允许在设计器中自动的拖拉控件改变控件的宽度和高度,看到右下脚的鼠标和控件中间控件的115和42没.很不幸DesignControl没有这样的功能.为什么呢?

(4)第三次测试

我们再来最后的一次测试.我们再次将Text属性的内容去掉
效果如下


图三

DesignControl恢复回来了,不好的是DesignWebControl成了一白板:)

(6)解决方案来了
其实上面的这两个控件跟Literal和Label控件像极了,其本身使用一点问题也没有,为了设计时更好看,也为了保护我们的眼睛看的舒服点:),我们能做点什么.
一切的一切都是因为.net提供了设计时支持,不然的话,恐怕你连上面的几个界面也看不到了.还好我们可以自己来改变它.那便是利用.net的设计时支持.

(7)每个控件都应该有各自的设计时支持

不知道这句话,大家是否认同,即使控件现在可能不需要,但请做好以后的准备,先空定义一个也可以

下面我们讨论下label控件.

7.1当Text属性为空时,设计器呈现为"["加控件ID的值"]",如[Label1],注意这个是设计器呈现,而非生成的效果呈现.
7.2Control类没有width和height属性,当然设计时也就不支持更改了.

(8)实现

上面说了一大堆废话,还是来看看如何实现吧

public class DesginWebControlDesigner : ControlDesigner
    
{
        
private DesginWebControl webControl;

        
public DesginWebControlDesigner()
        
{ }

        
//初始化控件设计器
        public override void Initialize(IComponent ponent)
        
{
            
base.Initialize(ponent);


            webControl 
= (DesginWebControl)ponent;
            webControl.Text 
= "DesginWebControl";
            
        }


        
//调整控件的大小
        public override bool AllowResize
        
{
            
get
            
{
                
return false;
            }

        }


        
//获取设计器HTML
        public override string GetDesignTimeHtml()
        
{
            
if (webControl.Text.Length > 0)
            
{
                
string spec = "<font color='red'>{0}</font>";
                
return String.Format(spec, webControl.Text);
            }

            
else
                
return GetEmptyDesignTimeHtml();
        }


        
//定义一个空的实现
        protected override string GetEmptyDesignTimeHtml()
        
{
            
string spec = "[{0}]";
            
return String.Format(spec, webControl.ID);
        }

    }

(1)Initialize方法初始化控件设计时的状态
(2)AllowResize属性默认为True,设置为False,控件就无法在设计器了调整控件大小了
(3)GetDesignTimeHtml方法 最终获取控件在设计器中的状态
(4)GetEmptyDesignTimeHtml方法 定义一个空的实现

定义好以后再将控件与设计器关联起来
    [Designer(typeof(DesginWebControlDesigner))]
    
public class DesginWebControl :WebControl
    
{
    }

好了,现在就可以来测试下了


图四

效果跟定义的一样,这个就是设计时的效果了,当然生成的页面可不是这样的,这个要区分清楚.
这时我们再来修改Text属性,和控件的BackColor属性,发现Text改变了,BackColor属性在更改后设计器效果不变.

注意点:
(1)GetDesignTimeHtml方法呈现的将是控件设计器上最终的效果,使用时,你无法更改在此方法定义的效果,Initialize方法初始化的效果可以更改.
(2)页面呈现效果与设计器呈现效果不一定相同


讲了这么多就讲了最基础的东西,很容易理解的东西,大家可以了解下.

示例代码


Clingingboy 2007-03-31 14:37 发表评论
把SubText1.9.4(类似.Text单用户)免安装源码发给大家

昨天在国外的网站以外的发现了SubText,最新版是1.9.4,在搜索引擎上搜了一下,发现这方面中文的资料还不多,可能是高手觉得太简单了吧。下载来装了一下,还不错,不过感觉和.Text差不多,不过觉得很简洁也很实用,现把带基础数据库,免安装版的源码发给大家

下载地址:http://51aspx.com/CV/SubText/
官方地址:http://www.subtextproject.com/

我发现主要功能如下:

截图:


适合单用户使用
功能和.Text相仿,可以说是.Text的单用户版,关于具体使用也差不多,就不多介绍了
支持从.Text导入数据
默认管理员帐号admin,密码51aspx
内置了很多皮肤(本系统默认为Green,因为要与51aspx色调统一嘛)
支持BlogML导入导出功能(这个好像.Text没有)

SubtextSolution/Subtext.Web为web项目文件夹,Db_51aspx为数据库文件夹,导入即可

配置注意:该系统默认为Trusted_Connection=True模式,请在sql数据库中给与该用户相应的权限
文件夹中还有很多英文文档,英文好的可以研究一下
为了安全,建议把install目录删除或者改名

希望大家使用后能发现更多的功能,最起码也能学到很多东西哦

全部源码下载地址:http://51aspx.com/CV/SubText/


刘岛 2007-03-31 13:44 发表评论
More Posts Next page »