2008-9-4 0:07:00
今天看见chrome,欣喜十分,忙下载Beta版试用,第一感觉是窗体简洁,第二感觉是小巧玲珑。用了那么几个小时,感觉还不错。安装的时候,也自动导入了我Firefox的书签。现在欠缺点的就是支持的插件、主题还没有,但由于它是开源的,相信不久的将来,这些东东一定会极大的丰富。
发现chrome的任务管理(shift+Esc),里面详细列表了chrome进程的内存占用情况,其中包括物理内存(Memory)、虚拟内存(Virtual memory),详细显示了各个页面占用内存的情况,让人一目了然啊。不知道Google开发者把这些数据显示给用户,用意何为。是在寓意chrome占用内存少?是提醒Web开发者也得关心关心客户端的Broswer,让它们也尽量减减刑?(现在某些网页,几乎可以让某些浏览器打开网页缓慢甚至崩溃,客户端脚本太多,效率低下是一方面原因的)还是其他更重要的原因呢!
关于chrome遵循W3C标志情况,还不咋地清楚,不过相对于目前的浏览器相信它做的更好些吧。发现Firefox(3.0)对缓存的页面有缩小显示的迹象本来两div间距只有10px(在IE7、Opera显示为10px,今天发现在Chrome也显示为10px),可显示出来却有20px,而div内的字体间距、字体、div宽度看起来似乎变窄了。
其实,我急着用chrome的Beta版还有个原因,Google既然推出了Google Web Accelerator,必然会在自己浏览器访问网页速度方面下点功夫,(其他方面当然也不例外了)再则,要想自己后来居上,没半斤八两的也是不行的。可能Google就是抱着开源这个大树吧,google的目标不是程序的最终用户,而是编写程序的Programer。
chrome下载:http://www.google.com/chrome
阅读全文>>
2008-9-4 2:15:29
如何让我们的asp.net程序在某个时刻自动执行某些任务呢?
当我们为桌面程序设计某个计划任务时,一个时钟控件(Timer)就轻而易举地解决了,可我们如何让我们的web程序能具有像时钟控件一样的功能呢?(注:此处的自动执行不是某个用户访问某一页面时才自动执行,而是只要Web服务器正常工作,则无论有没有用户访问都可自动执行某些任务的情况)
吾漫游于搜索引擎间,终得甜头啊~~~
其思路如下:
在Application_Start里面添加一进程,通过while(true)让它陷入执行任务的死循环,此死循环非绝对死循环每当它执行一次任务后,我们就让它沉睡一会,Thread.Sleep(3000)。由此,每隔3秒就可执行一次我们安排的任务,至于任务和执行时间个间隔完全可以自治。
Global.asax文件部分源码:
复制代码
复制代码
private void start()
{//调用进程
ThreadStart myThreadStart = new ThreadStart(startJob);
schedulerThread = new Thread(myThreadStart);
schedulerThread.Start();
}
private void startJob()
{//循环执行,间隔3秒
while (true)
{//每隔3秒执行一次
ThreadStart myThreadDelegate = new ThreadStart(excuteJob);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
Thread.Sleep(3000);
}
}
private void excuteJob()
{
//此处添加需要执行的任务,如备份数据库、发送信息等待
//此处的任务是每隔3秒刷新一次www.goberl.com本站的页面
//==================================================任务开始
WebRequest wres;
String url = http://www.goberl.com/;
wres = WebRequest.Create(url);
WebResponse wreq = wres.GetResponse();
Encoding code = Encoding.GetEncoding(gb2312);
StreamReader sr1 = new StreamReader(wreq.GetResponseStream(), code);
String strtemp = sr1.ReadToEnd();
sr1.Close();
//==================================================任务结束
//记录执行的次数
int readCount=-2;
using (StreamReader sr = new StreamReader(System.AppDomain.CurrentDomain.BaseDirectory+@/countRecord.txt))
{//获取文本文件中的数字
String line;
while (((line = sr.ReadLine()) != null))
{
readCount = Convert.ToInt32(line);
}
}
if (readCount != -2)
{//如果成功读取了文本文件中的数据则是该数字自增1,并写入文本文件
readCount++;
using (StreamWriter sw = new StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + @/countRecord.txt, false))
{
sw.Write(readCount.ToString());
}
}
}
public System.Threading.Thread schedulerThread = null;
void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
HttpContext.Current.Application.Lock();
HttpContext.Current.Application[TimeStamp] = DateTime.Now;
HttpContext.Current.Application.UnLock();
start(); //调度
}
源码下载:download
阅读全文>>
2008-9-5 5:40:42
每当在无聊的生活中呆上一天半天,总想找点所谓能够成就自我,能够带来惬意的事情来做,无论是游戏,打球,写程序都如小孩子在玩泥玩一会就丢一边去了。生活就如没有远大目标的航船在大海上漂泊着,每当经过某一个不知名的岛屿,都登陆上去看一看,玩一玩,玩够了,返回航船继续依旧的漂泊。
我又想用偶发突想这个短语来修饰我又想出了个小玩样儿,但很不情愿地用这个短语,因为我用得自己都厌烦了,而事实上也不知道那种状态是否是真的算偶发突想N天以前,我想做一个投票系统,可在设计数据库的时候遇到了困难,我不知道该如何设计数据库来解决不确定投票项目数的情况。一个投票题目可能有2个选项,3个,4个或者更多,同时一个投票题目可能是多选。这种有点复杂(在我看来)的关系让我在我N天前放弃了做投票系统的打算。可N天后,也就是今天,我又偶发突想地想通了这个问题,理顺了这种有点复杂的关系。
先看下这张图片:


解释解释(此图是关于投票或者选择题有未知个数选项的数据库设计):
首先,在题目表中一个投票或者选择题必然有一个题目,比如:关于年龄段的调查。此处的题目ID字段标示为主键(自动编号),标题字段存储题目,类型字段存储此投票或者选择题目是多项选择还是单项选择;
其次,在题项表中每个投票或者选择题都有N个选项,比如:5~16,17~22,22~40,40以上的四个选项。此处的题项ID字段标示为主键(自动编号),题项内容字段存储选项内容,题目ID为引用自题目表的外码。
如此设计,就可解决不确定项投票或者选择题以及是否多选的问题。只是这样的设计会导致绑定数据时的难度,需要在Item_DataBind事件下判断每个投票或者选择题类型并绑定各个题项,这种绑定方法难免会影响程序的性能。
以下是Power Desiger生成Sql文件(MS SQL2000):
复制代码
/*==============================================================*/
/* DBMS name: Microsoft SQL Server 2000 */
/* Created on: 2008-9-4 20:11:26 */
/*==============================================================*/
alter table 题项
drop constraint FK_题项_REFE_题目ID
go
if exists (select 1
from sysindexes
where id = object_id('topic')
and name = 'Index_查询'
and indid > 0
and indid < 255)
drop index topic.Index_查询
go
if exists (select 1
from sysindexes
where id = object_id('topic')
and name = 'Index_连接'
and indid > 0
and indid < 255)
drop index topic.Index_连接
go
if exists (select 1
from sysindexes
where id = object_id('题项')
and name = 'Index_更新'
and indid > 0
and indid < 255)
drop index 题项.Index_更新
go
if exists (select 1
from sysindexes
where id = object_id('题项')
and name = 'Index_连接'
and indid > 0
and indid < 255)
drop index 题项.Index_连接
go
if exists (select 1
from sysobjects
where id = object_id('topic')
and type = 'U')
drop table topic
go
if exists (select 1
from sysobjects
where id = object_id('题项')
and type = 'U')
drop table 题项
go
/*==============================================================*/
/* Table: topic */
/*==============================================================*/
create table topic (
题目ID integer identity,
标题 varchar(250) null,
类型 varchar(10) null,
constraint PK_TOPIC primary key (题目ID)
)
go
declare @Cmttopic varchar(128)
select @Cmttopic = user_name()
execute sp_addextendedproperty 'MS_Description',
'每个投票OR选择题的题目内容',
'user', @Cmttopic, 'table', 'topic'
go
execute sp_addextendedproperty 'MS_Description',
'多选OR单选',
'user', '', 'table', 'topic', 'column', '类型'
go
/*==============================================================*/
/* Index: Index_连接 */
/*==============================================================*/
create unique index Index_连接 on topic (
题目ID ASC
)
go
/*==============================================================*/
/* Index: Index_查询 */
/*==============================================================*/
create unique index Index_查询 on topic (
题目ID ASC,
类型 ASC
)
go
/*==============================================================*/
/* Table: 题项 */
/*==============================================================*/
create table 题项 (
题项ID integer identity,
选项内容 varchar(250) null,
题目ID integer null,
constraint PK_题项 primary key (题项ID)
)
go
declare @Cmt题项 varchar(128)
select @Cmt题项 = user_name()
execute sp_addextendedproperty 'MS_Description',
'投票OR选择题的各个选项',
'user', @Cmt题项, 'table', '题项'
go
execute sp_addextendedproperty 'MS_Description',
'投票选项OR题目选项内容',
'user', '', 'table', '题项', 'column', '选项内容'
go
/*==============================================================*/
/* Index: Index_连接 */
/*==============================================================*/
create index Index_连接 on 题项 (
题目ID ASC
)
go
/*==============================================================*/
/* Index: Index_更新 */
/*==============================================================*/
create unique index Index_更新 on 题项 (
题项ID ASC
)
go
alter table 题项
add constraint FK_题项_REFE_题目ID foreign key (题目ID)
references topic (题目ID)
go
阅读全文>>
2008-9-20 8:04:08
前几天无聊得很,到微软的网络课堂上下载了几个感兴趣的视频。看了其中的一部名为《开发高性能的ASP.NET应用》的课程,里面讲的好多知识都未接触过,看后感慨良深咋认识越多,不懂的就越多。
看了两三部,其中印象最深的一个就是关于关闭数据库连接的问题。
通常我们为了提高应用程序的性能,在与数据库交互时,在对数据库进行操作后会立即关闭数据库连接。但这个立即关闭数据库连接到底是什么意思呢?我们先来看看下面这个例子。
Note: con是一个SQLConnection对象,sqlCMD是一个SQLCommand对象,省略了SQL语句的部分内容.
假设有下列3个SQL语句需要依次执行,且不方便于把三个语句写入一个SQL语句中。
String strSql1=INSERT INTO [Employees]
String strSql2=UPDATE [Employees]
String strSql3=DELETE FROM [Employees]
第一种方法:
con.Open();
sqlCMD= new SQLiteCommand(strSql1, con);
sqlCMD.ExecuteNonQuer();
sqlCMD= new SQLiteCommand(strSql2, con);
sqlCMD.ExecuteNonQuer();
sqlCMD= new SQLiteCommand(strSql3, con);
sqlCMD.ExecuteNonQuer();
con.Close();
第二种方法:
con.Open();
sqlCMD= new SQLiteCommand(strSql1, con);
sqlCMD.ExecuteNonQuer();
con.Close();
con.Open();
sqlCMD= new SQLiteCommand(strSql2, con);
sqlCMD.ExecuteNonQuer();
con.Close();con.Open();
sqlCMD= new SQLiteCommand(strSql3, con);
sqlCMD.ExecuteNonQuer();
con.Close();
这两种方法哪一个更具有性能优势呢?我平时用的是第一种,觉得它有效。可我看了这个视频后,我发现
自己的想当然错误了。当数据库连接池启用的情况下,第一种方法会导致非常大的性能问题甚至会导致连接的漏洞为什么呢?为什么会这样呢?
原来如此:
第一种方法看似只打开了一次数据库连接,并在最后一次性关闭,而实质是每执行一次ExecuteNonQuer(),数据库就为其创建一个连接,此连接直 到最后的con.Close()或者垃圾回收时才释放此过程中数据库需要一直维护其连接。上面的例子执行了3次,数据库就为其创建3个连接。假设 是一个循环,执行了千次万次,这种操作方法带来的后果是恐怖的。
第二种方法为什么会高效呢?那样反复的打开/关闭数据库连接还高效?谁不知道打开/关闭数据库连接是
非常耗时的。问题的关键就在于数据库的连接池,ADO.NET自动启用的连接池技术让我们快速从数据库的连接池中获取一个连接,我们反复地Open/Close的连接其实是从连接池中获取的。
注意:这种情况的前提是启动了数据库的连接池技术。
一句话只在需要时才打开数据库连接,使用后立刻关闭连接,如此,提升程序性能。
阅读全文>>
2008-9-21 8:04:17
悠哉悠哉进了Google的生活搜索,随手Google 搜索出现了一大片的信息。突然发现网页右侧有图片、图例,仔细一瞧大为惊诧!何也?惊诧于Google的以人为本,惊诧于Google的神通广大,惊诧于Google的特色网络服务。
1.Google生活搜索之房屋

一看这个图例,咋让我想到了炒股的波状图。Google应该不会派专人来研究房价吧
看一张图例还不够刺激,再看看这个二手房价格走势、租房供给量走势、二手房供给量走势,真可谓一览无余啊!

Google除了能给普通用户提供图例外,还为广大网站主提供了额外的服务通过一小段代码可以让这些图例显示到自己的网站中。点击详情
2.Google生活搜索之工作
输入了一个互联网,出现了很多有关这个职称的工作岗位,发现她的信息都来自各招聘网站,但增加了许多查询限制选项,如行业、雇主、学历、工作经验、薪酬等。使用Google的工作搜索无需担心信息过期,因为她的更新周期小于1小时。如果Google让Google 快讯和这个结合起来,不知道有多爽啊。而右侧的图例居然让我想到了管理人力资源的政府部门。
3.Google生活搜索之出行票务
这个显示未来火车票数量的图例不得不让我大跌眼镜虽然我没有眼镜。

又一次见识了Googl高招啊,我只想说间谍猛于军队,孰知Google之猛,有甚于是间谍者乎!
信息管理、管理信息得向Google学习。
以下引用Google的代码显示了成都租房价格的走势图。
阅读全文>>
2008-9-27 5:59:43
昨调试程序,生成缩略图时中提示System.OutOfMemoryException: 内存不足。。在网上溜达了一圈。总结如下:
GetThumbnailImage(newWidth, newHeight, callback, IntPtr.Zero);中的宽度或者高度 为0或者负数,可能出现内存不足 。
提供给System.Drawing.Image对象的Stream释放(Dispose)太早,也会导致内存不足。
确实是因为Stream提供的字节流太大,导致内存不足,但这种可能性太小了。现在的Web服务器配置不可能处理一个普通的图片都会导致内存不足。现在计算机的发展远远超过了摩尔定律的约每隔18个月便会增加一倍,性能也将提升一倍的规律。价格猛降。前两天买了个金士顿2G1年保修的U盘,才35RMB,宿舍一兄弟伙配了台AMD 4800+双核的电脑2000不到,降价太黑人了。是不是再等几年就普及4核6核了。
关于C#,VB.NET生成缩略图请参见:
http://msdn.microsoft.com/en-us/library/system.drawing.image.getthumbnailimage.aspx
阅读全文>>
2008-9-28 7:38:14
今天在专业英语课上,看见课本上说Japanese和Chinese字符都是用Unicode编码的,突然让我想起正则表达式中\unnnn一个4位十六进制指定的Unicode字符这句话求出中文字符的Unicode,不就得到了该中文字符在正则表达式的匹配符吗?遂得如下页面,以便查询某一汉字在正则表达式中的匹配符。网上很多网站都提供了Unicode查询,但我的目的是提供查询某汉字的正则表达式匹配符。
在线查询汉字Unicode编码、在线查询单个汉字正则表达式
阅读全文>>
2008-9-30 11:01:26
C# GDI实现渐变色:
先看看示例页面,www.goberl.com/functionAspx/03GradientColor.aspx
写得很粗糙,如果图片太大,而渐变色的起始和终止颜色相差又不大,就无法绘制渐变色了。其实GDI绘制这个渐变色图像就用了N个矩形填充,而要实现渐变色的关键就是对颜色的计算。
关于GDI要实现渐变色即RGB实现渐变色的原理或者规律稍后再叙!
===========================================================
(跳过个人学习的误区。
要实现渐变色请参见:http://www.goberl.com/archive/item19.aspx
或者:LinearGradientBrush及其相关类
具体实现的代码方法见:http://forums.asp.net/t/1333757.aspx
)
本段更新于2008年10月18日
=============================================================
效果图:
阅读全文>>