首页 文章 精选 留言 我的

精选列表

搜索[天玑9500],共10000篇文章
优秀的个人博客,低调大师

2018-07-11 第六十六天 jQuery

一、jQuery中的事件 1.绑定事件 方法1:click()、mousemove()、mouseout()、mouseover(); 方法2:bind() 对后来加入的无效; live()对后来加入的也有效 在jQuery1.7及之前的版本中使用, 1.9版本中淘汰了; one()一次事件绑定; trigger()在每一个匹配的元素上触发某类事件。 2.解除绑定unbind(): 不传参表示解除所有事件, 传参表示解除指定的事件 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <!--网络加载jquery.js--> <scriptsrc="http://apps.bdimg.com/libs/jquery/1.7.0/jquery.js"type="text/javascript"charset="utf-8"></script> <scripttype="text/javascript"> /*等价于js中的onload*/ //$(document).ready(function() {}) //$(function() {}) //jQuery(function() {}) $(function() { /*事件的绑定*/ $("#bu1").click(function() { alert("单击事件的绑定"); }) $("#bu1").dblclick(function() { alert("双击事件的绑定"); }) /******bind事件的绑定*********/ $("#bu2").bind('click',function() { alert("单击事件的绑定"); }) /*绑定多个事件*/ $("#bu2").bind({ 'click':function() {}, dblclick:function() {}, blur:function() {} }) /****one事件的绑定***********/ $("#bu3").one("click",function() { alert("单击一次执行效果"); }) /*******trigger事件的使用**************/ $("#bu4").click(function() { $("#bu1").trigger("click"); $("#bu3").trigger("click"); }) $("#bu5").click(function() { //解绑所有绑定事件 $("#bu1").unbind(); //解绑单个的事件 $("#bu1").unbind("click"); }) /***********live方法介绍********************/ $(".bb").click(function() { alert("live事件的添加"); }) $(".bb").bind('click',function() { alert("live事件的添加"); }) $(".bb").live('click',function() { alert("live事件的添加"); }) $("body").append("<input type='button' value='live事件' class='bb' />") }) </script> </head> <body> <inputtype="button"name="bu1"id="bu1"class="bb"value="单击事件的绑定"/> <inputtype="button"name="bu2"id="bu2"value="bind事件的绑定"/> <inputtype="button"name="bu3"id="bu3"value="one事件的绑定"/> <inputtype="button"name="bu4"id="bu4"value="trigger事件的绑定"/> <inputtype="button"name="bu4"id="bu5"value="事件的解绑"/> </body> </html> 二、jQuery中的动画 1.显示隐藏:show()--hide(),改变width、height、opacity; 2.淡入淡出:fadeIn()--fadeOut(),改变opacity ; 3.滑入滑出:slideDown()--slideUp(),改变height(对于img同时改变height和width); 4.隐藏的显示/显示的隐藏:toggle()。 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"src="js/jquery-1.12.3.min.js"></script> <scripttype="text/javascript"> $(function() { $("#bu1").click(function() { //获得div对象 vardiv1=$("#div1"); /*隐藏的效果*/ div1.hide(3000); div1.show(3000); //显示的隐藏-- 隐藏的显示 $("div").toggle(3000); //滑动上 div1.slideUp(3000); //滑动下 div1.slideDown(3000); //淡出 div1.fadeOut(3000); //淡入 div1.fadeIn(3000); }) }) </script> <style> #div1{ height:300px; background-color:red; } #div2{ height:300px; background-color:gold; } </style> </head> <body> <inputtype="button"name="bu1"id="bu1"value="动画的测试"/> <divid="div1"></div> <divid="div2"></div> </body> </html> 三、jQuery实现表单校验 1.为什么要进行表单验证:保证数据符合要求。 2.为什么要进行JavaScript或者jQuery表单验证:降低服务器端负担。 3.还可以进行服务器验证(JSP) 4.正则表达式 推荐两篇文章: https://www.jb51.net/article/72044.htm https://www.jb51.net/article/76901.htm (1)为什么使用正则表达式:简洁的代码、严谨的验证文本框中的内容。 (2)正则表达式举例: 匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}; 匹配腾讯QQ号:[1-9][0-9]{4,}; 匹配中国邮政编码:\d{6}; 匹配身份证:\d{15}|\d{18}; 匹配由数字和26个英文字母组成的字符串^[A-Za-z0-9]+$; 匹配Email地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*; 匹配中文字符的正则表达式:[\u4e00-\u9fa5]。 (3)什么是正则表达式: Regular Expression,在代码中常简写为regex。 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。 在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 (4)如何创建正则表达式: var reg=/china/; var reg=new RegExp(" china "); var reg=/^\w+$/; var reg=new RegExp("^\w+@\w+.[a-zA-Z]{2,3}(.[a-zA-Z]{2,3})?$"; (5)正则表达式中常用的符号和用法: (6)正则表达式的重复字符: <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scriptsrc="js/jquery-1.12.3.min.js"type="text/javascript"charset="utf-8"></script> <script> /*****验证码产生****************/ functionyzm() { varran=Math.floor(Math.random()*9000+1000); //document.getElementById("yzm1").innerHTML=ran; varspan=document.getElementById("yzm2"); span.innerHTML=ran; } $(function() { /*********姓名的校验**************/ $("#uname").blur(function() { //姓名的正则表达式 2-4位的汉字 varreg=/^[\u4e00-\u9fa5]{2,4}$/; checkData("uname", reg); }) /**********密码的校验****************/ $("#pwd").blur(function() { varreg=/^\d{4,6}$/; checkData("pwd", reg); }) /**********邮箱的校验****************/ $("#email").blur(function() { //邮箱的正则表达式 varreg=/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; checkData("email", reg); }) /**********手机的校验****************/ $("#phone").blur(function() { varreg=/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/; checkData("phone", reg); }) /**********提取公共的方法***************/ functioncheckData(id,reg) { //获得用户名的值 varus=$("#"+id); //获得span对象 varspan=$("#span_"+id); if(us.val()==""||us.val()==null) { span.html("× "+us.attr("alt")+"不能为空").css("color","red").addClass("error"); }else if(reg.test(us.val())) { //符合要求的格式 span.html("√ "+us.attr("alt")+"合法").css("color","green").removeClass(); }else{ span.html("× "+us.attr("alt")+"不合法").css("color","red").addClass("error"); } } /********爱好的校验***************/ $("input[name=fav]").click(function() { varche=$("input[name=fav]:checked"); if(che.length>0) { $("#span_fav").html("爱好选择成功").css("color","green").removeClass(); }else{ $("#span_fav").html("请选择爱好").css("color","red").addClass("error"); } }) /********籍贯的选择***************/ $("#sel").change(function() { varval=$("#sel").val(); if(val=="0") { $("#span_sel").html("请选择籍贯").css("color","red").addClass("error"); }else{ $("#span_sel").html("籍贯选择成功").css("color","green").removeClass(); } }) /********验证码的校验**************/ $("#yzm1").blur(function() { //[1]随机产生的验证码 varyz=$("#yzm2").html(); //[2]输入的值 varyz2=$("#yzm1").val(); if(yz==yz2) { $("#yzm3").html("验证码输入正确").css("color","green").removeClass(); }else{ $("#yzm3").html("验证码输入错误").css("color","red").addClass("error"); } }) /******同意协议*********/ $("#check").click(function() { varflag=$("#check").prop("checked"); /*if(flag){ $("#sub").prop("disabled",false); }else { $("#sub").prop("disabled",true); }*/ $("#sub").prop("disabled",!flag); }) /******校验表单的提交***********/ $("form").submit(function() { $("#uname").trigger("blur"); $("#pwd").trigger("blur"); $("#email").trigger("blur"); $("#phone").trigger("blur"); /*执行两次*/ $("input[name=fav]").trigger("click"); $("input[name=fav]").trigger("click"); varerr=$(".error"); if(err.length>0) { returnfalse; }else{ returntrue; } }) }) </script> <!-- 正则表达式学习 ^:开始 数字:[0-9] $:结束 \d:代表[0-9] \w [0-9][A-Z][a-z]以及下划线 {n}:段域 ^[0-9]{7}$ ^[0-9]{4,7}$ ^\w{5}$ 快速去除字符串操作 var a="abcdefg"; var jj=/[b|c]/ while(jj.test(a)){ a= a.replace(jj,""); } alert(a); --> </head> <bodyonload="yzm()"> <center> <h3>注册页面</h3> <hr/> <formaction=""method="get"> <table> <trheight="35px"> <tdwidth="150px">用户名:</td> <tdwidth="400px"> <inputtype="text"name="uname"id="uname"value="张三三"alt="用户名"/> <spanid="span_uname"></span> </td> </tr> <trheight="35px"> <td>密码:</td> <td> <inputtype="password"name="pwd"id="pwd"value="123456"alt="密码"/> <spanid="span_pwd"></span> </td> </tr> <trheight="35px"> <td>手机号:</td> <td> <inputtype="text"name="phone"id="phone"value="18231932733"alt="手机号"/> <spanid="span_phone"></span> </td> </tr> <trheight="35px"> <td>邮箱:</td> <td> <inputtype="text"name="mail"id="email"value="2767501426@qq.com"alt="邮箱"/> <spanid="span_email"></span> </td> </tr> <trheight="35px"> <td>性别:</td> <td> 男:<inputtype="radio"name="sex"value="1"/> 女: <inputtype="radio"name="sex"value="0"/> </td> </tr> <trheight="35px"> <td>爱好:</td> <td> <inputtype="checkbox"name="fav"value="1"/>唱歌 <inputtype="checkbox"name="fav"value="2"/>睡觉 <inputtype="checkbox"name="fav"value="3"/>LOL<br/> <inputtype="checkbox"name="fav"value="4"/>旅游 <inputtype="checkbox"name="fav"value="5"/>高尔夫 <inputtype="checkbox"name="fav"value="6"/>篮球 <spanid="span_fav"></span> </td> </tr> <trheight="35px"> <td>籍贯:</td> <td> <selectname="adress"id="sel"> <optionvalue="0">--请选择--</option> <optionvalue="1">安徽</option> <optionvalue="2">北京</option> <optionvalue="3">上海</option> <optionvalue="4">山东</option> <optionvalue="5">天津</option> </select> <spanid="span_sel"></span> </td> </tr> <trheight="35px"> <td>验证码:</td> <td> <inputtype="text"style="width:100px;height:60px;"id="yzm1"/> <spanid="yzm2"onclick="yzm()"></span> <spanid="yzm3"></span> </td> </tr> <trheight="35px"> <td>个人介绍:</td> <td> <textareaname="intro"rows="8"cols="30"></textarea> </td> </tr> <trheight="35px"> <tdcolspan="2"align="center"> <inputtype="checkbox"name=""id="check"value="">是否同一本公司协议 </td> </tr> <trheight="35px"> <tdcolspan="2"align="center"> <inputtype="submit"id="sub"value="注册"disabled="true"/> </td> </tr> </table> </form> </center> </body> </html> 四、jQuery实现树形菜单 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title>树形菜单-1</title> <scripttype="text/javascript"src="js/jquery-1.12.3.min.js"></script> <styletype="text/css"> div{ font-size:12px; color:#000000; line-height:22px; } img{ vertical-align:middle; } a{ font-size:13px; color:#000000; text-decoration:none; } a:hover{ font-size:13px; color:#999999 } .red{ color:#FF0000 } </style> <scripttype="text/javascript"> $(function() { $(".fir").click(function() { //parent() 获得父节点对象 next() 得到下一个节点 vardis=$(this).parent().next().css("display"); if(dis=="none") { $(this).parent().next().css("display","block"); children() 获得子节点 $(this).children().attr("src","img/minus.gif"); }else{ $(this).parent().next().css("display","none"); find() 查找到指定的节点 $(this).find("img").attr("src","img/plus.gif"); } }) }) </script> </head> <body> <divid="div1"style="padding-left:100px;"> <div> <ahref="javascript:void(0)"class="fir"><imgsrc="img/plus.gif"border="0">分类讨论区</a> </div> <divid="1"style="display:none;padding-left:15px;"><imgsrc="img/z-top.gif">BBS 系统 <BR><imgsrc="img/z-top.gif">共建水木 <BR><imgsrc="img/z-top.gif">站务公告栏 <BR><imgsrc="img/z-top.gif">妆点水木 <BR><imgsrc="img/z-end.gif">申请版主 </div> <div> <ahref="javascript:void(0)"class="fir"><imgsrc="img/plus.gif"border="0">分类讨论区</a> </div> <divid="2"style="display:none;padding-left:15px;"><imgsrc="img/z-top.gif">BBS 系统 <BR><imgsrc="img/z-top.gif">共建水木 <BR><imgsrc="img/z-top.gif">站务公告栏 <BR><imgsrc="img/z-top.gif">妆点水木 <BR><imgsrc="img/z-end.gif">申请版主 </div> <div> <ahref="javascript:void(0)"class="fir"><imgsrc="img/plus.gif"border="0">分类讨论区</a> </div> <divid="3"style="display:none;padding-left:15px;"><imgsrc="img/z-top.gif">BBS 系统 <BR><imgsrc="img/z-top.gif">共建水木 <BR><imgsrc="img/z-top.gif">站务公告栏 <BR><imgsrc="img/z-top.gif">妆点水木 <BR><imgsrc="img/z-end.gif">申请版主 </div> </div> </body> </html> 五、Query中的框架--图片放大器插件 https://www.oschina.net/p/jqzoom 官方网址:https://jquery-plugins.net/jqzoom jQZoom是一个基于最流行的jQuery的图片放大器插件。它功能强大,使用简便。 支持标准模式、反转模式、无镜头、无标题的放大,并可以自定义jQZoom的窗口位置和渐隐效果,修正IE6的select bug。 配置参数 · zoomType,默认值:’standard’,另一个值是’reverse’,是否将原图用半透明图层遮盖。 · zoomWidth,默认值:200,放大窗口的宽度。 · zoomHeight,默认值:200,放大窗口的高度。 · xOffset,默认值:10,放大窗口相对于原图的x轴偏移值,可以为负。 · yOffset,默认值:0,放大窗口相对于原图的y轴偏移值,可以为负。 · position,默认值:’right’,放大窗口的位置,值还可以是:’right’,’left’,’top’,’bottom’。 · lens,默认值:true,若为false,则不在原图上显示镜头。 · imageOpacity,默认值:0.2,当zoomType的值为’reverse’时,这个参数用于指定遮罩的透明度。 · title,默认值:true,在放大窗口中显示标题,值可以为a标记的title值,若无,则为原图的title值。 · showEffect,默认值:’show’,显示放大窗口时的效果,值可以为: ‘show’,’fadein’。 · hideEffect,默认值:’hide’,隐藏放大窗口时的效果: ‘hide’,’fadeout’。 · fadeinSpeed,默认值:’fast’,放大窗口的渐显速度(选项: ‘fast’,'slow’,'medium’)。 · fadeoutSpeed,默认值:’slow’,放大窗口的渐隐速度(选项: ‘fast’,'slow’,'medium’)。 · showPreload,默认值:true,是否显示加载提示Loading zoom(选项: ‘true’,'false’)。 · preloadText,默认值:’Loading zoom’,自定义加载提示文本。 · preloadPosition,默认值:’center’,加载提示的位置,值也可以为’bycss’,以通过css指定位置。

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

2018-07-09 第六十四天 JavaScript

JavaScript 一、JS中event事件 1.什么是事件: 事件是可以被JavaScript 侦测到的行为 网页中的每个元素都可以产生某些可以触发JavaScript 函数的事件。比方说,我们可以在用户点击某按钮时产生一个 onClick 事件来触发某个函数 事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行。 <bodyonload="getTime()"> <input type="button"value="提交" onclick="calc()"/> <input type="button"value="暂停"onclick="pauseTime()"/> <input type="button"value="继续"onclick="continueTime()"/> 2.有哪些事件: 3.事件的触发: <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> function demo1(){ console.log("我的demo1"); } function demo2(){ console.log("鼠标移动"); } function demo3(){ console.log("键盘弹起"); } functiondemo4(){ console.log("内容改变"); } function demo5(val){ console.log(val); } function demo6(){ console.log("页面加载完成"); } </script> <style> .div1{ width:200px; height:200px; border:1pxsolidred; } </style> </head> <!--页面加载完成执行的事件--> <bodyonload="demo6()"> <!--单击事件--> <inputtype="button"name=""id=""value="测试一"onclick="demo1();demo2();demo3()"/> <!--双击事件--> <inputtype="button"name=""id=""value="测试二"ondblclick="demo1()"/> <!--onmouseover:鼠标放上事件 onmouseout:鼠标移开事件--> <divclass="div1"onmousemove="demo2()"onmouseout="demo1()"></div> <!--键盘事件 onkeydown:键盘按下 onkeyup:键盘弹起--> <inputtype="text"onkeyup="demo3()"/> <br/> <!--onblur:失去焦点 onfocus:获得焦点 onchange:内容改变触发事件 --> <inputtype="text"onchange="demo4()"/> <br/> <!--传递this this代表本身的对象--> <selectonchange="demo5(this.value)"> <optionvalue="1">中国1</option> <optionvalue="2">中国2</option> <optionvalue="3">中国3</option> </select> </body> </html> <!-- 总结事件的一般使用情况: onclick、ondblclick、按钮使用(按钮是绝对不会结合onchange、onblur事件) onchange、onkeydown、onkeyup onblur、onfocus、结合单行文本框和多行文本框 onchange:下拉框 onload:作用body onmouseover、onmouseout、onmousemove:某些块元素上结合使用 --> 二、JS中BOM对象 1.什么是BOM: BOM是Browser Object Model的简写,即浏览器对象模型。 BOM由一系列对象组成,是访问、控制、修改浏览器的属性的方法 BOM没有统一的标准(每种客户端都可以自定标准)。 BOM的顶层是window对象 2.什么是DOM: DOM是Document Object Model的简写,即文档对象模型。 DOM用于XHTML、XML文档的应用程序接口(API)。 DOM提供一种结构化的文档描述方式,从而使HTML内容使用结构化的方式显示。 DOM由一系列对象组成,是访问、检索、修改XHTML文档内容与结构的标准方法。 DOM标准是由w3c制定与维护。DOM是跨平台与跨语言的。 DOM的顶层是document对象 蓝色框内是归DOM管的,红色框内归BOM管的;也可以说DOM也是归BOM管的 BOM 是为了操作浏览器出现的 API,window 是其根对象。 DOM 是为了操作文档出现的 API,document 是其根对象。 三、BOM A、 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> function demo1(){ /*弹框一 , 只是含有确定按钮*/ window.alert("外面还在下暴雨,今天我们两个分开了"); } functiondemo2(){ /*弹框二,含有取消的弹框*/ varflag=window.confirm("是否删除"); alert(flag); } function demo3(){ /*弹框三 ,含有输入内容的弹框*/ var pr=window.prompt("请输入昵称","例如:李白"); //返回输入的内容 alert(pr); } function getTime(){ var date=newDate(); //获得系统时间 vartime=date.toLocaleString(); //获得span对象 varspan=document.getElementById("span1"); //获得span中的内容对象 span.innerHTML=time; } /*js中的定时器*/ /*1s后执行方法的调用 ---调用一次*/ window.setTimeout("getTime()",1000); /*每间隔1s就会调用方法 ---调用多次*/ varti=window.setInterval("getTime()",1000); var ti1= window.setInterval("getTime1()",1000); functionstop1(){ //清除定时器的操作 window.clearInterval(ti); } function close1(){ //关闭当前的窗口 window.close(); //打开指定的窗口 window.open("http://www.baidu.com"); } </script> </head> <bodyonload="getTime()"> 当前的时间是:<spanid="span1"></span> <inputtype="button"value="停止计时"onclick="stop1()"/> <br/> <inputtype="button"name=""id=""value="关闭窗口"onclick="close1()"/> <hr/> <inputtype="button"name=""id=""value="弹框一"onclick="demo1()"/> <inputtype="button"name=""id=""value="弹框二"onclick="demo2()"/> <inputtype="button"name=""id=""value="弹框三"onclick="demo3()"/> </body> </html> B、 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> /*location对象的学习*/ function demo1(){ //127.0.0.1:8020 varhost=window.location.host; //127.0.0.1 varhostname=window.location.hostname; varurll=window.location.href; //8020 varport=window.location.port; //console.log(host+"--"+hostname+"---"+urll+"---"+port) /**实现页面的跳转*/ //window.location.href="http://www.baidu.com"; //*重新加载网页 window.location.reload(); } /*History对象学习*/ function demo2(){ //返回浏览器历史列表中的 URL 数量。 varlen=window.history.length; //console.log(len); //前进按钮 // window.history.forward(); //后退 // window.history.back(); //正数前进 负数:后退 0:刷新 window.history.go(0); } /*****Screen对象*******/ function demo3(){ varwi=window.screen.width; varhi=window.screen.height; console.log(wi+"---"+hi); } /****Navigator对象学习*******/ function demo4(){ //用户代理对象 varus=window.navigator.userAgent; console.log(us); } </script> </head> <body> <inputtype="button"name=""id=""value="location对象学习" onclick="demo1()"/> <inputtype="button"name=""id=""value="History对象学习" onclick="demo2()"/> <inputtype="button"name=""id=""value="Screen对象学习" onclick="demo3()"/> <inputtype="button"name=""id=""value="Navigator对象学习" onclick="demo4()"/> </body> </html> 四、DOM 1.什么是DOM 2.DOM节点分类node 元素节点element node <ahref="链接地址">我的链接</a> 属性节点attribute node href="链接地址" 文本节点text node 链接地址我的链接 3.DOM节点关系 父子关系(parent-child):<html> 元素作为父级,<head> 和 <body> 元素作为子级 兄弟关系(Sibling):<a> 和 <h1> 元素就是兄弟关系;<title> 和 <h1> 元素并不是兄弟关系 4.DOM操作的内容 1.查询元素(进行操作元素、或者元素的属性、文本) 2.操作文本 3.操作属性 4.操作CSS样式(一个特殊的属性style) 5.操作元素 五、直接获得对象的方式 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> /*直接获得*/ function demo1(){ //获得id名称是span1的节点对象--获得单个对象 varspan=document.getElementById("span1"); alert(span); } function demo2(){ //根据标签的名称获得对象---获得的多个对象 var spans=document.getElementsByTagName("span"); //获得具体的某一个对象 alert(spans[2]); } function demo3(){ //通过class获得元素对象---获得的多个对象 var sp=document.getElementsByClassName("sp"); alert(sp.length); } function demo4(){ //通过name属性获得元素的对象---获得的多个对象 varinp=document.getElementsByName("inp"); } </script> </head> <body> <inputtype="button"value="id获得节点对象"onclick="demo1()"/> <inputtype="button"value="ByTagName获得节点对象"onclick="demo2()" name="inp"/> <inputtype="button"value="class获得节点对象"onclick="demo3()" name="inp"/> <inputtype="button"value="Name获得节点对象"onclick="demo4()" name="inp"/> <hr/> <spanid="span1"></span> <spanclass="sp"></span> <spanclass="sp"></span> <span></span> </body> </html> 六、间接获得元素对象的方式 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> functiondemo1(){ //获得div对象 var div=document.getElementById("div1"); //获得子节点--空白的文本也是一个节点 varchi= div.childNodes; //只是获得span标签 varsp=div.getElementsByTagName("span"); alert(sp.length); } function demo2(){ //获得span对象 varspan=document.getElementById("span1"); //获得父节点元素 vardiv=span.parentNode; alert(div); } function demo3(){ //获得指定的span标签 varspan=document.getElementById("span1"); //获得上一个节点 --包含空白文档Text //var sp= span.previousSibling; //获得上一个节点 --不包含空白文档Text //var sp=span.previousElementSibling; //获得下一个节点 --包含空白文档Text //var sp=span.nextSibling; //获得下一个节点 --不包含空白文档Text varsp=span.nextElementSibling; alert(sp); } </script> </head> <body> <inputtype="button"name=""id=""value="获得子节点"onclick="demo1()"/> <inputtype="button"name=""id=""value="获得父节点"onclick="demo2()"/> <inputtype="button"name=""id=""value="获得兄弟点"onclick="demo3()"/> <hr/> <divid="div1"> <span>北京百度</span> <span>北京百度</span> <spanid="span1">北京百度</span> <span>北京百度</span> </div> </body> </html> 七、DOM对象操作元素样式&属性 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> functiondemo1(){ //操作元素的节点属性 varinp=document.getElementById("inp"); //获得元素的属性 //alert(inp.type+"---"+inp.name+"---"+inp.value); //改变元素的属性 inp.type="button"; inp.value="测试一下"; } function demo2(){ //操作元素的样式 vardiv=document.getElementById("div1"); //获得样式--只是支持行内样式的书写 varwi=div.style.width; varhe=div.style.height; //alert(wi+"---"+he); /*操作css方式一*/ /*div.style.width="300px" div.style.height="400px"; div.style.backgroundColor="green";*/ /*操作css的方式二 --通过增加calss属性添加样式*/ div.className="di"; } </script> <style> /*#div1{ width: 200px; height: 200px; border: 3px solid green; }*/ .di{ width:300px; height:300px; background-color:pink; } </style> </head> <body> <inputtype="button"name=""id=""value="属性操作"onclick="demo1()"/> <inputtype="button"name=""id=""value="样式操作"onclick="demo2()"/> <hr/> <inputtype="text"name="inp"id="inp"value="123"/> <divid="div1" style="width:200px;height:200px;border:3pxsolidred;"></div> </body> </html> 八、JS操作元素的文本内容 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> functiondemo1(){ //获得div对象 vardiv=document.getElementById("div1"); //只是获得节点对象的内容,纯文本的内容 //alert(div.innerText); //获得节点的文本内容+html标签 // alert(div.innerHTML); //赋予对象节点的文本内容 // div.innerText="<b>baidu</b>"; //会识别HTML对应的代码 // div.innerHTML="<b>baidu</b>"; //实现内容的累加 div.innerHTML+="<b>baidu</b>"; } functiondemo2(){ //获得input对象 varinp=document.getElementById("inp"); varval=inp.value; alert(val); } functiondemo3(){ varsel=document.getElementById("sel"); //如果option选项没有value属性,获得的值是对应的文本内容 var val=sel.value; alert(val); } function demo4(){ //获得多行文本框的对象 vartex=document.getElementById("tex"); alert(tex.value); } </script> </head> <body> <inputtype="button"onclick="demo1()"value="测试节点的内容"/> <inputtype="button"name=""id=""value="获得节点的值"onclick="demo2()"/> <inputtype="button"name=""id=""value="获得多行文本的值"onclick="demo4()"/> <hr/> <divid="div1"> <span> 我们都爱笑 </span> </div> <inputtype="text"id="inp"/> <hr/> <selectonchange="demo3()"id="sel"> <optionvalue="1">javaSE</option> <optionvalue="2">javaEE</option> <optionvalue="3">javaME</option> </select> <hr/> <textarearows="20"cols="30"id="tex">123</textarea> </body> </html> <!-- 总结: innerHTML,innerText ,value使用的情景 innerHTML,innerText:通常使用到双标签上 例外(select、textarea)获得值的时候也是用的value属性 value:通常是单标签 :input --> 九、JS中DOM对象操作元素的节点 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> functioninsertNode(){ //创建节点对象 varp=document.createElement("p"); p.innerHTML="照片:"; varinp1=document.createElement("input"); //操作节点对象的属性 inp1.type="file"; varinp2=document.createElement("input"); inp2.type="button"; inp2.value="删除"; inp2.onclick=function(){ //移除子节点的操作 /* p.removeChild(inp1); p.removeChild(inp2); document.body.removeChild(p);*/ //移除所有的节点 p.remove(); } //指定元素的对应关系 appendChild:添加到现有元素对象之后 //document.body.appendChild(p); //获得添指定元素对象 varp1=document.getElementById("p_1"); //在指定元素之前添加对象 document.body.insertBefore(p,p1); p.appendChild(inp1); p.appendChild(inp2); } //只会执行一个事件 ,,执行后者绑定的事件 window.onload=function(){ alert("页面加载完成"); } window.onload=function(){ alert("页面加载完成2"); } </script> </head> <bodyonload="demo1();demo2()"> <p> 姓名:<inputtype=""name=""id=""value=""/> </p> <p> 照片:<inputtype="file"name=""id=""value=""/> <inputtype="button"name=""id=""value="添加"onclick="insertNode()"/> </p> <pid="p_1"> <inputtype="button"name=""id=""value="提交"/> <inputtype="button"name=""id=""value="清空"/> </p> </body> </html> <!-- 节点操作的方法 document.createElement("标签名"); 父节点.appendChild(子节点); 父节点.insertBefore(新节点,指定之前的节点); 父节点.removeChild(子节点); 父节点.remove(); --> 十、JS中表单操作 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <scripttype="text/javascript"> functioncheckName(){ //获得输入的值 var val=document.getElementById("zh").value; //获得span标签对象 var span=document.getElementById("span_name"); if(val==""||val==null){ span.innerHTML="× 用户名不能为空"; span.style.color="red"; returnfalse; }else{ span.innerHTML="√ 用户名合法"; span.style.color="green"; returntrue; } } //判断表单内容是否提交 function sub(){ varflag=checkName(); if(flag){ //进行表单数据的提交 document.fom.submit(); } } </script> </head> <body> <formaction="01JS中的事件学习.html"method="get"name="fom"> 账号:<inputtype="text"name="zh"id="zh"value=""onblur="checkName()"/><spanid="span_name"></span> <br/> 密码:<inputtype="password"name="pwd"id="pwd"value=""/><br/> <inputtype="button"name=""id=""value="提交"onclick="sub()"/> </form> </body> </html> <!-- readonly和disabled 共同点:是文本框不可以更该内容 区别:readonly中对应的数据可以提交到后台 disabled中对应的数据是无法提交到后台 表单提交的形式: [1] * <input type="submit" name="" id="" value="提交" /> onsubmit="return checkName()" [2]<input type="button" name="" id="" value="提交" onclick="sub()" /> document.fom.submit(); --> 十一、JS实现打地鼠操作 <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title></title> <styletype="text/css"> body{ background-image:url("img/bb.jpg"); background-repeat:no-repeat; background-size:1360px700px; } table{ margin-top:90px; margin-left:200px; } </style> <scripttype="text/javascript"> varimgs; //游戏的时间是10s vartime=10; varshowI,stopT,leaT; varcount=0; //游戏开始 function begin(){ showI=window.setInterval("showImg()",1500); //开始计时的操作 stopT=window.setInterval("stopTime()",1000); } //展示图片 function showImg(){ //获得所有的img对象 imgs=document.getElementsByTagName("img"); //产生随机的下标 0-24 varindex=Math.floor(Math.random()*25); imgs[index].src="img/01.jpg"; //间隔2s后调用地鼠的离开的操作 leaT=window.setTimeout("leaveImg("+index+")",2000); } //地鼠回去的操作 function leaveImg(ind){ imgs[ind].src="img/00.jpg"; } //打击地鼠的操作 function change(ts){ //点击的图片的路径是01.jpg //http://127.0.0.1:8020/05JS/img/00.jpg //alert(ts.src); varimgU=ts.src.substr(ts.src.length-6,6); if(imgU=="01.jpg"){ ts.src="img/02.jpg"; count++; } } //停止计时 function stopTime(){ if(time>0){ time--; document.getElementById("div1").innerHTML=time; }else{ gameOver(); } } //停止游戏的操作 function gameOver(){ //清除所有的定时器 window.clearInterval(showI); window.clearInterval(stopT); window.clearTimeout(leaT); //图片回归之前的操作 for(vari inimgs){ imgs[i].src="img/00.jpg"; } //统计结果 alert(count); } </script> </head> <body> <divid="div1"></div> <div> <inputtype="button"name=""id=""value="开始"onclick="begin()"/> <!--table>tr*5>td*5>img[src='' onclick='']--> <tableborder="1px"> <tr> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> </tr> <tr> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> </tr> <tr> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> </tr> <tr> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> </tr> <tr> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> <td><imgsrc="img/00.jpg"alt=""onclick="change(this)"/></td> </tr> </table> </div> </body> </html>

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

【CVPR Oral】TensorFlow实现StarGAN代码全部开源,1天训练完

StarGAN 是去年 11 月由香港科技大学、新泽西大学和韩国大学等机构的研究人员提出的一个图像风格迁移模型,是一种可以在同一个模型中进行多个图像领域之间的风格转换的对抗生成方法。近日,有研究人员将 StarGAN 在 TensorFlow 上实现的全部代码开源,相关论文获 CVPR 2018 Oral。 开源地址:https://github.com/taki0112/StarGAN-Tensorflow 作者:Junho Kim 看代码之前,我们先来回顾一下 StarGAN 的原始论文。 StarGAN 对抗生成网络实现多领域图像变换 图像到图像转换(image-to-image translation)这个任务是指改变给定图像的某一方面,例如,将人的面部表情从微笑改变为皱眉。在引入生成对抗网络(GAN)之后,这项任务有了显着的改进,

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

2018-05-29 第二十三天

一、垃圾回收 1:java 的内存分为三部分 栈:stack 局部变量。 栈内存的回收,自动回收,方法结束,就回收了。 堆:heap 对象 new 出来的对象。 动态管理分配的堆内存。进行垃圾回收。 方法区:字节码元数据,静态变量。 常驻内存数据。 2:java 垃圾回收的内存区域,指的是堆内存。 3:什么样的内存属于垃圾内存? 答:没有引用指向的对象所占用的内存就是垃圾内存。 4:如何让你对象所占用的内存成为垃圾内存? 将所有指向某个对象的引用都赋值为null。 5:如何回收垃圾内存? jvm 中包含了垃圾回收器 garbage collection。 GC 垃圾回收器是jvm 的一个组成部分,它就负责监测回收堆内存中的垃圾内存。 垃圾回收器工作的时候会影响程序的运行,会导致程序运行速度降低。jvm 在垃圾回收的机制上,GC 运行的优先级是最低的。 规则: 1:程序处于一个闲置的状态,可能会进行一次垃圾回收。 2:当在堆中申请一块内存的时候,空间不够了,运行一次垃圾回收器。如果空间仍然不够,那么再次运行 GC 垃圾回收。如果内存还不够使用,那么就报错。堆内存溢出。 6:是否可以通过程序代码来实现运行垃圾回收器? 可以的。 在System类提供了一个方法 。System.gc(); 调用System.gc():通知 jvm 运行一次垃圾回收器。但是不能保证 GC 立即执行。 public static void gc()运行垃圾回收器。 调用gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存。当控制权从方法调用中返回时,虚拟机已经尽最大努力从所有丢弃的对象中回收了空间。 调用System.gc() 实际上等效于调用: Runtime.getRuntime().gc() 7:finalize():终止方法,Object 类的默认是现实 是空实现。 如果某个对象被垃圾回收器回收,那么该对象对应的类型中的finalize()方法会被GC调用。 该方法不要主动调用,只能被动调用。 可以在finalize()中对对象做最后的清理工作。善后的工作。 通常更建议的方式是自定义方法来进行善后的处理。 publicclassTest { publicstaticvoidmain(String[] args) { //final 修饰的引用数据类型的对象,对象的属性是可以被修改的。 //不能让该引用指向新的对象。 finalStudent STUDENT=newStudent(); STUDENT.setAge(10); // System.out.println(STUDENT.getAge()); Student student2=newStudent(); student2.setAge(101); Student student3= student2; //让两个引用空指向,原来指向的对象就没有任何引用指向了。 student2.destroy(); student2=null; student3=null; // System.gc(); } voidtest(){ Student student=newStudent(); } } classStudent{ privateintage; publicintgetAge() { returnage; } voiddestroy(){ //关闭网络连接等等。对象善后的工作。 } publicvoidsetAge(intage) { this.age= age; } @Override protectedvoidfinalize()throwsThrowable { System.out.println(age); System.out.println("enclosing_type.enclosing_method()"); } } 二、异常 java 程序中的错误,被称为异常Exception。 主要的五个关键字:try--catch--finally throw throws。 (一)try--catch 需求:让程序执行完毕。执行某些必要的代码。给用户一些错误提示。 语法:try{ //可能产生错误的代码 }catch(ArithmeticExceptione){ //当产生 ArithmeticException这种类型的异常的时候,在此处编写处理代码。 } 不使用try-catch时: 如果某行代码产生了异常,程序直接被终止。后续的代码都被跳过了。 深入理解: 如果在程序中出现了异常,那么该异常就交给了jvm 来处理。jvm 无法处理程序中的问题,直接终止程序运行。 使用try -catch时: 如果try 中的代码产生了异常,那么 try 代码块中的后续代码将被跳过,执行 catch 代码块中的代码,然后执行try-catch 后的代码。 如果没有产生异常:那么catch 代码块将不被执行。 深入理解: 如果产生了异常,会生成一个异常对象。如果该对象是catch 后的参数中定义的异常的类型 的实例,那么catch就可以将该异常对象捕获。 异常对象将形参变量实例化。对e 的处理,或者进行一些需要的提示信息等等。 执行完catch 代码块,执行后续的代码。 如果想让catch 可以捕获所有的异常,可以使用jdk 提供的所以的异常的公共的父类作为参数 Exception。 importjava.util.Scanner; /** * 实现功能:输入被除数,除数,求商 * */ publicclassTestException { publicstaticvoidmain(String[] args) { //创建扫描器对象 Scanner scanner=newScanner(System.in); System.out.println("请您输入被除数:"); intnum1= scanner.nextInt(); System.out.println("请您输入除数:"); intnum2= scanner.nextInt(); try{//try 代码块 intresult= num1/ num2; System.out.println(num1+ "\t除以"+num2+ "\t的结果为:"+result); }catch(Exception e) { //catch 代码块 //产生异常,处理的代码 System.out.println("输入了错误的数据!"); System.out.println(e); } System.out.println("谢谢使用!"); //在所有的键盘输入结束之后再关闭! scanner.close(); } } (二)多重catch 语法: try{ }catch(异常参数){ }catch(异常参数){ } catch 的个数没有限制。 使用多重catch 在处理对于捕获不同的类型的异常对象,希望有不同的处理的方案。可以在不同的catch 语句中给出不同的处理方案。 try-catch中,可以没有catch,此时需要fiinally结束此语句。但catch必要和try配套使用。 importjava.util.InputMismatchException; importjava.util.Scanner; /** * 实现功能:输入被除数,除数,求商 * */ publicclassTestException { //记录是发布版本还是测试版本 staticbooleanisRelease=true; publicstaticvoidmain(String[] args) { System.out.println(test()); Scanner scanner=newScanner(System.in); try{//try 代码块 //创建扫描器对象 System.out.println("请您输入被除数:"); intnum1= scanner.nextInt(); System.out.println("请您输入除数:"); intnum2= scanner.nextInt(); intresult= num1/ num2; System.out.println(num1+ "\t除以"+num2+ "\t的结果为:"+result); //结束虚拟机的 System.exit(0); }catch(ArithmeticException e) { //catch 代码块 //产生异常,处理的代码 if(isRelease){ System.out.println("输入了错误的数据!除数不能为0,请您下次注意!"); }else{ //打印异常对象的栈信息 //把异常信息要暴露给程序猿,去解决问题。 e.printStackTrace(); } }catch(InputMismatchException e){ System.out.println("输入了非法的数值型数据!"); }catch(Exception e){//最大的异常类型放到最后 //其他的异常的处理的方案。 System.out.println("都是我们的软件做的不好,我们继续努力!"); }finally{//最终代码块,不管程序出现了什么样的问题,该代码块中的代码都将被执行。 System.out.println("谢谢使用!"); //在所有的键盘输入结束之后再关闭! scanner.close(); } } staticinttest(){ inti= 0; try{ i++; //结果返回1 先计算返回的结果。然后再执行finally 中的代码,最后返回计算出来的结果。 returni; }finally{ i++; } } } (三)java 异常体系被分为了 2大类 1:运行期异常: RuntimeException 是所有的运行时异常的父类。只有在运行的时候才会出现的。 2:编译期异常 checked Exception:在编译的时候就暴露出来了。 1:运行时异常处理方式:通常不需要做特别的处理。保持代码逻辑严谨,用户体验合理即可。 2:编译期异常: 1:使用try-catch 进行捕获 并处理。 抓 2:在产生编译期异常的方法的声明处(参数列表的末尾)使用throws 将产生的编译期异常继续往外抛。抛给当前方法的调用者去处理。 抛 throw: 1:在方法的内部使用。 2:后面跟的是异常对象。 3:后面只能跟一个异常对象。 throws: 1:在方法的声明处使用,参数列表的末尾。 2:后面跟的是异常的类型。 3:后面可以跟多个异常类型,使用逗号分割。 常见异常: 1:ArithmeticException数学异常,被0除 2:InputMismatchException输入类型不匹配异常 3:java.lang.ArrayIndexOutOfBoundsException:数组下标越界异常。 4:java.io.IOException : javaIO 异常。 5:java.lang.NullPointerException:空指针异常,使用了尚未初始化的对象。 importjava.io.File; importjava.io.IOException; publicclassTest1 { publicstaticvoidmain(String[] args) { int[] array= {1,2}; System.out.println(array[2]); //使用try-catch 进行捕获处理。 try{ test(); }catch(IOException e) { //TODOAuto-generated catch block e.printStackTrace(); } } staticvoidtest()throwsIOException{ File file=newFile("c:/1.txt"); //将该编译期异常在方法声明处声明该方法在被调用的时候可能会产生某种异常。 file.createNewFile(); } } (四)自定义异常 /** * 自定义异常 * */ publicclassTestMyException { publicstaticvoidmain(String[] args) { Person person=newPerson(); try{ person.setAge(-1); }catch(AgeException e) { e.printStackTrace(); } } } classPerson{ privateintage; publicintgetAge() { returnage; } //如果一个方法产生了一个异常对象。 publicvoidsetAge(intage)throwsAgeException { if(age< 0){ //产生一个异常对象,并抛出去 AgeException e=newAgeException(age); throwe; } this.age= age; } } //自定义异常 classAgeExceptionextendsException{ //保存非法年龄的属性 privateintage; publicAgeException(intage) { this.age= age; } //该异常对象的字符串表示形式 publicString toString() { return"使用了非法的年龄,数值为:"+age; } } 三、java常用类 (一)基本数据类型包装类 java 已经提供了八种基本数据类型。 jdk 中定义了 八种基本数据类型对应的包装类。 byte--Byte short--Short int--Integer long--Long float--Float double--Double char--Character boolean--Boolean 为何要出现八种基本数据类型对应的包装类。 1:在处理很多基本数据类型的时候,需要将这些数据当作对象来对待。 2:包装类中定义了各种处理基本数据类型的方法。提供了基本数据类型到 字符串之间的相互的转换。 例:"1"+ 1中的1 这个整数要先转换为字符串(通过方法)然后在做+连接。 (二)Integer public final class Integerextends Numberimplements Comparable Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。 此外,该类提供了多个方法,能在int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。 构造方法 Integer(int value) 构造一个新分配的Integer 对象,它表示指定的 int 值。 Integer(String s) 构造一个新分配的Integer 对象,它表示 String 参数所指示的 int 值。 int compareTo(Integer anotherInteger) 在数字上比较两个Integer 对象。 boolean equals(Object obj) 比较此对象与指定对象。 int intValue() 以int 类型返回该 Integer 的值。 static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析。 static int parseInt(String s, int radix) 使用第二个参数指定的基数,将字符串参数解析为有符号的整数。 static String toBinaryString(int i) 以二进制(基数2)无符号整数形式返回一个整数参数的字符串表示形式。 static String toString(int i) 返回一个表示指定整数的String 对象。 static Integer valueOf(int i) 返回一个表示指定的int 值的 Integer 实例。 static Integer valueOf(String s) 返回保存指定的String 的值的 Integer 对象。 例: importjava.util.Arrays; importcom.bjsxt.util.MyUtil; //* 定义一个Integer数组,元素个数10,然后对元素随机赋值。使用Integer.valueOf(int); 创建元素对象, //* 然后遍历数组,打印然后排序,然后再次打印。 //源代码 //静态工厂方法 publicclassTestInteger { publicstaticvoidmain(String[] args) { finalintLEN= 10; Integer[] integers=newInteger[LEN]; for(inti=0;i integers[i] = Integer.valueOf(MyUtil.getRandomNumber(0, 100)); } //打印数组内容 System.out.println(Arrays.toString(integers)); Arrays.sort(integers); System.out.println(Arrays.toString(integers)); } } //很多时候需要创建一个类的不同特性的对象。 //直接通过构造方法创建不同特性的对象,需要分析构造方法的参数类型,来进行区分。 //静态工厂方法可以更好的通过方法的名字来体现创建的对象的特性。 //如果想对某个类创建的对象加以限制,可以构造方法私有化,然后通过静态工厂方法去创建你希望被外部的其他的类创建的对象。 classStudent{ privateintage; privateString name; Student(intage) { super(); this.age= age; } publicStudent() { } Student(intage, String name) { super(); this.age= age; this.name= name; } //静态工厂方法。 publicstaticStudent newInstance(){ returnnewStudent(1); } publicstaticStudent newDefaultStudent(){ } } (三)valueOf(-128~127) 1:Integer 对象一旦创建,就不能修改内部的value 值。value 值 是一个final 修饰的。 好处:安全。 坏处:需要创建大量的Integer 对象来满足 创建不同值的 Integer对象。 没有提供setValue 的方法。 只有获得value 值的方法。intValue 方法获得 Integer对象内部的value 值。 分析:通过构造方法和valueOf(int) 创建对象的区别。 publicstaticInteger valueOf(inti) { if(i>= IntegerCache.low&& i<= IntegerCache.high) returnIntegerCache.cache[i+ (-IntegerCache.low)]; returnnewInteger(i); } 区别:使用new 调用构造方法,一定会创建一个新的对象。 使用valueOf如果参数的值在byte 的取值范围内,则复用系统创建的对象,而不用再创建新的对象。超过范围再创建对象。 结论:优先使用valueOf创建Integer 对象。 (四)自动装箱封箱 publicclassTestBoxing { publicstaticvoidmain(String[] args) { //jdk1.5 版本提供了非常简便的语法。 //自动封箱autoboxing将一个基本数据类型的数据封装到一个对应的包装类的对象中。 Integer integer= 1; //上面的代码编译之后就是下面的样子 Integer integer2= Integer.valueOf(1); //自动拆箱autounboxing将一个包装类对象直接赋值给一个对应的基本数据类型变量。 inti= integer; //上面的代码编译之后就是下面的样子 intvalue= integer.intValue(); } } (五)System系统类 public final class Systemextends ObjectSystem 类包含一些有用的类字段和方法。它不能被实例化。 在System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。 in : 对应着标准输入设备 ,键盘 out:标准输出设备 ,控制台。 常用方法: static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。 static long currentTimeMillis() 当前时间与协调世界时1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。 static void exit(int status) 终止当前正在运行的Java 虚拟机。 static void gc() 运行垃圾回收器。 static long nanoTime() 返回最准确的可用系统计时器的当前值,以毫微秒为单位。 static void runFinalization() 运行处于挂起终止状态的所有对象的终止方法。 static void setIn(InputStream in) 重新分配“标准”输入流。 static void setOut(PrintStream out) 重新分配“标准”输出流。 (六)Math类 public final class Mathextends Object Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 static double E:比任何其他值都更接近e(即自然对数的底数)的 double 值。 static double PI:比任何其他值都更接近pi(即圆的周长与直径之比)的 double 值。 static int abs(int a) 返回int 值的绝对值。 static double cbrt(double a) 返回double 值的立方根。 static double ceil(double a)向上取整 返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数。 static double floor(double a)向下取整 返回最大的(最接近正无穷大)double 值,该值小于等于参数,并等于某个整数。 static double max(double a, double b) 返回两个double 值中较大的一个。 static double min(double a, double b) 返回两个double 值中较小的一个。 static double pow(double a, double b) 返回第一个参数的第二个参数次幂的值。 static double random() 返回带正号的double 值,该值大于等于 0.0 且小于 1.0。 static long round(double a)四舍五入 返回最接近参数的long。 static double sqrt(double a) 返回正确舍入的double 值的正平方根。 static double toDegrees(double angrad) 将用弧度表示的角转换为近似相等的用角度表示的角。 static double toRadians(double angdeg) 将用角度表示的角转换为近似相等的用弧度表示的角。

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

第134天:移动web开发的一些总结(二)

1、响应式布局 开发一个页面,在所有的设备上都能够完美展示。 媒体查询:@media screen and (max-width:100px) { } 媒体类型:screen(屏幕) print(打印机)handheld(手持设备)all(通用) 常用媒体查询参数: width —— 视口宽高height —— 视口宽高device-width —— 设备的宽高device- height —— 设备的宽高orientation:检查设备处于横向(landscape)还是竖屏(portrait) 2、响应式设计设计点 设计点一:百分比布局 仅仅使用媒体查询来适应不同固定宽度设计,只会从一组css到另一组css的切换。两种设计之间没有任何平滑渐变。只使用媒体查询,布局有时会变得不可控制。当然,这只是建议,也有一些页面采用固定布局的情况下能够很好的在一些没有考虑过媒体查询情况下的设备上很好的展示。 设计点二:弹性图片 思路:无论何时,全都包在图片的元素宽度范围内,以最大的宽度同比完整的显示图片。 img{ max-height: 100% } 设计点三:重新布局,显示与隐藏 当页面达到手机屏幕宽度的时候,很多时候就要放弃一些传统的页面设计思想。力求页面简单,做如下处理:① 同比例缩减元素尺寸② 调整页面结构布局③ 隐藏冗余的元素经常需要切换位置元素使用【绝对定位】,减少重绘提高渲染性能。 关于响应式设计的思考: 根据响应式设计的理念,一个页面包含所有设备不同屏幕的样式和图片,当一个移动设备访问一个响应式的页面,就会下载pc,笔记本,ipad等不同设备对应的样式。而这些样式却是冗余的,完全没有用。权衡利弊:性能不是最优,但是能减少重复开发。 3、 特殊样式处理 (1) 高清图片 在移动web页面上渲染图片,为了避免图片产生模糊,图片的宽度应该用物理像素单位渲染,即是100 * 100的图片,应该使用100dp * 10dp。width:(w_value/dpr)px;height:(w_height/dpr)px; (2) 一像素边框 同样是retina屏幕下的问题,根本原因:1px使用2dp渲染。border:0.5px;(错误),仅仅ios8可以使用通用方案:scaleY(0.5) (3) 相对单位rem 为了适应各大屏幕的手机,px略显固定,不能根据尺寸的大小而改变,使用相对单位更能体验页面兼容性。em:是根据父节点的font-size为相对单位rem:是根据html的font-size为相对单位em在多层嵌套下,变得非常难以维护,rem更加能作为全局统一设置的度量那么,rem的基值设置为多少比较好?回归目的:为了适应各大手机屏幕rem = screen.width / 20 不使用rem的情况:font-size 一般来讲font-size是不应该使用rem的相对单位的。因为字体的大小是趋向于阅读的实用性,并不适合于排版布局。同理,趋向于一些固定的元素的特性。我们不使用rem而改为使用px去确保在不同屏幕上表现一致(跟rem的目的相反)。 (4) 多行文本溢出••• 单行文本溢出,对title类的使用非常多,而多行文本类,在详情介绍则用的比较多。 1 //单行文本溢出… 2 .inaline { 3 overflow: hidden; 4 white-space: nowrap; 5 text-overflow: ellipsis; 6 } 7 //多行文本溢出… 8 .intwoline { 9 display: -webkit-box: !important; 10 overflow: hidden; 11 12 text-overflow: ellipsis; 13 word-break: break-all; 14 15 -webkit-box-orient: vertical; 16 -webkit-line-clamp: 4; 17 } 4、 终端交互优化 对click事件say no 弹性滚动 上拉刷新 tap事件基础 touch触摸事件 下拉加载 300ms: 移动web页面上的click事件响应都要慢上300ms用300ms判断是单击还是双击 (1) tap基础事件 300ms延迟怎么破?tap事件代替click事件。自定义tao事件原理:在touchstart、touchend的记录时间、手指位置,在touchend时进行比较,如果手指位置为同一位置(或允许移动一个非常小的位移值)且时间间隔较短(一般认为是200ms),且过程中未曾触发过touchmove,即可认为触发了手持设备上的“click”,一般称它为“tap”。 tap“点透”的bug:有两层,点击第一层的时候,如果点击的区域在第二层的范围内,那么第二层也会被触发。(原因与300ms有关) tap透传的解决方案:①使用缓存动画,过渡300ms的延迟②中间层dom元素的加入,让中间层接收这个“穿透”事件,稍后隐藏③“上下”都使用tap事件,原理上解决tap穿透事件,(但是不可避免原生标签的click事件,如a,input)。③ 改用Fastclick的库(听过最新的zepto已经fixed掉这个bug) (2) Touch基础事件 触摸才是移动设备的交互的核心事件,支持多点触摸。touchstart:手指触摸屏幕触发(已经有手指放屏幕上不会出发)touchmove:手指在屏幕上滑动,连续触发touchend:手指离开屏幕时触发touchcancel:系统取消touch时候触发(不常用)eg:滑动页面时来了一个电话或者其他系统事件 除常见的事件属性外,触摸事件包含专有的触摸属性:touches:跟踪触摸操作的touch对象数组targetTouches:特定事件目标的touch对象数组changeTouches:上次触摸改变的touch对象数组 一个小BUG:android只会触发一次touchstart,一次touchmove,touchend不触发。(4.0,4.1有,4.2修复没有了,4.4开始又出现了) 解决方案:在touchmove中加入:event.preventDefault(),可fixedBug。 但注意:event.preventDefault()会导致默认行为不发生,如scroll,导致页面不滚动!如果页面带有滚动条,就需要考虑更换解决方案。 (3) 弹性滚动,下拉刷新 ①弹性滚动:当客户端的页面滚动到顶部或底部的时候,滚动条会收缩并让我们多滑动一定距离。通过缓冲反弹的效果,带给用户良好的体验。移动web页面也是拥有这样的能力的,但滚动有几种情况需要考虑:body层滚动:(系统特殊化处理)自带弹性滚动,overflow:hidden失效,GIF和定时器暂停。局部滚动:没有弹性滚动,没有滚动惯性,不流畅。局部滚动开启弹性滚动: body { overflow:scroll; -webkit-overflow-scrolling:touch; } 但注意:android不支持原生的弹性滚动!但可以借助三方库iScroll来实现 ②下拉刷新:顶端下拉一小点距离,页面弹性滚动向下。④ 上拉加载:使用scroll事件,而不是touch事件(android有bug) (4) Canvas & GPU render【GPU 渲染】 优化技巧:canvas代替img标签drawImage(image,x,y);canvas上绘制图片drawImage(image,x,y,width,height);canvas上绘制缩放图片 原因:img使用浏览器渲染,当图片特别大且手机性能不是很好的情况下,会特别卡,通常表现在滑动图片。因为没有触发物理设备本身的GPU(图形处理器)渲染 image object: ① 预加载图片:当设置img.src=””的时候,就表示请求加载图片② 图片的按比例缩放 (5) css3 animation 当一个css3动画结束时,我们可以监听相关事件AnimationEnd,比如对于webkit来说,是webkitAnimationEnd。 5、 跨终端web ① 单域 - Media Query② 单域 – 多模板③ 多域 – 跳转(很原始)④ 多平台 App (1) 移动优先: ① 移动端的用户和流量越来越多② 各种屏幕让我们更聚焦业务的本领③ 移动设备有更先进的人机交互体验 (2) 多终端检测 (3) 接口:结构:通用接口, 接口模型:前端消费者;后端生产者;测试监督者 6、零碎的细节 1)CSS3动画,代替DOM animation,效率更高,因为css3直接使用浏览器的GPU(图形处理器)渲染 2) 当你给一个元素设置它的百分比宽度的时候,他需要一个比照,也就是父元素,但是当它没有父的时候,需要给他一个绝对定位absolute值,但是在移动开发中,给整个整块的页面使用position: absolute;很占用内存,特别是当内容比较多的时候,会非常明显。会有几个后果:在ios下,会导致浏览器直接崩溃掉;在android下,会导致非常非常的卡。所以建议直接用js计算。 3)将图片显示到一排上,不使用浮动,使用-webkit-transform:translate3d(0,0,0); position: absolute; 4)new Date() * 1;// * 1 ,进行数值运算,转换为数字形式的时间戳 5) self.startX = evt.touches[0].pageX; //记录开始的位移,touches包含着所有手指触摸在屏幕上的点的集合 -webkit-backface-visibility:hidden;/* 防止闪白 */ 6)更多图片的优化,保留3个要使用的节点,当前的,上一个,下一个图片的节点,剩余的不需要的删除 7)jQuery Mobile(JQM jQMobile)是jQuery在手机上和平板设备上的版本,是创建移动web app的框架。 8)2048制作过程中遇到的bug:(见9(2)touch基础事件BUG) // 手机上手指识别无用,chrome19827号错误:touchevent不被触发。防止没有正确使用preventDefault() document.addEventListener('touchmove', function(event) { event.preventDefault(); }); 10)使用Dropbox发布自己的web app免费限制:① 静态网站 ② 速度较慢(在国外) ③ 域名不宜记忆11)web app、native app和hybrid app(混合模式)

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

[BigData]关于Hadoop学习笔记第三天(PPT总结)(一)

课程安排 MapReduce原理*** MapReduce执行过程** 数据类型与格式*** Writable接口与序列化机制*** ---------------------------加深拓展---------------------- MapReduce的执行过程源码分析 问题:怎样解决海量数据的计算? MapReduce概述 lMapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. lMR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算,非常简单。 l这两个函数的形参是key、value对,表示函数的输入信息。 思考:自己设计一个MapReduce框架 Mapreduce原理 ◆执行步骤: 1. map任务处理 1.1 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。 1.2 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。 2.reduce任务处理 2.1写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。 2.2把reduce的输出保存到文件中。 map、reduce键值对格式 WordCountApp的驱动代码 Configuration conf = new Configuration(); //加载配置文件 Job job = new Job(conf); //创建一个job,供JobTracker使用 job.setJarByClass(WordCountApp.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); FileInputFormat.setInputPaths(job, new Path("hdfs://192.168.1.10:9000/input")); FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.1.10:9000/output")); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); job.waitForCompletion(true); } MR流程 l代码编写 l作业配置 l提交作业 l初始化作业 l分配任务 l执行任务 l更新任务和状态 l完成作业 MR过程各个角色的作用 ljobClient:提交作业 lJobTracker:初始化作业,分配作业,TaskTracker与其进行通信,协调监控整个作业 lTaskTracker:定期与JobTracker通信,执行Map和Reduce任务 lHDFS:保存作业的数据、配置、jar包、结果 作业提交 l提交作业之前,需要对作业进行配置 •编写自己的MR程序 •配置作业,包括输入输出路径等等 l提交作业 •配置完成后,通过JobClient提交 l具体功能 •与JobTracker通信得到一个jar的存储路径和JobId •输入输出路径检查 •将jobj ar拷贝到的HDFS •计算输入分片,将分片信息写入到job.split中 •写job.xml •真正提交作业 作业初始化 l客户端提交作业后,JobTracker会将作业加入到队列,然后进行调度,默认是FIFO方式 l具体功能 •作业初始化主要是指JobInProgress中完成的 •读取分片信息 •创建task包括Map和Reduce任创建task包括Map和Reduce任务 •创建TaskInProgress执行task,包括map任务和reduce任务 任务分配 lTaskTracker与JobTracker之间的通信和任务分配是通过心跳机制实现的 lTaskTracker会主动定期向JobTracker发送心态信息,询问是否有任务要做,如果有,就会申请到任务。 任务执行 l如果TaskTracker拿到任务,会将所有的信息拷贝到本地,包括代码、配置、分片信息等 lTaskTracker中的localizeJob()方法会被调用进行本地化,拷贝job.jar,jobconf,job.xml到本地 lTaskTracker调用launchTaskForJob()方法加载启动任务 lMapTaskRunner和ReduceTaskRunner分别启动java child进程来执行相应的任务 状态更新 lTask会定期向TaskTraker汇报执行情况 lTaskTracker会定期收集所在集群上的所有Task的信息,并向JobTracker汇报 lJobTracker会根据所有TaskTracker汇报上来的信息进行汇总 作业完成 lJobTracker是在接收到最后一个任务完成后,才将任务标记为成功 l将数结果据写入到HDFS中 错误处理 lJobTracker失败 •存在单点故障,hadoop2.0解决了这个问题 lTraskTracker失败 •TraskTracker崩溃了会停止向JobTracker发送心跳信息。 •JobTracker会将TraskTracker从等待的任务池中移除,并将该任务转移到其他的地方执行 •JobTracker将TaskTracker加入到黑名单中 lTask失败 •任务失败,会向TraskTracker抛出异常 •任务挂起 JobTracker l负责接收用户提交的作业,负责启动、跟踪任务执行。 lJobSubmissionProtocol是JobClient与JobTracker通信的接口。 lInterTrackerProtocol是TaskTracker与JobTracker通信的接口。 TaskTracker l负责执行任务。 JobClient l是用户作业与JobTracker交互的主要接口。 l负责提交作业的,负责启动、跟踪任务执行、访问任务状态和日志等。 序列化概念 l序列化(Serialization)是指把结构化对象转化为字节流。 l反序列化(Deserialization)是序列化的逆过程。即把字节流转回结构化对象。 lJava序列化(java.io.Serializable) Hadoop序列化的特点 l序列化格式特点: 1.紧凑:高效使用存储空间。 2.快速:读写数据的额外开销小 3.可扩展:可透明地读取老格式的数据 4.互操作:支持多语言的交互 Hadoop的序列化格式:Writable Java序列化的不足: 1.不精简。附加信息多。不大适合随机访问。 2.存储空间大。递归地输出类的超类描述直到不再有超类。序列化图对象,反序列化时为每个对象新建一个实例。相反。Writable对象可以重用。 3.扩展性差。而Writable方便用户自定义 Hadoop序列化的作用 l序列化在分布式环境的两大作用:进程间通信,永久存储。 lHadoop节点间通信。 Writable接口 lWritable接口, 是根据 DataInput 和 DataOutput 实现的简单、有效的序列化对象. lMR的任意Key和Value必须实现Writable接口. •MR的任意key必须实现WritableComparable接口 常用的Writable实现类 Text一般认为它等价于java.lang.String的Writable。针对UTF-8序列。 例: Text test = new Text("test"); IntWritable one = new IntWritable(1); 自定义Writable类 Writable ①write 是把每个对象序列化到输出流 ②readFields是把输入流字节反序列化 ①实现WritableComparable. ②Java值对象的比较:一般需要重写toString(),hashCode(),equals()方法 自定义WritableKpi 1.电信例子 2.把上面例子里的Mapper的value改写为自定义Writable类型。修改原MapReduce程序,并成功执行。结果跟原来一致。 MapReduce输入的处理类 lFileInputFormat: FileInputFormat是所有以文件作为数据源的InputFormat实现的基类,FileInputFormat保存作为job输入的所有文件,并实现了对输入文件计算splits的方法。至于获得记录的方法是有不同的子类——TextInputFormat进行实现的。 InputFormat InputFormat 负责处理MR的输入部分. 有三个作用: v验证作业的输入是否规范. v把输入文件切分成InputSplit. v提供RecordReader 的实现类,把InputSplit读到Mapper中进行处理. InputSplit ◆ 在执行mapreduce之前,原始数据被分割成若干split,每个split作为一个map任务的输入,在map执行过程中split会被分解成一个个记录(key-value对),map会依次处理每一个记录。 ◆ FileInputFormat只划分比HDFS block大的文件,所以FileInputFormat划分的结果是这个文件或者是这个文件中的一部分. ◆ 如果一个文件的大小比block小,将不会被划分,这也是Hadoop处理大文件的效率要比处理很多小文件的效率高的原因。 ◆ 当Hadoop处理很多小文件(文件大小小于hdfs block大小)的时候,由于FileInputFormat不会对小文件进行划分,所以每一个小文件都会被当做一个split并分配一个map任务,导致效率底下。 例如:一个1G的文件,会被划分成16个64MB的split,并分配16个map任务处理,而10000个100kb的文件会被10000个map任务处理。 TextInputFormat ◆ TextInputformat是默认的处理类,处理普通文本文件。 ◆ 文件中每一行作为一个记录,他将每一行在文件中的起始偏移量作为key,每一行的内容作为value。 ◆ 默认以\n或回车键作为一行记录。 ◆ TextInputFormat继承了FileInputFormat。 InputFormat类的层次结构 其他输入类 ◆ CombineFileInputFormat 相对于大量的小文件来说,hadoop更合适处理少量的大文件。 CombineFileInputFormat可以缓解这个问题,它是针对小文件而设计的。 ◆ KeyValueTextInputFormat 当输入数据的每一行是两列,并用tab分离的形式的时候,KeyValueTextInputformat处理这种格式的文件非常适合。 ◆ NLineInputformat NLineInputformat可以控制在每个split中数据的行数。 ◆ SequenceFileInputformat 当输入文件格式是sequencefile的时候,要使用SequenceFileInputformat作为输入。 自定义输入格式 1)继承FileInputFormat基类。 2)重写里面的getSplits(JobContext context)方法。 3)重写createRecordReader(InputSplit split,TaskAttemptContext context)方法。 (讲解源代码) Hadoop的输出 ◆ TextOutputformat 默认的输出格式,key和value中间值用tab隔开的。 ◆ SequenceFileOutputformat 将key和value以sequencefile格式输出。 ◆ SequenceFileAsOutputFormat 将key和value以原始二进制的格式输出。 ◆ MapFileOutputFormat 将key和value写入MapFile中。由于MapFile中的key是有序的,所以写入的时候必须保证记录是按key值顺序写入的。 ◆ MultipleOutputFormat 默认情况下一个reducer会产生一个输出,但是有些时候我们想一个reducer产生多个输出,MultipleOutputFormat和MultipleOutputs可以实现这个功能。 思考题 1.MapReduce框架的结构是什么 2.Map在整个MR框架中作用是什么 3.Reduce在整个MR框架中作用是什么 本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/4572339.html,如需转载请自行联系原作者

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

菜鸟学Linux 第001天笔记 基础理论知识

主要学习的知识: RHCE RH033 RH133 RH253 RHCA: RH401 RH423(LDAP)学习不多 RH442 RH436(集群) RHS333 MySQL 应用行业: 运维工程师、系统工程师、系统架构师、DBA 所有后期实验都是在VMware里操作,必须学会使用此虚拟机。 计算机体系结构和如何运作: 运算器 控制器 存储器 输入设备 输出设备 程序=指令+数据 硬件架构(cpu架构) ARM(只生产知识产权,设计芯片,不生产设备) X86 X86 64 or X64 安腾 (intel 收购的HP的cpu) alpha HP UltraSparc Sun Power IBM (世界上第一个生产双核心,四核心,六核心,八核心, 第一个生产出超4GHZ主频的CPU) M68000,M68K 摩托罗拉 PowerPC 苹果、IBM、摩托罗拉 全作生产 OS (operating system) Windows Linux Unix 以下为Unix 不同的厂商 HP-UX Solaris AIX SCO UNIX Unixware 等 OS/2 硬件软件分层图 计算机发展史 Linux 发展史 Linux 组织 GNU: GNU is Not Unix 提供Linux 源代码 GPL: General Public license 通用公共许可证 以下是发行商把源代码打包编译成可执行程序的Linux, 因为他们是开源的,软件可以随便下载使用,所以主要利润来源于服务,即如果使用操作系统出故障,自己处理不了,需要联系他们时,则需要收服务费,根据其需要的响应时间不同收费不同。 你懂得 RedHat SLS Debian SUSE RHEL Red Hat Enterprise Linux CentOS Community Enterprise Operating System CentOS 是RHEL的源代码再编译的产物 本文转自Winthcloud博客51CTO博客,原文链接http://blog.51cto.com/winthcloud/1850625如需转载请自行联系原作者 Winthcloud

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

CCNA第二天学习笔记之Cisco系统IOS

路由器简介 路由器能起到隔离广播域的作用,还能在不同网络间转发数据包。路由器实际上是一台特殊用途的计算机,和常见的PC机一样,路由器有CPU、内存、BOOT ROM。路由器没有键盘、硬盘、显示器;然而比起计算机,路由器多了NVRAM、FLASH以及各种各样的接口。路由器各个部件的作用如下: 1、CPU:中央处理单元,和计算机一样,它是路由器的控制和运算部件。 2、RAM/DRAM:内存,用于存储临时的运算结果,如:路由表、ARP表、快速交换缓存、缓冲数据包、数据队列、当前配置。众所周知,RAM中的数据在路由器断电后是会丢失的。 3、FLASH:可擦除、可编程的ROM,用于存放路由器的IOS,FLASH的可擦除特性允许我们更新、升级IOS而不用更换路由器内部的芯片。路由器断电后,FLASH的内容不会丢失。FLASH容量较大时,就可以存放多个IOS版本。 4、NVRAM:非易失性RAM,用于存放路由器的配置文件,路由器的配置文件,路由器断电后,NVRAM中的内容仍然保持。 5、ROM:只读存储器,存储了路由器的开机诊断程序、引导程序和特殊版本的IOS软件(用于诊断等有限用途),ROM中软件升级时需要更换芯片。 6、接口(Interface) :用于网络连接,路由器就是通过这些接口和不同的网络进行连接的。 IOS简介 路由器也有自己的操作系统,通常称为IOS(Internetwork Operating System) 。和计算机上的Windows一样,IOS是路由器的灵魂,所有配置是通过IOS完成的。Cisco的IOS是命令行界面(称为CLI,Command Line Interface),CLI有两种基本工作模式: 1、用户模式(User mode):通常用来查看路由器的状态。在此状态下,无法对路由器进行配置,可以查看的路由器信息也是有限的。 2、特权模式(Privilege mode):可以更改路由器的配置,当然也可以查看路由器的所有信息。 1、理解启动路由器时的情况{工作过程)。当第一次启动一台Cisco 路由器时,它将运行一个加电白检测试(POST),如果通过,它将查找(Cisco IOS),如果闪存中保存有IOS文件,它将从中加载。接着IOS将处理装载和在NVRAM中查找一个有效的配置,即被称做启动配置的文件。如果在NVRAM中没有文件存在,则路由器将进入设置模式。 2、记住设置模式可以提供的操作。如果路由器在引导时没有启动配置文件保存在 NVRAM中,设置模式将会自动启动。也可以在特权模式下通过键入setup进入到设置模式。对于那些不了解如何在命令行下配置Cisco路由器的操作者来说,设置模式提供了简易格式的最小规模的配置。 3、了解用户模式和特权模式之间的不同。默认时,用户模式提供了一个带有很少可用命令的命令行接口。在用户模式下不允许配置被查看或修改。特权模式允许用户查看并修改路由器的配置。可以通过键人命令enable及输入启用口令或启用加密口令(如果设置了)来进入特权模式。 4、记住命令show version可以提供的信息。show version命令将提供关于系统硬件的基本配置信息,以及软件的版本号、配置文件的名称和来源、配置寄存器设置以及引导映像等。 5、记住如何设置路由器的主机名。设置一台路由器主机名的命令顺序如下: enable conf1g t hostname cisco 6、记住启用口令和启用加密口令之间的不同。这两个口令都是用于进人特权模式的。然而,启用加密口令是更新的方式,并且默认时被加密保存。另外,如果在设置了启用口令之后又设置了启用加密口令,则只有启用加密口令被运用。 7、记住如何在路由器上设置启用加密口令。要设置启用加密口令,可以使用命令enable secret。不要使用enable secret password pasword,否则,将设置口令为"password password"。下面是一个示例: enab1e config t enab1e secret cisco 8、记住如何在路由器上设置控制台口令。要设置控制台口令,使用如下命令顺序: enab1e conf1g t line console o password cisco 1og1n 9、记住如何在路由器上设置Te1net口令。要设置Telnet口令,命令顺序是: enab1e config t linevty O 4 password cisco 1og1n 了解如何诊断-个串行链接的问题。如果键入show interface serial 0命令后发现链路 说明是"down,line protocol is down",表明是物理层问题。如果得到的是"up,line protocol is down",则表明遇到了数据链路层上的问题。 10、理解如何使用show interfaces命令来检验你的路由器。如果输人了show interfaces就能查看到此路由器上该接口的统计数字,并验证该接口是否被关闭,以及查看到每个接口上的IP地址。 本文转自 ltyluck 51CTO博客,原文链接:http://blog.51cto.com/ltyluck/172938

资源下载

更多资源
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应用均可从中受益。

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部分的功能。

用户登录
用户注册