基于二叉树的思路实现的“十叉树”

该数据结构用于以替代一些简单的本地缓存系统,并提供快速检索的功能。

业务场景:

用户帐号223,拥有下级帐号223001、223002、2230055、22312345...

用户帐号224,拥有下级帐号224002、2248888...

用户...

223和224,我们暂且叫他为大帐号,后面的都叫小帐号。

当这些小帐号发消息给系统时,需要识别出对应的大帐号,且小帐号的长度不等,不可以检索库表。

假设大帐号已经驻留在内存。

 

java:

/**
 * 基于二叉树的思路实现的“十叉树”,用于存储一些临时性的数据,并提供一些查询接口
 * @project xframework
 * @date 2013-1-11
 * @version 1.0
 * @author Jason5186@qq.com
 * 
 * @review_history
 * [2013-1-11] create by Jason
 */
public class BinaryTree {
	
	// 树的根结点
	private TreeNode root = null;
	
	/**
	 * 
	 */
	public BinaryTree() {
		// TODO Auto-generated constructor stub
		root = new TreeNode(0);
	}
	
	private class TreeNode {
		
		private int key; 
		private Object value;
		private TreeNode[] nodes = new TreeNode[10];
		
		
		public TreeNode(int key) {
			// TODO Auto-generated constructor stub
			this(key, null);
		}
		
		public TreeNode(int key, Object value) {
			this.key = key;
			this.value = value;
		}	
		
		
		public TreeNode setChildTreeNode(int key, Object value){
			
			synchronized(this){
				TreeNode treeNode = nodes[key];
				if (treeNode == null) {
					nodes[key] = new TreeNode(key);
				}
				getChildTreeNode(key).setValue(value);
			}
			
			return getChildTreeNode(key);
			
		}
		
		public TreeNode setChildTreeNode(int key){
			synchronized(this){
				TreeNode treeNode = nodes[key];
				if (treeNode == null) {
					nodes[key] = new TreeNode(key);
				}
			}
			
			return getChildTreeNode(key);
		}
		
		public TreeNode getChildTreeNode(int key){
			return nodes[key];
		}
		
		public int getKey() {
			return key;
		}
		
		public Object getValue(){
			return value;
		}
		
		public void removeValue(){
			this.value = null;
		}
		
		public void setValue(Object value){
			this.value = value;
		}
		
		public String toString()
		{
			
			return "(" + key + " , " + value + " )";
		}
		
	}
	
	/**
	 * 空返回 true ,否则返回 false . 
	 */
	public boolean isEmpty()
	{
		if (root == null) {
			return true;
		} else {
			return false;
		}			
	}
	
	
	public void TreeEmpty() throws Exception 
	{
		if (isEmpty()) {
			throw new Exception("树为空");
		}
	}
	
	
	
	/**
	 * 查找指定s_key对应的节点
	 * @param s_key
	 * @return TreeNode
	 * @throws Exception
	 */
	public TreeNode search(String s_key) throws Exception 
	{
		
		if (getRoot() == null) {
			throw new Exception("root node is null");
		}
		
		TreeNode treeNode = getRoot();
		
		char[] key_array = s_key.toCharArray();
		
		// 根据给定的s_key,遍历tree node的绝对路径,且以最短匹配的规则检索;
		// 命中后返回对应的tree node,否则返回Null。
		for (char skey : key_array) {
			
			int key = skey & 0xf;
			
			TreeNode t_treeNode = treeNode.getChildTreeNode(key);
			if (t_treeNode == null) {
				
				// 该节点尚未创建:
				return null;
			}else if (t_treeNode.getValue() != null) {
				
				// 命中:
				return t_treeNode;
			}else{
				
				// 否则,将遍历下一个节点:
				treeNode = t_treeNode;
			}
			
		}
		
		// 循环体之外,将视为未命中:
		return null;
		
	}
	
	
	/**
	 * 将指定的s_key放入节点,并设置对应的value
	 * @param s_key
	 * @param value
	 * @throws Exception 
	 */
	public void insert(String s_key, Object value) throws Exception{
		TreeNode treeNode = getRoot();
		
		char[] key_array = s_key.toCharArray();
		int s_key_length = key_array.length;
		int s_key_count = 1;
		/*
		 * 根据给定的key_array的长度,查找节点、布置节点并得到最后一个节点的tree node,然后赋值value。
		 */
		for (char skey : key_array) {
			
			int key = skey & 0xf;
			
			// 取某节点下,N个子节点中的一个分支:
			TreeNode t_treeNode = treeNode.getChildTreeNode(key);
			
			if (t_treeNode == null) {
				
				// 创建一个新的子节点:
				t_treeNode = treeNode.setChildTreeNode(key);
			}else{
				
				if (t_treeNode.getValue() != null && s_key_count != s_key_length) {
					
					treeNode = null;
					break;
				}
				
			}
			
			// 该节点已经存在,节点交换:
			treeNode = t_treeNode;
			
			s_key_count++;
		}
		
		if (treeNode != null) {
			
			// 为最后一个节点赋值:
			treeNode.setValue(value);
		}
		
		
	}
	
	
	/**
	 * 删除指定key的节点
	 * @param s_key
	 * @throws Exception
	 */
	public void delete(String s_key) throws Exception
	{
		TreeNode node = search(s_key);
		if (node == null) {
			throw new Exception("Tree node not found, Tree node key is:["+s_key+"]");
		}
		
		node.removeValue();
		node = null;
		
	}
	
	
	
	
	public TreeNode getRoot() {
		return root;
	}
	
	
}

Test:

public static void main(String[] args) 
    {
    	try {
	    	BinaryTree bt = new BinaryTree();

	    	String key = "223";
	    	String msg = "hello jason";
	    	bt.insert(key, msg);
	    	
	    	TreeNode node = bt.search(key);
	    	if (node != null) {
	    		System.out.println(node.getValue());
	    	}
	    	
	    	node = bt.search("223001");
	    	if (node != null) {
	    		System.out.println(node.getValue());
	    	}
	    	
	    	
	    	System.out.println("Done!");
	    	
    	} catch (Exception e) {
    		System.out.println(e.getMessage());
    		e.printStackTrace();
    	}
    }

 

 

 

.

发表在 technologys | 基于二叉树的思路实现的“十叉树”已关闭评论

统一域名争议解决政策

本文介绍ICANN(互联网名称与数字地址分配机构)发布的两个关于域名仲裁的政策法规,想要炒域名的同学们请尽快补习一下,以免日后吃亏。

统一域名争议解决政策(UDRP)

  (由ICANN于1999年8月24日通过,1999年10月24日批准实施)

  说明:

  1、本政策业已生效。有关实施时间表,可参见网址 www.icann.org/udrp/udrp-schedule.htm.

  2、本政策已为所有由ICANN认可的、负责为以.com、 .net、.org结尾的域名提供注册服务的注册商(registrars)所采纳,亦为某些国家顶级域名(如.nu、 .tv、 .ws等)的管理者所采纳。

  3、 本政策是域名注册商(或者某些国家顶级域名的注册机构)和其客户(域名持有人或注册人)之间的约定。因此,本政策以"我方"或"我们的"指称域名注册商,而以"你方"或"你们的"指称域名持有人。

统一域名争议解决政策

(由ICANN于1999年10月24日批准实施)

  1、目的:

  本统一域名争议解决政策("政策")已经由互联网络名称和数码分配公司(ICANN)所采纳,并以附件的形式并入你方的注册协议。该政策为你方与我方(域名注册商)以外的任何其他方之间因你方所注册的互联网络域名的注册及使用而引发的有关争议设定了条款和条件。本政策第4条所规定的解决程序将根据《统一域名争议解决政策之规则》(《程序规则》)(该《程序规则》可见诸于网址 www.icann.org/udrp/udrp-rules-24oct99.htm)和选定的行政争议解决服务提供者的《补充规则》而进行。

  2、你方的陈述责任:

  你方申请注册某一域名或要求我方保留或更新某一域名注册时,即向我们陈述并保证:(a)你方注册协议中所作的陈述是完整的和准确的;(b)就你方所知,域名的注册将不会侵害或妨碍任一第三方的权益;(c)该域名的注册并非出于某种不法目的;以及(d)你方不会在明知违反有关可适用的法律或法规的情况下使用该域名。你方有责任判断你方域名注册行为是否侵害或妨碍他人权益。

  3、撤销、转让和变更:

  在下列情况下,我方将撤销、转让和变更域名注册:

  (a)根据本《政策》第8条的规定,我方收到你方或你方授权代理人提交的书面的或适当电子形式的通知,要求采取此类行动;

  (b)我方收到有管辖权的法庭或仲裁机构作出的裁定,指令采取此类行动;

  (c) 我方收到行政专家组在依据本《政策》或依据为ICANN所采纳的本《政策》以后版本而进行的、以你方为一方当事人的任何行政程序中所作出的裁决,要求采取此类行动。(见以下第4(9)条和第4(11)条)

  我方也可根据域名注册协议的条款或其他合法要求撤销、转让和变更域名注册。

  4、强制性行政程序

  本条限定了你方应交由强制性行政程序解决的争议类型。该程序将由网址 www.icann.org/udrp/approved-providers.htm 中所列明的行政争议解决服务提供者(所列明的均为行政争议解决服务提供者,以下简称"争议解决机构")之一进行。

  a. 适可的争议 一旦第三方(投诉人)根据《程序规则》,向一适格的争议解决机构提出如下主张时,你方有义务加入该强制性的行政程序:

  (i) 你方域名与投诉人享有权利的商品商标或服务商标相同或混淆性相似;且

  (ii) 你方对该域名并不享有权利或合法利益;且

  (iii) 你方对该域名的注册和使用具有恶意。

  投诉人在行政程序中必须举证证明以上三种情形同时具备。

  b. 恶意注册和使用域名的证据 针对第4(a)(iii) 条,尤其是如下情形但并不限于如下情形,如经专家组发现确实存在,则构成恶意注册和使用域名的证据:

  (i) 该情形表明,你方注册或获取域名的主要目的是为了向作为商品商标或服务商标所有人的投诉人或其竞争对手出售、出租或转让域名,以获取直接与域名注册相关费用之外的额外收益者;或者,

  (ii) 你方注册行为本身即表明,你方注册该域名的目的是为了阻止商品商标和服务商标的所有人以相应的域名反映其上述商标者;或者,

  (iii) 你方注册域名的主要目的是为了破坏竞争对手的正常业务者;或者,

  (iv) 以使用域名的手段,为商业利益目的,你方通过制造你方网站或网址上所出售的商品或提供的服务与投诉人商标之间在来源者、赞助者、附属者或保证者方面的混淆,故意引诱网络用户访问你方网站或其他连机地址者。

  c. 如何在答辩中证明你方对域名拥有权利及合法利益 你方在收到投诉书后,应根据《程序规则》第5条的规定来决定你方应如何准备答辩。针对第4(a)(ii) 条,尤其是如下情形但并不限于如下情形,如由专家组在对所提交的证据进行全面认定基础上得以证实,则表明你方对该域名拥有权利或合法利益:

  (i) 在接到有关争议通知之前,你方在提供商品或服务的过程中已善意地使用或可证明准备善意地使用该域名或与该域名相对应的名称者;或者,

  (ii) 你方(作为个人、商业公司或其他组织)虽未获得商品商标或有关服务商标,但因所持有的域名业已广为人知者;或者

  (iii) 你方正非商业性地合法使用或合理地使用该域名,不存有为获取商业利益而误导消费者或玷污争议商品商标或服务商标之意图者。

  d.争议解决机构的选择 投诉人应从业经ICANN认可的争议解决机构中选择一争议解决机构,并向该争议解决机构提交投诉书。除第4(f)条所规定的合并审理的情形外,该争议解决机构将管理案件程序性事项。

  e. 程序的启动和行政专家组的指定 有关案件的启动程序、案件进行程序及裁决争议的专家组("行政专家组")的指定程序由《程序规则》另作规定。

  f. 合并审理 如果你方与投诉人之间存有多个域名争议,你方或投诉人均可请求将这些争议交由一个行政专家组合并审理。该请求应向最初被指定负责双方间在审争议的行政专家组提出。该专家组有权决定将此类争议部分或全部予以合并审理,只要这些合并审理的争议受本《政策》或为ICANN采纳的本《政策》以后的版本所约束。

  g. 费用 争议解决机构根据本《政策》就提交专家组解决的争议而收取的所有费用均由投诉人承担,但你方根据《程序规则》第5(b)(iv) 条的规定选择将行政专家组成员由一名专家扩充为三名专家的情形除外。在这种情形下,全部费用由你方和投诉人平均分担。

  h. 我方在行政程序中的介入 我方不参与管理由行政专家组所进行的任何程序。此外,我方对因专家组裁决而产生的结果不承担责任。

  i. 救济措施 投诉人通过行政专家组程序可获得的救济措施应限于要求注销你方域名或将你方注册域名转移给投诉人。

  j. 通知和公布 争议解决机构应通知我方由行政专家组针对你方注册的域名所作出的任何裁决。所有根据本《政策》所作裁决均全文在互联网上予以公布,但专家组在特殊情形下决定裁决中不宜公布的部分除外。

  k. 司法程序的可行性 第4条规定所要求的强制性行政程序并不排除你方或投诉人在该强制性行政程序开始之前或结束之后将争议提交有管辖权的法院独立解决。如果行政专家组裁定你方域名应予注销或转移,我们将在得到有关争议解决机构行政专家组的裁决通知后、在执行该裁决之前,等待十(10)个工作日(以我方主营业机构所在地时间为准)。然后,我们将执行裁决,除非我们在该十(10)个工作日的等待期内收到你方在投诉人根据《程序规则》第3(b)(xiii) 条提出投诉的地域针对投诉人提起司法诉讼的正式文件(如盖有法院职员归档印鉴的的起诉书副本)。(一般情况下,该地域是我们主营业机构所在地或者我方Whois数据库所记载的你方地址所在地。详细信息参见《程序规则》的第1条和第3(b)(xiii) 条)。如果我们在十(10)个工作日期间内收到了上述文件,直至我们收到(i)令我们确信双方已解决争议的证据;(ii)令我们确信你方诉讼请求已被驳回或撤销的证据;或者,(iii)法院有关驳回你方诉讼请求或裁定你方无权继续使用域名的裁定副本,我们将不执行行政专家组的裁决,也不采取进一步的进行。

  5、 其他争议及诉讼 所有你方与除我方之外的他方当事人之间的其他并非根据本《政策》第4条强制性行政程序规定而提起的有关你方因域名注册而引起的争议,均由你方与该方当事人通过法院诉讼、仲裁和其他可适用的程序予以解决。

  6、 我方有关争议的介入 我方不以任何方式参加你方与除我方之外的他方之间因你方注册及使用域名而产生的任何争议。你方不得在任何此类程序中将我方列为当事人之一方或以其他方式使我方介入该程序。一旦我方在此类程序中被列为当事人之一方,我们则保留进行适当辩护以及采取其他必要行动以维护我方利益的权利。

  7、 维持现有状态 除前述第3条所规定的情形外,我方将不对根据本《政策》注册的域名予以撤销、转让、使之生效或失效,或以其他任何措施改变域名现有状态。

  8、争议期间的转让

  a. 将域名转让给新持有人 你方不得在下列期间将注册域名转让给另一持有人:(i)在根据第4条而提起的行政程序进行期间,或该程序终结后15个工作日内(以我方主营业机构所在地时间为准);或者(ii)在针对你方域名注册而提起的法院诉讼程序或仲裁程序进行期间,除非接受域名转让的一方当事人书面同意接受法院判决或仲裁裁决的约束。我方保留对违反该条款规定所进行的域名转让予以注销权利。

  b. 变更注册商 你方在根据第4条而提起的行政程序进行期间或该程序终结后15个工作日内(以我方主营业机构所在地时间为准)不得将注册域名转移给另一注册商。只要你方在我处注册的域名能够继续成为在依据本《政策》条款针对你方而提起的程序中的争议标的,你方可在法院诉讼或仲裁程序进行期间将注册域名转移给另一注册商管理。如果你方在法院诉讼或仲裁程序进行期间将域名转移给我们管理,则有关该域名的争议仍应适用原注册商的域名争议解决政策。

  9、本政策的修订 我们有权在征得ICANN的同意后适时对本《政策》予以修订。我们将至少在修改后的政策生效前30日将其在上予以公布。如果本《政策》已为投诉人在向争议解决机构提交的投诉书中所援引,则你方应受投诉人援引时有效的政策文本约束。除此之外,无论是域名争议产生在修订文本生效之前、生效之时抑或生效之后,所有的这些修改之处均对你方具有约束力。如果你方对本《政策》的修改之处不予接受,你方唯一的救济方式是取消在我处的域名注册,但你方无权要求返还你方业已向我方支付的任何费用。业经修订的政策文本直至你方注销域名注册时为止对你方均予适用。

  [ 2000年7月24日 ]

统一域名争议解决政策之规则

(由ICANN于1999年10月24日通过)

  根据由ICANN采纳的《统一域名争议解决政策》而进行的争议解决行政程序受本《规则》及管理案件程序的争议解决机构通过其网站发布的《补充规则》所约束。

  1、定义

  在本《规则》中:

  投诉人指就有关域名注册提起投诉的一方当事人。

  ICANN指互联网络名称及数码分配公司。

  交互管辖法域指,(a)注册商主营业机构所在地的法院管辖(只要域名持有人在其注册协议中已规定将有关因域名的使用而 产生的争议交付该法域法院司法管辖)或,(b)投诉提交争议解决机构之时注册商Whois数据库中域名注册信息所显示的域名持有人的地址所在地的法院管辖。

  专家组指由争议解决机构指定的审理有关域名注册投诉的行政专家组。

  专家指由争议解决机构指定的作为专家组成员的专家。

  当事人指投诉人或被投诉人。

  《政策》指《统一域名争议解决政策》。该《政策》通过援引而被并入并成为注册协议的一部分。

  争议解决机构指由ICANN所确认的争议解决服务提供者。机构名单可查阅网址www.icann.org/udrp/approved-providers.htm.

  注册商指为被投诉人提供争议域名注册服务的公司。

  注册协议指注册商与域名持有人间所签订的域名注册协议。

  被投诉人指针对其据以提起投诉的注册域名持有人。

  反向域名侵夺指恶意地利用《政策》中的有关规定以企图剥夺注册域名持有人持有域名的行为。

  《补充规则》指有权管理案件程序的争议解决机构制定的本《规则》之补充规则。

  2、送达

  (a) 在向被投诉人送达投诉书时,争议解决机构有责任采取合理可行的措施,确保被投诉人实际收到投诉书。实际收到投诉书,或争议解决机构为使被投诉人实际收到投诉书而实施以下行为后,该项责任即行解除:

  (i)按(A)注册商Whois数据库域名注册资料中记载的注册域名持有人及其技术联系人、管理联系人以及,(B)注册商向争议解决机构提供的域名注册缴费联系人的所有邮政通讯及传真地址,将投诉书发送被投诉人的;及

  (ii)、通过电子邮件向以下地址传送电子形式投诉书(包括可按照电子形式传送的附件)的:

  (A)域名注册技术联系人、管理联系人及缴费联系人的电子邮件地址;

  (B)postmaster@<争议域名>;及

  (C)如果域名(或www.后紧接该域名)解析至一个有效网页(该网页并非争议解决机构所确认的由注册商或ISP所预留的、可搁置由多个域名持有人所注册的域名的一般性网页)时,该网页所显示的任何电子邮件地址或该网页所能链接的任何电子邮件地址;

  (iii)按照被投诉人自行选择并通知争议解决机构的任何地址,及在可行的范围内向由投诉人根据第3(b)(v) 条向争议解决机构提供的所有其他地址发送投诉书的。

  (b) 除第2 (a) 条规定的情形外,依本《规则》向投诉人和被投诉人传送的任何书面文件均应分别根据投诉人和被投诉人选定的方式为之(见第3 (b) (iii)条和第5 (b) (iii)条),或在没有这种指示时

  (i)通过带有传输确认的传真方式传送;或

  (ii)预付邮资并通过带有收据的邮寄或快递方式发送;或

  (iii)在能获得传送记录的情况下,通过互联网以电子形式传送。

  (c)向争议解决机构或专家组提交的任何文件均应按争议解决机构《补充规则》所规定的方法和方式(包括分数)提交。

  (d)文件应以第11条所规定的语文制作。如果可行的话,电子文件应以简易文本传送。

  (e)任何一方当事人均可通知争议解决机构和注册商,以更新其详细联络信息。

  (f)除非本《规则》另有规定,或专家组另有决定,根据本《规则》所提交的所有文件于下列情形下应视为已经送达;

  (i)通过传真方式传送的,以传送确认书上显示的日期为准;或

  (ii)通过邮寄或快递方式发送的,以收据上标注的日期为准,或

  (iii)通过互联网络传送的,在传送日期可予验证的情况下,以该文件传送日期为准。

  (g)除非本《规则》另有规定,所有本《规则》所规定的文件提交开始的期间应当从依第2(f) 条之规定文件最早视为业已提交的日期开始计算。

  (h)任何文件,

  (i)凡由专家组传送给任何一方当事人者,必须同时向争议解决机构和另一方当事人传送文件副本;

  (ii)凡由争议解决机构传送给任何一方当事人者,必须同时向另一方当事人传送文件副本;以及

  (iii)凡由一方当事人提交者,必须同时向另一方当事人、专家组以及争议解决机构传送文件副本。

  (i)文件传送方有义务为其传送的文件保留记录,以记载有关文件传送的具体事实和情况,供有关当事方查阅,并用以制作相应的报告。

  (j)如果传送文件的一方当事人收到告知未收到其所传送文件的通知,该当事人应立即将有关情况通知专家组(或者,如果专家组尚未指定,通知争议解决机构)。有关文件传送和回复的进一步程序均应依照专家组(或争议机构)的指示而为之。

  3、投诉

  (a)任何个人或企业均可依据《政策》及本《规则》向经ICANN认可的争议解决机构提出投诉以启动行政程序。(由于资质限制或其他原因,争议解决机构受理投诉的资格可能会暂时中止。在这种情况下,争议解决机构应拒绝受理投诉。有关个人或企业可向另一争议解决机构提请投诉。)

  (b)投诉书应以有形书面文件形式及电子文件形式(无法获得电子格式的附件除外)提交,并且应当:

  (i)载有有关投诉应根据《政策》和本《规则》予以裁决的请求;

  (ii)提供投诉人及其行政程序授权代表的姓名、通讯及电子邮件地址以及电话和传真号码;

  (iii)确定在行政程序中就(A)电子文件材料和(B)包含有形书面文件的材料与投诉人联络的首选通讯方式(包括联系人、联系方式及联络地址);

  (iv)决定投诉人是选择一人专家组裁决纠纷,还是三人专家组裁决纠纷。如果投诉人选择由三人专家组裁决纠纷,则应提供将会被指定作为案件专家组成员之一的三位候选专家的姓名和详细的联络信息(三位候选专家可从任何一个业经ICANN确认的争议解决机构的专家名单中选定);

  (v)提供被投诉人(域名持有人)的名称及为投诉人所知的如何联络被投诉人及其代表的包括投诉前双方协商过程中的联络信息在内的所有信息(包括所有的通讯及电子邮件地址以及电话和传真号码),上述信息应详细具体足以允许争议解决机构将投诉书按第2(a)条所述方式发送被投诉人;

  (vi)明确作为投诉标的的域名;

  (vii)确定投诉提起之时注册域名的注册商;

  (viii)明确据以提出投诉的商品商标或服务商标。就每一商标而言,如果有的话,则应说明据以使用商标的商品或服务(投诉人亦可分别说明在投诉提起之时被投诉人意欲将来使用该商标的商品及服务);

  (ix)根据《政策》规定,说明据以提起投诉的理由,尤其应包括:

  (1)争议域名与投诉人享有权利的商品商标或服务商标相同或混淆性相似;及

  (2)被投诉人(域名持有人)对争议域名不享有权利或不具备合法利益的原因;及

  (3)争议域名被认为系属恶意注册和使用的理由。

  (就第(2)项和第(3)项而言,投诉人应讨论应予适用的《政策》第4(b)条和第4(c)条所规定的各个方面。有关说明的字数应符合争议解决机构《补充规则》有关字数或文件页数的限制。);

  (x)根据《政策》规定,明确所寻求的补救方式;

  (xi)说明任何其他已经开始或业已终止的与争议域名相关的司法程序;

  (xii)声明已经根据第2(b)条的规定,连同争议解决机构《补充规则》所规定的格式封面,向被投诉人(域名持有人)发送或传送了投诉书副本;

  (xiii)声明投诉人如对行政程序关于取消或转移域名的裁决有任何异议,将把有关争议提交至少一个确定的交互管辖法域的法院予以管辖;

  (xiv)投诉书的结尾应附有下列声明,并由投诉人或其授权代表签署:

  "投诉人同意,其有关域名注册、争议或争议解决的投诉及救济主张仅针对域名持有人,该投诉及救济主张不涉及(a)争议解决机构及专家,但故意不当行为除外,(b)注册商,(c)注册官员,及(d)互联网络名称和数码分配公司,以及上述机构的董事、官员、雇员及代理商。"

  "投诉人确认,投诉书所载信息就其所知是完整的和准确的。本投诉并非出于诸如讹诈等任何不正当目的。投诉人保证投诉书有关主张是依据本《规则》和应予适用的法律而提出,犹如其现存状态或可由善意及合理抗辩而展延之状态。"

  (xv)包括争议域名应予适用的《政策》副本及投诉赖以依存的注册商标和服务商标在内的任何文件或其他证据应作为附件提交,并应同时提供上述证据的目录索引表;

  (c)投诉人可对多个域名提出投诉,只要这些域名为同一域名持有人所注册。

  4、投诉通知

  (a)争议解决机构应对投诉书予以行政审查。如果投诉书符合《政策》及本《规则》规定,争议解决机构将在收到投诉人根据第19条交纳的费用后3个历日内依第2(a)条所规定的方式将投诉书(连同争议解决机构《补充规则》所规定的说明性格式封面)送达被投诉人。

  (b)如果争议解决机构发现投诉书存有形式缺陷,则应立即将该缺陷通知投诉人和被投诉人。投诉人应在收到通知后5个历日内对该缺陷予以修改。投诉人未能在上述期限内对投诉书形式缺陷予以修改者,行政程序将视为撤回,但并不妨碍投诉人提出另一不同的投诉。

  (c)争议解决机构依第2(a)条完成向被投诉人送达投诉文件职责之日即为行政程序开始之日。

  (d)争议解决机构应立即将行政程序开始日期通知投诉人、被投诉人、有关注册商及ICANN.

  5、答辩

  (a)被投诉人应在行政程序开始之日起20日内向争议解决机构提交答辩。

  (b)答辩应以有形书面文件和电子文件(没有电子格式的附件除外)形式提交,并应当:

  (i)对投诉书中的陈述和主张予以具体反驳,并申明被投诉人(域名持有人)保留域名注册和继续使用争议域名的所有依据和具体理由(答辩书该部分字数应当符合争议解决机构《补充规则》所规定的字数或页数限制);

  (ii)提供被投诉人(域名持有人)及其授权行政程序代理人的姓名、通讯及电子邮件地址以及电话和传真号码;

  (iii)确定在行政程序中就(A)电子文件材料和(B)包含有形书面文件的材料与被投诉人联络的首选通讯方式(包括联系人、联系方式及联络地址);

  (iv)如果投诉人在投诉书中选择一人专家组审理案件(见第3(b)(iv)条),则应声明被投诉人是否选择将争议交由三人专家组裁决;

  (v)如果投诉人抑或被投诉人选择了三人专家组,则应提供将会被指定作为案件专家组成员之一的三位候选专家的姓名和详细的联络信息(这些候选专家可从任一经ICANN确认的争议解决机构专家名单中选定);

  (vi)明确与争议域名有关的已经开始或业已终止的任何其他司法程序;

  (vii)声明已经依照第2(b)条之规定向投诉人发送或传送了答辩书副本;

  (viii)答辩书的结尾应附有下列声明,并经被投诉人或其授权代表签署:

  "被投诉人确认,答辩书中所含信息就其所知是完整的和准确的。该答辩并非出于诸如讹诈等任何不正当目的。被投诉人保证答辩书有关主张是依据本《规则》和应予适用的法律而提出,犹如其现存状态或可由善意及合理抗辩而展延之状态。"

  (ix)任何答辩赖以依存的文件或其他证据应作为附件提交,并应同时提供上述证据的目录索引表。

  (c)如果投诉人选择将争议交由一人专家组裁决,而被投诉人选择将争议交由三人专家组裁决,被投诉人则应承担争议解决机构《补充规则》所规定的三人专家组费用的一半。该费用应在向争议解决机构提交答辩时一并交付。如所应收取的费用未能应要求交付,争议将由一人专家组审理。

  (d)应被投诉人请求,争议解决机构可在个别案件中延长提交答辩的期限。该期限亦可因当事人之书面约定而展延,只要该约定获经争议解决机构批准。

  (e)如果被投诉人未提交答辩,如无特殊情形,专家组应依据投诉书裁决争议。

  6、专家组的指定及裁决期限

  (a)每个争议解决机构应制定并公布包括专家姓名及其适格性在内的专家名册。

  (b)如果投诉人和被投诉人均未选择三人专家组(第3(b)(iv)条和第5(b)(iv)条),争议解决机构将在收到被投诉人答辩或答辩期限届满后5日内从其专家名册中指定一名独任专家。一人专家组费用应全部由投诉人承担。

  (c)如果投诉人或被投诉人之一方选择将争议交由三人专家组裁决,争议解决机构应根据第6(e) 条所规定的程序指定三位专家。三人专家组费用应全部由投诉人承担,但三人专家组由被投诉人选择者除外。在后一种情形下,所涉费用应由双方各半分担。

  (d)除非投诉人已经选择三人专家组,投诉人应在收到有关被投诉人选择三人专家组的答辩书后5个历日内,向争议解决机构提交将被指定作为案件专家组成员之一的三位候选专家的姓名和详细联络信息。这些候选专家可从经ICANN认可的任一争议解决机构的专家名单中选定。

  (e)如果投诉人或被投诉人之一方选择三人专家组,争议解决机构应尽量从投诉人及被投诉人提供的候选专家名单中各自指定一名专家。如果争议解决机构未能在5个历日内按其惯常条件从双方候选专家名单中各自指定一名专家,则争议解决机构将从其专家名册中予以指定。第三名专家应由争议解决机构从其提供给当事人的五位候选专家名单中指定。争议解决机构在指定第三名专家时,应尊重当事人双方在争议解决机构向其提交五位候选专家名单后5个历日内所可能作出的选择,合理地平衡双方当事人的意愿,。

  (f)专家组一经指定,争议解决机构应将指定的专家及如无特殊情况专家组应将有关投诉的裁决提交争议解决机构的日期通知双方当事人。

  7、独立与公正

  专家应独立公正,并应在接受指定前向争议解决机构披露对其独立公正产生合理怀疑的任何情形。如果在行政程序进行过程中的任何阶段出现了可导致对其独立公正产生合理怀疑的新情况,则该专家应立即将该情形向争议解决机构予以披露。在这种情况下,争议解决机构有权指定替代专家。

  8、当事人与专家组之间的联络

  任何一方当事人或其代理人均不得与专家组进行单方联络。当事人一方与专家组或争议解决机构间的所有联络均应通过争议解决机构根据其《补充规则》之规定方式指定的案件经办人进行。

  9、案件移交专家组

  当专家组由一人组成时,该专家一经指定,或当专家组由三人组成时,最后一位专家一经指定,争议解决机构即应将案件移交专家组。

  10、专家组一般性权利

  (a)专家组应以其根据《政策》和本《规则》而认为适当的方式进行行政程序。

  (b)在所有案件中,专家组应确保平等地对待双方当事人,并保证每一方当事人均拥有平等的机会陈述案情。

  (c)专家组应确保行政程序快速进行。专家组可应一方当事人请求或自行决定在特殊情形下延长本《规则》或专家组所确定的时限。

  (d)专家组有权决定证据的可接受性、关联性、实质性和重要性。

  (e)专家组可根据《政策》和本《规则》规定应一方当事人的请求决定对多个域名争议合并审理。

  11、程序所使用的语文

  (a)除非当事人另有约定或注册协议另有规定,以及专家组根据行政解决程序的具体情形另有决定,行政程序所使用的语文应是注册协议所使用的语文。

  (b)专家组可裁定要求当事人提交的任何非以行政程序所应使用的语文制作的文件均应全部或部分地附具行政程序所应使用语言的译文。

  12、进一步陈述

  除投诉书和答辩书外,专家组可自行决定要求当事人一方就所涉案件提供进一步的陈述或提交相关文件。

  13、当庭听证

  除非专家组在特殊情形下自行决定,当庭听证对裁决争议确有必要,正常情况下不举行当庭听证(包括以电话会议、视频会议及网络会议所进行的任何听证)。

  14、缺席

  (a)当事人一方,如无特殊情形,不遵守本《规则》或专家组所确定的任何时限,专家组将继续进行行政程序,直至就所涉投诉作出裁决。

  (b)当事人一方,如无特殊情形,不遵守本《规则》之规定或要求或专家组的任何指令,专家组应以其认为适当的情形对此予以推论。

  15、专家组裁决

  (a)专家组应基于当事人所提交的陈述及证据,根据《政策》、本《规则》以及可予使用的法律规则和原则裁决争议。

  (b)如无特殊情形,专家组应在根据第6条被指定后14日内将有关投诉之裁决提交争议解决机构。

  (c)如果是三人专家组,裁决应以多数意见作出。

  (d)专家组裁决应为书面,说明裁决理由,注明裁决作出日期,并写明专家姓名。

  (e)专家组裁决及有关不同意见通常应符合争议解决机构《补充规则》关于文件长度的要求。任何不同意见均应载入以多数意见所作之裁决。如果专家组认为所涉争议不属于《政策》第4(a) 条所规定之范围,则应予以说明。如果专家组经审阅当事人所提交之文件后认定投诉具有恶意,例如属于反向域名侵夺之情形或其本意在于讹诈域名持有人,专家组应在裁决中宣布,投诉具有恶意并构成对行政程序的滥用。

  16、裁决送达当事人

  (a)争议解决机构应在收到专家组提交的裁决后3个历日内将裁决书全文发送各方当事人、有关注册商及ICANN.有关注册商应立即将根据《政策》之规定执行裁决的日期告知各方当事人、争议解决机构和ICANN.

  (b)除专家组另有决定外(见《政策》第4(j)条),争议解决机构应将裁决全文及其执行日期在一公开网站上予以公布。无论何种情形,裁决中有关投诉构成恶意的部分均应予以公开。

  17、和解或其他终止程序的事理

  (a)如果在专家组作出裁决之前,当事人达成和解,专家组应终止行政程序。

  (b)如果在专家组作出裁决之前,因其他原因行政程序已无必要继续进行或不可能继续进行,专家组应决定终止行政程序,除非一方当事人在专家组规定的时间内提出合理的反对理由。

  18、司法程序的效力

  (a)如果在行政程序开始之前或进行的过程中已就争议域名提起了司法程序,专家组有权自行决定中止或终止行政程序,或继续行政程序,直至作出裁决。

  (b)如果一方当事人在行政程序进行期间就争议域名提起了司法程序,其应立即通知专家组和争议解决机构。见上述第8条。

  19、费用

  (a)投诉人应根据争议解决机构《补充规则》之规定,按规定的时间和金额,向争议解决机构支付固定的基本费用。如果被投诉人根据第5(b)(iv)条之规定选择将争议交由三人专家组裁决,而不是交由投诉人选择的一人专家组裁决,则三人专家组费用的一半应由被投诉人承担,并由其向争议解决机构支付(见第5(c)条)。在其他情形下,争议解决机构所有费用应由投诉人承担,但第19(d)条规定的情形除外。专家组一经指定,争议解决机构应根据争议解决机构《补充规则》的规定,将适当比例的基本费用,如果有的话,返还给投诉人。

  (b)在投诉人未根据第19(a)条之规定向争议解决机构缴纳基本费用前,争议解决机构不应就有关投诉采取行动。

  (c)如果争议解决机构在收到投诉后10个历日内未收到有关费用,视投诉视为撤回,行政程序予以终止。

  (d)在特殊情形下,例如举行当庭听证,争议解决机构应要求当事人双方另外付费。该费用应经协商当事人双方和专家组后确定。

  20、责任排除

  除故意不当行为外,争议解决机构抑或专家均不就与根据本《规则》而进行之行政程序有关的任何行为或疏忽向一方当事人承担责任。

  21、修改

  有关行政程序适用向争议解决机构提交投诉之时有效的本《规则》之文本。本《规则》只有在得到ICANN明示书面确认后方可予以修订。

  (原文见:http://www.icann.org/udrp/udrp-rules-24oct99.htm

  [ 2000年7月24日 ]

发表在 technologys | 统一域名争议解决政策已关闭评论

dom onunload 兼容

window.onload = function() {

  alert(""你好,欢迎光临"");//各浏览器均正常弹出

}

window.onbeforeunload = function() {

  alert(""谢谢光临""); //IE 火狐浏览器提示

  return (""谢谢光临"");//IE 谷歌浏览器提示(opera浏览器只有刷新时提示)

}

window.onunload = function() {

  alert(""再见"");//只有IE正常弹出

  //chrome opera调试都执行该行,但“Blocked alert() during beforeunload.”

  //firefox 刷新执行该行,弹出“NS_ERROR_NOT_AVAILABLE: Component returned failure code: 0 x80040111 (NS_ERROR_NOT_AVAILABLE)     [nsIDOMWindow.alert]”

}

虽然这种功能不再使用,但是还是知道的好……

发表在 technologys | 标签为 | dom onunload 兼容已关闭评论

mobile viewport meta media

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" />   

在网页的<head>中增加以上这句话,可以让网页的宽度自动适应手机屏幕的宽度。
其中:
width=device-width :表示宽度是设备屏幕的宽度
initial-scale=1.0:表示初始的缩放比例
minimum-scale=0.5:表示最小的缩放比例
maximum-scale=2.0:表示最大的缩放比例
user-scalable=yes:表示用户是否可以调整缩放比例
 
如果是想要一打开网页,则自动以原始比例显示,并且不允许用户修改的话,则是:

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />  

这样子写后,就可以把一些页头横幅等的图片的宽度都设置成style="width:100%",整个页面在设备上看起来就是全屏的了。

 

设置meta
mobile默认会像PC上的浏览器一样渲染页面(默认的页面宽度是980px,这个值是可以通过viewport的width属性设置的),然后同比缩放以适应mobile的小屏幕(缩放比例可以通过minimum-scale和maxmum-scale进行设定),因此用户在mobile看这个页面时感觉字体就比较小了,也比较模糊,必须要放大才能看得真切。但是我们可以通过设置viewport来解决,viewport有如下几个属性:
width设置viewport的宽度,即mobile最初模拟PC浏览器的宽度,之后mobile会这个宽度展现的页面同比缩放到mobile屏幕上。设置width=device-width后就不会再进行缩放了,因为宽度正好和mobile的宽度相同(前提是没有设置缩放比例)。
minimum-scale和maximum-scale是控制用户允许设置的缩放比例的。
user-scalable标识是否允许对页面进行缩放,取值有两个yes和no。设置为no则不允许进行页面缩放了。
initial-scale设置 用户最初看到页面时的缩放比例。 我们可以直接在html页面设置好,也可以通过JavaScript来设置,Tangram Mobile实现了相应的设置方法,
baidu.page.setNoScale 设置页面默认不缩放,并且不可缩放
设置media
我们可以利用link标签的media属性来限制CSS的应用范围,通过max-device-width:480px 屏蔽PC;通过only screen屏蔽屏幕阅读设备; 通过orientation: portrait来区分横屏竖屏,
@media all and (min-width:500px) { … }
@media (min-width:500px) { … }
@media (orientation: portrait) { … }
@media all and (orientation: portrait) { … }
@media screen and (min-width: 400px) and (max-width: 700px) { … }

设备翻转状态
通过获取orientation的值来判断翻转状态,那如果设备不支持orientation怎么样,那我们可以通过 innerWidth和innerHeight的比例来判断翻转状态,代码如下(取自Tangram Mobile的getOrientation):

baidu.page.getOrientation = function() { 
    if ("onorientationchange" in window) { 
        return (window.orientation == 0 || window.orientation == 180) ? 'portrait' : 'landscape'; 
    } else { 
        return (windows.innerHeight > windows.innerWidth) ? 'portrait' : 'landscape'; 
    } 
};

 

 

发表在 technologys | 标签为 | mobile viewport meta media已关闭评论

23种设计模式

创建型模式

1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory

工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。

2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句 话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻 松搞掂,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)

建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。

3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)

原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

5、SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)

单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

 

结构型模式

6、ADAPTER—在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)

适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。

7、BRIDGE —早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了

桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。

8、COMPOSITE—Mary今天过生日。“我过生日,你要送我一件礼物。”“嗯,好吧,去商店,你自己 挑。”“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”“喂,买了三件了呀,我只答应送一件礼物的哦。”“什么呀,T恤加裙子加包包,正好 配成一套呀,小姐,麻烦你包起来。”“……”,MM都会用Composite模式了,你会了没有?

合成模式:合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。

9、DECORATOR—Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩 完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞 美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

10、FACADE —我有一个专业的Nikon相机,我就喜欢自己手动调光圈、快门,这样照出来的照片才专业,但MM可不懂这些,教了半天也不会。幸好相机有Facade设计模式,把相机调整到自动档,只要对准目标按快门就行了,一切由相机自动调整,这样MM也可以用这个相机给我拍张照片了。

门面模式:外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

11、FLYWEIGHT —每天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。

享元模式:FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元 模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影 响内蕴状态,它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享 的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

12、PROXY—跟MM在网上聊天,一开头总是“hi,你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?”这些话,真烦人,写个程序做为我的Proxy吧,凡是接收到这些话都设置好了自动的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构 代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出 代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象 必须有系统的其他角色代为创建并传入。

 

行为模式

13、CHAIN OF RESPONSIBLEITY—晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!

责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接

起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户 端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

14、COMMAND—俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我 有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三 个男朋友送COMMAND,就数你最小气,才请我吃面。”,:-(

命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委 派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否 执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

15、INTERPRETER—俺有一个《泡MM真经》,上面有各种泡MM的攻略,比如说去吃西餐的步骤、去看电影的方法等等,跟MM约会时,只要做一个Interpreter,照着上面的脚本执行就可以了。

解释器模式:给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这 个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对 象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对 象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。

16、ITERATOR—我爱上了Mary,不顾一切的向她求婚。

Mary:“想要我跟你结婚,得答应我的条件”

我:“什么条件我都答应,你说吧”

Mary:“我看上了那个一克拉的钻石”

我:“我买,我买,还有吗?”

Mary:“我看上了湖边的那栋别墅”

我:“我买,我买,还有吗?”

Mary:“你的小弟弟必须要有50cm长”

我脑袋嗡的一声,坐在椅子上,一咬牙:“我剪,我剪,还有吗?”

……

迭代子模式:迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称 之为聚集,聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中,从而与聚集本身隔开。迭代子模式简化了聚集的界面。每 一个聚集对象都可以有一个或一个以上的迭代子对象,每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。

17、MEDIATOR—四个MM打麻将,相互之间谁应该给谁多少钱算不清楚了,幸亏当时我在旁边,按照各自的筹码数算钱,赚了钱的从我这里拿,赔了钱的也付给我,一切就OK啦,俺得到了四个MM的电话。

调停者模式:调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散偶 合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对 多的相互作用。调停者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

18、MEMENTO—同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存,这样可以随时察看以前的记录啦。

备忘录模式:备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

19、OBSERVER—想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦

观察者模式:观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

20、STATE—跟MM交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同,比如你约她今天晚上 去看电影,对你没兴趣的MM就会说“有事情啦”,对你不讨厌但还没喜欢上的MM就会说“好啊,不过可以带上我同事么?”,已经喜欢上你的MM就会说“几点 钟?看完电影再去泡吧怎么样?”,当然你看电影过程中表现良好的话,也可以把MM的状态从不讨厌不喜欢变成喜欢哦。

状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模 式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其 行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时,系统便改变所选的子类。

21、STRATEGY—跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,单目的都是为了得到MM的芳心,我的追MM锦囊中有好多Strategy哦。

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策 略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法 和环境独立开来,算法的增减,修改都不会影响到环境和客户端。

22、TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method),但每个步骤针对不同的情况,都有不一样的做法,这就要看你随机应变啦(具体实现);

模板方法模式:模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

23、VISITOR—情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特 点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品 店老板也根据每个人特点选一张卡,这样就轻松多了;

访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这 个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由 的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类 中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构 的成员类。

发表在 technologys | 23种设计模式已关闭评论

SVN trunks branches tags

1.trunk是主分支,是日常开发进行的地方。

2.branches是分支。一些阶段性的release版本,这些版本是可以继续进行开发和维护的,则放在branches目录中。又比如为不同用户客制化的版本,也可以放在分支中进行开发。

3.tags目录一般是只读的,这里存储阶段性的发布版本,只是作为一个里程碑的版本进行存档。
注意:svn并没有明确的规范,更多的还是用户自己的习惯。
下面是详细介绍:
比如一个项目有main.cpp, common.h两个文件,假设目前在开发的是最新的3.0版本,而且1.0/2.0版本也在进行维护,那么项目树将类似如下样子:
project
|
+-- trunk
+ |
+ +----- main.cpp (3.0版本的最新文件)
+ +----- common.h
+
+-- branches
+ |
+ +-- r1.0
+ + |
+ + +---- main.cpp (1.x版本的最新文件)
+ + +---- common.h
+ +
+ +-- r2.0
+ |
+ +---- main.cpp (2.x版本的最新文件)
+ +---- common.h
+
+-- tags (此目录只读)
|
+-- r1.0
+ |
+ +---- main.cpp (1.0版本的发布文件)
+ +---- common.h
+
+-- r1.1
+ |
+ +---- main.cpp (1.1版本的发布文件)
+ +---- common.h
+
+-- r1.2
+ |
+ +---- main.cpp (1.2版本的发布文件)
+ +---- common.h
+
+-- r1.3
+ |
+ +---- main.cpp (1.3版本的发布文件)
+ +---- common.h
+
+-- r2.0
+ |
+ +---- main.cpp (2.0版本的发布文件)
+ +---- common.h
+
+-- r2.1
|
+---- main.cpp (2.1版本的发布文件)
+---- common.h
要使用这样的文件夹结构,在建立项目版本库时,可首先建好项目文件夹,并在其中建立trunk, branches, tags三个空的子目录,再将项目文件夹连同这三个子目录一起导入版本库。
这样在trunk中开始进行开发,当需要建立branch或tag时,使用SVN的copy操作进行。
其中tags目录需要只读,可以使用SVN中的authz文件控制该目录的访问权限为只读。

 

场景案例一:
产品开发已经基本完成,并且通过很严格的测试,这时候我们就想发布我们的1.0版本,不再提交代码
1. svn copy svn://server/trunk svn://server/tags/release-1.0 -m "1.0 released"
场景案例二:
有一个客户想对产品做定制,我们可以从已发布库中选择一个版本,做为起点来开发
1. svn copy svn://server/tags/release-1.0 svn://server/branches/order009 -m "定单009"
场景案例三:
有一天,突然在trunk下的core中发现一个致命的bug,那么所有的branches一定也一样,这时需要进行分支合并
1. svn -r 148:149 merge svn://server/trunk branches/order008
2. svn -r 148:149 merge svn://server/trunk branches/order009
其中148和149是两次修改的版本号。

发表在 technologys | 标签为 | SVN trunks branches tags已关闭评论

.net 文档生成

首先下载微软文档编译工具:

http://sandcastle.codeplex.com/

然后在下个GUI的build工具(类似NDoc):

http://shfb.codeplex.com/

https://github.com/EWSoftware/SHFB/releases

 

全部安装完毕后,打开SHFB gui工具,然后创建一个文档项目,然后右键Document Sources选择添加我们的exe文件,然后编译文档。

 

点击查看原图

 

效果展示:

点击查看原图

发表在 .net | .net 文档生成已关闭评论

oracle license

Oracle软件本身是免费的,所以任何人都可以从Oracle官方网站下载并安装Oracle的数据库软件,收费的是License,即软件授权,如果数据库用于商业用途,就需要购买相应Oracle产品的License。

现在Oracle有两种授权方式,按CPU(Process)数和按用户数(Named User Plus)。前一种方式一般用于用户数不确定或者用户数量很大的情况,典型的如互联网环境,而后一种则通常被用于用户数确定或者较少的情况。



按CPU: License数=CPU 数*系数。系数来自Oracle的一个参数表,如IBM Power6的处理器为1,AMD和Intel的处理器为0.5,详细情况见下:

参数 处理器型号
0.25 Sun UltraSPARC T1 处理器
0.50 Sun UltraSPARC T1处理器
0.50 Intel、AMD处理器
0.50 Sun UltraSPARC T2+ 处理器
1.00 IBM POWER6、POWER7 处理器
0.75 其他多核处理器
1.00 单核处理器

则根据公式可以算出,一个SUN UltraSparc T1的4*8核处理器需要4*8*0.25=8个CPU licenses

按用户数:Oracle用户数的官方定义是每一个访问Oracle数据库的用户,无论是自然人还是设备(如工业环境中的传感器之类),都算作一个用户(Named User)。

英文官方定义:Named User Plus: is defined as an individual authorized by you to use the programs which are installed on a single server or multiple servers, regardless of whether the individual is actively using the programs at any given time. A non human operated device will be counted.

按用户数购买则对应相应的产品有对应的License的最低购买量限制,如下:

产品 最低License数
Oracle Database Standard Edition ONE 5 Named User Plus licenses
Oracle Database Standard Edition 5 Named User Plus licenses
Oracle Database Enterprise Edition 25 Named User Plus licenses per CPU
Oracle Application Server Standard Edition ONE 5 Named User Plus licenses
All other Oracle Application Server products 10 Named User Plus licenses per CPU

当然用户应该根据自己的实际用户数订购,且不少于相应版本所要求的最低用户数。

一般情况下,1CPU的费用约等于50user的费用,所以如果用户数>CPU数*系数*50,则按CPU订购反而更为经济。

每个License还有有效期的分类[不论是User License还是CPU License],分别为:1年、2年、3年、4年、5年、永久。当然价格也是依次增加。

当前Oracle 11G的User License无限使用期的价格为人民币3千5左右,按50个User License无限使用期的购买量则价格为17.5万;每个CPU License无限使用期的价格为17万9千,按IBM小机的系数计算,则购买价格为17万9千,和50个User License的价格相近。

关于服务价格:一般地,购买Oracle的License都包含首年的服务费,以后的费用按每年原价的22%计算。

更多的产品价格可以访问 http://shop.oracle.com 查看。

参考资料:

Oracle Licensing:http://www.orafaq.com/wiki/Oracle_Licensing

Oracle Technology Global Price List:http://www.oracle.com/us/corporate/pricing/technology-price-list-070617.pdf

Oracle Price Lists:http://www.oracle.com/us/corporate/pricing/price-lists/index.html

Oracle Support:http://www.orafaq.com/wiki/Oracle_Support

 

 

一些小常识:

Q:Oracle的订购方式? 

A:有按用户数订购和按CPU订购两种方式,其中按CPU订购也即所谓无限用户版 



Q:Oracle用户数的官方定义? 

A:每一个访问Oracle数据库的用户,无论是自然人还是设备,都算作一个用户(Named User)。 

英文官方定义:Named User Plus: is defined as an individual authorized by you to use the programs which are installed on a single server or multiple servers, regardless of whether the individual is actively using the programs at any given time. A non human operated device will be counted. 



Q: Oracle的用户数是怎么算的呢? 

A:Oracle官方要求的各类版本的最低用户数为: 

个人版本:1user*PC数 

标准版1=服务器的CPU数*5 

标准版=服务器的CPU数*10user 

企业版=服务器的CPU数*25user; 

用户应该根据自己的实际用户数订购,且不少于相应版本所要求的最低用户数。 



Q:什么情况下须按照CPU订购? 

A:访问Oracle的用户数很多,或者无法预估用户数的情况下,应该按照CPU(Processor)订购。 



Q:Processor的官方定义? 

A:等于安装Oracle数据库软件的服务器的CPU总数。 

英文官方定义:Processor: shall be defined as all processors where the Oracle programs are installed and/or running. Programs licensed on a Processor basis may be accessed by your internal users (including agents and contractors) and by your third party users. 



Q:请举例说明? 

A:例如,若用户的应用是基于Internet,Oracle作为网站后台数据库,根据Oracle对用户数的官方定义,每一个通过Internet访问网站(数据库)的都算作1个用户,这样用户数很多,而且无法预估,所以应按照CPU数订购。

 

版本对比

标准版One(Oracle Database Standard Edition One)在使用、运行能力、性能方面提供了空前的灵活性,应用于工作组、部门和web应用。从较少业务的单服务器环境到多方面的分布环境,Oracle Database Standard Edition One为重要业务应用提供了所有必须的功能。
 
标准版(Oracle Database Standard Edition)除了提供了Oracle Database Standard Edition One的功能之外,它还支持多机器的集群服务Real Application Clusters,在Oracle Database 10g之前版本的标准版中不包含Real Application Clusters,在早期版本也不是有效的option。
 
企业版(Oracle Database Enterprise Edition)为重要任务应用提共了性能、有效性、可测量性和安全性等需求,如高吞吐量的联机事务处理(OLTP)应用,密集查询的数据仓库,要求严格的网络应用。Oracle Database Enterprise Edition包含了所有的Oracle数据库组件,具有更加强大的功能,更多优势的选择,详细描述见 Chapter 2 "Options and Packs"
 
个人版(Oracle Database Personal Edition)提供了单用户的开发和部署环境,它的需求与Oracle Database Standard Edition One、Oracle Database Standard Edition、Oracle Database Enterprise Edition全兼容。
 
Personal Edition包含所有包含在企业版中的组件,也包括企业版中所有有效的option,除了Oracle Real Application Clusters,该option不能用于个人版。个人版在以下平台中有效:Windows 2000,Windows NT,Windows XP,Windows Server 2003 (32-bit 和 64-bit 版本)。管理包不包含在个人版中。

发表在 db | 标签为 | oracle license已关闭评论

bind说明

2. DNS 系统基础

Internet上的成千上万台主机都是通过IP地址来区分的。当大家对IP地址了解后,发现去记这些数字很难记。能否有些方便我们记忆的形式来互相访问?在这种需求之下,我们有了DNS(域名) 。

2.1 DNS 定义

DNS 是域名系统 (Domain Name System) 的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务。DNS 命名用于 Internet 等 TCP/IP 网络中,通过用户友好的名称查找计算机和服务。当用户在应用程序中输入 DNS 名称时,DNS 服务可以将此名称解析为与之相关的其他信息,如 IP 地址。

例如,多数用户喜欢使用友好的名称(如 debian.linuxsir.org)来查找计算机,如网络上的邮件服务器或 Web 服务器。友好名称更容易了解和记住。但是,计算机使用数字地址在网络上进行通讯。为更容易地使用网络资源,DNS 等命名系统提供了一种方法,将计算机或服务的用户友好名称映射为数字地址。

下图显示了 DNS 的基本用途,即根据计算机名称查找其 IP 地址。

DNS示意图

本例中,客户端计算机查询 DNS 服务器,要求获得某台计算机(Debian.linuxsir.org)的 IP 地址。由于 DNS 服务器能够根据其本地数据库应答此查询,因此,它将以包含所请求信息的应答来回复客户端,即一条主机 (A) 资源记录,其中含有 Debian.linuxsir.org 的 IP 地址信息(211.93.98.20)。

此例显示了单个客户端与 DNS 服务器之间的简单 DNS 查询。实际上,DNS 查询要复杂得多,包含此处未显示的许多其他步骤。

2.2 DNS的结构

DNS是一个分层级的分散式名称对应系统有点像电脑的目录树结构在最顶端的是一个“.”(root)然後其下分为好几个基本类别名称如com、org、edu等再下面是组织名称如cisco、intel等继而是主机名称如www、mail、ftp等。因为当初internet是从美国发起的所以当时并没有国域名称但随着后来internet的蓬勃发展DNS也加进了诸如cn、jp、au等国域名称。所以一个完整的dns名称就好像是这样的www.xyz.com.cn而整个名称对应的就是一个IP地址了。

在开始的时候root下面只有六个组织类别

类别名称        代表意思            
edu             教育学术单位            
org             组织机构            
net             网路通讯单位            
com             公司企业            
gov             政府机关            
mil             军事单位    

不过自从组织类别名称开放以後各种各样五花八门的名称也相继现出来了但无论如何取名的规则最好量适合网站性质。除了原来的类别资料由美国的NIC(Network Information Center)管理之外其它在国域以下的类别分别由该国的NIC管理。

2.3 DNS 查询的工作原理

当 DNS 客户端需要查询程序中使用的名称时,它会查询 DNS 服务器来解析该名称。客户端发送的每条查询消息都包括三条信息,指定服务器回答的问题:

        
* 指定的 DNS 域名,规定为完全合格的域名 (FQDN)            
* 指定的查询类型,可根据类型指定资源记录,或者指定查询操作的专用类型。            
* DNS 域名的指定类别。   

例如,指定的名称可为计算机的 FQDN,如 Debian.linuxsir.org ,并且指定的查询类型用于通过该名称搜索地址 (A) 资源记录。将 DNS 查询看作客户端向服务器询问由两部分组成的问题,如“您是否拥有名为‘Debian.linuxsir.org’的计算机的 A 资源记录?”当客户端收到来自服务器的应答时,它将读取并解释应答的 A 资源记录,获取根据名称询问的计算机的 IP 地址。

DNS 查询以各种不同的方式进行解析。有时,客户端也可使用从先前的查询获得的缓存信息在本地应答查询。DNS 服务器可使用其自身的资源记录信息缓存来应答查询。DNS 服务器也可代表请求客户端查询或联系其他 DNS 服务器,以便完全解析该名称,并随后将应答返回至客户端。这个过程称为递归。

另外,客户端自己也可尝试联系其他的 DNS 服务器来解析名称。当客户端执行此操作时,它会根据来自服务器的参考答案,使用其他的独立查询。这个过程称为迭代。

总之,DNS 查询进程分两部分进行:

        
* 名称查询从客户端计算机开始,并传输至解析程序即 DNS 客户端服务程序进行解析。            
* 不能在本地解析查询时,可根据需要查询 DNS 服务器来解析名称。  

2.4 Internet上域名命名的一般规则

由于Internet上的各级域名是分别由不同机构管理的,所以,各个机构管理域名的方式和域名命名的规则也有所不同。但域名的命名也有一些共同的规则,主要有以下几点:

    
域名中只能包含以下字符:          
1. 26个英文字母          
2. “0,1,2,3,4,5,6,7,8,9”十个数字          
3. “-”(英文中的连词号)。       
域名中字符的组合规则:           
1. 在域名中,不区分英文字母的大小写           
2. 对于一个域名的长度是有一定限制的    

2.5 常见标准资源记录

SOA(Start Of Authority)

起始授权记录表示一个授权区的开始

A (Address)

将主机名转换为地址。这个字段保存以点分隔的十进制形式的IP地址。任何给定的主机都只能有一个A记录,因为这个记录被认为是授权信息。这个主机的任何附加地址名或地址映射必须用CNAME类型给出

CNAME (Canonical NAME)

给定一个主机的别名,主机的别名记录是在这个主机的A记录中指定的

MX (Mail eXchanger)

建立邮件交换器记录。MX记录告诉邮件传送进程把邮件送到另一个系统,这个系统知道如何将它递送到它的最终目的地

NS (Name Server)

标识一个域的域名服务器。NS资源记录的数据字段包括这个域名服务器的DNS名。我们还需要指定这个名字名字服务器的地址与主机名相匹配的A记录

PTR (domain name PoinTeR)

将地址变换成主机名。主机名必须是规范主机名

BIND (Berkeley Internet Name Domain)是Domain Name System (DNS) 协议的一个实现,提供了DNS主要功能的开放实现,包括

  • 域名服务器 (named)
  • DNS解析库函数
  • DNS服务器运行调试所用的工具

是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护的,

按照ISC的调查报告,BIND是世界上使用最多最广泛的域名服务系统。不论你的邮件服务器,WEB服务器或者其他的services如何的安全可靠,DNS的故障会给你带来用户根本无法访问这些服务。

BIND,也是我们常说的named,由于多数网络应用程序使用其功能,所以在很多BIND的弱点及时被发现。主要分为三个版本:

v4

1998年多数UNIX捆绑的是BIND4,已经被多数厂商抛弃了,除了OpenBSD还在使用。OpenBSD核心人为BIND8过于复杂和不安全,所以继续使用BIND4。这样一来BIND8/9的很多优点都不包括在v4中。

v8

就是如今使用最多最广的版本,其详细内容可以参阅 BIND 8+ 域名服务器安全增强

v9

最新版本的BIND,全部重新写过,免费(但是由商业公司资助),也添加了许多新的功能(但是安全上也可能有更多的问题)。BIND9在2000年十月份推出,现在稳定版本是9.3.2。

3.2 软件的相关资源

官方网站: http://www.bind.com/

最新版本: 9.3.2 http://www.isc.org/sw/bind/bind9.3.php#download

帮助文档: http://www.isc.org/sw/bind/

配置文件样例: http://www.bind.com/bind.html

FAQ: http://www.nominum.com/getOpenSourceResource.php?id=6

3.3 配置环境

       
环境:GNU/Linux Debian/testing Linux 2.6.8-2-386            
版本:bind9  9.3.2-2            
测试域名:mydebian.org            
测试ip: 192.168.102.47  
主域名服务器                    192.168.102.48  
纯缓存域名服务器                192.168.102.49  
辅助域名服务器                  192.168.102.49  
测试客户机  

3.4 配置文件说明

安装bind9的命令:

        
~# aptitude update          
~# aptitude install bind9 bind9-host dnsutils  

配置文件族:

        
# ls /etc/bind/ -l
        total 44
        -rw-r--r-- 1 root root  237 Jan 16  2006 db.0
        -rw-r--r-- 1 root root  271 Jan 16  2006 db.127
        -rw-r--r-- 1 root root  237 Jan 16  2006 db.255
        -rw-r--r-- 1 root root  353 Jan 16  2006 db.empty
        -rw-r--r-- 1 root root  256 Jan 16  2006 db.local
        -rw-r--r-- 1 root root 1507 Jan 16  2006 db.root
        -rw-r--r-- 1 root bind 1611 Jan 16  2006 named.conf
        -rw-r--r-- 1 root bind  165 Jan 16  2006 named.conf.local
        -rw-r--r-- 1 root bind  672 Jan 16  2006 named.conf.options
        -rw-r----- 1 bind bind   77 Aug  4 08:41 rndc.key
        -rw-r--r-- 1 root root 1317 Jan 16  2006 zones.rfc1918
配置文件说明:

named.conf

设置一般的named参数,指向该服务器使用的域数据库的信息源

named.conf.options

全局选项

db.root

根服务器指向文件, 由Internet NIC创建和维护, 无需修改, 但是需要定期更新

db.local

localhost正向区文件,用于将名字localhost转换为本地回送IP地址 (127.0.0.1)

db.127

localhost反向区文件,用于将本地回送IP地址(127.0.0.1)转换为名字localhost

其中,主配置文件/etc/named.conf的配置语句

 命令          用法    
acl           定义IP地址的访问控制清单    
control       定义ndc使用的控制通道    
include       把其他文件包含到配置文件中    
key           定义授权的安全密钥    
logging       定义日志写什么,写到哪     
opitons       定义全局配置选项和缺省值     
server        定义远程服务器的特征    
trunsted-keys 为服务器定义DNSSEC加密密钥    
zone          定义一个区 
 

默认情况下, 内容如下:

        
include "/etc/bind/named.conf.options";

        zone "." {
                type hint;
                file "/etc/bind/db.root";
        };

        zone "localhost" {
                type master;
                file "/etc/bind/db.local";
        };

        zone "127.in-addr.arpa" {
                type master;
                file "/etc/bind/db.127";
        };

        zone "0.in-addr.arpa" {
                type master;
                file "/etc/bind/db.0";
        };

        zone "255.in-addr.arpa" {
                type master;
                file "/etc/bind/db.255";
        };

        include "/etc/bind/named.conf.local";
 

其中type项的值:

master:表示定义的是主域名服务器

slave :表示定义的是辅助域名服务器

hint:表示是互联网中根域名服务器

在Debian环境中,options语句的配置内容, 被移至named.conf.options文件中:

        options {
                directory "/var/cache/bind";

                // If there is a firewall between you and nameservers you want
                // to talk to, you might need to uncomment the query-source
                // directive below.  Previous versions of BIND always asked
                // questions using port 53, but BIND 8.1 and later use an unprivileged
                // port by default.

                // query-source address * port 53;

                // If your ISP provided one or more IP addresses for stable
                // nameservers, you probably want to use them as forwarders.
                // Uncomment the following block, and insert the addresses replacing
                // the all-0's placeholder.

                // forwarders {
                //      0.0.0.0;
                // };

                auth-nxdomain no;    # conform to RFC1035

        };

3.5 创建主域名服务器

a. 首先, 在在192.168.102.47机器上安全bind9

b. 使用编辑器,比如vi, 编辑配置文件/etc/bind/named.conf

加入如下内容

zone "mydebian.org" {

                type master;    //定义此区为主服务器

                file "/etc/bind/db.mydebian";   指定区资源文件的位置

        };





        zone "102.168.192.in-addr.arpa" {

                type master;    //定义此区为主服务器

                file "/etc/bind/db.192";        //指定区资源文件的位置

        };

c. 创建区资源文件:

创建区资源文件/etc/bind/db.mydebian内容如下

 ;

        ; BIND data file for local loopback interface

        ;

        $TTL    604800

        $ORIGIN mydebian.org.

        @       IN      SOA     mydebian.org. root.mydebian.org. (

                                2006080401      ; Serial

                                 604800         ; Refresh

                                  86400         ; Retry

                                2419200         ; Expire

                                 604800 )       ; Negative Cache TTL

        ;



                IN      NS      ns

                IN      MX      0       mail.mydebian.org.

        @       IN      A       192.168.102.47

        ns      IN      A       192.168.102.47

        www     IN      A       192.168.102.47

        webserver       IN      CNAME   www

        mail    IN      A       192.168.102.47

        ftp     IN      A       192.168.102.48

        ns2     IN      A       192.168.102.48

        ns3     IN      A       192.168.102.49



第一行是TTL设定,生存时间记录字段。它以秒为单位定义该资源记录中的信息存放在高速缓存中的时间长度。这里定义为604800秒,也就是1周.

第二行是$ORIGIN设定,说明下面的记录出自何处.请您加倍留意最后的一个小小数点"."

然后,第三行,是一个 SOA 记录的设定,在这里我们看到一个特殊字符 @ ,它就是 ORIGIN 的意思,也就是刚刚所定义的$ ORIGIN mydebian.org. 的内容,您可以写成 mydebian.org. 也可以用 @ 来代替。

假如这个文件前面没有定义 $ ORIGIN 的话, 那這个 @ 的值就以 named.conf 里的 zone .

接着 SOA 后面,指定了这个区域的授权主机和管理者的信箱,这里分别是"mydebian.org." 和"root.mydebian.org."。我们平时使用的信箱通常是“user@host”这样的格式,但因为@在 DNS 记录中是个保留字符,所以在 SOA 中就用“.”来代替了@。目前这个信箱是 "root@mydebian.org."。

接下来的 SOA 设置,是被括在“( )”之间的 5 组数字,主要作为和 slave 服务器同步 DNS 资料所使用的资料:

Serial:其格式通常会是“年月日+修改次序”(但也不一定如此,您自己能够记得就行)。当 slave 要进行资料同步的时候,会比较这个号码。如果发现在这里的号码比它那边的数值“大”,就进行更新,否则忽略。不过设 serial 有一个地方您要留意:不能超过 10 位数字!

Refresh:这里是是告诉 slave 要隔多久要进行资料同步(是否同步要看 Serial 的比较结果)。

Retry:如果 slave 在进行更新失败后,要隔多久再进行重试。

Expire:这是记录逾期时间:当 slave 一直未能成功与 master 取得联系,那到这里就放弃 retry,同时这里的资料也将标识为过期(

expired )。

Minimum:这是最小默认 TTL 值,如果您在前面没有用“$TTL”来定义,就会以此值为准。

请注意:SOA 记录中这对 “ ( ) ”符号之第一个 “ (”括号一定要和 SOA 写在同一行,而不能用 Enter 断行到下一行去,而且其左边最好有一个空格键或 tab 建。而最后一个 “ )”括号也不能写在注解符号 “ ;”的右边。 置 DNS 的 RR 记录档,其格式要求非常严格,我们丝毫不能掉以轻心。比方说:如果句子不是以空格键、Tab 键、 或注解符号 ( ; )开头,也不在 SOA 的 “ ( ) ”之内, 则表示要定义一个“新记录项 (Entry) ”;如果句子是以空格键或 tab 键开始的话,其设置被视为上一个“记录项”的内容。所以,如果您要为“同一个记录项”定义多个记录设置,而不想重复打字,您倒可以偷懒:在接着它的后面几行用空白或 Tab 来缩排就可以了。

NS表明负责mydebian.org.这个域的Name Server是mydebian.org这台主机

MX记录标明发往mydebian.org域的邮件由mail.mydebian.org这台服务器接收

A记录标明了IP地址和域名之间的对应关系

接下来创建该区的反向映射资源文件

/etc/bind/db.192内容如下:

;

        ; BIND reverse data file for local loopback interface

        ;

        $TTL    604800

        @       IN      SOA     mydebian.org. root.mydebian.org. (

                                2006080401      ; Serial

                                 604800         ; Refresh

                                  86400         ; Retry

                                2419200         ; Expire

                                 604800 )       ; Negative Cache TTL

        ;

        @       IN      NS      mydebian.org.

        47      IN      PTR     mail.mydebian.org.

        47      IN      PTR     www.mydebian.org.

        47      IN      PTR     ns.mydebian.org.

        48      IN      PTR     ftp.mydebian.org.

        48      IN      PTR     ns2.mydebian.org.

        49      IN      PTR     ns3.mydebian.org.

其中PTR记录用来解析IP地址对应的域名

d. 重启DNS服务

  /etc/init.d/bind9 restart


此时查看系统日志,可了解BIND的启动情况,比如如下输出,则说明引导正常

tonybox:~# tail /var/log/syslog

        Aug 14 08:36:45 localhost named[2792]: zone 127.in-addr.arpa/IN: loaded serial 1

        Aug 14 08:36:45 localhost named[2792]: zone 102.168.192.in-addr.arpa/IN: loaded serial 2006080801

        Aug 14 08:36:45 localhost named[2792]: zone 255.in-addr.arpa/IN: loaded serial 1

        Aug 14 08:36:45 localhost named[2792]: zone localhost/IN: loaded serial 1

        Aug 14 08:36:45 localhost named[2792]: zone mydebian.org/IN: loaded serial 2006080801

        Aug 14 08:36:45 localhost named[2792]: running

        Aug 14 08:36:45 localhost named[2792]: zone mydebian.org/IN: sending notifies (serial 2006080801)

        Aug 14 08:36:45 localhost named[2792]: zone 102.168.192.in-addr.arpa/IN: sending notifies (serial 2006080801)

        Aug 14 08:36:45 localhost named[2792]: client 192.168.102.47#1030: received notify for zone 'mydebian.org'

        Aug 14 08:36:45 localhost named[2792]: client 192.168.102.47#1030: received notify for zone '102.168.192.in-addr.arpa'



e. 在客户机上的设置

 # cat /etc/resolv.conf

        search mydebian.org

        nameserver 192.168.102.47

f. 测试:

使用nslookup 测试

tonybox2:~# nslookup

        > set type=any

        > mydebian.org

        Server:         192.168.102.47

        Address:        192.168.102.47#53



        mydebian.org

                origin = mydebian.org

                mail addr = root.mydebian.org

                serial = 2006080801

                refresh = 604800

                retry = 86400

                expire = 2419200

                minimum = 604800

        mydebian.org    nameserver = ns.mydebian.org.

        mydebian.org    mail exchanger = 0 mail.mydebian.org.

        Name:   mydebian.org

        Address: 192.168.102.47

使用dig测试

tonybox2:~# dig @192.168.102.47 mydebian.org



        ; <<>> DiG 9.3.2 <<>> @192.168.102.47 mydebian.org

        ; (1 server found)

        ;; global options:  printcmd

        ;; Got answer:

        ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41793

        ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1



        ;; QUESTION SECTION:

        ;mydebian.org.                  IN      A



        ;; ANSWER SECTION:

        mydebian.org.           604800  IN      A       192.168.102.47



        ;; AUTHORITY SECTION:

        mydebian.org.           604800  IN      NS      ns.mydebian.org.



        ;; ADDITIONAL SECTION:

        ns.mydebian.org.        604800  IN      A       192.168.102.47



        ;; Query time: 31 msec

        ;; SERVER: 192.168.102.47#53(192.168.102.47)

        ;; WHEN: Mon Aug 14 09:16:27 2006

        ;; MSG SIZE  rcvd: 79





        tonybox2:~# dig @192.168.102.47 ftp.mydebian.org



        ; <<>> DiG 9.3.2 <<>> @192.168.102.47 ftp.mydebian.org

        ; (1 server found)

        ;; global options:  printcmd

        ;; Got answer:

        ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63890

        ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1



        ;; QUESTION SECTION:

        ;ftp.mydebian.org.              IN      A



        ;; ANSWER SECTION:

        ftp.mydebian.org.       604800  IN      A       192.168.102.48



        ;; AUTHORITY SECTION:

        mydebian.org.           604800  IN      NS      ns.mydebian.org.



        ;; ADDITIONAL SECTION:

        ns.mydebian.org.        604800  IN      A       192.168.102.47



        ;; Query time: 22 msec

        ;; SERVER: 192.168.102.47#53(192.168.102.47)

        ;; WHEN: Mon Aug 14 09:16:41 2006

        ;; MSG SIZE  rcvd: 83

反向查询

tonybox2:~# dig @192.168.102.47 -x 192.168.102.47



        ; <<>> DiG 9.3.2 <<>> @192.168.102.47 -x 192.168.102.47

        ; (1 server found)

        ;; global options:  printcmd

        ;; Got answer:

        ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21885

        ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1



        ;; QUESTION SECTION:

        ;47.102.168.192.in-addr.arpa.   IN      PTR



        ;; ANSWER SECTION:

        47.102.168.192.in-addr.arpa. 604800 IN  PTR     www.mydebian.org.

        47.102.168.192.in-addr.arpa. 604800 IN  PTR     mail.mydebian.org.

        47.102.168.192.in-addr.arpa. 604800 IN  PTR     mydebian.org.



        ;; AUTHORITY SECTION:

        102.168.192.in-addr.arpa. 604800 IN     NS      mydebian.org.



        ;; ADDITIONAL SECTION:

        mydebian.org.           604800  IN      A       192.168.102.47



        ;; Query time: 33 msec

        ;; SERVER: 192.168.102.47#53(192.168.102.47)

        ;; WHEN: Mon Aug 14 09:17:00 2006

        ;; MSG SIZE  rcvd: 138

3.6 纯缓存域名服务器

192.168.102.48 为我们的dns 缓存服务器,首先, 在在192.168.102.48 机器上安全bind9, 在配置前我们用dig 进行测试

tonybox2:/etc/bind# dig @192.168.102.48 www.mydebian.org



        ; <<>> DiG 9.3.2 <<>> @192.168.102.48 www.mydebian.org

        ; (1 server found)

        ;; global options:  printcmd

        ;; Got answer:

        ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 34137

        ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0



        ;; QUESTION SECTION:

        ;www.mydebian.org.              IN      A



        ;; Query time: 1844 msec

        ;; SERVER: 192.168.102.48#53(192.168.102.48)

        ;; WHEN: Tue Aug  8 12:05:17 2006

        ;; MSG SIZE  rcvd: 34

修改named.conf.options文件

tonybox2:/etc/bind# cat named.conf.options

        options {

                directory "/var/cache/bind";



                // If there is a firewall between you and nameservers you want

                // to talk to, you might need to uncomment the query-source

                // directive below.  Previous versions of BIND always asked

                // questions using port 53, but BIND 8.1 and later use an unprivileged

                // port by default.



                // query-source address * port 53;



                // If your ISP provided one or more IP addresses for stable

                // nameservers, you probably want to use them as forwarders.

                // Uncomment the following block, and insert the addresses replacing

                // the all-0's placeholder.



                 forwarders {

                        192.168.102.47;  //主域名服务器的IP地址

                 };



                auth-nxdomain no;    # conform to RFC1035



        };

然后再进行测试

tonybox2:/etc/bind# dig @192.168.102.48 www.mydebian.org



        ; <<>> DiG 9.3.2 <<>> @192.168.102.48 www.mydebian.org

        ; (1 server found)

        ;; global options:  printcmd

        ;; Got answer:

        ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54332

        ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1



        ;; QUESTION SECTION:

        ;www.mydebian.org.              IN      A



        ;; ANSWER SECTION:

        www.mydebian.org.       604800  IN      A       192.168.102.47



        ;; AUTHORITY SECTION:

        mydebian.org.           604800  IN      NS      mydebian.org.



        ;; ADDITIONAL SECTION:

        mydebian.org.           604800  IN      A       192.168.102.47



        ;; Query time: 44 msec

        ;; SERVER: 192.168.102.48#53(192.168.102.48)

        ;; WHEN: Tue Aug  8 12:05:47 2006

        ;; MSG SIZE  rcvd: 80

所谓的 forwarder,就是当某一台 NS 主机遇到非本机负责的 zone ( slave zone 也属于本机负责的范围) 查询请求的时候,将不直接向 "." zone 查询而把请求转交给指定的 forwarder (一台或多台) 主机代为查询。

我们知道,当DNS服务器接到客户端主机的查询请求时,首先会检查这个查询是否属于本机管辖,否则将转向 "." zone 再逐级的查询下去,最后再把查询结果告诉客户端。

在这个过程之中,DNS服务器还会将查询到的结果存放到缓存中。只要缓存中的 TTL 没过期,在下次遇到同样查询的时候,就可以直接将结果响应给客户端,而无需再重复上次的查询流程。

如果DNS服务器上指定了forwarder,那这个DNS发现缓存中没有记录时,将不向 "." 查询,而是向 forwarder 送出同样的请求(转发),然后等待查询结果,即把逐级往下查询这个耗费精力的动作,交给 forwarder 负责。但无论这个结果是自己直接查询得来的,还是 forwarder 送回来的,DNS服务器都会保存一份数据在缓存中。

这样,以后的相同查询就快多了,这对于DNS所服务的 客户端而言查询效率会提高很多。

       /var/named/named.ca

        dig @a.root-servers.net . ns > /var/named/named.ca

3.7 辅助域名服务器

a. 192.168.102.49 为我们的dns 缓存服务器,首先, 在在192.168.102.49 机器上安全bind9,

b. 在主配置文件/etc/named.conf中加入如下内容:

 zone "mydebian.org" {

                type slave;

                file "/etc/bind/slaves/db.mydebian";

                masters {192.168.102.47;};

        };



        zone "102.168.192.in-addr.arpa" {

                type slave;

                file "/etc/bind/slaves/db.192";

                masters {192.168.102.47;};

        };

type后面的值已经成为slave; 表示定义的是辅助域名服务器

file 后面也可以是别的文件名不必与主域DNS服务器的设置一样

masters 后为主域DNS服务器的IP地址, 可以是多个IP,型如

masters {ip1;ip2;ip3;};





c. 创建/etc/bind/slaves/目录

        tonybox2:/etc/bind# mkdir slaves



        tonybox2:/etc/bind# chown bind.bind slaves

d. 重启dns服务

        tonybox2:/etc/bind/slaves# /etc/init.d/bind9 restart  

named进程第一次启动时,辅助域名服务器就下载主域名服务器的信息;辅助域名服务器根据主域名服务器的对应SOA记录规定的刷新时间间隔,去主域名服务器查询相关信息。

        tonybox2:/etc/bind/slaves# ls -l
        total 8
        -rw-r--r-- 1 bind bind 410 2006-08-08 12:23 db.192
        -rw-r--r-- 1 bind bind 430 2006-08-08 12:23 db.mydebian

查看 /etc/bind/slaves 目录,我门会发现已经从主域名服务器获取了相应的资源文件

如果用户bind对于/etc/bind/slaves目录没有写权限, 则查看 /var/log/syslog 会出现如下类似错误:

tonybox:~# tail /var/log/syslog



        Aug  8 12:30:09 tonybox2 named[3849]: zone mydebian.org/IN: Transfer started.

        Aug  8 12:30:09 tonybox2 named[3849]: transfer of 'mydebian.org/IN' from 192.168.102.47#53: connected using 192.168.102.15#1075

        Aug  8 12:30:09 tonybox2 named[3849]: dumping master file: /etc/bind/tmp-VHTxU6CT5n: open: permission denied

        Aug  8 12:30:09 tonybox2 named[3849]: transfer of 'mydebian.org/IN' from 192.168.102.47#53: failed while receiving responses: permission denied

        Aug  8 12:30:09 tonybox2 named[3849]: transfer of 'mydebian.org/IN' from 192.168.102.47#53: end of transfer

        Aug  8 12:30:10 tonybox2 named[3849]: zone 102.168.192.in-addr.arpa/IN: Transfer started.

        Aug  8 12:30:10 tonybox2 named[3849]: transfer of '102.168.192.in-addr.arpa/IN' from 192.168.102.47#53: connected using 192.168.102.15#1076

        Aug  8 12:30:10 tonybox2 named[3849]: dumping master file: /etc/bind/tmp-dxbiD1JtTK: open: permission denied

        Aug  8 12:30:10 tonybox2 named[3849]: transfer of '102.168.192.in-addr.arpa/IN' from 192.168.102.47#53: failed while receiving responses: permission denied

        Aug  8 12:30:10 tonybox2 named[3849]: transfer of '102.168.192.in-addr.arpa/IN' from 192.168.102.47#53: end of transfer

注:    解决办法一,对于启动了SELINUX的系统,在/etc/sysconfig/named 中有一行说明,需要开启相应的配置
ENABLE_ZONE_WRITE=yes 
同时执行命令 #setsebool named_write_master_zones 1
另外一个办法,直接关闭SELINUX,关闭后错误解决,方法:

/usr/bin/setenforce 修改SELinux的实时运行模式

setenforce 1 设置SELinux 成为enforcing模式

setenforce 0 设置SELinux 成为permissive模式

彻底禁用SELinux 需要在/etc/sysconfig/selinux中设置参数selinux=0 ,或者在/etc/grub.conf中添加这个参数

4. 安全设置:

4.1 版本信息

在named.conf.options配置文件中加入:

de>

        version     "None of your business";  

de>

当别人要探测我们DNS服务器的版本时,对方得到的将是None of your business :)

4.2 地址监听

在named.conf.options配置文件中加入:

de>

        Listen-on{192.168.102.47;};  

de>

如果DNS服务运行在有多个网卡的服务器上,那么默认的它会在所有网卡接口上监听服务,这个选项告诉它只在指定的借口上进行服务监听。

4.3 访问控制列表

首先定义访问控制列表

在/etc/bind/named.conf文件的最上部添加如下内容:

de>

        include "/etc/bind/named.conf.acls";  

de>

创建/etc/bind/named.conf.acls文件,内容如下:

de>

        acl denied {            192.168.0.0/24;            };            acl intra-net {            192.168.102.0/24;            };            acl slave {            192.168.102.49;            }  

de>

如果不想让192.168.0.0/24网段使用DNS服务器,则可以在 named.conf.options 文件的options内部加入:

de>

        blackhole {denied;};  

de>

如果只想相让192.168.102.0/24;网段使用DNS服务器,则可以在 named.conf.options 文件的options内部加入:

de>

        allow-query { intra-net; };  

de>

如果只想对某个区资源作限制,也可将blackhole/allow-query指令加入到named.conf的对应zone中去。比如:

de>

        zone "mydebian.org" {                  type master;                  file "/etc/bind/db.mydebian";                  allow-query { intra-net; };          };  

de>

4.4 传送控制

使用的是allow-transfer指令,用于设定允许从主域名服务器更新资源文件的辅助域名服务器的ip地址

使用方法,如:

de>

        allow-query{ slave;};  

de>

根据需求可以加在/etc/bind/named.conf的对应zone中去,对某个区资源做限制, 或加入到/etc/bind/named.conf.options文件中,多所有的区资源文件作限制。

5. 参考文献

http://www.isc.org/index.pl?/sw/bind/FAQ.php

Building A Debian DNS System

Two-in-one DNS server with BIND9

Traditional DNS Howto

DNS配置过程/debian

鸟哥的 Linux 私房菜

http://www.cublog.cn/opera/showart.php?blogid=12066&id=60600

http://blog.csdn.net/marcolu/archive/2004/06/30/30735.aspx

使用TSIG和DNSSEC加固域名服务器

BIND Manual Pages, BIND 9 User Guide

http://www.bind9.net/manual/bind/9.3.2/Bv9ARM.ch06.html#options

http://edu.tmn.cn/html/5/48/2005223/234756.htm

bind-9.3.1 + mysql-4.1.9 + web管理详细配置全过程

http://osmond.cn/rh9/slides/toc.html

6. 附录

BIND相关的一些工具介绍

dig

dig查询DNS服务器。

host

host是一个DNS查找工具。

rndc

rndc控制BIND的操作。

rndc-confgen

rndc-confgen生成rndc.conf文件

named-checkconf

named-checkconf检查named.conf文件的语法。

named-checkzone

named-checkzone检查区域文件的合法性。

lwresd

lwresd是为本地进程提供的只有缓存的名字服务器。

named

named是名字服务器守护进程。

dnssec-signzone

dnssec-signzone生成带有签名的区域文件。

dnssec-signkey

dnssec-signkey为区域文件密钥集生成签名。

dnssec-keygen

dnssec-keygen是DNS密钥生成器。

dnssec-makekeyset

dnssec-makekeyset利用dnssec-keygen生成的一个或多个密钥创建密钥集。

nsupdate

nsupdate用于提交DNS更新请求。

发表在 technologys | 标签为 , | bind说明已关闭评论

glibc bug

Linux GNU glibc标准库的 gethostbyname函数爆出缓冲区溢出漏洞,漏洞编号为CVE-2015-0235。黑客可以通过gethostbyname系列函数实现远程代码执行,获取服务器的控制权及Shell权限
 
一、    漏洞发布日期 
2015年1月27日 
 
二、    已确认被成功利用的软件及系统 
Glibc 2.2到2.17 (包含2.2和2.17版本) 
 
三、    漏洞描述 
GNU glibc标准库的gethostbyname 函数爆出缓冲区溢出漏洞,漏洞编号:CVE-2015-0235。 Glibc 是提供系统调用和基本函数的 C 库,比如open, malloc, printf等等。所有动态连接的程序都要用到Glibc。远程攻击者可以利用这个漏洞执行任意代码并提升运行应用程序的用户的权限。 
 
四、    漏洞检测方法 
请自行检测: 
[[test]] 
$ cat > GHOST.c << EOF 
#include <netdb.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <errno.h> 
#define CANARY"in_the_coal_mine" 
struct { 
  char buffer[1024]; 
  char canary[sizeof(CANARY)]; 
} temp = { "buffer", CANARY }; 
int main(void) { 
  struct hostent resbuf; 
  struct hostent *result; 
  int herrno; 
  int retval; 
  /*** strlen (name) = size_needed -sizeof (*host_addr) - sizeof (*h_addr_ptrs) - 1; ***/ 
  size_t len = sizeof(temp.buffer) -16*sizeof(unsigned char) - 2*sizeof(char *) - 1; 
  char name[sizeof(temp.buffer)]; 
  memset(name, '0', len); 
  name[len] = '\0'; 
  retval = gethostbyname_r(name,&resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno); 
  if (strcmp(temp.canary, CANARY) !=0) { 
    puts("vulnerable"); 
    exit(EXIT_SUCCESS); 
  } 
  if (retval == ERANGE) { 
    puts("notvulnerable"); 
    exit(EXIT_SUCCESS); 
  } 
  puts("should nothappen"); 
  exit(EXIT_FAILURE); 

EOF 
[test] 
$ gcc GHOST.c -o GHOST 
[test] 
$./GHOST 
vulnerable 
 
五、    建议修补方案 
 
 
Centos 5/6/7:
 
 
yum update glibc

 

资料来源:http://bbs.aliyun.com/read/227885.html

发表在 linux | 标签为 | glibc bug已关闭评论

systemctl, chkconfig

systemctl 对比表
任务 旧指令 新指令
使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service
使某服务不自动启动 chkconfig --level 3 httpd off systemctl disable httpd.service
检查服务状态 service httpd status systemctl status httpd.service (服务详细信息) systemctl is-active httpd.service (仅显示是否 Active)
显示所有已启动的服务 chkconfig --list systemctl list-units --type=service
启动某服务 service httpd start systemctl start httpd.service
停止某服务 service httpd stop systemctl stop httpd.service
重启某服务 service httpd restart systemctl restart httpd.service
发表在 linux | 标签为 , | systemctl, chkconfig已关闭评论

linux install

passwd
update openssl

update glibc

vi /etc/hosts
vi /etc/resolv.conf
vi /etc/sysconfig/network
import iptables
hostname xxxxxxxxxxxxxx
vi /etc/modprobe.d/dist.conf

alias net-pf-10 off
alias ipv6 off

vi /etc/inittab

date -R

1.查看当前使用的时区
cat /etc/sysconfig/clock
# The timezone of the system is defined by the contents of /etc/localtime.
ZONE="Asia/Shanghai"
UTC=true
ARC=false

2.修改时区
进入/usr/share/zoneinfo目录,可以看到很多时区文件,将其中要用的时区(此处以上海为例)
命令:
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

3. ntp时间更新
yum install ntp
ntpdate us.pool.ntp.org

4.时间修改参考

http://www.xiaobo.li/linux/472.html

发表在 linux | linux install已关闭评论

logrotate 日志轮转

logrotate -f /etc/logrotate.conf

 

手动执行:

logrotate 可以直接执行,后面跟配置文件就可以了,如:/usr/sbin/logrotate -f /etc/logrotate.d/nginx

参数:

-v 显示指令执行过程

-d Debug模式(模拟执行),详细显示指令执行过程,便于排错或了解程序执行的情况。

-f 强制执行

-s <状态文件> 使用指定的状态文件

 

主要参数:

默认配置文件 /etc/logrotate.conf:

daily指定转储周期为每天

weekly指定转储周期为每周

monthly指定转储周期为每月

dateext 切换后的日志文件会附加上一个短横线和YYYYMMDD格式的日期,没有这个配置项会附加一个小数点加一个数字序号.

dateformat 配合dateext使用可以为切割后的日志加上YYYYMMDD格式的日期,如dateformat -%Y%m%d

compress通过gzip 压缩转储以后的日志

nocompress不需要压缩时,用这个参数

copytruncate先把日志内容复制到旧日志文件后才清除日志文件内容,可以保证日志记录的连续性

nocopytruncate备份日志文件但是不截断

create mode owner group转储文件,使用指定的文件模式创建新的日志文件

nocreate不建立新的日志文件

delaycompress和 compress 一起使用时,转储的日志文件到下一次转储时才压缩

nodelaycompress覆盖 delaycompress 选项,转储同时压缩。

errors address专储时的错误信息发送到指定的Email 地址

ifempty即使是空文件也转储,这个是 logrotate 的缺省选项。

notifempty如果是空文件的话,不转储

mail address把转储的日志文件发送到指定的E-mail 地址

nomail转储时不发送日志文件

olddir directory转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统

noolddir转储后的日志文件和当前日志文件放在同一个目录下

rotate count指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份

tabootext [+] list让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~

size size当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).

prerotate/endscript在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行

postrotate/endscript在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行

 

案例一:

vi /etc/logrotate.d/nginx

/var/log/nginx/*.log

{

daily#指定转储周期为每天

missingok #跳过错误日志文件

rotate 5#保留5个文件

compress#通过gzip 压缩转储以后的日志

delaycompress#和 compress 一起使用时,转储的日志文件到下一次转储时才压缩

ifempty

create 0640 www-data adm

sharedscripts

postrotate

#kill -USR1 `cat /var/run/nginx.pid不是中止Nginx的进程,而是传递给它信号重新生成日志,如果nginx没启动不做操作

[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

endscript

}

 

案例二:

/var/log/debug.log
{
        daily   ;每天转储
        rotate 30  ;保留30个备份
        compress   ;压缩转储的备份文件
        copytruncate ;备份当前日志并截断
        nocreate      ;不创建新的日志文件
        delaycompress  ;转储的日志文件到下一次转储时才压缩
        notifempty  ;日志为空不转储
        dateext   ; 为日志文件打上日期标签
}

 

案例三:

/var/log/messages
{
missingok
notifempty
copytruncate
size 1M
daily
rotate 10
create 0600 root root
dateformat -%Y%m%d.%s
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

 

 

 

 

 

 

发表在 linux | 标签为 , | logrotate 日志轮转已关闭评论

ssh

#添加用户

useradd uesrname

#设置用户密码

passwd username

 

允许/禁止root登录
vi /etc/ssh/sshd_config

#是否允许root登录

PermitRootLogin yes/no

 

#是否允许不输入密码登录
PermitEmptyPasswords yes

 

#设置允许远程登录的用户

AllowUsers uesrname username1

 

[修改文件权限,700表示为用户设置读、写、执行的权限(开头的 7),而不给组和其他用户的权限(后面的两个 0)]
$ chmod u+w /etc/sudoers
$ vi /etc/sudoers
$ chmod u-w /etc/sudoers


保存公钥/私钥,在服务器上执行以下命令:
$ mkdir ~/.ssh
$ touch ~/.ssh/authorized_keys

#权限设置(RHEL/CENTOS系统必需)
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

ssh-rsa TMiZRfW0cENRnGRgQPR1dCDv4GJwpcQi... ... username

 

配置说明:

AcceptEnv

 只支持SSHv2协议

 指定客户端发送的哪些环境变量将会被传递到会话环境中。具体的细节可以参考 ssh_config5 中的 SendEnv 配置指令。

该关健字的值是空格分隔的变量名列表(其中可以使用’*'和’?'作为通配符),也可以使用多个AcceptEnv达到同样的目的。需要注意的是,有些环境变量可能会被用于绕过禁止用户使用的环境变量。由于这个原因,该指令应当小心使用默认值:是不传递任何环境变量

 

AddressFamily 

指定sshd8)应当使用哪种地址族,取值范围:”any”(默认)、”inet”(仅IPv4)、”inet6″(仅IPv6

 

AllowGroups 

这个指令后面跟着一串用空格分隔的组名列表(其中可以使用”*”和”?”通配符),默认允许所有组登录。如果使用了这个指令,那么将仅允许这些组中的成员登录,而拒绝其它所有组。这里的”组”是指”主组”(primary group),也就是/etc/passwd文件中指定的组。

这里只允许使用组的名字而不允许使用GID。相关的 allow/deny 指令按照下列顺序处理:DenyUsers --> AllowUsers --> DenyGroups-->AllowGroups

 

AllowTcpForwarding

是否允许TCP转发,默认值为”yes”。

禁止TCP转发并不能增强安全性,除非禁止了用户对shell的访问,因为用户可以安装他们自己的转发器

 

AllowUsers 

这个指令后面跟着一串用空格分隔的用户名列表(其中可以使用”*”和”?”通配符)。默认允许所有用户登录。

如果使用了这个指令,那么将仅允许这些用户登录,而拒绝其它所有用户。

如果指定了 USER@HOST 模式的用户,那么 USER  HOST 将同时被检查。

这里只允许使用用户的名字而不允许使用UID。相关的 allow/deny 指令按照下列顺序处理:

DenyUsers -->AllowUsers-->DenyGroups --> AllowGroups

 

AuthorizedKeysFile

存放该用户可以用来登录的 RSA/DSA 公钥。

该指令中可以使用下列根据连接时的实际情况进行展开的符号:%% 表示’%'%h 表示用户的主目录、%u 表示该用户的用户名。经过扩展之后的值必须要么是绝对路径,要么是相对于用户主目录的相对路径。默认值是”.ssh/authorized_keys

 

Banner

 只支持SSHv2协议

 将这个指令指定的文件中的内容在用户进行认证前显示给远程用户。默认什么内容也不显示。”none”表示禁用这个特性

ChallengeResponseAuthentication 

 是否允许质疑-应答(challenge-response)认证。默认值是”yes”。所有login.conf5 中允许的认证方式都被支持

 

Ciphers

 只支持SSHv2协议

 指定SSH-2允许使用的加密算法。多个算法之间使用逗号分隔。可以使用的算法如下:

aes128-cbc”, aes192-cbc”, aes256-cbc”, aes128-ctr”, aes192-ctr”, aes256-ctr”, 3des-cbc”, arcfour128″,arcfour256″, arcfour”, blowfish-cbc”, cast128-cbc

默认值是可以使用上述所有算法

 

ClientAliveCountMax

 只支持SSHv2协议

 Sshd8)在未收到任何客户端回应前最多允许发送多少个”alive”消息。默认值是 3 

到达这个上限后,sshd8 将强制断开连接、关闭会话。

需要注意的是,”alive”消息与 TCPKeepAlive 有很大差异。

alive”消息是通过加密连接发送的,因此不会被欺骗;而 TCPKeepAlive 却是可以被欺骗的。

如果ClientAliveInterval被设为15 并且将 ClientAliveCountMax 保持为默认值,那么无应答的客户端大约会在45秒后被强制断开

 

ClientAliveInterval

 只支持SSHv2协议

 设置一个以秒记的时长,如果超过这么长时间没有收到客户端的任何数据,sshd8 将通过安全通道向客户端发送一个”alive”消息,并等候应答。默认值 0 表示不发送”alive”消息

 

Compression

 是否对通信数据进行加密,还是延迟到认证成功之后再对通信数据加密。可用值:”yes” “delayed”(默认), “no”

 

DenyGroups

 这个指令后面跟着一串用空格分隔的组名列表(其中可以使用”*””?”通配符)。默认允许所有组登录。

如果使用了这个指令,那么这些组中的成员将被拒绝登录。

这里的是指主组primary group),也就是/etc/passwd文件中指定的组。

这里只允许使用组的名字而不允许使用GID。相关的 allow/deny 指令按照下列顺序处理:DenyUsers -> AllowUsers -> DenyGroups -> AllowGroups

 

DenyUsers

 这个指令后面跟着一串用空格分隔的用户名列表(其中可以使用”*””?”通配符)。默认允许所有用户登录。

如果使用了这个指令,那么这些用户将被拒绝登录。

如果指定了 USER@HOST 模式的用户,那么 USER  HOST 将同时被检查。

这里只允许使用用户的名字而不允许使用UID。相关的 allow/deny 指令按照下列顺序处理:

DenyUsers -> AllowUsers -> DenyGroups -> AllowGroups

 

ForceCommand 

强制执行这里指定的命令而忽略客户端提供的任何命令。这个命令将使用用户的登录shell执行(shell -c)。

这可以应用于 shell 、命令、子系统的完成,通常用于 Match 块中。

这个命令最初是在客户端通过 SSH_ORIGINAL_COMMAND 环境变量来支持的

 

GatewayPorts

 是否允许远程主机连接本地的转发端口。默认值是”no”

sshd8 默认将远程端口转发绑定到loopback地址。这样将阻止其它远程主机连接到转发端口。

GatewayPorts 指令可以让 sshd 将远程端口转发绑定到非loopback地址,这样就可以允许远程主机连接了。

“no”表示仅允许本地连接,”yes”表示强制将远程端口转发绑定到统配地址(wildcard address),

“clientspecified”表示允许客户端选择将远程端口转发绑定到哪个地址

 

GSSAPIAuthentication

只支持SSHv2协议

是否允许使用基于 GSSAPI 的用户认证。默认值为”no”

 

GSSAPICleanupCredentials

只支持SSHv2协议

是否在用户退出登录后自动销毁用户凭证缓存。默认值是”yes”

 

HostbasedAuthentication

只支持SSHv2协议

这个指令与 RhostsRSAAuthentication 类似,推荐使用默认值”no”不禁止这种不安全的认证方式

 

HostbasedUsesNameFromPacketOnly

 在开启 HostbasedAuthentication 的情况下,

指定服务器在使用 ~/.shosts ~/.rhosts /etc/hosts.equiv 进行远程主机名匹配时,是否进行反向域名查询。

“yes”表示 sshd8 信任客户端提供的主机名而不进行反向查询。默认值是”no”

 

HostKey

 主机私钥文件的位置。如果权限不对,sshd8 可能会拒绝启动。

SSHv1默认是: /etc/ssh/ssh_host_key 

SSHv2默认是:/etc/ssh/ssh_host_rsa_key  /etc/ssh/ssh_host_dsa_key 。一台主机可以拥有多个不同的私钥。”rsa1″仅用于SSH-1”dsa””rsa”仅用于SSH-2

 

IgnoreRhosts

 是否在 RhostsRSAAuthentication  HostbasedAuthentication 过程中忽略 .rhosts  .shosts 文件。不过 /etc/hosts.equiv  /etc/shosts.equiv 仍将被使用。推荐设为默认值”yes”

 

IgnoreUserKnownHosts

 是否在 RhostsRSAAuthentication  HostbasedAuthentication 过程中忽略用户的 ~/.ssh/known_hosts 文件。默认值是”no”。为了提高安全性,可以设为”yes”

 

KerberosAuthentication

 是否要求用户为 PasswordAuthentication 提供的密码必须通过 Kerberos KDC 认证,也就是是否使用Kerberos认证。要使用Kerberos认证,服务器需要一个可以校验 KDC identity  Kerberos servtab 。默认值是”no”

 

KerberosGetAFSToken

 如果使用了 AFS 并且该用户有一个 Kerberos 5 TGT,那么开启该指令后,将会在访问用户的家目录前尝试获取一个 AFS token 。默认为”no”

 

KerberosOrLocalPasswd

 如果 Kerberos 密码认证失败,那么该密码还将要通过其它的认证机制(比如 /etc/passwd)。默认值为”yes”

 

KerberosTicketCleanup

 是否在用户退出登录后自动销毁用户的 ticket 。默认值是”yes”

 

KeyRegenerationInterval

只支持SSHv1协议

SSH-1协议下,短命的服务器密钥将以此指令设置的时间为周期(秒),不断重新生成。

这个机制可以尽量减小密钥丢失或者黑客攻击造成的损失。

设为 0 表示永不重新生成,默认为 3600(秒)

 

 

发表在 linux | 标签为 | ssh已关闭评论

whois协议

IP系统
RFC812定义了一个非常简单的Internet信息查询协议——WHOIS协议。其基本内容是,先向服务器的TCP端口43建立一个连接,发送查询关 键字并加上回车换行,然后接收服务器的查询结果。
  世界上各级Internet管理机构秉承公开、公正、共享的原则,设立了可以查知IP地址和域名所有者登记资料的WHOIS服务器,以便所有Internet的使用者排除故障、打击网上非法活动。全世界国际区域性的IP地址管理机构有四个:
ARINRIPEAPNICLACNIC,他们负责的IP地址的地理区域如下图所示。

点击查看原图

四个国际区域性IP地址管理机构所负责的区域
(此图摘自《RIPE 2002年度报告》)

 

域名系统

域名的查询主要是基于RFC 954提供的WHOIS协议。在上述过程中,我们实际上是访问了InterNIC站点的WHOIS服务器,该服务器从WHOIS数据库中查询我们所需要的内容。
WHOIS服务器是一个基于"查询/响应"的TCP事务服务器,它运行在SRI-NIC机器上(26.0.0.73或10.0.0.51),向用户提供internet范围内的目录服务。本地主机上的用户程序可以通过Internet访问该服务器,其过程主要有下面三步:
(1)在TCP服务端口43(十进制)连接SRI-NIC服务主机;
(2)发送一个命令,以回车和换行(<CRLF>)结尾;
(3)接受相应命令的返回信息,一旦输出结束,服务器将关闭连接。
命令的格式非常简单。可以直接输入域名,例如,可以使用"sohu.com"查询"搜狐"网站的域名信息;也可以使用"help"得到详细的帮助信息。

2.全球列表

.br.com       whois.centralnic.com
.cn.com       whois.centralnic.com
.de.com       whois.centralnic.com
.eu.com       whois.centralnic.com
.gb.com       whois.centralnic.com
.gb.net       whois.centralnic.com
.hu.com       whois.centralnic.com
.no.com       whois.centralnic.com
.qc.com       whois.centralnic.com
.ru.com       whois.centralnic.com
.sa.com       whois.centralnic.com
.se.com       whois.centralnic.com
.se.net       whois.centralnic.com
.uk.com       whois.centralnic.com
.uk.net       whois.centralnic.com
.us.com       whois.centralnic.com
.uy.com       whois.centralnic.com
.za.com       whois.centralnic.com
.com.au       whois.ausregistry.net.au
.net.au       whois.ausregistry.net.au
.org.au       whois.ausregistry.net.au
.asn.au       whois.ausregistry.net.au
.id.au        whois.ausregistry.net.au
.ac.uk        whois.ja.net
.gov.uk       whois.ja.net
.museum       whois.museum
.asia         whois.crsnic.net
.info         whois.afilias.net
.name         whois.nic.name
.aero         whois.information.aero
.coop         whois.nic.coop
.com          whois.crsnic.net
.net          whois.crsnic.net
.org          whois.publicinterestregistry.net
.edu          whois.educause.net
.gov          whois.nic.gov
.int          whois.iana.org
.mil          whois.nic.mil
.biz          whois.neulevel.biz
.as           whois.nic.as
.ac           whois.nic.ac
.al           whois.ripe.net
.am           whois.amnic.net
.at           whois.nic.at
.au           whois.aunic.net
.az           whois.ripe.net
.ba           whois.ripe.net
.be           whois.dns.be
.bg           whois.ripe.net
.br           whois.nic.br
.by           whois.ripe.net
.ca           whois.cira.ca
.cc           whois.nic.cc
.cd           whois.nic.cd
.ch           whois.nic.ch
.cl           whois.nic.cl
.cn           whois.cnnic.net.cn
.cx           whois.nic.cx
.cy           whois.ripe.net
.cz           whois.ripe.net
.de           whois.denic.de
.dk           whois.dk-hostmaster.dk
.dz           whois.ripe.net
.ee           whois.eenet.ee
.eg           whois.ripe.net
.es           whois.ripe.net
.eu           whois.eu
.fi           whois.ripe.net
.fo           whois.ripe.net
.fr           whois.nic.fr
.gb           whois.ripe.net
.ge           whois.ripe.net
.gr           whois.ripe.net
.gs           whois.adamsnames.tc
.hk           whois.apnic.net
.hr           whois.ripe.net
.hu           whois.ripe.net
.ie           whois.domainregistry.ie
.il           whois.isoc.org.il
.in           whois.ncst.ernet.in
.ir           whois.nic.ir
.is           whois.ripe.net
.it           whois.nic.it
.jp           whois.jp
.kh           whois.nic.net.kh
.kr           whois.krnic.net
.li           whois.nic.ch
.lt           whois.ripe.net
.lu           whois.dns.lu
.lv           whois.ripe.net
.ma           whois.ripe.net
.md           whois.ripe.net
.mk           whois.ripe.net
.ms           whois.adamsnames.tc
.mt           whois.ripe.net
.mx           whois.nic.mx
.nl           whois.domain-registry.nl
.no           whois.norid.no
.nu           whois.nic.nu
.nz           whois.srs.net.nz
.pl           whois.dns.pl
.pt           whois.ripe.net
.ro           whois.ripe.net
.ru           whois.ripn.ru
.se           whois.nic-se.se
.sg           whois.nic.net.sg
.si           whois.ripe.net
.sh           whois.nic.sh
.sk           whois.ripe.net
.sm           whois.ripe.net
.su           whois.ripn.net
.tc           whois.adamsnames.tc
.tf           whois.adamsnames.tc
.th           whois.thnic.net
.tj           whois.nic.tj
.tn           whois.ripe.net
.to           whois.tonic.to
.tr           whois.ripe.net
.tv           whois.tv
.tw           whois.twnic.net
.ua           whois.ripe.net
.uk           whois.nic.uk
.us           whois.nic.us
.va           whois.ripe.net
.vg           whois.adamsnames.tc

.ws           whois.nic.ws

其它参考:

http://www.nirsoft.net/whois_servers_list.html

发表在 article | 标签为 , , , , | whois协议已关闭评论