4889软件园:电脑手机软件下载大全,热门手机游戏免费下载

4889软件园 > 资讯文章 > 自动抢红包插件(国外小姐姐开源了一款 Chrome 效率插件,火了)

自动抢红包插件(国外小姐姐开源了一款 Chrome 效率插件,火了)

作者:佚名 来源:4889软件园 时间:2022-12-29 16:09:46

自动抢红包插件(国外小姐姐开源了一款 Chrome 效率插件,火了)

3k抢红包插件文章列表:

自动抢红包插件(国外小姐姐开源了一款 Chrome 效率插件,火了)

国外小姐姐开源了一款 Chrome 效率插件,火了

Chrome 作为目前全球市场占比第一的浏览器,因其强大丰富的插件商店系统,受到不少用户青睐,其中也不乏具备开发能力的工程师。

在 GitHub 上,有不少工程师会根据个人需求,制作一些可提高生产力的 Chrome 插件,并将代码开源。

最近几天逛 Product Hunt 的时候,偶然发现了一款名为 Omni 的生产力插件,在 1 月 12 号,稳居日榜第一。

今天,便跟大家简单介绍下。

功能介绍

The all-in-one tool to supercharge your productivity。

简单来说,你可以把 Omni 视为一款 Chrome 快捷键管理工具。

它拥有 50 多项特性,为提高生产力而生。主要目的,是让你可以像极客一样,通过键盘快捷键来使用 Chrome。

GitHub:https://github.com/alyssaxuu/omni

里面包括了快速切换和搜索页面标签,搜索网页浏览记录,多个快捷键配置等功能,并集成了 Notion、Figma、Docs 等多款工具。

完整功能特性如下:

切换、打开、关闭和搜索标签;

浏览和管理个人书签;

快速搜索浏览历史记录;

?? 拥有 50 多项提高生产力的特性;

用于过滤和执行更多操作的特殊命令;

与 Notion、Figma、Docs、Asana 的集成;

?? 静音、置顶、书签等操作的快捷方式;

?? 解决浏览问题的高级设置;

暗黑模式。

安装使用

安装方式可分为在线和离线两种。

在线安装:

这是最简单的一种安装方式。

访问该插件的 Chrome 商店地址,直接点击安装插件即可:

https://chrome.google.com/webstore/detail/omni/mapjgeachilmcbbokkgcbgpbakaaeehi

离线安装:

这种安装方式,主要适用于无法正常访问 Chrome 商店的用户。

安装分为以下几步:

    在 GitHub 上下载或克隆该项目代码;

    打开浏览器,访问 Chrome 插件管理页面(chrome://extensions/),启动浏览器开发者模式;

    将项目的 src 文件夹,拖动至 Chrome 插件管理页面。

    完成 Omni 本地安装。

操作使用:

安装完毕后,使用 ? K(Windows 用 Ctrl K)快捷键,即可在 Chrome 浏览器中调出 Omni 界面:

你可以在界面搜索框中输入下面命令,来快速启动某个指令:

/tabs : 搜索标签

/bookmarks : 搜索书签

/history : 搜索浏览器历史

/actions : 搜索所有可用的操作

/remove : 删除书签或关闭标签

对于平时用惯了 Chrome 自带快捷键的我来说,Omni 所提供的打开新标签、关闭页面、刷新页面等功能比较鸡肋,因此按下不表。

这里着重跟大家介绍几项 Omni 特有的,也是我个人比较喜欢的功能。

在 Omni 界面搜索框中,输入 /a,查看所有 Omni 提供的附加操作:

这里面总共有 50 多项可用于提高生产力的快捷操作,比如新建 Notion 页面、Excel 表、GitHub 仓库、录制页面、打开画板、编辑图片、在线转换 PDF 等功能。

以创建白板页面为例,当我们调用「Create a whiteboard」命令时:

便会在浏览器上,自动跳转到 webwhiteboard 网站,快速进行创作。

你可以在上面绘制流程图或思维导图,用于日常笔记记录:

另外还有个好处是,由于这个项目代码完全开源。因此,如果你不满足于插件提供的 50 多项功能,还可以自行定制。

我简单看了下作者所提供的项目源码,要定制并不难。只需打开项目的 background.js 文件,往 actions 数组插入符合定义的新增项即可。

具体代码可参见:

https://github.com/alyssaxuu/omni/blob/master/src/background.js#L15-L73

改完代码之后,记得在 Chrome 的插件管理页面,重新加载一下插件安装包。

作者介绍

该插件作者 Alyssa 是一名来自美国旧金山小姐姐,懂设计与开发,在 GitHub 上拥有 3k 粉丝。

曾创办 Sonuum 与多家企业,被 Maker Mag(独立开发者杂志)评为 2018 年最佳女性制作人,Product Hunt 年度制作人。

Omni 插件自 2022 年 1 月 11 日在 GitHub 开源以来,Star 数增长迅猛,短短几天便突破 1k ,感兴趣的小伙伴不妨安装体验一下。

除了这款插件,你还见过哪些比较实用的 Chrome 生产力插件,欢迎在评论区聊聊。

GitHub 热点速览:刷 LeetCode 的正确姿势

作者 | HelloGitHub-小鱼干

责编 | 郭芮

找对路子,事半功倍,正如本周 GitHub Trending #刷 LeetCode# 主题想表达的那般,正确的学习姿势方能让人走得更远,走进大厂。学习除了正确姿势,“脑洞”也很重要,在五一假期掀起 Copy 风的 AR Cut & Paste 凭借所见即可拷的特性在 Twitter、微博等社交平台刷了屏。

说到学习方法,本周特推的 亚马逊工程师亲测:coding-interview-university 无疑是非科班人员进大厂的最佳实践,读完它的作者自我介绍不得不感叹:正确的姿势也得坚持不懈的努力方能“得偿所愿”。

以下内容摘录自微博@HelloGitHub的 GitHub Trending,选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 7 day 的项目会标注 New,无该标志则说明项目 release 超过一周。由于本文篇幅有限,还有部分项目未能在本文展示,望周知。

本周特推

1.1 所见即可拷:AR Cut & Paste本周 star 增长数:2900 New:可见即可拷,AR Cut & Paste 是一个 AR 复制粘贴工具,可无缝衔接 Photoshop 将实物粘贴到图层中。作为一个 AR ML 原型,在未来它将支持你直接在环境中剪切元素,并将它们粘贴到一个图像编辑软件中,目前只支持 PS。btw,项目刚开源 24 小时不到已获得近 3k star ??

GitHub 地址→https://github.com/cyrildiagne/ar-cutpaste

1.2 亚马逊工程师亲测:coding-interview-university本周 star 增长数:850

coding-interview-university 是一名非科班程序员为入职 Google 制定的学习计划,并严格按照每天 8-12 小时的学习节奏实施。虽然他最后没有去面试 Google 而是入职了 Amazon,但是不妨碍这是一个不错的程序员学习清单,下面引用下作者的原话:

自 1997 年以来,我一直从事于 Web 程序的构建、服务器的构建及创业型公司的创办。对于只有着一个经济学学位,而不是计算机科学学位(CS degree)的我来说,在职业生涯中所取得的都非常成功。

然而,我想在 Google 工作,并进入大型系统中,真正地去理解计算机系统、算法效率、数据结构性能、低级别编程语言及其工作原理。可一项都不了解的我,怎么会被 Google 所应聘呢?

GitHub 地址→https://github.com/jwasham/coding-interview-university

GitHub Trending 周榜

2.1 扫码传输利器:qrcp本周 star 增长数:1000

比微信传输更香,扫码传输利器 #GitHub Trending# qrcp 是一个文件传送工具,连上 Wi-Fi 之后通过 QR 码(二维码)可直接在 PC 与移动设备上传输文件。

工作原理:

qrcp将 Web 服务器绑定 Wi-Fi 网络接口地址的随机端口,并为它创建一个处理程序。默认处理程序处理内容,并在传输完成时退出程序。

当用于接收文件时,qrcp 提供一个上传页面并处理传输。

GitHub 地址→https://github.com/claudiodangelis/qrcp

2.2 算法实现:Java本周 star 增长数:700

本周 #GitHub Trending# 上的 Java 不是一个 Java 入门到精通的项目,而是用 Java 实现所有算法的项目,虽然某些实现方式不如 Java 标准库高效,如果你在学习算法或者打算刷 LeetCode,不妨看看这个项目。

GitHub 地址→https://github.com/TheAlgorithms/Java

2.3 手绘图形库:Rough.js本周 star 增长数:150

Rough.js 是一个小巧的 js 库(小于 9KB),它提供了手绘风格的基础图形,包括:直线,曲线,圆弧,多边形,圆形和椭圆形等基础图形,支持 Canvas、SVG。

GitHub 地址→https://github.com/pshihn/rough

2.4 ins 千粉事迹(1/1):InstaPy本周 star 增长数:500

InstaPy 是一个自动点赞/关注/评论的 Python 脚本,帮你自动完成 Instagram 的互动。作者设计初衷是通过 InstaPy 给 ins 的某些 tag 下内容自动点赞或者 follow 某些 ins 作者得到曝光,当然作者也成功的使用 InstaPy 获得超过了 3k 粉丝。

GitHub 地址→https://github.com/timgrossmann/InstaPy

2.5 学…学…学不动 Vue 3.0:vue-next本周 star 增长数:400

vue-next 是 Vue 3.0 repo,目前项目处于 Beta,包含了前端在开发过程中需要的套件、WebPack 插件等等内容。目前 Vue 3.0 状态如下:

vue: Beta

vue-router: Alpha

vuex: Alpha

vue-class-component: Alpha

vue-cli: Experimental support via vue-cli-plugin-vue-next

eslint-plugin-vue: Alpha

vue-test-utils: Alpha

vue-devtools: WIP

jsx: WIP

GitHub 地址→https://github.com/vuejs/vue-next

2.6 这应该是最全的 Flutter 学习教程:Flutter-Course-Resources本周 star 增长数:300

Flutter-Course-Resources 是一个 Flutter 开发训练营,它旨在你学习开发 App 的过程中习得 Flutter 之技,该训练一共分为 16 个章节,从 Flutter 介绍讲起,带你从安装部署、icon 设计到 Flutter 开发实践,一条龙学习 Flutter。

GitHub 地址→https://github.com/londonappbrewery/Flutter-Course-Resources

2.7 建站萌新福利:Docusaurus本周 star 增长数:200

Docusaurus 是 Faecbook 专门为开源项目开发者提供的一款易于维护的静态网站创建工具,使用 Markdown 即可更新网站。用它即可构建一个自带主页、文档、API、帮助 以及博客页面的静态网站。

GitHub 地址→https://github.com/facebook/docusaurus

本周 GitHub Trending #刷 LeetCode#主题的主力军

别的大厂笔者不了解,对于新晋 BAT 的字节跳动而言,大家对它的面试评价关键词一定有:算法,而 LeetCode 是每位程序员自测算法的最佳方式,为此笔者选了 GitHub 上 3 个有代表性的项目,仅供你观摩。

3.1 LeetCode GitHub 首席:LeetCode本周 star 增长数:750

超 30 k 的 star 坐实 LeetCode 在 GitHub 的首席代表的身份,Repo 分为五个部分:

第一个部分是 leetcode 经典题目的解析,包括思路,关键点和具体的代码实现。

第二部分是对于数据结构与算法的总结。

第三部分是 anki 卡片, 将 leetcode 题目按照一定的方式记录在 anki 中,方便大家记忆。

第四部分是每日一题,每日一题是在交流群(包括微信和 qq)里进行的一种活动,大家一起解一道题,这样讨论问题更加集中,会得到更多的反馈。而这些题目可以被记录下来,日后会进行筛选添加到仓库的题解模块。

第五部分是计划, 这里会记录将来要加入到以上三个部分内容。

GitHub 地址→https://github.com/azl397985856/leetcode

3.2 动起来:LeetCodeAnimation本周 star 增长数:350

GitHub 上刷 LeetCode 的 Repo 千千万,为要独推荐 LeetCodeAnimation?有什么方式能比图解、动画更直观了解到整个运行过程的呢?LeetCodeAnimation 用动画的形式呈现解 LeetCode 题目的思路,尤其适合新手刷题使用。

GitHub 地址→https://github.com/MisterBooo/LeetCodeAnimation

3.3 人手把手撕 LeetCode 题目:fucking-algorithm本周 star 增长数:2150

fucking-algorithm 是一个总结 LeetCode 刷题思路和技巧的项目,该项目不是简单地刷题,而是帮你培养解题思维,希望这份小抄能帮你打开升职加薪大门。btw,在上个月该项目获得超 10k 的 star ??

GitHub 地址→https://github.com/labuladong/fucking-algorithm

以上为本周的 GitHub Trending ??如果你 Pick 其他好玩、实用的 GitHub 项目,记得来评论区和我们分享下哟~~

声明:本文为作者投稿,版权归其个人所有。

?写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?| 原力计划?比 TensorFlow Lite 快 15.6 倍!业界首个移动 GPU BNN 加速引擎 PhoneBit 开源?视频 | 你不知道的"开源"60年秘史?GitHub标星10,000 ,Apache项目ShardingSphere的开源之路?阿里技术专家告诉你,如何画出优秀的架构图??加拿大API平台如何做到30%为中国明星项目?创业老兵这样说……

玩车什么最重要?花小钱保命的装备你要了解下|摩娱粉

新晋级的摩托车爱好者在跨上摩托车之前,一定要有一顶舒适安全的头盔。对于我们这些喜爱玩车的人来说,安全永远都应该是第一位的,其中承担绝大部分防护功能的基础护具就是头盔。头盔不仅是骑士的第二张脸,还是最重要的保命神器。可市面上的头盔种类和品牌繁多,让很多朋友无从下手,陷入两难的抉择,下面《摩娱粉》就介绍几款好盔分享给大家。

6D ATS-1

749.95美元折合人民币5139元

几十年来,头盔的构造基本相同,大多采用聚苯乙烯外壳,在碰撞时吸收撞击力,起到保护头部的效果。但随着安全科技的发展,头盔也在进化。美国6D公司的ATS-1头盔采用ODS(全方位悬架)技术,在冲击过程中减少冲击力传递到头部,缓冲能力远远超过传统头盔。

缓冲器镶嵌在两个EPS衬垫之间

ATS-1外壳采用3K碳纤维材质,一般碳纤维头盔的重量在1360g左右,而ATS-1重量却是1780g,从数据上看略重了一些,但由于它优秀的空气动力学设计,让骑士在骑行时并没有沉重的感觉。

在舒适性方面,ATS-1也做得不错,提供了多种尺寸的衬垫选择,让不同脸型的骑士都能舒适地佩戴。

AGV Corsa R

799.95美元折合人民币5462元起

意大利AGV头盔对于喜爱摩托车的朋友来说已经非常熟悉了,旗下的K3、K4更是大多数摩友的选择。但这款Corsa R是一顶接近赛车级别的头盔,它采用了碳纤维设计重量很轻,配有可拆卸的护鼻板和导流板,集成了通风系统(IVS)。

Corsa R还配有两种面料的内衬,可以调节并能翻转,面镜达到5毫米厚,带有防雾镜片插件,以及极宽的视野。相比专业级的Pista R,它保留大部分功能,但售价仅为799.95美元起(折合人民币5445元)。

AGV SportModular

749.95美元折合人民币 5139元

对于全盔来讲,笔者更喜欢揭面盔,主要是因为日常骑行时它能提供很好的便利性,但在安全性和重量上一般都要逊于全盔。

这款AGV的SportModular头盔采用全碳纤维制成,重量仅为1295(±50)克。而且官方宣称这款揭面盔与Pista R MotoGP头盔有着相同的安全标准,同时经过风洞测试,让SportModular空气动力学达到很好的效果,风噪也更低。

头盔颈部边缘的造型设计,还能有效防止雨水流入颈部,是一款非常适合摩旅的头盔。

Arai Corsair-X

849.95美元折合人民币5824元起

日本Arai头盔在安全方面一直享有很好的声誉,其中的Corsair-X更是它的旗舰产品,它被许多MotoGP和WSBK车手选为自己的赛事用盔。从安全标准来看,Arai旗下所有盔型,都符合内部的安全标准,并且超过了DOT和Sell标准。以R75为例,每款Arai头盔都至少有75mm的连续曲线半径。根据Arai的官方解释,这样的造型能让意外发生时的撞击能量得到很好抵消,同时减少翻滚时被尖锐物体或是障碍物阻挡的可能性。而且其通风效果很好,能让骑士在长时间骑行时,依旧保持凉爽,有助于提高注意力。

BELL Pro Star Flex

1199.95美元折合人民币8222元

Pro Star Flex作为Bell的旗舰产品,是Bell旗下最轻,最先进的头盔,Pro Star Flex采用了由Textreme加强的碳纤维外壳,相比普通碳纤维材质更轻,更薄,使全盔的重量控制在1500克。

Flex采用三种不同密度的材料层(EPO,EPP和EPS)来保护头部,通过这个设计还可以让衬垫之间有5mm的滑动范围,尽可能的减少头部受到的冲击力。

而且还有磁性颊垫、Virus CoolJade衬垫及合理的风道设计,这些都有助于提升头盔的舒适性和安全性。

Flex的面镜提供了非常大的视野范围,在骑行时能让你观察到更多的路面情况。

BELL SRT-M

349.95美元折合人民币2398元

这款头盔是Bell最新上市的揭面盔,价格较上一款Pro Star Flex亲民许多,虽然各项指标逊于Pro Star Flex但满足日常骑行完全没有问题。它在空气动力学上很完善,达到很好通风及导流效果。并且,为戴眼镜的朋友设计了眼睛通道,让戴眼镜不再是一件痛苦的事 。

在头盔内部预留了扬声器的位置,兼容市面大多数的蓝牙耳机。

通风口打开时,风噪也没有增加太多,而且戴着手套也能轻松操作通风开关。

HJC RPHA 11 Pro

399.99美元折合人民币2740元起

HJC凭借其优秀的性价比和稳定的质量,在国内有着很高的知名度。但不要以为它只有这种中低端产品,旗下的RPHA系列就代表了它的顶级产品,而其中的RPHA 11 Pro是HJC设计的赛车级全盔。它由复合材料制成,是一款非常舒适的头盔,具有出色的空气动力学和通风性。最主要的是RPHA 11 Pro拥有赛车级品质,但价格更便宜。

SHOEI RF1200

485.99美元折合人民币3330元起

SHOEI是日本除了Arai之外的另一头盔巨头,它的名字对于摩友来讲就代表了舒适安全。新推出的RF1200与之前的RF1100相比,拥有更小巧的外形和更好的空气动力学。RF1200设计的双层ESP内衬由玻璃纤维与有机树脂纤维的六层结构组成,拥有不同密度,同时冷空气能顺畅的通过内置通道。

紧急快速释放系统(EQRS),可以让医护人员快速安全地取下受伤骑士的头盔,而不会伤到骑士。

3D MAX-DRY内部系统II,完全可拆卸,衬里材料吸收和消散汗液的速度是传统尼龙的两倍多,面部颊垫有多种尺寸可提高舒适度和头盔稳定性。

SHOEI Neotec II

699.99美元折合人民币4796元起

SHOEI Neotec II揭面盔在原有基础上进行了升级,使它在空气动力学上获得了更好的效果。

面罩配备专为NEOTEC II设计的CNS-3。有着高气密性和经久耐用的特点,有效防止风和水的渗透。并且镜片采用Shield光学设计,可优化每个部件的曲率。当放下面镜时,PINLOCK?EVO镜片实现了清晰的可视性。

加大的面罩开关更方便骑士操作。重新设计的风道,加大通风效果的同时,还有效减小了风噪。这在高速行驶时,能对听力有一定保护。

SHOEI X-Fourteen

681.99美元折合人民币4673元起

Shoei的X-Fourteen(X-14)是MotoGP车手马奎斯选择的头盔,X-14是目前为止X系列中空气动力学最优秀的型号。具有可拆卸和可更换的导流板,以满足对特定赛道的需求。六个进气口与六个排气口串联工作,可实现出色的通风效果,而且在脸颊也有均匀的通风道。

X-14特殊设计的旋转内衬,通过调整头盔后部和底部的两个定位按扣,可提供四度左右的视野范围,而这一变化仅需几分钟就能轻松搞定。Shoei也是目前摩友公认最适合亚洲人头型的头盔,在舒适性方面X-14也无可挑剔,不仅有不同尺寸的衬垫选择,就连头盔中心衬垫也有不同厚度的选择。骑士可以根据自己的头型进行选购,达到最佳状态。

TORC

如果您觉得上述头盔太贵了,还可以看看美国TORC品牌。虽然在舒适性、通风性能以及内衬的面料上,无法和那些大牌相比。

但它同样通过了欧洲最全面的ECE安全标准,在安全方面还是很有保障的。最主要的是它的性价比很高,一般花五六百元就可以买到一顶适合自己的盔型。

最后提醒一下,即便您预算有限,但头盔还是要戴的,毕竟没有什么比您聪明的大脑更重要了。还有,不管您的头盔有多贵多好,它也只有5年的保质期。过期的头盔在防护性能上会大打折扣, 所以过期的头盔就不要戴了。

萝卜开会

您觉得为自己的安全买头盔花多少钱合适呢?

Ansible如何使用Filter插件转换数据

写在前面

今天和小伙伴分享一些ansible中过滤器

博文内容比较简单

主要介绍的常用过滤器和对应的Demo

使用过滤器如何处理变量

理解不足小伙伴帮忙指正

食用方式:了解Ansible基础语法

「 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波」

Ansible 过滤器

关于Ansible 的过滤器,主要由两部分构成,一部分过滤器通过ansible filter插件提供,包含在 Ansible Engine 中,一部分过滤器通过python模板引擎jinja2提供

在模板引擎中,Ansible 使用 Jinja2 表达式将变量值应用到Playbook和模板。Jinja2 表达式也支持过滤器。过滤器用于修改或处理Playbook或模板中放入的变量的值。关于Jinja2,是基于python的模板引擎,类似Java的Freemarker,在Python Web 中也经常使用,比如Flask常常结合Jinja2 实现前后端不分离的小型Web项目

具体的过滤器列表,小伙伴们可以在下面的路劲看到,当在内网的时候,可以直接查找:

jinja2 : /usr/lib/python3.6/site-packages/jinja2/filters.py

Ansible : /usr/lib/python3.6/site-packages/ansible/plugins/filter/core.py

过滤器具体的说明文档:

jinja2 :https://jinja.palletsprojects.com/en/3.0.x/templates/#builtin-filters

Ansible :https://docs.ansible.com/ansible/2.8/user_guide/playbooks_filters.html

学习之前,简单回顾下 YAML格式数据文件中的变量的定义方式,熟悉小伙伴可以直接跳过

变量类型

YAML 结构或值内容定义了确切的数据类型。类型包括:

字符串(字符序列)

数字(数值)

布尔值

日期(ISO-8601 日历日期)

Null(将变量设置为未定义的变量)

列表或数组(值的有序集合)

字典(键值对的集合)

「字符串」

字符串是一系列字符,是Ansible中的默认数据类型。字符串不需要使用引导或双引号括起:

YAML 格式允许定义多行字符,使用竖线(|)保留换行符,或使用大于运算符(>)来取消换行符,(最后一个换行符还是会存在):

---- name: demo var type hosts: servera tasks: - name: var1 vars: String_var: | liruilong and students string_vars: > liruilong and students debug: msg: "{{ string_var }} ||| {{ string_vars }}"

测试一下

$ ansible-playbook var_type.yamlPLAY [demo var type] *********************************************************************************TASK [var1] ******************************************************************************************ok: [servera] => { "msg": "liruilong nand nstudentsn ||| liruilong and students n"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

「数字」

当变量内容是数字时,YAML 会解析字符串,并生成一个数字值,即 Integer 或 Float 类型。

Integers 包含十进制字符,并且可以选择在前面加上 或 - 符号:

如果数值中包含小数点,则将其解析为 Float:

也可以使用科学记数法表示很大的 Integers 或 Floats:

十六进制数字以 0x 开头,后面仅跟十六进制字符:

如果将数字放在引号中,其将被视为 String:

$ cat var_type.yaml---- name: demo var type hosts: servera tasks: - name: var1 vars: string_var: 2.165 string_vars: 456 debug: msg: "{{ string_var }} ||| {{ string_vars 3 }}"

$ ansible-playbook var_type.yamlPLAY [demo var type] *********************************************************************************TASK [var1] ******************************************************************************************ok: [servera] => { "msg": "2.165 ||| 459"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$

「布尔值」

布尔值包含 yes、no、y、n、on、off、true 或 false 字符串。不区分大小写,但是 Jinja2 文档中建议使用小写来保持一致。

$ cat var_type.yaml---- name: demo var type hosts: servera tasks: - name: var1 vars: string_var: 2.165 string_vars: 456 boo: yes shell: echo "{{ string_var }}" when: boo

$ ansible-playbook var_type.yamlPLAY [demo var type] *********************************************************************************TASK [var1] ******************************************************************************************changed: [servera]PLAY RECAP *******************************************************************************************servera : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$

「日期」

如果字符串符合 ISO-8601 标准,YAML 会将字符串转换为 date 类型的值:

「Null」

特殊的 Null 值将变量声明为 undefined:

$ ansible-playbook var_demo.yamlPLAY [var demo] **************************************************************************************TASK [var1 demo] *************************************************************************************ok: [servera] => { "msg": " n"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$

「列表或数组」

列表(数组)是值的有序集合。列表是数据收集和循环的基本结构。将列表写成以逗号分隔的值序列并用方括号括起,或每行一个元素并加上短划线前缀:可以使用从 0 开始的索引编号来访问列表的特定元素:

$ ansible-playbook var_demo.yamlPLAY [var demo] **************************************************************************************TASK [var1 demo] *************************************************************************************ok: [servera] => { "msg": "v1 ['v1', 'v2', 'v3'] n"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$ cat var_demo.yaml---- name: var demo hosts: servera vars: param: - v1 - v2 - v3 tasks: - name: var1 demo debug: msg: > {{ param.0 }} {{ param }}$

「字典」

字典(映射或散列)是将字符串键链接到值以进行直接访问的结构,键括在方括号中来访问字典中的项:

$ ansible-playbook var_demo.yamlPLAY [var demo] **************************************************************************************TASK [var1 demo] *************************************************************************************ok: [servera] => { "msg": "{'v1': 10, 'v2': 11, 'v3': 12} 10 n"}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$ cat var_demo.yaml---- name: var demo hosts: servera vars: param_dist: v1: 10 v2: 11 v3: 12 tasks: - name: var1 demo debug: msg: > {{ param_dist }} {{ param_dist['v1'] }}$

使用Jinja2过滤器处理数据

应用过滤器,需要在变量名称后面加上竖线字符和要应用的过滤器的名称。某些过滤器可能需要将可选参数或选项放在括号中。可以在一个表达式中串联多个过滤器。

jinja2支持的过滤器:https://jinja.palletsprojects.com/en/3.0.x/templates/#jinja-filters

在这里插入图片描述

看几个demo

使用 Jinja2 过滤器来将首字母进行大写小写转化:

$ ansible servera -m debug -a 'msg={{ "liruilong" | lower}}'servera | SUCCESS => { "msg": "liruilong"}$ ansible servera -m debug -a 'msg={{ "liruilong" | capitalize }}'servera | SUCCESS => { "msg": "Liruilong"}

将变量转换为另一种类型,如转换为 String 类型:

$ ansible servera -m debug -a 'msg={{ "liruilong" | string }}'servera | SUCCESS => { "msg": "liruilong"}

使用unique过滤器来删除重复数据,使用sort过滤器对其进行排序:

$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | unique | sort }}'servera | SUCCESS => { "msg": [ 1, 2, 3, 4, 5, 6 ]}

常用过滤器

「检查变量是否定义」

mandatory:如果变量未定义,则会失败并中止 Ansible Playbook。

$ ansible servera -m debug -a 'msg={{ name | mandatory }}' -e name=liruilongservera | SUCCESS => { "msg": "liruilong"}$ ansible servera -m debug -a 'msg={{ name | mandatory }}'servera | FAILED! => { "msg": "Mandatory variable 'name' not defined."}

可以通过设置未定义变量的处理策略来忽略未定义的变量

$ ansible-config dump | grep -i undeDEFAULT_UNDEFINED_VAR_BEHAVIOR(default) = True$

通过配置文件查看可以看到,可以通过变量的方式,在命令行或者清单文件中定义

$ ansible-config list env: - {name: ANSIBLE_ERROR_ON_UNDEFINED_VARS} ini: - {key: error_on_undefined_vars, section: defaults} name: Jinja2 fail on undefined type: boolean version_added: '1.3'

ansible.cfg

error_on_undefined_vars=false

default:如果变量未定义,或者为null,则过滤器会将其设置为圆括号中指定的值。

$ ansible servera -m debug -a 'msg={{ name | default( "liruilong",True) }}'servera | SUCCESS => { "msg": "liruilong"}

如果括号中的第二个参数为 True ,那么变量的初始值是空字符串或布尔值 False 时,过滤器也会将变量设置为默认值。

$ ansible servera -m debug -a 'msg={{ name | default( "liruilong",True) }}' -e name=''servera | SUCCESS => { "msg": "liruilong"}

default 过滤器也可以取特殊值omit,会导致值在没有初始值时保留为未定义状态。如果变量已具有值,则 omit不会更改值。

$ ansible servera -m debug -a 'msg={{ names | default(omit) }}'servera | SUCCESS => { "msg": "Hello world!"}$ ansible servera -m debug -a 'msg={{ names | default(omit) }}' -e names=liruilongservera | SUCCESS => { "msg": "liruilong"}$

执行数学计算

Jinja2 提供了多个数学过滤器,可以对数字进行运算。

算术运算:某写情况下,可能需要首先使用 int 过滤器将值转换为整数,或使用 float 过滤器将值转换为浮点数。还有其它的可用于数学运算的过滤器:root、log、pow、abs 和 round 等。

$ ansible servera -m debug -a 'msg={{ (12.3 | int) 1 }}'servera | SUCCESS => { "msg": "13"}$ ansible servera -m debug -a 'msg={{ (-12.3 | int) | abs }}'servera | SUCCESS => { "msg": "12"}

操作列表

如果列表中包含数字,可以使用max、min 或 sum来查找所有列表项的最大数、最小数和总和:

$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | max }}'servera | SUCCESS => { "msg": "6"}$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | sum }}'servera | SUCCESS => { "msg": "24"}

「提取列表元素」

通过first、last、length来获取列表信息:

$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | first }}'servera | SUCCESS => { "msg": "2"}$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | last }}'servera | SUCCESS => { "msg": "6"}$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | length }}'servera | SUCCESS => { "msg": "7"}

random 过滤器从列表中返回一个随机元素:

$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | random }}'servera | SUCCESS => { "msg": "1"}

「修改列表元素的顺序」

sort 过滤器按照元素的自然顺序对列表进行排序。

$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | sort }}'servera | SUCCESS => { "msg": [ 1, 2, 3, 3, 4, 5, 6 ]}

reverse过滤器会返回一个顺序与原始顺序相反的列表。

$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | sort | reverse | list }}'servera | SUCCESS => { "msg": [ 6, 5, 4, 3, 3, 2, 1 ]}

shuffle 过滤器返回一个列表,顺序为随机。

$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6] | sort | reverse | shuffle|list }}'servera | SUCCESS => { "msg": [ 3, 2, 4, 5, 6, 1, 3 ]}

「合并列表」

flatten 过滤器以递归方式取输入列表值中的任何内部列表,并将内部值添加到外部列表中:

$ ansible servera -m debug -a 'msg={{ [2,3,4,5,3,1,6,[[7,8],9]] | flatten}}'servera | SUCCESS => { "msg": [ 2, 3, 4, 5, 3, 1, 6, 7, 8, 9 ]}

「以集合形式操作列表」

unique 过滤器确保列表中没有重复元素。

union 并集:过滤器返回一个集合,包含两个集合中的元素。

intersect 交集:过滤器返回一个集合,包含两个集合中共有的元素。

difference 差集:过滤器返回一个集合,包含存在于第一个集合但不存在第二个集合的元素。

依次来看一下

unique 过滤器确保列表中没有重复元素。

$ ansible servera -m debug -a 'msg={{ [2,3,4,3] | unique }}'servera | SUCCESS => { "msg": [ 2, 3, 4 ]}

union 过滤器返回一个集合,包含两个集合中的元素。

$ ansible servera -m debug -a 'msg={{ [2,3,4,3] | union([5]) }}'servera | SUCCESS => { "msg": [ 2, 3, 4, 5 ]}

intersect 过滤器返回一个集合,包含两个集合中共有的元素。

$ ansible servera -m debug -a 'msg={{ [2,3,4,3] | intersect([4]) }}'servera | SUCCESS => { "msg": [ 4 ]}

difference 过滤器返回一个集合,包含存在于第一个集合但不存在第二个集合的元素。

$ ansible servera -m debug -a 'msg={{ [2,3,4,3] | difference([4]) }}'servera | SUCCESS => { "msg": [ 2, 3 ]}

操作字典

与列表不同,字典不会以任何方式进行排序。它们仅仅是键值对的集合。

$ ansible servera -m debug -a 'msg={{ { "name":"liruilong"} }}'servera | SUCCESS => { "msg": { "name": "liruilong" }}

「连接字典」

通过 combine 过滤器连接多个字典:

$ ansible servera -m debug -a 'msg={{ { "name":"liruilong"} | combine( { "age": 27 }) }}' servera | SUCCESS => { "msg": { "age": 27, "name": "liruilong" }}

「重塑字典」

字典可以通过 dict2items 过滤器重塑为列表

$ ansible servera -m debug -a 'msg={{ { "name":"liruilong"} | combine( { "age": 27 })| dict2items }}'servera | SUCCESS => { "msg": [ { "key": "name", "value": "liruilong" }, { "key": "age", "value": 27 } ]}

列表也可通过items2dict过滤器重塑为字典:

$ ansible servera -m debug -a 'msg={{ { "name":"liruilong"} | combine( { "age": 27 })| dict2items | items2dict }}'servera | SUCCESS => { "msg": { "age": 27, "name": "liruilong" }}$

散列、编码和操作字符串

有多个过滤器可用于操作值的文本。可以取各种校验和,创建密码哈希,并将文本和 Base64 编码相互转换。

「散列字符串和密码」

hash 过滤其可以利用提供的哈希算法,返回输入字符串的哈希值:

$ ansible servera -m debug -a 'msg={{ "liruilong" | hash("sha1") }}'servera | SUCCESS => { "msg": "bd588e37a86b3f527f61a70bc1ab65129abe4f2c"}

$ ansible servera -m debug -a 'msg={{ "liruilong" | hash("md5") }}'servera | SUCCESS => { "msg": "5406f230fe5927a6ea9ac57ba6f4c6cf"}$

$ ansible servera -m debug -a 'msg={{ "liruilong" | hash("sha512") }}'servera | SUCCESS => { "msg": "1ca56023dcbce5b9e85ec6caf3bd721a227ee754afb31171970d19256a24bdbafa0c1f5a0ad66cd93c5b86ea2f7ad5e1d1a63aee7edaaa3533dfd71fcfbe5b06"}

使用password_hash过滤器来生成密码哈希:

看下机器上root的密码,

# cat /etc/shadow | grep rootroot:$6$3kq6I94xqKs0Giut$sEWrjkl8QDpCCb3FECMpOGbVKwJFzxOMzeNJIr6LZjNpjwpU.njmf6bz2JPt6D1OocbCU2fOGchWPfUaI2plq1:18025:0:99999:7:::

通过密码串我们可以知道,盐为:3kq6I94xqKs0Giut ,加密类型为:$6(sha512),通过Ansilbe的插件生成

$ ansible servera -m debug -a 'msg={{ "redhat" | password_hash("sha512","3kq6I94xqKs0Giut") }}' servera | SUCCESS => { "msg": "$6$3kq6I94xqKs0Giut$sEWrjkl8QDpCCb3FECMpOGbVKwJFzxOMzeNJIr6LZjNpjwpU.njmf6bz2JPt6D1OocbCU2fOGchWPfUaI2plq1"}

「编码字符串」 可以通过b64encode过滤器将二进制数据转换为 base64,并通过 b64decode 过滤器重新转换为二进制:在将字符串发送到 Shell 之前,为了避免解析或代码注入的问题,最好使用quote过滤器清理字符串,这个没有Demo。

「格式化字符串」

使用lower、upper、或 capitalize过滤器来强制字符串的大小写:

$ ansible servera -m debug -a 'msg={{ "Liruilong" | lower }}'servera | SUCCESS => { "msg": "liruilong"}$ ansible servera -m debug -a 'msg={{ "Liruilong" | upper }}'servera | SUCCESS => { "msg": "LIRUILONG"}$ ansible servera -m debug -a 'msg={{ "liruilong" | capitalize }}'servera | SUCCESS => { "msg": "Liruilong"}

「替换文本」

regex_search过滤器,查找所有出现的子字符串,匹配行中第一个项目,并返回一个列表值。

regex_findall过滤器,查找所有出现的子字符串,匹配行中所有项目,并返回一个列表值。

replace过滤器,换输入字符串中所有出现的子字符串,不支持正则表达式。

regex_replace过滤器,换输入字符串中所有出现的子字符串。

replace 过滤器用于替换字符串:

$ ansible servera -m debug -a 'msg={{ "liruilong" | replace("long","bo") }}'servera | SUCCESS => { "msg": "liruibo"}

通过使用正则表达式和 regex_search 和 regex_replace 过滤器可以进行更加复杂的搜索替换:

$ ansible servera -m debug -a 'msg={{ "liruilong up " | regex_search("up") }}'servera | SUCCESS => { "msg": "up"}$ ansible servera -m debug -a 'msg={{ "liruilong up " | regex_replace("up","and") }}'servera | SUCCESS => { "msg": "liruilong and "}

操作 JSON 数据

Ansible 使用的许多数据结构都采用 JSON 格式。JSON 和 YAML 表示法密切相关,Ansible 数据结构则可作为 JSON 来处理。 from_json和from_yaml过滤器,从已经格式化好的变量读取数据。

格式化数组

$ cat name_list.yamlusers: - name: "liruilong" job: "dev" - name: "sy" job: "ops"$ ansible-playbook json.yamlPLAY [json demo] *************************************************************************************TASK [debug] *****************************************************************************************ok: [servera] => { "msg": [ { "job": "dev", "name": "liruilong" }, { "job": "ops", "name": "sy" } ]}PLAY RECAP *******************************************************************************************servera : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$ cat json.yaml---- name: json demo hosts: servera vars_files: - name_list.yaml tasks: - debug: msg: "{{ users | from_yaml }}"

「JSON 查询」 使用 json_query 过滤器从 Ansible 数据结构中提取信息:

$ cat name_list.yamlusers: - name: "liruilong" job: "dev" - name: "sy" job: "ops"

$ ansible-playbook json.yamlPLAY [json demo] *************************************************************************************TASK [debug] *****************************************************************************************ok: [servera] => { "msg": [ "liruilong", "sy" ]}$ cat json.yaml---- name: json demo hosts: servera vars_files: - name_list.yaml tasks: - debug: msg: "{{ users | json_query('[*].name') }}"

分析和编码数据结构

数据结构使用to_json 和 to_yaml过滤器序列化为 JSON 或 YAML 格式。哈,这个感谢没啥区别,以后再研究下

$ ansible servera -m debug -a 'msg={{ file | to_json }}' -e file='[{"name":"bastion","ip":["172.25.250.254","172.25.252.1"]}]'servera | SUCCESS => { "msg": ""[{"name":"bastion","ip":["172.25.250.254","172.25.252.1"]}]""}$ ansible servera -m debug -a 'msg={{ file | to_yaml }}' -e file='[{"name":"bastion","ip":["172.25.250.254","172.25.252.1"]}]'servera | SUCCESS => { "msg": "'[{"name":"bastion","ip":["172.25.250.254","172.25.252.1"]}]'n"}$

使用 to_nice_json 和 to_nice_yaml 过滤器可以获取人类可读的格式化输出。

quote过滤器,给字符串添加引号,在shell模块内使用。在将字符串发送到shell之前,为了避免解析或代码注入问题,最好使用quote过滤器对字符串进行处理。

$ ansible-playbook quote.yamlPLAY [debug play] *******************************************************************************************************************************************TASK [shell] ************************************************************************************************************************************************changed: [servera]TASK [debug] ************************************************************************************************************************************************ok: [servera] => { "msg": "hellonworld"}TASK [shell] ************************************************************************************************************************************************changed: [servera]TASK [debug] ************************************************************************************************************************************************ok: [servera] => { "msg": "-e "hellonworld""}PLAY RECAP **************************************************************************************************************************************************servera : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0$ cat quote.yaml---- name: debug play hosts: servera vars: st: -e "hellonworld" tasks: - shell: echo {{ st }} register: resout - debug: msg={{ resout.stdout }} - shell: echo {{ st | quote }} register: resout - debug: msg={{ resout.stdout }}$

通过这个Demo我们可以看到,没有使用quote过滤器处理的字符串被当作了命令行参数处理

其他过滤器

basename过滤器,获取一个文件的绝对路径,例如将foo.txt转换为/etc/asdf/foo.txt。

$ ansible servera -m debug -a "msg={{ '/etc/sysconfig/network' | basename }}"servera | SUCCESS => { "msg": "network"}

dirname过滤器,获取一个文件或目录的上级目录。

$ ansible servera -m debug -a "msg={{ '/etc/sysconfig/network' | dirname}}"servera | SUCCESS => { "msg": "/etc/sysconfig"}$

to_uuid过滤器,根据一个字符串生成一个UUID。可以看到这里的UUID和时间没有关系,只和种子有关

$ ansible servera -m debug -a "msg={{ 'liruilong' | to_uuid }}"servera | SUCCESS => { "msg": "1745726b-5a9a-592e-833b-3a2d9b2f0922"}$ ansible servera -m debug -a "msg={{ 'liruilong' | to_uuid }}"servera | SUCCESS => { "msg": "1745726b-5a9a-592e-833b-3a2d9b2f0922"}

comment过滤器,可以实现注释字符串的功能,默认为#注释。

$ ansible servera -m debug -a "msg={{ 'liruilong' | comment }}"servera | SUCCESS => { "msg": "#n# liruilongn#"}

关于过滤器就和小伙伴们分享到这里

博文参考

《Red Hat Ansible Engine 2.8 DO447》

动漫设计专业毕业怎么样可以月入过万?

作为当下比较热门的专业:动漫设计,为何网上就业哀声一片?

网络搜索动漫设计就业,一片倒的在吐槽不好就业,薪资低。这是为什么呢?

这里我们就来分析讲解一下。

动漫设计需要学些什么?

动漫设计的发展方向很多,主要划分在漫画和动画两个类别里进行延伸,不同发展方向需要学习的软件也是不同的。

动漫设计包括前期策划、原画、道具与场景设计、动漫角色设计、二维动画设计、3D道具与场景设计、动漫三维角色制作以及三维动画特效设计等部分。

而动漫设计常用软件有PS、PAINTER、3DMax、MAYA、UVLayout以及Body paint等,尤其是像3DMax、MAYA以及LIGHTWAVE等这些软件的运用范围是非常广的。

PS相信大家都知道主要就是用来处理以像素构成的数字图像,使用众多的编修与绘图工具就可以有效地进行图片编辑了。并且PS的功能是很多并且很强大的,无论是在图像、图形又或者是在文字、视频方面都有涉及。

Body paint其实是数码素描与绘画工具的终极选择,它也是动漫设计中一款非常优秀的仿自然的绘画软件,拥有全面并且很逼真的仿自然画笔。这个软件是专门为渴望追求自由创意及需要数码工具来仿真传统绘画的数码艺术家、插画画家及摄影师而开发的。

3DMax是基于PC系统的三维动画渲染和制作的一款软件,而3DStudioMax与WindowsNT组合的出现大大降低了动漫设计CG制作的门槛,首先开始运用在电脑游戏中的动画制作,然后更进一步开始参与影视片的特效制作。

不过在动漫设计工作中用得最多的软件就是Photoshop、3DMAX、MAYA,所以建议大家在学习动漫设计过程中,一定要熟练掌握Photoshop、3DMAX、MAYA 这三种软件的使用。

有人毕业薪资过万,有人毕业即失业,你们的差距究竟在哪里?

我们先来看看招聘网站对于动漫设计这个专业的招聘要求有哪些:

1、线下培训机构:实操型面对面教学,学费高,地域要求高,通勤时间长,但是学习效果好;

2、网课教学:直播教学 作业点评,学费低,不限地域,可以随时随地上课,直播回放温习,老师点评查缺补漏;

3、自学:耗时长,效率低,见效慢。

就业前景

动画设计其实是一个比较宽泛的职业。能做到多少岁取决于你个人到底有多爱这个行业可以为他牺牲生命还是只是赚钱的工具。如果是赚钱的工具那你这辈子要很累很辛苦了。下面总结下动漫设计到底概括了多少东西!

可以具体到角色的形象设计,道具的外观设计,场景设计,分镜设计等这一类都属于设计类,工资一般都8K起步,需要科班毕业的美术生作为底子平面设计工作为主,偶尔会涉及到三维。

然后是二维动画,除了设计师,动画师就是干苦力的,首席动画师设计出几个关键动作剩下的就是动画师一帧一帧的去完成中间帧。累累工作虽然也需要一定能力的画工,但是工作本身是属于流水线工人性质工资很低,刚入行3K左右一般8K-12K封顶。

如果是三维动漫的话又分了很细的岗位,大致分为模型师、绑定师、动画师、特效师、后期师(灯光渲染合成),通常情况下三维部门以生产线的流水线工人为主,少数组长知道能获得较高收入薪资范围2-20K不等。

另一类主要负责后期环节的擦屁股工作,例如解决材质文理和模型问题。

这类制作人员工资不会很高因为大部分的工作都是由电脑完成的,你只须知道如何操作即可。有一点你的渲染时间占用了你大部分白天工作时间,所以晚上加班也是很平常的一件事,工资大概2-8K。

绑定设置相对来说工资比其他环节要高,因为这个对人的逻辑思维能力综合运用能力要求较高。首先你需要了解人体和生物体的骨骼运行原理和各种机械的运行原理,然后通过软件将这些原理变成动画可以实现的绑定系统,然后你还需要学习骨骼动力学和一些动力学解算的内容,最后你为了提高效率不得不去学习计算机语言用来编写各种插件脚本。入职工资5K左右,学了动力学后可以拿到8K左右,会编程的话可以拿到15-20K。

特效,很多人入行都抱着一腔热血看了很多好莱坞大片之后就说要学特效,但是很多人根本不知道他们面对的是什么。特效大致分了不同的种类:粒子,刚体,柔体,流体。粒子和刚体相对来说是最容易学的,因为生活当中有很多这些例子可以借鉴,例如球的弹跳,碗的破碎,烟花等。难的在后面,柔体的布料解算和毛发解算。水、火、烟的形态颜色等控制,让你不得不去了解物理化学的很多知识。往往导演提出的要求都会让你匪夷所思做一些世界上不存在甚至你没见过的东西。例如黑洞数字模型。

特效的工资也是行业内最高的,但是也是创造能力最强的一个工作,入职6K大部分特效师都是15-20K的工资再高的话国内不太可能。国外的话维塔工作室10万英镑月薪。

动漫设计收入区间投票:

19%都在3~4K这个区间,5K以上的占了34%;

动漫行业的就业率和薪资真的没有网上说的那么差,但是想要高的薪资的话,专业技能是不止于学校内学习到的那些皮毛,自己必须要去学习更多的知识和专业技能,这样才能让自己赢在新的起跑线上!

有不懂的小伙伴可以后台留言小助手咨询哦~