首页 文章 精选 留言 我的

精选列表

搜索[源码学习],共10000篇文章
优秀的个人博客,低调大师

Python学习笔记

一:中文编码 1:指定编码 python-------》#!/usr/bin/python shell----------》#!/bin/bash 2:中文识别 # -*- coding: UTF-8 -*- 或 #coding=utf-8 3:多行语句 我们使用斜杠(/)将一行语句分成多行 如果是{},(),[]则直接可以进行换行 4.转义 \n表示换行、\t表示制表符、\\表示\、 如果有很多需要转义,则可使用r' ' ''' '''也可以表示换行 print('''line1 line2 line3''') 5:输出 print x,y print默认是换行的,如果再print末尾加个逗号“,”就回不换行 6.输入 shell:read -p "Please enter your age: " age python2:a = raw_input("请输入你的名字") python3:a = input("请输入你的名字") 二:变量和简单类型 python中数据类型分为5种:数字,字符串、列表、元组、字典 变量命名规则: python shell 文件名/模块名 小写,单词用“_”分割 ----->ad_stats.py 包名 小写,单词用“_”分割 类名 单词首字母大写----->ConfigUtil 全局变量名 大写字母,单词之间用_分割 ------->COLOR_WRITE 普通变量 小写字母,单词之间用_分割 ------->this_is_a_var 实例变量 以_开头,其他和普通变量一样 ----->_instance_var 普通函数 和普通变量一样-------------------->get_name() 2.1数字 整数:a=1 浮点数:a=1.234 2.2字符串 创:var1 = 'Hello World!' 查:print "var1[0]: ", var1[0] print "var2[1:5]: ", var2[1:5] 改:print "更新字符串 :- ", var1[:6] + 'Runoob!' rd()函数获取字符的整数表示,chr()函数把编码转换为对应的字符 占位符 'Hi, %s, you have $%d.' % ('Michael', 1000000) 如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串 另外一种格式化字符串的方法是format(),他会将传入的参数依次替换{1},{2},{3}......,... 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125) 2.3布尔值 布尔值只有True、False两种值 2.4空值 2.5常量 10/3=3.3333 9/3=3.0 10//3=3 10%3=1 2.6除法 余数: >>> divmod(10,3) (3, 1) 四舍五入: >>> round(10/3,4) 3.0 >>> round(10.0/3,4) 3.3333 2.7数学函数与运算优先级 1.绝对值 abs(-10)=10 2.四舍五入 round(1.234)=1 三:高级特性 1.切片 L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引0,1,2,正好是3个元素 如果第一个索引是0,还可以省略-------》L[:3] 前10个数,每两个取一个----------》L[:10:2] 所有数,每5个取一个--------------》L[::5] 什么都不写,只写[:]就可以原样复制一个list-----------》L[:] 2.迭代 3.列表生成器 [x * x for x in range(1, 11)]--------》[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 四:列表(List) list是一种有序的集合,可以随时添加和删除其中的元素。 list1 = ['Michael', 'Bob', 'Tracy'] 增:list1.append('adm')、 list1.insert(1,'jack') #插入元素到指定的位置 删:list1.pop(1) #不填则删除末尾元素 del list1[2] 查:list1[-1] 改:list1[1] ='Sarah',dellist1[2]; 附加:s = ['python','java', ['asp','php'],'scheme'],s[2][1] 五:元组 Python的元组与列表类似,不同之处在于元组的元素不能修改。 tup1 = ('physics', 'chemistry', 1997, 2000); 查:tup1[2] 较:cmp(tuple1, tuple2) 长:len(tup1) 六:字典 字典是另一种可变容器模型,且可存储任意类型对象。 d = {key1 : value1, key2 : value2 } 增: 删:del d['key1']; # 删除键是'key1'的条目 d.pop(key1) #删除对应的键值对 d.clear(); # 清空词典所有条目 del d; # 删除词典 查:d['key1'] d.get(key1)---------->value1 d..has_key(key1)-------->返回true或者false d.keys()-------------->返回所以键['key2','key1'] dict.values()---------->返回所以值[value1,value2] 改:d['key1']=value3 d.update(dict2)----------->将dict2添加到d后面 判:d.has_key(key1)---------->存在则返回true,否则为false 较:cmp(dict1, dict2) 长:len(dict) 七:运算符 python中运算符分为7种:1.算术运算符 2.比较(关系)运算符 3.赋值运算符 4.逻辑运算符 5.位运算符 6.成员运算符 7.身份运算符 1.算术运算符:+、-、*、%(求余)、**(次幂a**b)、//(取整) 2.比较运算符:==(比较是否相等)、!=、<>(比较两个数是否不相等)、>=、<= 3.赋值运算符:=、+=、-=、*=、/=(除法赋值运算符)、%=(取模赋值运算符)、**=(幂赋值运算符)、//=(取整运算符) 4.位运算符:&、|、^、 5.and(与)、or(或)、not 6.in(在)、not in(不在) 7.is(是)、is not(不是) 优先级 八:语句 python分为7种:条件语句,循环语句(while循环,for循环),break语句,continue循环语句,pass循环 python循环语句不用括号()括起来 1:条件语句 num = 5 if num == 3: # 判断num的值 print 'boss' elif num == 2:print 'user' elif num == 1:print 'worker' elif num < 0: # 值小于零时输出 print 'error' else:print 'roadman' # 条件均不成立时输出 2:循环语句 while...else循环 count = 0 while count < 5: print count, " is less than 5" count = count + 1 else: print count, " is not less than 5" for循环 for num in range(10,20): # 迭代 10 到 20 之间的数字 for i in range(2,num): # 根据因子迭代 if num%i == 0: # 确定第一个因子 j=num/i # 计算第二个因子 print '%d 等于 %d * %d' % (num,i,j) break # 跳出当前循环 else: # 循环的 else 部分 print num, '是一个质数' 九:函数 9.1函数规则 1:函数代码块以def关键字开头,后接函数标识符名称和圆括号() 2:任何传入参数和变量必须放在圆括号中间,圆括号中可以用于定义参数 3:函数第一行语句可以放文档字符串,用于存放函数说明 4:函数内容以冒号起始,并且缩进 #python函数 def printinfo( name, age ): "打印任何传入的字符串" print "Name: ", name; print "Age ", age; return; #调用printinfo函数 printinfo( age=50, name="miki" ); #shell函数 function RintedConfig(){ } 9.2函数参数 1.必备参数、2.关键字参数、3.默认参数、4.不定长参数 1:必备参数 必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。 2:关键字参数 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。 def printinfo( name, age ): printinfo( age=50, name="miki" ); 3:缺省参数 调用函数时,缺省参数的值如果没有传入,则被认为是默认值。 def printinfo( name, age = 35 ): printinfo( name="miki" ); 4:不定长参数 你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数, def functionname([formal_args,] *var_args_tuple ): 加了星号(*)的变量名会存放所有未命名的变量参数 9.3高阶函数 1.map() map()可接受两个参数,一个是函数,一个是Iterable,map将传入的参数作用到序的每个元素,并把结果作为新的Iterable返回。 def f(x): return x*x map(f, [1,2,3,4]) >>[1,4,9,16] 2.return() return接收一个函数和两个参数,reduce把结果继续和序列的下一个元素做累积计算。 def f(x,y): return x+y >>map(f, [1,2,3,4]) >>25 3.filter() 用于过滤序列,filter()将元素作用于每个人元素,并根据返回值是true或者false来决定元素的去留。 def is_odd(n): return n % 2==1 filter(is_odd, [1,2,3,4,5,6]) 4.sorted() sorted()可将元素进行排序, def reversed_cmp(x, y): if x > y: return -1 if x < y: return 1 return 0 >>> sorted([36, 5, 12, 9, 21], reversed_cmp) [36, 21, 12, 9, 5] 9.4返回函数 高阶函数除了可以将函数作为参数,也可以将函数作为结果返回。 def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum 9.5匿名函数 关键字lambda表示匿名函数, 匿名函数有个限制,就是只能使用一个表达式,返回值就是该表达式的结果。 map(lambda x: x*x, [1,2,3,4,5,6]) 使用匿名函数就不用担心名字冲突,同是匿名函数也是一个对象,可以将匿名函数作为参数。 ff = lambda x: x*x print ff(5) 9.6装饰器 有时候为了增强函数的功能,但又不改变函数的定义,这种在代码运行期间动态的增加函数的功能的方法叫装饰器。 def log(text): def decorator(func): def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator @log('execute') def now(): print('2015-3-25') >>> now() execute now(): 2015-3-25 9.7偏函数 十:模块 10.1作用域 有的函数和变量,我们仅仅希望在模块内使用,python中我们通过_前缀来实现。 正常的函数和变量都是被公开的,_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用。 带下划线的函数,说明该函数不能根据 from * import来导入,明显在这个模块中你导入的还只是包,然后通过了这个导入的包去调用他内部存在的函数。 十一:面向对象编程 11.1类和实例 class Student (Object): class后面接的是类名,类名手写字母必须大写,紧接的是object,表示该类所继承的类,如果没有,则继承自object类。 class Student(object): def __init__(self, name, score): self.name = name self.score = score def print_score(self): print '%s: %s' % (self.name, self.score) 11.2访问限制 如果要让内部属性,不被外部访问,可以将属性的名称前面加两个下划线,python中变量以__开头的则为私有变量(private),只有内部可以访问,外部不能被访问。 外部要获取和改变,只能通过get和set方法来进行。 class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def print_score(self): print '%s: %s' % (self.__name, self.__score) #外部直接获取 >>> bart = Student('Bart Simpson', 98) >>> bart.__name Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'Student' object has no attribute '__name'#必须使用getname和setname方法 class Student(object): ... def get_name(self): return self.__name def get_score(self): return self.__score 11.3基础多态 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写; 有了继承,才能有多态。在调用类实例方法的时候,尽量把变量视作父类类型,这样,所有子类类型都可以正常被接收; 11.4获取对象信息 1.type() type可以判断一个变量、函数,类的类型。 2.isinstance() isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。 3.dir() 如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list。 11.5__slots__ 如果想对向前类进行限制只添加某几个属性,可以使用__slots__来进行限制。 __slots__只对当前类起作用,对继承的类不起作用。 class Student(object): __slots__=('name','age') s = Student() s.name = 'yaohong' s.age = 90 s.socre = 99 》》 s.socre = 99 AttributeError: 'Student' object has no attribute 'socre' 11.6@property Python内置的@property装饰器就是负责把一个方法变成属性调用的。 class Student(object): @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value @property def age(self): return 2014 - self._birth 11.7多继承 一个子类同时获得多个父类的所有功能。 由于Python允许使用多重继承,因此,Mixin就是一种常见的设计。 只允许单一继承的语言(如Java)不能使用Mixin的设计。 11.8定制类 __str__ class Student(object): def __init__(self, name): self.name = name def __str__(self): return self.name def __repr__(self): return self.name print Student('YAOHONG') print Student('YAOHONG') 11.9使用元类 十二:文件I/O 10.1打印到屏幕 print “”itnihao” 10.2读取输入 1.raw_input str = raw_input("请输入:"); print "你输入的内容是: ", str 2.input input可以接收一个函数表达式 str = input("请输入:"); print "你输入的内容是: ", str 3.open() file object = open(file_name [, access_mode][, buffering]) file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。 access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。 buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。 4.close() close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。 5.write() write()方法可将任何字符串写入一个打开的文件 6.read() fo = open("foo.txt", "r+") str = fo.read(10); print "读取的字符串是 : ", str # 关闭打开的文件 fo.close() 7.rename() os.rename( "test1.txt", "test2.txt" ) 8.remove() os.remove("test2.txt") 8.mkdri() os.mkdir("test")在当前目录下创建新的test文件 9.chdir() os.chdir("/home/newdir")改变当前目录为/home/newdir目录 10.getcwd() os.getcwd()获取当前目录 11.rmdir() # 删除”/tmp/test”目录 os.rmdir( "/tmp/test" ) 十三:异常处理 1.捕获异常:try/except try: fh = open("testfile", "w") fh.write("这是一个测试文件,用于测试异常!!") except IOError: print "Error: 没有找到文件或读取文件失败" else: print "内容写入文件成功" fh.close() 2.try/finally try-finally 语句无论是否发生异常都将执行最后的代码。 3.触发异常 使用raise语句自己触发异常 def functionName( level ): if level < 1: raise Exception("Invalid level!", level) # 触发异常后,后面的代码就不会再执行 十四:file file使用open函数来创建 常用函数: file.close() file.flush() file.next() 返回下一行 file.read(size) 从文件读取指定的字节数,如果未给定或为负则读取所有。 file.readline(size) 读取整行 file.seek() 设置文件当前位置 file.tell() 返回文件当前位置 file.truncate() 截取文件,截取文件通过size指定 file.write() 将指定字符串写入文件 file.writelines() 向文件写入一个字符串列表 十五:OS os.access() 检测文件是否可读可写,文件是否存在,是否拥有执行权限 os.chdir(path) 切换到新的目录 os.chmod() 更改文件或者目录权限 os.chown() 更改文件所有者 os.close() 关闭文件 os.path.join('a','b')字符串拼接形成a/b os.system("ls") 执行shell命令,如assert os.system("rm -rf %s" % install_path) == 0, "卸载 失败" os.path.exists(BIN_PATH) 判断某个变量是否存在 os.unlink(path) 方法用于删除文件,如果文件是一个目录则返回一个错误。 os.remove() 删除文件 十六:open open(a.txt).read() 去取a.txt文件 十七:enumerate enumerate(list1) 枚举list,map等获取索引和元素for index, item in enumerate(list1): 十八:string str.strip("@") 去掉以@开头结尾的 str.startswith("#") 判断是否以#开头 十九:Python常见模块 python常见命令如下,点击链接查看详情 1.os 2.os.path 3.shutil 4.sys 5.inspect

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

Java学习笔记

代码点与代码单元 codePoint codeUnit 这里当字符串中有辅助字符时,代码点是两个代码单元,需要以下遍历: int cp = sentence.codePointAt(i); if(Character.isSupplementaryCodePoint(cp)){ i += 2; }else{ i++; } String类对象->不可变字符串 不能修改字符串中的字符:编译器可以将字符串共享,以此带来高效率。 当将一个字符串与一个非字符串的值进行拼接时,后者将被转换成字符串。 任何一个对象都可以转换成字符串。 检测两字符串是否相等,而不区分大小写,可用equalsIgnoreCase()方法 Java中允许一个数组长度为0,不同于null。 Java中的多维数组实际上是数组的数组。 一个对象变量实际上是一个对象指针。 用clone()方法获得对象的完整拷贝。 不能编写返回引用可变对象的访问器方法。 一个方法可以访问所属类的所有对象的私有数据。 Sytem类中有一个setOut方法是一个本地方法,不是用Java语言实现的,可以绕过Java的存取控制机制(out是final的)。 每个类都可以有一个main方法,可用来进行单元测试。 一个方法不能修改一个基本数据; 一个方法可以改变一个对象参数的状态; 一个方法不能让对象参数引用一个新的对象。 方法签名:方法名、参数类型。 初始化块机制 首先运行初始化快,然后才运行构造器的主体部分 静态域初始化块: static{ } 只能使用*导入一个包,如: import java.util.*; 静态导入:静态方法、静态域 import static java.lang.System.*; 如果没有指定public或private,那么这个部分(类、方法或者变量)可被同一个包中的所有方法访问 包作用域:默认情况下是包可见的 包密封:(package sealing) jar文件密封包 /*…/->文档注释 javadoc 标记+自由格式,其中标记由”@”开始 类设计技巧: 一定要将数据设为私有; 一定要对数据初始化; 不要在类中使用过多的基本数据类型; 不是所有的域都需要独立的域访问器和域更改器; 使用标准格式进行类的定义; 将职责过多的类进行分解; 类名和方法名要能够体现它们的职责。 Java中的所有继承都是公有继承:超类和子类 覆盖(Override)子类使用super调用超类的方法以及构造器 一个对象变量可以引用多种实际类型的现象叫做多态(Polymorphism) 运行能够自动地选择调用的适当方法的现象称为动态绑定 虚拟机预先为各个类创建了一个方法表 在覆盖一个方法时,子类方法不能低于超类方法的可见性 阻止继承的两种方法:final类的方法自动成为final方法(不包括域),final方法 内联的概念:如果一个方法没有被覆盖并且很短,编译器就能够对它进行优化处理。 强制类型转换: 只能在继承层次内进行类型转换; 在将超类转换成子类的前应使用instanceof进行检查 抽象类可以包含非抽象方法,也可以不包含抽象方法。抽象方法充当着占位的角色,具体实现在子类中。 抽象类不能被实例化 只有子类实现了所有抽象方法,子类才不是抽象的了 子类不能访问超类的私有域 hashcode: 由对象导出的一个整型值 每个对象都有一个默认的散列码,其值为对象的存储地址 两个相等的对象要求必须返回一个相等的散列码 自动打包规范要求boolean byte char=0:x; 四个基本的抽象流类:InputStream OutputStream Reader Writer(这些对象由其他方法返回) 注意流过滤器的运用 对象序列化:ObjectOutputstream ObjectInputStream writeObject() readObject() 类必须实现Serializable 接口 Java使用SHA编码的前8字节作为类的指纹 在序列化的过程中内存地址会被替换为序列号(唯一) 流类关注的是文件内容,而File类关注的是文件在磁盘上的存储 原文出处:后端技术杂谈 原文链接 转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

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

CUDA学习(三)

内存层次结构:CUDA线程可能会在执行期间从多个内存空间访问数据,如图所示。每个线程都有专用本地内存(local menory)。 每个线程块都具有共享内存(shared memory),该块的所有线程都可见,并且具有与该块相同的生命周期。 所有线程都可以访问相同的全局内存(global memory)。所有线程还有两个额外的只读内存空间:常量和纹理内存空间。 全局,常量和纹理内存空间针对不同的内存使用进行了优化。 对于某些特定的数据格式,纹理内存也提供了不同的寻址模式以及数据过滤功能。全局,常量和纹理内存空间在同一应用程序的内核启动时保持不变异构编程(Heterogeneous Programming):这里设GPU设备为Device,CPU设备为Host,如图所示,kernel函数在Device上运行,其余C语言程序依然上CPU上运行。CUDA编程模型还假定主机和设备都在DRAM中分别维护它们自己的独立存储空间,分别称为主机存储器和设备存储器。 因此,程序通过调用CUDA运行库来管理内核可见的全局,常量和纹理内存空间(在编程接口中描述)。 这包括设备内存分配和重新分配以及主机和设备内存之间的数据传输。统一内存提供托管内存来桥接主机和设备内存空间。 托管内存可以从系统中的所有CPU和GPU作为具有共同地址空间的单一连贯内存映像访问。 这种功能使得设备内存的超额申请成为可能,并且通过消除在主机和设备上显式镜像数据的需要,可以大大简化移植应用程序的任务。 计算能力:设备的计算能力由版本号表示,有时也称为“SM版本”。 该版本号标识GPU硬件支持的特征,并由运行时的应用程序使用以确定当前GPU上哪些硬件特征和指令可用。计算能力包括主版本号X和次版本号Y,用X.Y表示。主版本号相同的设备具有相同的核心架构。 基于Volta体系结构的设备主要版本为7,基于Pascal体系结构的设备为6,基于Maxwell体系结构的设备为5,基于开普勒体系结构的设备为3,基于费米体系结构的设备为2, 和基于特斯拉架构的设备为1.次要版本号对应于核心架构的渐进式改进,可能包括新功能。支持CUDA的GPU列出了所有支持CUDA的设备及其计算能力。 计算能力给出了每种计算能力的技术规格。特斯拉和费米架构分别在CUDA7.0和CUDA9.0不被支持。

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

.Net学习资料

1.博客系列文章 (1)设计模式 吕震宇 设计模式 张逸:晴窗笔记 Design & Pattern 梦幻Dot Net .Net设计模式 李会军.NET设计模式系列文章 C#面向对象设计模式纵横谈系列课程 (2).net 2.0 海东的技术资料 ADO.NET 2.0 LoveCherryASP.NET 2.0 新特性 aiyagazeEffective C# 翻译 博客园 - .NET 2.0专题 (3)其它 李会军Enterprise Library系列文章回顾与总结 蜡人张Reporting TJVictorZedGraph类库介绍 Wu.CountryEffective C# 榻榻米好香 VML 2.博客 博客堂 孟宪会 清清月儿 愚翁专栏(C#入门系列,高级编程,WinForm) 蜡人张(报表,BI,SQL Server) 老赵点滴(Asp.Net,AJAX,架构设计等方面) 长江支流(C#,打印方面) 3.站点 博客园 CSDN论坛 MSDN 中文网站 天极网开发者网络 C#开源资源大全 Windows Forms .NET Windows Forms FAQ 本文转自peterzb博客园博客,原文链接:http://www.cnblogs.com/peterzb/archive/2009/05/24/1488497.html,如需转载请自行联系原作者

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

android Notification 学习

1 Notification notification = new Notification(com.android.internal.R.drawable.stat_sys_warning,"notification.",System.currentTimeMillis()); 2 notification.defaults = Notification.DEFAULT_SOUND; 3 notification.flags = Notification.FLAG_AUTO_CANCEL; 4 notification.tickerText="miss sdCard"; 5 NotificationManager notificationManager = (NotificationManager)mContext.getSystemService(Context.NOTIFICATION_SERVICE); 6 7 Intent mIntent = new Intent(); 8 mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 9 PendingIntent mContentIntent =PendingIntent.getActivity(mContext,0, mIntent, 0); //这里必需要用setLatestEventInfo(上下文,标题,内容,PendingIntent)不然会报错.10 notification.setLatestEventInfo(mContext, "10086", "holle, merci.", mContentIntent); 11 12 13 notificationManager.notify(0, notification); 本文转自wanqi博客园博客,原文链接http://www.cnblogs.com/wanqieddy/archive/2011/08/11/2134941.html:如需转载请自行联系原作者

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

SpringBoot学习目录

<pre> 一、基础 第一章:用一个HelloWord来阐述SpringBoot的简单与快速 第二章:SpringBoot与JSP间不可描述的秘密 第三章:SpringBoot使用SpringDataJPA完成CRUD 第四章:使用Druid作为SpringBoot项目数据源(添加监控) 第五章:配置使用FastJson返回Json视图 第六章:如何在SpringBoot项目中使用拦截器 第七章:SpringBoot整合JavaMail发送邮件 第八章:使用拦截器记录你的SpringBoot的请求日志 第九章:如何排除SpringBoot内置SpringMvc静态文件地址 第十章:配置SpringBoot支持自动装载Servlet 第十一章:实现SpringBoot单个、多个文件的上传 第十二章:SpringBoot使用LogBack作为日志组件 二、核心 第十三章:SpringBoot实战SpringDataJPA 第十四章:QueryDSL与SpringDataJPA共同服务于SpringBoot 第十五章:使用SpringBoot validator让数据更真实 第十六章:使用Redis作为SpringBoot项目数据缓存 第十七章:使用SpringSecurity让SpringBoot项目更安全 第十八章:SpringBoot项目中使用SpringSecurity整合OAuth2设计项目API安全接口服务 第十九章:使用jwt设计SpringBoot项目api接口安全服务 第二十章:SpringBoot项目中使用WebSocker配置广播式通信 第二十一章:SpringBoot项目中的全局异常处理 第二十二章:SpringBoot项目多模块运用与设计 第二十三章:SpringBoot项目多模块打包与部署 第二十四章:SpringBoot项目多数据源配置 第二十五章:SpringBoot添加支持CORS跨域访问 第二十六章:SpringBoot使用@Scheduled创建定时任务 第二十七章:SpringBoot使用ApplicationEvent&Listener完成业务解耦 第二十八章:SpringBoot使用AutoConfiguration自定义Starter 第二十九章:SpringBoot使用Lombok来优雅的编码 第三十章:SpringBoot使用MapStruct自动映射DTO 三、配置 第三十一章:SpringBoot配置文件application.properties参数详解 第三十二章:如何获取SpringBoot项目的applicationContext对象 第三十三章:修改SpringBoot启动Banner 第三十四章:SpringBoot配置类WebMvcConfigurerAdapter 四、提升 第三十五章:SpringBoot与单元测试的小秘密 第三十六章:基于SpringBoot架构重写SpringMVC请求参数装载 第三十七章:基于SpringBoot架构以及参数装载完成接口安全认证 第三十八章:基于SpringBoot架构使用Profile完成打包环境分离 第三十九章:基于SpringBoot & Quartz完成定时任务分布式单节点持久化 第四十章:基于SpringBoot & Quartz完成定时任务分布式多节点负载持久化 第四十一章:基于SpringBoot & RabbitMQ完成DirectExchange分布式消息消费 第四十二章: 基于SpringBoot设计通用框架级别系统异常回调通知处理 第四十三章:开源HGenerator代码生成Maven插件 第四十四章: 基于SpringBoot & AOP完成自定义Redis缓存数据读取 第四十五章: 基于SpringBoot & AOP完成自定义Redis缓存数据更新 第四十六章:基于SpringBoot使用MethodInterceptor打印请求参数日志 上述是有关SpringBoot初期目标的目录,后期在更新文章中可能还会添加,每次添加都会修改本文章内容,并且每次发布新文章都会添加超链接到对应的章节。SpringBoot目标达成后还会有SpringCloud去构建微服务,希望大家多多支持。 作者:恒宇少年 链接:http://www.jianshu.com/p/9a08417e4e84 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</pre> 文章摘自:https://juejin.im/post/5a0ae2bcf265da4312806f57

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

docker学习日志

# cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) # yum install docker # docker version # systemctl start docker.service # systemctl enable docker.service # vi /etc/sysconfig/docker OPTIONS='--registry-mirror=https://xxxxxxx.mirror.aliyuncs.com' # systemctl restart docker.service # docker search centos7 # docker pull centos:centos7 # docker images # docker run -it centos:centos7 /bin/bash # cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) # exit exit #再打开一个登陆窗口查看 # docker ps #docker停止后台运行的镜像? # docker stop/kill (container_id) # docker stop `docker ps|grep centos7 | awk { 'print $1'}` 本文转自 guowang327 51CTO博客,原文链接:http://blog.51cto.com/guowang327/1915308,如需转载请自行联系原作者

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

Android BroadcastReceiver 学习

BroadcastReceiver用于异步接收广播Intent。主要有两大类,用于接收广播的: 正常广播Normal broadcasts(用Context.sendBroadcast()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。 有序广播Ordered broadcasts(用Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播——不传播给其他receiver。 而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。 要注意的是,即使是Normal broadcasts,系统在某些情况下可能会恢复到一次传播给一个receiver。 特别是receiver可能需要创建一个进程,为了避免系统超载,只能一次运行一个receiver。 Broadcast Receiver 并没有提供可视化的界面来显示广播信息。可以使用Notification和Notification Manager来实现可视化的信息的界面,显示广播信息的内容,图标及震动信息。 生命周期 一个BroadcastReceiver 对象只有在被调用 onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。 因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。 发送广播 事件的广播比较简单,构建Intent对象,可调用sendBroadcast(Intent)方法将广播发出。另外还有sendOrderedBroadcast(),sendStickyBroadcast()等方法,请查阅API Doc。 1.new Intent with action name Intent intent = new Intent(String action); 或者 只是new Intent, 然后 intent.setAction(String action); 2.set data等准备好了后,in activity, sendBroadcast(Intent); // 发送广播 接收广播 通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中响应事件。 public classSMSReceiver extendsBroadcastReceiver{ @Override public void onReceive(Context context, Intent intent){ // get data from SMS intent Bundle bundle = intent.getExtras(); if(bundle != null){ // get message by "pdus" Object[] objArray = (Object[]) bundle.get( "pdus"); // rebuild SMS SmsMessage[] messages = newSmsMessage[objArray.length]; for( inti=0; i < objArray.length; i++){ messages[i] = SmsMessage.createFromPdu(( byte[])objArray[i]); StringBuilder str = newStringBuilder( "from: "); str.append(messages[i].getDisplayOriginatingAddress()); str.append( "\nmessage:\n"); str.append(messages[i].getDisplayMessageBody()); Toast.makeText(context, str.toString(), Toast.LENGTH_LONG) .show(); } } } } 注册Receiver 注册有两种方式: 1. 静态方式,在AndroidManifest.xml的application里面定义receiver并设置要接收的action。 < receiver android:name =".SMSReceiver" > < intent-filter > < action android:name ="android.provider.Telephony.SMS_RECEIVED" /> </ intent-filter > </ receiver > 2. 动态方式, 在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。 public classHelloDemo extendsActivity { privateBroadcastReceiver receiver; @Override protected voidonStart() { super.onStart(); receiver = newCallReceiver(); registerReceiver(receiver, newIntentFilter( "android.intent.action.PHONE_STATE")); } @Override protected voidonStop() { unregisterReceiver(receiver); super.onStop(); } } 一个receiver可以接收多个action的,即可以有多个intent-filter,需要在onReceive里面对intent.getAction(action name)进行判断。 个人推荐使用静态注册方式,由系统来管理receiver,而且程序里的所有receiver,可以在xml里面一目了然。而动态注册方式,隐藏在代码中,比较难发现。 而且动态注册,需要特别注意的是,在退出程序前要记得调用 Context.unregisterReceiver()方法。一般在activity的onStart()里面进行注册, onStop()里面进行注销。官方提醒,如果在Activity.onResume()里面注册了,就必须在Activity.onPause()注销。 Permission权限 要接收某些action,需要在AndroidManifest.xml里面添加相应的permission。例如接收SMS: < uses-permission android:name ="android.permission.RECEIVE_SMS" /> 下面给出动态注册的接收来电的广播处理的CallReceiver的代码: 一种方式是直接读取intent.getStringExtra("incoming_number")来获取来电号码: public classCallReceiver extendsBroadcastReceiver { @Override public voidonReceive(Context context, Intent intent) { TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); switch(teleManager.getCallState()){ caseTelephonyManager.CALL_STATE_RINGING: //响铃 Toast.makeText(context, "Ringing: "+ intent.getStringExtra( "incoming_number"), Toast.LENGTH_LONG).show(); break; caseTelephonyManager.CALL_STATE_OFFHOOK: //接听 Toast.makeText(context, "OffHook: "+ intent.getStringExtra( "incoming_number"), Toast.LENGTH_LONG).show(); break; caseTelephonyManager.CALL_STATE_IDLE: //挂断 Toast.makeText(m_context, "Idle: "+ incomingNumber, Toast.LENGTH_LONG).show(); break; } } } 在运行时,发现除了响铃时可以获取来电号码,接听和挂断都不能成功获取的,显示为null。 另一种方式是通过PhoneStateListener的onCallStateChanged来监听状态的变化: public classCallReceiver extendsBroadcastReceiver { privateContext m_context; @Override public voidonReceive(Context context, Intent intent) { m_context = context; TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); teleManager.listen(newPhoneStateListener(){ @Override public voidonCallStateChanged( intstate, String incomingNumber) { switch(state){ caseTelephonyManager.CALL_STATE_RINGING: //响铃 Toast.makeText(m_context, "Ringing: "+ incomingNumber, Toast.LENGTH_LONG) .show(); break; caseTelephonyManager.CALL_STATE_OFFHOOK: //接听 Toast.makeText(m_context, "OffHook: "+ incomingNumber, Toast.LENGTH_LONG) .show(); break; caseTelephonyManager.CALL_STATE_IDLE: //挂断 Toast.makeText(m_context, "Idle: "+ incomingNumber, Toast.LENGTH_LONG) .show(); break; } }} , PhoneStateListener.LISTEN_CALL_STATE); } } 运行时也发现incomingNumber在接听和挂断时获取为blank。 因为这里监听的是通话的状态变化,所以这个receiver会被调用3次。 监听通话状态需要加上权限: < uses-permission android:name ="android.permission.READ_PHONE_STATE" /> =========== 小结: 1. 对于sendBroadCast的intent对象,需要设置其action name; 2. 推荐使用显式指明receiver,在配置文件AndroidManifest.xml指明; 3. 一个receiver可以接收多个action; 4. 每次接收广播都会重新生成一个接收广播的对象,再次调用onReceive; 5. 在BroadCast 中尽量不要处理太多逻辑问题,建议复杂的逻辑交给Activity 或者 Service 去处理。 本文转自 Icansoft 51CTO博客,原文链接:http://blog.51cto.com/android/521784

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

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

用户登录
用户注册