adpost'sblog

有方向有阶段的努力才能离目标更近,
posts - 5, comments - 1, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2010年8月2日

#include <locale>
#include <iostream>
#include <cstdlib>

using namespace std;
string SystemGameResult (int rndNumber);
int IsWoner(int a,int b,int &sucessNumber,int &EqualNumber);
string PrintResultInfo(int s);
/*
    石头剪刀布游戏
powerby:http://www.adpost.cn
    输入 R:代表石头
         S:代表剪刀
         P:代表布
*/
int main()
{
    //setlocale (LC_ALL, "");
    //随机数 0:石头 1:剪刀 2:布
    int rndNumber;
    int gamesNumber;
    int sucessNumber=0,EqualNumber=0;
    char gamerInput;
    gamesNumber = 0;
    string noteInfo = "请输入一个字符,r:石头,s:剪刀,p:布,0:退出:";
    srand ( (unsigned) time (NULL));
    cout << noteInfo << endl;
    while (true) {
        gamesNumber++;
        cin >> gamerInput;
        rndNumber = rand() % 3;
        if (gamerInput == '0')
            break;
        switch (tolower (gamerInput)) {
        case 'r':
            cout << "您出:"<<SystemGameResult(0)
                 <<",系统出:" << SystemGameResult(rndNumber)
                 << " "<<PrintResultInfo(IsWoner(rndNumber,0,sucessNumber,EqualNumber)) << endl;
            break;
        case 's':
            cout << "您出:"<<SystemGameResult(1)
                 <<",系统出:" << SystemGameResult(rndNumber)
                 << " "<<PrintResultInfo(IsWoner(rndNumber,1,sucessNumber,EqualNumber)) << endl;
            break;
        case 'p':
            cout << "您出:"<<SystemGameResult(2)
                 <<",系统出:" << SystemGameResult(rndNumber)
                 << " "<<PrintResultInfo(IsWoner(rndNumber,2,sucessNumber,EqualNumber)) << endl;
            break;
        default:
            cout << "输入错误,请输入一个字符,r:石头,s:剪刀,p:布,0:退出:" << endl;
            break;
        }
    }
    cout<<"共玩了"<<gamesNumber<<"次,"
        <<"赢了 "<<sucessNumber<<" 次,"
        <<"输了 "<<gamesNumber-sucessNumber-EqualNumber<<" 次,"
        <<"平了 "<<EqualNumber<<" 次"
        <<endl;
    return 0;
}
/*
谁胜利
a:玩家
b:系统
A-B:
    0:平
    -1,2:胜
     1,-2:输
@return:
    0:平 1:胜 2:输 -1:异常数据
*/
int IsWoner(int a,int b,int &sucessNumber,int &EqualNumber)
{
    int v = a-b;
    if(v==0)
    {
        EqualNumber++;
        return 0;
    }
    if(v==1 || v==-2) {
        sucessNumber++;
        return 1;
    } else if(v==-1 || v==2)
        return 2;
    else return -1;
}
//打印结果信息
string PrintResultInfo(int s)
{
    switch(s) {
    case 0:
        return "平了!\n";
        break;
    case 1:
        return "你胜利了!\n";
        break;
    case 2:
        return "你输了!\n";
        break;
    default:
        return "异常性况!\n";
        break;
    }
}

string SystemGameResult (int rndNumber)
{
    switch (rndNumber) {
    case 0:
        return "石头";
        break;
    case 1:
        return "剪刀";
        break;
    case 2:
        return "布";
        break;
    default:
        return "异常数据";
        break;
    }
}


posted @ 2010-08-02 13:40 adpost 阅读(67) 评论(0) 编辑

2010年6月2日

程序发行后,对WEB程序进行压缩(web程序文件,HTML,ASPX,ASP,CSS,JS文件),可以减少程序的大小,加快客户的访问速度.所以就写了这个小程序.

  • 自动备份原始文件
  • 可选择文件默认编码
  • 可自定义不处理压缩的标签
  • 多线程处理
  • 需要 .net 2.0 框架支持

版本V2更新:

  1、解决了一个小BUG

  2、修改了更新方法

后续计划:

  1、多语言版本

  2、动态语言(CGI)程序的压缩处理

新版本下载地址:

下载地址:http://files.cnblogs.com/adpost/HTML%e5%8e%8b%e7%bc%a9.rar

 

posted @ 2010-06-02 16:46 adpost 阅读(37) 评论(0) 编辑

2010年5月25日

在.net中打开读取文件内容时,如果不对文件编码进行匹配时经常会把文件内容读成乱码。所以就有了以下的文章。

如何得知这个文件的编码方式?

BOM

        这里涉及到一个BOM(Byte Order Mark) 的概念。简单的讲,在Unicode标准中,为了标示文本文件的编码类型,可以在文本文件的开始插入几个特殊的byte,通过这几个特殊的byte,应用程序就可以鉴别文本文件使用的是那种编码了。那几个特殊的byte也被称之为BOM(参考:http://unicode.org/faq/utf_bom.html

 对于Unicode,几种编码的BOM如下:

/// <summary>
        /// 文件编码
        /// </summary>
        private enum fileEncoding {            
            /// <summary>
            /// UTF-8:前3个byte是:EF BB BF
            /// </summary>
            UTF8,
            /// <summary>
            /// UTF-16 big-endian:前2个byte是:FE FF
            /// </summary>
            UTF16BigEndian,
            /// <summary>
            /// UTF-16  little-endian:前2个byte是:FF FE
            /// </summary>
            UTF16LittleEndian,
            /// <summary>
            /// UTF-32 big-endian:前4个byte是:00 00 FE FF
            /// </summary>
            UTF32BigEndian,
            /// <summary>
            /// UTF-32  little-endian:前4个byte是:FF FE 00 00
            /// </summary>
            UTF32LittleEndian,
            /// <summary>
            /// UTF7:所有的byte转换为十进制都小于127
            /// </summary>
            UTF7,
            /// <summary>
            /// 找不到BOM 未知编码
            /// </summary>
            Unknown
        }
判定文件编码方式:
我们知道UNCODE文件相对应的编码后我们就可以读取文件的前几个byte然后判断文件的相应编码:
/// <summary>
        /// 通过文件BOM 取得文件编码
        /// </summary>
        /// <param name="buffer">文件前100个字节</param>
        /// <returns></returns>
        private fileEncoding FileEncoding(byte[] buffer)
        {
            bool IsUTF7 = false;
            if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
                return fileEncoding.UTF8;
            if (buffer[0] == 0xfe && buffer[1] == 0xff)
                return fileEncoding.UTF16BigEndian;
            if (buffer[0] == 0xff && buffer[1] == 0xfe)
                return fileEncoding.UTF16LittleEndian;
            if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)
                return fileEncoding.UTF32BigEndian;
            if (buffer[0] == 0xff && buffer[1] == 0xfe && buffer[2] == 0 && buffer[3] == 0)
                return fileEncoding.UTF32LittleEndian;
            for (int i = 0; i < buffer.Length; i++)
            {
                if (buffer[i] > 127)
                {
                    IsUTF7 = false;
                    break;
                }
            }
            if (IsUTF7)
                return fileEncoding.UTF7;
            else
                return fileEncoding.Unknown;
        }
        

得到文件的相应编码类型后,我们就可以转换为.net里的 System.Text.Encoding了。

/// <summary>
        /// 转换 fileEncoding enum 为 System.Text.Encoding
        /// </summary>
        /// <param name="fe">自定义 编码 enum</param>
        /// <returns></returns>
        private Encoding FileEnCoding(fileEncoding fe)
        {
            Encoding e = Encoding.Default;
            switch (fe)
            { 
                case fileEncoding.UTF8:
                    e = Encoding.UTF8;
                    break;
                case fileEncoding.UTF16BigEndian:
                case fileEncoding.UTF16LittleEndian:
                    e = Encoding.Unicode;
                    break;
                case fileEncoding.UTF32BigEndian:
                case fileEncoding.UTF32LittleEndian:
                        e = Encoding.UTF32;
                    break;
                case fileEncoding.UTF7:
                    e = Encoding.UTF7;
                    break;
            }
            return e;
        }

OK,至此我们就得到文件的相应编码了。

posted @ 2010-05-25 10:08 adpost 阅读(174) 评论(1) 编辑

2008年12月31日

Ctrl+m+Crtr+o折叠所有大纲
Ctrl+M+Crtr+P: 停止大纲显示
Ctrl+K+Crtr+C: 注释选定内容
Ctrl+K+Crtr+U: 取消选定注释内容
Ctrl+J : 列出成员 智能感知Shift+Alt+Enter: 切换全屏编辑
Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签
Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)
Ctrl+Shift+V: 剪贴板循环
Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态

Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本
Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写代码快捷键
Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息
Ctrl+K,I: 快速信息Ctrl+E,U / Ctrl+K,U: 取消选定注释内容
Ctrl+K,M: 生成方法存根
Ctrl+K,X: 插入代码段
Ctrl+K,S: 插入外侧代码
F12: 转到所调用过程或变量的定义窗口快捷键Ctrl+W,W: 浏览器窗口
Ctrl+W,S: 解决方案管理器
Ctrl+W,C: 类视图
Ctrl+W,E: 错误列表
Ctrl+W,O: 输出视图
trl+W,P: 属性窗口
Ctrl+W,T: 任务列表
Ctrl+W,X: 工具箱
Ctrl+W,B: 书签窗口
Ctrl+W,U: 文档大纲
Ctrl+D,B: 断点窗口
Ctrl+D,I: 即时窗口
Ctrl+Tab: 活动窗体切换
Ctrl+Shift+N: 新建项目
Ctrl+Shift+O: 打开项目
Ctrl+Shift+S: 全部保存
Shift+Alt+C: 新建类
Ctrl+Shift+A: 新建项
Shift+Alt+Enter: 切换全屏编辑
Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签
Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)
Ctrl+Shift+V: 剪贴板循环
Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+M,P: 停止大纲显示
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本
Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写

posted @ 2008-12-31 17:36 adpost 阅读(28) 评论(0) 编辑

2008年12月26日

  本文介绍了几个比较典型的服务器评测软件,无论什么评测工具,基本的技术都是利用线程技术模仿和虚拟用户,在这里主要的难点在于测试脚本的编写,每种工具使用的脚本都不一样,但是大多数工具都提供录制功能就算是不会编码的测试人员同样可以测试。众所周知,服务器是整个网络系统和计算平台的核心,许多重要的数据都保存在服务器上,很多网络服务都在服务器上运行,因此服务器性能的好坏决定了整个应用系统的性能。现在市面上不同品牌、不同种类的服务器有很多种,用户在选购时,仅仅从配置上判别是不够的,最好能够通过实际测试来筛选,下面就介绍一些较典型的测试工具:

  (一)服务器整机系统性能测试工具

  一台服务器系统的性能可以按照处理器、内存、存储、网络几部分来划分,而针对不同的应用,可能会对某些部分的性能要求高一些。

  Iometer(www.iometer.org):存储子系统读写性能测试

  Iometer是Windows系统下对存储子系统的读写性能进行测试的软件。可以显示磁盘系统的最大IO能力、磁盘系统的最大吞吐量、CPU使用率、错误信息等。用户可以通过设置不同的测试的参数,有存取类型(如sequential ,random)、读写块大小(如64K、256K),队列深度等,来模拟实际应用的读写环境进行测试。Iometer操作简单,可以录制测试脚本,可以准确有效的反映存储系统的读写性能,为各大服务器和存储厂商所广泛采用。

  Sisoft Sandra(www.sisoftware.co.uk):WINDOWS下基准评测

  SiSoft发行的Sandra系列测试软件是Windows系统下的基准评测软件。此软件有超过三十种以上的测试项目,能够查看系统所有配件的信息,而且能够对部分配件(如CPU、内存、硬盘等)进行打分(benchmark),并且可以与其它型号硬件的得分进行对比。另外,该软件还有系统稳定性综合测试、性能调整向导等附加功能。Sisoft Sandra软件在最近发布的Intel bensley平台上测试的内存带宽性能并不理想,不知道采用该软件测试的FBD内存性能是否还有参考价值,或许软件应该针对FBD内存带宽的测试项目做一个升级。

  Iozone(www.iozone.org):linux下I/O性能测试

  现在有很多的服务器系统都是采用linux操作系统,在linux平台下测试I/O性能可以采用iozone。 iozone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能。可以测试Read, write, re-read, re-write, read backwards, read strided, fread, fwrite, random read, pread ,mmap, aio_read, aio_write 等等不同的模式下的硬盘的性能。测试所有这些方面,生成excel文件,另外, iozone还附带了用gnuplot画图的脚本。该软件用在大规模机群系统上测试NFS的性能,更加具有说服力。

  Netperf(www.netperf.org):网络性能测试

  Netperf可以测试服务器网络性能,主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多块的速度接收数据。Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是 netperf,用来向server发起网络测试。在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果;在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,用来来回传递着特殊的流量模式,以测试网络的性能。对于服务器系统来说,网络性能显得尤其重要,有些服务器上为了节省成本,采用了桌面级的网络芯片,性能怎样,用这个软件一测便知了。以上介绍的这几款测试工具都是可以免费从网上下载的非商业软件,但是其测试结果和认可程度均是为大多数使用者所认同的。你可以根据自己的应用需求选择不同的软件进行测试。

  (二)针对应用的测试工具

  随着web应用的增多,服务器应用解决方案中以Web为核心的应用也越来越多,很多公司各种应用的架构都以web应用为主。一般的web测试和以往的应用程序的测试的侧重点不完全相同,在基本功能已经通过测试后,就要进行重要的系统性能测试了。系统的性能是一个很大的概念,覆盖面非常广泛,对一个软件系统而言包括执行效率、资源占用率、稳定性、安全性、兼容性、可靠性等等,以下重点从负载压力方面来介绍服务器系统性能的测试。系统的负载和压力需要采用负载测试工具进行,虚拟一定数量的用户来测试系统的表现,看是否满足预期的设计指标要求。负载测试的目标是测试当负载逐渐增加时,系统组成部分的相应输出项,例如通过量、响应时间、CPU负载、内存使用等如何决定系统的性能,例如稳定性和响应等。负载测试一般使用工具完成,有 LoadRunner,Webload,QALoad等,主要的内容都是编写出测试脚本,脚本中一般包括用户常用的功能,然后运行,得出报告。使用压力测试工具对web服务器进行压力测试。测试可以帮助找到一些大型的问题,如死机、崩损、内存泄漏等,因为有些存在内存泄漏问题的程序,在运行一两次时可能不会出现问题,但是如果运行了成千上万次,内存泄漏得越来越多,就会导致系统崩滑。

  Loadrunner:预测系统行为和性能的负载测试工具

  目前,业界中有不少能够做性能和压力测试的工具,Mercury(美科利)Interactive公司的LoadRunner是其中的佼佼者,也已经成为了行业的规范,目前最新的版本8.1。LoadRunner 是一种预测系统行为和性能的负载测试工具,通过模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试,LoadRunner 适用于各种体系架构,能支持广范的协议和技术(如Web、Ftp、Database等),能预测系统行为并优化系统性能。它通过模拟实际用户的操作行为和实行实时性能监测,来帮助您更快的查找和发现问题。Loadrunner是一个强大有力的压力测试工具,它的脚本可以录制生成,自动关联。测试场景面向指标,实现了多方监控。而且测试结果采用图表显示,可以自由拆分组合。通过Loadrunner的测试结果图表对比,你可以寻找出系统瓶颈的原因,一般来说可以按照服务器硬件、网络、应用程序、操作系统、中间件的顺序进行分析。

  Webload:WEB性能压力测试

  webload是RadView公司推出的一个性能测试和分析工具,它让web应用程序开发者自动执行压力测试;webload通过模拟真实用户的操作, 生成压力负载来测试web的性能。用户创建的是基于javascript的测试脚本,称为议程agenda,用它来模拟客户的行为,通过执行该脚本来衡量 web应用程序在真实环境下的性能。当前最高版本是6.0。webload提供巡航控制器cruise control的功能,利用巡航控制器,可以预定义web应用程序应该满足的性能指标,然后测试系统是否满足这些需求指标;cruise control能够自动把负载加到web应用程序,并将在此负荷下能够访问程序的客户数量生成报告。webload能够在测试会话执行期间对监测的系统性能生成实时的报告,这些测试结果通过一个易读的图形界面显示出来,并可以导出到excel和其他文件里。这两个软件的功能虽然强大,并且可以自动生成测试报告,但其终究是一个工具,如果你想真正的定位服务器性能的好坏和性能的瓶颈所在,需要使用工具的人对于测试软件的方方面面都要有了解,比如软件体系构架,网络拓扑,服务器硬件等知识。

posted @ 2008-12-26 11:52 adpost 阅读(583) 评论(0) 编辑