News stories from Thursday 26 April, 2018

Favicon for 开源中国社区最新新闻 09:09 Java easycms 2.0 发布 » Post from 开源中国社区最新新闻 Visit off-site link

Java easycms 2.0 发布。

  1. 精简 js 框架,删除不开源的 ace ui 框架,改为更简洁,理论支持 n 级节点的层级菜单

  2. 默认使用嵌入式数据库 h2

  3. 使用 jetty 作为 servlet 容器启动服务,配合 maven 插件编译启动

  4. 使用对 html 更友好的 thymeleaf 作为前端展示页面的模板引擎,支持自定义标签,方便的调用后端 java 类方法

  5. 更改类名,目录名,方法名,表名,更易于理解项目结构

  6. 增加多个站点支持的演示,咖啡站中间菜单的管理和展示,仅当示例。www.52en.me  是自己的一个字幕学习网站

  7. 码云地址 https://gitee.com/sid_jiang/easycms.git

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 09:06 英孚教育全面上云与Serverless构建之路 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

在英孚教育的云迁移之路中,许多值得借鉴的架构设计经验和部署战略的发展理念可以作为典型案例用来分析。因而,InfoQ也借此机会对英孚青少儿CTO Andrew Tsui进行了专访,与他探讨应用、数据迁移上云以及在Serverless架构实践中的相关思考。

By 曹倩芸
Favicon for 开源中国社区最新新闻 08:28 每日一博 | Apache ServiceComb 的开放性设计 » Post from 开源中国社区最新新闻 Visit off-site link

本文讲述了整个 开源微服务框架 Apache ServiceComb 设计形成的前因后果,尝试从理念、思想和实践结合的维度剖析一个优质的微服务框架应该具备哪些要素

Favicon for 开源中国社区最新新闻 08:26 访谈 | 解读 Airtest,谷歌青睐的游戏自动化测试方案 » Post from 开源中国社区最新新闻 Visit off-site link

游戏自动化测试方案的出现减轻了测试人员的负担,同时提高了上游开发与设计等人员的效率,使他们可以创造更多价值。

Favicon for 开源中国社区最新新闻 08:21 码云推荐 | 快速将 Vim 打造成 C++ IDE VimForCpp » Post from 开源中国社区最新新闻 Visit off-site link

可以快速将 Vim 打造成 C++ IDE,一键式安装,无需编译直接使用 YouComplete

Favicon for 开源中国社区最新新闻 08:20 RSUITE —— 基于 React 的后台 UI 组件库 » Post from 开源中国社区最新新闻 Visit off-site link

RSUITE(React Suite 的简写)是 一套 React 组件库,为后台产品而生。经历了三次大的版本更新后,累积了大量的组件和丰富的功能。

Favicon for 开源中国社区最新新闻 08:19 npm 发布 npm@6 包管理器,并提供新的安全保护 » Post from 开源中国社区最新新闻 Visit off-site link

npm 公司宣布推出 npm@6 软件包管理器。 它将提供强大的新安全功能,例如,当开发人员尝试使用具有已知漏洞的开源代码时,它可以自动发出警告。npm 命令'npm audit',可以允许开发人员分析复杂的代码并查明特定的漏洞。

170136_xtgM_2903254.png

最近一项 npm 调查发现,97% 的 JavaScript 开发人员使用开源代码,77% 的人表示担心他们使用的开源软件是否安全。 此外,52% 的开发人员认为没有令人满意的方式来评估代码是否安全。

Node.js 基金会执行董事 Mark Hinkle 说:“npm@6 致力于将安全性放在首要位置,并帮助开发人员构建全球最具可扩展性的关键任务 JavaScript 应用程序。”

其他新功能包括性能增强,针对持续集成的优化,webhooks 管理,更明显的完整性元数据以及自动解决锁文件冲突。

原文:Medium  编译:开源中国

Favicon for 开源中国社区最新新闻 08:11 「微服务示范项目」征集中!千元好礼等你拿 » Post from 开源中国社区最新新闻 Visit off-site link

码云携手华为云有奖征集「微服务示范项目」,最高可获赠2000元!

Favicon for 开源中国社区最新新闻 08:10 Oracle 毙掉 JavaOne,以 Oracle Code One 取而代之 » Post from 开源中国社区最新新闻 Visit off-site link

JavaOne 是在 Sun 正式发布 Java 1.0 之后,组织起来的专属于 Java 的会议。从 1996 年开始,每年都会在旧金山举办一次。

然而近日,Oracle 宣布取消 JavaOne 的会议,并用 Oracle Code One 取而代之,其名字由 JavaOne 与 Oracle OpenWorld 结合而来,其活动地点从一直以来的 Moscone Center 迁移到附近的酒店。

151338_26Mq_2903254.png

Oracle 方面称,这么做是为了更好地扩展会议内容,他们希望将更多的语言、技术和各个领域的开发人员容纳进来,在会议上就 Go,Rust,Python,JavaScript 和 R 等更多的语言进行会谈,而不仅仅限于 Java。

Oracle 开发者社区团队主管 Stephen Chin 宣布 Code One 将包含“客户端开发,JVM 语言,IDE,测试框架等的大量社区内容”。并补充道:“会议扩展之后,开发人员还可以期待其他前沿话题,例如 chatbots,微服务,AI 和区块链......我们还将围绕现代开源开发技术进行会议,包括 Oracle JET,Project Fn 和 OpenJFX。”

不过,这个新会议会继续保留 Java 技术主题演讲和开发者社区主题演讲,并且它将继续成为公告 Java 11 以及 OpenJDK 和其他核心 Java 开发进展的场所。最初的 Code One 将包含服务器端 Java EE 技术的专场,包括介绍 Jarkata EE,Spring 以及 Java 微服务和容器的进步。

对于此项变动,Java 企业顾问兼 Java EE Guardians 联合创始人 Reza Rahman 在 Twitter 上发表推文表示:“我不得不说这让我非常难过,JavaOne 这么多年来对我意味着太多,这是 Oracle Code One 代替不了的......“

关于新会议的更多内容可以查看这篇博客Code One 主页

原文:ADTMAG  编译:开源中国

Favicon for 开源中国社区最新新闻 08:10 Ubuntu 18.04 LTS 新增欢迎界面,方便上手新系统 » Post from 开源中国社区最新新闻 Visit off-site link

Canonical再次分享了Ubuntu 18.04 LTS (Bionic Beaver) 新功能--全新的欢迎界面。在用户完成安装首次进入系统的时候,那么你就会看到全新设计的欢迎界面。

172637_dDe6_2903254.png

在Ubuntu生态系统中有很多风味版本都有欢迎界面,例如Ubuntu MATE和Ubuntu Budgie,还有很多基于Ubuntu的GNU/Linux发行版本,在系统安装完成之后为消费者设置提供快捷简便的设置指南。

172652_dDh2_2903254.png

Ubuntu原版系统此前从未使用过欢迎界面,不过自Ubuntu 18.04 LTS版本开始将会发生改变。引入欢迎界面能够帮助新手或者老用户更好的理解全新设计的GNOME用户界面,以及对Canonical LivePatch等服务进行设置。

172717_iIMI_2903254.png

如果你此前使用过GNOME桌面环境,那么你可能会对这个界面非常熟悉。不过Ubuntu和此前GNOME环境最大的区别在于Launcher条位于屏幕左侧,支持GNOME Shell界面的Ubuntu Dock分支。

172740_Hpnn_2903254.png

在欢迎屏幕上点击“下一步”能够设置Canonical LivePatch,可以在不重启的情况下部署内核更新。想要设置Livepatch服务,用户需要拥有一个Ubuntu SSO账号。

172800_E7vT_2903254.png

来源:cnBeta.COM

Favicon for 开源中国社区最新新闻 08:09 OSChina 周四乱弹 — 我读书少,你不要脱了裤子骗我 » Post from 开源中国社区最新新闻 Visit off-site link

大冬天,在某银行,一劫匪把刀架在人质脖子上才刚放上去,人质大喊:凉!凉!凉!!整个银行憋成内伤

Favicon for 开源中国社区最新新闻 08:09 Qt 也要拥抱 WebAssembly!将在 5.11.0 中正式支持 » Post from 开源中国社区最新新闻 Visit off-site link

又一开发工具宣布加入 WebAssembly 生态圈!老牌跨平台开发框架 Qt 官方表示,Qt 将在 5.11.0 版本发布时开始支持将程式码编译为 WebAssembly,现阶段提供技术预览版,希望大家在社区反馈意见。

075457_ZAks_2903254.jpg

Qt 研发部图形和多媒体团队经理 Eskil Abrahamsen Blomfeldt 在博客发文表示,WebAssembly 由于是字节码的格式,可以将应用程序快速部署到有支援 Web 浏览器的装置上。

这个特性让 WebAssembly 不需要任何安装过程,就能在浏览器的沙盒中安全执行,Eskil Abrahamsen Blomfeldt 认为,这个适用于不需要存取完整装置功能的应用,并且,可以给使用者提供快速简单的使用经验。

在 Qt 5.11.0 发布时,使用者就能通过 Qt 将 C++ 代码编译成 WebAssembly,并且直接在浏览器中执行 Qt 应用程序,但目前仅支持客户端的应用。官方文件提到,由于现在仍在技术预览版,还有许多已知问题尚未解决,包括现在无法将 Windows 作为主机平台,但可以使用适用于 Linux 的 Windows 子系统。

另外,Qt Quick 使用软件后端,这会对较复杂的 UI 性能产生影响,并且也禁止使用着色器,但这项问题很快会得到解决。而且,目前在 WebAssembly 中不支持线程,如果您的应用程序依赖于线程,这可能会导致编译出来的 WebAssembly 发生无法意料的结果。

虽然 Mozilla 已有工具 Emscripten 能将 C++ 编译为 WebAssembly,但 Qt 作为知名的跨平台开发框架,宣布支持 WebAssembly 势必能将更多开发者带入这个生态圈。详情请看博客

Favicon for 开源中国社区最新新闻 08:05 Vant 1.1.0 发布,有赞轻量级移动端 Vue 组件库 » Post from 开源中国社区最新新闻 Visit off-site link

Vant 1.1.0 已发布,更新如下:

改进

  • 新增 Slider 滑块组件 #897 #915

  • 新增 BEM mixin,规范 BEM 命名格式 #921 #924 #932 #934

  • Cell: 优化 flex 结构 #919

  • Panel: 优化结构,使用 Cell 代替部分样式 #927

  • Build: 升级至 vue-loader@15 #937

  • Build: 使用 ChromeHeadless 代替 PhantomJS 作为测试运行环境 #913

  • Build: 使用 MiniCssExtractPlugin 代替 ExtractTextPlugin #936

  • Build: 增加针对 webpack4 优化的 sideEffects 配置 #926

  • 文档: 新增 rem 指引 #928

  • 文档: 移除 Loading circle 类型,不推荐使用 #941

Bug 修复

  • 修复 Uploader 在安卓下无法上传图片的问题 #929

  • 修复 Checkbox 内容为空时渲染了空 label 元素的问题 #920

  • 修复 Dialog TS 类型定义错误 #918

  • 修复 Popup 多层级关闭时未正确移除 lock-scroll 导致无法滚动的问题 #912

  • 修复 Picker 在系统字体大小缩放时布局错乱的问题 #916

Vant 是有赞移动端 Vue 组件库,特性如下:

  • 50+ 个经过有赞线上业务检验的组件

  • 单元测试覆盖率超过 90%

  • 完善的文档和示例

  • 支持 babel-plugin-import

  • 支持 TypeScript

  • 支持 SSR

Favicon for 开源中国社区最新新闻 08:03 San 3.5.7 发布,百度开源的 MVVM 组件框架 » Post from 开源中国社区最新新闻 Visit off-site link

San 3.5.7 已发布,更新内容:

  • 【优化】- 组件反解时,组件数据信息的 comment 节点前允许包含空白文本节点

  • 【优化】- 新增常用 html entity 的转义支持

  • 【bug修复】- ssr 下 html entity 渲染错误。该问题为 3.5.5 引入

San 是百度开源的一个 MVVM 的组件框架。它体积小巧(12.6K),兼容性好(IE6),性能卓越,是一个可靠、可依赖的实现响应式用户界面的解决方案。

San 通过声明式的类 HTML 视图模板,在支持所有原生 HTML 的语法特性外,还支持了数据到视图的绑定指令、业务开发中最常使用的分支、循环指令等,在保持良好的易用性基础上,由框架完成基于字符串的模板解析,并构建出视图层的 节点关系树,通过高性能的视图引擎快速生成 UI 视图。San 中定义的数据会被封装,使得当数据发生有效变更时通知 San 组件,San 组件依赖模板编译阶段生成的节点关系树,确定需要变更的最小视图,进而完成视图的异步更新,保证了视图更新的高效性。

Favicon for 开源中国社区最新新闻 08:00 开源 API 网关Tyk 发布 2.6 版本,让 API 管理更容易 » Post from 开源中国社区最新新闻 Visit off-site link

Tyk 是一个开源的 API 网关,可让你控制访问 API 的人员,访问 API 的时间以及访问 API 的方式。Tyk 还包含一个简单易用的 Dashboard ,会记录用户与 API 进行交互的过程以及出现问题时的详细分析。

Tyk 2.6 支持对组织级别进行不同的速率限制,支持 JSON 模式验证用户请求,支持创建可访问多个 API 的 OAuth 客户端,并可通过 hash 来进行更多的操作,以及对 Redis TLS 的支持。

具体细节可查阅发行说明:

源码下载:

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 Spring Cloud Stream 2.0发布,专注于性能、灵活性和一致性 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

Pivotal正式发布Spring Cloud Stream 2.0,用于构建高度可扩展的基于事件驱动的微服务。此版本包含对content-type协商功能(允许用户定义消息转换器)的全面改进,减小资源占用,支持轮询式的消费者,支持Micrometer度量指标,增强对Apache Kafka Streams的支持等。

By Daniel Bryant Translated by 无明
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 GCP发布Kaniko:在非特权容器和Kubernetes中构建容器镜像的工具 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

Google发布了“Kaniko”,一种用于在未授权容器或Kubernetes集群中构建容器镜像的开源工具。虽然Kaniko也是根据用户给定的Dockerfile构建镜像,但是并不依赖于Docker守护进程,而是在用户空间中完全执行每个命令,并对所导致的文件系统更改做快照。Kaniko支持在Kubernetes集群等不方便甚至是不能安全地暴露Docker守护进程的环境中构建容器镜像。

By Daniel Bryant Translated by 盖磊
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 精益敏捷采购的外包 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

采购流程是组织在运营中变敏捷的最后一道障碍。在最近的Agilia会议上, Mirko Kleiner就精益敏捷采购提出了一种服务合同谈判的方法,该方法涉及采购专家、IT团队和供应商,它能够大幅缩短合同谈判的时间,并将你争我夺的态度转变为协作的方式,以满足客户的需求。

By Shane Hastie Translated by 张兰月
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 Sauce Labs将分析和扩展调试添加到其持续测试云中 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

在最近的用户会议SauceCon上,Sauce Labs为其持续测试云加入了一些新的功能,包括测试分析,其中还包含了一个仪表板,用于分析测试结果并显示浏览器和操作系统(包括安卓和iOS)常见的故障。

By Helen Beal Translated by 张兰月
Favicon for 开源中国社区最新新闻 07:58 AgensGraph 1.3 发布,基于 PostgreSQL 的图数据库 » Post from 开源中国社区最新新闻 Visit off-site link

AgensGraph 是一个基于 PostgreSQL 的新一代多模型图数据库。它提供图形分析环境,用户可以同时编写、编辑和执行 SQL 和 Cypher 查询。AgensGraph 带有 PostgreSQL 兼容性和 PostgreSQL 扩展,能够帮助 PostgreSQL 用户摆脱数据迁移的痛苦,轻松开发提供高级数据分析的服务。

AgensGraph v1.3 主要改进和修复:

  • 增强 Query Plan 性能

  • 支持更多 Cypher 表达式

  • 增强对外部模块的支持

  • 改进可用性

  • 优化内存使用

  • 修复与使用多个 Cypher 关键字相关的错误

  • 修复加载数据时的内存泄漏

  • 修复与 Vertex Reference 相关的错误

更多细节可查阅发行说明:

下载地址:

Favicon for 开源中国社区最新新闻 07:50 开源模拟器 QEMU 2.12.0 发布,包含大量不兼容更改 » Post from 开源中国社区最新新闻 Visit off-site link

QEMU 是一个通用的开源模拟器和虚拟器,基本上已支持所有的操作系统。

QEMU 2.12.0 已发布,值得留意的是该版本包含许多不兼容的更新和变化,像是:

  • 弃用的 CLI 选项 “-tdf”,“-no-kvm-pit” 和 “-drive boot = on | off” 已被彻底删除。

  • 弃用的 CLI 选项 “-net channel” 已被删除,可使用 "-netdev user,guestfwd=..." 替代。

  • 弃用的 CLI 选项 “-hdachs” 已被删除,现在可指定磁盘参数,例如通过-device ide-hd,cyls = c,heads = h,secs = s 代替。

  • 在 x86 上使用 “-drive if = scsi” 配置 SCSI 设备的原有方式已被删除。改为使用适当的 SCSI 控制器 “-device scsi-hd” 或 “-device scsi-cd” 和相应的 “-blockdev” 参数。

  • 使用 “-usbdevice” 配置 “host”,“serial”,“disk” 或“net” USB 设备的原有方式已被删除。改用 “-device usb -...” 。

  • 不推荐使用的 HMP 命令 “usb_add” 和 “usb_del” 已被删除。改为使用 “device_add” 和 “device_del” 。

  • 不推荐使用的 HMP 命令 “host_net_add” 和 “host_net_remove” 已被删除。改用 “netdev_add” 和 “netdev_remove” 。

  • 转储网络流量的方式已被删除。改用 “-object filter-dump”。

  • 弃用的 “spapr-pci-vfio-host-bridge” 已被删除。自 QEMU v2.6.0 以后,vfio 不再需要它。

更多细节请查阅发行列表:

下载地址:

Favicon for 开源中国社区最新新闻 07:49 OpenEMR 4.1.5 发布,开源医疗实践管理方案 » Post from 开源中国社区最新新闻 Visit off-site link

OpenEMR 4.1.5 已发布,带来包括患者门户、机构账单、基本 FHIR 支持、DICOM 图像查看器、免费电子处方、提醒模块、团体治疗模块、活动目录支持和基于临床角色的菜单等大量新特性,以及涉及 OpenEMR 中的各个模块的改进,包括代码库的现代化和标准化、用户界面的现代化和图形化、加密、文档管理、消息传送、病人跟踪及安全性。

此外,国际化和本地化也得到显着改善,OpenEMR 目前已支持 34 种语言。

具体细节可查阅发行说明:

OpenEMR 是一个开源的电子健康记录 (EHR) 系统和医疗实践管理方案,已通过符合国际标准的 ONC 认证。功能包括医患调度、电子处方、医疗账单、CMS 报告、临床决策规则等等。

下载地址:

Favicon for 开源中国社区最新新闻 07:40 Darktable 2.4.3 发布,跨平台 RAW 图像编辑器 » Post from 开源中国社区最新新闻 Visit off-site link

开源、跨平台的 RAW 图像编辑器 Darktable 发布了 2.4 系列的第三个维护版本,新增了用于将 .dtyle 转换为 .xmp 的脚本,对水印模块的完善,以及一些崩溃情况和导出功能的修复。

此外,还新增了对一些数码相机的支持,包括 Fujifilm X-H1 (compressed)、Kodak EOS DCS 3、Olympus E-PL9、Panasonic DC-GX9 (4:3)、Sony DSC-RX1RM2、Sony ILCE-7M3 等等。

详细的更新内容可查阅完整发行列表

Darktable 是一个数字摄影暗房软件:它在数据库管理你的数码底片并允许通过可缩放 lighttable 查看。它还能够开发和改进原始图像(RAW)。

165108_Yaxa_2896879.png

下载地址:

Favicon for 开源中国社区最新新闻 07:38 Spring Cloud Finchley RC1 发布,基于 Spring Boot 2.0.1 » Post from 开源中国社区最新新闻 Visit off-site link

Spring Cloud Finchley 的首个候选版 RC1 已发布,该版本基于 Spring Boot 2.0.1 。

更新内容:

Spring Cloud Task

Spring Cloud Config

Spring Cloud Bus

Spring Cloud Netflix

Spring Cloud Cloudfoundry

Spring Cloud Contract

  • Support for Pact v3

  • Integration with Pact Broker

  • Option to upload and fetch stubs from a Git repository

  • Bug Fixes

Spring Cloud Consul

Spring Cloud Gateway

Spring Cloud Zookeeper

Spring Cloud Stream

Spring Cloud Sleuth

  • Dubbo integration has been documented

  • Bug Fixes

Spring Cloud Commons

组件版本升级:

073738_UciK_2896879.png

更多详情请查看发行说明:

Favicon for 开源中国社区最新新闻 07:31 Apache Tika 1.18 发布,内容抽取工具集合 » Post from 开源中国社区最新新闻 Visit off-site link

Apache Tika 1.18 已发布,Tika 是一个内容抽取的工具集合(a toolkit for text extracting)。它集成了 POI 和 Pdfbox,并且为文本抽取工作提供了一个统一的界面。其次,Tika 也提供了便利的扩展 API,用来丰富其对第三方文件格式的支持。

Apache Tika 1.18 包含许多改进和错误修复,其中包括:

  • Jackson 更新至 2.9.5

  • 支持 brotli

  • 将 geo-apis 升级到 3.0.1

  • 从 PPT 中的分组文本框中提取文本

  • 为 XPS 添加解析器

  • 要求 Java 8

完整更新内容请查看发行说明

下载地址:http://tika.apache.org/download.html

Favicon for 开源中国社区最新新闻 07:25 Kong 0.13.1 发布, 分布式微服务抽象层 » Post from 开源中国社区最新新闻 Visit off-site link

Kong 0.13.1 已发布,这是一个小版本,包含一些 bug 修复和小的新特性。

主要亮点:

  • 大部分 no memory 错误都已被解决

  • 数据库 cache miss 现在存储在单独的内存区域以减少缓存更新并提高性能和可靠性

  • Nginx的 stdoutstderr 现在正确地重定向到 kong start

  • kong start 现在会验证 Cassandra 或 PostgreSQL 实例是否属于支持的版本范围,并显示警告

  • 对 CLI,Admin API 和插件的多项 bug 修复......

完整更新内容请查阅更新日志

Kong 是一个云原生、快速、可扩展和分布式的微服务抽象层(也称为 API 网关),通过插件扩展功能。Kong 有两个主要组件:基于 nginx 的服务器,用来接收 API 请求的 Kong Server;以及用来存储操作数据的 Apache Cassandra 。

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 07:18 文章: 区块链快速通道:从技术原理到应用落地 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo-devops-1517322113546-1524676331239.

区块链是机遇也是挑战,如何在这风起云涌的区块链世界里获得加速卡实现弯道超车?没有区块链技术基础的你又怎样迅速部署属于自己的第一个应用? 为了解决一部分粉丝的困惑,我们邀请到万向区块链旗下万云平台首席架构师兼产品总监李晨,从以下两个方面为大家分享他和万云团队对区块链技术及应用的思考:一是对区块链技术进行基本介绍,尤其是区块链的发展历史和核心技术;二是分享万云平台在区块链行业当中的探索。

By 李晨
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 07:05 文章: 基于云原生技术和服务网格的Java EE » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
GettyImages-845809800-1524208773636.jpg

Java EE可以很容易地与云原生技术(如Kubernetes或Istio)结合在一起,用以构建现代化的以服务为驱动的应用程序。

By Sebastian Daschner Translated by 无明
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 06:44 文章: 天天写「业务代码」,如何成为「技术大牛」? » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
GettyImages-628619884-1514929417641-1524

不管是开发、测试、运维,每个技术人员心理多多少少都有一个成为技术大牛的梦,毕竟“梦想总是要有的,万一实现了呢”!正是对技术梦的追求,促使我们不断地努力和提升自己。然而……

By 李运华

News stories from Wednesday 25 April, 2018

Favicon for 小众软件 - Appinn 22:09 灰鱼动态壁纸 – 搞个大新闻,9 张壁纸也敢发布 App [iOS] » Post from 小众软件 - Appinn Visit off-site link

一上来就要搞个大新闻,只有 4 种设计,3 个颜色,一共 9 张高效好看的动态壁纸,嗯,这就是 灰鱼动态壁纸 。@Appinn

来自发现频道,为嘛是搞个大新闻?你看看发现频道的截图就懂了。

虽然…只有 9 张壁纸,但是 灰鱼动态壁纸 支持将自己的视频剪辑后制作成动态壁纸保存。

另外一个好消息是,正常的 3D Touch 需要设备支持,包括以下:

iPhone X, iPhone 8, iPhone 8 plus, iPhone 7, iPhone 7 plus, iPhone 6s plus, iPhone 6s, iPhone 6 plus

而 灰鱼 同学还搞定了 iPhone 6 以及 iPhone SE 的支持。

正常情况下,只能看到 3 种设计,另外一种设计需要想办法开启彩蛋,目前青小蛙还没发现 🙈


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 开源中国社区最新新闻 15:36 Go 开源博客平台 Pipe 1.5.0,首页加入 Top10 博主列表 » Post from 开源中国社区最新新闻 Visit off-site link

Go 开源博客平台 Pipe 1.5.0 已发布,该版本主要在平台首页加入了 Top 10 博主列表,并可以在编辑文章时指定发布时间。

简介

Pipe 是一款小而美的开源博客平台,通过黑客派账号登录即可使用。

动机

产品层面:

  • 市面上缺乏支持多独立博客的平台级系统

  • 实现 B3log 构思

技术层面:

  • 在博客系统这个轮子上充分发挥 golang 的优势

  • 后台使用 Vue.js 进行前后端分离

案例

http://pipe.b3log.org

特性

  • 多用户博客平台

  • Markdown / Emoji

  • 聚合分类 / 标签

  • 自定义导航

  • 多主题 / 多语言

  • Atom 订阅

  • 搜索

  • Hexo/Jekyll 导入 / 导出

  • 可配置动静分离

  • 支持 SQLite / MySQL

安装

下载最新的 Pipe 包解压,进入解压目录直接运行 pipe/pipe.exe 可执行文件即可。

更多细节请参考 Pipe 用户指南。另外,如果你不想自己维护服务器,可以直接使用我们运维的 Pipe 服务

文档

版本历史

变更历史请看这里

Favicon for 开源中国社区最新新闻 13:59 React Suite —— 基于 React 的 UI 组件库 » Post from 开源中国社区最新新闻 Visit off-site link

React Suite 是 HYPERS 前端团队和 UX 团队开源的一套基于 React 的 UI 组件库,能够帮助您快速构建一个企业级应用。

Favicon for 开源中国社区最新新闻 12:36 React Suite v3.0 正式版发布,React 的 UI 组件库 » Post from 开源中国社区最新新闻 Visit off-site link

React Suite v3.0 正式版发布

相信很多人会好奇,React Suite 是什么?

React Suite 是 HYPERS 前端团队和 UX 团队开源的一套基于 React 的 UI 组件库,能够帮助您快速构建一个企业级应用。

官网访问地址: rsuitejs.com

为什么选择 React Suite ?

我们在服务于很多企业的过程中发现,不管是大企业,还是中小企业都有一套(或者希望有一套)自己的 VI ,其中产品视觉设计就很重要的一部分,这些企业都不希望自己的产品通过某某框架生产出市面上都一样的设计风格。

在这样一个背景下,我们除了做好功能全面的组件,另外一直在想办法让 React Suite 可以方便的个性化定制。

我们的目标:就是让所有的企业都可以定制化一套属于自己企业产品风格的组件。

如果您们公司也在使用 React 技术栈, 也在找一个工具能很好定制成符合自己企业 VI 的产品,不妨试一下 React Suite。

本次更新内容

从 2.0 到 3.0 做了很大改动,为了使用上的便利,我们把各个独立组件统一合并至 rsuite 库,并重新设计并重构了所有代码,在设计与测试上投入了大量的时间。

希望可以得到大家的支持 Star 。

Favicon for 开源中国社区最新新闻 11:30 Qt for WebAssembly 技术预览版发布 Beta 版本 » Post from 开源中国社区最新新闻 Visit off-site link

据 Qt 官方博客透露,当下个 Qt 版本 5.11.0 发布时,作为 Qt 5.11 工具包更新的一部分,他们计划发布 Qt for WebAssembly 的技术预览版,可让你直接在浏览器窗口内运行 Qt 应用程序。

Qt for WebAssembly 可将 Qt 应用构建为 WebAssembly 模块,目前处于开发阶段。现在 Qt for WebAssembly 技术预览版已发布 Beta 版本,Qt 开发者推荐通过 Firefox 浏览器搭配使用,因为它目前提供了最快的 WASM 编译性能。此外,该模块目前不支持 Windows 作为主机平台。

官方 wiki 页面还提供了其他信息,包括有关如何配置环境和构建软件包的信息。

如果希望下载体验,只需登录你的 Qt 账号,进入“下载”区域即可获取。

Favicon for 开源中国社区最新新闻 11:08 MyBatis Dynamic SQL 1.1.0,生成动态 SQL 语句的框架 » Post from 开源中国社区最新新闻 Visit off-site link

MyBatis Dynamic SQL 1.1.0 已发布,该版本包含一些特性改进和两个 Bug 修复。其中最重要的改进是支持可选条件,允许编写一个 WHERE 子句,根据条件的输入值而变化,这对编码检索非常有用。

具体更新细节可查阅更改列表

MyBatis Dynamic SQL 是生成动态 SQL 语句的框架,可把它看作是一个类型安全的 SQL 模板库,另外还支持 MyBatis3 和 Spring JDBC 模板。

该库将生成格式化为由 MyBatis 或 Spring 使用的完整 DELETE,INSERT,SELECT 和 UPDATE 语句。

最常见的用例是生成语句和一组匹配的参数,这些参数可以被 MyBatis 直接使用。该库还将生成与 Spring JDBC 模板兼容的语句和参数对象。

该库通过实现一个类似 SQL 的 DSL 来创建一个对象,该对象包含完整的 SQL 语句以及该语句所需的任何参数。SQL 语句对象可以被 MyBatis 直接用作映射器方法的参数。

Maven 使用

<dependency>
  <groupId>org.mybatis.dynamic-sql</groupId>
  <artifactId>mybatis-dynamic-sql</artifactId>
  <version>1.1.0</version>
</dependency>

源码下载

Favicon for 开源中国社区最新新闻 10:57 PyTorch 0.4.0 发布,正式支持 Windows 系统 » Post from 开源中国社区最新新闻 Visit off-site link

PyTorch 0.4.0 已发布,除了平衡计算内存、支持更多概率分布、优化性能和修复 Bug 外,还正式官方支持 Windows 系统,不再需要借助其它开发者发布的第三方 conda 包。

更新列表:

  • 主要核心更改

    • Tensor / Variable 合并

    • Zero-dimensional Tensors

    • 数据类型

    • 迁移指南

  • 新特性

    • 支持 RNN

    • 易于使用的 Launcher utility

    • NCCL2 后端

    • 24 个基础的概率分布

    • 新增 cdf, variance, entropy, perplexity 等

    • 平衡计算内存

    • bottleneck - 一款识别代码中的热点的工具

    • 全面支持高级索引

    • 快速傅立叶转换

    • Tensors

    • Neural Networks

    • torch.distributions

    • Distributed Training

    • C++ 拓展

    • 支持 Windows

    • ONNX Improvements

  • 性能改进

  • Bug 修复

具体细节可查阅发行说明:

PyTorch 是一个 Python 优先的深度学习框架,提供两个高级功能:

  • 强大的 GPU 加速 Tensor 计算(类似 numpy)

  • 构建基于 tape 的自动升级系统上的深度神经网络

Favicon for 小众软件 - Appinn 10:50 坚果云新增 云桥模式、文件保护锁等功能,可以节省空间/加密文件 [Windows] » Post from 小众软件 - Appinn Visit off-site link

坚果云是一款十分优秀的跨平台网盘服务,也是小众软件的老朋友了,前不久我们还有过团购活动。最近坚果云的 Windows 客户端新增了一些非常实用的功能,如云桥模式、文件保护锁、书签、知识地图等功能。@Appinn

云桥模式解决了青小蛙一个很大的问题,就是在网盘中,很多文件其实是十分低频访问的,几年都不一定访问一次,但放在硬盘里占地方呀…虽然硬盘便宜,但青小蛙的硬盘剩余长期在 50 G 以下,再低系统就要报警,好烦躁。

云桥模式

云桥模式对文件有个简单的机制:用时 > 下载,不用时 > 云端保存。

上图中,只有 1.png 这个图片时在电脑的硬盘里保存,其他文件与文件夹都只是保存了个样子(真的只是样子,不占用磁盘空间),当你点击任何一个有云角标的文件时,坚果云就回帮你现场下载回来。

在设置中,有两个因素决定文件十分被保留在本地:

  1. 缓存大小
  2. 未访问文件天数

即当缓存使用达到限制时,坚果云就回自动帮你清理那些 30 天没访问过的文件,让这些文件只保存在云端。

在这种设置条件下,只需要将坚果云里的文件都设置成不同步到本地,就再也不用管了。过不了一周,经常使用的文件都在硬盘里,不常使用的文件都在云端里,听起来听完美的。

手动让文件在本地消失也很简单,右键 > 释放空间 即可:

需要注意的是,那些在本地的「假文件」是不能随意删除的,如果删除,云端也会被删除。

文件保护锁(给文件加个密码)

文件保护锁也是一个新的功能「开启文件保护锁功能后,当坚果云客户端未运行时,本地同步文件夹将无法访问。文件保护锁,锁住您的云端文件,保护您的数据安全。」

也就是说,开启保护锁后,当关闭坚果云客户端后,所有文件(坚果云内)将无法访问,相当于一个另类加密,因为再次打开坚果云客户端的时候,是需要输入密码才可以的。

用最简单的方式给 Windows 里的文件加个密码,这个功能就这样实现了,青小蛙流泪满面…

知识地图(文件思维导图)

知识地图是坚果云根据文件结构生成的类似思维导图样式的网页,并且还能根据文件名前面的颜色来判断文件大小,以及历史版本的文件结构:

最下方选择时间,可以看到不同时间点的文件结构(Pro 账号能保持 3 个月的历史版本)。

这个功能非常有创新点,十分有意思,还能直接在页面里点击文件名打开文件。

上图放大是这个样子的:

通过彩色小圆点显示大小,非常直观。

不过在 Edge 浏览器中,拖拽操作还可以在优化一下,有时候不好控制导图的开关。

其他新功能

其他的新功能还包括查看锁定、冲突、一场文件,更新历史记录可以分文件夹查看了,支持通过超过 256 个字符的文件和文件夹,新增分享链接过期时间、访问密码等,以及为常用文件添加书签,并统一将快捷方式放置在书签文件夹中:

书签文件夹并不占用磁盘空间。

最新的 4.1.0 已经可以下载了,前往:坚果云注册地址


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 开源中国社区最新新闻 10:33 Ceph 12.2.5 发布,可扩展分布式存储系统 » Post from 开源中国社区最新新闻 Visit off-site link

Ceph 12.2.5 已发布,这是 12.2.x LTS 系列的第五个修补版本,包含一系列跨组件的 bug 修复,建议所有 12.2.x 系列的用户更新。

主要亮点:

MGR

  • 包含在 ceph-mon 包中的 ceph-rest-api 命令行工具已被 MGR“restful” 模块弃用,并被标记为不推荐使用。

CephFS

  • 升级 MDS 集群到 12.2.3+ 后将导致升级后的 MDS 一旦联机(即使是待机状态),因功能不兼容,会导致所有活动的 MDS 闪退。管理员可忽略错误消息并继续升级/重启,或遵循此优先顺序:将优先级减至 1(ceph fs set <fs_name> max_mds 1),等待所有其他 MDS 停用,只保留一个活动的 MDS ,并进行升级,然后升级/启动备用数据库。 最后,恢复以前的 max_mds 。

更多细节可查阅:

Ceph 是一个可扩展的分布式存储系统,性能卓越,安全可靠。

202453_bzqc_2896879.png

下载地址:

Favicon for 开源中国社区最新新闻 09:36 OneinStack 1.7 发布,一键 PHP/JAVA 安装工具 » Post from 开源中国社区最新新闻 Visit off-site link

OneinStack 1.7 发布了,这个脚本是使用 shell编写,为了快速在生产环境上部署lnmp/lamp/lnmpa/lnmt(Linux、Nginx/Tengine/OpenResty、 MySQL/MariaDB/Percona/MongoDB/PostgreSQL、PHP、Apache、Tomcat),适用于CentOS 6~7(包括redhat)、Debian 6~9、Ubuntu 12~16的32位和64位。

OneinStack包含以下组合:

  • lnmp(Linux + Nginx+ MySQL/MongoDB+ PHP)

  • lamp(Linux + Apache+ MySQL/MongoDB+ PHP)

  • lnmpa(Linux + Nginx+ MySQL/MongoDB+ PHP+ Apache):Nginx处理静态,Apache(mod_php)处理动态PHP

  • lnmt(Linux + Nginx+ MySQL/MongoDB+ Tomcat):Nginx处理静态,Tomcat(JDK)处理JAVA

  • lnpp(Linux + Nginx+ PostgreSQL+ PHP)

  • lapp(Linux + Apache+ PostgreSQL+ PHP)

  • lnmh(Linux + Nginx+ MySQL+ HHVM)

V1.7版本更新如下:

  • 新增无人值守安装模式,参考:https://oneinstack.com/auto

  • 新增MySQL8.0、Tomcat9、JDK9

  • 新增oneinstack更新功能

  • Pure-ftpd新增SSL/TLS

  • 优化vhost.sh,启用acme.sh支持通配符,禁用certbot

  • 新增阿里云OSS备份功能

  • 软件版本更新至最新稳定

特性:

  • 持续不断更新,支持交互、无人值守安装

  • 源码编译安装,大多数源码是最新stable版,并从官方网址下载

  • 提供多个数据库版本(MySQL-8.0, MySQL-5.7, MySQL-5.6, MySQL-5.5, MariaDB-10.1, MariaDB-10.0, MariaDB-5.5, Percona-5.7, Percona-5.6, Percona-5.5,AliSQL-5.6,PostgreSQL, MongoDB)

  • 提供多个PHP版本(PHP-7.2,PHP-7.1,PHP-7.0,PHP-5.6, PHP-5.5,PHP-5.4,PHP-5.3)

  • 提供Nginx、Tengine、OpenResty

  • 提供多个Apache版本(Apache-2.4,Apache-2.2)

  • 提供多个Tomcat版本(Tomcat-9,Tomcat-8,Tomcat-7,Tomcat-6)

  • 提供多个JDK版本(JDK-9,JDK-1.8,JDK-1.7,JDK-1.6)

  • 根据自己需求安装PHP缓存加速器,提供ZendOPcache、xcache、apcu、eAccelerator。及php加解密工具ionCube、ZendGuardLoader

  • 根据自己需求安装Pureftpd、phpMyAdmin

  • 根据自己需求安装Memcached、Redis

  • jemalloc优化MySQL、Nginx

  • 提供添加虚拟主机脚本

  • 提供Nginx/Tengine/OpenResty/Apache、PHP、Redis、phpMyAdmin升级脚本

  • 提供本地备、远程(服务器之间rsync)、阿里云OSS、腾讯云COS和又拍云备份脚本

  • 提供CentOS 6、7下HHVM安装

更多信息请访问官网:https://oneinstack.com

Favicon for ITeye资讯频道 09:17 最简单的SAP云平台开发教程 - 如何开发UI5应用并运行在SAP云平台上 » Post from ITeye资讯频道 Visit off-site link

选择Services Catalog,根据关键字搜索到WebIDE服务,点击超链接打开WebIDE:

 

进入workspace,选择Git->Clone Repository:

 

从我的github clone:https://github.com/i042416/jerrylist

 

clone完毕之后选择Run->Run index.html, 检查clone是否成功。

 

正常情况下应该看到这个UI5应用:

 

将该应用从git的workspace部署到SAP cloud platform上:

 

Application Name可以随便起,我用的jerrylistfordemo。

 

成功部署后,在HTML5 Application能看到刚刚部署成功的应用jerrylistfordemo:

 

点击该应用的超链接能看到访问这个应用的url:

 

这样既可访问部署在SAP云平台上的应用。

 

同样的url也能在手机上访问:

 

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

 
 


感谢 JerryWang_SAP 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



Favicon for 开源中国社区最新新闻 08:59 YMP v2.0.5 发布,轻量级 Java 应用开发框架 » Post from 开源中国社区最新新闻 Visit off-site link

YMP v2.0.5 发布了。本次版本更新主要是新增若干新特性、增加对Beetl模板引擎的支持,同时针对框架问题修复、移除编译警告及性能优化,并对依赖包升级更新。

YMP是一个非常简单、易用的轻量级Java应用开发框架,涵盖AOP、IoC、WebMVC、ORM、Validation、Plugin、Serv、Cache等特性,让开发工作像搭积木一样轻松是我们一直不懈努力的目标!

新版本已提交至Maven中央库,可以通过以下配置获取各模块依赖:

<dependency>
    <groupId>net.ymate.platform</groupId>
    <artifactId>ymate-platform-<MODULE_NAME></artifactId>
    <version>2.0.5</version>
</dependency>

请将替换为具体模块名,模块详见: The Central Repository Search Engine

相关链接:

码云仓库地址:https://gitee.com/suninformation/ymate-platform-v2

框架使用手册:https://my.oschina.net/robocop/blog/1785404

主要更新内容:

核心(Core)

  • 新增序列化处理器注解支持自动扫描注册

  • 新增IConfigReader接口定义及接口实现

  • 新增IBeanInitializer接口实现自定义Bean实例化后处理逻辑

  • 新增配置项允许@Bean注解自定义对象处理器

  • 新增支持在类路径下通过banner.txt文件自定义字符徽标

  • 新增允许通过JVM启动参数(ymp.run_env)配置系统运行环境并根据环境配置和操作系统类型加载框架配置文件

  • 新增Freemarker模板引擎配置构建工具类

  • 新增RecycleHelper对象资源回收机制

  • 优化框架初始化逻辑

  • 优化调整IInitializable对象初始化能力接口

  • 优化BlurObject在字符串转换为数值异常时将返回默认值并输出异常警告

  • 优化ClassUtils类加载方法防止发生NoClassDefFoundError异常时程序中断

  • 优化Bean注册时是否忽略接口分析逻辑

  • 优化对象序列化接口新增ContentType获取方法

  • 优化密码处理器接口支持设置自定义密钥

  • 优化丰富ClassUtils.BeanWrapper类包装器方法

  • 优化控制台表格构建工具输出样式和换行转义逻辑并支持CSV格式输出

  • 优化@Ignored注解支持在包上声明

  • 优化FileUtils文件工具类增加文件压缩和复制方法

  • 优化并修正接口方法名称拼写错误

  • 查看模块文档...

配置体系(Configuration)

  • 新增@Configurable注解通过配合IConfigurable接口实现配置文件自动装配

  • 新增配置对象支持是否开启自动重新加载

  • 新增配置文件状态检查机制使修改配置文件内容无需重启服务将自动生效

  • 新增允许通过JVM启动参数(config_home)进行体系目录配置

  • 优化调整IConfiguration使其继承IConfigReader接口

  • 优化配置代理逻辑及配置文件分析器接口方法

  • 查看模块文档...

日志(Log)

  • 优化并新增(Logoo)怀旧版业务日志记录工具

  • 优化日志输出级别判断

  • 查看模块文档...

Web框架 (WebMVC)

  • 新增BeetlView视图对Beetl模板引擎支持

  • 新增控制器方法返回结果对象支持自定义输出

  • 优化视图接口方法支持批量添加属性参数

  • 优化控制器方法返回值是String和IView之外的对象并且未指定@ResponseBody注解时框架将默认采用JSON输出

  • 优化UploadFileWrapper文件上传对象包装器对文件移动和复制操作处理逻辑

  • 查看模块文档...

持久化(JDBC)

  • 优化日志输出SQL参数内容时若字符串中包含换行符则采用Base64编码方式输出

  • 优化堆栈跟踪支持多包名过滤

  • 优化DBCP数据源初始化逻辑

  • 优化JDBC方言以兼容SQLite、PostgreSQL等数据库

  • 优化密码参数值解密处理逻辑

  • 优化实体生成器模板引擎配置方式

  • 查看模块文档...

持久化(Redis)

  • 优化完善数据源初始化逻辑

  • 优化模块接口方法

  • 优化会话连接开启及关闭处理逻辑

  • 优化完善消息发布订阅逻辑

  • 优化密码参数值解密处理逻辑

  • 新增模块文档

  • 查看模块文档...

插件(Plugin)

服务 (Serv)

缓存 (Cache)

  • 新增针对Redis缓存禁用元素过期事件订阅配置项

  • 新增针对Redis缓存是否采用SET进行数据存储开关配置

  • 优化重命名缓存包装类名称拼写错误

  • 优化获取对象序列化接口配置逻辑

  • 优化基于Redis缓存及对象过期事件处理逻辑

  • 查看模块文档...

One More Thing

YMP是一个非常简单、易用的轻量级Java应用开发框架,涵盖AOP、IoC、WebMVC、ORM、Validation、Plugin、Serv、Cache等特性,让开发工作像搭积木一样轻松是我们一直不懈努力的目标!

YMP不仅提供便捷的Web及其它Java项目的快速开发体验,也将不断提供更多丰富的项目实践经验。

了解更多有关YMP框架的内容,请访问官网:http://www.ymate.net/

Favicon for 开源中国社区最新新闻 08:44 J2Cache 2.3.11 发布,只是为了秀一下存在感 » Post from 开源中国社区最新新闻 Visit off-site link

昨天被迫发布了 2.3.11 版本。因为之前在发布 2.3.10 版本时只发布了 core 模块,其他的诸如 hibernate 支持以及 Spring Boot 支持的模块都没有更新,导致不少用户催促我赶紧跟进。

2.3.11 版本主要包含两方面的改进:

  • Spring Boot 模块关于 redis 数据读写的 bug 修复(感谢 @zhangsaizz

  • 处理了一些代码上的 Bad smell (这些问题是码云自带的代码质量检测发现的问题)

更多关于 J2Cache 的代码质量报告请看这里,我会酌情进行处理。

可通过 Maven 获取该版本:

<dependency>
    <groupId>net.oschina.j2cache</groupId>
    <artifactId>j2cache</artifactId>
    <version>2.3.11-release</version>
</dependency>
Favicon for 开源中国社区最新新闻 08:35 avue 1.2.1 发布,扩展 crud 组件和路由加入缓存机制 » Post from 开源中国社区最新新闻 Visit off-site link

crud

  • 新增:表格expand(展开属性)

  • 新增:menuAlign(操作栏对其方式)

  • 新增:列的align(表格内容对其方式)

  • 新增:列的headAlign(表格头部内容对其方式)

  • 修复:修复表格新增时候验证规则报错,在编辑窗口不消失问题

路由

  • 新增: keepAlive路由缓存机制

其他

  • 扩展在线demo

Favicon for 开源中国社区最新新闻 08:33 PHP 5.6.36, 7.1.17 和 7.2.5 正式发布,多项内容修复 » Post from 开源中国社区最新新闻 Visit off-site link

PHP 5.6.36, 7.1.17, 7.2.5正式发布了。PHP(PHP:Hypertext Preprocessor)是一种在电脑上执行的脚本语言,主要是用途在于处理动态网页,也包含了命令列执行接口(command line interface),或者产生图形使用者接口(GUI)程式。

版本主要还是修复 bug,改进日志如下:

PHP 5.6.36

- Exif:
  . Fixed bug #76130 (Heap Buffer Overflow (READ: 1786) in exif_iif_add_value).
  (Stas)

- iconv:
  . Fixed bug #76249 (stream filter convert.iconv leads to infinite loop on
    invalid sequence). (Stas)

- LDAP:
  . Fixed bug #76248 (Malicious LDAP-Server Response causes Crash). (Stas)

- Phar:
  . Fixed bug #76129 (fix for CVE-2018-5712 may not be complete). (Stas)


PHP 7.1.17

- Date:
  . Fixed bug #76131 (mismatch arginfo for date_create). (carusogabriel)

- Exif:
  . Fixed bug#76130 (Heap Buffer Overflow (READ: 1786) in exif_iif_add_value).
    (Stas)

- FPM:
  . Fixed bug #68440 (ERROR: failed to reload: execvp() failed: Argument list
    too long). (Jacob Hipps)
  . Fixed incorrect write to getenv result in FPM reload. (Jakub Zelenka)

- GD:
  . Fixed bug #52070 (imagedashedline() - dashed line sometimes is not visible).
    (cmb)

- iconv:
  . Fixed bug #76249 (stream filter convert.iconv leads to infinite loop on
    invalid sequence). (Stas)

- intl:
  . Fixed bug #76153 (Intl compilation fails with icu4c 61.1). (Anatol)

- ldap:
  . Fixed bug #76248 (Malicious LDAP-Server Response causes Crash). (Stas)

- mbstring:
  . Fixed bug #75944 (Wrong cp1251 detection). (dmk001)
  . Fixed bug #76113 (mbstring does not build with Oniguruma 6.8.1).
    (chrullrich, cmb)

- Phar:
  . Fixed bug #76129 (fix for CVE-2018-5712 may not be complete). (Stas)

- phpdbg:
  . Fixed bug #76143 (Memory corruption: arbitrary NUL overwrite). (Laruence)

- SPL:
  . Fixed bug #76131 (mismatch arginfo for splarray constructor). 
    (carusogabriel)

- standard:
  . Fixed bug #75996 (incorrect url in header for mt_rand). (tatarbj)


PHP 7.2.5

- Core:
  . Fixed bug #75722 (Convert valgrind detection to configure option).
    (Michael Heimpold)

- Date:
  . Fixed bug #76131 (mismatch arginfo for date_create). (carusogabriel)

- Exif:
  . Fixed bug#76130 (Heap Buffer Overflow (READ: 1786) in exif_iif_add_value).
    (Stas)

- FPM:
  . Fixed bug #68440 (ERROR: failed to reload: execvp() failed: Argument list
    too long). (Jacob Hipps)
  . Fixed incorrect write to getenv result in FPM reload. (Jakub Zelenka)

- GD:
  . Fixed bug #52070 (imagedashedline() - dashed line sometimes is not visible).
    (cmb)

- intl:
  . Fixed bug #76153 (Intl compilation fails with icu4c 61.1). (Anatol)

- iconv:
  . Fixed bug #76249 (stream filter convert.iconv leads to infinite loop on
    invalid sequence). (Stas)

- ldap:
  . Fixed bug #76248 (Malicious LDAP-Server Response causes Crash). (Stas)

- mbstring:
  . Fixed bug #75944 (Wrong cp1251 detection). (dmk001)
  . Fixed bug #76113 (mbstring does not build with Oniguruma 6.8.1).
    (chrullrich, cmb)

- ODBC:
  . Fixed bug #76088 (ODBC functions are not available by default on Windows).
    (cmb)

- Opcache:
  . Fixed bug #76094 (Access violation when using opcache). (Laruence)

- Phar:
  . Fixed bug #76129 (fix for CVE-2018-5712 may not be complete). (Stas)

- phpdbg:
  . Fixed bug #76143 (Memory corruption: arbitrary NUL overwrite). (Laruence)

- SPL:
  . Fixed bug #76131 (mismatch arginfo for splarray constructor). 
    (carusogabriel)

- standard:
  . Fixed bug #74139 (mail.add_x_header default inconsistent with docs). (cmb)
  . Fixed bug #75996 (incorrect url in header for mt_rand). (tatarbj)

下载链接:

Favicon for 开源中国社区最新新闻 08:24 每日一博 | 微服务开发中的数据架构设计 » Post from 开源中国社区最新新闻 Visit off-site link

微服务是当前非常流行的技术框架,通过服务的小型化、原子化以及分布式架构的弹性伸缩和高可用性,可以实现业务之间的松耦合、业务的灵活调整组合以及系统的高可用性。

Favicon for 开源中国社区最新新闻 08:24 如果开源领域里没有了这些软件,那我们还有什么? » Post from 开源中国社区最新新闻 Visit off-site link

如果我们平时使用的由国外开发者主导的开源项目被限制使用了,我们还有什么?

Favicon for 开源中国社区最新新闻 08:23 Kubernetes, OpenStack 等被闭源?我礼貌性地慌一下 » Post from 开源中国社区最新新闻 Visit off-site link

最近一段时间,有一种观点在流传,一些知名的开源软件有可能被闭源。起因是美国制裁某通讯厂商,制裁内容包括芯片和安卓系统。因为安卓系统是开源的,引起了一种论调,“开源的OpenStack、Kubernetes、Hadoop等软件是美国人发起的,美国政府只要愿意,随时也可以闭源!”

笔者认为这种观点是不正确的,相反,只有积极拥抱开源,才有话语权,才能有利于正真的实现自主可控!

这个问题需要分为几个层面来看:

1.被制裁的是安卓系统,不是安卓源代码

Android最初由安迪·鲁宾等人开发制作,于2005年7月11日被谷歌收购。随后,谷歌以Apache免费开放源代码许可证的授权方式,发布了安卓的源代码。

安卓系统实际分为三个部分:

  • 内核,实际是Linux内核上裁剪和开发,因为Linux内核使用的是GPL开源协议,GPL是具有传染性的开源协议,即对Linux内核的任何修改,也必须开源,这也是为什么Linux发行版都要开源的原因。

  • 安卓系统,谷歌以Apache许可证的方式发布了安卓源代码。

  • 谷歌的安卓应用,比如谷歌Play商店、Gmail、地图等,这部分是闭源的。

谷歌发行的原生版本包含以上三个部分,被制裁的实际是谷歌的安卓框架和应用,如果把安卓的内核和系统源代码拿来,去掉谷歌框架和谷歌的软件,理论上是可以使用的。

亚马逊的Kindle系统就是一个很好的例子,Kindle系统就是亚马逊深度定制的安卓系统,完全不依赖谷歌的安卓发行版。

另外,插一句,关于各种开源协议,阮一峰的博客上有一副图,非常形象,可以参考下:

080943_fLnW_2903254.png

2.开源是大势所趋

使用开源软件是大势所趋,根据中国信通院《开源治理白皮书》中的数据:

  • 开源软件市场应用广泛。据 Gartner 调查显示, 99%的组织在其 IT系统中使用了开源软件,同时开源软件在服务器操作系统、云计算领域、 Web 领域都有比较广泛的应用。

  • 开源软件市场规模稳居服务器操作系统首位。  全球公有云上运行的负载有 90% 是 Linux 操作系统。

  • 开源软件在云计算领域使用广泛。 2017《OpenStack User Survey》显示: 2017 年, OpenStack 全球部署将近 1000 次。

  • 2013 年 Docker 发布之后, 技术日渐崛起。截至 2014 年底,容器镜像下载量高达 1 亿;到 2017 年初,这一数量超过 80 亿。

  • 开源软件在 Web 领域占据主要市场份额。 根据 Netcraft《WebServer Survey》显示, 调查发现, Nginx 市场份额增加到 21.4%,较上一年增长 3.84%, 成为了面向 Web 的计算机市场上第三大服务器厂商。

开源软件在安全、敏捷、人才方面有巨大的优势,就连以前对开源嗤之以鼻的微软也一百八十度的大转弯,积极拥抱开源。

3.OpenStack、kubernetes 、Hadoop的运作模式是基金会模式,美国政府也难以干涉

主流的开源软件项目使用的都是基金会模式,OpenStack有自己的基金会,kubernetes属于CNCF基金会,Hadoop属于Apache基金会,Apache基金会托管了许多知名的开源项目。最知名的开源基金会应该是Linux基金会。这些开源基金会都采用相似的运作模式,以Linux基金会为例。

以下数据引用自维基百科。

Linux 基金会(英语:Linux Foundation,简称 LF),是一家非营利性技术贸易协会,致力于促进,保护和推进Linux和协同开发。它开始于2000年的开源码发展实验室(OSDL),并与自由标准组织(FSG)合并后从而成为现在的组织。Linux基金会赞助Linux创始人Linus Torvalds和主管维护者Greg Kroah-Hartman的工作,并由领导Linux和开源公司的支持,以及来自全世界的开发商 。

截至2017年1月,Linux基金会共有超过260多名企业会员:

  • 白金会员(12名)每个会员每年捐出50万美元,其中包括 (按字母顺序排列):AT&T[12], 思科系统, 富士通, 日立, 华为, IBM, 英特尔, 微软, 日本电气, 甲骨文公司, 高通, 三星电子

  • 黄金会员(19名)每个会员每年捐出10万美元

  • 白银会员(244名)每个会员每年捐赠5,000-20,000美元(按雇员数量增加)

基金会董事会成员由公司会员选举(付费高的会员选举更多董事)。开源基金会的运行类似联合国,任何的决议都需要董事会投票,是博弈的结果,基金会的运行只要不违法,美国政府也不能干预。

从上面的数据可以看出,开源社区是全球开发者民间自发创新行为,开源项目(如Linux项目)和基于开源的商业化产品(如红帽的企业版RHEL产品)是两回事,前者不受商业争端和政治行为的影响,所以不存在所谓“闭源”的风险,即使把开源项目产品化,也必须遵守相关的开源协议(红帽的RHEL也是开源的),把中美商业争端和开源闭源放在一起,是一种误导,是对开源协议和开源组织的运作方式不了解。

在法律层面,已经销售License和服务的商业化软件产品的用户使用权是受到法律保护的。知识产权也是受到法律保护的。

4.要增加在开源组织中的话语权,解决方法就是积极参加

要增加在开源组织中的话语权,解决方法就是积极参加,国内这方面做得比较好的就是华为,笔者查了下相关的资料,华为是多个开源基金会的高级会员。

高级会员有能力更进一步的参与开源基金会决策,比如美国时间4月17日,全球顶级开源社区Cloud Native Computing Foundation(云原生计算基金会,以下简称CNCF)正式宣布了基金会的技术监督委员会(Technical Oversight Committee,下称TOC)席位改选结果, 华为和Google进入TOC。这是华为首次,也是亚洲首家公司获得CNCF TOC成员席位。 

TOC决定CNCF社区的技术走向,CNCF基金会层面由TOC定义和维护云原生领域技术愿景,对CNCF下所有的项目进行生命周期管理,如项目的创立、毕业、合作、终止等、接受用户委员会的需求与建议,并交由旗下各个项目组来承载和实现,基于代码标准化通用的接口和实践。这样,CNCF TOC在基金会层面从整体技术堆栈角度,自上而下的给予每个项目大颗粒的技术指导,每个项目再根据自己的实际情况做自下而上的技术决策。

另外,在开源项目的代码贡献上,华为也是国内无可争议的第一,根据《2017Linux开发者报告》,华为的代码贡献排名第15名,是前20名中唯一进入的中国公司。

另外,华为还参与了许多开源组织,还是一些开源组织的创始会员,贡献了很多代码。

华为对海思芯片的投入,充分证明了华为的远见卓识。华为对开源项目不计成本的投入,也不断的看到效果,华为在参与的开源组织中有很强的话语权。

5.使用开源软件做自己商业发行版是很好的模式

很多公司,针对基于开源项目,做了自己的商业化产品,是在开源的基础上,基于工程化要求和运营的要求做了改进和产品化。最知名的就是红帽,通过发行Linux的商业产品,一方面服务了用户需求,一方面反过来成为重量的Linux代码贡献者,可以说Linux项目离开红帽将逊色不少。

那么华为为什么要在开源项目上如此投入,笔者认为答案就是华为云。互联网业务的云基础设施1.0以计算、存储、网络等资源型服务为主,在新型互联网业务的推动下,目前互联网业务云基础设施进入2.0时代,云计算服务商开始广泛提供容器、AI、大数据、DevOps等能力型服务,从资源服务向能力服务转型。

在互联网云基础设施2.0时代,云服务多建立在多个开源项目上,尤其是容器,容器是提升企业高效迁移部署、快速迭代开发的和应用上云后自动化运维最佳选择,目前业界都认可的容器项目就是Kubernetes,而华为则在Kubernetes创新方面走在了其他厂商的前面。实际上,华为与Kubernetes的渊源颇深,早在Kubernetes刚开源的时候,华为就以社区创始成员及白金会员的身份加入其中。目前,华为拥有1个SteeringCommittee席位和5个Maintainer席位。所以,在互联网云基础设施2.0时代,企业和政府向云转型的时候,华为云有非常强大的优势。

大中型企业客户面临数字化转型诉求。华为在过去三十年一直是服务全球的企业,华为云提供一个包含公有云在内的混合云的解决方案可能是今天企业最好的选择。同时华为云有全球非常强大的线上和线下服务团队,所以在互联网云基础设施2.0的时代,企业和政府向云转型的时候,华为云有非常强大的优势。

可见在开源的投入上,华为再次体现了远见和大局观,通过在开源项目上的投入和布局,华为将在基础设施软件上构筑优势,注入自己的思路,从而更好的为自己的云服务,将具有主动权,源于开源,高于开源。

总结

使用开源软件是大势所趋,OpenStack、Kubernetes、Hadoop这样的软件不仅不会闭源,并且会沿着目前的方向坚定的走下去,只有像华为这样积极拥抱开源,切切实实深度理解开源,才能让开源更好的为中国服务,在开源的基础上实现真正的自主可控。

正是因为开源项目的内在机制,基于开源的商业化产品是安全和有发展保障的。美国提出对华的高科技产品的“禁售”的风险,正是国家前几年大力推行和强制要求提升IT基础设施国产化率的必要性。这个工作刻不容缓,IT产品国产化刻不容缓!!源于开源,高于开源的理念,正是国产化的驱动力。

来源:云技术实践

Favicon for 开源中国社区最新新闻 08:23 高手问答 | 2018 年,我该如何学习 React 以及进阶 » Post from 开源中国社区最新新闻 Visit off-site link

OSCHINA 本期高手问答(4 月 25 日 - 5 月 1 日)我们请来了徐超@艾特老干部 和大家一起探讨关于使用 React 进行前端开发的问题。

Favicon for 开源中国社区最新新闻 08:23 码云推荐 | 基于 Spring-WebFlux 的配置中心 DuiC » Post from 开源中国社区最新新闻 Visit off-site link

配置中心 DuiC 的设计目标是统一不同应用的配置管理方式,打造更人性化的配置编辑方式,提供更灵活的配置获取方式

Favicon for 开源中国社区最新新闻 08:23 Tabler —— 基于 Bootstrap4 的 HTML 仪表盘 UI 套件 » Post from 开源中国社区最新新闻 Visit off-site link

Tabler 是一个基于 Bootstrap 4 开发的 HTML 仪表盘 UI 套件,旨在提供一个用户友好,清晰简单的管理面板,可适用于简单和复杂的网站系统。

Favicon for 开源中国社区最新新闻 08:21 Eclipse 基金会:Jakarta EE 将专注 Cloud Native 发展 » Post from 开源中国社区最新新闻 Visit off-site link

Eclipse 基金会正在为 Jakarta EE 制定路线图,Jakarta EE 是由 Java EE 衍生而来的社区主导平台,这是多年来企业系统的首选平台。 当 Java EE 从 Oracle 转移到 Eclipse Foundation 时,决定将其重命名,社区最终选择 Jakarta EE,是引用自现已退役的 Apache Jakarta 项目。

Eclipse 基金会刚刚在 1800 多名 Java 开发人员中完成一项“开发人员希望从 Jakarta EE 获得新技术功能”的调查。 受访结果显示,开发人员主要想改进的三个领域是:

  • 支持微服务

  • 与 Kubernetes,Docker 和其他容器平台进行本地集成

  • 加快创新步伐

Eclipse 基金会执行总监 Mike Milinkovich 说:“Jakarta EE 的使命是增加发布频率,降低参与障碍,并让社区重返平台。”在社区的第一次投票中,反馈非常具体,开发人员正在寻求更多的云原生(Cloud Native)支持企业 Java 系统。 这意味着不仅要继续发展像 Eclipse MicroProfile 这样的流行项目,还要探索与云原生堆栈中的其他项目的集成等。

因开发者期望的亮相改进都集中在云原生(Cloud Native)开发上,因此 Jakarta EE 发展的重点之一将是启用云原生(Cloud Native) Java。 它还将创建一个新的治理模式,为 Jakarta EE 社区引入新成员。

原文:SDTimes  编译:开源中国

Favicon for 开源中国社区最新新闻 08:21 ChromeOS 终端应用程序暗示其即将支持 Linux 应用 » Post from 开源中国社区最新新闻 Visit off-site link

Chromebook也可以运行Linux程序。这种可能性在去年2月已经暗示,但随着终端应用程序在Chrome操作系统的开发通道中出现,这种情况可能会很快到来。目前讽刺的是,这种基于Linux的Chrome操作系统不支持运行Linux应用程序,就像使用Linux内核的Android一样,Google也对它进行了修改,以至于几乎没有Linux的外表。

但是在即将到来的整合过程中,Chrome操作系统可能会很快直接运行Linux软件,并将操作系统和Chromebook开放给教育或企业以外的用例。目前,一些Reddit用户发现并确认,Chrome操作系统最新测试版附带了终端应用程序,并且宣传新版本可以运行您最喜爱的本机应用程序和命令行工具,同时警告需要200 MB下载来安装这个终端应用程序。

但是,目前单击“安装”仅以失败告终。事实上,已经有一个终端应用程序可以安装,这意味着该功能已经接近可用,至少对于alpha和beta测试来说。这个200 MB的软件包证实了这个Linux实现基于虚拟机,几乎与我们几个月前听到的“Crostini”相同。这种虚拟机策略实际上与微软用Windows Linux子系统完成的策略类似。、

Chrome OS上的Linux支持的到来改变了操作系统的叙述。主要针对学校和办公室使用,这可能会让Chrome OS分支出一个新的开发者市场。特别是那些只需要Web浏览器和一些基于Linux的工具来创建像Web应用程序这样的软件开发者。

173225_73hi_2903254.png

173240_VX7T_2903254.png

173300_x4Nv_2903254.png

来源:cnBeta.COM

Favicon for 开源中国社区最新新闻 08:20 Node.js 10.0.0 正式发布,带来大量改进和修复 » Post from 开源中国社区最新新闻 Visit off-site link

Node.js 10.0.0 正式发布,这是自 Node.js Foundation 开展以来的第七个主要版本,并将在 2018 年 10 月成为下一个 LTS 分支。

新版本自带定制化的 Node-ChakraCore 引擎,其功能亮点包括:

  • 全面支持 N-API

  • 可轻松通过新的 Visual Studio Code Extension 进行 Time-Travel 调试

  • 支持 TTD 的生成器和异步函数

  • 支持 Inspector 协议

  • 增强稳定性和其他各种改进

Node.js 10.0.0 还包含以下更新:

  • N-API native addons API 已从实验状态毕业

  • Async_hooks

    • 过时的实验性 async_hooks API 已被删除

  • Child Process

    • 忽略未定义的 env 属性。

  • Console

    • 新增 console.table() 方法。

  • Crypto

    • crypto.createCipher() 和 crypto.createDecipher() 方法已被弃用,并被 crypto.createCipheriv() 和 crypto.createDecipheriv() 替代。

    • decipher.finaltol() 方法已弃用。

    • crypto.DEFAULT_ENCODING 属性已弃用。

    • 新增 ECDH.convertKey() 方法。

    • crypto.fips 属性已弃用。

  • Dependencies

    • V8 已升级至 6.6 版本。

    • OpenSSL 升级至 1.1.0h 版本。

完整更新内容请查阅发行说明:

下载地址:

Favicon for 开源中国社区最新新闻 08:18 OSChina 周三乱弹 —— 同志,你这个书签掉毛严重啊 » Post from 开源中国社区最新新闻 Visit off-site link

招呼同事喝碳酸饮料。 同事(摸摸肚子):不了吧,这个热量太高,怕胖 我:这个是冷饮啊,怎么会热量高呢! 同事:………………你说得有道理,走!

Favicon for 开源中国社区最新新闻 08:18 Heptio 开源 Gimbal,用于 Kubernetes 的负载均衡器 » Post from 开源中国社区最新新闻 Visit off-site link

Heptio 是一家容器公司,由 Kubernetes 项目共同创办人 Craig McLuckie  和 Joe Beda 于 2016 年创办。

Gimbal 由 Heptio 与雅虎日本子公司 Actapio 一起开发,旨在帮助企业将流量引入 Kubernetes 集群和 OpenStack 部署。

许多企业现在都在同时运行这些技术,而有些企业现在已经超越了 OpenStack,并转向了更多以 Kubernetes 为中心的架构,但他们不可能在短期内放弃 OpenStack 的投资。

Gimbal 建立在 Kubernetes 和 Heptio 的 Kubernetes Ingress 控制器 Contour 的基础之上,为各种 Kubernetes 集群和混合环境提供简单灵活的负载平衡平台。

这个负载均衡解决方案可以让公司更容易地转换到 Kubernetes,即使他们已经拥有像 OpenStack 这样的现有解决方案。 开发人员可以跨 OpenStack 和 Kubernetes 管理多个集群入口,并且,Heptio 承诺会开发更多选项。

原文:TechCrunch  编译:开源中国

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:02 架构、测试、安全、大数据:宜人贷金融科技面面观 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

4月20日-22日,QCon全球软件开发大会在北京召开,宜人贷与大会主办方极客邦科技共同打造“金融科技的创新实践”宜人贷技术专场,为金融、互联网行业对金融科技感兴趣的从业者呈现“业务高速发展下的互联网金融系统架构演进”、“前后端自动化测试前置的实践与落地”、“互联网场景下的办公网安全”、“数据驱动金融科技:从营销到反欺诈”四场主题分享,并通过“我的技术管理之道”圆桌对话,为技术人进阶管理提供建议。

By 张晓楠
Favicon for 开源中国社区最新新闻 08:01 IntelliJ IDEA 2018.1.2 发布,改进对 Spring Boot 的支持 » Post from 开源中国社区最新新闻 Visit off-site link

IntelliJ IDEA 2018.1.2 已发布,这是 IntelliJ IDEA 2018.1 系列的第二次小更新。

针对 IntelliJ IDEA 2018.1 推出的新功能 partial Git commits ,新版本做了几个修复和完善:

  • Fix for wrong diff preview for the partial Git commit: IDEA-188650

  • The IDE supports the partial Git commit feature with old Git versions (1.x): IDEA-188681

  • The ability to deselect files with the line-ending changes in the Commit Changes dialog: IDEA-189369

并改进对 Spring Boot 的支持:

  • Access HTTP request mappings from the editor via the new REST client doesn’t require a configured web facet: IDEA-189086.

  • The IDE now supports several new Spring Boot annotations: @ConditionalOnManagementPort@ConditionalOnEnabledInfoContributor@ConditionalOnEnabledHealthIndicator.

  • The IDE finds @ConfigurationProperties bean properties usages in the dependent modules.

修复了几个重要的 issues,包括:

  • Fix for the high memory consumption of Git indexing for shallow clones: IDEA-178016.

  • Fix for the extremely wide, not-resizable Commit Changes dialog in case of a long error message: IDEA-141136.

  • The Commit Changes dialog doesn’t automatically scroll back and forth while clicking: IDEA-188502.

  • The debugger now evaluates complex expressions with JDK 9.

  • The stream debugger now works with JDK 9.

此外,还将 JDK 升级至 1.8.0_152-release-1136-b29 版本:

  • Performance has been improved for Version Control Log scrolling: JRE-690

  • Horizontal grey lines in every window in IntelliJ IDEA were eliminated: JRE-711

完整的 IntelliJ IDEA 更新日志:

下载地址:

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 物联网技术周报第 134 期: 智能音箱 Alexa 与 Arduino 制作家门口的安全快递柜 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

智能音箱 Alexa 与 Arduino 制作家门口的安全快递柜;使用 IoT 技术创建简单而有趣的加速计游戏;车纷享:基于阿里云 HBase 构建车联网平台实践;联发科与微软合作推出物联网专用芯片组;Facebook 新研究成果:通过手臂皮肤震动阅读文字;靠近物联网 微软发布定制 Linux 内核;Qualcomm 发布专门面向物联网终端的视觉智能平台 集成摄像头、人工智能和计算机视觉领域的最新技术;阿里全资收购中天微 力主研发AI“中国芯”

By 黄峰达
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 从Catchpoint的调查结果看网站可靠性工程师的工作 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

和软件工程师一样,网站可靠性管理工程师需要负责IT运营,2003年Google就推出了这一设想,2016年Google推出了《网站可靠性管理,Google如何运营生产系统》一书,详细介绍了这一方面内容。网站监测服务公司Catchpoint最近调查了416名网站可靠性管理工程师(SRE),希望借此了解SRE的具体工作。

By Helen Beal Translated by 刘嘉洋
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 JDK 11版本时间表 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

Oracle首席架构师Mark Reinhold最近提出了将于2018年9月发布的JDK 11 GA版本的时间表。JEP-320的新功能之一是移除可能会破坏现有应用程序的Java EE和CORBA模块。

By Michael Redlich Translated by 无明
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 08:00 QCon北京2018圆满结束,探索前沿技术最佳实践 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
logo_bigger.jpg

由极客邦科技与 InfoQ 中国主办的 QCon全球软件开发大会,于 2018年4月20 日 - 22日在北京国际会议中心举办。本次大会特邀 200 多位国内外技术专家,与 2000 余名技术管理者、架构师共同分享和交流新技术在行业应用中的最新实践,助力企业技术选型、业务升级与顺利转型。

By 师海君
Favicon for 开源中国社区最新新闻 07:55 Appium 1.8.0 发布,全面支持 W3C WebDriver 规范 » Post from 开源中国社区最新新闻 Visit off-site link

Appium 是一个开源、跨平台的自动化测试工具,最初主要用于测试原生和轻量移动应用,包括 iOS 和 Android ,目前还支持对 Windows 平台上的应用的自动化测试。

Appium 1.8.0 发布,引入了对 W3C WebDriver 规范的全面支持,以及:

  • 对 NodeJS 版本的最低要求更改为 NodeJS 6

  • 新增获取和设置剪贴板内容、获取全屏截图、应用管理等方法

  • 通过缓存 URL 来更有效地下载应用

  • moveTo 触屏操作中的所有操作现在都将坐标视为绝对坐标

  • 支持 iOS 11.3/Xcode 9.3

  • 支持 Android P (API Level 28)

  • iOS:新增录屏功能

  • iOS:新增对复杂手势的支持

  • iOS:修复在模拟器上处理自定义 SSL 证书的问题

  • iOS:新增性能测量

  • Android:允许通过设置禁用通知

  • Android:支持 deep linking 和 Android Instant Apps

更多更新细节请查阅 changlog

下载地址:

Favicon for 开源中国社区最新新闻 07:53 高性能 HTTP 服务器/客户端 http-kit 2.3.0 发布 » Post from 开源中国社区最新新闻 Visit off-site link

http-kit 是一个简约的、事件驱动的高性能 Clojure HTTP 服务器/客户端库。

2.3.0 是一个主要版本,不包含突破性更改(breaking change),但开发团队建议在生产中使用前先进行评估和测试,以免出现问题。

更新内容:

  • Client: 回调函数新增死锁保护,且默认启用 (若出现问题,可在 :deadlock-guard? 选项禁用)

  • Client: 现在有独立的 :connect-timeout 和 :idle-timeout 选项

  • Client: multipart messages 支持数字,并抛出未知的 multipart 参数类型

  • Client: :proxy-host, :proxy-port 已被 :proxy-url 替代

  • Client: 允许自定义 SSLEngine 配置

  • Client, server: 新增添加指标/日志工具

  • Server: 新增 :worker-pool 选项

  • Server: 补齐缺失的 'MKCOL' http 方法枚举

  • Server: 将 getCount 方法添加至 BytesInputStream

更多修复和改进可查阅更新日志

下载地址:

Favicon for 开源中国社区最新新闻 07:52 iTerm2 发布 3.1.6 版本,MacOS 终端模拟器 » Post from 开源中国社区最新新闻 Visit off-site link

iTerm2 已发布 3.1.6 版本,这是一款用于 macOS 的终端模拟器。

iTerm2 是 iTerm 的后继者,也是 Terminal 的替代者。支持窗口分割、热键、搜索、自动补齐、无鼠标复制、历史粘贴、即时重播等功能特性,适用于 MacOS 10.10 及以上版本。

3.1.6 带来了一些新特性:

  • 帮助菜单新增显示第三方许可证的选项。

  • 状态栏菜单新增隐藏会话功能。

  • 新增取消重启会话确认选项。

  • 新增对 OSC 10 和 OSC 11 的支持。

  • 将 F21-F24 添加到触摸栏。

  • 新增基于 GPU 的 Metal 渲染器(正在开发中,默认关闭)。

另外还包括一些 BUG 修复和其他改进,完整的更新细节请查阅:Changelog

下载地址:

Favicon for 开源中国社区最新新闻 07:42 PySolFC 2.2.0 发布,超过 1000 款纸牌游戏的集合 » Post from 开源中国社区最新新闻 Visit off-site link

PySolFC(PySol Fan Club edition)是一个用 Python 编写的纸牌游戏集合,目前已包含了超过 1000 款的纸牌游戏。该项目fork 自已停止维护的 PySol Solitaire,旨在持续清理代码、添加功能、修复错误等。

PySolFC 2.2.0 是最新的稳定版本,上一个稳定版本是 2009 年发布的 2.0 ( 2.1.0 被归为测试版本)。新特性包括:

  • 兼容 Python 3.x 和 Python 2.7 。

  • 支持 Kivy UI 工具。

  • 新增 Windows 二进制安装包。

  • 支持 Black Hole 和 All in a Row 。

  • 存储库新增测试套件和 CI 。

了解更多详情可查阅发行说明

164515_aQGl_2896879.png

下载地址:

Favicon for 开源中国社区最新新闻 07:37 automerge 0.7.7 发布,构建协作应用的数据结构库 » Post from 开源中国社区最新新闻 Visit off-site link

automerge 0.7.7 已发布,该版本主要是移除了用户反映影响构建的 babel-polyfill #87 。

automerge 是一个用于在 JavaScript 中构建协作应用程序的数据结构库。

设计原则

  • 网络不可知论者。Automerge 是一个纯粹的数据结构库,不关心你使用的是什么类型的网络。

  • 不变的状态。Automerge 对象在某个时间点是应用程序状态的不可变快照。无论何时进行更改,或者合并来自网络的更改,都会返回一个反映该更改的新状态对象。

  • 自动合并。Automerge 是所谓的无冲突复制数据类型(CRDT),它允许在不需要任何中央服务器的情况下自动合并不同设备上的并发更改。

  • 相当便捷。已经在 Node.js,Chrome,Firefox 和 Electron 上进行测试。

下载地址:

Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 07:33 文章: GrowingIO 联合创始人 & CTO 叶玎玎:首席增长官 —— 技术管理者应该知道的那些事 » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
kafak-1524505874462.jpg

什么是首席增长官?对 CTO 的挑战在哪里?我们又该如何应对挑战?

By 叶玎玎
Favicon for 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! 07:25 文章: 技术漫谈:为何KPI毁了索尼,而OKR却成就了谷歌? » Post from 未注册用户的 InfoQ 个性化 RSS Feed - 请注册后升级! Visit off-site link
GettyImages-671039130-1512649078720-1524

从技术 leader 的角度出发,看技术人绩效考核的痛。大多数公司里面总会因为 KPI 的考核方式而存在各种各样的问题,OKR 是一个在硅谷互联网公司比较流行的做法。怎样去理解 OKR 这个概念,并在技术团队中推行,从而使绩效考核更合理也更有意义?

By 李运华

News stories from Tuesday 24 April, 2018

Favicon for 小众软件 - Appinn 16:26 如何批量整理 Chrome 的书签 – Bookmark Sentry » Post from 小众软件 - Appinn Visit off-site link

浏览器用的时间久了,难免会积累许多书签,如何整理是一个让人头疼的问题,不过,现在有了 Bookmark Sentry “书签哨兵”,一切难题都迎刃而解。@Appinn

评论区看到有人问的,所以再发一下.

首先,Chrome 商店里已经没有这款扩展了,需要的可以从这里下载,百度网盘,这里还有一个汉化包,百度网盘

汉化包用法:放入下面的路径解压覆盖即可。

Browser\Chrome\User Data\Default\Extensions\bdglbbcbmgnimogcmcdenggkpdmihlga\1.7.13_0 

记得先备份书签!

下面,我来具体说一下用法,先选择首选项,可以根据自己的需求来选择,建议默认方式

扫描模式,可以选择第三个,即检查坏连接和重复

线程数选择可以适当增加一点,建议选择5线程

OK,都选择好了,就可以点击 开始扫描了

下面就静静的等待扫描结果了,建议扫描过后,自己手动删除,防止误删!

记得先备份!


相关阅读


©2017 行者无疆 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for ITeye资讯频道 13:00 七行JSON代码将你的网站变成移动应用 » Post from ITeye资讯频道 Visit off-site link
引用
作者|Ethan
译者|大愚若智
编辑|覃云

本文介绍了借助 Jasonette 将 Web 视图和原生组件融合构建真正“混合”应用的做法。
668d234c-d492-3d4b-846a-c4f650e1b0b4.jpg

如果我告诉你,只需要 上述 7 行橙色的 JSON 代码 就可以将一个网站变成移动应用,你相信吗?完全不需要使用某种框架 API 重写网站,就可以获得与移动应用相同的行为。如果你已经有一个现成的网站,只需要简单地引用 URL 就可以将其“打包”为原生应用。

而如果在此基础上,只需要略微调整 JSON 代码内容,就可以直接访问所有原生 API、原生 UI 组件以及原生视图切换(View Transition)。

最简化的范例效果如下图所示:
54ffd433-b07b-3cc1-bb1a-5e98968c7ddd.gif

从中可以看出,我嵌入了一个 GitHub.com 的 Web 页面,但界面上其余布局均为原生 UI 组件,例如 导航条 以及 底部的标签栏。而我们并不需要使用任何 API 重写网站,就可以自动获得原生的切换效果。

在介绍具体做法前你可能会问:“看着挺酷,但除了在原生应用框架内展示 Web 页面之外,这种技术还有什么意义?”

问得好!这也是本文要讲的重点。我们只需要创建一个无缝的 Web 视图与应用间双向通信,借此,父应用就可以触发 Web 视图内的任何 JavaScript 函数,随后 Web 视图即可从外部调用原生 API。

例如:
d4734f0c-d7c3-315b-89a4-77e001412ba2.gif

请注意,这个视图包含:
  • 原生导航条,以及内置的切换功能
  • 一个 Web 视图,其中嵌入了一个可以生成二维码的 Web 应用
  • 在底部包含一个原生的文字输入组件
上述所有这一切只需要略微调整 JSON 代码的属性即可实现。

最后请注意,随着在文字输入区输入不同内容,二维码也会产生相应变化。输入的文字可触发二维码生成器 Web 应用内部的 JavaScript 函数重新生成二维码图像。

目前还没有任何一个开发框架曾试图从根本上解决“Web 视图与原生应用无缝集成”的问题,因为这些框架都专注于完全原生,或完全 HTML5 的做法。

无论什么时候当我们听到有人讨论移动应用的未来时,很可能会听到类似“到底是 HTML5 还是原生方法会最终胜出呢?”这样的说法。

似乎没人觉得native和html可以共存,而且二者的协同和最终实现似乎也并不容易。

本文我将要介绍:
  • 为何 Web 引擎与原生组件的融合通常是一种更好的做法。
  • 为何 HTML 与原生的无缝集成那么难,具体又该如何实现。
  • 更重要的是,该如何使用这样的技术快速构建自己的应用。
为何要在原生应用中使用 HTML?

在进一步介绍前,首先一起看看这样做是好是坏,以及什么时候适合使用这种方法。这种做法的一些潜在用例如下:

1. 使用 Web 原生功能

应用中的部分内容使用 Web 引擎来实现也许是一种更适合的做法。例如 WebSocket 是一种原生的 Web 功能,主要面向 Web 环境而设计。这种情况下就更适合使用内建的 Web 引擎(iOS 的 WKWebView 以及 Android 的 WebView),而非安装某些只能“模拟”WebSocket 的第三方库。

无需额外安装任何代码,使用免费工具即可实现目标,这样岂不是更好。同时这也催生了下一个原因。

2. 避免二进制文件体积过大

有些功能也许需要借助庞大的第三方库,而你可能希望能快速用上这样的功能。

例如,为了以原生方式包含二维码图像生成器,可能需要安装某些第三方库,这会导致二进制文件体积增大。但如果使用 Web 视图引擎并通过一个简单的<script src>调用 JavaScript 库,就可以免费实现这一切,并且避免了使用第三方原生库。

3. 缺乏可靠的移动库

对于一些前沿技术,可能暂时并不具备稳定可靠的移动端实现。

好在大部分此类技术都具备 Web 实现,因此最高效的集成方法就是使用 JavaScript 库。

4. 构建部分原生,部分基于 Web 的应用

很多新手开发者想要将自己的网站移植为移动应用,但在发现自己现有网站的部分功能过于复杂,无法面向每种移动平台快速重写时,往往会感到沮丧或受挫。

例如你可能有一个非常复杂的 Web 页面无法快速转换为移动应用,但网站的其他内容可以很容易地转换。

面对这种情况,如果通过某种方法将应用的大部分内容以原生方式构建,对于特别复杂的页面直接将其以 HTML 的形式无缝集成到应用中,是不是很棒啊。

这是如何实现的?

A. Jasonette

Jasonette 是一种基于标记语言,构建跨平台原生应用的开源方法。

该技术看似 Web 浏览器,但并不会将 HTML 标记语言解释为 Web 页面,而是会将 JSON 标记解释为 iOS 和 Android 上的原生应用。

正如所有 Web 浏览器都有完全相同的代码,但只要按需解释不同类型的 HTML 标记,即可为用户提供所有不同类型的 Web 应用,所有 Jasonette 应用也有着完全相同的库,可按需解释不同类型的 JSON 标记并创建出你的应用。开发者完全无需触及代码本身,只需要编写标记,将代码实时“翻译”为原生应用,即可开发出自己的应用来。

虽然 Jasonette 的核心作用在于构建原生应用,但本文的重点在于介绍如何将 HTML 集成到核心原生引擎中,接下来就一起了解一下吧。

B. Jasonette Web 容器

原生应用很棒,但有时候我们依然需要使用 Web 功能。

但 Web 视图与原生应用的集成是个麻烦的过程。无缝的集成要求:
  • Web 视图应作为原生布局的一部分进行集成:Web 视图应作为原生布局的一部分纳入应用中,并且操作方式应与其他任何原生 UI 组件保持一致。否则会让用户感觉很笨拙,并且感觉上就像自己实际上是在访问网站那样。
  • 父应用可以控制子 Web 容器:父应用应能随意控制子 Web 视图。
  • 子 Web 容器可触发父应用的原生事件:子应用应该能触发父应用的事件以运行原生 API。
这是一个非常繁重的工作,因此先从第一个环节着手介绍:直接将 Web 容器嵌入原生布局 —并将其作为第 1 版发布:

JSON Web 容器,JSON 中的 HTML 将变为原生应用组件。

仅这一点就已经很实用了,但由于无法交互,依然存在一定的局限。

父应用无法控制子 Web 容器,子容器无法向父应用发送任何事件通知,这 导致 Web 容器与外界完全隔离。

C. Jasonette Web 容器 2.0:使其可交互

发布第 1 版之后,我们开始处理第二个问题:为 Web 容器添加交互能力。

下文将介绍如何为之前创建的静态 Web 容器添加交互能力,让它变得更强大。

实现:交互式 Web 容器

1. 通过 URL 加载

问题

之前在第 1 版中,为了使用 Web 容器作为后台视图组件,我们首先需要将$jason.body.background.type设置为"html",随后在$jason.body.background.text属性下添加硬编码的 HTML 文本,例如这样:
41ea03b7-b47e-3101-8d92-609003e9d663.png

一般来说,人们往往更希望直接使用 Web URL 对容器进行实例化,而不希望将整个 HTML 代码以硬编码的方式作为一行代码加入。

解决方案

Web 容器 2.0 增加了url属性,我们可以嵌入file://形式的本地 HTML,例如这样(可以从伴随应用发布的本地 HTML 文件加载):
7c4e9db4-32d0-3894-b80f-d477f672968d.png

或者也可以嵌入远程的http[s]:// URL,例如这样(可以从远程 HTML 加载):
e13b7f87-85a5-3021-b1b7-281a4ca5151a.png

2. 父应用与 Web 容器的双向通信

问题

之前,Web 容器只能用于展示内容,无法交互。这意味着 下列做法全部无法实现:

  • Jasonette 到 Web 容器的通信:从 Jasonette 中调用 Web 容器内部的 JavaScript 函数。
  • Web 容器到 Jasonette 的通信:从 Web 容器代码中调用原生 API。
此时我们只能展示 Web 容器的内容。这就像网页中嵌入的 iframe 框架,主页面完全无法访问 iframe 框架中的内容。

解决方案

Jasonette 最大的目标在于设计一种可以描述跨平台移动应用的标准化标记语言。因此我们需要这个标记语言能够全面地描述父应用和子 Web 容器之间的双向通信。

为此我在父应用和子 Web 容器之间使用了一种基于 JSON-RPC 的通信管道。由于 Jasonette 中的一切都是通过 JSON 对象表达的,因此使用 JSON-RPC 标准格式作为通信协议就成了一种非常自然合理的方式。
1e5146fb-6783-36e8-9a61-3977bf647997.png

为了让 JavaScript 函数能够调用 Web 容器,需要声明一个名为$agent.request的操作:
cc86edb3-83d5-3c1b-9650-d24d0cd3968c.png

$agent.request 是一种原生 API,可触发 JSON-RPC 请求并发送给 Web 容器。为了使用该 API,必须将options对象作为参数传递。

options对象实际上是发送给 Web 容器的 JSON-RPC 请求。每个属性的含义如下:
  • id:Web 容器构建在一种名为 Agent 的底层架构基础上,通常来说,我们可以为一个视图使用多个 Agent,每个 Agent 可以有自己的唯一 ID。但 Web 容器是一种特殊类型的 Agent,只能使用 $webcontainer 作为 ID,因此这里需要使用 ID。
  • method:要调用的 JavaScript 函数名称。
  • params:传递给 JavaScript 函数的参数数组。
因此完整来看,所用的标记应该是类似这样的:
288c360f-cca5-37d0-91de-c04f9a6fcfa4.png

这串标记实际上是在说:

当视图加载($jason.head.actions.$load)时,向 Web 容器 Agent 发送一个 JSON-RPC 请求($agent.request),而具体的请求是通过options指定的。

Web 容器在 $jason.body.background 下定义,本例中将会加载一个名为file://index.html的本地文件。

随后会查找一个名为 login 的 JavaScript 函数并传递params下的两个参数("alice"和"1234")。
b884a8ce-a281-3382-b7cb-39eab1ca7c05.png

上文介绍了父应用如何触发子 Web 容器的 JavaScript 函数调用,我们还可以反着来,让 Web 容器触发父应用的原生 API。

详情请参阅 Agent 文档。

Agent 文档: https://docs.jasonette.com/agents/

范 例  

继续回到上文介绍的二维码生成器范例:
78f24231-a4fa-3c81-bcdd-60985c725330.gif

  • 其中 底部的文字输入组件是 100% 原生的。
  • 二维码由 作为 Web 应用运行 的 Web 容器生成。
  • 当用户输入内容并按下“生成”,将调用 Web 容器 Agent 中的$agent.request操作,进而调用 JavaScript 函数“qr”。
具体示例可以参阅:
https://github.com/Jasonette/Jasonpedia/blob/gh-pages/webcontainer/agent/fn/index.json

3. 脚本注入

问题

有时候我们可能需要在 Web 容器完成初始 HTML 加载后,动态地将 JavaScript 代码注入 Web 容器。

假设要构建一个自定义的 Web 浏览器应用,我们可能希望将自己的自定义 JavaScript 注入到每个 Web 视图,借此定制 Web 视图的行为,这有点类似于 Web 浏览器的扩展。

就算不需要构建 Web 浏览器,当希望为所包含的内容不由我们控制的 URL 实现自定义行为时,同样需要使用脚本注入的方法。原生应用和 Web 容器只能通过$agent API 通信,但如果无法更改 HTML 内容,只能通过动态注入的方式将$agent接口加入 Web 容器。

解决方案

正如上文所述,$jason.body.background这个 Web 容器也是一个agent,这意味着我们可以使用与普通 Agent 完全相同的 $agent.inject 方法。
3cec1cde-cc76-36cd-b0d4-8575f9bbb24a.png

4. 对 URL 点击的处理

以往,Web 容器只能通过两种方式处理链接点击操作:
  • 只读:将 Web 容器视作只读的,忽略所有诸如触控或滚动等事件。此时所有 Web 容器都是只读的,除非明确令其表现得像是普通浏览器,具体做法见下文。
  • 普通浏览器行为:像是普通浏览器那样,允许用户与页面交互。为此需要进行声明,将"type": "$default"设置为action属性。
问题

两者均为 “全无或全有(All or nothing)”解决方案。
  • 对于“只读”,Web 容器会忽略用户的所有交互操作。
  • 对于“普通浏览器行为”,Web 容器的表现将与浏览器一致。点击链接后,将像普通网页那样刷新页面展示链接内容,但无法劫持该点击并调用其他原生 API。
解决方案

通过使用新的 Web 容器,可以将任何action附加到$jason.body.background这个 Web 容器,进而处理链接点击之类的事件。
1d232018-9aeb-33f5-86f6-c4547ca65ac3.png

一起看一个例子:
3465cb65-5858-39ce-804f-9a7864f8e2a7.png

在这里我们为 Web 容器附加了"trigger": "displayBanner",这意味着当用户点击 Web 容器内的任何链接后,将触发displayBanner操作,而非直接交由 Web 视图处理。

此外如果查看displayBanner操作会发现,这里出现了变量$jason。在本例中,点击的链接将通过$jason变量传递。例如,如果点击一个名为"https://google.com"的 URL,$jason将获得下列值:
b9630881-7b32-3dc9-a87f-00065014b731.png

这意味着我们可以 检查 $jason.url 的值 进而选择性地触发不同操作。

用自定义 Web 浏览器的实现作为另一个例子一起来看看:
725576fa-4348-3226-be20-23e2d655d74c.png

我们会检查 URL 是否包含字符串signin,并根据结果执行两个不同操作。
  • 如果包含signin,打开一个新视图并以原生方式完成登录操作。
  • 如果不包含signin,则直接运行"type": "$default"操作,实现类似普通浏览器的行为。
用法示范

构建自定义 Web 浏览器

利用新版 Web 容器的下列特性,可以实现很多有趣的操作:
  • 通过url属性实现自我加载,并充当一个功能齐备的浏览器。
  • 根据 URL 的不同,选择性地处理链接点击操作。
我们甚至可以通过几十行 JSON 代码构建一个自定义的 Web 浏览器。由于现在可以劫持每个链接点击,因此可以检查$jason.url,并根据结果运行我们需要的任何操作。

例如下面的例子:
9305a612-0cc9-317c-b553-4efd841d711e.gif
679dee3d-2431-3d9d-916f-31ef988b4ceb.gif

从上图可以看到,点击链接后的行为与普通浏览器无异("type": "$default")。

从下图可以看到,点击链接后可以用原生方式转换至另一个 JASON 视图。

这一切都可以根据$jason.url的值选择性地触发实现。

第 1 步:向 Web 容器附加一个名为visit的操作:
3d92dedc-2a37-3258-a3ee-b1d6795cfa96.png

第 2 步:根据$jason.url的值运行visit内部的相关操作

在下列代码中,我们会检查$jason.url是否与newest、show、ask等内容(均为顶级菜单项链接)相符。如果相符,设置"type": "$default"即可让 Web 容器做出与普通浏览器一样的行为。

如果模式不符,则可通过原生的$href转换打开一个新视图,并将点击的链接作为参数传递过去。
752b912d-f8bc-32d6-8537-f0b43e7cc71e.png

该 Web 浏览器的完整 JSON 标记请参阅(仅 48 行!):

https://github.com/Jasonette/Jasonpedia/blob/gh-pages/webcontainer/agent/hijack.json
瞬间构建“混合”应用

人们通常在说“混合”应用时,主要是指封装在原生应用框架内部的 HTML Web 应用。

但此处说的并不是这种应用。这里所谓的“混合”是指真正的混合应用,也就是可以同时包含多个原生视图以及多个基于 Web 的视图的应用。在这种应用中,一个视图可以有多个原生 UI 组件,以及一个用相同原生布局渲染的 Web 容器。

Web 视图与原生视图的交织应当尽可能无缝,使得用户完全无法分辨。
1986694b-c213-3877-af7b-410381ab3e47.gif

在这个例子中,我创建了一个可以在 Web 容器中显示 jasonbase.com 的内容,并将其作为主页视图的应用。

Jasonbase 是我开发的免费 JSON 托管服务,该服务可以很简单地用于托管 Jasonette 应用所用到的 JSON 标记。

当然,这本身是个网站,但我将其嵌入到 Jasonette 中,因此在点击链接后并不会打开网页,而是会通过原生的$href转换展示原生的 JASON 视图。

完全无需触及 Jasonbase.com 的代码就可以构建出这个应用。

只需要将网站作为 Web 容器嵌入 Jasonette,随后劫持链接点击操作的原生处理方式,这样就可以实现原生应用所具备的各类功能,例如触发原生 API 以及进行原生转换。

完整代码可参阅这里:https://github.com/Jasonette/Jasonpedia/blob/gh-pages/webcontainer/agent/hybrid.json

结 论

在我看来,让这一切如此令人赞叹的原因在于,在框架层面上即可妥善处理好一切。所有最困难的工作都是在后台完成的。

应用开发者并不需要自行费时费力从零开始实现下列这一切:
  • 将 Web 视图嵌入原生布局
  • 创建 JavaScript 桥,以便让应用能够调用 Web 视图中的函数
  • 创建原生事件处理架构,以便让 Web 视图能够触发父应用的原生事件
整个解决方案创建了下列内容组成的抽象:
  • 声明式标记语言:用于描述如何将 Web 视图嵌入原生应用。
  • 通信协议(JSON-RPC):用于在应用及其子 Web 视图之间实现极为简单的通信。
我并不觉得这种方法可以解决所有问题,但从自己的用例来看,至少可以说这是个不错的解决方案。

我试着以非常前沿的技术来构建应用,而这些技术已经前沿到在移动端还没有任何稳定可靠的实现(由于协议的一些本质,甚至不清楚最终是否会有移动端的实现)。好在这些技术都有 JavaScript 实现,因此不费什么事就可以轻松地将其与应用相集成。

总的来说,这种技术很棒,我对目前的效果非常满意。最新版文档 已经包含了所有新功能,欢迎大家深入研究并尝试。

声明:能力越大,需要担负的责任也就越大

最后我想说:虽然这种新技术确实很强大,但我觉得大家在开发应用时都应该在用户体验方面进行更全面的权衡。

有些人可能会借助这种技术构建完全由 Web 视图组成的应用,但说到底这样的做法,你的应用实际上就只是一个网站,已经与开发专属应用的本意背道而驰了。

需要强调的是,我并不认为你的每个应用都应同时包含 HTML 和原生组件。我只是认为,这样的做法对很多面临某些具体状况的人会显得较为有用,只不过别过火就好。

相关链接

最新版文档:https://docs.jasonette.com/web/
原文链接:https://medium.freecodecamp.org/how-to-turn-your-website-into-a-mobile-app-with-7-lines-of-json-631c9c9895f5

感谢 jihong10102006 投递这篇资讯

资讯来源:前端之巅

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



Favicon for 小众软件 - Appinn 10:32 Eversync – 跨浏览器「同步书签」工具,替代 Xmarks » Post from 小众软件 - Appinn Visit off-site link

@beta 同学在求xmarks替代品

访问 Xmarks 官网,发现 Xmarks 只有不到一个月的寿命了:

LogMeIn is retiring Xmarks from its line of products as of May 1, 2018. After this date, you will no longer have access to Xmarks.

求推荐替代品,浏览器自己的同步功能不算,最好是跨浏览器的

如今只有不到 1 周的时间了,历史悠久的 Xmarks 将要被关闭。那么新的替代方案是什么呢?

感谢 @wujiyu115、@RUKDing 推荐的 Eversync。

Eversync

Eversync 是一个跨平台的书签、最喜爱站点、标签页同步工具,支持 Chrome、Firefox、IE,以及 Android、iOS 和 WinPhone。

再注册账号、安装扩展以及应用后,就可以使用 Eversync 同步书签了。

其实青小蛙习惯于在不同平台都使用相同的浏览器,这样能够尽可能的达到体验一致,于是也少了感受不同浏览器的机会 😂

从 Eversync 的更新日期来看,项目还活着。而移动端应用不是帮你同步书签,而是其自身就是一个展示书签的应用,点击书签会自动打开浏览器。

祝同步愉快,官网:https://www.everhelper.me/synchronizer.php

当然,另外一个方法是,直接使用网络书签:

Raindrop.io – 漂亮的网络书签[跨平台]


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

News stories from Monday 23 April, 2018

Favicon for 异次元软件世界 22:23 [来自异次元] IDM 下载工具利器 - 经典好用优秀的 Windows 多线程加速下载软件 » Post from 异次元软件世界 Visit off-site link

idm_banner.jpg

如果你是一名互联网“老司机”,那么一定听过「IDM」这款下载工具的大名!它的全名叫做 Internet Download Manager (互联网下载管理器),缩写就是 IDM。

IDM 是一款非常经典老牌、功能强大的 Windows 文件多线程下载加速软件,在电脑玩家间的评价极高,甚至被称为 HTTP 下载神器!除了下载加速之外,它还提供了自动链接捕获、下载队列、站点抓取、映射服务器、视频音频下载、国外网盘加速下载、静默下载等多种功能……

[ 马上前往围观.... ]


异次元还有这些值得一看:

异次元正版数字商城  |  异次元首页  |  iPcFun  |  新浪微博  |  软件精选

Favicon for ITeye资讯频道 13:25 Python 人气王,JS 比 Java 更受公司青睐 » Post from ITeye资讯频道 Visit off-site link
四月 PYPL 编程语言排行榜和 Hacker News 招聘趋势都已经出炉。

Hacker News 招聘趋势的数据由 Hacker News 新闻站负责收集,它不仅仅关注编程语言趋势,还关注公司要求的顶尖技能的趋势,包括框架、库等。

PYPL 通过分析 Google 搜索语言教程的频率生成数据,即,某项语言在 Google 上搜索频率越高,表示这项语言越受欢迎。

在四月的数据中,两个排行榜都显示,Python 是增长最快的语言,流行度名列前茅。

Kotlin 在 PYPL 排行榜中取得了不小的提升,但是在 Hacker News 招聘趋势上却少有露面。

Hacker News 招聘趋势

根据 Hacker News 招聘趋势排名,公司对掌握 Python 技能的人员越来越干兴趣,其次是 JavaScript 和 Golang。 最有趣的是,Golang 在某一时期似乎已经超越了 Java 的流行程度,不过这一趋势还不稳定。
908bb116-a6ca-3b10-bc85-9a4671f2ee47.png

另外,公司对 JavaScript 的需求似乎一直比 Java 高。
e5cddfd1-04ae-3643-ac55-fcaa98b30247.png

“最稳定”的语言是 Kotlin,Google 已将其作为开发应用程序的官方语言,本以为这有助于公司加强对 Kotlin 的重视,提升对其的需求,但实际看来并非如此。Kotlin 的市场需求一直低于其他几个热门语言。

PYPL

PYPL 关注编程语言流行度。虽然与去年的指数结果相比,Java 的整体学习趋势略有下降,但 Java 仍然是最受欢迎的语言。 Python 以 5.2% 的巨幅增长超过了 JavaScript,使其成为开发人员中受欢迎程度最快的语言。
c093d036-98bd-3a87-bc04-d09de81a92dd.jpg

Python 在人气方面的增长几乎触及了 Java,它们之间的差距仅仅只有 0.57%!

与 Hacker News 招聘趋势不同,在 PYPL 中,Kotlin 是本月增长最快的语言之一,成功前进 6 位,排名 16。

综合比较

将两个排名系统进行比较时,我们可以清楚地看到:Python 正在变得非常重要。不管是招聘需求还是 Google 搜索教程,Python 都置于语言排名的前列。

而 Go 和 Kotlin 在两个排行系统存在一定的差异。如上图所示,在 Hacker News 招聘趋势排行榜中,Kotlin 无处可见,而 PYPL 编程语言指数榜显示 Kotlin 是增长最快的语言之一。 同样,根据 Hacker News 招聘趋势排名,Golang 的趋势似乎在上升,而 PYPL 编程语言的指数显示 Golang 相当静态。

感谢 jihong10102006 投递这篇资讯

资讯来源:oschina

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



Favicon for 小众软件 - Appinn 10:37 Windows 下载神器 IDM 「终身授权」优惠来了 » Post from 小众软件 - Appinn Visit off-site link

Internet Download Manager (以下简称 IDM Windows 平台老牌而功能强大的下载工具,提供了下载队列、站点抓取和映射服务器、多媒体下载、静默下载、百度盘加速等多个功能,这次的优惠版本为终身授权,永久使用,享受三年更新。@Appinn

IDM 堪称下载神器,青白蛙去找老司机要还好用的下载工具,都推荐这货… 不过,青老老蛙有时候会出来说句话:当年我们都是用光盘里的 JetCar ……

IDM 的主要特点如下:

自动捕获链接

IDM 能够在使用浏览器下载文件时,自动捕获下载链接并添加下载任务。IDM 支持大部分主流浏览器,如 Chrome、Safari、Firefox、Edge、Internet Explorer 等。

多媒体下载

只要你打开想要下载的音&视频页面,IDM 会自动检测在线播放器发出的多媒体请求并在播放器上显示下载浮动条,你可以直接下载流媒体网站中的视频进行离线观看。支持 MP4、MP3、MOV、AAC 等常见音视频格式的检测与下载。

静默下载

大多数人在下载文件时,都会习惯性地将文件保存到某个固定位置,等下载完成后再进一步处理。如果每次下载都需要重复点选「保存对话框」中的按键,会显得非常多余和低效。

IDM 的静默下载功能能自动最小化下载窗口。如果下载过程中,希望修改保存位置或其他选项,可直接在托盘中呼出 IDM 图标即可。

百度云盘加速下载

用一个 油猴脚本 配合 IDM 就能实现,非常容易。

站点抓取

「站点抓取」功能能够让你在输入链接后,直接选择要下载网页中的指定内容而不需要使用通配符,包括图片、音频、视频、文件或者包含完整样式的网站离线文件,IDM 都可以做到。你还可以根据需求自定义站点抓取的内容与规则,并将它们保存下来方便下次调用。

支持主流国外网盘

希望下载国外网盘中的资源?搭IDM 能将网盘文件作为队列进行批量下载,让你独立定制每个队列的下载时间、下载文件数量等,灵活地提高下载效率。

目前支持的网盘包括 RapidShareUploaded.netFileServe 等(支持登录)。可访问官网查看 所有 IDM 支持网盘。

关于这次优惠

这次优惠所提供的版本为终身授权版本,可享受永久使用,以及支持 3 年更新。

价格方面:原价 24.95 刀,大约 157 元,优惠价格 129 元,领券再减 5 元,只需 124 就能拿回家,嗯。

最后,先 领取优惠券https://partner.lizhi.io/appinn/cp),再前往 数码荔枝商城 购买即可。

青小蛙祝各位下载愉快,另外有什么下载资源推荐么 🙈


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

News stories from Sunday 22 April, 2018

Favicon for 异次元软件世界 18:25 [来自异次元] 6款那些年救过我的数据文件恢复软件 - 误删除重要文件的“后悔药” » Post from 异次元软件世界 Visit off-site link

data_recovery_banner.jpg

相信很多朋友都有过一不小心把电脑硬盘、U盘或储存卡里的重要文件资料、照片、视频错手删除的经历,有时甚至在回收站也清空了,非常的无助。

其实,养成备份重要资料的习惯尤为重要,不但图个安心,真的需要的时候也是“及时雨”。但如果你并没有备份资料,电脑数据文件恢复软件就成了最后的救命稻草了。这里向大家推荐一些用过的且口碑比较好的文件删除恢复工具,在电脑里留一个准没错!希望能有所帮助……

[ 马上前往围观.... ]


异次元还有这些值得一看:

异次元正版数字商城  |  异次元首页  |  iPcFun  |  新浪微博  |  软件精选

Favicon for 小众软件 - Appinn 10:55 DesignEvo – 拥有 4000+ 模板的 Logo 在线生成工具 » Post from 小众软件 - Appinn Visit off-site link

DesignEvo 是一个在线制作 Logo 的网站,无论是公司、网站、软件、App、品牌、社团,都可以用来制作自己的 Logo,免费版提供 500px * 500px 尺寸的图片下载,以及一个带背景的 png 格式。付费版则可以下载高清晰度和透明背景的图片。@Appinn

来自发现频道

DesignEvo 在发现频道挺长时间的了,开始的时候青小蛙觉得贵,他们的定价是 20 刀一个,如果想要 PDF 与 SVG 格式,以及可以申请为商标,就需要 40 刀一个了。

不过后来想想,一个属于自己的 Logo,还能注册商标,其实也不能算贵嘛。最重要的,其实是青小蛙帮朋友设计了一个 Logo,设计完发现,还挺好看,不过朋友要求不高,就免费版直接用了。

而使用 DesignEvo 就非常容易了,有中文界面,选择合适的模板,也可以从零开始设计,选择图标、字体、形状,拖拖拽拽就完成了设计:

整体效果还是很不错的,很多设计好的 Logo 看着像正经玩意。

来看段视频:

最后,青小蛙向 DesignEvo(官网) 要来了 6 折折扣码 APPINN 有效期至 2018-04-30 无次数限制,20 刀还是 40 刀套餐都能使用。


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

News stories from Saturday 21 April, 2018

Favicon for 小众软件 - Appinn 17:14 毒汤日历 – 每天一句毒鸡汤,没有多余的功能 [iPhone/iPad] » Post from 小众软件 - Appinn Visit off-site link

毒汤日历 有点意思,提供不少毒鸡汤。虽说鸡汤有效,毒鸡汤也可以以毒攻毒。其实还有一个可以让用户提交毒鸡汤的功能。@Appinn

来自发现频道

毒鸡汤都懂吧 😂以毒攻毒疗效快,有时候生活就缺那么点汤。

功能简单,设计简洁,下面是「我的毒汤」:

貌似只有 iOS 版本,App Store 有下:


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

News stories from Friday 20 April, 2018

Favicon for 小众软件 - Appinn 19:00 Nihon – 「霓虹国传统颜色」451 种日本传统色系 [iPhone/iPad 限免] » Post from 小众软件 - Appinn Visit off-site link

Nihon 是一款收集了 451 种日本传统色系的应用。在日本传统色系,指的是日本古典文学里经常采用颜色。这些颜色常被用于和服或其他日本传统艺术和手工艺中。@Appinn

感谢 @伍仁 的推荐。

Nihon 的每一种颜色都有一个专属的名字,让你可以「在极简设计中,欣赏日本传统色系」,并且为你自己的项目寻找灵感。

  • 应用支持横屏;
  • 手滑了可以在首页“摇一摇设备”返回上一个颜色;
  • 在首页点击颜色名称,可以看到由 451 种颜色组成的列表;
  • 应用提供 Today Widget,希望让您随时看到不一样的颜色,激发灵感、改善心情。


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 异次元软件世界 17:35 [来自异次元] 卫星统治 Satellite Reign - 科幻朋克开放世界即时战略游戏 (Steam喜+1) » Post from 异次元软件世界 Visit off-site link

satellite_reign.jpg

游戏促销狂魔 HumbleBundle 又来给大家免费送正版 Steam 游戏激活码了!!除了可以关注每月的 Humble Monthly 之外,我们经常还会遇到限免的喜+1游戏。这次就是《卫星统治》(Satellite Reign)。 卫星统治 (Satellite Reign) 是一款科幻风格的拥有不同职业角色的即时战略游戏,游戏背景设定在一个赛博朋克风格的城……

[ 马上前往围观.... ]


异次元正版数字商城  |  异次元首页  |  iPcFun  |  新浪微博  |  软件精选

Favicon for ITeye资讯频道 17:15 若依后台管理系统 1.1.0 发布 » Post from ITeye资讯频道 Visit off-site link
若依管理系统 v1.1.0 已发布,更新日志:

1、支持新增主目录
2、支持批量生成代码
3、支持导出数据(csv、txt、doc、excel)
4、自动适应宽高模式窗体(兼容所有分辨率)
5、重复校验(角色名、菜单名、部门名)
6、优化一些其他细节

平台简介

一直想做一款后台管理系统,看了很多优秀的开源项目但是发现没有合适自己的。于是利用空闲休息时间开始自己写一套后台系统。如此有了若依管理系统。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错效率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。

寓意:你若不离不弃,我必生死相依

内置功能

1.    用户管理:用户是系统操作者。
2.    部门管理:配置系统组织机构。
3.    岗位管理:岗位是用户所属职务。
4.    菜单管理:配置系统菜单(支持控制到按钮)。
5.    角色管理:角色菜单权限分配。
6.    字典管理:对系统中经常使用的一些较为固定的数据进行维护。
7.    操作日志:系统操作日志记录(含异常)。
8.    登录日志:系统登录情况记录(含异常)。
9.    在线用户:当前系统中活跃用户状态监控。(可强退)
10.  定时任务:在线添加、修改和删除任务调度(含执行日志)。
11.  代码生成:生成包括 java、html、js、xml、sql
12.  连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。

部分功能演示
160757_fnZP_1438828.png
005844_Qduc_1438828.png
082449_H7e8_1438828.png
005851_bFzg_1438828.png
235921_7txy_1438828.png
235934_lHXI_1438828.png
235903_p5W6_1438828.png

感谢 yangzongzhuan 投递这篇资讯

声明:本文系ITeye网站发布的原创资讯,严禁任何网站转载本文,否则必将追究法律责任!

资讯来源:若依开源

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐



Favicon for 小众软件 - Appinn 15:39 Reedr 4 – 注重隐私保护的 RSS 阅读器 [iPhone] » Post from 小众软件 - Appinn Visit off-site link

Reedr 4 是一款 iPhone 上的 RSS 阅读器,通过将内容储存、网络请求以及阅读行为放在手机内完成,从而达到保护用户阅读隐私的目的。@Appinn

听起来有些奇怪,但阅读的确也有隐私,你拥有不告诉别人自己在读什么的权利。

Reedr 4 的同学发来邮件:

鉴于最近很多和用户隐私泄漏、利用大数据杀熟的事件,甚至还有李总“中国人愿意用隐私换便利”的言论,感觉提高用户对隐私保护的敏感度是挺重要的,于是出炉了这个 RSS 阅读器:Reedr

我是一个重度 RSS 用户,因为 App Store 上没有找到自己满意的,所以自己造了个轮子,之前一直是自己用,这次完善了一下发布了。

Reedr 会一次刷新所有的 Feeds,然后按照时间倒序显示出来,调用 Safari 显示具体网页内容,这样配合 Safari Content Blocker 可以更好地实现隐私保护。在屏幕左上角使用 URL Scheme 可以快速返回到 Reedr,打开其他感兴趣的条目,最后在 Safari 里查看所有的文章具体内容。

不知道现在坚持 RSS 的用户还有多少,也希望通过小众了解一下。附上几个促销代码。

当初历史上最伟大的阅读器 Google Reader 就是以服务器不堪重负为由结束了服务,从此阅读器地位一蹶不振,虽然近期有人喊出了复兴 RSS,但青小蛙觉得,这个事情可能没那么容易…

RSS 依旧是少部分人的高效工具,但在互联网越来越封闭的今天,源没有了,要阅读器干什么?

Reedr 4 在 App Store 售价 25 元,开发者送来的兑换码,想从阅读器中送出,但又没有操作性,于是就留言送出吧,4 枚。

 


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for 异次元软件世界 14:03 [来自异次元] 致命框架2 (Framed 2) - 精彩绝伦的创意漫画化悬疑解谜游戏续作 » Post from 异次元软件世界 Visit off-site link

framed2_banner.jpg

谈起解谜类游戏的「创意」,你可能会想起《纪念碑谷2》那让人拍手称绝的视觉错位设计。然而,在众多优秀解谜游戏中,《FRAMED》(致命框架) 那别具一格的创新玩法同样巧妙得让人深深折服!

游戏以一格格精致生动的视频漫画来呈现故事,玩家需要调换漫画格的顺序,从而改写剧情,帮助主角一步一步逃出生天!这种突破常规的、让玩家亲手“重构”故事线的创意解谜形式,就连知名游戏制作人(合金装备之父)小岛秀夫都赞赏有加!如今,它的续作《FRAMED 2 (致命框架2)》终于来了……

[ 马上前往围观.... ]


异次元还有这些值得一看:

异次元正版数字商城  |  异次元首页  |  iPcFun  |  新浪微博  |  软件精选

Favicon for 小众软件 - Appinn 11:50 简悦 · 轻阅版 – 支持 Safari、Edge 的浏览器沉浸式阅读模式工具[ UserScript 脚本] » Post from 小众软件 - Appinn Visit off-site link

简悦 是一款浏览器沉浸式阅读扩展,开发者逐一适配了 240+ 个网站,只为让用户更好的阅读。之前已「原生」支持 Chrome 与 Firefox,勤奋的开发者更是发布了使用 UserScript 脚本的简悦 · 轻阅版,让 Safari、Opera、Microsoft Edge、Opera、Dolphin 等支持 UserScript 的浏览器都可以使用简悦了。@Appinn

与插件版本相比,UserScript 版本能够让加载速度更快,并且可以导入 简悦 原版的配置。

也就是说,你完全可以在 Chrome、Firefox 上卸载插件版本,而使用 UserScript 版本。

看图,两者区别:

安装方式:

完成。

要开启沉浸式阅读,只需要在打开的网页上输入快捷键 AA(双击 A)即可。

简悦 · 轻阅版官网:http://ksria.com/simpread/#lite


相关阅读


©2017 青小蛙 for 小众软件 | 加入我们 | 投稿 | 订阅指南 | 反馈 | 代理(优惠码 Appinn)
b27c41ad47c2611d60d7452a4c02dd52
Site Meter

apppackge:

Favicon for ITeye资讯频道 11:18 深入理解Android消息机制 » Post from ITeye资讯频道 Visit off-site link
在日常的开发中,Android 的消息机制作为系统运行的根本机制之一,显得十分的重要。
从 Handler 发送消息开始

查看源码,Handler的post、send方法最终都会走到
public final boolean sendMessageDelayed(Message msg, long delayMillis) {
	if (delayMillis < 0) {
	    delayMillis = 0;
    }
    return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}

sendMessageDelayed 会走到
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
	msg.target = this;
    if (mAsynchronous) {
	    msg.setAsynchronous(true);
    }
    return queue.enqueueMessage(msg, uptimeMillis);
}

这里可以设置 Message 为异步消息

查看 queue 的 enqueueMessage 方法, 我们剥离出核心代码:
if (p == null || when == 0 || when < p.when) {
	// New head, wake up the event queue if blocked.
	msg.next = p;
    mMessages = msg;
    needWake = mBlocked;
 }

如果是新的队列头,直接插入队列

如果队列里面已经有消息了,执行如下逻辑
needWake = mBlocked && p.target == null && msg.isAsynchronous();
Message prev;
for (;;) {
	prev = p;
    p = p.next;
    if (p == null || when < p.when) {
	    break;
    }
    if (needWake && p.isAsynchronous()) {
	    needWake = false;
    }
}
msg.next = p; // invariant: p == prev.next
prev.next = msg;

插入消息的时候,一般不会唤醒消息队列。如果消息是异步的,并且队列头不是一个异步消息的时候,会唤醒消息队列
if (needWake) {
	nativeWake(mPtr);
}

消息队列的具体唤醒过程我们暂时不细看。把关注点移到 Looper 上。looper在执行的时候具体执行了什么逻辑呢?查看 Looper.java 的 looper() 方法

looper 方法中有一个死循环, 在死循环中,会获取下一个 Message
for (;;) {
	Message msg = queue.next(); // might block
}

if (msg != null && msg.target == null) {
// Stalled by a barrier.  Find the next asynchronous message in the queue.
do {
	prevMsg = msg;
	msg = msg.next;
} while (msg != null && !msg.isAsynchronous());

当存在一个 barrier 消息的时候,会寻找队列中下一个异步任务。而不是按照顺序。 例如3个消息,1,2,3, 2 是异步消息。如果不存在barrier的时候,next的顺序就是 1,2,3 但是如果存在barrier的时候,则是 2,1,3
if (msg != null) {
	if (now < msg.when) {
    // Next message is not ready.  Set a timeout to wake up when it is ready.
    nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
    } else {
	    // Got a message.
        mBlocked = false;
        if (prevMsg != null) {
	        prevMsg.next = msg.next;
        } else {
		    mMessages = msg.next;
        }
        msg.next = null;
        if (DEBUG) Log.v(TAG, "Returning message: " + msg);
        msg.markInUse();
	    return msg;
   }
} else {
	// No more messages.
	nextPollTimeoutMillis = -1;
}

这里如果 next 的 Message 不为空,就返回,并且将它移出队列 在 MessageQueue 为空的时候,会顺便去处理一下 add 过的 IdleHandler, 处理一些不重要的消息
for (int i = 0; i < pendingIdleHandlerCount; i++) {
	final IdleHandler idler = mPendingIdleHandlers[i];
    mPendingIdleHandlers[i] = null; // release the reference to the handler

    boolean keep = false;
    try {
		keep = idler.queueIdle();
    } catch (Throwable t) {
	    Log.wtf(TAG, "IdleHandler threw exception", t);
    }

    if (!keep) {
		synchronized (this) {
        mIdleHandlers.remove(idler);
     }
}

查看 IdleHandler 的源码。
   
 * Callback interface for discovering when a thread is going to block
     * waiting for more messages.
     */
    public static interface IdleHandler {
        /**
         * Called when the message queue has run out of messages and will now
         * wait for more.  Return true to keep your idle handler active, false
         * to have it removed.  This may be called if there are still messages
         * pending in the queue, but they are all scheduled to be dispatched
         * after the current time.
         */
        boolean queueIdle();
    }

当 queueIdle() 为 false 的时候,会将它从 mIdleHandlers 中 remove,仔细思考下,我们其实可以利用IdleHandler实现不少功能, 例如
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
	@Override
	public boolean queueIdle() {
		return false
	}
});

我们可以在 queueIdle 中,趁着没有消息要处理,统计一下页面的渲染时间(消息发送完了说明UI已经渲染完了),或者算一下屏幕是否长时间没操作等等。

拿到 Message 对象后,会将 Message 分发到对应的 target 去
msg.target.dispatchMessage(msg);

查看源码
public void dispatchMessage(Message msg) {
	if (msg.callback != null) {
		handleCallback(msg);
    } else {
	    if (mCallback != null) {
	        if (mCallback.handleMessage(msg)) {
	            return;
            }
         }
     handleMessage(msg);
	}
}

当 msg 的 callback 不为 null 的时候,即通过 post(Runnable) 发送信息的会执行 handlerCallback(msg) 方法。如果 mCallback 不为 null并且 handleMessage 的结果为 false,则执行 handleMessage 方法。否则会停止分发。
private static void handleCallback(Message message) {
	message.callback.run();
}

查看 handlerCallback 方法源码, callback 会得到执行。到这里基本的Android消息机制就分析完了,简而言之就是,Handler 不断的将Message发送到一 根据时间进行排序的优先队列里面,而线程中的 Looper 则不停的从MQ里面取出消息,分发到相应的目标Handler执行。

为什么主线程不卡?

分析完基本的消息机制,既然 Looper 的 looper 方法是一个for(;;;)循环,那么新的问题提出来了。为什么Android会在主线程使用死循环?执行死循环的时候为什么主线程的阻塞没有导致CPU占用的暴增?�

继续分析在源码中我们没有分析的部分:
  • 消息队列构造的时候是否调用了jni部分
  • nativeWake、nativePollOnce这些方法的作用是什么
先查看MQ的构造方法:
MessageQueue(boolean quitAllowed) {
	mQuitAllowed = quitAllowed;
	mPtr = nativeInit();
}

会发现消息队列还是和native层有关系,继续查看android/platform/frameworks/base/core/jni/android_os_MessageQueue_nativeInit.cpp中nativeInit的实现:
static jlong android_os_MessageQueue_nativeInit(JNIEnv* env, jclass clazz) {
    NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue();
    if (!nativeMessageQueue) {
        jniThrowRuntimeException(env, "Unable to allocate native queue");
        return 0;
    }

    nativeMessageQueue->incStrong(env);
    return reinterpret_cast<jlong>(nativeMessageQueue);
}

这里会发现我们初始化了一个 NativeMessageQueue ,查看这个消息队列的构造函数
NativeMessageQueue::NativeMessageQueue() :
        mPollEnv(NULL), mPollObj(NULL), mExceptionObj(NULL) {
    mLooper = Looper::getForThread();
    if (mLooper == NULL) {
        mLooper = new Looper(false);
        Looper::setForThread(mLooper);
    }
}

这里会发现在mq中初始化了 native 的 Looper 对象,查看android/platform/framework/native/libs/utils/Looper.cpp中 Looper 对象的构造函数
// 简化后的代码
Looper::Looper(bool allowNonCallbacks) :
        mAllowNonCallbacks(allowNonCallbacks), mSendingMessage(false),
        mResponseIndex(0), mNextMessageUptime(LLONG_MAX) {

	int wakeFds[2];
	int result = pipe(wakeFds);

	mWakeReadPipeFd = wakeFds[0];
	mWakeWritePipeFd = wakeFds[1];
	
	result = fcntl(mWakeReadPipeFd, F_SETFL, O_NONBLOCK);
	result = fcntl(mWakeWritePipeFd, F_SETFL, O_NONBLOCK);

	mEpollFd = epoll_create(EPOLL_SIZE_HINT);

	struct epoll_event eventItem;
    memset(& eventItem, 0, sizeof(epoll_event)); 
    eventItem.events = EPOLLIN;
    eventItem.data.fd = mWakeReadPipeFd;
    result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, & eventItem);
}

这里我们会发现,在 native 层创建了一个epoll,并且对 epoll 的 event 事件进行了监听。

什么是epoll

在继续分析源码之前,我们先分析一下,什么是epoll

epoll是Linux中的一种IO多路复用方式,也叫做event-driver-IO。

Linux的select 多路复用IO通过一个select()调用来监视文件描述符的数组,然后轮询这个数组。如果有IO事件,就进行处理。

select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。

epoll在select的基础上(实际是在poll的基础上)做了改进,epoll同样只告知那些就绪的文件描述符,而且当我们调用epoll_wait()获得就绪文件描述符时,返回的不是实际的描述符,而是一个代表就绪描述符数量的值,你只需要去epoll指定的一个数组中依次取得相应数量的文件描述符即可。

另一个本质的改进在于epoll采用基于事件的就绪通知方式(设置回调)。在select中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便得到通知

关于epoll和select,可以举一个例子来表达意思。select的情况和班长告诉全班同学交作业类似,会挨个去询问作业是否完成,如果没有完成,班长会继续询问。

而epoll的情况则是班长询问的时候只是统计了待交作业的人数,然后告诉同学作业完成的时候告诉把作业放在某处,然后喊一下他。然后班长每次都去这个地方收作业。

大致了解了epoll之后,我们继续查看nativePollOnce方法,同理,会调用native Looper的pollOnce方法
while (mResponseIndex < mResponses.size()) {
            const Response& response = mResponses.itemAt(mResponseIndex++);
            int ident = response.request.ident;
            if (ident >= 0) {
                int fd = response.request.fd;
                int events = response.events;
                void* data = response.request.data;
                if (outFd != NULL) *outFd = fd;
                if (outEvents != NULL) *outEvents = events;
                if (outData != NULL) *outData = data;
                return ident;
            }
        }

在pollOnce中,会先处理没有callback的response(ALOOPER_POLL_CALLBACK = -2),处理完后会执行pollInner方法
// 移除了部分细节处理和日志代码
// 添加了分析源码的日志
int Looper::pollInner(int timeoutMillis) {
	if (timeoutMillis != 0 && mNextMessageUptime != LLONG_MAX) {
	        nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
	        int messageTimeoutMillis = toMillisecondTimeoutDelay(now, mNextMessageUptime);
	        if (messageTimeoutMillis >= 0
	                && (timeoutMillis < 0 || messageTimeoutMillis < timeoutMillis)) {
	            timeoutMillis = messageTimeoutMillis;
	        }
	  }

	// Poll.
    int result = ALOOPER_POLL_WAKE;
    mResponses.clear();
    mResponseIndex = 0;

    struct epoll_event eventItems[EPOLL_MAX_EVENTS];
	// 等待事件发生或者超时
    int eventCount = epoll_wait(mEpollFd, eventItems, EPOLL_MAX_EVENTS, timeoutMillis);

    // Acquire lock.
    mLock.lock();


	// Check for poll error.
	// epoll 事件小于0, 发生错误
    if (eventCount < 0) {
        if (errno == EINTR) {
            goto Done;
        }
        result = ALOOPER_POLL_ERROR;
        goto Done;
    }

	if (eventCount == 0) {
		// epoll事件为0,超时,直接跳转到Done
        result = ALOOPER_POLL_TIMEOUT;
        goto Done;
    }

	//循环遍历,处理所有的事件
	for (int i = 0; i < eventCount; i++) {
        int fd = eventItems[i].data.fd;
        uint32_t epollEvents = eventItems[i].events;
        if (fd == mWakeReadPipeFd) {
            if (epollEvents & EPOLLIN) {
                awoken();  //唤醒,读取管道里面的事件
            } else {
            }
        } else {
            ssize_t requestIndex = mRequests.indexOfKey(fd);
            if (requestIndex >= 0) {
                int events = 0;         
                // 处理request,生成response对象,push到相应的Vector
                pushResponse(events, mRequests.valueAt(requestIndex));
            } else {               
            }
        }
    }

Done: ;

	// Invoke pending message callbacks.
	// 发生超时的逻辑处理
    mNextMessageUptime = LLONG_MAX;
    while (mMessageEnvelopes.size() != 0) {
	    // 处理Native端的Message
        nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
        const MessageEnvelope& messageEnvelope = mMessageEnvelopes.itemAt(0);
        if (messageEnvelope.uptime <= now) {
            // Remove the envelope from the list.
            // We keep a strong reference to the handler until the call to handleMessage
            // finishes.  Then we drop it so that the handler can be deleted *before*
            // we reacquire our lock.
            { // obtain handler
                sp<MessageHandler> handler = messageEnvelope.handler;
                Message message = messageEnvelope.message;
                mMessageEnvelopes.removeAt(0);
                mSendingMessage = true;
                mLock.unlock();
                handler->handleMessage(message);   // 处理消息事件
            } // release handler

            mLock.lock();
            mSendingMessage = false;
            result = ALOOPER_POLL_CALLBACK;   // 设置回调
        } else {
            // The last message left at the head of the queue determines the next wakeup time.
            mNextMessageUptime = messageEnvelope.uptime;
            break;
        }
    }

    // Release lock.
    mLock.unlock();

    // Invoke all response callbacks.
    // 执行回调
    for (size_t i = 0; i < mResponses.size(); i++) {
        Response& response = mResponses.editItemAt(i);
        if (response.request.ident == ALOOPER_POLL_CALLBACK) {
            int fd = response.request.fd;
            int events = response.events;
            void* data = response.request.data;
            int callbackResult = response.request.callback->handleEvent(fd, events, data);
            if (callbackResult == 0) {
                removeFd(fd);  //移除fd
            }
            // Clear the callback reference in the response structure promptly because we
            // will not clear the response vector itself until the next poll.
            response.request.callback.clear();  // 清除reponse引用的回调方法
            result = ALOOPER_POLL_CALLBACK;  // 发生回调
        }
    }
    return result;
}

看到这里,我们其实可以看出来整体消息模型由 native 和 Java 2层组成,2层各自有自己的消息系统。 Java层通过调用 pollonce 来达到调用底层epoll 让死循环进入阻塞休眠的状态,以避免浪费CPU, 所以这也解释了为什么Android Looper的死循环为什么不会让主线程CPU占用率飙升。

java层和native层的对应图如下:
50cfe74c-d831-378f-90b9-25af1baad581.png

备注
  • Java 层和 native 层通过 MessageQueue 里面持有一个 native 的MessageQueue 对象进行交互。WeakMessageHandler 继承自MessageHandler,NativeMessageQueue 继承自 MessageQueue
  • Java 层和 native 层实质是各自维护了一套相似的消息系统。C层发出的消息和Java层发出的消息可以没有任何关系。所以 Framework 层只是很巧的利用了底层 epoll 的机制达到阻塞的目的。
  • 通过 pollOnce 的分析,可以发现消息的处理其实是有顺序的,首先是处理native message,然后处理native request,最后才会执行java层,处理java层的message
可以在子线程中创建Handler吗?为什么每个线程只会有一个Looper?

在很多时候,我们可以遇到这2个问题。既然看了 Handler 的源码,那么,我们就顺便分析一下这 2 个问题。

查看Handler的构造方法,无参构造方法最后会调用
public Handler(Callback callback, boolean async) {
        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

可以看到,这里会直接获取Looper
public static @Nullable Looper myLooper() {
    return sThreadLocal.get();
}

这里会把每个 Looper 存到相应的ThreadLocal对象中,如果子线程直接创建了Handler,Looper 就会是一个null,所以会直接跑出一个"Can't create handler inside thread that has not called Looper.prepare()"的RuntimeException

那么我们是何时把Looper放入ThreadLocal对象的呢?可以在Looper.prepare()中找到答案
private static void prepare(boolean quitAllowed) {
	if (sThreadLocal.get() != null) {
		throw new RuntimeException("Only one Looper may be created per thread");
	}
	sThreadLocal.set(new Looper(quitAllowed));
}

这也解释了,在每个 Thread 中,只会存在一个 Looper 对象。如果我们想在子线程中正常创建 Handler,就需要提前运行当前线程的 Looper,调用
Looper.prepare()

就不会抛出异常了。

总结

消息机制作为 Android 的基础,还是非常有深入了解的必要。对于我们遇到Handler发送消息的时候跑出的系统异常的排查也很有意义。

特别感谢

本次源码的阅读过程中,遇到了很多不了解的问题例如epoll,这里非常感谢IO哥(查看IO哥大佬)助和指导。让我在某些细节问题上暂时绕过和恍然大悟。

感谢 jihong10102006 投递这篇资讯

资讯来源:github

已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐