计算机语言

0x00前言文章中的文字可能存在语法错误以及标点错误,请谅解;如果在文章中发现代码错误或其它问题请告知,感谢!0x01解决方法我们在使用linux开发编译的时候可能会遇到:1.前几次还好用的命令,这次再输入就出现-bash:***:commandnotfound的情况;2.第一次使用就出现-bash:**:commandnotfound的情况。导致这种问题的原因有很多(就像导致肚子疼痛的原因各种各样),有可能是环境变量配置问题,也可能某一个bin文件夹下的内容全部删除导致等,所以现在将主要导致bash:commandnotfound的原因写在下面,希望对大家的开发过程有帮助。1.检查该命令工具是否安装出现这个问题时,首先用whereis命令确定该指令工具是否安装,例如确定gcc是否安装whereisgcc,如果此时显示gcc:/usr/bin/gcc则说明已经安装好,可以接着用下面的方法继续找原因,如果只是显示gcc:,则说明gcc没有下载,此时进行下载就可以。Centos(Rehat系列)系统下载gcc命令:yuminstallgccUbuntu系统下载gcc命令:apt-getinatallgcc2.检查各个bin文件夹的内容是否非空在使用其它相对更复杂的手段“还原”到之前好用的状态之前,应该先检查的bin文件夹里的命令是否都在,这个方法最简单也最直观。如果自己需要用到的命令所在的bin文件夹为空,那么就会理所应当的出现-bash:***:commandnotfound情况。要检查的bin文件夹有以下几个:/bin,/usr/bin,/sbin,/usr/sbin查看这四个里面的是否为空,若出现为空的情况,那么解决办法就是找一个同样系统版本的linux把对应文件夹的内容复制到本地空的bin文件夹中。例如我的linux版本是CentOSrelease6.8,我输入gcc命令编译的时候出现bash:gcc:commandnotfound,通过查看四个目录发现其中/usr/bin内容为空,然后自己通过将同样的CentOSrelease6.8系统下的/usr/bin内容全部复制到本地的/usr/bin中,然后再次gcc编译,通过。注意,这种排查方法适用在输入类似ls、tty这种常见指令以前可用但最近出现notfound的情况。3.检查是否是$PATH设置是否正确$PATH决定了shell到哪些目录下去寻找命令或工具,PATH的值是一系列目录,当程序运行时,Linux系统会到这些目录下进行搜索,所以当出现-bash:**:commandnotfound可能因为是PATH没有设置。PATH设置格式:PATH=$PATH:<PATH1>:<PATH2>:<PATH3>:...:<PATHN>1可以将自己指定的路径加到PATH中(见上,若有多个变量路径则在中间用冒号":"隔开),例如:exportPATH=/opt/STM/STLinux-2.3/devkit/sh4/bin:$PATH,设置成功之后,使用echo查看是否配置成功:[root@localhostu-boot-sh4]#echo$PATH/opt/STM/STLinux-2.3/devkit/sh4/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin12上述方法添加PATH在终端关闭后会消失。建议通过vi/etc/profile修改PATH,也可修改主用户目录下的.bashrc,这样可以永久生效。若使用前一种方法,则输入指令vi/etc/profile,然后在该文件最后添加:exportPATH="/opt/STM/STLinux-2.3/devkit/sh4/bin:$PATH"1保存后,退出,再执行:[root@localhostetc]#source/etc/profile1不报错就成功。当然,可能还有其它原因导致bash:commandnotfound,这时候就需要在网上仔细找,把导致该问题的前因后果都说清楚(配置了什么,删掉了什么),相信问题最后一定能解决。以上。参考文档:1.https://blog.csdn.net/awenluck/article/details/252338832.https://blog.csdn.net/panjiao119/article/details/797903243.https://blog.csdn.net/zq199692288/article/details/788710464.https://blog.csdn.net/FightForProgrammer/article/details/41960707————————————————原文链接:https://blog.csdn.net/wangqingchuan92/article/details/89399654

计算机语言

如果说是JQuery是手工作坊,那么Vue.js就像是一座工厂,虽然Vue.js做的任何事情JQuery都可以做,但无论是代码量还是流程规范性都是前者较优。Vue.js的官方中文教程其实也是一个不错的教程,不过相比于一次性把所有概念掌握,我更倾向于先会用,之后再在实际应用中把未涉及到的知识点逐步补全。就像开车,不是非要知道发动机的工作原理才能上路的,甚至你可能一辈子也不用知道。好了,开始吧准备首先,以下几点希望你已经知道或者做到了:你会用html+css+javascript写一些网页你知道什么是DOM和BOM(BrowserObjectModel)你知道Vue.js是一个框架而不是一个新语言你会用百度或者Google其中之一去查找答案接着,我会围绕以下几个Vue.js的基本(核心)使用方法逐个做测试和使用说明:新建vue对象数据绑定事件绑定表单控件绑定最后,根据上面的知识点结合起来写出我们的第一个vuejs前端页面新建Vue对象引用vue.js在桌面建立一个Vue.html文件,然后引入vue.js的CDN地址https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js<scriptsrc="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>新建Vue实例在Vue.html中插入一个id为firstVue的<div><divid="firstVue"></div>在Vue.html中插入下面js代码:<scripttype="text/javascript">varmyVue=newVue({el:"#firstVue"})</script>然后整个代码看起来是这样的:<!DOCTYPEhtml><html><head><title>VueDemo</title><scriptsrc="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script></head><body><divid="firstVue"></div></body><scripttype="text/javascript">varmyVue=newVue({el:"#firstVue"})</script></html>解释一下代码js变量myVue就是Vue创建的一个对象,可以理解成把<divid="firstVue></div>和这个标签里面包含的所有DOM都实例化成了一个JS对象,这个对象就是myVueel是Vue的保留字,用来指定实例化的DOM的ID号,#firstVue这句话就是标签选择器,告诉Vue要实例化ID=“firstVue”的这个标签。至此,Vue.js框架在html页面的引入工作完成,但是如果我们访问这个页面并不能看到任何效果,一篇空白数据绑定VUE这个框架的数据流向是单向的,不懂没关系,记住就好了所以数据绑定后的数据流向是从vue实例——>DOM文档的我们给上一步的<div>标签添加下面一句话{{my_data}}变成这样<divid="firstVue">{{my_data}}</div>这个双大括号的语法叫做mustache语法,大括号里面的是作为变量形式出现的。然后在创建vue实例的代码中加入下面数据声明:data:{my_data:"test"}整个代码看起来向下面这样:<!DOCTYPEhtml><html><head><title>VueDemo</title><scriptsrc="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script></head><body><divid="firstVue">{{my_data}}</div></body><scripttype="text/javascript">varmyVue=newVue({el:"#firstVue",data:{my_data:"test"}})</script></html>data参数用来绑定VUE实例的数据变量,每个不同变量之间用逗号分隔,上面我们绑定了自定义变量my_data,并赋初值'test'完成数据绑定工作,<div>标签里的{{myData}}数据会随着myVue实例里的myData数据的变动而变动,浏览器查看当前页面,会出现'test'字符串,说明数据绑定成功这是在HTML标签内部的数据绑定,那么如果想绑定某个HTML标签的属性值,就要用到v-bind:属性了,比如我想绑定一个标签是否可见的属性(hidden),那么就应该这么写:<divid="firstVue"v-bind:hidden="my_hidden">{{my_data}}</div>v-bind:后面写想要绑定的属性,my_hidden也不需要用两个大括号括起来了,直接写就可以了,然后在VUE实例中声明这个绑定数据varmyVue=newVue({el:'#firstVue',data:{my_data:"test",my_hidden:"hidden"}})这时候再浏览这个网页,又变成了空白,但是F12查看源代码,发现其实是div标签的hidden属性被激活了当然,v-bind:不仅可以绑定hidden属性,disabled属性,style属性,color属性,凡是标签有的属性,都可以通过这个方法进行绑定v-bind由于经常会用到,所以也可以缩写成冒号:,比如上面的<div>标签就完全可以这样写<divid="firstVue":hidden="my_hidden">{{my_data}}</div>这是和v-bind:hidden="my_hidden"完全等价的一种写法至此,Vue.js两种绑定数据的方法都写完并进行了测试事件绑定v-bind:是用来绑定数据的,v-on:则是用来绑定事件的,比如我要绑定一个<button>的click事件就这么写<buttonv-on:click="clickButton()">ClickMe</button>当然这里的click可以换成任意一个html事件,比如load,doubleclick,mouseon,mousedown这些,不过click肯定是我们最常用的将click动作绑定到clickButton()函数之后就需要实现这个函数了,我们要在之前的vue实例中加入新字段methodsvarmyVue=newVue({el:'#firstVue',data:{my_data:"test",my_hidden:"hidden"},methods:{clickButton:function(){this.my_data="Wow!I'mchanged!"}}})我们在methods关键字里面定义了clickButton方法,并在方法内改变了之前定义的my_data变量的值这里涉及到如何在vue实例中引用data字段的变量,如上所示,需要加this后面直接写要引用的变量就可以了如果不加this,系统会默认你想引用的是一个全局变量,可是这里我们需要引用的是这个vue实例里的局部变量现在整体代码和之前有些变化,看起来是这样的:<!DOCTYPEhtml><html><head><title>VueDemo</title><scriptsrc="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script></head><body><divid="firstVue"><buttonv-on:click="clickButton">ClickMe</button><p>{{my_data}}</p></div></body><scripttype="text/javascript">varmyVue=newVue({el:'#firstVue',data:{my_data:"test",my_hidden:"hidden"},methods:{clickButton:function(){this.my_data="Wow!I'mchanged!"}}})</script></html>好了,运行一下,点击ClickMe的时候"test"就会变成"Wow!I'mchanged!",这是因为变量my_data的改变。另外,v-on:语法同样有一个缩写@,比如v-on:click="clickButton"就等价于@click="clickButton"表单控件绑定之前有说Vue这个框架是单向数据传输的,就是从vue实例传送数据到DOM,那么我们如何从DOM中实时获取用户输入的数据赋值给vue实例呢这用到了Vue.js提供给用户的一个语法糖v-model,这个语法糖通过两步实现了数据的反向传递,也就是从DOM传送给vue实例数据。下面说的原理看不懂可以跳过,不会影响后续阅读v-model通过两步实现了数据反向传递第一步,绑定了DOM标签的input事件(比如叫tapInput())第二步,当用户进行输入时候,触发tapInput()函数,tapInput()函数内部读取此DOM标签的Value值,赋值给vue实例通过以上两步,v-model语法糖实现了vue数据的反向传输好,直接写一个例子吧<!DOCTYPEhtml><html><head><title>VueDemo</title><scriptsrc="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script></head><body><divid="firstVue"><inputtype="text"v-model="my_data"/><buttonv-on:click="clickButton">ClickMe</button><p>{{my_data}}</p></div></body><scripttype="text/javascript">varmyVue=newVue({el:'#firstVue',data:{my_data:"test",my_hidden:"hidden"},methods:{clickButton:function(){this.my_data="Wow!I'mchanged!"}}})</script></html>可以发现,我们增加了一个<input>标签,并且用v-model语法绑定了之前定义的变量my_data这个时候,当我们在<input>输入框输入值的时候,v-model会实时将最新值(value)赋值给vue实例的my_data变量,而my_data变量又将实时展现在<p>标签中这样我们看起来实现了这么一个数据流:DOM1(input标签)——>VUE——>DOM2(p标签)先从用户输入的DOM1获取输入保存在VUE实例,用从VUE实例里拿到数据输出到DOM2运行这个页面,发现<p>标签中的内容会随着<input>标签实时的变化,说明我们利用v-model语法变相实现了数据的双向传递总结看看我们学到了什么用newVue({})新建vue实例使用v-bind:和{{}}双大括号语法在html中绑定变量使用v-on:和@语法绑定函数到标签的事件使用v-model:语法使用户的页面输入反向传递回vue实例变量现在简单完善一下上面的代码,做成一个计数器程序,用户可以在输入框输入任意数字,点击按钮进行总数累加下面是对刚才代码进行了一些小的改动,相信你一定可以看明白的<!DOCTYPEhtml><html><head><title>VueDemo</title><scriptsrc="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script></head><body><divid="firstVue"><inputtype="number"v-model.number="my_step"/><buttonv-on:click="clickButton">Add</button><p>{{my_total}}</p></div></body><scripttype="text/javascript">varmyVue=newVue({el:'#firstVue',data:{my_step:1,my_total:0},methods:{clickButton:function(){this.my_total=this.my_total+this.my_step}}})</script></html>上面v-model.number后面的这个.number的意思是说在返回my_step值的时候自动转换成integer类型,因为默认是string类型,所以要多这么一句。本文算是vue的基础内容,下一篇将会是vue的核心内容,组件。前端的东西多且杂,东拼西凑总也不是进步的办法,我认为最好就是将主干的一支学明白用在实际项目中,其他的一些枝枝叉叉遇见了现看文档也是来得及的,比如我每次FLEX布局都要现查语法,甚至写前端页面的时候总是开着VUE的官方文档随时查看-囧-我会写出一个用Vue.js构建SPA(SinglePageApplication)的系列文章,希望可以让初学、转学VUE的人少走弯路一基础以上是VUE组件的官方定义,让我说的直白一点,比如<button>Click</button>这个html的按钮就可以理解为一个组件,因为这么写就会展示出一个按钮在界面。那么如果我写<button-demo>Click</button-demo>界面就不会有任何显示,因为浏览器不认识这个<button-demo>这个组件,html语法没有定义。那么VUE的组件使我们有能通过现有的浏览器认可的组件自定义一个像是<button-demo>这样的组件的显示方式和内部运行逻辑。举个栗子:Vue.component('button-demo',{template:'<button>Hellohere!</button>'})通过Vue注册一个叫做'button-demo'的组件,这个自定义组件是由<button>Hellohere!</button>组成的。可以这么理解,注册了'button-demo'以后,<button-demo></button-demo>就等价于<button>Hellohere!</button>看一下演示效果这里需要注意下,通过Vue注册的组件只能在Vue的注册范围内用,就像演示里面一样,必须要<divid="app"></div>里面用。二进阶VUE组件当然不可能就只能组合组合html标签,每一个VUE组件对相当于一个VUE实例,在组件内可以定义方法,数据,甚至可以引用其他组件//定义button-counter组件Vue.component('button-counter',{//定义数据data:function(){return{count:0}},//定义方法methods:{clickAdd:function(){this.count++}},template:'<button@click="clickAdd">Youclickedme{{count}}times</button>'})看一下演示效果这里需要注意的是data并不是像这样直接提供一个对象:data:{count:0}取而代之的是,一个组件的data选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝(看不懂记住就好,以后慢慢理解):data:function(){return{count:0}}三全局注册与局部注册上面我们注册的是全局组件,也就是在整个VUE根实例中注册的,也可以理解为调用了VUE的静态方法注册的,这样注册的组件是可以在任何VUE实例中使用的。不过这样也会带来作用域冲突的麻烦,比如我分别注册了一个前端HOME组件和一个后端ADMIN组件,又想注册两个HEAD组件分别用在HOME和ADMIN组件里面,代表前台后台不同的页头,这时候如果是全局注册为了区分不同的HEAD组件,我可能就需要为他们起两个名字,分别叫HOME_HEAD和ADMIN_HEAD。但是局部组件注册就允许用户把自定义组件的作用域限制在父级VUE实例中://component-a是一个全局组件Vue.component('component-a',{template:'<div><p>这里是全局组件</p><component-b></component-b></div>',//使用components在父组件中注册局部组件components:{'component-b':{template:'<button>这是一个局部组件</button>'},}})可以看到,我们把在component-a组件里使用了关键字components注册了一个局部组件component-b并且嵌入了component-a的模板语法中。完整代码四注意问题单个根元素注意上面局部组件的那个例子,全局组件component-a的模板字符串是被一个<div>标签完全包裹起来的,是因为VUE规定每个组件必须只有一个根元素,所以不管你的组件由多少子元素组成,最外层都只有有且只有一个元素。合理组织代码结构同样是局部组件的那个例子,如果向下面这样写会不会更清楚明白一些://定义component-b组件变量component-b={template:'<button>这是组件B</button>'}//定义component-a组间变量,并引用component-a变量component-a={template:'<div><p>这是组件A</p><component-b></component-b></div>'components:{'component-b':component-b}}//在Vue实例中注册component-a局部组件//虽然component-a实在Vue实例中注册,但是如果此Vue实例//是整个程序的跟实例,那也component-a也相当于进行了全局注册newVue({el:'#components-demo',components:{'component-b':component-a}})上面的代码将每个组件的代码赋值给了不同的变量,这样如果某个组件有变化,只用修改相应的变量,而不需要修改所有引用此变量的方法,实现了松耦合的编程思想。特殊元素特殊对待有些HTML元素,诸如<ul>、<ol>、<table>和<select>,对于哪些元素可以出现在其内部是有严格限制的。而有些元素,诸如<li>、<tr>和<option>,只能出现在其它某些特定的元素内部。这会导致我们使用这些有约束条件的元素时遇到一些问题。例如:<table><blog-post-row></blog-post-row><!--table元素中只允许包含<th>,<tr>等元素--></table>这个自定义组件<blog-post-row>会被作为无效的内容提升到外部,并导致最终渲染结果出错。幸好这个特殊的is特性给了我们一个变通的办法:<table><tris="blog-post-row"></tr></table>这样<blog-post-row>这个自定义组件就会正常渲染。如果你使用单文件组件的话(就是.vue后缀的文件),这一条可以忽略总结作为一个轻量级的JS前端框架,我认为这两章的内容就已经涵盖使用VUE最核心的语法和思想了。还是那句话,学习一个框架,最有效的方法就是实践,不需要把所有文档看一个遍再去写程序,因为真正写程序的时候,你还会翻看无数遍框架文档。直到现在,我在写VUE程序的时候,左边的屏幕是编辑器,右边的屏幕就是VUE的官方文档。数据绑定事件绑定用户输入获取组件定义和使用上面四大知识点已经足够支撑我们写出一个差不多的VUE程序了。转载:https://www.jianshu.com/p/5d0d913d2453视频教程:https://learning.dcloud.io/

2020-7-18 623 0
计算机语言

CentOS6.0精简版已发布,http://www.wdlinux.cn/wdlinux_CentOS_6.0精简定制由来由于原版ISO文件大(DVD4.5G,CD8张光盘),默认安装的服务也多,安装步骤烦琐(新手更不容易),不管是下载或安装使用都不太方便,而且,很多的服务和文件都是及少用到或特殊服务才会应用,基于此原因,便想定制,精简这样的一个小巧,易安装易使用的精简版本,对一些常规选项进行了自动化处理进行安装和系统一些优化处理,更便于安装和使用,基本上安装好就是一个最优化的系统,极大方便了安装和使用,对于不熟悉或常需安装系统(如IDC机房)的朋友来说更是一个便利.iso版本简介[我的Linux,让Linux更易用]wdlinux是基于最新的CentOS5.6版本定制,精简而来,是定制版,也是精简版,主要是去除了大部分不常用软件包,筛选了系统基本包和web应用基础包,并进行了更新和优化,以达到最小最优.同时增加一些较常用的工具包,如iptraf,nmap,sysstat,strace,tcpdump,curl等,便于日常维护中使用和排错,同时,同时集成wdcp服务器管理系统(lamp,lnmp安装版),可方便在线管理服务器和网站.分i386(32位)和x86(64位)两个版本,大小500M左右,一个光盘搞掂,比原来的几个光盘或一个DVD盘方便多了.下载也更快.并且,此ISO将安装过程进行简化,只需在设置IP,网关,密码(base版为可以设置自定分区)时提示并设置,其它的均为自动,整个安装,大概5分钟左右,就可以安装完一个系统.更方便和简洁,快速.对一些机房工作人员或是对Linux又不是那么熟悉的人来说,省时又方便,何乐而不为?对大多站长来说,lamp,lnmp集成版更是方便.即使不懂Linux的人,也可以很容易就安装和使用Linux服务器了.节省大量人力物力...安装简单,方便,快速,整个安装过程,只需要几个操作即可完成,大概10分钟,即可全部装完有些人问:wdlinux稳定不?应该问linux稳定不?wdlinux安全不?应该问linux安全不?其实这些问题不用回答,看互联网上的大站,巨头都在用,就已经有答案了.wdlinux只是在安装上做一些处理和优化,并未修改内核源码等之类,所以,本质上,并无区别分三个版本集成lamp(linux+apache+mysql+php的简写)+zend+eAccelerator+wdcp请看http://www.wdlinux.cn/wdlinux_lamp集成lnmp(linux+nginx+mysql+php的简写)+zend+eAccelerator+wdcp请看http://www.wdlinux.cn/wdlinux_lnmpbase版,也就是基本版,不含web环境,就是一个最小化安装的Linux系统外加一些工具包集成lamp,lnmp版与base版的安装区别是lamp,lnmp会自动格式化硬盘和分区(注意有重要数据的请勿用此安装ISO)base版需要自己手工进行划分,且只是一个最小系统,没安装服务和环境下载地址(32和64位)base版http://dl.wdlinux.cn:5180/wdlinux_base_32_5.6.isohttp://dl.wdlinux.cn:5180/wdlinux_base_64_5.6.isolamp安装版http://dl.wdlinux.cn:5180/wdlinux_lamp_32_5.6.isohttp://dl.wdlinux.cn:5180/wdlinux_lamp_64_5.6.isolnmp安装版http://dl.wdlinux.cn:5180/wdlinux_lnmp_32_5.6.isohttp://dl.wdlinux.cn:5180/wdlinux_lnmp_64_5.6.iso5.5版的看这里http://www.wdlinux.cn/wdlinux_CentOS_5.5本文连接:http://www.wdlinux.cn/wdlinux_CentOS_5.62011.04.18零时更新增加lamp,lnmp安装版转自:http://www.wdlinux.cn/old/wdlinux_CentOS_5.6

计算机语言

LAMP之LINUX安装总结1、插入光盘或ISO文件2、以文本模式安装,输入:text3、跳过CD检验Skip4、WelcometoCentOS!ok5、语言选择English6、键盘选择us7、提示:会初始化设备,所有数据库将被清空,因为是全新安装。yes8、进入文本分区界面==========================removeallpartitionsonselecteddrivesandcreatedefaultlayout.移除所选磁盘上的所有分割区,并建立预设的分割模式。removelinuxpartitionsonselecteddrivesandcreatedefaultlayout.移除所选磁盘上的linux分割区,并建立预设的分割模式。usefreespaceonselecteddrivesandcreatedefaultlayout.使用所选取磁盘上的未使用空间,建立预设的分割模式。createcustomlayout.手动分区============================选择如第一个。9、确认信息YES10、将磁盘分为三个区。===========/bootswap/===========/分区选择Fillallavailablespace(全部剩余空间)分区选择Forcetobeaprimarypartition(主分区)OK确认。11、启动加载配置GRUB.默认回车。12、BootLoaderConfiguration设置一个与独立不重复的名字OK13、选择UseaGRUBPassword为GRUB设立一个密码。14、其它一路默认回车。15、NetworkConfigurationforeth0设置网络信息选择Activateonboot和EnableIPv4support回车16、选择ManualaddressconfigurationIPAddress本机ip(如):192.168.1.126Prefix(Netmask)子网掩码(如):255.255.255.0OK17、Gateway默认网关(如):192.168.1.1PrimaryDNS网关(如):202.106.0.20SecondaryDNS备用网关(如):空白OK18、设置主机名称OK19、设置系统时间选择Asis/ShanghaiOK20、设置系统登录密码21、选择要安装的软件包勾选Customizesoftwareselection(自定义)22、勾选基础安装包:developlibrarydeveloptoolseditsbasexsoftwaredevelopmentadministratortoolssystemtoolsOK23、确认安装信息OK后等待安装。24、取出光盘或ISO,reboot重启后登陆root#su-//获取root权限#whoami//查看目前权限25、创建新用户#useradd用户名#passwd用户名//设置密码or初始密码26、安全起见,修改系统端口及登录信息。#cp/etc/ssh/sshd_config/etc/ssh/sshd_config.ori//备份需要配置的ssh_config文件#vi/etc/ssh/sshd_config//编辑sshd_config####byjeacen###Port52113PermitRootLoginnoPermitEmptyPasswordsno####byjeacen###将以上信息加入后:wq保存:q退出#/etc/init.d/sshdrestart//重启ssh服务,修改信息生效。27、安全起见,将需要root权限的用户名加入sudo,可保证root密码不泄露。#visudo在下面添加需要root用户名#UserprivilegespecificationrootALL=(ALL)ALL用户名ALL=(ALL)ALLwq:保存28、修改中文显示#vi/etc/sysconfig/i18nLANG="zh_CN.GB18030"#source/etc/sysconfig/i18n生效

2014-9-15 3094 0
计算机语言

ignore_user_abort();函数搭配set_time_limit(0);和sleep($interval);即可实现以上自动更新。先给出一个基本的范式,其中有个人的测试程序:<?phpignore_user_abort();//函数设置与客户机断开是否会终止脚本的执行set_time_limit(0);//来设置一个脚本的执行时间为无限长$interval=30;do{$fp=fopen('text3.txt','a');fwrite($fp,'test');fclose($fp);sleep($interval);//函数延迟代码执行若干秒}while(true);?>首先运行该程序,然后关闭该页面,程序仍然运行中,test会每隔30秒的填补到text3.txt文件。最后根据php手册简单介绍一些相关的知识:1.连接处理:在PHP内部,系统维护着连接状态,其状态有三种可能的情况:0–NORMAL(正常)1–ABORTED(异常退出)2–TIMEOUT(超时)当PHP脚本正常地运行NORMAL状态时,连接为有效。当远程客户端中断连接时,ABORTED状态的标记将会被打开。远程客户端连接的中断通常是由用户点击STOP按钮导致的。当连接时间超过PHP的时限时,TIMEOUT状态的标记将被打开。可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便,即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户端连接中断时脚本将会退出。该处理过程可由php.ini的ignore_user_abort或由Apache.conf设置中对应的”php_valueignore_user_abort”以及ignore_user_abort()函数来控制。如果没有告诉PHP忽略用户的中断,脚本将会被中断,除非通过register_shutdown_function()设置了关闭触发函数。通过该关闭触发函数,当远程用户点击STOP按钮后,脚本再次尝试输出数据时,PHP将会检测到连接已被中断,并调用关闭触发函数。脚本也有可能被内置的脚本计时器中断。默认的超时限制为30秒。这个值可以通过设置php.ini的max_execution_time或Apache.conf设置中对应的”php_valuemax_execution_time”参数或者set_time_limit()函数来更改。当计数器超时的时候,脚本将会类似于以上连接中断的情况退出,先前被注册过的关闭触发函数也将在这时被执行。在该关闭触发函数中,可以通过调用connection_status()函数来检查超时是否导致关闭触发函数被调用。如果超时导致了关闭触发函数的调用,该函数将返回2。需要注意的一点是ABORTED和TIMEOUT状态可以同时有效。这在告诉PHP忽略用户的退出操作时是可能的。PHP将仍然注意用户已经中断了连接但脚本仍然在运行的情况。如果到了运行的时间限制,脚本将被退出,设置过的关闭触发函数也将被执行。在这时会发现函数connection_status()返回3。转:http://hi.baidu.com/helly/item/f14b871d5c88e60fb98a1aaa经过测试,用以上代码,就算把本身php文件删除,还是会继续执行,除非把php-cgi的进程结束,才不能继续执行了,太神奇了。又是一段邪恶的代码,哎。。还有,此代码是一死循环,切勿直接运用到程序中。

计算机语言

一、echoecho()实际上不是一个函数,是php语句,因此您无需对其使用括号。不过,如果您希望向echo()传递一个以上的参数,那么使用括号会发生解析错误。而且echo是返回void的,并不返回值,所以不能使用它来赋值。例子:<?php$a=echo("xshell");//错误!不能用来赋值echo"xshell";//xshellecho("xshell");//xshellecho("xshell","net");//发生错误,有括号不能传递多个参数echo"xshell","net","is","web";//不用括号的时候可以用逗号隔开多个值,会输出xshellnetiswebecho"xshellisgoodweb.";//不管是否换行,最终显示都是为一行xshellisgoodweb.echo"$fistnamenet";//如果$firstname="xshell",则会输出xshellnet.echo'$firstnamenet';//由于使用单引号,所以不会输出$firstname的值,而是输出$firstnamenet?>二、printprint()和echo()用法一样,但是echo速度会比print快一点点。实际上它也不是一个函数,因此您无需对其使用括号。不过,如果您希望向print()传递一个以上的参数,那么使用括号会发生解析错误。注意print总是返回1的,这个和echo不一样,也就是可以使用print来赋值,不过没有实际意义。例子:<?php$a=print("xshell");//这个是允许的echo$a;//$a的值是1?>三、print_r函数print_r函数打印关于变量的易于理解的信息。语法:mixedprint_r(mixed$expression[,boolreturn])如果变量是string,integerorfloat,将会直接输出其值,如果变量是一个数组,则会输出一个格式化后的数组,便于阅读,也就是有key和value对应的那种格式。对于object对象类同。print_r有两个参数,第一个是变量,第二个可设为true,如果设为true,则会返回字符串,否则返回布尔值TRUE。例子:<?php$a="xshell";$c=print_r($a);echo$c;//$c的值是TRUE$c=print_r($a,ture);echo$c;//$c的值是字符串xshell?>四、printf函数printf函数返回一个格式化后的字符串。语法:printf(format,arg1,arg2,arg++)参数format是转换的格式,以百分比符号(“%”)开始到转换字符结束。下面是可能的format值:*%%–返回百分比符号*%b–二进制数*%c–依照ASCII值的字符*%d–带符号十进制数*%e–可续计数法(比如1.5e+3)*%u–无符号十进制数*%f–浮点数(localsettingsaware)*%F–浮点数(notlocalsettingsaware)*%o–八进制数*%s–字符串*%x–十六进制数(小写字母)*%X–十六进制数(大写字母)arg1,arg2,arg++等参数将插入到主字符串中的百分号(%)符号处。该函数是逐步执行的,在第一个%符号中,插入arg1,在第二个%符号处,插入arg2,依此类推。如果%符号多于arg参数,则您必须使用占位符。占位符被插入%符号之后,由数字和“\$”组成。可使用数字指定显示的参数,详情请看例子。例子:<?phpprintf("Mynameis%s%s。","xshell","net");//Mynameisxshellnet。printf("Mynameis%1\$s%1\$s","xshell","net");//在s前添加1\$或2\$.....表示后面的参数显示的位置,此行输出MynameisRickyRicky因为只显示第一个参数两次。printf("Mynameis%2\$s%1\$s","xshell","net");//Mynameisnetxshell?>五、sprintf函数此函数使用方法和printf一样,唯一不同的就是该函数把格式化的字符串写写入一个变量中,而不是输出来。例子:<?phpsprintf("Mynameis%1\$s%1\$s","xshell","net");//你会发现没有任何东西输出的。$out=sprintf("Mynameis%1\$s%2\$s","xshell","net");echo$out;//输出Mynameisxshellnet?>六、var_dump函数功能:输出变量的内容、类型或字符串的内容、类型、长度。常用来调试。<?php$a=100;var_dump($a);//int(100)$a=100.356;var_dump($a);//float(100.356)?>转:http://www.2cto.com/kf/201208/147096.html

2013-3-30 4989 0
计算机语言

这样一来就检索出当前页面的局部变量了,接下来我们可以来结合前面的SQL语句来实现根据不同环境ID调用内容不同栏目内容。  例如:  {dede:php}  $thisid=$refObj->Fields['id'];  $row=$dsql->GetOne('selectid,typenamefromdede_arctypewhereid='.$thisid);  print_r($row);  {/dede:php}  这样是来调用当前栏目的标题,这个标签功能类似于{dede:field.typename/}  写自己的标签,让别人说去吧  DedeCMS从V5.3开始就支持自己扩展标签,不过许多新人很少用那个东西,今天我就来简单的介绍下如何编写自己的调用标签。  我们需要知道下扩展标签的存放目录及文件名构成,首先,扩展的标签都是存放在/include/taglib这个目录,名称都是以“标签名.lib.php”格式,例如{dede:channel/}标签对应的是channel.lib.php文件。  我们可以看一个示例标签:demotag.lib.php    if(!defined('DEDEINC'))  {  exit("RequestError!");  }  functionlib_demotag(&$ctag,&$refObj)  {  global$dsql,$envs;  //属性处理  $attlist="row|12,titlelen|24";  FillAttsDefault($ctag->CAttribute->Items,$attlist);  extract($ctag->CAttribute->Items,EXTR_SKIP);  $revalue='';  //你需编写的代码,不能用echo之类语法,把最终返回值传给$revalue  //------------------------------------------------------  $revalue='HelloWord!';  //------------------------------------------------------  return$revalue;  }  ?>  我们登录系统后台的[模板]-[全局标签测试]中运行{dede:demotag/},显示如下的结果:  这里我们知道,其实标签生成的内容其实是这个函数的一个返回值,这里返回的内容都是字符串,也就是函数return$revalue;中的$revalue需要是经过处理后生成的字符串。  $attlist="row|12,titlelen|24";这个是属性列表,这个经过函数处理后会直接生成变量并复制,我们可以测试下,做如下的修改:  $revalue='HelloWord!';  $revalue.="Row:".$row.";TitleLen:".$titlelen;  这样我们可以看到,这个属性已经被创建变量并且赋值了。  接下来我们可以再进一步去修改这个标签。  比如说我们需要写一个标签专门来查询文章内容页的那个相关文章,功能类似于上面sql标签中的那个sql,只是这里我们将其分装为一个标签。  我们可以新建一个标签,例如叫writerarc,那我们就需要创建一个writerarc.lib.php,然后模仿demotag编写函数,注意需要修改为  functionlib_writerarc(&$ctag,&$refObj)  接下来我们就可以编写查询语句及对底层模板处理的相关函数了  $revalue='';  $innertext=$ctag->GetInnerText();  $ctp=newDedeTagParse();  $ctp->SetNameSpace('field','[',']');  $sql="SELECT*FROMdede_archivesWHEREwriter='{$refObj->Fields['writer']}'limit0,$row";  $innertext这个是用来获取标签的底层模板的,$ctp创建用于处理底层模板中的变量,并处理进行替换。我们根据获取的属性编写我们的sql语句,这里我们使用limit0,$row,这样就可以根据$row来确定查询的内容数目。  当然我们可以获取更多的属性以便我们这个标签更强大,例如我们可以增加类似于arclist中的相关属性,并在函数中进行处理,不过这个需要有一定的PHP基础。  接下来我们通过执行查询对sql及输出变量进行处理:  $dsql->Execute('me',$sql);  while($rs=$dsql->GetArray('me'))  {  //根据属性处理查询变量  $rs['title']=cn_substr($rs['title'],$titlelen);  //获取底层模板  $ctp->LoadSource($innertext);  foreach($ctp->CTagsas$tagid=>$ctag){  if(!empty($rs[strtolower($ctag->GetName())])){  $ctp->Assign($tagid,$rs[$ctag->GetName()]);  }  }  //根据底层模板及查询变量得到处理结果  $revalue.=$ctp->GetResult();  }  这样我们就将查询出来的结果同底层模板中出现的相关变量进行替换,然后生成输出字符串,将所有的字符串信息存储到$revalue中。  最后返回这个值return$revalue;  整个文件内容如下:    if(!defined('DEDEINC'))  {  exit("RequestError!");  }  functionlib_writerarc(&$ctag,&$refObj)  {  global$dsql,$envs;  //属性处理  $attlist="row|12,titlelen|24";  FillAttsDefault($ctag->CAttribute->Items,$attlist);  extract($ctag->CAttribute->Items,EXTR_SKIP);  $revalue='';  $innertext=$ctag->GetInnerText();  $ctp=newDedeTagParse();  $ctp->SetNameSpace('field','[',']');  $sql="SELECT*FROMdede_archivesWHEREwriter='{$refObj->Fields['writer']}'limit0,$row";  $dsql->Execute('me',$sql);  while($rs=$dsql->GetArray('me'))  {  //根据属性处理查询变量  $rs['title']=cn_substr($rs['title'],$titlelen);  //获取底层模板  $ctp->LoadSource($innertext);  foreach($ctp->CTagsas$tagid=>$ctag){  if(!empty($rs[strtolower($ctag->GetName())])){  $ctp->Assign($tagid,$rs[$ctag->GetName()]);  }  }  //根据底层模板及查询变量得到处理结果  $revalue.=$ctp->GetResult();  }  return$revalue;  }  ?>  接下来我们来测试我们这个标签,我们修改article_article.htm模板,在里面加入以下的标签代码:  {dede:writerarcrow='10'titlelen='6'}  [field:title/]  {/dede:writerarc}  通过动态浏览页面进行查看调试http://www.dedecms.com/plus/view.php?aid=3,我们会发现标签起作用了,输出了我们的内容。  至此我们完成了标签的编写,这里面主要涉及到PHP、MySQL的很多知识,需要有一定相关方面的基础才能够编写标签了,当然这里只是一个简单的标签开发例子,还有许多的东西可以去开发。转自:http://hi.baidu.com/aloneseo/item/4cb9a733419ee7ffa88428c7

2013-3-30 3745 0