CNKI知网油猴插件-一键导入Endnote&下载PDF
由于知网导出参考文献过于繁琐,故自己编写了油猴插件,一键导入Endnote、一键下载PDF。好用的插件分享给大家。

由于知网导出参考文献过于繁琐,故自己编写了油猴插件,一键导入Endnote、一键下载PDF。好用的插件分享给大家。
word 自带的公式编辑器挺好用,相对 MathType
需要破解、行间距经常出莫名其妙的 bug 而言, word 自带编辑器好用很多。但是,其自带字体为 Cambria Math
,无法调为 Time New Roman
字体。在网上检索发现,可以使用 XITS Math
等方案进行替代。
在像 bash
这样的 Linux shell 环境中,命令前加一个空格可能会影响该命令是否被保存到命令历史中。
这个小技巧在处理敏感数据时非常有用,或者当你不希望某个命令被记录下来时也能派上用场。
这种行为是由一个叫做 HISTCONTROL
的 shell 环境变量控制的。
查看当前设置的方法如下:
echo $HISTCONTROL
例如,你可能会看到:
ignoredups:ignorespace
选项 | 描述 |
---|---|
ignoredups |
防止连续重复的命令被保存到历史中。 |
ignorespace |
防止以空格开头的命令被保存到历史中。 |
ignoreboth |
ignoredups:ignorespace 的简写形式。 |
假设你想导出一个密钥,但又不希望它出现在历史记录中:
export AWS_SECRET_ACCESS_KEY="super-secret"
命令前加的空格(注意前面的空格)可以阻止它被写入 ~/.bash_history
文件(前提是 ignorespace
设置生效)。
HISTCONTROL
包含 ignorespace
时,此行为才生效。ignorespace
,前导空格将没有任何特殊作用。要确保每次打开终端都启用此功能,请在你的 ~/.bashrc
或 ~/.bash_profile
文件中加入如下内容:
export HISTCONTROL=ignoredups:ignorespace
然后刷新 shell 配置:
source ~/.bashrc
在 Linux Shell 中命令前加一个空格,是一个简单却强大的技巧。它能防止敏感或临时命令被记录到历史中。对于开发者、系统管理员,或任何频繁使用终端的人来说,这都是一个非常实用的功能。
英文:Why a Leading Space in Linux Shell Commands Can Matter?
本文一共 438 个汉字, 你数一下对不对.restrict
?restrict
是 C99 引入的指针类型限定符。它告诉编译器,该指针在其生命周期内是访问其所指内存的唯一方式。
这使得编译器可以安全地进行优化,因为它可以假设没有指针别名 —— 即没有其他指针访问相同的内存。
void copy(int *restrict dst, const int *restrict src, size_t n);
restrict
时:void copy(int *dst, const int *src, size_t n);
没有 restrict
,编译器必须假设 dst
和 src
可能指向重叠的内存,限制了优化空间。
restrict
仅在 C99 及以上版本中有效restrict
吗?C++ 并不包含 restrict
这一标准关键字。不过,可以通过其他方式实现类似效果。
大多数主流编译器支持非标准的替代写法,例如:
void foo(int* __restrict__ a, int* __restrict__ b);
__restrict__
__restrict
注意:这些方式不具可移植性。
现代 C++ 鼓励使用更安全、更清晰的方式,如:
std::span
(C++20)明确表达内存范围void add(std::span<int> dst, std::span<const int> src);
虽然这不能从底层强制无别名,但能提高代码意图的清晰度,有助于规避别名相关的问题。
功能 | C语言 | C++ |
---|---|---|
restrict 支持 |
标准(C99+) | 非标准 |
优化收益 | 支持 | 支持(需扩展) |
更安全的替代方案 | 无 | std::span 、引用 |
在 C 中,当你能确保没有内存别名并且关心性能时,应当使用 restrict
。在 C++ 中,优先使用更现代的语义(如引用、std::span
),必要时也可以谨慎使用编译器扩展版本的 __restrict__
。
英文:C vs C++: Understanding the restrict Keyword and its Role in Optimization
本文一共 460 个汉字, 你数一下对不对.本文详细讲诉了用脚本实现定时模拟计算机按键,用于保持系统一直在线的状态。脚本可以使用VBScript、JScript和Powershell。这三种脚本语言都是微软/Microsoft的,不过前两种已经要被淘汰了。
在 Windows 环境下,这三种脚本(PowerShell、VBScript 和 JScript)都通过 CreateObject 来调用 COM 对象 WScript.Shell,以实现模拟按键的功能。例如,可以每隔一分钟模拟按下 Scroll Lock 键一次,从而保持“在线”状态(Keep Alive)。Scroll Lock 键在某些键盘上可能不存在,其作用是切换滚动锁定状态,连续按两次不会对系统造成实际影响。
有时候,你可能想模拟按键(键盘输入),例如为了自动化一些任务,相比查找 API 并写脚本,通过重复按键可能更简单。例如,你想打开任何聊天窗口并输入 “Hello!” 100 次,可以使用 PowerShell 编写一个脚本,它先暂停几秒钟,然后模拟按键。
你可以通过在 Windows 中使用 PowerShell 脚本创建 Wscript.Shell
COM 对象来实现。
$WShell = New-Object -com "Wscript.Shell" $WShell.sendkeys("Hello!")
要重复 100 次,可以在 PowerShell 中使用 FOR 循环:
$WShell = New-Object -com "Wscript.Shell" for (($i = 0), ($j = 0); $i -lt 10; $i++) { $WShell.sendkeys("Hello!") $WShell.sendkeys("{ENTER}") }
要运行一个 PowerShell 脚本,例如 .ps1 文件,你可以在 PowerShell 提示符中输入该脚本的完整路径。PowerShell 提示符也支持逐行输入 PowerShell 语句。
基于这个方法,我们可以每隔一段时间发送 Scroll-Lock 按键,直到脚本被终止。一些键盘甚至没有 Scroll-Lock 键。这个思路是模拟按键,使你的聊天程序(如 Microsoft Teams、Slack、Discord、Google Chat、Telegram 等)认为你仍然在线,从而不会将你的状态设置为 “离开”(AFK)。
$WShell = New-Object -com "Wscript.Shell" while ($true) { $WShell.sendkeys("{SCROLLLOCK}") Start-Sleep -Milliseconds 100 $WShell.sendkeys("{SCROLLLOCK}") Start-Sleep -Seconds 120 }
Microsoft VBScript 简单又方便。以下是 VBScript 版本。你可以将脚本保存为 .vbs 文件并双击运行。或者在命令行中通过 “start.exe send-keys.vbs” 或 “cscript.exe send-keys.vbs” 运行它(假设脚本名为 send-keys.vbs)。
Dim WShell Set WShell = CreateObject("Wscript.Shell") Const ASecond = 1000 Const AMinute = 60000 While True WShell.SendKeys "{SCROLLLOCK}" WScript.Sleep ASecond WShell.SendKeys "{SCROLLLOCK}" WScript.Sleep AMinute Wend
Microsoft JScript 类似于 Javascript,也可以在 Windows 上运行。以下是 JScript 版本,你可以用和 VBS 相同的方法来运行。
// alternatively // var WShell = WScript.CreateObject("Wscript.Shell"); var WShell = new ActiveXObject("Wscript.Shell"); var ASecond = 1000; var AMinute = ASecond * 60; for (;;) { WShell.SendKeys("{SCROLLLOCK}"); WScript.Sleep(ASecond); WShell.SendKeys("{SCROLLLOCK}"); WScript.Sleep(AMinute); }
顺便提一下,JScript 不支持 const 关键字和现代 Javascript 的其他语法特性。
本文展示了如何使用 PowerShell、VBScript 或 JScript 来模拟按键。一种用途就是通过模拟 SCROLLLOCK 按键来让你的聊天软件(如 Slack、Discord、Microsoft Teams、Telegram 等)显示为 “一直在线”。此外,如果你不希望电脑在你离开键盘时进入睡眠状态(尽管可以通过设置来控制),这类脚本也会派上用场。
需要注意的是,由于安全原因,这类脚本(创建 WScript.Shell COM 对象)可能会被公司的安全策略所屏蔽。不过,你仍然可以在 PowerShell 终端中逐行输入命令来绕过限制。
本文一共 723 个汉字, 你数一下对不对.程序员的未来?Vibe Coding + AI 一起上!
最近,我利用 ChatGPT-4o 和 o4-mini 快速开发并开源了三个小工具。起因其实很简单——每次想转换 YAML/JSON 或进行 Base64 编码时,我总是得去 Google 搜索在线工具。时间一久,我不禁开始思考:既然每次都要用,为什么不自己动手实现一个呢?正好我也在学习 React,把这个过程当作练习岂不是一举两得?
于是我开始“扮演”产品经理,向 ChatGPT 提出需求,它很快就为我搭建好了基础框架。包括项目结构、CI 工具(单元测试、ESLint——后来我换成了 Prettier)、README 文档,甚至是 GitHub Actions 上的自动化测试和部署流程,全部一气呵成。
这几个工具都部署在 GitHub Pages 上,开源、带测试、写了文档,虽然小巧,但功能完整,不需要自建服务器就能稳定运行,部署成本几乎为零。
用于在 YAML 和 JSON 格式之间进行双向转换,支持美化和压缩,简单直观。
支持文字和文件的编码解码操作,可以将文件内容直接转换为 Base64 字符串,或者反向解析恢复文件。
这是一个轻量级的字符串混淆工具。ROT47 的特点是“加密两次即为原文”,类似于异或操作,适用于简单场景下的信息模糊处理。
我又弄了一个,这个是把Markdown格式转换成HTML的,转换解释Markdown是基于 marked 库,所以并没有再造轮子。由于HTML转Markdown会比较复杂,这一版本就没有支持。
主要的活都让AI做了(编码/写测试/调CSS),我做的工作就是指导(Prompt Engineering)并把各个零件粘在一起。
AI 的发展速度太快了,现在生成代码的质量不仅更高,出错率也更低。即便出错,只需将报错信息交还给 AI,它就能分析并修正。程序员的角色正在转变:与其说是手工写代码,不如说是理解需求、与 AI 高效沟通,并拼装整合它给出的解决方案。
对我来说,项目最初的搭建一直是拖延的主要原因。ChatGPT 正好擅长这一环节——自动生成 boilerplate,让我几乎能“秒启动”一个新项目,显著提升了开发效率。
我已经养成每天使用 AI 的习惯,甚至已经很少再使用 Google 搜索。遇到问题,第一反应是直接问 ChatGPT,不仅快,还能一步到位解决问题。
Vibe Coding 这个概念今年特别火,核心思想是“用氛围编码”。也就是说,程序员不再执着于每一行代码的细节,而是通过自然语言描述需求,让 AI 来实现代码的生成、重构与调试。
Andrej Karpathy (2025)
TLDR;Vibe 编码是一种新兴的软件构建实践,它用简单的语言描述你想要的内容 – 然后让 AI 处理代码和测试。
TLDR; Vibe coding is the emerging practice of building software by describing what you want in plain language – and letting AI handle the code and test.
我发现自己越来越倾向于这种方式。遇到 bug,第一时间就将错误日志扔给 ChatGPT 处理。虽然效率很高,但也让我逐渐失去了深入思考和调试的乐趣。
现在还有很多支持 Vibe Coding 的工具,比如 Cursor,或者在 VSCode 中配置 AI Agent。你只需告诉它“我要实现什么”,它就能完成代码编写、框架搭建,甚至进行模块拆解和逻辑优化。而你要做的,仅仅是审查和接受它的建议——这不就是产品经理的工作吗?
AI 工具的普及正在重塑编程的边界,传统“照着教程敲代码”的模式已经远远落后。未来,初级程序员面临的挑战不再是“学不会写代码”,而是“不会用 AI”。
想要不被淘汰,最重要的是掌握如何高效地与 AI 协作,提升自己的系统思考与设计能力。AI 是强大的助手,但人类的洞察、判断和创造,依然无可替代。
未来属于那些善于利用工具、不断精进自己思考能力的人。也许“写代码”的定义正在改变,但“解决问题”的本质永远不会变。
AI大大提高了生产力,执行力和创造力会更加重要。软件工程师需要懂得怎么用AI来干活拧螺丝(开发/调试/解决问题)。感觉程序员的门槛瞬间变得好低,只要懂得看懂AI生成的代码,懂得基本的软件工程就可以了。
英文:From Idea to GitHub Pages: Building Tools with AI and Vibe Coding
本文一共 1373 个汉字, 你数一下对不对.在AI技术飞速演进的今天,新一代视频生成工具Pollo横空出世,再次刷新了人们对AI创造力的认知。只需上传一张图片,Pollo便能生成5秒左右的动态视频,无论是充满浪漫氛围的法式接吻,还是童话般的公主抱画面,都能精准呈现,细节生动,情感自然。
相比以往动辄需要多张图片、复杂提示词、甚至训练模型的生成方式,Pollo的操作几乎简单到极致,大大降低了内容创作的门槛。这种从”静态到动态”的极速转化,不仅体现了AI在理解视觉信息和动作逻辑方面的重大突破,也预示着AI内容生产将进入一个全新的加速阶段。
回顾过去一年,AI从文生图、图生图到文生视频、图生视频的进步节奏几乎是按月计算的。Pollo的出现,标志着图生视频领域迈入了“即拍即生”的时代——未来个人创作者、小团队乃至普通用户,都有机会像专业影视团队一样快速制作高质量的短片内容。
AI的进化,远比我们想象中还要快。也许在不久的将来,”一念成片”、”一想成电影”不再是幻想,而是每个人指尖的日常。
PolloAI视频工具可以制作多种AI视频,只需要一段话或者一两张图片。注册后有100个积点,可以免费用10次,每天还可以打卡获得积分,感觉免费版就够用了。
我媳妇很重,现实中我真抱不动,更不用说来一个公主抱了。
视频:油管/Youtube | B站/小破站 | 微博视频 | 西瓜视频 | 微信视频号 | X/推特 | 小红书 | Facebook
和媳妇来个法式接吻,秀个恩爱。
视频:油管/Youtube | B站/小破站 | 微博视频 | 西瓜视频 | 微信视频号 | X/推特 | 小红书 | Facebook
也可以把ChatGPT生成的Ghibli动画图片拿来用!
也支持在Ghibli动画图上二次创作。
我媳妇说:生成视频不清楚,很模糊。确实是,感觉之后AI Agent会互相协作,视频生成后可以让AI再变高清4K无码之类的。未来可能真的要来了,听说2027年就能全面进入AGI时代,到时候平面动画、设计师、视频剪辑师、程序员、律师、医生等职业需求可能要大幅度减少了,被社会淘汰的会是那些不懂得用AI工具的人。
这个工具里也有视频变清楚的功能,选择了一个4k,除了生成的视频文件确实变大了一些,效果并不是感觉特别明显(当然可能确实有点效果)
和媳妇高清版本4k的法式接吻 French Kiss in 4k
点Pollo立马注册,上传一张照片就能生成AI视频!
英文:AI Video Tool: Pollo.AI (AI Scales Fast!)
本文一共 1096 个汉字, 你数一下对不对.检查运行 curl命令 后的HTTP响应代码,您可以使用 curl 的 -w` 选项,这样可以指定自定义输出格式。以下是命令:
curl -o /dev/null -s -w "%{http_code}\n" <URL>
您可以将HTTP响应代码保存到BASH变量中,如下所示:
resp=$(curl -o /dev/null -s -w "%{http_code}\n" <URL>)
解释:
将 <url> 替换为您正在检查的实际URL。
如果您想同时获取HTTP输出,您需要使用 `-o` 来重定向输出。例如:
resp=$(curl -s -w "%{http_code}" -o /tmp/curl_output.txt <URL>)
然后,BASH 变量 $resp 包含HTTP响应代码,而文件 /tmp/curl_output.txt 则会保存请求的输出文本。
英文:How to Get HTTP Response Code using cURL Command?
本文一共 176 个汉字, 你数一下对不对.当使用像 Steem 这样的去中心化平台时,重要的是要预期偶尔的故障——网络问题、API 限制或暂时的停机。这就是为什么你构建的任何集成、机器人或工具都应该能够优雅地失败并智能地恢复。
在这篇文章中,我将带你了解一个简单而强大的 Steem 区块链见证人(也就是STEEM上的矿工)投票检查工具:
这是一个实用的 Node.js 函数,用于检查一个 Steem 用户是否投票支持了某个特定的 见证人——无论是直接投票还是通过代理。
function is_voted_by(witness, id) { return new Promise((resolve, reject) => { steem.api.getAccounts([id], function(err, response) { if (err) reject(err); if (typeof response == "undefined") reject("undefined"); const data = response[0]; resolve((data.proxy === witness) || data.witness_votes.includes(witness)); }); }); }
它获取给定 id 的账户数据,然后检查该用户是否设置了匹配目标见证人的投票代理,或者该见证人是否在他们的直接投票列表中。
这是更新版的函数,包含简单的重试机制(最多重试 3 次,每次重试间隔 1 秒)。以下的代码加入了重试功能:
function is_voted_by(witness, id, retries = 3) { return new Promise((resolve, reject) => { const attempt = (remaining) => { steem.api.getAccounts([id], function(err, response) { if (err || typeof response === "undefined") { if (remaining > 0) { setTimeout(() => attempt(remaining - 1), 1000); // 重试 1 秒后 } else { reject(err || "undefined response"); } return; } const data = response[0]; resolve((data.proxy === witness) || data.witness_votes.includes(witness)); }); }; attempt(retries); }); }
此版本在 Steem API 调用失败或返回 undefined 时最多进行 3 次重试,帮助处理不稳定的网络状况或临时的 API 问题。功能保持不变:检查直接的见证人投票或代理委托/Proxy。
使用指数退避机制/Exponential backoff来避免过度请求 API,并记录每次尝试以便于调试和更好的可视化。
module.exports.is_voted_by = function(witness, id, retries = 3, delay = 1000) { return new Promise((resolve, reject) => { const attempt = (remaining, currentDelay) => { console.log(`Checking vote for "${id}" against witness "${witness}"... (${retries - remaining + 1}/${retries})`); steem.api.getAccounts([id], function(err, response) { if (err || typeof response === "undefined") { console.warn(`Attempt failed: ${err || 'undefined response'}`); if (remaining > 0) { console.log(`Retrying in ${currentDelay}ms...`); setTimeout(() => attempt(remaining - 1, currentDelay * 2), currentDelay); // 指数退避 } else { reject(err || "undefined response after retries"); } return; } const data = response[0]; const voted = (data.proxy === witness) || data.witness_votes.includes(witness); console.log(`Vote check result: ${voted}`); resolve(voted); }); }; attempt(retries, delay); }); };
该函数:
如果 API 调用失败或返回 undefined,它将:
指数退避是网络编程中的经典策略——如果服务暂时不可用,快速连续请求只会让问题更加严重。通过在重试之间增加延迟,可以让系统有时间恢复,并且对 API 更加友好。
is_voted_by('witness-name', 'username') .then(voted => { if (voted) { console.log("User supports the witness!"); } else { console.log("User has not voted for the witness."); } }) .catch(err => { console.error("Error checking vote:", err); });
在构建与区块链交互的工具时,弹性至关重要。适当的重试逻辑能大大提高你的应用程序的稳定性和用户友好性——即使在底层基础设施出现问题时也能保持正常运行。
英文:
这两天,朋友圈和X(推特)上都被吉卜力风格的照片刷屏了,就连伊隆·马斯克也特意发帖推荐了 ChatGPT-4o 的这项新功能。仿佛一夜之间,AI 就能取代绝大多数设计师的工作。
这个 AI 生成图片的功能(严格来说是图生图)仅限 ChatGPT-4o 的付费用户使用,每月订阅费用为 20 美元。我曾在两年前订阅过半年 ChatGPT Plus/Pro,但后来账号因支付问题被封——当时我使用的是 OneKey 的美元加密货币卡。
不过,我们其实可以 免费 利用 Grok-3 生成吉卜力风格的照片。只需将图片拖入 Grok-3 的对话框,并输入以下提示词:
想起当年有个人做了测试:把油管视频下载下来再上传,再下载,再上传,然后最后面就得到很糊的一个视频。不知道如果我们一直让AI基于生成的图片再生成图片,效果是会收敛、变好、还是会变得不可预测?
变开心很容易,但是要特别特别开心真的就要付费了:试用美图秀秀的AI绘画功能: 快乐是免费的-特别快乐可能就要花一些钱了
ChatGPT现在也开放这个图生图功能给免费用户了,生成的质量明显比Grok好。
后续所有这类照片都放在这个帖子里:吉卜力风格照片(持续更新)
本文一共 958 个汉字, 你数一下对不对.在调试程序时,有时候我们希望一直运行程序直到遇到错误。GDB(GNU 调试器)和 LLDB(LLVM 调试器)都提供了自动化此过程的方法。
这在调试一些不稳定的程序非常有用,例如有时候写的一些单元测试可能随机崩溃SegFault。最近我在调试一个测试每跑1000次就有一次崩溃的时候就发现gdb/lldb调试器非常有用。
GDB(GNU 调试器)和 LLDB(LLVM 调试器)是用于低级别应用程序调试的强大工具。GDB 传统上用于由 GCC 编译的程序,而 LLDB 是 LLVM 项目的一部分,与 Clang 无缝配合。两者都提供强大的功能,但 GDB 在 Linux 环境中更常见,而 LLDB 在 macOS 上以及处理 Swift 时更受青睐。
调试重复性任务可能很乏味。通过自动化这些任务,直到发生错误,可以节省大量时间和精力。以下是如何在 GDB 和 LLDB 中设置重复执行直到遇到错误的步骤。
下面是一个 GDB 脚本,它会重复执行,直到发生错误:
while 1 run if $_exitcode != 0 echo "发生错误,退出码:$_exitcode\n" break end end
要运行此脚本,将其保存为 repeat_until_error.gdb
,然后使用以下命令执行 GDB:
gdb -q -x repeat_until_error.gdb ./your_program
或者,当你处于 gdb 提示符时,运行:
source repeat_until_error.gdb
“run” 命令用于启动程序,你可以为它添加参数,例如:
run param1 param2 ...
你也可以使用 “r” 作为 “run” 的简写。
类似地,在 LLDB 中,你可以使用以下脚本实现相同的效果:
while (1) run process launch if (process status != 0) script print("发生错误,退出码:", lldb.process.GetExitStatus()) break end end
要运行此脚本,将其保存为 repeat_until_error.lldb
,然后运行:
lldb --source repeat_until_error.lldb ./your_program
或者,在 lldb 提示符处运行:
source repeat_until_error.lldb
在 “run” 命令之后,你还可以通过附加参数来启动程序,例如:
run param1 param2
GDB 和 LLDB 都提供了方便的方法来自动化调试任务,选择使用哪种工具通常取决于你所使用的平台和工具链。GDB 与 GCC 的集成使其成为 Linux 开发者的首选,而 LLDB 在与 Clang 和 macOS 的无缝配合方面同样强大。
自动化重复的调试命令可以为你节省大量时间和精力 —— 无论你使用 GDB 还是 LLDB,这些脚本都能帮助你简化工作流程。
英文:How to Repeat Until Errors using GDB or LLDB Debugger?
本文一共 603 个汉字, 你数一下对不对.我每天使用 Microsoft Surface Studio 作为我的主要工作站,并且很少关闭或重启电脑,除非 Windows 强制更新。
最近,整个操作系统变得异常缓慢,Chrome 浏览器在加载包含大型表格的页面时甚至会导致系统冻结。一开始,我尝试关闭不必要的应用程序并清理一些内存,但问题依然存在。即使是简单的操作,比如在窗口之间切换或打开“开始”菜单,都变得迟缓无比。最终,我决定重启电脑,而一旦重启,Windows 立即开始安装更新。
更新完成后,系统恢复了正常,Chrome 不再卡顿,整体性能也大幅改善。这让我意识到,长时间不开机更新可能会导致系统性能逐渐下降。虽然 Windows 具备管理内存和资源的机制,但某些更新(尤其是涉及安全性、驱动程序或性能优化的更新)可能需要重启后才能生效。
所以,如果你的操作系统开始变得缓慢或无响应,这可能是在提醒你该安装更新了。定期更新系统不仅能提升性能,还能增强安全性和稳定性。今后,我可能会改变自己不愿重启的习惯,把定期更新作为维护电脑的一部分。
别一个系统很卡的原因就是浏览器不释放内存,因为长时间不重启/关电脑,也不关浏览器,经常我的Chrome和Edge的浏览器都是很多标签页,虽然关了程序,但是浏览器还是会在内存中不能正确得到释放,我一般就是强制删掉Chrome/Edge浏览器进程:
taskkill /im:chrome.exe /f taskkill /im:msedge.exe /f ## 或者直接一行终止 Edge/Chrome浏览器 taskkill /im:msedge.exe /im:chrome.exe /f
一条TaskKill命令下去(Windows操作系统)批量把所有停留在内存中的Chrome和Edge浏览器进程都终止掉,有快感,很爽。
英文:When Your PC Slows Down, It Might Be Time for an Update
本文一共 622 个汉字, 你数一下对不对.回国的时候最麻烦就是访问国外的网站:邮箱、油管视频等。在中国大陆,翻墙是违法的,但是好像在上海北京等大城市,可以申请许可,比如一些国际驻公司和政府机构因需要则可以申请绕过大墙网GFW/Great Firewall。
翻墙/建梯子的方式很多种,怕麻烦可以买现成的VPN,自己有服务器的可以建Wireguard等。这里再介绍一种简单的方式。
假设你的主机/服务器/VPS里已经装有Docker。只需要把下面的脚本存成一个BASH文件,比如 docker-firefox.sh 然后在命令行下跑:./docker-firefox.sh PASS 其中PASS是密码,这个我们下面要用到,PASS如果不写的话则要把 “-e VNC_PASSWORD=” 那行删掉即可。
#!/bin/bash VNC_PASS=$1 docker run -itd \ --restart always \ --name=firefox \ -p 5800:5800 \ -v $(pwd)/config:/config:rw \ --shm-size 1g \ -e ENABLE_CJK_FONT=1 \ -e VNC_PASSWORD=${VNC_PASS} \ jlesage/firefox
等一会儿,这时候Docker会去拉取这个软件镜像,然后完事即可在浏览器里把你的 域名/IP地址 后加上5800端口, 5800是上面脚本里指定的,也可以改成你想要的端口。
这样跑起来了,你的主机就相当于一个中转/代理,你在国内的时候访问你的主机(如果你主机没被大墙网拉入黑名单的话),那你就可以在浏览器里的内嵌FireFox浏览器里打开其它国外网站了。
可能是和我的主机配置有关,总觉得有点卡。不是很流畅。还有就是我想登陆我的GMAIL帐号,被GOOGLE认定有风险,要我改密码,吓得我只能作罢。
试了一下,看了一个油管广告,没有声音,所以通过这个技巧看油管视频是不现实的。
还有就是,目前只支持HTTP,而不支持HTTPS,如果域名开启了HSTS,那只能通过IP来访问HTTP。不过,你可以通过nginx/apache设置一个反代 reverse proxy 来访问HTTPS。
比如以下是在Nginx服务器配置443端口重新转向到这个FireFox代理:
server { listen 443 ssl; server_name domain_name ssl_certificate /root/fullchain.cer; ssl_certificate_key /root/key.key; location / { proxy_pass https://your-server-ip:5800; proxy_ssl_verify off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
这玩意不适合日常工作,但是回国用于救急还是可以的。特别是不想在公共电脑上留下痕迹,只需要用强密码+HTTPS。等不需要用的时候记得把Docker容器删除即可。
docker stop firefox docker rm -f firefox
这个没法支持多用户,也就是说多个用户同时登陆看到的是同一个窗口。
可以使用:docker logs -f firefox 来查看窗口的相关信息:
[init ] container is starting…
[cont-env ] loading container environment variables…
[cont-env ] APP_NAME: loading…
[cont-env ] APP_VERSION: loading…
[cont-env ] DISPLAY: executing…
[cont-env ] DISPLAY: terminated successfully.
[cont-env ] DISPLAY: loading…
[cont-env ] DOCKER_IMAGE_PLATFORM: loading…
[cont-env ] DOCKER_IMAGE_VERSION: loading…
[cont-env ] EGL_LOG_LEVEL: executing…
[cont-env ] EGL_LOG_LEVEL: terminated successfully.
[cont-env ] EGL_LOG_LEVEL: loading…
[cont-env ] GSK_RENDERER: executing…
[cont-env ] GSK_RENDERER: terminated successfully.
[cont-env ] GSK_RENDERER: loading…
[cont-env ] GTK2_RC_FILES: executing…
[cont-env ] GTK2_RC_FILES: terminated successfully.
[cont-env ] GTK2_RC_FILES: not setting variable.
[cont-env ] GTK_THEME: executing…
[cont-env ] GTK_THEME: terminated successfully.
[cont-env ] GTK_THEME: not setting variable.
[cont-env ] HOME: loading…
[cont-env ] LIBGL_DRIVERS_PATH: executing…
[cont-env ] LIBGL_DRIVERS_PATH: terminated successfully.
[cont-env ] LIBGL_DRIVERS_PATH: not setting variable.
[cont-env ] PULSE_CONFIG_PATH: executing…
[cont-env ] PULSE_CONFIG_PATH: terminated successfully.
[cont-env ] PULSE_CONFIG_PATH: not setting variable.
[cont-env ] PULSE_COOKIE: executing…
[cont-env ] PULSE_COOKIE: terminated successfully.
[cont-env ] PULSE_COOKIE: not setting variable.
[cont-env ] PULSE_SERVER: executing…
[cont-env ] PULSE_SERVER: terminated successfully.
[cont-env ] PULSE_SERVER: not setting variable.
[cont-env ] QT_STYLE_OVERRIDE: executing…
[cont-env ] QT_STYLE_OVERRIDE: terminated successfully.
[cont-env ] QT_STYLE_OVERRIDE: not setting variable.
[cont-env ] TAKE_CONFIG_OWNERSHIP: loading…
[cont-env ] XDG_CACHE_HOME: loading…
[cont-env ] XDG_CONFIG_HOME: loading…
[cont-env ] XDG_DATA_HOME: loading…
[cont-env ] XDG_RUNTIME_DIR: loading…
[cont-env ] XDG_STATE_HOME: loading…
[cont-env ] container environment variables initialized.
[cont-secrets] loading container secrets…
[cont-secrets] container secrets loaded.
[cont-init ] executing container initialization scripts…
[cont-init ] 10-certs.sh: executing…
[cont-init ] 10-certs.sh: terminated successfully.
[cont-init ] 10-check-app-niceness.sh: executing…
[cont-init ] 10-check-app-niceness.sh: terminated successfully.
[cont-init ] 10-clean-logmonitor-states.sh: executing…
[cont-init ] 10-clean-logmonitor-states.sh: terminated successfully.
[cont-init ] 10-clean-tmp-dir.sh: executing…
[cont-init ] 10-clean-tmp-dir.sh: terminated successfully.
[cont-init ] 10-fontconfig-cache-dir.sh: executing…
[cont-init ] 10-fontconfig-cache-dir.sh: terminated successfully.
[cont-init ] 10-init-users.sh: executing…
[cont-init ] 10-init-users.sh: terminated successfully.
[cont-init ] 10-nginx.sh: executing…
[cont-init ] 10-nginx.sh: terminated successfully.
[cont-init ] 10-openbox.sh: executing…
[cont-init ] 10-openbox.sh: terminated successfully.
[cont-init ] 10-pkgs-mirror.sh: executing…
[cont-init ] 10-pkgs-mirror.sh: terminated successfully.
[cont-init ] 10-pulse.sh: executing…
[cont-init ] 10-pulse.sh: terminated successfully.
[cont-init ] 10-set-tmp-dir-perms.sh: executing…
[cont-init ] 10-set-tmp-dir-perms.sh: terminated successfully.
[cont-init ] 10-vnc-password.sh: executing…
[cont-init ] 10-vnc-password.sh: creating VNC password file from environment variable…
[cont-init ] 10-vnc-password.sh: terminated successfully.
[cont-init ] 10-web-data.sh: executing…
[cont-init ] 10-web-data.sh: terminated successfully.
[cont-init ] 10-webauth.sh: executing…
[cont-init ] 10-webauth.sh: terminated successfully.
[cont-init ] 10-x11-unix.sh: executing…
[cont-init ] 10-x11-unix.sh: terminated successfully.
[cont-init ] 10-xdg-runtime-dir.sh: executing…
[cont-init ] 10-xdg-runtime-dir.sh: terminated successfully.
[cont-init ] 15-cjk-font.sh: executing…
[cont-init ] 15-cjk-font.sh: installing CJK font…
[cont-init ] 15-cjk-font.sh: fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/main/x86_64/APKINDEX.tar.gz
[cont-init ] 15-cjk-font.sh: fetch https://dl-cdn.alpinelinux.org/alpine/v3.21/community/x86_64/APKINDEX.tar.gz
[cont-init ] 15-cjk-font.sh: (1/1) Installing font-wqy-zenhei (0.9.45-r3)
[cont-init ] 15-cjk-font.sh: Executing fontconfig-2.15.0-r1.trigger
[cont-init ] 15-cjk-font.sh: Executing mkfontscale-1.2.3-r1.trigger
[cont-init ] 15-cjk-font.sh: OK: 694 MiB in 168 packages
[cont-init ] 15-cjk-font.sh: terminated successfully.
[cont-init ] 15-install-pkgs.sh: executing…
[cont-init ] 15-install-pkgs.sh: terminated successfully.
[cont-init ] 55-check-snd.sh: executing…
[cont-init ] 55-check-snd.sh: sound not supported: device /dev/snd not exposed to the container.
[cont-init ] 55-check-snd.sh: terminated successfully.
[cont-init ] 55-firefox.sh: executing…
[cont-init ] 55-firefox.sh: terminated successfully.
[cont-init ] 56-firefox-set-prefs-from-env.sh: executing…
[cont-init ] 56-firefox-set-prefs-from-env.sh: terminated successfully.
[cont-init ] 85-take-config-ownership.sh: executing…
[cont-init ] 85-take-config-ownership.sh: terminated successfully.
[cont-init ] 89-info.sh: executing…
╭――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――╮
│ │
│ Application: Firefox │
│ Application Version: 135.0-r0 │
│ Docker Image Version: 25.02.2 │
│ Docker Image Platform: linux/amd64 │
│ │
╰――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――╯
英文:Using Docker to Run Firefox as a Proxy: A Simple Solution for Accessing Blocked Websites in China
本文一共 804 个汉字, 你数一下对不对.创建一个 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
本文不构成任何投资建议。
那天在 领英/LinkedIn 上看到一则帖子:一个人每天坚持购买价值 30 美元的比特币,持续了整整 8 年。这种策略有一个专业术语,叫做“美元成本平均法”(Dollar Cost Averaging)。最终结果如何?他累计投入 86,370 美元,现在这些比特币的价值高达 100 万美元。
This guy bought $30 worth of BTC a day for 8 years. This is sometimes known as dollar cost averaging. The net result? $86,370 now worth $1M in Bitcoin.
如果你对投资一窍不通,其实也可以选择一种最简单的方法:定投比特币。不用去冒险尝试其他更复杂或波动性更大的加密货币,甚至第二加密货币ETH(以太坊)在更换了PoS/Proof of Stake共识算法后也有一定的风险。比特币作为全球首个且最具共识的加密货币,其归零的概率已经微乎其微。
定投的关键在于规避市场情绪的干扰,无论牛市或熊市,你都坚持以相同金额购买资产。这种方法帮助投资者在价格低时买入更多份额,价格高时买入更少份额,从而在长期内平滑成本,避免一次性投入的风险。比特币本身的稀缺性(固定总量 2100 万枚)和其作为“数字黄金”的定位,也使得长期持有者有较高的概率获得收益。
有人说,现在比特币10万美金已经很高位了,再涨收益可能不是很多,但是你要有信仰,在我看来,2025年将是下一个牛市,大饼至少15万美元,甚至有可能到20万刀,你看以往几次减半后都是会大涨一波的。比特币是数字黄金,趁现在有能力,买它个1-2个,没有能力也买个0.01个。你要知道比特币的稀缺性,总量2100万个,但由于很多人忘记密钥,丢了等,实际流通量会更少,所以地球上每个人还不够分到一个呢。
尽管比特币的归零概率小,但它依然是一个高波动性的资产。过去10几年,它经历了数次暴跌与牛市,很多人在市场恐慌中中途放弃。坚持到底需要极强的耐心和信念。因此,投资比特币的资金应是你能够长期承受的闲置资金,而非生活必需的储蓄。
买了就忘记它,用闲钱来投资大饼,不要追求/玩短期,更不要去借贷来买。一定要在能承受的损失能力范围内来买。
这个案例告诉我们,简单的投资策略加上持之以恒的执行力,能带来惊人的回报。对于普通人来说,比起尝试“抄底”或“逃顶”,选择定投反而是更加适合的方式。毕竟时间才是投资者的最大盟友。
你也许不需要完全复制这位投资者的策略,但这背后的理念值得深思:用规律的行动面对不可预测的市场,或许才是真正的智慧之选。
“美元成本平均法”(Dollar Cost Averaging,简称 DCA)是一种投资策略,核心思想是定期以固定金额购买某种资产,无论市场价格高低。比如,你可以每周或每月投入相同金额购买股票、加密货币或基金,而不需要纠结于短期的市场波动。
这种方法的优点是可以平滑投资成本。当市场价格较低时,固定的金额能够买入更多的资产份额;而当价格较高时,同样的金额则买入较少的份额。长期坚持下来,投资者的平均购买成本通常会低于市场的平均价格,特别适合那些无法准确预测市场走势的人。
虽然 DCA 是一种稳健的投资方法,但它也有局限性:
美元成本平均法是一种适合大众投资者的简单高效策略,尤其对那些没有时间研究市场、无法预测趋势的人特别友好。这种方法通过纪律性投入规避了情绪化交易的弊端,并且适合资产价格波动较大的市场,比如股票和加密货币。
对于普通人来说,DCA 的意义在于让投资回归理性:专注于时间的复利效应,降低短期波动的干扰。在投资过程中,时间是我们的朋友,而急功近利往往会成为最大的敌人。
英文:Simple investment strategy: regular investment in Bitcoin/BTC (Dollar Cost Averaging)
本文不构成任何投资建议。
本文一共 1823 个汉字, 你数一下对不对.前不久,力扣说我刷题刷了2000天,不是连续的,这个是一共刷的天数。2000天也就是5.479年。
我的力扣,欢迎围观:https://leetcode.com/u/justyy/
注册力扣帐号是2013年10月10号,当天提交了6次。当时是在谢菲尔得/Sheffield。
后来就是断断续续,甚至有很长一段时间都没有刷,直到2019年3月2日开始才未间断刷到今天(当时拿着Ipad中午在美国通用电气的食堂里刷题)。2016年竟然4月份连续刷了25天,我已经忘记当时为啥这么有闲情逸致了。哦,当时已经搬到了剑桥/Fen Drayton了,可能在准备谷歌的面试。
019年在美国通用电气/General Electric工作的时候中午吃完饭在湖边着着IPAD刷题。
从2013年到2024的力扣刷题之路,一点点改变,一点点变好。
现在刷题是保持面试状态的好方法,就像飞机飞到高空时油耗已经减少,我希望自己能维持这个状态。每天打卡,哪怕有时只是拷贝代码,依然会稍微思考并熟悉解法和算法。每天坚持打卡还能积累积分,兑换力扣衬衫。
英文:Milestone: Leetcoding for 2000 Days
网友:以后每天比比看是cursor做得快 还是你快。
答:刷题的目的又不是比快。让脑子思考,训练脑子。
网友:惭愧,我在 GE时候天天打酱油,群主确是每天在刷题飞。
网友:看似不起波澜的日复一日让我们看到坚持的意义!
我每天都要刷题,还有很多其他事情。最近我发现,用 EXCEL 记录这些任务是个不错的选择:一方面可以防止自己忘记,另一方面打卡能让每天的生活更加充实,也方便统计一年的成果。统计这些数据也是我个人的一个小爱好。
有些没有天天打卡的运动,但是由于每天都会填表,所以也不太会忘记太久,比如每周跑一次步,隔三差五就在油管上看系统设计/System Design的视频等等。
有了这个表格,如果很久没跑步,确实能提醒自己得动动了。
上面的EXCEL中,并不是每一列都是打卡的,有的比如只是记录一下频率,你懂的。
本文一共 309 个汉字, 你数一下对不对.做服务器运维,亦或者网站运营时,经常会听到 IP/PV/UV,这些东东到底是什么呢?它们又有什么作用,今天杜老师为大家简单讲解一下!
关于 IP 有很多解释,它是网络地址,通过它可以定位服务器;也是流量的代名词,我们常常听到某某明显自带 IP 的说法,说明 TA 代言或参演的作品会有很多人支持。
今天我们要说的 IP 是偏前者,指的是一个真实的地址。我们都知道在上网前需到服务商办理业务,就是租用宽带。上网时服务商会提供一个临时 IP,我们就是通过这个 IP 获得一个可通过互联网获取数据的身份。这里需要知道的是,即便家里的网络设备比较多,在使用时对外都是一样的 IP。
PV 全称 Page View,中文译为页面浏览,指代网站中的一个页面被浏览的次数。为了让大家更容易理解,我们举个简单例子。
杜老师说中的两篇文章,当有访客去分别访问时,就会产生 2 个 PV 了。而且其中一个页面被访客刷新页面后,也会额外产生 1 个 PV 的。
UV 全称 User View,中文译为用户浏览,指代有几个用户访问了你的网站。这个统计与 IP/PV 不同,为了让大家更好的理解,我们对比说明一下。
PV 的数值一般最大,因为不论浏览还是刷新,都会增加 PV 值;IP 的数值一般最小,因为同一网络内的访问,只算作 1 个 IP。比如同一网吧所有人都登录一个网站,对于该网站来说只进量了 1 个 IP。UV 在它们之间,一般会通过浏览器缓存信息判断是否是同一个用户。比如我用一个浏览器打开杜老师说的多个页面,也算作 1 个 UV。
对于运维人员来说,IP 可以判断访客的地域,到底是什么地区的人喜欢访问我们的网站,这样可以针对该地区做优化,比如多加节点等提升访客的访问体验;PV 可以判断哪些页面更加受欢迎,可针对页面做优化,比如增加缓存等等;UV 可以判断用户量,用于调整服务器并发等性能。
对于站长来说,IP 同样用来判断访客的地域,对于主要来源地域,我们可以针对性的推荐服务。比如一个做菜教程网站,访客大部门来自于东北地区,就可以多发布一些东北菜系教程;PV 得出的数据让我们知道了哪些页面更受欢迎,这样可以发布更多相关内容页面。UV 可以判断出访客数量,如果以后要做广告挂载,这是一个重要的参考值,因为广告商需知道有多少人访问网站。
为了给访客带来更好的体验,杜老师说经常需要升级网站,对页面的细节进行调整。而修改页面代码后,往往需要清空浏览器的缓存,才能看到更新后的内容,有什么办法能让火狐浏览器关闭缓存,今天杜老师就来说一下!
最近做项目的时候,在 Firefox 火狐浏览器发现缓存难清理,用CTRL+F5或者CTRL+R等在谷歌和 IE 浏览器的快捷键没用,搜了一下,发现火狐清理缓存比较麻烦,默认快捷键CTRL+SHIFT+DEL。
而且是弹窗选择性清理,还要点击按钮选择,在 Web 开发调试中非常的不方便不科学,然后问度娘发现火狐是要进入它的参数设置里设置本地不缓存的。
rm 是 Linux 文件删除的命令,它是 Linux 非常强大却又非常危险的一条命令,特别是 rm -rf 有时候强大到让你欲哭无泪。
当你需要清除当前目录下的所有文件和目录时,很简单 rm -rf ./*
,这没什么。但是如果不小心打成这样 rm -rf /*
,兄弟请节哀吧!
rm 删除文件同时删除 inode 信息,这使得使用 rm 删除的文件十分难恢复。总之 rm 是太危险了,特别是带有-rf 参数时一定要慎之又慎,但老虎也有打盹的时候,所以为什么不给 rm 一剂后悔药呢?
1 | alias rm=trash |
注意:将上面的代码加入到~/.bashrc 文件,然后执行 source ~./bashrc 导入该文件,之后运行 rm 即可将文件移动到指定目录中。记得在/tmp 创建目录!
1 | alias rm=trash |
注意:在原有基础上增加查看、恢复、清空功能,rml 可直接查看回收站的文件,urm 加文件名称可将文件恢复到当前目录中,crm 可清空回收站的所有文件,并需要输入 y 确认。
Google(谷歌)是全球知名的互联网巨头之一,几年前被认为是养老终级大厂,福利优厚,压力相对较小。在英国伦敦,Google设有一个主要从事开发和研究的办公室。
我在2016年首次面试Google。第一轮是电话面试,由一位在瑞士的工程师主导,通过电话交流并在Google Doc上同步编写代码。由于当时技术水平有限,我用C++完成了那道消息打印的题目,核心是使用队列和哈希表来解决问题,写得很磕磕巴巴。
当时对软件工程师的级别没有特别概念,推测自己面的是SWE L4/L5的级别,因为当时也就工作了5年多。
我查了一下邮件,2013年11月份的时候谷歌猎头联系我问我要不要试试?我说我当时没拿到英国永居,不想冒险,虽然他说到谷歌可以办工签,我当时还是没有选择去面试,现在想起来实在不可思议,后来2014年/2015年的时候同一个猎头还每隔6个月就check-in一次,最后面是在2016年4月份的时候才开始第一次的。
我要是当时聪明一些,努力刷题一些,搞不好当时进谷歌,现在也工作将近十年了,拿着谷歌股票到现在,也不至于现在混个高不成低不就的。
第二次面试是2020年11月份,第零轮其实应该算是Google的猎头问的一些选择题,比如C++里的哈希表/map如果访问一个不存在的键会发生什么?Google的软件工程师包括SRE站点可靠工程师在面试的时候都可以选两种路径,一个是数据结构和算法(编程),另一个是运维/DevOps偏LINUX知识的。我都选前者,毕竟这个我感觉只要短期刷题就好了,相反后者需要多年工作实战的积累。
通过了猎头的小测试,我进入了第一轮,是道编程题,但是并不是那种力扣上可以见到的,这一轮45分钟,给得是一个比较有意思的游戏,比如迷宫生成算法。面试的时候需要你主导整个过程,包括澄清问题,构思,写代码,分析复杂度等等,每一步都需要你Think Aloud。虽然这一轮我犯了些错误,但是给得反馈总题还不错,面试官说他觉得我应该进入下一轮。
到了终面,安排在了同一天,上午2轮,下午3轮,我记得3轮编程/Coding,一轮系统设计,一轮Culture Fit/Behavior/行为模式。除了系统设计是1小时,其它的4轮都是45分钟,谷歌的Coding面试45分钟都是解决1题即可,题目并不是力扣上的,题目范围/scope较大,偏难。一般来说coding完还会有一些Follow-up的问题,比如怎么优化算法。这个和Meta/Facebook的Coding面试不同,Meta百分百喜欢出力扣上原题,40分钟内需要解决2题力扣原题(留5分钟问问题),这个可以通过力扣按公司归类最近3/6个月的试题准备即可。
系统设计我记得是设计一个类似AWS S3的文件存储,也不知道是不是看我当时在AWS S3工作。很可惜,最后面这一轮不过关,当时我面的是L5(Senior),软件工程师级别越往上走,对系统设计的能力则要求越高(设计可扩展/分布式/高性能的系统 )。
Unfortunately Google doesn’t disclose specific feedback per interview session so in this case I can’t share more context. I wish I had more to share with you! Also, we don’t use the scoring system from 1-4 anymore, each person puts in full context, notes, and recommendations and then HC reviews for an overall consensus decision.
不幸的是,Google 不会披露每个面试环节的具体反馈,因此在这种情况下我无法分享更多背景信息。我希望我能与您分享更多!此外,我们不再使用 1-4 的评分系统,每个人都会提供完整的背景信息、注释和建议,然后由 HC 进行审查以做出总体共识决定。
一般大厂来说,不太会降级别给Offer,也就是说,如果面的是L5职位,但是能力可能只到L4,一般来说是不会给Offer的,但也不排除个别情况下,据说Meta就有面试E5给E4的情况。
级别是在面试过程中根据您的个人背景确定的,包括简历经验、面试表现等多种因素,以及与 SWE/SRE 的契合程度。
Unfortunately we reviewed for overall technical depth slotted against our teams and right now the decision is not to proceed.
不幸的是,我们审查了我们队伍的整体技术深度,现在的决定是不继续。
这次面试的职位是SRE站点可靠工程师。
其实去年2023年,也申请了谷歌伦敦Google Research的位置,当时和猎头简单聊过之后,就没下文了,猎头说会把我的简历给招聘经理,不过等了好几周,最后面很抱歉的说已经招了别人了。
Apologies for the radio silence on this one, we have had radio silence from the hiring manager on this role. They have unfortunately decided to prioritise other hiring areas in the team so we won’t be able to move forward at this stage.
However, if we have any other roles in the future I will make sure to keep you in mind.
抱歉,我们没有得到任何回复,我们一直没有收到招聘经理关于这个职位的任何回复。不幸的是,他们决定优先考虑团队中的其他招聘领域,因此我们目前无法继续推进。
但是,如果我们将来有其他职位,我一定会记住你的。
2021年/2022年我记得也投过,不过都没有下文(简历被拒),有一年直接申请Google瑞士,因为听说那边的工资高,和美国一样高,所以想试了试,第二天直接收到了拒信,还是谷歌瑞士的工程师直接发的邮件。
今年就随手申请了一下,也不知道是不是招聘市场回暖,简历同时过了Meta和Google的第一轮筛选。上一次2020年也是,同一时间面试Google和Meta,两个公司的面试都进入了最后一轮(Final Onsite)。
今年和Google猎头聊了聊,她并没有给小测试,就是了解了情况,然后让我选是以算法为主还是运维/DevOps为主,我今年面试的是SRE站点可靠工程师,和第二次一样。
第一轮面试也是一轮设计一个简化版的游戏,面试了45分钟,最后面拖了三分钟 Follow-up问题,也就是把这游戏 Scale Up,如果很多很多人玩,单机内存不够怎么办?
我最开始的暴力解法写得很6,犯了两个小错误,并不是Bug Free,不过面试官指出后我立马意识到并改正了,后来优化需要用到 二分搜索+前缀和/Prefix Sum,面试官很满意说他没想到这种方法。
再后来的优化用到了线段树,但由于时间限制,并不需要去实现,但需要讲明白算法原理。我脑子里想着另一种实现二叉索引树Binary Index Tree,但是不记得实现原理了,结果在那里纠结浪费了一些时间。
最后面给出的回馈就是最后面的Follow-up回答得不是很好。不过并没有立刻拒我,我猜是我过了Bar,但是并不是表现最好的那一个。一般一个职位一个坑,如果接到100份简历,那么只会邀请6-8个来进行第一轮面试,然后淘汰掉一半,最后面邀请3-4个来进行终面。
当时猎头给我打电话,说了反馈,然后就说暂时把我的申请on-hold了。
又过了两周,猎头给我回复:
I hope you’re keeping well, I just wanted to update you that we have now closed our London role. If we get another one through we will definitely be in touch! Thank you so much for everything you invested in our interviews, I know you put in a lot, on top of everything else and elsewhere too – and I know it takes a lot, so really do appreciate it, and I really hope we can keep in touch and work together again in the not so distant future! Take care and thank you again for everything you invested in our process, I really enjoyed working with you and getting to know you.
I wish you every strength, take care XXX!
希望你一切安好,我只是想告诉你,我们现在已经结束了伦敦的职位。如果我们又有新职位,我们一定会保持联系!非常感谢你为我们的面试所做的一切,我知道你付出了很多,除了其他一切之外,也付出了很多——我知道这需要很多,所以真的很感激,我真的希望我们能保持联系,在不久的将来再次合作!保重,再次感谢你为我们的过程所做的一切,我真的很高兴和你一起工作,认识你。
祝你一切顺利,保重 XXX!
我回了(不知道可不可以再投其它职位):
Could I apply to other roles if there are any suitable in the meantime? Or is it better to just wait?
如果在此期间有其他合适的职位,我可以申请吗?还是最好等待?
更新:Google猎头隔了几天又回了:
I hope you’re keeping well! Thank you for your patience, we should have some roles coming live in London so I’ll catch up with you super soon! Good news!
希望你一切安好!谢谢你的耐心,我们应该会在伦敦有一些HC职位,所以我很快就会再次联系你!好消息!
每年都面试一下,才能知道自己几斤几两。
谷歌的面试通常没有严格的次数限制,理论上并不是“一生只有三次机会”。不过,谷歌对多次申请有一定的冷却期政策,这意味着在未通过面试后,申请者需要等待一段时间才能再次申请。
通常的冷却期为6到12个月,但这时间会因具体情况和职位类型有所不同。如果之前的面试表现较好,甚至可以更早重新申请。此外,间隔期越长,对候选人的成长和进步的期望也会更高,因此再次面试时需要准备得更充分。
几天前中午和同事一起吃饭,聊到了AI(人工智能),特别是过去两三年间非常火热的ChatGPT大语言模型。他提到,有一次他在火车站打算去机场,结果火车停运了,于是他用手机查询了一下Uber去机场的费用,大概是80英镑。碰巧旁边有一位女士也要去机场,他便询问能否拼车以平摊车费。神奇的是,那位女士也查了一下Uber的价格,结果她的报价是50英镑。
同事不明白为什么仅相隔几分钟,价格会有这么大的差异。我解释道,这可能是因为Uber知道你在微软工作,觉得你有支付能力。
其实一些公司早就有算法(甚至不用AI)来实施差别定价。如果判断你是老客户,可能认为你更有可能会下单,于是就提高价格。甚至公司还会根据用户所在地区显示不同的价格,因此有时使用VPN更换地区,可能会获得更便宜的报价。
随着AI技术的引入,AI对你的了解也在增加(如性别、年龄、兴趣爱好等),模型会预测你能接受的最高价格,从而为公司带来最大化利润。当然,最简单的避免入坑的方法就是多比价(货比三家)。
英文:人工智能和动态定价如何影响我们的日常成本: How AI and Dynamic Pricing Shape Our Everyday Costs
本文一共 419 个汉字, 你数一下对不对.拿到服务器,想看是否是固态硬盘(SSD/NVMe),可以用以下几种方法,还有另一种方法是使用“dd”命令来测试硬盘的读写速度。
要检查 VPN 服务器上的磁盘是否为 SSD固态硬盘,您可以根据操作系统使用以下方法之一:
在 Linux 上,您可以使用以下命令检查磁盘是否为 SSD:
方法 1:使用 lsblk
lsblk -d -o name,rota
示例输出:
NAME ROTA
loop0 1
loop1 1
loop2 1
loop3 1
sda 1
ROTA 列显示设备是否为旋转式(1)或非旋转式(0)。
如果 ROTA 为 0,则设备可能是 SSD。
方法 2:使用 cat 查看 /sys/block
cat /sys/block/sdX/queue/rotational
将 sdX 替换为您的实际磁盘(例如,sda、sdb)。
如果输出为 0,则该磁盘为 SSD/固态硬盘。如果为 1,则为 HDD。
方法 3:使用 lsblk 的 -D 选项(用于丢弃/Discord功能)
lsblk -D
示例输出:
NAME DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
loop0 0 4K 4G 0
loop1 0 4K 4G 0
loop2 0 4K 4G 0
loop3 0 4K 4G 0
sda 0 32K 2G 0
├─sda1 0 32K 2G 0
├─sda14 0 32K 2G 0
├─sda15 0 32K 2G 0
└─sda16 0 32K 2G 0
SSDs 通常支持“丢弃”功能,因此在“DISC-GRAN”列中有非零值通常表示具有 SSD 功能。
如果您使用基于 Windows 的 VPN 服务器,可以使用 PowerShell 检查磁盘类型:
diskutil info diskX | grep "Solid State"
将 diskX 替换为实际磁盘标识符(例如 disk0)。
如果磁盘为 SSD,它将显示“Solid State: Yes”。
这些方法中的每一种都可以帮助您确定 VPN 服务器上的磁盘类型。
上述方法也适用于 Linux、Windows 和 MacOS 上的 NVMe/Non-Volatile Memory Express(非易失性存储器标准)驱动器,但在文件路径和命令输出方面存在一些差异:
在 Linux 上,NVMe 驱动器通常显示为 /dev/nvme0n1、/dev/nvme1n1 等。以下是针对 NVMe 调整的方法:
方法1:使用 lsblk
lsblk -d -o name,rota
NVMe 驱动器通常会显示 ROTA 为 0,表示非旋转(SSD)。
方法2:使用 /sys/block
cat /sys/block/nvme0n1/queue/rotational
将 nvme0n1 替换为您的 NVMe 设备。
输出应为 0 表示 NVMe 驱动器。
方法3:使用 nvme 工具
如果您安装了 nvme CLI 工具,还可以检查驱动器信息:
nvme list
您可以在 Ubuntu 上安装 nvme-cli 包,例如:
sudo apt install nvme-cli
这将显示所有 NVMe 设备的详细信息,包括型号、容量和序列号,有助于识别它是否为 NVMe SSD。
在 Windows 上,PowerShell 命令也可以识别 NVMe 驱动器:
Get-PhysicalDisk | Select-Object -Property DeviceID, MediaType, Model
在输出中,MediaType 显示为 SSD 表示 NVMe 驱动器。Model 字段可以帮助确认驱动器是否基于 NVMe。
示例输出:
DeviceID MediaType Model -------- --------- ----- 1 HDD Elements 25A3 2 HDD Elements 25A3 0 SSD MZVL22T0HBLB-00BMV SAMSUNG
在 macOS 上,diskutil 命令对 NVMe 驱动器也适用:
diskutil info diskX | grep "Solid State"
将 diskX 替换为 NVMe 磁盘标识符(例如 disk0)。如果是 SSD,您将看到“Solid State: Yes”,并且可以通过制造商提供的附加信息确认是否为 NVMe。
英文:How to Check Hard Disk Type (NVMe SSD) on Servers/VMs?
本文一共 689 个汉字, 你数一下对不对.DirectX 诊断工具(dxdiag)是 Windows 系统自带的一款实用工具,提供有关计算机硬件组件和 DirectX 设置的详细信息,这些对于运行多媒体应用程序至关重要。通过在“运行”对话框中输入“dxdiag”,用户可以查看系统的详细信息,例如显卡型号、音频设备配置和驱动程序信息。该工具尤其适合排查图形或音频问题,还可以用于验证系统规格,以确保与依赖 DirectX 技术的游戏或软件兼容。
在 Windows 上搜索并运行“dxdiag”以启动 DirectX 诊断工具。
您可以看到以下用户界面:系统和显示。这台电脑是我现在用的笔记本:微软Surface Studio Laptop。
英文:Use DirectX Diagnostic Tool (dxdiag) to View System Information
在Windows Subsystem for Linux (WSL)设置中,“启用调试控制台”选项允许您直接从WSL环境访问详细的调试信息。此功能有助于排查WSL进程的问题,提供对系统调用、内核交互和性能瓶颈的洞察。尤其当您的WSL环境无法启动时,它在调试中非常有用。
要在WSL中启用调试控制台,请按照以下步骤操作:
使用管理员权限打开PowerShell或Windows Terminal。
运行以下命令:
wsl --update
以确保您拥有最新的WSL版本。
通过更新WSL配置文件来启用调试控制台:
打开位于WSL发行版中的/etc/wsl.conf文件。
添加以下配置:
[wsl2] debugConsole=true
保存文件并重启WSL:
wsl --shutdown wsl
启用后,调试控制台可以提供详细的日志和系统诊断信息,帮助解决问题或优化您的WSL环境。
另一种启用WSL调试控制台的方法是通过Windows Subsystem for Linux设置的图形用户界面(GUI)。以下是操作步骤:
按Windows + I键打开设置,导航到“系统”,然后选择“为开发人员”。
向下滚动到“Windows Subsystem for Linux”部分。点击WSL选项下的“管理设置”。
在WSL设置窗口中,切换“启用调试控制台”选项为“开”。
启用后,通过在终端中运行wsl –shutdown或重启计算机来重启WSL。
这种方法更简单,不需要手动编辑配置文件,适合那些喜欢使用GUI方法的用户。
英文:Enabling the Debug Console for WSL2 (Windows Subsystem for Linux)
本文一共 396 个汉字, 你数一下对不对.软件工程师(aka 码农)可以让ChatGPT来帮助审核代码。我发现在工作中挺好用的,把同事的PR(Pull Request)代码贴给ChatGPT,那么它会帮你看看代码中是否有问题,是不是有一些BUG,甚至会给你一些建议,效果很不错。很多时候我发现ChatGPT比我更专业,很能给出中肯的建议(我甚至想不到的方面,也帮助我拓展了思路)
不过,我不建议完全依赖于ChatGPT,至少在拿到ChatGPT的审核结果后你需要自己再看一眼,看看是不是有道理。切忌直接Copy/Paste。
你也可以试一试其它AI工具,像Google的Gemini(以前叫Bard),还有Claude AI等(现在各类AI通用人工智能真是百花其放)。
英文:ChatGPT Use Case for Software Engineer: Review Pull Requests (Code Reviews)
在面试流程(例如筛选)的早期阶段,一位 Google 招聘人员曾向我问过这个问题。
在C++中,当你使用std::map访问一个不存在的键时,行为取决于你是如何访问它的。
如果键不存在,std::map 会默认插入一个该键的元素,并为其赋值为类型的默认值。比如,如果 map 的值类型是 int,那么它会插入该键并赋值为 0。
例子:
std::map<int, int> myMap; int value = myMap[10]; // 如果键10不存在,会插入myMap[10] = 0
如果键不存在,at() 会抛出 std::out_of_range 异常。
例子:
std::map<int, int> myMap; try { int value = myMap.at(10); // 如果键10不存在,会抛出异常 } catch (const std::out_of_range& e) { std::cout << "Key not found!" << std::endl; }
find() 方法不会修改 map,它返回一个迭代器。如果键不存在,它会返回 map.end()。
例子:
std::map<int, int> myMap; auto it = myMap.find(10); if (it == myMap.end()) { std::cout << "Key not found!" << std::endl; } else { std::cout << "Value: " << it->second << std::endl; }
std::unordered_map 处理不存在的键与 std::map 类似,但有一些差异,主要是因为它们内部的数据结构不同。
map 和 unordered_map 的区别:
总的来说,std::unordered_map 和 std::map 在处理不存在的键时,对于 []、at() 和 find() 的行为相似,但它们在顺序和性能方面存在差异。
英文:C++: Access a Non-existent Key in std::map or std::unordered_map
这几天英国天气太热了,都二十七八度了,家里楼上简直是桑拿。因为英国的房子大多数都很保暖。不过楼下的阳光房简直是冬天冷死,夏天热死。也没有装空调,所以只能拿个小风扇吹吹,吹出来的风确是暖和的。
我那微软的Surface Studio笔记本就突然很热,变得特别的卡,CPU风扇也狂转很吵,然后我就发现系统很卡,重启了也就好使,卡得几乎不能用了,勉强打开WINDOWS任务管理器发现CPU被严重限速了,最低CPU主频只有0.4 GHz,好一点的 0.9, 1.2。这CPU是11th Gen Intel(R) Core(TM) i7-11370H @ 3.30GHz 平常能到 3.8, 3.9。
再过一会儿 就蓝屏了/BSOD/Blue Screen of Death。显示的问题是英伟达Nvidia GPU显卡驱动 nvlddmkm.sys。
当您的Intel CPU过热时,它会自动降低其时钟速度以降低温度,这一过程称为降频。这种保护措施有助于防止CPU损坏,但会显著影响性能。在进行游戏、视频编辑或运行复杂的模拟等密集任务时,降频现象尤其明显。
尽管NVidia GPU非常强大,但它们也会在高温下出现问题。过热会导致GPU崩溃,从而引发Windows 11上的著名蓝屏(BSOD)。BSOD是Windows在遇到严重错误时执行的紧急停止,通常会导致系统重启并可能丢失未保存的工作。
造成过热的原因有很多:
为了防止降频和崩溃,请考虑以下步骤:
高温对电脑性能构成了重大风险,特别是对于运行Windows 11的Intel CPU和NVidia GPU系统。通过了解原因并实施有效的冷却和维护策略,您可以减轻降频和崩溃的风险,确保系统即使在高温下也能保持稳定和高效。
保持凉爽,让您的电脑更凉爽!
最近英特尔摊上了大麻烦,简单的说,是严重的产品质量问题。问题发生着酷睿13代和14代的全部中高端型号上包括了i9-13900/KS/KF/K/T,17-13700/K/KF/T,i5-13600/K/KF,还有14代的14900KS/KF/K、14700K/KF,甚至还包括使用13代或者14代的笔记本处理器相当多的型号比如13900HX。这里就不挨个念了。
具体是什么故障呢?就是频繁的程序崩溃、死机和蓝屏。而且一旦出现后,在软件或者主板BIOS上无论怎么更新都无济于事,相当于这个CPU接近报废了。
故障发生率有多高呢?不同的经销商统计标准不一样,但大都要比自己手里AMD的CPU故障率至少高一个数量级。比如,有些经销商经营了CPU十几年,返修率平均只有千分之三,但酷睿13代和14代大约在5%左右。更有经销商的客户是游戏开发人员或者服务器领域的,他们统计这两年卖出的800万块13代处理器,故障率竟然高达25%。
两个经销商故障率差异大主要是因为–面向普通用户,平时使用CPU时大都是办公环培负载很轻:个早服条干游戏开发和服务器,CPU一般都是满载,所以故障率很高。要知道,CPU里是没有任何活动部件的,所以这类产品在普通家庭或者办公中使用是几乎永远也坏不了的。今天我们听说一台电脑里的CPU已经工作15年了,这一点也不稀奇。换掉它的唯一原因是性能不够用了,而很少是因为CPU坏掉了。而那些带活动部件的东西,比如说洗衣机,如果能用15年,相信大家听说后的第一反应就是–真耐用。
英文:Hot Weather Causes Intel CPU Throttle and NVidia GPU Crashes on Windows 11 (Blue Screen)
周四晚上TEAMS开个会,公司电脑崩了,尴尬了,不过这个可能和最近INTEL CPU暴出的漏洞有关,INTEL股价大跌。
Windows 11的两个设定得关了,否则电脑的性能会大大的受到影响。
微软Windows的隐私设置弊大于利,大部分情况下,关掉这些隐私设置并不会影响使用,相反开启这些设置会让你的系统变卡变慢,甚至可能会有一些安全隐患。
关闭方法:Windows + I 键打开设置,然后在左下角选择隐私/安全(Privacy & Security),然后选择(通用/General),然后把这些设置全关了。
这个更新优化在后台消耗你的网络流量,并且会大量占用你的电脑硬盘(因为会存Windows更新文件),这个优化更新(Delivery Optimisation)的原理就是在别的用户需要下载更新的时候你作为一个P2P节点提供数据,当然这个是两个方向的,你需要下载更新的时候也可以从邻近的用户电脑里下载(速度会快一些),不过这有可能有安全隐私隐患。
关闭方法:Windows + I 键打开设置,然后在左下角选择安全更新(Windows Update),然后选择高级选项(Advanced Options),然后关了即可。
更新:今天,微软全球大规模机器宕机,影响了各大行业(金融/航空/酒店等),追其原因是因为杀毒软件CrowdStrike推送的一个更新有问题导致的。
当地时间7月19日,微软公司旗下部分应用和服务出现访问延迟、功能不全或无法访问问题,全球大量微软Windows用户遭遇蓝屏,相关话题登上热搜。
据媒体报道,微软支持中心客服人员表示,对于电脑出现批量蓝屏的情况,了解到大部分蓝屏都是公司电脑安装了三方杀毒软件之后出现的。
客服称,目前确认到是相关的杀毒软件更新导致的蓝屏,这种情况如果修改驱动文件名称无效,只能建议联系公司IT进一步处理。
据了解,今天CrowdStrike Falcon的Sensor更新后,内核驱动文件csagent.sys导致全球大面积Windows系统蓝屏。
网络安全软件公司Crowdstrike在其支持平台发布消息称,公司收到大量关于Windows电脑出现蓝屏的报告,公司工程部已确定该问题与“内容部署(content deployment)”有关,目前已恢复了这些更改。建议受影响的用户将电脑启动到安全模式或恢复环境,导航至C:\Windows\System32\drivers\CrowdStrike目录,找到与“C-00000291*.sys”匹配的文件并将其删除,即可正常启动电脑。
有网友支招,通过恢复模式启动,或多次异常重启进入安全模式,重命名以下文件为其他文件名:
C:\Windows\System32\drivers\CrowdStrike\csagent.sys。
或直接重命名C:\Windows\System32\Drivers\Crowdstrike文件夹。
英文:Two Windows Tips: Turn Off Delivery Optimization and Tweak Privacy Settings
本文一共 794 个汉字, 你数一下对不对.