• [技术干货] blog-engine-02-通过博客引擎 jekyll 构建 github pages 博客实战笔记【转】
    jekyll 搭建教程jekyll 搭建教程https://segmentfault.com/a/1190000002539546?_ea=304992Gem安装 Ruby,请访问 下载地址。http://rubyinstaller.org/downloadsJekyllJekyll 是一个简单且具备博客特性的静态网站生成器。https://jekyllrb.com/docs/home/使用以下命令安装 Jekyll。  [plaintext]$ gem install jekyll在中国可能需要使用代理软件。然后,请等待并学习如何使用它。或者,您可以使用 rails 替代 Jekyll。如果您使用的是 Mac,请使用以下命令。  [plaintext]$ sudo gem install jekyllGit您需要了解如何使用 Git。Git 文档http://www.runoob.com/git/git-tutorial.html在 Windows 下安装 Jekyll有时候工作需要,在 Windows 系统下编辑博客,想要看到效果却十分麻烦。因此尝试在 Windows 下安装 Jekyll。安装 Ruby下载下载 适合你计算机的合适版本的安装程序;http://rubyinstaller.org/downloads/安装安装时勾选上 Add Ruby executables to your PATH;查看版本在命令行中输入如下命令:  [plaintext]$ ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [x64-mingw32]安装 DevKit下载下载 适合你计算机的合适版本的安装程序;选择匹配的软件。本次选择 DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe, For use with Ruby 2.0 to 2.3 (x64 - 64bits only)解压下载并解压文件至路径如D:\Devkit下:运行  [plaintext]$ cd d:\Devkit [D:\Devkit]$ ruby dk.rb init [INFO] found RubyInstaller v2.3.3 at D:/Ruby23-x64 Initialization complete! Please review and modify the auto-generated 'config.yml' file to ensure it contains the root directories to all of the installed Rubies you want enhanced by the DevKit.查看 config.yml 应该有如下内容  [yml]# This configuration file contains the absolute path locations of all # installed Rubies to be enhanced to work with the DevKit. This config # file is generated by the 'ruby dk.rb init' step and may be modified # before running the 'ruby dk.rb install' step. To include any installed # Rubies that were not automagically discovered, simply add a line below # the triple hyphens with the absolute path to the Ruby root directory. # # Example: # # --- # - C:/ruby19trunk # - C:/ruby192dev # --- - D:/Ruby23-x64查看和安装  [plaintext][D:\Devkit]$ ruby dk.rb review Based upon the settings in the 'config.yml' file generated from running 'ruby dk.rb init' and any of your customizations, DevKit functionality will be injected into the following Rubies when you run 'ruby dk.rb install'. D:/Ruby23-x64 [D:\Devkit]$ ruby dk.rb install [INFO] Updating convenience notice gem override for 'D:/Ruby23-x64' [INFO] Installing 'D:/Ruby23-x64/lib/ruby/site_ruby/devkit.rb'安装 Jekyll确保 gem 已安装  [plaintext][D:\Devkit]$ gem -v 2.5.2安装 Jekyll  [plaintext]$ gem install jekyll问题错误:Permission denied - bind(2) for 127.0.0.1:4000bind localhost:4000 failed使用如下命令:  [plaintext]$ netstat -ano $ tasklist /svc /FI "PID eq ${pid}"pid 是占用 localhost:4000 的线程的结果;使用任务管理器结束该线程;请在 Gemfile 中添加以下内容以避免轮询更改:  [plaintext]gem 'wdm', '>= 0.1.0' if Gem.win_platform?gem ‘wdm’, ‘>= 0.1.0’ if Gem.win_platform?我尝试了很多次,但仍然失败。幸运的是,Jekyll 仍然可以正常工作jekyll-paginate  [plaintext]配置文件: /Users/houbinbin/blog/houbb.github.io/_config.yml 依赖错误: 哎呀!看起来你没有安装 jekyll-paginate 或者它的某个依赖项。为了按照当前配置使用 Jekyll,你需要安装这个 gem。来自 Ruby 的完整错误信息是: 'cannot load such file -- jekyll-paginate' 如果遇到问题,你可以在 http://jekyllrb.com/help/ 找到有用的资源! jekyll 3.1.3 | 错误: jekyll-paginate解决方法:  [plaintext]$ sudo gem install jekyll-paginate谷歌文件加载慢fonts.googleapis.com加载慢解决办法我是直接将semantic引用此文件的地方注释掉了。TOC 目录TOC把这个添加到文件中,就可以生成目录。  [plaintext]* any list {:toc}分页base page zh_CN最多页数限制分页功能插件使得 paginator liquid 对象具有下列属性:属性说明page当前页码per_page每页文章数量posts当前页的文章列表total_posts总文章数total_pages总页数previous_page上一页页码 或 nil(如果上一页不存在)previous_page_path上一页路径 或 nil(如果上一页不存在)next_page下一页页码 或 nil(如果下一页不存在)next_page_path下一页路径 或 nil(如果下一页不存在)Searchnice querySEO掌心 SEORang SEO优化 jekyll 站点的 SEO 技巧博客写好之后,直接搜索基本搜索不到。双边括号特殊符号,比如使用 vue 学习的时候,就会用到双边花括号,但是这个是 jekyll 的内置符号。解决方案如下:  [plaintext]{% comment %} 这里是各种包含奇怪花括号 {{{0}}} 的地方 {% endcomment %} TODO文章置顶has done!多说sitemap报错  [plaintext]$ gem install jekyll-sitemap ERROR: Could not find a valid gem 'Jekyll-sitemap' (>= 0), here is why: Unable to download data from https://gems.ruby-china.org/ - bad response Not Found 404 (https://gems.ruby-china.org/specs.4.8.gz)解决  [plaintext]gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/日志  [plaintext]https://gems.ruby-china.com/ added to sources source https://rubygems.org/ not present in cache重新执行  [plaintext]sudo gem install jekyll-sitemap日志  [plaintext]Fetching: jekyll-sitemap-1.2.0.gem (100%) Successfully installed jekyll-sitemap-1.2.0 Parsing documentation for jekyll-sitemap-1.2.0 Installing ri documentation for jekyll-sitemap-1.2.0 Done installing documentation for jekyll-sitemap after 0 seconds WARNING: Unable to pull data from 'https://gems.ruby-china.org/': bad response Not Found 404 (https://gems.ruby-china.org/specs.4.8.gz) 1 gem installed参考资料seohttp://vdaubry.github.io/2014/10/21/SEO-for-your-Jekyll-blog/https://crispgm.com/page/48-tips-for-jekyll-you-should-know.htmlJekyll自动生成站点地图如何让谷歌和百度搜索到自己GitHub上的博客Jekyll SEO Taghttps://github.com/jekyll/jekyll-seo-tagsitemaphttp://faso.me/notes/2013/07/27/jekyll-sitemap-without-plugin/index.htmlrubyhttps://www.jianshu.com/p/60f3707cb3ce?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendationGitHub 博客– Jekyll–代码高亮,Liquid 转义字符Jekyll 中文文档极客学院中文文档转载自https://houbb.github.io/2016/04/13/blog-engine-02-jekyll-01-install
  • [技术干货] blog-engine-01-常见博客引擎 jekyll/hugo/Hexo/Pelican/Gatsby/VuePress/Nuxt.js/Middleman 对比【转】
    前言由于个人一直喜欢使用 markdown 来写 个人博客,最近就整理了一下有哪些博客引擎。感兴趣的小伙伴也可以选择自己合适的。常见的博客引擎有哪些?除了 Jekyll、Hugo 和 Hexo,还有许多其他流行的博客引擎可供选择。以下是一些常见的博客引擎:WordPress:WordPress 是最流行的博客引擎之一,它提供了丰富的插件和主题,使用户能够轻松地创建和管理博客。Ghost:Ghost 是一个专注于博客的开源平台,它提供了简洁的界面和强大的编辑工具,适合那些追求写作体验的用户。Pelican:Pelican 是一个用 Python 编写的静态博客生成器,它使用简单的 Markdown 或 reStructuredText 格式来撰写内容。Gatsby:Gatsby 是一个基于 React 的静态网站生成器,它可以用来创建博客和其他类型的静态网站,具有出色的性能和灵活性。VuePress:VuePress 是一个由 Vue 驱动的静态网站生成器,它具有简单的配置和强大的插件系统,适合那些熟悉 Vue.js 的用户。Nuxt.js:Nuxt.js 是一个基于 Vue.js 的通用应用框架,它可以用来创建静态网站和单页面应用(SPA),具有灵活的路由和组件系统。Harp:Harp 是一个用 Node.js 编写的静态网站生成器,它支持使用 Markdown、Jade 和 EJS 等模板语言来创建内容。Middleman:Middleman 是一个用 Ruby 编写的静态网站生成器,它支持使用 Haml、Slim 和 Sass 等语言来构建网站。这些博客引擎各有特点,你可以根据自己的需求和偏好选择最适合的。博客引擎的对比表格以下是一份对一些常见博客引擎的比较表格。特性/博客引擎JekyllHugoHexoPelicanGatsbyVuePressNuxt.jsMiddleman语言RubyGoNode.jsPythonJavaScript (React)JavaScript (Vue)JavaScript (Vue)Ruby模板引擎LiquidGo TemplatesEJS (Embedded JavaScript)Jinja2React (JSX)VueVueERB (Embedded Ruby)速度中等快速中等中等快速快速快速快速主题系统有有有有有有有有插件系统有有有有插件生态较小插件系统较小有有社区活跃度高高高中等高高高中等数据源YAML、JSON、CSVTOML、YAMLYAML、JSONreStructuredText、Markdown数据源插件MarkdownMarkdownYAML、JSON构建时间取决于网站规模和内容量快速取决于网站规模和内容量取决于网站规模和内容量快速快速快速取决于网站规模和内容量托管支持GitHub Pages、Netlify、自己的服务器GitHub Pages、Netlify、自己的服务器GitHub Pages、Netlify、自己的服务器GitHub Pages、Netlify、自己的服务器Netlify、Vercel、自己的服务器GitHub Pages、Netlify、自己的服务器GitHub Pages、Netlify、自己的服务器GitHub Pages、Netlify、自己的服务器适用场景个人博客、文档个人博客、文档个人博客个人博客、文档博客、文档、应用官网文档、博客文档、博客小型网站、博客小结以下是对各个博客引擎的简单总结:Jekyll:静态网站生成器,使用 Ruby 编写。简单易用,支持 Markdown 和 Liquid 模板语言。社区活跃,有丰富的主题和插件可用。Hugo:快速且高效的静态网站生成器,使用 Go 编写。构建速度快,适合大型网站和博客。支持 Markdown 和自定义模板,具有灵活的主题系统。Hexo:快速的静态网站生成器,使用 Node.js 编写。支持 Markdown,使用 EJS 模板语言。插件丰富,可扩展性强。WordPress:最流行的博客平台之一,使用 PHP 和 MySQL。功能强大,支持插件和主题定制。需要服务器支持,适合有一定技术基础的用户。Ghost:简洁的博客平台,使用 Node.js 和 Ember.js。提供良好的写作体验和编辑工具。面向写作者和博客专业人士。Pelican:Python 编写的静态网站生成器。使用简单,支持 Markdown 和 reStructuredText。社区活跃,有各种插件可用。Gatsby:基于 React 的静态网站生成器,使用 GraphQL 查询数据。具有出色的性能和灵活性,支持 Markdown 和 React 组件。适合构建高度交互的博客和网站。VuePress:基于 Vue.js 的静态网站生成器,使用 Markdown 和 Vue 组件。简单易用,支持自定义主题和插件。适合开发者和技术博客。转载自cid:link_02016/04/13/blog-engine-01-overview
  • [分享交流] 如何优雅地处理Java多线程编程中的共享资源问题?
    如何优雅地处理Java多线程编程中的共享资源问题,以确保线程安全和高性能?
  • [技术干货] HTML5 WebSocket技术使用详解
    WebSocketWebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客服端的浏览器,这种方式有一个很大的弊端,就是会占用很多的带宽。最新的轮询效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求。使用WebSocket,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道,两者之间就直接可以数据互相传送。而且它为我们实现即时服务带来了两大好处:节省资源:互相沟通的Header是很小的-大概只有 2 Bytes。推送信息:不需要客户端请求,服务器可以主动传送数据给客户端。socket.ioSocket.IO是一个WebSocket库,包括了客户端的js和服务器端的nodejs,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用。socket.io的特点易用性:socket.io封装了服务端和客户端,使用起来非常简单方便。跨平台:socket.io支持跨平台,这就意味着你有了更多的选择,可以在自己喜欢的平台下开发实时应用。自适应:它会自动根据浏览器从WebSocket、AJAX长轮询、Iframe流等等各种方式中选择最佳的方式来实现网络实时应用,非常方便和人性化,而且支持的浏览器最低达IE5.5。WebSocket 安装部署1npm install socket.io服务监听socket.io的服务端启动非常的简单,引用socket.io模块。1var io = require('socket.io');然后调用listen函数,传入监听的端口号,开始服务监听。启用了80端口用于测试:1var io = require('socket.io')(80);注册事件12345io.on('connection', function (socket) {  socket.on('disconnect', function () {   })})connection事件在客户端成功连接到服务端时触发,有了这个事件,我们可以随时掌握用户连接到服务端的信息。当客户端成功建立连接时,在connection事件的回调函数中,我们还是可以为socket注册一些常用的事件,如:disconnect事件,它在客户端连接断开是触发,这时候我就知道用户已经离开了。WebSocket 启动服务目前为止,我们已经搭建好了一个最简单的socket服务器,为了在浏览器中能够访问到我们的服务,我们还需要在服务端搭建一个简单的web服务器,让浏览器能够访问我们的客户端页面。为了便捷,我们选用node.js中常用的express框架来实现web服务,示例如下:1234567891011var express = require('express');var app = express();app.get('/', function (req, res) {  res.status(200).send('成功连接!')});var server = require('http').createServer(app);var io = require('socket.io')(server);io.on('connection', function (socket) { });server.listen(80);WebSocket 客户端引用服务端构建完毕,下面看一看客户端应该如何使用。服务端运行后会在根目录动态生成socket.io的客户端js文件,客户端可以通过固定路径/socket.io/socket.io.js添加引用。首先添加网页index.html,并在网页中引用客户端js文件:1<script src="//cdn.bootcss.com/socket.io/2.0.2/socket.io.js"></script>WebSocket 连接服务当客户端成功加载socket.io客户端文件后会获取到一个全局对象io,我们将通过io.connect函数来向服务端发起连接请求。1234567var socket = io.connect('/');socket.on('connect',function(){  //连接成功});socket.on('disconnect',function(data){  //连接断开});connect函数可以接受一个url参数,url可以socket服务的http完整地址,也可以是相对路径,如果省略则表示默认连接当前路径。与服务端类似,客户端也需要注册相应的事件来捕获信息,不同的是客户端连接成功的事件是connect。了解了客户端如何使用,下面我们创建网页index.html,并添加如下内容(保存):123456789101112131415<html><head>  <script src="//cdn.bootcss.com/socket.io/2.0.2/socket.io.js"></script>  <script>    window.onload = function(){      var socket = io.connect('/');      socket.on('connect',function(){        document.write('连接成功!');      });    };  </script></head><body></body></html>页面添加完毕还要记得在服务端app.js中为它添加路由,让我们可以访问测试网页:123app.get('/index',function(req,res){  res.sendFile('index.html',{root:__dirname});});WebSocket 实时通讯服务端和客户端都构建完毕了,下面开始发送消息。当我们成功建立连接后,我们可以通过socket对象的send函数来互相发送消息,示例-客户端向服务端发送消息(index.html):12345678var socket = io.connect('/');socket.on('connect',function(){  //客户端连接成功后发送消息'hello world!'  socket.send('hello world!');});socket.on('message',function(data){  alert(data);});连接成功后,我们向服务端发送消息hello world!,还为socket注册了message事件,它是send函数对应的接收消息的事件,当服务端向客户端send消息时,我们就可以在message事件中接收到发送过来的消息。服务端向客户端发送消息也可以通过send的方式,示例 - 服务端向客户端发送消息(app.js):1234567var io = require('scoket.io');io.on('connection', function (socket) {  socket.send('Hello World!');  socket.on('message', function (data) {    console.log(data);  })});与客户端相同,服务端也需要为socket注册message事件来接收客户端发送过来的消息。WebSocket 发送信息socket.io既然是用来实现通讯的,那么如何发送、接收信息才是根本。在socket.io中,emit函数用于发送数据,我们使用send的方式实现了信息的互发,其实send函数只是emit的封装,实际上还是使用了emit,且看send函数是如何实现的:123456function send(){ var args = toArray(arguments); args.unshift('message'); this.emit.apply(this, args); return this;}在send函数中,获取到原来的参数,并在原来的基础上插入了一个参数message,然后调用了emit函数。通过send函数的实现,我们也学会了emit函数的用法,它有多个参数,第一个参数是事件名称,在接收端注册该事件就可以接收到发送过去的信息,事件名称可以自由定义,在不同的场景下,我们可以定义不同的事件来接收消息。第二个参数才是发送的数据。了解清楚了工作原理,下面来将send替换成emit函数发送信息:123456//app.jsio.on('connection',function(socket){   socket.emit('message','连接成功!');   socket.on('message',function(data){  });});WebSocket 服务端事件事件监听是实现通讯的基础,因此充分了解socket.io的事件,学习如何在正确的时候使用它们至关重要。在一些关键的的状态下,socket.io可以注册相应的事件,通过事件监听,我们可以在这些事件中作出反应,常用的事件如下:connection——客户端成功连接到服务器。message——捕获客户端send信息。。disconnect——客户端断开连接。error——发生错误。WebSocket 客户端较服务端而言,客户端提供更多的监听事件,在实时应用中,我们可以为这些事件注册监听并作出反应,例如:connect提示用户连接成功,disconnect时提示用户停止服务等等。connection——成功连接到服务器。connecting——正在连接。disconnect——断开连接。connect_failed——连接失败。error——连接错误。message——监听服务端send的信息。reconnect_failed——重新连接失败。reconnect——重新连接成功。reconnecting——正在重连。那么客户端socket发起连接时的顺序是怎么样的呢?当第一次连接时,事件触发顺序为: connecting → connect;当失去连接时,事件触发顺序为:disconnect → reconnecting → connecting → reconnect → connect。WebSocket 命名空间命名空间着实是一个非常实用好用的功能。我们可以通过命名空间,划分出不同的房间,在房间里的广播和通信都不会影响到房间以外的客户端。那么如何创建房间呢?在服务端,通过of("")的方式来划分新的命名空间:12io.of('chat').on('connection',function(socket){});示例中,我们创建一个名为chat的房间,客户端可以通过如下方式连接到指定的房间:1var socket = io.connect('/chat');虽然连接到指定的房间,但是我们也可以在服务端操作,自由的进出房间:12socket.join('chat');//进入chat房间socket.leave('chat');//离开chat房间WebSocket 广播消息在实时应用中,广播是一个不可或缺的功能,socket.io提供两种服务端广播方式。第一种广播方式可以称之为'全局广播',顾名思义,全局广播就是所有连接到服务器的客户端都会受到广播的信息:1socket.broadcast.emit('DATA',data);但是,在实际应用场景中,我们很多时候并不需要所有用户都收到广播信息,有的广播信息只发送给一部分客户端,比如某个房间里面的用户,那么可以使用如下方式:1socket.broadcast.to('chat').emit('DATA',data);中间件socket.io提供中间件功能,我们可以通过中间件来对请求进行预处理,比如身份验证:1234io.use(function(socket, next){ if (socket.request.headers.cookie) return next(); next(new Error('Authentication error'));});示例中展示了通过中间件进行身份验证,当没有cookie的时候抛出异常。传递参数在很多应用场景中,客户端发起连接请求时都需要传递参数,这些参数可能是身份验证、初始化设置等等,那么socket.io发起连接时如何传递参数呢?1var socket = io.connect('/');由于connect函数发起连接的参数是一个url,你可能会想到把参数拼接到url上,如http://xxxx?xx=xxxx,但是很遗憾这样是行不通的,我们可以通过这样的方式来传递参数:1var socket = io.connect('/',{ _query:'sid=123456' });在服务端可以这样获取到传递的参数:1234io.use(function(socket){   var query = socket.request._query;   var sid = query.sid; });客户端传递的参数已经被解析成了一个json对象,这个对象就是_query。
  • [技术干货] html5表单的required属性使用
    如何自定义提示文字用户名<input type="text" id="username" required oninvalid="setCustomValidity('请输入您的姓名');" oninput="setCustomValidity('');">如何让required失效1:把按钮类型变成button而不是submit2:提交按钮添加formnovalidate属性<form method="post" action="">         用户名<input type="text" id="username" required="required"><br>         密码<input type="password" id="password" required><br>         <input type="submit" value="登录" formnovalidate >     </form>3:在元素中添加novalidate属性,禁用整个表单的验证功能<form method="post" action="" novalidate>         用户名<input type="text" id="username" required="required"><br>         密码<input type="password" id="password" required><br>         <input type="submit" value="登录" >     </form>4,pattern属性 - 使用正则表达式验证(1)不必使用^和$字符表示要匹配字段值得开头和结尾。(2)只设置pattern的话,空值也会通过。如果不允许空,则还要加上required属性。
  • [热门活动] 【活动结束】#GaussDB-for openGauss数据迁移之DRS直播专家坐堂答疑# 提问互动赢华为无线充电器等周边好礼!
    感谢各位小伙伴参与本次活动,本次活动获奖名单如下:活动中奖公示奖项名称获奖楼层社区昵称奖品备注优秀提问69wolfandy华为无线充电器 幸运奖9nukinsan笔记本套装与#69优秀提问重复,顺延至#1032//#32内容无效,顺延至#34仍然无效78客家鱻粉笔记本套装 100linghz666笔记本套装 112//与#69优秀提问重复,顺延至下一楼层仍为同一人请各位获奖的伙伴在8月3日之前点击此处填写收货地址,如逾期未填写视为自动弃奖。再次感谢各位小伙伴参与本次活动,欢迎关注华为云更多活动~【直播简介】【专家简介】 南风 华为云数据迁移DRS产品架构师【直播简介】 DRS是一款易用、稳定、高效,用于数据库在线迁移和数据库实时同步的云服务,它提供了以Oracle、MySQL、PostgreSQL、华为云RDS等多种数据库作为源端的数据迁移上云服务,其中GaussDB(for openGauss)作为华为云上的主力云数据库,DRS对其做了深度的开发支持,在迁移的功能和性能上具有很大优势,可以帮助客户简单、快捷、一键式的完成数据迁移。【直播时间】2021年6月22日 星期二 19:00-20:00直播链接:https://bbs.huaweicloud.com/live/cloud_live/202106221900.html 【活动介绍】【互动方式】直播前您可以在本帖留下您感兴趣的问题,专家会在直播时为您解答。直播后您可以继续在本帖留言,与专家互动交流。我们会在全部活动结束后对参与互动的用户进行抽奖。【活动时间】6月17日—6月30日 【奖励说明】活动1:提问有礼评奖规则:在本帖提出与直播相关的问题,由专家在所有互动贴中选出1名最优互动贴的开发者进行奖励。奖品:华为无线充电器1个 活动2:盖楼有礼评奖规则在活动结束后(截止6月30日),在本帖所有盖楼的用户中抽取获奖楼层,获奖楼层=总楼层*中奖百分比,中奖百分比为8%、28%、68%、88%、98%。例如:活动束后总楼层为200,200*8%=16,即第16楼获奖,其他获奖楼层同理可得。如出现小数点,则四舍五入,例如:活动结束后总楼层为220,220*8%=17.6,即第18楼获奖。无效楼层不参与中奖,请勿连续刷楼超过5层或回复无关内容,否则视为无效。奖品:笔记本套装1套【注意事项】1、为保证您顺利领取活动奖品,请您提前填写奖品收货信息,如您没有填写,视为放弃奖励【点击此处填写信息】。2、活动获奖信息填写时间截止2021年7月9日,如未填写视为弃奖。本次先发活动奖品将于2021年7月30日前统一发出,请您耐心等待。3、活动期间每个ID(同一姓名/电话/收货地址)只能获奖一次,若重复则中奖资格顺延至下一个合格楼层,仅一次顺延。4、如活动奖品出现没有库存的情况,华为云工作人员将会替换等价值的奖品,获奖者不同意此规则视为放弃奖品。5、其他事宜请参考【华为云社区常规活动规则】。
  • [技术干货] 华为RPA常见问题FAQ
    1. 华为RPA网页操作运行失败类    1.1 RPA运行脚本失败       1)可能造成问题的原因,是否有申请并导入了正确的License           注意License是否过期,当前License有效期为3个月,3个月后需要重新申请License。可以检查安装目录下,如D:\huawei\robot_studio\Robot\cfg\license\License.bin文件的创建时间;如果是执行机则检查相应文件夹下的License文件(Robot\cfg\license\License.bin)的创建时间。           License是一机一个,如果电脑硬件更换或者从其他电脑移植过来的License是无法在本机运行的,需要根据本机的ESN号码重新申请License。打开studio,点击【设置/Settings】后选择【申请许可/ApplyLicense】按照如图的三步完成。     2)可能造成问题的原因,RPA安装完成后手动修改过某些文件,或者修改过脚本工程里的文件。          新安装的RPA导入License后即可运行,无需修改,控制面板里卸载RPA后重新安装并导入License即可解决。或者还原修改过的脚本。     3)可能造成问题的原因,运行有错误提示,例如缺少xxxx.dll          缺少 C++ Library,如果没有安装的话,无法运行uiautomation的命令。 安装VC2015即可。     1.2 提取网页数据失败,运行报错NoSuchElementException       1)可能造成问题的原因,网页有跳转,需要进入了一个新的iframe            网页跳转后需要选中新窗口使其处于active状态。            新页面有iframe,未切换到新的iframe。在操作新页面前添加切换iframe,也可以使用录制的方法开发,可避免手动添加iframe。注意观察iframe的ID是否是变化的,如果是变化的,则需要用其他方式定位,比如name或者class等。     2)可能造成问题的原因,网页加载尚未完成。          因为网速等原因导致网页加载尚未完成,此时去提取数据则会失败,需要在提取的时候增加延时delay,比如增加5秒或者10秒的延时。     3)可能造成问题的原因,网页元素位置有变更。          网页有变更导致原先可以运行的脚本无法运行了,需要重新定位元素,定位元素的过程中尽可能的使用相对位置或者名字。比如 :        xpath=//button[text()="Reset"]        xpath=//a[contains(text(),'查找')]     4)可能造成问题的原因,中英文系统导致的脚本无法运行。         对于弹出的确认对话框在中英文系统会中会有区别,此时也需要注意。建议在开发的时候把两种定位方式都添加进脚本。     5)可能造成问题的原因,元素有遮挡。        被遮挡的页面元素不能被找到,这种情况下可以尝试scrollintoview命令滚动当前元素到浏览器窗口。如果是table建议使用gettable控件提取。    6)可能造成问题的原因,存在MoveToElement操作。        MoveToElement命令不能被录制下来,导致下拉菜单出不来,后续click命令找不到目标,这种情况下需要手工加入MoveToElement命令。2. 文件操作类    2.1 调试过程中Excel文件打开失败      答:此文件在上次调试的时候已经打开了,但是RPA运行出错退出导致没有关闭此文件引起,此时可以在资源管理器中杀掉Excel.exe的进程,或者自己建立一个批处理用来应对这种情况,批处理内容为:taskkill /f /t /im EXCEL.exe    2.2 getDownloadFile获取不到下载的文件名是怎么回事?      答:getDownloadFile需要在Chrome浏览器中设置默认下载路径后才会生效,具体可看本文的《怎样设置Chrome默认的下载路径》。    2.3 华为RPA可以预处理加工数据么?比如有一个csv文档,想要做一些汇总计算之类的。      答:是可以的,如果CSV格式是固定的,是可以通过遍历去做处理的;另外也可以用其他的工具做汇总运算,比如power query、宏、VBA、Python、C#等去做一些数据的处理。另外针对Excel操作单独开发了40多个控件,供大家使用,控件框中输入Excel即可查询到。    2.4 怎样判断是否存在某一个指定的文件?      答:filelist获取指定文件列下文件列表,再用for循环或许判断是否有目标文件,或者将List转为string类型后测试是否包含目标文件名字符串。3. 加压、解压类    3.1  怎样加压解压Zip/7z文件?      答:华为RPA开发了Zip/Unzip控件,对Zip/7z类文件进行加压与解压缩。    3.2    怎样加压解压RAR文件?      答:因为RAR压缩算法的原因,暂时没有控件支持RAR文件的加压解压缩,但是可以使用批处理或者startAPP控件,采用电脑自带的winrar的WinRAR.exe使用命令进行加压解压。4. 远程桌面Citrix类    4.1 远程桌面操作只能用图片识别?        答:因为本机造作远程桌面本机的RPA是识别不了远程的控件的,所以只能采用图片识别的方式。如果远程的是一**立的电脑,则建议在远程的电脑上安装或者运行RPA,采用在本机开发的方式,这样准确率与稳定性都有保障。    4.2  如何对整个窗体发送键盘命令?比如发送快捷键。      答:窗体获取焦点后,使用citrix.rawkeyboard控件,参数key值为"Enter","Ctrl"等特殊字符,type为"KeyDown"或"KeyUp"。如果我们需要在一个远程桌面应用程序输入一个"Enter",必须使用citrix.rawkeyboard两次,第一次type类型为"KeyDown",第二次为"KeyUp",模拟一次完整的敲击"Enter"的动作。这个命令和citrix.clickpicscreen一样,也必须在获取焦点的情况下操作。5. Email操作类    5.1  怎样使用outlook收发邮件?      答:华为RPA提供了Outlook的收发邮件控件mapi.getEmail与outlook.sendEmail,特别是发送邮件,需要注意的是需要本地电脑打开Outlook,否则可能一直是待发送状态。    5.2  怎样开发移植性高的收发邮件脚本?      答:那就是不借助Outlook收发邮件,使用pop.getEmail与smtp.sendEmail空间开发脚本,使用这两个控件的时候需要注意服务器server的设置,需要设置为正确服务器,小技巧是可以从Outlook里的【文件】信息页查到,只取https://xxxx.xxxx.com即可。 6. Java类    6.1 执行Java链接命令失败      答:若提示权限不足,需要使用管理员权限启动;若提示缺少provider,需要安装JDK并配置环境变量。    6.2 Java界面操作小技巧有哪些?      答:       1)在某些场景下达成目的的手段可能不止一种,比如ComboBox的选择可能根据name选择,也可以根据index选择。在有些场景下index选择的准确性可能会更好,这些都需要实际测试。       2)录制过程中的动作有时并不是完全准确的,比如在某些场景下可能会漏录一个动作,或者有时select动作可能会录成click动作,不用过多担心,在回放测试的时候这些问题都会暴露出来,我们手工进行修改就可以。       3)各种不同的JAVA GUI程序自动化的稳定性可能和程序本身相关。在进行自动化实践的时候可以从不同的维度多尝试解决方法,然后选择最稳定的实现方法。    6.3 如果某个日期选择窗口很难选取到指定的日期,怎么办?      答:可以使用executeScript控件,在控件中执行document.querySelector("#beginDate").value="2020-04-17","#beginDate"是控件的ID,更多内容可以参考《HUAWEI AntRobot RPA开发者认证课程(高级)》的5.3课程。    6.4 怎样放缩窗口?类似在浏览器里按住Ctrl+滚轮缩放窗口。      答:可以使用executeScript控件,在控件中执行document.body.style.zoom='0.5' 。0.5就是缩小50%,如果放大120%,就是设置为1.2即可。7. 其他    7.1 为什么使用从文件属性处copy的文件路径执行中会失败?      答:如果是使用鼠标右键,选择【属性】在【安全】标签中copy的【对象名称】处的文件路径,如下图所示,那么执行是可能失败的,因为通过此方式获取的文件路径可能带有异常字符,所以执行失败。也可以将此字符串copy到CMD窗口查看比对。     7.2 网页获取的字符串与copy的目标字符串是一样的,但是为什么判断条件失败?      答:如果字符串中带有空格,那么从浏览器copy出来的字符串里的空格与RPA提取的内容可能是不一致的,此时如果要做字符串比较,此时建议先用print的方法将字符串打印到工程/output文件夹的print.log里,然后从文本文件copy出来使用。    7.3 怎样设置Chrome默认的下载路径?      答:按照1/2/3/4/5的步骤选择,并粘贴进去红框的文字({"prefs":{"download.default_directory":"d:\"}})即可设置默认路径,关于网页自动化的高阶设置可以参考《HUAWEI AntRobot RPA开发者认证课程(高级)》的5.1课程
  • 关于HTML5你需要了解的基础知识
    本帖最后由 码小玩 于 2017-10-13 15:31 编辑作者:Palak Shah来源:Linux中国HTML5 是第五个且是当前的 HTML 版本,它是用于在万维网上构建和呈现内容的标记语言。本文将帮助读者了解它。HTML5 通过 W3C 和Web 超文本应用技术工作组Web Hypertext Application Technology Working Group之间的合作发展起来。它是一个更高版本的 HTML,它的许多新元素可以使你的页面更加语义化和动态。它是为所有人提供更好的 Web 体验而开发的。HTML5 提供了很多的功能,使 Web 更加动态和交互。HTML5 的新功能是:[*]新标签,如 和 [*]用于 2D 绘图的 元素 [*]本地存储 [*]新的表单控件,如日历、日期和时间 [*]新媒体功能 [*]地理位置HTML5 还不是正式标准(LCTT 译注:HTML5 已于 2014 年成为“推荐标准”),因此,并不是所有的浏览器都支持它或其中一些功能。开发 HTML5 背后最重要的原因之一是防止用户下载并安装像 Silverlight 和 Flash 这样的多个插件。新标签和元素[*]语义化元素: 图 1 展示了一些有用的语义化元素。 [*]表单元素: HTML5 中的表单元素如图 2 所示。 [*]图形元素: HTML5 中的图形元素如图 3 所示。 [*]媒体元素: HTML5 中的新媒体元素如图 4 所示。 [*]2894 [*]2895 [*]HTML5 的高级功能地理位置这是一个 HTML5 API,用于获取网站用户的地理位置,用户必须首先允许网站获取他或她的位置。这通常通过按钮和/或浏览器弹出窗口来实现。所有最新版本的 Chrome、Firefox、IE、Safari 和 Opera 都可以使用 HTML5 的地理位置功能。地理位置的一些用途是:[*]公共交通网站 [*]出租车及其他运输网站 [*]电子商务网站计算运费 [*]旅行社网站 [*]房地产网站 [*]在附近播放的电影的电影院网站 [*]在线游戏 [*]网站首页提供本地标题和天气 [*]工作职位可以自动计算通勤时间工作原理: 地理位置通过扫描位置信息的常见源进行工作,其中包括以下:[*]全球定位系统(GPS)是最准确的 [*]网络信号 - IP地址、RFID、Wi-Fi 和蓝牙 MAC地址 [*]GSM/CDMA 蜂窝 ID [*]用户输入该 API 提供了非常方便的函数来检测浏览器中的地理位置支持:[*]2896[*]getCurrentPosition API 是使用地理位置的主要方法。它检索用户设备的当前地理位置。该位置被描述为一组地理坐标以及航向和速度。位置信息作为位置对象返回。[*]语法是:[*]2897[*] [*]showLocation:定义了检索位置信息的回调方法。 [*]ErrorHandler(可选):定义了在处理异步调用时发生错误时调用的回调方法。 [*]options (可选): 定义了一组用于检索位置信息的选项。我们可以通过两种方式向用户提供位置信息:测地和民用。[*]描述位置的测地方式直接指向纬度和经度。 [*]位置信息的民用表示法是人类可读的且容易理解。如下表 1 所示,每个属性/参数都具有测地和民用表示。[*]2898[*]图 5 包含了一个位置对象返回的属性集。[*]2899[*]网络存储在 HTML 中,为了在本机存储用户数据,我们需要使用 JavaScript cookie。为了避免这种情况,HTML5 已经引入了 Web 存储,网站利用它在本机上存储用户数据。与 Cookie 相比,Web 存储的优点是:[*]更安全 [*]更快 [*]存储更多的数据 [*]存储的数据不会随每个服务器请求一起发送。只有在被要求时才包括在内。这是 HTML5 Web 存储超过 Cookie 的一大优势。有两种类型的 Web 存储对象:[*]本地 - 存储没有到期日期的数据。 [*]会话 - 仅存储一个会话的数据。如何工作: localStorage 和 sessionStorage 对象创建一个 key=value 对。比如: key="Name", value="Palak"。这些存储为字符串,但如果需要,可以使用 JavaScript 函数(如 parseInt() 和 parseFloat())进行转换。下面给出了使用 Web 存储对象的语法:[*]存储一个值: [*]localStorage.setItem("key1", "value1"); [*]localStorage["key1"] = "value1"; [*]得到一个值: [*]alert(localStorage.getItem("key1")); [*]alert(localStorage["key1"]); [*]删除一个值: -removeItem("key1"); [*]删除所有值: [*]localStorage.clear();应用缓存(AppCache)使用 HTML5 AppCache,我们可以使 Web 应用程序在没有 Internet 连接的情况下脱机工作。除 IE 之外,所有浏览器都可以使用 AppCache(截止至此时)。应用缓存的优点是:[*]网页浏览可以脱机 [*]页面加载速度更快 [*]服务器负载更小cache manifest 是一个简单的文本文件,其中列出了浏览器应缓存的资源以进行脱机访问。 manifest 属性可以包含在文档的 HTML 标签中,如下所示:[*]2900[*]它应该在你要缓存的所有页面上。缓存的应用程序页面将一直保留,除非:[*]用户清除它们 [*]manifest 被修改 [*]缓存更新视频在 HTML5 发布之前,没有统一的标准来显示网页上的视频。大多数视频都是通过 Flash 等不同的插件显示的。但 HTML5 规定了使用 video 元素在网页上显示视频的标准方式。目前,video 元素支持三种视频格式,如表 2 所示。[*]2901[*]下面的例子展示了 video 元素的使用:[*]2902[*]例子使用了 Ogg 文件,并且可以在 Firefox、Opera 和 Chrome 中使用。要使视频在 Safari 和未来版本的 Chrome 中工作,我们必须添加一个 MPEG4 和 WebM 文件。video 元素允许多个 source 元素。source 元素可以链接到不同的视频文件。浏览器将使用第一个识别的格式,如下所示:[*]2903[*]
总条数:23 到第
上滑加载中