首页 文章 精选 留言 我的

精选列表

搜索[Harness工程],共10000篇文章
优秀的个人博客,低调大师

Python全栈工程师 (类变量、方法、继承、覆盖)

ParisGabriel 每天坚持手写一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 补充: 实例方法都是操作实例对象的 属于此类对象的方法 实例变量 添加/修改属性: 对象.属性名 = 表达式 删除: del 对象.属性名 类 | 对象 | 实例 class object instance 类的本质上也是对象 类可以创建此类对象 ----------------------------------------------------------------------------------------------------------------- 类: 类变量: 类变量是类的属性, 此属性属于类, 不属于此类的实例 作用: 通常用来储存该类创建的对象的共同属性 说明: 类变量可以通过该类的实例直接访问 类变量可以通过类的实例间接访问 类变量可以通过此类的对象__class__属性间接访问示例: # -*- coding:utf-8 -*- # 类变量 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') print(Human.total_count) # 0 h1 = Human("zhang") print(h1.total_count) # 0 用此类实例访问类变量 h1.total_count = 100 # 为对象添加实例变量 print(h1.total_count) # 100 优先访问实例变量 print(Human.total_count) # 0 访问类变量 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') h1 = Human("zhang") print(Human.total_count) # 0 h1.__class__.total_count = 100 # 为类添加修改实例变量 print(h1.total_count) # 100 间接访问类变量 print(Human.total_count) # 100 访问类变量 # 类变量的应用 用类变量记录实例个数 class Human: total_count = 0 # 类变量 def __init__(self, name): print(name, '对象被创建') self.__class__.total_count += 1 # 每次创建对象调用__init__ 类变量加1 def __del__(self): self.__class__.total_count += 1 # 每次析构对象后类变量减1 h1 = Human("zhang") print("此时Human对象的个数是", Human.total_count) # 1 L = [] L.append(Human("li")) L.append(Human("zhao")) print("此时Human对象的个数是", Human.total_count) # 3 del h1 L.pop() print("此时Human对象的个数是", Human.total_count) # 1 类的文档字符串: 和函数等一样 用__doc__属性访问示例: >>> class Dog: ... '''这是小动物''' ... >>> help(Dog) >>> Dog.__doc__ '这是小动物' >>> 类 __slots__ 列表: 作用: 限定一个类的创建实例只能有固定的属性(实例变量) 不允许对象添加列表以外的属性(实例变量) 防止用户因错写属性的名称而发生错误 说明: 1.__slots__ 列表绑定一个字符串列表 2.含有__slots__列表的类所创建的实例对象没有__dict__属性 (不用字典储存对象的属性 __slots__限制) 示例: class Human: # 以下列表限制此类对象只能有这两个属性 防止出错 __slots__ = ["name", "age"] def __init__(self, name, age): self.name, self.age = name, age h1 = Human("Ta", 15) print(h1.age) # 15 h1.Age = 18 # 区分大小写 出错 没有Age属性,也不允许有 print(h1.age) # 15 类方法 @ classmethod 类方法是用于描述类的行为的方法 类方法属于类, 不属于类的实例 说明: 类方法需要使用 @classmethod装饰器定义 类方法至少有一个形参, 第一个形参用于绑定类, 约定写“cls” 类和该类的实例都可以调用类的方法 类方法不能访问此类创建的实例的属性示例: # 类方法的使用 class A: v = 0 @classmethod def get_v(cls): # cls 用来绑定调用此方法的类 return cls.v # 访问类变量 @classmethod def set_v(cls, value): cls.v = value print(A.get_v()) # 0 A.set_v(100) print(A.get_v()) # 100 a1 = A() # 创建实例 print("a1.get_v=", a1.get_v) # 100 a1.set_v(200) print("a1.get_v=", a1.get_v) # 200 print("A.get_v=", A.get_v) # 200 静态方法 @staticmethod 静态方法是定义在类内部的函数, 此函数的作用域是类的内部 说明: 静态方法需要使用 @staticmethod装饰器定义 静态方法与普通函数定义相同, 不需要传入self实例参数和cls参数 静态方法只能凭借该类的创建实例调用 静态方法不能访问变量和实例变量(属性)示例: # 静态方法 class A: @staticmethod def myadd(a, b): return a + b print(A.myadd(100, 200)) # 300 a = A() # 创建实例 print(a.myadd(300, 400)) # 700 # def myadd(a, b): # 和静态方法结果一样 # return a + b # class A: # pass # print(A.myadd(100, 200)) # 300 # a = A() # 创建实例 # print(a.myadd(300, 400)) # 700 实例方法, 类方法, 静态方法,函数, 小结: 1.不想访问 类内 的和 实例内 的变量, 用静态方法 2.只想访问类变量, 不想访问实例变量, 用类方法 3.既要访问类变量, 也想访问实例变量, 用实例方法 4.函数与静态方法相同, 只是静态方式的作用域定义在类内 继承inheritance/派生derive: 什么是继承/派生: 继承是从已有的类中派生出新的类, 新类具有原类的行为, 并能扩充新的行为 派生是从已有的类中衍生成新类, 在新类上可以添加新的属性和行为 作用: 用继承派生机制, 可以将一些共有的功能加在基类中, 实现代码的共享 在不改变基类的代码的基础上改变原有的功能 名词: 基类(base class) / 超类(super class)/父类(father class) 派生类(derived class)/子类(child class) 子类对象一定是父类对象的类型 父类对象不一定是子类对象的类型单继承: 语法: class 类名(基类名) 语句块 说明: 单继承是指由一各基类衍生出新的类 示例: # 单继承用法 class Human: # 人类的共性 def say(srlf, what): print("说:", what) def walk(self, distance): # 走路 print("走了", distance, "公里") class Student(Human): # 继承 # def say(srlf, what): # print("说:", what) # def walk(self, distance): # 走路 # print("走了", distance, "公里") def study(self, subject): # 派生 print("学习", subject) class Teacher(Student): def teach(self, subject): # 派生 print("教", subject) h1 = Human() h1.say("哈哈") h1.walk(500) s1 = Student() s1.walk(4) s1.say("666") s1.study("python") T1 = Teacher() T1.walk(4) T1.say("666") T1.teach("python") T1.study("Java") 继承说明: python3 任何类都可以直接或间接的继承object类 object类是一切类的超类(父类) class的继承参数不写, 默认继承object类 一般省略不写 object类的超类是None类的__base__属性: __base__ 属性用来记录此类的基类(父类)Python的内建类: help(__builtins__) 覆盖 override 覆盖是指在有继承关系的类中, 子类中实现了与基类同名的方法, 在子类 的实例调用该方法时, 实际调用的是子类的覆盖版本, 这种现象叫覆盖示例: # 覆盖 override class A: def works(self): print("A.works被调用") class B(A): '''B继承A类''' def works(self): print("B.works被调用") b = B() b.works() # B.works被调用 # B.works 覆盖 A.works 优先调用子类 # A派生B B继承A # 子类对象显示调用基类(被覆盖)方法的方式: # 基类.方法名(实例, 实际调用参数) A.works(b) # 用类名显示调用, A.works被调用 super 函数: super(cls, obj)返回绑定超类的实例(要求obj必须是cls类的实例) super() 返回绑定超类的实例, 等同于:super(__class__), 实例方法的第一个参数), 必须在方法内调用 作用: 借助于super()返回实例间接调用其父类的覆盖方法 # 用super函数返回的对象调用父类的覆盖方法 class A: def works(self): print("A.works被调用") class B(A): '''B继承A类''' def works(self): print("B.works被调用") def super_works(self): self.works() # B.works被调用 super(B, self).works() # A.works被调用 super().works() # A.works被调用 b = B() b.works() # B.works被调用 super(B, b).works() # A.works被调用 b = B() b.super_works() # B.works被调用 显示调用基类的初始化方法: 当子类中实现了__init__方法,基类的构造方法不会被调用 def __init__(self, ...) # 用super函数调用父类的覆盖__init__初始化方法 class Human: def __init__(self, n, a): self. name, self.age = n, a print("Human类的 __init__ 方法被调用") def infos(self): print("name:", self.name) print("age:", self.age) class Student(Human): def __init__(self, n, a, s=0): super().__init__(n, a) # 用siper 调用父类的__init__方法 self.score = s # 添加成绩属性 print("Student类的 __init__ 方法被调用") def info(self): super().infos() # 调用父类的方法 print("name:", self.name) print("age:", self.age) print("score:", self.score) # 不调用父类的方法也不会出错 但是尽量不要用 s1 = Student("小张", 20) s1.infos()

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

Python全栈工程师(函数嵌套、变量作用域)

ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订阅吧灰常感谢 当个死粉也阔以 Python人工智能从入门到精通 globals()/locals()函数: globals()返回当前全局作用域内变量的字典 locals() 返回当前局部作用域内变量的字典函数变量: 函数名是变量,它在def 语句创建时绑定函数 fa1 = fa 没有括号 绑定函数 fa1 = fa() 返回结果 函数的变量名可以序列交换算法一个函数可以作为另一个函数的实参传递:例如: def myinput(fn): L = [5, 3, 1, 9, 7] return fn(L) print(myinput(max)) print(myinput(min)) print(myinput(sum)) print(myinput(len)) 函数可以作为另一个函数的返回值:例如: def get_op(): s = input("qing shu ru cao zuo") if s == "zui da": return max elif s == "zui xiao": return min elif s == "he": return sum L = [2, 3, 4, 6,5, 6, 9, 1] print(L) f = get_op() print(f(L)) 函数的嵌套: 函数嵌套定义是指一个函数里用def语句来创建其他的函数 示例: def fn_outter(): print("fn_outter被调用") def fn_inner(): print("fn_inner被调用") fn_inner() fn_inner() print("fn_outter调用结束") fn_outter() Python的作用域: 作用域也叫名字空间,是访问变量时查找变量的范围空间 python的4个作用域: 作用域: 英文解释 缩写 局部作用域(函数内) Local(function) L 外部嵌套函数作用域 Enclosing functio loc E 函数定义所在模块(文件)作用域 Global(module) G python内建模块作用域 Builtin(python) B 包含关系(内建>模块>外部嵌套函数>函数内)变量名查找规则: 访问变量时,先查找本地变量,然后是包裹此函数外的函数内部的变量 ,之后是全局变量,最后是内建变量 L ---> E ---> G ---> B 在默认情况下,变量名赋值会创建或者改变当前作用域的变量global语句: 告诉解释执行器global语句声明一个或多个变量, 这些变量的作用域为模块级别的作用域,也称为全局变量全局声明(global) 将赋值语句操作的变量映射到模块文件内部的作用域 语法: global 变量1, 变量2, .... 说明: 1. 全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是创建局部变量) 2. 全局变量在函数内部不经过声明就可以直接访问(变量已经存在并关联一个对象) 3. 不能先声明局部变量,再用global声明为全局变量,此做法不附合规则 4. global变量列表里的变量名不能出现在此作用域的形参列表里 nonlocal语句: 告诉解释执行器,nonlocal声明变量不是局部变量,也不是全局变量 它是外部嵌套函数变量 语法: nonlocal 变量名1,变量名2,... 说明: 1. nonlocal 语句只能在被嵌套的函数内部进行使用 2. 访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作 3. 当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近的一层变量进行操作 4. nonlocal语句的变量列表里的变量名,不能出现在此函数的参数列表中 lambda表达式(又称匿名函数)(希腊字母:入) 作用: 创建一个匿名函数对象 同def类似 但是不提供函数名 格式: lambda[ 参数1, 参数...]: 表达式 说明: 1. lambda 只是一个表达式,它用来创建一个函数对象 2. 当lambda表达式调用时,先执行冒号(:)后的表达式,并返回表达式的结果的引用关系 3. lambda 表达式创建的函数只能包含一条表达式 4. lambda 比函数简单且可以随时创建和销毁,有利于减少程序的偶合度 函数: eval () / exec() 函数 eval(source, globals=None, local=None) 把一个字符串 srouce 当成一个表达式来执行,返回表达式执行的结果 exec(source, globals=None, locals=None) 把一个字符串source 当成程序来执行 练习: 写一个函数叫hello(name),部分代码如下: count = 0 def hello(name): print('你好', name) ... 此处代码省略,需要同学们自己填写 ... 此处代码需要改变全局变量来记录此函数曾经被调用过多少次. hello('小张') hello('小李') print('hello 函数被调用', count, '次') # 2次 count = 0 def hello(name): global count count += 1 print("hello", name) hello("name") hello("xiaoli") hello("xiaoliu") hello("xiaowei") hello("xiaozhang") 1. 写一个lambda 表达式,判断这个数的2次方+1是否能被5整除,如果能被整除返回True, 否则返回False 例: fa = lambda x: ..... print(fa(2)) # True print(fa(4)) # False fa = lambda x: (x ** 2 + 1) % 5 == 0 print(fa(2)) # True print(fa(4)) # False 2. 写一个lambda表达式,求两个变量的最大值 例如: def mymax(x, y): ... mymax = lambda ... print(mymax(100, 200)) # 200 def mymax(x, y): if x > y: return x else: return y print(mymax(100, 200)) # 200 mymax = lambda x, y: x if x > y else y print(mymax(100, 200)) # 200 1. 给出一个整数n,写一个函数myfac来计算n!(n的阶乘) n! = 1 * 2 * 3 * 4 * ..... * n 如: print(myfac(5)) # 120 def myfac(n): x = 1 for i in range(1, n + 1): x = x * i return x print(myfac(5)) 2. 给出一个整数n,写一个函数计算myfn(n): 1 + 2**2 + 3**3 + .... + n**n的和 如: print(myfn(10)) # ??? def myfu(n): s = 0 for x in range(2, n + 1): s += x ** x return s print(myfu(10)) 3. 完全数: 1 + 2 + 3 = 6 (6为完全数) 1,2,3都为6的因数(因数是能被一个数x整除的整数为y,则y为x的因数) 1 x 6 = 6 2 x 3 = 6 完全数是指除自身以外的所有因数相加之和等于自身的数 求 4~5个完全数并打印出来 答案: 6 28 496 ...... def mywqs(x): s = 0 L = [] for i in range(1, x): if x % i == 0: L.append(i) for i in L: s += i if s == x: return True else: return False i = 0 wqs = 0 while wqs < 5: i += 1 if mywqs(i) == True: print(i) wqs += 1 咳咳 又到了吹NB环节 locals()、globals() 就是一个查询函数 以字典形式返回信息而已函数变量? 你就就把它看做一个全局变量 变量绑定数据 而它绑定语句块 就这么简单什么是作用域? 作用域就是变量的所属范围 超过范围就失效 在别的地方一般是3个作用域 而python有4个 内建变量 局部变量 模块全局变量 特殊那个就是两个函数嵌套之间的范围(外部嵌套) 分别都是包含关系(内建>模块>外部嵌套函数>函数内) 内建函数 不可删除或修改 其他作用域 不能与内建函数重名 否则内建函数失效 只作用于当前空间自定义函数 各作用域各不相干 同空间不可重名 global 不管在任何空间使用global都直接声明全局变量 nonlocal 只能在被嵌套函数内部使用 多层嵌套 只会跳一层 lambda 用表达式创建一个函数 和if一样

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

Python全栈工程师(数值类型、运算符)

ParisGabriel Python 入门基础 python的应用领域: 1.系统运维 2.网络编程(如:网络爬虫,搜索引擎,服务器编程) 3.科学计算 4.航空领域(如:卫星,导弹,等) 5.人工智能,机器人 6.web开发、 7.云计算 8.大数据以及数据库开发 9.教育 10.游戏,图像处理 等等。。 python的优点: 1.面向对象(java、C++、python、C#、swift) 2.开源免费 3.跨平台(windows、Linux、Unix、iOS、Android) 4.混合编程(C、C++、java、.net) 5.应用领域广泛 python的缺点: 1.执行速度没有C、C++快、较慢的java、相对而言也比较慢 2.源代码不能加密 python的组成: 1.程序是由模块组成的 2.模块是由数据、函数、支持库、类等组成的 3.函数是由语句块组成的 4.语句块是有表达式组成的 Python的核心数据类型: (整数int,浮点数float,复数complex,布尔型bool、 字符串 str 列表 list 等) 1.十进制表示方式10 200 -100 999八进制:0o177(127)0o11(9) 2.十六进制:0x11(17)0xff(255)0x1a2b3.二进制:0b1110b101 整形数 int整数是不带小数的部分数字正数负数0浮点数:float带有小数部分的数字 复数分为两部分:实部(real)虚部(image)虚部是j或J结尾的数字面值:1j(2J)1+2J3-4Jbool有两种1.true 代表条件成立2.false 代表条件不成立true的值是1false的值是0 内置对象: None 是一个表示不存在的特殊对象(空值) 用来占位或解除变量的绑定 表达式: 由数字、数字和运算符组成 通常让计算机做一些事会返回结果 算数运算运算符: 1.+ 加法 2.- 减法 3.* 乘法 4./ 除法 5.// 地板除 6.** 幂运算 7.% 取余 / 除法: 得到的是浮点数 不会丢弃小数位 // 地板除: 得到的是整数型 字节舍去所有小数(没有四舍五入) % 取余: 取整除后所剩余的余数(7%3=1) ** 幂运算: 优先级: 1.** 2.* / // % 3.+ - 4.()内的优先级最高 优先级越高越先执行 同等优先级 从左往右依次执行 混合类型自动升级: 整数加浮点数结果为浮点数 基本输入函数: print(格式:print(要打印的内容)) 多个数据类型要用“,”分开 变量: 变量就是关联一个对象的标识符并且区分字母大小写 标识符的命名: 必须以下划线或字母开头,后面跟字母、下划线、整数 不能使用Python的关键字命名 赋值运算符: “=” 语法: 变量名=表达式 变量名1=变量名2=表达式 变量名=表达式=序列 创建一个变量,此变量用来绑定数据对象 修改一个变量的绑定关系 让其绑定另一个对象 当变量不存在时创建变量 同事将对象绑定在变量上 当变量存在时改变变量的对象 一个人变量只能绑定一个对象 一个对象可以绑定多个变量 序列赋值: a,b = 100,200 Python的自动化内存管理: a=a+b 释放a a=a+b的和 变量的交换: 交换算法: >>> a=10 >>> b=20 >>> a=a+b >>> b=a-b >>> a=a-b >>> a 20 >>> b 10 第三变量: >>> a=20 >>> b=10 >>> c=a >>> a=b >>> b=c >>> a 10 >>> b 20 序列赋值: >>> a=10 >>> b=20 >>> a,b=20,10 >>> a 20 >>> b 10 >>> 删除变量: del >>> del a 删除变量的同时解除与对象的关联关系,如果能则释放对象 help(“——main——”) tarena@tedu:~$ python3 Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> a = 100 >>> help("__main__") 在交互模式下查看当前作用域的所有变量 Q退出查看 自动化内存管理和引用计数: 每个对象都会记录有几个变量绑定自身,当引用的数量为0时则此对象将被销毁 并且释放内存资源 此种自动化内存管理的方式叫引用计数 is/is not 运算符作用:判断两个对象是否是一个对象,当是同一个对象时返回true否则返回 falseis not返回值与is相反 id(obj)函数: 返回一个对象在内存中的地址(id(对象) 小整数对象值:CPython中 ,整数-5到256的数永远存在于小数池中不会释放且可重复使用符合赋值算数运算符:y += x 等同于 y = y + xy -= x 等同于 y = y - xy *= x 等同于 y = y * xy /= x 等同于 y = y / xy //= x 等同于 y = y // xy %= x 等同于 y = y % xy **= x 等同于 y = y ** x 练习:写程序打印出1.古代的秤是16两一斤 请问216两是几斤几两 print("Answer to question 1:") print(216 // 16, "axe", 216 % 16, "liang") 2.冲凌晨0:0:0计时 到现在已经过了63320秒 现在是几时几分几秒 print("Answer to question 2:") time = 63320 time // 3600 a = time % 3600 a // 60 a % 60 print(time // 3600, "小时", a // 60, "分钟", a % 60, "秒") 3.温度转换:摄氏度=5.0/9.0*(华氏度-32)请问100华氏度是多少摄氏度?如果当前温度是摄氏度温度能否算出华氏度温度是多少? print("Answer to question 3:") a = 5.0 / 9.0 * (100 - 32) print("100华氏度=", a, "摄氏度") a = 100 * 9 / 5 + 32 print("100摄氏度=", a, "华氏度")

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

Java工程师成神之路(2018修订版)

来源 :公众号|作者 : Hollis 主要版本更新时间备注 v1.02015-08-01首次发布 v1.12018-03-18增加新技术知识、完善知识体系 一、基础篇 JVM JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 Java内存模型 内存可见性、重排序、顺序一致性、volatile、锁、final 垃圾回收 内存分配策略、垃圾收集器(G1)、GC算法、GC参数、对象存活的判定 JVM参数及调优 Java对象模型 oop-klass、对象头 HotSpot 即时编译器、编译优化 类加载机制 classLoader、类加载过程、双亲委派(破坏双亲委派)、模块化(jboss modules、osgi、jigsaw) 虚拟机性能监控与故障处理工具 jps, jstack, jmap、jstat, jconsole, jinfo, jhat, javap, btrace、TProfiler 编译与反编译 javac 、javap 、jad 、CRF Java基础知识 阅读源代码 String、Integer、Long、Enum、BigDecimal、ThreadLocal、ClassLoader & URLClassLoader、ArrayList & LinkedList、 HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap、HashSet & LinkedHashSet & TreeSet Java中各种变量类型 熟悉Java String的使用,熟悉String的各种函数 JDK 6和JDK 7中substring的原理及区别、 replaceFirst、replaceAll、replace区别、 String对“+”的重载、 String.valueOf和Integer.toString的区别、 字符串的不可变性 自动拆装箱 Integer的缓存机制 熟悉Java中各种关键字 transient、instanceof、volatile、synchronized、final、static、const 原理及用法。 集合类 常用集合类的使用 ArrayList和LinkedList和Vector的区别 SynchronizedList和Vector的区别 HashMap、HashTable、ConcurrentHashMap区别 Java 8中stream相关用法 apache集合处理工具类的使用 不同版本的JDK中HashMap的实现的区别以及原因 枚举 枚举的用法、枚举与单例、Enum类 Java IO&Java NIO,并学会使用 bio、nio和aio的区别、三种IO的用法与原理、netty Java反射与javassist 反射与工厂模式、java.lang.reflect.* Java序列化 什么是序列化与反序列化、为什么序列化 序列化底层原理 序列化与单例模式 protobuf 为什么说序列化并不安全 注解 元注解、自定义注解、Java中常用注解使用、注解与反射的结合 JMS 什么是Java消息服务、JMS消息传送模型 JMX java.lang.management.*、javax.management.* 泛型 泛型与继承 类型擦除 泛型中K T V E object等的含义、泛型各种用法 单元测试 junit、mock、mockito、内存数据库(h2) 正则表达式 java.lang.util.regex.* 常用的Java工具库 commons.lang,commons.*...guava-librariesnetty 什么是API&SPI 异常 异常类型、正确处理异常、自定义异常 时间处理 时区、时令、Java中时间API 编码方式 解决乱码问题、常用编码方式 语法糖 Java中语法糖原理、解语法糖 Java并发编程 什么是线程,与进程的区别 阅读源代码,并学会使用 Thread、Runnable、Callable、ReentrantLock、ReentrantReadWriteLock、Atomic*、Semaphore、CountDownLatch、、ConcurrentHashMap、Executors 线程池 自己设计线程池、submit() 和 execute() 线程安全 死锁、死锁如何排查、Java线程调度、线程安全和内存模型的关系 锁 CAS、乐观锁与悲观锁、数据库相关锁机制、分布式锁、偏向锁、轻量级锁、重量级锁、monitor、锁优化、锁消除、锁粗化、自旋锁、可重入锁、阻塞锁、死锁 死锁 volatile happens-before、编译器指令重排和CPU指令重 synchronized synchronized是如何实现的? synchronized和lock之间关系 不使用synchronized如何实现一个线程安全的单例 sleep 和 wait wait 和 notify notify 和 notifyAll ThreadLocal 写一个死锁的程序 写代码来解决生产者消费者问题 守护线程 守护线程和非守护线程的区别以及用法 二、 进阶篇 Java底层知识 字节码、class文件格式 CPU缓存,L1,L2,L3和伪共享 尾递归 位运算 用位运算实现加、减、乘、除、取余 设计模式 了解23种设计模式 会使用常用设计模式 单例、策略、工厂、适配器、责任链。 实现AOP 实现IOC 不用synchronized和lock,实现线程安全的单例模式 nio和reactor设计模式 网络编程 tcp、udp、http、https等常用协议 三次握手与四次关闭、流量控制和拥塞控制、OSI七层模型、tcp粘包与拆包 http/1.0 http/1.1 http/2之前的区别 Java RMI,Socket,HttpClient cookie 与 session cookie被禁用,如何实现session 用Java写一个简单的静态文件的HTTP服务器 实现客户端缓存功能,支持返回304 实现可并发下载一个文件 使用线程池处理客户端请求 使用nio处理客户端请求 支持简单的rewrite规则 上述功能在实现的时候需要满足“开闭原则” 了解nginx和apache服务器的特性并搭建一个对应的服务器 用Java实现FTP、SMTP协议 进程间通讯的方式 什么是CDN?如果实现? 什么是DNS? 反向代理 框架知识 Servlet线程安全问题 Servlet中的filter和listener Hibernate的缓存机制 Hiberate的懒加载 Spring Bean的初始化 Spring的AOP原理 自己实现Spring的IOC Spring MVC Spring Boot2.0 Spring Boot的starter原理,自己实现一个starter Spring Security 应用服务器 JBoss tomcat jetty Weblogic 工具 git & svn maven & gradle 三、 高级篇 新技术 Java 8 lambda表达式、Stream API、 Java 9 Jigsaw、Jshell、Reactive Streams Java 10 局部变量类型推断、G1的并行Full GC、ThreadLocal握手机制 Spring 5 响应式编程 Spring Boot 2.0 性能优化 使用单例、使用Future模式、使用线程池、选择就绪、减少上下文切换、减少锁粒度、数据压缩、结果缓存 线上问题分析 dump获取 线程Dump、内存Dump、gc情况 dump分析 分析死锁、分析内存泄露 自己编写各种outofmemory,stackoverflow程序 HeapOutOfMemory、 Young OutOfMemory、MethodArea OutOfMemory、ConstantPool OutOfMemory、DirectMemory OutOfMemory、Stack OutOfMemory Stack OverFlow 常见问题解决思路 内存溢出、线程死锁、类加载冲突 使用工具尝试解决以下问题,并写下总结 当一个Java程序响应很慢时如何查找问题、 当一个Java程序频繁FullGC时如何解决问题、 如何查看垃圾回收日志、 当一个Java应用发生OutOfMemory时该如何解决、 如何判断是否出现死锁、 如何判断是否存在内存泄露 编译原理知识 编译与反编译 Java代码的编译与反编译 Java的反编译工具 词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化 操作系统知识 Linux的常用命令 进程同步 缓冲区溢出 分段和分页 虚拟内存与主存 数据库知识 MySql 执行引擎 MySQL 执行计划 如何查看执行计划,如何根据执行计划进行SQL优化 SQL优化 事务 事务的隔离级别、事务能不能实现锁的功能 数据库锁 行锁、表锁、使用数据库锁实现乐观锁、 数据库主备搭建 binlog 内存数据库 h2 常用的nosql数据库 redis、memcached 分别使用数据库锁、NoSql实现分布式锁 性能调优 数据结构与算法知识 简单的数据结构 栈、队列、链表、数组、哈希表、 树 二叉树、字典树、平衡树、排序树、B树、B+树、R树、多路树、红黑树 排序算法 各种排序算法和时间复杂度 深度优先和广度优先搜索 全排列、贪心算法、KMP算法、hash算法、海量数据处理 大数据知识 Zookeeper 基本概念、常见用法 Solr,Lucene,ElasticSearch 在linux上部署solr,solrcloud,,新增、删除、查询索引 Storm,流式计算,了解Spark,S4 在linux上部署storm,用zookeeper做协调,运行storm hello world,local和remote模式运行调试storm topology。 Hadoop,离线计算 HDFS、MapReduce 分布式日志收集flume,kafka,logstash 数据挖掘,mahout 网络安全知识 什么是XSS XSS的防御 什么是CSRF 什么是注入攻击 SQL注入、XML注入、CRLF注入 什么是文件上传漏洞 加密与解密 MD5,SHA1、DES、AES、RSA、DSA 什么是DOS攻击和DDOS攻击 memcached为什么可以导致DDos攻击、什么是反射型DDoS SSL、TLS,HTTPS 如何通过Hash碰撞进行DOS攻击 用openssl签一个证书部署到apache或nginx 四、架构篇 分布式 数据一致性、服务治理、服务降级 分布式事务 2PC、3PC、CAP、BASE、 可靠消息最终一致性、最大努力通知、TCC Dubbo 服务注册、服务发现,服务治理 分布式数据库 怎样打造一个分布式数据库、什么时候需要分布式数据库、mycat、otter、HBase 分布式文件系统 mfs、fastdfs 分布式缓存 缓存一致性、缓存命中率、缓存冗余 微服务 SOA、康威定律 ServiceMesh Docker & Kubernets Spring Boot Spring Cloud 高并发 分库分表 CDN技术 消息队列 ActiveMQ 监控 监控什么 CPU、内存、磁盘I/O、网络I/O等 监控手段 进程监控、语义监控、机器资源监控、数据波动 监控数据采集 日志、埋点 Dapper 负载均衡 tomcat负载均衡、Nginx负载均衡 DNS DNS原理、DNS的设计 CDN 数据一致性 五、 扩展篇 云计算 IaaS、SaaS、PaaS、虚拟化技术、openstack、Serverlsess 搜索引擎 Solr、Lucene、Nutch、Elasticsearch 权限管理 Shiro 区块链 哈希算法、Merkle树、公钥密码算法、共识算法、Raft协议、Paxos 算法与 Raft 算法、拜占庭问题与算法、消息认证码与数字签名 比特币 挖矿、共识机制、闪电网络、侧链、热点问题、分叉 以太坊 超级账本 人工智能 数学基础、机器学习、人工神经网络、深度学习、应用场景。 常用框架 TensorFlow、DeepLearning4J 其他语言 Groovy、Python、Go、NodeJs、Swift、Rust 欢迎大家加入Java架构开发:744677563 本群提供免费的学习指导 架构资料 以及免费的解答 不懂得问题都可以在本群提出来 之后还会有职业生涯规划以及面试指导 进群修改群备注:开发年限-地区-经验 方便架构师解答问题

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

iOS逆向工程之Reveal工具的安装、配置与使用

一、在越狱设备上配置Reveal 下方的内容是基于越狱的设备操作的,设备的系统版本为iOS9.2.1越狱版。 1. Reveal Loader安装 首先我们打款越狱设备的Cydia,然后在搜索中输入Reveal Loader,并且进行安装即可,下方是安装后的效果。这一步比较简单,安装后重启SpringBoard即可。 2.导入libReveal.dylib 这一步也是比较关键的一步,安装完上述的Reveal Loader后请查看是否有/Library/RHRevealLoader这个文件夹,并且确定该文件夹中是否有libReveal.dylib这个文件,如果有的话,请跳过这一步,如果没有,那么就往下看吧。 (1)操作越狱设备文件所需的工具 当然,本部分需要对越狱设备中的文件系统进行操作,并且将Mac上的文件夹导入到设备中。当然你可以使用OpenSSH来连接你的设备,但是要是将Mac中的文件导入到越狱设备相应的文件夹中,还是使用下方的可视化工具更直观一些。 下方是我本地装的两个工具,当然其中任何一个都可以操作iOS设备的文件系统,不过iExplorer这个工具的功能更强大一些。iExplorer可以查看你的Mac上所有iOS设备的备份文件,当然也包括非越狱设备的备份文件。 (2)libReveal.dylib 我们Mac上的Reveal自带了两个库,一个是libReveal.dylib,一个是Reveal.framework。在未越狱的设备上使用库是后者,本篇博客中使用的是前者。这两个文件位于Reveal中的iOS Library中。Reveal菜单->Help->Show Reveal Library in Finder ->iOS Library。通过上述目录就可以找到我们需要的文件,当然本篇博客中我们只需要libReveal.dylib这一个文件。 找到上述的libReveal.dylib文件后,使用IExplorer拷到我们的设备中相应的目录下即可。如下所示。 至此,我们的Reveal配置工作就结束了,接下来就是使用Reveal来做一些事情了。 二、Reveal的使用 1.在设备上选择可以Reveal的App 我们在越狱设备上安装完Reveal Loader后就可以在设置中找到Reveal的配置项,在该配置项中我们可以去选择要Reveal的App, 当然对于越狱手机,手机上安装的所有App都可以Reveal。当然也包括从AppStore下载的,也包括iOS系统自带的。如下所示: 2.查看系统App"股市"的UI层级 上面Reveal的配置工作就以及配置好了,接下来的时间就是Reveal的使用时间了。Mac上Reveal查看设备上App的UI层级时是不需要使用USB进行连接的,但要保证你的iOS设备与你的Mac在同一个局域网内。下方这个截图就是我在使用Reveal时的一个截图,DecoupleDemo on 呵呵(iOS 9.3.2)这个设备是我一个同事的,当然他的手机是未越狱的设备,不过他的App中引入了Reveal.framework这个包,所以我在这边也是可以看到的。下方是我的越狱设备,当然这个“股市”App是iOS系统自带的App, 接下来就看一下如何去使用Reveal在越狱设备上来查看第三方App的UI层级。 在上方截图中,我们点击下方的股市这条就可以Reveal“股市”这个App了。下方就是“股市”这App的UI层级图。 本文转自zsdnr 51CTO博客,原文链接:http://blog.51cto.com/12942149/1929661,如需转载请自行联系原作者

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

HDS工程师手记——用“数据”遇见可知的未来

美国物理学会院士巴拉巴西的《爆发》,在最新的时间、最新的领域,讨论了一个最古老的问题:到底应该用决定论的观点,还是用非决定论的观点,看待人类行为?作为复杂网络研究的权威,巴拉巴西在大数据的新背景下,认为数据、科学以及技术的合力,会使得人类变得比预期中容易预测得多。就象泰勒格迪做到的那样。在日趋精密的数字技术条件下,有了从四处搜集来的信息,我们不会再把人类的行为视为互不相关、随意偶然的独立事件。《爆发》作者的观点:人类行为93%是可以预测的。例如,通过对大量数据的分析追踪和预测每个公民的行踪。比如电梯摄像头拍到你11点20分离开了公寓大楼,那么10分钟后在你家附近地铁站的监视画面中就很有可能搜寻到你。这并不只是科幻故事,而更可能是大数据时代人类真实的生存现状。在大数据时代,通过对各种数据的充分了解,预测个体的行为可以变得非常容易。 遇见可知的未来 如果最变化无常的人类行为93%是可以预测的,那么,未来其它的事情是不是也可以预测呢,是不是预测的准确率也能达到93%呢。假设未来能预测93%,我们是不是可以认为我们的未来是可知的,我们能遇见可知的未来? 在不远的未来,未来世界的预测准确率将超过93%,天气能预测准确率能达到93%, 地震能预测准确率超过93%,疾病预测准确率超过93%,甚至股市准确率超过93%。我们的未来就是可知的未来。 有数据才能遇见未来 大家都对遇见可知的未来充满期待,但怎么才能遇见可知的未来呢?这就是时下非常热门的话题:大数据分析。大数据分析流程如下图所示: 大数据分析流程 从上图可以看出,对于大数据我们期待商业智能,就像我们想吃美味可口的食物,我们需要厨房(分析平台),需要厨师(行业知识和分析算法),但最重要的是我们要有食材(数据),食材才是最根本、最重要的东西。我们要知道数据在哪里,并且知道如何从浩如烟海的数据中挑选出对我们有用的数据。例如食材很多,要能精确的挑选出哪些食材是做宫保鸡丁的最佳食材。 传统的数据仓库技术,如BA存在了几十年,但是它主要是处理结构化数据,主要提供商业分析,而现在发展为BI,Business Intelligence的英文缩写,中文解释为商务智能。BI最终展现给用户的信息就是报表或图视,数据集合就象玩具“魔方”一样,可以任意快速的旋转组合报表或视图。从内容上BI除了包含结构化数据,还包含非结构化数据,如互联网,社交媒体和物联网(IOT)数据。这是大数据的特点。 IOT – 是Internet Of Things的缩写,字面翻译是“物体组成的因特网”,准确的翻译应该为“物联网”。物联网(Internet Of Things)又称传感网,“物联网”(Internet Of Things)指的是将各种信息传感设备,如射频识别装置、红外感应器、全球定位系统、激光扫描器等种种装置与互联网结合起来而形成的一个巨大网络。其目的是让所有的物品都与网络连接在一起,方便识别和管理。物联网的兴起将带来数据爆炸增长,也将对我们大数据分析和未来社会的预测产生影响。 数据处理的关键- ETL 使用数据最关键是数据梳理 – ETL。从浩如烟海的数据中,提取对我们有价值的数据和信息。ETL,(Extract Transform Load),它实现数据的抽取,转换及装载工作。ETL在技术上主要涉及增量、转换、调度和监控等几个方面的处理: 抽取:将数据从各种原始的业务系统中读取出来。 转换:按照预先设计好的规则将抽取的数据进行转换、清洗,以及处理一些冗余、歧义的数据,使本来异构的数据格式能统一起来。 装载:将转换完的数据按计划增量或全部导入到目标数据库中。 现在的大数据分析中,ETL是基础也是关键,HDS公司最近收购的Pentaho就能够实现各种数据的ETL整合。如下图所示: 从上图可以看出,Pentaho可以将传统的客户信息,交易信息等结构化数据,ETL(PDI)到标准的DW库中,也可以将IOT数据,地理位置信息(Location), 互联网和社交媒体信息ETL(PDI)到规定的目标中,如MongoDB和Hadoop中,并且能够集成传统数据和新的社交数据,为大数据分析提供全新视角。 拥有大量的数据,我们可以遇见可知的未来,数据ETL加工、转换、调度和处理是大数据分析的基础,HDS的Pentaho能够实现各种数据的ETL加工、转换、调度和处理,为企业客户大数据分析助一臂之力。 本文作者:谢勇 来源:51CTO

资源下载

更多资源
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部分的功能。

用户登录
用户注册