贝网博客

我的分类
流水记事
源码下载
Asp.net
其它
数据库
Javascript
.Net技术
我的相册
友情链接
博客园
CSDN博客
Start0
最新回复
fasdfasdf
[:..
lz这个东西好厉害,我..
哈哈,好照片
不错,以前一直用黄色..
终于找到支持ff的修正..
终于找到支持ff的修正..
新鲜性
看看,试试,好不好使。
好东西一起学习[:img0..
 日志列表    
本站一共有博客83条,当前显示81条
 发表于:2012-11-20 19:06:26

今天打开一个CHM文件,只有目录显示,内容显示:此程序无法显示网页

找遍了网上的解决方案,都不行,后来看到一个说中文名字可能有问题,就改为英文名,还是不行,再把它拷贝到C盘根目录,居然打开了,汗……

一个个尝试后,发现是因为目录名叫“C#”导致的,去掉这个#,就ok了

另外,如果不是这个问题,可以尝试一下:右键点击chm文件,属性,把锁定去掉

 发表于:2012-11-13 14:51:00
更新于:2012-11-13 15:50:33

1、正则工具,可以对匹配结果进行分组汇总统计等,网上找到的正则工具都无法进行汇总,所以我做了这个,可以方便的对日志里出现的次数进行统计
Github地址:https://github.com/youbl/Beinet.cn.RegexTool

2、代替SQL Server的导入导出功能的一个工具,SqlServer的导入导出功能每次都要重新输入连接信息,太坑爹了,复制粘贴也很累人的,所以开发了这个工具
Github地址:https://github.com/youbl/Beinet.cn.DataSync

3、Windows的Hosts管理工具,这种工具网上也很多,但是我这边集成了ping、nslook等功能,会贴心一些吧,哈哈
Github地址:https://github.com/youbl/Beinet.cn.HostsManager

4、驾照科目一模拟考试软件,注:题库有变化,需要自己重新抓取
Github地址:https://github.com/youbl/Beinet.cn.DrivingTest

 发表于:2012-11-12 16:52:02

今天需要开启一台电脑的远程桌面,结果死活开不起来,查看设置都开了啊,防火墙也都关闭状态
但是在别的机器用Telnet 192.168.254.58 3389死活连不上
在本机用netstat -an 命令,也看到没有监听3389端口
最后才发现在服务里有一项:Remote Desktop Services
这个服务被禁用,导致无法连接远程桌面。

简单描述一下怎么开启Win7的远程桌面:
1、点“开始”=》运行,输入:Services.msc打开服务管理窗口,在列表里查找下面2个服务,确保这2个服务都处于“已启动”状态(没有就启动它呗)
Windows Firewall
Remote Desktop Services

2、在“桌面”或开始菜单里的“计算机”上按右键,属性,点击属性窗口左侧的“远程设置”,选择下面的“允许运行任意版本远程桌面的计算机连接(较不安全)”,然后点击确定

3、在开始菜单里的“网络”上按右键,属性,点击属性窗口左侧下方的“Windows防火墙”,在弹出的窗口,点击左侧的“允许程序或功能通过Windows防火墙”,在列表最下面有个“远程桌面”,勾选上确定即可(简单作法是关闭防火墙,点“打开或关闭防火墙”,把里面的关闭都选中)

4、到这里,设置已经完成,别的机器应该可以远程过来了

 发表于:2012-11-06 17:22:53

今天看到,写入文件的代码如下:
using (FileStream fs = new FileStream(@"c:\1.tmp", FileMode.OpenOrCreate, FileAccess.Write))
{
    fs.Write(arr, 0 ,arr.Length);
}
对这个OpenOrCreate有点疑义,查了一下msdn,解释如下:
 

看晕了,我以前一直是使用FileMode.Create,这个枚举的解释:

也就是说Create,如果文件存在,会覆盖,但是OpenOrCreate好像也是覆盖,到底是不是呢?经过测试,发现,OpenOrCreate不是覆盖,而是重写,举个例子,如果文件内容是:123456789,如果使用OpenOrCreate枚举写入abc,那么文件的内容会变成:abc456789

也就是说,OpenOrCreate是打开文件,并把指针指向文件头,重写里面的字符,如果写入的数据长度比文件数据长度小,那么文件的后面那部分数据会保持旧数据不变,而不会扔掉.

在我的实际应用中,OpenOrCreate这个枚举好像意义不大,也许在别的地方确实有用途吧,总之,一定要搞清楚这2个枚举的区别,千万不要用错

 发表于:2012-11-01 11:24:00
更新于:2012-11-01 11:25:26

记录一下自己负责的软件搜索站点的优化过程

1、最初级的搜索方案,就是直接在SqlServer里使用类似这样的SQL语句:where name like '%keyword%' order by downNum desc
这个方案效率很低,全表扫描,数据量小还凑合,数据大了,SQLServer的CPU压力直线上升,而使用数据库本身的全文检索方案,很多结果出不来,放弃

2、建立一个搜索类给各个应用项目去引用,定义一个List<Soft>静态变量,每隔半小时,从数据库把所有软件数据填充到这个静态变量,搜索时,通过foreach循环这个List变量,用代码:
foreach(Soft s in list){
  if(s.Name.IndexOf(keyword) >= 0){
    returnLst.Add(s);
  }
}
把sql的like方案放到web服务器的内存中来匹配,效率比sql确实快了很多,而且压力分散到各个web服务器,数据库的压力减轻了很多,但是缺点同样很明显,就是每台web服务器都保存一份内存,到了半小时,都去数据库更新数据,这个时间点数据库压力一样很大,使用很短时间后,放弃

3、把搜索代码分离出来,单独架设一个搜索站点,通过WCF或JSON接口提供搜索服务,各个应用项目调用这个WCF或JSON接口实现搜索功能,同时改用盘古分词搜索功能,大大丰富了搜索结果数量不足的缺点
但是因为盘古分词搜索依赖于词库,对于新词,比如微博、陌陌之类,如果没有维护,就会搜索不到,另外对于非词组,也会搜索不到结果,最后把方案2中的IndexOf搜索功能也加上,先进行IndexOf搜索,再进行盘古分词搜索,把2个结果的并集返回,造成搜索站点的效率比较低下,而搜索内容又非常多样,把每个搜索词的搜索结果加入缓存也不太现实,内存占用太大,于是改进为对每周的TOP5000搜索词的搜索结果存入缓存,提高缓存命中率,同时还引入了Redis内存数据库,避免得到软件id列表,再去访问数据库时也造成数据库压力

4、一些细节改进:
  a、WCF接口不支持GZIP压缩,使用SOAP协议,造成网络流量偏大,弃用,改用ashx接口,通过Protobuf序列化结果并gzip压缩后返回,同时为调用方封装dll,请求ashx接口并反序列化,经过压力测试,Protobuf接口比WCF接口,网络流量降低了一半,cpu和内存压力也有很大提升,具体数据有空再贴上来吧
  b、s.Name.IndexOf(keyword) 修改为 s.Name.IndexOf(keyword, StringComparison.Ordinal),因为循环量非常大,这个小改进也降低了站点的不少压力
  c、对几十万的软件加载到内存时,根据标题的每个char进行分组到Dictionary中,原理大致是:如果搜索:手机,只对标题包括“手”的那些软件进行循环,这个功能加入后,站点的cpu压力降低了10%
  d、缓存由HttpRuntimeCache,改为自定义的静态变量保存缓存,在缓存过期时,也返回过期缓存,同时后台启动一个线程去填充新的数据,避免缓存过期时,都去执行业务的压力

 发表于:2012-06-07 09:38:03
更新于:2012-10-29 16:35:56

-- 获取表的行数,以及每个表占用的索引空间和数据空间
DECLARE @PageSize INT;
select @PageSize = v.low/1024.0 from master.dbo.spt_values v where v.number=1 and v.type='E'
SELECT a.id,b.name,a.rowcnt AS [行数],
 ISNULL((select @PageSize * SUM(a.used_pages - CASE WHEN a.type <> 1 THEN a.used_pages WHEN p.index_id < 2 THEN a.data_pages ELSE 0 END)
     FROM sys.indexes as i
     JOIN sys.partitions as p ON p.object_id = i.object_id and p.index_id = i.index_id
     JOIN sys.allocation_units as a ON a.container_id = p.partition_id
     where i.object_id = b.object_id),0.0)
 AS [索引空间(KB)],
 ISNULL((select @PageSize * SUM(CASE WHEN a.type <> 1 THEN a.used_pages WHEN p.index_id < 2 THEN a.data_pages ELSE 0 END)
     FROM sys.indexes as i
     JOIN sys.partitions as p ON p.object_id = i.object_id and p.index_id = i.index_id
     JOIN sys.allocation_units as a ON a.container_id = p.partition_id
     where i.object_id = b.object_id),0.0)
 AS [数据空间(KB)]
FROM sys.tables AS b,sysindexes a
WHERE a.id = b.[object_id] AND a.indid <=1 ORDER BY b.[name]
 

-- 查看当前数据库日志文件大小和使用率,size以8 KB 为单位,所以除128就是MB
SELECT name, data_space_id 文件组id, size/128 [文件大小(兆)],
    FILEPROPERTY(name, 'SpaceUsed')/128 [已用空间(兆)],
    size/128 - FILEPROPERTY(name, 'SpaceUsed')/128 [未用空间(兆)],
    FILEPROPERTY(name, 'SpaceUsed')*100.0/size [使用率(%)],
    max_size/128 [最大值(兆)],
    case is_percent_growth when 0 then cast(growth/128 as nvarchar) + '兆' else cast(growth as nvarchar) + '%' end 增长值,
    physical_name 物理路径
FROM sys.database_files a  ORDER BY a.[name]
注:Sql2005建议使用sys.database_files,sysfiles是为了兼容Sql2000才有的
前者表定义参考:http://msdn.microsoft.com/zh-cn/library/ms174397.aspx
后者兼容表定义参考:http://msdn.microsoft.com/zh-cn/library/ms178009.aspx

--查看数据库信息,如日志模式:
SELECT NAME, database_id,create_date 创建时间,is_auto_shrink_on 自动收缩, state_desc 状态,recovery_model_desc 恢复模式,is_published 是否发布库,log_reuse_wait_desc 日志重用状态 FROM sys.databases

查看日志文件使用率:
DBCC SQLPERF(LOGSPACE)

如果镜像的主体数据库日志过大,可以在主体数据库上定时作日志备份(比如1小时1次)
备份日志可以截断日志,让日志空间可以循环使用,这样可以使日志文件的大小不再增长。
BACKUP LOG newresourcedb TO DISK = 'e:\log20111122.bak'--备份完整日志
BACKUP DATABASE newresourcedb TO DISK = 'e:\db20111122.bak' with INIT--备份完整数据库

--修改数据库日志模式:Simple,Full,BULK_LOGGED
ALTER DATABASE [数据库名] SET RECOVERY SIMPLE
--设置自动收缩
ALTER DATABASE [数据库名] SET AUTO_SHRINK ON WITH NO_WAIT

-- 查看当前数据库总大小
SELECT sum(size)/128 [文件(兆)] FROM sys.database_files

-- 查看所有数据库大小
if exists (select 1 from sys.tables where name='tb1')
 drop table tb1;
SELECT *, GETDATE() dt, '                                           ' tbname into tb1 FROM sys.database_files where 1=2
EXECUTE sp_msforeachdb 'INSERT INTO tb1 SELECT *, GETDATE(),''?'' FROM [?].sys.database_files'
select tbname, sum(size)/128 [大小(M)] from tb1 group by tbname order by [大小(M)] desc
--sp_msforeachdb是循环所有数据库,把数据库名替换掉脚本里的?

查看sql执行计划命中率
SELECT count(1) FROM sys.dm_exec_cached_plans?
SELECT count(1) FROM sys.dm_exec_cached_plans? WHERE usecounts<=2
SELECT TOP 1000 stats.execution_count AS exec_count,? p.size_in_bytes as [size],? [sql].[text] as [plan_text]?
FROM sys.dm_exec_cached_plans p? outer apply sys.dm_exec_sql_text (p.plan_handle) sql?
join sys.dm_exec_query_stats stats ON stats.plan_handle = p.plan_handle?
ORDER BY usecounts

--获取前100个最占cpu的执行
select top 100
sum(qs.total_worker_time) as total_cpu_time,
sum(qs.execution_count) as total_execution_count,
count(*) as number_of_statements,
qs.plan_handle, [sql].[text] as [plan_text]
from sys.dm_exec_query_stats qs
 outer apply sys.dm_exec_sql_text (qs.plan_handle) sql
group by qs.plan_handle,[sql].[text]
order by total_cpu_time desc

-- 清空上面的执行计划缓存列表
DBCC FREESYSTEMCACHE ('ALL')
DBCC FREEPROCCACHE

--查找表的所有索引
SELECT a.name, b.name
FROM   sys.tables a, sys.indexes b
WHERE  a.[object_id] = b.[object_id]
ORDER BY a.name, b.name

-- 获取Sqlserver的查询计划
WITH XMLNAMESPACES('http://schemas.microsoft.com/sqlserver/2004/07/showplan' AS SQL)
SELECT c.value('@StatementId', 'INT') AS [no],
       c.value('(./@StatementText)', 'NVARCHAR(MAX)') AS [Statement],
       qplan.query_plan AS queryPlan
FROM   (
           SELECT DISTINCT plan_handle
           FROM   sys.dm_exec_query_stats
       ) AS qstats
       CROSS APPLY sys.dm_exec_query_plan(qstats.plan_handle) AS qplan
CROSS APPLY query_plan.nodes(
    '/SQL:ShowPlanXML/SQL:BatchSequence/SQL:Batch/SQL:Statements/descendant::*[attribute::StatementText]'
) AS t(c)
ORDER BY plan_handle, [no]

 

 发表于:2012-02-27 10:46:31
更新于:2012-10-29 16:34:35

这两天,由于负责的一个搜索站点服务器CPU很高,领导要求优化代码,在本地安装了个JetBrains dotTrace Performance 4.5,
并抓取IIS的请求,分析请求,发现每次请求IndexOf这个方法调用都超过10万次,已经占用了相当的处理时间了,经过ILSpy反编译,发现IndexOf方法定义:
public int IndexOf(string value)
{
    return this.IndexOf(value, StringComparison.CurrentCulture);
}

参考MSDN:

于是改用另外一个枚举:

Ordinal  
单单这个IndexOf的效率能提高一倍以上(其实不止)

另外,Contains方法默认使用的就是Ordinal了

还有一个字符串的Compare方法,我们经常使用:
string a="1", b = "2";
return a.CompareTo(b);

其实可以改用:
string.Compare(version1, version2, StringComparison.Ordinal);
或者:
string.CompareOrdinal(version1, version2);

效率也是很有提升的,关于StringComparison.CurrentCulture和StringComparison.Ordinal的区别,或其它StringComparison枚举,可以参考MSDN:
http://msdn.microsoft.com/zh-cn/library/system.stringcomparison(VS.80).aspx

 发表于:2012-08-16 16:02:16
更新于:2012-10-29 16:33:12

在之前的工作中,使用Fiddler2经常无法捕获到HttpWebRequest发起的请求,找了好久的原因都没找到,在应用程序里写

<system.net>
<defaultProxy enabled="true">
  <proxy proxyaddress="http://127.0.0.1:8888" bypassonlocal="False"/>
</defaultProxy>
</system.net>

也没有效果,今天终于发现,是因为我封装了HttpWebRequest的方法,里面手动写了一句:
httpWebRequest.Proxy = null;

默认情况下,HttpWebRequest会使用系统设置的代理去请求(IE里的代理设置),设置为null后,就不使用代理,直接请求,而Fiddler2是通过设置代理为127.0.0.1:8888来捕获Http请求的,所以就捕获不到了,把上面那行代码注释掉,就ok了


©2008 Beinet.cn 版权所有