普通视图

发现新文章,点击刷新页面。
今天 — 2024年10月16日首页

迭代幂运算/重幂的介绍与其Python代码实现


数学中的迭代幂运算/重幂是什么?

迭代幂运算(重幂)是数学中的一种运算,涉及到反复进行幂次运算。它是超运算序列的一部分,该序列延伸了加法、乘法和幂运算。在迭代幂运算中,一个数自乘多次,直到达到指定的次数。

一个数a迭代幂的高度n通常表示为:tex_7f275feba9caa33491cc739d97613e41 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,也就是把n写在a的左上角,(也可以记作:a↑↑n)这表示a被迭代n次。

例如:

  • tex_809d19495ee2ad967edb956694773d96 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 (简单恒等式)
  • tex_b2971689df7256a7c315e159e8dceca6 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 (a自乘一次)
  • tex_185fcc3b7fe6daf47068d87ffd22f670 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 (a的幂次为a自乘)
  • tex_a932b7bb96225dc665bbe571f816002a 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,依此类推。

在迭代幂运算的上下文中,tex_b3ef97b6eba2428ee919c02c89d2c9ea 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 通常未定义或没有普遍共识。然而,一些数学惯例建议对于任何 tex_58c6653dfed174ea991f702adfb3e6f4 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 tex_2f1f5ed0eeff6d95cf9b145624dfb6af 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,类似于在幂运算中对任何非零的 tex_58c6653dfed174ea991f702adfb3e6f4 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 tex_5c135adeedf02dca7953a9719fb38fa2 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 的情况。

迭代幂运算示例

让我们评估 tex_a5f6729c6edbc3df5dae3c81efe128b2 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 (读作“2迭代到高度3”):

tex_c3974a6b51c4029486462ba28d7f5c17 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机
tex_38f3272f3cc8a02e84ceed576663756c 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机
因此 tex_a79a23ebbcc28f19e40a7b5604f3e748 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机

迭代幂/重幂运算的通用性质

  • 非交换性:迭代幂运算不是交换的,这意味着 tex_2bb7d37b96ba358da2a2c8024d02fe57 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机
  • 增长速度非常快:迭代幂运算增长非常快。即使是小数也会因为幂运算的快速增长而导致非常大的结果。

迭代幂运算/重幂在基础数学中较少见,但在某些高级数学领域中发挥作用,特别是在涉及极大数的领域,如大数理论和计算机科学中。

用 Python 计算迭代幂运算

以下是两个计算迭代幂运算的Python函数。第一个使用递归,第二个使用迭代。

在两个函数中,我们在开始时添加了对 n = 0 的检查。如果 n 为 0,则函数返回 1,否则继续处理。这种方式使函数能够按照任意数的迭代幂高为0时为1的惯例处理 n=0 的情况。

递归函数计算迭代幂

递归函数:此函数将自己调用,n 的高度递减1,直到达到1,此时返回基数a。这就实现了从上到下构建指数链的效果。

@lru.cache(None)  ## 缓存函数
def tetration_recursive(a, n):
    if n == 0:
        return 1
    if n == 1:
        return a
    return a ** tetration_recursive(a, n - 1)

递归计算迭代幂的函数理论上可以进行尾优化。在尾递归中,递归调用是函数中的最后一个操作,这样某些编译器或解释器可以通过重用相同的堆栈帧来优化调用堆栈的使用。这可以通过消除每个递归调用的额外堆栈帧需求来将空间复杂度降到 O(1)。

然而,当前的递归实现并不是尾递归的,因为递归调用嵌套在一个幂运算中:

return a ** tetration_recursive(a, n - 1)

这里,幂运算依赖于递归调用的结果,所以在完成当前调用之前必须计算出结果,从而阻止了尾递归优化。

迭代函数计算迭代幂

迭代函数:此函数使用 for 循环遍历高度 n,通过在每次迭代中更新幂运算的结果,来从下至上计算结果。

def tetration_iterative(a, n):
    if n == 0:
        return 1
    result = a
    for _ in range(1, n):
        result = a ** result
    return result

迭代幂算法的时间/空间复杂度

Python函数计算迭代幂的时间和空间复杂度取决于其递归或迭代实现。让我们分析两种实现。

递归函数的复杂度

时间复杂度:

  • 每次递归调用都会与之前的调用结果进行一次幂运算。
  • 总共有n-1次递归调用,所以该函数被调用了O(n)次。
  • 然而,像 tex_ad68cb15ab4e6c9d3aa23d421625d67a 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 的幂运算需要 tex_e6c0128be5c7d7501ff5a45664d688da 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 的时间。
  • 因此,对于较大的 n 值,由于幂次的增长,其时间复杂度会呈指数增长。
  • 这导致总的时间复杂度大约为 tex_61a94ff4b35f50421447e762bcc2b21e 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,有n层,这意味着增长速度非常快

空间复杂度:

  • 由于这是一个递归函数,每次调用都需要堆栈空间。
  • 递归的最大深度为 n,所以空间复杂度为 O(n)。
迭代函数的复杂度

时间复杂度:

  • 与递归版本一样,该函数迭代 n – 1 次
  • 每次迭代涉及计算 tex_58c6653dfed174ea991f702adfb3e6f4 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 的幂次,这个结果会呈指数增长。
  • 因此,时间复杂度也成为 tex_61a94ff4b35f50421447e762bcc2b21e 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机 ,有n层,因为每一步都是指数级增长。

空间复杂度:

  • 此迭代版本仅需要少量额外空间用于 result 变量等,因此它的额外空间复杂度为 O(1)。
  • 然而,结果本身可能会变得非常大,如果 a 和 n 很大,可能需要大量内存来存储。

由于反复幂次的快速增长,这两种实现的时间复杂度都非常高,对于较大的值变得不可行。递归版本由于调用堆栈的使用空间复杂度为 O(n),而迭代版本的辅助空间复杂度为 O(1),但仍然需要处理极大数,这可能会间接影响内存使用。

英文:Tetration Operator in Math Simply Explained with Python Algorithms

本文一共 1253 个汉字, 你数一下对不对.
迭代幂运算/重幂的介绍与其Python代码实现. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 迭代幂运算/重幂的介绍与其Python代码实现 Python 学习笔记 数学 数学 程序设计 计算机
The post 迭代幂运算/重幂的介绍与其Python代码实现 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  4. 给孩子零花钱培养孩子正确的金钱观价值观 两个娃已经不知不觉7岁8岁了. 媳妇和我商量一下决定给孩子每人每周5英镑的零花钱(Pocket Money). 这样他们慢慢的就有自己的小积蓄备将来不时之需: 比如朋友聚会生日啥的需要准备礼物. 同时, 我们决定不再给孩子买零食(薯片啥的). 孩子一天好几餐, 晚上睡觉前还得吃零食, 我们就多买了很多水果面包, 健康的食物多吃一些总不是啥坏事. 孩子可以用这些零钱买自己想要的东西, 我们也不再过问. 孩子有自己的决定权. 第一周的时候,...
  5. 拔牙后的注意事项(图, 慎入) Care of Mouth after Extraction 昨天又拔了两颗牙, 初步定在5月4号装牙套. 这是牙医诊所给的术后注意事项: 拔完后需要等3-4小时麻醉失效后才能吃喝. 稍微流点血是很正常的. 但是请不要漱口吐出, 因为这会加速流血. 你只要轻轻的含着口水并咽下即可. 如果一直流血, 请拿着纱布(并不是纸巾)放在拔牙处20分钟. 24小时内请不要运动, 术后几小时内回家静静坐着. 12小时内不要吸烟, 喝酒或者喝热饮, 因为这会让伤口流血....
  6. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  7. ChatGPT-4 使用 Math Wolfram 插件解决数学脑筋急转弯问题 这篇文章, 我们看一个简单的数学问题(脑筋急转弯), 并用 Python 解决它. 我们看一下LLM(大型语言模型): ChatGPT3.5和ChatGPT4. 通过 ChatGPT-Plus 订阅(目前每月 20 美元 + VAT增值税), 我们可以启用...
  8. HPZ800服务器主板太老不支持超过2TB的大硬盘 我家里一直用的是HPZ800服务器, 很吵, 很老, 虽然这台服务器已经有十年之久(我在EBAY上买来用了五年多了), 但是即使放到今天, 这服务器速度依旧很快, 很稳定. 由于服务器用的是ECC较验内存, 所以基本上不重启关机. HPZ800主机有两个硬核CPU – 因特志强 X5650 – 每个CPU是12核....
昨天以前首页

C/C++ 中的内存管理器(堆与栈)


最近面试的时候遇到这个问题。这个问题考你计算机的基本功。

在 C/C++ 中,内存管理是控制程序如何分配和管理其资源的关键方面。C/C++ 程序中的内存通常分为不同的区域:堆栈和堆是最主要的动态和自动内存分配区域。

ACM题解系列之 – 最小堆栈 (Min Stack)

stack C/C++ 中的内存管理器(堆与栈) 学习笔记 技术 程序员 程序设计 编程 计算机 软件工程 面试

Stack 栈

堆栈内存

  • 定义:堆栈内存用于静态(自动)内存分配。它是存储函数参数、本地变量和返回地址的地方。当调用一个函数时,一个新的内存块(称为堆栈帧)会被添加到堆栈的顶部。当函数返回时,该内存会被自动释放。
  • 分配:内存由系统自动管理——在变量超出作用域时自动分配和释放。无需人工干预。
  • 生命周期:受限于函数或代码块的作用域。一旦函数退出,内存将被释放。
  • 大小限制:堆栈的大小通常较小并由系统预定义,意味着大的分配可能导致堆栈溢出。
  • 访问速度:由于其后进先出(LIFO)的结构,堆栈内存访问速度更快。由于内存是连续的且可预测的,它允许快速访问。
  • 使用场景:局部变量、函数调用信息和固定大小的对象(数组、结构体)。

堆内存

  • 定义:堆内存用于动态内存分配,程序员使用 C 中的 malloc()、calloc()、free() 和 C++ 中的 new、delete 手动分配和释放内存。
  • 分配:内存在运行时分配,并且分配的生命周期由程序员手动控制。它可以持续存在,直到显式释放。
  • 生命周期:堆分配的对象的生命周期不受作用域的限制。内存将一直被使用,直到被释放为止。
  • 大小限制:堆通常比堆栈大,但取决于系统资源。不当处理可能导致内存泄漏(忘记释放分配的内存)或碎片化(内存使用效率低)。
  • 访问速度:堆内存的访问速度比堆栈慢,因为分配是分散的,动态分配涉及更多的开销。
  • 使用场景:如链表、等大数据结构,或在运行时确定大小的对象。

堆与栈的主要区别

特征 堆栈
内存大小 通常较小,预定义 通常较大,受系统资源限制
分配 自动,由编译器管理 手动,由程序员管理(使用 new、malloc 等)
释放 自动(函数退出时) 手动(使用 delete、free 等)
生命周期 限于函数/代码块作用域 可以持续,直到显式释放
速度 较快(连续内存) 较慢(分散内存,开销更大)
风险 堆栈溢出(如果超出大小限制) 内存泄漏和碎片化

堆栈分配示例

void function() {
    int x = 10; // 分配在堆栈上
} // x 会自动释放

堆分配示例

void function() {
    int* p = new int; // 分配在堆上
    *p = 10;
    delete p; // 必须手动释放
}

正确管理堆内存在 C/C++ 中非常重要,因为它可能导致与内存相关的错误,如内存泄漏或重复释放。理解堆和堆栈内存之间的差异有助于优化程序的性能和可靠性。

英文:The Memory Manager in C/C++ (Heap vs Stack)

面试经历

面试题

面试技巧

面试其它

本文一共 874 个汉字, 你数一下对不对.
C/C++ 中的内存管理器(堆与栈). (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c C/C++ 中的内存管理器(堆与栈) 学习笔记 技术 程序员 程序设计 编程 计算机 软件工程 面试
The post C/C++ 中的内存管理器(堆与栈) first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. Javascript 中 sleep 函数实现 Javascript 中并没有 built-in 的 sleep 函数支持, 在 async/await/Promise 的支持之前, 我们可以用 busy-waiting 的方式来模拟: 1 2 3...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 《Steem 指南》之 justyy 在线工具与 API 系列 – 同时给多个帐号发送SBD或者STEEM 同时给多个帐号发送SBD或者STEEM STEEMIT 和 BUSY 的前端都有一个内置的钱包工具, 您可以一次给一个帐号发送 SBD 或者 STEEM. 当我们要给很多很多人发送钱的时候, 就显得有些不方便了. 这时候可以用这个在线工具: https://steemyy.com/wallet-tool/ 填写表单 只需要填上你的ID,...
  4. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  5. 拔牙后的注意事项(图, 慎入) Care of Mouth after Extraction 昨天又拔了两颗牙, 初步定在5月4号装牙套. 这是牙医诊所给的术后注意事项: 拔完后需要等3-4小时麻醉失效后才能吃喝. 稍微流点血是很正常的. 但是请不要漱口吐出, 因为这会加速流血. 你只要轻轻的含着口水并咽下即可. 如果一直流血, 请拿着纱布(并不是纸巾)放在拔牙处20分钟. 24小时内请不要运动, 术后几小时内回家静静坐着. 12小时内不要吸烟, 喝酒或者喝热饮, 因为这会让伤口流血....
  6. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  7. 最简单有效的过滤WordPress垃圾评论的方法 当你的Wordpress博客流量大的时候, 不免会收到很多垃圾评论. 本文介绍一种特别简单而且免费的过滤Wordpress垃圾评论的方法. 这种方法不需要你安装任何插件, 也不需要拥有修改Wordpress主题模板函数的能力, 只需要1分钟就可以搞定. 把这个列表拷贝下来 打开 WordPress 的控制面版, 到设置-讨论 拷贝上面的列表到 “评论审核” 或者 “评论黑名单”...
  8. 更改全站的评论名称 坛子给我建议说: 我觉得很有道理,但是别人网站上的留言我改不了, 自己的还是可以先改改的. 于是,我登陆 phpmyadmin (一个网页式的php mysql 管理平台) 然后输入以下命令: update `wp_comments` set `wp_comment_author` = 'JustYY.com...

45 分钟模拟面试(编程、系统设计)+职业发展建议


许多大型科技公司(如 FANG:Facebook/Meta、Apple、Netflix、Google)以及微软等,在发出工作邀请之前,通常会进行多轮面试。这些面试通常包括编程/Coding、系统设计/System Design和行为评估/Behaviour,以考察文化契合度。

我提供 45 分钟的模拟面试,帮助您准备编码和系统设计环节。作为曾在亚马逊(AWS,S3 Object Lambda)担任面试官的我,将通过真实的练习环节为您提供指导。在编码模拟面试中,您将解决一到两个编程问题;而在系统设计模拟面试中,您需要在白板上设计一个可扩展的产品。

此外,我还提供 45 分钟的聊天时间,可以讨论任何话题,包括职业发展和建议。

我目前定价 60 英镑一小时,会员价是 55 英镑,毕竟时间就是金钱。而这也大概和我的时薪差不多。

如果您有兴趣,请点击此处

mocked-interviews 45 分钟模拟面试(编程、系统设计)+职业发展建议 微软 程序员 系统设计 资讯 面试

本人提供模拟面试(编程/系统设计)或/和 职业规划建议

PS:我发现 Buy Me a Coffee 这个创业点子很好,赞赏+集成了网上商店,很是方便,界面也很友好,感兴趣的可以通过这个链接来创建一个专属于你的页面,在为用户创作内容的同时也能很快捷的收到赞赏!

英文:45 Minute Mock Interview (Coding, System Design) + Career Development Advices

system-design-interview 45 分钟模拟面试(编程、系统设计)+职业发展建议 微软 程序员 系统设计 资讯 面试

系统设计面试 System Design Interview

面试经历

面试题

面试技巧

面试其它

软件工程师

本文一共 395 个汉字, 你数一下对不对.
45 分钟模拟面试(编程、系统设计)+职业发展建议. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 45 分钟模拟面试(编程、系统设计)+职业发展建议 微软 程序员 系统设计 资讯 面试
The post 45 分钟模拟面试(编程、系统设计)+职业发展建议 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  4. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  5. 拔牙后的注意事项(图, 慎入) Care of Mouth after Extraction 昨天又拔了两颗牙, 初步定在5月4号装牙套. 这是牙医诊所给的术后注意事项: 拔完后需要等3-4小时麻醉失效后才能吃喝. 稍微流点血是很正常的. 但是请不要漱口吐出, 因为这会加速流血. 你只要轻轻的含着口水并咽下即可. 如果一直流血, 请拿着纱布(并不是纸巾)放在拔牙处20分钟. 24小时内请不要运动, 术后几小时内回家静静坐着. 12小时内不要吸烟, 喝酒或者喝热饮, 因为这会让伤口流血....
  6. 公司给配了台高配DELL笔记本 早上例会结束的时候我顺便说了一句 我的笔记本有点慢, 当时我并不知道我的经理远程用电话也参加会议了(他全程在听), senior staff SE 对着电话说, “peter, you hear that? btw, my disks are...
  7. 老婆的配偶签证被拒 郁闷死了, 601镑签证费打水漂,一去不回!费钱费力. 去年12月份我请了律师拿到了永居.老婆是T1G签证的陪工签 (DEPENDENT VISA) 2016年4月份到期. 然后我就想说得趁早把她的签证转成配偶签(SPOUSE)这样她就可以尽快走五年永居的路线. 今天收到拒签信,原因是我没有提供 有工资进帐的那份银行帐单,我提供了我和我老婆的联名帐户, 但是工资并不是直接打到这个帐单上的.所以就这一点被拒了.完全不给解释,不给补材料的机会.601镑就这样再见了. 英国的签证寄出之后是先由另一个部门先收费, 收完费才正式审理,而且不管结果如何是不退钱的.后悔没让律师弄,也不至于到现在浪费这么多时间和金钱,签证还没过.由于原签证还没到期,所以还不能上述.估计只能等搬完家后年底请律师搞定这事. 真是郁闷, 600镑, 我可以再买一个IPHONE6,或者给我的新买的车换四个轮胎....
  8. 花钱让人换汽车钥匙的电池真是个智商税 今天想不到我这么聪明的人也被人狠狠的收了一把智商税. 今天被收智商税了, 去 Tesco 换车钥匙的电池. . 才发现如此的简单, 那人直接2分钟搞定2个, 然后收了我25英镑. . 服了. . 我还以为很复杂…… 网友说 “1....

C++的 map 当键(Key)不存在的时候会发生什么?


面试流程(例如筛选)的早期阶段,一位 Google 招聘人员曾向我问过这个问题。

在C++中,当你使用std::map访问一个不存在的键时,行为取决于你是如何访问它的。

使用下标操作符 [] 访问时

如果键不存在,std::map 会默认插入一个该键的元素,并为其赋值为类型的默认值。比如,如果 map 的值类型是 int,那么它会插入该键并赋值为 0。

例子:

std::map<int, int> myMap;
int value = myMap[10]; // 如果键10不存在,会插入myMap[10] = 0

使用 at() 方法访问时

如果键不存在,at() 会抛出 std::out_of_range 异常。

例子:

std::map<int, int> myMap;
try {
    int value = myMap.at(10); // 如果键10不存在,会抛出异常
} catch (const std::out_of_range& e) {
    std::cout << "Key not found!" << std::endl;
}

使用 find() 方法

find() 方法不会修改 map,它返回一个迭代器。如果键不存在,它会返回 map.end()。

例子:

std::map<int, int> myMap;
auto it = myMap.find(10);
if (it == myMap.end()) {
    std::cout << "Key not found!" << std::endl;
} else {
    std::cout << "Value: " << it->second << std::endl;
}

C++ std::map 和 std::unordered_map的比较

std::unordered_map 处理不存在的键与 std::map 类似,但有一些差异,主要是因为它们内部的数据结构不同。

map 和 unordered_map 的区别:

  • 顺序:std::map 是有序的(内部实现为平衡树),所以元素会按键的顺序排列。而 std::unordered_map 是无序的,使用哈希表存储元素,因此没有特定的顺序。
  • 性能:std::unordered_map 通常有更快的平均访问时间(由于哈希结构,平均时间复杂度为 O(1)),而 std::map 的访问时间复杂度为 O(log n),因为其内部实现为树结构。然而,如果发生大量哈希冲突,unordered_map 在最坏情况下的时间复杂度可能是 O(n)。

总的来说,std::unordered_map 和 std::map 在处理不存在的键时,对于 []、at() 和 find() 的行为相似,但它们在顺序和性能方面存在差异。

总结

  • 使用 [] 访问时,如果键不存在,map 会插入一个新元素并赋予默认值。
  • 使用 at() 访问时,如果键不存在,会抛出异常。
  • 使用 find() 可以检查键是否存在,而不会修改 map。

英文:C++: Access a Non-existent Key in std::map or std::unordered_map

面试经历

面试题

面试技巧

面试其它

本文一共 473 个汉字, 你数一下对不对.
C++的 map 当键(Key)不存在的时候会发生什么?. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c C++的 map 当键(Key)不存在的时候会发生什么? ACM题解 学习笔记 小技巧 技术 数据结构与算法 程序设计 编程 资讯 软件工程
The post C++的 map 当键(Key)不存在的时候会发生什么? first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 步步高学生电脑上 Basic 编程语言 peek 用法示例 步步高学生电脑 是8位FC机的经典之作.它上面的BASIC有三个版本 1.0, 2.0 和 2.1 2.1 版本有个在线帮助,实际上是 help.cmd 1.0 是用 Esc 键退回到 DOS 的,...
  2. 你给SteemIt中文微信群拖后腿了么? 这年头不缺算法, 就缺数据. 这两天花了很多时间在整API上, 整完之后自己用了一下还觉得真是挺方便的. 今天就突然想看一看自己是否给大家拖后腿了, 于是调用每日中文区微信群排行榜单的API, 刷刷拿着 NodeJs 练手: 1 2 3 4 5 6...
  3. Javascript 中 sleep 函数实现 Javascript 中并没有 built-in 的 sleep 函数支持, 在 async/await/Promise 的支持之前, 我们可以用 busy-waiting 的方式来模拟: 1 2 3...
  4. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  5. 《Steem 指南》之 justyy 在线工具与 API 系列 – 同时给多个帐号发送SBD或者STEEM 同时给多个帐号发送SBD或者STEEM STEEMIT 和 BUSY 的前端都有一个内置的钱包工具, 您可以一次给一个帐号发送 SBD 或者 STEEM. 当我们要给很多很多人发送钱的时候, 就显得有些不方便了. 这时候可以用这个在线工具: https://steemyy.com/wallet-tool/ 填写表单 只需要填上你的ID,...
  6. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  7. 试用 Linkedin (领英) 高级帐号 (Premium) Linkedin (领英) 算是比较靠谱的职业社交网站, 在上面有很多猎头, 很多知名公司的HR 无时无刻在招人. 特别领英在被微软收购之后, 名气就变得大了许多. 领英是免费使用的, 但也有付费用户, 有给猎头的, 也有给想找工作的. 价格并不便宜, 对于想找工作的 Job...
  8. 最简单有效的过滤WordPress垃圾评论的方法 当你的Wordpress博客流量大的时候, 不免会收到很多垃圾评论. 本文介绍一种特别简单而且免费的过滤Wordpress垃圾评论的方法. 这种方法不需要你安装任何插件, 也不需要拥有修改Wordpress主题模板函数的能力, 只需要1分钟就可以搞定. 把这个列表拷贝下来 打开 WordPress 的控制面版, 到设置-讨论 拷贝上面的列表到 “评论审核” 或者 “评论黑名单”...

回溯 = 深度优先搜索(DFS) + 剪枝


回溯 = DFS + 剪枝” 是一个对回溯算法简明且直观的描述。要理解这一点,我们可以先拆解这个等式中的几个关键概念。

深度优先搜索 (DFS)

DFS(Depth-First Search)是一种图或树的遍历算法,它从根节点开始,沿着一个分支深入到尽可能远的节点,直到达到叶子节点或无可拓展的节点,然后回溯到上一个节点继续搜索其他分支。这种搜索策略自然地适合解决需要遍历所有可能状态的问题,如组合、排列问题等。

剪枝/Pruning

剪枝(Pruning)是指在搜索过程中,提前排除不符合条件的分支,以减少计算量。剪枝的主要作用是在搜索的过程中,避免无谓的计算。通过某些条件判断,可以在尚未完全展开某些分支时就停止搜索,从而减少时间复杂度。例如,当我们知道一个分支肯定不会产生有效解时,可以提前终止该分支的搜索过程。

回溯算法/Backtracking

回溯算法可以看作是深度优先搜索DFS的一种特例或具体应用。它采用DFS的思想,在搜索的过程中尝试每一种可能的选择(通常是通过递归实现),并在发现某个选择不符合条件或已经无法产生有效解时,及时回退(即“回溯”),然后继续尝试其他选择。这种“试探—回溯”的过程就构成了回溯算法。

结合三者的理解

DFS 为回溯算法提供了基本的搜索框架,即从起点开始沿着一个分支深入探索;

剪枝 则是在DFS基础上增加的优化步骤,目的是减少无效状态的探索。

因此,“回溯 = DFS + 剪枝” 是对回溯算法的一种总结。它表明回溯算法不仅仅是简单的深度优先搜索,还通过剪枝来提升效率。剪枝使得回溯算法在解决很多问题时比单纯的DFS更加高效,尤其是在解空间很大的情况下,剪枝能够大幅减少计算量,从而使得问题求解变得可行。

例子:Alpha-beta 算法剪枝

Alpha-beta 剪枝可以看作是一种回溯算法,它通过剪枝技术增强了深度优先搜索算法。

alpha-beta-pruning 回溯 = 深度优先搜索(DFS) + 剪枝 ACM题解 程序设计 算法 编程

alpha-beta-pruning

Alpha-beta 剪枝:这是用于减少博弈论中极小极大算法中评估节点数量的一种技术。

回溯算法:Alpha-beta 剪枝确实可以被视为回溯的一种形式,因为它系统地探索潜在解决方案(在本例中为游戏动作)并修剪保证不会影响最终决策的路径。

深度优先搜索 (DFS):Alpha-beta 剪枝通常使用 DFS 对树结构进行操作,在回溯之前深入探索节点。

剪枝技术:Alpha-beta 剪枝的主要特征是“剪枝”部分,其中跳过不可能影响最终决策的树的分支。

英文:Backtracking Algorithm = Depth First Search + Pruning

本文一共 810 个汉字, 你数一下对不对.
回溯 = 深度优先搜索(DFS) + 剪枝. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 回溯 = 深度优先搜索(DFS) + 剪枝 ACM题解 程序设计 算法 编程
The post 回溯 = 深度优先搜索(DFS) + 剪枝 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 软件工程师面试技巧之: 使用哈希表降复杂度 最近在刷题, 倒不是为了找工作, 主要是为了练练脑子, 日子过得太舒服, 人脑不动容易变笨. 程序员应该都了解并能熟悉使用 Hash 哈希表, 哈希表的插入和查找时间复杂度是O(1), 空间复杂度是O(N). 我们来看一道简单的面试题: 给定一个数组,找出相差为2的数对,比如: {1, 3, 5,...
  4. 升级到 Delphi 10 西雅图 公司前不久买了DELPHI XE8 (花了1400多英镑 一套). 并且买一送一, 我选择了 Delphi 2007. 因为D2007是 ANSI版本中最好的WIN32开发利器. 由于当时选了一年的升级服务 所以昨天发布的 Delphi 10 Seattle...
  5. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  6. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  7. Javascript 中 sleep 函数实现 Javascript 中并没有 built-in 的 sleep 函数支持, 在 async/await/Promise 的支持之前, 我们可以用 busy-waiting 的方式来模拟: 1 2 3...
  8. 在英国开车走公交通道 Bus Lane 被罚款的经历 昨天才发现有一封信没有打开, 打开后心凉了一下, 原来是媳妇开车不小心走 Bus Lane (公交通道)被摄像头拍到, 需要交罚款. 走公交通道 Bus Lane可以申诉么? 信上说, 如果有足够的理由, 可以在28天内提交相关的证据来申诉抗议, 会有人来审核, 当然不一定能保证通过....

ECharts实现WordPress评论统计图

作者 老王
2024年8月23日 13:10
之前使用Google Charts在本站创建过统计图,不知是什么原因最近发现各种统计图都不显示,以为是不小心动了某个代码,于是重新修改了一次,问题依旧。想着可能是代码冲突或者GG被qiang的原因。本着有问题必须解决的态度,想到了EChart。

获得最新Apache服务器访问记录的脚本


apache 服务器将访问请求记录在 /var/log/apache2 中,因此我们可以分析这个日志文件来找出最后的几个请求。

下面解析 apache2 服务器日志,并逐行打印请求。它基于 BASH 命令:tail 和 awk

#!/bin/bash 

NUMBER_OF_REQUESTS=50
LOG_FILES_PREFIX=/var/log/apache2/access

tail -n $NUMBER_OF_REQUESTS $LOG_FILES_PREFIX* | awk -F'"' '
    # 确保 IP 地址、请求和用户代理字段存在
    $1 ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ && $2 ~ /^(GET|POST|HEAD|PUT|DELETE|OPTIONS|PATCH)/ && $6 != "" {
        split($1, part1, " ")
        ip = part1[1]
        split($2, request, " ")
        method = request[1]
        path = request[2]
        user_agent = $6
        print ip, path, user_agent
    }
'

示例输出(每行包含 IP 地址、URI/URL 和用户代理字符串):

last-few-access-apache2-logs 获得最新Apache服务器访问记录的脚本 BASH LINUX 程序设计 运维

通过 IP、URL 和用户代理向 Apache2 发送的最后几个请求

有了它,我们可以集成到 BASH 脚本中,当 CPU 平均负载较高时发送电子邮件通知,以帮助我们了解导致峰值的原因。

英文:How to Get the Last Requests to Apache2 Server?

本文一共 198 个汉字, 你数一下对不对.
获得最新Apache服务器访问记录的脚本. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 获得最新Apache服务器访问记录的脚本 BASH LINUX 程序设计 运维
The post 获得最新Apache服务器访问记录的脚本 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 在币圈第一次被骗1355 USDT(1000英镑)的惨痛经历(Wirex) 今天回家,在帮媳妇干活的时候,收到一邮件,手机上打开,以为是来自Wirex的,要我验证手机号,我想也没想,就打开验证了,然后不到2分钟,里面的钱就被转走了。 手机上打开没细看,电脑上打开该邮件 其实很容易发现是诈骗邮件的。因为邮件不是来自于官方,而且我的姓名前是加了一些乱码。一眼假。只不过当时在干活,也没多想,才被骗。 损失1355 USDT(1000多英镑),因为在Wirex上有X-Account,我锁定了XX个大饼,还好锁定了(30天才能解锁),后怕啊,不然全被搞走了,真得上天台了。 X-Account帐号锁定解锁需要30天,骗子马上启动解锁了。但钱还在,我立马联系客服,客服回得也挺快(以前不太重要的邮件就得好几天才回),客服立马把我的帐号锁定了,然后进行调查。 庆幸当初为了高1%的利息锁定币30天,要不然今天估计就全丢了。 Wirex通过手机短信就可以把钱搞走,而且登陆/更改资料都需要SMS验证码,实在是不合理,我要改回我手机号,则需要向骗子手机要验证码。虽然我开通了更为安全2FA二维码验证,但是貌似一个手机SMS验证码就可以关闭。 这个假期本来很完美,结果因这事搞得很不愉快。惨痛的教训,就当学费了。骗子不得好死。 Wirex客服这次回得挺快: I am truly sorry you...
  3. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  4. HPZ800服务器主板太老不支持超过2TB的大硬盘 我家里一直用的是HPZ800服务器, 很吵, 很老, 虽然这台服务器已经有十年之久(我在EBAY上买来用了五年多了), 但是即使放到今天, 这服务器速度依旧很快, 很稳定. 由于服务器用的是ECC较验内存, 所以基本上不重启关机. HPZ800主机有两个硬核CPU – 因特志强 X5650 – 每个CPU是12核....
  5. 英国博士毕业答辩是怎样一个过程? 坛子发了篇 “欧洲博士毕业答辩是怎样一个过程?” 但是英国不太一样, 请听我细细道来. 我是2006年9月开始博士课程的, 当时很不容易 争取到免学费, 第二第三年学费免不免得看研究进度. 确定导师 如果你是中规中矩的进去 一般院里会给你安排个一导, 也可能是你跟着导师, 导师有钱, 这时候有钱给你生活费的就是一导, 一般至少需要2个导师,...
  6. WordPress 最简单的过滤垃圾评论的方法 WordPress 很多垃圾评论都是由程序直接调用访问 wp_comments.php 造成的. 所以我们可以在 functions.php 文件里加入以下代码 新增一个过滤 简单的检查是否是直接调用. 1 2 3 4 5 6...
  7. 穷举算法的应用 – 去除EXCEL文件中的保护 EXCEL 是可以用密码来保护的. 比如 这个EXCEL 就用了密码保护. 打开EXCEL文件 你会注意到 无法编辑 无法查看宏(VBA)的代码. 去除保护很简单 第一步先编辑宏 VBA 把下面的VBA代码拷贝到VBA编辑器里 并按下F5运行 1...
  8. 在LINUX下循环备份的方法 备份是我们常需要做的事, 你可以在服务器上有一个文件夹专门用于存放备份.然后定期删除(可以是一个脚本定期执行),这样就比较麻烦,因为如果你想每次删除比较旧的备份, 你就得对备份进行时间倒序. 其实可以完全利用LINUX下的 date命令来生成想要的文件名用于备份.比如你想保留过去的 24 小时备份,那么,你可以用: 1 2 H=`date +"%H"` ls > backup_$H  #...

小户型的空间利用

作者 xrspook
2024年7月2日 08:23

当年今日

这段迷时间迷上了看淘宝上面的小户型卧室装修视频,那些视频基本上都是动画合成的。

怎么利用只有不到九平方的空间做一个卧室,基本上他们的床都是靠墙的,肯定不会放中间,因为放中间就意味着左边跟右边还有床尾浪费了很多地方。床不能放中间是第一条。这就意味着床起码有两个边是靠墙的,甚至三个边都是封闭的,而第四个边可以这么说,都是悬空的,因为要把房间的空间最大化的利用,有一半以上的方案都是用小二层的方式把床悬在半空,下面是工作区或游戏区。余下的那些方案,床也是被抬高的,在这些方案里,面床被提抬高的就不是1米5以上,而是只是1米或以下,在这种方案里,床底下是很大的柜子,有可能是开个柜门人钻进去把东西塞进去,也有可能是在床底下,做三个大抽屉,人就不用进去了,把抽屉拉出来。那个抽屉没有做轨道,而是用滚轮的方式实现这个拉的操作。床底大抽屉这种方案通常床都是被螺栓把框架固定在墙上,同时在床底下做好多个支撑脚。那些做2层的方案,床通常都只是用螺栓把框架固定在墙上,当然,因为下面也会有各种柜子,所以那些东西也就大概能代替了之前那个方案里面的很多支撑脚。无论哪种方式,都是把床抬高了。还有一些方案,床是不抬高的,床是贴地的,床的下面实际上全部都是柜子,但是要用到这些柜子,你就得把床垫挪开,那是榻榻米式的设置。我觉得这种方式相比于前面两种来说,实用性不算太大,因为真的要拿里面的东西,很麻烦,除非你的床垫很轻薄,如果你是普通的弹簧床垫,要把床垫掀开再拿东西这个操作,会直接让你不想拿东西又或者是不想往里面放东西。

的确这些设计方案可以让很小的房间划分出很多个活动区域,同时储物功能也很强,但关键是如果我要更换清洗床上用品的时候该怎么办呢?如果那只是一个1米或者1米2的床,相对来说还容易一些,如果那是1米8甚至两米宽的床。那个床被悬在空中,要把那个大床垫抬起来,一个人基本上是做不到的。如果是在地上,你还能站在剩余的那一边去进行这些困难的操作,如果床在半空,该怎么办呢?难道做这种设计的人或者使用这种设计的人基本上不会整理那个床垫、床单、床笠之类的东西吗?如果所有东西都恰到好处,在这种小小的空间里面,用床单估计是最合理的,因为起码有三个面被固定下来了。但关键是床单可以,床垫过一段时间可能也得做个翻面吧。那么大的床垫在那么狭小的空间里面做翻面,我感觉那是一个不可能的任务。最离谱的一个设计里,在那不到10平方的小房间里,还要给小孩挖一个水池,让他在那里游泳,与其说游泳不如说是泡澡。在卧室里干这种事情,我感觉过于理想化了。理想很丰满,现实很骨感。水从哪里来?水要往哪里排?如何清洗?利用率高不高,会不会导致很潮湿?漏水了怎么办?这些都是常规操作,还有一些棺材房、马桶房的设置,就更加让人觉得不可思议。当然,这种事情可能在某些地方,比如寸金寸土的香港,并不是不可能的事。

一边看那些东西,我就一边在想,如果我要重新设置我的房间,我可以怎么进一步利用空间呢?

使用 Animator for framer 实现 SVG 动效交付

作者 youngbeom
2024年6月4日 22:51

前言

使用 Animator for framer 实现  SVG 动效交付


在最初一版的公司官网中,很多页面是使用的 UntitledUI 的样式来完成设计,但长期使用起来发现如果是仅仅在产品功能界面中使用该 UI 会是不错的选择,但使用在官网设计上会听到一些反馈,诸如色彩太单调,缺少动态效果等等。

这次版本优化就专门希望针对动效部分能做一个增强。之前的经验中如果涉及到动效的部分,会有很多不同的处理方式,但最终在调研过程中我把关注点放在了SVG动效上面,通过调研发现了一个非常好用的工具,那就是 SVG animator,而且在使用时带来了非常多的好处。

相信这会对设计师交付一些微动效尤其是svg路径动画有一些启发和帮助。

什么是 SVG Animation?


SVGs(scalable vector graphics)是可缩放矢量图形文件的缩写,是一种标准的图形文件类型,一种用于描述二维图形的XML标记语言。因为是矢量文件,所以无论是在多大的尺寸上展示效果都是一样的清晰,保证了图像不受尺寸影响,依然能够是最佳的展示效果。

不同于以像素为单位的位图,svg是基于代码,因此 SVG 动画具有可拓展性,后期更容易修改和调整。

Svg 更好的一点是,他的体积非常的小,对于网页来讲更容易渲染和加载,所以在现代网页设计中被广泛使用。

使用 Figma 将同一个图形导出为3种不同的格式,svg是2kb,而png和jpg分别为8kb、27kb。

使用 Animator for framer 实现  SVG 动效交付

关于 SVG 动画的历史

最早的关于 svg 动画是在上世纪90年代被开发出来,在 2003 年左右一些网页浏览器开始支持 svg 动画。但是直到最近我们还需要使用一些独立的插件或程序才可以浏览 svg 动画。

几乎所有主流的浏览器在 2011 年开始支持 svg 动画,并且在 2018 年发布了 SVG2 之后,我们才慢慢的发现更多强大且易于使用的 svg 动画软件。

使用 HTML 和 Javascript 制作 SVG 动画

从那之后网页中的 svg 动画开始慢慢取代无处不在的 GIF 动画,最近十年 GIF 动画开始慢慢消失,使用 HTML 和 Javascript 制作 SVG 动画开始变得越来越流行。

比较有名的就有苹果的初始化屏幕上展示的 hello 动画。

为什么使用SVG动


SVG 动画的使用给研发或者是设计师带来了不少的好处,目前越来越多的svg动画取代 gif 的一个原因之一是,网站的访问速度已经成为一个决定 Google 排名的重要因素之一。

如果一个网站上有过多的 gif,就会导致网站排名下降。因此,SVG这样轻量、快速、易用的格式开始变得越来越受欢迎。

SVG animator 是如何工作的?


Svg 的工作原理是需要给路径一个清晰的指导,就好比要给一个手里拿着画笔的孩子一个清晰的指引,告诉他起点、终点以及方向,按照这样的指引就可以让 svg 的路径变成一个动态效果。

通过这样的指引就可以清晰的画出直线、曲线、矩形、圆或者任意形状。

因此 SVG 路径有一个明确的起点、终点以及长度。有了这些参数,我们就能指定某个 svg 路径从 A 点到 B 点连贯起来渲染展示的动画。

Framer 的 Animator 组建是由 Benjamin den Boer 开发,用来处理让 SVG 动起来的问题,我们需要在这里点击 Copy Component,之后到 framer 项目中粘贴,再将这个组建于拖拽到项目中的 svg 资源相连接就可以使用,并且在使用过程中使用属性面板配置组建的动画设置,就可以让 svg 动起来。

一些效果

使用 Animator for framer 实现  SVG 动效交付

这个截图是原官网中 hero header section 部分,标题下的蓝色线条是静态的,通过 framer svg animator 重新设计之后的效果变成了 svg 路径动画,实现的效果可以参考下面的动图。

使用 Animator for framer 实现  SVG 动效交付

在设计页面时我们也会常用一些icon,这些 icon 也同样可以使用 svg animation 进行动态化。

使用 Animator for framer 实现  SVG 动效交付

在线预览地址

Tips

  • 如果是通过Figma设计,可以使用 Figma to HTML with framer 插件,将设计稿复制到 framer 中。
  • 使用 animation component 关联 svg 时,svg 不能编组,需要保证 component 关联的是 svg 路径,而不是封装的 group。

相关链接:

项目官网:https://animator.page/

作者个人网站 https://benjamin.design/

官方博客:https://www.framer.com/examples/svg-animation/

怎么样把Chrome插件Manifest版本2更新到3?


Chrome插件版本v2在今年6月份之后就会被淘汰了,早在四年前(2020年12月份版本88),v3就已经被支持,Google给了超过3年的时候让开发者把v2版本迁移到v3。我一直很懒,手头上几个插件都还是v2,挑选了几个用户比较多的改了一下迁移到v3。

手头上有11个Chrome插件,只有一些已经迁移到了v3。

chrome-extensions-v2 怎么样把Chrome插件Manifest版本2更新到3? 程序设计 资讯 软件

手头上有11个Chrome插件,只有一些已经迁移到了v3

将 Chrome 扩展程序的 v2 Manifest 转换为 V3 所需的更改

大部分需要的改动都在 manifest.json

chrome-v2-to-v3-manifest 怎么样把Chrome插件Manifest版本2更新到3? 程序设计 资讯 软件

所需要的改动就是在 manifest.json

manifest.json 是Chrome插件的配置文件:

manifest_version

需要改成3

browser_action

需要重命名为:”action”

web_accessible_resources

版本2:

"web_accessible_resources": [
  		"js/*", 
  		"images/*",
  		"bs/*"
],

版本3:

"web_accessible_resources":  [{
    "resources": ["js/*", "images/*", "bs/*"],
    "extension_ids": ["olpihmabpjpllgmahlgiakkgaccigpfo"]
  }],

background/scripts

版本2:

"background": {
    "scripts": ["js/background.js"]
},  

版本3:

"background": {
    "service_worker": "js/background.js"
},

这只是最基本的改动,当然如果你的插件用到了一些被影响到的API,则需要再按照需要修改,具体请看官方文档:Manifiest v3

比如,最有名的 eval 函数在 v3 Manifest 的浏览器插件中不再被支持(详细文档)。

英文:The Simple Steps to Convert Manifest V2 to V3 for Chrome Extensions

本文一共 304 个汉字, 你数一下对不对.
怎么样把Chrome插件Manifest版本2更新到3?. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 怎么样把Chrome插件Manifest版本2更新到3? 程序设计 资讯 软件
The post 怎么样把Chrome插件Manifest版本2更新到3? first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  2. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  3. 给孩子零花钱培养孩子正确的金钱观价值观 两个娃已经不知不觉7岁8岁了. 媳妇和我商量一下决定给孩子每人每周5英镑的零花钱(Pocket Money). 这样他们慢慢的就有自己的小积蓄备将来不时之需: 比如朋友聚会生日啥的需要准备礼物. 同时, 我们决定不再给孩子买零食(薯片啥的). 孩子一天好几餐, 晚上睡觉前还得吃零食, 我们就多买了很多水果面包, 健康的食物多吃一些总不是啥坏事. 孩子可以用这些零钱买自己想要的东西, 我们也不再过问. 孩子有自己的决定权. 第一周的时候,...
  4. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  5. 新的旅途 – 离别总是伤感的, 离开了一起创业的公司 2周前, 正式离开了一起创业的公司, 这公司是我博士毕业后的第一份正式工作, 待了8年多了, 离别总是伤感的. 我是9月初提的离职, 三个月 Notice Period, 最后的几周交接完工作确实没有什么压力了. 11月30号, 在公司最后一天, 公司有个习惯, 对于 Good...
  6. 公司给配了台高配DELL笔记本 早上例会结束的时候我顺便说了一句 我的笔记本有点慢, 当时我并不知道我的经理远程用电话也参加会议了(他全程在听), senior staff SE 对着电话说, “peter, you hear that? btw, my disks are...
  7. HPZ800服务器主板太老不支持超过2TB的大硬盘 我家里一直用的是HPZ800服务器, 很吵, 很老, 虽然这台服务器已经有十年之久(我在EBAY上买来用了五年多了), 但是即使放到今天, 这服务器速度依旧很快, 很稳定. 由于服务器用的是ECC较验内存, 所以基本上不重启关机. HPZ800主机有两个硬核CPU – 因特志强 X5650 – 每个CPU是12核....
  8. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...

女人钱真好挣之媳妇花了三千块四小时做了一个头发


这次回国,媳妇说要做个头发,因为在英国很少理发店可以烫卷,染发美发都比国内贵多了。她上一次在国内做头发还是十几年前。前几年有一次在英国不知道哪里,三个小时,大概花了100英镑,当时也是觉得就杂草而已(高级的做减法)。

这次在福州世欧广场(Show Park,媳妇说是后来建的,以前都是些老破小),我和媳妇看完电影《草木人生》后就找了一个评分比较高的理发店,然后媳妇就和理发师说要稍微剪一些,并且染发+烫卷。媳妇说不要弄直发,因为她的发量并不是很多(在英国喝的水质硬,容易掉头发)。理发师也说头发发量并不是很多,而且发末分叉,所以末端给稍微剪了修了一下。

理性师有三个价位的:88块,128块和188块,我们就选了个最好的188块,后来聊天才知道给媳妇剪的是店长,98年的(26岁),娃11个月大。

然后就选择染发和烫发,都有好几档,我们就选了一个次贵的,反正全部加起来是3000多块,新人第一次是8.8折(2770元),如果办卡(需要预留20%)的话价格能更便宜到8折。我们反正下一次回国也不太清楚什么时候(不过估计明年还会回来一次),所以就没有办卡。再者办卡也有风险,商家跑路损失了也没理说去。

晚上大概不到7点半进去的,等出来的时候是11点半了,四个小时,媳妇在里面洗头发都洗了三次,店里还给我俩提供了免费的饮料。后来我嫌等着无聊去世欧广场北楼二楼上的美食广场吃了烤窜,喝了酱香拉铁(打卡)和奶茶等,给媳妇也带了些喝的。

世欧广场是晚上10点关门,不过理发店可能得开到一两点,因为女人做次头发可能小半天就过去了(四五个小时起)。我大概9点多过去的时候发现好多小姑娘去做头发,估计这个时间小姑娘有时间。店里理发师都是小男生,其中有一个技师助理是16岁,好像初二读完就辍学来学习工作了。有一技之长挣点钱也很不错。

媳妇弄的是大卷,因为她说小卷(像方便面一样的卷)显老,确实,过年的时候,很多妈妈级别的阿姨都在比谁的头发更卷一些。染的颜色也比较低调,以至于我都感觉不出有啥区别。媳妇的弟弟是学美术的,就一眼看出了区别。而在我看来,四个小时,感觉没啥变化,哎,不过媳妇开心就好。

理发师说,这次做头发至少能保持三四个月除非剪掉,染的颜色如果比较夸张就会掉得比较明显。这次是店长理发师供选择的两三种方案选了一个,媳妇比较懒,平时不怎么爱化妆不太爱打理,所以选择了一个比较适合不折腾的发型,不过店长还是让她每天要稍微整理爱护一下。

媳妇说下次回来就不烫了(她嫌太久了),我说那得染一个我能注意到颜色。

fuzhou-show-park-hair-wife-dye-dressing-1-scaled 女人钱真好挣之媳妇花了三千块四小时做了一个头发 女人 媳妇 生活

店长理发师说,吹头发吹到快干的时候可以把头发卷起来吹。

fuzhou-show-park-hair-wife-dye-dressing-2-scaled 女人钱真好挣之媳妇花了三千块四小时做了一个头发 女人 媳妇 生活

后来又来了一个理性师,三人围观媳妇的头发。

fuzhou-show-park-hair-wife-dye-dressing-3-scaled 女人钱真好挣之媳妇花了三千块四小时做了一个头发 女人 媳妇 生活

7点多的时候,美发店里人不多,店长和媳妇在商量发型设计。

fuzhou-show-park-hair-wife-dye-dressing-4-scaled 女人钱真好挣之媳妇花了三千块四小时做了一个头发 女人 媳妇 生活

店长理发师和技师帮手在给我媳妇弄头发,也不知道这是第几步骤了

fuzhou-show-park-hair-wife-dye-dressing-cost-scaled 女人钱真好挣之媳妇花了三千块四小时做了一个头发 女人 媳妇 生活

男人消费14元,女人消费2770元。

fuzhou-show-park-hair-wife-dye-dressing-new-hair-scaled 女人钱真好挣之媳妇花了三千块四小时做了一个头发 女人 媳妇 生活

第二天起床后 烫的头发就不怎么显卷了

fuzhou-show-park-hair-wife-dye-dressing-new-hair-2-scaled 女人钱真好挣之媳妇花了三千块四小时做了一个头发 女人 媳妇 生活

老婆在福州世欧广场弄的头发,老实说没啥区别,而且感觉有点黄有点干

PS:媳妇的妈妈老是说媳妇的头发太长了,想让她一刀剪短,还好媳妇懂事听话,知道我最热衷于长发(当然还有大长腿),不夸张的说,我见到长发飘飘(越长越好,到屁股的那种)就会很鸡动走不动道哈哈,所以她答应我说弄头发的时候让我在边上监督提建议。

PPS:花了这么多钱,本以为是个换头手术,换个风格换个老婆,结果有点小失望。

女人的钱真是好挣!

2024年回国见闻

2024年3月28号回国,4月12号回英国,在国内玩了两周,北京-福州-厦门。

染发后当时并没觉得有多大区别,不过过了几周就慢慢感觉有点区别了,颜色也慢慢显现出来。头发也是越洗越卷。

2024-05-18-12.10.20 女人钱真好挣之媳妇花了三千块四小时做了一个头发 女人 媳妇 生活

3000 RMB的头发洗过几次后 确实有一点卷,不过也仅此而已

本文一共 1482 个汉字, 你数一下对不对.
女人钱真好挣之媳妇花了三千块四小时做了一个头发. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 女人钱真好挣之媳妇花了三千块四小时做了一个头发 女人 媳妇 生活
The post 女人钱真好挣之媳妇花了三千块四小时做了一个头发 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  4. SteemIt 高级定制微信文章列表 RSS/API/阅读器 v2.0 The Advanced Wechat Group Posts Feed/API/Reader v2.0 Abstract: I have added five parameters to the...
  5. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  6. 在英国带孩子去露营全攻略 之前就做了一些露营的准备工作, 因为大儿子Eric 很兴奋说是要去 Camping Holiday 估计是在 Papa Pig 里看到的. 英国有很多可以露营的地方, 最后面选了一个离家开车1个多小时. 看了评论还不错. 地址为: New Road,...
  7. 公司请的专业摄影师 公司来了新的CEO管理之后,很多事情都不一样了, 特别是一些公司对外形象的事情就特别的在意, 比如公司网站用上SSL.现在公司还有空闲的位置,请速来(钱多人不傻). 一月份出差回LUTON,刚好公司请来摄影师给高层管理照像放网站上的,于是我也凑了凑热闹(但是却还不够资格被放在公司网站上),不过没关系,放这里也差不多. 人到中年, 沧桑感强了些. 更新更新: 同事用他NB的单反给谢菲尔得办公室的人也拍了一组这样的照片.看起来很不错, 很专业,灯光,道具应有尽有.我已经用在了LINKEDIN页面上,立马高大上. 本文一共 230 个汉字, 你数一下对不对. 公司请的专业摄影师. (AMP...
  8. 在英国开车的简单介绍 在英国合法上路需要有: 有效的驾照; MOT 车的年检; 路税 (Road Tax);还有最重要的汽车保险; 四者缺一不可. 千万不要有侥幸心理, 因为警察现在都高科技, 都能扫描车牌就能知道你合不合法. 不合法直接拦下来轻则罚款, 重则扣车上述法庭. 驾照 在英国可以用欧盟的大部分驾照,...

假装是个设计师2——避雷针

作者 王隐
2018年9月3日 23:58

好的设计大同小异,不好的设计各有各的问题。

本文介绍一些网页和文章排版中的常见错误。

展示过程中会给出错误和正确的对比用例图片,错误用例也会进行具体标注,所以文字描述部分会比较少。

多图预警。

一、网页中的排版错误

1.内容未按逻辑分块

使用背景色将网页不同部分分块,更适于读者阅读。

2.标题上下方间隙不同

不同间隙会产生一种错觉:文章内容由标题决定,尽管每篇文章的重要性均等。也会让网站看起来很乱,

等间隙则会让不同标题显得一样重要。

3.padding 过小

图二中间部分的文字没被「撑」起来,读者很难将上部分与其分开。

插多大的空白呢?至少120px吧。

4.图片上放低对比度文字

原因很简单,看不清字。

图片太亮了,上面文字就看不清。

两个办法:

  • 文字的对比度要大过图,比如用黑色字体
  • 图片暗一点,并且把字放在图对比度最低的地方

5.太多样式

样式太多有一个问题——你到底想强调什么?

尽量一个页面用一个大小的字体,一个颜色,最多两套字体,这样看起来比较简洁。

6.颜色块太窄

避免使用窄颜色快来强调你的内容。比如标题已经很大了,这个时候就不要用颜色块了。背景色行不行?不止标题,还有相关的文字。

7.很窄还放放大量文字

没有可读性,因为读的人看时总要换行。

文字又长,又居中,可读性就更低了。

尽量不要在窄区域放很多的字。

8.居中文字过多

居中的文字很少时,显示效果很好,但一旦字多就不行了。

用户很难有效率地阅读,建议你字体设置大些。(24px以上)

如果你真的有很多的文字,弄个折叠显示,比如「点击显示全文」。

标题后带一段短文字,显示效果还不错。

9.文字对背景图片喧宾夺主

文字尽量不要遮挡图片(下图一文字挡了女孩的脸。),这样会看不清图的细节,也会让文字更不好读。

多尝试不同的位置,比如文字居中或竖着放左边。

10.误用字的行高

大标题的字最起码要比其他部分的标题字高。

图一的大标题要比二级标题小,人们会很困惑:二级标题的内容要比一级标题重要吗?

网页整体要有结构性, 从上到下,从大到小。

这有助于帮读者分清重要信息和不重要信息

11.不必要的逻辑切分

全屏图后面接文字,在视觉上给人感觉图前图后应该是两部分。

这个时候在文字和图都加上 padding,那它们看起来就很统一,像一个整体。

12.标题又长又大

大字体适用于短文字,标题要是太长,字体就要小一些,可读性也更高,也能给网页上其他部分留空间。

讲究平衡,网页不只是为了突出标题,还有其他的元素。

13.按钮用边框

透明按钮用边框有意义,彩色按钮别加。

14.颜色太多

太乱,一两个颜色就够了。

15.复杂的导航栏

导航栏目的是「导航」。

不要放没用的信息上去,5到7个足够了。

这个导航栏放的 tab 就太多了。

二、文章中的排版错误

1.不分段

大量篇幅不要写在一段。

经常分段。

多插图,插引用,给读者心里上的缓冲。

公众号现在都恨不得一句一段了。

2.标题上下距离一样

标题上下空出来的距离不要一样,因为标题是对下一部分的启下,即标题属于下部分。

标题上空白要比下空白大两到三倍。

同时,标题下间隔最好和段落间间隔相同,这样给人感觉标题和下部分短路是一个整体。

3.小标题比标题都大

4.间隔不一

图一的作者头像和网页顶栏过近,看起来就像作者属于顶栏部分,而不是下边的文字。

解决方法也是在头像上加 padding。

5.图片说明和图片距离过近

6.小标题(h2,h3)和文字段落过近

段落间隔>小标题与段落间隔,会让人觉得文章整体很松散。

段落间隔<副标题与段落的间隔,看起来好多了。

7.强调的内容离正文太近

关键段,引用,最起码要距离正文75到120px。

还是加 padding。

8.低对比度的内容

如果你想强调你的内容,最起码要讲强调段字体比正文大10到15px,字体也要再深点。

9.字少还用背景色

如果想强调作者信息,可以加 padding,不要用背景色。

也不要在小标题用背景色。

10.全屏图之间有空隙

空隙意义是什么?

11.太多加粗

太多加粗,文章好像断裂了一样,如果通篇都是加粗强调,那加粗的意义也就没有了。

12.太多样式

太多样式很容易分散读者注意力。

13.居中的段落太长

还是可读性不好。

14.标题和图片距离过近

标题和图片距离过近,会让人觉得标题和图片是一部分,其实标题应该是独立的。

设置 padding=60px,再加个副标题吧。

15.滥用斜体

16.居中

图一的标题和副标题都太靠左了。

原文连接:blog-en.tilda.cc

作者:Nikita Obukhov

新标签页助你重新掌控你的收藏夹

作者 折影轻梦
2024年3月5日 08:00

在数字时代,我们的浏览器收藏夹,就如同一个宝库,里面藏着我们曾经因兴趣、工作或学习而保留的无数网站链接。小舒同学,一个浏览器新标签页扩展,帮助您高效地管理这些珍贵的在线资源。通过整洁、直观的界面和强大的功能,通过小舒同学这款强大的浏览器扩展,让您的收藏夹焕发新生。

一键展示管理收藏夹

不需要反复整理和搜索您的主页,小舒同学提供了一种轻松的方法来展示和管理您的收藏夹。通过在新标签页中,将书签以清晰的图形方式呈现,帮助您聚焦真正重要的事情。无论是微软的 Edge、Google 的 Chrome,还是 Mozilla 的 Firefox,都可以实现一步直观整洁地展示管理您的网络财富。

一键展示管理收藏夹

随时随地的同步空间

小舒同学的同步空间可以让您轻松同步收藏夹,通过同步空间功能,不管您是在工作场合的电脑还是在家里的设备,都可以轻松连接,访问您全部的收藏内容。您的内容将被安全地存储与同步,确保您可以在任何时间访问。网络世界的一切都将由您连接统一,不仅能启动哔哩哔哩,更能直接访问您关注的具体内容。

同步空间

网页端

直观且舒适的重组织

小舒同学以流畅和直观的用户体验,帮您重新组织您的在线生活。我们专注于舒适的交互设计,将您的收藏夹以一种对您有意义的方式进行组织。

小舒同学提供各式各样的卡片形式和布局,让您可以完全按照自己的喜好进行自定义。您可以创建个性化的卡片组合,以满足您的独特需求。

重组织

严格隐私保护

小舒同学重视用户的隐私保护,拒绝记录和上传用户数据。在不使用同步空间的情况下,您的收藏夹数据也只在浏览器本地数据中,确保隐私数据的私密性。依托于 Manifest V3,小舒同学严格控制所需权限,保证只加载本地代码,保护用户的安全与私密。

定制个性化新标签页

小舒同学的自由度极高,可以按照用户的喜好进行多种个性化设置。您可以更换壁纸、主题、主题色,甚至可以用自定义 CSS 美化您的标签页。拥有如此高度自定义的新标签页,您的浏览器将成为真正属于您的个性空间。

主题 Fluid

主题 Meteor

主题 Hyper

小舒同学不仅仅是一个简单的收藏夹工具,它改变了我们与网络信息的互动方式,提供了一个更高效、更有组织性的网络生活体验。减少了无谓的折腾,让每一次收藏都变得值得,让每一次浏览都充满发现的喜悦。现在,尝试小舒同学,让您的收藏夹变成您的独特网络资产,发挥它们真正的潜力吧。

闭包与链式设计的使用示例

作者 anran758
2020年12月22日 20:30

最近遇到了个按需请求数据的需求,非常适合用于讲解闭包与链式设计的例子,故来分享一下思路。

大致需求如下: 目前有个 list, list 中每项 item 都是可展开的折叠项。当展开某个折叠项时,需要根据 item 的 code 另外去取 name 的映射。考虑到列表的数据量非常大,且一次性查询过多 code 时,接口的查询效率会明显降低,故采用按需请求映射的方案。

屏蔽与本例无关的属性,瘦身后的 list 数据结构大致如下:

1
2
3
4
5
6
interface DataType {
code: string;
paymentTransaction: string[];
}

type ListType = DataType[];

我们知道大型企业中的数据会比较复杂,比较常见的一种情况是数据中有一个 id 或 code 是用于跟另一个数据项相关联的。学习过数据库的同学很容易就联想到了外键这个概念。

现在我们就要取出这些 code 发送给服务端去查询。考虑到 code 可能会有重复,因此可以将 codes 存入 Set 中,利用 Set 的特性去重。除此之外,为了使 name 映射可以被复用,每次从接口返回的 name 映射将会被缓存起来。若下次再触发事件时有对应的 key,便不再查询。

我们可以将这段逻辑抽离出来作为一个依赖收集的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const mapping = new Map();

function collectionCodes(initCodes?: string[] | Set<string>) {
const codes = new Set<string>(initCodes)

return {
append(code: string) {
if (!mapping.has(code)) {
codes.add(code);
}

return this;
},
empty() {
return !codes.size;
},
value() {
return codes;
},
}
}

collectionCodes 函数是用于收集 codes。它内部利用了闭包的特性将 codes 缓存了起来,并且在添加新的 code 之前会判断 code 在 local 的映射中是否已经存在。append 返回的 this 是经典的链式调用设计,允许多次链式添加。当本次依赖收集结束后,调用 value 方法获取最终的 codes。

可以写一些简单的 mock 数据进行尝试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function handleNameMapping(data: DataType) {
const codes = collectionCodes()
.append(data.code)
.append('code-append-1')
.append('code-append-1')
.append('code-append-2');

data.paymentTransaction.forEach(code => codes.append(code));

if (codes.empty()) {
console.log('can get values from existing mapping.')
return;
}

// 如果请求的数据需要转为数组,可以 Array.from 进行转换
const list = Array.from(codes.value());
console.log('fetch data before, codes --> ', list);

// mock 获取数据后拿到 name mapping 后,存入 mapping 中的行为.
// 注意,Set 类型也可以用 forEach 方法,不一定得转为数组才可以操作
list.forEach(code => mapping.set(code, `random-name-${Math.random()}`))
}

const mockItemData = {
code: 'code-main',
paymentTransaction: [
'code-payment-4',
'code-payment-1',
'code-payment-2',
'code-payment-1',
'code-payment-3',
]
}

handleNameMapping(mockItemData);
// fetch data before, codes --> (7) ["code-main", "code-append-1", "code-append-2", "code-payment-4", "code-payment-1", "code-payment-2", "code-payment-3"]

handleNameMapping(mockItemData);
// can get values from existing mapping.

handleNameMapping 在发起请求前会做 code 收集,若本次收集中没有需要 fetch 的 code,那就避免发送无用的 HTTP 请求,从而达到了优化的目的。

最终示例的 TS 代码如下。若想直接在控制台尝试效果的话,可以通过 ts 官网中的 Playground 编译为可直接运行的 js 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
interface DataType {
code: string;
paymentTransaction: string[];
}

const mapping = new Map();

function collectionCodes(initCodes?: string[] | Set<string>) {
const codes = new Set<string>(initCodes);

return {
append(code: string) {
if (!mapping.has(code)) {
codes.add(code);
}

return this;
},
empty() {
return !codes.size;
},
value() {
return codes;
},
};
}

function handleNameMapping(data: DataType) {
const codes = collectionCodes()
.append(data.code)
.append('code-append-1')
.append('code-append-1')
.append('code-append-2');

data.paymentTransaction.forEach((code) => codes.append(code));

if (codes.empty()) {
console.log('can get values from existing mapping.');
return;
}

// 如果请求的数据需要转为数组,可以 Array.from 进行转换
const list = Array.from(codes.value());
console.log('fetch data before, codes --> ', list);

// mock 获取数据后拿到 name mapping 后,存入 mapping 中的行为.
// 注意,Set 类型也可以用 forEach 方法,不一定得转为数组才可以操作
list.forEach(code => mapping.set(code, `random-name-${Math.random()}`))
}

const mockItemData = {
code: 'code-main',
paymentTransaction: [
'code-payment-4',
'code-payment-1',
'code-payment-2',
'code-payment-1',
'code-payment-3',
],
};

handleNameMapping(mockItemData);
// fetch data before, codes --> (7) ["code-main", "code-append-1", "code-append-2", "code-payment-4", "code-payment-1", "code-payment-2", "code-payment-3"]

handleNameMapping(mockItemData);
// can get values from existing mapping.

本例的分析就到此结束了,虽然在本例中链式调用没有充分展示出自己的优势,但也可以作为一个设计思路用于参考。

漱石枕流(五)

作者 楚书业
2023年5月27日 06:58

5月的阿闽,
有点淘。
一日观尽风雨晴!

站点ico

好了,我不装了。
确实又把站点的ico图标给改了。
当然,改得也不会很显眼,没有特意关注细节的话,自然是瞅不出个子丑寅卯的区别。
再加上我没有传图片的习惯,便是连个新旧对比……亦无了!

twikoo

又把站点评论功能整上!
回归白嫖。
毕竟白嫖一时爽,一直白嫖一直爽~~
代码部署在境外的免费托管平台。

别问为什么,问就是没时间维护服务器(主要是买了闲置,过于浪费)。

金苔鼠

前几天搞了几条金苔鼠,放在古法生态缸里除藻。
新来的总是活跃滴。
这不,没过多久便把龟缸舔的干净多了。
emmm,至少水质明显提升一些。
绿藻啊、油膜啊等等,
干净些许!

青鳉

最近不知是水质原因还是其他,青鳉陆续gg了多条。
于是整了个大的,换大一些的桶搞个小古法缸。
这两天整体尚可,需持续关注!

斗鱼

该是有些许日子没细瞅国斗了,这俩货自从跟草龟做了邻居后,共处得蛮好的,至少龟口下游刃有余!
总是可以在草龟进食时,夺下几粒龟粮度日!
同时,大大小小的火山石提供了不少藏匿的地方,竟发色得有些漂亮!

草龟

扒缸与寸草不生,是避不开的话题。
就问嘴贱不贱。

天气回暖后,俩草龟终于回到了自个的新家。
也不知道是不是换了古法生态的养法还是放阳台的缘故,俩龟居然比去年待在沼泽过滤缸时还要活跃N倍!
当然,缸里的铜钱草、芋等挺水植物……全军覆没!
甚至,已经在扒缸了,底砂什么的一言难尽,随它们去吧!

其实……挺想买黑壳虾来除藻,成群结队煞是壮观!
但忍住了!

使用 Figma token + GitLab 创建设计系统

作者 youngbeom
2022年6月21日 12:06
使用 Figma token + GitLab 创建设计系统

设计系统及其相对应的各种 UI 工具是加速设计和开发过程的绝佳工具。但是在设计系统适应设计和开发环境之间还是会有一些“延迟”或者说“gap”。

因此在设计过程中引入 Design Token (设计令牌)是一个非常好的方法,它可以让我们在设计以及开发过程中更快速的进行设计系统的维护和更改。

这篇文章主要是介绍我们如何在 Figma 中使用 Figma Token这款插件来更便捷的管理我们的设计系统,并且将设计的变化快速的反应在开发环境中。

文章涵盖的内容包括:

  • 什么是 Figma Design Token
  • Design Token有什么好处
  • 如何创建 Figma Token
  • 连接到GitLab/GitHub
  • 使用 Zapier 同步记录到 Slack 群组

1.什么是 Figma Design Tokens?

设计师在设计一个产品的用户界面时,通常都会将一些基础的元素进行设计和复用,比如颜色、字体、边距、阴影等等。那我们是否可以将这些基础的部分都提取出来,生成一个表,产品的开发环境中的代码和 Figma 的设计稿都可以以这个表作为 SSOT(唯一可信源)来进行设计和开发。

使用 Figma token + GitLab 创建设计系统

我们在后续的设计过程中就可以直接修改表中的参数应用于设计和代码,而不是传统的设计师设计样式,开发修改样式代码,最后部署上线这样一套费时费力的流程。

使用 Figma token + GitLab 创建设计系统


使用 Figma token + GitLab 创建设计系统

2.Design Tokens 的好处

以下是我们使用 Figma Token 的一些好处:

  • 加快交付流程
  • 提高开发设计一致性
  • 提升设计流程自动化

使用 DesignToken 不仅可以加速设计到开发交付的过程,还有助于保持设计和开发之间的一致性问题.在设置好 Design Token 之后,我们可以将变更同步到代码仓库中,这将有助于我们将重复的工作进行自动化.帮助我们减少工作当中不必要的时间浪费.

因为我们在设置 Token 时都会讲一些基础的元素进行命名,所以在不管是设计师还是研发在引用时都更加的直观便于理解,对于颜色也不需要记住具体的色值,而是应用我们预先命名好的名字就可以.

在一些原始的设计流程中,设计师会将需求绘制成设计稿,研发同事需要将设计稿开发还原,这个流程是产品设计师和前端研发最头痛的部分,混乱的设计参数或者还原度不佳的开发结果都是经常出现的问题,验收的过程将会非常耗时,但使用 Token 之后,开发摆脱了使用硬代码的方式,根据使用场景输入 Token 名称的前缀就可以快速使用,提高了编程效率,这样一来只要是设计师和研发都能遵守一些基础的规范,就能做到精准还原,双方的工作量都会少很多.

3.如何创建 Figma Token

有非常多的基础组件可以被设置成 Token,但是为了专注于系统的简单和高效,我们往往会将最基础的元素设置为 Token.比如下面的这些:

  • 颜色
  • 透明度
  • 字体
  • 阴影
  • 圆角
  • 间距
  • 动效曲线

为了创建一个 Design Token,我们需要使用到一个 Figma 插件:Figma Tokens

使用 Figma token + GitLab 创建设计系统

通过这款插件我们可以通过设计稿生成一个 JSON 格式的 Design
Token,同样也可以通过引入 JSON 文件来应用设计系统.

在这款插件里,我们可以通过可视化的方式以及编码的方式创建 Toekns,插件中的所有 Tokens 都可以相互引用,下面我们会具体演示如何使用这个插件.

使用 Figma token + GitLab 创建设计系统

以当前使用的 109 版本的插件为例,我需要将设计稿中的一些规范应用到 Tokens 中.

使用 Figma token + GitLab 创建设计系统

使用 Figma token + GitLab 创建设计系统


上图是在产品中间距的应用规范,我们需要将间距作为 Token,需要填写 Token  名称以及描述.在填写一栏时我们可以使用运算方式填写.比如:

"4px": {
      "value": "{spacing.2px} *2",
      "type": "spacing",
      "description": "4px 用于组件内或图标与相关文本之间的间距。"

同理 8px 的 value 可以是 {spacing.4px} *2,这样早我们需要将间距整体变成 2 倍时,只需要将基础的 spacing.2px 乘以 2,就可以应用到所有的间距 Toekn 当中.

设置颜色 Token 时可以在命名时以 UI.Blue.500 这种方式命名,在插件中展示时会自动根据.来分级.

使用 Figma token + GitLab 创建设计系统

通过设置好不同的 tokens 后,我们也可以根据不同的 tokens 组合出不同的 themes,比如 Light/Dark mode. Figma tokens 插件支持一键将文稿中的设计图切换主题.

使用 Figma token + GitLab 创建设计系统

连接到 GitLab

等所有的 Tokens 都设定完成后我们就可以将 Token 导出了,我们可以选择导出到本地,也可以将 Tokens 上传至 GitLab、GitHub 等.

同步至 GitLab 需要我们在 Personal Access Tokens页面中生成一个可供 Figma 插件使用的 Access Token.

使用 Figma token + GitLab 创建设计系统

在填入 Personal Access Token 之后,需要指定一个项目,保存之后我们就可以将我们的 Design Tokens 同步至 GitLab 了,它支持双向同步,用户可以在 Figma 中编辑并 push 到 GitLab,也可以在 GitLab 中编辑完成后在插件中 pull 到 Figma 里.

使用 Figma token + GitLab 创建设计系统

我们可以看到在测试项目中会生成一个 token.json 的文件,里面的内容就是我们在 figma 中设置好的 design tokens.

使用 Figma token + GitLab 创建设计系统

但在实际的使用过程中研发不会直接将该 json 文件直接进行使用,只是将此作为参考以及基准依据使用.比如我们可以看到  GitLab-UI 项目中的  variables.scss 文件的内容.

使用 Figma token + GitLab 创建设计系统

5.使用 Zapier 同步记录到 Slack 群组

最后我们来看一个实际的需求,这个需求是在一个设计师群里偶然看到的.这位设计师问,有没有团队利用 Figma 的 API 实现了类似的功能:设计师在 figma 里修改了关键数值(如 style)并 push 后,团队协作工具(如 slack、飞书)里就能自动收到通知?

这个时候我们就可以使用Zapier,它是一款无代码集成平台,可以与 2000+ 家 SaaS 产品对接,同步数据和执行动作.

使用 Figma token + GitLab 创建设计系统

在上面的需求中,我们只需要在 GitLab 有提交发生时,同步消息到 Slack 群组就可以了.选择 app 和事件后,zapier 会一步步指导我们完成配置.

使用 Figma token + GitLab 创建设计系统

完成所有的配置需要以下步骤:

  • 连接 GitLab
  • 连接 Slack
  • 定制 Zap
  • 测试 Zap
  • 开启 Zap
使用 Figma token + GitLab 创建设计系统

完成所有的设置后,当我们在 Figma 的 Figma token 插件上同步样式至 GitLab 后, Zapier 会自动将提交信息同步至 Slack.我们可以在配置的过程中定制 Slack 的通知内容,它支持非常多的字段可以选择.在 GitLab 中我们也可以针对不同的 Branch 和 tag 进行动作的抓取,这样我们就能充分的将协作完成的更及时高效.

相关链接:
Figma Tokens - Docs
Figma Tokens - Plugin
Component Tokens & Themes Example
Zapier
Slack

❌
❌