科学 阮一峰
2023-03-17

风力发电正在全世界如火如荼地发展。
但是,风力发电有一个前提,就是必须有源源不断的风。那么,风可能出现静止吗?
事实上,2021年的夏秋之际,欧洲大部分地区就发生了"风旱"。许多地方的风速比年平均水平至少慢了约15%,英国出现了60年来风力最小的时期。
前年9月,风电发电还占英国发电量的18%,但到了去年9月,这一比例骤降至2%。为了弥补能源缺口,英国被迫重启了两座封存的煤电厂。
一项研究表明,全世界的风速正在下降,从1978年到2010年,风速每十年下降2.3%。不过,2010年到2019 年又有所反弹。从每小时7英里增加到7.4英里。
尽管如此,科学家还是认为,未来的风速将不断放缓,到2100年全球平均风速可能下降多达10%。
其中的原因,涉及到了一个根本的问题:为什么地球上有风?
地球出现风带,主要原因是温度不均匀:两极很冷,热带很暖。这种温差导致了空气流动,从而产生了风。
但是由于全球变暖,两极与热带的温差正在减小,这是因为两极(尤其是北极)的变暖速度比热带地区快。
另一个风速变小的原因,可能是"地球表面粗糙度"的增加。世界各地的城市建筑的数量和规模正在增加,这阻挡了风的流动。
风速变小会产生严重后果,不仅仅影响到风力发电。
(1)强风可以缓解城市污染,用新鲜空气代替停滞的空气。
(2)较慢的风会让热浪难以缓解。
(3)慢风也使飞机更难起飞,因为飞行员依靠逆风升空。希腊的一个机场,由于逆风减缓和气温上升,空客320在过去30年中,最大起飞重量减少了4吨。
Git
2023-03-13
看到一篇公众号文章 《Git仓库迁移实操(附批量迁移脚本)》,介绍他们将 GitLab 中一个 Group 内的几十个项目迁移到另一个 Group。
PS:文章有提到,前提是无法得到管理员协助,开启创建时导入的功能。
git clone
& git push
&& git push --tags
git clone --mirror
&& git push --mirror
git clone --bare
&& git push --mirror
基本方法就是 clone && push,不过参数不同。
只是,我没有了解过这里说的 --mirror
参数,这里记录一下,用到的时候研究研究。
文章带了两个脚本:
#!/bin/bash
remote_old=git@host1:group1
remote_new=git@host2:group2
while read repo
do
echo $repo
git clone --bare "$remote_old/${repo}.git"
cd "${repo}.git"
git push --mirror "$remote_new/${repo}.git"
cd ..
rm -fr "${repo}.git"
done < repos.txt
@echo off
set remote_old=git@host1:group1
set remote_new=git@host2:group2
set input_file=repos.txt
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ %input_file%"`) do (
call :process %%a
)
goto :eof
:process
SETLOCAL EnableDelayedExpansion
set "repo=!%1!"
set "repo=!repo:*:=!"
echo !repo!
git clone --bare "%remote_old%/!repo!.git"
cd "!repo!.git"
git push --mirror "%remote_new%/!repo!.git"
cd ..
rmdir "!repo!.git"
ENDLOCAL
goto :eof
Golang
2023-03-09
Ubuntu 更新源中的是 Go 1.18(apt install golang
),现在 Go 1.20 出来了,我想尝尝鲜,就需要考虑多版本共存的方案了。
Python 有 pyenv,Node 有 nvm。
Go 也有一些社区项目,比如 syndbg/goenv
和 moovweb/gvm
,还有 owenthereal/goup
。
其中 gvm 之前有尝试过,参考:gvm: Golang 版本管理
本文是介绍官方的 dl,可以说是非常简单。
go install golang.org/dl/go1.20@latest
~/go/bin/go1.20 download
Downloaded 0.0% ( 16384 / 99869470 bytes) ...
Downloaded 3.5% ( 3522544 / 99869470 bytes) ...
Downloaded 9.8% ( 9748480 / 99869470 bytes) ...
Downloaded 15.7% (15712240 / 99869470 bytes) ...
Downloaded 21.7% (21626880 / 99869470 bytes) ...
Downloaded 27.6% (27541296 / 99869470 bytes) ...
Downloaded 32.9% (32866288 / 99869470 bytes) ...
Downloaded 38.9% (38846464 / 99869470 bytes) ...
Downloaded 44.9% (44793840 / 99869470 bytes) ...
Downloaded 50.8% (50741248 / 99869470 bytes) ...
Downloaded 56.7% (56672240 / 99869470 bytes) ...
Downloaded 62.7% (62586864 / 99869470 bytes) ...
Downloaded 68.1% (67993600 / 99869470 bytes) ...
Downloaded 74.0% (73924304 / 99869470 bytes) ...
Downloaded 79.9% (79839200 / 99869470 bytes) ...
Downloaded 85.9% (85753856 / 99869470 bytes) ...
Downloaded 91.8% (91717424 / 99869470 bytes) ...
Downloaded 97.2% (97025728 / 99869470 bytes) ...
Downloaded 100.0% (99869470 / 99869470 bytes)
Unpacking /home/markjour/sdk/go1.20/go1.20.linux-amd64.tar.gz ...
Success. You may now run 'go1.20'
~/go/bin/go1.20 download
go1.20: already downloaded in /home/markjour/sdk/go1.20
~/sdk/go1.20/bin/go version
go version go1.20 linux/amd64
# sudo ln -sf ~/sdk/go1.20/bin/go /usr/local/bin/go
ln -sf ~/sdk/go1.20/bin/go ~/.local/bin/go1.20
ln -sf go1.20 ~/.local/bin/go
Python
2023-03-04
今天了解到这个库,为一些演示工作的方便而开发。用 Python 来配置界面,主要是输入、输出,然后将输入的参数传入处理方法,将返回值显示在输出。
PS:安装的时候可以看到,这个库有 14M,而且其他的依赖不少。
这只是一个简单的示例:
import gradio as gr
def greet(name):
return "Hello " + name + "!"
# demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo = gr.Interface(
fn=greet,
inputs=gr.Textbox(lines=2, placeholder="Name Here..."),
outputs="text",
)
demo.launch()
python gradioTest.py
Running on local URL: http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.

以后需要用到这个的时候再来研究研究。
LinuxNetwork Linux
2023-03-03
线上环境,有一个服务启动时,四个进程只成功了三个,检查发现端口被占用。
再一看,是被另外三个进程中的一个连接 MongoDB 占用了。
# 查看
cat /proc/sys/net/ipv4/ip_local_port_range
1024 65000
$ sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 1024 65000
PS:查了一下,个人机器(Ubuntu)上配置的是:32768 60999
把下限往上提到 20000,避开服务常用接口:
# 临时配置
echo "20000 65000" > /proc/sys/net/ipv4/ip_local_port_range
sysctl -w net.ipv4.ip_local_port_range="20000 65000"
# 持久配置
vim /etc/sysctl.conf
个人
2023-03-01
本来是想回忆一下青少年时期的各种事情,取了个名字叫我的青春。
但是细想想,我自己的青少年时光实在是乏善可陈。没有什么值得一提的事情。
或者说,和大多数人一样,我没有青春,只是在别人的青春中当个群演,跑下老套而已。
甚至,我觉得青春期的自己是个二百五,这让我感觉还不如不曾出现在别人的世界里,让这个世界更加美好一些。
所以这里还是就说一下那些年听过的歌、看过的电视吧。
Golang
2023-02-27
主要是参考一下这个目录,对照着查漏补缺。
Python 时间 Cygwin
2023-02-24
Cygwin 下执行一个 Python 脚本,其中 datetime.now()
获取到的时间居然是 UTF 时间。
执行 date 命令也是如此。
执行 tzselect,三次分别选 Asia,China,Beijing Time,然后就好了。
命令中有提示:如果要永久有效,需要在 ~/.profile 中加入 TZ='Asia/Shanghai'
。
关键是,TZ 其实有配置:
export | grep TZ
declare -x TZ="Asia/Shanghai"
运维
2023-02-24
概念
ITSM,CMDB,IPAM 和 DCIM 都是 IT 领域中的管理工具和框架,各自有不同的功能和应用场景。下面是它们的详细解释和关联:
- ITSM(IT Service Management,IT 服务管理):ITSM 是一种基于 ITIL(IT Infrastructure Library,IT 基础设施库)框架的 IT 服务管理方法论,它强调通过对服务管理全生命周期的规划、设计、交付、运营和持续改进,提高 IT 服务的质量和价值。ITSM 可以涉及到服务台管理、问题管理、变更管理、配置管理、发布管理等多个方面。
- CMDB(Configuration Management Database,配置管理数据库):CMDB 是一个用于存储 IT 资产、配置项以及它们之间关系的数据库,它可以帮助 IT 组织管理和控制 IT 环境。CMDB 可以用于支持 ITSM 的各个方面,如问题管理、变更管理、发布管理等。
- IPAM(IP Address Management,IP 地址管理):IPAM 是一种用于管理 IP 地址和网络设备的工具,它可以帮助 IT 组织准确掌握 IP 资源的分配和使用情况,避免 IP 地址冲突和浪费。IPAM 可以与 CMDB 集成,以便更好地管理 IP 资源的使用和配置。
- DCIM(Data Center Infrastructure Management,数据中心基础设施管理):DCIM 是一种用于管理数据中心设备和资源的工具,它可以帮助 IT 组织实现数据中心的资源规划、设备监控、电力管理、机柜布局等功能,提高数据中心的效率和可靠性。DCIM 可以与 CMDB 和 IPAM 集成,以便更好地管理数据中心的资源配置和使用。
总的来说,ITSM、CMDB、IPAM 和 DCIM 都是 IT 管理工具和框架,它们各自有不同的功能和应用场景,但也有一些关联和共同点。例如,CMDB 可以用于支持 ITSM 的各个方面,IPAM 和 DCIM 可以与 CMDB 集成,以便更好地管理 IT 资源的使用和配置。
相关项目
- RackTables:RackTables 是一个开源的机房资产管理系统,它可以管理 IT 资产的位置、网络、电源、硬件等信息,并提供了各种视图、报表和 API 接口等功能。
GPL
- i-doit:i-doit 是一个开源的 ITSM 和 CMDB 系统,它可以管理 IT 资产的硬件、软件、文档、业务关系等信息,并提供了各种报表、图表、导出和 API 接口等功能。
AGPL
- NetBox:NetBox 是一个开源的 IPAM 和 DCIM 系统,它可以管理网络设备、IP 地址、机柜、电源、连接等信息,并提供了各种视图、报表和 API 接口等功能。
Apache 2.0
- OpenDCIM:OpenDCIM 是一个开源的 DCIM 系统,它可以管理机房、机柜、设备、电源、网络等信息,并提供了各种视图、报表和 API 接口等功能。
GPL
Java
2023-02-23
遇到一个这样的问题,总数是 t,由 a,b,c 三部分组成。计算 a 的比例,结果算出来一个负数。
原来是 a * 100
这一步溢出了。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
public static void main(String[] args) {
double a = (double) (22890851 * 100) / 26487012;
System.out.println(a);
BigDecimal b = new BigDecimal(a);
System.out.println(b);
// 警告: [deprecation] BigDecimal中的ROUND_HALF_UP已过时
// [deprecation] BigDecimal中的setScale(int,int)已过时
// ROUND_HALF_UP is int
BigDecimal c = b.setScale(2, RoundingMode.HALF_UP);
System.out.println(c);
double d = c.doubleValue();
System.out.println(d);
BigDecimal result = new BigDecimal(22890951)
.multiply(new BigDecimal(100))
.divide(new BigDecimal(26487012), 2, RoundingMode.HALF_UP);
System.out.println(result);
System.out.println("HELLO WORLD");
}
}
OUTPUT:
86.42
-75.73078443125257
-75.7307844312525730856577865779399871826171875
-75.73
-75.73
HELLO WORLD