Golang
2022-06-10
type Weekday int
const (
Sunday Weekday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
func (day Weekday) String() string {
names := [...]string{
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
}
if day < Sunday || day > Saturday {
return "Unknown"
}
return names[day]
}
type FileSizeUnit int
const (
_ = iota // 忽略第一个值 0,让后续常量从 1 开始递增
KB FileSizeUnit = 1 << (10 * iota) // 1 << (10*1) = 1 << 10 = 1024
MB // 1 << (10*2) = 1 << 20 = 1048576
GB // 1 << (10*3) = 1 << 30 = 1073741824
TB // 1 << (10*4) = 1 << 40 = 1099511627776
)
package main
import "fmt"
func main() {
{
const (
a = iota
b
c
)
fmt.Printf("%+v\n", []int{a, b, c})
// [0 1 2]
}
{
const (
a = 1
b = iota
c
)
fmt.Printf("%+v\n", []int{a, b, c})
// [1 1 2]
}
{
const (
a = 1
b = 2
c = iota
)
fmt.Printf("%+v\n", []int{a, b, c})
// [1 2 2]
}
{
const (
a = 1
b = iota
c = iota
)
fmt.Printf("%+v\n", []int{a, b, c})
// [1 1 2]
}
}
总结
- 首次出现是这个常量块中变量的顺序(0 开始)
- 后面的常量如果没有定义,就表示是按照前面的常量定义来,只是 iota 代表的值 + 1 了
- 如果想跳过一个值,可以使用下划线
开发者 英语
2022-06-06
不看不知道,一看,读错好多单词。
包管理工具 Windows
2022-06-04
winget list
winget list -?
winget search xxx # 搜索
winget install xxx # 安装
winget upgrade # 列出 upgradable 包
winget upgrade xxx # 升级指定包
winget upgrade --all # 升级
winget
Windows 程序包管理器 v1.3.2691
版权所有 (C) Microsoft Corporation。保留所有权利。
WinGet 命令行实用工具可从命令行安装应用程序和其他程序包。
使用情况: winget [<命令>] [<选项>]
下列命令有效:
install 安装给定的程序包
show 显示包的相关信息
source 管理程序包的来源
search 查找并显示程序包的基本信息
list 显示已安装的程序包
upgrade 显示并执行可用升级
uninstall 卸载给定的程序包
hash 哈希安装程序的帮助程序
validate 验证清单文件
settings 打开设置或设置管理员设置
features 显示实验性功能的状态
export 导出已安装程序包的列表
import 安装文件中的所有程序包
如需特定命令的更多详细信息,请向其传递帮助参数。 [-?]
下列选项可用:
-v,--version 显示工具的版本
--info 显示工具的常规信息
可在此找到更多帮助: https://aka.ms/winget-command-help
开发者
2022-06-03
根据最新的 TIOBE 数据, 分析前面 50 中语言。
具体排名的意义对我们来说到不大,只是用来做一个比较热门语言的清单。
开发者
2022-06-01
基本要求
- 价格在 5000 ~ 8000
- 11 代 / 12 代英特尔 CPU,核数多一些(8+)
- 16G / 32G 内存
- 512G 固态硬盘
- 独立显卡
- 屏幕:至少 14 英寸
品牌筛选
首先确定品牌范围:惠普,戴尔,联想,ThinkPad,华为,小米
- 联想拯救者 Y7000
https://detail.zol.com.cn/notebook_advSearch/subcate16_1_m160-g5000-g6000-s9332-s8478-s9331-s8523-s5065-s5064-s6648-s5730-s855_9_1_0_1.html
- ThinkPad
https://detail.zol.com.cn/notebook_advSearch/subcate16_1_m32108-g5000-g6000-s9332-s8478-s9331-s8523-s5065-s5064-s6648-s5730-s855_9_1_0_1.html
- 惠普:光影精灵,暗影精灵
https://detail.zol.com.cn/notebook_advSearch/subcate16_1_m223-g5000-g6000-s9332-s8478-s9331-s8523-s5065-s5064-s6648-s5730-s855_9_1_0_1.html
- 戴尔:
https://detail.zol.com.cn/notebook_advSearch/subcate16_1_m21-g5000-g6000-s9332-s8478-s9331-s8523-s5065-s5064-s6648-s5730-s855_9_1_0_1.html
- 华为 MateBook
https://detail.zol.com.cn/notebook_advSearch/subcate16_1_m613-g5000-g6000-s9332-s8478-s9331-s8523-s5065-s5064-s6648-s5730-s855_9_1_0_1.html
- 小米:
https://detail.zol.com.cn/notebook_advSearch/subcate16_1_m55731-m34645-g5000-g6000-s9332-s8478-s9331-s8523-s5065-s5064-s6648-s5730-s855_9_1_0_1.html
小米,华为,ThinkPad 都是四核八线程
剩下:
- 联想拯救者 Y7000P 2022
i5 版 6.8,i7 版 7.8
开发者
2022-05-22
阮一峰最新的《科技爱好者周刊》中提到一个观点:代码优先和产品优先。大概是说代码优先程序员比较注重技术和代码,产品优先程序员则是更注重解决的问题。阮一峰明显是认为应该产品优先。
我看后感觉我就是文章的批判对象,从而进行了一个反思。但是我思考之后认为阮一峰说的并不全对,我的做法没有什么问题。
公司的目标,或者说研发中心的目标,就是用技术解决问题。而研发中心的开发人员的职责就是设计可行方案,然后通过代码来实现这个方案。
研发人员并不直接面向市场,面向用户,大多数时候也不负责产品的设计。甚至有些时候,研发人员都不参与产品设计方案评审。
理论上,如果我们能够吃透产品的设计,那么对开发工作肯定是有利的。但是我们的时间精力是非常有限的,平衡工作和生活之余,还有挤出时间来自学。
而且,对产品的思考更多的是产品设计人员的工作,让开发者把精力放在对产品的思考上有点不切实际。
确实,“如果产品不好用,代码也不会好”。但是,我们所处的位置真的很难左右公司的产品策略。让产品好用这个目标,在我们这边的操作空间就是写好自己代码。
所以对于开发者来说,代码优先几乎等同于产品优先,并不冲突,更好的代码等于更好的产品。
开发者根据项目背景和工期安排设计方案就行了。需要在代码和产品上做取舍的,是技术部门负责人的工作。
我知道很多人都说打工人要有更高层次的思维,思考更多,做得更多,才能有更好的发展。我自己确实也是这么想的,积极主动的承担起份外的工作,将能创造更大的影响力,然后决定你在组织中的角色。但我觉得这是工作之余的一些额外的投入,和日常开发工作无关,没有什么产品优先的问题,开发者还是应该把主要精力都放在自己的代码上。
- 我们应该投入一些精力去了解公司的产品设计,以及各项重点数据。
产品不是一成不变的,所以这是一个需要持续投入精力去做的事情。
- 我们还应该关注其他公司同事的工作,尤其是任务相关的其他同事。
Linux GNOME
2022-05-17
Restart GNOME without rebooting
Ctrl–Alt–Backspace
sudo /etc/init.d/gdm restart
killall gnome-panel
以上方法没有用,下面这个方法挺好的 (My Choice):
killall -HUP gnome-shell
在桌面还有响应的时候(比如桌面组件出了一些乱码之类的问题):
Alt + F2, and restart/r
参考资料与拓展阅读
Pipenv Python
2022-05-16
pipenv requirements > requirements.txt && pipenv requirements --dev-only > requirements-dev.txt
Edge 浏览器
2022-05-15
-
Microsoft Edge 中的键盘快捷方式
-
Ctrl + R / F5 刷新
- Ctrl + Shift + R / Shift + F5 强制刷新
- Ctrl + Shift + B 隐藏收藏夹栏
- Ctrl + Shift + N 打开隐私窗口
- Ctrl + F 在页面上查找
- Ctrl + H 历史记录
- Ctrl + J 下载
- Ctrl + K 搜索
- Ctrl + Shift + O 收藏夹管理
- F12
- Ctrl + 加号 / Ctrl + 减号 / Ctrl + 0 缩放与还原
- Ctrl + D 聚焦地址栏
CMPP SMS
2022-05-13
中国移动 CMPP 协议中的 UDH 头设计源自 SMPP 协议,SMPP 协议又是参考的 GSM 短信服务的相关标准。
- TP_UDHI 字段,1 bit,对应 GSM 协议中的 UDHI,表示短信中是否包含 UDH。
UDH
UDH,User Data Header,定义在 GSM 03.40 / 3GPP 23.040 中。
UDH 是短信中可能包含的一个二进制头部,对短信服务进行拓展。
可以实现以下功能:
- 长短信(级联短信):切割成多条,需要通过 UDH 中的总条数和序号来组装。
- EMS,增强型消息服务,支持颜色,文件格式,图片,动画,音乐
- MMS,彩信
- 本地语言转换表(Nation Language Shift Table):在 GSM-7 的框架上支持其他国家的语言。
概念:
- TP(Transfer Layer Protocol,传输层协议)
- TP-UD(User Data,用户数据),就是短信的正文部分
- 如果存在 UDH,那就在 TP-UD 的开头
- TP-UDHI(User Data Header Indicator,用户数据头指示器)
- 消息的第六 bit,表示短信中是否存在 UDH
UDHL:UDH Length,UDH 的第一字节,表示 UDH 的长度。
UDH 剩余部分是若干标签 + 长度 + 值的组合。其中标签又叫做 IEI(Information-Element-Identifier,信息元素标识符),占一字节。
例如:05 00 03 5F 03 01
- 第一字节 05,表示后面还有 5 Byte 是 UDH
- 第二字节 00,按照下面的 IEI 表,表示级联短信
- 第三字节 03,表示 IEI Length,也就是说这个 IEI 还有 3 Byte
- 第四字节 5F,按照级联短信的设计,这个 Byte 是一个随机 int8,避免不同批次短信搞混
- 第五字节 03,按照级联短信的设计,这个 Byte 表示总短信长度
- 第六字节 01,按照级联短信的设计,这个 Byte 表示当前短信在这一批次短信中的序号
重点:如果短信采用 GSM-7 编码,则需要对齐到 7 bit,也就是说真正需要的 bit 数是 math.ceil(6 * 8 / 7) * 7
上面这个例子,8 bit _ 6 = 48 bit,需要增加 1 bit,对齐成 7 bit _ 7 = 49 bit。
UDH Information Elements
| IEI (hex) |
Meaning |
Classification |
Length |
May repeat |
| 00 |
Concatenated short messages, 8-bit reference number |
SMS Control |
3 |
no |
| 01 |
Special SMS Message Indication |
SMS Control |
2 |
yes |
| 02 |
Reserved |
N/A |
N/A |
yes |
| 03 |
Not used to avoid misinterpretation as <LF> character |
N/A |
N/A |
yes |
| 04 |
Application port addressing scheme, 8 bit address |
SMS Control |
2 |
no |
| 05 |
Application port addressing scheme, 16 bit address |
SMS Control |
4 |
no |
| 06 |
SMSC Control Parameters |
SMS Control |
1 |
no |
| 07 |
UDH Source Indicator |
SMS Control |
1 |
yes |
| 08 |
Concatenated short message, 16-bit reference number |
SMS Control |
4 |
no |
| 09 |
Wireless Control Message Protocol |
SMS Control |
1-255 |
yes |
| 0A |
Text Formatting |
EMS Control |
3-4 |
yes |
| 0B |
Predefined Sound |
EMS Content |
2 |
yes |
| 0C |
User Defined Sound (iMelody max 128 bytes) |
EMS Content |
2-129 |
yes |
| 0D |
Predefined Animation |
EMS Content |
2 |
yes |
| 0E |
Large Animation (1616 times 4 = 324 =128 bytes) |
EMS Content |
129 |
yes |
| 0F |
Small Animation (88 times 4 = 84 =32 bytes) |
EMS Content |
33 |
yes |
| 10 |
Large Picture (32*32 = 128 bytes) |
EMS Content |
129 |
yes |
| 11 |
Small Picture (16*16 = 32 bytes) |
EMS Content |
33 |
yes |
| 12 |
Variable Picture |
EMS Content |
4-255 |
yes |
| 13 |
User prompt indicator |
EMS Control |
1 |
yes |
| 14 |
Extended Object |
EMS Content |
7-255 |
yes |
| 15 |
Reused Extended Object |
EMS Control |
3 |
yes |
| 16 |
Compression Control |
EMS Control |
3-255 |
no |
| 17 |
Object Distribution Indicator |
EMS Control |
2 |
yes |
| 18 |
Standard WVG object |
EMS Content |
1-255 |
yes |
| 19 |
Character Size WVG object |
EMS Content |
1-255 |
yes |
| 1A |
Extended Object Data Request Command |
EMS Control |
0-255 |
no |
| 1B |
Reserved for future EMS features |
N/A |
0-255 |
yes |
| 1C |
Reserved for future EMS features |
N/A |
0-255 |
yes |
| 1D |
Reserved for future EMS features |
N/A |
0-255 |
yes |
| 1E |
Reserved for future EMS features |
N/A |
0-255 |
yes |
| 1F |
Reserved for future EMS features |
N/A |
0-255 |
yes |
| 20 |
RFC 822 E-Mail Header |
SMS Control |
1 |
no |
| 21 |
Hyperlink format element |
SMS Control |
0-255 |
yes |
| 22 |
Reply Address Element |
SMS Control |
1-255 |
no |
| 23 |
Enhanced Voice Mail Information |
SMS Control |
0-255 |
no |
| 24 |
National Language Single Shift |
SMS Control |
1 |
no |
| 25 |
National Language Locking Shift |
SMS Control |
1 |
no |
| 26 – 6F |
Reserved for future use |
N/A |
0-255 |
N/A |
| 70 – 7F |
(U)SIM Toolkit Security Headers |
SMS Control |
0-255 |
? |
| 80 – 9F |
SME to SME specific use |
SMS Control |
0-255 |
? |
| A0 – BF |
Reserved for future use |
N/A |
0-255 |
? |
| C0 – DF |
SC specific use |
SMS Control |
0-255 |
? |
| E0 – FF |
Reserved for future use |
N/A |
0-255 |
? |
参考资料与拓展阅读