最近看到一个SQL Server的小例子,发现完全可以作为SQL server的一道入门面试题。题目如下: 例:有一合同表Contract Id Name Total buget 1 合同名称 100 102,22 2 合同名称2 300 ,102,22, 3 合同名称3 200 103,23, 要求:用SQL语句更新表的buget字段,如果前后没有”,”要加上”,”(即一个英文逗号)。(10分) 创建表数据: View Code use Testdb2 go IF NOT OBJECT_ID(‘[Contract]‘) ISNULL DROPTABLE [Contract] GO Createtable [Contract] (ID intprimarykey identity(1,1) ,[Name] nvarchar(50) null ,Total floatnull ,buget Nvarchar(500) null ) go insertinto [Contract] select‘合同名称’, 100,’102,22′ unionall select‘合同名称2′, 300,‘,102,22,’ unionall select‘合同名称3′, 300,’101,23,’ 分析:这道题乍看很简单,由于肯定用到Replace,所以很自然的结合left,right,从而得到以下语句 方法一: update [Contract] set buget=‘,’+buget whereleft(buget,1)=‘,’ update [Contract] set buget=buget+‘,’whereright(buget,1)=‘,’ 如果能写成一个 SQL语句,可以加1分。 update [Contract] set buget=(casewhen (left(buget,1)!=‘,’andright (buget,1)!=‘,’) then‘,’+buget+‘,’ whenleft(buget,1)!=‘,’then‘,’+buget whenright(buget,1)!=‘,’then buget+‘,’ else buget end) 如果能从字符串的开关和结尾这个思路出发,结合Reverse,可以提到如下方法: 方法二: update [Contract] set buget=‘,’+buget where charindex(‘,’,buget)<>1 update [Contract] set buget=buget+‘,’where charindex(‘,’,reverse(buget))<>1 该方法,主要涉及charindex函数和reverse函数。 说实话,我当时就这两种思路,这也是SQL中常见的基本用法。但出人意料的第三种方法出现了。 方法三: UPDATE [contract] SET Buget = ‘,’+Buget+‘,’ UPDATE [contract] SET Buget = REPLACE(Buget,‘,,’,‘,’) 解析:该方法最主要的亮点不在于语法的精妙,而在于其思路的异于常规。先给两边补上逗号,再替换双逗号为单逗号。这在实际编程中确实难能可贵。换句话说,如果没有事先思考过的话,这反映了解题者反应敏捷,思路开放。因此,至少可以再加3分。 当然,此语句其实还是有bug,比如如果原bug字段中间有两个逗号,那么在Replace时就会更新掉不应该更新的内容。不过,稍加修正,限定replace的范围即可, 受此思路启发,可以引申得到以下类似方法: 方法四: UPDATE [contract] SET Buget = substring(BuGet,2,len(BuGet)-1) wherecharindex(‘,’,buget)=1 UPDATE [contract] SET Buget = substring(BuGet,1,len(BuGet)-1) wherecharindex(‘,’,reverse(buget))=1 UPDATE [contract] SET BuGet = ‘,’+BuGet+‘,’ 该方法是先去掉两边的逗号,再给每条记录加上逗号,比起方法三来,稍显繁琐,这也反衬了方法三的巧妙。 当然,也可以结合前面的思路稍作修正,这里就不再赘述,请读者自己思考。 感悟:释迦牟尼说过“人生需要经过六项修炼:布施、持戒、忍辱、精进、禅定、智慧。”,SQL编程,或C#、Java,甚至Javascrip的某个领域也是如此。技术是死的,思路是鲜活的,有时候,思路能轻易地突破技术很难实现的死角。到了一定程度时,会发现潜意识里已经被惯性思维塞满,而无法接受新鲜思维方式或思路,如果一段时间内持续如此,那么,我们应该警醒,把自己的头脑放空,把自己置于一个初学者的地位,重新开始“精进”的修炼! 原文链接:http://www.cnblogs.com/downmoon/archive/2011/03/02/1968615.html
View Details首先进入dos模式下输入: 1.cd C:\Program Files\MySQL\MySQL Server 5.5\bin 2.mysql -h127.0.0.1(你要访问的主机的地址) -uroot(用户名) -proot(密码) 3.show variables like ‘character%’; 这样就完成了对你的mysql里的编码格式的查看了,如果你想修改,继续执行下面的步骤: 打开mysql安装目录,里面有个my.ini文件,打开这个文件,里面有两处字符集的设置,默认是拉丁,建议你所想改的,如:utf8或gbk 然后启动mysql服务,以后创建的数据库默认字符集就是ok了 (重启时,打开MySQLAdministrator的Service Control进行操作就可以了。)
View Details给定N个整数,请使用冒泡算法按照从大到小的顺序排序 1.可对N个整数的某一段(连续的M整数)排序 2.要求具有一定的可测试性 3.C#语言 ——————-- 思路: 1.冒泡算法 2.针对部分排序 3.可测试性 先上一段最简单的代码实现冒泡算法--这里错误的使用了选择排序,请参看改进版本的修正 int[] list= new int[] {1, 2, 3, 4, 5}; for (int i=0;i<list.Length;i++) for (int j=i+1;j<list.Length;j++) { if (list[i]<list[j]) { int tmp=list[i]; list[i]=list[j]; list[j]=tmp; } } for (int i=0;i<list.Length;i++) System.Console.Write("{0}\t",list[i]); System.Console.WriteLine(""); 观看上述代码,有如下发现 1)行1,主要进行数据的初始化工作,准备数据 2)行2-11,主要实现冒泡排序算法 3)行12-14,主要是显示结果 4)行1-14,包含算法实现,调用,实现和使用糅合在一起 第一次改进: 1)数据初始化部分,其实属于调用部分,此时用的是数组,扩展性较差,这里改成List<int>,并将此步重构成函数 //初始化N个数据void Init(List<int> list,int count){ System.Random a=new Random(); for (int i=0;i<count;i++) list.Add(a.Next(100));} 这里初始化数据,主要是减少人工干预,自动产生测试数据,实际生产过程中,是需要按照实际情况,选取一些比较特殊的数据作为测试数据的. 2)冒泡排序算法实现过程部分,也可以重构成函数 //实现冒泡算法——这里错误的使用了选择排序 void Bubble(List<int> list) { for (int i=0;i<list.Count;i++) for (int j=i+1;j<list.Count;j++) { if (list[i]<list[j]) { int tmp=list[i]; list[i]=list[j]; list[j]=tmp; } } } 正确的冒泡排序为 void Bubble(List<int> list) { bool bFlag=false; for (int i=0;i<list.Count;i++) { bFlag=false; for(int j=list.Count-1-1 ;j>i-1;j--) { if (list[j]<list[j+1]) { int tmp=list[j+1]; list[j+1]=list[j]; list[j]=tmp; bFlag=true; } } if (!bFlag) break; } } 将排序的代码,重构成函数,使得算法可以非常容易进行测试,只需要将精心设计的测试数据传给函数,就可以了 3)显示结果,也是重构成函数 //显示结果 void Print(List<int> list) { for (int i=0;i<list.Count;i++) System.Console.Write("{0}\t",list[i]); System.Console.WriteLine(""); } 4)最终调用过程 public static void Main(){ List<int> list=new List<int>(); //产生测试数据 Init(list,8); //打印测试数据 Print(list); //按照从大到小的顺序排序 Bubble(list); //打印排序后的结果 Print(list); } 第二次改进: 第一次改进中,基本解决冒泡算法和可测试性的问题,但是还有一个重要问题没有解决,就是针对N个整数中的某一段连续M个数据进行排序,所以这次的改进主要集中在<冒泡排序算法实现>函数的改进 很明显,要实现这个功能,只需要,在 Bubble这个函数增加两个参数,标识出M的上下限,Bubble变成如下形式
1 |
<span style="color:#0000FF;">void</span> Bubble(List<<span style="color:#0000FF;">int</span>> list,<span style="color:#0000FF;">int</span> low,<span style="color:#0000FF;">int</span> high) |
新的实现(注意,这里我的冒泡算法的实现是不对的,我用的是选择排序,经过一个园子里的兄弟提醒,我查过资料,发现的确用错了) 选择排序(Selection sort) 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 void Bubble(List<int> list,int low,int high){ int iHigh= list.Count<high+1? list.Count : high+1 ; int iLow=low<0? 0 :low ; //System.Console.WriteLine("{0}\t{1}",iLow,iHigh); for (int i=iLow;i<iHigh;i++) for (int j=i+1;j<iHigh;j++) { if (list[i]<list[j])//比较不一定相邻 { int tmp=list[i]; list[i]=list[j]; list[j]=tmp; } } } 下面是更正后的冒泡排序代码 冒泡排序(BubbleSort) 依次比较相邻的两个数,将小数放在前面,大数放在后面。 static void Bubble(List<int> list,int low,int high) { int iHigh= list.Count<high+1? list.Count : high+1 ; int iLow=low<0? 0 :low ; bool bFlag=false; for (int i=iLow;i<iHigh;i++) { bFlag=false; for(int j=iHigh-1-1 ;j>i-1;j--) { if (list[j]<list[j+1])//比较相邻 { int tmp=list[j+1]; list[j+1]=list[j]; list[j]=tmp; bFlag=true; } } if (!bFlag) break; } } 并提供一个重载函数
1 |
<span style="color:#0000FF;">void</span> Bubble(List<<span style="color:#0000FF;">int</span>><span style="color:#000000;"> list)<br /></span><span style="color:#000000;">{ <span style="color:#008080;"> <br /></span></span>Bubble(list,<span style="color:#800080;">0</span><span style="color:#000000;">,list.Count-1);<br /></span>} |
调用: public static void Main() { List<int> list=new List<int>(); //产生测试数据 Init(list,8); //打印测试数据 Print(list); //按照从大到小的顺序排序,针对序号2-5的之间的数据 Bubble(list,2,5); //打印排序后的结果 Print(list); } 至此,题目要求的目的全部达到,不过还是少了点什么,下面进行第三次改进 第三次改进: 第一次改进和第二次改进的结果,还是采用面向过程的方法,第三次改进侧重与面向对象的方法,就是封装 三个主要函数中都有List<int> list参数,这个是主要数据,我们用类来封装它,如下给出完整代码 public class BubbleSort { List<int> _list; public BubbleSort() { _list=new List<int>(); } public BubbleSort(List<int> list) { _list=list; } public void Sort() { Sort( _list,0,_list.Count-1); } public void Sort(int low,int high) { Sort( _list,low,high); } //实现冒泡算法--这里错误使用选择排序,请替换为第二次改进中的正确实现 public void Sort(List<int> list,int low,int high) { //int iHigh= list.Count<low+count? list.Count : high ; int iHigh= list.Count<high+1? list.Count : high+1 ; int iLow=low<0? 0 :low ; //System.Console.WriteLine("{0}\t{1}",iLow,iHigh); for (int i=iLow;i<iHigh;i++) for (int j=i+1;j<iHigh;j++) { if (list[i]<list[j]) { int tmp=list[i]; list[i]=list[j]; list[j]=tmp; } } } //初始化N个数据 public void Init(int count) { _list.Clear(); System.Random a=new Random(); for (int i=0;i<count;i++) _list.Add(a.Next(100)); } //显示结果 public void Print(List<int> list) { Print(list,0,list.Count-1,true); } public void Print(List<int> list,int low,int high,bool IsNewLine) { int iHigh= list.Count<high+1? list.Count : high+1 ; int iLow=low<0? 0 :low ; for (int i=iLow;i<iHigh;i++) System.Console.Write("{0}\t",list[i]); if (IsNewLine) System.Console.WriteLine(""); } public void Print(int low,int high,bool IsNewLine) { Print(_list,low,high,IsNewLine); } //将排序的M个数据用红色显示 public void Print(int low,int high) { Print(0,low-1,false); System.Console.ForegroundColor=ConsoleColor.Red; Print(low,high,false); System.Console.ResetColor(); Print(high+1,_list.Count,true); } public void Print() { Print(_list); } //for test public void Test() { //产生测试数据 Init(10); //打印测试数据 Print(); //按照从大到小的顺序排序 int[] iLowHigh=new int[]{4,7}; Sort(iLowHigh[0],iLowHigh[1]); //Sort(-1,8); //Sort(0,18); //Sort(-1,18); //打印排序后的结果 //Print(); Print(iLowHigh[0],iLowHigh[1]); } } 调用代码:
1 |
<span style="color:#008080;">1</span> BubbleSort bs=<span style="color:#0000FF;">new</span><span style="color:#000000;"> BubbleSort();<br /></span><span style="color:#008080;">2</span> bs.Test(); |
View Details
在网上找了好多资料都没找到,无意当中找的了一片文章(国外的网站)帮我解决了问题,因此想与大家分享。 首先错误信息(见图一): 图一 解决方法: 一、验证SSL需要选中的网站(见图二) 1、首先打开所要修改的网站然后右击选择“属性” 2、选择“目录安全性”-->在安全通信中选择“编辑” 3、选择“要求安全通信(SSL)”后点击“确定”。 图二 二、创建一个HttpRedirect.htm 文件保存到“C:\InetPub” HttpRedirect.htm中的代码:
1 2 3 4 5 6 7 8 9 10 11 |
<!-- beginning of HttpRedirect.htm file --> <script type="text/javascript"> function redirectToHttps() { var httpURL = window.location.hostname + window.location.pathname; var httpsURL = "https://" + httpURL ; window.location = httpsURL ; } redirectToHttps(); </script> <!-- end of HttpRedirect.htm file --> |
三、用HttpRedirect.htm文件替换403文件(见图三) 1、打开你的网站右击选择“属性” 2、选择“自定义错误”点击编辑 3、在“文件”中添加HttpRedirect.htm文件(路径为:C:\Inetpub\HttpRedirect.htm) 图三 四、测试 输入的网址:http://会自动跳转到https:// 参考网址: http://www.jppinto.com/2009/01/automatically-redirect-http-requests-to-https-on-iis-6/ 转自:http://www.cnblogs.com/nanyaxu/archive/2012/11/19/2777507.html
View Details你需要先导入Alert类: import mx.controls.Alert;
然后在想要弹出警告的时候使用:
Alert.show(“你确定要退出系统吗?”,“确认”,Alert.YES|Alert.NO,null,logout)
参数说明:第一个参数是要显示的文本,第二个参数是窗口的标题,这两个参数是最经常用的。第三个参数是按钮,默认是两个:YEW 和 NO,当然你也可以自定义,比如Alert.CANCEL,第四个参数是父窗口,默认为null。
Cairngorm (下载) Cairngorm是最老也最成熟的Flex框架。它现在由Adobe拥有并开源,而且被Adobe的RIA顾问服务团队大量使用。创造出Cairngorm 的Adobe Consulting团队是把设计模式框架运用到RIA开发的最早的倡导者。Cairngorm中可以看到许多在JEE世界中广泛使用的MVC相关设计模式,即使它只是一个仅用于RIA用户界面开发的微型架构框架。 Cairngorm被看作是企业RIA开发框架。它的分层MVC实现有助于开发出具有复杂的业务逻辑的可伸缩的RIA应用。在异步通信、事件驱动、无线程的Flex平台上,Cairngorm为构建严肃的商业应用程序提供了快速而可靠的方法。 Cairngorm的本质也决定了它可能不适用于小型的快速原型。Adobe说: Cairngorm微架构的意图是为企业RIA开发者提供一个框架。如果你在编写一个非常简单的应用(比如程序原型),或者只有一个视图的程序,那么你应该考虑“一体化”的方案,就不必挣扎于Cairngorm所倡导的模型、视图和控制分离了。Cairngorm架构的益处在开发复杂的RIA应用的时候才能体现出来,比如有多个用例和视图,由一整个团队负责开发,以及团队中存在设计师、创意型开发者、技术型开发者等受过不同训练的成员的情形。 PureMVC (下载) 它实际上是一个ActionScript 3框架。与Cairngorm不同,它完全不依赖任何Flash、Flex或其他Adobe的AS3类。因此它可用于开发任何基于Flash或者ActionScript 3的应用程序。 从PureMVC的名字中就可以看出,它是根据MVC设计模式来实现的,里面包含了三层,即模型、视图和控制器。这个框架的文档很全面,它的网站上也有很丰富的信息去帮助开发者上手。 由于PureMVC是纯粹用ActionScript实现的,而ActionScript是与JavaScript基于相同标准(ECMAScript)的,强类型的,完全面向对象的语言,因此PureMVC可以很容易移植到其他OO语言。而事实上也确实如此: 我高兴地宣布把PureMVC移植到4种语言的工作正在进行之中:AS2、C#、Java和ColdFusion,现已接近向公众公开的阶段。这样PureMVC的适用平台就扩大到了FlashLite、.NET、Windows Mobile、Silverlight、J2ME、SE、EE以及……ColdFusion:) 这些移植版以及许多演示程序和工具都是由一群专门投身于此项工作的贡献者们完成的,他们遍及全世界。还有许多翻译人员加入进来帮忙把PureMVC的文档翻译成其他语言,包括法语、德语、俄语、汉语和日语等等。他们不知疲倦的工作把一个简单的个人项目变成了全球化的开源成果。很快,你就会认识他们,并爱上他们高质量的工作。要是遇到了这群人中的某一位,请他喝一杯吧! 考虑到ActionScript(ECMAScript)连同Adobe所用的Flash引擎将被内建于下一代的Firefox,PureMVC将会成为RIA开发者们开发跨平台富应用的一件非常趁手的工具。 Model-Glue: Flex((下载) Model-Glue:Flex也是一个简单的MVC Flex框架。Joe Rinehart把他最初创作的Model-Glue for ColdFusion移植到了Flex。Model-Glue: Flex受到了好评。它的设计意图是成为一个比Cairngorm和PureMVC更轻量的框架,因此更便于快速原型和简单的Flex应用开发。 Foundry(下载) ServeBox Foundry(sbasfoundry)是为Flex 2应用程序开发而设计的ActionScript 3 / Java框架。它根据几个设计模式而设计,还包括了一些工具,用来解决Flex 2开发中一再重现的烦人问题:Model-View同步、屏幕浏览、访问控制列表(开发中)、本地化以及标签文字外部化等等。 Foundry是为中大型规模的企业RIA系统开发而设计和实现的。它包含了Java公用模块,用来将Foundry Flex插件与服务器端的进程紧密集成。 Guasax Flex Framework (下载) Guasax是一个易于使用的编程框架,可实现条理清晰的,可伸缩的Flex应用程序。 Guasax框架在运行时依照MVC模式来处理程序的动作。Guasax的一个独特之处是它用一个XML文件来配置业务逻辑中的动作,在某些方面类似于Java Struts框架。可通过开发Guasax组件来扩展Guasax。 ARP (下载) Aral Balkan当初把ARP(Ariaware RIA Platform)作为一个ActionScript框架来开发,现在它已成为Open Source Flash项目群的一员。ARP现在支持使用ActionScript 2和ActionScript 3来开发Flash或Flex的RIA应用。 ARP可能是Flash社区中最老的框架。ARP的第一版是早在2000年用Flash 5编写的,其中一部分曾随开源的FC-Lib库发布。随后它发展到Flash MX,其中一部分又进入了开源的Moose库。由于它是从Flash框架进化而来,ARP可以在Flex和AIR中使用。ARP的代码直接访问Flash类,因此有报告说它比其他Flex框架性能更好。 Flest Framework(下载) Flest是构建企业级RIA的ActionScript3 / Flex应用程序框架。它运用了Controller、Factory、Command等设计模式。它的设计理念是高效、简单和实用。Flest框架是一个轻量级且易于使用的工具集合,不但帮助搭建开发的环境,还给开发者最大的自由去实现自己的决定。 除了上面列出的框架,还有一些使用不那么广泛的。你可以看一下EasyMVC、Adobe FAST和Joeberkovitz的框架。 除了用来开发RIA用户界面的框架,RIA开发者还有其他帮手,比如FlexUnit(ActionScript 3的单元测试框架),FlexLib(开源Flex 2组件库),AS3CoreLib(提供了若干基本工具和出色JSON支持的ActionScript 3.0类库),以及Granite DS(Adobe Data Services for J2EE应用服务器的免费、开源的替代品,支持EJB3/Spring/Pojo服务)。 转自:http://hi.baidu.com/cosmos53076/item/3a183cce2885c93f449416f7
View DetailsOpenSSH很老了,所以… 最开始只是因为openSSH启动不了,才用的MobaSSH,它配置简单兼容性好,缺点就是偷偷的建立了一个账户,让我感觉很不爽。所以决定把OpenSSH配置好。经过检查,发现OpenSSH安装的时候已经把环境变量添加好了,因此在命令行窗口是可以直接输入执行 ssh chmod等等命令的,但是当我输入ls的时候,提示缺少cygintl-2.dll,所以这个提醒了我更换检索词。最终解决这个问题。 下载地址: http://sourceforge.net/projects/sshwindows/files/OpenSSH for Windows – Release/3.8p1-1 20040709 Build/setupssh381-20040709.zip/download 1. 默认安装 2. 补上cygintl-2.dll和cygwin1.dll 下载:http://samanthahalfon.net/resources/cygwin_includes.zip 将它们复制到c:\Program Files (x86)\OpenSSH\bin目录下,如果提示覆盖,则覆盖之,不然进行下面操作,会提示 不能启动opensshd服务 OpenSSH Error 1067:The process terminated unexpectedly 系统出错,进程意外终止 3. 开始安装 cd "c:\Program Files (x86)\OpenSSH\bin" mkgroup -l >> ..\etc\group 生成一个group mkpasswd -l [-u <username>] >> ..\etc\passwd 比如: mkpasswd -l -u mxio >> ..\etc\passwd 这样就生成用户名mxio的passwd文件, 它调用的是系统用户名和密码 cd ..\..\etc 给权限..\bin\chown mxio * ..\bin\chmod 600 * 4. 启动opensshd服务 不出问题会提示启动成功 net start opensshd 5. 测试连接 ssh mxio@localhost
View DetailsFrom: http://blog.chinaunix.net/u/26011/showart_258096.html系统安装好后,最重要的是软件的安装了,Linux中的软件安装不像在Windows里面那样只要点下一步下一步就可以了。不过还是有规律可找,不会超过这些。 目前流行的软件包有两种比较常见的形式,一种是RPM包的形式,另一种是压缩成*.tar.gz的形式. A、安装简便的RPM包RPM是Redhat Package Manager的缩写,它只能使用在安装了RPM软件的系统中。语法:#rpm [options] filename.rpmoptions(注意大小写):-i :安装软件-e :卸载软件-q :查看软件安装信息和状态-U:升级现有软件-v:显示附加信息-h :安装时以#号显示安装进度,每#为2% 注意:如果要安装Filename.rpm软件只要用 rpm –ivh filename.rpm,软件安装在什么,是怎么安装的都不需要用户操心,不过安装不成功往往是权限和依赖关系,一定要注意当有多个软件包时有一定的顺序,如果没有安装上看错误提示。(在图形化界面RPM包也是相当容易安装跟在Windows中差不多)查询RPM包有时我们要装一个包了,要看这个包有什么用或要用某个软件不知道自己以前装过没有,就可以用查询命令来查看。 1)软件包信息的查询语法:# rpm {-q | --query} [ select-options ] [ query-options ]-q –query : 必要的参数,表示执行查询操作Select-options用来指定本次查询对象,选项:-a :查询所有安装的软件包-f<file> :查询<file>属于哪个软件包--whatrequires<X> :查询所有需要<X>功能的软件包-p<file> :查询未安装的软件包信息Query-options用来指定本次查询所要获得的信息:<null> :为空时显示包的全部标识-i :显示软件包的概要信息-l :显示软件包中的文件列表--provides :显示软件包提供的功能--requires[-R] :显示软件包所需要的功能-c :显示配置文件列表例:安装soft.rpm包,并查询软件信息# rpm –ivh soft.rpm查询soft.rpm软件包的安装文件列表# rpm –ql soft.rpm 2) 查询已经安装好的软件包:# rpm –qa | grep soft.rpm查询是否安装了soft.rpm包# rpm –ql soft.rpm查询soft.rpm安装的位置 # rpm –qi soft.rpm 查询软件信息 B、安装需要编译的.tar.gz包由于RPM包使用的局限性,目前更多的软件使用的是源代码形式的.tar.gz包。这种软件的安装通常要经过解压缩、软件配置、软件编译及安装的过程。1、软件安装的第一步通常是解压,下面介绍几种压缩软件的解压与压缩命令: 注意:在解压和压缩之前一定要确定当前用户对文件是有执行权的。 用命令ll来查看,如果没有用chmod来更改,如果对一个文件夹,文件夹中有多个文件要加-R参数,即#chmod –R 755 /tmp/soft(例) 1)解压后缀为.tar的文件# tar xvf soft.tar 2)解压后缀为.tar.gz的文件 # gunzip soft.tar.gz # tar xvf soft.tar(注意:有两步先用guzip解开.gz再用tar解开.tar)# tar xvfz soft.tar.gz(用tar解压注意不同后缀的参数 )用另外一个命令来解压# gunzip –c soft.tar.gz | tar xvf – 3)压缩文件为.tar.gz的后缀 # tar cvf soft.tar /tmp/soft# gzip –q soft.tar /tmp/soft# tar cvfz soft.tar.gz /tmp/soft用另外一个命令来压缩# tar cvf – /tmp/soft | gzip –qc > soft.tar.gz 参数说明(参数小写):-x :释放文件内容-v :显示流程信息-z :解压ZIP压缩包-c :建立一个新压缩文件-f :定义压缩中的文字 4)解压后缀为tar.z的文件# tar xvfz soft.tar.z或# uncompress soft.tar.z( 一样有两步 )再# tar xvf soft.tar5)解压后缀为.tgz文件# gunzip soft.tgz 6) 压缩和解压后缀为.bz2的文件# bzip2 /etc/httpd.conf(将文件httpd.conf压缩为httpd.conf.bz2)# bunzip2 /etc/httpd.conf.bz2 (将文件httpd.conf.bz2还原为httpd.conf) 2、一般来说,在解压缩生成的目录中都会有名为Readme、 Rnstall或Readme.install之类的文件。这些文件通常会对软件的功能、特性、版权许可、安装以及相关知识加以介绍,并且会提到关于安装的方法和步骤。说明文档常用的短语:1.Overview for the impatient(概括说明配置的全过程) $./configure--prefix=PREFIX $make $make install $PREFIX/bin/apachectl start 2.Requirements(需要的条件) 3.Configuring the source tree(配置的参数说明) 4.Building the package(编译软件的方法) 5.Installing the package(安装软件的方法) 6.Testing the package(软件测试)一般来说,与安装软件有直接关系的文件只有两个:configure 、Makefile。 理解并能熟练使用这些说明文件后,就可以利用一些规律来安装大多数的软件。对于那些没有说明文件的软件(当然这种情况比较少见),这些规律通常也是适用的。一般来说,与安装软件有直接关系的文件只有两个:configure 、Makefile。 其中,configure文件具有可执行的属性,是用来配置软件的,它的参数比较多,用法也比较灵活。当然,不同的软件参数也不相同,这时候就需要借助它的help参数,运行下面的命令就会让你感到豁然开朗: #〉 ./configure -help Usage: configure [options] Options: [defaults in brackets after descriptions] General options: --quiet, --silent do not print messages --verbose,-v print even more messages --sha [=DIR] switch to a shadow tree (under DIR) for building Stand-alone options: --help,-h print this message --show-layout print installation path layout (check and debug) Installation layout options: --with-layout=[F:]ID use installation path layout ID (from file F) --target=TARGET install name-associated files using basename TARGET …… 接下来,就可以运行“./configure [options]”来配置该软件。注意,命令行中的“./”非常重要,它告诉系统要运行的命令就在当前目录下(否则系统就会到$path变量指定的路径下去执行命令)。执行命令后可以生成Makefile文件或者修改已有的文件配置。 Makefile文件通常是用来编译和安装软件的。运行make命令时系统会自动根据Makefile文件中的设置对软件进行编译和安装。make命令有时还可以带一些参数,如:all、build、 config、install等。具体要带哪个参数可以参看Makefile文件。在Linux中绝大部分文件是文本文件,Makefile就是一个 shell程序(Linux中shell程序与DOS中的批处理文件有很多相似之处,当然功能要强得多),很容易读懂,尤其是编译时可带的参数都会明确写出,例如: ##======================== ## Targets ##======================== # default target all: build ##———————— ## Build Target ##———————— # build the package build: …… # the non-verbose variant for package maintainers build-quiet: @$(MAKE) -f $(TOP)/$(MKF) $(MFLAGS) $(MFWD) QUIET=1 build # build the additional support stuff build-support: …… ##———————— ## Installation Targets ## ———————-- # the install target for installing the complete Apache # package. This is implemented by running subtargets for the # separate parts of the installation process. install: …… # the non-verbose variant for package maintainers install-quiet: @$(MAKE) -f $(TOP)/$(MKF) $(MFLAGS) $(MFWD) QUIET=1 install # create the installation tree install-mktree: …… 上面这段代码是apache_1.3.6的Makefile文件的一部分,从这段程序可以看出all参数表示完全编译(缺省参数)。此外,编译时还可以带 build、build-quiet、build-surpport等参数;安装时可以带install、install-quiet、install- surpport等参数。它们的功能分别在“#”表示的注释中进行了说明。需要额外说明的是,有些软件(例如Linux的内核升级程序)不用 configure命令来配置软件,而是用make config来完成这项工作,所以,具体使用哪种方法要具体问题具体分析。 C、其它的安装方法,利用脚本的安装(详细)。 例:安装Webmin-1.250.tar.gz先挂载:# mount /dev/cdrom /mnt/cdrom 进入挂载点:# cd /mnt/cdrom 拷贝Webmin-1.250.tar.gz到/tmp下或者你想解压的目录 再进入/tmp: # cd /tmp 改变文件的权限: # chmod 755 webmin-1.250.tar.gz(因为一般挂载过来的文件都是只有只读的权限) 解压:# tar xvfz webmin-1.250.tar.gz 进入解压后的文件夹:# cd webmin-1.250 现在可以用ls查看一下文件,现在如果自己没有资料介绍,第一次安装一般都是查看说明文档如:README、Rnstall或Readme.install之类的文件。 现在找到README文档,(进行简单的中文说明##后的为说明) […]
View Details安装好了CentOS 6.2,我想让它作为一个服务器,可以让我的Windows 7电脑远程登录。 安装OpenSSH Server 首先,我们搜索一下CentOS的软件库里面有没有已经定义好的SSH服务器包:
1 |
$ yum search <span style="color:#0000FF;">ssh<br />... ...</span><span style="color:#000000;">openssh.x86_64 : An open source implementation of SSH protocol versions </span><span style="color:#800080;">1</span> and <span style="color:#800080;">2</span><span style="color:#000000;">openssh</span>-askpass.x86_64 : A passphrase <span style="color:#0000FF;">dialog</span><span style="color:#0000FF;">for</span><span style="color:#000000;"> OpenSSH and Xopenssh</span>-<span style="color:#000000;">clients.x86_64 : An open source SSH client applicationsopenssh</span>-ldap.x86_64 : A LDAP support <span style="color:#0000FF;">for</span><span style="color:#000000;"> open source SSH server daemonopenssh</span>-server.x86_64 : An open source SSH server daemon<br />... ... |
OpenSSH是Secure Shell的一个开源实现。从上面的搜索结果可以看到,CentOS的软件库里面已经有了OpenSSH的服务器包(openssh-server)和客户端包(openssh-clients),用yum install可以直接安装。
1 |
$ yum <span style="color:#0000FF;">install</span> openssh-server |
OpenSSH Server安装完成后在/etc/init.d目录下应该会增加一个名为sshd的服务。可以参考《CentOS设置服务开机自动启动》的方式配置sshd服务开机自动启动。
1 |
$ chkconfig --<span style="color:#000000;">list sshdsshd </span><span style="color:#800080;">0</span>:off <span style="color:#800080;">1</span>:off <span style="color:#800080;">2</span>:on <span style="color:#800080;">3</span>:on <span style="color:#800080;">4</span>:on <span style="color:#800080;">5</span>:on <span style="color:#800080;">6</span>:off |
手动启动sshd服务,方便后面客户端的连接:
1 |
$ /etc/init.d/sshd start |
用密码方式登录远程服务器 WIndows 7里面的SSH客户端软件我用的是XShell。打开XShell,新建连接,选择Password验证方式,输入用户名和密码,这样就可以连接到服务器了。 登录成功后的画面: 用RSA密钥登录远程服务器 OpenSSH允许使用RSA的方式登录服务器。RSA加密方式会有两个文件:一个是公钥文件,放在服务器$HOME/.ssh/authorized_keys文件里面;另外一个是私钥文件,放在客户端电脑上。 产生RSA密钥对,可以在服务器产生,也可以在客户端产生:
1 |
$ <span style="color:#0000FF;">ssh-keygen</span> |
执行完毕后,会在$HOME/.ssh目录下多出来两个文件:id_rsa.pub(公钥文件)和id_rsa(私钥文件)。 将公钥文件追加到$HOME/.ssh/authorized_keys文件后面:
1 |
$ <span style="color:#0000FF;">cat</span> id_rsa.pub >> authorized_keys |
将私钥文件下载到客户端电脑(可以使用SFTP方式,例如XFtp,WinSCP等很多软件),然后新建XShell连接,选择Public Key验证方式: 配置完毕,现在我们可以不用输入密码也能够连接到服务器了。 OpenSSH相关目录和文件 所有配置信息保存的目录:/etc/ssh sshd服务配置文件:/etc/ssh/sshd_config OpenSSH相关链接 《用OpenSSH构建SSH服务器》:安装O盆SSH服务器。 《用SSH客户端软件登录到服务器》:如何用PUTTY+RSA登陆远程服务器。 《CentOS Wiki – 保卫 OpenSSH》:OpenSSH的安全设置。 《Top 20 OpenSSH Server Best Security Practices》:20个需要遵守的SSH安全建议。 转自:http://www.cnblogs.com/eastson/archive/2012/06/29/2570163.html
View DetailsWPF判断命令(Command)是否能够执行是通过ICommand.CanExecute事件,在实际程序中路由命令一般是通过CommandBinding来使命令得到实际操作代码,但是这个CanExecute事件的调用是由WPF控制的,有些时候,比如命令执行后进行一些异步耗时操作,操作完成后会影响CanExecute事件结果,但是WPF不会立即做出反应,那么这个时侯就需要手动调用CommandManager.InvalidateRequerySuggested对命令系统进行一次刷新。 比如下面这个小程序 <Window.CommandBindings> <CommandBinding Command="New" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" /> </Window.CommandBindings> <StackPanel> <Button Command="New">执行工作</Button> <TextBlock Name="tbl" Text="等待执行"></TextBlock> </StackPanel> // // 事件执行代码 // privatevoid CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute =!finished; } privatevoid CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { System.Threading.ThreadPool.QueueUserWorkItem(dowork); } bool finished =false; void dowork(object obj) { updateUI("开始工作"); System.Threading.Thread.Sleep(1000); updateUI("工作结束"); finished =true; } void updateUI(string msg) { Dispatcher.BeginInvoke((Action)(() => tbl.Text = msg)); } 程序按钮点击后下面文字显示“工作结束”,这时按钮理应是禁用的(因为此时CanExecute结果是false),但实际上按钮没有被禁用,只有界面发生改变后(如焦点,按键变化,或者按钮再次被点击),按钮才会被禁用,因为此时WPF才调用相应的CanExecute事件。 手动调用CommandManager.InvalidateRequerySuggested就可以解决问题,注意这个函数只有在UI主线程下调用才会起作用。 void dowork(object obj) { updateUI("开始工作"); System.Threading.Thread.Sleep(1000); updateUI("工作结束"); finished =true; //手动更新 updateCommand(); } void updateCommand() { Dispatcher.BeginInvoke((Action)(() […]
View Details