
Nothing for nothing.
ExcelUtil 借助反射和 POI 对 Excel 读取,省略了以往读取 Excel 的繁琐步骤,调用 ExcelUtil 只需要2步,对,你没有看错,2步足以读取到 Excel 的内容。自动赋值,传入对应Model所在路径,即可自动赋值.自动匹配数据类型String,Int,Long,Date,Double等,精准定位报错信息. 使用场景: 可以想一下我们现在有个Excel导入任务,比如是导入一个班级的学生花名册,比如学生这个实体类是Student.java 一般的导入是需要每行每列对Excel进行遍历,然后给Student的各个属性进行赋值,然后如果碰到Teacher.java需要导入,难道还要在写一遍遍历?代码又臭又长不说,而且代码冗余很多,现在借助ExcelUtil这个公共类,可以实现优雅,容易的读取.兼容03,07版Excel.大家用的时候只需要把ExcelUtil和StringUtil放在自己项目中就可以了,正在提交maven库,后期直接引入maven就可以了. 调用步骤: 1.定义需要读取的表头字段和表头对应的属性字段 String keyValue ="手机名称:phoneName,颜色:color,售价:price"; 2.读取数据 List list=ExcelUtil.readXls("C://test.xlsx",ExcelUtil.getMap(keyValue),"com.lkx.model.PhoneModel") POM引入 <groupId>net.oschina.likaixuan</groupId> <artifactId>excelutil</artifactId> <version>1.0</version> 文章转载自 开源中国社区 [http://www.oschina.net]
本文通过观察 Java EE 和 Kotlin 的关系,探讨如何利用 Kotlin 的运算符、可空性和 Optional 来实现最大的效果。 将 Java EE 应用转换为 Kotlin 始于框架的战斗,我们成功战胜了所有阻碍和过时的标准。在这个过程中,代码充斥着丰富而现代的 Kotlin 特有的结构,变得简洁而又不失安全。 如果还没有读这个系列的前面两篇文章,可以看看: Kotlin and Java EE: Part One - From Java to Kotlin Kotlin and Java EE: Part Two - Having Fun with Plugins 先简要回顾一下之前进行的改变,然后再补充一些最后的结果。 边城边城翻译于 2周前0人顶顶 翻译得不错哦!我们已经做了什么 前两个部分中的很多结构已经符合 Kotlin 的惯例了。我们来看下 set 的定义: private final Set<Class<?>> classes = new HashSet<>(Arrays.asList(KittenRestService.class)); 由于 Java 并不支持简单地通过一些对象构造 Set 或其它集合类型,因此我们需要用 Arrays 类来创建 List (!),然后将其转换为 Set。在 Kotlin 中代码变成了: private val classes = setOf(KittenRestService::class.java)我们还把 Java Bean 转换为 Kotlin 数据类(data class),使代码变得更简短。我们去掉了所有 getter 和 setter,并自动获得 equals()、hashCode() 和 toString()。 @Entity data class KittenEntity private constructor( @Id var id: Int?, override var name: String, override var cuteness: Int // set Int.MAX_VALUE for Nermal ) : Kitten { constructor(name: String, cuteness: Int) : this(null, name, cuteness) } 因为有编译器插件,我们可以“假冒”不可变对象而不需要无参数构造函数。 @Path("kitten") class KittenRestService @Inject constructor(private val kittenBusinessService: KittenBusinessService) { lateinit 关键字让框架可以更方便地处理值的初始化,还可以避免不必要的空检查: @Stateless class KittenBusinessService { @PersistenceContext private lateinit var entityManager: EntityManager ... 再来看看我们还可以改进什么。 边城边城翻译于 2周前0人顶顶 翻译得不错哦!Null 还是 Optional? 这是一个相当棘手的问题。Kotlin 对可空值的支持已经很好了,尤其是在使用第三方库的时候会有很大的帮助。问题是当你有机会进行选择的时候你会选择哪一个?下面是原来我们生成和使用 Optional 的代码: fun find(id: Int): Optional<KittenEntity> = Optional.ofNullable(entityManager.find(KittenEntity::class.java, id)) fun find(id: Int): KittenRest = kittenBusinessService .find(id) .map { kittenEntity -> KittenRest(kittenEntity.name, kittenEntity.cuteness) } .orElseThrow { NotFoundException("ID $id not found") } 惯用的 Kotlin 解决方案会使用空值,像这样: fun find(id: Int): KittenEntity? = entityManager.find(KittenEntity::class.java, id) fun find(id: Int) = kittenBusinessService.find(id) ?.let { KittenRest(it.name, it.cuteness) } ?: throw NotFoundException("ID $id not found") 可空值会出现在调用链的每个节点上,所以你必须使用问号来进行调用。它虽然解决了空值问题,但并不好看。 然而,如果返回类型是 Optional,而结果是 Optional.empty,后面的所有单独调用(monadic calls)都会被简单的跳过,结果直接变成 Optional.empty。对于我来说这是个很简洁的解决方案,如果想从 Java 调用 Kotlin 代码这也更安全, 对于 Java 互操作,优先使用 Optional 来处理可空值。 边城边城翻译于 2周前0人顶顶 翻译得不错哦!运算符! find、add 和 delete 都是完全有效的方法名称,但用运算符代替它们不是很好吗? 运算符! 我发现运算符不只是更短,可读性也更强,因为代码不再是一大堆方法调用。但要小心使用大家都知道或理解的运算符,否则你会遇到和 Scala 库类似的大麻烦,然后就得有一个运算符表来解释。在使用数据仓库的情况下,类似 MutableMap 的接口工作良好。注意,我使用“赋值加”(+=) 运算符来保存一个实体,因为原来的集包含了已经拥有的元素,又另外增加了一个元素。 这是声明: operator fun plusAssign(kitten: KittenEntity) = entityManager.persist(kitten) operator fun get(id: Int): KittenEntity? = entityManager.find(KittenEntity::class.java, id) 你可能想保留原来的方法,同时使用运算符来对它们进行包装,因为原来的方法可以返回值,而某些运算符却不能。其它可选用运算符的操作包括“remove” 和 “contains” 方法,因为它们可以用“赋值减”(-=)和Kotlin 的 in 运算符。剩下的请你充分发挥自己的想像。 边城边城翻译于 2周前0人顶顶 翻译得不错哦!结论 以符合使用习惯的方式书写,目的是使代码更具可读性以及更安全,我希望展示的例子能够成功地实现这一目标。 该系列仅显示了几种方法来改进 Java 版本的代码,同时使某些地方保持不变。一些值得探索的功能是:扩展函数,以及 if,when,try/catch 功能。去探索吧,找到对你有用的功能。 完整的代码可以在这里找到。 文章转载自 开源中国社区 [http://www.oschina.net]
一、性能优化的原则及方法论 树立原则:动态渲染进入一个Dom元素,首先需要保证动态渲染操作必须尽可能少对原有dom树的影响,影响重绘及重排。 确定方法论:必须寻找一个容器来缓存渲染期间生成的dom结构(操作必须尽可能少对原有dom树的影响),然后再进行一次渲染到目标element中。 二、生成期间DOM缓存的选择 DocumentFragment(文档碎片对象,选择原因:脱离于文档流)临时Element(选择原因:新element脱离于文档流)createElement,再一步步进行渲染通过描述Dom的String(下称:DomString),转化为Dom对象临时Element+innerHTML+cloneNode返回最外层element元素对象,再进行插入appendChild,必要时还需要选择器方法讲某一个Element对象提取出来XML字符串通过解析生成Element对象(注意,不是HTMLxxxElement对象,是Element对象),然后将该对象appendChild进去临时字符串(选择原因:借助innerHTML渲染,一次渲染)三、DocumentFragment的优缺点 基本模式: var fragment = document.createDocumentFragment(); fragment.appendChild( ... //生成Element的IIFE ) //IIFE示例,根据配置创建元素 var ConfigVar = { ELname:"div", id:"blablabla", name:"balblabla", class:"ClassName" } (function(Config){ var el = document.createElement(Config.ELname); el.className = (Config.class || ""); for (let AttrName in Config){ if (AttrName == "class")continue; el.setAttribute(AttrName,Config[AttrName]); } return el; })(ConfigVar) 优点 1、脱离于文档流,操作不会对Dom树产生影响 2、在每一次生成临时Element时候就可以将该Element对象的引用保存下来,而不需要多次用选择器再次获取。 缺点 兼容性只是达到IE9+ http://caniuse.com/#search=DocumentFragment 四、createElement的优缺点 基本模式 var el = document.createElement("ElementName"); el.className = ""; el.setAttribute("AttrName",AttrValue); el.setAttribute("AttrName",AttrValue); ... el.appendChild( ... //生成Element的IIFE,见上文 ); 优点 1、新创建的元素脱离于文档流,操作不会对Dom树产生影响 2、兼容性最好 3、在每一次生成临时Element时候就可以将该Element对象的引用保存下来,而不需要多次用选择器再次获取。 缺点 每一次调用setAttribute方法都是一次次对Element进行修改,此处具有潜在的性能损耗。 五、DomString——临时Element+innerHTML+cloneNode的优缺点 基本模式 var domString2Dom = (function(){ if (window.HTMLTemplateElement){ var container = document.createElement("template"); return function(domString){ container.innerHTML = domString; return container.content.firstChild.cloneNode(true) } }else{ //对不支持的template 的浏览器还有兼容性方法没写,所以不支持tr,td等些元素inner进div中。 var container = document.createElement("div"); return function(domString){ container.innerHTML = domString; return container.firstChild.cloneNode(true) } } })(); var template = domString2Dom('<div class="TestClass" Arg="TestArg"></div>'); for (var index = 0; index < 80; index++) { template.appendChild( (function(){ var el = domString2Dom("<div>M</div>"); return el })() ) } 优点 创建Dom之后不需要多次进行setAttribute 缺点 1、临时元素不能包裹一些特定的元素(不能在所有浏览器的所有 HTML 元素上设置 innerHTML 属性) 2、解析的过程进行了很多其余的操作。此处具有潜在的性能损耗。 3、插入的字符串第一层Node只允许有一个元素 六、DomString——XML解析的优缺点 基本模式 var XMLParser = function () { var $DOMParser = new DOMParser(); return function (domString) { if (domString[0] == "<") { var doc = $DOMParser.parseFromString(domString, "application/xhtml+xml"); return doc.firstChild; } else { return document.createTextNode(domString); } }; }(); var template = XMLParser('<div class="TestClass" Arg="TestArg"></div>'); for (var index = 0; index < 80; index++) { template.appendChild((function () { var el = XMLParser("<div>M</div>"); return el; })()); } 优点 DomString方法中通用性最强的,虽然IE10+才支持DOMParser,但是IE9以下的有替代方法 缺点 1、解析的过程本身就具有潜在的性能损耗。 2、只能得到刚刚创建最外层元素的克隆。子元素的引用还需要用选择器。 3、插入的字符串第一层Node只允许有一个元素 七、临时字符串的优缺点 基本模式: var template = document.createElement("div"); template.innerHTML = `<div class="TestClass" Arg="TestArg"> Test TextNode ${(function(){ var temp = new Array(8); for (var index = 0; index < 80; index++) { temp[index]="<div>M</div>" } return temp.join() }())} </div>` //需要增加的一大段Element 优点 1、通用性最强,不需要逐步创建一大堆无用的Element对象引用 2、运用es6模板字符串编码优雅,不需要字符串用加号进行链接 缺点 1、如果是直接给出配置Config进行渲染需要进行字符串的生成 2、只能得到刚刚创建最外层元素的引用。子元素的引用还需要用选择器。 八、Template元素 由于HTML5中新增了template元素 其特点就是有一个content属性是HTMLDocumentFragment对象,所以可以包容任何元素 基本范式是: var template = document.createElement("template"); template.innerHTML = `<div class="TestClass" Arg="TestArg"> Test TextNode ${(function(){ var temp = new Array(8); for (var index = 0; index < 80; index++) { temp[index]="<div>M</div>" } return temp.join() }())} </div>` //需要增加的一大段Element // template.content 是HTMLDocumentFragment 优点 比div要好很多,作为临时元素容器的包容性更强 缺点 兼容性不好:http://caniuse.com/#search=HTML%20templates 在不支持的浏览器中表示为HTMLUnknownElement 九、各种方法的效率对比 测试代码:(由于笔者不太熟悉各种浏览器性能的BUG,这里的代码如果有不足请指正),代码由typescript进行编写,也可以用babel进行编译。 /** * @param Count:渲染DOM结构的次数 */ var DateCount = { TimeList : {}, time:function(Str){ console.time(Str); }, timeEnd:function(Str){ console.timeEnd(Str); } }; //==================工具函数====================== var domString2Dom = (function () { var container; if (window.HTMLTemplateElement) { container = document.createElement("template"); return function (domString) { container.innerHTML = domString; return container.content.firstChild.cloneNode(true); }; } else { //对不支持的template 的浏览器还有兼容性方法没写,所以不支持tr,td等些元素inner进div中。 container = document.createElement("div"); return function (domString) { container.innerHTML = domString; return container.firstChild.cloneNode(true); }; } })(); var XMLParser = (function () { var $DOMParser; if (window.DOMParser) { $DOMParser = new DOMParser(); return function (domString) { if (domString[0] == "<") { var doc = $DOMParser.parseFromString(domString, "application/xhtml+xml"); return doc.firstChild; } else { return document.createTextNode(domString); } }; }else{ $DOMParser = new ActiveXObject("Microsoft.XMLDOM"); return function (domString) { if (domString[0] == "<") { $DOMParser.async = false; $DOMParser.loadXML(domString); return $DOMParser } else { return document.createTextNode(domString); } } } })(); //=============================================== var Test = function(Count){ //保留这种写法,能够在移动端平台中不依靠控制台进行效率测试 // var DateCount = { // TimeList : {}, // time:function(Str){ // this.TimeList[Str] = Date.now(); // }, // timeEnd:function(Str){ // alert(Str+(Date.now() - this.TimeList[Str])); // } // } //基准测试1: DateCount.time("无临时div + 不需要字符串拼接 + innerHTML:") for (let index = 0; index < Count; index++) { (function(){ var template = document.createElement("div"); template.className = "TestClass"; template.setAttribute("Arg","TestArg") template.innerHTML = ` Test TextNode <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> <div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div><div child="true">M</div> ` //需要增加的一大段Element,共100个子级div return template }()) } DateCount.timeEnd("无临时div + 不需要字符串拼接 + innerHTML:") //基准测试2: DateCount.time("createElement+appendChild写法:") for (let index = 0; index < Count; index++) { (function(){ var template = document.createElement("div"); template.className = "TestClass"; template.setAttribute("Arg","TestArg") template.appendChild(document.createTextNode('Test TextNode')); for (let index = 0; index < 100; index++) { let element = document.createElement("div"); element.setAttribute("child","true"); element.appendChild(document.createTextNode("M")) template.appendChild(element) } return template }()) } DateCount.timeEnd("createElement+appendChild写法:") //DocumentFragment DateCount.time("DocumentFragment+ createElement+appendChild 写法:") for (let index = 0; index < Count; index++) { (function(){ var fragment = document.createDocumentFragment(); fragment.appendChild(function(){ var template = document.createElement("div"); template.className = "TestClass"; template.setAttribute("Arg","TestArg") template.appendChild(document.createTextNode('Test TextNode')); for (let index = 0; index < 100; index++) { let element = document.createElement("div"); element.setAttribute("child","true"); template.appendChild(element) } return template; }()); return fragment }()) } DateCount.timeEnd("DocumentFragment+ createElement+appendChild 写法:") //DomString——临时Element+innerHTML+cloneNode // DateCount.time("DomString——临时Element+innerHTML+cloneNode:") // for (let index = 0; index < Count; index++) { // (function(){ // var template = domString2Dom('<div class="TestClass" Arg="TestArg"></div>'); // for (let index = 0; index < 100; index++) { // template.appendChild( // (function(){ // var el = domString2Dom("<div child='true'>M</div>"); // return el // })() // ) // } // return template; // }()) // } // DateCount.timeEnd("DomString——临时Element+innerHTML+cloneNode:") //DomString——XML解析 // DateCount.time("DomString——XML解析:") // for (let index = 0; index < Count; index++) { // (function(){ // var template = XMLParser('<div class="TestClass" Arg="TestArg"></div>'); // for (let index = 0; index < 100; index++) { // template.appendChild((function () { // var el = XMLParser("<div child='true'>M</div>"); // return el; // })()); // } // }()) // } // DateCount.timeEnd("DomString——XML解析:") //临时div + 临时字符串拼接: DateCount.time("临时div + 字符串拼接:") for (let index = 0; index < Count; index++) { (function(){ let template = document.createElement("div"); template.innerHTML = `<div class="TestClass" Arg="TestArg"> Test TextNode ${(function(){ let temp = ""; for (let index = 0; index < 100; index++) { temp+="<div child='true'>M</div>" } return temp }())} </div>` //需要增加的一大段Element return template.firstChild; }()) } DateCount.timeEnd("临时div + 字符串拼接:") //临时template + 临时字符串拼接: DateCount.time("临时template + 字符串拼接:") for (let index = 0; index < Count; index++) { (function(){ var template = document.createElement("template"); template.innerHTML = `<div class="TestClass" Arg="TestArg"> Test TextNode ${(function(){ let temp = ""; for (let index = 0; index < 100; index++) { temp+="<div child='true'>M</div>" } return temp }())} </div>` //需要增加的一大段Element return template.content; }()) } DateCount.timeEnd("临时template + 字符串拼接:") //临时template + createElement+appendChild 写法 DateCount.time("template + createElement+appendChild 写法:") for (let index = 0; index < Count; index++) { (function(){ var template = document.createElement("template"); template.appendChild(function(){ var template = document.createElement("div"); template.className = "TestClass"; template.setAttribute("Arg","TestArg") template.appendChild(document.createTextNode('Test TextNode')); for (let index = 0; index < 100; index++) { let element = document.createElement("div"); element.setAttribute("child","true"); template.appendChild(element) } return template; }()); return template.content }()) } DateCount.timeEnd("template + createElement+appendChild 写法:") }; for (var key of [1,10,100,1000]) { console.log("Start"+key); Test(key); } 十、结论 经过笔者基本依据手上平台进行测试, 无临时div + 不需要字符串拼接 + innerHTML // createElement+appendChild写法:性能低,无论在桌面端还是移动端,在IE/Edge系还是 Webkit系都是同样的表现domString 方法:性能最差DocumentFragment+ createElement+appendChild 写法:性能在桌面WebKit端表现最好,移动端也有不错的表现字符串拼接:临时div + 字符串拼接/临时template + 字符串拼接:性能表现基本一致,桌面端WebKit上:比DocumentFragment(或tmplate) + createElement+appendChild性能差多了;与之相反,在IE系inneHTML的性能最高,是前者的x十倍。在移动端上两者性能相近,innerHTML略差一点点。template + createElement+appendChild 写法:与DocumentFragment+ createElement+appendChild 写法效率相仿。具体数据测试之后再补充。 (待续) © 著作权归作者所有 文章转载自 开源中国社区 [http://www.oschina.net]
继昨天发布新版开源中国 iOS 客户端 v3.8.4 之后,今天我们如约双手份上该版本源码,敬请各位OSCer笑纳! (广而告之:这个美好的六月,开源中国源创会童鞋们马不停蹄地赶往杭州,因为「毕竟西湖六月中,风光不与四时同」,带着自由、开放、分享的开源精神和大家一起分享、交流,是何等惬意的事情呢!杭州附近的童鞋,请 猛击这里报名哦!除了各种干货之外,还有众多奖品等着你)该版本中主要的变化: 码云推荐模块中新增横屏阅读代码特性 修改从系统相册中分享图片到动弹可能失败的问题 改进了底层网络、IO等操作(防止发热) 获取开源中国 iOS 客户端 v3.8.4 源码请访问:https://git.oschina.net/oschina/iphone-app 关于我们的源码,请注意: 仓库的master分支中,并不保留任何代码 最新的代码总是会在其版本号对应的tag或branch中(如:v3.8.4) 将代码放到分支(或标签)中有什么好坏,请大家自行补脑 大家都知道,开源中国秉承自由、开放、分享的精神,每次客户端升级之后代码都会在第一时间开源,以供大家查阅、学习、批评、指正。所以,遇到有问题或更好的建议时,请大家通过码云issue来向我们反馈。 当然,客户端小组童鞋更希望广大OSCer们能够请大家喝杯咖啡。通过更实际的方式支持我们,我们会非常非常非常高兴的。 若在使用过程中遇到问题,请通过客户端内「反馈」模块与我们取得联系。当然,我们也非常欢迎各位盆友通过动弹向我们反馈遇到的问题。 文章转载自 开源中国社区 [http://www.oschina.net]
微软5月份宣布了专门针对中国定制的 Windows 10 政府版。官方介绍称,Windows 10 政府版由微软和神州网信合作开发,删除了一些诸如 OneDrive、娱乐等政府不需要的功能,另外满足“政府数据不出境、留在中国”的要求。神州网信公司 CEO 徐维英表示,Windows 10 政府版实现了本地激活、补丁、更新和升级。中国海关、上海市经信委和卫视通三家机构作为试点,接下来将会有更多的试点客户。 日前,微软大中华区 CEO 柯睿杰表示,基于“安全可控”原则打造的中国政府版 Win 10 正处于上市销售前的准备当中,该版本 Win10 已经通过3家大型企业的用户测试,证明该版本系统拥有可靠的安全性,接下来将进行大规模的部署。 对此,中国工程院院士倪光南今日在南方都市报发布专栏文章,建议政府停止采购和使用“ Win10 政府版”。倪光南表示,按照网信办发布的《网络产品和服务安全审查办法》,网络安全审查有严格的程序,并需由国家统一认定网络安全审查第三方机构,承担网络安全审查中的第三方评价工作。2015年,早在CETC(中国电子科技集团)与微软的合资公司成立前,微软就做出了“Win10政府版”。那时,《网络产品和服务安全审查办法》正在制订中,有关方面对“Win10政府版”进行了一次网络安全审查,结果没有通过。此后,对“Win10政府版”并没有再做此类审查。因此,不管后来它做了什么“用户测试”、“安全测试”,它至今仍是一个没有通过网络安全审查的产品。 倪光南称,鉴于 Win10 等同于 Win8 以及 “Win10政府版” 并未通过网络安全审查,希望有关方面予以关注,应依法继续禁止政府采购和使用 Win10(包括“Win10政府版”在内)。 文章转载自 开源中国社区 [http://www.oschina.net]
6月8日,炎炎夏日将至,近乎新版v5.0正式发布! 本次近乎全新改版,从最初的定位到最终的呈现方式,v5.0都以崭新面孔示人。无论是追求高质高感的加“料”动作,灵活百变的“型”体塑造,还是性能的高调升级,v5.0都在极力探索互联网下企业社交之道,以快速搭建和定制出符合客户需求的新型社区网站为目标,实现多终端内容一体化。 l 内容为重,有料为王 v5.0研发团队非常重视内容的创作,不仅在呈现方式上借鉴当下最为流行的视觉与操作效果,更在内容生产上力保高质,张弛有度。 文章、组图、视频、贴吧,全新呈现,强力视觉冲击,邀你一起感受彩色世界的斑斓。 https://static.oschina.net/uploads/space/2017/0609/152109_4gLg_2886655.png" > 弱化UGC用户原创,仅保留撰写文章功能,实现用户为站点投稿或写作专栏(博客)的运营意图。而在PGC方面,增加组图、视频等内容模型,强势助产高质量内容。 https://static.oschina.net/uploads/space/2017/0609/152126_cnzE_2886655.png" > 弱化SNS用户关系,仅保留基本的关注、粉丝和邀请朋友功能,同时强化QQ、微信、微博等社会化媒体的站外分享、第三方登录,以及注册时的真实性验证,安全再升级。 弱化皮肤设计和风格自定义,压缩个性装饰,强调内容,只允许用户自定义空间封面图片、整站风格等。 https://static.oschina.net/uploads/space/2017/0608/162914_XAyU_1041887.png" > l 灵活多变,可型可塑 无论是技术框架的设计还是功能模块的规划,v5.0都分分钟考虑了产品的扩展性和灵活性。 站点导航自定义,可把资讯栏目或任意链接设置为导航,并支持多级任意排序;文章可变身为博客,贴吧可变身为群组,资讯可快速增加新的内容模型,让扩展有无限可能;技术框架内置了丰富的构件(附件、评论、标签、分类、赞、收藏、积分......),无论修改已有的应用模块还是开发新的应用模块都十分方便。 https://static.oschina.net/uploads/space/2017/0608/162956_CuVj_1041887.png" > https://static.oschina.net/uploads/space/2017/0608/163007_1c8y_1041887.png" > 如此灵活的产品收放能力,让v5.0成为“百变”之星,快速完成搭建与定制:你能够搭建小米、华为心声这样的粉丝狂欢社区,呈现如虎嗅、36kr等专家级资讯版块,或者开拓果壳网小组、问答产品,乃至快速定制如豆瓣的读书、电影兴趣小组。 l 一端发布,多端呈现 注册/登录、内容浏览/发布、评论/点赞/收藏……v5.0移动端横扫web端绝大部分功能,一端发布即可多终端完美呈现,真正实现内容统一管理。移动端界面简约大气,充分考虑了手机的用户体验和使用习惯,在操作上也更为流畅便利。 l 性能优化,闪电响应v5.0对后端框架进行了重新搭建,在分布式文件存储、集群部署方面有了新突破,可轻松支持高并发和千万级数据;在前端框架上以模块化思想进行全新改装,页面响应速度得到大幅提升。 近乎v5.0的发布,将帮助企业快速搭建与创造更为快捷、优质、安全的社交文化环境。目前,近乎v5.0版本已上线web端、移动端,app支持Android和iOS,另有触屏版和集成微信版也在开发进行中,即将上线,敬请期待。 文章转载自 开源中国社区 [http://www.oschina.net]
Foreman 1.15.1 发布了。Foreman 是一个集成的数据中心生命周期管理工具,提供了服务开通,配置管理以及报告功能,和 Puppet Dahboard一样,Foreman 也是一个 Ruby on Rails 程序。Foreman 和 Dashboard 不同的地方是在于,Foreman 更多的关注服务开通和管理数据中心的能力,例如和引导工具,PXE 启动服务器,DHCP 服务器及服务器开通工具进行集成。 暂未发现更新内容,查看 更新日志地址 或 提交记录。 下载地址: Source code (zip) Source code (tar.gz) 文章转载自 开源中国社区 [http://www.oschina.net]
Riot 3.6.0 发布了。Riot.js 是一个客户端模型-视图-呈现(MVP)框架并且它非常轻量级甚至小于 1kb。尽管他的大小令人难以置信,所有它能构建的有如下:一个模板引擎,路由,甚至是库和一个严格的并具有组织的 MVP 模式。当模型数据变化时视图也会自动更新。 本次更新如下: riot: Add: the option to block the riot automatic updates via riot.settings.autoUpdate more info riot/2377 Fix: regex in riot-tmpl: Fix: incorrect regex that matches literal regexes Fix: use shared regex parser for browser and server versions riot-compiler: Fix: various issues with literal regexes 下载地址: Source code (zip) Source code (tar.gz) 文章转载自 开源中国社区 [http://www.oschina.net]
Rust 1.18 发布了。Rust 是一门由 Mozilla 开发的专注于安全性,速度和并发性的系统编程语言。 Rust 1.18 增加了许多新特性,运行起来像这样: #![windows_subsystem(console)] #![windows_subsystem(windows)] Rust的元组,枚举变量字段和结构体(没有#[repr])总是有一个未定义的布局。 我们已经开始自动重新排序,结构如下: struct Suboptimal(u8, u16, u8); 新 API Child::try_wait is a non-blocking form of Child::wait. HashMap::retain and HashSet::retain bring the retain API Vec has to these two hash data structures. PeekMut::pop lets you pop the top element from a BinaryHeap after you’ve already peeked at it without needing to reorder the heap a second time. TcpStream::peek, UdpSocket::peek, UdpSocket::peek_from let you peek at a stream or socket. 更多内容点此查看,或查看发布说明。 下载地址: Source code (zip) Source code (tar.gz) 文章转载自 开源中国社区 [http://www.oschina.net]
Build 2017 大会上,微软宣布名为 Fluent Design System 的全新设计语言,会在即将到来的 Windows 10 秋季创作者更新中亮相。今天微软官方网站率先迎来重大更新,从效果上来看 Fluent Design 设计语言表现非常不错。 视频演示地址Fluent Design System 设计语言共有五大元素,分别为光照(Light)、深度(Depth)、运动(Motion)、材质(Material)和缩放(Scale),目前包括人脉、计算器和 Groove 音乐等核心应用已经获得该设计语言的调整。 该设计语言的核心就是在美观的前提下,应用程序的使用更加自然和流畅。微软的 Kevin Gallo 将 Fluent 称为“ Metro 的演进”,一种“现代设计语言”,最终成为微软的标志性设计语言。而本次回归的 Fluent Design System 不仅只是简单的 Aero 特效回归,而是针对系统、核心软件进行大规模的调整,用户会获得全新的过渡动画、视觉效果、半透明和模糊等等。 用户现在访问 Microsoft.com网站、微软帐号控制中心和微软 Store 都能看到 Fluent Design System 的优秀设计和演示,此外还面向开发者和设计师提供了一些交互式的演示。 稿源:cnBeta.COM 文章转载自 开源中国社区 [http://www.oschina.net]
Spring Integration 4.3.10 发布了。Spring Integration 能在基于 Spring 的应用中进行简单的消息通信,并通过简单的适配器与外部系统集成。这些适配器提供了一个更高级别的抽象,超越了 Spring 对远程调用、消息和调度的支持。其主要目标是在保持关注点分离的同时,为构建企业集成解决方案提供一个简单的模型,该模型对产出可维护、可测试的代码来说是必不可少的。 更新内容: Bug [INT-4248] - RedisLockRegistry does not release lock after TTL expiry [INT-4262] - Possible bug in schema-drop-mysql.sql file [INT-4270] - Allow MessageChannels and MessageHandlers to be Proxied with CGLib [INT-4272] - MessageBuilder Does Not Honor readOnlyHeaders for Unchanged Message [INT-4284] - java.time.Instant wrong type mapping with @Header Defect [INT-4259] - In the AbstractCorrelatingMessageHandler make rescheduling group log message as a WARN [INT-4267] - Make JSON serialization in MessageStore implementations much easy and reliable Improvement [INT-4257] - Make ErrorMessageSendingRecoverer more generic and introduce ErrorMessageStrategy for customization [INT-4276] - Add header black listing specifically for AbstractReplyProducingMessageHandler [INT-4288] - Allow additive header black listing New Feature [INT-2116] - Support Capture of Original Inbound Message in ErrorMessage Task [INT-4266] - Revise Gemfire integration tests for potential leaks of not stopped JVM forks 下载地址: Source code (zip) Source code (tar.gz) 文章转载自 开源中国社区 [http://www.oschina.net]
https://static.oschina.net/uploads/space/2017/0608/170134_oHwR_2896879.png" > 数据库连接池是常用的 B/S 技术,而似乎生活在这个“池子”里面的那些连接对象有点不幸。 要是顺利的话,你干完活就可以歇着了。 要是不顺利,比如你掌握的连接已经被拒绝了,那么…… 你就会被“砰”地干掉。就问你怕不怕?(话说回来,回答错误会不会也被“砰”……) 原文: http://turnoff.us/geek/db-connection-pool/ 作者:Daniel Stori 编译: Linux中国 译者&点评:wxy 文章转载自 开源中国社区 [http://www.oschina.net]
被 Safari、App Store 以及许多其他 OS X、iOS 和 Linux 应用所广泛使用的开源 Web 浏览器引擎 WebKit ,如今有了完整的 WebAssembly 部署能力。就在上周,Google Chrome 也宣布将停止支持 PNaCl ,拥抱 WebAssembly ,并表示因为考虑到跨浏览器支持乃是大势所趋,今后主要依靠 WebAssembly 构建原生代码。 WebAssembly 是用于 Web 编译的新型便携式格式。它为高效而设计,针对体积和载入时间进行了优化。WebAssembly 的官方博客表示,该格式支持 C++ 等语言,它处理 C++ 代码的速度甚至可以接近原生速度。它建立在 asm.js 实现之上,提供了一个“自动备份,沙盒执行环境”,但等值的二进制格式更小,并且不再需要解析 JavaScript 。 https://static.oschina.net/uploads/space/2017/0608/175321_rhyy_2896879.png" > 官方 DemoChrome 和 Firefox 浏览器目前完全支持 WebAssembly ,随着 WebKit 的完整 WebAssembly 实现,Safari 浏览器也将很快包含对 WebAssembly 的支持(Safari 预览版本已支持)。这些主流浏览器的支持,也将带动建立围绕 WebAssembly 的生态系统,为新一代可在任何浏览器中快速运行的沉浸式网络应用奠定基础。 对于此技术,你持怎样的看法?欢迎留言评论! 文章转载自 开源中国社区 [http://www.oschina.net]
在 2017 年 Python 语言峰会上,Victor Stinner 提出了一些改进 Python 性能的想法,他认为用户现在正在将 Python 的性能与 Rust 或 Go 进行比较,Python 核心开发人员需要找到一种加速 Python 的方法,以保持其与其他语言的竞争力。 但 Stinner 也表示 Python 并不像其他语言那样容易优化,主要是因为 C API 阻碍了这一块的创新性发展。 PyPy 的 CPyExt API 已经取得了很大的进步,但仍然有一些轻微的兼容性问题。 PyPy 几年前曾试图重新实现 NumPy 扩展,最终也失败了。 NumPy 是 Python 的 C 扩展包之一,从本质上来说必须适用于任何替代实现,但现实却并未做到如此。 Stinner 认为 just-in-time (JIT) 编译可能是一种方向,但可惜的是在各种项目上尝试(如 Unladen Swallow、Pyston 和 Pyjion )后,都未能成功。另外,PyPy 使 Python 的速度提高了五倍,是否应该放弃 CPython 而推广 PyPy ?在他看来,许多核心开发人员更喜欢 CPython 和 C API,但如果 Python 想在当今的语言组合中具有竞争力,则需要 JIT 或转到 PyPy 。Stinner 还提出了一些其它的想法,比如说也许可以创建一个类似于 Python 的新语言,但更为严格,就像 Hack for PHP 那样,或许能实现 2x 目标。提前编译(AoT),也可能是一种实现 JIT 而无需长时间预热的可能性。另外像是多级 JIT ,类似 JavaScript,或许也能带来性能提升。 观点提出后,现场得到了许多赞同、反对和质疑的声音。Python 后续该如何发展,还需要这群核心开发者继续探讨和摸索。对此,你怎么看?欢迎留言评论。 文章转载自 开源中国社区 [http://www.oschina.net]
对于那些使用 Chrome 浏览器的 Android 用户来说,最近的版本更新带来了很多实用的新功能和性能优化。在 Chrome v59.0.3071.92 版本中,由于对 V8 JavaScript 引擎进行升级使网页加载速度变得更快。Google 官方表示相比较此前版本,页面加载速度提升20%。而且升级后的 V8 引擎变得更具效率,内存占用率更低。 今年 4 月份,Google 就曾表示研发方面的重大进步,会让 JavaScript 页面加载速度得到明显提升。在最新的 Chrome 59 版本中还支持动画 PNG 格式,也就是 APNG。尽管这种格式和 GIF 非常相似,但具备更高的质量,支持 24-bit 图像和 8-bit 透明度。 https://static.oschina.net/uploads/space/2017/0609/085129_2uUx_2720166.png" > 上图为 APNG 格式在新版本中还引入了全新的 Image Capture API,能够对设备相机提供更多的控制。全新的 API 不仅能够让页面更方便的调动相机,而且能够检测和切换可用的相机,并使用闪光灯、缩放和对焦等等。而最佳的部分是,通过该 API 拍摄的照片是全分辨率的,此前提供的多种截图方式都是低质量的。 https://static.oschina.net/uploads/space/2017/0609/084852_64ng_2720166.jpg" > https://static.oschina.net/uploads/space/2017/0609/084852_7KJX_2720166.jpg" > 下载来自:cnBeta.COM 章转载自 开源中国社区 [http://www.oschina.net]
YurunHttp V1.3.3正式发布了,YurunHttp是一个基于PHP cURL的开源HTTP类库,支持链式操作,省去繁杂的cURL使用方法。 更新内容如下: composer新增支持composer 本项目可以使用composer安装,遵循psr-4自动加载规则,在你的 composer.json 中加入下面的内容 { "require": { "yurunsoft/yurun-http": "dev-master" } } 然后执行 composer install 安装。 之后你便可以使用 include "vendor/autoload.php"; 来自动加载类。(ps:不要忘了namespace) 特殊环境支持新增临时目录设置新增支持自定义实现重定向 章转载自 开源中国社区 [http://www.oschina.net]
Spring Data Commons 1.13.4 发布了。Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问计数,包括非关系数据库、Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。Commons 是 Spring Data 的一部分,用来提供共享的基础框架,适合各个子项目使用,支持跨数据库持久化。 更新内容: Bug [DATACMNS-1066] - AccessControlException from ClassGeneratingPropertyAccessorFactory [DATACMNS-1067] - EventPublishingRepositoryProxyPostProcessor tries to call clearing method on plain method argument [DATACMNS-1082] - Synthetic constructors should not be considered persistence constructors Improvement [DATACMNS-1074] - Avoid hidden exceptions from Lookup.unreflectSpecial(…) in default method invocations Task [DATACMNS-1047] - Release 1.13.4 (Ingalls SR4) [DATACMNS-1062] - Make sure Travis builds always use fresh dependencies [DATACMNS-1065] - Add support for Vavr (successor of Javaslang) 下载地址: Source code (zip) Source code (tar.gz) 章转载自 开源中国社区 [http://www.oschina.net]
今天,谷歌为参与 Android Beta 的用户推送了全新的 Android O 系统,也就是第三个开发者预览版。 https://static.oschina.net/uploads/space/2017/0609/100547_UdKq_2720166.jpg" > 系统标签是 OPP3.170518.006,支持 Nexus 5X, Nexus 6P, Pixel, Pixel XL, Pixel C 以及 Nexus Player 等在内的设备,目前,工厂镜像也已经可以下载。 同时,毫无悬念的,已经升级的设备中,系统版本号也正式确定为 Android 8.0(此前 IDE 工具曾暗示其版本号可能是 7+)。虽然 Android O 的版本号已确定,但正式名称依然没有公布(奥利奥?)。 https://static.oschina.net/uploads/space/2017/0609/100700_Gu3L_2720166.png" > 按照谷歌目前公布的特性,安卓 8.0 的 APP 启动速度快了 2 倍,同时对后台管理进行了深度优化,续航长效提升。那么问题来了,有多少人已经用上 7.0 了呢? 附:Android O DP3 镜像链接 章转载自 开源中国社区 [http://www.oschina.net]
https://yqfile.alicdn.com/b8b2364edfa83b7dcdcecf76378bbda260e1a674.png " > 准备迎接更加直观的 WordPress !WordPress 开发团队刚刚发布了 WordPress 4.8 正式版,现在已经可以下载了。该版本以爵士乐钢琴家和作曲家 William John “Bill” Evans 的名字命名。WordPress 4.8 的新功能,将给你提供更多的方式,让你来在网上表达自我和展现品牌。 虽然 WordPress 4.8 都是一些小的改进,但这些改进都是用户们所关注的,由数以百计的开发者共同完成的。现在,我们来一起看看这些关注已久的新功能:链接功能改进;三个媒体挂件(小工具)包括:图片、音频、和视频;文本挂件(小工具)增加了可视化编辑功能;管理后台增加了新模块,显示附近即将举行的 WordPress 活动。 令人激动的挂件更新 图片挂件(小工具) 往挂件里添加图片,现在可以说是非常简单了,WordPress 用户无需了解代码知识。只要挂件的正确设置插入图片就可以了。试试添加一张你的头像,或者最新照片,一切都像自动的一样。 视频挂件(小工具) 一个受欢迎的视频,是最棒的宣传网站途径之一。通过这个新的视频挂件,你可以把媒体库里的视频文件轻松添加到视频挂件中。给你的网站访客做个欢迎短片,向访问者们介绍你的网站,或者宣传你最新的促销活动。 音频挂件(小工具) 如果你想成为一个播客、音乐人、或者博客网红,那使用音频文件无疑是最合适的了。上传你的音频文件到媒体库,然后在挂件设置里,选择你的文件,然后准备好播放给你的听众。同时,音频文件也非常适合播放网站的语音欢迎信息。 富文本挂件(小工具) 这绝对是一个极大且实用的功能改进!文本挂件现在拥有了富文本编辑能力。你可以在挂件中快速添加各种格式的文本内容:列表,字体加粗,迅速添加链接等。文本挂件的功能更加强大,使用也更加简单了。 链接边界 你在编辑链接和更新链接的时候,是否有过不方便,很难正确编辑的时候呢?比如想要更新链接的文字,却发现文字在链接之外。 链接边界功能主要就是解决这个问题。当你的鼠标光标进入链接区之后,将自动进入链接编辑模式,再进行任何修改,都是在修改锚文本。当光标离开链接范围之后,自动退出链接编辑模式。 细微之处的改进,却非常实用哦。 附近的 WordPress 活动 WordPress 社区非常活跃,在全球 400 多个城市举办过线下活动。WordPress 现在将这些活动的信息显示在 WordPress 的管理后台,吸引用户关注和参与这些活动,提升你的 WordPress 使用技术,结交好友等! 这是许多用户所喜爱的一个新功能。我们国内的 WordPress 用户,也曾经在 2008 和 2009 年在北京、上海举办过 WordCamp 线下活动。 下载地址 来源:WPChina 作者:WordPress中文网 章转载自 开源中国社区 [http://www.oschina.net]
赏色 是一款 Windows 下使用的屏幕取色软件,运行在 .net framework 4.0 上。 在向360反馈过后,现在的版本已经不再被360误报为病毒了~! 问题修复 修复复制颜色的快捷键功能反了的问题 修复按下 Ctrl Alt Del 键会出现“句柄无效”的问题 新增功能 添加复制策略,控制是否仅复制颜色值的功能 功能优化 优化反色算法,让反色看起来更清晰 优化预览算法,当预览窗口改变大小时,缩放倍数非线性变化,窗口越大,像素点放大倍数也就越大 章转载自 开源中国社区 [http://www.oschina.net]
微软的 Azure 平台今年得到了源源不断的更新,最近的一次更新提供了在遇到灾难的情况下能恢复 IaaS VM 的能力。今天 Azure 又带来了新的功能增强,现已支持基于 OpenBSD 的磁盘镜像和网络应用。Azure 在其今天更新的官方博客中提到,Azure 的开源高级主管 Kylie Liang 表示通过和安全供应商 Esdenera 的合作,微软的云平台现已支持 OpenBSD 6.1 系统。 OpenBSD 是一款开源的操作系统,被很多安全专家认为是最安全的类 UNIX 操作系统。该系统的运作方式及其不间断且全面的源代码审核使得其被广泛应用于创建防火墙,OpenBSD 还适用于构建分布式环境中的隐私网络服务。 如果希望使用这个新功能,微软已经提供了有关制作 OpenBSD 磁盘镜像的文档,可将其转换为虚拟硬盘驱动器 (VHD),并用于在 Azure 上创建虚拟机。 章转载自 开源中国社区 [http://www.oschina.net]
LucenePlus 1.2 发布了,这是一款基于 Lucene 的全文搜索框架。 更新如下: 优化代码结构、更加易用简洁 增加字段支持 float,binary,double,text 自定义 query 查询 排序重新定义 增加 LucenePlus 数据源、更清晰明了、随意切换 文章转载自 开源中国社区 [http://www.oschina.net]
Apache Lucene 6.6.0 发布了,值得关注的更新是: 添加一个并发的 SortedSet facets 实现 还包括许多 Bug 修复、改进、优化和其他的更新,详情点此参阅。 下载地址 Lucene 是 Apache 软件基金会的一个开放源代码的全文检索引擎工具包,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 文章转载自 开源中国社区 [http://www.oschina.net]
Sequelize 4.0.0 发布了,Sequelize.js 提供对 MySQL,MariaDB,SQLite 和PostgreSQL 数据库的简单访问,通过映射数据库条目到对象,或者对象到数据库条目。简而言之,就是 ORM(Object-Relational-Mapper)。Sequelize.js 完全是使用 JavaScript 编写,适用于 Node.js 的环境。 v4 版本包含大量 bug 修复和更新,部分内容如下: [ADDED] Add isSoftDeleted helper method to model instance #7408 [FIXED] Map isolation level strings to tedious isolation level [MSSQL] #7296 [ADDED] addConstraint, removeConstraint, showConstraint #7108 [FIXED] changeColumn generates incorrect query with ENUM type #7455 [ADDED] options.alter to sequelize.sync() to alter existing tables.#537 完整更新内容 下载地址: Source code (zip) Source code (tar.gz) 文章转载自 开源中国社区 [http://www.oschina.net]
Jetty 9.2.22 发布了。Jetty 是一个开源的 servlet 容器,它为基于 Java 的 web 内容,例如 JSP 和 servlet 提供运行环境。Jetty 是使用 Java 语言编写的,它的 API 以一组 JAR 包的形式发布。开发人员可以将 Jetty 容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的 Java 应用提供网络和 web 连接。 更新内容: Â+ 920 no main manifest attribute, in jetty-runner 9.2.19.v20160908.jar Â+ 1108 Please improve logging in SslContextFactory when there are no approvedÂcipher suites Â+ 1357 RolloverFileOutputStream: No rollout performed at midnight Â+ 1469 IllegalStateException in RolloverFileOutputStream Â+ 1507 Negative delay Timer.schedule exception due to mismatched local andÂ_logTimeZone values Â+ 1532 RolloverFileOutputStream can't handle multiple instances Â+ 1523 Update ALPN support for Java 8u131 Â+ 1556 A timing channel in Password.java Â+ 1590 RolloverFileOutputStream not functioning in Jetty 文章转载自 开源中国社区 [http://www.oschina.net]
Spring Cloud Pipelines 1.0.0.M5 发布了。 研发自动化一直是大公司才具备的能力,Spring Cloud Pipelines 模块实现了一个基于 spring cloud 架构的研发自动化流程,试图解决以下问题: 创建公共部署管道 传播良好的测试和部署实践 加快将功能部署到生产所需的时间 运行、配置和部署应用的常见方式,降低新开发人员在更改项目时融入的成本和时间 1.0.0.M5 新添加了一个名为 API 兼容性检查的新步骤。更多特性请看 Spring Cloud Pipelines Docs。 https://static.oschina.net/uploads/space/2017/0608/071701_MqSd_2903254.png" > 下载地址: Source code (zip) Source code (tar.gz) 文章转载自 开源中国社区 [http://www.oschina.net]
谷歌 AlphaGo 与柯洁的对弈给人类带来的恐惧还没有消散,这边国产的机器人又在高考试题上大显神威。 6月7日下午,一台名为 Al-Maths 的人工智能机器人在数学考试结束之后开始挑战了2017高考数学卷。“AT-MATHS” 单独在一个关闭外部网络的房间内,整个答题过程中,机器人不联网、不连接题库、无人工参与,全由机器人独立完成解答。 结果,这台机器人在22分钟内完成了一张北京文科数学考卷。根据来自成都的三位数学老师的阅卷,考卷得分为105分,满分是150分。对这台机器人来说,解答一道题目的时间最快不到一秒。 Al-Maths 是由成都某科技有限公司研发的一款以自动解题技术为核心的人工智能系统,诞生于2014年,据介绍其目标是能在2020年考上北大、清华。挑战完北京高考数学题之后,其还将挑战2017全国二卷等多套试题。 文章转载自 开源中国社区 [http://www.oschina.net]
Zulip 1.6 发布了。Zulip 是一个强大的开源群组聊天软件。 用 Python 编写,使用 Django 框架,支持通过会话流的私人消息和群聊。 Zulip 还支持快速搜索、拖放文件上传、图像预览、组私人消息、可听通知、错过电子邮件消息提醒,桌面应用等等。 更新内容: 已注销页面的完整视觉重新设计,包括登录,注册,集成等。 新的视觉设计为众多的 UI 元素,包括表情符号选择器,用户配置文件的边框,侧边栏,组合等等。 Zulip 设置界面的完整重新设计看起来更优美,更容易浏览。 完整更新内容 下载地址: zulip-server-1.6.0.tar.gz Source code (zip) Source code (tar.gz) 文章转载自 开源中国社区 [http://www.oschina.net]
年纪大了过了能熬夜看 WWDC 的时代了,但是还是在小小宝的哭闹和妈妈大人换尿布的催促中起了个大早。于是算趁着“热乎”把 WWDC 2017 的 Keynote 看完了。和往年差不多,虽然 WWDC 是一个开发者会议,但是 Keynote 并不是专门针对我们开发者的,它还承担了公司状况说明,新品发布等功能。作为技术人员,可能接下来的 session 会更有意义。要用一句话来评价今年 Keynote 所展现出来的内容的话,就是小步革新。大的技术方面可以说只有 ARKit 可堪研究,但是我们还是看到了类似跨 app 拖拽,新的 Files 应用这样进一步突破 iOS 原有桎梏的更新 (iMessage 转账什么的就不提了,我大天朝威武,移动支付领域领先世界至少三年)。iOS 11,特别是配合新的硬件,相信会给用户带来不错的体验。 作为 iOS 开发者,和往年一样,我整理了一下在可能需要关注的地方。 新增框架 新加入 SDK 的大的框架有两个,分别是负责简化和集成机器学习的 Core ML 和用来创建增强现实 (AR) 应用的 ARKit。 Core ML 自从 AlphaGo 出现以来,深度学习毫无疑问成了行业热点。而 Google 也在去年就转变 Mobile-first 到 AI-first 的战略。可以说一线的互联网企业几乎都在押宝 AI,目前看来机器学习,特别是深度学习是最有希望的一条道路。 如果你不是很熟悉机器学习的话,我想我可以在这里“僭越”地做一些简介。你可以先把机器学习的模型看作一个黑盒函数,你给定一些输入 (可能是一段文字,或者一张图片),这个函数会给出特定的输出 (比如这段文字中的人名地名,或者图片中出现的商店名牌等)。一开始这个模型可能非常粗糙,完全不能给出正确的结果,但是你可以使用大量已有的数据和正确的结果,来对模型进行训练,甚至改进。在所使用的模型足够优化,以及训练量足够大的情况下,这个黑盒模型将不仅对训练数据有较高的准确率,也往往能对未知的实际输入给出正确的返回。这样的模型就是一个训练好的可以实际使用的模型。 对机器学习模型的训练是一项很重的工作,Core ML 所扮演的角色更多的是将已经训练好的模型转换为 iOS 可以理解的形式,并且将新的数据“喂给”模型,获取输出。抽象问题和创建模型虽然并不难,但是对模型的改进和训练可以说是值得研究一辈子的事情,这篇文章的读者可能也不太会对此感冒。好在 Apple 提供了一系列的工具用来将各类机器学习模型转换为 Core ML 可以理解的形式。籍此,你就可以轻松地在你的 iOS app 里使用前人训练出的模型。这在以前可能会需要你自己去寻找模型,然后写一些 C++ 的代码来跨平台调用,而且难以利用 iOS 设备的 GPU 性能和 Metal (除非你自己写一些 shader 来进行矩阵运算)。Core ML 将使用模型的门槛降低了很多。 Core ML 在背后驱动了 iOS 的视觉识别的 Vision 框架和 Foundation 中的语义分析相关 API。普通开发者可以从这些高层的 API 中直接获益,比如人脸图片或者文字识别等。这部分内容在以前版本的 SDK 中也存在,不过在 iOS 11 SDK 中它们被集中到了新的框架中,并将一些更具体和底层的控制开放出来。比如你可以使用 Vision 中的高层接口,但是同时指定底层所使用的模型。这给 iOS 的计算机视觉带来了新的可能。 Google 或者 Samsung 在 Android AI 上的努力,大多是在自带的应用中集成服务。相比起来,Apple 基于对自己生态和硬件的控制,将更多的选择权交给了第三方开发者。 ARKit Keynote 上的 AR 的演示可以说是唯一的亮点了。iOS SDK 11 中 Apple 给开发者,特别是 AR 相关的开发者带来了一个很棒的礼物,那就是 ARKit。AR 可以说并非什么新技术,像是 Pokémon Go 这样的游戏也验证了 AR 在游戏上的潜力。不过除了 IP 和新鲜感之外,个人认为 Pokémon Go 并没有资格代表 AR 技术的潜力。现场的演示像我们展示了一种可能,粗略看来,ARKit 利用单镜头和陀螺仪,在对平面的识别和虚拟物体的稳定上做得相当出色。几乎可以肯定,那么不做最早,只做最好的 Apple 似乎在这一刻回到了舞台上 ARKit 极大降低了普通开发者玩 AR 的门槛,也是 Apple 现阶段用来抗衡 VR 的选项。可以畅想一下更多类似 Pokémon Go 的 AR 游戏 (结合实境的虚拟宠物什么的大概是最容易想到的) 能在 ARKit 和 SceneKit 的帮助下面世,甚至在 iPad Pro 现有技能上做像是 AR 电影这样能全方位展示的多媒体可能也不再是单纯的梦想。 而与之相应的,是一套并不很复杂的 API。涉及的 View 几乎是作为 SceneKit 的延伸,再加上在真实世界的定为也已经由系统帮助处理,开发者需要做的大抵就是将虚拟物体放在屏幕的合适位置,并让物体之间互动。而利用 Core ML 来对相机内的实际物体进行识别和交互,可以说也让各类特效的相机或者摄影 app 充满了想像空间。 Xcode 编辑器和编译器 速度就是生命,而开发者的生命都浪费在了等待编译上。Swift 自问世以来就备受好评,但是缓慢的编译速度,时有时无的语法提示,无法进行重构等工具链上的欠缺成为了最重要的黑点。Xcode 9 中编辑器进行了重写,支持了对 Swift 代码的重构 (虽然还很基础),将 VCS 提到了更重要的位置,并添加了 GitHub 集成,可以进行同局域网的无线部署和调试。 新的编译系统是使用 Swift 重写的,在进行了一些对比以后,编译速度确实有了不小的提升。虽然不知道是不是由于换成了 Swift 4,不过正在做的公司项目的总编译时间从原来的三分半缩短到了两分钟半左右,可以说相当明显了。Xcode 9 中的索引系统也使用了新的引擎,据称在大型项目中搜索最高可以达到 50 倍的速度。不过可能由于笔者所参加的项目不够大,这一点体会不太明显。项目里的 Swift 代码依然面临失色的情况。这可能是索引系统和编译系统没有能很好协同造成的,毕竟还是 beta 版本的软件,也许应该多给 Xcode 团队一些时间 (虽然可能到最后也就这样了)。 由于 Swift 4 编译器也提供了 Swift 3 的兼容 (在 Build Setting 中设置 Swift 版本即可),所以如果没有什么意外的话,我可能会在之后的日常开发中使用 Xcode 9 beta,然后在打包和发布时再切回 Xcode 8 了。毕竟每次完整编译节省一分半钟的时间,还是一件很诱人的事情。 这次的 beta 版本质量出人意料地好,也许是因为这一两年来都是小幅革新式的改良,让 Apple 的软件团队有相对充足的时间进行开发的结果?总之,Xcode 9 beta 现在已经能很好地工作了。 Named Color 这是个人很喜欢的一个变化。现在你可以在 xcassets 里添加颜色,然后在代码或者 IB 中引用这个颜色了。大概是这样的: https://static.oschina.net/uploads/space/2017/0607/201006_Mjx9_2896879.png" > 像是使用 IB 来构建 UI 的时候,一个很头疼的事情就是设计师表示我们要不换个主题色。你很可能需要到处寻找这个颜色进行替换。但是现在你只需要在 xcassets 里改一下,就能反应到 IB 中的所有地方了。其他值得注意的变更 剩下的都是些小变化了,简单浏览了下,把我觉得值得一提的列举出来,并附上参考的链接。 拖拽 - 很标准的一套 iOS API,不出意外地,iOS 系统帮助我们处理了绝大部分工作,开发者几乎只需要处理结果。UITextView 和 UITextField 原生支持拖拽,UICollectionView 和 UITableView 的拖拽有一系列专用的 delegate 来表明拖拽的发生和结束。而你也可以对任意 UIView 子类定义拖拽行为。和 mac 上的拖拽不同,iOS 的拖拽充分尊重了多点触控的屏幕,所以可能你需要对一次多个的拖拽行为做些特别处理。 FileProvider 和 FileProviderUI - 提供一套类似 Files app 的界面,让你可以获取用户设备上或者云端的文件。相信会成为以后文档相关类 app 的标配。 不再支持 32 位 app - 虽然在 beta 1 中依然可以运行 32 位 app,但是 Apple 明确指出了将在后续的 iOS 11 beta 中取消支持。所以如果你想让自己的程序运行在 iOS 11 的设备上,进行 64 位的重新编译是必须步骤。 DeviceCheck - 每天要用广告 ID 追踪用户的开发者现在有了更好地选择 (当然前提是用来做正经事儿)。DeviceCheck 允许你通过你的服务器与 Apple 服务器通讯,并为单个设备设置两个 bit 的数据。简单说,你在设备上用 DeviceCheck API 生成一个 token,然后将这个 token 发给自己的服务器,再由自己的服务器与 Apple 的 API 进行通讯,来更新或者查询该设备的值。这两个 bit 的数据用来追踪用户比如是否已经领取奖励这类信息。 PDFKit - 这是一个在 macOS 上已经长期存在的框架,但却在 iOS 上姗姗来迟。你可以使用这个框架显示和操作 pdf 文件。 IdentityLookup - 可以自己开发一个 app extension 来拦截系统 SMS 和 MMS 的信息。系统的信息 app 在接到未知的人的短信时,会询问所有开启的过滤扩展,如果扩展表示该消息应当被拦截,那么这则信息将不会传递给你。扩展有机会访问到事先指定的 server 来进行判断 (所以说你可以光明正大地获取用户短信内容了,不过当然考虑到隐私,这些访问都是匿名加密的,Apple 也禁止这类扩展在 container 里进行写入)。 Core NFC - 在 iPhone 7 和 iPhone 7 Plus 上提供基础的近场通讯读取功能。看起来很 promising,只要你有合适的 NFC 标签,手机就可以进行读取。但是考虑到无法后台常驻,实用性就打了折扣。不过笔者不是很熟这块,也许能有更合适的场景也未可知。 Auto Fill - 从 iCloud Keychain 中获取密码,然后自动填充的功能现在开放给第三方开发者了。UITextInputTraits 的 textContentType 中添加了 username 和 password,对适合的 text view 或者 text field 的 content type 进行配置,就可以在要求输入用户名密码时获取键盘上方的自动填充,帮助用户快速登录。 暂时先这么多,我之后如果发现什么有意思的事情再逐渐补充。如果你觉得还有什么值得一提的变化,也欢迎在评论里留言,我也会添加进去。 文章转载自 开源中国社区 [http://www.oschina.net]
苹果已经在使用 iOS 11 的 iOS 设备上结束 32 位应用,不久之后,该公司将在其 macOS 操作系统上进行相同的调整。 苹果在其全球开发者大会上表态,MacOS High Sierra 将是“最后一个支持 32 位应用的 macOS ”。 从 2018 年 1 月起,提交给 Mac App Store 的所有新应用必须是 64 位,到 2018 年 6 月之后,所有的应用和更新都必须为 64 位。在 High Sierra 之后的 macOS 版本 “积极”地警告用户不要继续使用 32 位应用。iOS 11 无法安装或启动 32 位应用了,尝试打开不支持的 32 位应用程序会弹出消息,通知用户需更新应用程序才能在 iOS 11 上运行。 文章转载自 开源中国社区 [http://www.oschina.net]
据 SoftPedia 报道,在最新发布的 Ubuntu 17.10 每日构建版中,Unity 桌面环境已消失,GNOME 已经正式成为即将推出的Ubuntu 17.10(Artful Aardvark)版本的默认桌面环境。 据悉,Ubuntu 17.10 将在 9 月 28 日发布 Final Beta 版本,这时候才会基本确定下来所有的内容,10 月 19 日 Ubuntu 17.10(Artful Aardvark)将正式发布。 https://static.oschina.net/uploads/space/2017/0607/113346_ttP5_2896879.png" > https://static.oschina.net/uploads/space/2017/0607/113446_piUp_2896879.png" > https://static.oschina.net/uploads/space/2017/0607/113458_TE59_2896879.png" > 文章转载自 开源中国社区 [http://www.oschina.net]
UCKeFu v2.4.0 发布,UCKeFu 基于 JAVA 语言开发,是一个全渠道融合的客户支持服务平台,聚合企业内部多个客服渠道,帮助各种行业各种规模的企业建立完整客服体系。 通过将邮件、短信、电话语音、WebIM 在线客服、微信、微博、H5 页面、APP 接口等多个渠道来源的客户服务请求与对话汇聚在一个管理平台,用统一的方式来响应和支撑客户服务。 http://git.oschina.net/uploads/images/2017/0315/075025_c1add38b_1200081.png" > 2.4.0 版本工单模块升级了新节目 https://static.oschina.net/uploads/space/2017/0606/082628_wK4D_3233864.png" > 文章转载自 开源中国社区 [http://www.oschina.net]
本次版本更新主要针对YMP框架的易用、稳定、安全性等方面的性能优化及BUG修复。 更多相关模块工程也会陆续更新,更多模块请参看:YMP v2.0 模块项目集中发布!第一波! 新版本已提交至Maven中央库,可以通过以下配置获取各模块依赖: <dependency> <groupId>net.ymate.platform</groupId> <artifactId>ymate-platform-<MODULE_NAME></artifactId> <version>2.0.1</version> </dependency> 请将替换为具体模块名,模块详见: The Central Repository Search Engine更新记录: 核心 (Core) 优化类扫描逻辑被声明@Ignored注解的类将被自动扫描程序忽略; 优化BeanWrapper为其新增类属性过滤器接口及相关方法; 优化获取类方法参数名称集合的逻辑及相关代码,若找不到或Missing时不会抛出异常而是返回元素数量为0的空数组; 增加拦截器全局规则设置,调整拦截器可以不用修改代码; 为BlurObject对象添加对Clob和Blob数据类型的支持; Fastjson存在高危安全漏洞,已更新升级至1.2.28; 调整Events事件触发模式由事件监听者在订阅事件时决定; 重新调整代理类的执行顺序Order参数值并改成注释为数值小的最先执行; 优化Base64方法调用; 配置体系 (Configuration) 修正尝试通过运行时变量或系统变量获取CONFIG_HOME参数的处理逻辑; 持久化 (JDBC) 优化数据库连接失败会导致服务启动不成功的问题增加尝试重新初始化逻辑; 实体代码生成器新增允许在指定字段上配置是否使用@Readonly注解声明; 优化BaseEntity实体基类增添find、findFirst和findAll方法重载; 数据实体生成器新增实体及属性命名过滤器接口, 允许为那些老旧数据库(命名不规范或有中文字段名等情况)自定义实体和字段名称; 优化使其基础数据实体类内部对象在进行JSON序列化时将不被输出; 优化实体基类的delete方法返回值逻辑; 修正数据实体结果集处理器由于Oracle数据查询时返回的字段名是大写字符导致实体对象无法正确赋值的问题; 优化JDBC操作器的异常日志输出以减少重复; 为SQL类对象增加直接转换的toSQL方法,同时优化field方法降低字段前缀操作频次; 修正ResultSet资源未关闭并移除无用的局部变量; 修正类构造方法中未对参数进行赋值; Web框架 (WebMVC) 优化请求编码处理逻辑; 优化JSON视图对象可以设置属性使用引号的开关方法; 优化当加载本地语言参数值无效或解析错误时可能会导致异常的情况; 调整将Cookie数据加解密返回的字节数组强制转为Base64编码; 优化JsonView对象支持设置是否保留空值属性; 防止WebMVC未成功初始化时导致的事件源对象为空的异常情况发生; 优化WebMVC请求处理过程的日志输出; 优化控制器请求解析器更完美支持RESTFul风格,可以通过参数request_mapping_parser_class=restful开启配置; 优化CookieHelper的使用并调整其对value的加解密逻辑以及统一Base64方法的调用; 验证 (Validation) 调整邮件地址验证器正则表达式使其支持后缀长度超过3位的域名; 缓存 (Cache) 初步实现缓存锁相关逻辑; 日志 (Log) 优化框架销毁时的日志输出可能产生空指针异常的情况; 日志相关模块代码逻辑优化使其更好的将commons-logging和slf4j等日志系统与log4j进行融合; One More Thing YMP是一个非常简单、易用的轻量级Java应用开发框架,涵盖AOP、IoC、WebMVC、ORM、Validation、Plugin、Serv、Cache等特性,让开发工作像搭积木一样轻松是我们一直不懈努力的目标! YMP不仅提供便捷的Web及其它Java项目的快速开发体验,也将不断提供更多丰富的项目实践经验。 文章转载自 开源中国社区 [http://www.oschina.net]
MinDoc 是一款针对IT团队开发的简单好用的文档管理系统。 MinDoc 的前身是 SmartWiki 文档系统。SmartWiki 是基于 PHP 框架 laravel 开发的一款文档管理系统。因 PHP 的部署对普通用户来说太复杂,所以改用 Golang 开发。可以方便用户部署和实用。 开发缘起是公司IT部门需要一款简单实用的项目接口文档管理和分享的系统。其功能和界面源于 kancloud 。 可以用来储存日常接口文档,数据库字典,手册说明等文档。内置项目管理,用户管理,权限管理等功能,能够满足大部分中小团队的文档管理需求。 v0.4 更新日志 修复 在sqlite数据库下项目成员切换权限错误的BUG #58 修复 项目内容搜索无法查看的BUG 修复 上传项目封面图片剪切后大小不变的BUG 修复 使用sqlite初始化数据库是数据库目录无法自动创建的BUG #56 修复 Markdown返回按钮异常 #63 新增 以服务的方式启动 详见 MinDoc 命令 新增 文档内上传的图片实现CDN,该功能需要在 conf/app.conf 中配置 cdnimg 节点 新增 自定义配置文件路径和静态文件路径,#59 详见 MinDoc 命令 更新方法: 下载后,覆盖即可;强烈建议升级钱备份数据库和文件。 如果不是从 v0.3 版本升级,请覆盖后执行以下命令: windows => godoc_windows_amd64.exe install godoc_windows_amd64.exe migrate linux => ./godoc_linux_amd64 install ./godoc_linux_amd64 migrate 如果看到 update successed. 表示升级成功。 文章转载自 开源中国社区 [http://www.oschina.net]
继昨天发布新版之后,今天我们如约爽分奉上该版本源码,敬请各位OSCer笑纳! 获取开源中国客户端 Android 版源码,请访问码云:http://git.oschina.net/oschina/android-app 新版本的核心代码主要集中在 net.oschina.app.improve 包中,欢迎各位OSCer阅读、点评、交流。 此外,对于托管在码云上的客户端源码,需要说明以下几点: 需要说明的几点: 仓库的master分支中,并不保留任何代码 最新的代码总是会在其版本号对应的tag或branch中(如:v2.8.6) 将代码放到分支(或标签)中有什么好坏,请大家自行补脑 大家都知道,开源中国秉承自由、开放、分享的精神,每次客户端升级之后代码都会在第一时间开源,以供大家查阅、学习、批评、指正。所以,遇到有问题或更好的建议时,请大家通过码云issue来向我们反馈。 当然,码云开源项目捐赠功能全面上线很久了,客户端小组童鞋更希望广大OSCer们能够请大家喝杯咖啡。通过更实际的方式支持我们,我们会非常非常非常高兴的。 衷心希望各位能够一如既往的支持我们。你们的支持,是我们不断进步的源泉。谢谢你们! 文章转载自 开源中国社区 [http://www.oschina.net]
EC+(ecjia)到家是一款可开展新零售业务的移动电商系统。它包含:移动端APP,采用原生模式开发,覆盖使用iOS及Android系统的移 动终端;后台系统,针对平台日常运营维护的平台后台,针对入驻店铺管理的商家后台,独立并行;移动端H5,能够灵活部署于微信及其他APP、网页等。 v1.5.2更新动态 优化订单状态增加“配货”、“发货” “订单状态中增加“配货”、“发货”信息。“订单提交成功”-“待付款”-“已付款”-“等待商家接单”-“配货中”-“已发货”-“配送员已取货”-“已确认收货”-“订单已完成”,完整的订单状态,高效的订单管理。 修复商家后台订单状态 “ 商家后台增加“收货确认”操作记录。买家“确认收货”,商家后台订单状态自动更新,操作记录完整,便于订单查询。 修复登录接口逻辑判断 “登录密码错填或不填时,登录提示为空,本次升级修复此登录接口逻辑,友好的提示提升产品体验,细节决定成败。 更新日志 【优化】平台后台订单管理员操作日志记录 【优化】帮助信息读取接口 【优化】微信公众号绑定机制 【优化】微信登录兼容 【优化】所有微信插件绑定账号兼容性 【优化】兼容微信公众号会员绑定插件 【优化】订单状态,新增“配货”“发货”信息 【修复】微信用户同步 【修复】登录接口逻辑判断 【修复】商家后台订单状态缺少收货一栏操作记录 【修复】点击“再次购买”,再次购买转跳的页面空白 文章转载自 开源中国社区 [http://www.oschina.net]
1.2.2 2017-06-06 calvin 封装更多的IO多路复用代码进tcpdaemon,使用者用tcpmain返回值设置等待事件 IO多路复用模型新增超时机制 1.概述tcpdaemon是一个TCP通讯服务端平台/库,它封装了众多常见服务端进程/线程管理和TCP连接管理模型(Forking、Leader-Follow、IO-Multiplex、WindowsThreads Leader-Follow),使用者只需加入TCP通讯数据收发和应用逻辑代码就能快速构建出完整的TCP应用服务器。 ... 2.使用示例2.1.服务模型Forking,链接模式1,接收HTTP请求报文然后发送HTTP响应报文 使用者只需编写一个函数tcpmain,实现同步的接收HTTP请求报文然后发送HTTP响应报文回去 $ vi test_callback_http_echo.c #include "tcpdaemon.h" _WINDLL_FUNC int tcpmain( struct TcpdaemonServerEnvirment *p_env , int sock , void *p_addr ) { char http_buffer[ 4096 + 1 ] ; long http_len ; long len ; /* 接收HTTP请求 */ memset( http_buffer , 0x00 , sizeof(http_buffer) ); http_len = 0 ; while( sizeof(http_buffer)-1 - http_len > 0 ) { len = RECV( sock , http_buffer + http_len , sizeof(http_buffer)-1 - http_len , 0 ) ; if( len == 0 ) return TCPMAIN_RETURN_CLOSE; if( len == -1 ) return TCPMAIN_RETURN_ERROR; if( strstr( http_buffer , "\r\n\r\n" ) ) break; http_len += len ; } if( sizeof(http_buffer)-1 - http_len <= 0 ) { return TCPMAIN_RETURN_ERROR; } /* 发送HTTP响应 */ memset( http_buffer , 0x00 , sizeof(http_buffer) ); http_len = 0 ; http_len = sprintf( http_buffer , "HTTP/1.0 200 OK\r\nContent-length: 17\r\n\r\nHello Tcpdaemon\r\n" ) ; SEND( sock , http_buffer , http_len , 0 ); return TCPMAIN_RETURN_CLOSE; } 编译链接成test_callback_http_echo.so $ gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -I. -I/home/calvin/include/tcpdaemon -c test_callback_http_echo.c $ gcc -g -fPIC -O2 -Wall -Werror -fno-strict-aliasing -shared -o test_callback_http_echo.so test_callback_http_echo.o -L. -L/home/calvin/lib -lpthread -ldl 用tcpdaemon直接挂接即可 $ tcpdaemon -m IF -l 0:9527 -s test_callback_http_echo.so -c 10 --tcp-nodelay --logfile $HOME/log/test_callback_http_echo.log --loglevel-debug 可``` 执行程序tcpdaemon所有命令行参数可以不带参数的执行而得到 $ tcpdaemonUSAGE : tcpdaemon -m IF -l ip:port -s so_pathfilename [ -c max_process_count ] -m LF -l ip:port -s so_pathfilename -c process_count [ -n max_requests_per_process ] other options : -v [ --daemon-level ] [ --work-path work_path ] [ --work-user work_user ] 执行后可在$HOME/log下可以看到tcpdaemon的日志。 通过curl发测试请求 $ curl "http://localhost:9527/"Hello Tcpdaemon 测试成功! 所有代码在源码安装包的test目录里下可以找到 ...
collectd 5.7.2 发布了,collectd 是一个守护(daemon)进程,用来收集系统性能和提供各种存储方式来存储不同值的机制。比如以 RRD 文件形式。当系统运行和存储信息的时候,Collectd 会周期性统计系统的相关统计信息。那些信息可以用来找到当前系统性能瓶颈。 一般来说,一图胜过千言,所以这里显示了某个系统在过去60分钟内的CPU利用率图形。 部分更新内容如下: collectd: A race condition when calculating a metric's rate has been fixed. Thanks to Florian Forster. #1193 AMQP, Exec, UnixSock, Write Kafka plugins: Parsing of the Florian Forster. #2274 AMQP plugin: The ExchangeType option is now also valid for publishers. Thanks to Florian Forster. #2286 BIND plugin: Fix parsing of the sample time provided by BIND. Previously, the time was assumed to be in the local timezone when in fact it was in UTC. Thanks to Ed Ravin. #1268 文章转载自 开源中国社区 [http://www.oschina.net]
有人在 Quora 上提问,为什么谷歌不喜欢 Node.js 呢,Google 的 UX 工程师和来自 Node.js 团队的开发者分别回答了他们对这个问题的看法,对于编程语言来说,每一门语言都有它自己的优势,重要的是如何用它去解决问题。 https://static.oschina.net/uploads/space/2017/0606/171416_1wLX_2896879.png" > 谷歌 UX 工程师 Sean Grogg : 对于任何语言,谷歌对其都秉持着中立的态度,只有所谓的 Big Three(Java、Python 和 Go)例外,这些语言有着自己特别的优势,在项目中使用它们不需要进行额外的说明。 作为一家企业,谷歌对 Node.js 并没有什么偏见。我写过很多 React 代码,它们都依赖 Node ,其中一些代码甚至现在还在谷歌的 megarepo 中。 当然,可能也会有一些个人或是团队不太喜欢 Node.js 。谷歌内部的确有一些人不喜欢它,但是同时也有很多人能够看到 Node.js 的价值,尤其是 Cloud 团队。 Node.js 是目前 Cloud Functions 唯一支持的语言 它也是 App Engine 灵活环境的一部分 它还是很多产品的客户端 library(Compute Engine,、Cloud Storage 以及 Datastore 等) Node.js 团队 Andreas Madsen: 谷歌的 V8 团队与 Node.js 团队有着紧密的合作。在最近的 Node.js 8 中,我们对之后的 V8 保证了 ABI 兼容性。如果没有两个团队间的紧密合作,我们无法做到这一点。 Node.js 还在和 V8 团队一起开发 PromiseHook API ,它允许开发者使用 C++ 检测所有 promise 。它让我们可以在 domain module 中加入对 promise 的支持,而且也是新的 async_hooks API 中的一个主要组件。 由此可见,说谷歌讨厌 Node.js 完全是一派胡言。 Topseptools.tech SEO 经理 Muhammad Saeed: 在使用 Node.js 的时候,你不能一次性处理多个 core ,比需要要对多个 instance 进行 spin 。更糟的是,它的 cluster API 到现在依然还只是实验性功能。 我之所以不喜欢 Node.js ,是因为在使用 headless 浏览器运行测试的时候,你智能使用一个 core 。除非你能学会如何将测试的 load 进行分配,否则在真实浏览器中运行测试的速度会更快。 调试也是个问题,如果你使用的是cluster library,它会无法正常工作。我非常希望 Node.js 能解决这个问题。 原文:Why does Google despise Node.js? Answer Request 译文:SDK.cn 编译:鲁行云 原标题:谷歌为何不喜欢 Node.js ? 文章转载自 开源中国社区 [http://www.oschina.net]
物联网的快速发展也意味着该领域总是在变化。Eclipse IoT 工作组、IEEE IoT、AGILE IoT 和 IoT 委员会在今年第一季度进行了一项“2017 物联网开发者调查”,旨在找出该领域的趋势,了解开发人员如何构建 IoT 解决方案。 该调查还公布了物联网领域编程语言的相关趋势: 调查发现这些主要编程语言之间其实存在很高的共性。 Java 和 Python 通常用于 Constrained Device、IoT 网关和 IoT 云平台。同时,C 和 C ++ 也在 Constrained Device 和网关里占有重要意义和用途,而 IoT 云平台的开发更多地是利用了 Javascript 和 Node.js 。这也表明在物联网领域其实可选的语言相对广泛,根据物联网生态系统的不同部分,语言也会有适当的倾向划分,满足客户需求的方法存在很大的差异。 https://static.oschina.net/uploads/space/2017/0606/114652_stTs_2896879.png" > 文章转载自 开源中国社区 [http://www.oschina.net]
Google 发布了最新的 Android 系统份额明细,展示了运行每个版本的 Android 的有效设备的比例。据 Google 表示,这些数据仅代表在在6月5日前访问 Google Play 商店的设备(所以没有计算国内的数据),不包括 AOSP 设备。 https://static.oschina.net/uploads/space/2017/0606/110545_zN93_2896879.png" > 本月最大涨幅是 Android 7.0 牛轧糖,从上月的 6.6% 涨至 8.9%。 但是,虽然牛轧糖表现强劲势头,但 7.1 却很惨,发布至今已近七个月的时间,仍然只有 0.6% 的比重。Android 6.0 仅在今年4月份有出现一次回落(仅0.1),自此后就一直保持在 31.2% 的水平。 Android 5.0 的下降到了 30.8%,首次出现 6.0 比 5.0&5.1 的组合更受欢迎的情况。 Jelly Bean 和 KitKat 持续下滑,这些以前具有较大使用份额的操作系统正在老化,这也是正常现象。 编译自:neowin 文章转载自 开源中国社区 [http://www.oschina.net]
https://static.oschina.net/uploads/space/2017/0607/080821_1Na3_2903254.png" > Linux Mint 18.2“Sonya”beta 发布。本次更新对 Linux Mint 的本地和第三方应用程序该来了改进,包括 Blueberry、Xed、Xplayper、Xreader、Pix、Xviewer、更新管理器、以及软件源码配置工具。 如果你已经安装了 Linux Mint 18.1 或 18.0,那将可以通过 Update Manager 直接进行升级。不过就算你不打算将更新至 18.2,官方也将对所有旧版系统提供安全补丁,直至 2021 。 更多内容请参阅发行说明。 下载地址: Mate: 64-bit Cinnamon: 64-bit 文章转载自 开源中国社区 [http://www.oschina.net]
进行社招面试时,有一个问题几乎是必问的: 你为什么要离开上一家公司? 其实这个问题主要是想试探一下求职者的核心诉求,并借此预估一下他在本公司工作的稳定性。常见的答案也无非就是这么几种:对薪酬不满意、干得不爽,或者是想换个环境。 然而,我遇到过好几个初次跳槽的求职者给出的答案是:「在原来的公司学不到技术」。 一听到这个,我就不由得叹口气:今天这一小时又算是交代了,这人基本上没戏。 程序员最核心的竞争力——「学习力」 如果有人问我:你在面试程序员时,最看中的是什么能力?那我的答案一定是:学习力。 互联网时代的技术来得快,去得更快。就像 Flash 这样曾经雄霸天下多年的技术,都有被人人唾弃的一天。如果没有足够强的学习能力,就无法跟上变化,被淘汰只是迟早的事。想想看,你苦心钻研多年引以为傲的技术,一夜之间就没有用武之地了,难免会有一种「身体被掏空」的感觉。 学习力强的程序员敢大胆地体验尝试新技术,他们的技术栈始终在保持不断地更新。他们能快速把握事物的本质,并判断出它能用来做什么,不能用来做什么。他们拥抱技术升级和革命,因为他们学习并掌握新技术的速度比其他人更快,所以他们永远不用担心失业。事实上,他们掌握的是「驾驶」和「学习驾驶」的技术,而不是「驾驶XX牌汽车」的技术。 而学习力差的程序员呢?为了继续停留在旧技术的舒适区,他们往往会抵制新技术的推广,甚至百般阻挠。因为那会使他们过去的经验统统无效,只能和后来者站在同一起跑线上。抱死一个框架好几年,脱离了框架啥都干不了的程序员实在太多了。事实上,这样的人不能驾驭技术,反而是被技术给奴役了。 同样是自行车,为什么山地车比公路车更普及更流行?除了皮实耐用价格低外,主要是因为它的通过性好,什么泥地沙地都不在话下,上下马路牙子跟玩一样。而公路车呢?只能老老实实地跑在平路上。 公司不是学校 面对这些因为「想学点技术」而换工作的求职者,评价他们「不思进取」貌似不太合适。但显然他们的思维模式还是被学校洗脑的那一套,没能真正地融入社会。也许他们认为,学习就是要由老师手把手带着,而自己之所以学不到技术,就是因为没遇到一个好leader,能替自己设计好成长路线,指出所有重难点,提供各种参考资料…… 在中国传统文化里,不管是匠人还是武师,收徒都要找毫无根基的幼童。这一方面是为了保持师父的绝对权威,方便贯彻落实教学;另一方面是为了尽量延长学徒期,以考察徒弟的品性。拜师之后,徒弟便跟随师父一起生活,经过数年的言传身教,这才得以出师。 师父收徒的核心诉求,是「传承」自己的技艺和名声,希望徒弟日后能做出一番成就来光耀师门。这就要求徒弟流动性低、忠诚度高、归属感强。与其说是收徒,还不如说是在挑儿子,所以有句俗话叫作「一日为师,终身为父」。 然而公司是盈利性的商业组织,不是学校,更不是新手训练营。公司招聘员工的核心诉求,是生产出实实在在、对得起薪水的价值,而不是传承技艺。公司希望员工入职前就具备工作的能力,至少在经过短暂的培训和指导后就能独立开展工作,正所谓「能干就干,干不了走人」。 一般情况下,为了使新人尽快进入工作状态,公司会安排一位老员工来做一段时间的导师。但导师只有为你解惑的义务,却没有教你技术的责任。 因为导师自己手里还有做不完的工作,带新人又没什么利益可图,凭什么为你提供私人教练级的服务?能有耐心听完你的问题,指点一下方向,就已经很不错了。 学习是自己的事,没有人能替你去做。这就跟吃饭一样,谁真的关心你吃没吃、饱没饱?就算你的亲人再怎么关心你,也不能替你去吃。我们都知道,人不吃饭肯定是要饿死的,那你为什么不去给自己找吃的,却在埋怨没有人给你嘴里喂食呢? 为什么你学不到技术? 很多人在学习之路上已经饱尝了痛苦的滋味,因此在离开学校之后。他们不到万不得已,是决然不会去学习的。你不妨回顾一下,从参加工作以来到现在,自己哪段时间里学习最认真,进步最明显? 如果不出意外的话,应该就是你找到的第一份工作的试用期。因为不想失去自己通过努力争取到的工作机会,所以你不得不逼自己打起十二份精神来学习,结果居然以自己都无法想象的速度掌握了工作必备的知识和技能。 然而,大多数人在自己的能力满足当前工作的要求之后,就丧失了学习的动力。下班之后要追剧,要玩游戏,要打球,要谈恋爱……为啥我要学习?不学又不会失业!学这个有啥用?谁知道用得上用不上?等要用的时候再学呗! 其实, 学不到技术最核心的原因只有一个:动机不足。至于环境条件,只是影响学习效果的因素之一,但绝对不是最重要的因素。在一个恶劣的环境里选择放弃学习的人,不可能到了一个优越的环境里就会去主动学习,因为在他内心深处对学习是抗拒的。 难道说换上了Macbook Pro和4k显示器,坐在数千元的人体工学座椅上,下班后就会有兴趣看框架源码了吗?看电影、打游戏不是更舒服一些? 在我看来,学习力的源泉就是好奇心,也就是对新知识的渴求,以及对探索未知的冲动。我们的大脑是「用进废退」的,如果不定期给它输送新鲜的知识营养,它就会逐渐退化。有学习力的人一段时间不看书,不折腾点新玩意,大脑真的是会「饿」的。 程序员该怎么学习技术? 有的求职者觉得自己没学到技术,是因为公司不给机会,或者缺乏条件: 「上次的H5让小王做了,这次的微信小程序又给了小李……完全没我什么事啊!」「公司最大一张表才10W数据,根本用不着分库分表啊!」…… 学习技术最有效的方式是阅读、实践和交流。公司没给你安排这方面的工作,那你自己都做了些什么呢?八小时之外的时间都用在哪了?有没有读源码?有没有看原版书?有没有泡技术社区?有没有尝试最新流行的技术?有没有尝试把它们用在公司的项目上?有没有主动去接触行业里使用这些技术的团队和大牛? 「看文档」其实是最快的学习方法。对于自己工作中常用到的技术,抽时间把官方文档通读一遍(其实篇幅都不大),绝对收获满满。没事的时候多翻翻自己使用的框架/系统/平台的API,看看有哪些自己不知道或者没用过的功能,想想这个功能可以用来做什么,能不能解决现存的问题,或者优化当下的解决方案。 如果你是前端工程师,通读HTTP协议和ECMAScript标准,就能秒杀95%的同行,不开玩笑。 「读源码」是深入学习开源技术的唯一途径。只有理解了某个功能在底层是如何实现的,你才能真正把握它更适合用来做什么,不能用来做什么。正如不明显汽车的构造和原理,我们也能把车开好。而如果多少知道一点,开起来就会更得心应手。当车出现问题时,也不至于完全束手无策,只能蹲在路边等待救援。 你一个框架用了N年了,却连一行源码都没读过?如果它是你女朋友,估计早该分手了。 「折腾」是学习任何技术的必经之路。在有保护的环境下进行大量的试错,是最高效的学习方法。现在虚拟机技术已经那么成熟,VPS也很便宜,你为什么不分分钟弄一个,然后在上面花式作死呢? 听说过无数次 rm -rf / 的事故,可你居然一次都没试过?知道输出啥样子么? 公司给你提供的最有价值的东西,就是实战的机会。 你所学习的技术,最终需要通过工作来变现。你有机会接触到真实的数据,了解真实的用户,观察真实系统是怎样运转的,积累真实的经验…… 然而,所谓的机会,只属于已经提前准备好的人。 不要等到工作都安排到你身上了再去学习。公司不是你的试验田,你也不该拿用户当小白鼠。公司不给你机会,那只说明你还没有准备好。 后话 「吾生也有涯,而知也无涯 。以有涯随无涯,殆已!」*——《庄子·内篇·养生主第三》 技术世界就如同一片汪洋大海,细分领域真是多如牛毛。我们只是站在其中一个小岛上,怎么确定自己该朝哪个方向进发呢? 学习技术不外乎以下两个方向: 1、广度:整个使用链条由哪些环节构成?每个环节的作用是什么?都有哪些类似的可替代方案?它们之间有什么区别?各自优劣点是什么?…… 2、深度:这个「技术 / 产品」的本质是什么?都能做什么?运作原理是什么?底层是如何实现的?可以做怎样的改进?…… 不管你在做什么工作,都应该先把自己每天都要用的核心技术做到一定深度,再去拓展广度。 「什么都知道一点,但都不甚了解」是最可怕的,它会让你误以为自己已经很NB了。 学习,是一辈子的事。 来源:镓话 | 作者:张砷镓 (喜欢本文章可点击前往支持作者) 文章转载自 开源中国社区 [http://www.oschina.net]
随着软件行业的发展,软件人才的队伍不断壮大,但同时新老交替的速度也在不断加快,让很多技术人员开始有一种危机感。在这种大环境下,从事更高层次开发构架工作的软件架构师成为令人向往的角色。本期【开源访谈】邀请到华为 SCEF 产品软件架构师姚磊分享如何成为一名优秀的软件架构师。 【分享嘉宾】 姚磊,华为SCEF产品软件架构师,8年电信设备从业经验,进入华为以来一直从事华为EPC网络能力开放产品SCEF软件开发、设计工作,对SCEF产品架构、业务功能有深入的理解。 【访谈实录】1、请简单地介绍一下您自己(技术背景、学习经历、工作经历)。 答:大家好,我是姚磊,2010 年毕业于湖南大学。我一开始是在一家电信设备公司从事网管的工作,当时基于开源软件做了一个网络管理工具,算是一些比较简单的代码编写和模块开发工作;工作两三年之后,开始涉及一些模块的设计,可以说是一名优秀开发者了,但还算不上一个架构师;后来到了第二家公司主要做了一个协议的开发; 2014 年进入华为,刚开始的时候作为 SE 负责产品的开发,做的是开源代码的研究,就是考虑怎么把开源代码集成到我们的产品中去,后来担任的是华为的 MDE,研究平台的对接,再后来开始做一些独立性的设计。所以,从我个人来说看来,大部分时间只是在做开发的工作,真正作为一名架构师的资历还是比较浅的。 2、程序员与架构师的区别是什么? 答:程序员可能更多关注的是如何实现一个模块的功能,但做为一名架构师要有一个全局性的思维,关注的不是具体实现的细节,而是各个模块之间怎么去交互、部署,还有它们的性能、安全,以及跟 web 的交互,以及怎么去管理等等。把各个模块都部署好之后,还要把限制通讯的结果、交互的内容都清晰地定义好,考虑接口对接的时候采用什么样的协议这些层次的问题。 3、软件架构师的进阶除了日常工作上的积累,还需要哪些方面的学习? 答:作为一个架构师首先要关注技术方面的问题,但不仅仅关注于当前的产品的技术,还要关注整个行业的发展趋势,包括优秀的一些架构,比如优秀的开源技术架构等,如果你只是关注自己产品的架构的话,也许能满足当前的需要,一旦外部发生变更的时候,就可能不适用了。 除了技术方面的问题外,周边的东西或者日常生活的方方面面都要去留心观察。举个例子,我们架构部有个大拿,他在设计我们产品的一个主要架构的时候,想了很多方案都通不过,有一天他在路上看到交通管制,看交通梳理的时候灵感来了,他按照这个思路设计了一个架构之后投票一次就通过了。 4、软件架构师需要具备怎样的素质与职责 答:(1)过硬的技术。其实大部分的软件架构师都是软件出身的,所以至少是某一个技术方面的大拿,如果技术不过关的话,设计的框架的性能、安全性都会受到约束。即使是成为架构师之后写代码的机会少了,也要经常去研究一些比较优秀的代码、开源架构,还要学习别人优秀的实践经验等等。 (2)良好的沟通能力。作为一名架构师,设计好一个架构之后肯定要给别人介绍这么一个东西,告诉别人这个架构能解决别人的问题,这就需要一定的沟通能力。 (3)良好的书面表达能力。一个优秀的文档能更好地呈现你所设计的东西。现在一些比较规范的公司,写架构的时候都会要你写这个架构的模板,包括安全、性能、数据库都要有一个章节去分析。但是一些别的小公司没有那么规范,这时候就要去研究一下周边的一些大公司或者行业的标准。 5、作为 SCEF 软件的架构师,应该注重业务上的发展,还是技术上的发展? 答:因为我本身是做技术出身的,原来我的理解是技术的发展更重要。但后来发现一个问题,我们的工程师能把产品说得头头是道,但只是从工程师这个角度去给别人演示展示这个产品,当对象发生变化了,面对的不再是工程师而是客户的时候,就不能很好地用客户化的语言去描述。 所以作为一个架构工程师的话,技术是基础,业务方面的发展也很重要。程序员可以只关注自己的技术,但是作为 SE ,视野应该放宽,不能闭门造车。华为内部对职位的划分都是很详细的,在各个层级都有很专业的人才,像行销人员的业务能力就很强,我们就可以多到一线去跟行销人员和客户沟通,学习怎么用客户的语言来跟他们沟通。 6、您是如何看待“大部分码农做不了软件架构师”这一观点的? 答:从人自身的发展来看,成为架构师要比一般的开发者要付出更多的精力,但是很多码农会满足于目前的成就,不再愿意去学习提升自己,其实架构师写的文档都是可以看得到的,所以如果愿意去提升的话可以自己去学习、去实践,大部分的架构师其实都是在一步步摸索和实践中成长起来的;从行业的大环境来说,公司方面也不需要很多架构师,一个产品最多配备一两个架构师就够了,然后可能还需要个别优秀的开发者对架构师设计的模块进行理解,把这个模块进行消化,再由其他的开发人员去实现就可以了。 7、什么样的人更合适做软件架构师? 答:程序员能成为架构师,首先当然要热爱这门技术,再者我觉得应该有良好的沟通能力和表达能力,包括写文档的能力,还有视野要开阔,能主动地从生活中的点点滴滴去感悟和思考。 文章转载自 开源中国社区 [http://www.oschina.net]
项目中涉及列表显示的地方都会用到分页控件,为了能更好地与当前网站的样式匹配,这次要自己实现一个。 所以选择了模板中提供的分页样式,基于模板改造以能够动态生成: http://images2015.cnblogs.com/blog/844205/201706/844205-20170606225606043-2137817722.png" > http://images2015.cnblogs.com/blog/844205/201706/844205-20170606225609887-709741290.png" > 一 控件的行为规则a) 可设置显示几个页码(默认5个,只能是奇数) 如果当前页显示5个,则默认前后各有两个,比如当前页是5,显示页码为“3 4 5 6 7 如果当前页在最前面,比如为1,显示页码为:1 2 3 4 5 同样当前页在最后面,比如为9,显示页码为:5 6 7 8 9 如果总页数少于5,比如只有3页,则页码全部显示:1 2 3 b) 关于跳转首页(<<)、尾页(>>)、上一页(<)、下一页(>) 如果当前页是第一页,首页和上一页禁用 如果当前页是最后一页,尾页和下一页禁用 c) 当前页的样式要区别于其它页码 二 代码编写 a) 分页组件类、属性、常量 PAGE_COUNT为默认显示的页码数量,这里为了便于测试设置成了2;静态属性分别为当前页、总页数、数据总条数,但刚刚发现TotalPage、TotalCount实际上是冗余的,两者可以互相计算得出,这要尽早重构。 b) 局部变量 根据目前的实现,需要这么一坨局部变量。startPage、endPage限定了显示页码的范围。将跳转链接放在了hrefStr,以后其它列表需要使用这个工具类时,可把hrefStr改造成属性。最后的以Attr和Href结尾的变量用于设置4个跳转按钮的禁用属性和超链接。 c) 核心方法 核心的方法如下,主要实现“一 控件的行为规则”中a) 所描述的规则。 http://images2015.cnblogs.com/blog/844205/201706/844205-20170606225749887-1529658259.png" > d) 设置属性与Href的方法,实现了“一 控件的行为规则”中b) 所描述的规则,需要注意的坑是, 标签需要禁用时,为其加上”disabled”=”true”是不管用的,这样做只是在样式上起作用。所以这儿采用的方法是通过设置href=”#”来阻止跳转(但会回到页面顶部),鼠标以上去的红圈样式使用Inspinia模板的class=”disabled”样式,这便是设置firstPageAttr等标签为”disabled”的用途 e) 返回html的方法 f) 分页组件的使用 在前端页面中,使用razor语法,Html元素的输出要用@Html.Raw()方法,另外因为相关的变量都是静态的,每次使用完要记得调用Reset重置状态。这样自己的分页组件就实现了,原本就知道这个小小的控件不好写,经过很多次单元测试、集成测试,费了不少时间终于能够使用了。 © 著作权归作者所有 文章转载自 开源中国社区 [http://www.oschina.net]
Node.js 6.11.0 发布了,Node.js 是一套用来编写高性能网络服务器的 JavaScript 工具包。主要更新内容如下: build: 支持构建 mips64el (nanxiongchao) #10991 cluster: disconnect() 给断开的服务器返回 reference (Sean Villars) #10019 crypto: 可在运行时选择 cert 存储 (Adam Majer) #8334 使用系统 CA 代替捆绑 (Adam Majer) #8334 Decipher 方法 setAuthTag() 和 setAAD 先返回 this. (Kirill Fomichev) #9398 再次添加 OPENSSL_CONF (Sam Roberts) #11006 将 LazyTransform 与 Streams1 编译(Matteo Collina) #12380 文章转载自 开源中国社区 [http://www.oschina.net]
更新内容: 310 前后端分离核心类WebSimulate 指定模拟的模板页面某些情况下查询不到的bug修复 309 Template 和 GroupTemplate 增加了语法校验API,适合CMS,规则引擎等应用领域发布前校验模板&脚本 308 完善了 PojoMethodInvoker 报错信息提示 <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl</artifactId> <version>2.7.16</version> </dependency> Beetl是新一代的模板引擎。总得来说,它的特性如下: 功能完备:同主流的java模板引擎相比,Beetl具有绝大多数功能。适用于各种应用场景,从对响应速度有很高要求的大网站到功能繁多的CMS管理系统都适合。Beetl本身还具有很多独特功能来完成模板编写和维护,这是其他模板引擎所不具有的。 非常简单:类似Javascript语法和习俗,只要半小时就能通过半学半猜完全掌握用法。拒绝其他模板引擎那种非人性化的语法和习俗。 超高的性能:Beetl 远超过主流java模板引擎性能,如5-6倍于freemarker,2倍于传统jsp技术。而且消耗较低的CPU 易于整合:Beetl能很容易的与各种web框架整合,如Spring MVC,JFinal,Struts,Nutz,Jodd,Servlet等。 支持模板单独开发和测试,即在MVC架构中,即使没有M和C部分,也能开发和测试模板。 扩展和个性化:Beetl支持自定义方法,格式化函数,虚拟属性,标签,和HTML标签. 同时Beetl也支持自定义占位符和控制语句起始符号也支持使用者完全可以打造适合自己的工具包. 文章转载自 开源中国社区 [http://www.oschina.net]
本次发布紧急修复了一个bug,在使用JPA2NameConversion的时候,某些情况下主键信息获取到不到的bug。 <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetlsql</artifactId> <version>2.8.16</version> </dependency> BeetlSql 是全新的Java 数据库访问 工具,具有如下特性: 开发效率: 1 无需注解,自动使用大量内置SQL,轻易完成增删改查功能,节省50%的开发工作量2 数据模型支持Pojo,也支持Map/List这种快速模型,也支持混合模型3 SQL 模板基于Beetl实现,更容易写和调试,以及扩展 可以针对单个表(或者视图)4 代码生成pojo类和sql模版,甚至是整个数据库。能减少代码编写工作量 维护性: 5 SQL 以更简洁的方式,Markdown方式集中管理,同时方便程序开发和数据库SQL调试。可以自动将sql文件映射为dao接口类6 直观灵活的支持一对一,一对多,多对多关系映射而不引入复杂的OR Mapping概念和技术。7 具备Interceptor功能,可以调试,性能诊断SQL,以及扩展其他功能。 文章转载自 开源中国社区 [http://www.oschina.net]
一个使用 xml 和 beetl 来实现的计算引擎(评级引擎),支持树形评级结构,通过计算得出一个评级,可以用于打分等应用。 本次发布实现了规则计算过程的展现,以及规则的语法校验 1) 规则计算过程显示 2) 语法校验 https://static.oschina.net/uploads/space/2017/0607/090451_lekh_567839.png" > 文章转载自 开源中国社区 [http://www.oschina.net]
这个美好的六月,开源中国源创会童鞋们马不停蹄地赶往杭州,因为「毕竟西湖六月中,风光不与四时同」,带着自由、开放、分享的开源精神和大家一起分享、交流,是何等惬意的事情呢!杭州附近的童鞋,请 猛击这里 报名哦!除了各种干货之外,还有众多奖品等着你! 当然,客户端童鞋也没有闲着:继前天发布最新版 Android 客户端之后,今天为大家送上开源中国 iOS 客户端 v3.8.4 版本。 横屏阅码 怎一个「爽」字了得 收到许多OSCer反馈说,在「码云推荐」项目中查阅源代码时很不舒服。因此,这个版本中我们加入了横屏阅读源码的辅助功能。在阅读源码时,只需将手机横向转动即可。 https://static.oschina.net/uploads/space/2017/0607/102513_XQE6_2340783.jpg" > 此外,我们也对上个版本中出现的一些细节问题进行了修复。在这里感谢各位OSCer对客户端的各种反馈意见。不要再犹豫了,赶紧去AppStore升级吧! 顺便说一下,v3.8.4 版本源码将会在明天正式开源,敬请各位OSCer期待! 大家都知道,开源中国秉承自由、开放、分享的精神,每次客户端升级之后代码都会在第一时间开源,以供大家查阅、学习、批评、指正。所以,遇到有问题或更好的建议时,请大家通过码云issue来向我们反馈。 访问开源中国 iOS 客户端源码:http://git.oschina.net/oschina/iphone-app 文章转载自 开源中国社区 [http://www.oschina.net]
采用逢二进一法则,二进制10+11=101
二进制是计算技术中广泛采用的一种数制。二进制的基数为2,用0和1两个数码来表示的数,进位规则是“逢二进一”。
十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
而由二进制数转换成十进制数是把二进制数首先写成加权系数展开式,然后按十进制加法规则求和,这种做法称为“按权相加”法。
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。
具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
以235为例,转为二进制:
235除以2得117,余1
117除以2得58,余1
58除以2得29,余0
29除以2得14,余1
14除以2得7,余0
7除以2得3,余1
3除以2得1,余1
从得到的1开始写起,余数倒排,加在它后面,就可得11101011。
从最后一位开始算,依次列为第0、1、2...位 ,第n位的数(0或1)乘以2的n次方 ,得到的结果相加就是答案 。
例如:01101011.转十进制:
拓展资料:
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用1来表示“开”,0来表示“关”。