#40 关于架构设计的一些想法
开发者 架构 2021-08-22阅读了来自公众号PM圈子的一篇文章《如何搭建一个拖垮公司的技术架构?》,反过来说的话,大概就是要注意以下方面。
coding in a complicated world
阅读了来自公众号PM圈子的一篇文章《如何搭建一个拖垮公司的技术架构?》,反过来说的话,大概就是要注意以下方面。
《科技爱好者周刊》第 167 期中,阮一峰十分愤慨的说广告拦截器太过分了。
因为他接到读者反馈,有篇文章中间的两段上下语义似乎不能接上,是否有写内容遗漏。然后检查之后发现是被广告拦截器拦截了。
阮一峰从使用非常广泛的规则集 EasyList (AdBlock 默认开启订阅,每 4 小时更新一次) 发现了很多针对他的规则,并从中摘抄了几句特别狠的:
! 拦截脚本 checker.js
ruanyifeng.com/blog/checker.js
! 隐藏指向 t.cn 的链接
ruanyifeng.com##a[href^="http://t.cn/"]
! 隐藏含有"培训"的段落
ruanyifeng.com##p:-abp-contains(培训)
# 曾经出现过,禁用所有 JS 代码:
ruanyifeng.com^$csp=script-src 'none'
我才知道,广告拦截可以做到这么精准的匹配,真心服!
阮一峰检测到用户开启广告拦截之后,就会不显示所有内容,取而代之的是这个提示:
您使用了广告拦截器,导致本站内容无法显示。
请将 www.ruanyifeng.com 加入白名单,解除广告屏蔽后,刷新页面。谢谢。
其他:
AdBlock (下载量 296278) 和 AdBlockPlus (下载量 174432) 的渊源:最早是有一个 Adblock 项目,由于 Adblock 停止更新,一位开发者启动了 AdblockPlus 项目,再后来又有公司基于 AdblockPlus 项目创建 AdBlock。
uBlock (下载量 1658) 和 uBlock Origin (下载量 24666) 的渊源:uBlock 的创始人将项目转移给别人维护之后,好像对后来接收捐款的分配不满,自己又开了一个分支 uBlock Origin。
常见的进制:
那么,八进制用来干嘛?
刚才在维基百科上找到了答案:
Octal became widely used in computing when systems such as the UNIVAC 1050, PDP-8, ICL 1900 and IBM mainframes employed 6-bit, 12-bit, 24-bit or 36-bit words.
就是说早期大量机器采用了 6 位,12 位,24 位,36 位的实现,都是 3 的倍数,所以取八进制(3 位二进制数一组)来表示比较通用。
七月二号发了一篇《吊炸天的 GitHub Copilot》,我表示非常期待这种技术的到来。
但是我并不知道他们是怎么弄的,没有考虑到其 AI 采用的训练集可能涉及的版权问题。
可以看到最近针对 Copilot 产生了巨大的争议,当前开发者社区的这种申讨氛围可能会让 GitHub 放弃 Copilot。
首先,GitHub 承认 Copilot 采用公开仓库代码做训练,不论其授权协议是 GPL 还是啥。
这里面有巨大的版权风险,虽然 GitHub 官方声称不会直接复制粘贴代码,但这种可能看起来就是 “洗代码” 的行为,无法说服别人他们拥有新代码的支配权。
更何况有人拿出了一些证据来证明 Copilot 会直接 Ctrl C + Ctrl V。
最近我使用 vscode 的时候,可以看到有时它会给我一些提示,真的感觉很棒。我不想 Copilot 被抛弃,希望 GitHub 或者 Google、IBM、阿里,或别的公司或组织,能解决所有争议,提供类似的产品,更好的服务开发者。
一个月前看到了微软通过 OpenAI 独家授权的 GPT-3 弄了一个低代码编程语言 Power Fx,可以直接通过简单的自然语言来完成数据的各种复杂操作。
我看到演示,当时就非常惊讶。不过当时我觉得,估计也就只能到这个地步了(弄弄 Excel 公式),想要真的生成可用代码,可能还得等几年。
今天有看到了 GitHub 搞的这个 Copilot,我是真的惊了。
看网上的演示,就根据一点点注释,可以生成各种语言的代码,还可以提供多种选择。
Your AI pair programmer,真是此言不虚!
除非是从 GitHub 已有仓库中拿出来的,然后人工标注其用途(可能性非常小),否则这真是逆天了,超出了我对现阶段人工智能水平的认知。
不过现在是技术预览阶段,我已提交申请,不过不知道什么时候可以通过,我是真的想试试,要是用上这等神器,必定可以省不少事。
话说回来,老码农的价值肯定是会被压缩了一些些。
首先,还是得看看 Copilot 的水平,再说。
我现在真是太激动了,虽然可能会让程序员变得更卷,但是看到这样的技术进步,我还是非常开心。
Update @ 2021-11-01
Copilot 已经支持 neovim 和 JetBrains IDE (IDEA, PyCharm, WebStorm, PphStorm, Goland...) 了。
Update @2022-06-23
GitHub Copilot 宣布免费到 08/22,今后要收费,每个月 8 美元。我已经非常习惯 Copilot 了,但是这个价格对我来说还是不可接受的。
我搜索了一下 VSCode 的拓展商店,看到有一个新的 GitHub Copilot Nightly 版本,估计是给免费用户使用的。
另外还发现一个 GitHub Copilot Labs 拓展,可能是更加完善的版本,应该也是收费。
Update @2022-06-27
如何快速的、正确的查询资料是开发者的必备技能。GitHub 是一个主要的资料来源,当然需要掌握其用法才行。
除了要知道搜索什么英语术语之外,还有一些别的辅助技能,可以有效的提升 GitHub 搜索效率。
国外网站上的一篇文章,讲高级工程师应该掌握哪些编码之外的技能,其中包括帮助别人晋升。
我反对的微服务,不是这种思想,而是大家炒热的各种技术框架。
# 查看 Exif 信息:
exiftool media/images/django.jpg
exiftool -X media/images/django.jpg # XML 格式
exiftool -csv media/images/django.jpg # CSV 格式
exiftool media/images/
exiftool -r media/images/ # 递归遍历子目录
# 清除文件 Exif 信息:
exiftool -all= -overwrite_original media/images/django.jpg
exiftool -all= -overwrite_original media/images/
exiftool -all= -overwrite_original -ext png media/images/
# 清除指定 Exif 信息
exiftool -gps:all= *.jpg

关于 convert 的文章,之前已经写过两篇:
sudo apt install imagemagick
convert -list type
convert -list font # 支持的字体
identify markjour.png
identify -verbose markjour.png
identify -format "Size: %w x %h\n" markjour.png
# Exif 信息
identify -format '%[Exif:*]' ~/Pictures/Photos/2019-09-14-18-48-22.jpg
# sudo apt install exif
exif ~/Pictures/Photos/2019-09-14-18-48-22.jpg
convert -strip input.jpg out.jpg
convert +profile "*" input.jpg out.jpg
<宽> x <高> + <X轴坐标> + <Y轴坐标>
convert -crop 300x400+10+10 src.jpg dest.jpg
# 指定中心位址为基准点:
convert -gravity center -crop 300x400+0+0 src.jpg dest.jpg
convert -crop 25%x100% src.jpg dest.jpg
之前(convert 图片转换的一次示例)合并图片用的就是这个命令。
# 横向
convert +append markjour-l.jpg markjour-c.jpg markjour-r.jpg markjour.jpg
# 纵向
convert -append markjour-t.jpg markjour-c.jpg markjour-b.jpg markjour.jpg
convert -rotate 90 input.jpg output.jpg # 顺时针
convert -rotate -90 input.jpg output.jpg # 逆时针
# 左右反转,镜像效果
convert -flop input.jpg output.jpg
# 上下反转,这个和旋转 270 效果还是不一样的
convert -flip input.jpg output.jpg
# 限宽我很常用,控制页面图片尺寸
convert -resize 108x markjour.png markjour-108.png
convert -sample 50% markjour.png markjour-new.png
convert -sample 200% markjour.png markjour-big.png
PS: 放大时 resize 会自动采样插值,而 sample 不会
convert input.jpg -quality 50 output.jpg
# 灰度,就是常见的黑白照片效果
convert -colorspace gray input.jpg output.jpg
# 分离 RGB 三个通道,输出三张图片,不知道为什么都是灰色
convert -separate input.png output.png
convert -threshold 40% input.png output.png # 也是一种常见效果,不知道叫什么
convert -negate input.png output.png # 反色
# 黑白(非灰度)sRGB -> Gray 2c
convert -monochrome input.png output.png
# 重新转成 sRGB 模式(但是颜色还是留在黑白两色)
convert -define png:color-type=2 input.png output.png
convert -colorspace sRGB -type truecolor input.jpg output.jpg
# 效果很奇特,可以试试:
convert -remap pattern:gray60 input.png output.png
# 替换
convert -fuzz 15% -fill white -opaque "rgb(143,141,250)" -opaque "rgb(216,217,62)" input.png output.png
convert -blur 70 input.png output.png
# 后面的数字对模糊程度有着决定性作用
convert -blur 70x15 input.png output.png
convert -charcoal 2 input.png output.png # 铅笔画风格
convert -noise 3 input.png output.png
convert -paint 4 input.png output.png # 油画风格
convert -spread 50 input.png output.png # 毛玻璃
convert -swirl 60 input.png output.png # 扭曲
convert -paint 4 -raise 5x5 input.png output.png
# 调整透明度
# 先确保图片有 Alpha 通道
convert -define png:format=png32 input.png output.png
convert -channel alpha -fx "0.5" output.png output2.png
# 加边框
convert -mattecolor "#000" -frame 60x60 input.png output.png
convert -mattecolor "#fff" -frame 60x60 input.png output.png
# 相同效果
convert -bordercolor "#fff" -border 60x60 input.png output.png
# 再配合上 raise:
convert -bordercolor "#fff" -border 10x10 input.png output.png
convert -raise 5x5 output.png output2.png
# 去掉边框:
convert -trim -fuzz 10% input.png output.png
convert -fill "#1770CC" \
-font Ubuntu-Mono -pointsize 50 -draw 'text 130,50 "©"' \
-font 楷体_GB2312 -pointsize 40 -draw 'text 50,50 "码厩"' \
-gravity southeast \
input.png output.png
# 改用 RGBA 模式
convert -fill "rgba(23,112,204,0.25)" \
-font Ubuntu-Mono -pointsize 50 -draw 'text 130,50 "©"' \
-font 楷体_GB2312 -pointsize 40 -draw 'text 50,50 "码厩"' \
-gravity southeast \
input.png output.png
# 这个不错,京东那里学来的:
convert -size 100x100 -fill "#1770CC" -gravity center \
-font Ubuntu -pointsize 30 -draw 'rotate -45 text 0,0 "markjour"' \
xc:none miff:- | composite -tile -dissolve 25 - input.png output.png
# 图片水印
convert -size 150x50 -fill "#1770CC" -gravity center \
-font Ubuntu -pointsize 30 -draw 'text 0,0 "markjour"' \
xc:none /tmp/mark.png
convert input.png -gravity southeast -compose over /tmp/mark.png -composite output.png
# 查看图片
# GNOME 桌面好像都是 eog
eog markjour.png
# 或者使用 ImageMagick 自带图片查看工具:
display markjour.png
# 查看颜色信息
convert xc:"#fff" -colorspace sRGB -format "%[pixel:u.p{0,0}]\n" txt:
convert xc:"#fff" -colorspace sRGB -format "%[pixel:u.p{0,0}]\n" info:
convert xc:"#fff" -colorspace sRGB -format "rgb(%[fx:int(255*r)],%[fx:int(255*g)],%[fx:int(255*b)])\n" info:
# 获取指定像素点的颜色(RGB)
convert "input.png[1x1+100+100]" -format "rgb(%[fx:int(255*r)],%[fx:int(255*g)],%[fx:int(255*b)])\n" info:
# 创建一张新图片
convert -size 1000x1000 xc:none /tmp/image.png
convert -size 1000x1000 xc:transparent /tmp/image.png
convert -size 1000x1000 xc:white /tmp/image.png
sudo apt install -y webp
cwebp 转成 WEBP 格式dwebp 转成别的格式cwebp -o xxx.png xxx.webp
dwebp -o xxx.webp xxx.png