├── .DS_Store ├── README.md ├── android ├── .DS_Store └── PhoneGap.txt ├── ask.txt ├── ebook ├── .DS_Store ├── Apache_Mina_Server_2.0中文参考手册V1.0.pdf ├── CSS完全参考手册3.0.chm ├── Hadoop in Action.pdf ├── JAVA并发库.png ├── Java NIO中文.pdf ├── Java并发编程:设计原则与模式(第二版).pdf ├── Java虚拟机规范(Java SE 7).pdf ├── Logback_manual_chs.pdf ├── Lua中文教程.pdf ├── MINA2官方教程翻译.pdf ├── Mina2.0快速入门与源码剖析.pdf ├── MySQL.pdf ├── Pro_Spring中文版.pdf ├── RSA基本理解.txt ├── Spring 的骨骼架构.doc ├── Spring.Roo.in.Action.pdf ├── Thinking in Java简体中文第二版.pdf ├── Web请求异步处理和海量数据即时分析在淘宝开放平台的实践(岑文初).pdf ├── groovy.in.action.pdf ├── java多线程设计模式详解.pdf ├── java并发编程实践.pdf ├── linux常用命令.png ├── mysql.chm ├── 七周七语言.pdf ├── 深入理解Apache_Mina.pdf ├── 看书笔记.txt ├── 购买道具.jpg ├── 阿里巴巴中文站架构设计实践(何_).pdf ├── 高性能MySQL.pdf └── 高性能高并发服务器架构.doc ├── java ├── .DS_Store ├── JDBC性能小贴士.txt ├── Random.txt ├── eclipse实现团队代码规范标准.txt ├── game_login_flow.txt ├── item_desgin.txt ├── java.lang.txt ├── java性能测试.txt ├── keytool.txt ├── logback完美展现.txt ├── mybatis缓存和延迟加载.txt ├── mybatis缓存和延迟加载.txt~ ├── nbandroid-key.txt ├── spring-mvc实践.txt ├── ubuntu软件管理常用命令.txt ├── 多人副本跨服.txt ├── 定义游戏flow层.txt ├── 定义游戏flow层.txt~ ├── 正则表达式.txt ├── 游戏log系统.txt └── 网络同步.txt ├── linux ├── command ├── command~ └── soft_install_describe ├── lua ├── .DS_Store ├── cocos2d-x.txt └── lua的遍历问题.txt ├── mybatis-code-generate ├── .DS_Store ├── database.server_generator.xml ├── generator.xml ├── generator.xml_temp ├── mybatis-generator-config_1_0.dtd ├── mybatis-generator-core-1.3.2-sources.jar ├── mybatis-generator-core-1.3.2.jar ├── mysql-connector-java-5.1.18-bin.jar ├── run.sh ├── src │ ├── .DS_Store │ └── com │ │ ├── .DS_Store │ │ └── xincao │ │ ├── .DS_Store │ │ └── database │ │ ├── .DS_Store │ │ └── server │ │ ├── .DS_Store │ │ ├── mapper │ │ ├── .DS_Store │ │ ├── MailBoxMapper.java │ │ ├── MailMapper.java │ │ ├── PlayerMapper.java │ │ └── mybatis │ │ │ ├── .DS_Store │ │ │ ├── MailBoxMapper.xml │ │ │ ├── MailMapper.xml │ │ │ └── PlayerMapper.xml │ │ └── model │ │ ├── .DS_Store │ │ ├── Mail.java │ │ ├── MailBox.java │ │ ├── Player.java │ │ └── Test.java └── temp_database.server_generator.xml-e └── shell ├── .DS_Store ├── crontab.sh ├── jstat.sh └── lowercase_to_uppercase.sh /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | note 2 | ==== 3 | 4 | 记录平时灵感 5 | -------------------------------------------------------------------------------- /android/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/android/.DS_Store -------------------------------------------------------------------------------- /android/PhoneGap.txt: -------------------------------------------------------------------------------- 1 | 因为,最近一直想做款基于web的app,因此,个人GOOGLE了一天,搭建起了,基本的开发框架。 2 | 这里整理,以方便日后的学习。 3 | 开发需求:基于web的app 4 | 技术支持:android SDK, netbeans8.0 + NBAndroid插件,PhoneGap,artTemplate(js模版引擎) 5 | 一切从这里开始, 6 | 1.netbeans + NBAndroid 7 | 这样的选择,可能和本人对软件开发的理解和偏好有关系。eclipse的插件太多了,当开发时候,总需要安装N个插件,这让事情变的很乱。 8 | 2.android SDK 9 | 从android官网下载对应版本的SDK,按照说明进行安装。(不再详述) 10 | 3.PhoneGap 11 | 从官网下载,PhoneGap压缩包。按照自己希望打包平台选择使用不同的文件,从官方文档中查找使用说明。 12 | 4.artTemplate 13 | 选择使用artTemplate js模版引擎,是想通过,json数据传输,手机渲染效果,来减少对网络的依赖,且能真正实现展示和业务数据分离。 14 | 通过,这几天感觉自己对springMVC高级的使用,还是实践的太少了,如果,有机会的话,以后,当补足。 15 | -------------------------------------------------------------------------------- /ask.txt: -------------------------------------------------------------------------------- 1 | 1.路径问题:java中文件的路径,一直让我摸不着边。一种情况是,文件在classpath中,可以通过类加载器来读取。另一种是,文件在文件系统中,需要通过绝对路径,或者相对路径来读取,不管那种方式让人总感觉存在硬编码问题。 2 | 2.开发实践中会面临的问题:这次,开发TODO,让我意识到一些问题。列举出来,以免,将来再发生。 3 | 目标:事件A完成 4 | 为了完成A事件,我找了好多解决方案,最终,事情不是A了,而是,A的3,4倍。这是为什么?最后我总结了。因为我的关注点,发生了变化,本来是A,后来,我被细节吸引,最终,精力有限,再也搞不下去。现在,只能回到最初。 5 | 求知欲是好事,但是,如果能把事情,分阶段,抓重点去处理,那才能获得真正的提升。OK -------------------------------------------------------------------------------- /ebook/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/.DS_Store -------------------------------------------------------------------------------- /ebook/Apache_Mina_Server_2.0中文参考手册V1.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Apache_Mina_Server_2.0中文参考手册V1.0.pdf -------------------------------------------------------------------------------- /ebook/CSS完全参考手册3.0.chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/CSS完全参考手册3.0.chm -------------------------------------------------------------------------------- /ebook/Hadoop in Action.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Hadoop in Action.pdf -------------------------------------------------------------------------------- /ebook/JAVA并发库.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/JAVA并发库.png -------------------------------------------------------------------------------- /ebook/Java NIO中文.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Java NIO中文.pdf -------------------------------------------------------------------------------- /ebook/Java并发编程:设计原则与模式(第二版).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Java并发编程:设计原则与模式(第二版).pdf -------------------------------------------------------------------------------- /ebook/Java虚拟机规范(Java SE 7).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Java虚拟机规范(Java SE 7).pdf -------------------------------------------------------------------------------- /ebook/Logback_manual_chs.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Logback_manual_chs.pdf -------------------------------------------------------------------------------- /ebook/Lua中文教程.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Lua中文教程.pdf -------------------------------------------------------------------------------- /ebook/MINA2官方教程翻译.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/MINA2官方教程翻译.pdf -------------------------------------------------------------------------------- /ebook/Mina2.0快速入门与源码剖析.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Mina2.0快速入门与源码剖析.pdf -------------------------------------------------------------------------------- /ebook/MySQL.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/MySQL.pdf -------------------------------------------------------------------------------- /ebook/Pro_Spring中文版.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Pro_Spring中文版.pdf -------------------------------------------------------------------------------- /ebook/RSA基本理解.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/RSA基本理解.txt -------------------------------------------------------------------------------- /ebook/Spring 的骨骼架构.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Spring 的骨骼架构.doc -------------------------------------------------------------------------------- /ebook/Spring.Roo.in.Action.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Spring.Roo.in.Action.pdf -------------------------------------------------------------------------------- /ebook/Thinking in Java简体中文第二版.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Thinking in Java简体中文第二版.pdf -------------------------------------------------------------------------------- /ebook/Web请求异步处理和海量数据即时分析在淘宝开放平台的实践(岑文初).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/Web请求异步处理和海量数据即时分析在淘宝开放平台的实践(岑文初).pdf -------------------------------------------------------------------------------- /ebook/groovy.in.action.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/groovy.in.action.pdf -------------------------------------------------------------------------------- /ebook/java多线程设计模式详解.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/java多线程设计模式详解.pdf -------------------------------------------------------------------------------- /ebook/java并发编程实践.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/java并发编程实践.pdf -------------------------------------------------------------------------------- /ebook/linux常用命令.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/linux常用命令.png -------------------------------------------------------------------------------- /ebook/mysql.chm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/mysql.chm -------------------------------------------------------------------------------- /ebook/七周七语言.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/七周七语言.pdf -------------------------------------------------------------------------------- /ebook/深入理解Apache_Mina.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/深入理解Apache_Mina.pdf -------------------------------------------------------------------------------- /ebook/看书笔记.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/看书笔记.txt -------------------------------------------------------------------------------- /ebook/购买道具.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/购买道具.jpg -------------------------------------------------------------------------------- /ebook/阿里巴巴中文站架构设计实践(何_).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/阿里巴巴中文站架构设计实践(何_).pdf -------------------------------------------------------------------------------- /ebook/高性能MySQL.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/高性能MySQL.pdf -------------------------------------------------------------------------------- /ebook/高性能高并发服务器架构.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/ebook/高性能高并发服务器架构.doc -------------------------------------------------------------------------------- /java/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/.DS_Store -------------------------------------------------------------------------------- /java/JDBC性能小贴士.txt: -------------------------------------------------------------------------------- 1 | JDBC性能小贴士 2 | 本文收集了一些用于提升JDBC性能的方法。Java应用或者JavaEE Web应用的性能是很重要的,尤其是数据库后端对应用的性能影响。不知你是否经历过Java、JavaEE web应用非常慢的案例没有(处理一个简单的请求都要花上好几秒的时间用于数据库访问,分页、排序等)。下面这些贴士也许能提升Java应用的性能。它们非常简单同时还可以应用于其它编程语言,如果是用数据库作为后端存储的话。 3 | 4 | 这几个JDBC性能贴示不见得有多酷或者有些你从没听说过,虽然讲的很基础但是在实践中上很多程序员经常忽略它们,当然你可能把标题称为数据库性能提示。 5 | 6 | JDBC性能贴士一:使用缓存 7 | 8 | 查出应用中有 多少数据库调用 ,然后把它们减到最少,不管你信不信性能问题大多数情况下罪魁祸首是访问数据库的那些代码。因为连接到数据库需要准备好连接(connections),还有往返的网络传输和数据库系统后端的处理。如果你可以把数据缓存下来的话这是减少数据库调用最好的方式,即使你的应用有完全动态的数据,短暂的缓存可以节省很大的数据苦往返的传输。加速Java应用后至少能减少20-50%的数据库调用,如果想找出数据库调用,那么仅仅把DAO层的每个db调用中记录到日志中就行,如果记录好每个线程进入和退出数据库访问的时间更好,它能告诉你一个调用究竟花了多少时间。 9 | 10 | JDBC性能贴士二:使用数据库索引 11 | 12 | 检查数据库列上(columns)是否有索引,如果你正做查询发现所花的时间比预想的要长,那么首先想到的是检查在列上(正在查询的where子句中的那列)是否做了索引。程序员中常犯这个错误,有索引和没有索引在做查询时有巨大的差异。这条贴士在性能上至少能提速100%,当然合适的索引更重要,太多的索引反而会减慢数据的插入和更新操作。因此使用索引的时候要小心,象id、类别(category)、类(class)等字段上做索引是经常使用的。 13 | 14 | JDBC性能贴士三:使用PreparedStatement 15 | 16 | 使用PreparedStatement或者存储过程(Stored Procedure)执行查询时PreparedStatement(预处理语句)比普通的Statement对象要快。因为数据库可以对查询语句做预处理何查询缓存计划。 因此总是使用 ** 参数化形式的预处理语句** 如SELECT * FROM table WHERE id=?,而不要使用SELECT * FROM table WHERE id='"+id "',虽然后者仍是一个预处理语句但不是参数化的。使用第二种查询方式在性能上没有任何优势,更多参考可以查下看JDBC为什么要使用PreparedStatement而不是Statement 17 | 18 | JDBC性能贴士四:使用数据库连接池 19 | 20 | 连接池用来存放数据库连接(Connection),创建数据库连接是个比较慢的过程而且会耗很长时间。所以如果每个请求都要创建一个连接,那么显然响应时间将会更长。用连接池根据上游的流量及并发请求数创建适当数量的连接。即使连接池在开始的请求中创建连接、缓存连接会比较慢,但总体还是能减不少开销。 21 | 22 | JDBC性能贴士五:使用JDBC批量更新 23 | 24 | 使用JDBC批量更新操作能显著提升Java数据库应用的性能。你应该始终用批量处理来执行插入和更新操作。通过使用Statment或者PreparedStatement做批量查询。用executeBatch()方法做批量查询。 25 | 26 | JDBC性能贴士六:取消自动提交 27 | 28 | 查询时设置setAutoCommit(false),默认JDBC连接自动提交模式是打开的,意味着每个独立的SQL语句都将在自己的事务中执行。然而你可以把SQL语句按组归到一个逻辑事务中去,这样通过调用commit()或rollback()要么提交要么回滚。试着运行相同数量的查询次数对比一下使用自动提交和不使用自动提交时的性能区别有多大的差异性。 29 | 30 | 这些Java数据库应用性能小提示看起来非常简单,很多高级Java程序员能熟练运用在生产级代码中,但我还看到很多Java程序员并没有在乎这些,直到他们发现Java应用变得很慢时。所以对于新手来说有必要记住它使用它。同时你还可以使用这些Java性能小提示作为代码审查机制的一个参考,在你写的Java应用是使用数据库作为后端存储的时候。 31 | 32 | 以上就是关于如何改善Java应用程序的性能的贴士,如果你有什么更好的提示不妨给我留言。 -------------------------------------------------------------------------------- /java/Random.txt: -------------------------------------------------------------------------------- 1 | java.util.Random(伪随机) 2 | 伪随机特点: 3 | 1、java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字; 4 | 2、相同种子数的Random对象,相同次数生成的随机数字是完全相同的; 5 | 3、Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等; 6 | java.lang.Math.random () 方法中创建的 java.util.Random对象为单例 7 | -------------------------------------------------------------------------------- /java/eclipse实现团队代码规范标准.txt: -------------------------------------------------------------------------------- 1 | Java Code Style 2 | Eclipse中的Java Code Style为软件编码提供了极大的方便。CodeStyle一般有3个功能: 3 | Formatter,格式化代码为有序的格式,形成良好代码风格; 4 | Code Template,辅助生成模板代码,提高编码效率; 5 | Clean Up,格式化代码并清理或补全代码的相关项,统一代码风格; 6 | CheckStyle的使用 7 | 为了保证整个团队的代码风格统一,需要对代码做代码风格检查。通常开发人员在提交代码之前,先对整个工程中的Java代码执行CleanUp,然后使用CheckStyle来检查代码风格。 -------------------------------------------------------------------------------- /java/game_login_flow.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/game_login_flow.txt -------------------------------------------------------------------------------- /java/item_desgin.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/item_desgin.txt -------------------------------------------------------------------------------- /java/java.lang.txt: -------------------------------------------------------------------------------- 1 | 提供利用 Java 编程语言进行程序设计的基础类。 2 | 3 | 接口摘要 4 | Appendable 能够被添加 char 序列和值的对象。 5 | CharSequence CharSequence 是 char 值的一个可读序列。 6 | Cloneable 此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 7 | Comparable 此接口强行对实现它的每个类的对象进行整体排序。 8 | Iterable 实现这个接口允许对象成为 "foreach" 语句的目标。 9 | Readable Readable 是一个字符源。 10 | Runnable Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。 11 | Thread.UncaughtExceptionHandler 当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。 12 | 13 | 14 | 类摘要 15 | Boolean Boolean 类将基本类型为 boolean 的值包装在一个对象中。 16 | Byte Byte 类将基本类型 byte 的值包装在一个对象中。 17 | Character Character 类在对象中包装一个基本类型 char 的值。 18 | Character.Subset 此类的实例表示 Unicode 字符集的特定子集。 19 | Character.UnicodeBlock 表示 Unicode 规范中字符块的一系列字符子集。 20 | Class Class 类的实例表示正在运行的 Java 应用程序中的类和接口。 21 | ClassLoader 类加载器是负责加载类的对象。 22 | Compiler Compiler 类主要支持 Java 到本机代码的编译器及相关服务。 23 | Double Double 类在对象中包装一个基本类型 double 的值。 24 | Enum> 这是所有 Java 语言枚举类型的公共基本类。 25 | Float Float 类在对象中包装一个基本类型 float 的值。 26 | InheritableThreadLocal 该类扩展了 ThreadLocal,为子线程提供从父线程那里继承的值:在创建子线程时,子线程会接收所有可继承的线程局部变量的初始值,以获得父线程所具有的值。 27 | Integer Integer 类在对象中包装了一个基本类型 int 的值。 28 | Long Long 类在对象中包装了基本类型 long 的值。 29 | Math Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 30 | Number 抽象类 Number 是 BigDecimal、BigInteger、Byte、Double、Float、Integer、Long 和 Short 类的超类。 31 | Object 类 Object 是类层次结构的根类。 32 | Package Package 对象包含有关 Java 包的实现和规范的版本信息。 33 | Process ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息。 34 | ProcessBuilder 此类用于创建操作系统进程。 35 | Runtime 每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。 36 | RuntimePermission 该类用于运行时权限。 37 | SecurityManager 安全管理器是一个允许应用程序实现安全策略的类。 38 | Short Short 类在对象中包装基本类型 short 的值。 39 | StackTraceElement 堆栈跟踪中的元素,它由 Throwable.getStackTrace() 返回。 40 | StrictMath StrictMath 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 41 | String String 类代表字符串。 42 | StringBuffer 线程安全的可变字符序列。 43 | StringBuilder 一个可变的字符序列。 44 | System System 类包含一些有用的类字段和方法。 45 | Thread 线程 是程序中的执行线程。 46 | ThreadGroup 线程组表示一个线程的集合。 47 | ThreadLocal 该类提供了线程局部 (thread-local) 变量。 48 | Throwable Throwable 类是 Java 语言中所有错误或异常的超类。 49 | Void Void 类是一个不可实例化的占位符类,它持有对表示 Java 关键字 void 的 Class 对象的引用。 50 | 51 | 52 | 枚举摘要 53 | Thread.State 线程状态。 54 | 55 | 56 | 异常摘要 57 | ArithmeticException 当出现异常的运算条件时,抛出此异常。 58 | ArrayIndexOutOfBoundsException 用非法索引访问数组时抛出的异常。 59 | ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常。 60 | ClassCastException 当试图将对象强制转换为不是实例的子类时,抛出该异常。 61 | ClassNotFoundException 当应用程序试图使用以下方法通过字符串名加载类时,抛出该异常: Class 类中的 forName 方法。 62 | CloneNotSupportedException 当调用 Object 类中的 clone 方法复制对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。 63 | EnumConstantNotPresentException 当应用程序试图通过名称和枚举类型访问那些不包含具有指定名称的常量的枚举常量时,抛出该异常。 64 | Exception Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。 65 | IllegalAccessException 当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时,抛出 IllegalAccessException。 66 | IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。 67 | IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 68 | IllegalStateException 在非法或不适当的时间调用方法时产生的信号。 69 | IllegalThreadStateException 指示线程没有处于请求操作所要求的适当状态时抛出的异常。 70 | IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 71 | InstantiationException 当应用程序试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常。 72 | InterruptedException 当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。 73 | NegativeArraySizeException 如果应用程序试图创建大小为负的数组,则抛出该异常。 74 | NoSuchFieldException 类不包含指定名称的字段时产生的信号。 75 | NoSuchMethodException 无法找到某一特定方法时,抛出该异常。 76 | NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常。 77 | NumberFormatException 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 78 | RuntimeException RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。 79 | SecurityException 由安全管理器抛出的异常,指示存在安全侵犯。 80 | StringIndexOutOfBoundsException 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 81 | TypeNotPresentException 当应用程序试图使用表示类型名称的字符串对类型进行访问,但无法找到带有指定名称的类型定义时,抛出该异常。 82 | UnsupportedOperationException 当不支持请求的操作时,抛出该异常。 83 | 84 | 85 | 错误摘要 86 | AbstractMethodError 当应用程序试图调用一个抽象方法时,抛出此错误。 87 | AssertionError 抛出该异常指示某个断言失败。 88 | ClassCircularityError 当初始化类时检测到类的循环调用的时候,抛出该错误。 89 | ClassFormatError 当 Java 虚拟机试图读取类文件并确定该文件存在格式错误或无法解释为类文件时,抛出该错误。 90 | Error Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。 91 | ExceptionInInitializerError 静态初始化程序中发生意外异常的信号。 92 | IllegalAccessError 当应用程序试图访问或修改它不能访问的字段,或调用它不能访问的方法时,抛出该异常。 93 | IncompatibleClassChangeError 在某些类定义中出现不兼容的类更改时抛出该异常。 94 | InstantiationError 当应用程序试图使用 Java 的 new 结构来实例化一个抽象类或一个接口时,抛出该异常。 95 | InternalError 该异常指示 Java 虚拟机中出现一些意外的内部错误。 96 | LinkageError LinkageError 的子类指示一个类在一定程度上依赖于另一个类;但是,在编译前一个类之后,后一个类发生了不相容的改变。 97 | NoClassDefFoundError 当 Java 虚拟机或 ClassLoader 实例试图在类的定义中加载(作为通常方法调用的一部分或者作为使用 new 表达式创建的新实例的一部分),但无法找到该类的定义时,抛出此异常。 98 | NoSuchFieldError 如果应用程序试图访问或修改一个指定的对象字段,而该对象不再包含该字段时,抛出该异常。 99 | NoSuchMethodError 当应用程序试图调用类(静态或实例)的指定方法,而该类已不再具有该方法的定义时,抛出该异常。 100 | OutOfMemoryError 因为内存溢出或没有可用的内存提供给垃圾回收器时,Java 虚拟机无法分配一个对象,这时抛出该异常。 101 | StackOverflowError 当应用程序递归太深而发生堆栈溢出时,抛出该错误。 102 | ThreadDeath 调用 Thread 类中带有零参数的 stop 方法时,受害线程将抛出一个 ThreadDeath 实例。 103 | UnknownError 当 Java 虚拟机中出现一个未知但严重的异常时,抛出该错误。 104 | UnsatisfiedLinkError 当 Java 虚拟机无法找到声明为 native 的方法的适当本地语言定义时,抛出该错误。 105 | UnsupportedClassVersionError 当 Java 虚拟机试图读取一个类文件,并确定文件的主辅版本号不受支持时,抛出该错误。 106 | VerifyError 当“校验器”检测到一个类文件虽然格式正确,但包含着一些内部不一致性或安全性问题时,抛出该错误。 107 | VirtualMachineError 当 Java 虚拟机崩溃或用尽了它继续操作所需的资源时,抛出该错误。 108 | 109 | 110 | 注释类型摘要 111 | Deprecated 用 @Deprecated 注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择。 112 | Override 表示一个方法声明打算重写超类中的另一个方法声明。 113 | SuppressWarnings 指示应该在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告。 -------------------------------------------------------------------------------- /java/java性能测试.txt: -------------------------------------------------------------------------------- 1 | 在性能测试过程中,有时候可能会有java应用CPU占用过高的情况,这时候就需要对CPU进行监控分析,以帮助开发人员进行性能调优。有以下两种方法可以对性能进行监控分析。 2 | java应用在运行的过程中可能会产生好多个线程,每个线程各自执行相应的java代码。在CPU占用过高的时候,我只要知道哪个线程在运行,就能知道哪部分代码的执行占用CPU过高。 3 | 第一步:查看java进程号和占用资源过多的线程号 4 | 查看java进程号: 5 | ps -ef | grep java 6 | 查看占用资源过多的线程号 7 | top -H 8 | 第二步:获取thread dump日志 9 | jstack -l 10 | 取上面耗费CPU最高的第一行的PID 2094,将其转化为十六进制得到0x82e。然后在thread dump日志中搜索0x82e,将会搜到如下信息: 11 | 日志中的nid即是线程号。这样可以清晰的看到耗费CPU的源代码的具体位置,可以精确到行号。 12 | 这种方法我觉得不好。从堆栈信息中只能看出jdk以及netty的一些类的调用,并没有体现出应用代码的具体位置。 13 | jprofiler监控 14 | CPU Views—Hot Spots如下图 15 | 从上图可以看出是Ehcache的put占用了60%的CPU时间。这是因为我们的采集在接收到数据,执行messageReceived方法的时候要往Ehcache里面put。这样就导致了cpu占用过高。 16 | -------------------------------------------------------------------------------- /java/keytool.txt: -------------------------------------------------------------------------------- 1 | keytool -genkey -alias jingxin191314@foxmail.com -keyalg RSA -keysize 1024 -validity 365 -------------------------------------------------------------------------------- /java/logback完美展现.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/logback完美展现.txt -------------------------------------------------------------------------------- /java/mybatis缓存和延迟加载.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/mybatis缓存和延迟加载.txt -------------------------------------------------------------------------------- /java/mybatis缓存和延迟加载.txt~: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/mybatis缓存和延迟加载.txt~ -------------------------------------------------------------------------------- /java/nbandroid-key.txt: -------------------------------------------------------------------------------- 1 | PKPwu9AKVqQ4grFkLBE7OmfENpok2jDAyoaJBPwxFAUK08VsS+husBF0WwjDg60XrFfJdGN3dhSl 2 | WPxi0kJ+Hv6OQ8b9iOHRitiS1qwFrjGjU2TzA5ukR14C63V5l0lwiTT4+VhbbxwnSghqL7flGkg8 3 | g/CstAvvVgZgh3mBU3vHFD1ndsyVkH9FJhMiEYBY/xw0TDrx7zxdQWMyXvwIRbP8U1dM7cJPY4Ha 4 | aJa4ZoaDvDuiNK0IfI6vsPaPmrJ4YGg+oVlodNoc56nJPxWz8yOvavZVD2M2XVZuYAtQhkCwramc 5 | lrboZZQ6RQoz2IX4ohCT36/QbQqqoz0biYpXEA== 6 | -------------------------------------------------------------------------------- /java/spring-mvc实践.txt: -------------------------------------------------------------------------------- 1 | 开发目的:Spring-Mvc实践 2 | 开发工具:Netbeans 3 | 技术选择:Spring-Mvc Mybatis Volecity Memcache Jquery Bootstrap 4 | 平台:JDK Bean Validation 5 | 开发分层 6 | Spring-Mvc + Mybatis + Volecity 后端 7 | Jquery + Bootstrap 前端 8 | Mybatis + Memcache 调优策略 9 | 10 | 案例1:注册用户表单 11 | 客户端 12 | 1.Bootstrap 展现的表单 13 | 2.客户输入数据到表单 14 | 3.Jquery Jquery.Validate 进行表单数据校验 15 | 服务器 16 | 1.Spring-Mvc + Bean Validation(hibernate-validator-5.1.0.Final.jar + validation-api-1.1.0.Final.jar) 注解对表单输入进行校验 17 | 2.Mybatis + Memcache Mybatis Mybatis数据进行插入,Memcache中缓存更新 18 | 感悟:多层次,结构更加清晰,后期维护升级简单。 19 | 基础设计快完成了。感觉自己对spring mvc 还是不理解,只能借助于度娘和谷歌。实在惭愧,不过我正打算降低开发速度。可以给我更多的时间去学习。 20 | -------------------------------------------------------------------------------- /java/ubuntu软件管理常用命令.txt: -------------------------------------------------------------------------------- 1 | 软件包管理: 2 | 更新软件包列表 sudo apt-get update 3 | 更新所有的软件 sudo apt-get upgrade 4 | 更新 Ubuntu:sudo do-release-upgrade 5 | 设置更新源:sudo vi /etc/apt/sources.list 6 | 查看软件包的信息(描述):apt-cache show mysql-server 7 | 安装软件包:sudo apt-get install apache 8 | 查找可用的软件包:apt-cache search mysql | grep server 9 | 检查某个软包是否已经安装:dpkg -l mysql 10 | 查看某个软件包包含哪些文件:dpkg -L mysql -------------------------------------------------------------------------------- /java/多人副本跨服.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/多人副本跨服.txt -------------------------------------------------------------------------------- /java/定义游戏flow层.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/定义游戏flow层.txt -------------------------------------------------------------------------------- /java/定义游戏flow层.txt~: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/定义游戏flow层.txt~ -------------------------------------------------------------------------------- /java/正则表达式.txt: -------------------------------------------------------------------------------- 1 | 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。 2 | 正则表达式示例 3 | 表达式 匹配 4 | /^\s*$/ 5 | 匹配空行。 6 | /\d{2}-\d{5}/ 7 | 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 8 | /<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ 9 | 匹配 HTML 标记。 10 | 下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为: 11 | 字符 说明 12 | \ 13 | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。 14 | ^ 15 | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与“\n”或“\r”之后的位置匹配。 16 | $ 17 | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与“\n”或“\r”之前的位置匹配。 18 | * 19 | 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,}。 20 | + 21 | 一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}。 22 | ? 23 | 零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。 24 | {n} 25 | n 是非负整数。正好匹配 n 次。例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。 26 | {n,} 27 | n 是非负整数。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。“o{1,}”等效于“o+”。“o{0,}”等效于“o*”。 28 | {n,m} 29 | M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,“o{1,3}”匹配“fooooood”中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。 30 | ? 31 | 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”。 32 | . 33 | 匹配除“\n”之外的任何单个字符。若要匹配包括“\n”在内的任意字符,请使用诸如“[\s\S]”之类的模式。 34 | (pattern) 35 | 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用“\(”或者“\)”。 36 | (?:pattern) 37 | 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“or”字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。 38 | (?=pattern) 39 | 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配“Windows 2000”中的“Windows”,但不匹配“Windows 3.1”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 40 | (?!pattern) 41 | 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配“Windows 3.1”中的 “Windows”,但不匹配“Windows 2000”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 42 | x|y 43 | 匹配 x 或 y。例如,'z|food' 匹配“z”或“food”。'(z|f)ood' 匹配“zood”或“food”。 44 | [xyz] 45 | 字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”。 46 | [^xyz] 47 | 反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”。 48 | [a-z] 49 | 字符范围。匹配指定范围内的任何字符。例如,“[a-z]”匹配“a”到“z”范围内的任何小写字母。 50 | [^a-z] 51 | 反向范围字符。匹配不在指定的范围内的任何字符。例如,“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符。 52 | \b 53 | 匹配一个字边界,即字与空格间的位置。例如,“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”。 54 | \B 55 | 非字边界匹配。“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”。 56 | \cx 57 | 匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是“c”字符本身。 58 | \d 59 | 数字字符匹配。等效于 [0-9]。 60 | \D 61 | 非数字字符匹配。等效于 [^0-9]。 62 | \f 63 | 换页符匹配。等效于 \x0c 和 \cL。 64 | \n 65 | 换行符匹配。等效于 \x0a 和 \cJ。 66 | \r 67 | 匹配一个回车符。等效于 \x0d 和 \cM。 68 | \s 69 | 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 70 | \S 71 | 匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。 72 | \t 73 | 制表符匹配。与 \x09 和 \cI 等效。 74 | \v 75 | 垂直制表符匹配。与 \x0b 和 \cK 等效。 76 | \w 77 | 匹配任何字类字符,包括下划线。与“[A-Za-z0-9_]”等效。 78 | \W 79 | 与任何非单词字符匹配。与“[^A-Za-z0-9_]”等效。 80 | \xn 81 | 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,“\x41”匹配“A”。“\x041”与“\x04”&“1”等效。允许在正则表达式中使用 ASCII 代码。 82 | \num 83 | 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,“(.)\1”匹配两个连续的相同字符。 84 | \n 85 | 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。 86 | \nm 87 | 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m。如果两种前面的情况都不存在,则 \nm 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。 88 | \nml 89 | 当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。 90 | \un 91 | 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。 92 | 93 | 正则表达式的用途 94 | 95 | 测试字符串内的模式。 96 | 例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 97 | 替换文本。 98 | 可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 99 | 基于模式匹配从字符串中提取子字符串。 100 | 可以查找文档内或输入域内特定的文本。 101 | -------------------------------------------------------------------------------- /java/游戏log系统.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/java/游戏log系统.txt -------------------------------------------------------------------------------- /java/网络同步.txt: -------------------------------------------------------------------------------- 1 |  同步在网络游戏中是非常重要的,它保证了每个玩家在屏幕上看到的东西大体是一样的。其实呢,解决同步问题的最简单的方法就是把每个玩家的动作都向其他玩家广播一遍,这里其实就存在两个问题:1,向哪些玩家广播,广播哪些消息。2,如果网络延迟怎么办。事实上呢,第一个问题是个非常简单的问题,不过之所以我提出这个问题来,是提醒大家在设计自己的消息结构的时候,需要把这个因素考虑进去。而对于第二个问题,则是一个挺麻烦的问题,大家可以来看这么个例子: 2 |   比如有一个玩家A向服务器发了条指令,说我现在在P1点,要去P2点。指令发出的时间是T0,服务器收到指令的时间是T1,然后向周围的玩家广播这条消息,消息的内容是“玩家A从P1到P2”有一个在A附近的玩家B,收到服务器的这则广播的消息的时间是T2,然后开始在客户端上画图,A从P1到P2点。这个时候就存在一个不同步的问题,玩家A和玩家B的屏幕上显示的画面相差了T2-T1的时间。这个时候怎么办呢? 3 |   有个解决方案,我给它取名叫 预测拉扯,虽然有些怪异了点,不过基本上大家也能从字面上来理解它的意思。要解决这个问题,首先要定义一个值叫:预测误差。然后需要在服务器端每个玩家连接的类里面加一项属性,叫TimeModified,然后在玩家登陆的时候,对客户端的时间和服务器的时间进行比较,得出来的差值保存在TimeModified里面。还是上面的那个例子,服务器广播消息的时候,就根据要广播对象的TimeModified,计算出一个客户端的CurrentTime,然后在消息头里面包含这个CurrentTime,然后再进行广播。并且同时在玩家A的客户端本地建立一个队列,保存该条消息,只到获得服务器验证就从未被验证的消息队列里面将该消息删除,如果验证失败,则会被拉扯回P1点。然后当玩家B收到了服务器发过来的消息“玩家A从P1到P2”这个时候就检查消息里面服务器发出的时间和本地时间做比较,如果大于定义的预测误差,就算出在T2这个时间,玩家A的屏幕上走到的地点P3,然后把玩家B屏幕上的玩家A直接拉扯到P3,再继续走下去,这样就能保证同步。更进一步,为了保证客户端运行起来更加smooth,我并不推荐直接把玩家拉扯过去,而是算出P3偏后的一点P4,然后用(P4-P1)/T(P4-P3)来算出一个很快的速度S,然后让玩家A用速度S快速移动到P4,这样的处理方法是比较合理的,这种解决方案的原形在国际上被称为(Full plesiochronous),当然,该原形被我篡改了很多来适应网络游戏的同步,所以而变成所谓的:预测拉扯。 4 |   另外一个解决方案,我给它取名叫 验证同步,听名字也知道,大体的意思就是每条指令在经过服务器验证通过了以后再执行动作。具体的思路如下:首先也需要在每个玩家连接类型里面定义一个TimeModified,然后在客户端响应玩家鼠标行走的同时,客户端并不会先行走动,而是发一条走路的指令给服务器,然后等待服务器的验证。服务器接受到这条消息以后,进行逻辑层的验证,然后计算出需要广播的范围,包括玩家A在内,根据各个客户端不同的TimeModified生成不同的消息头,开始广播,这个时候这个玩家的走路信息就是完全同步的了。这个方法的优点是能保证各个客户端之间绝对的同步,缺点是当网络延迟比较大的时候,玩家的客户端的行为会变得比较不流畅,给玩家带来很不爽的感觉。该种解决方案的原形在国际上被称为(Hierarchical master-slave synchronization),80年代以后被广泛应用于网络的各个领域。 5 |   最后一种解决方案是一种理想化的解决方案,在国际上被称为Mutual synchronization,是一种对未来网络的前景的良好预测出来的解决方案。这里之所以要提这个方案,并不是说我们已经完全的实现了这种方案,而只是在网络游戏领域的某些方面应用到这种方案的某些思想。我对该种方案取名为:半服务器同步。大体的设计思路如下: 6 |   首先客户端需要在登陆世界的时候建立很多张广播列表,这些列表在客户端后台和服务器要进行不及时同步,之所以要建立多张列表,是因为要广播的类型是不止一种的,比如说有local message,有remote message,还有global message 等等,这些列表都需要在客户端登陆的时候根据服务器发过来的消息建立好。在建立列表的同时,还需要获得每个列表中广播对象的TimeModified,并且要维护一张完整的用户状态列表在后台,也是不及时的和服务器进行同步,根据本地的用户状态表,可以做到一部分决策由客户端自己来决定,当客户端发送这部分决策的时候,则直接将最终决策发送到各个广播列表里面的客户端,并对其时间进行校对,保证每个客户端在收到的消息的时间是和根据本地时间进行校对过的。那么再采用预测拉扯中提到过的计算提前量,提高速度行走过去的方法,将会使同步变得非常的smooth。该方案的优点是不通过服务器,客户端自己之间进行同步,大大的降低了由于网络延迟而带来的误差,并且由于大部分决策都可以由客户端来做,也大大的降低了服务器的资源。由此带来的弊端就是由于消息和决策权都放在客户端本地,所以给外挂提供了很大的可乘之机。 7 |   综合以上三种关于网络同步派系的优缺点,综合出一套关于网络游戏传输同步的较完整的解决方案,我称它为综合同步法(colligate synchronization)。大体设计思路如下: 8 |   首先将服务器需要同步的所有消息从划分一个优先等级,然后按照3/4的比例划分出重要消息和非重要消息,对于非重要消息,把决策权放在客户端,在客户端逻辑上建立相关的决策机构和各种消息缓存区,以及相关的消息缓存区管理机构,如下图所示: 9 | INCLUDEPICTURE "http://dev.gameres.com/Program/Abstract/DeadReckoning1.gif" 10 |   上图简单说明了对于非重要消息,客户端的大体处理流程,其中有一个客户端被动行为值得大家注意,其中包括对服务器发过来的某些验证代码做返回,来确保消息缓存中的消息 -------------------------------------------------------------------------------- /linux/command: -------------------------------------------------------------------------------- 1 | apt-get install build-essential 2 | -------------------------------------------------------------------------------- /linux/command~: -------------------------------------------------------------------------------- 1 | apt-get install build-essential 2 | -------------------------------------------------------------------------------- /linux/soft_install_describe: -------------------------------------------------------------------------------- 1 | 1. install memcached (useing automake) 2 | (1).libevent 3 | cd libevent_src 4 | ./configure -prefix=/opt/libevent 5 | make; make install 6 | (2).memcached 7 | cd memcached_src 8 | ./configure -prefix=/opt/memcached --with-libevent=/opt/libevent 9 | make; make install 10 | 2. install redis 11 | cd redis_src 12 | make PREFIX=/opt/redis install 13 | 14 | -------------------------------------------------------------------------------- /lua/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/lua/.DS_Store -------------------------------------------------------------------------------- /lua/cocos2d-x.txt: -------------------------------------------------------------------------------- 1 | cocos2d-x 环境配置 2 | 方法一 3 | 运行cocos2d-x-3.0/setup.py,通过引导配置 4 | 方法二 5 | # Add environment variable NDK_ROOT for cocos2d-x 6 | export NDK_ROOT=/Users/sunground-android/android/android-ndk-r9d 7 | export PATH=$NDK_ROOT:$PATH 8 | 9 | # Add environment variable ANDROID_SDK_ROOT for cocos2d-x 10 | export ANDROID_SDK_ROOT=/Users/sunground-android/android/android-sdks 11 | export PATH=${ANDROID_SDK_ROOT}/tools:$PATH 12 | export PATH=${ANDROID_SDK_ROOT}/platform-tools:$PATH 13 | 14 | # Add environment variable COCOS_CONSOLE_ROOT for cocos2d-x 15 | export COCOS_CONSOLE_ROOT=/Users/sunground-android/cocos2d-x-3.0/tools/cocos2d-console/bin 16 | export PATH=$COCOS_CONSOLE_ROOT:$PATH 17 | 18 | # Add environment variable ANT_ROOT for cocos2d-x 19 | export ANT_ROOT=/usr/bin 20 | export PATH=$ANT_ROOT:$PATH 21 | 22 | # Add environment variable QUICK_COCOS2DX_ROOT for cocos2d-x 23 | export QUICK_COCOS2DX_ROOT=/Users/sunground-android/quick-cocos2d-x 24 | export PATH=$QUICK_COCOS2DX_ROOT:$PATH 25 | 26 | 1.使用cocos_console,对cocos2d-x项目的新建,编译,运行 27 | 28 | cocos new -l [cpp, lua, js] -p com.xincao.hero_defend -d . -t runtime hero_defend 29 | 30 | cocos compile -s ./hero_defend -p android -m [release, debug] 31 | 32 | cocos deploy -s ./hero_defend -p andoird -m release 33 | Now this command only take effect when target platform is android. It will re-install the specified project to the android device or simulator. 34 | 35 | cocos run -s ./hero_defend -p android -m release 36 | 37 | 2.通过,使用eclipse进行项目的打包 38 | 先导入android项目,/hero_defend/frameworks/runtime-src/proj.android 39 | 对android进行配置,java build path -> source -> link source, 选择cocos2d-x中platform->android->java->src -------------------------------------------------------------------------------- /lua/lua的遍历问题.txt: -------------------------------------------------------------------------------- 1 | 当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: 2 | for key, value in pairs(tbtest) do 3 | XXX 4 | end 5 | 6 | for key, value in ipairs(tbtest) do 7 | XXX 8 | end 9 | 10 | for i=1, #(tbtest) do 11 | XXX 12 | end 13 | 14 | for i=1, table.maxn(tbtest) do 15 | XXX 16 | end 17 | 前两种是泛型遍历,后两种是数值型遍历。当然你还会说lua的table遍历还有很多种方法啊,没错,不过最常见的这些遍历确实有必要弄清楚。 18 | 这四种方式各有特点,由于在工作中我几乎每天都会使用遍历table的方法,一开始也非常困惑这些方式的不同,一段时间后才渐渐明白,这里我也是把自己的一点经验告诉大家,对跟我一样的lua初学者也许有些帮助(至少当初我在写的时候在网上就找了很久,不知道是因为大牛们都认为这些很简单,不需要说,还是因为我笨,连这都要问)。 19 | 首先要明确一点,就是lua中table并非像是C/C++中的数组一样是顺序存储的,准确来说lua中的table更加像是C++中的map,通过Key对应存储Value,但是并非顺序来保存key-value对,而是使用了hash的方式,这样能够更加快速的访问key对应的value,我们也知道hash表的遍历需要使用所谓的迭代器来进行,同样,lua也有自己的迭代器,就是上面4种遍历方式中的pairs和ipairs遍历。但是lua同时提供了按照key来遍历的方式(另外两种,实质上是一种),正式因为它提供了这种按key的遍历,才造成了我一开始的困惑,我一度认为lua中关于table的遍历是按照我table定义key的顺序来的。 20 | 下面依次来讲讲四种遍历方式,首先来看for k,v in pairs(tbtest) do这种方式: 21 | 先看效果: 22 | tbtest = { 23 | [1] = 1, 24 | [2] = 2, 25 | [3] = 3, 26 | [4] = 4, 27 | } 28 | 29 | for key, value in pairs(tbtest) do 30 | print(value) 31 | end 32 | 我认为输出应该是1,2,3,4,实际上的输出是1,2,4,3。我因为这个造成了一个bug,这是后话。 33 | 也就是说for k,v in pairs(tbtest) do 这样的遍历顺序并非是tbtest中table的排列顺序,而是根据tbtest中key的hash值排列的顺序来遍历的。 34 | 35 | 当然,同时lua也提供了按照key的大小顺序来遍历的,注意,是大小顺序,仍然不是key定义的顺序,这种遍历方式就是for k,v in ipairs(tbtest) do。 36 | for k,v in ipairs(tbtest) do 这样的循环必须要求tbtest中的key为顺序的,而且必须是从1开始,ipairs只会从1开始按连续的key顺序遍历到key不连续为止。 37 | tbtest = { 38 | [1] = 1, 39 | [2] = 2, 40 | [3] = 3, 41 | [5] = 5, 42 | } 43 | 44 | for k,v in ipairs(tbtest) do 45 | print(v) 46 | end 47 | 只会打印1,2,3。而5则不会显示。 48 | local tbtest = { 49 | [2] = 2, 50 | [3] = 3, 51 | [5] = 5, 52 | } 53 | 54 | for k,v in ipairs(tbtest) do 55 | print(v) 56 | end 57 | 这样就一个都不会打印。 58 | 59 | 第三种遍历方式有一种神奇的符号'#',这个符号的作用是是获取table的长度,比如: 60 | tbtest = { 61 | [1] = 1, 62 | [2] = 2, 63 | [3] = 3, 64 | } 65 | print(#(tbtest)) 66 | 打印的就是3 67 | tbtest = { 68 | [1] = 1, 69 | [2] = 2, 70 | [6] = 6, 71 | } 72 | print(#(tbtest)) 73 | 这样打印的就是2,而且和table内的定义顺序没有关系,无论你是否先定义的key为6的值,‘#’都会查找key为1的值开始。 74 | 如果table的定义是这样的: 75 | tbtest = { 76 | ["a"] = 1, 77 | [2] = 2, 78 | [3] = 3, 79 | } 80 | 81 | print(#(tbtest)) 82 | 那么打印的就是0了。因为‘#’没有找到key为1的值。同样: 83 | tbtest = { 84 | [“a”] = 1, 85 | [“b”] = 2, 86 | [“c”] = 3, 87 | } 88 | print(#(tbtest)) 89 | 打印的也是0 90 | 所以,for i=1, #(tbtest) do这种遍历,只能遍历当tbtest中存在key为1的value时才会出现结果,而且是按照key从1开始依次递增1的顺序来遍历,找到一个递增不是1的时候就结束不再遍历,无论后面是否仍然是顺序的key,比如: 91 | 92 | table.maxn获取的只针对整数的key,字符串的key是没办法获取到的,比如: 93 | tbtest = { 94 | [1] = 1, 95 | [2] = 2, 96 | [3] = 3, 97 | } 98 | print(table.maxn(tbtest)) 99 | 100 | 101 | tbtest = { 102 | [6] = 6, 103 | [1] = 1, 104 | [2] = 2, 105 | } 106 | print(table.maxn(tbtest)) 107 | 这样打印的就是3和6,而且和table内的定义顺序没有关系,无论你是否先定义的key为6的值,table.maxn都会获取整数型key中的最大值。 108 | 如果table的定义是这样的: 109 | tbtest = { 110 | ["a"] = 1, 111 | [2] = 2, 112 | [3] = 3, 113 | } 114 | print(table.maxn(tbtest)) 115 | 那么打印的就是3了。如果table是: 116 | tbtest = { 117 | [“a”] = 1, 118 | [“b”] = 2, 119 | [“c”] = 3, 120 | } 121 | print(table.maxn(tbtest)) 122 | print(#(tbtest)) 123 | 那么打印的就全部是0了。 124 | 125 | 126 | 换句话说,事实上因为lua中table的构造表达式非常灵活,在同一个table中,你可以随意定义各种你想要的内容,比如: 127 | tbtest = { 128 | [1] = 1, 129 | [2] = 2, 130 | [3] = 3, 131 | ["a"] = 4, 132 | ["b"] = 5, 133 | } 134 | 同时由于这个灵活性,你也没有办法获取整个table的长度,其实在coding的过程中,你会发现,你真正想要获取整个table长度的地方几乎没有,你总能采取一种非常巧妙的定义方式,把这种需要获取整个table长度的操作避免掉,比如: 135 | tbtest = { 136 | tbaaa = { 137 | [1] = 1, 138 | [2] = 2, 139 | [3] = 3, 140 | }, 141 | ["a"] = 4, 142 | ["b"] = 5, 143 | } 144 | 你可能会惊讶,上面这种table该如何遍历呢? 145 | for k, v in pairs(tbtest) do 146 | print(k, v) 147 | end 148 | 输出是:a 4 b 5 tbaaa table:XXXXX。 149 | 由此你可以看到,其实在table中定义一个table,这个table的名字就是key,对应的内容其实是table的地址。 150 | 当然,如果你用 151 | for k, v in ipairs(tbtest) do 152 | print(k,v) 153 | end 154 | 来遍历的话,就什么都不会打印,因为没有key为1的值。但当你增加一个key为1的值时,ipairs只会打印那一个值,现在你明白ipairs是如何工作的吧。 155 | 既然这里谈到了遍历,就说一下目前看到的几种针对table的遍历方式: 156 | for i=1, #tbtest do --这种方式无法遍历所有的元素,因为'#'只会获取tbtest中从key为1开始的key连续的那几个元素,如果没有key为1,那么这个循环将无法进入 157 | for i=1, table.maxn(tbtest) do --这种方式同样无法遍历所有的元素,因为table.maxn只会获取key为整数中最大的那个数,遍历的元素其实是查找tbtest[1]~tbtest[整数key中最大值],所以,对于string做key的元素不会去查找,而且这么查找的效率低下,因为如果你整数key中定义的最大的key是10000,然而10000以下的key没有几个,那么这么遍历会浪费很多时间,因为会从1开始直到10000每一个元素都会查找一遍,实际上大多数元素都是不存在的,比如: 158 | tbtest = { 159 | [1] = 1, 160 | [10000] = 2, 161 | } 162 | local count = 0 163 | for i=1, table.maxn(tbtest) do 164 | count = count + 1 165 | print(tbtest[i]) 166 | end 167 | print(count) 168 | 你会看到打印结果是多么的坑爹,只有1和10000是有意义的,其他的全是nil,而且count是10000。耗时非常久。一般我不这么遍历。但是有一种情况下又必须这么遍历,这个在我的工作中还真的遇到了,这是后话,等讲完了再谈。 169 | for k, v in pairs(tbtest) do 170 | 这个是唯一一种可以保证遍历tbtest中每一个元素的方式,别高兴的太早,这种遍历也有它自身的缺点,就是遍历的顺序不是按照tbtest定义的顺序来遍历的,这个前面讲到过,当然,对于不需要顺序遍历的用法,这个是唯一可靠的遍历方式。 171 | for k, v in ipairs(tbtest) do 172 | 这个只会遍历tbtest中key为整数,而且必须从1开始的那些连续元素,如果没有1开始的key,那么这个遍历是无效的,我个人认为这种遍历方式完全可以被改造table和for i=1, #(tbtest) do的方式来代替,因为ipairs的效果和'#'的效果,在遍历的时候是类似的,都是按照key的递增1顺序来遍历。 173 | 好,再来谈谈为什么我需要使用table.maxn这种非常浪费的方式来遍历,在工作中, 我遇到一个问题,就是需要把当前的周序,转换成对应的奖励,简单来说,就是从一个活动开始算起,每周的奖励都不是固定的,比如1~4周给一种奖励,5~8周给另一种奖励,或者是一种排名奖励,1~8名给一种奖励,9~16名给另一种奖励,这种情况下,我根据长久的C语言的习惯,会把table定义成这个样子: 174 | tbtestAward = { 175 | [8] = 1, 176 | [16] = 3, 177 | } 178 | 这个代表,1~8给奖励1,9~16给奖励3。这样定义的好处是奖励我只需要写一次(这里的奖励用数字做了简化,实际上奖励也是一个大的table,里面还有非常复杂的结构)。然后我就遇到一个问题,即我需要根据周序数,或者是排名序数来确定给哪一种奖励,比如当前周序数是5,那么我应该给我定义好的key为8的那一档奖励,或者当前周序数是15,那么我应该给奖励3。由此读者看出,其实我定义的key是一个分界,小于这个key而大于上一个key,那么就给这个key的奖励,这就是我判断的条件。逻辑上没有问题,但是lua的遍历方式却把我狠狠地坑了一把。读者可以自己想一想我上面介绍的4种遍历方式,该用哪一种来实现我的这种需求呢?这个函数的大致框架如下: 179 | function GetAward(nSeq) 180 | for 遍历整个奖励表 do 181 | if 满足key的条件 then 182 | return 返回对应奖励的key 183 | end 184 | end 185 | return nil 186 | end 187 | 我也不卖关子了,分别来说一说吧,首先因为我的key不是连续的,而且没有key为1的值,所以ipairs和'#'遍历是没用的。这种情况下理想的遍历貌似是pairs,因为它会遍历我的每一个元素,但是读者不要忘记了,pairs遍历并非是按照我定义的顺序来遍历,如果我真的使用的条件是:序数nSeq小于这个key而大于上一个key,那么就返回这个key。那么我无法保证程序执行的正确性,因为key的顺序有可能是乱的,也就是有可能先遍历到的是key为16的值,然后才是key为8的值。 188 | 这么看来我只剩下table.maxn这么一种方式了,于是我写下了这种代码: 189 | for i=1, table.maxn(tbtestAward) do 190 | if tbtestAward[i] ~= nil then 191 | if nSeq <= i then 192 | return i 193 | end 194 | end 195 | end 196 | 这么写效率确实低下,因为实际上还是遍历了从key为1开始直到key为table.maxn中间的每一个值,不过能够满足我上面的要求。当时我是这么实现的,因为这个奖励表会不断的发生变化,这样我每次修改只需要修改这个奖励表就能够满足要求了,后来我想了想,觉得其实我如果自己再定义一个序数转换成对应的奖励数种类的表就可以避免这种坑爹的操作了,不过如果奖励发生修改,我需要统一排查的地方就不止这个奖励表了,权衡再三,我还是没有改,就这么写了。没办法,不断变化的需求已经把我磨练的忘记了程序的最高理想。我甚至愿意牺牲算法的效率而去追求改动的稳定性。在此哀悼程序员的无奈。我这种时间换空间的做法确实不知道好不好。 197 | 后来我在《Programming In Lua》中看到了一个神奇的迭代器,使用它就可以达到我想要的这种遍历方式,而且不需要去遍历那些不存在的key。它的方法是把你所需要遍历的table里的key按照遍历顺序放到另一个临时的table中去,这样只需要遍历这个临时的table按顺序取出原table中的key就可以了。如下: 198 | 首先定义一个迭代器: 199 | function pairsByKeys(t) 200 | local a = {} 201 | for n in pairs(t) do 202 | a[#a+1] = n 203 | end 204 | table.sort(a) 205 | local i = 0 206 | return function() 207 | i = i + 1 208 | return a[i], t[a[i]] 209 | end 210 | end 211 | 然后在遍历的时候使用这个迭代器就可以了,table同上,遍历如下: 212 | for key, value in pairsByKeys(tbtestAward) do 213 | if nSeq <= key then 214 | return key 215 | end 216 | end 217 | 并且后来我发现有了这个迭代器,我根本不需要先做一步获取是哪一档次的奖励的操作,直接使用这个迭代器进行发奖就可以了。大师就是大师,我怎么就没想到呢! 218 | 还有些话我还没有说,比如上面数值型遍历也并非是像看起来那样进行遍历的,比如下面的遍历: 219 | tbtest = { 220 | [1] = 1, 221 | [2] = 2, 222 | [3] = 3, 223 | [5] = 5, 224 | } 225 | 226 | for i=1, #(tbtest) do 227 | print(tbtest[i]) 228 | end 229 | 打印的顺序是:1,2,3。不会打印5,因为5已经不在table的数组数据块中了,我估计是被放到了hash数据块中,但是当我修改其中的一些key时,比如: 230 | tbtest = { 231 | [1] = 1, 232 | [2] = 2, 233 | [4] = 4, 234 | [5] = 5, 235 | } 236 | 237 | for i=1, #(tbtest) do 238 | print(tbtest[i]) 239 | end 240 | 打印的内容却是:1,2,nil,4,5。这个地方又遍历到了中间没有的key值,并且还能继续遍历下去。我最近正在看lua源码中table的实现部分,已经明白了是怎么回事,不过我想等我能够更加清晰的阐述lua中table的实现过程了再向大家介绍。用我师傅的话说就是不要使用一些未定义的行为方法,避免在工作中出错,不过工作外,我还是希望能明白未定义的行为中那些必然性,o(︶︿︶)o 唉!因果论的孩子伤不起。等我下一篇博文分析lua源码中table的实现就能够更加清晰的说明这些了。 -------------------------------------------------------------------------------- /mybatis-code-generate/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/.DS_Store -------------------------------------------------------------------------------- /mybatis-code-generate/database.server_generator.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /mybatis-code-generate/generator.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | -------------------------------------------------------------------------------- /mybatis-code-generate/generator.xml_temp: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | -------------------------------------------------------------------------------- /mybatis-code-generate/mybatis-generator-config_1_0.dtd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | 17 | 31 | 32 | 35 | 36 | 37 | 42 | 43 | 46 | 47 | 51 | 53 | 57 | 58 | 62 | 63 | 68 | 69 | 73 | 74 | 76 | 77 | 83 | 84 | 87 | 88 | 91 | 92 | 94 | 95 | 100 | 101 | 104 | 105 | 111 | 112 | 114 | 115 | 120 | 121 | 124 | 125 | 131 | 132 | 137 | 138 | 142 | 143 | 163 | 164 | 168 | 169 | 176 | 177 | 182 | 183 | 186 | 187 | 191 | 192 | 197 | 198 | 202 | 203 | 206 | 207 | 211 | 212 | 214 | -------------------------------------------------------------------------------- /mybatis-code-generate/mybatis-generator-core-1.3.2-sources.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/mybatis-generator-core-1.3.2-sources.jar -------------------------------------------------------------------------------- /mybatis-code-generate/mybatis-generator-core-1.3.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/mybatis-generator-core-1.3.2.jar -------------------------------------------------------------------------------- /mybatis-code-generate/mysql-connector-java-5.1.18-bin.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/mysql-connector-java-5.1.18-bin.jar -------------------------------------------------------------------------------- /mybatis-code-generate/run.sh: -------------------------------------------------------------------------------- 1 | #/bin/bash 2 | 3 | if [ $# -eq 4 ] 4 | then 5 | config_file="$2_generator.xml" 6 | cp generator.xml $config_file 7 | echo $config_file 8 | sed -i -e "s/{\$groupId}/$1/g" $config_file 9 | sed -i -e "s/{\$artifactId}/$2/g" $config_file 10 | sed -i -e "s/{\$database}/$2/g" $config_file 11 | sed -i -e "s/{\$user}/$3/g" $config_file 12 | sed -i -e "s/{\$passwd}/$4/g" $config_file 13 | elif [ $# -eq 3 ] 14 | then 15 | temp_config="temp_$1" 16 | cp $1 $temp_config 17 | sed -i -e "s/{\$table}/$2/g" $temp_config 18 | sed -i -e "s/{\$model}/$3/g" $temp_config 19 | java -jar mybatis-generator-core-1.3.2.jar -configfile $temp_config -overwrite 20 | rm $temp_config 21 | else 22 | echo "init: run.sh com\.xincao todo root asdf" 23 | echo "use: run.sh config_file.xml table Model" 24 | fi -------------------------------------------------------------------------------- /mybatis-code-generate/src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/src/.DS_Store -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/src/com/.DS_Store -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/src/com/xincao/.DS_Store -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/src/com/xincao/database/.DS_Store -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/src/com/xincao/database/server/.DS_Store -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/mapper/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/src/com/xincao/database/server/mapper/.DS_Store -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/mapper/MailBoxMapper.java: -------------------------------------------------------------------------------- 1 | package com.xincao.database.server.mapper; 2 | 3 | import com.xincao.database.server.model.MailBox; 4 | 5 | public interface MailBoxMapper { 6 | int deleteByPrimaryKey(Integer id); 7 | 8 | int insert(MailBox record); 9 | 10 | int insertSelective(MailBox record); 11 | 12 | MailBox selectByPrimaryKey(Integer id); 13 | 14 | int updateByPrimaryKeySelective(MailBox record); 15 | 16 | int updateByPrimaryKey(MailBox record); 17 | } -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/mapper/MailMapper.java: -------------------------------------------------------------------------------- 1 | package com.xincao.database.server.mapper; 2 | 3 | import com.xincao.database.server.model.Mail; 4 | 5 | public interface MailMapper { 6 | int deleteByPrimaryKey(Integer id); 7 | 8 | int insert(Mail record); 9 | 10 | int insertSelective(Mail record); 11 | 12 | Mail selectByPrimaryKey(Integer id); 13 | 14 | int updateByPrimaryKeySelective(Mail record); 15 | 16 | int updateByPrimaryKey(Mail record); 17 | } -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/mapper/PlayerMapper.java: -------------------------------------------------------------------------------- 1 | package com.xincao.database.server.mapper; 2 | 3 | import com.xincao.database.server.model.Player; 4 | 5 | public interface PlayerMapper { 6 | int deleteByPrimaryKey(Integer id); 7 | 8 | int insert(Player record); 9 | 10 | int insertSelective(Player record); 11 | 12 | Player selectByPrimaryKey(Integer id); 13 | 14 | int updateByPrimaryKeySelective(Player record); 15 | 16 | int updateByPrimaryKey(Player record); 17 | } -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/mapper/mybatis/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/src/com/xincao/database/server/mapper/mybatis/.DS_Store -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/mapper/mybatis/MailBoxMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | id, player_id, capacity 11 | 12 | 18 | 19 | delete from mail_box 20 | where id = #{id,jdbcType=INTEGER} 21 | 22 | 23 | insert into mail_box (id, player_id, capacity 24 | ) 25 | values (#{id,jdbcType=INTEGER}, #{playerId,jdbcType=INTEGER}, #{capacity,jdbcType=INTEGER} 26 | ) 27 | 28 | 29 | insert into mail_box 30 | 31 | 32 | id, 33 | 34 | 35 | player_id, 36 | 37 | 38 | capacity, 39 | 40 | 41 | 42 | 43 | #{id,jdbcType=INTEGER}, 44 | 45 | 46 | #{playerId,jdbcType=INTEGER}, 47 | 48 | 49 | #{capacity,jdbcType=INTEGER}, 50 | 51 | 52 | 53 | 54 | update mail_box 55 | 56 | 57 | player_id = #{playerId,jdbcType=INTEGER}, 58 | 59 | 60 | capacity = #{capacity,jdbcType=INTEGER}, 61 | 62 | 63 | where id = #{id,jdbcType=INTEGER} 64 | 65 | 66 | update mail_box 67 | set player_id = #{playerId,jdbcType=INTEGER}, 68 | capacity = #{capacity,jdbcType=INTEGER} 69 | where id = #{id,jdbcType=INTEGER} 70 | 71 | 72 | 73 | 74 | 75 | 76 | id, player_id 77 | 78 | 84 | 85 | delete from mail_box 86 | where id = #{id,jdbcType=INTEGER} 87 | 88 | 89 | insert into mail_box (id, player_id) 90 | values (#{id,jdbcType=INTEGER}, #{playerId,jdbcType=INTEGER}) 91 | 92 | 93 | insert into mail_box 94 | 95 | 96 | id, 97 | 98 | 99 | player_id, 100 | 101 | 102 | 103 | 104 | #{id,jdbcType=INTEGER}, 105 | 106 | 107 | #{playerId,jdbcType=INTEGER}, 108 | 109 | 110 | 111 | 112 | update mail_box 113 | 114 | 115 | player_id = #{playerId,jdbcType=INTEGER}, 116 | 117 | 118 | where id = #{id,jdbcType=INTEGER} 119 | 120 | 121 | update mail_box 122 | set player_id = #{playerId,jdbcType=INTEGER} 123 | where id = #{id,jdbcType=INTEGER} 124 | 125 | -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/mapper/mybatis/MailMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | id, mail_box_id, sender_id, content, create_at, status 14 | 15 | 21 | 22 | delete from mail 23 | where id = #{id,jdbcType=INTEGER} 24 | 25 | 26 | insert into mail (id, mail_box_id, sender_id, 27 | content, create_at, status 28 | ) 29 | values (#{id,jdbcType=INTEGER}, #{mailBoxId,jdbcType=INTEGER}, #{senderId,jdbcType=INTEGER}, 30 | #{content,jdbcType=VARCHAR}, #{createAt,jdbcType=DATE}, #{status,jdbcType=CHAR} 31 | ) 32 | 33 | 34 | insert into mail 35 | 36 | 37 | id, 38 | 39 | 40 | mail_box_id, 41 | 42 | 43 | sender_id, 44 | 45 | 46 | content, 47 | 48 | 49 | create_at, 50 | 51 | 52 | status, 53 | 54 | 55 | 56 | 57 | #{id,jdbcType=INTEGER}, 58 | 59 | 60 | #{mailBoxId,jdbcType=INTEGER}, 61 | 62 | 63 | #{senderId,jdbcType=INTEGER}, 64 | 65 | 66 | #{content,jdbcType=VARCHAR}, 67 | 68 | 69 | #{createAt,jdbcType=DATE}, 70 | 71 | 72 | #{status,jdbcType=CHAR}, 73 | 74 | 75 | 76 | 77 | update mail 78 | 79 | 80 | mail_box_id = #{mailBoxId,jdbcType=INTEGER}, 81 | 82 | 83 | sender_id = #{senderId,jdbcType=INTEGER}, 84 | 85 | 86 | content = #{content,jdbcType=VARCHAR}, 87 | 88 | 89 | create_at = #{createAt,jdbcType=DATE}, 90 | 91 | 92 | status = #{status,jdbcType=CHAR}, 93 | 94 | 95 | where id = #{id,jdbcType=INTEGER} 96 | 97 | 98 | update mail 99 | set mail_box_id = #{mailBoxId,jdbcType=INTEGER}, 100 | sender_id = #{senderId,jdbcType=INTEGER}, 101 | content = #{content,jdbcType=VARCHAR}, 102 | create_at = #{createAt,jdbcType=DATE}, 103 | status = #{status,jdbcType=CHAR} 104 | where id = #{id,jdbcType=INTEGER} 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | id, mail_box_id, content 113 | 114 | 120 | 121 | delete from mail 122 | where id = #{id,jdbcType=INTEGER} 123 | 124 | 125 | insert into mail (id, mail_box_id, content 126 | ) 127 | values (#{id,jdbcType=INTEGER}, #{mailBoxId,jdbcType=INTEGER}, #{content,jdbcType=VARCHAR} 128 | ) 129 | 130 | 131 | insert into mail 132 | 133 | 134 | id, 135 | 136 | 137 | mail_box_id, 138 | 139 | 140 | content, 141 | 142 | 143 | 144 | 145 | #{id,jdbcType=INTEGER}, 146 | 147 | 148 | #{mailBoxId,jdbcType=INTEGER}, 149 | 150 | 151 | #{content,jdbcType=VARCHAR}, 152 | 153 | 154 | 155 | 156 | update mail 157 | 158 | 159 | mail_box_id = #{mailBoxId,jdbcType=INTEGER}, 160 | 161 | 162 | content = #{content,jdbcType=VARCHAR}, 163 | 164 | 165 | where id = #{id,jdbcType=INTEGER} 166 | 167 | 168 | update mail 169 | set mail_box_id = #{mailBoxId,jdbcType=INTEGER}, 170 | content = #{content,jdbcType=VARCHAR} 171 | where id = #{id,jdbcType=INTEGER} 172 | 173 | -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/mapper/mybatis/PlayerMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | id, account, name 11 | 12 | 18 | 19 | delete from player 20 | where id = #{id,jdbcType=INTEGER} 21 | 22 | 23 | insert into player (id, account, name 24 | ) 25 | values (#{id,jdbcType=INTEGER}, #{account,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR} 26 | ) 27 | 28 | 29 | insert into player 30 | 31 | 32 | id, 33 | 34 | 35 | account, 36 | 37 | 38 | name, 39 | 40 | 41 | 42 | 43 | #{id,jdbcType=INTEGER}, 44 | 45 | 46 | #{account,jdbcType=VARCHAR}, 47 | 48 | 49 | #{name,jdbcType=VARCHAR}, 50 | 51 | 52 | 53 | 54 | update player 55 | 56 | 57 | account = #{account,jdbcType=VARCHAR}, 58 | 59 | 60 | name = #{name,jdbcType=VARCHAR}, 61 | 62 | 63 | where id = #{id,jdbcType=INTEGER} 64 | 65 | 66 | update player 67 | set account = #{account,jdbcType=VARCHAR}, 68 | name = #{name,jdbcType=VARCHAR} 69 | where id = #{id,jdbcType=INTEGER} 70 | 71 | -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/model/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/mybatis-code-generate/src/com/xincao/database/server/model/.DS_Store -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/model/Mail.java: -------------------------------------------------------------------------------- 1 | package com.xincao.database.server.model; 2 | 3 | import java.util.Date; 4 | 5 | public class Mail { 6 | private Integer id; 7 | 8 | private Integer mailBoxId; 9 | 10 | private Integer senderId; 11 | 12 | private String content; 13 | 14 | private Date createAt; 15 | 16 | private String status; 17 | 18 | public Integer getId() { 19 | return id; 20 | } 21 | 22 | public void setId(Integer id) { 23 | this.id = id; 24 | } 25 | 26 | public Integer getMailBoxId() { 27 | return mailBoxId; 28 | } 29 | 30 | public void setMailBoxId(Integer mailBoxId) { 31 | this.mailBoxId = mailBoxId; 32 | } 33 | 34 | public Integer getSenderId() { 35 | return senderId; 36 | } 37 | 38 | public void setSenderId(Integer senderId) { 39 | this.senderId = senderId; 40 | } 41 | 42 | public String getContent() { 43 | return content; 44 | } 45 | 46 | public void setContent(String content) { 47 | this.content = content == null ? null : content.trim(); 48 | } 49 | 50 | public Date getCreateAt() { 51 | return createAt; 52 | } 53 | 54 | public void setCreateAt(Date createAt) { 55 | this.createAt = createAt; 56 | } 57 | 58 | public String getStatus() { 59 | return status; 60 | } 61 | 62 | public void setStatus(String status) { 63 | this.status = status == null ? null : status.trim(); 64 | } 65 | } -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/model/MailBox.java: -------------------------------------------------------------------------------- 1 | package com.xincao.database.server.model; 2 | 3 | public class MailBox { 4 | private Integer id; 5 | 6 | private Integer playerId; 7 | 8 | private Integer capacity; 9 | 10 | public Integer getId() { 11 | return id; 12 | } 13 | 14 | public void setId(Integer id) { 15 | this.id = id; 16 | } 17 | 18 | public Integer getPlayerId() { 19 | return playerId; 20 | } 21 | 22 | public void setPlayerId(Integer playerId) { 23 | this.playerId = playerId; 24 | } 25 | 26 | public Integer getCapacity() { 27 | return capacity; 28 | } 29 | 30 | public void setCapacity(Integer capacity) { 31 | this.capacity = capacity; 32 | } 33 | } -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/model/Player.java: -------------------------------------------------------------------------------- 1 | package com.xincao.database.server.model; 2 | 3 | public class Player { 4 | private Integer id; 5 | 6 | private String account; 7 | 8 | private String name; 9 | 10 | public Integer getId() { 11 | return id; 12 | } 13 | 14 | public void setId(Integer id) { 15 | this.id = id; 16 | } 17 | 18 | public String getAccount() { 19 | return account; 20 | } 21 | 22 | public void setAccount(String account) { 23 | this.account = account == null ? null : account.trim(); 24 | } 25 | 26 | public String getName() { 27 | return name; 28 | } 29 | 30 | public void setName(String name) { 31 | this.name = name == null ? null : name.trim(); 32 | } 33 | } -------------------------------------------------------------------------------- /mybatis-code-generate/src/com/xincao/database/server/model/Test.java: -------------------------------------------------------------------------------- 1 | package com.xincao.database.server.model; 2 | 3 | public class Test { 4 | private Integer id; 5 | 6 | private String str; 7 | 8 | public Integer getId() { 9 | return id; 10 | } 11 | 12 | public void setId(Integer id) { 13 | this.id = id; 14 | } 15 | 16 | public String getStr() { 17 | return str; 18 | } 19 | 20 | public void setStr(String str) { 21 | this.str = str == null ? null : str.trim(); 22 | } 23 | } -------------------------------------------------------------------------------- /mybatis-code-generate/temp_database.server_generator.xml-e: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 32 | -------------------------------------------------------------------------------- /shell/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XinCao/note/0db5e955220d7b6b0cc00f44dbf3373c60a5ed81/shell/.DS_Store -------------------------------------------------------------------------------- /shell/crontab.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 19 * * * * ls -l 3 | 4 | -------------------------------------------------------------------------------- /shell/jstat.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "请输入java进程pid:"; 3 | read pid; 4 | while true; 5 | do 6 | echo `date '+%T%n%D'``jstat -gcutil $pid` >> log.txt 7 | sleep 5; 8 | done 9 | -------------------------------------------------------------------------------- /shell/lowercase_to_uppercase.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ "$1"x = "-u"x ]; then 4 | cat | tr [a-z] [A-Z] 5 | else 6 | cat | tr [A-Z] [a-z] 7 | fi 8 | --------------------------------------------------------------------------------