十二月
31

随机产生帐号信息

Author Dominic    Category dotNet     Tags ,

最近因为一个特定需要,需要产生大量帐号信息,要求是中文姓名需要随机产生,性别需要和姓名匹配,即男性姓名的性别需要是男性,女性姓名的性别需要是女性。参考wj2929兄弟的实现,我也做了一个。

首先,定义帐号实体:

   /// <summary>
    /// 账号基本信息
    /// </summary>
    public class AccountInfo
    {
        /// <summary>
        /// 账号中文姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 账号对应性别
        /// </summary>
        public Sex Sex { get; set; }
        /// <summary>
        /// 账号对应的登陆名称
        /// </summary>
        public string Account { get; set; }
        /// <summary>
        /// 账号人员出生日期
        /// </summary>
        public DateTime Birthday { get; set; }
        /// <summary>
        /// 账户人员居住地
        /// </summary>
        public string City { get; set; }
        /// <summary>
        /// 账户密码
        /// </summary>
        public string Password { get; set; }
    }

    public enum Sex
    {
        男, 女
    }

再分别定义姓氏、男性姓名、女性姓名,在随机产生一个性别,并在之后随机产生一个按照性别归类的姓名即可:

    /// <summary>
    /// 随机产生帐号信息
    /// </summary>
    public class RandomAccount
    {
        static string[] strSurname = {"", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "" };
        static string[] strBoyName ={"", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "广", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "" };
        static string[] strGirlName ={"", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "", "", "", "", "", "", "", "",
                               "", "", "" };

        /// <summary>
        /// 随机产生一个账号信息
        /// </summary>
        /// <returns>完整AccountInfo对象</returns>
        public static AccountInfo GetNew()
        {
            var accountInfo = GenerateName();
            accountInfo.Birthday = GenerateBirthday();
            accountInfo.City = GenerateCity();
            accountInfo.Password = GenerationPassword();
            return accountInfo;
        }
        /// <summary>
        /// 随机产生一个合法日期
        /// </summary>
        /// <returns></returns>
        private static DateTime GenerateBirthday()
        {
            var r = new Random();
            return new DateTime(r.Next(1960, 2008), r.Next(1, 12), r.Next(1, 32));
        }
        /// <summary>
        /// 随机产生居住地
        /// </summary>
        /// <returns>城市名称</returns>
        private static string GenerateCity()
        {
            return String.Empty;
        }
        /// <summary>
        /// 随机产生密码
        /// </summary>
        /// <returns></returns>
        private static string GenerationPassword()
        {
            return Guid.NewGuid().ToString().Substring(0, new Random().Next(6, 20));
        }

        /// <summary>
        /// 随机产生一个人名称
        /// </summary>
        /// <returns>AccountInfo对象</returns>
        private static AccountInfo GenerateName()
        {
            int nPername;
            string strFullName;
            var nRan = new Random();

            var nSurname = nRan.Next(0, strSurname.Length);
            var nNum = nRan.Next(2, 4);

            var nSex = nRan.Next(0, 2);

            var accountInfo = new AccountInfo();
            if (nSex == 0)
            {
                accountInfo.Sex = Sex.男;
                //rbMale.Checked = true;
                nPername = nRan.Next(0, strBoyName.Length);
                strFullName = strSurname[nSurname] + strBoyName[nPername];

                if (nNum == 3)
                {
                    nPername = nRan.Next(0, strBoyName.Length);
                    strFullName = strFullName + strBoyName[nPername];
                }
                accountInfo.Name = strFullName;
                //accountInfo.Account = Helper.ChineseSpell.MakeSpellCode(strFullName,0);
                //tbFullName.Text = strFullName;
            }
            else
            {
                accountInfo.Sex = Sex.女;
                //rbFemale.Checked = true;
                nPername = nRan.Next(0, strGirlName.Length);
                strFullName = strSurname[nSurname] + strGirlName[nPername];

                if (nNum == 3)
                {
                    nPername = nRan.Next(0, strGirlName.Length);
                    strFullName = strFullName + strGirlName[nPername];
                }
                accountInfo.Name = strFullName;
                //accountInfo.Account = Helper.ChineseSpell.MakeSpellCode(strFullName, 0);
                //tbFullName.Text = strFullName;
            }
            return accountInfo;
        }

    }

其中为了随机产生和姓名一致的帐号登陆名称,我用到了将汉字转化为拼音的一个类,这个类可以在cnblogs上面找到。

这样一个基本完整的帐号信息就产生了,在实际应用中,我还根据帐号名称检查了帐号是否存在,如果已经存在则在Account属性后面不上随机数字来保证帐号不重复。

十二月
25

原来耳机是需要煲的

Author Dominic    Category 生活叫吠     Tags

第一次听说好耳机是需要煲的,以下是转帖内容:

★为什么买到收的原装耳机音质不如人意呢??
配一副好耳机是理所当然的事,可是大家买回来一使用发现,并没有其它人评论的那么好,编开始怀疑自己买到的是不是假货,其实不然哦,真正的好耳机是需要一个听的过程,这个过程也就是我们常说的煲。耳机需要煲好比汽车刚买的时候需要磨合一样。

★煲耳机必须了解的问题!
煲耳机需要时间和一定的技巧,一般而言,如果用电脑声卡和收音机煲耳机的话,需要比较长的时间。而输出功率大的CD随身听来煲,时间要短一些,用调频煲也算是最方便的。
1)首先你需要一个可用来长时间放音的音源。
2)其次音源中要有频响范围很宽、动态效果舒缓、层次清晰、高中低音各成分适中的音乐,有这样效果的音乐要比一般音乐“煲”起来效果更明显【本文末有推荐音乐】。
3)还有一点就是音源输出功率一定要够大!CD煲比较好,但是CD煲耳机需要需要连续播放十几个小时左右,方法和MP3煲耳机的方法一样。
4)煲机还是分为舒筋、通络、习武、打擂、出道五步为好。以耳机为例:
 1、 舒筋——使用正常听音强度三分之一的音量驱动耳机12小时(用100~15000Hz/5s扫频信号更好);
 2、 通络——使用正常听音强度三分之二的音量驱动耳机12小时(用50~18000Hz/3s扫频信号更好);
 3、 习武——使用正常听音强度驱动耳机72小时(用20~20000Hz/2s扫频信号更好);
 4、 打擂——使用正常听音强度三分之四的音量驱动耳机24小时(用18~22000Hz/1s扫频信号更好);
 5、 出道——进入正常使用阶段。

★煲耳机的几种方法!
在这里给大家推荐几种煲的方法:
1)收音机煲法——最安全的煲耳机方法:
      使用调频收音机,把收音机调到一个没有信号的频道,音量控制在20以下。这个时候所发出的兹兹的声音相当于我们通常煲机所用的白噪音的碟。新耳机买回来大概需要每天煲上8个小时,持续一周到二周。虽然这种方法褒的方法比较慢,但是比较安全的。起码不至于因为操作不当把耳机煲坏。

2)MP3煲法——快的方法: 
MP3播放由于其本身构造的优势,便可以长时间的播放曲子。很适合煲耳机。
MP3煲—刚开始用轻柔一些的音乐,在较低音量下让耳机先舒缓10-30小时,然后用普通的音乐(摇滚、舞曲除外)在中等音量状态褒100-200小时;如果这时你听着高音不刺耳了,变得圆润自然,中音温暖亲切,低频再也不是混成一团的轰隆隆,而充满细节,那基本上是大功告成了。

2)CD煲法——快的方法:
CD煲机比较好,但是CD煲耳机需要需要连续播放十几个小时左右,方法、步骤和MP3煲耳机的方法一样。

4)其它煲法——不推荐!
软件:http://www.ukoo.net/bbs/viewthread.asp?tid=63855&highlight=%2Bnyx
  另外还有些人褒耳机喜欢用音频设备,例如电脑音响等。虽然这样可以使用一些特定的软件和特定的音碟。煲耳机煲的比较专业。但不推荐初学者使用这方法。因为现在返修的很多耳机都是在褒机的时候方法不当坏掉的。如果你身边有比较专业的人士,那你到可以尝试这类

★煲机音乐推荐!
     在这给大家推荐一些音乐。在人声来说。蔡琴的和王菲的声音都不错。推荐曲目有渡口,天空。沙拉.布莱曼《月亮女神》恩雅的音乐也不错。另外腾格尔的人声中气十足、爆发力极强也很适合煲机推荐曲目有天堂。类似老鹰的加洲旅馆比较经典的曲子也很合适。阎学敏《炎黄第一鼓》也是煲机的好碟,另外像惠威的试音碟曲目覆盖面很广 也非常合适用来煲耳机。
《TITANIC》电影原声CD中的第3段《SOUNTHAMPTON》、第9段《THE SINKING》和第10段《DEATH OF TITANIC》

主要内容转自:http://club.ccmove.com/nclub/topicdisplay-3475-1225878-1.html

PS:本来打算做到一个帖子也不转,只能尽量不转贴了。

十二月
23

虚拟化平台比较

Author Dominic    Category 系统应用     Tags ,

近日因为工作需要,准备测试虚拟化平台以便在行业内推广使用,在收集一些资料和聆听Citrix公司人员介绍之后对VMWare、Citrix、Microsoft公司的三个产品VI、XenServer、HyperV做了一个比较,具体比较文档在http://spreadsheets.google.com/ccc?key=pFJmhg0jNxG-730Ygr-dWLQ,可以看出,其实Microsoft公司的HyperV真的是一个不错的选择,HyperV本身只需要28美元,就200人民币左右。即使购买全套的管理工具,每个单台实体服务器投入也比Citrix少,更不用说昂贵的VMWare。而且XenServer和HyperV属于同源产品,优先选择测试HyperV吧。

五月
22

两网隔离情况下非法连接外网的检测

现在一些单位为了避免资料泄露,都实行了隔离外网的措施,但是这样的单位往往分支机构比较多,很难保证所有的下级分支机构不会自己接入光纤、开通ADSL,实际上造成了内网、外网两网隔离工作的失败。这里提出一个在两网隔离情况下非法连接外网的检测方法,这个也是一个08年工作内容之一的总结。

首先,我们需要向所有用户工作用机部署一个常态运行的软件,可以是桌面管理程序,也可以是其他均需要有的程序,我们在这个程序的基础上做一定的开发工作。

业务流程图如下:

外网检测业务流程图

首先在某个应用MIS中完成对部门、人员、IP段是否可以连通互联网的权限进行设置,有连通互联网权限的终端可以不做外网连接检测,相当于设置外网连接检测的免检名单。

根据设置的连接外网检测权限和系统设置的本地Web应用URL前缀、外连检测URL、外联检测程序尝试使用路由检测、IE历史记录检测、maxthon历史记录检测、Firefox历史记录检测、代理上网检测、其他常用网络软件检测等手段检测桌面终端和外网连通情况。这种方式避免传统靠检测附加硬件设备(判断是否存在Modem等)判定的方式的局限性,更为通用和有效。

路由检测法:尝试路由到指定IP,并获取返回的路由结果。判定给定网关前缀是否在路由链中,如果在则说明通过路由检测,否则说明存在连接外网行为。

IE历史记录检测:通过编程实现获取IE的浏览页面历史记录,并剔除URL前缀符合管理员设置的本地web应用URL(自动剔除file://开头的本地文件URL),形成桌面终端用户访问网页历史记录,判定用户是否访问外网。

Firefox历史记录检测:探测firefox路径,通过编程实现获取Firefox的浏览页面历史记录,并剔除URL前缀符合管理员设置的本地web应用URL(自动剔除file://开头的本地文件URL),形成桌面终端用户访问网页历史记录,判定用户是否访问外网。Firefox 的url历史记录,可参考firefox源代码或者处理local data 目录下\Mozilla\Firefox\Profiles\******.default\Cache下的文件。另外,在firefox下访问about:cache可以看到url访问历史记录。

直连及代理上网检测:在系统设定的外连检测url中挑选3~5条作为检测项。直接使用socket连接这些检测项的URL,如果能够正常返回数据,在检测返回的数据中是否包含检测项中指定的检测字符串,如果包含则说明该桌面终端连接到外网,如果连接URL是socket出现错误,则判定不能连接外网。读取注册表(HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\)中的ProxyEnable项,如果值为0或读取失败,则判定不能连接外网,如果值为非0值,读取ProxyServer的值,依次使用该值提供的代理设置,尝试使用代理连接这些检测项的URL,如果能够正常返回数据,在检测返回的数据中是否包含检测项中指定的检测字符串,如果包含则说明该桌面终端连接到外网,如果连接URL是socket出现错误,则判定不能连接外网。

其他常用网络软件检测:根据系统设定的外连检测程序,在系统的进程列表中检测是否存在管理员指定的进程,如果存在则判定连接外网。

其中每个检测所需要的参数均需要通过管理控制台来设置,在检测到有外网连接的时候,可以通过网管工具或者其他手段自动断开内网或者告警。

获取IE访问历史记录参考代码如下:

//Powered by fOx,转载请保留作者信息 : Email Destiny-fOx@hotmail.com
void GetUrlHistoryMethod2()
{
     HANDLE hFind = NULL;
     DWORD dwSize = NULL;
     hFind = ::FindFirstUrlCacheEntryA("visited:",NULL,&dwSize);
     HANDLE hHeap = ::HeapCreate(NULL,0x100,0x10000000);
     LPINTERNET_CACHE_ENTRY_INFOA pInfo = (LPINTERNET_CACHE_ENTRY_INFOA)::HeapAlloc(hHeap,LPTR,dwSize);
     hFind = ::FindFirstUrlCacheEntryA("visited:",pInfo,&dwSize);
     if(hFind)
     {
         int n = 0;
         while(pInfo != NULL)
         {
              /*
              typedef struct _INTERNET_CACHE_ENTRY_INFOA {
              DWORD dwStructSize;         // version of cache system.0
              LPSTR   lpszSourceUrlName;    // embedded pointer to the URL name string.4
              LPSTR   lpszLocalFileName;  // embedded pointer to the local file name.8
              DWORD CacheEntryType;       // cache type bit mask.C
              DWORD dwUseCount;           // current users count of the cache entry.10
              DWORD dwHitRate;            // num of times the cache entry was retrieved.
              DWORD dwSizeLow;            // low DWORD of the file size.
              DWORD dwSizeHigh;           // high DWORD of the file size.
              FILETIME LastModifiedTime;  // last modified time of the file in GMT format.
              FILETIME ExpireTime;        // expire time of the file in GMT format
              FILETIME LastAccessTime;    // last accessed time in GMT format
              FILETIME LastSyncTime;      // last time the URL was synchronized
              // with the source
              LPSTR   lpHeaderInfo;        // embedded pointer to the header info.
              DWORD dwHeaderInfoSize;     // size of the above header.
              LPSTR   lpszFileExtension;  // File extension used to retrive the urldata as a file.
              union {                     // Exemption delta from last access time.
              DWORD dwReserved;
              DWORD dwExemptDelta;
              };                          // Exemption delta from last access
              } INTERNET_CACHE_ENTRY_INFOA, * LPINTERNET_CACHE_ENTRY_INFOA;
              */
              LPBYTE p = (LPBYTE)(pInfo->lpHeaderInfo);
              p += *(PWORD)p;
              if(p != NULL)
                   if(p[2] != 0x10)
                       p = NULL;
                   else
                   {
                       if(p[3] == 0x1F)
                            p += 4;
                       else
                            p = NULL;
                   }
              printf("[%d] SourceUrlName : %s ,LocalFileName : %s Title : %S \r\n"
                   ,n,pInfo->lpszSourceUrlName,pInfo->lpszLocalFileName,p);
              n++;
              pInfo = NULL;
              dwSize = 1000;
              pInfo = (LPINTERNET_CACHE_ENTRY_INFOA)::HeapAlloc(hHeap,LPTR,dwSize);

              if(pInfo == NULL)
              {
                   DWORD dwError = ::GetLastError();
                   printf("HeapAlloc Error : %d\r\n",dwError);
              }
              BOOL bSus = ::FindNextUrlCacheEntryA(hFind,pInfo,&dwSize);
              if(bSus == FALSE)
              {
                   pInfo = NULL;
                   DWORD dwError = ::GetLastError();
                   printf("Error : %d\r\n",dwError);
              }
         }
         ::FindCloseUrlCache(hFind);
         ::HeapDestroy(hHeap);
     }
}
四月
1

推荐使用VSTS Web Access 2008替代团队浏览器完成大部分工作

公司开始启用VSTS来管理整个开发过程,在我要求下我负责的项目开始使用VSTS来管理Bug,在录入Bug和管理Bug过程中要启动我的VS 2008来操作Bug,内存消耗比较大,而且使用也不是太方便,在我建议下,VSTS项目组原本开发一个Bug录入工具,结果我在微软网站上发现了Visual StudioTeam System  2008  的简体中文版(发布时间2008/3/6),这下可好了,可以使用Web的方式访问TFS服务了。相关信息页面:http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=c568fba9-3a62-4781-83c6-fdfe79750207

Web Access 2008是可自定义的 Web 接口,可用于访问 Team Foundation Server 项目数据。它用作 Team Foundation Server 的客户端,并提供可通过团队资源管理器客户端使用的大多数(但不是全部)功能。 Web Access 还引入了一些新功能,如数据访问限制和文本搜索。

Team System Web Access 2008需要.net 2.0和IIS 6.0(7.0)环境,并且需要在安装Team System Web Access 2008的服务器上面安装 2008,可以和TFS 2005、TFS 2008协同工作(公司目前是TFS 2005),具体安装请参考:http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=c568fba9-3a62-4781-83c6-fdfe79750207#Instructions

安装完成登录之后主界面如下图:

主页截图

  从主界面截图可以看出,通过这个Team System Web Access 2008可以完成工作项的管理,查看报表,浏览版本控制库并下载文件,查看变更集、差异、历史记录和标注视图,管理文档和生成,最重要的是支持对工作项的搜索功能。

Bug录入界面如下图:

bug录入界面

  添加连接界面

而在Team Explorer 2008Bug录入界面如下:

团队浏览器Bug录入界面

Team System Web Access 中的Bug录入实在是强太多,Team Explorer 2008 中症状输入框实在是太小了(一般我们症状输入的文字会多于重现步骤),而且症状和重现步骤都不可以直接使用RichText或者HTML编辑(从Web页直接拷贝后好难编辑)。Team System Web Access 中症状和重现步骤完全支持简单的HTML代码编辑还是可视化编辑,更强的是,在Team System Web Access 中,可以添加附件上传图片,然后直接在症状中引用,非常直观。

而且在关联工作项方面做得非常人性化,如果某个工作项存在关联工作项,会在工作项列表中的记录前面显示一个+号图片可以展开来查看关联工作项。

Team System Web Access 中一个更直观的表示是在一个Bug经过几个状态的流转后,在Bug的历史记录里面会显示一个状态流转图,非常直观,如下:

历史记录中的状态图

整体来说如果不是需要在Visual Studio中使用团队浏览器作为源代码管理的话,一般这个Team System Web Access 会比Team Explorer 方便,经过简单实用,总结了几点Team System Web Access 的优缺点:

1、Team System Web Access 不需要使用者安装任何东西

2、Team System Web Access 使用了可视化编辑器,输入的文本更好看,而且添加的附件可以直接在其他地方引用

3、Team System Web Access 可以很方便地完成Team Explorer的大部分工作,源代码管理稍显不便

4、Team System Web Access 可以对多个工作项进行批量编辑

5、Team System Web Access 易用性要比Team Explorer好很多

6、Team System Web Access 针对工作项搜索功能非常方便

7、Team System Web Access 记录了最近操作,而且左侧快捷菜单会根据使用情况动态调节,可隐藏左侧菜单区

8、Team System Web Access 集成性非常好,集成了Team Explorer和Sharepoint常用功能

9、Team System Web Access 中指派给下拉框不能直接输入人员姓名,得手工选择,而Team Explorer可以

10、Team System Web Access 的搜索功能需要较慢

总之,不是在开发过程中使用源代码管理和构建,其他工作都建议通过Team System Web Access 完成,Team System Web Access 非常适合于系统分析人员、黑盒测试人员,项目经理、产品经理、公司领导层等不在Visual stdio 开发工具中使用的角色。

Team System Web Access 2008直接下载地址:http://download.microsoft.com/download/4/9/2/49277346-839b-4c02-b21e-87be90b43da0/TeamSystemWebAccess.msi

相关资源:

Team System Web Access 入门:http://msdn2.microsoft.com/zh-cn/library/bb822319.aspx

使用 Team System Web Access:http://msdn2.microsoft.com/zh-cn/library/bb822087.aspx

Team System Web Access 论坛:http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=1466&SiteID=1

Brian Harry 的博客:http://blogs.msdn.com/bharry/

Buck Hodges 的博客:http://blogs.msdn.com/buckh/

Hakan Eskici 的博客:http://blogs.msdn.com/hakane/

三月
28

Xoops中获取模块配置参数的方法。

Author Dominic    Category XOOPS     Tags ,

Xoops群(53219504,17380705)中有人询问在开发的时候,怎样获取在xoops_version.php中添加的参数值。其实Xoops中统一管理模块的参数是非常好的一种做法(将在下一个平台性项目中借鉴这个做法),获取的方法也非常简单,针对不同的情况可以分别实现如下:

1、更改现有模块代码,且现有模块代码中包含了全局性变量$xoopsModuleConfig的情况

这种情况比较简单:

global $xoopsModuleConfig;
$configvalue=$xoopsModuleConfig["xxxx"];
//xxxx为xoops_vesion.php中定义的参数对应名称

2、现有模块代码中不包含$xoopsModuleConfig或者自行开发简单模块且不使用Framework

$module_handler = &_gethandler('module');//获取module句柄$module_handler
$module = $module_handler->getByDirname("xxx");//xxx为模块目录名称,获取特定module操作句柄$module
$config_handler = &xoops_gethandler('config');//获取config的句柄$config_handler
$criteria = new CriteriaCompo(new Criteria('conf_modid', $module->getVar('mid')));// 根据上述module的id构建查询参数$criteria
$configs =& $config_handler->getConfigs($criteria);//用config句柄获得特定module的参数配置结果集

foreach(array_keys($configs) as $i)
{
$moduleConfig[$configs[$i]->getVar('conf_name')] = $configs[$i]->getConfValueForOutput();//转化成数组
}
unset($configs);

之后直接使用$moduleConfig['xxxx']就可以访问了,也可以把$moduleConfig设置为全局变量。

3、使用Framework的模块

load_functions("config");
$moduleConfig = mod_loadConfg("moduledirname");

使用Framework的情况可以参考article中代码。

三月
28

Linux下获取空闲内存和内存使用率的方法

Author Dominic    Category linux     Tags

一项目基于linux开发,包含一个服务器状态监视的功能,一个兄弟完成该功能之后显示内存占用率一直保存在94%以上,虽然测试机只有512M内存,但也不至于空闲内存如此之少,内存使用率如此之高呀,测试人员在提出这个问题之后,那兄弟还搪塞测试人员:linux就这样,内存使用方式和windows不同。

分析了一下这个系统的代码,他从/proc/meminfo中直接读取了MemFree对应的值,直接导致空闲内存不对,内存使用率当然也不对,在Linux下正确获取空闲内存的方法应当如下:

1、读取/proc/meminfo文件,结果如下:

MemTotal:       515880 kB
MemFree:         12748 kB
Buffers:         20768 kB
Cached:         190328 kB
SwapCached:      91920 kB
Active:         349272 kB
Inactive:       119392 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       515880 kB
LowFree:         12748 kB
SwapTotal:      891568 kB
SwapFree:       646656 kB
Dirty:             208 kB
Writeback:           0 kB
AnonPages:      246588 kB
Mapped:          62140 kB
Slab:            25504 kB
SReclaimable:    12256 kB
SUnreclaim:      13248 kB
PageTables:       2592 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   1149508 kB
Committed_AS:   935784 kB
VmallocTotal:   507896 kB
VmallocUsed:      3576 kB
VmallocChunk:   504176 kB

2、MemTotal值作为总内存

3、空闲内存计算方式:如果Cached值大于MemTotal值则空闲内存为MemFree值,否则空闲内存为MemFree值+Buffers值+Cached值

4、内存使用率为:空闲内存/总内存*100%。

三月
5

用VS 2008开发Silverlight1.0程序的问题(模板和智能感知)

Author Dominic    Category dotNet, 软件应用     Tags ,

买了本章立民的Silverlight书,里面用的是Silverlight1.0,可本机安装的是VS 2008,微软网站上的Silverlightv1.0SDK.msi里面只有给VS 2005用的模板,直接导致在VS 2008中不能直接根据模板新建Silverlight的项目,而虽然目前已经有了VS 2008开发Silverlight2.0的教程但是还是没有关于Silverlight2.0的任何下载,而Silverlight1.1只有alpha版,安装Silverlight1.1 SDK和Tools for ,竟然需要手工卸载Silverlight1.0,太麻烦了。想到之前解决VS中某个项目模板的问题,找到了在VS 2008下新建Silverlight1.0项目的方法,顺便搞定了这种状况下的XAML智能感知(intellisense)的问题。

从其他机器安装了VS 2005的机器上面安装Silverlight 1.0 SDK,在C:\Documents and Settings\[登录名]\My Documents\Visual Studio 2005\Templates\ProjectTemplates\Visual C#目录下的SilverlightJSApplication.zip拷贝出来,最后复制到安装VS 2008机器上的C:\Documents and Settings\[登录名]\My Documents\Visual Studio 2008\Templates\ProjectTemplates\Visual C#目录下Silverlight目录(需要手工建立)中,如果是在Vista下则目录结构前缀有所不同。重启VS 2008即可在新建项目Visual C#节点下看到Silverlight项目模板“ JavaScript Application”了。

新建Silverlight Javascript Application

这种情况下,VS 2008默认的WPF编辑器还没有对Silverlight文件XAML提供intellisense功能,现在没有智能感知功能怎么编程呀,可以利用VS 2008提供的XML编辑器中有intellisense功能来暂时解决一下这个问题,操作方法是:在解决方案资源管理器中选中一个XAML文件(如Scene.xaml),在右键菜单中选择“打开方式”菜单,在弹出来的打开方式对话框中选中“XML编辑器”,并点击右侧的“设为默认值”按钮,确定即可,再编辑xaml文件看看有没有intellisense功能。

更改XAML默认打开方式 

SilverlightJSApplication.zip下载

Silverlightv1.0SDK.msi下载

http://download.microsoft.com/download/e/c/8/ec8e1688-7740-4d0a-9563-476adb8034fa/Silverlightv1.0SDK.msi

二月
22

网线布线与Vista

Author Dominic    Category 系统应用     Tags ,

部门搬迁到新办公地点办公,室内网络也是新布线的。办公室里面就我一个人用Vista,结果出现了一个非常奇怪的现象:把网线和笔记本连接之后,是不是会出现不能正常连接的情况,网络连接里面显示“网络线缆被拔出”,过完年之后就一直这样,郁闷坏了。

用测线仪检测,再插上网线,又好了,过一会儿又不行了,如此反复,排查了操作系统、防火墙等等,终于发现问题出现在网线布线上。

大家知道,网线8根线中有两根接地线,这两根可以当作电话的音频线一起部署在信息点,这样部署后计算机会显示出10M网络,布线人员常常用这个方法来减少布线量。问题就出在这里,更改这两根接地线用途之后,故障消失。

非常奇怪的是这种常见的网线布线方式在Win98、Win2k/2k3、WinXP下都没有问题,独独在我的Vista下面出现问题,不知道是不是所有的Vista都有这个问题。如果也这样不放试试看不要一线多用。

一月
29

新装Ubuntu Server版用户安全优化

Author Dominic    Category linux, 网站管理     Tags ,

使用Ubuntu Server版安装LAMP server之后,Ubuntu给系统添加了一些不必要的用户,多余的用户在会给黑客留下获取shell的可能性,关闭不必要的用户shell使用权限在一定程度上可以加固Ubuntu服务的安全性。

安装完成后默认/etc/passwd文件内容如下:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
syslog:x:101:102::/home/syslog:/bin/false
klog:x:102:103::/home/klog:/bin/false
mysql:x:103:104:MySQL Server,,,:/var/lib/mysql:/bin/false
admin:x:1000:1000:Administrator,,,:/home/admin:/bin/bash

具体内容根据选择安装的服务不同而不同。Ubuntu默认创建了20多个帐号,大部分人并不知道这些帐号的具体用途,其中有几个帐号对于一个web服务器来说一般是不必要,可以通过更改shell的方式禁用这些帐号的登录(/bin/false):

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/false
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/false
mail:x:8:8:mail:/var/mail:/bin/false
news:x:9:9:news:/var/spool/news:/bin/false
uucp:x:10:10:uucp:/var/spool/uucp:/bin/false
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/false
irc:x:39:39:ircd:/var/run/ircd:/bin/false
nobody:x:65534:65534:nobody:/nonexistent:/bin/false

syslog:x:101:102::/home/syslog:/bin/false
klog:x:102:103::/home/klog:/bin/false
mysql:x:103:104:MySQL Server,,,:/var/lib/mysql:/bin/false
admin:x:1000:1000:Administrator,,,:/home/admin:/bin/bash

当然,如果相关服务是需要用到的服务,就不要更改shell了。

专题推荐

标签

分类目录

新浪微博

存档

近期文章

近期评论

友情链接

分享按钮