首页 文章 精选 留言 我的

精选列表

搜索[笔记工具],共10000篇文章
优秀的个人博客,低调大师

python的xml.dom学习笔记

首先说一下,由于这篇文章主要是自己随性学习写的,所以读者看起来可能很乱,呵呵。可以给大家稍微推荐一篇:http://www.cnblogs.com/xuxm2007/archive/2011/01/16/1936610.html稍微清晰一点 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 #coding=utf-8 #解析xml文件中的所有的link标签 from xml.dom import minidom from xml.dom.minidom import getDOMImplementation doc = minidom.parse( "d:\\hello.html" ) nodes = doc.getElementsByTagName( "link" ) for node in nodes: print "<" ,node.tagName, print "type=\"" ,node.getAttribute( "type" ), "\"" , print "rel=\"" ,node.getAttribute( "rel" ), "\"" , print "href=\"" ,node.getAttribute( "href" ), "\"" , print "/>" print "通过另外一种方式获得link标签" linknodes = doc.getElementsByTagName( "link" ) for i in range ( len (linknodes)): print linknodes[i].getAttribute( "type" ), print linknodes[i].getAttribute( "rel" ), print linknodes[i].getAttribute( "href" ) #操作节点 node = linknodes[ 0 ] print dir (node) print node.parentNode print node.prefix print node.nodeType,node.nodeValue,node.nodeName print node.localName print node.childNodes print node.firstChild,node.lastChild print node.attributes print node.namespaceURI print node.nextSibling print "--" * 10 print node.tagName print "===" * 20 impl = getDOMImplementation() newdoc = impl.createDocument( None , "some_tag" , None ) top_element = newdoc.documentElement node1 = newdoc.createTextNode( "node1" ) node2 = newdoc.createTextNode( "node2" ) node3 = newdoc.createTextNode( "node3" ) top_element.appendChild(node1) top_element.appendChild(node2) top_element.appendChild(node3) top_element.removeChild(node3) top_element.insertBefore(node3,node2) print top_element.childNodes 运行结果: < link type = " text/css " rel = " stylesheet " href = " http://www.cnblogs.com/css/common.css " / > < link type = " text/css " rel = " stylesheet " href = " http://www.cnblogs.com/Skins/kubrick/style.css " / > < link type = " text/css " rel = " stylesheet " href = " http://www.cnblogs.com/css/common2.css " / > < link type = " text/css " rel = " stylesheet " href = " http://common.cnblogs.com/css/shCore.css " / > < link type = " text/css " rel = " stylesheet " href = " http://common.cnblogs.com/css/shThemeDefault.css " / > < link type = " application/rss+xml " rel = " alternate " href = " http://www.cnblogs.com/rollenholt/rss " / > < link type = " application/rsd+xml " rel = " EditURI " href = " http://www.cnblogs.com/rollenholt/rsd.xml " / > < link type = " application/wlwmanifest+xml " rel = " wlwmanifest " href = " http://www.cnblogs.com/rollenholt/wlwmanifest.xml " / > 通过另外一种方式获得link标签 text / css stylesheet http: / / www.cnblogs.com / css / common.css text / css stylesheet http: / / www.cnblogs.com / Skins / kubrick / style.css text / css stylesheet http: / / www.cnblogs.com / css / common2.css text / css stylesheet http: / / common.cnblogs.com / css / shCore.css text / css stylesheet http: / / common.cnblogs.com / css / shThemeDefault.css application / rss + xml alternate http: / / www.cnblogs.com / rollenholt / rss application / rsd + xml EditURI http: / / www.cnblogs.com / rollenholt / rsd.xml application / wlwmanifest + xml wlwmanifest http: / / www.cnblogs.com / rollenholt / wlwmanifest.xml [ 'ATTRIBUTE_NODE' , 'CDATA_SECTION_NODE' , 'COMMENT_NODE' , 'DOCUMENT_FRAGMENT_NODE' , 'DOCUMENT_NODE' , 'DOCUMENT_TYPE_NODE' , 'ELEMENT_NODE' , 'ENTITY_NODE' , 'ENTITY_REFERENCE_NODE' , 'NOTATION_NODE' , 'PROCESSING_INSTRUCTION_NODE' , 'TEXT_NODE' , '__doc__' , '__init__' , '__module__' , '__nonzero__' , '__repr__' , '_attrs' , '_attrsNS' , '_call_user_data_handler' , '_child_node_types' , '_get_attributes' , '_get_childNodes' , '_get_firstChild' , '_get_lastChild' , '_get_localName' , '_get_tagName' , '_magic_id_nodes' , 'appendChild' , 'attributes' , 'childNodes' , 'cloneNode' , 'firstChild' , 'getAttribute' , 'getAttributeNS' , 'getAttributeNode' , 'getAttributeNodeNS' , 'getElementsByTagName' , 'getElementsByTagNameNS' , 'getInterface' , 'getUserData' , 'hasAttribute' , 'hasAttributeNS' , 'hasAttributes' , 'hasChildNodes' , 'insertBefore' , 'isSameNode' , 'isSupported' , 'lastChild' , 'localName' , 'namespaceURI' , 'nextSibling' , 'nodeName' , 'nodeType' , 'nodeValue' , 'normalize' , 'ownerDocument' , 'parentNode' , 'prefix' , 'previousSibling' , 'removeAttribute' , 'removeAttributeNS' , 'removeAttributeNode' , 'removeAttributeNodeNS' , 'removeChild' , 'replaceChild' , 'schemaType' , 'setAttribute' , 'setAttributeNS' , 'setAttributeNode' , 'setAttributeNodeNS' , 'setIdAttribute' , 'setIdAttributeNS' , 'setIdAttributeNode' , 'setUserData' , 'tagName' , 'toprettyxml' , 'toxml' , 'unlink' , 'writexml' ] <DOM Element: head at 0x1b3e968 > None 1 None link link [] None None <xml.dom.minidom.NamedNodeMap object at 0x01B4D648 > http: / / www.w3.org / 1999 / xhtml <DOM Text node "u'\n'" > - - - - - - - - - - - - - - - - - - - - link = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = [<DOM Text node "'node1'" >, <DOM Text node "'node3'" >, <DOM Text node "'node2'" >] ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2011/12/01/2271131.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《Core Java 2》读书笔记(一)

1,一个线程可以调用interrupt方法来请求终止另一个线程的运行,也就是说线程的 run方法应该不时检查一下它是否应该退出。 线程不应该连续不断地工作,应该偶尔进入睡眠或等待状态,以便其他线程由机会得以执行。但当一个线程进入睡眠状态时,它就无法检查自己是否应该终止运行。当另一个线程对当前被中断运行的线程对象调用interrupt方法时,中断调用(sleep或wait)将被InterruptedException终止。但还有种情况要考虑,若线程并未处于睡眠或等待状态,则另一个线程对其调用interrupt方法,则不会产生InterruptedException,对于此,线程应该在下一轮工作之前通过interrupted方法来确认它最近是否被其他线程给请求终止了。整体的框架如下: 复制代码 public void run() { while (!interrupted()) { try { …… sleep(50); } catch(InterruptedException ex) { Thread.currentThread.interrupt(); } } } 复制代码 Interrupted方法是个静态方法,用来检查当前线程是否已经被中断,此外,它会清除线程的“中断”状态。isInterrupted方法是个实例方法,用来检查任何一个线程是否已经被中断,它不会改变线程的“中断”状态。 2,Sleep对应于经过规定的毫秒数才退出中断状态。如果一个当前已经中断的线程上再次调用sleep,则会抛出IllegalThreadStateException。wait和notifyAll是一对,是Object类的方法。 3,守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。 4,下面这段代码在本地线程机制下不会有什么问题,但若是在绿色线程机制下,则会发现利己线程会占据整个应用程序。 复制代码 public void run() { try { for (int i = 1; i <= 1000; i++) { b.move(); if (selfish) { // busy wait for 5 milliseconds long t = System.currentTimeMillis(); while (System.currentTimeMillis() < t + 5) ; } else sleep(5); } } catch (InterruptedException exception) { } } 复制代码 5,银行账户这个例子中,当账户中没有足够的金额时,我们必须等待,直到另外某个线程增加了金额为止。但transfer已经进行了同步,当前线程已经获得了对银行对象的专用访问权,因此没有其他线程有机会进行存款操作。因此我们想在synchronized方法中等待,就可以使用Object类的wait方法。于是当前线程将被中断运行,并且放弃对该对象的锁,这可以使另一个线程启动。当该线程在等待过程中被中断运行时,wait方法会抛出一个InterruptedException异常,此时,可以使用interrupt去打开“中断”标志,也可以传递该异常,这由调用线程来决定如何处理,所以在例子中给transfer 方法加入了throws InterruptedException。wait方法是Object类的一个方法,而不是Thread类的方法,当调用它时,银行对象打开自己的锁,并且中断当前线程的运行。 复制代码 public synchronized void transfer(int from, int to, int amount) throws InterruptedException { while (accounts[from] < amount) wait(); accounts[from] -= amount; accounts[to] += amount; ntransacts++; notifyAll(); if (ntransacts % NTEST == 0) test(); } 复制代码 等待进入synchronized方法的线程和已经调用了wait方法的线程之间有根本区别。一旦线程调用了wait方法,便进入了该对象的等待列表。此时线程被中断,在该线程没有从等待列表中删除之前,调度程序将忽略该线程,并且该线程将没有机会继续运行。要从等待列表中删除该线程,其他线程必须调用同一个对象上的notifyAll或notify方法。前者是将对象等待列表中的所有线程全部删除,后者是删除任意一个选择的线程。当线程从等待列表中删除后,它们就再次成为可运行的线程,并且调度程序最终会重新激活它们。然后,它们会试图重新进入该对象。一旦可以使用该对象锁时,其中的一个线程将锁定该对象,并且从它上次调用wait方法后的位置开始继续运行。 调用notifyAll方法的原则是每当一个对象的状态改变对各个等待线程有利时,就可以调用.例如在例子中,当完成资金转账时,就调用notifyAll方法,使得等待线程有机会查看其余额。若此时足够用于资金转账,则执行转账,否则再次调用wait进入等待列表。 调用notifyAll方法并不会立即激活某个等待线程,而只是撤消等待线程的中断状态,使其在当前线程退出synchronized方法后,与其他线程进行竞争,争取进入该对象。 如果一个线程必须等待某个对象的状态出现变更,那么它应该在对象的内部等待,而不是在外边等待,这通过进入一个synchronized方法,并且在其中调用wait方法来实现。 6,调用一个同步静态方法将会锁定类对象,如下例所示,将会锁定Singleton.class,因此,如果一个线程调用一个类的静态synchronized方法,那么该类的所有静态synchronized方法将会被锁定,直到第一个调用返回为止。 复制代码 public class Singleton { private static Singleton instance = null; private Singleton() { } public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 复制代码 7,stop方法来停止线程不安全,当一个线程被停止时,它会立即释放它锁定的所有对象的锁,这会使各个对象处于不一致的状态之中。例如,在取款后和存款前,线程在将资金从一个账户转入另一个账户的中间停止了运行,则此时银行对象就损坏了。 如果需要安全地停止一个线程的运行,可以让该线程定期检查一个变量,此变量负责指明是否有停止线程的请求。还有种特殊情况要考虑,若线程处于封锁状态(比如调用了wait方法),则线程只有在解除封锁状态后才能终止运行,我们可以通过interrupt方法来强制线程退出封锁状态,基本框架如下: 复制代码 public class MyThread extends Thread { private boolean isStop; public void run() { while (!isStop) { try { wait(); } catch(InterruptedException ex) { if (isStop == true) return; } } } public void requestStop() { isStop = true; interrupt(); } } 复制代码 8,suspend方法也被废弃了,它不会损坏对象,但如果挂起了一个拥有某个对象锁的线程,则在该线程恢复之前,将无法使用该对象。如果调用suspend方法的线程试图在调用resume方法之前获得同一个对象的锁,那么程序会死锁。因为被挂起的线程要等待恢复运行,并且挂起的线程要等待该对象被撤销锁定状态。 如果想要安全地暂停线程的运行,应该使用变量suspendrequested,并且在run方法中一个安全的位置上检查此变量。框架如下代码: 复制代码 class SuspendRequestor { private boolean suspendrequested; public synchronized void set(boolean flag) { suspendrequested = flag; notifyAll(); } public synchronized void waitForResume() throws InterruptedException { while (suspendrequested) wait(); } } class MyThread extends Thread { private SuspendRequestor suspender = new SuspendRequestor(); public void requestSuspend() { suspender.set(true); } public void requstResume() { suspender.set(false); } public void run() { try { while (more work to do) { suspender.waitForResume(); do work; } } catch(InterruptedException ex) { } } } 复制代码 也可以像下面这样使用一个无用对象作为同步机制 复制代码 class MyThread extends Thread { private boolean suspendRequested; private Integer dummy = new Integer(1); public void reuqestSuspend() { suspendRequested = true; } public void requestResume() { suspendRequested = false; synchronized(dummy) { dummy.notifyAll(); } } public void waitForResume() { synchronized(dummy) { while (suspendRequested) dummy.wait(); } } public void run() { try { while (more work to do) { waitForResume(); do work; } } catch(InterruptedException ex) { } } } 复制代码 9,有两个wait方法带有超时参数,当wait方法返回时,若你需要知道是因为超时还是得到了通知,可以计算调用wait方法前后的时间差。 long before = System.currentTimeMills(); wait(delay); long after = System.currentTimeMills(); if (after - before > delay) //超时了 此外,也可以让负责通知的线程设置一个标志。 为了始终强制使用超时,可以将封锁操作放入第二个线程,然后使用join方法来使得当前线程被封锁,直到第二个线程运行结束或经过规定的毫秒数为止。 复制代码 Thread t = new Thread() { public void run() { //封锁操作 } }; t.start(); t.join(mills); 复制代码 10,Swing大多数方法不是同步的,这就使得我们以前常用的在工作线程中通过指向主界面的指针来更新主界面元素的思路不可行,即在工作线程中不能接触用户界面,例如显示线程的进度百分比,就不能在工作线程中调用lable.setText,而应该使用EventQueue类的invokeLater和invokeAndWait方法,从而在事件调度线程中执行该调用程序。 复制代码 public void run() { try { while (!interrupted()) { EventQueue.invokeLater(new Runnable() { public void run() { int i = Math.abs(generator.nextInt()); if (i % 2 == 0) combo.insertItemAt(new Integer(i), 0); else if (combo.getItemCount() > 0) combo.removeItemAt(i % combo.getItemCount()); } }); Thread.sleep(1); } } catch (InterruptedException exception) {} } 复制代码 在事件被移到事件队列后,invokeLater立即返回。Run方法以异步方法执行。invokeAndWait方法将进行等待,直到run方法确实已经执行为止。EventQueue类负责处理具体的同步操作。需要注意的是,这里run方法的代码不是在新线程中执行的,而是在事件调度程序中执行的。 11,管道用于线程间的通信,适用于线程间低层次的通信,其他情况下可以使用队列。 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/09/22/1572058.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《Core Java 2》读书笔记(二)

1,防御性编程。必要时应当考虑采取保护性拷贝的手段来保护内部的私有数据,先来看下面这个例子: 复制代码 pubic final class Period { private final Date start; private final Date end; public Period(Date start, Date end) { if (start.compareTo(end) > 0) throw new IllegalArgumentException(start + "after " + end); this.start = start; this.end = end; } public Date getStart() { return start; } public Date getEnd() { return end; } } 复制代码 这个类存在两个不安全的地方,首先来看第一个攻击代码 Date start = new Date(); Date end = new Date(); Period p = new Period(start, end); end.setYear(78);//改变p的内部数据! 这是因为外部和内部引用了同样的数据,为了解决这个问题,应当修改Period的构造函数: 复制代码 public Period(Date start, Date end) { this.start = new Date(start.getTime()); this.end = new Date(end.getTime()); if (start.compareTo(end) > 0) throw new IllegalArgumentException(start + "after " + end); } 复制代码 这样内部的私有数据就与外部对象指向不同,则不会被外部改变 再来看第二个攻击代码: Date start = new Date(); Date end = new Date(); Period p = new Period(start, end); p.getEnd().setYear(78);//改变p的内部数据! 这很显然是由于公有方法暴露了内部私有数据,我们可以只返回内部私有数据的只读版本(即其一份拷贝) 复制代码 public Date getStart() { return (Date)start.clone(); } public Date getEnd() { return (Date)end.clone(); } 复制代码 2,读到上面这个例子,我想起来了下面这样的代码片段 复制代码 public class Suit { private final String name; private static int nextOrdinal = 0; private final int ordinal = nextOrdinal++; private Suit(String name) { this.name = name; } public String toString() { return name; } public int compareTo(Object o) { return o } public static final Suit CLUBS = new Suit("Clubs"); public static final Suit DIAMONDS = new Suit("diamonds"); public static final Suit HEARTS = new Suit("hearts"); public static final Suit SPADES = new Suit("spades"); private static final Suit[] PRIVATE_VALUES = {CLUBS,DIAMONDS,HEARTS,SPADES}; public static final List VALUES = Collections.unmodifiedList(Arrays.asList(PRIVATE_VALUES)); } 复制代码 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/09/28/1575645.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《Java编程思想》读书笔记(6)

JButton这一章,Brucke只给出了一个简单的例子,代码如下: import java.applet.Applet; import java.awt.*; import javax.swing.*; public class Test extends JApplet { private JButton btn1; private JButton btn2; /** * @param args */ public void init() { this.btn1 = new JButton("确定"); this.btn2 = new JButton("重置"); Container con = this.getContentPane(); con.setLayout(new FlowLayout()); con.add(btn1); con.add(btn2); } public static void main(String[] args) { Test t1 = new Test(); Console.run(t1,300,300); } } 这一节没有过多的东西可以思考,但布局管理器的知识值得去深究。 Java语言中提供的布局管理器种类有:边界式布局、卡片式布局、流式布局和网格式布局等,各有不同的特点,可根据实际 需要选用;但有最大自由设计空间的是“无布局管理器”——即不使用任何布局格式,而通过手工方式添加组件到页面布局的绝对位置上。因此我采用“无布局管理器”将他的代码改写如下: import java.applet.Applet; import java.awt.*; import javax.swing.*; public class Test extends JApplet { private JButton btn1; private JButton btn2; /** * @param args */ public void init() { this.btn1 = new JButton("确定"); this.btn2 = new JButton("重置"); Container con = this.getContentPane(); //con.setLayout(new FlowLayout()); con.setLayout(null); btn1.reshape(30,30,100,100); btn2.reshape(150,150,100,100); con.add(btn1); con.add(btn2); } public static void main(String[] args) { Test t1 = new Test(); Console.run(t1,600,600); } } 1. GridLayout GridLayout类是布局管理器之一,它将容器中的组件在放置在一个矩形网格中。容器被划分为相同大小的矩形,而每个组件就放置在一个单独的矩形中。 import java.awt.*; import javax.swing.*; public class GridForm extends JFrame { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub GridForm gf = new GridForm(); gf.setLayout(new GridLayout(3,2)); Container con = gf.getContentPane(); con.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); con.add(new JButton("1")); con.add(new JButton("2")); con.add(new JButton("3")); con.add(new JButton("4")); con.add(new JButton("5")); con.add(new JButton("6")); gf.setTitle("GridLayout例子"); gf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gf.setSize(200,200); gf.setVisible(true); } } 如果容器的ComponentOrientation属性是水平的并且从左到右,上面例子产生如下图1: 如果容器的ComponentOrientation属性是horizontal 和 right-to-left,结果就如下图2: 当行数和列数都被设置为非零值(不管是通过构造函数或者通过setRows和setColumns方法来设置),指定的列数就会被忽略掉。例如说,如果指定是3行3列,而将布局中放置9个组件,它们就会显示为3行3列。 2.BorderLayout 边界布局会把容器看成五个:部分:north, south, east, west,和 center。每个区域最多包含一个组件,重要的五个常量:NORTH, SOUTH, EAST, WEST和 CENTER; Panel p = new Panel(); p.setLayout(new BorderLayout()); p.add(new Button("Okay"), BorderLayout.SOUTH); ================================================== ================================================== Panel p2 = new Panel(); p2.setLayout(new BorderLayout()); p2.add(new TextArea()); // Same as p.add(new TextArea(), BorderLayout.CENTER); <!--[endif]--> BorderLayout 支持相对定位常量, PAGE_START, PAGE_END, LINE_START, and LINE_END. 在一个容器中,如果它的 ComponentOrientation 被设置为ComponentOrientation.LEFT_TO_RIGHT,这些常量就分别映射为 NORTH, SOUTH, WEST, and EAST 为了与以前兼容,BorderLayout也好汉相对定位常量 BEFORE_FIRST_LINE, AFTER_LAST_LINE, BEFORE_LINE_BEGINS and AFTER_LINE_ENDS. 他们分别和PAGE_START, PAGE_END, LINE_START and LINE_END等价. 如果同时使用绝对定位和相对定位,就会产生不可预测的结果。例如,如果你在容器中同时使 NORTH 和 PAGE_START 常量 来添加组件,而容器的 方向是 LEFT_TO_RIGHT, 那么就只有PAGE_START被会布局。 import java.awt.*; import javax.swing.*; public class GridForm extends JFrame { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub GridForm gf = new GridForm(); gf.setLayout(new BorderLayout()); Container con = gf.getContentPane(); con.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); con.add(new JButton("North"),BorderLayout.NORTH); con.add(new JButton("SOUTH"),BorderLayout.SOUTH); con.add(new JButton("EAST"),BorderLayout.EAST); con.add(new JButton("WEST"),BorderLayout.WEST); con.add(new JButton("CENTER"),BorderLayout.CENTER); gf.setTitle("BorderLayout例子"); gf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gf.setSize(200,200); gf.setVisible(true); } } 3. FlowLayout FlowLayout会将组件从左到右进排列,就象文章中的文本行一样。流布局一般用在面板中的按纽的放置。它将会将按纽以从左至右的方式排放,直到在同一行中再也放不下更多的按纽了。 import java.awt.*; import javax.swing.*; public class GridForm extends JFrame { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub GridForm gf = new GridForm(); //gf.setLayout(new BorderLayout()); gf.setLayout(new FlowLayout()); Container con = gf.getContentPane(); con.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); con.add(new JButton("North")); con.add(new JButton("SOUTH")); con.add(new JButton("EAST")); con.add(new JButton("WEST")); con.add(new JButton("CENTER")); gf.setTitle("FlowLayout例子"); gf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); gf.setSize(200,200); gf.setVisible(true); } } 4.BoxLayout BoxLayout能让你在垂直和水平两个方向上控制组件的摆放,它用一些被称为支柱(struts)和胶水(glue)的东西来控制组件间的距离。 package com.vitamin.UI; import javax.swing.*; import java.awt.*; import com.vitamin.*; import com.vitamin.Console.console; public class BoxLayout1 extends JApplet { public void init() { JPanel jpv = new JPanel(); jpv.setLayout(new BoxLayout(jpv, BoxLayout.Y_AXIS)); for(int i = 0; i < 5; i++) jpv.add(new JButton("jpv " + i)); JPanel jph = new JPanel(); jph.setLayout(new BoxLayout(jph, BoxLayout.X_AXIS)); for(int i = 0; i < 5; i++) jph.add(new JButton("jph " + i)); Container cp = getContentPane(); cp.add(BorderLayout.EAST, jpv); cp.add(BorderLayout.SOUTH, jph); } public static void main(String[] args) { console.run(new BoxLayout1(), 450, 200); } } 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/06/01/415342.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《Java编程思想》读书笔记(10)

package com.vitamin.UI; import javax.swing.*; import javax.swing.filechooser.FileFilter; import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.*; import java.io.File; import java.io.FileWriter; import java.io.IOException; import com.vitamin.Console.*; public class FileTest extends JFrame { private JButton btnOpen = new JButton("Open"); private JButton btnSave = new JButton("Save"); private JPanel p = null; private JTextField tfDir = new JTextField(); private JTextField tfFileName = new JTextField(); private JScrollPane sp = new JScrollPane(); private JEditorPane ep = new JEditorPane(); private File file = null; public FileTest() { super(); // TODO Auto-generated constructor stub this.initForm(); } public void initForm() { Container con = this.getContentPane(); con.setLayout(new BorderLayout()); this.tfDir.setEditable(false); this.tfFileName.setEditable(false); this.btnSave.setEnabled(false); this.btnOpen.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); fc.setFileFilter(new TextFileFilter() ); int returnVal = fc.showOpenDialog(FileTest.this); if(returnVal == JFileChooser.APPROVE_OPTION) { file = fc.getSelectedFile(); try { ep.setPage(file.toURL()); tfFileName.setText(file.getAbsolutePath()); btnSave.setEnabled(true); } catch(IOException ex) { throw new RuntimeException(ex); } } else if(returnVal == JFileChooser.CANCEL_OPTION) { tfFileName.setText("你已经取消了文件的选择"); } } }); this.btnSave.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { try { FileWriter fw = new FileWriter(file); ep.write(fw); JOptionPane.showMessageDialog(FileTest.this,"保存成功"); } catch (IOException ioe) { throw new RuntimeException(ioe); } } }); sp.getViewport().add(ep); p = new JPanel(); p.add(this.btnOpen); p.add(this.btnSave); con.add(p,BorderLayout.SOUTH); con.add(sp,BorderLayout.CENTER); p = new JPanel(); p.setLayout(new GridLayout(2,1)); p.add(this.tfDir); p.add(this.tfFileName); con.add(p,BorderLayout.NORTH); console.run(this,400,400); } public class TextFileFilter extends javax.swing.filechooser.FileFilter { public boolean accept(File f) { return f.getName().endsWith(".txt") || f.isDirectory(); } public String getDescription() { return "Text Files (*.txt)"; } } /** * @param args */ public static void main(String[] args) { FileTest ft = new FileTest(); } } 做了个读写文件的小东西,功能很烂,有时间做个完整的记事本吧。 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/06/08/420130.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《Java编程思想》读书笔记(14)

程序是根据具体情况在不断地创建新对象,而这些情况又只有在运行时才能够确定,因此我们就不知道到底需要多少对象,什么类型的对象,所以要能够创建任何对象并且能保持住这些对象的引用。Java就提供了很多容器类来持有和操纵对象。 数组是比较特别的一个容器,怎么说呢,它可以持有象int等基本类型数据,能够随机存储和访问,而且访问效率很高,但高效率是以牺牲灵活为代价的,当你创建了一个数组后,它的容量就确定了,并且在其生命周期内不能改变。而与它相对应的ArrayList就恰好相反,它可以灵活地增加容量,但效率就明显低于数组。而与List,Map,Set等泛型容器相比,数组在创建时就指明了它持有的对象类型,因此在编译时就会做类型检查,从而防止插入错误类型的对象。而泛型容器把它里面的元素都看成是Object,因此能容纳所有类型的对象(这就郁闷了,当你要往里面插入基本类型的数据时,就不得不先用对应的包装类将基本类型包装为Object型),并且泛型容器也没有编译时的类型检查,因此安全性得不到保证。 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/06/17/428251.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《Java编程思想》读书笔记(9)

一些listene接口中只定义了一个方法,因此要实现这种接口的工作量并不大,因为只要写完这一个方法,接口也就实现了。但是如果要使用有多个方法的listener的话,就会比较麻烦了,因为必须要实现接口中定义的所有方法,而实际上很多方法我们并不需要。举例来说,如果要捕捉鼠标点击的话,那就必须写一个mouseClicked( )方法。但是由于MouseListener是一个interface,所以即使MouseListener定义的其他方法我们不使用,也得实现其所有的方法。 为了解决这个问题,有些(但不是全部)多方法的listener接口提供了适配器(adapter)。适配器会为接口提供默认的空方法。这样,你只要继承适配器,根据需要覆写方法就可以了。 例如: package com.vitamin.UI; import java.awt.BorderLayout; import java.awt.Container; import java.awt.Event; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.*; import javax.swing.*; public class HelloForm extends JFrame { private JLabel lbInfo = null; private JButton btnOK = null; public HelloForm() { super(); } public HelloForm(String title) { super(title); this.initForm(); } private void initForm() { this.lbInfo = new JLabel(); this.btnOK = new JButton("确定"); this.btnOK.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { lbInfo.setText("hello,world"); } }); Container con = this.getContentPane(); con.setLayout(new BorderLayout()); con.add(this.btnOK,BorderLayout.SOUTH); con.add(this.lbInfo,BorderLayout.NORTH); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(300,300); this.setVisible(true); } /** * @param args */ public static void main(String[] args) { HelloForm hf = new HelloForm("内部匿名类测试程序"); } } 在附上<<TIJ>>中给出的一段处理多个事件的代码: package com.vitamin.UI; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; import com.vitamin.Console.console; public class TrackEvent extends JApplet { private HashMap h = new HashMap(); private String[] event = { "focusGained", "focusLost", "keyPressed", "keyReleased", "keyTyped", "mouseClicked", "mouseEntered", "mouseExited", "mousePressed", "mouseReleased", "mouseDragged", "mouseMoved" }; private MyButton b1 = new MyButton(Color.BLUE, "test1"), b2 = new MyButton(Color.RED, "test2"); class MyButton extends JButton { void report(String field, String msg) { ((JTextField)h.get(field)).setText(msg); } FocusListener fl = new FocusListener() { public void focusGained(FocusEvent e) { report("focusGained", e.paramString()); } public void focusLost(FocusEvent e) { report("focusLost", e.paramString()); } }; KeyListener kl = new KeyListener() { public void keyPressed(KeyEvent e) { report("keyPressed", e.paramString()); } public void keyReleased(KeyEvent e) { report("keyReleased", e.paramString()); } public void keyTyped(KeyEvent e) { report("keyTyped", e.paramString()); } }; MouseListener ml = new MouseListener() { public void mouseClicked(MouseEvent e) { report("mouseClicked", e.paramString()); } public void mouseEntered(MouseEvent e) { report("mouseEntered", e.paramString()); } public void mouseExited(MouseEvent e) { report("mouseExited", e.paramString()); } public void mousePressed(MouseEvent e) { report("mousePressed", e.paramString()); } public void mouseReleased(MouseEvent e) { report("mouseReleased", e.paramString()); } }; MouseMotionListener mml = new MouseMotionListener() { public void mouseDragged(MouseEvent e) { report("mouseDragged", e.paramString()); } public void mouseMoved(MouseEvent e) { report("mouseMoved", e.paramString()); } }; public MyButton(Color color, String label) { super(label); setBackground(color); addFocusListener(fl); addKeyListener(kl); addMouseListener(ml); addMouseMotionListener(mml); } } public void init() { Container c = getContentPane(); c.setLayout(new GridLayout(event.length + 1, 2)); for(int i = 0; i < event.length; i++) { JTextField t = new JTextField(); t.setEditable(false); c.add(new JLabel(event[i], JLabel.RIGHT)); c.add(t); h.put(event[i], t); } c.add(b1); c.add(b2); } public static void main(String[] args) { console.run(new TrackEvent(), 700, 500); } } 另外,今天还尝试了下手工打包可执行的jar文件,可没有成功,找不到原因,郁闷。。。 本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/06/07/419356.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

[Android学习笔记二] View转化Bitmap

在View类中的onDraw方法的参数Canvas是View绘制的背景,要将View转换为Bitmap实际上就是让Canvas上的绘制操作绘制到Bitmap上。 View转化为Bitmap也称为截屏,让用户看到的View视图转化为图片的过程。 关于View转化Bitmap涉及到的View类中的方法有: 1 2 3 4 5 protected void onDraw(Canvascanvas) public void buildDrawingCache() public void destroyDrawingCache() public BitmapgetDrawingCache() public void setDrawingCacheEnabled( boolean enabled) 下面是常见的几个View截屏的示例: 1.View转Bitmap 1 2 3 4 5 6 7 8 9 10 11 public final BitmapscreenShot(Viewview){ if ( null ==view){ throw new IllegalArgumentException( "parametercan'tbenull." ); } view.measure(View.MeasureSpec.UNSPECIFIED,View.MeasureSpec.UNSPECIFIED); view.layout( 0 , 0 ,view.getMeasuredWidth(),view.getMeasuredHeight()); view.setDrawingCacheEnabled( true ); view.buildDrawingCache(); Bitmapbitmap=view.getDrawingCache(); return bitmap; } 2. Activity转Bitmap,不带状态栏 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public final BitmapscreenShot(Activityactivity){ if ( null ==activity){ throw new IllegalArgumentException( "parametercan'tbenull." ); } Viewview=activity.getWindow().getDecorView(); view.setDrawingCacheEnabled( true ); view.buildDrawingCache(); Bitmapb1=view.getDrawingCache(); Rectframe= new Rect(); view.getWindowVisibleDisplayFrame(frame); int statusBarHeight=frame.top; Pointpoint= new Point(); activity.getWindowManager().getDefaultDisplay().getSize(point); int width=point.x; int height=point.y; Bitmapb2=Bitmap.createBitmap(b1, 0 ,statusBarHeight,width,height-statusBarHeight); view.destroyDrawingCache(); return b2; } 3. ScrollView转长Bitmap(类似锤子便签的截长图) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public final BitmapscreenShot(ScrollViewscrollView){ if ( null ==scrollView){ throw new IllegalArgumentException( "parametercan'tbenull." ); } int height= 0 ; Bitmapbitmap; for ( int i= 0 ,s=scrollView.getChildCount();i<s;i++){ height+=scrollView.getChildAt(i).getHeight(); scrollView.getChildAt(i).setBackgroundResource(android.R.drawable.screen_background_light); } bitmap=Bitmap.createBitmap(scrollView.getWidth(),height,Bitmap.Config.ARGB_8888); final Canvascanvas= new Canvas(bitmap); scrollView.draw(canvas); return bitmap; } 本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1711443,如需转载请自行联系原作者

优秀的个人博客,低调大师

Linux自学笔记——日志服务之rsyslog

日志:历史事件日志 历史事件: 时间,事件 时间级别(日志级别):事件的关键性程度; 事件:系统引导启动、应用程序启动、应用程序尤其是服务类应用程序运行过程中的一些事件: 系统日志服务: syslog: syslogd:system klogd:kernel 事件格式较为简单时,可统一由syslog进行记录: 事件产生的日期时间 主机 进程[pid]:事件内容 支持C/S架构:可通过UDP或TCP协议提供日志记录服务; rsyslog: rsyslogd: 特性: 多线程; UDP,TCP,SSL,TLS,RELP; 存储日志信息于mysql、pgsql、oracle等数据管理系统; 强大的过滤器,实现过滤日志信息中任何部分的内容; 自定义输出格式; Elk stack:elasticsearch,logstash,kibana rsyslog日志收集器中的术语: facility:设施,从功能或程序上对日志收集进行分类: auth,authpriv,cron,daemon,kern,lpr,mail,mark,news,security,user,uucp,local0-local7,syslog priority:优先级,日志级别 debug,info,notice,warn(warning),err(error),crit(critical),alert,emerg(panic) 指定级别: :所有级别 None:没有级别; priority:此级别以高于此级别的所有级别; =priority:仅此级别; …… 程序环境: 主程序:rsyslogd 主配置文件:/etc/rsyslog.conf, /etc/rsyslog.d/.conf 服务脚本(centos6):/etc/rc.d/init.d/rsyslog Unit File(centos7):/usr/lib/system/system/rsyslog.service 配置文件格式rsyslog.conf 主要由三部分组成: MODULES GLOBAL DRICTIVES RULES RULES: facilty.priority targetbr/> target: 文件:记录日志事件于指定的文件中;通常应该位于/var/log目录下;文件路径之前的“-”表示异步写入; 用户:将日志事件通知给指定的用户;是通过将信息发送给登录到系统上的用户的终端进行的; 日志服务器:@host,把日志送往指定的服务器主机; Host:即日志服务器地址,监听在tcp或udp协议的514端口以提供服务; 管道:| COMMAND 其他日志文件: /var/log/wtmp:当前系统成功登录系统的日志;需要使用last命令查看 /var/log/btmp:当前系统尝试登录系统失败相关的日志;需要使用lastb命令查看 Lastlog:显示当前系统上的所有用户最近一次登录系统的时间; /var/log/dmesg:系统引导过程中的日志信息;也可以使用dmesg命令进行查看; Rsyslog服务器: 编辑配置文件/etc/rsyslog.conf,启用一下选项即可启用rsyslog服务器; Provides UDP syslog reception $ModLoad imudp $UDPServerRun 514 Provides TCP syslog reception $ModLoad imtcp $InputTCPServerRun 514 示例:将日志记录在mysql中,以下为大致的步骤: 1.于mysql服务器:准备好mysql服务器,创建用户,授权对syslog数据库拥有全部的访问权限; 2.于rsyslog主机:安装rsyslog-mysql程序包; 3.于rsyslog主机:通过导入createDB.sql脚本创建依赖到的数据库及表; mysql -uUSER -hHOST -pPASSWORD < /usr/share/doc/rsyslog-mysql-VERSION/createDB.sql 4.配置rsyslog使用ommysql模块 MODULES #### $ModLoad ommysql RULES #### Facility.priority :ommysql:DBHOST,DB,DBUSER,DBUSERPASSWORD 注意:重启rsyslog服务; 5.Web展示接口:loganalyzer 1) 配置lamp Httpd,php,php-mysql,php-gd 2) 安装loganalyzer #tar xf loganalyzer-3.6.5.tar.gz #cp –r loganalyzer-3.6.5/src /var/www/html/loganalyzer #cp –r loganalyzer-3.6.5/contrib/*.sh /var/www/html/loganalyzer/ #cd /var/www/html/loganalyzer/ #chmod +x *.sh #./configure.sh #./secure.sh #chmod 666 config.php 测试,通过url访问; 演示: 日志服务器:192.168.19.134 测试主机:192.168.19.138 Mysql主机:192.168.19.138 启用服务器功能; 启动rsyslog服务,并测试端口; 测试在另一台主机上编辑/etc/rsyslog.conf,将target指向此台日志服务器的地址; 1) 编辑19.138主机上的rsyslog的主配置文件; 2) 重启服务并执行一个安装程序; 3) 在日志服务器上测试是否有日志; 记录日志于mysql中; 1) 授权用户对Syslog数据库的全部访问权限; Note:在这里除了要授权本机的权限,还要授权,rsyslog主机访问mysql数据库的权限,否则,远程访问mysql将失败; 2) 在rsyslog主机上安装rsyslog-mysql程序包; 3) 在rsyslog主机上通过导入createDB.sql脚本创建依赖到的数据库及表; 4) 配置rsyslog使用ommysql模块; Note:重启rsyslog服务; 5) 测试; 在测试主机上安装php,php-mysql,查询mysql服务器数据库Syslog表中的内容; Web展示接口:loganalyzer 1) 配置lamp组合 Httpd,php,php,mysql,php-gd; 2) 安装loganalyzer a. 解压; b. 复制相关文件至/var/www/html目录; c. 更改.sh结尾文件权限; d. 执行脚本; e. Config.php文件权限修改; f. 测试访问; 访问页面如下: 确保config.php权限可写: Step7,创建数据源,按如下填写: 进入页面,showevents选项可以查看日志; 本文转自 claude_liu 51CTO博客,原文链接:http://blog.51cto.com/claude666/2051737,如需转载请自行联系原作者

优秀的个人博客,低调大师

【讲座笔记】微软人谈IT职业发展

第一部分: 主讲人:孔文达,微软中国企业及合作伙伴事业部、职位:解决方案技术经理,wendakong@microsoft.com 讲座来源:微软WEBCAST课程(2008年录制) 教育经历:一般的一个市重点,大学是材料专业——高分子,大学本科读了六年,大二开始实习。 ——工作与学习兼得就要付出很多辛苦和牺牲。 RoadMAP:主要以微软的一个产品作为突破口,做过七年MCSE讲师——做好吃苦的准备,IT这一行太累。 IT的职业特性: 枯燥——成为工作后很有体现 不被重视——企业底层的支撑平台,不是外线、前锋。 不断地再学习——与时俱进 对人的综合素质要求高——技术、沟通、演讲能力 不被理解,甚至被质疑——理解和被理解 “晋升机会渺茫”—— 经验之谈: 不断自我激励 努力跟上技术潮流 利用已有环境充实自己 不断发现新机会 制定一条主攻技术路线 尽量多参加各种免费的技术大会 职业生涯中的五个坎: “青黄不接”阶段:工作三年内,不要轻易跳槽,影响职业信用度,坚持下来自己的计划。 “职业塑造”阶段:工作三年——六年内,职业目标和人生目标初步制定,但容易改变。 “职业锁定”阶段:过了三十,人在这个阶段追求稳定,职业野心下降,定下一辈子的目标。 “事业开拓”阶段:若是没有达到完全的创业条件,先别下手。 “事业平稳”阶段:为了一些个人的兴趣和事业奋斗。 晋升路线: 工程师/网管->项目经理->IT主管->CTO/CIO。 做好“吃得苦中苦,方为人上人”的准备。 遇到困难不要怨天尤人。 技术层面尽量深入——技术出了问题,排错的水平是标准。 语言能力。——演讲能力、英语能力。 第二部分: “IT专业人士如何更有效的学习专业知识”主讲人背景: 喻勇,微软中国PMP/MSCE,平台及开发合作部IT架构顾问。 学习的实质性: 掌握本领,并且可持续发展 。 学习方法 : 把握好理论知识和实践能力的平衡,宁肯花一些时间来进行摸索适合自己的方法 内功——操作系统原理、数据结构、编程语言和算法、计算机架构和接口、关系型数据库、计算机网络原理及协议——长期收益 套路——各大厂商的产品,应用系统、平台、各种语言、各种设备操作——短期速成 不要指望自己什么都会 选择一个大的平台:Windows还是Unix? 注重实践 应该有的素质 : 知其然还要知其所以然 不同的层次——如何使用->工作机制->设计理念 钻研精神 毅力 多方沟通、解决问题能力(听的时候自己突然想起来的) 学习效率: 一手抓理论,一手抓实践——抓住大局,打破砂锅 多讨论切磋 学习习惯: 养成阅读英文资料的习惯 少下载(这个自己要注意 )、勤阅读、多动手 知识的整理,习惯适用PPT和OneNotes(微软的一个产品,在Linux上用Tomboy 比较好) 着重学习基础,平台和核心领域的知识 学会提问: 要经过大脑提问 提问是为了获得启发,提问的技巧 常见的弊病 : 发发散性和盲目跟风式学习 吃着碗里的,想着锅里的。 理论不联系实际 无效学习:90%在收集、整理资料上 他的经历告诉了我们什么 :此人跳槽三次,算是颇为频繁的了。 英语学好,会有更多的选择。 理论和实践结合在编程中尤为体现。 考证不要盲目。 实习的目的是要看别人是怎么工作的,别人是怎么交流的,上班是怎么一回事 求知欲望不要膨胀 了解企业中的实际应用与架构 实践出真知 项目管理经验非常重要。 技术主线是在你毕业前两年到工作前三年这五年。 工作的时候,尤其是刚毕业,每天很长时间在看书,要珍惜 学习要与日常工作紧密联系起来,不要脱节 关于IT咨询顾问,需要什么素质和专业知识 : 这个职业是以个人经验来帮助一个企业完成一个IT项目,需要很好的沟通能力,对项目管理、成本、进度管理需要很多的要求。 第三部分: “IT专业人士如何更有效的学习专业知识”主讲人背景: 胡义,微软咨询顾问。 什么是项目——IT项目的特点:项目的基本特征—— · 明确的目标——建立在与用户的多次沟通之上。 · 独特的性质——但是项目的经验和资产是可以被重用的。 · 资源成本的约束性——人力、时间、金钱 · 项目实施的一次性 · 项目的不确定性——需求变更,项目由于某种原因停滞等,实际就转化为风险。 · 特定的委托人 · 结果的不可逆转性 项目阶段的关系: 微软的MSF和MOF(构建和运维)——PDAC——细化、设计、实施、变化(这是个循环) MOF属于IT Service的东西,是传统项目管理的延伸。 项目的成功不只是实施,运维做不好,那么你就无法从上个项目中脱身,项目也就是失败的了。 项目管理的成熟度:基线: · 范围管理 · 质量管理 · 时间管理 · 费用管理 Building Team: · 人力资源管理 · 供应商管理 · 沟通管理 Building a Project——整合管理 Building success——风险管理项目经理的职责: · 整合所有的资源和人 · 解决冲突和变更 · 沟通的核心 · 利益共担 项目经理的技能:注意图中项目经理的技能要求。项目经理要多关注架构上的HighLevel 常见的失败原因导致项目失败的技术因素导致项目失败的非技术因素 本文转自gnuhpc博客园博客,原文链接:http://www.cnblogs.com/gnuhpc/archive/2012/01/17/2324743.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

openstack学习笔记九 cinder基础配置

cinder 就是 云硬盘 配置cinder步骤 1 安装软件包,然后到keystone注册 创建必要的用户名 密码 服务 endpoint 2 设置配置文件 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 yum install openstack-cinder-y keystoneuser-create--namecinder--passhequan keystoneuser-role-add--usercinder--roleadmin--tennatservices keystoneservice-create--namecinder-- type volume--descriptioncinderxxx 例子关于cul keystoneservice-list |d1271040fa9144318a836a0b476d1e66|cinder|volume|CinderService| keystoneendpoint-list| grep d1271040fa9144318a836a0b476d1e66 |8e18c46fc51c4a6287ea740a37537a59|RegionOne|http: //115 .29.107.17:8776 /v1/ %(tenant_id)s|http: //115 .29.107.17:8776 /v1/ %(tenant_id)s|http: //115 .29.107.17:8776 /v1/ %(tenant_id)s|d1271040fa9144318a836a0b476d1e66| keystoneendpoint-create--service- id d1271040fa9144318a836a0b476d1e66--publicul 'http://115.29.107.17:8776/v1/%(tenant_id)s' --internalurl 'http://115.29.107.17:8776/v1/%(tenant_id)s' --adminurl 'http://115.29.107.17:8776/v1/%(tenant_id)s' [root@hequan~(keystone_admin)] #cd/etc/cinder/ [root@hequancinder(keystone_admin)] #ls api- paste .inipolicy.jsonrootwrap.d cinder.confrootwrap.confvolumes [root@hequancinder(keystone_admin)] #cpcinder.confcinder.conf.bak##备份 [root@hequan~(keystone_admin)] #cp/usr/share/cinder/cinder-dist.conf/etc/cinder/cinder.conf##复制配置文件 [root@hequancinder(keystone_admin)] #chownroot.cindercinder.conf##记得修改权限 [root@hequancinder(keystone_admin)] #openstack-db--init-servicecinder--passwordhequan--rootpw123456##创建数据库 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 [root@hequancinder(keystone_admin)] #vimcinder.conf [DEFAULT] logdir= /var/log/cinder state_path= /var/lib/cinder lock_path= /var/lib/cinder/tmp volumes_dir= /etc/cinder/volumes iscsi_helper=lioadm rootwrap_config= /etc/cinder/rootwrap .conf auth_strategy=keystone [database] connection=mysql: //cinder :hequan@115.29.107.17 /cinder [keystone_authtoken] admin_tenant_name=services admin_user=cinder admin_password=hequan auth_host=115.29.107.17 auth_port=35357 auth_protocol=http [root@hequancinder(keystone_admin)] #grep^rabbit/etc/keystone/keystone.conf rabbit_host=localhost rabbit_port=5672 rabbit_hosts=localhost:5672 rabbit_use_ssl=False rabbit_userid=guest rabbit_password=guest rabbit_virtual_host=/ rabbit_ha_queues=False ##把这些写到上面的配置文件里,通信用 [root@hequancinder(keystone_admin)] #systemctllist-unit-files|grepcinder openstack-cinder-api.serviceenabled ##用户接口 openstack-cinder-backup.serviceenabled ##备份 openstack-cinder-scheduler.serviceenabled ##调度 openstack-cinder-volume.serviceenabled ##后端存储卷 [root@hequancinder(keystone_admin)] #systemctlis-activeopenstack-cinder-api.service active [root@hequancinder(keystone_admin)] #systemctlstartopenstack-cinder-api.serviceopenstack-cinder-backup.serviceopenstack-cinder-scheduler.serviceopenstack-cinder-volume.service [root@hequancinder(keystone_admin)] #systemctlenableopenstack-cinder-api.serviceopenstack-cinder-backup.serviceopenstack-cinder-scheduler.serviceopenstack-cinder-volume.service 再创建一个cinderv2和上面一样 |8fe36f49892447679bc5433b21591906|cinderv2|volumev2|CinderServicev2| |75a8f5bbf35a42a0bfcd2e6a0d4cea9c|RegionOne|http: //115 .29.107.17:8776 /v2/ %(tenant_id)s|http: //115 .29.107.17:8776 /v2/ %(tenant_id)s|http: //115 .29.107.17:8776 /v2/ %(tenant_id)s|8fe36f49892447679bc5433b21591906| 2 修改配置 1 2 3 4 5 [root@hequancinder(keystone_admin)] #cinderlist +----+--------+------------------+------+------+-------------+----------+-------------+-------------+ |ID|Status|MigrationStatus|Name|Size|VolumeType|Bootable|Multiattach|Attachedto| +----+--------+------------------+------+------+-------------+----------+-------------+-------------+ +----+--------+------------------+------+------+-------------+----------+-------------+-------------+ 1 2 3 4 5 6 创建VG [root@hequancinder(keystone_admin)] #pvcreate/dev/xvdb [root@hequancinder(keystone_admin)] #vgcreatecinder-volumes/dev/xvdb [root@hequancinder(keystone_admin)] #vgs VG #PV#LV#SNAttrVSizeVFree cinder-volumes100wz--n-20.60g20.60g 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 [root@hequancinder(keystone_admin)] #cindercreate--display-namevoll1 +---------------------------------------+--------------------------------------+ |Property|Value| +---------------------------------------+--------------------------------------+ |attachments|[]| |availability_zone|nova| |bootable| false | |consistencygroup_id|None| |created_at|2016-07-27T15:14:07.000000| |description|None| |encrypted|False| | id |7f778803-41cd-492f-b3b7-baa349b9c3dc| |metadata|{}| |migration_status|None| |multiattach|False| |name|voll| |os-vol-host-attr:host|None| |os-vol-mig-status-attr:migstat|None| |os-vol-mig-status-attr:name_id|None| |os-vol-tenant-attr:tenant_id|ddac36f63e4547e0a8619574dbc41534| |os-volume-replication:driver_data|None| |os-volume-replication:extended_status|None| |replication_status|disabled| |size|1| |snapshot_id|None| |source_volid|None| |status|creating| |user_id|9382216e2ea540a2af70216577dbed00| |volume_type|None| +---------------------------------------+--------------------------------------+ [root@hequancinder(keystone_admin)] #cinderlist +--------------------------------------+-----------+------------------+------+------+-------------+----------+-------------+-------------+ |ID|Status|MigrationStatus|Name|Size|VolumeType|Bootable|Multiattach|Attachedto| +--------------------------------------+-----------+------------------+------+------+-------------+----------+-------------+-------------+ |7f778803-41cd-492f-b3b7-baa349b9c3dc|available|-|voll|1|-| false |False|| +--------------------------------------+-----------+------------------+------+------+-------------+----------+-------------+-------------+ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ##添加到上面的配置cinder.conf中作为单独字段 [lvm] iscsi_helper=lioadm volume_group=cinder-volumes ##那个组决定默认存储 iscsi_ip_address=115.29.107.17 volume_driver=cinder.volume.drivers.lvm.LVMVolumeDriver ##云硬盘默认存储LVM volumes_dir= /var/lib/cinder/volumes iscsi_protocol=iscsi volume_backend_name=lvm [root@hequancinder(keystone_admin)] #lvs LVVGAttrLSizePoolOriginData%Meta%MoveLogCpy%SyncConvert volume-7f778803-41cd-492f-b3b7-baa349b9c3dccinder-volumes-wi-a-----1.00g [root@hequancinder(keystone_admin)] #lvscan ACTIVE '/dev/cinder-volumes/volume-7f778803-41cd-492f-b3b7-baa349b9c3dc' [1.00GiB]inherit 1 2 3 4 5 6 更换名字 volume_group=vg0 [root@hequancinder(keystone_admin)] #vgrenamecinder-volumesvg0##更改名字 [root@hequan~] #vgs VG #PV#LV#SNAttrVSizeVFree vg0120wz--n-20.60g9.60g 1 2 3 4 5 6 7 8 9 10 11 待测试ceph做后端存储具体ceph配置可看我前一篇glance volume_driver=cinder.volume.drivers.rbd.RBDDriver rbd_pool=cinder #ceph卷名字 rbd_ceph_conf= /etc/ceph/ceph .conf rbd_flatten_volume_from_snapshot= false rbd_max_clone_depth=5 rbd_stone_chunk_size=4 rados_connect_timeout=-1 glance_api_version=2 setfacl-mu:cinder:r-- /etc/ceph/ceph .client.admin.keyring ##cinder可读 本文转自 295631788 51CTO博客,原文链接:http://blog.51cto.com/hequan/1830981,如需转载请自行联系原作者

优秀的个人博客,低调大师

openstack学习笔记二 网络设置基础

租用这个服务的机构,我们称之"租户/tenant/项目/project" 租户 用户 vxlan划分租户 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@h1~] #ipaddr 1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWN link /loopback 00:00:00:00:00:00brd00:00:00:00:00:00 inet127.0.0.1 /8 scopehostlo valid_lftforeverpreferred_lftforever 2:eth0:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscmqstateUPqlen1000 link /ether 00:50:56:a0:b6:6bbrdff:ff:ff:ff:ff:ff inet192.168.1.201 /24 brd192.168.1.255scopeglobaleth0 valid_lftforeverpreferred_lftforever 3:ovs-system:<BROADCAST,MULTICAST>mtu1500qdiscnoopstateDOWN link /ether 36:26:25:65:14:9cbrdff:ff:ff:ff:ff:ff 4:br-ex:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscnoqueuestateUNKNOWN link /ether de:4c:6d:9c:15:4dbrdff:ff:ff:ff:ff:ff 5:br-int:<BROADCAST,MULTICAST>mtu1500qdiscnoopstateDOWN link /ether ce:0b:9b:b5:c1:4dbrdff:ff:ff:ff:ff:ff 6:br-tun:<BROADCAST,MULTICAST>mtu1500qdiscnoopstateDOWN link /ether ae:75:26:fb:f8:42brdff:ff:ff:ff:ff:ff 你想把哪个网络作为数据包的出口,那么你就应该把那个网卡桥接到 br-ex openvswitch 简称 ovs 配置网卡 重点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@h1network-scripts] #catifcfg-eth0 DEVICE=eth0 DEVICETYPE=ovs TYPE=OVSPort OVS_BRIDGE=br-ex ONBOOT= yes BOOTPROTO=none [root@h1network-scripts] #catifcfg-br-ex DEVICE=br-ex DEVICETYPE=ovs TYPE=OVSBridge ONBOOT= yes BOOTPROTO=none IPADDR=192.168.1.201 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=202.106.0.20 1 2 3 4 5 6 7 8 9 10 查看网卡 2:eth0:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscmqmasterovs-systemstateUPqlen1000 link /ether 00:50:56:a0:b6:6bbrdff:ff:ff:ff:ff:ff 3:ovs-system:<BROADCAST,MULTICAST>mtu1500qdiscnoopstateDOWN link /ether d2:18:7d:5e:5e:b9brdff:ff:ff:ff:ff:ff 5:br-ex:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu1500qdiscnoqueuestateUNKNOWN link /ether 00:50:56:a0:b6:6bbrdff:ff:ff:ff:ff:ff inet192.168.1.201 /24 brd192.168.1.255scopeglobalbr-ex valid_lftforeverpreferred_lftforever 管理员登陆http://192.168.1.201/dashboard 选择系统--网络--创建网络 创建,点击网络名称put-ex 下一步 创建一个项目,创建一个新的用户,新用户关联项目。 用新的用户登录,创建网络 先创建网络,然后创建路由,连到网络上,最后添加端口 本文转自 295631788 51CTO博客,原文链接:http://blog.51cto.com/hequan/1795705,如需转载请自行联系原作者

优秀的个人博客,低调大师

(JMX读书笔记)-JMX的架构

JMX采用的是3层的架构模型: 分配层:(Distributed Layer) 这一层主要包含了能JMXAgent和外部世界进行通信的组件。有两种类型的交互,一种称为adaptor,一种称为connector. 代理层: (Agent Layer) 这一层主要包含了Agent和MBeanServer,前者为了方便管理MBean,提供了4类服务(timer,monitoring,dynamic MBean loading,relationship service)。后者用于注册MBean,并且是JMX架构的核心组件。 设备层:(Instrumentation Layer) 这一层主要包含了MBean,每个MBean可通过API来使用,或者,操作一个受管资源 整体架构图如图: 学习JMX的最好的例子就是研究下JBoss的架构,JBOSS服务器吧JMX的特征和功能发挥到了极致,等写完这系列知识之后我会写一系列文章来列举JBoss架构。 本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/861739,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android学习笔记(一) 使用选择部件

ListActivity的使用 extend Activity package com.example.listtest; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { TextView selection; ListView list; String[] items={"t0","t1","t2","t3","t4"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items)); selection=(TextView)findViewById(R.id.textView1); list=(ListView)findViewById(R.id.listView1); //绑定数据 list.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items)); list.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView< ?> arg0, View arg1, int position,long id){ selection.setText(items[position]); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } extend ListActivity spinner的使用 package com.example.test2; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; public class MainActivity extends Activity { TextView text; Spinner sp; private String[] items={"t0","t1","t2","t3","t4"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text=(TextView)findViewById(R.id.textView1); sp=(Spinner)findViewById(R.id.spinner1); ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,items); aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); sp.setAdapter(aa); sp.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView< ?> parent, View v, int position, long id){ text.setText(items[position]); } public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub text.setText("Nothing selected!"); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } GridView的使用 package com.example.test3; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.GridView; import android.widget.TextView; public class MainActivity extends Activity { TextView selection; GridView grid; String[] items={"t0","t1","t2","t3","t4","t5","t6","7t","t8","t9","t10","t11","t12","t13","t14","t15","t16","t17","t18","t19",}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); selection=(TextView)findViewById(R.id.textView1); grid=(GridView)findViewById(R.id.gridView1); grid.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,items)); grid.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub selection.setText(items[arg2]); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } AutoCompleteTextView package com.example.test5; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.widget.TextView; import android.support.v4.app.NavUtils; import android.text.Editable; import android.text.TextWatcher; public class MainActivity extends Activity implements TextWatcher{ TextView selection; AutoCompleteTextView edit; String[] items={"teacher","core","popular","wherese","compromise","teeth"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); selection=(TextView)findViewById(R.id.textView1); edit=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); edit.addTextChangedListener(this); edit.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line,items)); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void afterTextChanged(Editable s) { // TODO Auto-generated method stub } public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub selection.setText(edit.getText()); } } 本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/archive/2013/05/09/3068353.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册