
暂无个人介绍
什么是 ALV?ALV 最初是 ABAP List Viewer 的缩写,但在 SAP 文档中找到的当前术语是 SAP List Viewer。 不过,这并不重要,在日常实践中,它被简称为 ALV,不再使用任何名称。ABAP 列表查看器 (ALV) 是一组应用程序编程接口(API 功能模块和类),用于以表格或分层格式显示数据,以及用于视觉呈现和事件处理的内置选项。对于用户,ALV 提供了一个友好的界面和一个工具栏,允许每个用户根据自己的喜好调整呈现的布局,并轻松地对数据进行排序或过滤。 许多标准 SAP 报告使用 ALV,由于其灵活性、易于实施和多种功能,它已成为构建自定义 ABAP 报告时的流行工具。ALV 框架的第一个实现是经典 SAP 列表查看器,通常称为 ALV 列表。Jerry因为工作原因不会进行SAP Dynpro的编程,所以也不知道这个ALV IDA的存在。网上搜了一下,发现早在2018年就有SAP从业者写过介绍它的博客了:因为使用确实非常简单,Jerry不会重复博客里的内容,对其详细用法感兴趣的朋友,请移步这篇SAP社区博客: SAP List Viewer with integrated Data Access ALV with IDA.如下图所示,我在SAPGUI里写了一个报表,只用一行语句就能完成一个名叫ZFAT_INTERFACE这个CDS view的ALV展示工作。cl_salv_gui_table_ida=>create_for_cds_view( iv_cds_view_name = 'ZFAT_INTERFACE' )->fullscreen( )->display( ).这个CDS view显示的数据,是当前ABAP系统里所有的接口(SE24里查看的interface)和接口上定义的方法个数。CDS view实现源码如下:为什么要搞这样一个CDS view出来?Jerry曾经给SAP成都研究院的同事们做过一个面向对象程序设计的培训,里面讲到了一个原则:Interface Segregation Principle(接口分离/隔离原则).接口隔离准则期望达到的效果是,客户类不应被强迫依赖于那些它们实际并不需要的接口。相反地,一个接口定义的方法数量越多,其实现类越容易受制于该接口。例如,一个客户类A实现了一个接口,该接口包含了客户类不需要的方法,但这些方法是其他客户类所需要的,那么当其他客户类由于某种原因需要对接口进行修改时,这个修改也将影响客户类A。通过接口隔离准则,我们尽可能地避免这种不必要的耦合,比如上图中把包含了Print,Staple, Copy和Fax四个方法的胖接口Job,拆分成了四个各自只包含一个独立方法的接口。讲完了接口隔离原则之后,我忽然有了一个想法,SAP ABAP系统里大量的历史遗留代码里,是否存在着定义了大量方法的胖接口呢?于是就开发了上述的CDS view一探究竟。从使用ALV IDA显示CDS view ZFAT_INTERFACE的结果看,方法数量排名第一的胖接口IFUR_NW7__ALL,其上定义了755个方法…再回到ALV IDA,它能够显示CDS view数据的原理是什么?使用Jerry之前文章:SAP错误消息调试之七种武器:让所有的错误消息都能被定位 里介绍的第五种办法,孔雀翎之SAT,即使用SAT运行之前编写的ALV程序,在SAT跟踪结果里,就能找到cl_salv_gui_table_ida最后是如何从CDS view里取值的:CL_SQL_STATEMENT->EXECUTE_QUERY在该方法里设置断点, 执行报表,断点会触发两次:断点第一次触发,执行的SQL表达式:SELECT COUNT( * ) AS "COUNT" FROM "ZFATINF" AS "ZFAT_INTERFACE" WITH PARAMETERS( 'LOCALE' = 'EN' )断点第二次触发,执行的SQL表达式:SELECT "ZFAT_INTERFACE"."CLSNAME" AS "CLSNAME", "ZFAT_INTERFACE"."METHOD_COUNT" AS "METHOD_COUNT" FROM "ZFATINF" AS "ZFAT_INTERFACE" ORDER BY "ZFAT_INTERFACE"."CLSNAME" ASC LIMIT ? OFFSET ? WITH PARAMETERS( 'LOCALE' = 'CASE_INSENSITIVE' )一旦指向结果集(result set)的引用lo_result在1049行代码调用next_package方法,CDS view的前1000条数据就被赋值到了ABAP内表lr_data里:这种不采用ABAP OPEN SQL,而用CL_SQL_STATEMENT,CL_SQL_CONNECTION等系列工具类的数据库访问方式,称为ADBC - ABAP Database Connectivity.ADBC是一套API的集合,能允许ABAP开发人员使用ABAP面向对象编程的方式,同ABAP服务器的原生SQL接口进行交互。Jerry之前的文章集合 Jerry的ABAP, Java和JavaScript乱炖,里面有一篇将ADBC和Java的JDBC做了对比:ADBC vs JDBC下图左边是用ADBC读取数据库的代码,右边是Java的JDBC代码,大家可以简单对比一下语法:最后,在哪些版本的ABAP服务器上能使用ALV IDA?无需查阅文档,直接查看源代码,在CL_SALV_GUI_TABLE_IDA有个DB_CAPABILITIES方法:进而查看该方法实现里的CL_SALV_IDA_CAPABILITY_SERVICE:当前DB是否支持指定的特性,通过这些IS方法返回的布尔值决定。从源代码看,很多特性需要ABAP 740 SP4之后的版本才能支持。感谢阅读。
使用如下代码创建 HTTP 代理服务器:const http = require('http'); const httpProxy = require('http-proxy'); const targetUrl = 'https://www.sap.cn/index.html'; const proxy = httpProxy.createProxyServer({ target: targetUrl, secure:false }); http.createServer(function (req, res) { proxy.web(req, res); }).listen(8089); console.log('Proxy listens in 8089');浏览器输入 http://localhost:8089/,遇到如下错误消息:The requested URL “http://%5bNo%20Host%5d/index.html/”, is invalid.在 proxy 服务器构造时,添加一行 changeOrigin:true, 后,错误消失:这行代码的作用:changeOrigin: true/false, Default: false - changes the origin of the host header to the target URL意思是:置为 true,可以将 host header 的 origin 值,更改为目标 URL。我们可以把 HTTP server 构造时指定的 target 字段,设置到 proxy.web 方法里,仍然工作:第 15 行 web 方法的第三个参数,接收一个字段为 target 的 JSON 对象,值为期望跳转到的目标 url.同第一种方法不同,大家注意到,这种方法,我们在地址栏里输入了 localhost:8089, 打开被代理的百度网页后,地址栏里的 localhost:8089 保持不变:const http = require('http'); const httpProxy = require('http-proxy'); const targetUrl = 'https://www.sap.cn/index.html'; const baidu = 'https://www.baidu.com'; const proxy = httpProxy.createProxyServer({ //target: targetUrl, changeOrigin:true, secure:false }); http.createServer(function (req, res) { proxy.web(req, res, { target: baidu }); }).listen(8089); console.log('Proxy listens in 8089');但是对于 sap 官网来说,有一个重定向的行为:Access to fetch at ‘https://wappass.baidu.com/static/captcha/tuxing.html?&logid=11334581951689513341&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fbaidu&signature=266d81f92ed0df604946084fd4d93f4c×tamp=1661502581’ (redirected from ‘http://localhost:8085/baidu’) from origin ‘http://localhost:8085’ has been blocked by CORS policy: The ‘Access-Control-Allow-Origin’ header has a value ‘http://wappass.baidu.com’ that is not equal to the supplied origin. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.正常情况下,使用 fetch 请求绝对路径:在 Chrome 开发者工具 network 标签页里,没有观察到 OPTIONS 请求:直接就是 HTTP GET CORS 错误了。当站点 A 尝试从站点 B 获取内容时,站点 B 可以发送一个 Access-Control-Allow-Origin 响应标头,告诉浏览器该页面的内容可以从某些来源访问。 源是一个域(domain),加上一个方案(scheme)和端口号。
CL_GUI_FRONTEND_SERVICES 提供了 GET_SAPLOGON_ENCODING 方法,能返回 SAPGUI 环境下默认的系统 System Code page 值。使用函数 SCP_CODEPAGE_FOR_LANGUAGE 获得系统当前的 Code Page:输入参数为当前系统登录语言。这里得知,语言 E 的 System Code page 为 4103:TCP00 数据库表里,4103 是字符集 UTF16-LE 在 ABAP 系统的编号。这个 FETYPE 是 Frontend Type 的意思吗?值为 MS,是指 Microsoft 操作系统吗?frontend codepage 通过 CALL 调用之后,值变为 1160:在 TCP00 数据库表里,1160 Code Page 对应的 CPCompany 为 MS,果然是 Microsoft 的意思。这里还有其他的 provider company,比如 IBM,SAP 等。CPENCODING 的值 为 4:ISO/ASCII-base, 8 bits01- one byte charactersSCP_GET_JAVA_NAME, 传入是 ABAP 格式的 code page 值 1160,输出一个字符串,Cp1252,这是 Java 世界里的 Code page 名称?默认使用 Java Code Page:cp1252根据 cp1252 和 J,进行逆运算,可以反得出 1160,这是 ABAP 和 Java Code page 的互相转换。因此执行报表,打印出的默认 code page 为 Cp1252,就是这么来的。在弹出框手动输入 external code page,比如 UTF-8:UTF-8 的 ABAP encoding 编号是 4110:rv_upload_parameters-code_page_ui 变量维护的就是用户在弹出对话框里手动输入的 code page:UTF-8 是 ABAP ENCODING 的编号,UTF8 是对应的 Java 编号:只要是用 4110 就行:这里的 CPCOMPANY 换成了 ISO,而不是之前的 MS - Microsoft接下来就是我们熟悉的逻辑了,将 encoding 格式为 UTF-8 的 xstring 二进制内容,连同 UTF-8,一起传递到 CL_ABAP_CONV_IN_CE 的 create 方法里:/ui5/cl_ui5_rep_utility 提供了很多有用的工具方法,比如在 xstring 和 string 之间互相转换的 convert_xstring_2_string 方法:上面这个例子,就是把 iv_xstring 变量里包含的 binary 值,基于 code page 4110,转换成字符串
本文介绍笔者在 SAP Marketing Cloud 工作项目中使用 Restful API SDK 过程中积累的一些使用经验。成功登录 SAP Marketing Cloud 系统之后,可以在菜单"快速启动"->"Manage Contacts"里找到Marketing Cloud contact管理应用。单击:这里就能看到该系统里所有的contact列表了。左边的1218377是系统contact总个数,正下方Create就是新建按钮,可以通过这个按钮打开contact创建页面。右边的search bar就是一个Google风格的模糊搜索入口。这个界面第一次使用的话需要注意一些小技巧。上图高亮的四个控件实际上是四个过滤器,例如当前系统里并不存在状态为For Review的contact,数字为0,因此单击这个过滤器后:表格会显示0条数据。这是用户期望的行为,因此大家如果看到表格是空的,不要觉得奇怪。当单击某条contact数据的超链接后,会跳转到contact明细页面. 下图url里高亮的guid就是这条contact在SAP数据库里的主键值。使用nodejs对Marketing Cloud的contact主数据进行修改操作假设在Marketing Cloud有这样一个contact主数据:现在需求是使用编程语言比如nodejs修改这个contact实例的高亮属性。代码如下:var config = require("./mcConfig"); var request = require('request'); var url = config.tokenURL; console.log("user: " + config.user + " password: " + config.password); var getTokenOptions = { url: url, method: "GET", json:true, headers: { 'Authorization': 'Basic ' + new Buffer(config.user + ":" + config.password).toString('base64'), "content-type": "application/json", "x-csrf-token" :"fetch" } }; function getToken() { return new Promise(function(resolve,reject){ var requestC = request.defaults({jar: true}); console.log("Step1: get csrf token via url: " + url ); requestC(getTokenOptions,function(error,response,body){ var csrfToken = response.headers['x-csrf-token']; if(!csrfToken){ reject({message:"token fetch error: " + error}); return; } console.log("Step1: csrf token got: " + csrfToken); resolve(csrfToken); }); }); } function updateContact(token){ return new Promise(function(resolve, reject){ var sPostData = "--batch_1f7d-bd35-caed" + "\n" + "Content-Type: multipart/mixed; boundary=changeset_8f9e-9a44-9f9e" + "\n" + "\n" + "--changeset_8f9e-9a44-9f9e" + "\n" + "Content-Type: application/http" + "\n" + "Content-Transfer-Encoding: binary" + "\n" + "\n" + "MERGE Consumers('02000A21209F1EE99CDF1A1FC9AA8065')?sap-client=100 HTTP/1.1" + "\n" + "Cache-Control: max-age=360" + "\n" + "sap-contextid-accept: header" + "\n" + "Accept: application/json" + "\n" + "Accept-Language: en" + "\n" + "DataServiceVersion: 2.0" + "\n" + "MaxDataServiceVersion: 2.0" + "\n" + "x-csrf-token: fQ2Pwfmf0K_LVYoKV9QYUw==" + "\n" + "Content-Type: application/json" + "\n" + //"Content-Length: 215" + "\n" + "\n" + "{\"YY1_CustomerType_ENH\":\"Jerry测试1\"}" + "\n" + "--changeset_8f9e-9a44-9f9e--" + "\n" + "\n" + "--batch_1f7d-bd35-caed--"; var requestC = request.defaults({jar: true}); var createOptions = { url: config.updateContactURL, method: "POST", json:false, headers: { "content-type": "multipart/mixed;boundary=batch_1f7d-bd35-caed", 'x-csrf-token': token }, body:sPostData }; requestC(createOptions,function(error,response,data){ if(error){ reject(error.message); }else { debugger; console.log("Contact updated successfully"); resolve(data); } }); }); } getToken().then(updateContact).catch((error) =>{ console.log("error: " + error.message); });我在nodejs代码里把需要更改的字段值赋为"Jerry测试1”:执行之后这个属性被成功更新了:
最近笔者由于项目需要,又得学习一个新工具:SAP Cloud Platform Integration,简称 CPI,以前又叫做HCI - HANA Cloud Platform Integration Service.笔者想通过本文,把使用这个工具的第一手体会,分享给曾经用过SAP CRM中间件,但尚未有机会接触到CPI的朋友们。之所以本文标题里把SAP CRM中间件和SAP CPI关联在一起,是因为二者同广义上说,扮演的都是系统集成里中间件的角色。SAP ERP和CRM通过qRFC进行业务数据同步,而中间件能够提供队列机制,错误处理,重试,传输监控等功能。而SAP CPI顾名思义,则是云时代下SAP推荐的SAP产品同第三方云产品进行集成的云端中间件解决方案。SAP CPI(Cloud Platform Integration)是一种通过云端集成不同系统的解决方案。它是 SAP Cloud Platform Integration Suite 的一部分。 CPI 能够连接系统、服务、人员、数据、人工智能、物联网。尽管云应用在很长一段时间内被业界广泛讨论,但在企业管理软件领域,不少公司仍然更愿意使用本地解决方案,或者至少是混合解决方案(Hybrid Solutions)。 近些年来 SAP 在公有云和私有云解决方案上做出了巨大的投资,发布 S/4 HANA 的云版本以及后续活动则充分证明了 SAP 向云端转型的决心。而 SAP CPI 则是 SAP 本地解决方案,SAP 云端解决方案和第三方系统之间互联的重要工具和手段之一,旨在完成关于数据的协议、结构、类型和格式的转换。其用于建模 IFlow 的技术是 Java、JavaScript 或 Groovy Script.作为学习笔记,Jerry这里把我学习SAP CPI时做的一个Hello World级别的练习步骤记录下来。这个练习的场景是,假设有一个部署在第三方云平台上的OData服务,提供了产品主数据查询的功能。我们需要在SAP系统里消费这个OData服务。SAP开发人员不希望直接去消费第三方云平台上的OData服务,而是期望SAP CPI能暴露一个更加容易访问的API endpoint出来,例如通过postman传一个Product ID给CPI,CPI拿到这个ID后,由CPI向第三方云平台发起OData请求,拿到请求响应后,CPI把结果返回给位于SAP产品的消费端。用于这个场景的OData服务地址:https://espmrefapps.hana.ondemand.com/espm-cloud-web/espm.svc/$metadataSAP CPI是一个SaaS应用,在SAP云平台控制台的Subscriptions面板里订阅和访问。点击Go to Applications进入主操作页面。我们为了实现这个集成场景需要在CPI里开发一个集成流 - integration flow(下文简写为iFlow), 用于定义当其收到消费者传入的product ID后,应该进行何种处理。和ABAP里的程序需要存储在一个开发包里一样,iFlow也需要存储在一个包里,称为Content package.进入CPI后在此处创建一个Content package:然后点击上图的Artifacts进入iFlow创建界面:取名Jerry first integration flow, 再点击就能进入iFlow的图形化编辑界面了。一个新的iFlow创建之后的默认界面如下:点击上图最左边的Sender图标,将其拖拽到上图中间integration process矩形框内的Start图标内,这个动作会帮助我们创建一个inbound adapter,类型我们选择HTTPS,意思是这个iFlow期望其被消费的方式是HTTPS.在Adapter的Address里维护一个url片段/CloudIntegrationTrials, 等到最后该iFlow正式部署后,生成的endpoint就是以该片段结尾,届时我们可以在postman等工具里使用该endpoint消费这个iFlow.考虑到现在流行的Restful API实现都期望其消费者以JSON格式传输请求内容,我们也沿用这个最佳实践,因此首先拖拽一个JSON to XML Converter到iFlow integration process建模区域的矩形框里,将JSON 格式的用户输入转换成XML格式:然后再使用Content Modifier,将XML格式里的product ID的值提取出来。下图展示了Content Modifier通过XPath将XML格式的输入里的productIdentifier这个字段的值提取出来。有了product ID,可以进行OData调用了。从iFlow建模的工具箱里拖拽一个External Call出来:类型选择成OData V2:指定前面提过的OData服务的url:选择该OData服务的Products节点作为消费的对象:将OData Product节点的ProductId字段绑定到前一步骤通过Content Modifier解析出来的包含了用户输入的productIdentifier字段。就像小朋友们搭积木一样,我们把iFlow工具箱里提供的元素,通过拖拽的方式组合成了一个图形化的流程。点击Deploy进行部署:部署成功之后,抄下这个生成的endpoint:在Postman里向这个endpoint发送一个GET请求:部署在SAP Cloud Platform上的CPI iFlow接收到了请求后,就会按照我们维护好的逻辑,解析出Product ID,调用OData服务,将该ID对应的Product明细数据作为结果返回给消费端。和SAP CRM中间件有各种通过事务码比如SMW01访问的监控应用一样,SAP CPI也有类似的监控程序:希望这个最简单的例子能让还没有接触过SAP CPI的朋友对其作用有个最直观的了解,感谢阅读。总结本文首先将 SAP Cloud Platform Integration 同 SAP On-Premises 解决方案下的 CRM 中间件进行了对比,接着阐述了 SAP CPI 在 SAP 向云端转型过程中扮演的重要角色,最后通过一个具体的 iFlow 开发例子,力求给没有使用过 CPI 的开发者一个最直观的印象。
本文讲解使用 SAP UI5 barcode scanner 调用本机摄像头时,在 PC 端浏览器测试时,同样是 Cordova API 不可用,进入 else 分支的执行逻辑:如果 Cordova API 不可用,但是 isUserMediaAccessSupported 仍然返回 true,则仍然可以打开 scan 对话框:/** * Used to detect browsers which does not have access to html5 user media api and cant use device camera * @private * @returns {boolean} true is user media access supported by html5 compatible browser */ function isUserMediaAccessSupported() { return !!(window && window.navigator && window.navigator.mediaDevices && window.navigator.mediaDevices.getUserMedia); }这里 window.navigator.mediaDevices.getUserMedia 的含义:MediaDevices.getUserMedia() 方法提示用户允许使用媒体输入,该输入生成一个 MediaStream,其轨道包含所请求的媒体类型。例如,该流可以包括视频轨道(由硬件或虚拟视频源(如相机、视频记录设备、屏幕共享服务等)产生)、音频轨道(类似地,由物理或 虚拟音频源(如麦克风、A/D 转换器等),以及可能的其他轨道类型。它返回一个解析为 MediaStream 对象的 Promise。 如果用户拒绝许可,或者匹配的媒体不可用,则分别以 NotAllowedError 或 NotFoundError DOMException 拒绝承诺。其中 getUserMedia 为浏览器原生实现。async function getMedia(constraints) { let stream = null; try { stream = await navigator.mediaDevices.getUserMedia(constraints); /* use the stream */ } catch(err) { /* handle the error */ } }传入 getUserMedia 的 constraints 参数:constraints 是一个对象,指定要请求的媒体类型,以及每种类型的任何要求。约束参数是一个具有两个成员的对象:视频和音频,描述请求的媒体类型。 必须指定其中之一或两者。 如果浏览器无法找到符合给定约束的指定类型的所有媒体轨道,则返回的 Promise 会被 NotFoundError DOMException 拒绝。如果为媒体类型指定了 true,则结果流中需要包含该类型的轨道。 如果由于任何原因不能返回一个,对 getUserMedia() 的调用将导致错误。虽然出于隐私原因无法访问有关用户相机和麦克风的信息,但应用程序可以使用额外的约束来请求它需要和想要的相机和麦克风功能。 以下表示对 1280x720 相机分辨率的偏好:{ audio: true, video: { width: 1280, height: 720 } }如果不存在此分辨率或更高分辨率的相机,则返回的 Promise 将被 OverconstrainedError 拒绝,并且不会提示用户。
笔者写过的和 Docker 容器技术的一些其他系列文章:Docker 实战教程之从入门到提高 (一)Docker 实战教程之从入门到提高 (二)Docker 实战教程之从入门到提高 (三)Docker 实战教程之从入门到提高 (四)Docker 实战教程之从入门到提高 (五)Docker 实战教程之从入门到提高 (六)Docker 实战教程之从入门到提高 (七)Docker 实战教程之从入门到提高 (八)Docker 技术三大要点:cgroup, namespace 和 unionFS, 从理论到实践在我们探讨容器和容器镜像的区别之前,对于容器技术的初学者来说,有必要先去了解,为什么从事云原生开发需要学习容器技术?随着企业数字化进程的不断深入发展,云原生技术成为业界一个炙手可热的话题。所谓云原生,以容器、微服务、DevOps 等技术为基础,提供对应用进行分布式部署和统一管理的平台和体系。云原生是一系列思想和工具的集合。从其概念定义可看出,容器技术是云原生的基石。在云原生领域工作的开发人员,如果不了解和掌握容器技术,好比试图在浮沙堤上修建高楼大厦一般。什么是容器在介绍为什么我们需要容器之前,请大家先回忆一下自己的第一个 Hello World 程序的诞生史。在我们费尽千辛万苦,解决各种本地开发工具配置(编译器,环境变量等等)的问题之后,终于看到了 Hello World 的输出,那份喜悦之情不言而喻,但我们也绝不会忘记在遇到各种各样的环境配置问题时的沮丧和无助。笔者在基于本地部署(On-Premises)的企业级管理软件领域工作十余年,遇到过一些同样版本的应用程序,在开发机和测试机上能够正常运行,部署到生产环境之后出现故障的棘手问题,最后经过排查,这些问题都是因为运行环境的差异所导致。而容器技术作为一种轻量级、可移植和自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。采用容器技术,开发人员在自己本地开发环境创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行,从而能够彻底避免软件因为运行环境的差异而可能出现的各种运行问题。初学者理解容器技术,可以从容器一词的字面含义入手。想象一下现实生活中的集装箱。我们要把一批货物从一个地方运输到另一个地方,只需要把货物按照标准规定打包放入集装箱内,集装箱与集装箱之间不会相互影响,集装箱也并不关心箱内到底装的是水果,衣物还是电子产品,所以这些货物的打包方式都遵循标准化规定。这些集装箱打包好之后,可以用通用的运输工具,比如汽车和货轮等进行运输。到了目的地之后,再用标准化的方式打开集装箱,取出里面的货物即可使用。很多刚刚接触容器技术的朋友,不容易弄清楚容器,容器镜像和 Docker 这几个词的区别和联系。我们首先来看容器和容器镜像。举个例子,执行命令行 docker search nginx,搜索结果的一条条记录就是一个个容器镜像。所谓镜像,就是一个静态概念,一个镜像由若干只读层(read-only layer)构成。上图左边是 Docker 镜像的内部实现细节,我们能看到多个只读层叠加在一起,层与层之间通过指针关联,这些层能够在运行 Docker 的宿主机的文件系统上访问到。Linux 的统一文件系统(union file system)技术将这些叠加的只读层合并成一个文件系统,该系统为这些只读层提供了一个统一的视角,从而为 Docker 的用户隐藏了多层的存在。从 Docker 用户的视角出发,一个 Docker 镜像只存在一个文件系统,即上图右边所示。这些文件系统的设计是 Docker 实现细节,一般情况下我们不用去深究。但如果您足够好奇,使用命令 sudo tree 浏览目录 /var/lib/docker 即可:比如我用命令 docker images 浏览下载到本地的 docker 镜像:其中一个叫 jerry-nginx 的镜像,是一个 web 应用,它的所有内容能在 /var/lib/docker 目录下的这个目录查到:讲完了容器镜像,我们再来看容器。容器和容器镜像一样,也是若干层的叠加,唯一区别是所有只读层的最上面一层,是一层可读可写层,如上图绿色图例所示。初学者可以记住这个简单的公式:容器 = 容器镜像 + 可读可写层我们如果用命令 docker ps --all 查看本机所有容器列表,会发现有的容器处于运行状态,有的处于退出状态。因此,一个处于运行状态的容器(running container)包含一个可读写的文件系统加上隔离的进程空间。容器里的进程可以对这个可读写文件系统内的文件进行修改、删除、创建等操作。镜像里每一层其实都能在 docker 文件夹的 containers 子目录下找到:上图每一个红色文件夹代表镜像里的一层,蓝色文件包含了该层运行时的日志文件,或者网络相关配置等。做个实验:ubuntu 这个容器执行结束后,使用 find / -name i042416.txt 文件,这说明 docker 运行时能对宿主机的文件系统进行写操作。下面分析几个常用的易混淆的命令。docker create先看它的帮助文档:试着执行以下:产生一个输出 id:7ee10851c3f1e53bbd35e5f196f34de560afa1a20d9bf1ced587630dbcda877bcreate 创建的容器,状态变为 created:docker create 命令给通过命令行传入的容器镜像创建了一个新的可读可写层,从而生成了一个新的容器实例:然后再执行 docker start,输入 docker create 创建的容器实例 ID,就可以启动这个容器实例了。而 docker run 其实就是 docker create 和 docker start 这两个命令合二为一的版本。总结本文首先将容器这个对初学者来说比较陌生的概念,类比成现实世界中的集装箱,让读者对容器概念有一个直观的理解,接着阐述了容器和容器镜像的区别。希望这篇文章能帮助大家理解容器和容器镜像的区别。笔者写过的和 Docker 容器技术的一些其他系列文章:Docker 实战教程之从入门到提高 (一)Docker 实战教程之从入门到提高 (二)Docker 实战教程之从入门到提高 (三)Docker 实战教程之从入门到提高 (四)Docker 实战教程之从入门到提高 (五)Docker 实战教程之从入门到提高 (六)Docker 实战教程之从入门到提高 (七)Docker 实战教程之从入门到提高 (八)Docker 技术三大要点:cgroup, namespace 和 unionFS, 从理论到实践
为什么这篇文章要把 C 语言和 ABAP 放在一起讲,而不是别的语言比如 Java 和 ABAP呢?因为 ABAP 语言底层是基于 C/C++ 实现的,包括其关键字(比如最简单的关键字 WRITE 的 C++ 实现有 2 千多行)和虚拟机(ABAP Runtime)。SAP 内部的一群计算机科学家们发明了 ABAP 这门伟大的语言,由它实现的各种 SAP 应用帮助了全球超过 180 个国家和地区的客户们更好地运行其业务。通过 Google 我们能搜索到一些关于这些 SAP 计算机科学家们的介绍,比如这个链接:比如像下图这种用 kernel module修饰的 sc_km_check_feature_2, 以及每一个 ABAP 关键字,其 C 语言的实现代码在 SAP 内部的 Netweaver 系统可以查看到,但是在客户系统上,则是以二进制目标文件的形式存储,无法查看源代码。本文的目的是希望通过 C 语言和 ABAP 编译过程的一些介绍,加深 ABAP 顾问们对这门语言的理解。用C语言写个Hello World程序,另存为study.c:用命令行 gcc ./study.c --verbose 进行编译,参数 verbose 可供我们查看编译明细。上述命令行在我的Ubuntu系统上产生一串长长的输出:我们可以一步步分析。首先用参数 -E查看预处理生成的目标文件study.i:gcc -E study.c -o study.i可以看到源代码文件只有 78 字节,编译预处理后生成的输出文件有 17116 字节。为什么膨胀了这么多?原因是因为我源代码文件的第一行,#include<stdio.h> 被预处理器替换成了 stdio.h 的实际内容,而 stdio.h 里如果又存在 #include 其他文件的声明,这个替换过程会递归执行。因此直到 study.i 的末尾部分,我们才能看到在 study.c 里书写的源代码部分。源代码文件 study.c 里的第一行语句 #include<stdio.h>, 请大家记住,后面讲 ABAP 还会提到。用命令行 gcc -S 可以查看 study.c 编译后生成的汇编代码:看到这些 pushq, popq, %rbp,Jerry 不由得想起本科汇编程序设计专业课上,我和寝室其他兄弟坐在教室最后一排看体坛周报的时光。工作十多年后,Jerry 不得不承认,当时本科开设的计算机专业课,像数据结构,操作系统,计算机组成原理,编译原理,汇编程序设计,计算机图形学这些都是有用的,工作后,公司不可能再给你时间去学习这些基础理论知识了。虽然汇编程序设计这门课 Jerry 当初没有好好学,但至少教材我是妥善保存了的,以防哪天公司的工作安排需要让我把十多年前在学校学的东西重新又捡起来。下面我们来聊聊 ABAP。SAP note 1230076 Generation of ABAP loads: Tips for the analysis 介绍了一个工具程序:RSDEPEND. 这个 note 提到,一个即便看起来最简单的 ABAP Hello World 报表,其实也依赖于许多标准的 Repository 对象,这些依赖我们假定称其为A,B,C。假设 A,B,C 其中有任何一个有改动产生,比如 A 是一个 include 程序,里面使用到了一个 DDIC 结构,在某个时刻,系统导入了一个传输请求(Transport Request), 里面包含了针对这个 DDIC 结构的更改,那么此时这个最简单的 Hello World 报表的 load 就成为了 obsolete 状态。在重新执行该报表之前,ABAP Runtime(中文译成 ABAP 运行时)会自动做一个 load invalidation 操作,生成一个最新版本的 load.什么是 ABAP load?看 ABAP help 里的官方定义:In the ABAP environment, a load describes a binary representation of a repository object which is optimized for fast access, in the memory or on the database.翻译成中文:ABAP load 是 Repository 对象的二进制表现形式,针对 ABAP 环境的快速访问而做过特别优化,可以存储在数据库表中或者加载于内存里。我们用一个实际的例子来理解 ABAP 报表激活和运行时发生的事情。创建一张非常简单的透明表 ZLOADTEST:写一个简单的报表,命名为 ZTESTLOAD. 报表的源代码以压缩的格式存储在表 REPOSRC 的 DATA 字段里。测试报表的源代码很简单,把表里的数据全部读取出来:激活这个简单的报表(是的,在 ABAP 世界里,我们习惯说激活,而不是编译)。激活后生成的 ABAP load 存储在表 REPOLOAD 的字段 LDATA 和 QDATA 里。这两个字段存储的内容就是前面 ABAP help 提到的 ABAP load 在数据库表中的存储形式。菜单 Goto->Navigate to->Switch to Classic Debugger:Goto->System Areas->Internal Information:在 System Area 区域输入 CONT,就能在下图的 NAME 列看到 ABAP load 里包含的指令。当然同开源的 JVM 不同,JVM 字节码指令集在网上能够查到,而这些 ABAP load 的指令是 SAP internal 的,因此不能在这里做解释。然后执行前面提到的工具报表 RSDEPEND, 输入参数 program name = ZTESTLOAD, 得到结果,其中测试报表的 ABAP Load 时间戳为 07:21:02, 这个报表依赖的标准 Include 有:DB__SSEL由此看出,每一个标准的 ABAP 报表都自动包含了这些 include. 如果开发人员显式地再包含其中任意一个,会遇到语法错误:Module %_PF_STATUS is already defined as a OUTPUT module大家觉得这个 <REPINI> 是不是很像前文 C 语言部分提到的 #include<stdio.h> ?下面我们再做几轮测试。测试1修改透明表的描述信息,然后重新激活透明表。执行 RSDEPEND, 可以看到只有透明表的 Last Changed 字段发生了变化,ABAP Time Stamp 和 Screen Time Stamp 都不变,这是我们期望的结果,因为我们只是修改了透明表的描述信息,并未修改结构。再次执行测试报表 ZTESTLOAD, 用 RSDEPEND 检测,发现测试报表的 ABAP Load 时间戳没有发生变化,这说明:即使依赖的透明表的描述信息发生变化,使用了该透明表的 ABAP 报表不需要重新编译,因为透明表描述信息不需要在报表执行期使用。测试2给透明表增加新的一列,再次激活。此时通过 RSDEPEND 发现,透明表的三个时间戳全部发生了变化,如下图蓝色矩形框所示。然而测试报表 ABAP Load 本身的时间戳仍然未变,这也是合理的,因为我们给透明表里增加了新的列后,还未执行测试报表。再次执行 ZTESTLOAD 后,这次发现它的 ABAP Load 已经被自动 invalidate 了,时间戳从07:21:02 变成了 07:36:02。这也解释了一个现象:有的朋友们观察到,当系统刚升完级后,或者有一批新的传输请求导入到系统后,第一次使用 SAP 应用时,系统响应速度很慢。原因其实通过前文的两个测试已经说明了:系统在花费时间去做相关 ABAP Load invalidation. 在应用依赖的这些 Load invalidation 没有结束之前,系统无法响应用户请求。为了避免用户在第一次使用应用时长时间等待,可以使用事务码 SGEN 预先进行 Load invalidation. SGEN 详细的使用方法可以参考下面这篇文章希望这篇文章能给那些想了解 ABAP 语言底层一些实现细节的顾问朋友们有所帮助。总结ABAP 是基于 Netweaver 技术栈的 SAP 产品比如 CRM,S/4HANA 等的业务逻辑和底层系统平台实现采取的编程语言。ABAP 是一门高级面向对象的编程语言,其运行时和内核基于 C/C++ 实现。本文通过一些具体的 ABAP 报表例子,介绍了 ABAP 语言的一些底层实现细节。
本教程的前一篇文章:MongoDB 入门教程系列之一:开发环境搭建以及 Node.js 和 Java 的读写访问,我们首先介绍了 MongoDB 本地环境的搭建,接着举了两个具体的例子,展示了如何使用 Node.js 和 Java 访问 MongoDB 存储的数据。本教程继续介绍如何使用业界流行的开发工具来操作 MongoDB.Spring Boot 是一个轻量级框架,可以完成基于 Spring 的应用程序的大部分配置工作。Spring Boot 的目的是提供一组工具,以便快速构建容易配置的 Spring 应用程序,为应用开发人员省去大量传统 Spring 项目的繁琐配置。本教程第一篇文章已经介绍过,MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。本文介绍如何使用 Spring Boot 操作 MongoDB,从而通过 Java 代码在 MongoDB 里插入数据。首先按照本教程前一篇文章的介绍,在本地搭建好 MongoDB 的开发环境。新建一个 Java 项目,pom.xml 的内容如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.springframework</groupId> <artifactId>gs-rest-service</artifactId> <version>0.1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver</artifactId> <version>3.6.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> </dependencies> <properties> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-releases</id> <url>https://repo.spring.io/libs-release</url> </pluginRepository> </pluginRepositories> </project>其中下面这个 dependency 的作用是为 SpringBoot 应用提供操作 MongoDB 的功能:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>而这个 dependency 能让您的 Spring Boot 应用支持 junit:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>在 src/main/test 文件夹下创建一个以 Tests 结尾的 .java 文件,我的例子里是ApplicationTests.java:将如下代码粘贴进去:package main.test; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import main.java.library.Application; import main.java.library.Book; import main.java.library.BookRepository; @RunWith(SpringRunner.class) @SpringBootTest(classes=Application.class) public class ApplicationTests { @Autowired private BookRepository bookRepository; @Before public void setUp() { bookRepository.deleteAll(); } @Test public void test() throws Exception { bookRepository.save(new Book("1", "didi", "Jerry")); } }第 27 行代码,新建了一个 Book 对象,id为 1,name 为 didi,作者为 Jerry.然后通过 bookRepository 加入到 MongoDB 里。BookRepository 的实现:import java.util.Optional; import org.springframework.data.mongodb.repository.MongoRepository; public interface BookRepository extends MongoRepository<Book, String>, BookRepositoryCustom { public Optional<Book> findByName(String name); }在 Eclipse 里,确保这个 JUnit 单元测试运行成功:在 MongoDB Compass 里成功看到这条插入的记录:总结SpringBoot 是一个基于 Spring 的 Java 应用开发框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程,能够帮助开发人员专注于业务开发任务本身上去。本文在系列第一篇文章的基础上,介绍了在 SpringBoot 应用里对 MongoDB 的读写访问实现细节。
微信框架 API 的调用通过迄今为止的介绍,大家对微信小程序的视图和控制器,微信调试器,以及如何在微信控制器里编写 JavaScript 函数来响应微信小程序的用户事件,已经有了一个最基本的认识了。我们现在来开发一个微信小程序的实际例子,进一步巩固以前学到的知识。这个例子的效果如下:在微信小程序上显示一个按钮:获取头像昵称。点击之后,微信小程序会自动通过微信框架提供的 API 把当前点击这个按钮的微信用户的明细,比如昵称,头像,所在省份,城市等信息取回来,并且显示在小程序页面上, 如下图所示。视图设计:<view class="userinfo"> <button open-type="getUserInfo" bindgetuserinfo="jerry_getUserInfo"> 获取头像昵称 </button> <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image> <text class="userinfo-nickname">{{userInfo.nickName}}</text> <text class="userinfo-nickname">{{userInfo.city}}</text> <text class="userinfo-nickname">{{userInfo.country}}</text> <text class="userinfo-nickname">{{userInfo.province}}</text> </view>这个视图里一共有 6 个 UI 元素,其中 1 个 button 元素,1 个 image 元素和 4 个 text 元素。button 元素负责响应用户点击事件,调用微信框架的 API 读取用户明细。1 个 image 元素负责显示点击该按钮的微信用户头像,剩下的 4 个 text 元素显示微信用户的明细。后 5 个UI元素的绑定路径均为userInfo,而 userInfo 的数据是点了 button 后通过调用微信 API 读取的。这个 userInfo 是我们在控制器 index.js 里定义的数据模型:Page({ data: { userInfo: {} } });我们回过头来看本文这个小程序最重要的 button 元素,它有两个属性:open-type=“getUserInfo” :说明该 button 点击之后,自动调用微信框架的 API getUserInfo;bindgetuserinfo=“jerry_getUserInfo”:指定了一个回调函数的名称,该回调函数在我们的控制器 index.js 里实现。当微信框架的 API 调用成功取回微信用户明细后,会将微信用户明细作为输入参数,调用我们写的这个回调函数。jerry_getUserInfo: function(e) { app.globalData.userInfo = e.detail.userInfo this.setData({ userInfo: e.detail.userInfo }); }在小程序能够访问的上下文里,有一个全局变量 wx,里面包含了所有微信框架暴露出来的API:在微信小程序官网上有关于这个 wx的所有成员说明:我们再试试另外一个 API:getSystemInfo.首先在小程序视图里定义一个按钮,绑定一个 JavaScript 函数 jerry_systeminfo, 用于触发 getSystemInfo:<button bindtap = "jerry_systeminfo"> 获取系统信息 </button>然后定义七个 UI 元素,用于显示 getSystemInfo 的返回结果。<text class="userinfo-nickname">{{systeminfo.model}}</text> <text class="userinfo-nickname">{{systeminfo.pixelRatio}}</text> <text class="userinfo-nickname">{{systeminfo.windowWidth}}</text> <text class="userinfo-nickname">{{systeminfo.windowHeight}}</text> <text class="userinfo-nickname">{{systeminfo.language}}</text> <text class="userinfo-nickname">{{systeminfo.version}}</text> <text class="userinfo-nickname">{{systeminfo.platform}}</text>wx.getSystemInfo 返回的结果作为一个输入参数,自动传入到我们定义的 success 回调函数里,然后再用 setData 设置到视图的数据结构里。jerry_systeminfo: function(){ var that = this; wx.getSystemInfo({ success: function (res) { var systeminfo = {}; systeminfo.model = res.model; systeminfo.pixelRatio = res.pixelRatio; systeminfo.windowWidth = res.windowWidth; systeminfo.windowHeight = res.windowHeight; systeminfo.language = res.language; systeminfo.version = res.version; systeminfo.platform = res.platform; try { that.setData({ systeminfo: systeminfo }); } catch(e){ console.log(e); } } }) },最后我在我的 Android 三星手机上点击“获取系统信息”之后,就显示出了我三星手机的型号SM-C7010 等详细信息。总结本教程首先介绍了微信小程序控制器里如何响应用户点击事件,然后通过一个实际的如何获取当前用户微信昵称和手机信号的例子,介绍了微信小程序如何消费微信平台 API 的方法。本教程前面两篇文章:微信小程序开发系列 (一) :开发环境搭建和微信小程序的视图设计与开发微信小程序开发系列 (二) :微信小程序的单步调试和控制器实现步骤概述
微信小程序的控制器实现严格意义上说,按照微信小程序官方文档里介绍的,微信小程序实际采取的是 React 和 Vue 的 MVMM 的设计思路,MVVM 是 Model-View-ViewModel 的简写,本质上是 MVC 模式的改进版。MVVM 架构中,View 的状态和行为被抽象化,从而将视图 UI 和业务逻辑分开。简单来说就是不要再让 JavaScript 直接操控 DOM,JavaScript 只需要管理状态,然后再通过一种模板语法来描述状态和界面结构的关系即可。下面我们来逐行分析 index.js 的代码://获取应用实例 const app = getApp();getApp是微信框架的方法,返回当前小程序的应用实例。通常情况下这是微信小程序控制器执行的第一行代码:这个应用实例的创建是在我们小程序控制器的访问范围之外由微信框架创建的,然后直接在getApp 函数里返回创建好的 app 实例:为什么这个 app 实例如此重要,以至于放到控制器的第一行代码来创建呢?我们直接在调试器里输入 app 然后回车,能看到这个 app 对象里包含了 globalData 这个属性和很多有用的方法。有了 app 实例后,下一步需要创建的就是 Page 实例了。这个实例代表当前小程序页面,通过构造函数 Page 进行创建。我们同样可以在微信小程序调试器里输入 Page 然后回车查看这个构造函数的源代码,或者直接单步调试进去学习。下图就是 Page 构造函数单步执行的情况,输入参数 e 为一个Json 对象:这个输入参数 e 包含的内容有:我们控制器 index.js 里实现的一个 json 对象,名称为 data(作为当前微信小程序页面的数据模型,即 MVC 中的 M),如下图红色下划线所示。我们控制器 index.js 里实现的三个 JavaScript 函数,用于响应小程序上用户点击事件。总结一下,任何微信小程序,其控制器的逻辑只有两步:调用微信小程序框架提供的标准函数 getApp, 获得一个小程序实例。调用微信小程序页面构造函数 Page,初始化页面实例。我们在控制器内主要的编码逻辑,主要集中在传入这个 Page 构造函数的输入参数,即一个 JSON 对象。而这个 JSON 对象包含的属性也只有两类:第一类是另一个 JSON 对象,作为 MVC 中的 M,即数据模型。这个 JSON 数据模型的字段被绑定到微信小程序视图的某个 UI 元素,比如 Text, Image 的对应属性,这样就自动把数据模型里的字段显示到 UI 上了。第二类是我们自己开发的 JavaScript 函数,用于响应微信小程序的用户输入,比如视图上的按钮点击事件等等。本系列的下一篇文章会详细介绍如何用 JavaScript 函数响应微信小程序的用户点击事件。总结单步调试技术是程序员学习几乎任何一门技术时都必须掌握的基本技能。本文首先介绍了在微信开发者工具里进行微信小程序单步调试的步骤,接着继本教程前一系列学习了微信小程序视图设计后,继续学习微信小程序的控制器实现。本教程前一步骤的文章:微信小程序开发系列 (一) :开发环境搭建和微信小程序的视图设计与开发。
操作系统可以使用一种称为重定位的技术来管理每个进程在内存中的存储位置。 操作系统核心模块通常存储在最高的内存地址中。 当程序编译并执行时,它从零地址位开始处理,最大地址等于总内存大小减去操作系统大小。 系统初始化进程被加载并分配一个连续的内存段。 进程的最小物理地址是基地址,该进程可以访问的最大物理地址是限制地址。重定位技术有两种方法:静态重定位和动态重定位。静态重定位在静态重定位过程中,操作系统调整一个进程的内存地址,以反映它在内存中的起始位置。一旦一个进程在内存中被分配了一个起始位置,它就会在其分配的空间内执行。一旦静态重定位过程完成,操作系统直至其终止之前始终无法再次针对该进程进行重定位。动态重定位在动态重定位方法中,硬件将重定位寄存器(基值)添加到编译器生成的虚拟地址中。重定位寄存器允许转换为物理内存地址。硬件将此内存地址与限制寄存器(已分配部分中可用的最大值——此内存地址必须小于限制)进行比较。如果内存地址高于限制,处理器会进行地址陷阱并忽略物理地址。动态重定位的优点很多。 第一个也是最重要的优点是操作系统可以在必要时轻松移动进程。这带来了第二个优势:一个进程具备随着时间的推移而增长的能力,因为它可以很容易地重新定位到更大的内存块。动态重定位由硬件执行并且很简单——它需要两个特殊的寄存器、一个简单的加法和一个简单的比较运算。动态重定位也有缺点。 虽然相对便宜,但由于上面概述的附加操作,它确实一定程度上减慢了硬件速度。
在 Windows中,当一个应用程序窗口被关闭后,该应用程序将仅保留在外部存储设备中。计算机的主存储器称为 RAM(即 Ramdom Access Memory,随机存取存储器)。我们可以把主存储器想象成电脑用来完成工作的工作空间,比如一张桌子。当我们双击 Windows 操作系统资源管理器里的一个应用程序、打开一个文档或做很多事情时,这张办公桌的一部分会被覆盖,不能被其他任何东西使用。当我们不断双击打开更多文件时,就像用越来越多的文件覆盖这张办公桌一样。铺有少量文件的办公桌很容易使用,但是当一张办公桌铺满一堆东西后,这种工作区很难高效使用。除了 RAM 之外,计算机还需要具有长期记录数据能力的外部设备,比如硬盘驱动器 (HDD) 或固态驱动器 (SSD) 等存储设备,用来在系统关闭之后持久化存储数据。我们可以把外部存储设备想象成现实生活中办公室的文件柜——一个靠近工作空间(RAM,计算机主存储器)的地方。我们可以随时把文件柜(计算机外部存储设备)里的文件重新取出,放回到办公桌(计算机主存)中。当我们在办公桌上处理完工作之后,需要把完成的文件放到文件柜里,这个动作就好比关闭应用程序的窗口,放到文件柜里的文件,好比被关闭的应用程序。
方法2:使用 SAP UI5 自定义控件这种方式本质上同方法一异曲同工,只不是封装性更好,将方法1 描述的步骤,封装成一个 SAP UI5 可重用控件,方便使用 SAP UI5 这个前端框架进行开发的前端程序员直接使用。关于 SAP UI5 这个企业级前端开发框架的介绍,参考笔者之前的 InfoQ 文章:面向企业级前端应用的开发框架 UI5 的发展简史介绍。先回忆方法1 技术实现的要点:(1) 在 web 应用的 HTML 页面里定义 HTML5 用于显示视频的原生标签: video(2) 使用 WebRTC 的 API,获取设备摄像头对应的 MediaStream 对象,再将这个对象实例赋给 video 标签对应的 DOM对象的 srcObject 属性.以上两步实现之后,我们通过摄像头观察到的视频图像,就能实时显示在 web 应用的 video 标签里了。至于将某一时间点里 video 标签里显示的视频内容保存成图片并下载,其对应的 JavaScript 代码对于所有的前端框架并没有太大的不同,本文略过。因此,使用 SAP UI5 开发,我们无非得重复以上两个步骤。SAP UI5 应用最常用的视图格式为 XML 视图。我们直接在 XML 视图里加上 HTML 原生的 video 或者 div 标签,会发生什么?404 错误,UI5 框架加载不了 div.js 这个脚本文件。笔者以前还在 SAP 成都研究院 CRM Fiori 应用开发团队工作时,曾经写过一个 SAP UI5 框架代码的学习教程,里面有两篇文章,详细介绍了 SAP UI5 XML 视图运行时的渲染原理:Why my formatter does not work? A trouble shooting example to know how it worksHow I do self-study on a given Fiori control – part 10简单地说,就是 SAP UI5 里有个 XMLTemplateProcessor.js 的实现,运行时当 XML 视图的源文件被浏览器加载解析成 DOM 后,它会对 DOM 树进行深度优先遍历,对遇到的每一个 UI5 标签,加载其实现文件(如果是在 UI5 调试模式下),然后创建这个标签对应的实例。回到本文的例子,我写到 SAP UI5 XML 视图里的 div 标签被当成了一个 SAP UI5 XML 的控件,所以 UI5 框架自动去找这个根本不存在的 div 控件的实现文件,当然找不到了。知道问题出在哪里,解决的思路自然就有了。自己把 HTML5 原生标签 video 封装成 UI5 控件不就行了?SAP UI5 开源社区里已经有一个封装好的 library:https://github.com/tiagobalmeida/openui5-camera先看这个例子在笔记本电脑上访问的效果:点击页面上显示的摄像头拍摄的内容,能自动保存成一张图片。手机上的显示效果:然后再来看这个 library 的实现原理。这个 camera 自定义 UI5 控件实现的层级结果如下:SAP UI5 自定义控件的实现包括三个 JavaScript 文件:library.js:定义这个控件抬头级别的控制信息,比如名称,版本号,依赖等。Camera.js:实现了将 WebRTC API 获得的 MediaStream 对象实例绑定到控件封装的 video 元素上的步骤。CameraRender.js:负责将这个自定义控件在XML视图里的标签 Camera 渲染成原生的video和canvas标签的组合。SAP UI5 的每一个控件都有一个与之对应的渲染类,用于完成 XML 视图里 UI5 的标签到 HTML5 原生标签的转换:如何使用这个自定义控件呢?在 XML 视图里使用如下定义即可:<cam:Camera id="idCamera" width="800" height="600" snapshot=".onSnapshot" />总结本文介绍了基于 WebRTC 技术使用 JavaScript 调用本机摄像头的解决方案。WebRTC 可以为基于开放标准的应用程序添加实时通信功能,支持在对等点之间发送视频、语音和通用数据,允许开发人员构建强大的语音和视频通信解决方案。WebRTC 可用于所有现代浏览器以及所有主流操作系统的本地客户端。WebRTC 背后的技术是作为一个开放的 Web 标准实现,并且可以在所有主流浏览器中作为常规 JavaScript API 使用。本文两个例子在 Windows 10 操作系统的 Chrome 浏览器里实现并通过测试。对于原生客户端,如 Android 和 iOS 应用程序,可以使用提供相同功能的 WebRTC 库。希望本文介绍的知识点对大家采取 JavaScript 实现浏览器环境里调用本机摄像头的需求能有所帮助,感谢阅读。
Old space是 V8 托管(也称为垃圾收集)堆(即 JavaScript 对象所在的位置)中最大和最可配置的部分,而 --max-old-space-size 标志控制其最大大小。 随着内存消耗接近极限,V8 将花费更多时间在垃圾收集上,以释放未使用的内存。如果堆内存消耗(即 GC 无法释放的活动对象)超过限制,V8 将使您的进程崩溃(因为缺乏替代方案),因此您不想将其设置得太低。 当然,如果您将其设置得太高,那么 V8 将允许的额外堆使用可能会导致您的整个系统内存不足(并且由于缺乏替代方案而交换或终止随机进程)。总之,在具有 2GB 内存的机器上,我可能会将 --max-old-space-size 设置为大约 1.5GB 以留出一些内存用于其他用途并避免交换。当我在应用程序中运行“npm start”时,出现以下错误:FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory大多数在线发布的解决方案都是关于使用 NODE_OPTIONS="–max-old-space-size=2048" 增加内存。设置环境变量NODE_OPTIONS --max-old-space-size 环境变量允许增加节点的最大堆大小。 设置环境变量允许 Node 从您的环境中读取此值,因此我们不需要在每次运行 Node 命令时将此值作为参数传递。 这被设置为一个全局值,并且可以被每个 Node 进程使用。使用下列命令行设置环境变量:export NODE_OPTIONS="–max-old-space-size=8192"如果将此命令放在终端会话中,则需要在每个新会话中执行此操作。 为避免这种情况,您可以将其放入 shell 脚本文件中,终端会自动为您加载它。.bashrc 文件存在于 Linux 环境中,大多数评论都将重新加载 bash 作为一种快速方式,例如 source ~/.bashrc ,它在当前会话中加载环境变量。 可以随时重新启动终端以重新加载,但前者是首选! 同样,如果使用 Windows,请忽略这一点。命令行方式命令行:node --max_old_space_size=5000 yourapp.js第三种方式,基于项目"scripts": { "start": "cross-env NODE_OPTIONS=--max-old-space-size=8192 webpack" }
我使用 SAP UI5 Tools 的 CLI 工具,运行命令 npm run deploy 将 Visual Studio Code 里开发的 SAP UI5 应用,部署到 ABAP 服务器后,成功生成了 url:https://er9.sap:44300/sap/bc/ui5_ui5/sap/zjerrypureui5?sap-client=001但是浏览器打不开:错误消息:ICF Node NOT found!登录后台执行事物码 sicf,确实没有在路径 ui5_ui5 下面发现 zjerrypureui5 这个节点。下面的 url 是我之前这篇文章本地开发好的 SAP Fiori Elements 应用,如何部署到 ABAP 服务器上?成功部署到 ER9 系统后生成的 url:https://er9:44300/sap/bc/bsp/sap/jerryfioriapp/index.html一些常见的错误HTTP Status 504 - An internal application error occurred如果应用程序包含一个相当大的文件,并且 HTML5 dispatcher(位于从 SAP Web IDE 到 SAP 系统的 route 上)在尝试 dispatch 时出现超时,则可能会发生这种情况。有时,HTML5 dispatcher 的超时时间 (30s) 比 ABAP 系统本身 (5m) 更短。发生这种情况时,ABAP 系统实际上能够处理大文件的上传,但 HTML5 调度程序会在此过程中引发超时。解决方法是增加 HTML5 Dispatcher 的超时时间。为此,请按照访问 REST 服务中目标属性下的说明进行操作,并将超时增加到最大值 300 秒。如果您在提高超时后仍然遇到此错误,您可能需要执行 ICM 硬关机。 ICM (Internet Communication Manager) 处理所有inbound HTTP/HTTPS/SMTP 连接。使用 SMICM 事务查看这些连接的状态。如果您从 SAP Web IDE 推送应用程序,则可能需要硬关机,因为连接可能由于某种原因保持打开状态。通过选择 Administration ICM 从菜单触发该操作。如果问题仍然存在,请找到大文件并通过 SE80 事务手动上传。Namespace Errorsinfo builder:custom deploy-to-abap * Creating new SAPUI5 ABAP repository ZJERRYPUREUI5 *ERR! builder:custom deploy-to-abap Remote creation in customer namespace not possible in SAP systemsERR! builder:custom deploy-to-abap Upload canceled: SAPUI5 ABAP repository has not been created (successfully).遇到该错误消息后,如果到 ABAP 系统后台手动创建一个 SAP BSP 应用,就会遇到本文开头提到的错误:ICF Node NOT found!这些错误是由我们提供的命名空间 Z 引起的。目标系统在 SAP 或客户模式下运行。如果它在 SAP 模式下运行,则只能使用给定应用程序名称中的 SAP 命名空间,不能以 Z 开头。解决方案将 ui5-deploy.yaml 里 SAP UI5 部署到 ABAP 系统生成的应用前面的 Z 去掉即可。部署成功:
说明Jerry 从 2014 年加入 SAP成都研究院 CRM Fiori 开发团队之后开始接触 SAP UI5,曾经在 SAP 社区和“汪子熙”微信公众号上发表过多篇关于 SAP UI5 工作原理和源码解析的文章。在 Jerry 这篇文章 对 SAP UI5 一无所知的新手,从哪些材料开始学习比较好? 曾经提到,Jerry 也是从 SAP UI5 菜鸟一路走过来,深知只有 ABAP 开发背景的开发者,向 SAP UI5 开发领域转型的不易,因此我在业余时间设计了这份适合 SAP UI5 初学者的学习教程,把开发一个完整的 SAP UI5 应用的流程,拆分成若干个步骤,力求每个步骤里,把涉及到的知识点都涵盖到。这些知识点可能不像我的 UI5 源码分析系列文章那么深入,但力求浅显易懂,便于 SAP UI5 初学者理解。本教程每一个步骤的源代码,都存放在我的 Github 上,分别用文件夹 01,02,03 等等来标识。每一个步骤均是前一步骤的基础上,添加了若干新特性。建议零基础或者对 SAP UI5 知之甚少的初学者,按照顺序从第一个步骤开始循序渐进地学习,把这些代码下载到本地,配合教程的文字讲解,自己动手,以加深理解。大家如果对教程的每个步骤有任何疑问,欢迎在教程对应的步骤文章里给我评论,进行留言。本教程前 34 个步骤, SAP UI5 应用一直是在本地 Visual Studio Code 中开发并通过本地命令行 ui5 serve 启动然后本地测试的。本步骤我们将学习,如何使用 SAP UI5 Tools 的命令行,一键将这个本地开发好的 SAP UI5 应用,部署到 ABAP On-Premises 服务器上运行。要按照本步骤介绍的指令进行练习,必须先有一个可以使用的 ABAP On-Premises 系统才行。本步骤包含的源代码,在 Github 这个路径可以下载:https://github.com/wangzixi-diablo/ui5-tutorial/tree/main/35下面是详细的部署步骤讲解。
近日很荣幸地收到了阿里云邀请做一个关于阿里旗下无影云桌面的评测,从官网上了解到阿里云无影云桌面原名为弹性云桌面,融合了无影产品技术后更名升级,可广泛应用于具有高数据安全管控、高性能计算等要求的安全办公、金融、设计、影视、教育等领域。我是一个程序员,最近一年的工作是参与开发一个开源的电商前端(Storefront)项目,代号 Spartacus,使用的编程语言是 TypeScript,开发框架是 Angular. 这是我们项目的 Github 代码仓库:https://github.com/SAP/spartacus这是从本地开发环境运行 Spartacus 的一些截图:很高兴地接受了阿里的评测邀请之后,我就在琢磨:无影云桌面能否用来提高我日常开发 Spartacus Storefront 的工作效率?作为一个开源的电商前端应用,Spartacus 有着完善的端到端自动化测试,我们使用自动化测试框架 Cypress 来进行 UI 端到端测试和回归测试。每次开发人员使用 git 提交代码更改到 Github 仓库时,会触发基于 Travis CI 的持续集成脚本,在 CI 服务器上执行所有的 Cypress 自动化测试用例。下面是 CI 服务器上运行 Cypress 自动化测试的命令行:yarn --cwd ./projects/storefrontapp-e2e-cypress run cy:run:ci在我实际的开发过程中,我不时会遇到这种情况,本地修改了代码之后,单元测试全部通过,然后提交代码,发现 CI 服务器上的某些 Cypress 自动化测试用例执行失败。因为我们在 Travis CI 上执行的脚本内容较多,build 一次需要花费 40 多分钟的时间,所以靠在 CI 服务器上执行 Cypress 回归测试用例的方式来发现本地提交代码的缺陷,效率实在低下。因此,我就有了一个想法:把 Spartacus Cypress 自动化测试放到无影云桌面进行。这样,每次我在本地修改完代码之后,如果无影云桌面里能立即识别到这些代码修改,并在云桌面里运行所有的 Cypress 自动化测试,等全部测试都通过后,我再提交代码。这样,借助无影云桌面强大的计算性能,我可以事先把所有可能引起回归测试失败的代码缺陷都检测出来,这样能尽可能提高我提交代码之后,Travis CI build 的一次通过率。首先我在无影云桌面里安装了 Angular 开发必备的开发和构建工具,比如 yarn, npm, Node.js 等。下图是在云桌面上使用 Angular CLI 启动命令行的截图:下图是命令行启动的 Spartacus Storefront 运行在无影云桌面的 Chrome 浏览器里的截图,和在本地电脑里运行没有任何差别:感谢无影云桌面强大的磁盘映射功能,我能够直接在 PC 云桌面客户端里,直接通过图形界面以及命令行的方式,访问到我本地操作系统 C 盘的数据。下图的本地磁盘 C:DESKTOP-IC6UIET 图标, 代表的就是我本地计算机的 C 盘。通过 UNC 地址:\Client\C$\Code,可以在无影云桌面 powershell 命令行里访问本地操作系统 C 盘下的数据,命令行操作方式同在本地电脑使用没有任何区别:如果在无影云桌面里可以直接用命令行启动我本地电脑 C 盘的 Spartacus 应用,那就是最理想的情况了。于是我使用命令行,将本地电脑的 UNC 路径 \Client\C$, 映射成无影云桌面里的 Z 盘:net use Z: \Client\C$\然后在云桌面里打开 powershell,进入 Z 盘,使用 Angular CLI 的 ng serve 命令启动 Spartacus:然而等待了很长时间后,仍然没有看到 ng serve 命令的输出。同无影云桌面的支持人员沟通过,得知这种直接在云桌面里运行本机应用的场景不被支持。不过问题也不大,我在云桌面里使用 git 将 Spartacus 源代码克隆到云桌面的本地目录 C:\code\spa\spartacus-develop,然后每次我的本机目录 Z:\Code\SPA\spartacus 有代码修改时,使用一个 powershell script 直接将发生修改的文件,从本机目录拷贝到云桌面即可。在无影云桌面里使用如下的 powershell script, 即可将本地修改的文件自动同步到云桌面的本地目录:$sourcePath = "Z:\Code\SPA\spartacus"; $targetPath = "C:\code\spa\spartacus-develop"; $modifiedFilesList = "C:\code\spa\modifiedFilesList.txt"; function syncFile { $modifiedFiles = Get-Content $modifiedFilesList foreach($file in $modifiedFiles) { echo $file; Copy-Item $file -Destination $targetPath; } echo "done"; } git ls-files -m > $modifiedFilesList; syncFile;然后就可以在无影云桌面里启动 Cypress 了。虽然可以采取默认的 headless 方式运行所有回归测试用例,但既然云桌面提供了显示桌面,不利用起来有点可惜,所以我选择了以交互式方式运行 Cypress.顺利的在无影云桌面上打开了 Cypress 的交互式运行桌面:在无影云桌面里非常流畅地完成了 Cypress 的回归测试,并且在非 headless 模式下,能够直观地观察到当测试用例执行失败时,当前应用的 UI 界面,非常方便定位问题。关于在无影云桌面里执行 Cypress 回归测试的动态效果,可以查看我这个视频。https://www.zhihu.com/zvideo/1466527639535706113选择在无影云桌面而不是本地运行 Cypress 回归测试,我主要基于以下几点考虑:(1) 节省本地宝贵的 CPU 和内存资源,用于执行一些技术附加值更高的非技术工作。(2) 利用无影云桌面的手机客户端,我可以做到即使人不在电脑面前,也能随时监控 Cypress 测试的执行结果。下面的截图是通过 Android 客户端登录到无影云桌面的截图:可以看到在手机上查看 Cypress 的执行结果还是非常方便的:如果觉得手机屏幕过小,看不清楚显示的内容,云桌面的手机客户端贴心地提供了修改显示分辨率的功能:选择自动适应屏幕后,就会按照手机的实际屏幕尺寸,动态调整桌面的显示效果,便于在手机客户端上完成一些简单的云桌面操作。综上所述,这算是一次让我满意的通过无影云桌面提高我日常工作效率的体验之旅。后续我在 Angular 开发工作中,还会继续留意,考虑是否有更多的开发步骤,能够迁移到云桌面里完成。这里也感谢阿里推出的这款如此优秀的云桌面产品,在全球疫情的大环境下,给大家的远程工作带来了更多的便利。
这是 Jerry 2022 年第二篇原创文章,也是本公众号第 370 篇原创文章。之前有一个朋友在知乎上向我咨询过这个问题,我觉得很有代表性,所以专门用一篇文章来讲述一些相关知识点。先看这位朋友遇到的具体问题。用 Postman 调用第三方接口,里面的中文字符能够正常显示。然而当用 ABAP 的 HTTP 工具类 CL_HTTP_CLIENT 的 response->get_data( ) 读取响应之后,发现里面的中文字符,例如 “访问成功” 是乱码:首先明确一点,既然 Postman 能正确显示响应数据中的中文内容,说明 API provider 是不存在问题的,这个乱码问题出现在接收方,即 ABAP 代码的编程实现需要调整。我们只要弄清楚出现乱码的原因,就能有的放矢进行修复了。上个世纪 60 年代,美国制定了一套字符编码,定义了英文字符与二进制位之间的一一映射关系,称为 ASCII 码。将一个符号的图形显示,关联到其二进制存储位的这种行为,就称之为字符编码。ASCII 就是一种最简单的字符集和字符编码方式。一个字节有 8 位,2 的 8 次方为 256,因此 1 个字节只能表示 256 种符号,而汉字的总数超过了 10 万个,显然无法用 1 个字节来存储。除了大家熟悉的英文字符和汉字外,还有很多历史更悠久的文字,比如埃及象形文字:以及周杰伦《爱在西元前》里提到的楔形文字:有没有这样一种计算机编码方式,能够将这些稀奇古怪的符号都纳入其中呢?有,这就是 Unicode,正如其命名暗示的,Unicode 将世界各种语言的每个字符都分配了一个唯一的编码,以满足跨语言、跨平台的文本信息转换。我们根据 Unicode 编码表,就能查到一个字符对应的 Unicode 编码,比如汉字 "汪"对应的 Unicode 编码为 00006C6A.6C6A 的二进制表示为 0110 1100 0110 1010,需要两个字节进行存储。表示其他的符号,可能需要三个甚至四个字节存储。另一方面,对于原本就存在于 ASCII 编码表中的英文字符,仅需 1 个字节就能存储。如果 Unicode 强制要求每个字符按照最大需要的存储空间,即 4 字节进行存储,显然对于英文字符来说,意味着极大的空间浪费。因此,Unicode 仅仅定义字符到其编码的映射关系。而这些编码到底采取多少个字节进行存储,由 Unicode 具体的实现方式,比如 UTF-8,UTF16 等来决定。UTF-8 是一种变长的编码方式,使用 1 到 4 个字节表示一个字符,符号不同,用于存储的字节长度也不同。比如 “汪” 的 UTF-8 码值为 E6B1AA,需要三个字节存储。根据 SAP 帮助文档,ABAP 采用 UCS-2 编码方式,可以看成 UTF-16 的子集,因为 UCS-2 不支持 UTF-16 的 surrogates 区间内定义的一些特殊符号。所谓 UTF-16,就是所有字符固定都用两个字节表示。从下面这张表格能够看出,UTF-16 又分 UTF-16BE 和 UTF-16LE 两种实现方式。以汉字 “汪” 的 Unicode 编码值 6C6A 为例,如果 6C 存储在内存低位地址,6A 存储在内存高位地址,这就是 Big Endian 即大尾序(有时也译作大头,大端)存储方式,反之则为 Little Endian 即小尾序存储方式。这两个名称来自英国讽刺寓言作家斯威夫特的《格列佛游记》。书中的小人国爆发了内战,战争起因竟然是人们争论吃鸡蛋时究竟应该从大头(Big Endian)一端敲开,还是从小头(Little Endian)敲开。那么 ABAP 的 UCS-2(UTF-16 的子集), 到底是 BE 存储还是 LE 存储?一试便知。在我的系统里,答案是 UTF-16LE.另一种方式,直接检查系统类 CL_ABAP_CHAR_UTILITIES 的属性 ENDIAN. 在 Jerry 的系统里,该属性的值为 L,代表 Little Endian:我们了解了这些知识,再来修复文章开头描述的乱码问题。仔细观察 Postman 调用 API 的返回结果,发现还有一条重要信息:charset=GB18030,意思是 API 响应数据采取 GB18030 字符集编码。汉字 “访” 的 GB18030 编码值为 B7C3,完全不等同于 UTF-16LE 中的编码值 BF8B.如果我们在 ABAP 代码里,按照默认的 UTF-16LE 的方式去读取一个根据 GB18030 编码的符号,当然不会得到期望的结果。这种张冠李戴的解码方式见下图第 55 行的 get_cdata 方法,最后就会出现乱码。正确的方式,采取第 57 行 get_data,返回一个 16 进制数据流,类型为 xstring:在这个16 进制数据流里,我们已经看到了汉字 “访” 和 “问” 对应的 GB18030 编码值。剩下的事情就容易了,使用字符集 GB18030 对这段数据流进行解码。我们首先打开数据库表 TCP00, 根据关键词 18030 查询表字段 CPCOMMENT:得到 GB18030 对应的 SAP Code Page 为 8401:在下面这段代码中,传入 8401,变量 lv_binary 存储的是 16 进制数据流,变量 lv_text 存放的就是基于 GB18030 的 API 响应内容:可以看到乱码已经消失了,在 ABAP 程序里显示的内容已经和 Postman 里观察到的完全一致了。希望本文介绍的这个例子,能对大家在 ABAP 里处理中文乱码问题有所启发,感谢阅读。Jerry 的 ABAP 专集Jerry的ABAP, Java和JavaScript乱炖ABAP开发人员未来应该学些什么Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现Jerry的ABAP原创技术文章合集300行ABAP代码实现一个最简单的区块链原型使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务ABAP vs Java, 蛙泳 vs 自由泳聊聊C语言和ABAP动手使用ABAP Channel开发一些小工具,提升日常工作效率我用ABAP做过的那些无聊的事情不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧使用Visual Studio Code编写和激活ABAP代码你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧在SAP云平台ABAP编程环境上编写第一段ABAP程序SAP官方发布的ABAP编程规范ABAP Code Inspector那些隐藏的功能,您都知道吗?还在用ABAP进行SAP产品的二次开发?来了解下这种全新的二次开发理念吧ABAP Netweaver体内的那些寄生式编程语言从SAP社区上的一篇博客开始,聊聊SAP产品命名背后的那份情怀云端的ABAP Restful服务开发如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用Jerry带您了解Restful ABAP Programming模型系列之二:Action和Validation的实现Jerry带您了解Restful ABAP Programming模型系列之三:云端ABAP应用调试SAP云平台上的ABAP编程环境里如何消费第三方服务ABAP开发者上云的时候到了 - 现在大家可以免费使用SAP云平台ABAP环境的试用版了学而不思则罔 - SAP云平台ABAP编程环境的由来和适用场景SAP云平台里的三叉戟应用如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用SAP 2019 TechEd Key Note解读:云时代下SAP从业人员如何做二次开发?有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了利用ABAP 740的新关键字REDUCE完成一个实际工作任务一段让人瑟瑟发抖的ABAP代码昨日万圣节ABAP怪兽级代码谜团,公布答案啦介绍一种在ABAP内核态进行内表高效拷贝的方法使用SAP Cloud Application Programming模型开发OData的一个实际例子当ABAP遇见普罗米修斯使用ABAP绘制可伸缩矢量图ABAP开发环境语法高亮的那些事儿SAP错误消息调试之七种武器:让所有的错误消息都能被定位使用ABAP操作Excel的几种方法SAP GUI里的收藏夹事务码管理工具SAP GUI和Windows注册表有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼实现ABAP条件断点的三种方式使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害SAP ABAP Netweaver容器化, 不可能完成的任务吗?SAP产品增强技术回顾SAP API开发方法大全浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试SAP ABAP应用服务器的HTTP响应状态码(Status Code)SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下ABAP面试题系列:写一组会出现死锁(Deadlock)的ABAP程序SAP ABAP Netweaver服务器的标准登录方式讲解SAP ABAP关键字语法图和ABAP代码自动生成工具Code ComposerSAP ABAP SM50的另类用途 - ABAP工作进程对数据库表读取操作的检测关于SAP ABAP字符变量和字符串变量字符个数的一个知识点,和一个血案SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)SAP AMDP介绍 - ABAP托管的HANA数据库过程给你的ABAP对象打上标签(Tag)历史上的今天:编程语言中null引用的十亿美元错误ABAP Development Tool 代码模板和其他一些实用技巧汇总SAP ABAP Development Tool 提高开发效率的十个小技巧如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web ServiceABAP 真的会过时吗?聊聊 ABAP 的过去,现在和未来基于 abapGit 和 abaplint 的 ABAP 持续集成的一个例子不使用任何框架,手写纯 JavaScript 实现上传本地文件到 ABAP 服务器使用 JavaScript 上传 PDF 和 Excel 等二进制文件到 ABAP 服务器并进行解析从 ABAP Netweaver 到 ABAP Platform,我们一直在努力
如下图所示,我们可以利用 StackBlitz,在浏览器里开发 Node.js 应用:这一切归功于所谓的 WebContainer,如下图 Booting WebContainer 和 Installing dependencies 的信息:几年前,我们就能感觉到,web 开发正在走向一个关键的拐点。WebAssembly 和新的 capabilities API 的出现,使得编写一个基于 WebAssembly 的操作系统似乎成为可能,该操作系统功能强大到可以完全在浏览器中运行 Node.js。 提供一个比本地环境更快、更安全、更一致的卓越开发环境,以实现无缝代码协作,而无需设置本地环境,这个目标似乎离 Web 开发人员越来越近了。实现这个目标的关键之一是 Web Container.传统在线 IDE 在远程服务器上运行您的整个开发环境,并将结果通过 Internet 流式传输回您的浏览器。 这种方法的问题在于,它几乎没有安全优势,并且在几乎所有方面都比本地机器提供更糟糕的体验:启动容器需要几分钟时间,容易出现网络延迟,无法离线工作,经常导致网络超时, 调试冻结/损坏的容器几乎是不可能的,点击刷新只会将您重新连接到损坏的容器。StackBlitz 提供的 WebContainers 允许您创建全栈 Node.js 环境,该环境可在几毫秒内启动并立即处于在线状态,可以通过链接共享——只需单击一下。 该环境加载了 VS Code 强大的编辑体验、完整的终端、npm 等。 它也完全在浏览器中运行,这会产生下列这些关键的好处:比本地环境更快。 构建完成速度比 yarn/npm 快 20%,包安装完成速度 >= 5 倍。Node.js 应用可以在浏览器中调试。 与 Chrome DevTools 的无缝集成支持本地后端调试,无需安装或扩展。默认的安全级别。 所有代码执行都发生在浏览器的安全沙箱内,而不是远程虚拟机或本地二进制文件上。同样,这些环境不在远程服务器上运行。 相反,这些运行环境都完全包含在 Web 浏览器中。 Node.js 运行时本身第一次在浏览器内部本地运行。
错误:The selector app-root did not match any elements这个错误消息倒和 Angular 的版本没有关系。index.html 里定义的 selector 必须和 App.module.ts 里定义的 AppComponent selector 一致:错误2:unhandled promise rejection原因:在 Angular 2 里,导入 rxjs 操作符的语法:import 'rxjs/add/observable/fromEvent'; import 'rxjs/add/operator/pairwise'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/exhaustMap'; import 'rxjs/add/operator/filter'; import 'rxjs/add/operator/startWith';在 Angular 12 里,导入 rxjs 的语法应该是:import { pairwise, map, exhaustMap, filter, startWith } from 'rxjs/operators';错误:NullInjectorError:No provider for HttpClient解决方法:从 @angular/common/http 里导入 HttpClientModule, 加到 app module 的 imports 区域。错误消息:NG0303: Can’t bind to ‘ngForOf’ since it isn’t a known property of ‘li’.解决方法:从 @angular/common 里导入 CommonModule, 加到 app module 的 imports 区域。错误:zone.js:3382 Mixed Content: The page at ‘https://jerry-infinite-scroller.stackblitz.io/’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘http://node-hnapi.herokuapp.com/news?page=1’. This request has been blocked; the content must be served over HTTPS.解决方法:把 service 实现里的 http 改成 https.
我们在 Windows10 操作系统下,安装了 git 客户端之后,可以通过 git-bash.exe 打开一个 shell:执行一些 linux 系统里的命令:注意到上图紫色的 MINGW64.Mingw-w64 是原始 mingw.org 项目的改进版,旨在支持 Windows 系统上的 GCC 编译器。 它在 2007 年对它进行了分叉,以提供对 64 位和新 API 的支持。 从那时起,它得到了广泛的使用和分发。而所谓 MinGW(“Minimalist GNU for Windows”),原名 mingw32,是一个免费的开源软件开发环境,用于创建 Microsoft Windows 应用程序。 2005 年至 2008 年创建了一个名为 Mingw-w64 的替代项目,作为 MinGW 项目的一个发展分叉。MinGW 包括 GNU 编译器集合 (GCC) 的一个端口、用于 Windows 的 GNU Binutils(汇编器、链接器、存档管理器)、一组可自由分发的 Windows 特定头文件和静态导入库,这些库支持使用 Windows API、Windows GNU 项目的 GNU 调试器和其他实用程序的本机构建。MinGW 不依赖第三方 C 运行时动态链接库 (DLL) 文件,并且由于运行时库不是使用 GNU 通用公共许可证 (GPL) 分发的,因此无需随生成的程序分发源代码, 除非在程序的其他地方使用了 GPL 库。MinGW 既可以在本地 Microsoft Windows 平台上运行,也可以在 Linux(或其他 Unix)上交叉托管,或者在 Cygwin 上“跨本地”运行。尽管在 MinGW 下生成的程序是 32 位可执行文件,但它们可以在 32 位和 64 位版本的 Windows 中使用。同 cygwin 的比较尽管 Cygwin 和 MinGW 都可用于将 Unix 软件移植到 Windows,但它们有不同的方法:Cygwin 旨在提供一个完整的 POSIX 层,包括所有主要 Unix 系统调用和库的完整实现。兼容性被认为比性能更重要。另一方面,MinGW 的优先事项是简单性和性能。因此,它不提供某些无法使用 Windows API 轻松实现的 POSIX API,例如 fork()、mmap() 和 ioctl()。使用本身已移植到 MinGW 的跨平台库编写的应用程序,例如 SDL、wxWidgets、Qt 或 GTK,在 MinGW 中编译通常会像在 Cygwin 中一样容易。用 Cygwin 编写的 Windows 程序运行在一个 Copyleft 兼容 DLL 之上,该 DLL 必须与程序一起分发,以及程序的源代码。 MinGW 不需要兼容层,因为基于 MinGW 的程序是通过直接调用 Windows API 编译的。MinGW 和 MSYS 的组合提供了一个小型、自包含的环境,可以将其加载到可移动媒体上,而无需在注册表或计算机上的文件中留下条目。也可以在 POSIX 系统下用 MinGW-GCC 交叉编译 Windows 应用程序。这意味着开发人员不需要安装带有 MSYS 的 Windows 来编译在带有或不带有 Cygwin 的 Windows 上运行的软件。
在 Github 项目文件夹下面添加 .travis.yml 文件。为了运行构建,Travis CI 的系统将触发构建的存储库克隆到构建环境。 构建环境是一个隔离的虚拟机或 LXD 容器,一旦构建完成就会终止。 克隆仅在构建请求之后发生,因此仅适用于在 GitHub 设置中明确启用的存储库。一个例子:为了设置构建环境并准备构建,Travis CI 的系统从存储库和构建请求中明确指定的分支中获取并处理 .travis.yml 配置文件,由 GitHub 触发。这个 .travis.yml 配置文件的语法在官网可以找到。比如,dist: bionic 的意思是,构建虚拟系统的类型,bionic 是其中一个枚举值。Travis CI 支持 Linux 构建的两种虚拟化类型:“Full VM”和“LXD”。 最重要的是,Linux 构建可以在多个 CPU 架构上运行。Full VM 是启用 sudo 的,每个构建的完整虚拟机,运行 Linux.虽然启动缓慢(与 LXD 容器相比增加了构建时间)但没有任何限制。它分配了固定数量的 vCPU 和 RAM。而 LXD 环境,尽可能接近容器世界中的虚拟机。 Linux 环境在非特权 LXD 容器中运行。和 Full VM 相比,其启动速度更快(与完整 VM 相比减少了构建时间)但确实存在一些限制。它从最少 2 个 vCPU 开始,如果有更多的计算时间可用,主机可以动态分配它以加快构建速度。又比如 branches 关键字和 only 的组合,下列例子的语义是,仅当 develop, epic, release, integration-libs 等 分支出现代码提交时才触发 Travis..travis.yml 是一个 YAML 格式的配置文件,下面是一些高级用法。在更高级的用例中,为了减少大型构建配置文件中的重复,一个好的做法是使用 YAML 的机制来定义和重用共享配置部分作为 YAML 锚点和别名。例如,不要像这样为两个不同的部署目标重复部署配置, 这是不好的实践:deploy: - provider: heroku api_key: ... app: app-production on: branch: master - provider: heroku api_key: ... app: app-staging on: branch: staging使用下列的语法,重用某块 yaml 定义:deploy: - &deploy provider: heroku api_key: ... app: app-production on: branch: master - <<: *deploy app: app-staging on: branch: staging
通过修改注册表的方式,来调整 Windows10 操作系统里指定文件格式显示的默认图标,我已经在这篇文章里介绍了。对于 pdf 格式的文件来说,同理:找到 pdf 文件在 Windows10 系统里的 Progid:AppXm5dr6489nry3zq4zfg4n1h09c1xgjapm然后根据这个 id,找到其对应的 DefaultIcon:在我的电脑上,路径:Computer\HKEY_USERS\S-1-12-1-854440563-1287273769-2485447849-2282204647\SOFTWARE\Classes\AppXm5dr6489nry3zq4zfg4n1h09c1xgjapm\DefaultIcon双击右边的 default,指定一个自定义的 ico 文件路径即可:最后 pdf 文件在我电脑上显示的修改后的图标如下图所示:
12月18日消息,日前USB-IF协会已确认,USB Type-C 2.1数据线开放认证,将支持最高48V/5A 240W快充技术,要求数据线内置的VBUS电容耐压值高于50.9V。Type-C接口的最高功率已达到240W,对于普通消费者绝对是个好消息,可能会有不少网友认为手机厂商的快充协议白研究了,研究了半天也只有120W左右,USB-IF协会出手就是240W。小雷要说的是,充电接口和充电协议不是一码事,估计很快USB-IF协会制定的快PD快充协议就将支持240W。手机厂商有自己的考虑,他们需要卖充电配件赚钱,所以要推出自家的快充协议,哪怕PD协议支持240W。受240W PD快充协议影响最大的应该是游戏本,现在PD协议最高只支持100W,用于轻薄本、商务本没有问题,用于游戏本就不够用了。在PD无法满足的情况下,游戏本厂商大多是自家的快充协议和充电接口,与其它设备无法通用。一般来说,游戏本的功率在150W~230W之间,小雷自己的残血RTX 3060游戏本功耗仅180W,主流游戏本基本都在240W以内。未来的游戏本可以考虑全部更换为Type-C接口,在忘记带充电器的情况下,也能用手机的充电器顶一顶,虽说功率较低,不能用来打游戏,看个电视、做个文档肯定够了。至于游戏本能否摆脱板砖似的电源适配器,小雷觉得可能性不高。笔记本的电源适配器是为了保证打游戏时的功率稳定,不会忽高忽低。那些体积较小的氮化镓充电器,在长期大功率工作时,很难保证功率稳定。当然,或许有笔记本厂商能想出方案,让电源适配器在保障大功率的前提下,尽量减少体积。技术总是在进步,我们要对厂商们的未来有信心。此外,240W充电线已开放认证,或许未来两三年,手机的快充技术也能突破200W。
“悟空 悟空,给我来一段劲嗨的舞蹈!”通过这样的语音指令,“悟空”就会唱起歌,跳起舞来。这款由优必选联合腾讯叮当共同研发的便携式机器人——悟空 正式在 9 月 27 号面世(售价:4999元)。其中优必选素有全球智能机器人领导者之称,这是一家集人工智能和人形机器人研发、平台软件开发运用等为一体的全球性高科技企业,此前就曾联合亚马逊、腾讯、迪士尼等推出过不少黑科技满满的机器人。“悟空”同样就像西游记里的孙悟空一样,有百般能耐,不过它不会法术,只有满满的黑科技!到底有多便携?悟空的身高跟一瓶纯净水差不多,足够小巧了吧,基于此,悟空可以轻松装进背包,随时随地带在身边。 更关键的是,悟空给人的感觉非常生动可爱,它内置了 14 个高精度伺服舵机,可以做出各种“高难度”动作,且动作经过了拟人化设计,因此它的肢体运动更加生动形象。比较特别的是悟空的眼睛采用 LCD 屏幕,能够表现出各种喜怒哀乐的表情,这是让悟空更显生命感的其中关键。悟空搭载了腾讯叮当 AI 助手,内置物体/人像识别摄像系统,可以看懂各种物品,并能够跟用户进行语音交互,就像AI语音助手一样,悟空支持百科问答、天气咨询、设置提醒、翻译等等的各种日常助理功能。另外,悟空还通过与编程猫合作,让其支持图形编程功能,通过可视化的操作,可以给悟空“编写”各种程序指令,操作简单,小白也能快速上手,将悟空玩出更多花样。悟空可以理解为是人工智能的一个载体,但它的更深层意义是,通过让一款机器人变得更加亲切有感情、有温度,让机器人不仅仅只是一个冷冰冰的产品,提高交互体验,更好地融入人们的生活,成为人们亲密的好伙伴。现场不少伙伴见证了悟空的交互表现、肢体动作以及表情变化后都表示,悟空真的就像有生命一样!悟空可以应用到很多场景中,包括教育场景、家庭场景、社交场景以及办公场景等,当然它的想象空间还很大,在现场,官方通过视频就给我们展示了几个可想象的场景。比如,悟空可以充当酒店的“前台入住登记员”,悟空支持物体/人脸的识别,入住客户通过与悟空的交互即可完成入住办理;在酒店或者居家中,悟空还可以变身“安全卫士”,支持人体姿态检测功能,如果发现主人意外跌倒,会自动报警,那么假如有小偷入室,悟空同样也会报警。当然,悟空只是一个开始,本次发布会上,官方还发布了全球首个大规模商用的服务机器人操作系统 ROSA。该系统可以理解为是机器人的“大脑”,其采用模块化设计、层次性架构,具有系统松耦合、功能全集成、可拓展与可重用、开放性四大特点,能够实现语音操控、机器视觉、电源管理、定位导航、运动控制、情绪表现、环境智能感知、传感器集成、应用策略决策、设备互联及资源调度等功能,使得服务机器人拥有了表现力和生命感。其中悟空就是基于 ROSA 开发而成,也就是说通过这样的一个操作系统,厂商可以开发出千千万万各种形形式式的“悟空”,或许一个全新的个人智能机器人时代即将到来。这个科技高速发展的时代,我们经常会聊到机器人,但却不知道我们真正需要的到底是一款怎样的机器人?悟空给我们的灵感就是:首先它是要便携的,这样才可以更方便把它带在身边,随时随地服务人类;其次它要有生命感,机器人不应该仅仅只是机器人,而是要像平常人、亲人、朋友一样,和蔼可亲,才能更好地成为人类的亲密伙伴,融入生活。本次发布会上,优必选还与 MoCA(上海当代艺术馆)达成战略合作,并引进了日本 Robi 机器人之父高桥智隆、计算机科学与工程博士 Howard Michel 等高端人才加入,依靠各方的资源优势共同打造AI机器人平台,未来,“悟空”对人类的影响有多大?可尽情想象。
素有全球人工智能和机器人领导者称号的优必选联合迪士尼推出了星战首款 AR 互动机器人:星球大战第一军团冲锋队员机器人。这款机器人获得了迪士尼官方授权,基于《星球大战》系列电影角色第一军团冲锋队员开发,能够通过沉浸式的 AR 交互体验,让星战迷们身临其境地感受电影场景,开启称霸星球之路。1一个“听话”的白兵机器人,你也可以当一回星战指挥官 这个星战白兵机器人的设计比较呆萌,简直是萌到让人看一眼就爱上它,当然,它不仅长得可爱,还很“听话”,用户就是白兵机器人的指挥官,通过在专用 APP 的“训练”模式中,教导白兵机器人学习各种组合动作、语音之后,就可以对机器人进行操练,比如这样:除了让机器人做出对应的组合动作和发出语音外,在“练习”模式上,用户还可以通过 APP 控制白兵机器人前后左右运动,也可以直接通过语音指令进行控制,并且能够控制白兵机器人转动头部,利用 APP 还能看到机器人摄像头传回来的第一视觉画面。 白兵机器人的响应速度很快,每个指令都能完美执行,通过 APP 传回来的画面,用户就可以远程控制机器人去执行相关任务。 值得一提的是,白兵机器人还支持直连模式,也就是说,不需要网络环境,直接用手机 APP 和机器人wifi连接就能使用,这除了能保护用户隐私外,还不受网络环境影响,出门在外同样可以玩起来。2开启执行作战任务,每个人都能踏上称霸星球之路控制白兵机器人还不是最好玩的地方,更特别的是,这款机器人还融合了 APP 沉浸式的 AR 体验,通过对星战电影场景的还原,让用户能够身临其境地体验星战魅力。 在 APP 的“任务”模式中,用户可以带领白兵机器人开启作战任务,启动任务后,机器人就会模拟星战电影中的作战场景,利用 APP 对机器人下达相关指令,并完成作战任务。其实这就相当于一场游戏,但比游戏更加好玩,其融合了 AR 增强现实技术,用户能够通过机器人第一视角在星球执行任务,同时 APP 画面上的星球环境还融合了现实环境,有效增强代入感,当然也可以通过第三视角全方位了解作战状态。 游戏的玩法上也比较有趣,需要在 APP 上对机器人行走路线进行规划,抵达目标后还需要完成相关的考验才能够通关,执行任务中有:获取情报、摧毁基地等等,在游戏的中途还可能会出现随机任务,进一步增加趣味性。目前我们使用的最新版本 APP 上已经开放了“贾库”星球体验,据说在后续的更新中,还会加入更多的星球战斗和新的 AR 模式,从此不再只是“看”星战,每个人都能踏上称霸星球之路。 3还是一位看家小能手,“入侵者”请小心! 在《星球大战》中,白兵机器人的其中一个作用就是“巡逻”,通过在领地内开展区域巡逻,随时监测入侵者,而这款优必选白兵机器人同样自带“岗哨模式”。用户可以设定白兵机器人在一定区域内的巡逻行走路线,以及触发动作,当在“巡逻”中遇到不同的人物或者触发指令后就会做出相关动作或警报,其支持人脸识别功能,巡逻中可以识别最多四张不同人脸,包括:指挥官、上尉、中尉、敌军抵抗组织,并利用摄像头和麦克风进行监视和探听,假如发现“入侵者”,就会要求其进行脸部识别和语音密码验证。白兵机器人虽然并不能真的可以帮用户看家,但“巡逻”功能的加入确实让机器人的玩法更加丰富,同时也符合星战电影中的白兵形象,还可以用它去整蛊下家人或朋友哦。 4小结 对比其他一些注重实用性的机器人,这款白兵机器人则比较偏娱乐性,通过丰富的玩法,配合沉浸式的 AR 体验,用户能够身临其境地感受星战电影场景,通过全新的交互方式,用户也可以当一回星球大战第一军团冲锋队员机器人指挥官,比起看电影,这样的体验方式代入感更强,用户自己就是星战的“主角”。目前星战白兵机器人已上架全球 Apple Store,当然也在优必选天猫旗舰店和线下门店同步销售,目前优必选天猫旗舰店活动优惠价为 1999 元,感兴趣的伙伴看好了哦。
消费级的 PC VR 正式进驻市场,其实也才过去了半年时间,Oculus Rift 在 3 月 28 日发布之后,HTC Vive 也迅速投放到了市场。Oculus 的首席执行官帕胖(Palmer)对于 Vive 的抢先发布似乎不屑一顾,在接受 Eurogamer 的采访时表示:抢先发布并不意味任何事情,我们在这几个月内做了更有意义的事情:开发 Oculus Touch,并将此作为对 Vive 的回应。与 Oculus 将主机和手柄拆卖的策略不同,HTC Vive 在发售之时就已经非常完整了,Vive手柄的开创性和易用性也为其赢得了一部分买家。受限于产能问题,Oculus Touch 几经跳票才决定于 12 月 6 日正式发售,而随着 Valve、微软的相继入局以及第三方原型设备的不断出现,VR 的手柄之争也逐渐变得白热化起来。传统的十字键手柄暂且不提,目前比较契合 VR 操控的主流控制器大致包括 Oculus Touch、Vive 手柄、PS Move 三种,而根据流出的信息来看,Valve 和微软的原形手柄也相当抢眼。1Vive 控制器Vive 控制器有些像头重脚轻的哑铃,顶端采取了横向的空心圆环设计,上面布满了用于定位的凹孔。持握时拇指方向有一个可供触控的圆形面板,而食指方向则有两阶扳机。这款产品在满电状态下可以独立运行 4 个小时,已经能够满足基本的使用需求。出色的定位能力是它的杀手锏之一,Lighthouse(灯塔)技术的引入能够将定位误差缩小到亚毫米级别,而激光定位也无疑是排除遮挡问题的最好解决方案。房间对角的两个发射器通过垂直和横向的扫描,就能构建出一个“感应空间”。而设备顶端诸多的光敏传感器,则能帮助计算单元重建一个手柄的三维模型。尽管 Vive 控制器几乎不存在延迟,也能支持 15 英尺范围内的站立姿态,但它的持握体验其实不尽人意,长时间持握 Vive 手柄是个沉重的负担。除此之外,设备在 VR 内容的应用上也没有太多扩展空间,“扣下”扳机的动作仅契合某些 FPS 游戏。不过,Vive 控制器被有效的整合到了设备之中,得益于友好的 SDK 和官方支持,开发者可以没有后顾之忧的为其创造内容。而开创性的控制方式,也让人们意识到“虚拟手”对于VR 的重要性。2Oculus TouchTouch 与 Rift 的拆卖一直以来都让玩家们有些不爽,本机+手柄高达 700 美元的价格其实已经和整套 HTC Vive 相差无几,而产品的数次跳票更是引起了人们的愤怒。不过,体验过 Oculus Touch 的用户对产品本身还是予以了肯定,并表示其紧贴双手的工业设计更符合人类的自然姿态。Touch 的控制面板中嵌入了一个小型摇杆和数个圆形按键,握柄方向同样设置了单阶扳机,功能上与 Vive 手柄相差不大。其内部植入的摄像头感应器成了亮眼之处,它能够通过感知距离模拟出手指的大致动作,这大大增强了控制器的可扩展性。Oculus Touch 的缺陷在于定位方案的不完善,红外光学定位和九轴系统的辅助本身还是不错的,也能免除一部分遮挡问题。但 Rift 当前只配备了一个摄像头,仅能感应正前方的小块区域,限制了 Touch 的使用范围。Palmer 曾经声称 Oculus Rift 在多个摄像头的支持下也能完成房间级定位,但目前还没有具体的实操案例。除此之外,增设摄像头还需要按 79 美元一个的价格额外采购,看起来不怎么“良心”。3 PS Move留意 PlayStation VR 的首发内容就能得知,它们主要还是基于 DualShock 4 游戏手柄驱动,极少用到 PS Move。实际上,PS Move 是一款 6 年前发售的产品,主要对标任天堂Wii Remote 的体感支持,并非 PS VR 的特供物。PS Move 的造型更像是顶了个彩色圆球的手电筒,持握手感也非常相似,副操纵棒上甚至加上了传统手柄的十字按键,整体的控件按钮多达十数个,操控起来有些繁杂。相比其它 VR 手柄,PS Move 的定位技术也是比较落后的,其可见光定位只能感应控制器的大致位置,完全谈不上精度,甚至有玩家表示自己的“光头反光”也会影响到设备识别。又由于抗遮挡性较差,多目标定位也有一定的数量限制。不过,PS Move 的复用大大降低了研发成本,而优秀的内容支持也弥补了设备的缺陷。索尼似乎也察觉到了产品的不足,此前就为 “Farpoint” 打造了一款名为 “PS VR Aim” 的专用控制器,后续可能将有更多的拓展。4 Valve 控制器Valve 绝非一家纯粹的内容开发商,Valve VR 可以说得上是 Oculus Rift 和 HTC Vive 的指明灯,在 2014 年召开的 Steam 第一届开发大会上,Palmer Luckey 还特意登台进行过演讲。尽管 Valve 在虚拟现实的研发道路上不太顺畅,但时隔两年之后它们还是带来了一款全新的 VR 产品——Valve 控制器。Valve 此前也有开发 Steam Controller 的相关经验,产出 VR 控制器也在意料之中。这款产品在佩戴时有些类似“指虎”,手背上是条形的感应装置,手心的控制主体则通过腕带连接在一起。得益于这样的结构,使用者无需保持握紧的状态,设备在张开手掌的情况下也不会掉落。Valve 控制器的消息不算太多,官方仅邀请了开发者参与体验。根据 Vrerse 透露的信息来看,手柄上搭载了 21 个感应器,抓取虚拟物品时也无需按任何键,手柄表面的触摸屏能够判断用户是否握拳。不过,这款产品在短时间内应该还不会投入商用,Valve 表示“握拳感应”在以后的迭代中将被细化为“手指感应”,而做工比较粗糙的问题也将逐步解决。4 Normal Touch&Texture Touch相比上述那些完成度比较高的产品,微软的 VR 控制器显然还处在实验阶段。不过,除了基础的操控之外,Normal Touch&Texture Touch 在压感和触感方向进行了深化,它们也许将成为 VR 控制器的未来雏形。Normal Touch&Texture Touch 由微软的一个四人团队开发,Normal Touch 主要通过分散的“触手”来反馈虚拟物体的硬度,而 Texture Touch 则能模拟出虚拟物品的材质变化。这两款产品目前可以适配 Oculus Rift DK2,也使用了对应的红外光学追踪技术。遗憾的是,它们当前只能还原“一根”手指的触摸感受,笨重的元件堆砌和丑陋的工业设计还未能得到优化,真正应用还需等上很长一段时间。民间开发者 Scott Devine 设计的触感反馈装置,在原理上与 Normal Touch 有着异曲同工之妙。他为 Baxter 机器人写了一段程序,让其能够通过机器臂对玩家施力,从而再现 VR世界中的“阻力”。◆ ◆ ◆ ◆ ◆ “百花齐放”的 VR 手柄世界可以看出,VR 手柄目前处于“百花齐放”的阶段。由于没有绝对成功的产品,各个开发商的设计思路都不尽相同,HTC 和 Oculus 在机械手感上加以精进,而 Valve 更倾向于 Steam Controller 一样的触摸体验。除此之外,专精于 MR 的 Magic Leap 则一直倡导手势控制。从 1958 年的突起旋钮到 1982 年的十字键手柄,传统控制器在历经数十种尝试、摸索了20 余年之后才得以落地生根。时至如今,十字键手柄仍然是解决内容操控的最好方式之一。相较于越来越同质化的移动 VR 市场,繁杂而深入的 VR 手柄研发其实是一件好事。尽管它们之中免不了要淘汰一部分失败的设计,但大量开发商的入局,为 VR 手柄的发展奠定了良好的试错基础。
英特尔近来频频在新兴技术领域发力,它们不仅在今年秋季的 IDF 上展示了有别于 AR、VR 的融合现实技术,而且还相应的推出了原型一体机 Alloy。除此之外,英特尔对于无人机公司 AscTec(Ascending Technologies GmbH)的收购,似乎也已初见成果。在刚刚举行的 2016 INTERGEO 无人机大会上,英特尔发布了一款名为“Falcon 8+”的无人机,这款无人机是 Falcon 8 的改良版,也可以配备相机系统实现航拍。从官方的介绍来看,航拍相机能够达到毫米级精度。(图片来源于:Intel)由于对材料进行了优化,因此 Falcon 8+ 的重量约为 2.7kg,仅能负载 0.8kg 左右的物品,这也保证了它的时速能够达到 56.33 公里。Falcon 8+ 的造型有些与众不同,两侧并列设置了四个旋翼电机,整体呈 V 字结构,而机身主要采取了黄黑相间的配色。英特尔在无人机中加入了惯性测量单元、空域感知、自主飞控等系统,从而在一定程度上保证了设备本身的安全。这也让 Falcon 8+ 更加契合测绘、勘探等工业需求。Falcon 8+ 的控制装置“Intel Cockpit”非常像街机厅中的摇杆,其中内嵌了一个平板电脑。除了良好的操作手感和完善的自动控制系统之外,Intel Cockpit 还具有一定的防水和抗摔特性。(图片来源于:Intel)AscTec 曾经是全球最大的无人机制造商之一,与 3D Robotics、大疆齐名,之前也有开发过较为常见的四轴无人机。AscTec 于 1 月份被英特尔收购,人们普遍认为这是英特尔入局消费级无人机市场的一个跳板。然而,它们首先发出的还是更为稳妥的工业无人机(而且还是个升级版)。不过这也情有可原,参考 3D Robotics 目前的境遇,它们因为错误的决策前景黯淡,在裁员 150 多人和烧掉 1 亿美元之后只能无奈转型,可见消费级无人机市场还是充满了风险。总体来说,Falcon 8+ 只能算得上是英特尔跨步微小的前期试水,一旦触及消费者市场,还需要面对大疆这个羽翼丰满的竞争对手。不过,英特尔相比 3D Robotics 有着更强的底力和更完善的供应链,在如此谨慎的布局下,应该不会重蹈 3D Robotics 的覆辙。
要跟我们爱的人告别是很痛苦的,尤其是当他们突然离世的时候。但是多亏如今有了快速发展的人工智能技术,很快你可能就不需要和他们永别了。好吧,至少咱们可以说不需要完全真正地永别。这儿就有个例子:Eugenia Kuyda是俄罗斯一个人工智能初创公司 Luka Inc 的创始人之一,最近她将她去世的好友以智能聊天机器人的形式召唤回了人间。她的好朋友 Roman Mazurenko是个科技企业家,在 2015 年 11 月份一场车祸中去世了,但就在那场悲剧发生的三个月后,Kuyda 就给他的人工智能化身 Roman 成功发送了第一条短信。由于他已经被火化,Kuyda 也没有办法去他的坟墓缅怀他,于是这位年轻的程序员决定好好利用关于他的每一个电子回忆,包括照片,新闻报道还有这么多年来他发给她的几千条 SMS 短信,然后把它们装进神经网络里来创造一个智能的聊天机器人,那些认识 Mazurenko 的人都说这个智能聊天机器人听起来就像真的 Mazurenko 一样。图片来源: Stampsy任何下载了 iOS 版本 Luka 手机软件的人只要在输入时加上 @Roman,就都可以用英语或俄罗斯语跟 Mazurenko 的数字化身对话。你可以问他一些问题来看看他会怎么回答,或者在选项菜单处了解一下他。Mazurenko 的许多朋友,家人甚至是陌生人在使用 Luka 和智能聊天机器人交谈后都在 The Verge 上匿名留言说,“他”的回答真的很像 Mazurenko 本人的回答,都有点难以分辨真假了,这也让“他”多少有了点争议。Mazurenko 的许多朋友都有和 Kuyda 的这个智能产品聊过天,也都纷纷表示:这也太像 Mazurenko 本人了吧。有些人认为这个智能聊天机器人会有治疗作用,然而也有人觉得这有点诡异和反自然。甚至连 Roman 的父母都对这智能化身抱有不同的态度。他的母亲认为自己能够享用这一科技是非常幸运的,她还补充说看到“他”对那些问题的回答,她感觉自己在慢慢加深对儿子的了解。而父亲则无法接受跟这样一个总是听起来很像自己儿子的机器人交谈,当然,有时候机器人也会回答错误,这也在提醒着父亲他的儿子是真的离开了人世。作为 @Roman 的创造者,Eugenia Kuyd 说她自己也在继续与这个智能聊天机器人聊天来减缓失去挚友的痛苦。她说:“所有那些信息都是关于爱的,或是将那些以前没来得及说的话讲出来。即使这不是一个真实存在的人,至少有一个我们可以表达的地方,在我们觉得孤单的时候可以在这里倾诉,然后他们也真的能够回复。我只是将信息发到了天堂,对我来说,能够表达出自己感情的意义远远大于得到回复的意义。”
英国有一群外科医生成功地完成了全世界首例用机器人进行眼内手术,很可能彻底改变了这一领域的治疗方法。这项手术是在牛津市的 John Radcliffe(约翰·拉德克利夫医院)进行的,这群外科医生们对此成功之举欢欣鼓舞。“目前现有的激光扫描仪和显微镜技术能够让我们从微观水平检测视网膜疾病,但是我们现在看到的这一案例超越了人类能够用手进行操作的极限。”“有了这个机器人系统,我们翻开了眼科手术的一个全新的目前仍无法达到的篇章。”这个案例中的病人叫 William Beaver(威廉·比佛),现年 70 岁,术后视力逐步恢复,此前眼睛斜视情况非常严重,看东西就像身处“在一个布满镜子的广场中”。这项手术非常关键,病人的视网膜表面上长了一层薄膜,并且出现了收缩现象,因此形状凹凸不平。这层膜的厚度约为一百分之一毫米,需要在不伤害视网膜的基础上将其与视网膜切割分离开。外科医生们通常的做法是减缓病人的脉搏并同时计算监测他们的心跳间隔时间的变化下进行手术,而机器人可以把事情变得简单多。专家称在机器人有超越人手的能力,能够进行全新高精度手术。外科医生们在眼睛外使用控制杆和触摸屏就能控制机器人,并能同时通过手术显微镜监控进展。这为医学工作者带来了极大的便利,这样只需通过控制杆就能操纵机器人进行精密操作。这个案例实现了首次通过设备在人眼内成功进行三维精密手术。MacLaren(麦克拉伦)说:“这项技术能够有助于失明新疗法的开发,比如基因疗法和干细胞疗法,因为这两种疗法都需要在视网膜下进行高精度植入技术。”机器人眼科手术实验组一共有 12 名病人,而手术的难度将会逐步加大。实验的第一部分目的是在不伤害脆弱的视网膜的基础上剥落长在其上的薄膜。而这一部分也正是目前这个案例所达到的,可以看到进行得非常成功。实验的第二阶段将会测试机器人是否能够把一根细针放置于视网膜之下并通过细针向视网膜注射液体。专家称这项技术或能促进机器人在视网膜基因疗法中的应用,视网膜基因疗法是目前世界上许多医疗中心在进行实验的治疗失明的方法。
机器人在这个科技圈里面一直是个不温不火的领域,这几年来,推出的机器人产品无数,但依然没有迎来爆发时期,不过这只是时机尚未成熟,未来肯定会是一个机器人的社会。为了加快步伐,微软推出了一款名为“Bamboo”的机器人,这是全球首个使用 Win 10 系统以及基于英特尔 Joule 平台驱动的机器人。值得一提的是,英特尔 Joule 是一个可将第三方开发者的概念转化为原型并投入生产的平台,这是一个小型、低功耗但性能很高的系统模块(SOM)。微软的 Bamboo 机器人集成了该模块后,能够获得计算机视觉、机器人、无人机、工业物联网、虚拟现实、增强现实、微型服务器以及涉及高端边缘计算等的资源。(图片来源于:新浪科技)此外,Bamboo 还搭载了微软的 Cognitive Services 技术,得益于该技术 Bamboo 能够实现情感分析以及翻译,其能够把 Twitter 上的任何一种语言翻译成英语。Bamboo 通过 EZ-Robot EZ-B 控制系统进行移动,其能够利用英特尔 Joule 和 RealSense 摄像头组成的互联系统识别出周围的环境,也就是说该机器人可能具备环境深度感知能力,从而避免移动过程中发生碰撞,另外,Bamboo 还能识别用户的情绪,以给人更真实的反馈交互。针对不同的使用场景和需求,机器人的品类很多,有仿生型的、有用于某些特定生产需求的、有用于服务人类生活的等等。这款 Bamboo 机器人主要用于哪方面,官方并没有透露太多信息。不过按照微软的口述,其表示任何人都能用英特尔 Joule 和 Windows 10 IoT Core 将他们的想法带到现实生活中。由此,笔者猜测这是一款可以应用到日常生活以及工作中的多功能机器人。一方面 Windows 平台本身是一个可用于生活和工作的系统,另一方面英特尔 Joule 又是一个可服务于多个领域的平台,还包括有 VR、MR、物联网等等。可见 Bamboo 可能会是一款全能的服务型机器人,不过这应该只是一款试水之作,未来表现如何?有待时间验证。
这一两年科技圈最火热的无疑是 VR 和无人机,不少厂商推出各种类型的 VR 产品,也有不少厂商推出各种类型的无人机产品。好了,今天我们聊的不是 VR,而是无人机,而且下面介绍的就是一款类型比较特别的无人机。像大疆那种“X”型支架的常规无人机你就见得多了,但是下面这款“蛋”型无人机相信是第一次见。近日,PowerVision 公司推出了一款蛋形的无人机:PowerEgg。PowerEgg 主打便携,采用四旋翼设计,在不使用时可以将螺旋桨和螺旋桨机臂折叠在机身内部,在完全闭合形态下,造型就像一个鸡蛋一样。不过,目前其具体体积,并不知道是多少,因此能不能放进背包需要进一步验证。但如果考虑到便携设计的话,体积应该不会太大,而且采用“蛋”型的设计确实可以大大提高便携性,不用担心螺旋桨、机臂折断等问题。这款无人机内置 6400mAh 电池,飞行时间大概为 23 分钟,支持 4K 视频拍摄和 360 度视频拍摄,最远可在三英里的范围内实时回传视频流。PowerEgg 通过传统的遥控器操控,同时还设计了类似 Wii 遥控器的 PowerEgg 控制器,因此,该款无人机可以通过手势体感交互来实现无人机的控制,但具体操作体验如何,还需进一步验证。类似这种使用手势交互的遥控方式的无人机还有亿航的 GHOSTDRONE 2.0 无人机,其通过连接手机,利用手机陀螺仪进行体感控制,雷科技(微信ID:leitech)不久前曾对该款产品进行过评测(戳下方视频复习),操控的灵敏度还不错,而且使用体感交互确实能大大降低操控的门槛。
作为在 Android 阵营地位等同于 iPhone 的亲生系列,谷歌 Nexus 系列在系统升级方面可以说让不少第三方厂商用户羡慕嫉妒恨。显然,今年发布的 Android 7.0 同样如此。今日,谷歌正式向 Nexus 用户推送 Android 7.0 牛轧糖系统正式版本(Final Builds),真是好大的一个惊喜。(图片来源于:androidpit)据悉,此次有机会获得谷歌官方升级的设备包括:华为代工的 Nexus 6P、LG 代工的 Nexus 5X、MOTO 代工的 Nexus 6、HTC 代工的 Nexus 9 平板电脑、华硕代工的 Nexus Player 智能盒子,以及谷歌亲自设计和制造的 Pixel C 二合一电脑。而 Nexus 5 不出意料和官方 Android 7.0 说拜拜了,后续关注 CM 等第三方系统的更新吧。目前,Nexus 6P、Nexus 5X 以及 Pixel C 已经释出了官方完整版系统镜像。如未收到更新推送,或者不想通过 OTA 方式升级的这些设备的用户,可直接下载官方镜像并在 REC 模式下通过 ADB 命令刷入。另外需要说明的是,如果已经安装开发者预览版系统的用户将优先获得推送,而仍处于 Android 6.0 的用户或许还要等 1-2 周。(图片来源于:LG)除此以外,谷歌方面已经确定,LG V20 将成为全球首个预装 Android 7.0 系统的手机,目前该机的真机渲染图和配置已经曝光。在此之前,LG 也已经在官方新闻网站公布该消息。这也就是说,在 9 月 6 日 LG V20 发布之前推出的所有新机,包括 IFA 展出的华为 Mate S2、索尼 Xperia XR 和 Kugo,都将只能预装 Android 6.0 棉花糖系统。至于第三方机型升级方面,之前雷科技(微信ID:leitech)已经做过合理保留的预测。简单来说,Moto、LG、HTC 旗舰机依然有望列入第一批升级梯队,将在今年 10-12 月正式开启升级;三星、小米、华为紧随其后,有望在今年底至明年初开启升级。而其他厂商的旗舰机用户则可能需要经历一段漫长的等待。总体而言,能获得 Android 7.0 的更新还是好处多多的。这次的牛轧糖系统不仅加入了分屏、Doze 休眠机制等诸多新功能,甚至还据称该系统的运行速度将提升 600%,相信这对于想要告别系统卡顿的用户来说,将是最受欢迎和最值得升级的一次大版本更新。
当人们在忧愁缺乏各种 VR 外设时,一家研发虚拟现实相关产品的公司 Ilium VR 近日发布了一款专为 VR 游戏而打造的枪型手柄 Devkits,绰号为“劝诫者”。在体验 HTC Vive 的枪战游戏时,主要通过两个附带的手柄进行交互操作,但因为这不是真正的“枪”所以玩起来并不够真实,而这款枪型手柄正好满足了这个需求,其支持与 HTC Vive 的连接。设计方面,“劝诫者”跟传统的冲锋枪造型差不多,但由于其塑料感太重,给人感觉就像是一把玩具枪。“劝诫者”采用模块化设计,相比其他的枪型手柄,其好玩之处在于可以将外挂的按钮拆卸下来,并按照自己的使用习惯调整合适的位置,也可以外挂操纵杆,甚至可以将 HTC Vive的手柄安装到枪杆上。另外,“劝诫者”还具有触觉反馈系统,也有类似真枪那种火力模式转换开关,为了模仿那种真实的枪战体验效果,“劝诫者”的弹药仓可以拆卸,游戏中,玩家可以通过插拔弹药舱来更换子弹。这款手柄采用无线方式连接,目前主要适配 HTC Vive,未来还将支持 Oculus Rift 以及 PSVR 等主流设备的适配。“劝诫者”现在已于 Ilium VR Store 上市,售价 199 美元(折合人民币约:1320 元),购买手柄会附送两款演示游戏,分别为沙漠僵尸射击游戏和城市屋顶防御游戏。类似这样的体感枪其实还有很多,比如 X-rover 的炫感枪、MAGP90、TrinityVR 的 Trinity Magnum(三位一体手枪)和 Dekka 的虚拟反震冲锋枪,而索尼即将推出的枪形控制器同样是一款专为枪战游戏而生的设备。当然,体感枪只是VR外设的其中一种分类,针对不同的体验场景以及应用需要配合不同的 VR 外设使用,比如“开飞机”需要有空战座椅,“开汽车”需要有体感座椅等等。随着 VR 的发展,未来还会有越来越多的“外设”诞生,而这才能使虚拟现实的体验越来越深度。
手机已经成为我们生活中不可脱离的工具,由于这种密不可分因此手机也存储着用户的各种私人信息重要资料等等,所以手机的安全非常重要。手机厂商到软件开发商再到用户自身都尝试着用各种手段来提高手机安全性,但有些意料之外的事情总是难以避免。据了解,信息安全研究公司 Check Point 近期发现了使用高通处理器的 Android 手机的4个新漏洞,这些漏洞可以被黑客完全入侵手机。这些名字叫 Quadrooter 的漏洞有可能影响超过 9 亿部手机和平板电脑,黑客可以利用这些漏洞在不请求权限的情况下也能欺骗用户安装“应用”,随后黑客便可以获得权限,之后就能对你的手机为所欲为,包括软硬件的控制。只要是使用了高通处理器的手机都会受到影响,包括谷歌自主品牌的 Nexus 5X、Nexus 6和 Nexus 6P,以及三星 Galaxy S7 和 S7 Edge 等等,甚至是黑莓最近发布被称作“最安全 Android 智能手机”的 DTEK50 同样无法避免。更坏的消息是,据谷歌发言人表示,这些漏洞要在 9 月份才能得到修复。对比起手机系统自身以及各种应用上的广告和各种潜伏性病毒,这个漏洞的危险性更高,对于安卓手机来说在不 root 的情况下,手机安全性不低,如果没有对应用开放某些权限,很难中病毒。当然堤防各种欺诈性广告也至关重要,雷科技(微信ID:leitech)此前也发表过一篇文章《智能手机中毒事件频发,罪魁祸首竟然是手机广告?》讨论过关于广告病毒的问题。这个高通 CPU 的漏洞有可能会让你防不胜防,即使你手机没有解锁权限,黑客依然能入侵你的手机并欺骗你安装“病毒”,如果这一步得逞,你的手机危险就大了,黑客可以盗窃你的资料、监控输入密码的过程、开启麦克风/摄像头、定位信息等等。为了避免黑客入侵,你可以采取断开网络连接这种措施,但这个互联网时代,半天不上网都很难,只希望你不会被黑客看上。不过,好在安装“病毒”的这一步需要由用户来操作,黑客只能入侵你的手机诱导你安装,却无法强制安装,其实这跟目前手机的各种欺诈性广告差不多,用户在使用手机时多加小心,不要随便“点击”依然不会中毒。
有没有想象过像钢铁侠一样通过 MR 在现实环境里面生成 N 个虚拟桌面进行各种工作...MR 版无限桌面现在不知道有没有,但可以肯定的是 VR 版无限桌面应用已经面世。近日,一家叫 Envelop VR 的虚拟现实软件公司推出了一款名为 Envelop for Windows 的平台,该平台可以让 VR 眼镜实现 Windows 应用的“多桌面”工作。通过 Envelop VR 研发的 Envelop Virtual Environment(EVE)平台,用户可以在 VR 眼镜内运行 Windows 应用,同时可以打开多个窗口并控制每一个窗口的大小和位置。如果你的电脑配置跟得上,可以在虚拟世界里面 360 度地生成 N 个包围着你的页面,之后通过转动头部就能查看各个页面,并进行各种交互操作。(图片来源于:http://yivian.com/)Envelop for Windows 目前兼容 HTC Vive 和 Oculus Rift 头显,其将会在洛杉矶虚拟现实博览会上正式亮相,Beta 版已经进行了几个月的封闭测试,美国当地时间 8 月 5 日将免费上架Steam平台,用户也可以通过 Envelop VR 官网直接进行免费下载,想要像钢铁侠一样装装逼的用户赶紧了。虚拟现实先驱 Tom Furness 博士表示:我认为 Envelop for Windows 是虚拟现实的‘强力胶’,而且是把虚拟现实的潜能带给现有 Windows 平台用户的关键一步。如果你正准备投资诸如 Oculus Rift 或 HTC Vive 这样的虚拟现实头显,那么 Envelop 可以帮助你最有效发挥出这些技术潜能。你不仅可以接触到更好的内容,还可以在同时进行多任务操作…..而这一切都可以在一个沉浸式三维虚拟环境中实现….这就像魔法一样。VR/AR/MR 带给了人们无限的可能,不管是生活还是各种生产方式等等都会因为“三R”而带来颠覆性的改变,像此前大火的 Tilt Brush 可以让人们轻松进行各种艺术创作。上文提到的这款“无限桌面”应用,虽然概念很早就已经有了,但现在依然是“经典”,过去一些需要多桌面工作的用户只能通过使用N个实体显示器来实现,但这会带来种种不便,现在只需要一款头显设备即完成,而且除了可以生成无限个桌面外,还可随意移动和不受空间限制,人类生产力和效率将大幅提升。当然,VR/AR/MR 远不止这些,请尽情想象。
手机储存着越来越多的重要文件,一台手机丢失了,让人伤心的不单单只是手机本身,更重要的是手机里面装着的东西,特别是一些珍贵的照片,如果手机丢了,照片也“拍”不回来了。所以养成定时备份的习惯不能缺,很多人都觉得备份非常麻烦,特别是安卓手机如果要备份到电脑的话,又要连接数据线,又要找出相关文件夹以及文件,操作相当繁琐;而使用网盘的话,上传速度又慢,还要担心网盘某天会倒闭......那么,如何便捷轻松又安全地完成备份?今天就来教大家一些的方法:◆ ◆ ◆ ◆ ◆ 通过第三方软件实现无线快捷传输每次上传文件到电脑都需要连接数据线,操作非常麻烦,当然,如果你使用的是 iPhone 手机同时又使用 MacBook 的话,可以直接使用 AirDrop 功能实现文件的无线快捷传输。当然,如果你不具备这些条件,通过第三方的文件快传软件同样可以实现类似功能,比如使用 360WiFi 快传、小米快传、茄子快传等等,将手机连上笔记本的 WiFi 信号后,两台设备间的文件就能通过无线方式互相访问和传输,文件的显示和备份相比电脑文件夹式的管理清晰方便很多。◆ ◆ ◆ ◆ ◆ 无线 WiFi 移动硬盘:不用电脑同样能实现快捷备份假如你连开个电脑备份文件都觉得麻烦,那么还有更懒的备份方法,那就是使用无线 WiFi+ 移动硬盘。很多人都喜欢将重要文件备份到移动硬盘上,然而如果用常规方法将手机文件备份到移动硬盘的话需要经过“手机-电脑-移动硬盘”三步,现在有一种东西叫做:智能 WiFi 盒子,将移动硬盘连接到智能 WiFi 盒子后,可以通过 WiFi 信号让移动硬盘与手机连接,从而实现文件的无线传输和访问,使用这种方式可以让你快捷备份和访问硬盘的文件,还可以与好友共享。另外还有一些移动硬盘直接将 WiFi 模块内嵌到硬盘上从而做成:无线移动硬盘,其使用方式和上述的“智能 WiFi 盒子+移动硬盘”一样,这种形态的设备一体化更强,使用也更加方便。◆ ◆ ◆ ◆ ◆ 无线 U 盘:随时随地便捷备份出门在外,携带无线硬盘来备份其“沉重硕大”的体型显然会大大加重旅途负担,这时候你需要一款无线 U 盘,这种无线 U 盘使用方式和无线硬盘一样,同样内置了 WiFi 模块,手机等设备可以通过无线方式与U盘实现数据的访问和传输。知名 U 盘厂商闪迪(SanDisk)已推出无线 U 盘,可续航 4.5 小时,同时支持 3 台设备访问数据,感兴趣的可以自己倒某宝某东找,不过这类 U 盘并不便宜,在某东,32GB 售价为 199 元。◆ ◆ ◆ ◆ ◆ OTG 线/OTG U 盘:另一种便捷的备份方式如果你的 U 盘不支持无线传输,同时又想直接通过手机备份文件到 U 盘上,那么可以使用 OTG 线,其将 USB 口转换成手机接口,从而让手机与 U 盘实现有线连接,这样你就可以直接通过手机备份文件到普通 U 盘上了另外还有一种叫 OTG U 盘的东西,其在 U 盘上设计了连接安卓手机的 Micro USB 接口,或 iPhone 的 Lightning 接口,这 种U 盘可以直接连接手机进行备份,相比 OTG 线+U 盘,这种一体化设计的 U 盘更加便携。爱国者 OTG U盘◆ ◆ ◆ ◆ ◆ 智能路由器:打造个人专属网盘如果你担心网盘带来的种种问题而拒绝使用网盘,但又想体验“网盘”的便利,那么可以使用那种具有硬盘储存功能的智能路由器。比如小米的一款路由器,其产品本身内置了硬盘(有些智能路由器可外接硬盘),当手机等设备连上 WiFi 后可以实现与硬盘间的数据传输,同时也能远程访问数据,这相当于属于你自己的个人网盘,相比常规网盘,其更加便捷、安全、私隐。看到这里,相信你已经知道如何便捷快速地备份了,那么,这么多方法到底哪一种是你的菜呢?当然方法还有很多,如果你还有更特别的方法欢迎与我们分享。最后再提醒一下:手机里的照片等文件非常珍贵,请记得养成备份习惯。
号称空中机器人的无人机,是这两年里最火爆的硬件领域之一。说到明星硬件公司,人们都会想到DJI(大疆),对行业稍有了解的还知道极飞、零度、亿航、Parrot、3D-Robotics、Lily等品牌。实际上远不止这些,在中国创业者项目库IT桔子检索飞行器项目已有24个项目,国内目前拥有无人机生产企业已超过400家。这些无人机其中一大半是做航拍,还有一部分是专注于各个领域,例如工业级长续航、农业应用等等,同质化较为严重。现在,围绕无人机的『周边』领域,将出现更多机会。1精准定位无人机现在基于GPS定位,定位精度在数厘米级别,无法达到更精细的程度。这让它在某些场景下的应用被局限了。想要回落到行动中的汽车顶部,想要绝对安全地在室内穿梭,想要完成一些精细化的空中任务例如物流配送、化工厂巡检,都需要更加精细化的定位能力。谁能解决这一问题,谁就有机会做出下一代无人机。凌宇智控就是这一领域的创业团队,其打算基于计算机视觉等前沿技术,提供最精确的机器人室内三维定位解决方案,精度可达到毫米级别。(详见下方视频)精确定位可能会成为无人机后来者的杀手锏。DJI等无人机大鳄是否感受到威胁呢?2培训认证从12月22日开始,所有美国无人机用户都可以向美国航空管理局注册,按照现有规定,符合要求的无人机都必须在2016年2月19日前完成注册,否则将会面临处罚。毫无疑问,尚处于灰色地带的中国民用无人机也将迎来类似的监管,未来将采取实名制,并且接入监管系统,无人机用户未来甚至可能被要去拥有『执照』。针对无人机的认证服务,无人机用户的专业或非专业的培训服务,将成为刚需。『带你装逼带你飞』,这是可以赚钱的。3无人机保险无人机飞行时非常酷,却蕴藏着较大的风险,基本可映射到汽车风险上:价值不菲的无人机本身容易『摔机』,维修费用非常之高,这是巨大的损失。同时还有可能砸到人或物,造成第三方责任,或者给用户自身带来伤害。基于此,面向无人机的保险迫在眉睫。2015年,UFLYING无人机联盟联合正隆(北京)保险与天安财产保险推出了国内首个『无人机综合作业保障方案』,太小众。中国无人机佼佼者DJI在今年已与众安保险联合推出多种保险,针对“悟”Inspire 1机损的售后服务计划——DJI Care售价高达3888元,针对Phantom 3 Standard 半年版要788元,太贵了。太平洋财产保险亦推出了无人机保险。相信未来无人机保险会像车险一样普及,尤其是未来用户可能被强制购买保险,随和无人机产业的壮大,无人机保险会更便宜。4无人机充电桩民用无人机续航能力一直都不太给力,尽管有紫燕等团队试图打造长续航无人机,但市面上的普通无人机续航都在一个小时以内。在一些专业作业场所,未来有望建设类似于电动车一样的无人机充电桩基础设施。要没电了,无人机就可以自动飞回去充满电继续飞行。这样它就可以飞很远,或者在一些场合来回飞行,不断作业。今年,美国波音公司被美国商标和专利局(USPTO)授予了一项“可为半空中的无人机充电”的新专利。在给到无人机更好的续航能力之前,帮助其便捷地补充电量可成为缓兵之计。5无人机+VRDJI(大疆)需要专业遥控器操作无人机,亿航进入市场之后最大卖点是直接用手机App操控无人机——用手机操作无人机的玩家现在越来越多了。手机之后,已经有厂商开始尝试用头戴式VR设备来操作无人机了,给你真正的上帝视角。全球的民用无人机始祖Parrot 就发布了 Bebop支持Oculus Rift、 索尼 FPV产品、蔡司的 Cinemize;亿航发布的Ghost 2.0也搭载了带有头部姿态追踪功能的虚拟现实眼镜;越来越多的无人机开始支持VR设备。除了使用 VR 设备得到第一人称视角的操作体验之外,给无人机搭载 VR 内容摄录工具,同样是机会,Nokia OZO 等专注于VR内容制作的设备正在越来越多,如果给它们上帝视觉,就可以让人类用上帝视角来虚拟现实了。无人机近年来的火爆程度有增无减,其本质是空中机器人,是最先普及的民用机械机器人。不过,相对于科幻电影中的机器人而言,无人机智能化程度并不够,它需要人类对其进行操控,缺乏足够精准的机器视觉,除了航拍、施肥之类不能进行更复杂的空中操作比如维修电缆、悬挂广告牌……相信未来这些都会得到解决,无人机会越来越智能越来越聪明,围绕着无人机还有巨大的机会,这是一个空中产业,我们不应该只关注DJI。
少林扫地僧或称无名老僧,金庸小说《天龙八部》里武功极高的高僧,隐居于少林藏经阁,日常功课是扫地。今天雷科技(ID:Leitech)就为大家扒出了中国科技圈的扫地僧:一般很“低调”,实际却很厉害,尤其是在专业领域。XAIRCRAFT极飞,商用无人机中的佼佼者说到无人机,大家肯定会先想到DJI大疆或者是Parrot,大疆在国内其实已经非常低调和小众了,然而极飞相比大疆则更为小众,是国内最早开始研发多旋翼无人机的公司之一,成立于 2007 年,总部位于中国广州。极飞的无人机更多是倾向于商用领域,产品涵盖农业植保、低空物流、警察监控、医疗救援、森林防火、地质勘探、空中测绘、极地科考等产业。无人机物流也是极飞未来的发展方向之一,2013年顺丰被爆出在东莞实验无人机物流,而那时选择的合作伙伴就是极飞。今年2月初,淘宝实验无人机送货,那台用于送货的无人机也是由极飞生产的。目前极飞的无人机产品已经走进了美国好莱坞片场、澳大利亚的海岸巡逻队和德国的智能工业区以及新疆的万亩棉花地。NOITOM诺亦腾,为《权利的游戏》提供动作捕捉技术诺亦腾是一家从事动作捕捉领域的公司。旗下共有三款产品:Perception Neuron、Perception Legacy、MySwing Golf。其Perception系列产品基于惯性传感器的动作捕捉技术是一项融合了传感器技术、无线传输、人体动力学、计算机图形学等多种学科的综合性技术,有着极高的技术门槛,世界上仅有少数几家公司能够完成。mySwing是针对高尔夫运动推出的产品,挥杆宝与智能终端(兼容iOS和安卓系统)匹配使用,可以精准捕获高尔夫挥杆数据。这么说似乎不是很具体,著名美剧《权利的游戏》相信大家都有看过或者听说过,诺亦腾的Perception Neuron就曾被其制作方使用,专门负责虚拟形象的动作捕捉拍摄。是国内少有的,拥有世界级水准的动作捕捉公司。旷视科技,支付宝刷脸支付背后的公司旷视科技是2011年10月正式成立的一家年轻公司,旗下最著名的产品就是Face++人脸识别云服务平台。Face++平台通过提供云端API、离线SDK、以及面向用户的自主研发产品形式,将人脸识别技术广泛应用到互联网及移动应用场景中。人脸识别现在常常应用在各种安全领域,我们生活中最常见的人脸识别的技术应用就是人脸识别解锁、刷脸支付等等。在2015年德国汉诺威CeBit展上,支付宝推出了新功能声波支付和人脸支付。其中未来感十足的人脸支付的技术就是采用的Face++。目前其还与360搜索达成了合作,进行试水阶段的图片搜索应用。同时其也为世纪佳缘设计人脸识别场景,帮助用户根据自己对另一半长相的需求。从网站的数据库中搜索相似外貌的用户。简而言之,这家公司的技术已经进入了我们普通人的日常生活中了。Face++的团队很年轻基本上都是85后,公司三位创始人都来自于清华大学。2014年,Face++在人脸检测FDDB评测、人脸关键点定位300-W评测和人脸识别LFW评测上,接连拿下了这三项的世界第一。其中,在最重要的互联网图片人脸识别(Face recognition)LFW中,Face++团队更是力压Facebook的团队,在极难识别的互联网新闻图片上,获得了97.27%的准确率。这个可是相当不俗的战绩啊。汇顶科技,让安卓用上正面按压指纹识别iPhone 5s出现的时候为大家带来了手机上的正面按压指纹识别,从此为手机解锁打来了一扇新的大门。之前手机上的指纹识别基本上都是采用滑动式的,体验非常的糟糕。后来有许多手机厂商想要跟进这项技术,不过为iPhone 5s做指纹识别那家AuthenTec公司已经被苹果收购了,所以安卓手机正面按压指纹识别技术的速度并没多快。直到魅族MX4 Pro出现,大家才对安卓的指纹识别改观,它是第一款采用正面按压指纹识别技术的安卓手机。说到这款手机的指纹识别技术就不得不提一家公司,就是汇顶科技,其实早在MX4 Pro上市半年多前汇顶已经做出了在技术和可靠性上可以跟 AuthenTec 媲美的指纹识别模块,不过那时模块太大了,经过一段时间的打磨汇顶科技终于做出了现在大家常用的指纹识别模块。除了指纹识别,汇顶科技在单层多点触控技术、基于触摸屏的近场通信技术也做得很不错。目前其产品和解决方案广泛应用在华为、中兴、联想、OPPO、VIVO、魅族、三星显示、JDI、诺基亚、东芝、松下、宏碁、华硕等大家熟知的品牌上。HiFiMAN 头领科技,能生产出世界顶级的耳机喜欢音频器材的小伙伴们应该都比较了解这家公司。头领科技是2007年在美国纽约创立的高端音频产品品牌,现在,头领科技已经把公司总部从美国纽约迁往中国天津,并在中国大陆设有两家工厂和一个研发中心。目前,其生产的产品在国际上也有相当知名度,有的产品可以和森海塞尔、拜亚动力等老牌声厂的高端产品相媲美。HE1000平板耳机是头领科技目前的旗舰级产品,采用的是其自主研发的纳米厚度振膜,以及独家专利的“百叶窗”技术,让HE1000的背部结构更大程度的开放,并且还拥有特有的双侧非对称设计磁路,在保证获得驱动效率的最大化之余,也进一步减少了声音的失真。简单的说,这款产品的声音好到不输国外的一线品牌的顶级产品,并且其还有众多奖项加持,诸如:基山音响展最佳耳机奖、2016年CES创新大奖等等。步步高,全球第五大可穿戴设备厂商步步高是大家们很熟悉的一家公司,但你知道它是世界第五大可穿戴设备厂商吗?是的,这次我们不是要说点读机,也不是要说手机,而是要说是可穿戴智能硬件。在大家的印象中步步高似乎跟智能可穿戴硬件没什么关系,可是要说到小天才这个品牌或许大家就比较熟悉了。小天才是步步高旗下的一个品牌,主攻幼教早教系列。就在最近,IDC公布了今年第三季度全球可穿戴市场出货量排行榜,步步高(BBK)以 70 万的出货量取代三星首次成为全球第五大可穿戴设备厂商,而这70万出货量绝大部分都是靠的小天才电话手表,由此可见步步高在产品和线下营销的实力。OPPO影音,蓝光播放器被奉为“神器”OPPO在大家心目中一直以来是以手机厂商示人的,不过在国外最为著名或许不是OPPO手机而是OPPO影音,其实OPPO手机与OPPO影音是完全独立运行的两家公司。目前OPPO影音的产品有平面振膜耳机、耳机功率放大器以及蓝光播放器。以其蓝光播放器最为著名,2008年OPPO推出首款蓝光播放机BDP-83,后陆续发布BDP-80、BDP-93、BDP-95、BDP-103、BDP-105、BDP-103D、BDP-103D。OPPO影音的蓝光播放器在国外影音爱好者的心目中一直以来都是“神器”,曾经一度登顶发烧友心目中的泰斗级奖项 Stereophile A+榜榜首,并多次获得Audioholics,、HiFi Choice、HomeTheatreSecret等专业发烧杂志的“ReferenceAward”、“Best of the Best”奖项,以及欧洲影音协会EISA奖“2013-2014年度欧洲最佳家庭影院全能播放机”。简而言之,OPPO蓝光播放器在国外有着相当好的口碑,在万元内强过很多日系品牌,常年都是销量前几名。在科技公司方面,有很多人觉得国内的公司相比国外的同类公司要逊色不少,但其实我们一样很厉害。上面列举的这些公司,在国内或许很“低调”,但其实他们基本都是各自领域中的佼佼者,生产的产品也广受好评。
Amazon无人机送货新闻一出,国内一堆快递公司都说要出无人机送货服务了,折腾了一年多愣是没捣腾出啥来,当然作为新闻,还是很有关注度的,营销目的达到了。了解无人机的朋友想都知道,不论是负重能力还是飞行里程还是交通法规,无人机送货在可见的未来都是不可能实现的。况且在飞行过程中还会遇到雾霾、捕获、天气这些问题,掉下来砸到人不说,砸到花花草草也不好嘛。第一是创意,第二是跟随,第三就是呵呵了,今年双十一期间还有商家在学……像汪峰给章子怡送礼物那样还是可以的,距离要短,场景有限,还要专业飞手。3智能灯泡用手机App来控制灯泡,是不是很酷?是。可是,你为什么需要用手机来控制灯泡?想来想去只有一个厂家:『自己一边儿玩儿去』。本来可以按一下按钮就可以打开的灯泡,为什么要让我打开手机再打开App来打开……神啊,放过我吧。当然有人说,某智能灯泡可以实现光感,声控什么的,哥,你不知道20年前,中国偏远地区小镇楼道的灯光都实现了这点吗…4智能净水机这个是伪智能中的战斗机,净水机很少需要与人交互,它本身也不需要太多智能化功能,没水了就安安静静地在那里净化就好了,现在的智能净水机如何智能呢?你可以通过App看到家里的用水量,你家净水机滤芯用完了可以提醒你更换,而这玩意儿一般半年以上才需要换一次,卖滤芯的会很勤快的给你打电话的,因为这是收费的,还很贵。所以,我需要为了看用水量,或者看滤芯是否到期来安装一个App?放过我吧,我的iPhone只有16GB内存啊。5智键智键可是掀起了互联网巨头做硬件的小高潮,快按钮做了之后,360、小米等巨头纷纷跟进,快按钮还曾哭诉巨头抄袭其idea,记得当时这一招还挺管用的,围观者义愤填膺(现在大家对这个麻木了)。可是,回过头来看,你看到过身边使用『智键』的人吗?——就是在你耳机孔里面插入一个按钮,然后给这个按钮定义某个动作比如拍照,本质是让你手机多了一个实体按键,注意,只支持Android。事实证明,这玩意儿,没有抓住用户的心。6儿童安全鞋儿童安全手表做了一堆,最后家长买这玩意儿,并不是因为安全定位,而是因为它可以打电话,所以你看没有几个儿童手表还会突出安全二字了——实际上如果你不看管好孩子,想要通过一款手表来实现安全,是痴心妄想。与之类似,361°等公司还推出了安全鞋,就是在运动鞋上加一个定位芯片,进而可以追踪到孩子位置…你会给你孩子买这样的鞋子吗?以安全之名。7智能空气检测墨迹天气除了空气果,许多人说完了,这是墨迹要做大数据要,通过空气果监测到的天气状况来做天气预报,看到这里学大气学的大学生们都笑了。当然,墨迹空气果的工业设计确实堪称上乘,漂亮的外观得到了大家的认可,可是鉴于需求不够强烈且定价过高,最后也卖得不怎么样。除了墨迹空气果,还有许多围绕着『空气检测』的智能硬件,有的检测甲醛,有的检测一氧化碳,但大家都面临一个问题:用户买你这个检测空气不好又能如何?而且北京人在冬天,或者买了新车什么的,不检测也知道空气不好啊。8智能跳弹智能跳蛋是给女人用的,智能飞机杯是给男人用的,它们可以实现远程交互,让别人来控制你的设备,或者通过手机App来控制玩具。可是这有什么意义呢?它并不难给你更多快感,而且使用起来更麻烦,要知道很多人在XXOO的时候连打开Durex的时间都觉得太长了,你还要他拿起手机打开App去打开跳蛋?最智能的跳蛋,是你的他;最智能的飞机杯,是你的她,so,智能跳蛋、智能飞机杯,歇歇吧。9智能电风扇智能电风扇这是也是醉了,艾美特等传统家电厂商看到国内一堆做智能硬件的,赶紧跟风做了一个,可以通过手机App去调整风速什么的,可是,为什么我不能直接用按钮?当然,市面上确实很多传统电扇配置了遥控器,可是这个遥控器究竟有多少人会使用?难道还嫌家里遥控器不够多么?退一步说,有时候使用手机App操控体验并不如遥控器,智能电视交互就是一个很有说服力的例子。
前些年,在坊间一直流传着一种说法“ Mac OS是不需要杀毒软件的”,其实这并不是因为 Mac OS 的安全性比 Windows 高很多,这是由于 Mac 用户相比普通 PC 用户而言要少得多,而黑客通常都会盯上使用人数较多的操作系统上。不过随着近几年越来越多的消费者选择购买 Mac 产品,Mac 被攻击的次数也开始逐年增长。有调查显示,目前,Mac 产品在全球电脑市场占有 7.6% 的份额,且增长势头稳定。而且目前已有诸如 IBM 的大公司部署了数量可观 Mac,相信黑客们也不会忽视如此庞大的一块“蛋糕”。想必大家都还记得去年的 WireLurker 事件和今年 9 月的 XcodeGhost 事件,这些类似的事件对 Mac 用户的信息安全造成了极坏的影响。日前,安全公司 Bit9 最近发布报告称,2015年成为Mac有史以来受到恶意攻击最多的一年,在今年 6 月至 8 月期间,他们对 1400 多个 Mac 病毒样本进行了 10 周的研究,结果显示这一年的Mac被攻击次数几乎相当于过去5年时间被攻击次数的总和。一定程度上来说,Mac 还是需要一些安全软件的。那笔者就向一般的普通Mac推荐几款比较实用的安全软件:1Avira (小红伞)安全软件它来自德国,在安全方面一直以来有着不错的表现,并且还有免费版本可供下载。免费版提供了实时恶意软件防护、基于配置文件的系统扫描程序、一键式病毒删除,并且还有比较直观的操作界面。2诺顿Symantec公司推出的诺顿网络安全软件,这款软件入门版的一年期售价为79元,可供一台电脑使用。进阶版和专业版的一年期售价分别为139元和249元,分别可供3台电脑和5台电脑使用。入门版提供抵御病毒、间谍软件、恶意软件和其他在线威胁防范功能。如果设备被感染病毒而无法修复,其还提供退款服务。3McAfeeMcAfee这家安全软件公司大家应该也比较熟悉,其和创始人分道扬镳后现在是 Intel Security 的一部分。其面向家庭的安全软件售价为310元,可供1-3台计算机使用。提供木马程序、病毒、间谍软件、Rootkit的防护,并且还会检测、隔离和阻止病毒及恶意软件。4AdwareMedic 广告清理软件AdwareMedic 广告清理软件,这款软件的功能相对而言比较单一,但却十分简单易用,主要是清理Mac中被安装的广告软件,一定程度上的减少垃圾广告对用户的骚扰。目前它能够检测并处理二十多种不同的广告软件类别,并且其还在不断更新可检测的广告。这几款软件价格比较合适,杀毒软件中尤其以小红伞免费版最为划算,而且在国内比较容易从官方渠道下载和购买,所以比较推荐,但它们的功能基本上还是大同小异。其实保证自身的网络和信息安全,Mac用户除了下载网络安全软件,还是需要养成一个良好的上网习惯,诸如:不安装未知来源的软件、尽量从App Store中下载软件、浏览网站时要防范不安全网站等等;这些举动都可以一定程度上的降低网络安全风险。
三段关于“即贴即充”的视频,引发了网友的高关注度,其总观看量已经超过 500 万。在第一段“跟电池说永别”的视频中,在法国的中国交换生魏信介绍了名为 K3OPS 的全新供能技术;第二段“用辐射点亮彩灯”的视频中,K3OPS 将辐射转换成电能来点亮彩灯;第三段“用辐射点亮灯泡和手机”的视频中,K3OPS 将环境中的射频能量取回并转换成电能给日常生活中的用电器供电。将环境中的电磁辐射转换为电能,再给不同的用电设备永久供电,这样的想法多少都有点科幻。但现在魏信不仅做出了 K3OPS 贴片的演示视频,还将在国内的艾瑟智能家居系统中植入 K3OPS。不含有毒化学物资而且成本不高,K3OPS 技术可以消除干电池的使用,同时解决电池老化和更换的问题。K3OPS 技术通过由近及远采集不同频率的辐射,回收的电磁能量包括 WiFi 网络、蓝牙和 4G 等信号源产生的辐射。使用对电磁场有特性的超导材料,输出电阻与负载阻抗的耦合,特殊信号的分离和低通滤波器和谐波萃取,保障了输出电压的稳定性和强大的输出功率。值得一提的是,K3OPS 技术支持的供电介质可以是标准规格的电池(如 A、AA、纽扣电池等),也可以是手机电池,这样手机就有望告别充电器。一年前,魏信在海外注册了 K3OPS 公司,现在他计划发布多款采用 K3OPS 技术的消费产品。视频中介绍的 K3OPS 贴片只是一个简单的辐射能转换和供电设备,包括最为关键的天线电路与转化电路,而贴片最薄可以做到 0.3mm。除过供能贴片,K3OPS 公司的待发新品还包括运动腕带和充电手机壳。名为 SQUID 的可佩戴腕带,可以监测电磁场以及心脏速率和体温。SQUID 腕带采用 K3OPS 技术,无需电池,单靠采集周围环境中“浪费的”辐射能转换供电。你甚至可以通过数据线连接腕带给其他的电子设备进行充电。K3OPS 技术的另一款代表作手机壳,可以不断地为智能手机充电。这款手机壳嵌有一个整流天线系统,一个特殊的天线收获环境中的 RF(射频)并转换成直流电。如果这款手机壳投入大规模量产,手机充电将告别必须依赖充电线和电源的旧时代,妈妈再也不用担心手机没电而自动关机了。借力国内合作伙伴 ISE(艾瑟)技术,K3OPS 射频能源回收技术也被引入前者的智能家居系统。K3OPS 这项多少有点科幻的新技术,在实际应用中会受到限制吗?ISE 智能家居产品总监马宏图对雷科技表示:K3OPS 技术的应用暂时不会受到限制。K3OPS 现在支持 12V,750mA 的稳定输出,整个系统为多层天线网络系统,多波段扫描涵盖了生活中所有的辐射射频,实时扫描环境中各种频率,优化选取最佳的辐射源进行转化,避免可对正常通讯设备的干扰,不会对环境中其他设备的正常使用带来任何影响。据悉,K3OPS 将兼容包括通信功能在内的 ISE 所有协议。ISE 会在近期推出以 K3OPS 技术为基础的智能家居产品,然后迅速地移植到 ISE 整个智能家居体系当中。公开资料显示,ISE 技术是一家智能家居产品开发与方案集成商,其推出的 ISE.智能家居组合(包括智能彩灯、开关、插座和无线网关)于去年登陆点名时间进行众筹。
苹果每一代产品出来,都有人看好,也有人不看好,比如 iPhone 、iPad 。Apple Watch 同样如此,正式发售当天在全球范围内大受热捧,不过朋友圈依然有人对其不看好,并表示坐等打脸。Apple Watch 发布之后,能否再次定义一个产业,给智能手表行业带来什么影响,这是雷科技 SmartTalk 第八期探讨的核心问题。活动之后,我们有了来自业内人士的答案。1.Apple Watch 引领市场,不过终将被 Android 阵营超越百度 Duwear 负责人王磊认为,Apple 在手机、平板上都曾引领市场,不过最后却被 Android 以大概 3 年的时间超越。今天对于国内的手表市场是巨大的契机,苹果产品已经发布了,教育和引导作用非常明显,Apple Watch 销量有望一下超过所有智能手表之和。不过,智能手表最终普及可能还是要靠 Android 。理由有以下几点:1. Apple Watch 只为 iPhone 用户服务,留下了 78.3% 的巨大市场空白,Android 、Windows Phone 手机用户,同样需要智能手表。2. Apple Watch 定价最低 2588,智能手表年年换代并不具备显著收藏价值,用户需要更具性价比的智能手表,51% 的受访者表示只接受 199 元以内的智能手表,超过 2000 元的手表只占 1% 市场份额。3.智能手表具有非常强的装饰属性,时尚属性强,每个人对美有不同理解,有多样性的需求,不可能被 Apple Watch 垄断,而多样化的产品最终必然是基于开放式的系统上,传统手表厂商不可能自行做系统最终一定要选择第三方,就像 Android 手机一样。Android Wear 虽然已推出,不过目前市场表现乏善可陈,对应服务的本地化做得并不好,比如基于 Google Now 的语音交互目前只支持英语,再比如 Google 地图在中国的本土化做得并不好,这给第三方留下了机会,百度基于 Android 5.0 推出 Duwear,腾讯近日则宣布基于 TOS + 打造智能手表系统,中国互联网巨头蠢蠢欲动。Duwear,历时 8 个月开发的智能手表系统,基于 Android 5.0 定制2、智能手表需要摆脱对手机依赖,不要只为已有用户服务Apple Watch 是 iPhone 的助理,没有 iPhone 它基本是废物,无法联网不说,很多交互都无法进行。苹果做 Apple Wacth 的目的是为给它的手机用户服务,跟三星做 Gear 一样。曾先后操盘百度移动操作系统、百度 T5 浏览器内核的王磊认为,计算平台的一个显著趋势是越来越便携,从老一代 PC 到台式机到笔记本到手机再到手表,越来越小,功耗更低,交互更加自然,离人体更近,更加智能,因此他认为智能手表某一天取代智能手机并非没有可能,现在做不到是技术局限,比如续航能力和计算能力。不久之前 Intel 和 Google 先后发布了“计算棒”,即非常 mini 的计算机主机,与电视机搭配就是一台电脑,我将这个趋势总结为 Mini 计算。智能手表的成熟以及王磊先生的观点,与“Mini 计算”不谋而合。果壳电子软件副总裁于海东同样认可此观点,他认为,Apple Wacth 基于 iOS 生态,要照顾大量 iOS 用户,因此无法做到毫无顾忌的创新。iPhone 做到了这一点,大量从来没用过 Mac 的用户都很容易使用它,大获成功。微软 Windows CE 先做先死,就是因为把手机当成了 PC 的一个延伸而不是全新的存在。因此,Apple Watch 是否真能如外界预期的大获成功,于海东对此并不太乐观。3、智能手表最大问题是给用户一个买单的理由不论是 PC 还是智能手机还是平板,它们大获成功的前提都是解决了某些用户的某些痛点。智能手机是用户想要随时随地便捷地上网和使用应用,而平板则是人们在某些场合需要更大的屏幕玩游戏看电影上网购物,但又不想趴在桌子前用电脑。智能手表的典型场景,解决的核心痛点究竟是什么?所有嘉宾,以及苹果、Google 官方,搜遍互联网,都没有一个很让人满意的答案。Apple Watch 目前在做的事情主要是这样的:取代了手环是一个很好的健康量化工具;让用户在不掏出手机时可以接受消息、打电话和进行简单交互;与好友互动分享心跳涂鸦等;作为支付的 ID,未来可与智能汽车、家居等结合。而果壳电子则认为,智能手表有五大价值,身手钥交钱,身:身体健康,运动——取代手环;手:手机的第二块屏幕;钥:钥匙&遥控;交:社交;钱:支付。内容层面,大家都大同小异,Duwear 应用层目前主要也是在做这些事情,只是手段和技术不同。SmartTalk 嘉宾,信利软件产品部总经理张泽峰认为,Apple Watch 需要找到用户真正的痛点,就像海飞丝的“去头屑”功能一样,Apple Watch 需要形成类似的卖点。4、智能手表研发术业有专攻,需克服惯性思维Duwear 发布智能手表系统的逻辑在于,智能手表厂商擅长做时尚设计、擅长做硬件研发,擅长做线下渠道,却并不一定长于系统研发—— Apple 这样软硬件通吃的公司太少了,在中国能做并且做得好的更是微乎其微。相对于成熟的智能手机系统而言,智能手表生态才刚刚开始,还有诸多不成熟之处,尤其是语音、地图等交互技术,以及支付这样的平台化应用。果壳电子是中国最早做智能手表的企业,并且推出了第一款纯圆外形的智能手表果壳二代,这款产品基于 Android 定制了一套系统。不过,果壳电子软件副总裁于海东认为术业有专攻,果壳更期望做某一类型的扩展,做好自己该做的事情,现在可穿戴设备厂商什么都自己做,耐克、迪斯尼都来凑热闹,垄断不好,但过渡竞争让用户无所适从。当然,终端厂商选择第三方操作系统会有自己的顾虑,比如是否要捆绑业务,Duwear 是否要捆绑百度地图、百度支付,是否还可以选择第三方业务,未来是否收费,都是终端厂商的顾虑。针对此,王磊表示 Duwear 初期采取半开源模式,以绝对开放心态与第三方厂商合作。果壳电子软件副总裁于海东分享果壳对智能手表的理解于海东认为,智能手表研发最大的坑是惯性思维,果壳电子在研发中做的一重要的事情就是摆脱做手机的思维。在操作场景上,在用户行为分析方面,智能手表跟电脑行业和手机行业有巨大的差别,会用到许多新的跨界手段,比如时尚、生物、物理等等,许多东西都需要推倒重来。这并非果壳电子一家的问题,于海东表示在其所接触的合作伙伴、同行都有类似的惯性思维,包括 Apple Watch 都体现了非常之多的手机思维。除此之外,智能手表厂商需要接触到手表生产供应链,与传统消费电子供应链也是完全不同的领域,需要重新开始。5、汽车是智能手表的典型场景,有望先行爆发关于任何产品需求的讨论都离不开场景,用户在什么时间、什么地方使用产品解决何种问题。PC 是在桌前办公或者娱乐,提升效率、获取信息为主,“趴着玩电脑”;手机是在交通中、躺着、诸多场合,它的交互特性是“低头交互”;平板则是在客厅在卧室为主。智能手表的使用场景究竟是什么?百度地图刘准认为,智能手表很典型的两个场景是,生活中的步行和驾车场景。开车导航的时候,手扶着方向盘,又拿手机看,导航仪在车的中间,要低头看,体验就不好。如果带着手表,双手握着方向盘的同时,可以看到前方导航的路径,就很自然。在出行上路线导航、生活服务导航、移动支付都可以通过智能手表实现,如果体验够好就很简单、自然。Apple Watch 未来也将与 Apple CarPlay 结合,与汽车厂商合作,成为随身佩戴的汽车钥匙
移动互联网时代如果你还只懂得使用U盘进行数据备份那就真 OUT 了,云存储的普及让我们可以轻松将电脑文档、移动设备上的通讯录、短信、照片等重要数据复制、备份、存储到公共网络云盘空间,但公共云盘的数据保密和安全问题一直是困扰着用户,虽然你的这些资料斯诺登们不一定会感兴趣,但保存在公共云空间上的资料有太多机会被骇客和“有关人员”接触到,说不定那天网上就会出现你需要保密的资料;另外,云盘空间也有可能发生损坏或关停等情况,你保存在云盘上的资料将付之东流。为了保证重要资料更安全,最好的方法是架设一台内部网络存储服务器。几年前,网络存储服务器(NAS)还是服务于大中型企业的专属网络产品,NAS 设备费用高、需要专业技术人员才能进行管理和维护。随着智能硬件创新发展,价格便宜、功能多样的微小型 NAS 开始步入普通用户的工作和生活中,妙存( Onespace ) 智能无线网络存储中心就是这样一件 NAS 产品。外观:妙存智能无线网络存储采用牛皮纸盒包装,包装盒只在底部贴着一张产品标签,极简的包装以致会让用户误认这是一件工包产品。从产品标签上可以了解到这台妙存无线网络存储中心型号为 SP01A,采用双核 1G 处理器,内置 256M 运行内存,支持 300M WiFi 连接和 10/100/1000M 有线网络连接,具有 DLNA 推送、打印与 USB 设备共享、离线下载、多用户管理、数据加密等诸多功能。妙存的配件包括主机盒子、9V/2A 电源适配器、4 个防滑减震垫脚、说明书和保修凭证。妙存的外观小巧,盒子尺寸只有 70 mm (宽) x 80 mm (深) x 120 mm (高)。外壳采用纯白色烤漆工艺,盒子上没有印刷任何文字和图案,前面只设计了 MIC、指示灯,所有的接口集中设计在盒子背面。顶部位置设计有扬声器孔,小三角孔起到空气对流散热作用。妙存底部贴有产品信息标签,标签右侧小孔是 Reset 按键孔,用户可通过 Reset 键完成妙存的配置或清除信息。妙存出厂不带硬盘,使用前拧下底部 4 个螺丝即可打开底盖安装硬盘。硬盘经外壳两侧塑料导轨安装进盒子里,底盖在硬盘安装位置设计有减震海棉,可减少硬盘受到震动和降低运行噪声。妙存的硬盘安装仓位可安装 2.5 英寸 SATA 接口硬盘,硬盘支持大于 1TB 容量。拆机:妙存的顶盖使用双面胶带贴合,拆下顶盖可看到下面安装有扬声器和两根 WiFi 天线。妙存 WiFi 天线采用薄膜印刷电路材料,使用粘胶将薄膜天线粘贴在外壳顶部支架。妙存使用的薄膜印刷天线具有体积小,易于安装等优点,而缺点是天线增益小。从电路板上可以看到妙存 SP01A 采用全志(ALLWINNER ) A20 双核处理器,全志 A20 处理器内含 2 个 ARM Cortex-A7 核心,主频速率为 1GHz,全志 A20 处理器常用于平板电脑和电视机顶盒等产品,具有性能好,功耗低等特点。妙存电路板上的电容零件全部采用固态电容,与电解电容相比,固态电容耐高温、不爆浆,更经久耐用,有利于提高产品使用期限。电路板上使用一片 4Gb 的三星 K9GBG08U0A NAND 闪存芯片保存系统固件;两片 128MB x 16 位的 SKhynix H5TQ2G63FFR DDR3-1600 内存芯片构成 256MB x 16 位运行内存(PS:实际运行内存换算应为512MB,厂家给出的参数为 256MB)。无线网络使用 Realtek RTL8192EU USB 模块,模块支持 802.11 b/g/n WiFi 协议,最高无线速率达到300Mbps。有线网络接口采用 Realtek RTL8211E 芯片构建 10/100/1000M 自适应有线网络接入。电路板采用沉金工艺,敷铜线路覆盖着防氧漆,在高温潮湿环境下运行时,可有效防止电路板氧化。电路板上预留有串行检测接口和 USB 接口;妙存的电源管理电路使用 AXP209 芯片,可精确控制整机功耗。内置的 SATA 硬盘接口设计在电路板背面,电路板上贴有防静电薄膜,避免静电对硬盘和电路之间相互影响;在极端情况下,还可降低硬盘与电路板出现接触短路等问题。 小结:外观上,妙存无线网络存储中心设计太过精简,包装盒和产品各贴着一张产品标签,没有其它的印刷文字或图案,让用户容易感觉产品不成熟或公模工包。采用纯白色烤漆工艺的外观漂亮大方,电路板采用沉金工艺和覆盖防氧化漆、采用固态电容等可有效提高产品使用寿命。全志 ALLWINNER A20 双核处理器性能较好、功耗低,可有效降低 NAS 整机功耗,但电路使用 Realtek RTL8192EU USB 无线模块和 Realtek RTL8211E 千兆有线网络处理芯片,可能会受到处理器能力的限制,不能达到理想的传输速率。妙存 Onespace 无线网络存储中心更重要的是体现在功能和应用上,雷科技将在下期评测文章中向大家介绍妙存无线网络存储中心的应用体验。
对于乐高迷来说,这种神奇的积木玩具几乎可以组装成世界上任何一种物品,因此喜欢乐高的朋友一定会对这款出现在Kickstarter上的乐高无人机感兴趣。这款乐高无人机不仅提供了可以组建成无人机的完整乐高组件,同时还提供了包括其它飞行和电子设备,还有汇编指令。整个无人机的体积都非常轻巧,一旦用户将其组装完毕,配备的四翼螺旋桨就可以将整个无人机带起来,同时还包括了外接的便携相机。用户可以在拍摄完毕后查看所有通过无人机拍摄的画面。这款乐高无人机的设计者名叫Ed Scott,而他所打造的产品是世界上第一个可以真正飞行并且通过完全由乐高积木组件自主框架的无人机产品。虽然看起来它是一种玩具,但是对于飞行和电子爱好者来说,也是一种新挑战。Ed Scott表示,这款乐高无人机由APM飞行控制器控制,并且可以作为家庭教育和娱乐的最佳工具,可以让每个人都自己动手组件自己的无人机。目前,这款乐高无人机在Kickstarter上的众筹价格为200美元(约合人民币1220元),感兴趣的朋友可以来欣赏一下介绍视频。
时下预购火热的苹果手表又多了一个大招:解锁自行车。如果你还停留在一把钥匙开一把自行车锁的旧时代,那么欢迎来到自行车无匙之锁的新时代。Nokē U-Lock,一把利用蓝牙技术解锁你的心爱单车的智能车锁。当你走进车锁,只需轻轻按下车锁边上的按钮,Nokē U-Lock 就会从你随身携带的智能手机甚至是最新款的苹果手表上搜索信号,手机或手表处于蓝牙通讯范围内即可瞬间完成解锁动作。而 Nokē U-Lock 锁体本身也是一款结实的自行车锁。采用能抗压也能防水的“钢合金”材质,外观也比普通的自行车锁好看。该款车锁通过 USB 充电电池供电。针对自行车锁实际使用过程中可能出现的一些问题,Nokē U-Lock 也提供了较为完备的解决方案。如果有小偷盯上了你的爱车,Nokē U-Lock 的加速度传感器会检测这一“不良举动”并发出警报。如果你不小心忘记把爱车停在哪呢?手机或手表上的 Nokē U-Lock 配对应用会通过 GPS 定位告诉你最后一次锁车时的位置。如果你想把单车借给朋友,长期的你可以授权其持续访问你的车锁(“共享”你的自行车),也可以就这一次让他打开你的车锁,之后仍然由你控制。如果你出门不常带着手机,Nokē U-Lock 还提供一把实体钥匙供你开锁。当然,你也可以借由朋友手机上的 Nokē U-Lock 应用来轻敲解锁,输入只有你知道的编码即可解锁你的爱车。如果...“世界上最智能”的 Nokē U-Lock 目前仍在 Kickstarter 上进行众筹,但仅剩最后四天时间。众筹价格为 99 美元,预计正式售价将为 129 美元。众筹所剩时间无几,对其感兴趣的玩家请抓住最后机会。当然,如果身为单车骑行族的你也想买块 Apple Watch,那还不赶紧扔掉你的车钥匙,去买把与苹果手表毫无违和感的 Nokē U-Lock 吧。
Solarbike 是一款电动自行车,它的外形与市面上常见的公路自行车很相似,其在安装水壶架的位置,被放置了一个如大号水壶一样电池。在其轮毂两侧被安装了太阳能电池,这样做法很巧妙,如此就极大的节约了空间。当Solarbike静止的时候,轮毂两侧的太阳能电池会通过太阳能进行充电,根据光照时间和强度,一天大概能给 Solarbike 充 2 至 25 公里的续航里程;运行时,太阳能电池和那个车架上的电池会共同为马达供电。据悉,Solarbike 满电续航里程为 70 公里,平均速度为 25 公里/时,最高速度可达 50 公里/时。最重要的是,得益于太阳能电池和极轻便的车身,我们完全可以把Solarbike当作一般的自动车来骑。累的时候再启用电池提供动力。而且它永远不用专门去连电线充电。
在这个看脸的年代,长得不好看就得长的有特点,这不,松下就推出了一个球形风扇,名为 Q (真的好Q啊),放在地上总有一种想踢一脚的感觉。前有戴森的超苗条无扇叶设计,现在松下也不甘示弱,推出了球形风扇。简简单单一个球体,上面有大大小小几个孔洞,满满的现代风啊,它的设计师绝对是一个现代风格的忠实拥趸,要不也不会长得如此炫(gua)酷(yi)。就这么一个没有扇叶的小圆球,是怎么让我们凉快下来的呢?其实它内部还是有一个涡轮扇系统的。当空气通过遍布 Q 周身的孔洞时,涡轮扇就会将它们送出去,形成气流。这样,我们就能在享受凉风的同时,获得更加安静的体验。想要得到这个炫酷的小圆球得花的钱也不少,它要价 330 美元。反正比戴森 Pure Cool 便宜就是了,壕的玩物小编我是不懂的,这个价位给我一个不买空调的理由。但是,摆个这样的风扇在家真的是很酷很有B格啊,有木有?
PLEN2 机器人就跟我们小时候玩的电动机器人一样,小巧可爱,但是更为复杂,它有控制板、伺服电机及配件,不过一把螺丝刀就可以轻松完成组装,不需要任何技术知识或特殊工具。它的主要部件可以通过 3D 打印完成。PLEN2 的控制板是 Arduino 兼容控制器,可以轻松编程、添加功能,还配备 ROS MiddleWare 控制板,完成更加专业级别的机器人开发。你可以用 PLEN2 搬运小物件,看它跳舞、表演,并且你可以使用智能手机、PC、通过传感器设备控制,如:身体动作、表情、甚至可以用脑电波等操控。孩子们可以通过它了解到关于机器人的乐趣。学生和成年人有机会学习编程、机器控制、电子电路、设计。研究人员,工程师和开发人员可以使用 PLEN2 测试许多更为专业的问题。别掩饰了,我知道你也想要一台。
2022年09月