国内用户苹果土耳其礼品卡购买全攻略(注册、充值、避坑指南)
之前有写过一篇「国内用户订阅土耳其区 iCloud+ 攻略」,在文中我有提到国内用户可以在oyunfor.co […]
之前有写过一篇「国内用户订阅土耳其区 iCloud+ 攻略」,在文中我有提到国内用户可以在oyunfor.co […]
在 macOS 中,许多应用在启动时会频繁弹出“XX.app 想访问其他App的数据”提示,非常影响使用体验。
今天,我二娃搞了一个网页/网站,他通过 GitHub Pages 完成的,其实不难。几天前,他注册了一个 GitHub 账户(被戏称为全世界最大的“同志网站”——gayhub),取了个 ID,叫做 faceless15748。他说 faceless15 已经被人注册了。
他还自学了 HTML 和 Markdown,并且稍微懂一些 JavaScript 和 CSS。比我十岁时强多了。我十岁的时候,记得的只有在院子里玩泥巴。
我娃自己查文档、搜索,还会用 Copilot,他说以后想和我一样成为软件工程师。我竟然有点小小的感动。
在这个信息化的时代,技术的门槛越来越低。回想起我小时候,接触计算机和编程的机会并不多,学习的资源也十分有限。然而,今天的孩子们拥有无数的学习机会和工具,他们可以通过网络和开源项目实现几乎任何想法。
GitHub Pages 是一个免费的静态网站托管服务,用户可以通过 GitHub 仓库将 HTML、CSS 和 JavaScript 文件上传,并托管成一个网站。这个服务特别适合个人、项目或组织展示,甚至可以直接用来做博客或者作品集。
如何轻松创建并托管你的 GitHub Pages 站点 (无服务器静态应用)
GitHub Pages 的最大优势之一就是无需服务器支持。所有的文件都会被托管在 GitHub 提供的全球 CDN(内容分发网络)上,加载速度非常快,且完全免费。更重要的是,GitHub Pages 完全支持自定义域名,允许你轻松地展示个人创作。
本文一共 550 个汉字, 你数一下对不对.创建一个 GitHub Pages 站点是一个简单的过程,可以免费为你的个人、项目或组织创建网站/博客。按照此指南开始。
使用以下命令克隆仓库到本地机器:
git clone https://github.com/<username>/<repository-name>.git
创建一个 index.html 文件,包含你想要的内容。这里是一个例子:
<!DOCTYPE html> <title>我的 GitHub 页面</title> <h1>欢迎访问我的站点</h1> <p>这是我的第一个 GitHub Pages 站点。</p>
或者,你可以使用 README.md(Markdown)作为首页。
## 我的 Github 页面 ### 欢迎访问我的站点 THis is my first Github Pages site.
将你的更改提交并推送到 GitHub:
git add . git commit -m "Initial commit" git push origin main
要添加主题,请转到 Pages 设置并选择“选择一个主题”。
你还可以上传额外的 HTML、CSS 和 JavaScript 文件以进行进一步的自定义。
GitHub Pages 作为无服务器静态应用运行,因为它们直接向用户提供预构建的静态 HTML、CSS 和 JavaScript 文件,而不依赖后端服务器或运行时动态内容生成。相反,这些文件托管在 GitHub 的全球内容分发网络(CDN)上,确保快速有效的交付。
优点:
缺点:
GitHub Pages 是一个令人赞叹的免费托管网站的工具。只需几步,你就可以为你的项目、作品集或个人使用创建一个站点。通过利用无服务器模型,你可以构建轻量、高效且维护最小的站点。
英文:How to Setup and Create GitHub Pages (Serverless Static Apps)
本文一共 587 个汉字, 你数一下对不对.获取最新区块号(高度)是开发人员在去中心化系统中常见的任务。如果你正在使用 Sui 区块链,并希望通过 Node.js 和 JavaScript 获取最新的区块高度,以下是一个简单的实现方法。
Sui 是一个高性能、可扩展的区块链,以低延迟和创新架构而闻名。与 Sui 的交互需要利用其 API,这些 API 允许开发人员无缝查询区块链数据并与智能合约交互。首先,确保你已在计算机上设置了 Node.js 环境并安装了必要的依赖项。
了解 Sui 区块链:Sui区块链简介
首先,创建一个新的 Node.js 项目。你可以使用以下命令初始化项目:
mkdir sui-block-height cd sui-block-height npm init -y
接下来,安装 Axios 库,它通常用于在Node.js中发起 HTTP 请求。我们将用它从 Sui 区块链 API 获取数据:
npm install axios
现在,创建一个名为 getLatestBlock.js 的文件,并在你喜欢的代码编辑器中打开。在这个脚本中,我们将编写一个函数来获取最新的区块高度。Sui 区块链提供了一个 RPC 端点,允许你查询其状态。这个端点是获取区块数据的关键。
以下是代码:
const axios = require('axios'); // Sui RPC 端点 - 如果使用特定网络,请替换为实际端点 const SUI_RPC_URL = 'https://fullnode.sui.io/v1'; async function getLatestBlockHeight() { try { // 向 Sui RPC 端点发送 POST 请求 const response = await axios.post(SUI_RPC_URL, { jsonrpc: '2.0', id: 1, method: 'sui_getLatestCheckpointSequenceNumber', params: [] }); if (response.data && response.data.result !== undefined) { console.log(`最新区块高度: ${response.data.result}`); return response.data.result; } else { throw new Error('响应结构异常'); } } catch (error) { console.error('获取区块高度失败:', error.message); throw error; } } // 运行函数 getLatestBlockHeight().catch((err) => { console.error('Failed to fetch the block height:', err); });
在运行脚本之前,确保 Sui RPC 端点正确且可访问。示例中提供的 URL 指向 Sui 主网的全节点端点。如果你使用的是测试网或本地实例,请将 SUI_RPC_URL 变量替换为合适的端点。
运行脚本的命令:
node getLatestBlock.js
如果设置正确,你应该在控制台中看到打印的最新区块高度。此函数可以轻松集成到更大的应用程序中,或通过修改 RPC 方法和参数来适应其他区块链数据的获取需求。
实时交互区块链数据是构建去中心化应用程序的关键技能。借助 Sui 区块链强大的 API 和 Node.js 的简单性,你可以快速获取最新区块高度,并将此信息用于各种用途,例如监控网络、更新用户界面或触发应用程序中的特定操作。
随着 Sui 生态系统的发展,及时关注其文档和最佳实践可以确保你的集成高效且可靠。
英文:NodeJs/Javascript Function to Get the Latest Block Number (Height) on the Sui Blockchain
statistics.mode() 函数是 Python 中 statistics 模块的一部分,它返回数据集中出现次数最多的单个值(众数)。与 multimode() 不同,mode() 如果数据集包含多个众数(即多模态数据)或数据为空,则会引发错误。
以下是一些示例来说明 mode() 的行为:
statistics.mode(data)
data: 一个序列(例如 list、tuple),其中的元素是可散列的,用于确定众数。
from statistics import mode data = [1, 2, 2, 3, 4] result = mode(data) print(result) # 输出: 2
from statistics import mode data = ["apple", "banana", "apple", "cherry"] result = mode(data) print(result) # 输出: "apple"
如果有多个众数,mode() 会引发 StatisticsError。
from statistics import mode data = [1, 1, 2, 2, 3] try: result = mode(data) except StatisticsError as e: print(e) # 输出: "no unique mode; found 2 equally common values"
如果数据集中没有值重复,mode() 会引发 StatisticsError。
from statistics import mode data = [1, 2, 3, 4, 5] try: result = mode(data) except StatisticsError as e: print(e) # 输出: "no unique mode; found 5 equally common values"
如果数据集为空,mode() 会引发 StatisticsError。
from statistics import mode data = [] try: result = mode(data) except StatisticsError as e: print(e) # 输出: "no mode for empty data"
在 Python 中,术语 multimode 通常指 statistics.multimode() 函数,这是 Python 3.8 中 statistics 模块的一部分。此函数用于找到数据集中出现次数最多的值(众数)。与 statistics.mode() 不同,后者仅返回单个众数(如果数据集是多模态的会引发错误),而 multimode() 可以处理包含多个众数的多模态数据集。
statistics.multimode(data)
data: 一个序列(例如 list、tuple),其中的元素是可散列的,用于查找众数。
返回输入数据中所有众数的列表。如果没有元素重复,则返回所有唯一值的列表,因为在这种情况下每个值都是众数。
from statistics import multimode data = [1, 2, 2, 3, 4] result = multimode(data) print(result) # 输出: [2]
from statistics import multimode data = [1, 1, 2, 2, 3] result = multimode(data) print(result) # 输出: [1, 2]
from statistics import multimode data = [1, 2, 3, 4, 5] result = multimode(data) print(result) # 输出: [1, 2, 3, 4, 5]
多模态支持:可以处理包含多个同频值的数据集。
优雅地处理唯一数据:如果没有重复值,则返回所有唯一值。
灵活的输入类型:适用于任何可散列对象的序列,包括字符串和元组。
data = ["apple", "banana", "apple", "cherry", "banana", "banana"] result = multimode(data) print(result) # 输出: ['banana']
如果数据集很大,计算众数可能会消耗大量计算资源,因为它需要统计所有元素的出现次数。
特性 | mode() | multimode() |
---|---|---|
返回值 | 单个最频繁的值 | 所有最频繁值的列表 |
多模态数据行为 | 引发 StatisticsError |
返回所有众数 |
空数据集行为 | 引发 StatisticsError |
返回空列表 |
最佳用途 | 适用于期望唯一众数的单模态数据 | 适用于包含多个众数的多模态数据或任意数据 |
如果不确定数据是否包含多个众数或无重复值,multimode() 是更安全的选择。
英文:The mode vs multimode in Python
本文一共 702 个汉字, 你数一下对不对.我一直是自己租用VPS服务器,然后搭建各种服务,比如博客就是Apache2+MySQL数据库。一般来说就是默认参数,没有去管,不过最近发现MySQL的性能参数都很保守,不能发挥整个服务器的性能。
然后我就网上搜索了一下,根据参数配置建议,用ChatGPT写了以下Python和BASH脚本。只需要在需要优化的服务器上,跑一下该脚本,然后就会显示参数配置,然后直接把参数添加到MySQL数据库配置参数文件上: /etc/mysql/mysql.conf.d/mysqld.cnf
然后运行: service mysql restart 重启MySQL服务器。
运行了几周,发现效果很好,博客反应速度也快了很多,这很大原因是根据了内存增加了MySQL缓存大小。
把下面的Python脚本存成 mysql_config.py 然后运行 python3 mysql_config.py
def get_total_ram(): with open('/proc/meminfo', 'r') as f: for line in f: if line.startswith("MemTotal:"): total_ram_kb = int(line.split()[1]) return total_ram_kb * 1024 # 转换为字节(bytes) return 0 # 如果未找到 MemTotal,则返回 0 def calculate_mysql_settings(): # 获取总内存(以字节为单位) total_ram = get_total_ram() # 根据总内存(以字节为单位)计算 MySQL 配置 innodb_buffer_pool_size = int(total_ram * 0.3) # 使用内存的 30% key_buffer_size = min(total_ram * 20 // 100, 512 * 1024 * 1024) # 使用内存的 20%,最大限制为 512MB sort_buffer_size = min(total_ram * 25 // 1000, 4 * 1024 * 1024) # 使用内存的 0.25%,最大限制为 4MB read_rnd_buffer_size = min(total_ram * 625 // 100000, 512 * 1024) # 使用内存的 0.0625%,最大限制为 512KB tmp_table_size = max_heap_table_size = min(total_ram * 5 // 100, 64 * 1024 * 1024) # 使用内存的 5%,最大限制为 64MB join_buffer_size = min(total_ram * 2 // 1000, 4 * 1024 * 1024) # 使用内存的 0.2%,最大限制为 4MB table_open_cache = min(400 + (total_ram // 64), 2000) # 根据内存动态计算,最大限制为 2000 thread_cache_size = min(total_ram * 15 // 1000, 100) # 使用内存的 1.5%,最大限制为 100 innodb_log_buffer_size = min(total_ram * 5 // 100, 16 * 1024 * 1024) # 使用内存的 5%,最大限制为 16MB # 以字节为单位打印配置 print(f"MySQL 配置(基于总内存 {total_ram / (1024 * 1024):.2f} MB):") print("将以下内容添加到 /etc/mysql/mysql.conf.d/mysqld.cnf 的末尾\n") print(f"innodb_buffer_pool_size = {innodb_buffer_pool_size}") print(f"key_buffer_size = {key_buffer_size}") print(f"sort_buffer_size = {sort_buffer_size}") print(f"read_rnd_buffer_size = {read_rnd_buffer_size}") print(f"tmp_table_size = {tmp_table_size}") print(f"max_heap_table_size = {max_heap_table_size}") print(f"join_buffer_size = {join_buffer_size}") print(f"table_open_cache = {table_open_cache}") print(f"thread_cache_size = {thread_cache_size}") print(f"innodb_log_buffer_size = {innodb_log_buffer_size}") # 打印自定义设置 print("expire_logs_days = 3") print("max_binlog_size = 100M") if __name__ == "__main__": calculate_mysql_settings()
会打印出类似以下的配置:
innodb_buffer_pool_size = 626468044 key_buffer_size = 417645363 sort_buffer_size = 4194304 read_rnd_buffer_size = 524288 tmp_table_size = 67108864 max_heap_table_size = 67108864 join_buffer_size = 4176453 table_open_cache = 2000 thread_cache_size = 100 innodb_log_buffer_size = 16777216 expire_logs_days = 3 max_binlog_size = 100M
添加到MySQL的配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf 然后重启数据库即可:service mysql restart
以下是完成同样功能的BASH脚本。
#!/bin/bash # 获取总内存大小(以字节为单位) get_total_ram() { # 从 /proc/meminfo 中提取总内存(以 kB 为单位) total_ram_kb=$(awk '/^MemTotal:/ {print $2}' /proc/meminfo) if [[ -z "$total_ram_kb" ]]; then echo 0 # 如果未找到 MemTotal,则返回 0 else echo $((total_ram_kb * 1024)) # 将 kB 转换为字节 fi } # 根据总内存大小计算 MySQL 配置 calculate_mysql_settings() { # 获取总内存(以字节为单位) total_ram=$(get_total_ram) # 计算 MySQL 配置参数 innodb_buffer_pool_size=$((total_ram * 30 / 100)) # 使用内存的 30% key_buffer_size=$(($((total_ram * 20 / 100)) < $((512 * 1024 * 1024)) ? $((total_ram * 20 / 100)) : $((512 * 1024 * 1024)))) # 使用内存的 20%,最大限制为 512MB sort_buffer_size=$(($((total_ram * 25 / 1000)) < $((4 * 1024 * 1024)) ? $((total_ram * 25 / 1000)) : $((4 * 1024 * 1024)))) # 使用内存的 0.25%,最大限制为 4MB read_rnd_buffer_size=$(($((total_ram * 625 / 100000)) < $((512 * 1024)) ? $((total_ram * 625 / 100000)) : $((512 * 1024)))) # 使用内存的 0.0625%,最大限制为 512KB tmp_table_size=$((total_ram * 5 / 100 < 64 * 1024 * 1024 ? total_ram * 5 / 100 : 64 * 1024 * 1024)) # 使用内存的 5%,最大限制为 64MB max_heap_table_size=$tmp_table_size # 临时表大小等于最大堆表大小 join_buffer_size=$(($((total_ram * 2 / 1000)) < $((4 * 1024 * 1024)) ? $((total_ram * 2 / 1000)) : $((4 * 1024 * 1024)))) # 使用内存的 0.2%,最大限制为 4MB table_open_cache=$(($((400 + total_ram / 64)) < 2000 ? $((400 + total_ram / 64)) : 2000)) # 根据内存动态计算,最大限制为 2000 thread_cache_size=$(($((total_ram * 15 / 1000)) < 100 ? $((total_ram * 15 / 1000)) : 100)) # 使用内存的 1.5%,最大限制为 100 innodb_log_buffer_size=$(($((total_ram * 5 / 100)) < $((16 * 1024 * 1024)) ? $((total_ram * 5 / 100)) : $((16 * 1024 * 1024)))) # 使用内存的 5%,最大限制为 16MB # 打印配置(以字节为单位) echo "MySQL 配置(基于总内存 $((total_ram / (1024 * 1024))) MB):" echo "将以下内容添加到 /etc/mysql/mysql.conf.d/mysqld.cnf 的末尾" echo echo "innodb_buffer_pool_size = $innodb_buffer_pool_size" echo "key_buffer_size = $key_buffer_size" echo "sort_buffer_size = $sort_buffer_size" echo "read_rnd_buffer_size = $read_rnd_buffer_size" echo "tmp_table_size = $tmp_table_size" echo "max_heap_table_size = $max_heap_table_size" echo "join_buffer_size = $join_buffer_size" echo "table_open_cache = $table_open_cache" echo "thread_cache_size = $thread_cache_size" echo "innodb_log_buffer_size = $innodb_log_buffer_size" echo echo "expire_logs_days = 3" # 日志过期天数设置为 3 天 echo "max_binlog_size = 100M" # 最大二进制日志大小设置为 100M } # 主函数调用 calculate_mysql_settings
需要注意的是,我在脚本后面加入了一些我自定义的配置,根据需求自行修改即可。在配置文件里,后面定义的会覆盖前面的,这就是为什么要添加到文件尾的原因。
其中最关键的配置 innodb_buffer_pool_size 我设置为使用当前内存的30%,如果服务器只有数据库/博客这个功能,可以适当的提高比例,比如60%-80%。
英文:Python/Bash Script to Print the Optimized Parameters for MySQL Servers
在系统设计面试中,可用性百分比是软件工程师应该熟悉的基本知识。
在系统可靠性领域(System Availability),99.9% 或 99.99% 之类的可用性百分比是关键的基准。但是这些数字究竟意味着什么?它们又如何转化为实际停机时间(Downtime)?以下介绍了如何计算与不同可用性水平相关的停机时间,并使用示例来说明 99.9%、99.99% 和其他可用性目标所带来的预期。
可用性百分比表示系统在给定时间段(通常是一年、一月或一天)内预计正常运行的时间比例。例如,99.9% 的可用性意味着系统在指定期间内可以停机 0.1% 的时间。
以下是根据不同时间段的可用性百分比计算停机时间的方法:
停机时间 = 总时间周期 × (1 – 可用性百分比)
对于具有更高可用性目标的系统,如 99.99% 或 99.999%,允许的停机时间会变得更短。以下是总结不同可用性水平停机时间的表格:
可用性 | 年度停机时间 | 月度停机时间 | 每日停机时间 |
---|---|---|---|
99.9%(三个 9) | 约 8 小时 45 分钟 | 约 43.2 分钟 | 约 1.44 分钟 |
99.99%(四个 9) | 约 52.6 分钟 | 约 4.4 分钟 | 约 8.6 秒 |
99.999%(五个 9) | 约 5.3 分钟 | 约 26 秒 | 约 0.86 秒 |
99.9999%(六个 9) | 约 31.5 秒 | 约 2.6 秒 | 约 86 毫秒 |
具有高可用性目标的系统对于那些停机会直接影响收入、客户满意度或安全的行业至关重要。实现这些目标需要精心设计,包括负载均衡、冗余、故障转移机制,有时还需要资源的地理分布。
可用性百分比提供了表达系统可靠性的一种方便方式,但将其转换为停机时间则可以更清楚地看到面临的风险。使用这些计算来设置现实的可用性目标,并相应地准备您的基础设施。
英文:Understanding Availability Percentages: Calculating Downtime for Your Systems
本文一共 768 个汉字, 你数一下对不对.在 C++ 中,std::future 和 std::async 是 C++11 标准 并发库的一部分。它们允许您异步/Asynchronous运行任务并在稍后获取结果,非常适合编写非阻塞代码和并行化计算。以下是它们的工作原理和典型用法。
std::async 是一个高级函数,允许您异步启动一个任务(一个可调用对象,如函数或 lambda)。您指定要运行的函数,std::async 返回一个表示该 函数结果的 std::future。您可以稍后获取该结果,无论是任务完成时还是您需要时。
#include <iostream> #include <future> #include <chrono> int compute() { std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟工作 return 42; // 计算结果 } int main() { // 异步启动任务 std::future<int> result = std::async(std::launch::async, compute); // 当 compute() 运行时执行其他任务... // 获取 compute() 的结果(如果任务未完成则会等待) int value = result.get(); std::cout << "结果: " << value << std::endl; return 0; }
在此示例中:
如果省略策略,C++ 可能根据实现定义的标准选择其中之一。
std::future 是一个类模板,表示稍后获取的结果。它本质上是一个异步操作结果的占位符。
if (result.wait_for(std::chrono::seconds(1)) == std::future_status::ready) { std::cout << "结果已就绪: " << result.get() << std::endl; } else { std::cout << "仍在等待结果..." << std::endl; }
此代码检查结果是否在 1 秒内就绪。如果没有就绪则继续执行,不 阻塞。
对于更高级的用法,std::promise 允许您手动设置 std::future 的结果。std::promise 对象提供一个 std::future,您可以显式设置结果。
#include <iostream> #include <future> #include <thread> void setPromise(std::promise<int> p) { p.set_value(10); // 设置 promise 的结果 } int main() { std::promise<int> p; std::future<int> f = p.get_future(); // 从 promise 获取 future std::thread t(setPromise, std::move(p)); // 将 promise 传递给线程 t.join(); std::cout << "promise 的结果: " << f.get() << std::endl; // 获取结果 return 0; }
在此例子中,结果 10 是由 std::promise 设置的,std::future 可以通过 f.get() 获取。
使用这些功能,您可以有效地管理 C++ 中的异步任务,更轻松地并行运行计算或将工作分配给其他线程而不阻塞主线程。
英文:Tutorial on C++ Future, Async and Promise
今天通过墨西哥 VPN 注册的用户可免费获得一年Coursera Plus会员,享受7,000多门课程的无限访问。该促销活动有时间限制,只需在注册过程中使用VPN,完成后可正常使用。需注意,在订阅结束前取消以避免收费。
RSS是一种基于XML的内容发布和订阅格式,用于在互联网上分享和同步网站内容。用户可通过RSS阅读器订阅网站的最新内容,从而在一个界面中查看多个网站的更新。尽管其主流性已降低,但RSS仍然在信息自主选择和隐私保护方面展现独特价值,为用户提供高效的信息获取方式。
RSS简单科普最先出现在Justin写字的地方。
Fidder是一款强大的Telegram RSS订阅机器人,让用户可以通过Telegram平台管理和接收更新,无需额外应用程序。只需搜索并添加@FidderBot,用户即可轻松使用指令添加、管理和接收RSS订阅源更新。这种便捷方式让用户可以第一时间获取站点新文章。
OpenAI宣布了适用于 macOS 的 ChatGPT 客户端app正式面向所有用户开放。该应用专为 macOS 系统设计,支持快捷键呼出和多种内容形式的交互。目前仅适用于配备 Apple Silicon(M1 或更高版本)的 macOS 14+,但计划在今年晚些时候登陆 Windows。
FUJISTYLE是专为富士相机用户设计的app,可保存富士色彩配方笔记、识别JPEG原图色彩配方、查看照片EXIF信息等。用户可免费使用基础功能,而Pro会员享有更多专属功能,并有年度或月度订阅选项。app的目标是提升用户拍摄体验并提供额外功能。
假设有这么一段代码, 你的Webpack配置报了下述的错误: 你尝试把改为,很快你会发现无济于事,因为ESM的限制规则在它之上。 其实如果写了(但是他们甚至没把esm导出写进package.json),或者你的工程是传统的cjs工程,亦或是你给每个导入都加了扩展名(虽然好像确实有利于解析速度但是真的会有人写嘛)那么你不会遇到这个问题。在编译期最快的解决方案果然还是用webpack配置,顺带也解决一下的默认导入不是esm的问题: 注意dayjs后的$是必要的,它代表精确匹配,否则之后的两个规则都不会命中。你或许可以试试反着写可不可以。 封面图出处:https://www.pakutaso.com/20200930251post-30704.
BT下载没速度怎么办?有可能是你的资源比较冷门,也有可能是内置的Tracker List不够好用,下载过程中找不到共享用户。 如果你是后者的原因,那么这份Tracker List就可以尝试添加。玻珠亲测下载速度能得到质的提升。 有些下载软件不适用于这个功能:首先就是国内的某吸血雷,为什么说吸血呢?因为光吃别人的下载速度自己不上传。 纠正一下,可以添加了。 有什么推荐的呢?玻珠是用qBittorrent的,但是一定要从官方渠道下载哦,不要被捆绑了。 来源(Source):Torrent Tracker List…