朗志工作室(Langzhi Studio)  
专注于企业级应用开发
北京的coder, designer 加我qq一起交流哈 朗志工作室,承接北京地区B/S类应用
公告
日历
<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456
统计
  • 随笔 - 133
  • 文章 - 5
  • 评论 - 157
  • 引用 - 4

导航

与我联系

搜索

 

常用链接

留言簿(1)

我管理的小组

我的标签

随笔分类

随笔档案

相册

北京

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

 

置顶随笔

     摘要: 采用SqlServer2000+asp.net2.0+SubSonic+Linq+AspNetPager分页控件的自家用的站点程序(含源码)  阅读全文
posted @ 2008-06-03 09:13 lexus 阅读(1373) | 评论 (8)编辑

2008年8月28日

posted @ 2008-08-28 20:57 lexus 阅读(33) | 评论 (0)编辑
 

 

 1using System;
 2using System.Collections.Generic;
 3using System.ComponentModel;
 4using System.Data;
 5using System.Drawing;
 6using System.Linq;
 7using System.Text;
 8using System.Threading;
 9using System.Windows.Forms;
10
11namespace BrowserDemo
12{
13    public partial class Form8 : Form
14    {
15        public Form8()
16        {
17            InitializeComponent();
18        }

19
20        private void button1_Click(object sender, EventArgs e)
21        {
22            DoWork();
23        }

24        private void DoWork()
25        {
26            Thread t = new Thread(new ThreadStart(this.DoSomething));
27            t.Start();
28        }

29        private void DoSomething()
30        {
31            MessageBox.Show("thread start");
32        }

33
34        private void button2_Click(object sender, EventArgs e)
35        {
36            foreach (var v in typeof(AA).GetFields())
37            {
38                if (v.FieldType.IsEnum == true)
39                {
40                    this.comboBox1.Items.Add(v.Name);
41                }

42            }

43            this.comboBox1.SelectedIndex = 1;
44
45
46        }

47        public enum AA
48        {
49            B,
50            C
51        }

52
53        private void button3_Click(object sender, EventArgs e)
54        {
55
56            AA a = AA.B;
57            MessageBox.Show(a.ToString());
58            this.comboBox1.SelectedIndex = this.comboBox1.FindString(a.ToString());
59        }

60    }

61}

62

是些小技巧,但每次要用的时候都得google一遍,真的很痛恨自己这一点,怎么记性就不能再好一点,很耽误时间。在这里记录一下吧

 

posted @ 2008-08-28 13:06 lexus 阅读(69) | 评论 (0)编辑

2008年8月27日

 

按照惯例先上个图,自己照着人家的例子写了一遍,基本上把这个弄懂了,这个控件就是省事,不懂线程原理的人也可使,ms就是厉害,生产力节节提高哈,

 

 1using System;
 2using System.Collections.Generic;
 3using System.ComponentModel;
 4using System.Data;
 5using System.Drawing;
 6using System.Linq;
 7using System.Text;
 8using System.Threading;
 9using System.Windows.Forms;
10
11namespace BrowserDemo
12{
13    public partial class Form7 : Form
14    {
15        const int argument = 20000;
16
17        public Form7()
18        {
19            InitializeComponent();
20        }

21
22        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
23        {
24            for(var i=0;i<int.Parse(e.Argument.ToString());i++)
25            {
26                e.Result = i;
27                (sender as BackgroundWorker).ReportProgress((int)(((double)i / (double)((int)e.Argument)) * 100),i);
28                Thread.Sleep(20);
29                if (this.backgroundWorker1.CancellationPending)
30                    return;
31            }

32        }

33
34        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
35        {
36            this.listBox1.Items.Add(e.UserState);
37            this.progressBar1.Value = e.ProgressPercentage;
38        }

39
40        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
41        {
42            MessageBox.Show("finished");
43        }

44
45        private void button1_Click(object sender, EventArgs e)
46        {
47            if (this.backgroundWorker1.IsBusy)
48            {
49                MessageBox.Show("慢则那,等着吧");
50                return;
51            }

52            this.backgroundWorker1.RunWorkerAsync(argument);
53            this.button2.Enabled = true;
54            this.button3.Enabled = true;
55
56        }

57
58        private void button2_Click(object sender, EventArgs e)
59        {
60            MessageBox.Show("111");
61        }

62
63        private void button3_Click(object sender, EventArgs e)
64        {
65            this.backgroundWorker1.CancelAsync();
66        }

67
68        private void Form7_Load(object sender, EventArgs e)
69        {
70            this.button2.Enabled = false;
71            this.button3.Enabled = false;
72        }

73    }

74}

75

 

完整的工程如下

 

 http://files.cnblogs.com/lexus/BrowserDemo.7z

 

相关资源,发现msdn上写得比较还好,不过自己写一遍自己就清楚了,我发现网上的msdn,是不是和vs2008里的光盘里的那个msdn不一样,有些资源为什么在光盘上的找不到呢,等我采集程序做好了,我要把它都抓下来,占为已有,嘿嘿

 http://msdn.microsoft.com/zh-cn/library/ms233672(VS.80).aspx

posted @ 2008-08-27 18:28 lexus 阅读(58) | 评论 (0)编辑
 

log4net是一个apache基金资助的项目log4j的.net移植版本,它是一个.net的dll,可以方便的加载到开发项目中,实现程序调试和运行的时候的日志信息输入,比.net自己提供的debug类和trace类要提供更多功能。

    整个讨论分为两部分,第一部分是howto部分,告诉读者如何用最快的方式使log4net运作起来,第二步部分是inside部分,和读者一起探讨关于log4net层次架构设计以及一些思想. 
    HOWTO部分:
    该部分给出一个范例,让你的第一个log4net范例尽快运行起来
    先决条件:作者假设用户能够使用visual studio 2003的ide编写.net的winform程序,以及用户已经从网站上下载了一份最新的log4net(当前最新版本的下载地址:http://cvs.apache.org/dist/incubator/log4net/1.2.9/incubating-log4net-1.2.9-beta.zip)

 


     第一步:新增项目,添加log4net引用. 
    通过vs.net 2003建立一个项目,然后将log4net添加到项目引用中来  
      


    第二步:设置配置文件: 
    建立对应项目的xml配置文件,log4net.config,文件内容如下:  

 


      1<?xml version="1.0" encoding="utf-8" ?>
 2<configuration>
 3    <configSections>
 4        <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
 5    </configSections>
 6    <log4net>
 7        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
 8            <layout type="log4net.Layout.PatternLayout">
 9                <conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
10            </layout>
11        </appender>
12        <appender name="FileAppender" type="log4net.Appender.FileAppender">
13            <file value="c:/log-file.txt" />
14            <appendToFile value="true" />
15            <layout type="log4net.Layout.PatternLayout">
16                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
17            </layout>
18        </appender>
19        <root>
20            <level value="INFO" />
21            <appender-ref ref="ConsoleAppender" />
22        </root>
23        <logger name="test.logger">
24            <level value="ALL" />
25            <appender-ref ref="FileAppender" />
26        </logger>        
27    </log4net>
28</configuration> 

 

    第三步:在程序中设置自动加载以及监视配置文件 
    在AssemblyInfo.cs中增加如下语句:
    1[assembly: log4net.Config.XmlConfigurator(Watch=true,ConfigFile="log4net.config")]

 


    第四步:测试使用 
    在窗体中增加一个按钮,    
    并在该按钮的Click事件中增加如下代码:
            private void trigLogger_Click(object sender, System.EventArgs e)
        {
            ILog log = LogManager.GetLogger("test.logger");
            log.Info("Hello,World!");
        }
    然后首先将log4net.config复制到bin\Debug目录下,并运行程序,点击"Trigger Logger"按钮,可以看到结果大概  如下      

2006-01-19 16:25:54,890 [3476] INFO  Test.logger [(null)] - Hello World

posted @ 2008-08-27 12:37 lexus 阅读(9) | 评论 (0)编辑

2008年8月26日

依旧先来段废话呵呵,程序还在开发阶段,担心开发出来的程序会走样,所以拿出来溜溜。市面上已经有n多的采集软件了,我只是在重复轮子,比它们的好不到哪去,差到没边到是极有可能。不过相比目前的一些采集程序而言,我算是基于组件的吧,各个组件间可替换,希望能算得上是一个亮点。同时也希望这次的展示,同行专家们给予建议和批评。

目前没有解决的问题是:

1.一些需要cookie的网站,怎么采集,sina我是登录进去了,不过cnblogs我没有登录成功。

2.定时的执行,怎么样让一个任务定时执行,使用Quartz.net?,由于一个采集任务的网址可能非常之多,第一个网址采集的时间,和最后一个网址采集的时间可能相隔几小时,如果整个任务的要求是间隔1h,采集一次,那么最后一个网址可能才刚采集完又要采集了,或是上一次任务都还没有执行到该网址。这里还没有考虑采集间隔策略的情况,比如如果三次采集未发生变化则延长下次采集时间等

3.储存问题,如果使用DAS、或是数据库到是一点问题都没有,但是如果各个客户端将采集的结果以文件的形式储存,怎么将各客户机上的文件汇总合并又将是一个系统的工程

4.任务流程及组件的装配界面实现的问题,目前对流程的配置都是使用文本编辑器来编辑配置文件,极易写错,对GDI+不了解,没有想到好的方法来实现界面化的组件装配。

 

我们先来看一下采集的结果,再介绍整个采集的流程。采集的结果用xml保存,使用了程序内置的Store2Xml组件,如果你想储存到特定的数据库中,你可以自己写一个组件,或者提供某个cms的webservice我们再做一个适配组件。

我考虑再做一个Store2MDB的组件,便于将数据转移也是嵌入式的,不采用sqlite是因为一般用户可能不太了解。

 

 

 

 

 

 

下面我以采集http://tech.sina.com.cn/VC/index.html下的创业资讯和创业锦囊栏目为例,展示一下这个程序

step1:分析网页

 这两个栏目的样式是一样的,因此我们只需要写一个采集规则就可以了。

 

打开任意一个栏目的列表页,查看它的源码,我们需要找到重复的片段,如下图中高亮的部分是重复出现的内容

我们将上图中的欲抽取的部分源码放到RegexBuddy中作为测试代码,用来测试我们撰写的正则

将测试完的正则放到组件的指定属性中,目前只能手工配置了,在实际中应用有一个图形化的环境,提供step by step的操作提示

最后我们来设计组件装配置执行的流程,使用的是boo解释引擎,类似ironpython

 

 在设计阶段总共有三个文件 ,其中文本文件储存的是欲采集的网址集,一行一个

Step 2:添加任务

将设计阶段制作好的任务包添加进来,填写好信息,就可以提交任务了<