首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

Linux基础 crontab定时任务

linux定时任务: 程序、进程、守护进程 程序:软件,可执行的代码 进程:正在执行的命令、服务,执行完成,就会退出 守护进程(服务):在后台一直运行的进程 sshd: 守护进程:daemon 1)检查crond服务是否允许 /etc/init.d/crond status /etc/init.d/crond start chkconfig crond on 2)定时任务的写法 * * * * * cmd 分 时 日 月 周 执行的命令 3)举例 编辑定时任务crontab -e * * * * * echo 1234567 >>/tmp/oldboy.txt 查看定时任务crontab -l 练习: 每隔两个小时,重启一下sshd服务 4)定时任务 一定要,命令行,先测试!!! 10 */2 * * * 每隔2小时的每分钟,都执行 5)定时任务的取值范围 * * * * * cmd 分 时 日 月 周 执行的命令 0-59 0-23 1-31 1-12 0-6 练习: 每周3,下午6点整,echo jiaozuoye 00 18 * * 3 6)注意 */3 每隔多久执行一次 7)例子: 每天下午的2点整和4点整,京东秒杀 echo jingdongmiaosha 00 14,16 * * * echo jingdongmiaosha 练习: 每年的3、6、11月份,1-7号,早上8点整到晚上8点整 echo 进行大酬宾 00 8-20 1-7 3,6,11 * echo dachoubin 8:注意事项 a.定时任务执行命令的时候,最好使用命令的决对路径。 b.定时任务一定要加注释!(君子协议) c.特殊符号需要转义;例子:* * * * * echo "`date +\%F\ \%T`" >>/tmp/time.txt d.最好不要让直行的命令,有输出,如果避免不了有输出,就把它定向到空(黑洞) e.定时任务中,严禁使用相对路径 f.尽量使用crontab -e命令来添加定时任务!因为crontab带有语法检查。 不加引号:只能输出单行文本;能解析变量 单引号: 可以输出多行文本; 不能解析变量,适合输出带有特殊符号的内容 双引号: 可以输出多行文本;能解析变量 标准输出:1>(默认就是标准输出) 错误输出:2> 黑洞:/dev/null 9:批量添加定时任务 crontab -e编辑定时任务,实际上就是编辑文件/var/spool/cron/root #上课 30 9 * * 0 /oldboy.sh &>/dev/null echo -e '#上课\n30 9 * * 6 /oldboy.sh &>/dev/null' >>/var/spool/cron/root 建个回收站recovery alias rm = "mv -f -t /recovery" 直接删除\rm \取消别名作用 crontab -e * */2 * * * \rm -rf /recovery/* #每两小时清空一次recovery minute hour day month dayofweek command minute是分钟,取值范围:0-59 hour段是小时。取值范围:0-23 day段是一个月中的第几天,取值范围:1-31 month是一年中的第几个月,取值范围:1-12 dayofweek是一个星期中的第几天,以星期天开始依次的取值为0~7,0、7都表示星期天。 command是定时运行的命令。 root表示以root用户身份来运行 run-parts表示后面跟着的是一个文件夹,要执行的是该文件夹下的所有脚本 所有可用值用 * 表示 整数间的连字号(-)表示整数列,例如1-4意思是整数1,2,3,4 指定数值由逗号分开。如:3,4,6,8表示这四个指定整数。 符号“/”指定步进设置。“/<interger>”表示步进值。如0-59/2定义每两分钟执行一次。步进值也可用星号表示。如*/3用来运行每三个月份运行指定任务。 以“#”开头的为注释行,不会被执行。 如果一个cron任务需要定期而不是按小时,天,周,月来执行,则需要添加/etc/cron.d目录。这个目录下的所有文件和文件/etc/crontab语法相同,查看样例: # record the memory usage of the system every monday # at 3:30AM in the file /tmp/meminfo 30 3 * * mon cat /proc/meminfo >> /tmp/meminfo # run custom scrīpt the first day of every month at 4:10AM 10 4 1 * * /root/scrīpts/backup.sh 除了root用户之外的用户可以执行crontab配置计划任务。所有用户定义的crontab存储在目录/var/spool/cron下,任务会以创建者的身份被执行。要以特定用户创建一个crontab,先以该用户登录,执行命令crontab -e,系统会启动在VISUAL或者EDITOR中指定的的编辑软件编辑crontab。文件内容与/etc/crontab格式相同。示例如下: 0 3 * * * /home/dbbackup/db1backup.sh backup 0 4 * * * /home/dbbackup/db2backup.sh backup 表示每天3点执行/home/dbbackup/db1backup.sh backup,4点执行/home/dbbackup/db2backup.sh backup,如果是每五分钟执行一次可改为: */5 * * * * /home/dbbackup/db2backup.sh backup 当更改的crontab需要保存时,文件会保存在成如下文件/var/spool/cron/username。文件名会根据用户名而不同。 cron服务会每分钟检查一次/etc/crontab、/etc/cron.d/、/var/spool/cron文件下的变更。如果发现变化,就会下载到存储器中。因此,即使crontab文件改变了,程序也不需要重新启动。推荐自定义的任务使用crontab -e命令添加,退出后用/etc/init.d/crond restart命令重启crond进程,官方文件说不用重启进程,但我遇到不重启无法运行任务的情况。开始不知道/etc/crontab文件中的run-parts是什么意思,直接把命令按照/etc/crontab的格式加上总是无法运行,后来才知道run-parts是指后面跟着的是文件夹。 四.crontab服务的启动关闭 sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置

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

java基础学习_常用类小结

看看下面的类,是否都熟悉,简要说明每个类主要是干什么呢? Object:是类层次结构的根类,所有类都直接或者间接的继承自该类。 Scanner:获取键盘录入数据的类。 String:针对字符串的常见操作的类。 StringBuffer/StringBuilder:字符串缓冲区类,提高字符串的操作效率。 Arrays:针对数组进行操作的工具类。 Integer:把int基本数据类型封装成Integer引用数据类型,可以调用方法了,最主要作用是可以把String引用数据类型转换int基本数据类型了。 Character:把char基本类型封装成Character引用数据类型,可以调用方法了。了解几个方法就可以了。 Pattern:正则表达式的编译表示形式。模式对象。 Matcher:匹配器对象。 Math:针对数学运算操作的类。 Random:产生随机数的类。 System:系统类,提供了几个有用方法。 BigInteger:关于大整数的运算的类。 BigDecimal:关于浮点数的运算用这个,不会有精度的丢失。 Date:针对日期操作的类,可以精确到毫秒。 DateFormat:针对日期进行格式化或者针对字符串(文本)进行解析的类。 Calendar:日历类,把所有的日历字段(成员变量)进行了封装,要什么,自己使用获取方法,然后拼接。 Object:是类层次结构的根类,所有类都直接或者间接的继承自该类。 Scanner:获取键盘录入数据的类。 String:针对字符串的常见操作的类。 StringBuffer/StringBuilder:字符串缓冲区类,提高字符串的操作效率。 Arrays:针对数组进行操作的工具类。 Integer:把int基本数据类型封装成Integer引用数据类型,可以调用方法了,最主要作用是可以把String引用数据类型转换int基本数据类型了。 Character:把char基本类型封装成Character引用数据类型,可以调用方法了。了解几个方法就可以了。 Pattern:正则表达式的编译表示形式。模式对象。 Matcher:匹配器对象。 Math:针对数学运算操作的类。 Random:产生随机数的类。 System:系统类,提供了几个有用方法。 BigInteger:关于大整数的运算的类。 BigDecimal:关于浮点数的运算用这个,不会有精度的丢失。 Date:针对日期操作的类,可以精确到毫秒。 DateFormat:针对日期进行格式化或者针对字符串(文本)进行解析的类。 Calendar:日历类,把所有的日历字段(成员变量)进行了封装,要什么,自己使用获取方法,然后拼接。我的GitHub地址: https://github.com/heizemingjun 我的博客园地址: http://www.cnblogs.com/chenmingjun 我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun Copyright ©2018 黑泽明军 【转载文章务必保留出处和署名,谢谢!】

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

02.Java基础(线程池)

执行异步任务的时候,如果只是new Thread,存在一下弊端 a. 每次new Thread新建对象性能差。 b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 c. 缺乏更多功能,如定时执行、定期执行、线程中断。 Java本身提供了四种线程池 newCachedThreadPool 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程, 那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智 能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于 操作系统(或者说JVM)能够创建的最大线程大小。 newCachedThreadPool是存在内存溢出安全隐患的,因为我们假设新建的线程都在工 作,newCachedThreadPool 只会重用空闲并且可用的线程,所以当所需线程数量足够大 时,会不停地创建新线程,在 64-bit JDK 1.7 中 -Xss 默认是 1024k,也就是 1M(一个线 程占用的空间大小),那就是需要 10000*1M = 10G 的堆外内存空间来给线程使用,就 会 发生OOM ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) { final int index = i; try { Thread.sleep(index * 1000); } catch (InterruptedException e) { e.printStackTrace(); } cachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println(index); } }); newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { final int index = i; fixedThreadPool.execute(new Runnable() { @Override public void run() { try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.schedule(new Runnable() { @Override public void run() { System.out.println("delay 3 seconds"); } }, 3, TimeUnit.SECONDS); scheduledThreadPool.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("delay 1 seconds, and excute every 3 seconds"); } }, 1, 3, TimeUnit.SECONDS); newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行 ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute(new Runnable() { @Override public void run() { try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); 相对于直接new Thread,线程池具有一下优点 a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。 b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 c. 提供定时执行、定期执行、单线程、并发数控制等功能

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

JavaScript的常用基础知识

前言 稻光养晦,未雨绸缪 函数的定义 函数定义的第一种方式 屏幕快照 2018-01-26 17.39.05.png 说明 1 . 这是最正常的一种函数表达式 2 . 函数aa可以接受任意的参数 3 . 可以有返回值,可以用变量来接受其返回值 4 . 如果没有return,则返回undefined. 函数定义的第二种方式 屏幕快照 2018-01-26 17.41.48.png 说明 1 . 直接给变量赋值一个函数 2 . 在项目开发中是一种比较常见的形式 Dom对象 DOM是Document Object Model文档对象模型的缩写。根据W3C DOM规范,DOM是一种与浏览器,平台,语言无关的接口,使得你可以访问页面其他的标准组件。 D:文档 – html 文档 或 xml 文档 O:对象 – 把document里的所有节点都看成对象 M:模型(用于建立从文档到对象的模型) 结构如下: 屏幕快照 2018-01-27 00.02.59.png 对应的html页面: 屏幕快照 2018-01-27 00.03.11.png 从上述两个图中可以看出: 1 . 整个html称为dom树,而dom的引用为document,也称为一个节点。 2 . 每一个HTML标签都为一个元素节点 3 . 标签中的文字则是文本节点 4 . 标签中的属性则是属性节点 5 . dom中元素、文本、属性都是节点 6 . dom树是由节点构成的 7 . 每个节点都代表一个对象 常用的API getElementById() 说明: 1、 查询给定ID属性值的元素,返回该元素的元素节点。也称为元素对象。 2、 因为在一个html页面中id的值是唯一的,所以返回值也是唯一的。所以方法的名称为getElementById()而不是getElementsById()。 3、 该方法只能用于document对象,类似与java的static关键字。 例子 屏幕快照 2018-01-27 00.24.44.png getElementsByName() 说明: 1、查找给定name属性的所有元素,这个方法将返回一个节点集合,也可以称为对象集合。 2、这个集合可以作为数组来对待,length属性的值表示集合的个数。 3、因为在html页面中,name不能唯一确定一个元素,所以方法的名称为getElementsByName而不是getElementByName。 例子 屏幕快照 2018-01-27 00.25.53.png getElementsByTagName() 说明: 1、查询给定标签名的所有元素 2、因为在html页面中,标签名不是唯一的,所以返回值为节点的集合。 3、这个集合可以当做数组来处理,length属性为集合里所有元素的个数 例子 <!DOCTYPE html> <html> <head> <title>getElementsByTagName.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <form name="form1" action="test.html" method="post"> <input type="text" name="halo" value="我是Halo1!!!" id="halo1"> <input type="text" name="halo" value="我是Halo2!!!" id="halo2"> <input type="text" name="halo" value="我是Halo3!!!" id="halo3"> <input type="text" name="halo" value="我是Halo4!!!" id="halo4"> <input type="button" name="ok" value="OK"> </form> <select name="sport" id="sport"> <option value="篮球">乔丹</option> <option value="足球" selected="selected">梅西</option> <option value="乒乓球">刘国梁</option> <option value="台球">丁俊晖</option> </select> <select name="edu" id="edu"> <option value="专科">专科学位</option> <option value="本科">本科学位</option> <option value="硕士">硕士学位</option> <option value="博士">博士学位</option> </select> </body> <script type="text/javascript"> /*** *1、获取所有input元素的值 *2、输出所有input元素的值,不包括按钮,并且点击文本框,获取相应的值。 *3、输出所有下拉选 id=“edu” 的value值 *4、输出所有下拉选框的内容 *5、选择下拉列表框的内容,并且弹出所选择的内容 *6、针对每一个下拉列表框的内容,弹出所选中的内容 ***/ //1. /******************************************************************/ /* //1.获取所有input元素的值 var inputElements = document.getElementsByTagName("input"); //遍历inputElements数组元素的每一个对象 for(var i=0;i < inputElements.length;i++){ alert(inputElements.item(i).value); } */ //2. /******************************************************************/ //输出所有input元素的值,不包括按钮,并且点击文本框,获取相应的值。 //1、获取input元素的对象数组 var inputElements = document.getElementsByTagName("input"); //2、遍历数组 /* for(var i=0;i<inputElements.length;i++){ if(inputElements[i].type != "button"){ alert(inputElements[i].value); inputElements[i].onclick = function(){ alert(this.value); } } } */ //3. /******************************************************************/ //输出所有下拉选 id=“edu” 的value值 //eduElement.childNodes获取的是所有子节点及子子节点。 /* //1、获取id为edu的对象 var eduElement = document.getElementById("edu"); //2、获取id为edu的对象的子节点 var optionElements = eduElement.getElementsByTagName("option"); for(var i=0;i<optionElements.length;i++){ alert(optionElements[i].value); } */ //4. /******************************************************************/ //输出所有下拉选框的内容 /* var optionElements = document.getElementsByTagName("option"); for(var i=0;i<optionElements.length;i++){ alert(optionElements[i].value); } */ //5. /******************************************************************/ //选择下拉列表框的内容,并且弹出所选择的内容 //1.获取所有的select元素的对象 var selectElements = document.getElementsByTagName("select"); //2.遍历所有的select对象,并且赋值onchange方法 for(var i=0; i<selectElements.length;i++){ selectElements[i].onchange = function(){ //this代表选中的option对象 alert(this.value); } } //6. /******************************************************************/ //针对每一个下拉列表框的内容,弹出所选中的内容 var selectElement1 = document.getElementById("sport"); var selectElement2 = document.getElementById("edu"); selectElement1.onchange = function(){ alert(this.value); } selectElement2.onchange = function(){ alert(this.value); } </script> </html> hasChildNodes() 说明 1、该方法用来判断一个元素是否有子节点。 2、返回值为true或者false。 3、文本节点和属性节点不可能再包含子节点,所以对于这两类节点使用 hasChildNodes()方法返回值永远为false。 4、如果hasChildNodes()返回值为false,则childNodes,firstChild,lastChild将为空数组或者空字符串。 例子 <!DOCTYPE html> <html> <head> <title>hasChildNodes.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <form name="form1" action="test.html" method="post"> <input type="text" name="halo" value="我是Halo1!!!" id="halo1"> <input type="text" name="halo" value="我是Halo2!!!" id="halo2"> <input type="text" name="halo" value="我是Halo3!!!" id="halo3"> <input type="text" name="halo" value="我是Halo4!!!" id="halo4"> <input type="button" name="ok" value="OK"> </form> <select name="edu" id="edu"> <option value="专科">专科学位</option> <option value="本科">本科学位</option> <option value="硕士">硕士学位</option> <option value="博士">博士学位</option> </select> </body> <script type="text/javascript"> /* *分两种情况输出hasChildNodes()的值 * 1、有子节点 * 2、没有子节点 */ //输出有子节点的值 var eduElement = document.getElementById("edu"); //因为有子节点,所以返回值为true alert(eduElement.hasChildNodes()); //输出没有子节点的值 var halo1Element = document.getElementById("halo1"); alert(halo1Element.hasChildNodes()); </script> </html> nodeName属性 说明 1、文档中的每一个节点都有这个属性。 2、为给定节点的名称。 3、如果节点是元素节点,nodeName返回元素的名称;如果给定节点为属性节点,nodeName返回属性的名称;如果给定节点为文本节点,nodeName返回为#text的字符串; 例子 <!DOCTYPE html> <html> <head> <title>nodeName.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <select name="edu" id="edu"> <option value="本科">本科学位</option> <option value="硕士">硕士学位</option> <option value="博士">博士学位</option> <option value="专科">专科学位</option> </select> </body> <script type="text/javascript"> /* *分别输出edu元素节点元素及属性name,id的nodeName * */ //1.获得edu对象 var eduElement = document.getElementById("edu"); //2.获得edu对象的nodeName alert(eduElement.nodeName); //这一步获得的是<select name="edu" id="edu">的name属性的值 //var nameElement = eduElement.name; //通过eduElement.getAttributeNode()可以获取属性的对象 var nameElement = eduElement.getAttributeNode("name"); alert(nameElement.nodeName); var idElement = eduElement.getAttributeNode("id"); alert(idElement.nodeName); var optionElements = eduElement.getElementsByTagName("option"); for(var i=0;i<optionElements.length;i++){ alert(optionElements[i].nodeName); var valueElement = optionElements[i].getAttributeNode("value"); alert(valueElement.nodeName); } </script> </html> nodeType属性 说明 1、该节点表明节点类型,返回值为一个整数 2、常用的节点类型有三种: (1)、 元素节点类型 值为1 (2)、属性节点类型 值为2 (3)、文本节点类型 值为3 例子 <!DOCTYPE html> <html> <head> <title>nodeName.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <select name="edu" id="edu"> <option value="专科">专科学位</option> <option value="本科">本科学位</option> <option value="硕士">硕士学位</option> <option value="博士">博士学位</option> </select> </body> <script type="text/javascript"> /* *分别输出edu元素节点元素及属性name,id的nodeType *输出option元素的子节点文本元素的元素类型 */ //1.分别输出edu元素节点元素及属性name,id的nodeType var eduElement = document.getElementById("edu"); //alert(eduElement.nodeType); var nameElement = eduElement.getAttributeNode("name"); //alert(nameElement.nodeType); var idElement = eduElement.getAttributeNode("id"); //alert(idElement.nodeType); var optionElements = eduElement.getElementsByTagName("option"); for(var i=0;i<optionElements.length;i++){ //alert(optionElements[i].nodeType); var valueElement = optionElements[i].getAttributeNode("value"); alert(valueElement.nodeType); var textElement = optionElements[i].firstChild; alert(textElement.nodeType); } </script> </html> nodeType属性 说明 1、返回给定节点的当前值(字符串)。 2、如果给定节点是属性节点,返回值是这个属性的值;如果给定节点是文本节点,返回值是这个文本节点的内容;如果给定节点是元素节点,返回值是null。 3、nodeValue是一个读写属性。 例子 <!DOCTYPE html> <html> <head> <title>nodeValue.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <select name="edu" id="edu"> <option value="专科">专科学位</option> <option value="本科">本科学位</option> <option value="硕士">硕士学位</option> <option value="博士">博士学位</option> </select> </body> <script type="text/javascript"> /* *分别输出edu元素节点元素及属性name,id的nodeValue *输出option元素的子节点文本元素的元素类型 */ //1、获得edu的元素节点 var eduElement = document.getElementById("edu"); //2、获得eduElement的nodeValue的值 alert(eduElement.nodeValue); //获得edu属性name的元素节点值 var nameElement = eduElement.getAttributeNode("name"); alert(nameElement.nodeValue); //获得edu属性id的元素节点值 var idElement = eduElement.getAttributeNode("id"); alert(nameElement.nodeValue); //输出option元素的子节点文本元素的元素类型 var optionElements = eduElement.getElementsByTagName("option"); for(var i = 0; i < optionElements.length; i++){ var valueElement = optionElements[i].getAttributeNode("value"); alert(valueElement.nodeValue); var textElement = optionElements[i].firstChild; alert(textElement.nodeValue); } </script> </html> replaceChild() 说明 1、把一个给定父元素里的一个子节点替换为另外一个子节点; 2、var reference = element.replaceChild(newChild,oldChild); 3、返回值指向已经被替换掉的那个子节点的引用; 例子 <!DOCTYPE html> <html> <head> <title>replaceChild.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> 您喜欢的城市:<br> <ul> <li id="wh" value="wuhan">武汉</li> <li id="km" value="kunming">昆明</li> <li id="sz" value="shenzhen">深圳</li> </ul> 您喜欢的词语:<br> <ul> <li id="six" value="sixsixsix">666</li> <li id="dy" value="daye">大爷</li> <li id="ly" value="laoye">老爷</li> </ul> </body> <script type="text/javascript"> /* *点击北京节点,将被给力节点替换 */ window.onload = function(){ //1、得到北京节点 var whElement = document.getElementById("wh"); //2、注册onclick事件 whElement.onclick = function(){ //3、找到wh节点的父节点 var ulElement = whElement.parentNode; //4、获得gl节点 var dyElement = document.getElementById("dy"); //5、替换 ulElement.replaceChild(dyElement,whElement); } } </script> </html> getAttribute() 说明 1、返回一个给定元素的给定属性的节点的值 2、var attributeValue = element.getAttribute(attributeName) 3、给定属性的名字必须以字符串的形式传递给该方法 4、给定属性的值将以字符串的形式返回 5、通过属性获取属性节点getAttributeNode(属性的名称) --返回属性节点 例子 <!DOCTYPE html> <html> <head> <title>getAttribute.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> 您喜欢的词语:<br> <ul> <li id="six" value="sixsixsix">666</li> <li id="dy" value="daye">大爷</li> <li id="ly" value="laoye">老爷</li> </ul> </body> <script type="text/javascript"> /** ** 获取<li id="six" value="sixsixsix">666</li>的属性id和value的值 **/ var sixElement = document.getElementById("six"); //第一种方法: alert(sixElement.getAttributeNode("id").nodeValue); alert(sixElement.getAttributeNode("value").nodeValue); //第二种方法: alert(sixElement.getAttribute("id")); alert(sixElement.getAttribute("value")); </script> </html> setAttribute() 说明 1、将给定元素添加一个新的属性或改变它现有属性的值; 2、element.setAttribute(attributeName,attributeValue); 3、属性的名字和值必须以字符串的形式传递; 4、如果这个属性已经存在,那么值将被attributeValue取代; 5、如果这个属性不存在,那么先创建它,再给他赋值; 例子 <!DOCTYPE html> <html> <head> <title>setAttribute.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> 您喜欢的词语:<br> <ul> <li id="six" value="sixsixsix">666</li> <li id="dy" value=daye"">大爷</li> <li id="ly" value="laoye">老爷</li> </ul> </body> <script type="text/javascript"> /** ** 给<li id="ly" value="laoye">老爷</li>增加一个name属性,并赋值,然后输出 **/ var lyElement = document.getElementById("ly"); lyElement.setAttribute("name", "halo"); alert(lyElement.getAttribute("name")); </script> </html> createElement() 说明 1、按照给定的标签名创建一个新的元素节点,方法的参数为被创建的元素的名称; 2、var reference = document.createElement(elementName); 3、方法的返回值指向新建节点的引用,返回值是一个元素节点,所以nodeType 为1; 4、新建的节点不会自动添加到文档里,只是存在于document里一个游离的对象; 例子 <!DOCTYPE html> <html> <head> <title>createElement.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> 您喜欢的词语:<br> <ul> <li id="six" value="sixsixsix">666</li> <li id="dy" value=daye"">大爷</li> <li id="ly" value="laoye">老爷</li> </ul> </body> <script type="text/javascript"> /** ** 为ul增加一个新的元素<li id="cs" value="cs">计算机</li> ** **/ //1.创建<li></li> var liElement = document.createElement("li"); //2.创建文本节点 传说 var textElement = document.createTextNode("计算机"); //3.<li id="cs" value="cs">计算机</li>的形成 liElement.appendChild(textElement); liElement.setAttribute("id", "cs"); liElement.setAttribute("value", "cs"); //4.获得ul对象 var ulElement = document.getElementsByTagName("ul")[0]; ulElement.appendChild(liElement); </script> </html> innerHTML属性 说明 用来读写某个元素中的HTML内容 例子 <!DOCTYPE html> <html> <head> <title>innerHTML.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> <div id="mydiv"><h1 id="h">halo是我的简称!!</h1></div> </body> <script type="text/javascript"> /** *读取div中的html内容 **/ var divElement = document.getElementById("mydiv"); var h1Element = document.getElementById("h") alert(divElement.textContent); alert(h1Element.textContent); </script> </html> window.onload 说明 1、在页面上所有的数据加载完以后触发该方法; 2、这样做的好处是,有时候一些JS函数要用到页面上的一些数据,但是此时有些数据还没有加载进来。这个时候触发函数,就会报一些异常。所以用window.onload方法可以确保数据安全落地; 例子 <!DOCTYPE html> <html> <head> <title>window_load.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> </head> <body> this is my HTML page.<br> </body> <script type="text/javascript"> /** *把页面中的所有的数据加载完以后触发该方法 **/ window.onload = function(){ alert("ssssss"); } </script> </html>

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

objective-c内存管理基础

对于我们.net开发人员来说,.net为我们提供了自动内存管理的机制,我们不需去关心内存的管理。但是iphone开发中却是不能的。这篇文章将简述一下objective-c的内存管理机制和方法和一些特性。 手动的进行内存管理 Cocoa和Objective-C的类都是NSObject的子类。NSObject中有几个方法进行内存管理。alloc方法为对象分配一片内存空间。dealloc方法用于释放对象的空间。但是在我们的代码中将永远都不会使用dealloc方法,因为运行时会为你调用此方法释放内存空间。而你需要做的只是引用计数,稍后介绍什么是引用计数。 除了alloc和dealloc,NSObject的还有retain和release方法两个方法用于引用计数。retain方法给retainCount变量加1,release方法给retainCount变量减1。当使用alloc为对象分配一片内存空间的时候,retainCount会为1。在这个对象的生命周期内,这个对象可能继续被其它变量引用。但有新的变量指向这个对象的时候,你应该调用retain方法,这样运行时才会知道有新的引用指向了这个变量,在这个对象生存期中拥有它的使用权。这个被Objective-C开发人员称之为“拥有”。例如: Foo * myFooOne = [[Foo alloc] init]; // retaincount 为1 Foo * myFooTwo = myFooOne; // myFooTwo 指向了这个对象 // retaincount 仍然为1 [myFooTwo retain]; // 调用retain方法,运行时才知道myFooTwo指向了该对象,retaincount 为2 上面的代码中,myFooTwo通过调用retain方法,取得了Foo对象的拥有权。在这个对象的生命周期中,会有很多变量来指向和引用它。指向这个对象的变量也可以通过release方法来解除这种拥有权。release方法将会告诉运行时,我已经使用完这个变量了,已经不需要它了,retainCount计数减1。 当对象的retainCount的计数大于或者等于1的时候,运行时会继续维持这个对象。当对象的retainCount为0的时候,运行时会释放这个对象,并回收它占得内存空间。 下图展示了一个Foo对象的生命周期。Foo对象首先在内存中分配一个内存空间,并且被myFooOne引用。在这个时候Foo对象的retaincount为1。 Foo * myFooOne = [[Foo alloc] init]; 第二个引用变量指向Foo对象,这个引用变量接着调用retain方法,其实也是调用Foo对象的retain方法。Foo对象的retaincount变成2。 Foo * myFooTwo = myFooOne; [myFooTwo retain]; 接着当myFooOne引用不需要的时候,通过调用release方法,解除与Foo对象的拥有权,Foo对象的retaincount变成1。 [myFooOne release]; 但myFooTwo不在需要的时候,同样通过调用release方法,解除与Foo对象的拥有权,Foo对象的retaincount变成0。 内存泄露 我们经常会在一个方法中声明对象,看下面这个例子: - ( void ) myMethod { // incorrect method NSString * myString = [[NSString alloc] init]; // retainCount = 1 Foo * myFoo = [[Foo alloc] initWithName:myString]; // retainCount = 1 NSLog( @" Foo's Name:%@ " , [myFoo getName]); } 这上面这个方法中,我们为myString 和myFoo分配了内存空间。方法执行结束之后,两个变量超出了作用域的范围,所以不再有效。但是这个方法并没有releases这两个对象。所以运行时没有释放这两个变量占据的内存空间。除非你的应用程序结束,否则这两个变量占据的内存空间一直都是不可用的。我们把它称之为内存泄露。 为了防止内存泄露。无论什么时候,我们创建一个对象,或者创建一个对象的拷贝,我们都必须通过release方法释放。 - ( void ) myMethod { NSString * myString = [[NSString alloc] init]; // retainCount=1 Foo * myFoo = [[Foo alloc] initWithName:myString]; // retainCount=1 NSLog( " Foo's Name:%@ " , [myFoo getName]); [myFoo release]; // retainCount=0 so deallocate [myString release]; // retainCount=0 so deallocate } 弱引用 看下面的例子: - ( void ) myMethod { // an incorrect method Foo * myFooOne = [[Foo alloc] initWithName: @" James " ]; // retainCount=1 Foo * myFooTwo = myFooOne; // retainCount still 1 [myFooOne release]; // retaincount=0 so deallocated NSLog( " Name:%@ " , [myFooTwo printOutName]); // runtime error } nyFooTwo指向了Foo对象,但是没有调用retain方法,就是一种弱引用,上面的代码会在运行时报错。因为myFooOne调用release方法。retaincount变成0,运行时,回收了对象的内存空间。然后myFooTwo调用printPutName自然就报错了,见下图说明。 总结:本文简单的介绍了一下手动的进行内存管理、内存泄露、弱引用等objective-c的知识。 本文转自麒麟博客园博客,原文链接:http://www.cnblogs.com/zhuqil/archive/2011/03/16/1986420.html,如需转载请自行联系原作者

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

2-openstack基础环境准备

说明: linux-node1 控制节点 linux-node2 计算节点 2.1.两台centos7服务器 1 2 3 4 5 主机名: [root@linux-node1~] #hostname linux-node1 [root@linux-node2~] #hostname linux-node2 1 2 3 IP: linux-node1192.168.56.11 /24 linux-node2192.168.56.12 /24 1 2 3 4 5 6 host解析 cat /etc/hosts 127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4 ::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain6 192.168.56.11linux-node1linux-node1.oldboyedu.com 192.168.56.12linux-node2linux-node2.oldboyedu.com 2.2 selinux 和防火墙关闭 1 2 3 4 5 6 7 8 9 [root@linux-node2~] #getenforce Disabled [root@linux-node1~] #getenforce Disabled #可以用sed sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config 防火墙: systemctlstopfirewalld systemctldisablefirewalld 2.3 配置时间同步(两台都做) 1 2 3 4 5 6 yum–y install chrony grep "allow" /etc/chrony .conf #打开 allow192.168 /16 systemctl enable chronyd.service #设置开机自启 systemctlstartchronyd.service #启动 timedatectl set -timezoneAsia /Shanghai #同步时区 2.4 在linux-node1 上安装数据库 1 2 3 4 5 6 7 8 9 10 11 yum install -ymariadbmariadb-serverMySQl-python #安装数据库 \ cp /usr/share/mysql/my-medium .cnf /etc/my .cnf #拷贝配置文件 在 vi /etc/my .cnf添加如下几行 [mysqld] default-storage-engine=innodb #默认的存储引擎 innodb_file_per_table #使用独享的表空间 collation-server=utf8_general_ci #设置校对规则 init-connect= 'SETNAMESutf8' #设置链接的字符集 character- set -server=utf8 #设置默认的字符集 systemctl enable mariadb.service #开机启动数据库 systemctlstartmariadb.service #立马启动数据库 2.5 初始化数据库 2.6 为各个组件创建数据库并收授权 2.6.1 keystone 1 2 3 4 5 6 MariaDB[(none)]>createdatabasekeystone; QueryOK,1rowaffected(0.01sec) MariaDB[(none)]>grantallonkeystone.*to 'keystone' @ 'localhost' identifiedby 'keystonne' ; QueryOK,0rowsaffected(0.00sec) MariaDB[(none)]>grantallonkeystone.*to 'keystone' @ '%' identifiedby 'keystone' ; QueryOK,0rowsaffected(0.00sec) 2.6.2 glance 1 2 3 4 5 MariaDB[(none)]>createdatabaseglance; QueryOK,1rowaffected(0.00sec) MariaDB[(none)]>grantallonglance.*to 'glance' @ '%' identifiedby 'glance' ; QueryOK,0rowsaffected(0.00sec) MariaDB[(none)]>grantallonglance.*to 'glance' @ 'localhost' identifiedby 'glance' ; 2.6.3 nova和nova_api 1 2 3 4 5 6 7 8 9 10 11 MariaDB[(none)]>createdatabasenova; QueryOK,1rowaffected(0.00sec) MariaDB[(none)]>grantallonnova.*to 'nova' @ '%' identifiedby 'nova' ; QueryOK,0rowsaffected(0.00sec) MariaDB[(none)]>grantallonnova.*to 'nova' @ 'localhost' identifiedby 'nova' ; QueryOK,0rowsaffected(0.00sec) MariaDB[(none)]>createdatabasenova_api; QueryOK,1rowaffected(0.00sec) MariaDB[(none)]>grantallonnova_api.*to 'nova' @ 'localhost' identifiedby 'nova' ; QueryOK,0rowsaffected(0.00sec) MariaDB[(none)]>grantallonnova_api.*to 'nova' @ '%' identifiedby 'nova' ; 2.6.4 neutron 1 2 3 4 5 6 7 8 MariaDB[(none)]>createdatabaseneutron; QueryOK,1rowaffected(0.00sec) MariaDB[(none)]>grantallonneutron.*to 'neutron' @ '%' identifiedby 'neutron' ; QueryOK,0rowsaffected(0.00sec) MariaDB[(none)]>grantallonneutron.*to 'neutron' @ 'localhost' identifiedby 'neutron' ;; QueryOK,0rowsaffected(0.00sec) MariaDB[(none)]>flushprivileges; QueryOK,0rowsaffected(0.00sec) 2.6.5 检验数据库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 MariaDB[(none)]>showdatabases; +--------------------+ |Database| +--------------------+ |information_schema| |glance| |keystone| |mysql| |neutron| |nova| |nova_api| |performance_schema| +--------------------+ 8rowsinset(0.00sec) MariaDB[(none)]> 2.7 安装消息队列(rabbitmq) 2.7.1 基本安装 1 2 3 4 5 6 7 8 9 10 11 yuminstallrabbitmq-server-y systemctl enable rabbitmq-server.service systemctlstartrabbitmq-server.service [root@linux-node1~] #rabbitmqctladd_useropenstackopenstack#创建消息队列认证用户 Creatinguser "openstack" ... ... done . [root@linux-node1~] # #创建的用户得授权才能使用 [root@linux-node1~] #rabbitmqctlset_permissionsopenstack".*"".*"".*"#授权用户才能使用 Settingpermissions for user "openstack" in vhost "/" ... ... done . 2.7.2 web界面安装 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 查看组件 [root@linux-node1~] #rabbitmq-pluginslist []amqp_client3.3.5 []cowboy0.5.0-rmq3.3.5-git4b93c2d []eldap3.3.5-gite309de4 []mochiweb2.7.0-rmq3.3.5-git680dba8 []rabbitmq_amqp1_03.3.5 []rabbitmq_auth_backend_ldap3.3.5 []rabbitmq_auth_mechanism_ssl3.3.5 []rabbitmq_consistent_hash_exchange3.3.5 []rabbitmq_federation3.3.5 []rabbitmq_federation_management3.3.5 []rabbitmq_management3.3.5 []rabbitmq_management_agent3.3.5 []rabbitmq_management_visualiser3.3.5 []rabbitmq_mqtt3.3.5 []rabbitmq_shovel3.3.5 []rabbitmq_shovel_management3.3.5 []rabbitmq_stomp3.3.5 []rabbitmq_test3.3.5 []rabbitmq_tracing3.3.5 []rabbitmq_web_dispatch3.3.5 []rabbitmq_web_stomp3.3.5 []rabbitmq_web_stomp_examples3.3.5 []sockjs0.3.4-rmq3.3.5-git3132eb9 []webmachine1.10.3-rmq3.3.5-gite9359c7 加载组件 rabbitmq-plugins enable rabbitmq_management systemctlrestartrabbitmq-server.service #重启消息队列 说明 rabbitmq监听的是5672 rabbitmq的管理界面监听的是15672 2.7.3 访问测试 默认是用户guest 密码是guest 让openstack用户拥有admistrator的权限进行登录 本文转自 小小三郎1 51CTO博客,原文链接:http://blog.51cto.com/wsxxsl/1883586,如需转载请自行联系原作者

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

Android图片显示ICON——基础编

今天写了一编小的图片显示代码,是从ICON的图片的显示结果来说明如果从以后的过程中更加适合里面去。先让我们看一下:图: 让我们看一下类中是代码: packagecom.smart.widget; importandroid.content.Context; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.graphics.Canvas; importandroid.graphics.Rect; importandroid.util.AttributeSet; importandroid.widget.TextView; publicclassIconTextextendsTextView{ //命名空间的值 privatefinalStringnamespace="http://net.blogjava.mobile"; //图像资源ID privateintresourceId=0; privateBitmapbitmap; publicIconText(Contextcontext,AttributeSetattrs) { super(context,attrs); resourceId=attrs.getAttributeResourceValue(namespace,"iconSrc",0); if(resourceId>0) bitmap=BitmapFactory.decodeResource(getResources(),resourceId); } @Override protectedvoidonDraw(Canvascanvas) { if(bitmap!=null) { //从原图上截取图像的区域,在本例中为整个图像 Rectsrc=newRect(); //将截取的图像复制到bitmap上的目标区域,在本例中与复制区域相同 Recttarget=newRect(); src.left=0; src.top=0; src.right=bitmap.getWidth(); src.bottom=bitmap.getHeight(); inttextHeight=(int)getTextSize(); target.left=0; //计算图像复制到目录区域的纵坐标。由于TextView中文本内容并不是从最顶端开始绘制的,因此,需要重新计算绘制图像的纵坐标 target.top=(int)((getMeasuredHeight()-getTextSize())/2)+1; target.bottom=target.top+textHeight; //为了保证图像不变形,需要根据图像高度重新计算图像的宽度 target.right=(int)(textHeight*(bitmap.getWidth()/(float)bitmap .getHeight())); //开始绘制图像 canvas.drawBitmap(bitmap,src,target,getPaint()); //将TextView中的文本向右移动一定的距离(在本例中移动了图像宽度加2个象素点的位置) canvas.translate(target.right+2,0); } super.onDraw(canvas); } } main代码: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:mobile="http://www.baidu.com" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.smart.widget.IconText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第一个笑脸" mobile:iconSrc="drawable/small" /> <com.smart.widget.IconText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第二个笑脸" android:textSize="24dp" mobile:iconSrc="drawable/small" /> <com.smart.widget.IconText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第三个笑脸" android:textSize="36dp" mobile:iconSrc="drawable/small" /> <com.smart.widget.IconText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第四个笑脸" android:textSize="48dp" mobile:iconSrc="drawable/small" /> <com.smart.widget.IconText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第五个笑脸" android:textSize="36dp" mobile:iconSrc="drawable/small" /> <com.smart.widget.IconText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第六个笑脸" android:textSize="24dp" mobile:iconSrc="drawable/small" /> <com.smart.widget.IconText android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="第七个笑脸" mobile:iconSrc="drawable/small" /> </LinearLayout> 本文转自 llb988 51CTO博客,原文链接:http://blog.51cto.com/llb988/497220,如需转载请自行联系原作者

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

android基础进度条原理

下面详细介绍ProgressBar 一、说明 在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度。一个进度条也可不确定其进度。在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。 二、XML重要属性 android:progressBarStyle:默认进度条样式 android:progressBarStyleHorizontal:水平样式 三、重要方法 getMax():返回这个进度条的范围的上限 getProgress():返回进度 getSecondaryProgress():返回次要进度 incrementProgressBy(int diff):指定增加的进度 isIndeterminate():指示进度条是否在不确定模式下 setIndeterminate(boolean indeterminate):设置不确定模式下 setVisibility(int v):设置该进度条是否可视 四、重要事件 onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件 看一下实现代码 packagecom.smart; importjava.util.Timer; importjava.util.TimerTask; importandroid.app.Activity; importandroid.os.Bundle; importandroid.os.Handler; importandroid.os.Message; importandroid.widget.ProgressBar; publicclassMainextendsActivity{ privateProgressBarprogressBar; privateHandlerhandler=newHandler(){ publicvoidhandleMessage(Messagemsg){ switch(msg.what){ case1: intcurrentProgress=progressBar.getProgress()+2; if(currentProgress>progressBar.getMax()) currentProgress=0;//断送进度条 progressBar.setProgress(currentProgress);//显示进度条进度 break; } super.handleMessage(msg); } }; privateTimerTasktimerTask=newTimerTask(){ //信息 @Override publicvoidrun(){ Messagemessage=newMessage(); message.what=1; handler.sendMessage(message); } }; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); progressBar=(ProgressBar)findViewById(R.id.progressbar); Timertimer=newTimer(); timer.schedule(timerTask,0,500); //第二个参数为:从0开始,第三个参数为:它的速度,越大越慢,越小越快。 } } main.xml文件 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ProgressBar android:id="@+id/progressbar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:max="100" style="?android:attr/progressBarStyleHorizontal" /> </LinearLayout> 本文转自 llb988 51CTO博客,原文链接:http://blog.51cto.com/llb988/510427,如需转载请自行联系原作者

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

android计数器——基础编

计数器是指一些常用计时器,例如体育比赛中测试时间的计时器等,但所要介绍的这种计时器一般原理,先让我们看一下图先 让我们看一下代码的实现方法: packagecom.smart; importandroid.app.Activity; importandroid.content.Context; importandroid.os.Bundle; importandroid.os.Handler; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.TextView; importandroid.widget.Toast; publicclassMainextendsActivityimplementsOnClickListener,Runnable{ privateHandlerhandler; privateTextViewsCount; privateintcount=0; @Override//创建方法 publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); ButtonsStart=(Button)findViewById(R.id.sStart); ButtonsStop=(Button)findViewById(R.id.sStop); ButtonshowToast=(Button)findViewById(R.id.showToast); sCount=(TextView)findViewById(R.id.sCount); sStart.setOnClickListener(this); sStop.setOnClickListener(this); showToast.setOnClickListener(this); handler=newHandler(); } //吐丝显示 classRunToastimplementsRunnable{ privateContextcontext; publicRunToast(Contextcontext){ this.context=context; } @Override publicvoidrun(){//根据时间去显示内容 Toast.makeText(context,"15秒后显示信息内容",Toast.LENGTH_LONG).show(); } } @Override//事件点击 publicvoidonClick(Viewv){ switch(v.getId()) { caseR.id.sStart: handler.postDelayed(this,5000); break; caseR.id.sStop: handler.removeCallbacks(this); break; caseR.id.showToast: handler.postAtTime(newRunToast(this) { },android.os.SystemClock.uptimeMillis()+15*1000); break; } } @Override//线程运行 publicvoidrun(){ sCount.setText("Count:"+String.valueOf(++count));//显示计数: handler.postDelayed(this,5000); } } main.xml文件写法 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/sCount" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/sStart" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="开始计数" /> <Button android:id="@+id/sStop" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="停止计数" /> <Button android:id="@+id/showToast" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="15秒后显示Toast信息" /> </LinearLayout> 附件:http://down.51cto.com/data/2357682 本文转自 llb988 51CTO博客,原文链接:http://blog.51cto.com/llb988/510350,如需转载请自行联系原作者

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

Activity多功能按钮——基础编

packagecom.smart; importandroid.app.Activity; importandroid.app.AlertDialog; importandroid.app.Dialog; importandroid.content.DialogInterface; importandroid.os.Bundle; importandroid.util.Log; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.ListView; //继承OnClickListener publicclassMainextendsActivityimplementsOnClickListener{ //固定的静态变量, privatefinalintDELETE_FILE=1; privatefinalintSIMPLE_LIST=2; privatefinalintSINGLE_CHOICE_LIST=3; privatefinalintMULTI_LIST=4; privateListViewlv=null; //定义一个字符串数组 privateString[]provinces=newString[]{"中国","泰国","美国","法国", "新加坡","英国"}; //按钮 privateButtonOnClickbuttonOnClick=newButtonOnClick(1); @Override//事件点击 publicvoidonClick(Viewv){ //开关选择 switch(v.getId()){ caseR.id.btnDeleteFile: showDialog(DELETE_FILE); break; caseR.id.btnSimpleList: showDialog(SIMPLE_LIST); break; caseR.id.btnChoiceList: showDialog(SINGLE_CHOICE_LIST); break; caseR.id.btnMultiChoiceList: showDialog(MULTI_LIST); break; caseR.id.btnRemoveDialog: removeDialog(DELETE_FILE); removeDialog(SIMPLE_LIST); removeDialog(SINGLE_CHOICE_LIST); removeDialog(MULTI_LIST); break; } } @Override protectedDialogonCreateDialog(intid){ Log.d("dialog",String.valueOf(id)); //用来判断选择的目标。如果没有选择,并提示出来,选择中了,也显示结果。详看代码 switch(id){ caseDELETE_FILE: returnnewAlertDialog.Builder(this).setIcon(R.drawable.question).setTitle("是否删除文件").setPositiveButton("确定",newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich){ newAlertDialog.Builder(Main.this).setMessage("文件已经被删除").create().show(); } }).setNegativeButton("取消",newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich){ newAlertDialog.Builder(Main.this).setMessage("您已经选择了取消,文件未删除").create().show(); } }).create(); caseSIMPLE_LIST: returnnewAlertDialog.Builder(this).setTitle("选择国家").setItems(provinces,newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich){ finalAlertDialogad=newAlertDialog.Builder(Main.this).setMessage("您已经选择了"+which+":"+provinces[which]).show(); android.os.Handlerhander=newandroid.os.Handler(); hander.postDelayed(newRunnable(){ //线程管理 @Override publicvoidrun(){ ad.dismiss(); } },5*1000); } }).create(); caseSINGLE_CHOICE_LIST: returnnewAlertDialog.Builder(this).setTitle("选择国家").setSingleChoiceItems(provinces,1,buttonOnClick).setPositiveButton("确定",buttonOnClick).setNegativeButton("取消",buttonOnClick).create(); caseMULTI_LIST: AlertDialogad=newAlertDialog.Builder(this).setIcon(R.drawable.image).setTitle("选择国家").setMultiChoiceItems(provinces,newboolean[]{false,true,false,true,false,false},newDialogInterface.OnMultiChoiceClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich,booleanisChecked){ } }).setPositiveButton("确定",newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich){ intcount=lv.getCount(); Strings="您选择了:"; for(inti=0;i<provinces.length;i++){ if(lv.getCheckedItemPositions().get(i)){ s+=i+":"+lv.getAdapter().getItem(i)+""; } } if(lv.getCheckedItemPositions().size()>0){ newAlertDialog.Builder(Main.this).setMessage(s).show(); }else{ newAlertDialog.Builder(Main.this).setMessage("您未选择任何国家").show(); } } }).setNegativeButton("取消",null).create(); lv=ad.getListView(); returnad; } returnnull; } @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //得到选中的哪一个按钮 ButtonbtnDeletefile=(Button)findViewById(R.id.btnDeleteFile); ButtonbtnSimpleList=(Button)findViewById(R.id.btnChoiceList); ButtonbtnSimngleChoiceList=(Button)findViewById(R.id.btnSimpleList); ButtonbtnMultiChoiceList=(Button)findViewById(R.id.btnMultiChoiceList); ButtonbtnRemoveDialog=(Button)findViewById(R.id.btnRemoveDialog); //绑定监听器 btnDeletefile.setOnClickListener(this); btnSimpleList.setOnClickListener(this); btnSimngleChoiceList.setOnClickListener(this); btnMultiChoiceList.setOnClickListener(this); btnRemoveDialog.setOnClickListener(this); } //定义一个类,用来判断选择中的。 privateclassButtonOnClickimplementsDialogInterface.OnClickListener{ privateintindex; publicButtonOnClick(intindex){ this.index=index; } @Override publicvoidonClick(DialogInterfacedialog,intwhichButton){ if(whichButton>=0){ index=whichButton; }else{ if(whichButton==DialogInterface.BUTTON_POSITIVE){ newAlertDialog.Builder(Main.this).setMessage("您已经选择了:"+index+":"+provinces[index]).show(); }elseif(whichButton==DialogInterface.BUTTON_NEGATIVE){ newAlertDialog.Builder(Main.this).setMessage("你未选择,请选择").show(); } } } } protectedvoidonPrepareDialog(intid,Dialogdialog){ super.onPrepareDialog(id,dialog); } } 另外很多朋友对Android系统构架图还不是很了解,我附上一张中文的图给大家观看 本文转自 llb988 51CTO博客,原文链接:http://blog.51cto.com/llb988/489522,如需转载请自行联系原作者

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

python文件基础之(文件操作)

在之前学习了python的列表、元组、集合等知识,接下来将python的文件相关的知识做一总结和分析。 一 open函数 在我们用word、excel、vim对文件操作时,肯定要先打开文件,同样在编程里面也是需要将文件打开,然后再对文件操作,操作完对文件进行关闭。文件打开使用open()函数,同时创建一个相关的对象。 、基本语法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 open ( file ,mode = 'r' ,buffering = None ,encoding = None ,errors = None ,newline = None ,closefd = True ) 参数介绍: file :表示文件名,可以使用绝对路径和相对路径,还有可以根据mode方式决定文件的追加或者覆盖 mode:表示打开文件的模式 buffering:设置缓存模式。 0 表示不缓存, 1 表示缓存;如果大于 1 则表示缓冲区的大小,以字节为单位。 encoding:表示打开文件的编码格式 errors:参数errors是用来指明编码和解码错误时怎么样处理。不能在二进制的模式下使用。 1 )当指明为’strict’时,编码出错则抛出异常ValueError。 2 )当指明为’ignore’时,忽略错误。 3 )当指明为’replace’时,使用某字符进行替代模式,比如使用’?’来替换出错的。 4 )其它相应还有surrogateescape / xmlcharrefreplacs / backslashreplace。 newline: 参数newline是用来控制文本模式之下,一行的结束字符。可以是 None ,’’,\n,\r,\r\n等。 当在读取模式下,如果新行符为 None ,那么就作为通用换行符模式工作,意思就是说当遇到\n, \r或\r\n都可以作为换行标识,并且统一转换为\n作为文本输入的换行符。当设置为空’’时, 也是通用换行符模式工作,但不作转换为\n,输入什么样的,就保持原样全输入。当设置为其它相应 字符时,就会判断到相应的字符作为换行符,并保持原样输入到文本。 当在输出模式时,如果新行符为 None ,那么所有输出文本都是采用\n作为换行符。如果设置为’’ 或者\n时,不作任何的替换动作。如果是其它字符,会在字符后面添加\n作为换行符。 closefd:是用来当给一个文件句柄传进来时,而当退出文件使用时,而不对文件句柄进行关闭。如果传 递一个文件名进来,这个参数无效,必定为 True 方式。 关于上面提到的mode模式种类比较多,我们做以下相关介绍和总结, 模式 描述 r 打开一个文件为只读。文件指针置于该文件的开头。这是默认模式。 rb 打开一个文件只能以二进制格式读取。文件指针置于该文件的开头。这是默认模式。 r+ 打开用于读取和写入文件。文件指针将会在文件的开头。 rb+ 打开用于读取和写入二进制格式的文件。文件指针将会在文件的开头。 w 打开一个文件只写。覆盖该文件,如果该文件存在。如果该文件不存在,则创建用于写入一个新的文件。 wb 打开一个文件只能以二进制格式写入。覆盖该文件,如果该文件存在。如果该文件不存在,则创建用于写入一个新的文件。 w+ 打开用于写入和读取的文件。覆盖现有的文件,如果文件存在。如果该文件不存在,则创建读取和写入新的文件。 wb+ 打开用于写入和读取的二进制格式的文件。覆盖现有的文件,如果文件存在。如果该文件不存在,则创建读取和写入新的文件。 a 将打开追加文件。文件指针是在文件的结尾。也就是说,该文件是在附加模式。如果该文件不存在,它创造了写入一个新的文件。 ab 将打开追加的二进制格式的文件。文件指针在该文件的结束。也就是说,该文件为追加模式。如果该文件不存在,它创建并写入一个新的文件。 a+ 打开为追加和读取文件。文件指针在该文件的结束。该文件将为追加模式。如果该文件不存在,它创建并读取和写入的新文件。 ab+ 打开两个追加和读取的二进制格式的文件。文件指针在该文件的结束。该文件将在追加模式。如果该文件不存在,它创建并读取和写入的新文件。 二进制在我们处理图像等信息时使用比较多,而其他部分在我们操作字符串等内容比较多。 简单的示例: 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 示例文件内容: 我曾经问个不休你何时跟我走 可你却总是笑我一无所有 我要给你我的追求还有我的自由 可你却总是笑我一无所有 噢你何时跟我走 噢你何时跟我走 脚下的地在走身边的水在流 可你却总是笑我一无所有 为何你总笑个没够为何我总要追求 难道在你面前我永远是一无所有 Processfinishedwithexitcode 0 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) readline = a_File.read() print (readline) 结果: 我曾经问个不休你何时跟我走 可你却总是笑我一无所有 我要给你我的追求还有我的自由 可你却总是笑我一无所有 噢你何时跟我走 噢你何时跟我走 脚下的地在走身边的水在流 可你却总是笑我一无所有 为何你总笑个没够为何我总要追求 难道在你面前我永远是一无所有 上面使用的r模式打开,我们采取尝试写入文件,写入内容为字符串openstack\nMYSQLDBA #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) readline = a_File.read() print (readline) a_File.write( "openstack\nMYSQLDBA" ) a_File.close() 结果:文件不可写 Traceback(mostrecentcalllast): File "D:/project/myapp/hello.py" ,line 6 , in <module> a_File.write( "openstack\nMYSQLDBA" ) io.UnsupportedOperation: not writable 我们再尝试用二进制方式打开文件查看内容: #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "rb" ) #去掉了编码格式 readline = a_File.read() print (readline) #a_File.write("openstack\nMYSQLDBA") a_File.close() 结果: b'\xe6\x88\x91\xe6\x9b\xbe\xe7\xbb\x8f\xe9\x97\xae\xe4\xb8\xaa\xe4\xb8\x8d\xe4\xbc\x91\xe4\xbd\xa0\xe4\xbd\x95\xe 其他内容繁多,因此不再演示其他的mode模式 在研究完我们如何将文件打开后,我们就要考虑如何处理打开的文件,主要涉及到文件对象的一些方法。 序号 方法以及描述与应用 1 open()可以创建一个对象打开某个文件,这一部分涉及内容比较多,下一部分介绍,打开的方式以及编码格式等 2 file.close()关闭文件 关闭文件后不能再进行读写操作 3 file.read([size])从文件读取指定的字节数,要是未指定或为负则读取所有 4 file.readline([size])读取整行包括”\n”换行 5 file.readlines()读取文件里的所有行并返回列表,若sizeint>0返回总行约为sizeint字节的行,实际读取的值可能比sizeint较大,因为需要缓冲区 6 file.next()返回文件下一行 7 file.isatty()如果文件连接一个终端设备返回Ture 否则返回False 8 file.flush()刷新文件内部缓冲,直接把内部缓存区的数据写入文件,而不是被动的等待输出缓存区写入 9 file.fileno()返回一个整型的文件描述符(file descriptor FD)可以用在os模块的read方法等的底层操作 10 file.seek(offset[whencr])设置文件的当前位置 11 file.tell()返回文件的当前位置 12 file.truncate([size])截取文件,截取的字节通过size指定,默认当前位置开始 13 file.write(str)将字符串写入文件没有返回值 14 file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则需要自己加入换行符 下面根据不同的方法做简单介绍以及相关示例 读操作:读的有file.read() filereadline() filereadlies()等三种方法 1、file.read()方法 里面的参数是size,表示从文件中读取size大小字节,当默认为空或者为负值时表示读取所有的字节, 示例: 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 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) #readline=a_File.read(1) print ( "测试结果1" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.read( - 1 )) 结果: ###############################################测试结果1################################################ 我曾经问个不休你何时跟我走 可你却总是笑我一无所有 我要给你我的追求还有我的自由 可你却总是笑我一无所有 噢你何时跟我走 噢你何时跟我走 脚下的地在走身边的水在流 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) #readline=a_File.read(1) print ( "测试结果2" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.read()) 结果: ###############################################测试结果2################################################ 我曾经问个不休你何时跟我走 可你却总是笑我一无所有 我要给你我的追求还有我的自由 可你却总是笑我一无所有 噢你何时跟我走 噢你何时跟我走 脚下的地在走身边的水在流 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) #readline=a_File.read(1) print ( "测试结果3" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.read( 3 )) 结果: ###############################################测试结果3################################################ 我曾经 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) #readline=a_File.read(1) print ( "测试结果4" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.read( 15 )) 结果: ###############################################测试结果4################################################ 我曾经问个不休你何时跟我走 可以发现read方法是受字节数量控制的,字节数量的控制影响其输出 2、readline()方法 读取整行包括”\n”换行,参数也是[size]控制,其和read()的区别就是当readline()某行中的字符不够时,只读取改行,而read()会读取其他行的内容。 示例(两者的区别) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) #readline=a_File.read(1) print ( "测试结果1" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.read( 50 )) print ( "测试结果2" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.readline( 100 )) 结果: ###############################################测试结果1################################################ 我曾经问个不休你何时跟我走 可你却总是笑我一无所有 我要给你我的追求还有我的自由 可你却总是笑 ###############################################测试结果2################################################ 我一无所有 readline()方法默认值和负值的相关示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) #readline=a_File.read(1) print ( "测试结果1" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.readline()) print ( "测试结果2" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.readline( - 1 )) print ( "测试结果3" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.readline( 4 )) print ( "测试结果4" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.readline( 10 )) 结果: ###############################################测试结果1################################################ 我曾经问个不休你何时跟我走 ###############################################测试结果2################################################ 可你却总是笑我一无所有 ###############################################测试结果3################################################ 我要给你 ###############################################测试结果4################################################ 我的追求还有我的自 3、readlines()取文件里的所有行并返回列表,若sizeint>0返回总行约为sizeint字节的行,实际读取的值可能比sizeint较大,因为需要缓冲区。则读取指定长度的字节, 并且将这些字节按行分割。 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) #readline=a_File.read(1) print ( "测试结果1" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.readlines( 14 )) ###############################################测试结果1################################################ [ '我曾经问个不休你何时跟我走\n' ] #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile.txt" , "r" ,encoding = 'utf-8' ) #readline=a_File.read(1) print ( "测试结果1" .center( 100 , '#' ))#为了更好的展现测试结果分割 print (a_File.readlines( 14 )) [ '我曾经问个不休你何时跟我走\n' , '可你却总是笑我一无所有\n' ] 当我们设置sizeint值大于行中的字符时才能显示其他行的内容 4、file.close() 关闭文件 关闭文件后不能再进行读写操作文件对象的close()方法刷新未写入的信息,并关闭该文件的对象,在这之后没有数据内容可以执行写入。 Python自动关闭,当文件的引用对象被重新分配给另外一个文件。它是使用close()方法来关闭文件是一个很好的做法。 1 2 3 4 5 6 7 8 9 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile2.txt" , "w+" ) #readline=a_File.read(1) a_File.write( "winnerlookopenatck" ) a_File.close() 将文件写入 写入内容: winnerlookopenatck 5、flie.write() write()方法写入字符串到任何一个打开的文件。要注意的是Python字符串可以具有二进制数据,而不仅仅是文字。 write()方法不要将换行字符(' ')添加到字符串的结尾。在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容。 例如: 1 2 3 4 5 6 #!/usr/bin/envpython #_*_coding:utf-8_*_ a_File = open ( "D:\\pythonfile2.txt" , "w+" ) #readline=a_File.read(1) a_File.write( "winnerlookopenatck" ) a_File.close() 6、file.writelines() file.writelines()方法用于向文件中写入一序列的字符串。这一序列字符串可以是由迭代对象产生的,如一个字符串列表。换行需要制定换行符 \n。 1 2 3 4 5 6 7 8 9 10 11 12 13 #!/usr/bin/envpython #_*_coding:utf-8_*_ sed = [ "openstack:1\n" , "docker2\n" , "mysqlDBA3\n" , "KVM4\n" ] #定义列表 a_File = open ( "D:\\pythonfile2.txt" , "w+" ) #readline=a_File.read(1) a_File.writelines(sed) a_File.close() 结果: openstack: 1 docker 2 mysqlDBA 3 KVM 4 7、file.flush() flush() 方法是用来刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区,不需要是被动的等待输出缓冲区写入。 一般情况下,文件关闭后会自动刷新缓冲区,但有时你需要在关闭前刷新它,这时就可以使用 flush() 方法。没有返回值 例如 1 2 3 4 5 6 7 8 9 #!/usr/bin/envpython #_*_coding:utf-8_*_ sed = [ "openstack:1\n" , "docker2\n" , "mysqlDBA3\n" , "KVM4\n" ] a_File = open ( "D:\\pythonfile2.txt" , "w+" ) #readline=a_File.read(1) a_File.writelines(sed) a_File.flush() a_File.close() 8、file.next() next() 方法在文件使用迭代器时会使用到,在循环中,next()方法会在每次循环中调用,该方法返回文件的下一行,如果到达结尾(EOF),则触发StopIteration 示例: 1 2 3 4 5 6 7 8 #!/usr/bin/envpython #_*_coding:utf-8_*_ sed = [ "openstack:1\n" , "docker2\n" , "mysqlDBA3\n" , "KVM4\n" ] aFile = open ( "D:\\pythonfile2.txt" , "w+" ) for index in range ( 3 ): line = next (aFile) print ( "第%d行-%s" % (index,line)) 9、file.tell() file.tell()方法返回文件的当前位置,即文件指针当前位置。 语法: 1 fileObject.tell(offset[,whence]) 返回值当前文件指针 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/envpython #_*_coding:utf-8_*_ sed = [ "openstack:1\n" , "docker2\n" , "mysqlDBA3\n" , "KVM4\n" ] aFile = open ( "D:\\pythonfile.txt" , "r" ,encoding = "utf-8" ) print (aFile.readline( 30 )) print (aFile.tell()) 我曾经问个不休你何时跟我走我曾经问个不休你何时跟我走我曾 86 #!/usr/bin/envpython #_*_coding:utf-8_*_ sed = [ "openstack:1\n" , "docker2\n" , "mysqlDBA3\n" , "KVM4\n" ] aFile = open ( "D:\\pythonfile.txt" , "r" ,encoding = "utf-8" ) print (aFile.readline()) print (aFile.tell()) 我曾经问个不休你何时跟我走我曾经问个不休你何时跟我走我曾经问个不休你何时跟我走我曾经问个不休你何时跟我走 162 10、file.isatty() file.isatty()方法检测文件是否连接到一个终端设备,如果是返回 True,否则返回 False 用法: fileObject.isatty() #!/usr/bin/envpython #_*_coding:utf-8_*_ sed=["openstack:1\n","docker2\n","mysqlDBA3\n","KVM4\n"] aFile=open("D:\\pythonfile.txt","r",encoding="utf-8") print(aFile.isatty()) False 11、file.seek() seek() 方法用于移动文件读取指针到指定位置,没有返回值 seek() 方法语法如下: fileObject.seek(offset[,whence]) offset -- 开始的偏移量,也就是代表需要移动偏移的字节数 whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/usr/bin/envpython #_*_coding:utf-8_*_ sed = [ "openstack:1\n" , "docker2\n" , "mysqlDBA3\n" , "KVM4\n" ] aFile = open ( "D:\\pythonfile.txt" , "r" ,encoding = "utf-8" ) print (aFile.readline( 10 )) print (aFile.readline( 10 )) aFile.seek( 0 , 0 ) #设置起始位置为0 print (aFile.readline( 10 )) 结果: 我曾经问个不休你何 时跟我走我曾经问个不 我曾经问个不休你何 总结打印完第一行后,下次打印从上次的位置接上,而重新设置其位置后在开始位置打印 12、file.fileno() 方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。返回值为一个文件描述符: 1 2 3 4 5 6 7 8 9 #!/usr/bin/envpython #_*_coding:utf-8_*_ sed = [ "openstack:1\n" , "docker2\n" , "mysqlDBA3\n" , "KVM4\n" ] aFile = open ( "D:\\pythonfile.txt" , "r" ,encoding = "utf-8" ) print (aFile.fileno()) 结果: 3 13、file.truncate() truncate() 方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除 truncate() 方法语法如下: fileObject.truncate([size]) 参数 本文转自 tianya1993 51CTO博客,原文链接:http://blog.51cto.com/dreamlinux/1910955,如需转载请自行联系原作者

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

Android多点触控手势基础

处理多点触控手势 多点触控就是同时把一根以上的手指放在屏幕上。 再继续往下以前需要补充一些名词: 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的手指。 触控事件:在触控手势中,有手指移动或者离开屏幕的时候就会引发一个触控事件。这个事件就存放在MotionEvent中。 在这个事件中,包含说与的触控数据。 触控:手指碰到屏幕的时候就产生了一个触控(pointer)。 追踪多个触控点 多个手指同时放在屏幕上的时候会触发以下的系统事件: ACTION_DOWN --第一个对屏幕的触碰。这是多点触控的开始。这个触碰的而数据 保存在index为0的MotionEvent中。 ACTION_POINTER_DOWN--其他对屏幕的触碰。触碰事件的index可以用方法getActionIndex()获取到。 触碰的数据保存在这个index指定的MotionEvent中。 ACTION_MOVE--放在屏幕上的任何一根手指移动的时候触发。 ACTION_POINTER_UP--第一个触摸屏幕的手指以外的其他手指离开屏幕的时候触发。 ACTION_UP--当最后一根手指离开屏幕的时候触发。 你可以通过触碰事件的index或者ID来获得事件MotionEvent。 Index: 一个MotionEvent存储了几根手指触摸屏幕的每一个手指的触碰数据。一般处理触摸 的是后都用index作为获取MotionEvent的依据,而不是触碰ID。 ID:整个多点触摸事件过程中,每一个触摸都有一个ID和整个触摸匹配。 一个触碰的index在MotionEvent中可能发生改变的。而整个触碰的ID是保持不变的,只要整个 触碰保持激活状态。用getPointerId()可以获取整个手势执行期间的每一个event里的触碰数据。 也可以通过findPointerIndex()来根据一个触控的ID来获取这触控在触控事件中的index。比如: var mActivePointerId: Int? = null override fun onTouchEvent(event: MotionEvent?): Boolean { mActivePointerId = event?.getPointerId(0) // 其他的事件先不管... // 用触控ID获得index,然后获取位置数据 var pointerIndex = event?.findPointerIndex(mActivePointerId!!) // 获取触控的当前位置 var x = event?.getX(pointerIndex!!) var y = event?.getY(pointerIndex!!) return true } 获取一个MotionEvent的Action 你应该使用getActionMasked()(或者从兼容方面考虑的话用MotionEventCompat.getAtionMasked()来获取MotionEvent的action。与getAction()不同,getActionMasked()就是被用来处理多点触控的。 这个方法的返回值不在包含触控index的位数。你可以用getActonIndex()来获取触控action的index。这些在后面详细叙述。 注意:后面的例子用的是MotionEventCompat类。这个类在Support Library中。 你可以使用MotionEventCompat来获得更多的平台支持。MotionEventCompat不是用来代替MotionEvent的。 其实,这个类只是提供了一些静态方法以方便使用。 override fun onTouchEvent(event: MotionEvent?): Boolean { var action = MotionEventCompat.getActionMasked(event!!) var index: Int = MotionEventCompat.getActionIndex(event!!) var xPos = -1.0f var yPos = -1.0f Log.d(TAG, "The action is " + actionToSring(action)) if (event!!.pointerCount > 1) { Log.d(TAG, "Mutipletouch event") // 坐标系是相对于处理这个事件的View或者Activity的 xPos = MotionEventCompat.getX(event!!, index) yPos = MotionEventCompat.getY(event!!, index) } else { //单点触控 Log.d(TAG, "Single touch event") xPos = MotionEventCompat.getX(event!!, index) yPos = MotionEventCompat.getY(event!!, index) } return true } fun actionToSring(action: Int): String { when (action) { MotionEvent.ACTION_DOWN -> return "Down" MotionEvent.ACTION_MOVE -> return "Move" MotionEvent.ACTION_POINTER_DOWN -> return "Pointer down" MotionEvent.ACTION_UP -> return "UP" MotionEvent.ACTION_POINTER_UP -> return "Pointer up" MotionEvent.ACTION_OUTSIDE -> return "Outside" MotionEvent.ACTION_CANCEL -> return "Cancel" } return "" } 原文是Google的文档。但是文档杜宇前提和一些概念的描述不足,会导致初学者理解出现偏差。我都加上了,我就是初学者。 代码都是用Kotlin写的,自从用了这个语言就再也不想用Java了。对于Java开发者理解Kotlin的代码没有什么太大的问题,基本上都一样。 欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处! 本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/5245293.html ,如需转载请自行联系原作者

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

语音搜索的基础-语音识别

一直在想,假如有一天我们生活中的机器人像在很多科幻电影里面看到的那样,能够理解人类的语言,并能完成与人类的自然对话,是多爽的事情。语音的研究一直在试图解决这个问题。例如,语音到文字,即通常所说的语音识别,就试图将语音转换为文字,然后交给计算机进行后续的理解;而文字到语音,即语音合成,则试图将文字转换为声音,让人类可以听到。也许通过全世界语音界的科研和工程人员的努力,在不久的将来,我们真的可以和机器进行自由的对话(其实我一直很期待这一天的到来)。 语音识别有狭义的概念和广义的概念两种。狭义的语音识别,就是语音到文字的转换,即人对着机器说一句话,机器将其翻译为其对应的文字内容。而广义的语音识别,则包含了狭义的语音识别,并且也包含了哼唱搜索,说话人识别,说话人确认等等的技术领域。百度在9月初的时候,曾经推出过一个实验性的哼唱搜索功能,运气比较好的网友可能已经哼唱搜索有感性的认识了。实际上哼唱搜索,就是指我们在计算机或者某些设备前哼唱了某段歌曲,然后计算机根据哼唱的内容找到其对应的歌曲的功能。而说话人识别,则是利用人说的语音来识别人的身份。说话人确认则是根据人说的话确认此人所声称的身份。 语音识别经过几十年的发展,并伴随着计算机硬件的高速发展,已经从最初的只能识别若干个数字,发展到可以识别大词汇量,连续语音,并且说话人无关的语音识别技术。由于互联网和移动互联网发展的驱动,世界各大的互联网公司,手机厂商都在进行语音识别的应用,推出语音搜索,语音拨号,语音输入法等等的应用产品。可以说,语音识别已经迎来了新一轮的发展高潮。 按照识别的形式看,语音识别大体都可以划为孤立词识别,带语法规则的连接词识别,以及连续语音识别。孤立词识别,指的是每次只能说一个词或者一小段固定的话,并且在其配置的词表外的词,全部都不能识别。而连接词识别,则可以识别根据其配置规则生成的句子,比如“请 呼叫 ×××”。连续语音识别,则可以认为能识别任意词搭配的短句,或者完整的句子。按照说话人是否有关来分,则分为说话人相关的语音识别和说话人无关的语音识别。从总体上看,限制条件越少,其难度越大。 限于当前技术的发展水平,计算机并不能凭空识别语音,而是需要相当多的知识源。按照识别的形式看,语音识别大体都可以划为孤立词识别,带语法规则的连接词识别,以及连续语音识别。拿连续语音识别来说,需要描述语音发音特性的知识源,也需要描述人类语言搭配习惯的知识源。具体说,就是需要对人类语音的发音单元进行建模并估计出其相关参数,由此得到描述发音单元的模型,简称声学模型。而描述人类语言搭配的知识源,则可以是人工总结和构造的某些规则,也可以是从大量的文本资料统计出来的参数。当前连续语音识别中使用比较多的是从文本资料统计出来的n元文法模型,即常说的ngram语言模型。这种模型假设第N个词出现的概率,只和其前面的N-1个词有关。声学模型和语言模型是语音识别中最重要的两个知识源,而根据声学模型发音单元选择的不同,,可能需要一个从发音单元到词的对照表,比如我们选择的是声母和韵母作为建模单元,则需要知道某个字或某个词是由哪些声韵母组合的,我们一般把这个对照表成为发音字典。 再说说中文语音识别的一些与英文识别不同的难点。虽然语音识别是从西方国家起源的,但是随着语音识别学者对中文语音识别的研究的深入,当前我们已经可以看到中文的语音识别产品,包括百度的语音搜索,以及智能手机中内嵌的语音识别产品等等,都是对此很好的说明(我们需要感谢前辈们做出的贡献)。但是中文识别和英文毕竟是不同的,感谢我们的祖先,中文词汇是封闭的,即任何词都可以用字来组成,这给中文识别提供了方便,使得中文识别不像英文那样,只要没在发音词典中配置的词都不能识别。不过这同时也给我们带来一定的麻烦,使得我们做语言模型的时候选择其词集合相当困难。想象中,使用所有的单字即可,可惜的是,我们的实验告诉我们,使用单字的识别率不高,所以词典选择很重要。另外,由于中文是由字组成的,所以识别过程中使用的一些技术对中文不太好用,甚至会导致错误,这个问题可以以后再慢慢探讨。还有就是中文的方言实在是太丰富了,这使得我们做语音识别系统的时候倍感困难,其原因就是尽管我们可以做到说话人无关,但是由于声学模型却是和方言发音直接相关的。不过我相信,这些困难我们都可以克服,并且希望在不久的将来,全国人民都能用上我们的语音识别产品。 技术是为了方便人类生活和工作的,语音技术也不例外,所有需要文字输入,但是不能让人方便使用的地方,都是语音识别技术未来应用的地方,比如手机,比如对不习惯使用键盘的人群等等。此外,语音识别除了作为输入外,还可以在呼叫中心,语音翻译等等地方得到广泛的应用。 让我们一起迎接语音识别光明的未来吧。 By liangweiwen 【本文首发于: 搜索研发部官方博客】 http://stblog.baidu-tech.com/?p=74 【 关注百度技术沙龙】 本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/743800 ,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册