vue.js 解耦视图与数据,可复用的组件,前端路由,状态管理,虚拟DOM。 MVVM模式:当View(视图层)变化时,会自动更新ViewModel(视图模型),View与ViewModel之间双向绑定。 【Vue.js使用第一个程序】
< div id ="app" >
< p > {{ message }}p >
div >
< script >
new Vue({
el: ' #app ' ,
data: {
message: ' Hello Vue.js! '
},
created: function (){
console.log( this .message); // Hello Vue.js!
},
mounted: function (){
console.log( this .$el);
},
beforeDestroy: function (){
},
filters: {
filterA: function (v){
return v;
}
},
methods: {
close: function (){
}
},
computde: {
msg: function (){
return this .message;
}
}
})
script >
【第1-3章,Vue介绍、数据绑定、计算属性】 *el:挂载DOM对象。 *data:绑定数据集。 *created:实例创建完成后调用,但尚未挂载,$el还不可用。 *mounted:el挂载到实例上后调用,一般第一个业务逻辑在这里开始。 *beforeDestroy:实例销毁之前调用。 *filters:过滤器,支持在{{}}插值的尾部添加一个管道符“|”,经常用于格式化文本, 过滤器也可以串联多个,也可以传递参数,接收第一个参数默认是数据本身, 串联{{message|filterA|filterB}},接收参数{{message|filterA('arg1','arg2')}}。 过滤器应当用于简单的文本转换,如要实现复杂的数据变化,应使用“计算属性”。 *methods:声明所有绑定事件监听器实现的方法,每个方法以函数形式声明, 实例方法内可以通过this直接调用其他申明的方法,外部也可以通过声明实例名调用。 *computde:计算属性,复杂的逻辑都可以在这里实现,最终返回结果, 计算属性还可以返回多个Vue实例的数据,其中一个数据变化,计算属性会重新执行。 计算属性包含get和set函数,可以通过set函数进行修改数据值,一般set用的少。 计算属性可以依赖其他计算属性,也可以依赖其他实例中的数据。 计算属性缓存,所依赖的数据发生变化时,它才会重新取值。 2.1.3 {{}}:输出data中的属性值,里面还可以使用javascript表达式、三元运算等,vue.js只支持单个表达式,不支持语句和流控制, 另外,在表达式中不能使用用户自定义的全局变量,只能使用Vue自带的全局变量,如Math和Date等。 v-html:与{{}}不同的是,可以输出html,双大括号是解析后的纯文本。 这里要注意,如果使用v-html输出后,有可能导致XSS攻击,所以要在服务端对用户提交的内容进行处理。 2.2 v-:指令,vue.js中指令前缀带有“v-”,比如v-if、v-html、v-pre等, 指令主要职责就是当其表达式的值改变时,将某些行为应用到DOM上。 v-pre: 即可跳过当前元素和子元素的编译过程,可以将{{}}直接文本形式显示出来。 v-bind:动态更新HTML元素上的属性,比如id、class等,v-bind:id="id"、v-bind:class="class"。 v-on:用来绑定事件监听器,这样我们就可以做一些交互了,v-on:click="onclose", onclose这些方法都写在Vue实例的methods属性内,表达式除了方法名,也可以直接是一个内联语句, v-on:click="show=false",show是data中属性。 2.3 语法糖: “v-bind:” 可以用:代替 “v-on” 可以用@代替 【第4章,关于样式class和style绑定】 4.2.1 绑定class对象:
以上设置对象可以动态切换class,当数据isActive和isError变化时,对应的class类名也会更新。
4.2.2 绑定class数组:
active和error直接依赖于数据,数组中也可以用三元表达式,数组中也可以包含对象。
当:class的表达式过长或逻辑复杂时,还可以绑定一个计算属性和方法,表达式用[]括起来优先级。
例:return ['btn',{['btn-'+this.size]: this.size!=='',['btn-disabled']: this.disabled}]
当数据this.size不为空时,会应用‘btn-size12’,当数据this.disabled为true时,会应用‘btn-disabled’。
备注:使用计算属性给元素动态设置类名,在业务中经常用到,尤其是在写复用的组件时,应该尽可能的优先使用计算属性。
4.2.3 组件上绑定class:
这种语法仅适用于自定义组件的最外层是一个根元素,否则会无效,需要给子元素设置类名时,应当使用组件props来传递。
4.3 绑定style内联样式:语法跟:class类似,
为了便于阅读和维护,一般写在data或computde里,应用多个样式对象时,可以使用数组语法。
【第5章,内置指令】
5.1.1 v-cloak:不需要表达式,它会在vue实例结束编译时从绑定的HTML元素上移除,经常和css的display:none配合使用。
在一般的情况下,v-cloak是一个解决初始化慢导致页面闪动的最佳实践,但使用webpack和vue-router之后,项目的HTML结构
只有一个空的div元素,剩余的内容都是由路由去挂载不同的组件来完成的,所以不再需要v-cloak。
备注:解决刚加载页面,但Vue未执行完成时,页面上会出现{{...}}显示问题。
v-once:也是一个不需要表达式的指令,作用是定义它的元素或组件只渲染一次,包括元素或组件的所有子节点。
首次渲染后,不再随着数据的变化重新渲染,将被视为静态内容。
5.2.1 v-if、v-else-if、v-else:与javascript的条件语句类似。
在渲染元素时,处于效率考虑,会尽可能的复用已有的元素,当切换后dom之前输入的值不变。
如果不希望这么做,可以使用key属性,唯一key值来控制是否要复用。
5.2.2 v-show:用法与v-if基本一致,只不过v-show是改变元素的css属性display,元素隐藏。
v-show不能在
上使用,频繁切换场景中适合使用。 v-for:列表渲染指令,循环显示的时候使用,需要配合in来使用,数组和对象都可以遍历。
< ul >
< li v-for ="book in books" > {{book.name}}li >
ul >
v-for的表达式支持一个可选参数作为当前项的索引:
< ul >
< li v-for ="(book,index) in books" > {{index}}-{{book.name}}li >
ul >
5.3.1 与v-if一样,v-for也可以用在内置标签上,将多个元素进行渲染。 遍历对象属性时,有两个可选参数,分别是键名和索引。 5.3.2 数组更新:当我们修改数组时,视图也会立即更。 Vue包含了一组观察数组非变异的方法: push()、pop()、shift()、unshift()、splice()、sort()、reverse()、filter()、concat()、slice() 它们返回的是一个新数组,在使用这些非变异的方法时,可以用新数组来替换原数组,相同的元素不会重新渲染。
app.books = app.books.filter(function (item){
return item.name.match(/JavaScript/);
});
关于通过索引修改更新数据,app.books[3]={...} 视图不会被更新,可以使用vue内置的set方法。
Vue.set(app.books,3,{name:'abc',author:'jack'});
如果是在组件化的方式,默认是没有导入Vue的,这是可以使用$set。 关于修改数组长度,app.books.length=1,视图也不会更新,可以使用splice来解决。 app.books.splice(1); 5.3.3 过滤与排序。 当你不想改变原数组,想通过一个数组的副本来做过滤或排序显示时,可以使用计算属性来返回过滤或排序后的数组。 5.4 方法与事件 @click调用的方法名后面可以不写(),vue提供了一个特殊变量$event,用于访问原生DOM事件。 5.4.2 修饰符。 Vue支持以下修饰符:.stop、.prevent、.capture、.self、once。修饰符可以串联使用。 【第6章,表单与v-model】 6.1 v-model:完成表单类控件的数据双向绑定,如input、select等。 备注:v-model也是一个特殊的语法糖,使用@input来替代v-model,可以实时更新。 单选按钮radio:分单独使用和组合使用,单独使用时,不需要绑定v-model,使用v-bind绑定一个布尔类型, 组合使用时需要v-model和value来配合使用,v-model绑定数据为选中的value值,字符串类型。
< input type ="radio" :checked ="picked" >
{data:{picked:true}}
< input type ="radio" v-model ="picked" value ="html" id ="html" >< label for ="html" > HTMLlabel >
< input type ="radio" v-model ="picked" value ="css" id ="css" >< label for ="css" > CSSlabel >
{data:{picked:'html'}}
复选框checked:复选框也分单选使用和组合使用,v-model都绑定到同一个数据,单选时值为布尔值, 组合使用时,需要value值,自动push到绑定的数组中,数据类型为字符串数组。
< input type ="checkbox" v-model ="checked" id ="checked" >
{data:{checked:false}}
< input type ="checkbox" v-model ="checked" value ="html" id ="html" >< label for ="html" > HTMLlabel >
< input type ="checkbox" v-model ="checked" value ="css" id ="css" >< label for ="css" > CSSlabel >
{data:{checked:['html','css']}}
选择列表select:下拉选择也分单选和多选两种方式,单选时绑定数据为字符串,多选时为字符串数组形式,是备选项,如果包含value属性,v-model会优先取value值,没有则取text值,multiple属性支持多选。
< select v-model ="selected" multiple >
< option > htmloption >
< option value ="js" > JavaScriptoption >
{data:{selected:['html','js']}}
在业务中经常用v-for动态输出,value和text也是用v-bind来动态输出的。
< option v-for ="option in options" :value ="option.value" > {{option.text}} option >
6.2 绑定值:单选按钮、复选框和选择列表在单独使用或单选的模式下,v-model绑定的值是一个静态字符串或布尔值, 但在业务中,有时需要绑定一个动态的数据,这时可以用v-bind来实现。
< input type ="radio" v-model ="picked" :value ="value" >
{data:{picked:false,value:123}} //选中后,picked值为123
< input type ="checkbox" v-model ="toggle" :true-value ="value1" :false-value ="value2" >
{data:{toggle:false,value1:'a',value2:'b'}} //选中时toggle为a,未选中时toggle为b
< select v-model ="selected" >
< option :value ="{number:123}" > 123option > //当选中时,app.selected是一个Object,app.selected.number===123
select >
6.3 修饰符:与事件的修饰符类似,v-model也有修饰符,用于控制数据同步的时机。 v-model.lazy:在输入框中,v-model默认是在input事件中同步输入框的数据,使用.lazy会转变为change事件中同步。 v-model.number:可以将输入转换为Number类型,v-model默认输入的数字其实也是字符串类型。 v-model.trim:可以自动过滤输入的首位空格。 【第7章,组件详解】 7.1.2 组件用法,组件需要注册后才能使用,分全局注册和局部注册,全局注册后,任何Vue实例都可以使用。
Vue.component("my-component"),{
template: '这里是组件内容
'
})
使用组件: //my-component就是注册的组件自定义标签名称。 在Vue实例中,使用components选项可以局部注册组件,组件也可以嵌套组件。
内无法直接使用组件,可以使用is特殊指令挂载组件,除了table还有ul、ol、select。
< div id ="app" >
< table >
< tbody is ="my-component" > tbody >
table >
div >
注册组件,除了template选项外,还可以有data、computed、methods等选项。
Vue.component('my-component',{
template:' < div > {{message}}div > ',
data: function(){
return { message: '组件内容' }; //这里data必须是函数用return返回
}
});
备注:如果data中引用了外部对象,那么这个对象就是共享的,所有修改同步,如果想复用组件,必须在内部返回一个新的对象。 7.2.1 使用props传递数据,组件间进行通信,父组件的模板中包含子组件,父组件要正向的向子组件传递数据或参数, 子组件根据接收不同数据渲染不同的内容或执行操作,这种正向传递数据的过程就是通过props来实现的。
< my-component message ='来自父组件的数据' >
Vue.component('my-component',{
props:['message'], //props的值分两种,字符串数组或对象。
template:' < div > {{message}}div > '
});
备注:props中声明的数据来自父级,组件data函数return的数据是组件自己的数据。 驼峰命名:当使用DOM模板时,props名称要转为短横分割命名。 例如:
< my-component warning-text ='来自父组件的数据' >
{props:['warningText'],template:' < div > {{warningText}}div > '}
直接传递数字、布尔值、数组、对象和通过v-bind绑定传递值区别?
< my-component message ='[1,2,3]' > my-component > //长度为7
< my-component :message ='[1,2,3]' > my-component > //长度为3
Vue.component('my-component',{
props:['message'],
template:' < div > {{message.length}}div > '
});
7.2.2 单项数据流,业务中经常遇到两种需要改变prop的情况,一种是父组件传递初始值进来, 子组件将它作为初始值保存起来,在自己的作用域下可以随意使用和修改。
< my-component :init-count ='1' > my-component >
Vue.component('my-component',{
props: ['initCount'],
template:' < div > {{ count }}div > ',
data: function(){
return {
count: this.initCount
}
}
}
另一种情况是prop作为需要被转变的原始值传入,这种情况用计算属性就可以了。
< my-component :width ='100' > my-component >
Vue.component('my-component',{
props:['width'],
template:' < div :style ="style" > 组件内容div > ',
computed:{
style:function(){
return {
width: this.width + 'px'
}
}
}
});
备注:在JavaScript中对象和数组是引用类型,指向同一个内存空间,所以props是对象和数组时, 在子组件内改变时会影响父组件的。 7.2.3 数据验证,props选项的值需要用对象,验证数据非法,会在控制台弹出警告。 验证的type类型包括:String、Number、Boolean、Object、Array、Function type也可以是一个自定义构造器,使用instanceof检测。
Vue.component('my-component',{
props:{
//必须是数字类型
propA: Number,
//必须是字符串或数字类型
propB: [String, Number],
//布尔类型,默认值为true
propC: {
type: Boolean,
default: true
},
//数字类型,必传参数
propD: {
type: Number,
required: ture
},
//数组或对象类型,默认值必须是一个函数来返回
propE: {
type: Array,
default: function(){
return [];
}
},
//自定义一个验证函数
propF: {
validator: function(value){
return value > 10;
}
}
}
});
7.3.1 组件通信自定义事件,当子组件需要向父组件传递数据时,就要用到自定义事件。 子组件用$emit()来触发事件,父组件用$on()来绑定监听子组件的事件。 父组件也可以直接在子组件的自定义标签上使用v-on来监听子组件触发的自定义事件。
< div id ="app" >
< p > 总数:{{ total }}p >
< my-component @increase ="handleGetTotal" @reduce ="handleGetTotal" > my-component >
div >
Vue.component('my-component',{
template: '\
< div > \
< button @click ="handleIncrease" > +1button > \
< button @click ="handleReduce" > -1button > \
div > ',
data: function(){
return {
counter: 0
}
},
methods:{
handleIncrease: function(){
counter++;
this.$emit('increase',this.counter);
},
handleReduce: function(){
counter--;
this.$emit('reduce',this.counter);
}
}
});
var app = new Vue({
el: '#app',
data: {
total: 0
},
methods: {
handleGetTotal: function(total){
this.total = total;
}
}
});
解析:increase和reduce是自定义事件标签,由子组件$emit来触发这个事件。 备注:v-on在组件上监听事件,可以使用.native修饰符表示监听的是一个原生事件。 7.3.2 使用v-model,在自定义组件上使用v-model指令。 v-model是语法糖,$emit()事件名是特殊的input。 v-model还可以用来创建自定义的表单输入组件,进行数据双向绑定。 双向绑定要满足两个要求:接收一个value属性,在有新的value时触发input事件。
< div id ="app" >
< p > 总数:{{ total }}p >
< my-component v-model ="total" > my-component >
< button @click ="handleReduce" > -1button >
div >
Vue.component('my-component',{
props: ['value'],
template: ' < input :value ="value" @input ="updateValue" > ',
methods: {
updateValue: function(event){
this.$emit('input',event.target.value);
}
}
});
var app = new Vue({
el: '#app',
data: {
total: 0
},
methods: {
handleReduce: function(){
this.total--;
}
}
});
7.3.3 非父子组件通信,非父子组件一般有两种,兄弟组件和跨多级组件。 使用一个空的Vue实例作为中央事件总线(bus),也就是一个中介,在实例初始化时让bus获取一次, 任何时间,任何组件就可以从中直接使用了。
< div id ="app" >
{{ message }}
< component-a > component-a >
div >
var bus = new Vue();
Vue.component('component-a',{
template: ' < button @click ="handleEvent" > 传递事件button > ',
methods: {
handleEvent: function(){
bus.$emit('on-message','来自组件component-a的内容');
}
}
});
var app = new Vue({
el: '#app',
data: {
message: ''
},
mounted: function(){
var _this = this;
//在实例初始化时,监听来自bus实例的事件
bus.$on('on-message',function(msg){
_this.message = msg;
});
}
});
父链:在子组件中,使用this.$parent可以直接访问该组件的父实例或组件, this.$parent.message = '来自组件component-a的内容'; 子组件索引:父组件也可以通过this.$children访问它所有的子组件。 在父组件模板中,子组件标签上使用ref指定一个名称,并在父组件内通过this.$refs来访问指定名称的子组件。
< component-a ref ="comA" > component-a >
this.$refs.comA.message;
备注:除了中央事件总线bus,父链和子组件索引也可以实现组件间通信,但业务中子组件尽可能避免依赖父组件。 $refs是非响应式的,直接访问子组件,避免在模板或计算属性中使用。 7.4.1 使用slot分发内容,什么是slot? 当需要让组件组合使用,混合父组件的内容与子组件的模板时,就会用到slot,这个过程叫做内容分发。 以为例,它有两个特点:组件不知道它的挂载点会有什么内容,挂载点的内容是有的父组件决定的。组件很可能有它自己的模板。 备注:props传递数据、events触发事件和slot内容分发就构成了Vue组件的3个API来源, 在复杂的组件也是由这3部分构成的。 7.4.2 作用域,父组件模板的内容是在父组件作用域内编译,子组件模板的内容是在子组件作用域内编译。 7.4.3 slot用法 单个Slot,在子组件内使用特殊的元素就可以为这个子组件开启一个slot插槽, 在父组件模板里插入在子组件标签内的所有内容将替代子组件的标签及它的内容。
< div id ="app" >
< child-component >
< p > 分发的内容p >
< p > 更多分发的内容p >
child-component >
div >
< script >
Vue.component( ' child-component ' ,{
template: ' \
\
\
如果父组件没有插入内容,我将作为默认出现
\
\
'
});
var app = new Vue({
el: ' #app '
});
script >
渲染结果为:
< div id ="app" >
< div >
< p > 分发的内容p >
< p > 更多分发的内容p >
div >
div >
注意:子组件内的备用内容,它的作用域是子组件本身。 具名Slot:给元素指定一个name后可以分发多个内容,具名Slot可以与单个Slot共存。
< div id ="app" >
< child-component >
< h2 slot ="header" > 标题h2 >
< p > 正文内容p >
< p > 更多的正文内容p >
< div slot ="footer" > 底部信息div >
child-component >
div >
< script >
Vue.component( ' child-component ' ,{
template: ' \
'
});
var app = new Vue({
el: ' #app '
});
script >
备注:slot没有使用name特性,所有内容将作为默认slot出现,有name特性的指定位置出现。 7.4.4 作用域插槽,是一种特殊的slot,使用一个可以复用的模板替换已渲染元素。
< div id ="app" >
< child-component >
< template scope ="props" >
< p > 来自父组件的内容p >
< p > {{ props.msg }}p >
template >
child-component >
div >
< script >
Vue.component( ' child-component ' ,{
template: ' \
\
\
'
});
var app = new Vue({
el: ' #app '
});
script >
备注:子组件中有类似props传递数据方式,声明参数msg数据传递给插槽, 父组件中使用了元素,而且拥有一个scope特性来接收子组件插槽的数据。 例:作用域插槽更具代表性的用例是列表组件,允许组件自定义应该如何渲染列表每一项。
< div id ="app" >
< my-list :books ="books" >
< template slot ="book" scope ="props" >
< li > {{ props.bookname }}li >
template >
< my-list >
div >
< script >
Vue.component( ' my-list ' ,{
props:{
books:{
type:Array,
default : function (){
return [];
}
}
},
template: ' \
'
});
var app = new Vue({
el: ' #app ' ,
data:{
books:[
{ name: ' 《Vue.js实战》 ' },
{ name: ' 《JavaScript语言精粹》 ' },
{ name: ' 《HTML5/CSS3基础》 ' }
]
}
});
script >
备注:作用域插槽也可以是具名的Slot。 7.4.5 访问slot,用来访问被slot分发的内容的方法$slots。
mounted: function(){
var header = this.$slots.header;
var main = this.$slots.default;
var footer = this.$slots.footer;
console.log(footer);
console.log(footer[0].elm.innerHTML);
}
备注:通过$slots可以访问某个具名slot,this.$slots.default包括了所有没有被包含在具名slot中的节点。 在用render函数创建组件时比较有用。 7.5.1 递归组件,组件在它的模板内可以递归地调用自己,只有给组件设置name的选项就可以了, 必须给一个条件来限制递归数量,否则会抛出异常。 7.5.2 内联模板,给组件标签使用inline-template特性,组件就会把它的内容当作模板,而不是把它内容分发。 备注:在父组件和子组件中声明的数据,都可以直接渲染,如果同名优先使用子组件数据,不建议使用内联模板。 7.5.3 动态组件,Vue.js提供了一个特殊的元素用来动态挂载不同的组件,使用is特性来选择要挂载的组件。
< div id ="app" >
< component :is ="currentView" > component >
< button @click ="handleChangeView('A')" > 切换到Abutton >
< button @click ="handleChangeView('B')" > 切换到Bbutton >
< button @click ="handleChangeView('C')" > 切换到Cbutton >
div >
< script >
var app = new Vue({
el: ' #app ' ,
components: [
comA: {
template: ' 组件A
'
},
comB: {
template: ' 组件B
'
},
comC: {
template: ' 组件C
'
}
],
data:{
currentView : ' comA '
},
methods:{
handleChangeView: function (component){
this .currentView = ' com ' + component;
}
}
});
script >
动态的改变currentView的值就可以动态挂载组件了,也可以直接绑定在组件对象上。
< div id ="app" >
< component :is ="currentView" > component >
div >
< script >
var Home = { template: ' Welcome home!
' }
var app = new Vue({
el: ' #app ' ,
data: {
currentView: Home
}
});
script >
7.5.4 异步组件,Vue.js允许将组件定义为一个工厂函数,动态地解析组件, Vue.js只在组件需要渲染时触发工厂函数,并且把结果缓存起来,用于后面的再次渲染。 7.6.1 $nextTick,当v-if="true"时div不会被立即创建出来,这时操作dom会报错, $nextTick(function(){}),就是用来知道什么时候DOM更新完成的。 7.6.2 X-Templates,Vue提供了另外一种定义模板的方式,在
你可能感兴趣的:(Vue.js2.0快速入门笔记)
QQ群采集助手,精准引流必备神器
2401_87347160
其他 经验分享
功能概述微信群查找与筛选工具是一款专为微信用户设计的辅助工具,它通过关键词搜索功能,帮助用户快速找到相关的微信群,并提供筛选是否需要验证的群组的功能。主要功能关键词搜索:用户可以输入关键词,工具将自动查找包含该关键词的微信群。筛选功能:工具提供筛选机制,用户可以选择是否只显示需要验证或不需要验证的群组。精准引流:通过上述功能,用户可以更精准地找到目标群组,进行有效的引流操作。3.设备需求该工具可以
element实现动态路由+面包屑
软件技术NINI
vue案例 vue.js 前端
el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi
理解Gunicorn:Python WSGI服务器的基石
范范0825
ipython linux 运维
理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico
腾讯云技术深度探索:构建高效云原生微服务架构
我的运维人生
云原生 架构 腾讯云 运维开发 技术共享
腾讯云技术深度探索:构建高效云原生微服务架构在当今快速发展的技术环境中,云原生技术已成为企业数字化转型的关键驱动力。腾讯云作为行业领先的云服务提供商,不断推出创新的产品和技术,助力企业构建高效、可扩展的云原生微服务架构。本文将深入探讨腾讯云在微服务领域的最新进展,并通过一个实际案例展示如何在腾讯云平台上构建云原生应用。腾讯云微服务架构概览腾讯云微服务架构基于云原生理念,旨在帮助企业快速实现应用的容
使用Faiss进行高效相似度搜索
llzwxh888
faiss python
在现代AI应用中,快速和高效的相似度搜索是至关重要的。Faiss(FacebookAISimilaritySearch)是一个专门用于快速相似度搜索和聚类的库,特别适用于高维向量。本文将介绍如何使用Faiss来进行相似度搜索,并结合Python代码演示其基本用法。什么是Faiss?Faiss是一个由FacebookAIResearch团队开发的开源库,主要用于高维向量的相似性搜索和聚类。Faiss
人工智能时代,程序员如何保持核心竞争力?
jmoych
人工智能
随着AIGC(如chatgpt、midjourney、claude等)大语言模型接二连三的涌现,AI辅助编程工具日益普及,程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作,也有人认为AI是提高效率的得力助手。面对这一趋势,程序员应该如何应对?是专注于某个领域深耕细作,还是广泛学习以适应快速变化的技术环境?又或者,我们是否应该将重点转向AI无法轻易替代的软技能?让我们一起探讨程序员
Python快速入门 —— 第三节:类与对象
孤华暗香
Python快速入门 python 开发语言
第三节:类与对象目标:了解面向对象编程的基础概念,并学会如何定义类和创建对象。内容:类与对象:定义类:class关键字。类的构造函数:__init__()。类的属性和方法。对象的创建与使用。示例:classStudent:def__init__(self,name,age,major):self.name
Faiss Tips:高效向量搜索与聚类的利器
焦习娜Samantha
FaissTips:高效向量搜索与聚类的利器faiss_tipsSomeusefultipsforfaiss项目地址:https://gitcode.com/gh_mirrors/fa/faiss_tips项目介绍Faiss是由FacebookAIResearch开发的一个用于高效相似性搜索和密集向量聚类的库。它支持多种硬件平台,包括CPU和GPU,能够在海量数据集上实现快速的近似最近邻搜索(AN
高级 ECharts 技巧:自定义图表主题与样式
SnowMan1993
echarts 信息可视化 数据分析
ECharts是一个强大的数据可视化库,提供了多种内置主题和样式,但你也可以根据项目的设计需求,自定义图表的主题与样式。本文将介绍如何使用ECharts自定义图表主题,以提升数据可视化的吸引力和一致性。1.什么是ECharts主题?ECharts的主题是指定义图表样式的配置项,包括颜色、字体、线条样式等。通过预设主题,你可以快速更改图表的整体风格,而自定义主题则允许你在此基础上进行个性化设置。2.
基于CODESYS的多轴运动控制程序框架:逻辑与运动控制分离,快速开发灵活操作
GPJnCrbBdl
python 开发语言
基于codesys开发的多轴运动控制程序框架,将逻辑与运动控制分离,将单轴控制封装成功能块,对该功能块的操作包含了所有的单轴控制(归零、点动、相对定位、绝对定位、设置当前位置、伺服模式切换等等)。程序框架由主程序按照状态调用分归零模式、手动模式、自动模式、故障模式,程序状态的跳转都已完成,只需要根据不同的工艺要求完成所需的动作即可。变量的声明、地址的规划都严格按照C++的标准定义,能帮助开发者快速
果然只有离职的时候,才有人敢说真话!
return2ok
今天公司出了神贴。今天中午吃饭,同事问我看了论坛上的神贴了吗?什么帖子?我问。同事显得很惊讶,你居然没看,现在那个帖子可能会成为年度最佳帖子。这么厉害?我等不及了,饭没吃完就快速的奔向办公室,打开公司论坛,我要一睹这个帖子的神奇。写这帖子的童鞋胆儿真肥。这哪里是一个帖子,这是很多个帖子,组成了一个系列。某人从公司文化、管理、人事、项目管理等多个方面分析了公司的概况,并抨击了公司的各种弊端,并提出了
如何选择最适合你的项目研发管理软件?TAPD卓越版全面解析
北京云巴巴信息技术有限公司
产品经理 需求分析
在当今快速发展的科技时代,项目研发管理软件已成为企业不可或缺的重要工具。面对市场上琳琅满目的产品,如何选择一款适合自己团队的项目研发管理软件呢?本文将围绕项目研发管理软件的选择标准,重点介绍TAPD卓越版的特点、优势以及使用体验,让你更好地理解和选择适合自己的项目研发管理软件。项目研发管理软件的选择标准在选择项目研发管理软件时,我们需要考虑以下几个方面的因素:功能全面性:软件是否覆盖了从需求管理、
2022-08-28
蔚蓝一片晴
初三暑假培训收获点滴从8月25至8月27日三天两晚的培训结束了,回到家中,该静下心来整理一下触动心灵的收获,成为成长的积淀。1.在优秀团队中快速成长与提升,做一名反思成长型教师一名专业型教师的教学指导包括了教学原理知识、案例知识、策略知识。面对教学中的遇到的有趣的情形、问题会去研究其理,寻找更好的教法学法对策。从新手到成熟型教师,再走向专业型教师,需要的是觉醒与反思,多进行案例研究,从案例中观察、
你可能遗漏的一些C#/.NET/.NET Core知识点
追逐时光者
C# .NET DotNetGuide编程指南 c# .net .netcore microsoft
前言在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NETCore拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。拾遗补漏GitHub开源地址https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/D
Java面试题精选:消息队列(二)
芒果不是芒
Java面试题精选 java kafka
一、Kafka的特性1.消息持久化:消息存储在磁盘,所以消息不会丢失2.高吞吐量:可以轻松实现单机百万级别的并发3.扩展性:扩展性强,还是动态扩展4.多客户端支持:支持多种语言(Java、C、C++、GO、)5.KafkaStreams(一个天生的流处理):在双十一或者销售大屏就会用到这种流处理。使用KafkaStreams可以快速的把销售额统计出来6.安全机制:Kafka进行生产或者消费的时候会
2024.8.22 Python,链表两数之和,链表快速反转,二叉树的深度,二叉树前中后序遍历,N叉树递归遍历,翻转二叉树
RaidenQ
python 链表 开发语言
1.链表两数之和输入:l1=[2,4,3],l2=[5,6,4]输出:[7,0,8]解释:342+465=807.示例2:输入:l1=[0],l2=[0]输出:[0]示例3:输入:l1=[9,9,9,9,9,9,9],l2=[9,9,9,9]输出:[8,9,9,9,0,0,0,1]昨天的这个题,用自己的办法写的麻烦的要死,然后刚才一看chat归类的办法,感觉自己像个智障。classListNode
esp32开发快速入门 8 : MQTT 的快速入门,基于esp32实现MQTT通信
z755924843
ESP32开发快速入门 服务器 网络 运维
MQTT介绍简介MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联
Armv8.3 体系结构扩展--原文版
代码改变世界ctw
ARM-TEE-Android armv8 嵌入式 arm架构 安全架构 芯片 Trustzone Secureboot
快速链接:.ARMv8/ARMv9架构入门到精通-[目录]付费专栏-付费课程【购买须知】:个人博客笔记导读目录(全部)TheArmv8.3architectureextensionTheArmv8.3architectureextensionisanextensiontoArmv8.2.Itaddsmandatoryandoptionalarchitecturalfeatures.Somefeat
Spring MVC 全面指南:从入门到精通的详细解析
一杯梅子酱
技术栈学习 spring mvc java
引言:SpringMVC,作为Spring框架的一个重要模块,为构建Web应用提供了强大的功能和灵活性。无论是初学者还是有一定经验的开发者,掌握SpringMVC都将显著提升你的Web开发技能。本文旨在为初学者提供一个全面且易于理解的学习路径,通过详细的知识点分析和实际案例,帮助你快速上手SpringMVC,让学习过程既深刻又高效。一、SpringMVC简介1.1什么是SpringMVC?Spri
JavaScript `Map` 和 `WeakMap`详细解释
跳房子的前端
JavaScript 原生方法 javascript 前端 开发语言
在JavaScript中,Map和WeakMap都是用于存储键值对的数据结构,但它们有一些关键的不同之处。MapMap是一种可以存储任意类型的键值对的集合。它保持了键值对的插入顺序,并且可以通过键快速查找对应的值。Map提供了一些非常有用的方法和属性来操作这些数据对:set(key,value):将一个键值对添加到Map中。如果键已经存在,则更新其对应的值。get(key):获取指定键的值。如果键
自动写论文的网站推荐这5款实用类工具
小猪包333
写论文 人工智能 深度学习 计算机视觉 AI写作
在当今学术研究和写作领域,AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿,还能进行内容优化、查重和排版等操作。以下是五款实用类工具推荐,特别是千笔-AIPassPaper。1.千笔-AIPassPaper千笔-AIPassPaper是一款功能强大且全面的AI论文写作助手,用户只需输入基本的研究需求和关键词,便能迅速生成一篇完整的论文。该工具利用先进的
推荐3家毕业AI论文可五分钟一键生成!文末附免费教程!
小猪包333
写论文 人工智能 AI写作 深度学习 计算机视觉
在当前的学术研究和写作领域,AI论文生成器已经成为许多研究人员和学生的重要工具。这些工具不仅能够帮助用户快速生成高质量的论文内容,还能进行内容优化、查重和排版等操作。以下是三款值得推荐的AI论文生成器:千笔-AIPassPaper、懒人论文以及AIPaperPass。千笔-AIPassPaper千笔-AIPassPaper是一款基于深度学习和自然语言处理技术的AI写作助手,旨在帮助用户快速生成高质
AI论文写作推荐哪个好?分享5款AI论文写作带数据图表网站
小猪包333
写论文 人工智能 深度学习 计算机视觉
在当今学术研究和写作领域,AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿,还能进行内容优化、查重和排版等操作。以下是五款推荐的AI论文写作工具,包括千笔-AIPassPaper。千笔-AIPassPaper千笔-AIPassPaper是一款功能强大的AI论文写作助手,旨在帮助用户快速生成高质量的论文内容。AI论文,免费大纲,10分钟3万字https:
华为云分布式缓存服务DCS 8月新特性发布
华为云PaaS服务小智
华为云 分布式 缓存
分布式缓存服务(DistributedCacheService,简称DCS)是华为云提供的一款兼容Redis的高速内存数据处理引擎,为您提供即开即用、安全可靠、弹性扩容、便捷管理的在线分布式缓存能力,满足用户高并发及数据快速访问的业务诉求。此次为大家带来DCS8月的特性更新内容,一起来看看吧!
【算法练习】IDEA集成leetcode插件实现快速刷
2401_84102892
2024年程序员学习 算法 intellij-idea leetcode
============点击右侧边leetcode->设置->配置地址、用户名、密码、存放目录、文件模板用户名要登录后在账号信息里看模板代码1.codefilename!velocityTool.camelC
效率神器来了:AI工具手把手教你快速提升工作效能
kkai人工智能
人工智能 学习 媒体 ai chatgpt
随着科技的进步,AI工具已经成为提升工作效率的关键手段。本文将介绍一些实用的AI工具和方法,帮助你自动化繁琐的重复性任务、优化数据管理、促进团队协作与沟通,并提升决策质量。背景:OOPAI-免费问答学习交流-GPT自动化重复性任务Zapier:Zapier可以自动化多个应用程序之间的工作流程。例如,它能自动将Gmail中的附件保存至GoogleDrive,或在你发布新文章时,自动分享至社交媒体平台
助力新能源汽车产业发展,2025第五届广州国际新能源汽车产业智能制造技术展览会将于11月在广州召开
ws201907
制造 汽车
助力新能源汽车产业发展,2025第五届广州国际新能源汽车产业智能制造技术展览会将于11月在广州召开伴随着全球新一轮科技革命和产业变革,汽车与能源、半导体、物联网等领域有关技术加速融合,新能源汽车已成为全球汽车产业转型升级的主要方向。近年来,在相关政策的影响下,新能源汽车市场呈现出快速增长的态势,市场规模不断扩大。截至2020年,中国新能源汽车保有量已超过500万辆,成为全球最大的新能源汽车市场。随
电子技术引领汽车智能新浪潮,尽在AUTO TECH 2025广州国际汽车电子技术盛会
JSZNZZ
汽车
随着科技的持续进步,汽车电子行业正迎来深刻的转型。这一变革的显著特征是从传统的机械控制方式逐渐过渡到智能化和网联化的管理系统。这种转变不仅提升了汽车电子产品的技术复杂性,还极大地丰富了其创新性和功能性。在这个过程中,产品开发的质量和效率变得尤为关键,它们直接决定了企业在激烈竞争环境中的市场地位和商业成功。面对快速变化的市场需求,汽车电子行业在产品开发过程中遇到了多方面的挑战。其中,信息孤岛是一个显
深度 Qlearning:在直播推荐系统中的应用
AGI通用人工智能之禅
程序员提升自我 硅基计算 碳基计算 认知计算 生物计算 深度学习 神经网络 大数据 AIGC AGI LLM Java Python 架构设计 Agent 程序员实现财富自由
深度Q-learning:在直播推荐系统中的应用关键词:深度Q-learning,强化学习,直播推荐系统,个性化推荐1.背景介绍1.1问题的由来随着互联网技术的飞速发展,直播平台如雨后春笋般涌现。面对海量的直播内容,用户很难快速找到自己感兴趣的内容。因此,个性化推荐系统在直播平台中扮演着越来越重要的角色。1.2研究现状目前,主流的个性化推荐算法包括协同过滤、基于内容的推荐等。这些方法在一定程度上缓
阿里巴巴商品搜索API返回值实战解析
weixin_43841111
api java 前端 javascript
在解析阿里巴巴中国站商品搜索API返回值并进行实战时,可以从以下几个方面入手:一、了解API返回值的结构基本信息返回值通常包含商品的标题、价格、库存、图片链接等基本信息。这些信息对于了解商品的概况非常重要。例如,商品标题可以让你快速了解商品的名称和特点,价格信息可以帮助你进行价格比较和成本核算。详细描述可能包括商品的详细描述、规格参数、使用方法等。这些信息对于深入了解商品的特性和功能非常有帮助。比
github中多个平台共存
jackyrong
github
在个人电脑上,如何分别链接比如oschina,github等库呢,一般教程之列的,默认
ssh链接一个托管的而已,下面讲解如何放两个文件
1) 设置用户名和邮件地址
$ git config --global user.name "xx"
$ git config --global user.email "
[email protected] "
ip地址与整数的相互转换(javascript)
alxw4616
JavaScript
//IP转成整型
function ip2int(ip){
var num = 0;
ip = ip.split(".");
num = Number(ip[0]) * 256 * 256 * 256 + Number(ip[1]) * 256 * 256 + Number(ip[2]) * 256 + Number(ip[3]);
n
读书笔记-jquey+数据库+css
chengxuyuancsdn
html jquery oracle
1、grouping ,group by rollup, GROUP BY GROUPING SETS区别
2、$("#totalTable tbody>tr td:nth-child(" + i + ")").css({"width":tdWidth, "margin":"0px", &q
javaSE javaEE javaME == API下载
Array_06
java
oracle下载各种API文档:
http://www.oracle.com/technetwork/java/embedded/javame/embed-me/documentation/javame-embedded-apis-2181154.html
JavaSE文档:
http://docs.oracle.com/javase/8/docs/api/
JavaEE文档:
ht
shiro入门学习
cugfy
java Web 框架
声明本文只适合初学者,本人也是刚接触而已,经过一段时间的研究小有收获,特来分享下希望和大家互相交流学习。
首先配置我们的web.xml代码如下,固定格式,记死就成
<filter>
<filter-name>shiroFilter</filter-name>
&nbs
Array添加删除方法
357029540
js
刚才做项目前台删除数组的固定下标值时,删除得不是很完整,所以在网上查了下,发现一个不错的方法,也提供给需要的同学。
//给数组添加删除
Array.prototype.del = function(n){
navigation bar 更改颜色
张亚雄
IO
今天郁闷了一下午,就因为objective-c默认语言是英文,我写的中文全是一些乱七八糟的样子,到不是乱码,但是,前两个自字是粗体,后两个字正常体,这可郁闷死我了,问了问大牛,人家告诉我说更改一下字体就好啦,比如改成黑体,哇塞,茅塞顿开。
翻书看,发现,书上有介绍怎么更改表格中文字字体的,代码如下
 
unicode转换成中文
adminjun
unicode 编码转换
在Java程序中总会出现\u6b22\u8fce\u63d0\u4ea4\u5fae\u535a\u641c\u7d22\u4f7f\u7528\u53cd\u9988\uff0c\u8bf7\u76f4\u63a5这个的字符,这是unicode编码,使用时有时候不会自动转换成中文就需要自己转换了使用下面的方法转换一下即可。
/**
* unicode 转换成 中文
一站式 Java Web 框架 firefly
aijuans
Java Web
Firefly是一个高性能一站式Web框架。 涵盖了web开发的主要技术栈。 包含Template engine、IOC、MVC framework、HTTP Server、Common tools、Log、Json parser等模块。
firefly-2.0_07修复了模版压缩对javascript单行注释的影响,并新增了自定义错误页面功能。
更新日志:
增加自定义系统错误页面功能
设计模式——单例模式
ayaoxinchao
设计模式
定义
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
分析
从定义中可以看出单例的要点有三个:一是某个类只能有一个实例;二是必须自行创建这个实例;三是必须自行向系统提供这个实例。
&nb
Javascript 多浏览器兼容性问题及解决方案
BigBird2012
JavaScript
不论是网站应用还是学习js,大家很注重ie与firefox等浏览器的兼容性问题,毕竟这两中浏览器是占了绝大多数。
一、document.formName.item(”itemName”) 问题
问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document.formName.elements ["elementName&quo
JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
bijian1013
junit4.11 单元测试
下载了最新的JUnit版本,是4.11,结果尝试使用发现总是报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing这样的错误,上网查了一下,一般的解决方案是,换一个低一点的版本就好了。还有人说,是缺少hamcrest的包。去官网看了一下,如下发现:
[Zookeeper学习笔记之二]Zookeeper部署脚本
bit1129
zookeeper
Zookeeper伪分布式安装脚本(此脚本在一台机器上创建Zookeeper三个进程,即创建具有三个节点的Zookeeper集群。这个脚本和zookeeper的tar包放在同一个目录下,脚本中指定的名字是zookeeper的3.4.6版本,需要根据实际情况修改):
#!/bin/bash
#!!!Change the name!!!
#The zookeepe
【Spark八十】Spark RDD API二
bit1129
spark
coGroup
package spark.examples.rddapi
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.SparkContext._
object CoGroupTest_05 {
def main(args: Array[String]) {
v
Linux中编译apache服务器modules文件夹缺少模块(.so)的问题
ronin47
modules
在modules目录中只有httpd.exp,那些so文件呢?
我尝试在fedora core 3中安装apache 2. 当我解压了apache 2.0.54后使用configure工具并且加入了 --enable-so 或者 --enable-modules=so (两个我都试过了)
去make并且make install了。我希望在/apache2/modules/目录里有各种模块,
Java基础-克隆
BrokenDreams
java基础
Java中怎么拷贝一个对象呢?可以通过调用这个对象类型的构造器构造一个新对象,然后将要拷贝对象的属性设置到新对象里面。Java中也有另一种不通过构造器来拷贝对象的方式,这种方式称为
克隆。
Java提供了java.lang.
读《研磨设计模式》-代码笔记-适配器模式-Adapter
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
package design.pattern;
/*
* 适配器模式解决的主要问题是,现有的方法接口与客户要求的方法接口不一致
* 可以这样想,我们要写这样一个类(Adapter):
* 1.这个类要符合客户的要求 ---> 那显然要
HDR图像PS教程集锦&心得
cherishLC
PS
HDR是指高动态范围的图像,主要原理为提高图像的局部对比度。
软件有photomatix和nik hdr efex。
一、教程
叶明在知乎上的回答:
http://www.zhihu.com/question/27418267/answer/37317792
大意是修完后直方图最好是等值直方图,方法是HDR软件调一遍,再结合不透明度和蒙版细调。
二、心得
1、去除阴影部分的
maven-3.3.3 mvn archetype 列表
crabdave
ArcheType
maven-3.3.3 mvn archetype 列表
可以参考最新的:http://repo1.maven.org/maven2/archetype-catalog.xml
[INFO] Scanning for projects...
[INFO]
linux shell 中文件编码查看及转换方法
daizj
shell 中文乱码 vim 文件编码
一、查看文件编码。
在打开文件的时候输入:set fileencoding
即可显示文件编码格式。
二、文件编码转换
1、在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式
&
MySQL--binlog日志恢复数据
dcj3sjt126com
binlog
恢复数据的重要命令如下 mysql> flush logs; 默认的日志是mysql-bin.000001,现在刷新了重新开启一个就多了一个mysql-bin.000002
数据库中数据表数据迁移方法
dcj3sjt126com
sql
刚开始想想好像挺麻烦的,后来找到一种方法了,就SQL中的 INSERT 语句,不过内容是现从另外的表中查出来的,其实就是 MySQL中INSERT INTO SELECT的使用
下面看看如何使用
语法:MySQL中INSERT INTO SELECT的使用
1. 语法介绍
有三张表a、b、c,现在需要从表b
Java反转字符串
dyy_gusi
java 反转字符串
前几天看见一篇文章,说使用Java能用几种方式反转一个字符串。首先要明白什么叫反转字符串,就是将一个字符串到过来啦,比如"倒过来念的是小狗"反转过来就是”狗小是的念来过倒“。接下来就把自己能想到的所有方式记录下来了。
1、第一个念头就是直接使用String类的反转方法,对不起,这样是不行的,因为Stri
UI设计中我们为什么需要设计动效
gcq511120594
UI linux
随着国际大品牌苹果和谷歌的引领,最近越来越多的国内公司开始关注动效设计了,越来越多的团队已经意识到动效在产品用户体验中的重要性了,更多的UI设计师们也开始投身动效设计领域。
但是说到底,我们到底为什么需要动效设计?或者说我们到底需要什么样的动效?做动效设计也有段时间了,于是尝试用一些案例,从产品本身出发来说说我所思考的动效设计。
一、加强体验舒适度
嗯,就是让用户更加爽更加爽的用
JBOSS服务部署端口冲突问题
HogwartsRow
java 应用服务器 jboss server EJB3
服务端口冲突问题的解决方法,一般修改如下三个文件中的部分端口就可以了。
1、jboss5/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml
2、./server/default/deploy/jbossweb.sar/server.xml
3、.
第三章 Redis/SSDB+Twemproxy安装与使用
jinnianshilongnian
ssdb reids twemproxy
目前对于互联网公司不使用Redis的很少,Redis不仅仅可以作为key-value缓存,而且提供了丰富的数据结果如set、list、map等,可以实现很多复杂的功能;但是Redis本身主要用作内存缓存,不适合做持久化存储,因此目前有如SSDB、ARDB等,还有如京东的JIMDB,它们都支持Redis协议,可以支持Redis客户端直接访问;而这些持久化存储大多数使用了如LevelDB、RocksD
ZooKeeper原理及使用
liyonghui160com
ZooKeeper是Hadoop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调(Coordination)服务,与之对应的Google的类似服务叫Chubby。今天这篇文章分为三个部分来介绍ZooKeeper,第一部分介绍ZooKeeper的基本原理,第二部分介绍ZooKeeper
程序员解决问题的60个策略
pda158
框架 工作 单元测试
根本的指导方针
1. 首先写代码的时候最好不要有缺陷。最好的修复方法就是让 bug 胎死腹中。
良好的单元测试
强制数据库约束
使用输入验证框架
避免未实现的“else”条件
在应用到主程序之前知道如何在孤立的情况下使用
日志
2. print 语句。往往额外输出个一两行将有助于隔离问题。
3. 切换至详细的日志记录。详细的日
Create the Google Play Account
sillycat
Google
Create the Google Play Account
Having a Google account, pay 25$, then you get your google developer account.
References:
http://developer.android.com/distribute/googleplay/start.html
https://p
JSP三大指令
vikingwei
jsp
JSP三大指令
一个jsp页面中,可以有0~N个指令的定义!
1. page --> 最复杂:<%@page language="java" info="xxx"...%>
* pageEncoding和contentType:
> pageEncoding:它