首页 文章 精选 留言 我的

精选列表

搜索[webpack入门],共10000篇文章
优秀的个人博客,低调大师

python-面向对象入门

一、面向对象介绍 介绍面向对象之前,先来回顾一下以前学的面向过程的编程思想 面向过程编程: 核心是过程二字,过程指的是解决问题的步骤,即先干什么,再干什么后干什么,基于该思想编程就好比是在设计一条流水线,是一种机械化的思维方式 优点:复杂的问题流程化,进而简单化 缺点:可扩展性差 现在轮到面向对象的编程思想了! 面向对象编程,核心是对象二字,对象是特征与技能的结合体,基于该思想编写程序(脑子里始终想的是对象二字),就好比创造一个世界,在上帝眼里任何存在的事物都是对象,任何不存在的事物都可以造出来,是一种上帝式的思维方式 优点:可扩展性强 缺点:编程的复杂度要高于面向过程 二、类 对象是特征与技能的结合体,而类则是一系列对象相同的特征与技能的结合体 强调: 1.对象是具体存在的事物,而类则是一个抽象概念 2.站在不同的角度总结出的类与对象是不同的 在现实世界中,先有一个个具体存在的对象,然后随着人类文明的发展才总结出类的概念 在程序中,先定义类,后调用类来产生对象 类体中最常见的就是变量和函数的定义,但类体中可以存在任意的python代码。 定义类: class语句创建一个新的类的定义,后面跟着冒号“:” class Student: #相同的特征 school = 'superschool' #相同的技能 def choose_course(self): print('choosing course') 类体代码会在类定义阶段立即执行,会产生一个类名称空间,用来将类体代码都丢进去。 查看类的名称空间: print(Student.__dict__) 修改,添加,删除 Student.school = 'SUPPER' Student.country = 'China'del Student.country 总结类: 1.类本质上就是一个名称空间,或者说是一个用来存放变量和函数的容器 2.类的用途之一就是当做名称空间从其内部取出名字来使用 3.类的用途之二就是调用类来产生对象 对象: 调用类的过程称之为类的实例化,调用类的返回值称之为类的一个对象/实例 stu1 = Student() 为对象定制自己独有的特性: stu1.name='李铁蛋' stu1.age=18 stu1.sex='male' stu2.name='赵钢弹' stu2.age=38 stu2.sex='female' 大家也注意到了,这里存在了冗余代码,我们来优化一下 def init(obj,name,age,sex): obj.name = name obj.age = age obj.sex = sex 产生的对象通过每次调用函数能够更简便,还有没有更好的方法呢?答案肯定是有的 class Student: #相同的特征 school = 'oldboy' # stu1,'李铁蛋',18,'male' def __init__(obj, name, age, sex): obj.name = name #stu1.name='李铁蛋' obj.age = age #stu1.age=18 obj.sex = sex #stu1.sex='male' #相同的技能 def choose_course(self): print('choosing course') 调用类会先产生一个空对象stul,然后返回,触发类中的__init__的执行,将对象连同调用类括号里指定的参数一同传入 stu1=Student('李铁蛋',18,'male') #__init__(stu1,'李铁蛋',18,'male') stu2=Student('赵钢弹',38,'female') #__init__(stu2,'赵弹',38,'female') 总结__init__的功能:是在实例化时就为对象初始自己独有的属性,要注意的是不能有返回值,默认返回None 属性查找: 1.先从对象自己的名称空间中找,没有则去所属的类中找 2.类中定义的变量是所有对象共享的,对象可以用来用,类也可以来使用,类一旦改变自己的数据属性的值,所有对象都能感知到。 绑定方法: 类中定义的函数是是类的函数属性,类可以用,类调用就是一个普通函数,但其实类中定义的函数是给对象用的,而且是绑定给对象用的 1.类的函数:该传几个参数就传几个 2.绑定方法,指向类的函数:特殊之处是绑定给谁就由谁来调用,谁来调用就会当做第一个参数自动传入。 三、一切皆对象 在python3中统一了类与类型的概念 class Foo: pass print(Foo) obj=Foo() print(type(obj)) print(int) age=10 #age=int(10) print(type(age)) l1=[1,2,3] #l1=list([1,2,3]) # print(type(l1)) # l1.append(4) # print(l1) l1.append(4) # list.append(l1,4) print(l1) l1.append就相当于调用了list类中的append函数 面向对象后期继续补充,七夕刚好new个对象!焚膏油以继晷,恒兀兀以穷年。

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

zookeeper入门与Doubbo(一)

1.zookeeper的特性 一致性:数据一致性,数据按照顺序分批入库 原子性:事务要么成功,要么失败,不会局部化 单一视图:客户端连接集群中任一zk节点,数据都是一致的 可靠性:每次对zk的操作状态都会保存在服务器端 实时性:客户端可以读取到zk服务端的最新数据 2.JDK的安装 第一步:卸载自带的openjdk: rpm -qa | grep java rpm -e --nodeps java-XXXXXX 第二步:解压 第三步:配置环境变量 [root@localhost opt]# vim /etc/profile [root@localhost opt]# source /etc/profile 3.zookeeper的安装 zookeeper的目录结构: 配置文件: 运行zookeeper:在zookeeper下的bin下运行 4.zookeeper的数据类型 ①树型结构、 ②目录结构 5.zookeeper基本数据类型的操作 主要包括客户端连接,查看znode连接,关闭客户端连接(ctrl+c退出) 6.zookeeper的作用

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

PHP学习1——快速入门

主要内容: 搭建PHP开发环境 第一个helloworld程序 PHP(Hypertext Preprocessor)PHP超文本预处理程序,是一种嵌入HTML的脚本语言,运行在服务器。 搭建PHP开发环境 PHP开发环境主要3部分:服务器Apache,编程语言PHP,数据库MySQL。搭建开发环境,直接使用XAMPP集成安装就可以。 XAMPP=Apache+MySQL+PHP+Perl,X表示的是跨平台。 官网下载安装即可:https://www.apachefriends.org/zh_cn/index.html (安装太简单了,没有什么可说的,不过如果以前安装过tomcat,apache,MySQL等,xampp的部分功能可能不能使用,解决办法网上很多,不再赘言) 第一个helloworld程序 php可以使用note++进行编辑。 helloworld.php <?php echo "hello world!"; ?> 然后运行XAMPP的控制面板,点击Apache的start,绿色就是正常运行了。 然后将helloworld.php文件放在路径:C:\xampp\htdocs 浏览器输入:http://localhost/helloworld.php ok,我们的第一个PHP程序就完成了。

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

python-函数入门(二)

一、函数对象 什么是函数? 函数是第一类对象,指的是函数名指向的值(函数)可以被当做数据去使用 1.函数的特性 1.函数可以被引用,即函数可以把值赋值给一个变量 def foo(): print('from foo') foo() func=foo #引用,赋值 func() print(foo) print(func) 2.函数可以当做参数传给另一个函数 def hi(): return "hi yasoob!" def doSomethingBeforeHi(func): print("I am doing some boring work before executing hi()") print(func()) doSomethingBeforeHi(hi) 3.可以当做一个函数的返回值 def func(): # func=函数的内地址 print('from func') # print(func) age=10 def bar(x): return x res=bar(age) print(res) res=bar(func) print(res) 4.可以当做容器类型的元素 容器对象(list、dict、set等)中可以存放任何对象,包括整数、字符串,函数也可以作存放到容器对象中 def func(): # func=函数的内地址 print('from func') age=10 l=[age,func,func()] print(l) 二、函数嵌套 函数的嵌套又分为两大类 1.函数的嵌套调用:在调用一个函数的过程中,其内部代码又调用了其他函数 def max2(x,y): if x > y: return x else: return y def max4(a,b,c,d): res1=max2(a,b) res2=max2(res1,c) res3=max2(res2,d) return res3 print(max4(1,2,3,4)) 2.函数的嵌套定义:一个函数内部又定义了另外一个函数 # from math import pi # # print(pi) # # def circle(radius,action=0): # """ # 圆形相关运算 # :param radius: 半径 # :param action: 0代表求面积,1代表求周长 # :return: 面积或者周长 # """ # def area(radius): # return pi * (radius ** 2) # # def perimiter(radius): # return 2 * pi * radius # # if action == 0: # res=area(radius) # elif action == 1: # res=perimiter(radius) # # return res # # print(circle(10,0)) # print(circle(10,1)) 三、名称空间与作用域 1.什么是名称空间: 名称空间就是用来存放名字与内存地址绑定关系的地方(内存空间),但凡要查找值一定要通过名字,访问名字必须去查找名称空间 2.名称空间的三大类 内置名称空间:存放的是python解释器自带的名字 例如:len()、man()等 全局名称空间:存放的是文件级别的名字(不是函数内,不是内置的) x、y、z、b、foo都是全局 m不是 x=1 y=2 if x=1: z=3 while Ture: b=4 def foo(): m=3 局部名称空间:在函数内部定义的 生命周期: 内置名称空间:在解释器启动时生效,关闭时则失效 全局名称空间:在解释器解释执行python文件时生效,文件执行完毕后则失效 局部名称空间:只在调用函数时临时产生该函数的局部名称空间 加载顺序:内置===》全局===》局部 查找名字的顺序: 基于当前所在位置往上查找,假设当前站在局部,查找顺序:局部==》全局==》内置 假设当前站在全局,查找顺序:全局=》内置 注:名字的查找顺序,在函数定义阶段就已经被固定死了(即在检测语法时就已经确定了名字的查找顺序),与函数调 用位置无关,无论在任何地方调用函数,都必须回到当初定义函数的位置去确定名字的查找关系 # x=111 # def outer(): # def inner(): # print('from inner',x) # x访问的时全局名称空间中x # return inner # # f=outer() # # print(f) # # x=222 # f() 3.作用域 作用域指的是作用的范围,分为两种,全局作用域和局部作用域 1.全局作用域:包含的是内置名称空间与全局名称空间中的名字 特点:全局有效,全局存活 2.局部作用域:包含的是局部名称空间中的名字 特点:局部有效,临时存活 补:global 和 nonlocal #global:在局部声明一个名字是来自于全局作用域的,可以用来在局部修改全局的不可变类型 # x=1 # def foo(): # global x # x=2 # # foo() # print(x) #nonlocal:声明一个名字是来自于当前层外一层作用域的,可以用来在局部修改外层函数的不可变类型 # x=0 # def f1(): # x=111 # def f2(): # nonlocal x # x=222 # f2() # print(x) # # f1() # print(x) 四、闭包函数 1.什么是闭包函数? 指的是定义一个函数内部的函数,该内部函数包含对外层函数作用域名字的引用 需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数的层级限制。 def outter(): x=111 def inner(): print(x) return inner f=outter() #f=outter内的inner # x=22222 # f() def func(): x=3333 f() func() 2.为何要用闭包函数? 闭包函数提供了一种为函数体传值的解决方案 3.如何使用闭包函数 为函数传值的方式有两种,参数和闭包(目前所学) # 为函数体传值的方式一:参数 # def func(x,y): # print(x+y) # # func(1,2) # 为函数体传值的方式二:闭包 # def outter(x,y): # # x=1 # # y=2 # def func(): # print(x+y) # return func # # f=outter(1,2) # f() 闭包的概念有的晦涩难以理解,期待接下里的学习! 焚膏油以继晷,恒兀兀以穷年。

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

Java入门之继承(下)

Object类 Object类是所有类的父类 一个类没有使用extends关键字明确标识继承关系,则默认继承Object类 (包括数组) Java中的每个类都可以使用Object中定义的方法 可以在Java官方文档中查找Object类中的自带的方法 Object类官方文档 final关键字 final关键字修饰的类 , 表示该类不允许有子类,也就是说不允许被继承 final关键字修饰的方法, 不能修饰构造方法 该方法不允许被子类重写 可以正常被子类继承使用 final关键字修饰方法内部的变量(局部变量), 只要在具体被使用之前进行赋值即可 一旦赋值不允许被修改 final关键字修饰类当中成员属性时,只有在三个特定的位置可以对final修饰的成员属性进行赋值, 定义时直接初始化 构造方法中 构造代码块中 final关键字修饰引用类型的变量, 初始化之后不能再指向另一个对象,但对象的内容是可以改变的 可配合static使用 表示静态的不允许被修改的信息 /* * final eat()修饰方法 */ public final void eat(){ } public class Animal{ public final int age = 18; //final 修饰变量 并 赋值 } 注解 从JDK1.5版本引入的一个特性 可以声明在包、类、属性、方法、局部变量、方法参数等,的前面,用来对这些元素进行说明、解释。 注解可以按照两种不同的类别来进行区分: 按照运行机制来分 源码注解 :注解只在源码中存在,编译成.class文件注解就不存在了(例:@Override) 编译时注解 :注解在源码和.class文件中都存在 运行时注解 :在运行阶段还起作用,甚至会影响运行逻辑的注解(例:Spring注解:@Autowired) 按照来源区分 来自JDK的注解 :例:@Override 来自第三方的注解 :例:Spring注解:@Autowired 我们自己定义的注解 :自己编写的注解 @Override public void eat(){ // @Override 用来标识此方法是重写父类的一个方法 System.out.println(); }

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

python-函数入门(一)

1.什么是函数: 可重复使用的,用来实现单一,或相关联功能的代码段。 函数分为内置函数和自定义函数,这里先讲自定义函数 2.如何定义函数: #语法 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 注:函数必须先定义才能使用,定义阶段不执行代码只检测语法.意思就是语法错误在定义阶段就会检测出来,代码的逻辑错误只有在执行时才会提示. 3.定义函数的三种形式 无参:用于执行一些打印等操作,不需要参数传进去 有参:需要根据传进去的参数进行运算 空函数:用于设计代码结构 # 1.无参函数 # def foo(): # print('from foo') # foo() # # 2.有参函数 # def bar(): # print(x,y) # bar(1,2) # # 3,空函数 # def func(): # pass 4.函数调用 函数调用就是函数名加个()即可 4.1调用函数的三种形式: # 1.语句形式 # def foo(): # print('from foo') # foo() # # 2.表达式形式 # def foo(x,y): # res = x+y # return res # res = foo(1,2) # 3.可以当做参数传给另外一个函数 # def max2(x,y): # if x>y: # return x # else: # return y # res = max2(max2(1,2),3) # print(res) 4.2函数的返回值 1.返回值没有类型限制 2.返回值没有个数限制 注:返回多个值的结果就是返回一个元组,0个值返回为None return是函数结束的标准,可以有多个return但只执行一次 # def f1(): # print('111') # return 1 # print('222') # return 2 # print('333') # return 3 #def f1() #只执行 print('111') 4.3函数的参数 函数的参数分为形参和实参.形参即为变量名,实参为变量值,在函数调用时,把值绑定到变量名上,在函数调用结束后,解除绑定 形参与实参的具体分类(重点) 1.位置参数 1.1位置形参 在定义函数阶段按照从左到右的顺序定义的形参. 注:按位置定义的形参必须被传值,多一个不行,少一个也不行 # def foo(x,y) # print(x,y) # # foo(1,2) #正确 # foo(1,2,3) #错误 1.2位置实参 在调用函数阶段按照从左到右的顺序依次传入的值. 2.关键字参数 关键字实参:在调用函数阶段,按照key=value的形式指名道姓的为指定值传值 注:可以完全打乱顺序,仍可以为指定的形参传值 可以混合使用位置实参和关键字实参,但必须注意(1)位置实参必须放在关键字实参前面(2)不能对一个形参重复赋值 def foo(name,age): print(name,age) foo('zfj',18) foo(age=18,name='egon') # foo(name='zfj',18)#报错 # foo('zfj', age=18) 3.默认参数 指的是在定义阶段就已经为某个形参赋值了,该形参称之为有默认值的形参 注意:1.在定义阶段就已经被赋值,意味着在调用阶段就可以直接使用,默认参数 2.位置形参应该放到默认形参前面 3.默认参数的值,通常应该为不可变类型 def foo(x,y=2): print(x,y) foo(1)#1,2 foo(1,3)#1,3 4.可变长度参数 站在实参的角度,参数长度可变指的是在调用函数时,传入的实参的值个数不固定 4.1在形参中带“*”:会将调用函数时溢出的位置实参保存为元组的形式,然后赋值给*后的变量 def foo(x,y,*z): print(x,y,z) foo(1,2,3,4,5)#1 2 (3, 4, 5) 4.2在形参中带“**”:会将调用函数时溢出的关键字实参保存成字典的形式,然后赋值给**后的变量名 def foo(x,y,**z): print(x,y,z) foo(1,2,a=1,b=2)#1 2 {'a': 1, 'b': 2} 4.3在实参中带“*”:在传值前先被打散成位置实参,然后再进行赋值 def foo(x,y,*z): print(x,y,z) foo(1,*[2,3,4,5,6])#1 2 (3, 4, 5, 6) 4.4在实参中带“**”:在传值前先被打散成关键字实参,然后再进行赋值 def foo(x,y,z): print(x,y,z) foo(1,**{'y':2,'z':1})#1 2 1 5.命名关键字参数 放到*与**之间的参数称为命名关键字参数。函数的调用者可以传入任意不受限制的关键字参数 注意:命名关键字参数必须按照key = value的形式传值 补充: 在形参中带*与**的,*后的变量名应该为args,**后应该是kwargs # 当我们想要将传给一个函数的参数格式原封不动地转嫁给其内部的一个函数,应该使用下面这种格式 def bar(x,y,z): print(x,y,z) def wrapper(*args,**kwargs): bar(*args,**kwargs) wrapper(1,2,z=3) #虽然调用的是wrapper,但是要遵循的却是bar的参数标准 焚膏油以继晷,恒兀兀以穷年。

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

Java入门之继承(上)

继承 概念: 一种类与类之间的关系 使用已存在的类的定义作为基础建立新类 新类的定义可以增加新的数据或功能,也可以用父类的功能,但不能选择性地继承父类,需全部把父类的东西继承过来。 子类只能继承父类非私有成员 特点: 1.利于代码复用 2.缩短开发周期 语法: 1.使用extends实现继承 2.单一继承,只能有一个父类 /* * Dog 为子类 又名派生类 * Animal 为父类 又名 超类、基类 */ class Dog extends Animal{ } 方法重载要求: 1.同一个类中 2.方法名相同,参数列表不同(参数顺序 、个数 、类型) 3.方法返回值、访问修饰符 4.与方法的参数名无关 方法重写要求: 1.有继承关系的子类中 ,子类重写父类方法 2.方法名,参数类型、顺序、个数 都要与父类的方法相同 3.方法返回值类型与父类兼容就可以,允许发生改变 4.访问修饰符,访问范围需要大于等于父类的访问范围 5.与方法的参数名无关 访问修饰符 公有的 public (允许任意位置使用) 私有的 private (只允许在本类中使用) 受保护的 protected (允许在当前类、同包子类/非子类、跨包子类调用、跨包非子类不能允许) 默认 (允许在当前类 同包子类调用;跨包子类/非子类不允许调用) super关键字 super代表父类对象的引用,通过super访问父类的成员 父类的构造方法不允许被继承,不允许被重写,但是会影响子类实例化过程 继承后的初始化顺序(子类对象的实例化过程) 父类静态成员 → 子类静态成员 → 父类对象构造 → 子类对象构造 子类的构造的过程中必须调用其父类的构造方法 如果子类的构造方法中没有显示的标注,则系统默认调用父类的无参构造方法 如果子类的构造方法中既没有显示标注,且父类中没有无参的构造方法,则编译错误 使用super调用父类指定的构造方法,必须在子类构造方法的第一行 public Cat(String name, int age){ super(name, age); } this 和 super this : 当前类对象的引用 访问当前类的成员方法、成员属性 访问当前类的构造方法 不能在静态方法中使用 super 访问父类的成员方法、成员属性 访问父类的构造方法 不能在静态方法中使用 this和super不能同时使使用 在继承(下)中会学习更深入的知识,敬请期待,很快更新。

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

不学无数——SpringBoot入门IV

SpringBoot 1.Profiles Spring Profiles能够在不同的环境中使不同的应用配置生效。@Component和@Configuration两个注解都能够通过@Profiles来标记。下面是例子: @Configuration @Profile("buxuewushu") public class ProductionConfiguration { // ... } 在配置文件中可以通过spring.profiles.active这个变量来控制哪个Profiles生效。例如,可以在application.properties配置文件中配置如下: spring.profiles.active=buxuewushu1,buxuewushu --即通过@Profiles注解标记的名为buxuewushu和buxuewushu1的文件生效 当然也可以通过命令行的形式进行配置:--spring.profiles.active= buxuewushu1, buxuewushu 1.1在代码中配置 在启动文件运行之前可以通过SpringApplication设置需要使哪一个配置生效,SpringApplication.setAdditionalProfiles(…​),也可以通过Spring的ConfigurableEnvironment接口来配置。 2.日志 SpringBoot使用 Commons Logging作为内部的日志门面,但是也提供了一系列的接口来实现扩展。默认的日志配置有,Java Util Logging,Log4J2和[Logback] (https://commons.apache.org/proper/commons-logging/),在这每一种的实现下,都能通过配置来实现针对于哪一些日志的输出。 2.1日志的格式 SpringBoot默认的日志输出格式如下所示,默认输出级别是INFO。默认使用的是Logback进行记录日志的。 2018-07-20 19:11:40.046 INFO 21758 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@db57326: startup date [Fri Jul 20 19:11:38 CST 2018]; root of context hierarchy 2018-07-20 19:11:40.093 INFO 21758 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto java.lang.String com.example.FirstSpringBoot.FirstSpringBootApplication.home() 2018-07-20 19:11:40.097 INFO 21758 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2018-07-20 19:11:40.097 INFO 21758 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 时间:非常精确的时间,并且是根据时间进行排序的输出顺序。 日志级别:ERROR,WARN,INFO,DEBUG,TRANCE 进程ID 通过---进行分割,右边为实际的日志输出内容 线程名 日志名称:通常是源类的名称 日志的内容 2.2调整日志级别 SpringBoot默认的日志级别是INFO,如果想打印其他级别的日志的话可以通过配置。日志级别的顺序是ERROR>WARN>INFO>DEBUG>TRANCE.第一种办法是通过在启动的时候进行参数的配置--debug。 $ java -jar myapp.jar --debug 当然也可以通过配置文件的形式进行调整级别。debug=true,即输出为DEBUG级别的日志信息。 2.3在文件中记录日志 默认情况下,SpringBoot仅仅在控制台中打印日志,不会将日志记录在文件中。如果想将日志输出在文件中的话,那么可以在配置文件中配置文件的路径。logging.file或者logging.path.下面介绍logging.file和logging.path的区别。 logging.file logging.path 例子 描述 none none none 仅仅在控制台中输出日志 文件名 none buxuewushu.log 会在项目的根目录下生成一个buxuewushu.log来记录日志 none 文件夹的名字 ./logs 会在项目的根目录中生成一个logs文件夹,logs文件下会生成默认的spring.log来记录日志 当日志文件记录的数据达到一定量时,SpringBoot会将此文件进行压缩为.gz的压缩文件。SpringBoot默认的大小为10M。当然这个大小也可以通过logging.file.max-size进行配置,但是必须得带单位。 2.4自定义日志配置 许多的日志系统能够被相应的配置文件所配置,或者通过在application.properties中配置Spring的环境变量进行配置logging.config。 可以通过org.springframework.boot.logging.LoggingSystem的系统变量的设置从而使用特定的日志系统,系统日志的value值应该是日志实现的全路径名。 由于日志的加载是在ApplicationContext创建之前的,所以不能通过@PropertySources和@Configuration进行配置。唯一的配置方式就是在系统的环境变量中。 不同的日志系统所对应的配置文件如下: 日志名 文件名 Logback logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy Log4j2 log4j2-spring.xml or log4j2.xml JDK (Java Util Logging) logging.properties Java Util Logging在可执行jar包运行时,可能会造成类加载的问题,所以尽可能避免在jar包执行时使用Java Util Logging 为了更好配置化,一些在properties中的配置被转化为了配置在系统中的变量。对应关系如下: Spring配置变量 系统变量 描述 logging.exception-conversion-word LOG_EXCEPTION_CONVERSION_WORD 记录异常时使用的转换字 logging.file LOG_FILE 用于默认日志配置在哪个文件中 logging.path LOG_PATH 用于默认日志配置文件夹下 logging.file.max-size LOG_FILE_MAX_SIZE 日志文件中支持的最大容量 logging.file.max-history LOG_FILE_MAX_HISTORY 最大的已经被压缩的文件的数量 logging.pattern.console CONSOLE_LOG_PATTERN 在控制台上使用的日志模式 PID PID 当前的进程ID(如果可能,还没有被定义为OS环境变量时发现) 2.5 Logback的扩展 SpringBoot为Logback的可扩展性提供了许多的帮助。能够在logback-spring.xml文件中进行配置想要扩展的内容。 由于logback.xml文件的加载时间太早了,所以不能将扩展的内容配置在logback.xml中。 通常在开发过程中,我们根据不同的环境进行配置不同的日志级别。所以在配置文件中可以通过<springProfile>标签进行有选择的使具体哪一步分生效。例子如下,在logback-spring.xml进行配置 --想要的配置的具体内容在<springProfile>标签中进行编写 <springProfile name="staging"> <!-- 配置staging生效 --> </springProfile> <springProfile name="dev | staging"> <!-- 配置dev或者staging生效 --> </springProfile> <springProfile name="!production"> <!-- 配置除了production之外的生效 --> </springProfile>

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

Java入门(一)---面向对象

二狗子.jpeg 面向对象: 关注现实存在的事物的各个方面的信息,从对象的角度出发,根据事物的特征进行程序设计。 类 类,是抽象的概念,可以理解为一个模型,用来确定对象将会拥有的特征(属性)和行为(方法) 对象,是类的实例表现形式,一个实体。 类的属性:对象具有的各种静态特征 (对象有什么) 类的方法:对象具有的各种动态行为 (对象能做什么) 实例化 定义一个Dog类,有两个属性name和age,还有两个方法,run()和eat() 新建文件Dog.java public class Dog { //成员属性:name age String name; int age; //成员方法: run eat public void run(){ System.out.println("跑"); } public void eat(){ System.out.println("吃"); } } 接着,再定义一个用来测试的类, TestDog.java 1 public class TestDog { 2 public static void main(String[] args){ 3 Dog dog = new Dog(); 4 dog.name = "灰灰"; 5 dog.age = 2; 6 System.out.println(dog.name); 7 System.out.println(dog.age); 8 dog.eat(); 9 dog.run(); } } 下边来看下TestDog.java做了些什么: 第一行第二行的基础部分这里不再赘述,直接看第三行,实例化对象 Dog dog = new Dog(); 实例化对象的过程可以分为两部分: 声明对象 Dog dog :在内存的栈空间开辟一块空间, 此时对象是空的, 无法使用 实例化对象 new Dog() : 在内存的堆空间开辟一块空间,完成具体对象初始化操作 image.png 通过赋值操作,把堆空间的内存地址存放到了 dog中: Dog dog = new Dog(); 关于对象的实例化操作,是通过new + 构造方法的形式来完成的。 构造方法 构造方法也称为构造函数、构造器: 1.构造方法与类同名且没有返回值 2.只能在对象实例化的时候调用(配合 new调用) 3.当没有指定构造方法时,系统会自动添加无参的构造方法 4.当指定了构造方法,无论有参数还是无参数的构造方法,都不会自动添加无参数的构造方法 5.一个类中可以有多个构造方法,---构造方法重载,java会根据参数去自动选择。 上边的Dog.java没有定义构造方法,在调用时系统自动帮我们添加无参数的构造方法,下边我们添加上有参数的构造方法: public class Dog { String name; int age; //带参数的构造方法 public Dog(String name, int age){ } public void run(){ System.out.println("跑"); } public void eat(){ System.out.println("吃"); } } 当我们使用带参数的构造函数来进行初始化的时候,为了避免产生赋值错误的情况,可以使用this关键字 this关键字 this代表当前对象的默认引用,上述代码,dog就是当前对象 更改Dog.java public class Dog { String name; int age; //带参数的构造方法 public Dog(String name, int age){ //把传入的 name 赋值给局部变量 name this.name = name; //把传入的 age 赋值给局部变量 age this.age = age; } public void run(){ //调用成员方法eat,(这里只是演示this的使用 不关心逻辑) this.eat(); System.out.println("跑"); } public void eat(){ //也可以不用this 直接调用成员方法run run(); System.out.println("吃"); } } 补充知识 我们在类中定义变量后,其实变量是有初始值的,代码说明: 新建Demo.java和TestDemo.java public class Demo { String name; int age; double d; boolean n; } public class TestDemo { public static void main(String[] args){ Demo de = new Demo(); System.out.println(de.name); System.out.println(de.age); System.out.println(de.d); System.out.println(de.n); } } 运行结果: null 0 0.0 false 上边Demo.java中定义了四个不同类型的变量,直接在TestDemo.java中调用并打印,可看到变量的默认值。 下图展示了变量定以后的初始值: image.png

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

Dart In Action -Dart快速入门(-)

写在前面 本文基本上是将dart官网部分内容进行翻译,没兴趣的请出门左转至Dart的官网,有兴趣的同志请继续阅读本文。Flutter教程在这里 1.什么是Dart? 以下来自百度百科: Dart是谷歌开发的计算机编程语言,后来被Ecma (ECMA-408)认定为标准 [1] 。它被用于web、服务器、移动应用 [2] 和物联网等领域的开发。它是宽松开源许可证(修改的BSD证书)下的开源软件。 Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言,可以转译为JavaScript,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing)和sound type system。 事实上,Dart被抛弃过,但Dart这门语言已经发展到2.x了。 2.为什么要学Dart? 大千世界,语言不计其数,这次我们要学习的为是Dart?答案是因为google推出的全新的跨平台UI框架--Flutter,而Flutter所使用的语言便是Dart。 3.初识Dart 以下代码展示了使用频率非常高并且最基础的Dart语法: // 定义一个函数. printInteger(int aNumber) { print('The number is $aNumber.'); // 将内容输出至控制台. } //和很多语言一样,dart选择了main()作为程序入口. main() { var number = 42; // 声明并且定义一个变量. printInteger(number); // 调用一个函数. } 4.Dart的注释 Dart的注释分为三种,举例说明: 单行注释 以//以为开始。在//和行尾之前的内容会被Dart编译器忽略掉。 void main() { // TODO: refactor into an AbstractLlamaGreetingFactory? print('Welcome to my Llama farm!'); } 多行注释 以/*开始并以*/为结束。/*和*/之前的内容会被Dart编译器忽略掉(除非注释是文档注释,下小节会介绍文档注释)。多行注释是可以嵌套的。 void main() { /* * This is a lot of work. Consider raising chickens. Llama larry = Llama(); larry.feed(); larry.exercise(); larry.clean(); */ } 3. 文档注释 文档注释是多行或者单行注释,以///或者/**开始。使用///注释连续的行与多行文档注释有相同的效果。 在文档注释中,Dart编译器会忽略所有文本,除非它被括在括号中。使用方括号,可以引用类、方法、字段、顶级变量、函数和参数。括号中的名称在文档化的程序元素的词法范围中解析。 /// A domesticated South American camelid (Lama glama). /// /// Andean cultures have used llamas as meat and pack /// animals since pre-Hispanic times. class Llama { String name; /// Feeds your llama [Food]. /// /// The typical llama eats one bale of hay per week. void feed(Food food) { // ... } /// Exercises your llama with an [activity] for /// [timeLimit] minutes. void exercise(Activity activity, int timeLimit) { // ... } } 在生成的文档中,[Food]成为指向Food类的API文档的链接。使用这个SDK可以解析Dart代码以及生HTML文档。 第一节结束

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

Java 基础 之 入门HelloWorld

http://www.verejava.com/?id=1699251664916 import java.lang.*; /** @author : 胡杨 @version : 1.0 1. //双斜杠代表注释, 是给人看的, 机器忽略不计 2. public 公有的, 是java 的关键字 3. class 叫 类, 每一个java文件里必须包含一个类 4. HelloWord 叫 类名, 类名可以跟文件名不一样, 但是规范一般写成一样 5. static 叫 静态的, main方法必须写static java 虚拟机才能找到 6. void 空 也就是没有返回值 7. main 叫主方法, 是java程序的入口, 必须这么写固定的, 否则程序不能运行. 8. String 字符串 是用双引号括起来的数字字符的一连串的组合 9. String[] 字符串数组 10. args 叫 main 方法的参数 11. System: 系统, out : 输出 println : 打印 12. 类名 后面{}部分叫做 类体 括号必须成对出现 13. 主方法main 后面 {} 部分叫做方法体 括号必须成对出现 14. import java.lang.*; 叫做 导入 java.lang下面的所有类, 但是java 默认 java.lang 下面的类已经导入, 所有 java.lang这个包也是java唯一可以省略不用导入的包. 编码规范: 1. 类名 第一个单词首字母大写, 如果有多个单词组成, 每个单词的首字母大写 2. java 是区分大小写的语言 3. 书写类体时{} 括号要成对出现 4. 书写方法体时{}括号要成对出现 5. 方法写在类体中 每个方法前面留一个 Tab 键空格 6. 方法中的执行语句 写作方法体中 每条执行语句 相对于方法前面留一个Tab 键空格, 并且每条执行语句后面都要写一个分号; 表示该条语句执行结束 */ public class HelloWorld { public static void main(String[] args) { //向控制台打印输出 Hello Word信息 然后换一行 System.out.println("Hello Word"); //向控制台打印输入信息, 但不换行 System.out.print("aaaa\t"); System.out.print("bbb"); } } http://www.verejava.com/?id=1699251664916

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

react新手入门(序)

之前在软件园使用的是react,当时为了做个集光推送,自己去搭过react,这次项目中继续使用react,于是又重新操作了遍,恰巧公司买了本react的书籍,这本书写的非常好,看着并不觉得拗口,很容易理解,于是我又搭了遍react,然后对比之前写的我的第一个react,感觉这次对react更加深入理解了。先把这本书推荐给大家。 react深入浅出 react安装步骤: 1.通过官网https://nodejs.org/安装node.js和npm, node装好,npm就出来了 2.查看是否安装成功npm -v, node -v 3.npm install --global create-react-app 4.create-react-app first_react_app 5.cd first_react_app 6.npm start 7.进入项目中运行npm install,然后npm start,由于前端数据绑定层是react,UI框架是阿里的Ant Design,这框架不支持ie,所以只能在谷歌等浏览器上操作 image.png image.png 也可以用淘宝的镜像下载淘宝镜像 下载完以后可以直接用cnpm install安装即可,淘宝镜像服务器都在国内速度相对快些。 image.png image.png image.png 我看了TypeError不支持startsWith想到了可能跟浏览器有关 react的背景:facebook出品,目前最为流行的前端框架之一,相比vue和angular来说,vue相对react要容易上手,但是性能和功能都略差,angular更新太快,从angular1到angular4,可以说是面目全非,并且后期有点抄袭react的趋势,react不仅功能强度,性能好,有单元测试,热部署等优势,目前更新也很快,很多大厂都在使用react。 个人看法:目前比较流行的技术栈是,前端(深度)react+Ant Design,广度(小程序,app,公众号等等),后端springboot+springcloud+mysql+hadop+docker+spark+elasticsearch,技术这东西真是学之不尽。这也是我个人看法,不一定全面。

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

Protocol Buffers入门教程

什么是Protocol Buffers 先看官网定义: protocol buffers – a language-neutral, platform-neutral, extensible way of serializing structured data for use in communications protocols, data storage, and more. Protocol Buffers 是一种结构化数据的存储格式,可以用于结构化数据的序列化和反序列化。它很适合做数据存储、 RPC 数据交换格式。 Protocol Buffers的作用可以类比JSON、XML。 对于传输双方,如果约定好使用Protocol Buffer为数据传输的格式,那么这将是一种比JSON和XML都高效轻便的途径。 Protocol Buffers支持多种编程语言,包括C++、Java、Python、Go、C#等。 安装Protocol Buffers 1、官网下载压缩包 2、解压 tar -zxvf protobuf-all-3.6.0.tar.gz 3、protobuf的包需要自己编译 cd protobuf-3.6.0 ./configure make make install 4、在protobuf-3.6.0目录下有对应着各种语言的文件夹,每个文件夹下都有README.md,里面有相应的安装步骤。对于python: cd protobuf-3.6.0/python python setup.py build python setup.py test python setup.py install 5、到此为止,protobuf的python版本已经安装完成,可在命令行键入protoc试试。 Demo 1、创建addressbook.proto文件。.proto文件定义了要序列化的数据结构。 syntax = "proto2"; package tutorial; message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phones = 4; } message AddressBook { repeated Person people = 1; } 2、编译addressbook.proto protoc --python_out=/Users/ya/developer/protoc-test addressbook.proto 这一条命令执行完后会在你指定的目录下生成addressbook_pb2.py文件。 addressbook_pb2.py会提供关于所定义的数据结构的操作方法。 3、编写writer.py,负责序列化数据并保存到文件 # See README.txt for information and build instructions. import addressbook_pb2 import sys try: raw_input # Python 2 except NameError: raw_input = input # Python 3 # This function fills in a Person message based on user input. def PromptForAddress(person): person.id = int(raw_input("Enter person ID number: ")) person.name = raw_input("Enter name: ") email = raw_input("Enter email address (blank for none): ") if email != "": person.email = email while True: number = raw_input("Enter a phone number (or leave blank to finish): ") if number == "": break phone_number = person.phones.add() phone_number.number = number type = raw_input("Is this a mobile, home, or work phone? ") if type == "mobile": phone_number.type = addressbook_pb2.Person.MOBILE elif type == "home": phone_number.type = addressbook_pb2.Person.HOME elif type == "work": phone_number.type = addressbook_pb2.Person.WORK else: print("Unknown phone type; leaving as default value.") # Main procedure: Reads the entire address book from a file, # adds one person based on user input, then writes it back out to the same # file. if len(sys.argv) != 2: print("Usage:", sys.argv[0], "ADDRESS_BOOK_FILE") sys.exit(-1) address_book = addressbook_pb2.AddressBook() # Read the existing address book. try: with open(sys.argv[1], "rb") as f: address_book.ParseFromString(f.read()) except IOError: print(sys.argv[1] + ": File not found. Creating a new file.") # Add an address. PromptForAddress(address_book.people.add()) # Write the new address book back to disk. with open(sys.argv[1], "wb") as f: f.write(address_book.SerializeToString()) 5、执行writer.py python writer.py addressbook.data 执行完脚本后数据将会序列化并存储到addressbook.data中。 6、编写reader.py,负责读取文件并反序列化数据 import addressbook_pb2 import sys # Iterates though all people in the AddressBook and prints info about them. def ListPeople(address_book): for person in address_book.people: print "Person ID:", person.id print "Name:", person.name if person.email != "": print "E-mail address:", person.email for phone_number in person.phones: if phone_number.type == addressbook_pb2.Person.MOBILE: print "Mobile phone :", elif phone_number.type == addressbook_pb2.Person.HOME: print "Home phone :", elif phone_number.type == addressbook_pb2.Person.WORK: print "Work phone :", print(phone_number.number) # Main procedure: Reads the entire address book from a file and prints all # the information inside. if len(sys.argv) != 2: print("Usage:", sys.argv[0], "ADDRESS_BOOK_FILE") sys.exit(-1) address_book = addressbook_pb2.AddressBook() # Read the existing address book. with open(sys.argv[1], "rb") as f: address_book.ParseFromString(f.read()) ListPeople(address_book) 7、执行reader.py python reader.py addressbook.data 输出结果示例: Person ID: 1 Name: kanon E-mail address: 540004716@qq.com Mobile phone : 123456 两个很重要的方法 SerializeToString( ):serializes the message and returns it as a string. ParseFromString( data ):parses a message from the given string. Protocol Buffers 相比 XML are simpler are 3 to 10 times smaller are 20 to 100 times faster are less ambiguous generate data access classes that are easier to use programmatically 在ODPS(MaxCompute)中的应用 ODPS的Tunnel HTTP Server采用了Protobuf作为其序列化机制。客户端在上传数据时,需要先对结构化数据进行序列化(生成二进制流),Tunnel服务端接收到数据后,(对二进制流)执行反序列化,还原出结构化数据,写到ODPS表中。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

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

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

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

用户登录
用户注册