python中进程的锁和线程的锁用法一样
Lock锁(只能锁一个,放一个) import multiprocessing import time lock = multiprocessing.Lock() def task(args): p = multiprocessing.current_process() lock.acquire() time.sleep(2) print(p.name) print(args) lock.release() def run(): for i in range(10): p = multiprocessing.Process(target=task,args=(i,)) p.start() if __name__ == '__main__': run() 2.RLock锁(可以上多把锁,也是锁一个放一个)
lock = multiprocessing.RLock() def task(args): p = multiprocessing.current_process() lock.acquire() lock.acquire() time.sleep(2) print(p.name) print(args) lock.release() lock.release() def run(): for i in range(10): p = multiprocessing.Process(target=task,args=(i,)) p.start() if __name__ == '__main__': run() seamphore锁(可以控制进入临界区的进程数量) lock = multiprocessing.BoundedSemaphore(3) def task(args): p = multiprocessing.
什么是静态路由?
静态路由指的是需要管理员手动配置的路由,只适合用于小型且稳定的网络,大型网络因为网段设备众多,手动配置需要花费较大的精力,所以大型网络我们一般是用动态路由。另外静态路由还有一个弊端是,每当网络情况发生变化时,需要管理员去手动更改配置,路由器不能够自己学习到。
静态路由怎么配置?
上图中,使用静态路由配置,使得PC1与PC2之间可以相互通信。画好拓扑图,一定要将各个网段与接口的IP理清楚(不然配到最后自己晕了,就很没有条理),静态路由的配置非常简单,三步就可以完成(以R2为例):
1. 为接口分配IP
2. 为路由器配置非直连网段的路由
R1和R3的配置也是同样的原理,需要注意的是使用静态路由进行配置时,每台路由器都要对所有的非直连网段进行配置,缺一不可。
ps:如果你需要一下或更多网工资料,可以私信我要~
3. 保存配置,使用ping命令测试网络连通性
如果测试过程中出现问题,那也可以用ping命令一步一步测试主机与每个网段,以此来判断是哪里出现来问题。在上述例子中,如果最终PC1无法联通PC2
那就可以用PC1与每个网段都ping一下,看是从哪里开始不联通的。由下图我们可以知道,直到192.168.3.2都是可以联通的,所以一定是192.168.4.0网段出现了问题,这里最后查错得出的结论是R3的e0/0/1接口IP没有配置好。
默认路由
也称为缺省路由,只有当数据报在路由表中无法找到相匹配的路径时才使用,这时候数据报就根据缺省路由进行转发,在路由表中的形式是0.0.0.0/0.静态路由一般用于企业网或者校园网出口,在出口处配置一条静态路由就可以使出口设备转发的数据报可以去到外网任何地址。
配置命令为ip route-static 0.0.0.0 0.0.0.0 下一跳
换了个工作,接手了别人的项目,最近因公司业务需求,商品详情页需加载H5的链接,方便以后更新,加载显示之后才发现,页面短时滑动还正常,一旦页面比较长,滑动时各种卡顿,手指往上滑,页面往下跑,反之,亦然,于是开始了漫长的寻找Bug之路。
开始在外面加了一层Scrollview,发现滑动很流畅了,心里窃喜,结果发现本该在屏幕底部的按钮跟随Scrollview的高度跑到屏幕外面的最底部了,而且页面较短时,有些内容还显示不全,又开始了新一轮的挣扎,使用各种自定义Scrollview,Webview,最后连腾讯的X5Webview都使用了,问题依然存在,怀疑是H5的问题,然后让H5看看,搞来搞去还是不行,H5也没辙了
于是把京东的商品详情放在项目中,发现也是这个问题,这样一看,那肯定是我们的问题了,但是问题在哪依然找不到,然后开始使用排除法,首先新建一个项目,用webview把链接放进去,就很丝滑,那么突然,猝不及防,暗自窃喜,这时怀疑是项目中的三方库引起的,于是把三方库复制到新项目中,发现依然没问题,此时怀疑是AndroidManifest文件配置问题,接着把项目中的配置复制到新项目中,果然问题出现了,逐步排查发现是使android:hardwareAccelerated="false" 导致的,功能是启动硬件加速,将其改为true或者删除就行了,至此问题解决
https://jingyan.baidu.com/article/b7001fe1a61dc70e7282dd37.html
1、依次点击“大小”→“定义”,进入公式符号的大小设置界面,如下图:
2、保存格式样式:在主界面上,“预置”>“公式预置”-> “保存到文件” ->存一个与默认配置文件不同的名字(如Font10,如下图),然后关闭mathtype回到word文档。
3、点击菜单栏中的“格式化公式”
4、在出现的对话框中浏览选择刚才保存的“mathtype公式格式统一10.5”
5、选择更新范围,可以是整篇文档,也可以选中的内容进行跟新,点击更新后,便会自动更新。
1.本地安装
npm install --save js-md5
2.在main.js中引入
import md5 from 'js-md5';
Vue.prototype.$md5 = md5;
3.使用方法
let userinfo = {
"username": this.loginFrom.name,
"password": this.$md5(this.loginFrom.pwd)
}
在本地输入密码1qaz@*****
经过数据库加密后的密码:92d7ddd2a010c59511dc2905b7e****
而在数据库中储存的密码是:92d7ddd2a010c59511dc2905b7e****
登陆时候的拿你的密码再加密一次,然后和数据库里面加密的密码对比,数据库存储的是加密之后的密码
注意:代码环境为服务端 客户端都在本地上,且都在同一个目录下进行编写的,大家可以根据自己的需要进行修改
大体思路:首先将文件的基本信息如文件名称,文件大小,文件的MD5值,封装一下,让后序列化,发送到服务端,服务端对MD5进行检查是否存在自己当前的目录,如果没有存在就行重传,如果已经存在就进行断点续传,中间使用MD5作为文件名进行临时存储文件的内容,这样可以避免同名不同内容的文件的上传,然后等到传输完毕,则将文件名改为自己需要的文件名
客户端代码
import socket import os import hashlib import json #创建socket对象 up_client = socket.socket() #连接服务端 up_client.connect(("127.0.0.1",8001)) #求文件的md5值 def file_md5(file_path): obj = hashlib.md5() with open(file_path,mode="rb") as f: for line in f: obj.update(line) return obj.hexdigest() #文件信息 #文件路径 #这里上传的是自己电脑上的文件路径,也可以对代码进行修改,将路径修改为需要输入的路径值,这样就可以进行上传,同时也要注意在服务端也进行修改 file_path = "01.txt" #获取文件大小 file_size = os.stat(file_path).st_size file_md5 = file_md5(file_path) file_name = os.path.basename(file_path) #自定义协议 file_infor = {"file_name":file_name,"file_size":file_size,"file_md5":file_md5} up_client.sendall(json.dumps(file_infor).encode("utf-8")) serve_msg = up_client.recv(1024).decode("utf-8") if serve_msg=="1002": print("开始发送") with open(file_path,mode="rb") as f: for line in f: up_client.
文章目录 结构体1 结构体基本概念2 结构体定义和使用3 结构体数组4 结构体指针5 结构体嵌套结构体6 结构体做函数参数7 结构体中const使用场景8 结构体案例19 结构体案例2 结构体 1 结构体基本概念 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型
2 结构体定义和使用 语法:sturct 结构体名{结构体成员列表};
通过结构体创建变量的方式有3种:
struct 结构体名 变量名struct 结构体名 变量名={成员1值,成员2值…}定义结构体时顺便创建变量 示例(创建结构体——学生类[姓名,年龄,分数]):
struct Student { //成员列表 //姓名 string name; //年龄 int age; //分数 int score; }; 定义完结构体后,有3种方式可以给结构体赋值:
#include<iostream> #include<string> using namespace std; //1、创建学生数据类型:学生包括:姓名,年龄,分数 //自定义数据类型,一些类型集合组成的一个类型 //语法:struct 类型名称{成员列表} struct Student { //成员列表 //姓名 string name; //年龄 int age; //分数 int score; }s3;//顺便创建结构体变量 int main() { //2、通过学生数据类型创建具体学生,3种创建变量的方式 // 2.
1、打开计划任务
2、创建任务
3、添加一个启动触发器
4、添加一个脚本操作
5、点击确认,输入登录管理员密码即可
重启试试吧
2021年,我做产品经理的第七年。
七年之痒,总会有些不一样的感悟。可以是痛彻心扉无言相对的冷漠,可以是不鸣则已一鸣惊人的深爱。这其中的变或不变,是一路走来的心路历程。
冷漠的是过去无知无畏的前路,深爱的是现在有知有行的探索。冷漠的是天道风云变幻的行业,深爱的是身边真诚大爱的同伴。七年的跌跌撞撞,平凡亦不平凡。
如果说勇于探索、勇于决策的品质,是产品经理给自己铺就的主动成长。那么保持反思、保持记录,就是我们给自己营造的被动成长。主动+被动,一往无前。
但前路漫漫,除去年份加持的职场经历,还剩下什么呢?产品经理抛去平台项目,有多少真实呢?这些问题,每年都要给自己一个答案。
距离2021年结束还剩4天,当我复盘今年的决策、迭代、功能、数据,好像留下点痕迹——这一年的40条点点滴滴。
01
策划篇
去年我关注相同,今年我更关注不同。
1、评价策划方案的好坏要根据目标。不同产品的做法没有优劣之分,区别只是目标不同罢了。比如知乎改版,不喜欢的人已经不是目标用户,喜欢的人自然更久留存、更多价值。
2、解决问题是产品唯一的价值衡量。也就是说,问题问对了产品才有意义。比如产品经理培训,问题是如何成为优秀的产品经理还是如何包装简历快速转行?
3、当和别人争论方案的时候,思考为何争论比证明自己是对的更重要。因为大部分的差异来源于价值观。比如你觉得体验更重要,但别人觉得商业化更重要。这个时候,站在产品目标的前提下先达成价值观的一致,差异自然消除了。
4、通用能力、C端视角、中台意识、数据模型,每个团队都在寻找有深度、会复盘、能抽象的产品经理,但这样的同学太少了。团队还是得有差异化,就像西游记的取经团队那样。
5、产品是技术的场景化包装,有技术支撑策划才能百花齐放。但今年给人的感觉是新技术无法到来,场景化的包装已经穷举完毕。所以,增长停了。
6、增长能掩盖大部分问题,人的缺点、团队的缺点、业务的缺点等等。但当增长停滞的时候,问题就会被无限放大,此时职场就会很难受。所以,我们需要有在最高点跳出去的能力和魄力。
7、职场的核心是价值呈现,要有用。有用其一是自身的能力被领导认可,二是让用户侧面说你好。那就有数据的直接上数据,没数据的就得量化体验。我们看到越来越多的产品在做NPS调研了。
8、越是崇尚数据的公司,产品经理的价值就越低。如果决策都用数据替代,那做产品的乐趣在哪?所以,我现在很反感AB测试,这是自身失去判断力的表现。产品经理要知其所以然,既然知其所以然,那为何还需要AB测。
9、交易类平台今年迭代的核心是注意力。告诉用户「应该买点啥」,这个背后隐含的是分发商品的逻辑变化。站在这个维度,也就明白了京东第二个tab改成新品的原因。
10、产品经理有相当一部分工作在自嗨。数据提升了、留存上去了、日活增加了,看起来很合格。但往往这是创新者的窘境,忽略了趋势的变化。比如新能源的对油车的压力,该抬头看看行业了。
11、理想主义是年轻产品经理常犯的错误。职级越高就越现实,越关注当下的数据。你要理解领导也需要汇报,他们得有拿出手的成绩。不信,你看波百度裁员,看的就是商业贡献。
12、最低价永远是吸引用户的手段,但不应该滥用。商业的核心是便宜、物美价廉。低价是人为制造的补贴洼地,便宜是建立在降本提效上的价值呈现。滥用补贴,日后必受其害。比如看看现在的新消费品牌。
13、产业互联网和古典互联网就是两套玩法,差异大到产品的地位都不可同日而语。所以为什么懂业务的产品经理很重要?因为产品只是解决业务问题的载体罢了。
14、产品经理的工作都是对外的。想法是跟老板讨论的,策划是给领导过的,文档是给开发写的,原型是给设计看的。那么我们的产出让别人看的舒服(言简意赅、重点突出)就是最强的沟通方式。但至少有90%的产品经理意识不到这点,他们在用自己的思路瞎写文档。
15、就像现在的产品经理跟五年前的要求完全不一样,五年后的产品经理肯定不是我们现在这样。好消息是到时候总有人符合要求,坏消息是剩下的就会被淘汰。
02
经验篇
人性的弱点有两方面,一是太相信过去的成功经验,二是太否定过去的失败经验。
16、经验的作用是参考,不是照搬。当需要做决策的时候,经验的作用是对照组,我们要用对照组拿出一个更好的方案,切忌直接照搬。否则经验失灵的时候,会直接懵逼。
17、经验的比较级是迭代,即承认过去的优点或缺点,然后在此基础上不断优化决策模型,一次比一次更好。曾经一个经验用了五年的职场故事,就是没做到这点。
18、挣B端的钱与C端的钱是完全相反的两套逻辑。B端的需求是明确的,提供精准的价值即可,讲究干货、有用、隐秘、小圈子、红利等等。但C端需要先将需求放大,讲究精准、分层、回捞、定向等等。
19、当我们目标明确、有节奏的时候,其实不会关注周边的人和事,会尤其专注。比如在高铁上,里座的人说要出去你会觉得别人事多。但如果你在打王者荣耀,你会下意识的直接让开,让别人快速过去,这就是区别。
20、原动力对人的影响很重要。就拿写公众号来说,如果原动力是涨粉、阅读量,那么在流量变少的当下会非常焦虑,会考虑要不要去抖音小红书多维发展。但如果原动力是个人输出、记录表达,那么就会平常心,流量变化也就无所谓了。
21、多问几个为什么,事情就会豁然开朗,做产品如此,生活也是如此。比如去大厂为什么?背书吗?背书的目的呢?创业吗?创业的目的呢?赚钱还是价值实现?最后再反问一句,解法一定是第一个问题当做起点吗?多追问之后,就会发现事情总会落到「当前生活的困境需要赚钱解决」和「内心价值的实现需要不断探索」这两个点上。
22、任何费时费力的工作,都有方法去优化。当你机械重复的时候,先想想是不是该磨刀了。现实是我们第一次砍柴的时候无法把刀磨好,但第二次就得有这个意识。即第二次的效率是建立在首次经验的优化之上。
23、大部分事情不是想的那样。同理心是相对的,差异是绝对的。比如就像我们看到的一个很开朗的UP主,可能只是被MCN包装出来的表演一样。今年亲测的一个案例,震撼了我。
24、我们的注意力被当下裹挟了。明星丑闻、双减裁员,没人关注昨天的事、上周的事、上月的事。比如鸿星尔克现在如何了,捐款这波热度对其影响几何?郑州新乡的洪水,恢复的情况怎么样?跳出裹挟,关注自己关注的事情,才能独立思考。
25、优秀的人各有不同,差劲的同学条条想通。
26、书是经验的载体,是当事人心得复盘,是一次我们与亲身经历者的对话,需要关注重点仔细倾听。站在这个角度,播客也是。
27、喜欢给别人讲过往经验的同学,往往在寻求价值认同。要么是在掩盖不如意的现在,要么是在得意的炫耀。如果遇到,简单的附和就是对他们最大的敬意了。
28、做事动因很重要。从自己的前进动力到对方的无事殷勤,往深了一层去看,你会发现大部分事情不复杂。你也许就理解了对方,觉得对方其实很可怜。
29、除了已知的外卖或快递,我们真的不需要接任何电话了。把手机通话设置成静音,你就远离了所有的推销诈骗。(其实快递和外卖也不需要接电话,他们知道放在哪)
30、常驻勿扰模式,任何人任何事都没必要立即回复。科技越来越发达,需要主动保持距离。比如我在Q4成功的把在线的微信用成了离线的QQ,少了很多打扰,真香。
03
管理篇
管理是人与人的关系,对上对下对平级,三者都需要花点心思。
31、管理就两点:一是能拿出对方期望的,二是要得到自己期望的。第一句话的重点是「能」,第二句话的重点是「要」。前者是你与别人对话的前提,后者是你付出精力的回报。
32、每个人都是独立的个体,有TA独立的思想和期望。管理的技巧是从对方的角度出发,得到自己想要的结果。这一需要同理心,二需要包装。站在老板的角度,叫画饼。
33、管理的前提是稀缺(时间紧张、资源不足)。管理的结果是提高下属的容错抢时间和得到上级的倾斜资源。身在职场,就要争取资源拿出让人满意的结果呈现。
34、内卷的价值是对上管理,证明自己能超出领导的期望行为,从而得到想要的结果(涨薪、职级)。在大家能力水平差异不大的时候可能有用,但问题是决定权不在自己手中,往往落空。
35、站在给予和得到的基础上再看管理书籍,事半功倍融会贯通。同理,当看书讨论时最好带着认知去看去谈,有对话、能交流才是一次好的talk。
36、职场没有绝对的说服,只有相对的妥协。你以为你bettle赢了,可能只是对方懒得说了、或觉得你怎样做都无所谓,不影响大局的结果。
37、一个职场人能做到自我管理,就跑赢了大部分人。但这个赢,需要时间、运气还有坚持。也就是认可这些短期无效但长期有价值的事。
38、社交牛逼症其实就是管理对方的预期,让对方关注的点都落在自己身上。看似顺其自然,实则步步都是预设。
39、人到30就需要管理自己的精力。把清醒有创造力的时刻用在关键的事情上,在混沌蒙昧的时间用在常规的事情上。但前提一是会管理,二是分主次,挺难的。
40、管理自己的焦虑,别被割了韭菜。大部分焦虑都能靠自己解决,也只能靠自己解决。商场如战场,雪中送炭的少,落井下石的多。
最后
如果跟去年的总结对比,今年的总结明显比去年更长、更系统。
有思考、成体系,将一年的点滴融汇到自身的知识框架中,将自己当成一个产品不断的迭代。成长的点线面,一步一步的脚踏实地。
2021,抛开所有,幸好有点收获。
- END -
往期推荐
《2020年,一个产品经理的40条心得总结》
《2019年,一个产品经理的40条心得总结》
欢迎关注公众号
持续输出深度思考的干货文章
↓↓↓↓↓↓
本次呢,简单介绍一下协同过滤算法,并且给出简单的电影推荐实验作为举例说明。利用Spark MLlib中的协同过滤算法完成针对特定用户的电影推荐功能。这一部分需要实现实现输入用户id,输出为其推荐的电影。
一、协同过滤 所谓协同过滤,就是简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的资讯,个人透过合作的机制给予资讯相当程度的回应并记录下来以达到过滤的目的进而帮助别人选择信息。对于实现针对用户个性的推荐功能这一需求,非常合适。
二、电影推荐 首先来看我们的结果:
需要用到的数据集下载链接在文章的最后。
大概是这个样子:
movies和ratings两个数据集
数据之间以 :: 隔开
movies的每一列分别表示
movie_id , movie_name , movie_type
ratings的每一列分别表示:
movie_id , user_id , score , timestamp(时间戳)
代码如下:
object SparkPi { case class Rating(userId: Int, movieId: Int, rating: Float, timestamp: Long) def parseRating(str: String): Rating = { val fields = str.split("::") assert(fields.size == 4) Rating(fields(0).toInt, fields(1).toInt, fields(2).toFloat, fields(3).toLong) } def main(args: Array[String]): Unit = { val sc=SparkSession.builder() .master("local") .appName("movie") .getOrCreate() val ratingRDD=sc.
一、实现效果
html代码
<el-button type="primary" icon="el-icon-close" size="mini" style="margin: 10px 10px 10px 0" @click="alldelete" :disabled="multipleSelection.length === 0" >批量删除</el-button > <el-table :data="tableData" style="width: 100%" :header-cell-style="{ background: '#F2F6FC', color: '#606266' }" ref="multipleTable" size="mini" border :row-style="tableRowStyle" @selection-change="handleSelectionChange" v-loading="loading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading" > <el-table-column type="selection" width="55" ></el-table-column> <el-table-column label="操作" width="130" > <template slot-scope="scope"> <el-button @click="handleClick(scope.row)" type="text" size="small" >修改</el-button > <el-button type="text" size="small" @click="handleDelete(scope.row.id)" >删除</el-button > </template> </el-table-column> <el-table-column prop="title" label="标题" :show-overflow-tooltip="true" width='440px' > <template slot-scope="scope"> <a :href="
今天把基本图形基本结束掉,之后直接学ggplot2吧,冲!
1.核密度图
在上一个直方图中也用过其实,核密度估计是一种用于估计随机变量概率密度函数的非参数方法。用来观察连续变量地分布。
plot(density(x)),最简单地形式,plot是会新创建一幅新的图像,如果是要加上线可以用lines(),像上一篇中一样。如下是单个变量的密度图,以及多个变量密度图合并比较显示。
#核密度图 plot(density(mtcars$drat),main = 'Density of drat') polygon(density(mtcars$drat),col = rainbow(1),border = "blue")#设置填充颜色和边界颜色 rug(mtcars$drat,col = 'red')#添加轴须图,在图最下面 #核密度图的叠加 install.packages("sm") library(sm) attach(mtcars) cyl_f<-factor(cyl,levels = c(4,6,8), labels = c('4 cylinder','6 cylinder','8 cylinder'))#创建分组因子并设置顺序 sm.density.compare(mpg,cyl,xlab = "Miles per gallon") title(main = "mpg distribution by cyl")#只能在外头加有用 legend(locator(1),levels(cyl_f),fill = 2:4)#鼠标交互式放图例,这个颜色的对应稍微有点不理解 detach(mtcars) 2.箱线图
又称盒须图,展现连续型变量的五数:最小值、下四分位数、中位数、上四分位数、最大值。一定程度上展现分布情况,并且能展现出离群点,在范围外超过1.5四分位距的点。
boxplot(mpg ~ cyl,data = mtcars, main = "mpg - cyl", xlab = 'number of cylinders', ylab = 'miles per gallon') #有凹槽 boxplot(mpg ~ cyl,data = mtcars, main = "
目录
前言
一、依赖选择
二、环境部署安装
2.1解压
2.2启动程序
2.3踩坑--------office.home配置有误
2.4踩坑问题解决
三、踩坑-------OFFICE组件不可用
3.1确认是否是office组件的问题
3.2验证office组件是否不可用
3.3验证office组件是否可用
四、踩坑-------officeHome must exist and be a directory
五、程序优化
5.1无法打开dox文件,使用KFV程序转义成pdf时会报500,体验感很糟糕,我这里通过异常捕获,返回I‘m sorry图像
5.2文件无法打开,报404
5.3解决文件编译乱码问题
总结
前言 提示:本人从2021年7月份开始使用开源框架kkFileView到现在已经过去了5个多月了,总提来讲kkFileView的功能很强大,由于需要集成依赖第三方软件openboffice或liberoffice,不可避免的会给开发人员或者使用部署人员带来很多兼容性和环境配置问题,我在这里踩了很多坑,这里做个总结,下面的kkFileView就简称KFV了
提示:以下是本篇文章正文内容,下面案例可供参考
一、依赖选择 示例:kkFileView需要第三方软件的功能支撑,因此如果选择的软件不符合程序能够接受的范围就会带来冲突,下面附上官方说明:
Java: 1.8+ Maven:3.4+ OpenOffice或LiberOffice(Windows下已内置,CentOS或Ubuntu下会自动下载安装,MacOS下需要自行安装) 不过这些提示并不精确,查看类OfficeUtils中getDefaultOfficeHome方法后定位到更精准范围,如下图:
windows下KFV自带完美兼容的windows-office,这里就不做说明了;
linux下可以选择openoffice4,而libreoffice可以选择使用libreoffice6.0-7.2版本;
作者这里选择的是libreoffice7.1版本的软件来兼容的KFV,下载地址如下:
https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.4.2/rpm/x86_64/LibreOffice_7.1.4.2_Linux_x86-64_rpm.tar.gz
https://downloadarchive.documentfoundation.org/libreoffice/old/7.1.4.2/rpm/x86_64/LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN.tar.gz
这两个分别下载LibreOffice_7.1.4.2_Linux_x86-64_rpm.tar.gz 和LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN.tar.gz文件,前面提供启动程序,后面提供中文语言包
第三个需要下载的是KFV官网的linux能运行的jar包下载地址如下:(https://kkfileview.keking.cn)
https://kkfileview.keking.cn/kkFileView-4.0.0.tar.gz
二、环境部署安装 2.1解压 将下载好的程序传到某个目录下,我这里的文件目录是
/export/server/LibreOffice_7.1.4.2_Linux_x86-64_rpm.tar.gz /export/server/LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN.tar.gz /export/server/kkFileView-4.0.0.tar.gz 接下来需要解压文件:
使用命令如下:
#进入解压文件位置后
tar -zxvf /export/server/LibreOffice_7.1.4.2_Linux_x86-64_rpm.tar.gz tar -zxvf /export/server/LibreOffice_7.1.4.2_Linux_x86-64_rpm_langpack_zh-CN.tar.gz tar -zxvf /export/server/kkFileView-4.0.0.tar.gz 2.2启动程序 解压后目录结构如图所示;
进入 cd ./kkFileView4.0.0/bin ,然后执行命令sh ./startup.sh sh .
Unity渲染(一):纯色Shader 通过这里,你可以学习到UnityShader基本语法,CG语义,GPU渲染流水线等编写着色器的基础知识
开发环境:Unity5.0或者更高
最终效果 概述 1. Unity shader 基本语法 2. 顶点着色器与片元着色器参数传递 3. 基本shader语义 4. GPU渲染流水线 1.1 开始 创建场景并取名为SolidColor并在场景中添加Camera与Cube Hierachy 创建Material 和Shader 删除Shader中所有代码后,写入如下代码, 这是shader的基本结构 Shader "Toturial/SolidColor" { SubShader { Pass { CGPROGRAM ENDCG } } } 此时Console出现了两条警告信息,第一条表示该Shader代码中的所有SubShader都不支持,第二条表示需要该Shader对GPU顶点着色器和片元着色器进行编程,在
Shader warning in 'Toturial/SolidColor': Toturial/SolidColor shader is not supported on this GPU (none of subshaders/fallbacks are suitable)
Shader warning in 'Toturial/SolidColor': Both vertex and fragment programs must be present in a shader snippet. Excluding it from compilation
微信小程序的canvas。。一言难尽
先差不多上个效果图吧
网上其实能找到挺多教程,但注意!!!都是很久之前的写法,有些方法已经被废除了,像wx.createCanvasContext,ctx.draw(),另外draw()文档上还没更新,文档上显示还能用,真的太坑了,而且还有很多绘图时使用的方法也更换了,具体看小程序文档
https://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.htmlhttps://developers.weixin.qq.com/miniprogram/dev/api/canvas/CanvasContext.html
另外其实现在小程序画圆跟H5用canvas差不多的
具体看这个
HTML canvas arc() 方法https://www.w3school.com.cn/tags/canvas_arc.asp上一波代码吧,改动挺多的对比以前,其实就是获取ctx根据小程序文档来改进的,还有关于画圆变成椭圆的问题其实我自己的解决办法就是不给它加高度宽度,直接用半径绘制,还知道一种方法就是直接在canvas标签上面加height:100;width:100
WXML
<view class="progress"> <canvas type="2d" class="progress_bg" canvas-id="canvasProgressBg" id="ProgressBgId"></canvas> <canvas type="2d" class="progress_canvas" canvas-id="canvasProgress" id="ProgressId"></canvas> <view class="progress_text"> <image class="progress_img" src="/img/success.png" mode="widthFix"></image> <view class="progress_num">{{progressNum}}</view> </view> </view> JS
// pages/downLoad/downLoad.js Page({ /** * 页面的初始数据 */ data: { progressNum:'10%', screenWidth:0, step:0 }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { wx.getSystemInfo({ success: (res) => { this.setData({ screenWidth:res.screenWidth }) }, }) }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { this.
什么是路由? 路由表包含哪些信息? 如何配置浮动路由? 一、 什么是路由 网络中的各个节点,处在不同网段,路由器收到1个数据包,要将这个数据包送往目的地。
路由器转发数据包的依据,就是路由表。
二、 路由表包含哪些信息 路由表中最关键的信息,是去往每个目标网段的下一跳和出接口
如图,对于这台路由器,根据路由表就能知道,去往10.1.1.0/24的数据包,应该从g0/0/0接口发出,下一跳的地址是1.1.1.2。
可能会想,只要有出接口,就能判断数据如何转发了,为什么还要下一跳的地址?
因为数据包必须经过以太网封装才能发出,而以太网封装必须写上目标mac,这个下一跳地址,就是为了完成目标mac的封装,只要查一下下一跳地址的ARP记录,就知道了对应的mac地址。
一条完整的路由条目,除了目标网段,出接口,下一跳外,还有很多其他信息。以下图华为的路由器的路由表为例
Destination/Mask:表示此路由的目的网络地址与网络掩码。
Proto(Protocol):该路由的协议类型,也即路由器是通过什么协议获知该路由的,上图可以看出是一条ospf路由
Pre(Preference):表示此路由的路由协议优先级。针对同一目的地,可能存在不同下一跳、出接口等多条路由,这些不同的路由可能是由不同的路由协议发现的(如OSPF和RIP),不同路由协议有不同的优先级。pre数值最小者将成为当前的最优路由。 Cost:路由开销。当到达同一目的地的多条路由具有相同的路由优先级时(如都是OSPF产生的),路由开销最小的将成为当前的最优路由。
NextHop:表示对于本路由器而言,到达该路由指向的目的网络的下一跳地址。该字段指明了数据转发的下一个设备。
Interface:表示此路由的出接口。指明数据将从本路由器的哪个接口转发出去。
ps:如果你需要以下资料,或更多网工资料,可以找我要~
三、 浮动路由配置举例 上图中,AR1去往6.6.6.6有两条路径,希望通过路由的配置,实现主路径走1.1.1.1,备路径走2.2.2.2,可以通过路由的pre值来实现
[Huawei]ip route-static 6.6.6.6 32 1.1.1.1 preference 60
[Huawei]ip route-static 6.6.6.6 32 2.2.2.2 preference 61
小思考:本实验如果使用OSPF,如何实现主备路由的控制?
基础知识:
import pygame,sys #导入pygame和sys模块
pygame.init() #初始化init(),小数点是引用后面的函数
screen = pygame.display.set_mode((500,400))#设置窗口大小,screen可以自定义名字,=号是赋值,pygame里面的display里面的set_mode()函数
pygame.display.set_caption(‘我的第一个游戏’)#设置标题栏set_caption()是窗口函数,带括号的都是函数
while True: #主程序循环
for event in pygame.event.get():
if event.type == pygame.OUIT: #接收到退出事件后退出程序
pygame.quit()
sys.exit()
pygame.display.update() #刷新画面
#导入游戏所需模块
import pygame 导入游戏所需模块
import pyamne as game 游戏模块用game名简化,用其它名字也可以
import sys 导入系统模块
import random random用于产生随机数
import time time模块用于设置屏幕刷新率
game_window = game.display.set_mode((600,500)) #设置游戏窗口大小并赋值给game_window
game.display.set_caption(‘接弹球计分游戏’) #设置游戏标题名称
pdf.js是 mozilla 出品的一款 PDF 文件阅读的开源 js 库。
github 仓库 : GitHub - mozilla/pdf.js: PDF Reader in JavaScript
pdf.js 使得PDF文件可以在html页面中进行打开阅读, 自带的预览页面 viewer.html 包含了丰富的功能。预览效果如下图所示:
页面自带有放大缩小的功能,需要用户点击对应的 “+”、“-” 按钮进行操作。但是在手机页面中,用户很常见的一个需求就是需要通过手势进行放大缩小,这也是很合理的用户习惯。而pdf.js默认不支持手势的缩放,此时就需要对其 viewer.html 进行调整以满足需求。
本文分享的方法,不需要修改 pdf.js 本身的代码, 只需要在其自身代码基础上添加补充的方法。
经过阅读可以发现 pdf.js 自带的放大缩小功能调用的方法为 PDFViewerApplication.zoomIn() 以及 PDFViewerApplication. zoomOut(),代码位于 viewer.js 的 812行:
zoomIn(ticks) { if (this.pdfViewer.isInPresentationMode) { return; } let newScale = this.pdfViewer.currentScale; do { newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2); newScale = Math.ceil(newScale * 10) / 10; newScale = Math.min(_ui_utils.MAX_SCALE, newScale); } while (--ticks > 0 && newScale < _ui_utils.
参考: (1)idea中 maven 本地仓库有jar包,但还是找不到,解决打包失败和无法引用的问题_huqiankunlol的博客-CSDN博客_idea maven 本地仓库有但是引不进来
我: (1)删除掉本地仓库中指定jar包路径所在的_remote.repositories文件
(2)删除掉idea项目中的.iml临时文件(清除缓存),重新打开idea。