• [技术干货] 前端模块规范简介
    模块化的好处:避免命名冲突(减少命名空间污染)更好的分离, 按需加载更高复用性高可维护性1.CommonJSNode.js 应用由模块组成,采用 CommonJS 模块规范。 1.1 语法风格//Math.js module.exports = {     'add': function(a, b) { return a + b;     } }//main.js const Math = require('./Math'); console.log(Math.add(2, 3)); console.log('done'); /** 输出: -->node main 5 done **/1.2 同步加载由上面例子可以看出,CommonJS中模块是同步加载的1.3 动态加载//main.js const Math = require('./Ma' + 'th');//动态拼接CommonJS支持动态加载模块。因为conmonJs是同步的,执行到这一行时,才会加载模块。1.4 浏览器不支持CommonJS规范。浏览器不兼容CommonJS的根本原因,在于缺少四个Node.js环境的变量。moduleexportsrequireglobal可以使用工具进行转换,例如:Browserify1.5 其他特点所有代码都运行在模块作用域,不会污染全局作用域。模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。模块加载的顺序,按照其在代码中出现的顺序。CommonJS模块的加载机制中,输入的是被输出的值的拷贝。也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。适合服务器端小测验//Math.js let counter = 1; let addCounter = function () {     counter++; }; module.exports = {     counter,     addCounter }; console.log('Math init'); //main.js const Math = require('./Math'); Math.addCounter(); console.log(Math.counter); // position A Math.counter = 5; const Math2 = require('./Math'); console.log(Math2.counter); // position B //位置A 和 位置B的值分别是什么?2.AMDCommonJS是主要为了JS在后端的表现制定的,他是不适合前端的。AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。RequireJS实现了AMD规范。下面以RequireJS为例,了解一下AMD规范。2.1 语法风格//Math.js define([], function(){     return {         'add': function(a, b) { return a + b; }     } })//main.js require.config({     paths : {         "math" : "Math"     } }); require(['math'], function (math) { console.log(math.add(2, 3)); }); console.log('done'); //done //52.2 异步加载由上面的例子可以看出,require命令是异步执行的2.3 动态加载2.4 依赖前置,提前执行3.CMD(Common Module Definition)CMD是SeaJS 在推广过程中对模块定义的规范化产出。CMD规范和 AMD 很相似,尽量保持简单,并与 CommonJS 规范保持了很大的兼容性。 3.1 语法风格// CMD define(function(require, exports, module) {     var a = require('./a');     a.doSomething();     //...     var b = require('./b');   // 依赖可以就近书写     b.doSomething();     // ...      require.async('./c',function(c){ //支持异步加载         c.doSomething();     }); })// AMD 默认推荐的是 define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好     a.doSomething();     //...     b.doSomething();     //... })3.2 AMD和CMD的区别1) 对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible(尽可能的懒加载,也称为延迟加载,即在需要的时候才加载)。2) CMD 推崇依赖就近,AMD 推崇依赖前置。虽然 AMD 也支持 CMD 的写法,同时还支持将 require 作为依赖项传递,但 RequireJS 的作者默认是最喜欢依赖前置的写法,也是官方文档里默认的模块定义写法。3.3 推荐链接与 RequireJS 的异同二、ModuleES中Module的特点浏览器,服务器通用静态加载1. 基本语法1.1 export一个模块就是一个独立的文件。export关键字用来输出模块内部的某个变量 。可以输出变量,函数或类。// test.js export var name = 'zhangsan'; export var age = 18;// test.js var name = 'zhangsan'; var age = 18; export { name, age };可以使用as为输出变量重命名。var name = 'zhangsan'; var age = 18; export { name as personName,      age };需要特别注意的是,export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。// 报错 export 1; // 报错 var m = 1; export m;export语句输出的接口,与其对应的值是动态绑定关系,即通过该接口,可以取到模块内部实时的值。//m.js export var foo = 'bar'; setTimeout(() => foo = 'baz', 1000);//main.js import { foo } from './m1.js'; console.log(1, foo); setTimeout(function () {     console.log(2, foo); }, 1000);<!DOCTYPE html> <html>     <script type="module" src='./main.js'></script>     <body></body> </html>//console 1 "bar" 2 "baz"export命令可以出现在模块的任何位置,只要处于模块顶层就可以。1.2 import其他 JS 文件通过import命令加载模块。大括号里面的变量名,必须与被导入模块(test.js)对外接口的名称相同。// main.js import { name, age } from './test.js'; function showName() {   console.log(name); } //zhangsanimport命令输入的变量都是只读的,因为它的本质是输入接口。import {a} from './xxx.js' a = {}; // Assignment to constant variable.如果a是一个对象,改写a的属性是允许的。和const一样。import {a} from './xxx.js' a.foo = 'hello'; // 合法操作可以用星号(*)指定一个对象,进行整体加载。// main.js import * as test from './test.js'; function showName() {   console.log(test.name); } //zhangsan test.name = 'yun'; //Cannot assign to read only property 'name' of object '[object Module]' //但如果是对象,可以修改对象的属性。import命令具有提升效果,会提升到整个模块的头部,首先执行。foo(); import { foo } from 'my_module';由于import是静态执行,所以不能使用表达式和变量。// 报错 import { 'f' + 'oo' } from 'my_module';import语句会执行所加载的模块,因此可以有下面的写法。仅仅执行lodash模块,但是不输入任何值。import 'lodash';即使加载多次,也只会执行一次。也就是说,import语句是 Singleton 模式。1.3 单例模式解读//counter.js export let counter = 1; export function addCounter(){     counter++; } console.log('counter init');//main.js import {counter, addCounter} from './counter'; console.log('main:' + counter); addCounter(); console.log('main:' + counter); //counter init //main:1 //main:2 //从这例子中可以看出和CommonJS的区别另一个例子//main2.js import {counter, addCounter} from './counter'; console.log('main2:' + counter); addCounter(); console.log('main2:' + counter);<!DOCTYPE html> <html> <head> <title>module test</title> <script type="module" src='main.js'></script> <script type="module" src='main2.js'></script> </head> </html>//console counter init main:1 main:2 main2:2 main2:3从上面这个例子中可以看出,即使加载多次,也只会执行一次。并且是 Singleton 模式。1.4 export default使用export default可以不用关注输出模块中的变量名。// export-default.js export default function () {   console.log('foo'); }// import-default.js import customName from './export-default'; customName(); // 'foo'import命令可以为该匿名函数指定任意名字。import命令后面,不使用大括号。// export-default.js function foo() {   console.log('foo'); } export default foo;export default的本质,就是输出一个叫做default的变量或方法。imort something from ...的本质,就是import {default as something} from ...// 正确 export var a = 1; // 正确 var a = 1; export default a; // 错误 export default var a = 1; // 正确 export default 42; // 报错 export 42;所以export default是比较常用的方法:// MyClass.js export default class { ... } // main.js import MyClass from 'MyClass'; let o = new MyClass();1.5 import&export混合使用export { foo, bar } from 'my_module'; // 可以简单理解为 import { foo, bar } from 'my_module'; export { foo, bar };上面代码中,export和import语句可以结合在一起,写成一行。但需要注意的是,写成一行以后,foo和bar实际上并没有被导入当前模块,只是相当于对外转发了这两个接口,导致当前模块不能直接使用foo和bar。// 接口改名 export { fooName as newName } from 'my_module'; //具名接口改为默认接口 export { foo as default } from './someModule'; //接口也可以改名为具名接口 export { default as ES } from './someModule';1.6 模块的继承//calculator.js export function add(a, b) {   return a + b; }//calculatorPlus.js export * from './calculator.js'; export function multiply(a, b) {   return a * b; }//main.js import * as cal from './calculatorPlus.js'; cal.add(2, 3);//5 cal.multiply(2, 3);//61.7 import()ES2020 (ES11)新增了 动态import特性,解决了import动态加载,和不能写在代码块中的问题。import()返回一个 Promise 对象 。import(a + '.js') .then(...);        import(f()) .then(...); if (condition) {   import('moduleA').then(...); } else {   import('moduleB').then(...); }2. Module补充2.1 ES模块和CommonJS模块的差异import和export是关键字,require不是。CommonJS 模块输出的是一个值的拷贝,ES 模块输出的是值的引用。(详情见上方【单例模式解读】)CommonJS 模块是运行时加载,ES 模块是编译时输出接口。    因为 CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成。而 ES 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。this指向不同。ES 模块之中,顶层的this指向undefined;CommonJS 模块的顶层this指向当前模块,这是两者的一个重大差异。2.2 循环加载CommonJS中的循环加载// a.js let bar = require('./b').bar; console.log('bar:', bar); exports.ada = 'ada';// b.js let ada = require('./a').ada; exports.bar = 'bar'; setTimeout(function () {     console.log('ada:', ada); }, 0);执行结果:-->node a bar: bar ada: undefinedES Module中的循环加载// a.js import {bar} from './b.js'; console.log('a.js', bar); export let ada = 'ada';// b.js import {ada} from './a.js'; //console.log(ada);  //此处访问ada会报错 setTimeout(function () {     console.log('b.js', ada); }, 0); export let bar = 'bar';<!DOCTYPE html> <html> <head>     <title>module test</title>     <script type="module" src='a.js'></script> </head> </html>执行结果://console a.js bar b.js ada解读:因为CommonJS 模块输出的是一个值的拷贝,当拷贝的动作发生时,ada值为undefined,之后模块a中对ada进行赋值已经不会影响到模块b中保存的ada。ES 模块输出的是值的引用。所以模块a对ada进行赋值,会影响b中打印的结果。
  • [交流分享] 【悦识鲲鹏系列 第20期】Kunpeng BoostKit应用使能套件-Web场景文档获取与使用
    Kunpeng BoostKit应用使能套件,围绕大数据、分布式存储、数据库、虚拟化等八大主流场景,开放高性能开源组件、加速软件包和工具/参考实现,使能应用最优性能。本期介绍Web场景下应用使能相关文档资源的获取与使用。软件兼容性查询:cid:link_2鲲鹏BoostKit Web使能套件介绍 在线课程:https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXK045+Self-paced/about?isAuth=0&cfrom=hwc鲲鹏BoostKit Web使能套件文档聚合:cid:link_1
  • [迁移工具] CentOS7.6安装Web版Porting Advisor后,访问IP:Port显示“Page Not Found”
    按照 https://support.huaweicloud.com/ug-pa-kunpengdevps/kunpengpt_06_0017.html 完成了Web版的安装,IP地址选择的是弹性服务器的内网IP。已经在安全组中添加了8084的入规则。但是访问公网IP:8084提示“Page Not Found”。服务器的防火墙未开启:[root@ecs-b762-lsx86centos Code-Scanner_2.2.T2.SPC300_x86_64-linux]# systemctl status firewalld● firewalld.service - firewalld - dynamic firewall daemon   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)   Active: inactive (dead)     Docs: man:firewalld(1)gunicorn_port :[root@ecs-b762-lsx86centos Code-Scanner_2.2.T2.SPC300_x86_64-linux]# systemctl status gunicorn_port● gunicorn_port.service - gunicorn daemon   Loaded: loaded (/etc/systemd/system/gunicorn_port.service; enabled; vendor preset: disabled)   Active: active (running) since Mon 2020-12-28 17:59:16 CST; 2h 27min ago Main PID: 676 (gunicorn)   CGroup: /system.slice/gunicorn_port.service           ├─ 676 /opt/portadv/tools/venv/bin/python3 /opt/portadv/tools/venv/bin/gunicorn -c resource/g...           ├─ 921 /opt/portadv/tools/venv/bin/python3 /opt/portadv/tools/venv/bin/gunicorn -c resource/g...           ├─1016 /opt/portadv/tools/venv/bin/python3 /opt/portadv/tools/venv/bin/gunicorn -c resource/g...           ├─1046 /opt/portadv/tools/venv/bin/python3 /opt/portadv/tools/venv/bin/gunicorn -c resource/g...           └─1062 /opt/portadv/tools/venv/bin/python3 /opt/portadv/tools/venv/bin/gunicorn -c resource/g...Dec 28 17:59:16 ecs-b762-lsx86centos systemd[1]: Started gunicorn daemon.nginx_port:[root@ecs-b762-lsx86centos Code-Scanner_2.2.T2.SPC300_x86_64-linux]# systemctl status nginx_port● nginx_port.service - nginx - high performance web server   Loaded: loaded (/usr/lib/systemd/system/nginx_port.service; enabled; vendor preset: disabled)   Active: active (running) since Mon 2020-12-28 17:59:18 CST; 2h 28min ago     Docs: http://nginx.org/en/docs/ Main PID: 1168 (nginx)   CGroup: /system.slice/nginx_port.service           ├─1168 nginx: master process /opt/portadv/tools/nginx-install/sbin/nginx -c /opt/portadv/tool...           ├─1182 nginx: worker process           └─1183 nginx: worker processDec 28 17:59:17 ecs-b762-lsx86centos systemd[1]: Starting nginx - high performance web server...Dec 28 17:59:18 ecs-b762-lsx86centos bash[925]: /opt/portadv/tools/webui/.tempfileService nginx_port ...essDec 28 17:59:18 ecs-b762-lsx86centos systemd[1]: Started nginx - high performance web server.Hint: Some lines were ellipsized, use -l to show in full.
  • [技术干货] Nest.js初探:这很Angular
    一、前言Nest是构建高效,可扩展的 Node.js Web 应用程序的框架。 它使用现代的 JavaScript 或 TypeScript(保留与纯 JavaScript 的兼容性),并结合 OOP(面向对象编程),FP(函数式编程)和FRP(函数响应式编程)的元素。 在底层,Nest 使用了 Express,但也提供了与其他各种库的兼容,例如Fastify,可以方便地使用各种可用的第三方插件。以上是Nest.js的官方介绍,其实我们只需知道,它是一款Node.js的后端框架,并且官方提到了这么一段话:Nest aims to provide an application architecture out of the box which allows for effortless creation of highly testable, scalable, loosely coupled and easily maintainable applications. The architecture is heavily inspired by Angular.翻译过来就是:Nest 旨在提供一个开箱即用的应用程序体系结构,允许轻松创建高度可测试,可扩展,松散耦合且易于维护的应用程序。并且设计灵感来自于Angular。所以这应和了这篇文章的标题,而Angular很多模式又来自于Spring框架,比如依赖注入等等,所以可以认为:Nest.js是Node.js版的Spring框架。Nest.js的社区非常活跃,Github上已经有32.9k Star。不过我们国内也有类似的Node.js框架,比如阿里出品的Midway,两者设计思路也非常类似。二、创建新应用通过Nest CLI脚手架生成一个新应用:初始化完成后,执行npm run start即可启动项目。在项目的src目录下,我们可以看到以下几个文件:main.ts是入口文件,可以看到总共就8行代码:简单来说就是使用NestFactory这个工厂函数生成一个实例,然后监听3000端口即可。这时候打开浏览器访问localhost:3000,可以看到打印出了“Hello World!”三、实现接口接下来我们来实现一个查询用户的接口,来熟悉一下基本的开发流程。第一步,创建一个module:通过脚手架命令,可以自动帮我们生成一个module文件:这时候会发现,AppModule中自动引入了该module:第二步,创建Controller:Controller就类似前端的路由,负责处理服务器响应和客户端请求。举个例子,我们要创建一个接口获取所有的用户信息,接口路径为http://localhost:3000/user/users,那么我们可以在UserController中创建一个GET方法,路径为users:当我们访问上面的接口时,就会返回“all users”。再写一个获取单个用户信息的接口: 当然,这只是Controller能力的冰山一角,官方还提供了更多的装饰器:除此之外,Nest.js里还有很多概念都与Angular一一对应,如Provider、Pipe、Guard、Interceptors等等,对于熟悉Angular的开发者来说,Nest.js可谓是量身打造的后端框架。
  • [技术干货] 了解鲲鹏计算Web解决方案
    了解鲲鹏计算Web解决方案华为鲲鹏Web解决方案基于鲲鹏处理器,支持所有开源的Web组件,支持HTTPS的RSA加速,并针对开源Web组件特点优化了请求处理,充分发挥出了鲲鹏处理器多核优势,从而可以给客户带来更高的Web业务性能。鲲鹏计算Web解决方案文档获取地址:https://support.huaweicloud.com/twp-kunpengwebs/kunpengwebs_19_0002.html
  • [活动公告] 长沙站·《零基础WEB全栈学习训练营》第二阶段·每章随堂测验打卡帖
    (请严格按照回复示例进行回复,格式不对会影响获奖哦~)(回复格式:华为云ID+截图)为了巩固大家的学习成果,紧跟学习进度请将需要完成的每章随堂测验内容按要求回复到本帖下方还能有机会获得附加幸运奖哦~打卡时间2020.12.23-2021.01.06 23:59打卡要求在本帖中,回复对应章节的随堂测验并提交截图 ↓                                              回复格式:华为云ID+课程完成截图,如图所示↓↓↓华为云ID:grandmaster奖励方式在本阶段内提交随堂测验的用户中随机抽取5位幸运奖奖励华为云定制三和一数据线 活动注意事项 由于本帖回复内容为随堂测试结果,已设置回帖仅版主可见想了解更多关于全栈成长计划课程内容请移步主帖:https://bbs.huaweicloud.com/forum/thread-96671-1-1.html
  • [热门活动] 长沙站·《零基础WEB全栈学习训练营》第二阶段(已结束)
    《零基础WEB全栈学习训练营》第二阶段已结束感谢大家的积极参与和支持(因参加课程的学生数量及打卡人数未达到开奖要求,取消第二阶段结业考试以及奖励,只发作业得分总排名前三名的奖励)课程相关内容- 课程观看入口:   点此查看课程课程为录播,现在报名还可观看相关内容- 课程大纲:   点此查看课程大纲-第二阶段直播回看链接:1.8月13日【大厂前端经典面试题解析】直播回放地址:https://bbs.huaweicloud.com/videos/103100学习打卡任务内容及奖励安排课程表奖品如下:各学习任务打卡1.随堂测验打卡贴:【零基础WEB全栈学习训练营】第二阶段·每章随堂测验打卡帖2.最终考核打卡帖:【零基础WEB全栈学习训练营】第二阶段•最终考核打卡帖《零基础WEB全栈学习训练营》第一阶段回看链接:https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=86105其他学习与活动内容1.【零基础WEB全栈学习训练营】学习情况调查问卷,和版主反馈下你的态度?发发牢骚?学习调查问卷点这里点这里点这里
  • [问题求助] 【FusionInsight产品】Apache Kylin对接FusionInsight时web页面打不开
    【功能模块】FusionInsight HD【操作步骤&问题现象】Apache Kylin对接FusionInsight时web页面打不开, 在kylin.log可以看到报错【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [新手课堂] CPU的前端
    CPU的前端其实就是控制单元,负责对指令进行预处理。指令预处理大体上分为取指、预解码、融合、解码、分支预测、重排等操作。取指(Fetch)我们制作财务报表,第一步就是把制作指南拿出来。CPU也一样,先把指令载入进来。预解码(PreDecode)制作指南是一整页的,我们要分解出第一步算哪个数据,第二步又是算哪个数据,在小纸条上把公式列出来,一张小纸条一个公式。CPU也一样,要把程序中一整批的指令数据,拆分出来第一条是什么指令,第二条是什么指令;可能还需要对指令进行分类标志。预解码后的指令放在指令队列(Instruction Queue)里面。解码(Decode),又称为译码小纸条上的公式写着:利润=收入-支出,查帐本的同事就需要先把收入和支出数据从账本中找出来,抄到小纸条上。同样的,CPU碰到类似把内存中两个数加起来这样的指令,需要分解成:从内存载入第一个数字;从内存载入第二个数字;两个数字相加这样三个指令。一般来说,我们把原始的指令称为宏操作(Macro-Operations),分解后的指令称为微操作(Micro-Operations, μops)。指令融合(Micro-Fusion/Macro-Fusion)假设指南中有一个数据是算平均数的,某个按计算器的同事手上整好有一个可以直接算平均数的统计用计算器。那么,当我们在指南中看到一条类似这样的公式的时候,我们可以直接列算这几个数的平均数公式,注明给这位同事算。CPU也一样,某些指令是可以融合起来执行的,例如:比较A和B的大小;如果A不等于B,跳转到标志X的指令。可以用一条指令JNE A,B,X来代替,这样的处理称之为指令融合。指令解码前的宏操作融合,称为Macro-Fusion,解码后的微操作融合,称为Micro-Fusion。分支预测(Branch Prediction)理论上,制作指南中列出的所有步骤,我们都要完成上面的这些处理。但假设制作指南中说,盈利的话要算某几个数据,亏损的话这几个数不用算,要另外算其它几个数据。当我们计算过第一季度的数据知道企业第一季度是盈利的,我们算第二季度的数据时,想偷懒就直接跳过亏损要算的那几个数据的处理了。CPU处理指令也是一样的,负责预测的模块叫分支预测器(Branch Predictor)当然,如果算下来我们发现第二季度亏损了,还是要重新处理指南上的这些计算步骤。CPU也一样。指令重排,或者叫乱序执行(Out-Of-Order,OOO),或者动态执行(Dynamic Execution)事实上,我们不一定要完全按照指南上的步骤第一步算什么,第二步算什么这样算。只要公式列出来,数据抄出来了,就可以直接交给按计算器的同事去算。所以可能第一步要用的数据不太好找,按计算器的同事就先把第二步算出来了。当然,这里有一个前提,就是算第二步的时候,不需要用到第一步的计算结果。
  • [技术讨论] web系统架构
    web系统架构web系统架构的物理架构用户   负载均衡   web应用服务器   DB服务器 四部分组成用户通过浏览器访问web服务 进行交互负载均衡器自身需形成集群,达到高可用。web应用服务器进行HTTP响应并通过HTTP响应并通过程序实现应用逻辑,可能是web软件+CGL+程序或例如Tomcat自实际http交互的应用服务器DB服务器负责数据的可靠存取负载均衡器的作用:a.均衡负载http请求到web应用服务器,达到高可用。b.为web应用服务器提供高可用实现在某个web应用服务器故障时,切换到其他正常节点c.可以实现SSL卸载,无需在Web应用服务器建立SSL,减轻web应用服务器的计算压力。
  • CloudIDE 启动一个web任务后如何停止啊?小白求助
    如图,启动一个springBoot任务后,如何停止啊?找不到停止选项.jpg
  • [云实验室] 云安全:《WEB安全防护实践》-交流讨论帖
    欢迎小伙伴们体验《WEB安全防护实践》实验,有任何问题都可以在这里讨论交流哦! 通过本实验:§   您将学习    通过进行DNS解析配置,使用Web应用防火墙进行关于WAF的WEB安全防护实践。完成本实验,能够了解和掌握华为云WEB应用防火墙使用方法,掌握WEB安全防护操作及原理,建立WEB防护安全意识。§   您将体验    1.准备环境    2.配置DNS解析    3.Web应用防护墙 WAF防护体验§   您将掌握掌握WEB安全防护操作及原理如何配置DNS解析 实验开始前,推荐您先学习相关课程,掌握实验背景知识:   1. 《循序渐进了解华为云安全》   2.《云时代下的网络安全》   3.《华为云安全架构》   4.《华为云服务 - 云安全服务》 实验完成后,欢迎学习相关领域微认证,认证您的AI技能:       微认证:《云上主机安全》实验过程中,如有任何问题可在该帖进行交流,也可以添加华为云学院小助手(微信号:HWcloudedu),专业人员为您实时解疑答惑,互相交流,共同进步!如要提出问题,请详细描述您的问题及出现的步骤,附上实验操作截图,如有其他参考信息可一并附上。
  • [问题求助] 【Atlas200DK】【Presenter Server】利用Prenter Server传输jpg图片web无显示
    【功能模块】【操作步骤&问题现象】1、先是参照https://gitee.com/ascend/samples/tree/dev/Python/level2_simple_inference/2_object_detection/face_detection_camera 这个python的face_detection例程,因为要传输的是网络摄像头拍到的图片,又参照例程https://gitee.com/ascend/samples/tree/dev/Python/level2_simple_inference/6_other/colorization_video 对presenter_channel.py进行了修改2.先是用opencv每拍一张图片,存成jpg图片再用cv.imread()读出发送,收到信号到点开没有内容,FPS在0和1之间来回变动3.一开始以为是传输速率过慢引起的,索性直接循环读取目录中的图片再发送,FPS达到了28,但依然没有图片显示,下面为我修改presenter_channel.py部分的代码和结果图片【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] java实现文件上传功能(下)
    public ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) { ServletFileUpload upload = new ServletFileUpload(factory); //监听文件上传进度 upload.setProgressListener(new ProgressListener() {  @Override  public void update(long uploaded, long totalSize, int i) {  System.out.println("已上传:"+(uploaded*100)/totalSize+"%");  } }); upload.setHeaderEncoding("UTF-8");//乱码处理 upload.setFileSizeMax(1024 * 1024 * 10);//设置单个文件的最大值10M upload.setSizeMax(1024 * 1024 * 100);//设置总共能上传文件的最大值100M return upload; }  public String uploadParseRequest(ServletFileUpload upload, HttpServletRequest req, String uploadPath) throws FileUploadException, IOException { String msg = ""; //把前端请求解析,封装成一个List对象 List<FileItem> fileItems = upload.parseRequest(req); for (FileItem fileItem : fileItems) {  if (fileItem.isFormField()) {//判断上传的文件是普通的表单还是带文件的表单  String name = fileItem.getName();//前端表单控件的name:username  String value = fileItem.getString("UTF-8");//乱码处理  System.out.println(name + ":" + value);  } else {//判断为上传的文件  //==================处理文件=====================  String uploadFileName = fileItem.getName();//前端表单控件的name  System.out.println("上传的文件名:" + uploadFileName);  if (uploadFileName.trim().equals("") || uploadFileName == null) {//可能存在不合法的情况   continue;  }  String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);//文件名  String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);//文件后缀名  System.out.println("文件名:" + fileName + "--文件后缀:" + fileExtName);  //==================存放地址==================  String uuidPath = UUID.randomUUID().toString();  //文件存储的真实路径  String realPath = uploadPath + "/" + uuidPath;  System.out.println("文件上传到的位置:"+realPath);  //给每个文件创建一个文件夹  File realPathFile = new File(realPath);  if (!realPathFile.exists()) {//如果文件夹不存在,则创建一个   realPathFile.mkdir();  }  //==================文件传输==================  //获得文件上传的流  InputStream inputStream = fileItem.getInputStream();  //创建一个文件输出流  FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);  //创建一个缓冲区  byte[] buffer = new byte[1024 * 1024];  //判断读取是否完毕  int len = 0;  while ((len = inputStream.read(buffer)) > 0) {   fileOutputStream.write(buffer, 0, len);  }  //关闭流  fileOutputStream.close();  inputStream.close();  msg = "上传成功";  fileItem.delete();//上传成功,清除临时文件  } } return msg;}文件上传的注意事项1、为保证服务器安全,上传的文件应该放在外界无法直接访问的目录下,例如放在WEB-INF目录下。2、为了防止文件覆盖的现象,要为上传的文件产生一个唯一的文件名(可以为每一个上传的文件增加一个uuid或时间戳为名的文件夹)3、限制上传文件的最大值4、限制上传文件的类型,在收到上传文件时,判断其后缀名是否合法,是否为自己限制的类型
  • [交流吐槽] 在华为云推广方面的一些经验分享
        我自己本身是一名在校的大学生,我业余时间是在学习web开发的,对于华为云的了解也只有一年的时间,在今年年初由于疫情的原因每天除了上课就是在家里学习前端方面的知识,利用我所学到的知识,我做了一个说不上漂亮但是蛮简约又有那么一丝艺术感的一个页面,我也加了很多前端学习的qq群,偶尔拿出来和群里的前辈们交流交流,谈谈怎么改进,仅仅只是想和各位前辈多学习一些知识,从未想过会有人让我做网页,也并没有考虑赚钱。     很幸运的在暑假期间,有一个企业的老板联系到了我,让我给他们公司做一个网页,当时我也无所事事,就抱着试一试的心态同意了,老板让我给他推荐服务器,因为我只接触过华为云熟悉了华为云的控制台以及服务器连接方式,所以我推荐了华为云的2核4g的服务器,服务器的费用是由老板采购的,由于当时我并没有了解到云推官,所以也没有获得推广费用,为了考虑后续维护方便我用了wp模板,花了三天的时间,把他想要的公司官网上线了,就这样我获得了六百的收入,除了时间,我没有丝毫的的投入,后来第一个老板又给我推荐了两个客户,当时我看到了华为云首页有推广云速建站,最标准版和2核4g的服务器活动优惠价格基本差不多,而且续费价格就还要便宜一半,我就给老板推荐了云速建站,好在对于网站部署有点了解,花了一天的时间我基本上对于云速建站的基本设置熟悉了,虽然后来又遇到了中英文页面切换的问题(大概就是由于我控制台设置的是中文,而我只做了英文界面,预览始终是不显示我修改好的页面),现在想来都有些可笑,那么简单的问题居然困扰了整整半天时间。   就这样算下来一共花了十天左右的时间(跳过中间第一个老板做好以后休息的那几天),我获得了人生中真正意义上的自己独立获得的收入,一共是一千八百五十元(其中有一个老板跟我谈后续维护的问题谈到了晚上十一点,给了五十块钱的水费)。    上面是我通过华为云获得的收入,虽说与云推官整个活动没什么关系,但是我还是想分享一下我对于推广方面的经验,上个月我看到了有云推官这个活动,我本身在学校的专业是财务管理,我分析了一下如果我在一开始赶上云推官活动的话,以最低百分之二十的返利比率的话,粗略算一下服务器购买是联系过华为云客服九百的价格加上一个两年以及一个一年的云速建站超过了两千八百元,我能获得做一个网站的收入,因为在云推官方面还是一个新人,期望以后能够在云推官上面获得更多的收入。    在推广方案上我觉得很多企业的需求都是企业官网,因为基本上做软件开发的都是有专业技术人员的,并不需要去外包,更多的需求还是面对中小企业的互联网宣传,说到底就是公司官网、微信小程序,我觉得云推官这个活动对于在计算机专业的人们尤其接兼职做网站的学生是非常友好的,在做网站的同时靠推广所需要的产品也能多获得一份收入,尽量熟悉云速建站的操作方法,云速建站在操作中基本不需要前端知识,对于没有前端基础的朋友们非常友好,在推广时以云速建站为主要推广方向,同时我也希望华为云能够在匀速建站模板方面多更新,因为不少模板看起来都是非常古老的样式。    以上是我的经历加上对于推广方面的方案、以及我对于华为云产品的了解分析,给各位前辈以及想要进入云产品推广、云推官的新人分享一下,如果有不好的地方,还望多多批评、多提意见。   补充一些问题,昨天有前辈告知云速建站不计入返利,但是就目前来看,企业对于云产品的需求依然是企业网站、小程序、以及公众号,而云速建站这种低代码低成本易维护的产品对于没有代码基础的推广人员非常适用,我很建议动手尝试一下,不懂的地方可以直接提交工单咨询华为工程师嘛。就cps而言,有代码基础的云推官是非常有优势的,服务器返利加上搭建网站小程序都可以获得很高的回报。  市场方面一定要多拉拢中小企业客户,自身没有技术人员的大企业是非常少的,因为中小企业客户由于没有专业技术人员,基本上买卖是很容易谈成的。  推广方面,我觉得充分利用现在的互联网社交软件,qq群、微信朋友圈都可以作为推广的途径。(我的收入有很多运气的成分,我并没有搞过那么直白的推广,只是以一个技术人员的形象被人找到的)  产品方面,尽可能地了解产品的用途以及产品优势,给客户非常专业的一个形象,会大大提高成功的机率。  以上方面,只能说作为参考,是我针对之前我所遇到的几位客户的交流过程来做出的一些分析分享给各位云推官。  我是一个不是很专业的推广人员,而且我所获得的收入都是偏技术方面的,所以我的分析可能大部分是偏技术方面的,希望前辈们多提意见,新人们参考一下,毕竟我的专业不是推销。