Perl //= 和 ||= 的区别 | 附实验

结论

  • $var//=2:等价于 defined($var)||2,即 未定义 时才赋值为 2 ,否则不变( 即使是 或 空字符串 )
  • $var||=2 :除非定义且为 true 才不会赋值,否则赋值(比如 或 空字符串 时)为2。

//=

Step-1 空串

$var='';
$var//=2;
print "'$var'\n";
# perl atest4.pl 
''

Step-2 0

$var=0;
$var//=2;
print "'$var'\n";
# perl atest4.pl 
'0'

Step-3 1

$var=1;
$var//=2;
print "'$var'\n";
# perl atest4.pl 
'1'

Step-4 undef

$var=undef;
$var//=2;
print "'$var'\n";
# perl atest4.pl 
'2'

||=

Step-1 空串

$var='';
$var||=2;
print $var;
# perl atest4.pl 
2

Step-2 0

$var=0;
$var||=2;
print $var;
# perl atest4.pl 
2

Step-3 1

$var=1;
$var||=2;
print $var;
# perl atest4.pl 
1

Step-4 undef

$var=undef;
$var||=2;
print $var;
# perl atest4.pl 
2

Perl 常用内置函数 -r -e 等

-r: File is readable by effective uid/gid.
-w: File is writable by effective uid/gid.
-x: File is executable by effective uid/gid.
-o: File is owned by effective uid.

-R: File is readable by real uid/gid.
-W: File is writable by real uid/gid.
-X: File is executable by real uid/gid.
-O: File is owned by real uid.

-e: File exists.
-z: File has zero size (is empty).
-s: File has nonzero size (returns size in bytes).

-f: File is a plain file.
-d: File is a directory.
-l: File is a symbolic link.
-p: File is a named pipe (FIFO), or Filehandle is a pipe.
-S: File is a socket.
-b: File is a block special file.
-c: File is a character special file.
-t: Filehandle is opened to a tty.

-u: File has setuid bit set.
-g: File has setgid bit set.
-k: File has sticky bit set.

-T: File is an ASCII text file (heuristic guess).
-B: File is a "binary" file (opposite of -T).

-M: Script start time minus file modification time, in days.
-A: Same for access time.
-C: Same for inode change time (Unix, may differ for other platforms)

参考文献

2021 下半年博客「经营」报告

距离发布《2021 上半年博客「经营」报告》已经半年过去了,这半年里,我发布了 Notion BoJo模版及其配套的财务看板「BJ-PFD」,发布了随机壁纸生成器「Get Random Wallpaper」,新作了个人主页「煎茶」,自此我的博客「Frytea’s Blog」专门分享一些碎片化的信息,主页用来汇集个人信息并分享成体系的内容。

这样一来,下半年的网站访问量相较上半年有一个简单的提升,在这里简单“汇报”一下。

发现百度统计统计到来自百度的流量多,Google 统计到来自 Google 的流量多,为了解决该问题我自己使用 umami 搭建了访问统计服务,但目前才统计了3个月,这次还是先看百度统计吧。

数据概述

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-2.35.06c9acb01fa2da7373.png

从百度统计的结果来看,近半年主要网站 PV 10W 次,UV 7W 个,来自 5W 个IP,相比去年有一个小小的提升,心里还是很开心。

其中 11月访问量最高,单月访问量 3W+,大概是因为那个月在 V2EX 发布了一篇「找寻独立原创博客的价值」的帖子。截至目前这篇帖子获得了 5060 次点击 ∙ 44 人收藏 ∙ 3 人感谢。

来源统计

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.10.15045551465ce491a6.png

再来看一下来源统计。百度统计的结果显示,访客最多的是直接访问,其次是来源百度搜索,之后是必应和谷歌,在后面就是来自论坛和其他流量。

搜索词方面,比较多的是这些来自百度的搜索词:

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.18.41f7954644672e4673.png

访问统计

访问统计方面,这些页面被访问的次数最多:

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.27.374776c271b94a0473.png

访客统计

访客统计方面,先看看全球的访客分布:

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.29.02934d38cb95a44a93.png

来自中国的访问最多,其次是美国。再看看国内的访客分布:

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.30.211e42bb9be478a0fe.png

国内访客中,来自北京的最多,其次是上海和广东。

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.31.46110a9d8db0e86c4f.png

客户端类型方面,PC端还是比移动端多一些。

https://imagehost-cdn.frytea.com/images/2022/01/01/2022-01-01-3.34.04fc04190d6f127d45.png

访客属性方面,大概如图所示。

总结

互联网时代的流量就是金钱,而作为网站站长则希望自己网站的内容可以真正的为网友提供帮助,在未来我会努力输出整理有价值的内容,希望持续输出价值。

什么是 WEB3 以及其发展概要

要问何为 Web3,就先从什么味 Web2 和 Web1 来说起吧。

最近在网上看到 Web3 的概念很火热,比肩区块链、元宇宙,其实貌似一整个未来,特意整理一下认为比较好的材料分享出来。

WEB 的进化

https://imagehost-cdn.frytea.com/images/2021/12/31/image83ab2e1e696f8c3e.png

截止目前,互联网技术大致进行过2次重要的革新,每个时代,都有其显著地时代特征。

WEB1 – 信息投喂

虽然我很不喜欢这个词,但貌似事实如此。

早在上世纪 90 年代互联网刚刚开始普及的时候,用户与网络的互动处于非常早期的阶段,即用户只能被动地浏览文本、图片以及简单的视频内容,网站提供什么,用户查看什么。几乎没有互动可言。

上世纪 90 年代中后期,在谷歌、百度发展之前的一段时间,互联网曾经由 AltaVista 和 Netscape 主宰。当时,互联网的存在只是为了宣传他们的实体公司。这些网站是「只读网站」,意味着你只能搜索和阅读信息。

https://imagehost-cdn.frytea.com/images/2021/12/31/image83876cc0f4e5dc0a.png

而那个时代的电子商务网站实际上跟现在超市发的促销手册一样,只是给你展示内容,你无法在网站上下单。

这就是 Web1.0,缓慢的 Web 1.0,完全受控制的 Web 1.0。

WEB2 – 网上互动

当前我们所处的这个时代,大致可理解为 WEB2.0

这一代互联网被称为「Web2.0」或「读写」网络。现在,用户不仅仅是单纯的访问者,他们还可以创建自己的内容,并将其上传到网站上。以著名的视频博主「办公室小野」为例,她仅用了 2 年的时间就从一个默默无闻的视频作者变成了月收入数千万的视频大 V。

https://imagehost-cdn.frytea.com/images/2021/12/31/imagec1f47771a6aaaafa.png

有影响的网红只需要发一个视频就可以让一个餐馆排满长队,也可以用一句话让一家网店差评如潮。互联网人对于互联网的影响力与日俱增,以往网站给用户投喂信息的时代已经过去。

Web2.0 的主要目标是,使互联网更加民主,并尽可能地方便用户访问。

WEB3 – 未来互联网

至于什么是 WEB3 还很难有一个准确的定义,但可以总结这么几个关键词:

  • 统一身份认证
  • 数据确权与授权
  • 隐私保护与抗审查
  • 去中心化运行

在 WEB3.0 时代,身份认证有一个统一的平台,不再需要记录各个平台的账号密码,也不需要担心账号泄露;数据的确权与授权统一规范,不再是一家独大;个人隐私可以受到很好的保护,网站再也不能随意的跟踪用户行为;一切网络服务的运作,都是去中心化的。

至于具体改变了什么,未来将会是什么样子,可以想象。举个例子,某网盘再也不能随意的封禁用户数据,不可能因为新浪博客单方面的停止运营导致我们的博客内容无法访问,音乐资源不再局限于哪一家的版权,因为一切都是去中心化的。

当然改变越大,风险就越大,难度也越大。

怪不得最近总是看到有人说:不学习加密技术是自我毁灭。

就像是有些人已经成了比特币首富,有些人连什么是比特币还不清楚。一些人已经在闷声发大财,有些人还在固有的道路上艰难前进。

变化

在将来,人们的使用习惯和生活方式可能会发生一些变化,比如现在常用 Chrome,未来可能使用 Brave。

https://imagehost-cdn.frytea.com/images/2021/12/31/image3dae6010ffd8d459.png

信息就是金钱,随着 Web 3.0的出现,新的平台将以一种不被垄断服务提供商扼杀的健康竞争水平出现。

这个概念是这样的: 目前,分散的应用程序、钱包、平台以及其他构成 Web 3.0的数字资产是分散的。访问这些接口需要单独的种子、登录和身份标识,这与现有的 Web 2.0非常相似。将通过一个种子将这些不同的平台连接在一起。因为这将作为一个加密的钥匙,可以与其拥有者联系起来,艾森蒂亚将提供身份证明,但不会透露任何非必要的个人身份。

总结

也许 WEB3 没有一个清晰地样子,只是不断的畅想未来的模型。如果一切明了,大概就是下一个时代的变革点了。因此抓住它,不要嫌弃它的简陋,要看到它就是未来。

参考文献

国内对象存储/CDN服务价格横评

话不多说,直接上表格。

价格表(国内HTTPS价格)

名称 存储免费额度(GB) 存储费用(元 / GB / 日) 流量免费额度 流量费用(元/GB) CDN流量费用
多吉云 10 0.003 20 0.11 0.11
七牛云 10 0.098-0.145 \ 0.29 0.28
腾讯云 \ 0.099-0.118 \ 0.5 0.21
阿里云 \ 0.12 \ 0.25-0.5 0.24
又拍云 \ 0.0043 \ 0.5 0.29
百度智能云 \ 0.119-0.15 \ 0.25-0.49 0.20

注:价格整理于2021年12月30日;存储指对象存储,流量指对象存储公网流出流量。

分析说明

由于本人使用过国内各种主流云厂商云存储、CDN服务,目前稳定存储2G左右,每日流量1G左右,使用过各家。知道最近发现多吉云也推出了自家云存储服务,虽然是阿里云、腾讯云包了一层,但费用便宜很多,应该是走量优惠比较大。

后来我就把自己网站的对象存储和CDN都迁移到多吉云了,目前使用起来感觉良好。

还记得上次过年期间,使用的七牛云存储出了点问题,提工单半天没解决,非说是我解析有问题。后来自愈了,对七牛云的印象就没有多好了,因此这次果断迁移到多吉云。

经过这次迁移,发现各家云存储费用差异还比较大,顺便整理,方便各位有需要的客官挑选。

参考文献

Ubuntu 安装 GitKraken 并汉化

GitKraken 是一款超好用的 git 可视化(gui)工具,但是官方不提供多语言支持,今天就以 Ubuntu 平台为例介绍一下安装方法。

安装及汉化

首先在 GitKraken 官网下载安装包:

如果是 debian 系操系统可下载其中的 deb 版本,之后安装即可。

至于汉化,使用 Github 上的 k-skye/gitkraken-chinese 这个仓库即可完成。

方法很简单,安装好之后,使用汉化语言包替换原有的语言包即可。

# 首先备份官方语言包
mv /usr/share/gitkraken/resources/app.asar.unpacked/strings.json /usr/share/gitkraken/resources/app.asar.unpacked/strings.json.bk
# 从github拉取资源并替换
wget https://github.com/k-skye/gitkraken-chinese/raw/master/strings_8.1.1.json -O /usr/share/gitkraken/resources/app.asar.unpacked/strings.json

# 如果在国内访问 github 有困难
# 可使用 fastgit 提供的 github 国内镜像拉取
wget https://hub.fastgit.org/k-skye/gitkraken-chinese/raw/master/strings_8.1.1.json -O /usr/share/gitkraken/resources/app.asar.unpacked/strings.json

之后重启 GitKraken 即可。

https://imagehost-cdn.frytea.com/images/2021/12/30/image031b80c4bef3b2af.png

参考文献

深挖 docker 默认网络 | 为什么 docker 默认网络能上外网

为什么默认配置创建出来的 docker 容器可以访问外网,为什么监听对应端口就能对外暴露docker服务,一张图搞清楚。

首先 Docker 有四中网络模式, 分别是 Bridge、Host、Container、None,默认使用 Bridge,今天就来讲讲 Bridge。

https://imagehost-cdn.frytea.com/images/2021/12/28/drawf92673ecda5420ba.jpg

创建的容器默认使用 bridge 的方式联网,因此默认就可以docker间互通,该网桥名叫 bridge0,通过 nat 的方式与物理网卡相连,每创建一个该模式下的容器,就自动创建一对 veth-pair 挂上去。

# brctl show 
bridge name bridge id       STP enabled interfaces
br-1061a9012b5a     8000.0242998bddbb   no      
docker0     8000.0242f9c2fd4f   no      veth4fc1b46
                            veth86c0817
                            vethe510127
vmbr0       8000.b496916544ad   no      enp59s0f1

通过 nat 的方式,docker可以自由的通过宿主机网卡访问外网,如果映射端口,也是通过 nat 的方式将对应流量送入docker:

# docker ps
CONTAINER ID   IMAGE          COMMAND              CREATED        STATUS        PORTS                                       NAMES
398907d00b97   001b9ea10452   "/sbin/init start"   5 hours ago    Up 5 hours    192.168.226.140:8206->8006/tcp              hci-nos3
475b07e8faa4   001b9ea10452   "/sbin/init start"   5 hours ago    Up 5 hours    192.168.226.139:8206->8006/tcp              hci-nos2
e9955db2132c   001b9ea10452   "/sbin/init"         29 hours ago   Up 29 hours   0.0.0.0:8106->8006/tcp, :::8106->8006/tcp   hci-nos
# iptables -n -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0           
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:8006
MASQUERADE  tcp  --  172.17.0.3           172.17.0.3           tcp dpt:8006
MASQUERADE  tcp  --  172.17.0.4           172.17.0.4           tcp dpt:8006

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8106 to:172.17.0.2:8006
DNAT       tcp  --  0.0.0.0/0            192.168.226.139      tcp dpt:8206 to:172.17.0.3:8006
DNAT       tcp  --  0.0.0.0/0            192.168.226.140      tcp dpt:8206 to:172.17.0.4:8006

以上面几个docker为例,分别直接监听和指定ip,会发现创建了对应的规则在 iptables 中。

至此,为什么docker访问外网及访问docker的原理讲解完毕,有问题欢迎留言。

参考文献