From Clicks to Commands: A Windows User's Survival Guide

本篇 Blog 正在更新中 这篇 Blog 主要记录了一些在 Unix 终端环境下对应的 Windows 下的常见的鼠标操作 主要面向 Linux 和 MacOS 的新手们,所以有些信息会被简化或者忽略 可为什么要用终端/命令行呢? 就像“为什么使用 Vim”一样,原因有很多,对于我来说,它足够简单,足够快,支持许多的自定义,是 Programmable 的 在程序员的世界里,你真的能够做到(抖个机灵哈哈哈): 如果你觉得终端难用,就去定制你的 Shell 配置;如果你觉得命令不够方便,就写个函数或别名把它封装得更好;如果你觉得工具功能太弱,就用脚本扩展它的能力;如果你觉得操作繁琐,就从自动化开始,一点点改善工作流程,而不是一昧地抱怨,排斥,逃向 GUI。 Left Click 首先需要学习的肯定是鼠标左键的双击 — 打开某个文件夹,以及打开某个文件夹后的结果:查看这个文件夹的内容 对应到终端中: cd 跳转到某个文件夹 ls 展示文件夹的内容 > ls Applications Playground DataGripProjects Projects Desktop Public Documents Scripts Downloads Temp Dropbox Virtual Machines.localized Library Zotero Movies dotfiles-main Music go Pictures > cd Projects 在使用 cd 命令时,不用把文件夹的名字输入完整 比如想要 cd Projects,只需要输入 cd Pro,然后按下键盘上的 Tab 键,就能触发自动补全 ...

November 26, 2024 · 3 min · KKKZOZ

Dev Operations

写在前面 本篇博客主要会记录和总结一些我平时在 Unix 环境下遇到的一些问题,包括但不局限于命令行,Git 操作等 CommandLine 可执行文件存放位置 如果我有一个可执行文件,我应该把它放在哪里 /usr/local/bin 最推荐的位置 所有用户都可访问 该目录默认在 PATH 中 适合系统级的第三方软件 $HOME/.local/bin 用户级安装的推荐位置 只对当前用户可用 需要确保该目录在 PATH 中 要将文件复制到 /usr/local/bin,使用: ...

November 25, 2024 · 10 min · KKKZOZ

Mac Development Environment Setup

How to install Homebrew? 参考资料 homebrew 软件仓库和 homebrew bottles 软件仓库有什么不一样 homebrew 仓库类型主要有两种,它们用途不同: homebrew 软件仓库(brew git remote) 包含所有软件包的安装脚本(Ruby 格式的 Formula) 主要仓库是 homebrew-core 仓库相对较小,包含的是软件包的描述文件 homebrew bottles 软件仓库 存放预编译的二进制软件包 类似于 Linux 下的 .deb 或 .rpm 包 仓库较大,因为包含实际的软件二进制文件 使用 bottles 可以避免从源码编译,加快安装速度 举例说明: 当你运行 brew install wget 时: Homebrew 先从软件仓库获取 wget 的 Formula 然后检查 bottles 仓库是否有对应的预编译包 如果有 bottle 就直接下载安装,否则就按照 Formula 的指示编译源码 所以设置镜像时通常需要同时配置这两种仓库: 配置软件仓库以获取安装脚本,同时配置 bottles 仓库来获取预编译包 安装步骤 前置条件 在终端中执行 xcode-select --install 设置环境变量 首先设置环境变量,方便使用国内镜像进行安装 export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git" export HOMEBREW_INSTALL_FROM_API=1 安装 Homebrew /bin/bash -c "$(curl -fsSL https://github.com/Homebrew/install/raw/master/install.sh)" 设置镜像 # 将下面这段内容添加到 ~/.zshrc 中 export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api" export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles" 完整流程是: ...

November 21, 2024 · 3 min · KKKZOZ

A Piece Of: Golang Profile

Tips on Profile 先说几个小坑点: 默认情况下,Golang Profile 取样的频率为 100Hz,意味着每 10ms 才会取样一次,所以程序运行时间少于 10ms 肯定不会被取样 但是我们可以通过 runtime.SetCPUProfileRate() 重新设置值,重新进行调试,比如将采样率设置为 1000,每 1ms 就会取样一次,但是这样对性能的开销很大,Golang 官方建议这个值不要设置在 200 以上 其实最好的还是让程序多运行一段时间,比如 1s 左右,个人测试即使将采样率调高,如果一个程序只运行 10ms 左右,采样的结果也大概率为空 在正确位置设置上述语句后,程序提示 “runtime: cannot set cpu profile rate until previous profile has finished.",这句错误提示简直不明不白的,我第一次看到这个错误提示还以为就是字面意思:系统中可能存在正在运行的 profile 程序 查资料后发现,runtime.SetCPUProfileRate() 是一种比较 Hack 的做法,所以该错误提示可以忽略 在程序运行时,直接通过 kill 命令结束程序的话,最后生成的 profile 为空(?),最好使用下面的这个模式: sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) server := NewServer(port, connMap) go server.Run() <-sigs Log.Info("Shutting down server") 通过 signal.Notify 来拦截 kill 的信号,保证程序能够正常结束,profile 文件不为空 How to Profile if pprofFlag { // runtime.SetCPUProfileRate(1000) cpuFile, err := os.Create("executor_profile.prof") if err != nil { fmt.Println("无法创建 CPU profile 文件:", err) return } defer cpuFile.Close() // 开始 CPU profile if err := pprof.StartCPUProfile(cpuFile); err != nil { fmt.Println("无法启动 CPU profile:", err) return } defer pprof.StopCPUProfile() } 注意这段代码只能放在 main 函数中,否则 defer 语句的语义会有影响 How to Read Profile Results 命令行 (pprof) top 10 Showing nodes accounting for 40ms, 100% of 40ms total Showing top 10 nodes out of 26 flat flat% sum% cum cum% 10ms 25.00% 25.00% 10ms 25.00% os.(*File).checkValid (inline) 10ms 25.00% 50.00% 10ms 25.00% runtime.(*mheap).allocSpan 10ms 25.00% 75.00% 10ms 25.00% runtime.(*profBuf).read 10ms 25.00% 100% 10ms 25.00% runtime.startm 0 0% 100% 10ms 25.00% log.(*Logger).Output 0 0% 100% 10ms 25.00% log.Println 0 0% 100% 10ms 25.00% main.main.func1 0 0% 100% 10ms 25.00% os.(*File).Write 0 0% 100% 10ms 25.00% runtime.(*mcache).nextFree 0 0% 100% 10ms 25.00% runtime.(*mcache).refill flat:该函数本身直接消耗的时间。比如,flat = 10ms 表示这个函数自身消耗了 10 毫秒的 CPU 时间,而不是它调用的其他函数所消耗的时间。 ...

October 23, 2024 · 4 min · KKKZOZ

Missing Semester - Lecture 5

Job Control Signals can do other things beyond killing a process. For instance, SIGSTOP pauses a process. In the terminal, typing Ctrl-Z will prompt the shell to send a SIGTSTP signal, short for Terminal Stop. We can then continue the paused job in the foreground or in the background using fg or bg. One more thing to know is that the & suffix in a command will run the command in the background, giving you the prompt back. ...

October 17, 2024 · 4 min · KKKZOZ