Logo

site iconJustYY | 小赖子

小赖子的英国生活和资讯,以及投资和个人生活。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

JustYY | 小赖子 RSS 预览

Windows Powershell下touch命令的实现

2026-03-02 19:52:52

PowerShell 中的 touch 命令(兼容 Linux 风格)

如果你来自 Linux/macOS 环境,可能会很想念 touch 命令:当文件不存在时创建文件,存在时更新它的修改时间。PowerShell 本身并没有内置 touch 命令,但我们可以自己实现一个行为与 Unix 类似的版本(支持多个文件和通配符)。 本文提供一个实用的 touch 函数,你可以将其添加到 PowerShell Profile 中长期使用,同时包含示例和一些边界情况说明。

“touch” 应该具备的行为

在 Unix 系统中,touch 通常具备以下特性:
  • 如果文件不存在,则创建一个空文件
  • 如果文件存在,则更新其“最后修改时间”
  • 支持多个文件路径
  • 支持通配符,例如 *.txt
  • 默认情况下不输出多余信息
下面我们将在 PowerShell 中实现这种行为。

一次性使用的简单版本(单文件)

如果你只是临时使用一次,下面是一行实现“创建或更新时间”的最简写法(不会向文件追加换行):

if (Test-Path .\file.txt) { (Get-Item .\file.txt).LastWriteTime = Get-Date } else { New-Item -ItemType File -Path .\file.txt | Out-Null }

Linux 风格的 touch 函数(支持多个文件 + 通配符)

该函数具有以下特性:
  • 支持一个或多个路径参数
  • 支持通配符展开
  • 为已存在文件更新时间戳
  • 可选创建不存在的父目录
  • 不会修改文件内容
默认情况下不会输出多余信息。

function touch { 
    [CmdletBinding()] 
    param( 
        [Parameter(Mandatory=$true, ValueFromRemainingArguments=$true)] 
        [string[]] $Path,

        # 可选:当父目录不存在时自动创建
        [switch] $MakeDirs
    )

    $now = Get-Date

    foreach ($p in $Path) {

        # 展开通配符(例如 *.txt),若无匹配则按字面路径处理
        $expanded = @(Get-ChildItem -LiteralPath $p -ErrorAction SilentlyContinue)

        if ($expanded.Count -gt 0) {
            foreach ($item in $expanded) {
                if ($item.PSIsContainer) {
                    continue  # 跳过目录(Unix 行为可不同,这里更安全)
                }
                $item.LastWriteTime = $now
            }
            continue
        }

        # 没有通配符匹配时,按普通路径处理
        if (Test-Path -LiteralPath $p) {
            $item = Get-Item -LiteralPath $p
            if (-not $item.PSIsContainer) {
                $item.LastWriteTime = $now
            }
            continue
        }

        # 创建文件(可选创建父目录)
        if ($MakeDirs) {
            $parent = Split-Path -Parent $p
            if ($parent -and -not (Test-Path -LiteralPath $parent)) {
                New-Item -ItemType Directory -Path $parent -Force | Out-Null
            }
        }

        New-Item -ItemType File -Path $p -Force | Out-Null
    }
}

使用示例

创建或更新时间一个文件:
touch .\hello.txt
同时操作多个文件:
touch .\a.txt .\b.txt .\c.txt
更新当前目录下所有 .log 文件:
touch *.log
在嵌套目录中创建文件,并自动创建目录:
touch .\logs\2026\app.log -MakeDirs

永久安装 touch(添加到 PowerShell Profile)

PowerShell 启动时会加载 Profile 脚本。你可以把上面的函数添加到 Profile 文件中。 打开(或创建)Profile 文件:
notepad $PROFILE
touch 函数粘贴进去,保存并重启 PowerShell。 如果 Profile 被禁用,可以为当前用户启用:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

可选:更接近 Linux 的使用体验

如果你希望使用更短的别名:
Set-Alias -Name t -Value touch
也可以把这行加入 Profile。

注意事项

目录处理:当前实现会跳过目录。如果你希望“touch 目录也更新时间”,可以删除 PSIsContainer 判断。 通配符:PowerShell 使用 Get-ChildItem 处理通配符。如果通配符没有匹配结果,函数会按普通路径创建该文件(符合大多数人的预期)。 不会修改文件内容:不同于 "" >> file 的做法,本函数不会向文件追加换行或改变文件内容。 英文:The touch command in Windows Powershell

坐缆车登上瑞士少女峰Jungfraujoch

2026-03-02 07:42:49

登上欧洲之巅:我的少女峰之旅 年末瑞士行:在Jungfraujoch看见世界的高度 五天四晚,奔赴少女峰的冰雪世界 申根签证到期前的最后一站:瑞士少女峰 站在3454米的地方,和这一年告别 瑞士冬日记:从Interlaken到欧洲之巅 年终收官之旅:少女峰的白色震撼 《站在欧洲之巅,与这一年告别》 《年末瑞士行:少女峰 Jungfraujoch 全记录》
去年年底,趁着申根签证还未到期,我们决定把瑞士作为这一年的收官之旅。五天四晚的行程中,最重要的一站,自然是登上少女峰——Jungfraujoch。 少女峰 Jungfraujoch 位于瑞士伯尔尼高地,海拔 3454 米,是欧洲海拔最高的火车站所在地,因此被称为“欧洲之巅”(Top of Europe)。它坐落在少女峰(Jungfrau)与僧侣峰(Mönch)之间,俯瞰壮丽的阿莱奇冰川(Aletsch Glacier)——这是阿尔卑斯山脉最长的冰川,也被列入联合国教科文组织世界自然遗产名录。游客可以搭乘齿轨火车穿越隧道直达山顶,在观景平台远眺连绵雪峰,在冰宫感受晶莹剔透的冰雪世界。这里不仅是瑞士最具代表性的地标之一,也是许多人心中一生必去的高山目的地。 上山的路线有好几种。我们选择从 Interlaken 坐火车前往 Grindelwald,然后转乘缆车,大约 15 分钟到达 Eigergletscher,再换乘齿轨火车一路攀升至 Jungfraujoch。下山时则选择直接乘火车返回,省时也更从容。 [caption id="attachment_71041" align="alignnone" width="1155"]瑞士少女峰上山路径 瑞士少女峰上山路径[/caption] 那段 15 分钟的缆车旅程其实挺刺激。车厢悬在高空,脚下是陡峭的山坡和白茫茫的雪地,偶尔缆车会轻轻晃动一下,甚至带来一瞬间微微的失重感,让人心里一紧。好在天气很好,视野开阔。透过车窗往下看,可以看到很多人在山坡上滑雪,身影在雪地上划出一道道优雅的弧线,自由又惬意。 少女峰 Jungfraujoch 被称为“欧洲之巅”(Top of Europe),海拔 3454 米,是欧洲海拔最高的火车站。这里位于阿尔卑斯山脉的核心区域,四周被冰川环绕,壮阔而纯净。站在观景平台上,远处连绵的雪峰在阳光下闪闪发亮,仿佛置身于一个巨大的冰雪王国。空气清冽,寒风凛冽,但那种辽阔与震撼,让人几乎忘记寒冷。 在冰宫里,晶莹剔透的冰雕和冰墙透出幽蓝的光;在观景台上,游客们裹着厚厚的羽绒服拍照留念,每个人脸上都带着兴奋与满足。那一刻会真正理解,为什么这么多人不远万里来到这里——并不仅仅是为了“打卡”,而是为了亲眼看看世界的高度。 五天的瑞士之行,其实并不算长,但足够让人放慢脚步。湖水像镜子一样安静,小镇干净而有秩序,远处的雪山像背景板一样永远矗立在那里。作为一年的最后一趟旅行,它既有仪式感,也带着一点对新一年的期待。站在“欧洲之巅”回望过去的一年,忽然觉得,很多烦恼都变得渺小了。 PS:山顶风很大,也非常冷,我们都裹得严严实实。听说少女峰上能遇到晴朗天气并不算常见,所以这次能看到蓝天白雪,算是相当幸运。中午我们在山顶的快餐店简单吃了点东西就准备下山了。由于海拔高、空气稀薄,稍微走几步就觉得有点累,甚至有些发晕,只能放慢节奏慢慢走。 视频:油管/Youtube | B站/小破站 | 微博视频 | 西瓜视频 | 微信视频号 | X/推特 | 小红书 | Facebook [caption id="attachment_71049" align="alignnone" width="2048"]瑞士雪山边上的房子/好幸福 瑞士雪山边上的房子/好幸福[/caption] [caption id="attachment_71048" align="alignnone" width="2048"]山腰上的火车站,空气有点稀薄 山腰上的火车站,空气有点稀薄[/caption] [caption id="attachment_71047" align="alignnone" width="2048"]缆车往外拍的雪山美景 缆车往外拍的雪山美景[/caption] [caption id="attachment_71046" align="alignnone" width="1365"]少女峰上风大很冷 老大包的严严实实。 少女峰上风大很冷 老大包的严严实实。[/caption] [caption id="attachment_71045" align="alignnone" width="1108"]从缆车下来,最后一段路程我们选择火车上去。 从缆车下来,最后一段路程我们选择火车上去。[/caption] [caption id="attachment_71044" align="alignnone" width="2048"]和媳妇在少女峰上合影,用AI把背景的游客删掉了 和媳妇在少女峰上合影,用AI把背景的游客删掉了[/caption] [caption id="attachment_71043" align="alignnone" width="2048"]很幸运,上山那一天天气晴朗。 很幸运,上山那一天天气晴朗。[/caption] [caption id="attachment_70749" align="alignnone" width="2048"]2025-12-27全家爬上了瑞士少女峰 jungfraujoch 2025-12-27全家爬上了瑞士少女峰 jungfraujoch[/caption] [show_file file="/var/www/wp-post-common/justyy.com/switzerland.php"]

第一次被微软官方认证为AI工程师助理 AI Engineer Associate (AI-102)

2026-02-23 19:23:05

上周五中午抽空去了 Peterborough(单程开车约50分钟),参加并通过了 AI-102:Microsoft AI Engineer Associate 认证考试,中文可以理解为“微软 AI 工程师助理”。 被官网认证为AI工程师助理! [caption id="attachment_71027" align="alignnone" width="1137"]AI-102微软人工智能工程师/助理 AI-102微软人工智能工程师/助理[/caption] 之前考过的 AI-900 属于基础级认证,没有过期时间,证书上是一颗星。 这次通过的是两颗星的中级认证(费用165美元)。中级及以上证书有效期为一年,过期前6个月可以在线免费续考。据说如果续考没通过,可以每24小时重考一次,也就是说理论上最多有大约180次续考机会。 这次的 AI-102 难度明显高于 AI-900。AI-900 主要考察对概念的理解,而 AI-102 不仅要求理解原理,还要掌握具体 API 的使用方法,以及在不同场景(Case Study)下如何选择和应用合适的 AI 模型。 考试时长大约两小时,分为两部分。 第一部分是选择题(单选、多选、下拉、排序等),可以标记(Mark for review)后面再回头检查。 第二部分是 Case Study,提交后无法返回修改。我做完第一部分并复查后,开始第二部分时只剩下大约20分钟,时间还是挺紧张的。 考过之后真的很开心。这也是获取多巴胺的一种方式吧。努力学习,卷起来,给孩子做榜样,保持持续学习的状态 💪 [show_file file="/var/www/wp-post-common/justyy.com/exams.php"]

竞赛选手几乎都会写的两行 C++ 代码

2026-02-23 19:08:26

竞赛选手几乎都会写的两行 C++ 代码

在刷算法题、打竞赛的人里,几乎都能看到 main() 里先写这两行:
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}
很多新手会觉得像“祖传模板”,但它们确实能在 IO 很重的题里显著提速。原因主要有两个:同步和自动刷新。

1) 为什么 ios::sync_with_stdio(false) 能加速?

C++ 常用输入输出是 cin / cout。默认情况下,它们会和 C 的 scanf / printf 保持同步。 同步的意思是:当你用 cout 输出时,C++ 的 IO 层会和 C 的 stdio 层做额外的协调工作,确保两套机制混用时输出顺序一致。但在竞赛里我们通常只用 cin/cout,不需要这种同步,反而增加开销。 所以这一行:
ios::sync_with_stdio(false);
会解除 C++ IO 与 C IO 的同步,从而减少不必要的开销,尤其在大量读写数据时更明显。

2) 为什么 cin.tie(nullptr) 也能加速?

cout 并不会每输出一次就立刻写到终端,而是先进入缓冲区,之后再统一刷新(flush),因为频繁和操作系统交互很慢。 默认情况下,cin 会“绑定”(tie)到 cout:每次执行 cin 读取之前,都会自动把 cout 的缓冲区刷新一次,以保证交互式程序里提示信息能及时显示。 但竞赛题不是交互式程序,没必要每次读入前都 flush,于是这一行:
cin.tie(nullptr);
会解除 cincout 的绑定,避免额外的自动刷新,进一步提升 IO 性能。

推荐写法

把两行放在 main() 最开始:
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}

什么时候不建议用?

  • 你混用 scanf/printfcin/cout 时(关闭同步后可能导致顺序问题)。
  • 交互题需要及时输出提示并立刻读取输入时(tie 可能影响提示及时显示)。
除此之外,在大多数竞赛/刷题场景里,这两行属于“低成本高收益”的常规优化,写上基本不会错。 高中时参加 NOIP,用的是 Turbo Pascal。那时候写竞赛代码,基本不追求可读性,各种“骚操作”层出不穷,代码往往晦涩难懂,但这并不妨碍最后拿奖。 竞技编程本身就更强调效率和技巧,而不是可维护性。甚至像每年举办的 C 语言混淆大赛,写出来的代码几乎没人能一眼看懂,却依然能正确运行,效果惊艳。 类似地,很多 Python 也能用一两行写出看似“神奇”的实现,但放到工业环境里几乎不可维护、不可扩展。 竞赛代码和工程代码,本质上是两种完全不同的思维方式。 英文:Competitive Programming: Two Simple Tricks in C++ To Make Code Faster

一个月考过四个初级微软计算机证书: 云+AI+数据+安全

2026-02-13 07:11:52

[caption id="attachment_71003" align="alignnone" width="1382"]微软证书/升级打卡 微软证书/升级打卡[/caption] [caption id="attachment_71002" align="alignnone" width="2048"]微软证书/升级打卡 微软证书/升级打卡[/caption]

一个月拿下 4 张微软证书:云、AI、数据、安全

上一两个月里,我在一个月之内考过了四个微软的初级证书,分别对应计算机的四大方向:云、AI(人工智能)、数据和安全。 毕竟干码农也十几二十年了,除了做了几套练习题外,基本没有系统复习,所以整体来说考得还算轻松。 我是去年十一月左右,偶然在公司内部的一个学习频道里看到考证的信息。微软员工考自家的证书(和其他大厂,比如 AWS 一样)是免费的。 这种“薅羊毛”的机会,我怎么可能错过?一件事情如果同时有好几个好处,我一般都会去做。考证这件事正好满足:
  • 免费(公司报销 / 内部 voucher)
  • 有明确目标,能推动自己系统学习
  • 简历上更好看
  • 对知识结构做一次系统性梳理

微软证书体系结构

微软证书大致分三个等级:
  • Fundamentals(初级,通常是 -900 系列)
  • Associate(中级)
  • Expert(高级)
我这次考的四张都是 初级/Fundamentals 级别。 像 PL-900 这样的证书也属于 Fundamentals,不过对程序员/工程师的帮助相对有限(更偏业务应用),所以我没有继续考其他方向。

考试时间与题型

  • Fundamentals:总考试时间约 60 分钟,实际答题时间约 45 分钟
  • Associate / Expert:总考试时间约 2 小时,答题时间约 100 分钟
题型主要是选择题,包括单选和多选。

费用说明(更严谨版本)

微软认证考试是全球统一体系,但价格会因国家/地区不同而有所调整。 大致标准定价如下(以官方公开价格为参考):
  • Fundamentals:约 99 美元
  • Associate / Expert:约 165 美元
注意几点:
  • 在英国考试通常以英镑定价,不一定正好换算成 99 / 165 美元。
  • 实际价格取决于你注册考试时选择的考试区域。
  • 微软偶尔会有活动(例如 Ignite 赠送考试券),但不是常态。
  • 公司内部员工通常可以通过内部渠道免费考试(我就是这种情况)。

有效期与续证规则(重要)

这一块很多人容易搞混。

Fundamentals(-900 系列)

  • 永久有效
  • 不需要续证

Associate / Expert

  • 有效期 1 年
  • 在证书到期前 6 个月内可以免费在线续证
  • 续证是在线评估(无需去考试中心)
  • 不需要重新参加完整考试
也就是说,中高级证书不是“永久一次考完”,而是需要每年维护。

考试地点选择

我这四次考试都是去考试中心考的:
  • 两次在 Peterborough
  • 两次在 Bedford
剑桥没有考点,这两个算是离我最近的:
  • Peterborough:单程开车约 45 分钟
  • Bedford:大约 40 分钟
虽然可以选择在家考试(在线监考),但流程比较严格:
  • 必须提前下载安装考试软件
  • 全程摄像头监考
  • 房间内不能有任何其他物品(书籍、纸张等)
  • 监考人员可能会要求你转动摄像头检查环境
对我来说,直接去考试中心反而更省事。

个人感受

这四张证书对我来说,不是为了“证明我会”,而是一次系统性复盘。 平时工作中很多知识是碎片化的:云架构、AI 服务、数据处理、安全模型。考证的过程,相当于把这些碎片重新结构化了一遍。 免费的学习动力 + 明确的目标 + 可量化的结果,是一个非常不错的组合。 微软证书:
Code 领域 证书名 证书编号 获得日期
AI-900 人工智能/AI Azure AI Fundamentals 7Z9DA9-388866 2025年12月19日 (大纲)
DP-900 数据/Data Azure Data Fundamentals CD4244-E236BG 2025年12月19日 (大纲)
SC-900 安全/Security Security, Compliance, and Identity Fundamentals B6A851-BECO96 2026年1月13日 (大纲)
AZ-900 云/Cloud Azure Fundamentals B6FAD6-2S7125 2026年1月16日 (大纲)

持续学习的能力

报了考试,就有动力学习,也会逼迫自己每天学习。每天学习1小时,打鸡血!复利的作用/Compound Effect。 考证的目的是让自己变得更强,让自己变得更值钱,听说考完证更容易升职或找工作,也不知道是不是真的。 已经报了AI-102和AZ-204,希望自己一切顺利! [show_file file="/var/www/wp-post-common/justyy.com/exams.php"]