开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
Computer Science

Hibernate H2 数据库连接配置 URL 解读

H2 是我们常使用的一个内存数据库,通常这个数据库能够帮助我们在测试的时候进行逻辑测试。 如果你使用了 Hibernate 的话,首先需要设置数据库的连接,因为 H2 可以支持内存模式,也可以支持文件模式,我们下面分别对这 2 种模式的配置参数进行一些解读。 内存模式 我们可以使用下面的配置的字符串来进行内存模式的配置: hibernate.connection.url=jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;INIT=RUNSCRIPT FROM 'classpath:schema/h2.sql' 针对内存模式,需要了解下面的重点,在 JVM 进程启动后,将会在内存中创建一个数据库,当 JVM 内存释放后,你的程序将会关闭最后的连接,当 H2 直到最后的连接被关闭后,H2 数据库将会自动从内存中删除。 jdbc:h2:mem:test 上面的命令将会在内存中创建一个 test 的数据库,这个参数中的 mem 表示的是内存中创建。 MODE=MySQL 创建的数据库使用 MySQL 兼容模式,这样如果你需要对数据库迁移到基于服务器的 MySQL 数据库上的话,你不需要对你的逻辑代码和实体进行修改。 DB_CLOSE_DELAY=-1 在默认情况下,H2 将会在最后的连接退出的时候关闭数据库。针对基于内存的数据库配置的情况下,如果在这个情况下还进行数据库连接的话,很有可能程序将会得到连接丢失的错误,如果你使用了连接池的话,通常在 JVM 退出之前,连接池都会保持有数据库连接,因此这个问题针对使用连接池的情况可能不存在。 如果你没有使用连接池的话,建议将这个参数设置为: ;DB_CLOSE_DELAY=-1 这样能够保证在虚拟机退出之前 H2 数据库不关闭连接。 DB_CLOSE_ON_EXIT=FALSE 这个参数的默认配置为 TRUE。 在默认情况下,H2 将会在最后的连接退出的时候关闭数据库,如果在这个情况下数据库没有被关闭的话,H2 将会在虚拟机退出的时候关闭数据库。 但是在一些特殊的情况下,我们并不希望虚拟机在退出的时候关闭数据库,比如说你还需要使用数据库写入一些虚拟机的情况,或者写入虚拟机的关闭过程等。 因此,在这个情况下,你需要讲这个参数配置为 TRUE。 INIT=RUNSCRIPT FROM ‘classpath:schema/h2.sql’ 初始化 SQL 脚本。 通常我们会在这里配置一个初始化的脚本,因为内存数据库在初始化成功后是不会创建数据表和初始化数据的,因此我们需要让第一个链接在链接数据库后直接运行一个脚本来创建数据库,表,同时插入一些数据。 这个配置是在这里设置,classpath: 就是你当前项目的 resources 目录中。 如果下图所示的目录结构。     文件模式 文件模式的情况能够让你的测试数据在文件系统中持久化。 这种模式通常能够让有机会在程序退出的时候检查数据处理是否准确,存储和更新是否有问题。 hibernate.connection.url=jdbc:h2:file:~/h2/test;MODE=MySQL;AUTO_SERVER=TRUE 请参考上面的配置参数,和下面的一些解读。 jdbc:h2:file:~/h2/test 这个配置参数会告诉 H2 在文件系统中创建一个数据库,创建的路径为 ~/h2/test 具体来说,如果你使用的是 Windows 系统,并且当前登录的用户名为 huyuc,那么创建的数据库文件的路径为:C:\Users\huyuc\h2 AUTO_SERVER=TRUE 这个配置模式为 Automatic Mixed Mode。 用土话说就是允许多个进程同时访问数据库。 举例来说,如你运行一个测试环境,但是又想用一个 UI 工具来查看数据库中的数据情况,这个时候你需要讲这个配置参数设置为 TRUE。 因为这里是 2 个进程同时访问数据库,否则你将会得到数据库文件被占用的错误。   https://www.ossez.com/t/hibernate-h2-url/13816

2021年11月23日 0Comments 805Browse 0Like Read more
Computer Science

美东某 IoT 公司技术流程第一轮沟通就挂了

面试的时间是在 2021年的 11 月。 在第一轮面试进行一些沟通情况的后就没有下文了。 相关背景 本次面试的原因是有招聘的 HR 在 Linkedin 上找到我,发了一个希望了解下的消息,然后先消息了解了下。 这个公司本身应该是做的 IoT 相关的服务的,这个公司在 2019 年我没事投简历后发过一次 OA 给我,费了不少时间做完成 OA 后基本上就没有下文了。 个人觉得上次的 OA 没有什么问题,结论都是正确的。所以这次他们找我希望再次沟通下,我也真没有太当会事情,因为我知道这家公司基本上是属于面试面着玩的那种,公司在招聘层面的逻辑和流程本身也不是非常正规。 第一轮面试相关 第一轮面试是完全的电话沟通,没有任何深入的了解,主要是面试的人不知道从哪里搬来了一些概念来问你了解不了解。 问得最多的是技术栈上面的问题,主要是设计上面的。 同时还问了一个 Restful API 是什么东西,会有些什么。如果你做过相关 API 的话,通常这个不会非常难,一般都是 POST Payload,同时在 Header 里面会设置一些参数等等。 因为我是使用 Java 技术栈的,因此多用 Spring MVC 来构建一个 API 就可以了。 另外一个问题就是什么是 URL 和 URI,这个问题就有点意思了,通常 URL 都是统一资源定位符的简称,在网页上输入的都是 URL。     URI = Uniform Resource Identifier 统一资源标志符 URL = Uniform Resource Locator 统一资源定位符 通常知道 URL 为 URI 的子集就好了。 这 2 个都有点概念性的意思了,其实很多时候我们都不会过于深究到底是 URI 还是 URL,所以说都不明白这个问题是从哪里抄过来的。 总结 感觉主要还是技术栈不是非常符合的意思,这个公司原来使用的是 Java 技术栈,随着时间变化,感觉他们要将技术栈迁移到 NodeJS 上了。 因此他们可能要求更多的 NodeJS 后端编程开发的,但是 NodeJS 本身可能不适合非常大逻辑的计算等,并且 NodeJS 的包的质量普遍没有 Java 高。 当然技术是为业务服务的,公司的选择无可厚非。 另,因为没有听清他们要求解释 URL 还是 URI,所以这个有关 URL 和 URI 的问题压根就没有回答明白,上面的内容都是后面自己脑补的。   https://www.ossez.com/t/iot/13815

2021年11月22日 0Comments 665Browse 0Like Read more
Computer Science

Moment.js 如何使用 Epoch Time 来构造对象

如果你对 Epoch 不是非常了解的话,请参考下下面的帖子: UNIX时间:新纪元时间(Epoch Time) Moment.js 是可以直接使用数字来构造 Moment 对象的。 需要注意的是 Epoch 时间可能有 2 个数字。 对比下面 2 个数字: 1635795000000 1635795000 其实都表示的是一个时间,不同的是第一个数字带上了毫秒,第二个数字没有。 那么在构造 Moment 对象的时候使用的方法是不同的。 对一个数字,我们应该使用: moment(1635795000000) 直接构造就可以了。 对第二个数字,应该使用的方法是,moment.unix(1635795000)     从输出中,我们可以看出来,如果使用了 .unix 的方法的话,会自动在你的输入数据之后添加 3 个 0。 总结 Moment 对象内部使用的是毫秒级别的保存,因此在构造的时候如果使用的是数字来构造对象。 你需要考虑使用的方法,否则可能会出现不正确的情况。   https://www.ossez.com/t/moment-js-epoch-time/13812

2021年11月17日 0Comments 853Browse 0Like Read more
Computer Science

Moment.js 如何获得当前时间的零时时间

有这么一个需求。 假设当前我们时间戳的时间为:2021-11-16T18:00:17.095Z 我们希望获得当前时间戳所在的零时的时间为:2021-11-16T18:00:17.095Z 解决方案 Moment.js 非常贴心的提供了一个 startOf('days') 来帮你解决这个问题。 考察下面的代码: moment(1637085617095).utc().startOf('days').toISOString() 就可以获得你想要的时间了。   00-time-01805×544 26.1 KB   Moment.js 为我们提供了非常好的解决方案。 除此之外,你还可以有下面的一些选择. moment().startOf('year'); // 设置为今年一月1日上午 12:00 moment().startOf('month'); // 设置为本月1日上午 12:00 moment().startOf('quarter'); // 设置为当前季度的开始,即每月的第一天上午 12:00 moment().startOf('week'); // 设置为本周的第一天上午 12:00 moment().startOf('isoWeek'); // 根据 ISO 8601 设置为本周的第一天上午 12:00 moment().startOf('day'); // 设置为今天上午 12:00 moment().startOf('date'); // 设置为今天上午 12:00 moment().startOf('hour'); // 设置为当前时间,但是 0 分钟、0 秒钟、0 毫秒 moment().startOf('minute'); // 设置为当前时间,但是 0 秒钟、0 毫秒 moment().startOf('second'); // 与 moment().milliseconds(0); 相同 https://www.ossez.com/t/moment-js/13813

2021年11月17日 0Comments 751Browse 0Like Read more
Computer Science

JavaScript 的 parseInt() 函数

parseInt() 函数可解析一个字符串,并返回一个整数。 parseInt 可以接受 2 个函数。 parseInt(string, radix) 解析一个字符串并返回指定基数的十进制整数, radix 是2-36之间的整数,表示被解析字符串的基数。 当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。 参数 string 要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操作)。字符串开头的空白符将会被忽略。 radix 可选 从 2 到 36,表示字符串的基数。例如指定 16 表示被解析值是十六进制数。请注意,10不是默认值! 描述 parseInt函数将其第一个参数转换为一个字符串,对该字符串进行解析,然后返回一个整数或 NaN。 如果不是NaN,返回值将是以第一个参数作为指定基数 radix 的转换后的十进制整数。(例如,radix为10,就是可以转换十进制数,为8可以转换八进制数"07",16可以转换十六进制数"0xff",以此类推)。 对于 radix 为10以上的,英文字母表示大于9的数字。例如,对于十六进制数(基数16),则使用 A 到 F 。 如果 parseInt 遇到的字符不是指定 radix 参数中的数字,它将忽略该字符以及所有后续字符,并返回到该点为止已解析的整数值。 parseInt 将数字截断为整数值。 允许前导和尾随空格。 由于某些数字在其字符串表示形式中使用e字符(例如 6.022×23 表示 6.022e23 ),因此当对非常大或非常小的数字使用数字时,使用 parseInt 截断数字将产生意外结果。 parseInt不应替代Math.floor()。 parseInt 可以理解两个符号。+ 表示正数,- 表示负数(从ECMAScript 1开始)。它是在去掉空格后作为解析的初始步骤进行的。如果没有找到符号,算法将进入下一步;否则,它将删除符号,并对字符串的其余部分进行数字解析。 如果 radix 是 undefined、0或未指定的,JavaScript会假定以下情况: 如果输入的 string以 "0x"或 “0x”(一个0,后面是小写或大写的X)开头,那么radix被假定为16,字符串的其余部分被当做十六进制数去解析。 如果输入的 string以 “0”(0)开头, radix被假定为8(八进制)或10(十进制)。具体选择哪一个radix取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用 parseInt 时,一定要指定一个 radix。 如果输入的 string 以任何其他值开头, radix 是 10 (十进制)。 如果第一个字符不能转换为数字,parseInt会返回 NaN。 为了算术的目的,NaN 值不能作为任何 radix 的数字。你可以调用isNaN函数来确定parseInt的结果是否为 NaN。如果将NaN传递给算术运算,则运算结果也将是 NaN。 要将一个数字转换为特定的 radix 中的字符串字段,请使用 thatNumber.toString(radix)函数。 总结 通常我们都会使用 parseInt 来转换成一个 10 进制的数。 一个使用场景是你在参数中传入了一个字符串来表示当前时间的 Unix 时间,你需要将这个时间首先转换成整数后再用来构造 moment 对象。     在 IntelliJ IDEA 中,使用了不同的颜色来区分结果的类型。 同时如果是字符的话,IntelliJ IDEA 会使用引号。     如果上面图中的对比。 当然,你也可以直接写成 moment.utc(+duplicateData.timeStamp) 在方法前面添加一个 + 号也会帮你完成转换的。 有个同学做了下面的一个表,觉得挺好的,能够帮助你在转换的时候参考下。     parseInt 转换和可能出现 NaN 的情况。   https://www.ossez.com/t/javascript-parseint/13811

2021年11月17日 0Comments 648Browse 0Like Read more
Computer Science

TypeScript 是弱类型

类型系统按照「是否允许隐式类型转换」来分类,可以分为强类型和弱类型。     以下这段代码不管是在 JavaScript 中还是在 TypeScript 中都是可以正常运行的,运行时数字 1 会被隐式类型转换为字符串 '1',加号 + 被识别为字符串拼接,所以打印出结果是字符串 '11'。 console.log(1 + '1'); // 打印出字符串 '11' TypeScript 是完全兼容 JavaScript 的,它不会修改 JavaScript 运行时的特性,所以 它们都是弱类型。 与弱类型对应的就是强类型语言,比如说 Java。 强类型语言是一种强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是这该死的数据类型。 强类型语言包括:Java、.net、Python、C++ 等语言。 虽然有时候 Java 也会给你做一些隐式转换,但是大部分情况类型不匹配,在编译的时候就会报错了。 例如,我们可以看看下面的 Python 代码,因为 Python 是强类型,以下代码会在运行时报错: print(1 + '1') # TypeError: unsupported operand type(s) for +: 'int' and 'str' 若要修复该错误,需要进行强制类型转换: print(str(1) + '1') # 打印出字符串 '11' 强/弱是相对的,Python 在处理整型和浮点型相加时,会将整型隐式转换为浮点型,但是这并不影响 Python 是强类型的结论,因为大部分情况下 Python 并不会进行隐式类型转换。 相比而言,JavaScript 和 TypeScript 中不管加号两侧是什么类型,都可以通过隐式类型转换计算出一个结果——而不是报错——所以 JavaScript 和 TypeScript 都是弱类型。 虽然 TypeScript 不限制加号两侧的类型,但是我们可以借助 TypeScript 提供的类型系统,以及 ESLint 提供的代码检查功能,来限制加号两侧必须同为数字或同为字符串。 这在一定程度上使得 TypeScript 向「强类型」更近一步了——当然,这种限制是可选的。 这样的类型系统体现了 TypeScript 的核心设计理念:在完整保留 JavaScript 运行时行为的基础上,通过引入静态类型系统来提高代码的可维护性,减少可能出现的 bug。 这就是为什么对 Java 同学来说,可能更喜欢 TypeScript 一些。 https://www.ossez.com/t/typescript/13810  

2021年11月16日 0Comments 1129Browse 0Like Read more
Computer Science

TypeScript 类型系统

针对 JavaScript 上面的问题,聪明的同学就想那我们就给 JavaScript 加个类型吧,和 Java 一样,能够对变量的类型进行定义,这个想法就是 TypeScript 的类型系统, 在很大程度上弥补了 JavaScript 的带来的困惑。 从 TypeScript 的名字就可以看出来,「类型」是其最核心的特性,TypeScript 也主要致力于解决 JavaScript 的类型混乱问题。   prts_03011422×762 53.3 KB   TypeScript 是静态类型 类型系统按照「类型检查的时机」来分类,可以分为下面 2 种 动态类型 静态类型 动态类型是指在运行时才会进行类型检查,这种语言的类型错误往往会导致运行时错误。 JavaScript 是一门解释型语言,没有编译阶段(这个就是另外一个针对 Java 同学经常吐槽的地方),所以它是动态类型,以下这段代码在运行时才会报错: let foo = 1; foo.split(' '); // Uncaught TypeError: foo.split is not a function // 运行时会报错(foo.split 不是一个函数),在运行的时候造成 bug。 // 打开你浏览器 F12 看看上面有多少错误你就能了解到了。 静态类型是指编译阶段就能确定每个变量的类型,这种语言的类型错误往往会导致语法错误。TypeScript 在运行前需要先编译为 JavaScript,而在编译阶段就会进行类型检查,所以 TypeScript 是静态类型,这段 TypeScript 代码在编译阶段就会报错了: let foo = 1; foo.split(' '); // Property 'split' does not exist on type 'number'. // 编译时会报错(数字没有 split 方法),无法通过编译 你可能会奇怪,这段 TypeScript 代码看上去和 JavaScript 没有什么区别呀。 没错!大部分 JavaScript 代码都只需要经过少量的修改(或者完全不用修改)就变成 TypeScript 代码,这得益于 TypeScript 强大的[类型推论][],即使不去手动声明变量 foo 的类型,也能在变量初始化时自动推论出它是一个 number 类型。 完整的 TypeScript 代码是这样的: let foo: number = 1; foo.split(' '); // Property 'split' does not exist on type 'number'. // 编译时会报错(数字没有 split 方法),无法通过编译 TypeScript 希望通过上面的配置来增强 JavaScript 的功能。   https://www.ossez.com/t/typescript/13809

2021年11月16日 0Comments 766Browse 0Like Read more
Computer Science

TypeScript 针对 JavaScript 做了什么

JavaScript 是一门非常灵活的编程语言,在了解为什么要有 TypeScript 之前,觉得还是有必要说说这个世界对 JavaScript 的误解。 JavaScript 语言特性和不足 因为 JavaScript 堪称世界上被人误解最深的编程语言。虽然常被嘲为“玩具语言”,但在它看似简洁的外衣下,还隐藏着强大的语言特性。 JavaScript 目前广泛应用于众多知名应用中,对于网页和移动开发者来说,深入理解 JavaScript 就尤为必要。 我们有必要先从这门语言的历史谈起。在1995 年 Netscape 一位名为 Brendan Eich 的工程师创造了 JavaScript,随后在 1996 年初,JavaScript 首先被应用于 Netscape 2 浏览器上。最初的 JavaScript 名为 LiveScript,但是因为一个糟糕的营销策略而被重新命名,该策略企图利用Sun Microsystem 的 Java 语言的流行性,将它的名字从最初的 LiveScript 更改为 JavaScript——尽管两者之间并没有什么共同点。 这便是之后混淆产生的根源。 敲黑板:JavaScript 和 Java 一点关系都没有,甚至可以说是 2 个完全不同的动物。 几个月后,Microsoft 随 IE 3 发布推出了一个与之基本兼容的语言 JScript。 又过了几个月,Netscape 将 JavaScript 提交至 Ecma International(一个欧洲标准化组织), ECMAScript 标准第一版便在 1997 年诞生了,随后在 1999 年以 ECMAScript 第三版的形式进行了更新,从那之后这个标准没有发生过大的改动。由于委员会在语言特性的讨论上发生分歧,ECMAScript 第四版尚未推出便被废除,但随后于 2009 年 12 月发布的 ECMAScript 第五版引入了第四版草案加入的许多特性。 第六版标准已经于 2015 年 6 月发布。 如果要说说 JavaScript 还有什么特性的话就是大致可以考虑下有: 它没有类型约束,一个变量可能初始化时是字符串,过一会儿又被赋值为数字。 由于隐式类型转换的存在,有的变量的类型很难在运行前就确定。 基于原型的面向对象编程,使得原型上的属性或方法可以在运行时被修改。 函数是 JavaScript 中的一等公民,可以赋值给变量,也可以当作参数或返回值。 JavaScript 的代码质量参差不齐,维护成本高,运行时错误多多。     针对 Java 程序员来说,最最头疼重要的就是 JavaScript 毫无章法的变量类型,完全不知道自己的变量是什么,和另外一个就是 JavaScript 是一种解释型的脚本语言, 与 Java 等语言先编译后执行不同, JavaScript 是在程序的运行过程中逐行进行解释。这就导致 JavaScript 的很多错误在编译的过程中无法发现,运行后又问题多多。 要赶上 JavaScript, TypeScript 还有很长的路要走。 https://www.ossez.com/t/typescript-javascript/13808  

2021年11月15日 0Comments 791Browse 0Like Read more
Computer Science

Moment.js 转换 UTC 格式的 2 个小问题

在使用 Moment.js 转换为 UTC 格式的时候,我们可能会遇到 2 个小问题。 如果你使用 ('2021-11-01T19:39:00.000').utc().format(); 来进行 UTC 时间转换的话,你会发现你输入时间和输出时间是不同的。 转换时区 如果上面所描述的,在结果中,我们看到如下图     输入的时间,我们实际上使用 UTC 的时间,但是在转换成功后,我们会发现 2 个时间有偏差。 有这个偏差的原因就是当前你的计算机的时间。 从下图我们可以看到:     在对象初始化的时候,是否是 UTC 的时间参数选项是 false。 因此才会出现偏差。 如果你已知的输入时间是 UTC 时间的话,你可以使用下面的代码: moment.utc('2021-11-01T19:39:00.000').format();     这样的方式初始化对象的话,对象的时间标记将会标记为 UTC 时间。 format 函数没有毫秒 聪明的你可能会看到,如果你使用 format() 函数进行格式化 ISO 时间的话是没有毫秒的。 如果你希望你的时间对象格式化输出后有毫秒数据。 你应该使用的方法是: toISOString() 考察下面的代码: moment.utc('2021-11-01T19:39:00.000').toISOString() 如下图所示,下面的代码格式化输出后将会有毫秒数据:     这是在实际使用的时候需要注意一下的地方。 https://www.ossez.com/t/moment-js-utc-2/13807

2021年11月15日 0Comments 652Browse 0Like Read more
Computer Science

什么是 TypeScript

TypeScript is JavaScript with syntax for types (TypeScript 是一个使用了 types 类型的 JavaScript 语言)。 添加了类型系统的 JavaScript,适用于任何规模的项目。 上面的英文是从官方网站 [1] 上抄录下来的。     从上面的文字,可以简单的理解就是针 JavaScript 语言,TypeScript 添加了「类型(types)」。 如果你写过或者了解 Java 程序的,你会知道 Java 在定义 变量的时候需要对变量的类型进行定义。 在实际使用的时候,因为变量的类型进行了定义,因此 Java 语言就涉及到类型转换,比如说要把 String 转换为 Int,虽然 Java 对其类型转换进行了一些包装,但是整个转换过程还是有点学习曲线的。 对比 Java 而言,JavaScript 就完全不需要对类型进行定义了,JavaScript 会在运行的时候帮你进行类型的自动判断和转换。这个就导致 JavaScript 非常灵活,灵活的同时就会带来困惑, 原因是你在程序运行的时候,完全不知道你的变量是什么类型的,这会导致一些莫名其妙的错误发生,而且 Debug 的时候也是比较纠结。   https://www.ossez.com/t/typescript/13806

2021年11月12日 0Comments 953Browse 0Like Read more
1…119120121122123…304
Archives
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,367)
    • Confluence (663)
    • Gradle (12)
  • U.S. (522)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1