MacOS
2024-09-16
-> % tree -dL2 /
/
├── Applications
│ ├── Another Redis Desktop Manager.app
│ ├── Apifox.app
│ ├── Beyond Compare.app
│ ├── CopyQ.app
│ ├── DBeaver.app
│ ├── DingTalk.app
│ ├── GitButler.app
│ ├── Install macOS Monterey.app
│ ├── Microsoft Edge.app
│ ├── Nutstore.app
│ ├── OpenVPN Connect
│ ├── OpenVPN Connect.app -> /Applications/OpenVPN Connect/OpenVPN Connect.app
│ ├── Safari.app -> ../System/Cryptexes/App/System/Applications/Safari.app
│ ├── Utilities
│ ├── WeChat.app
│ ├── Wireshark.app
│ ├── iTerm.app
│ ├── wpsoffice.app
│ ├── 优酷.app
│ └── 企业微信.app
├── Library
│ ├── Apple
│ ├── Application Support
│ ├── Audio
│ ├── Bluetooth
│ ├── Bundles
│ ├── Caches
│ ├── Catacomb
│ ├── ColorPickers
│ ├── ColorSync
│ ├── Components
│ ├── Compositions
│ ├── Contextual Menu Items
│ ├── CoreAnalytics
│ ├── CoreMediaIO
│ ├── Developer
│ ├── DirectoryServices
│ ├── Documentation
│ ├── DriverExtensions
│ ├── Extensions
│ ├── Filesystems
│ ├── Fonts
│ ├── Frameworks
│ ├── GPUBundles
│ ├── Google
│ ├── Graphics
│ ├── Image Capture
│ ├── Input Methods
│ ├── InstallerSandboxes
│ ├── Internet Plug-Ins
│ ├── Java
│ ├── KernelCollections
│ ├── Keyboard Layouts
│ ├── Keychains
│ ├── LaunchAgents
│ ├── LaunchDaemons
│ ├── Logs
│ ├── Modem Scripts
│ ├── OSAnalytics
│ ├── OpenDirectory
│ ├── Perl
│ ├── PreferencePanes
│ ├── Preferences
│ ├── Printers
│ ├── PrivilegedHelperTools
│ ├── QuickLook
│ ├── Receipts
│ ├── Ruby
│ ├── Sandbox
│ ├── Screen Savers
│ ├── ScriptingAdditions
│ ├── Scripts
│ ├── Security
│ ├── Speech
│ ├── Spotlight
│ ├── StagedDriverExtensions
│ ├── StagedExtensions
│ ├── StartupItems
│ ├── SystemExtensions
│ ├── SystemMigration
│ ├── SystemProfiler
│ ├── Trial
│ ├── Updates
│ ├── User Pictures
│ ├── User Template
│ ├── Video
│ └── WebServer
├── System
│ ├── Applications
│ ├── Cryptexes
│ ├── Developer
│ ├── DriverKit
│ ├── Library
│ ├── Volumes
│ └── iOSSupport
├── Users
│ ├── Guest
│ ├── Shared
│ └── adm
├── Volumes
│ └── 未命名 -> /
├── bin
├── cores
├── dev
│ └── fd
├── etc -> private/etc
├── home -> /System/Volumes/Data/home
├── opt
├── private
│ ├── etc
│ ├── tmp
│ └── var
├── sbin
├── tmp -> private/tmp
├── usr
│ ├── bin
│ ├── lib
│ ├── libexec
│ ├── local
│ ├── sbin
│ ├── share
│ └── standalone
└── var -> private/var
128 directories
Linux 目录结构
/home -> /System/Volumes/Data/home
/usr
/bin
/sbin
/etc -> private/etc
/var -> private/var
/opt
/tmp -> private/tmp
/dev
应用目录
/Applications/
/System/Applications/
/System/Volumes/Data/Applications/
-> % find / -maxdepth 5 -type d -name "*.app" > /tmp/a
-> % awk -F '/' '{path="";for(i=1;i<NF;i++){path=path $i "/"};c[path]++}END{for(i in c){printf "%5d %s\n",c[i],i}}' /tmp/a | sort -nr
107 /System/Library/CoreServices/
39 /System/Applications/
19 /System/Applications/Utilities/
18 /System/Library/Input Methods/
18 /Applications/
5 /Users/adm/Downloads/
4 /Library/Image Capture/Devices/
2 /System/Library/Services/
2 /Library/Input Methods/
2 /Applications/OpenVPN Connect/
1 /usr/libexec/
1 /System/Library/Classroom/
1 /Applications/Nutstore.app/Contents/
-> % type code
code is /usr/local/bin/code
-> % ll /usr/local/bin/code
lrwxr-xr-x@ 1 adm admin 167B 9 20 21:40 /usr/local/bin/code -> /private/var/folders/lh/vyr5k29j1cgbmd4b_lhpxq340000gn/T/AppTranslocation/F14FB3FE-0B4C-4F60-81FA-7AD83514E78D/d/Visual Studio Code.app/Contents/Resources/app/bin/code
-> % echo $TMPDIR
/var/folders/lh/vyr5k29j1cgbmd4b_lhpxq340000gn/T/
武汉
2024-09-15
| 景点 |
城市 |
区 |
位置 |
| 电影院 |
武汉 |
- |
光谷里 武昌泛悦奥特莱斯 江夏罗马春天 汉口北 |
| 黄鹤楼公园 |
武汉 |
武昌区 |
司门口 |
| 黄鹤楼落梅轩 |
武汉 |
武昌区 |
司门口 |
| 杜莎夫人蜡像馆 |
武汉 |
武昌区 |
楚河汉街 |
| 东湖落雁景区 |
武汉 |
东湖 |
- |
| 东湖飞鸟世界 |
武汉 |
东湖 |
- |
| 东湖游船 |
武汉 |
东湖 |
- |
| 龙泉山 |
武汉 |
江夏区 |
- |
| 武汉植物园 |
武汉 |
武昌区 |
鲁磨路 |
| 长春观 |
武汉 |
武昌区 |
大东门 |
| 九峰山森林公园 |
武汉 |
洪山区 |
- |
| 禧汤生活馆 |
武汉 |
洪山区 |
珞珈山 |
| 武汉园博园(武汉自然博物馆) |
武汉 |
硚口区 |
- |
| 张公山寨 |
武汉 |
青山区 |
- |
| 木兰天池 |
武汉 |
黄陂区 |
- |
| 木兰草原 |
武汉 |
黄陂区 |
- |
| 木兰云雾山 |
武汉 |
黄陂区 |
- |
| 木兰山 |
武汉 |
黄陂区 |
- |
| 花海乐园 |
武汉 |
黄陂区 |
- |
| 大余湾 |
武汉 |
黄陂区 |
- |
| 锦里沟 |
武汉 |
黄陂区 |
- |
| 清凉寨 |
武汉 |
黄陂区 |
- |
| 姚家山 |
武汉 |
黄陂区 |
- |
| 九真山 |
武汉 |
蔡甸区 |
- |
| 九真桃源 |
武汉 |
蔡甸区 |
- |
| 金龙水寨 |
武汉 |
蔡甸区 |
- |
| 紫微都市田园 |
武汉 |
新洲区 |
- |
| 凤娃古寨 |
武汉 |
新洲区 |
- |
| 花朝河湾 |
武汉 |
新洲区 |
- |
| 香草伊甸园 |
武汉 |
新洲区 |
- |
| -------------------- |
- |
- |
- |
| 熙凤水乡 |
孝感 |
- |
- |
| 楚珍园 |
孝感 |
应城 |
- |
| 金卉庄园 |
孝感 |
孝南区 |
- |
| 天紫湖 |
孝感 |
孝南区 |
- |
| 盛世闻樱景区 |
孝感 |
安陆 |
- |
| 白兆山风景区 |
孝感 |
安陆 |
- |
| -------------------- |
- |
- |
- |
| 三里畈温泉 |
黄冈 |
罗田县 |
- |
| 罗田薄刀峰 |
黄冈 |
罗田县 |
- |
| 黄石河峡谷隧道漂流 |
黄冈 |
罗田县 |
- |
| 帝王湖 |
黄冈 |
红安县 |
|
| -------------------- |
- |
- |
- |
| 瑶池温泉 |
咸宁 |
咸安区 |
- |
| 山湖温泉 |
咸宁 |
嘉鱼县 |
- |
Golang
2024-09-09
基础示例
package main
import (
"fmt"
"os"
"strings"
"text/template"
"time"
)
const TEMPLTE = `{{ .Subject }}
Time: {{ .Time.Format "2006-01-02 15:04:05" }}
Source: {{ .Source }}
{{ .Body }}`
func main() {
tmpl01, _ := template.New("tmpl01").Parse("你好,{{ . }}")
tmpl01.Execute(os.Stdout, "世界")
fmt.Println()
fmt.Println(strings.Repeat("=", 80))
fmt.Println()
type Message struct {
Subject string
Time time.Time
Source string
Body string
}
// http://www.xinhuanet.com/politics/2020-02/08/c_1125546135.htm
subject := "国家监察委员会调查组已抵达武汉"
timeobj, _ := time.Parse("2006-01-02 15:04:05", "2020-02-08 13:49:38")
source := "新华社“新华视点”微博"
content := "中央纪委国家监委网站8日消息,国家监察委员会调查组已抵达武汉。经中央批准,国家监察委员会派出调查组赴湖北省武汉市,就群众反映的涉及李文亮医生的有关问题作全面调查。"
tmpl02, _ := template.New("tmpl02").Parse(TEMPLTE)
tmpl02.Execute(os.Stdout, Message{subject, timeobj, source, content})
}
语法说明
- 双花括号
{{ . }} // 输出当前变量
{{ .Name }} // 输出当前变量的 Name 字段
{{/* 注释 */}}
{{- /* 注释(去掉前后空格与换行) */ -}}
{{ if ... }} A {{ end }}
{{ if ... }} A {{ else }} B {{ end }}
{{ if ... }} A {{ else if ... }} B {{ else }} C {{ end }}
{{ range ... }} A {{ end }}
{{ range ... }} A {{ else }} B {{ end }}
{{ range . -}} {{ . }} {{ end -}}
{{ range $key, $val := . -}} ... {{ end -}}
Auth
2024-09-08
日志
2024-08-25
https://en.wikipedia.org/wiki/Extended_Log_Format
相比 Common Log Format (通用日志格式),ELF 是名副其实的可拓展:在头部声明了版本,以及字段。
例如:
#Version: 1.0
#Date: 12-Jan-1996 00:00:00
#Fields: time cs-method cs-uri
00:34:23 GET /foo/bar.html
12:21:16 GET /foo/bar.html
12:45:52 GET /foo/bar.html
12:57:34 GET /foo/bar.html
- Version:
<integer>.<integer>
The version of the extended log file format used. This draft defines version 1.0.
- Fields:
[<specifier>...]
Specifies the fields recorded in the log.
- Software: string
Identifies the software which generated the log.
- Start-Date:
<date> <time>
The date and time at which the log was started.
- End-Date:
<date> <time>
The date and time at which the log was finished.
- Date:
<date> <time>
The date and time at which the entry was added.
- Remark:
<text>
Comment information. Data recorded in this field should be ignored by analysis tools.
然后这个字段的声明又有一套规则,可以参考
开发者
2024-08-23
隐性知识是危险的
隐性知识又称为"部落知识",指的是有些知识没有文档,只掌握在团队成员的头脑里面。
如果你想掌握这些知识,只有去询问团队成员。
隐形知识的优点是,省去了文档成本,而且询问相关成员比自己阅读文档更快,当然前提是那位成员能够快速响应。
隐形知识的缺点是,一旦团队扩大规模,它就会失败。对于掌握知识的团队成员来说,回答问题所占用的时间是一个拖累,影响了生产力,也拖慢了团队的开发速度。
另一方面,随着团队规模的扩大和知识变得更加分散,你自己阅读文档和观看视频讲座,会比向他人寻求帮助更快速和方便。
所以,团队越是大,就越要避免"隐形知识",所有知识尽量文档化,让团队成员能够方便地查阅。
团队知识分享是一个很重要的事情。
- 周会分享
- 专题分享/讨论会
- 文档维护制度
日志
2024-08-12
- NCSA HTTPd (Apache HTTP Server 前身) 定义的一个标准 Web 服务器日志格式。
- 格式:
host ident authuser date request status bytes
例如:127.0.0.1 user-identifier frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
- 如果哪一个字段没有值,就用
- 代替。
import re
from datetime import datetime
RE_CLF = re.compile(r'(\S+) (\S+) (\S+) \[(.*?)\] "(.*?)" (\d{3}) (\d+|-)')
def parse_clf(log_line):
match = RE_CLF.match(log_line)
if not match:
raise ValueError('Log line does not match CLF format')
ip_address = match.group(1)
identity = match.group(2)
user = match.group(3)
time_str = match.group(4)
request_line = match.group(5)
status_code = int(match.group(6))
size = match.group(7)
time_format = '%d/%b/%Y:%H:%M:%S %z'
timestamp = datetime.strptime(time_str, time_format)
size = int(size) if size != '-' else None
return {
'host': ip_address,
'ident': identity,
'authuser': user,
'date': timestamp,
'request': request_line,
'status': status_code,
'bytes': size,
}
log_example = '127.0.0.1 user-identifier frank [10/Oct/2000:13:55:36 -0700] 'GET /apache_pb.gif HTTP/1.0' 200 2326'
parsed_log = parse_clf(log_example)
print(parsed_log)
# {'host': '127.0.0.1', 'ident': 'user-identifier', 'authuser': 'frank',
# 'date': datetime.datetime(2000, 10, 10, 13, 55, 36, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=61200))),
# 'request': 'GET /apache_pb.gif HTTP/1.0', 'status': 200, 'bytes': 2326}
邮件 阮一峰
2024-08-11
Netlify 公司希望给用户发邮件,让用户回信提供产品反馈。
但是公司知道,群发邮件的回复率很低。他们就请了一个营销顾问,希望他设法提高邮件回复率。
这个顾问认为,用户不回邮有两个原因:
(1)邮件篇幅太长,大多数人懒得读。
(2)群发邮件都是模板格式,用户觉得这是机器发送的,没必要理睬。
他决定,缩短邮件内容,采用口语表达,看看能不能提高回复率。
他设计了一个 A/B 测试。A 格式是传统样式的邮件,150 多个单词。

结果,邮件回复率是 1%,100 个收信人有 1 个回复。
B 格式是一封更短的邮件,只有 37 个单词。

结果,回复率上升到了 4%。邮件长度减少到了四分之一,但是回复率变成了四倍。
他一不做二不休,索性将邮件删到 14 个单词,就是直接了当的一个问题。

这一次,回复率进一步上升到了 8%。
因此,营销邮件提高效果的最简单方法,就是删除任何的多余词汇,尽可能短。
阮一峰是转载的 To Get More Replies, Say Less,原文中还附了这个图表,表示上面提到的这种负相关关系:

管理
2024-08-07
我有好多地方都做的不好,做了一些反思。
目标管理
- 所有人的工作一定要有长期目标。
即便是一些事务性强的岗位,比如技术支持(处理客户问题),也需要制定目标。
甚至可以说,越是杂事多的岗位,越要长期目标。没有目标,人就会陷入大量杂事包围,失去方向,真就变成打杂的了。
这对于个人成长、考核评估都是糟糕的影响,升职加薪就更难实现。
从管理者的角度看,目标不明确,就等于对员工没有要求,完全寄希望于所有人的主观能动性,并且他们正好能够和你同频,和团队目标正好对齐。
注:有很强主观能动性,积极主动地投身于工作,这样的人应该不多吧!要想无需沟通,就能自动对齐,那真是黄金搭档了。
- 个人目标需要和他承担的角色,以及团队的整体目标有关联性。
- 每周都需要制定工作计划(团队目标,重点事项)。
- 设计到的人必须协同达成这个团队目标(优先级高于其他个人目标)。
每个人自己的工作可以自己按照自己的计划来推进,但是团队目标需要把控好。
- 尽可能涉及多一些人。
- 周末(或周一早上)总结、评价。
- 过程评价:是否按时完成,是否有沟通,是否回头看。
- 结果评价:完成度,完成效果(对团队目标的促进作用),和预期对比。
- 只关注几个重点事项就行了,其他的事情完成就行(如果后面出现问题,就需要简单沟通,并酌情考虑在考核中有所体现)。
- 目标的制定、目标进度跟踪,都需要保持良好的沟通,及时反馈。
至少,周三要关注一下大家的进度是否符合预期,有没有遇到难题。
注:需要有意培养大家主动沟通,及时反馈的习惯。
- 好的目标:符合 SMART 原则,明确的事项,有时限,可衡量,可实现(努力能做到),并且和团队目标有关联。
报告
- 报告的前提就是要对自己的工作进行有效的总结。
- 保持对工作的思考,有助于维持清晰的思路,对个人工作的开展事有益的。
- 报告就是和上级沟通,将自己的工作和上级做信息同步
- 一项工作做的再好,如果没有能够在团队内做到足够好的信息同步,效果会大打折扣。
- 对管理者来讲,主要的精力都投身于一些重要事项,真不会很清楚你的工作究竟如何。
- 上级的工作目标是什么,他关心我的哪一个工作进展,换位思考一下。
- 成绩是什么,存在的问题是什么,需要的资源是什么?
- 成绩部分要有数据支撑(可视化,整洁,要点清晰)、有事例加以辅助说明。
- 强调成绩和团队目标的关联,强调团队需要的点。
- 个人的付出,做了什么努力,带着提一提。如果时间充足,可以多投入时间(不要啰嗦)。
- 问题部分要有解决思路。
- 工作计划是否需要调整?
- 需要哪些支持?
- 要丰富自己的知识框架,基于这些再整理出报告框架,这样思考问题会更加全面一些。
- 尽量多追问自己一些问题,报告完成之后总结一下,对于新提出来的问题我为什么没有事先想到。
沟通
- 多听多看。
应该鼓励员工的反馈,少打断他。要有耐心。
- 感染力:表情,眼神交流,肢体动作。
- 这一次沟通的目的是什么?重复,重复,重复。
如果是重要事项,需要抓住一切机会,多重复几遍。
- 培养感情。
历史 科学
2024-07-26
王贞仪(1768 年—1797 年),字德卿,女,原籍安徽天长,生于江苏南京,清朝天文学家。王贞仪通过艰苦努力自学天文学,数学,地理和医学等科目,突破了当时的封建习俗对女性权利的阻碍。她是一位非常聪明的女性,因其在天文学,数学和诗歌方面的贡献而闻名。她也是一位广受赞誉的学者,是“18 世纪中国的一位非凡女性”。