0%

李贤珠-白色画布

太有趣了,

主人公小米用手中的蜡笔,绘出了一片纯白的天地。在这片天地中,小米遇到了啄木鸟爷爷、熊叔叔、青蛙姑娘、兔宝宝和兔妈妈。她用手中那支神奇的画笔创造了许许多多的奇迹。

linux 之gunzip命令

.. _linux-beginner-gunzip:

官方的定义为:

gzip, gunzip, zcat – compression/decompression tool using Lempel-Ziv coding (LZ77)

参考gunzip命令

使用的方法为:

1
$ uname [OPTION]...

常用的一些选项为:

  • -a, --all:打印全部的信息
  • -s, --kernel-name:打印内核名
  • -n, --nodename:打印网络节点hostnme,即主机名
  • -r, --kernel-release:打印内核发行版
  • -v, --kernel-version:打印内核版本
  • -m, --machine:打印机器的硬件名字
  • -p, --processor:打印processor或者unknown
  • -i, --hardware-platform:打印硬件平台或者“unknown”
  • -o, --operating-system:打印操作系统

语法

1
$ unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>][.zip文件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]

参数

  • -c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。
  • -f 更新现有的文件。
  • -l 显示压缩文件内所包含的文件。
  • -p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。
  • -t 检查压缩文件是否正确。
  • -u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。
  • -v 执行是时显示详细的信息。
  • -z 仅显示压缩文件的备注文字。
  • -a 对文本文件进行必要的字符转换。
  • -b 不要对文本文件进行字符转换。
  • -C 压缩文件中的文件名称区分大小写。
  • -j 不处理压缩文件中原有的目录路径。
  • -L 将压缩文件中的全部文件名改为小写。
  • -M 将输出结果送到more程序处理。
  • -n 解压缩时不要覆盖原有的文件。
  • -o 不必先询问用户,unzip执行后覆盖原有文件。
  • -P<密码> 使用zip的密码选项。
  • -q 执行时不显示任何信息。
  • -s 将文件名中的空白字符转换为底线字符。
  • -V 保留VMS的文件版本信息。
  • -X 解压缩时同时回存文件原来的UID/GID。
  • [.zip文件] 指定.zip压缩文件。
  • [文件] 指定要处理.zip压缩文件中的哪些文件。
  • -d<目录> 指定文件解压缩后所要存储的目录。
  • -x<文件> 指定不要处理.zip压缩文件中的哪些文件。
  • -Z unzip -Z等于执行zipinfo指令。

实例

查看压缩文件中包含的文件:

1
2
3
4
5
6
7
8
9
10
11
# unzip -l abc.zip 
Archive: abc.zip
Length Date Time Name
-------- ---- ---- ----
94618 05-21-10 20:44 a11.jpg
202001 05-21-10 20:44 a22.jpg
16 05-22-10 15:01 11.txt
46468 05-23-10 10:30 w456.JPG
140085 03-14-10 21:49 my.asp
-------- -------
483188 5 files

-v 参数用于查看压缩文件目录信息,但是不解压该文件。

1
2
3
4
5
6
7
8
9
10
11
# unzip -v abc.zip 
Archive: abc.zip
Length Method Size Ratio Date Time CRC-32 Name
-------- ------ ------- ----- ---- ---- ------ ----
94618 Defl:N 93353 1% 05-21-10 20:44 9e661437 a11.jpg
202001 Defl:N 201833 0% 05-21-10 20:44 1da462eb a22.jpg
16 Stored 16 0% 05-22-10 15:01 ae8a9910 ? +-|¥+-? (11).txt
46468 Defl:N 39997 14% 05-23-10 10:30 962861f2 w456.JPG
140085 Defl:N 36765 74% 03-14-10 21:49 836fcc3f my.asp
-------- ------- --- -------
483188 371964 23% 5 files

列出系统硬件信息的lshw

lshwHardware Lister 的缩写,直面意思即列出系统硬件信息。

可以显示关于计算机硬件组件(如处理器、内存、硬盘、网卡等)的详细信息,对于系统管理员和用户来说是一个非常有用的工具。

显示所有硬件信息

任何参数都不加的话,可用,信息极多,但是可用信息不多。

1
sudo lshw

这将输出系统中所有可用硬件的详细信息,包括硬件组件的制造商、型号、驱动程序等。

查看摘要硬件信息

显示摘要信息:相对而言,这个反而好一些,简单的就是有用的

1
sudo lshw -short

这将显示硬件的摘要信息,包括设备名、类别、描述等。

查看特定硬件信息(如网络、内存、硬盘等设备)

显示指定类型的硬件信息

1
sudo lshw -C network

上述示例将仅显示网络相关的硬件信息。

比如还可以查看memorycpudisk等信息。

lshw提供了全面的硬件信息,帮助用户了解系统配置和硬件组件的细节。在查看和诊断硬件问题或了解系统配置时,它是一个非常有用的工具。

Bandpass 带通

带通指在其跨越的范围内传递频率并衰减其他的频率。

带通的常见天文应用是在射电望远镜上使用的观测频率,它必须具有有限的带宽或带通。从这个意义上说,理想的带通类似于阶跃函数,在高频和低频边界处具有完美的截止,并在其间具有平坦的响应。在实践中存在一些”band edge roll-off”,即边界处的信号衰减,但不会完全降至零。因此,射电天文学家通常会丢弃在带通边缘收集的数据,这可能会受到带边缘滚降的影响。

参考:COSMOS (swin.edu.au)

Baseline 基线的概念

在射电天文学中,基线是连接两个射电望远镜构成的矢量,主要用于干涉测量,以确定观测中某颗源”相位中心”的条纹率,一条基线对应傅里叶空间中的一个点。

对于具有N个元素的干涉仪,有N(N-1)/2个独立的基线。靠近在一起的天线对善于测量源中的大尺度结构,而长基线具有更好的分辨率和解析精细结构。

首先是“基线”,即干涉阵中两个天线所构成的矢量,它是干涉测量的基础概念,一条基线对应傅里叶空间中的一个点。基线由阵列的布局决定。

物理基线

物理基线是在三维空间中,两个天线之间的几何连接。投影基线是该三维的物理基线在二维平面上的投影,该二维平面由观测方向决定。在地面参考系(In Terrestrial Reference Frame,ITRF)中,物理基线是常数,不会变,但是投影基线却会随着地球的自转而改变,因为在天空参考系里,源固定不动,因此投影基线所在的二维平面在随时变化。

杨氏双缝实验

函数double_slit画了一个双缝实验装置, 𝑝处有一个光源(事实上,这个函数可以画多个光源,这里我们暂时只画了一个源)。蓝色点线是光轴(𝑝=0),正弦波可以看出波长(这里单位任意,因为只有跟波长相关的几何距离才会影响到结果)。黑线表示光波通过狭缝到达右边像屏的路径。右边的条纹是干涉模式,红色曲线为干涉模式横截面的光强曲线。

干涉模式随基线baseline 𝐵B (两狭缝之间的距离)和波长𝜆λ 的变化。调整下面的baseline和wavelength滑块,观察右边条纹的变化:baseline越长,条纹频率越高(间隔越窄),波长越短,条纹频率也越高。

最早的双缝实验验证了光的波动性质,光源只是被用来照亮狭缝。现在反问一下自己,如果给定一个双缝装置,我们是否能利用它获得一些光源信息?是否能利用双缝实验做成一个测量设备,也就是 干涉仪 呢?

假定移动位置,我们注意到,长基线对源的位置变化很敏感,而短基线则没有那么敏感。在第四章我们将学习到,干涉仪的空间分辨率(可以区分出的最小源间距离)由𝜆/𝐵λ/B决定,而传统望远镜的空间分辨率由𝜆/𝐷λ/D决定,其中𝐷D为天线(或者镜子)的口径。这是一件非常幸运的事实,因为长基线的造价要比大口径低很多!

然而,由于干涉模式的周期性,长基线测到的位置并不明确。相反,短基线正好能解决上述问题.

如下:

短基线的效果:

最早的visibility的出现,在杨氏双缝实验就已经使用了术语“可见度”visibility,该术语最早指的是干涉模式中亮纹和暗纹间的对比度。

现代干涉仪用的是复可见度,是复数。一个复可见度的振幅,或者可见度振幅,对应了干涉模式的亮度,可见度相位对应了相对相位(在我们的模拟实验中,指的是屏幕中央条纹的相位)。一个复数就表示了光源了所有信息,然而,双缝实验显示了整个干涉模式,屏幕上模式的变化完全取决于“盒子”(一般是用于测量的仪器)的几何规格,光源的信息内容只有幅度和相位。

现代干涉仪用的是复可见度,是复数。一个复可见度的振幅,或者可见度振幅,对应了干涉模式的亮度,可见度相位对应了相对相位(在我们的模拟实验中,指的是屏幕中央条纹的相位)。一个复数就表示了光源了所有信息,然而,双缝实验显示了整个干涉模式,屏幕上模式的变化完全取决于“盒子”(一般是用于测量的仪器)的几何规格,光源的信息内容只有幅度和相位。

到目前为止,我们仅仅只是关注了测量源的属性。显然,干涉模式对仪器的几何性质也很敏感。根据上述现象引申出了干涉仪的许多其它应用,从大地测量VLBI(通过对已知源的射电干涉探测,精确测出天线位置的变化,从而得到大陆的漂移量),到最近LIGO做的引力波探测(以激光作为光源,通过干涉模式测出由引力波引起的时空的微小扭曲,也就是干涉仪的几何改变)。

上面的双缝实验模拟器已经向我们展示了,不同基线长度,其干涉模式传递了天空的某项特定信息。在下面的例子中,对同一条基线,三个不同的“天空”却得到了相同的干涉模式,因此,一次测量无法区分它们:

但是,改变基线长度再次进行测量,得到了截然不同的干涉模式:

使用更多基线,我们能收集到足够信息,重建得到天空图像。这是因为,本质上,每条基线测得的是天空亮度分布的一个傅立叶分量(详见第4章),知道了傅立叶分量,通过傅里叶变换,就能重建出天空图像。1960年代末,计算机的出现使该技术成为可能,射电干涉仪变成了通用化的成像仪器。若非特别说明,现代射电干涉测量指的就是孔径合成。

Michelson interferometer 迈克尔逊干涉仪

完整起见,我们修改上面的函数,使之更接近现实的干涉仪。主要改了两处:

  • 把光源改为无限远
  • 按照迈克尔逊干涉仪修改光路

我们对程序做了如下改动。首先,光源位于无限远,因此我们根据入射波前的到达角度(0表示同轴,即沿垂直轴)来定义光源位置。然后用波长数定义基线长度。抵达干涉仪的两个臂的波前“相位差”完全根据到达角来定义,进入干涉仪外臂的两条“射线”指示了入射角。

在不同的position、intensity和baseline的情况下的效果如下所示:

此时用2个源来测试一下:

参考

Broadband 宽带

天文学中,术语”宽带“是指进行给定观测的频谱的宽度,用于区分连续体和光谱线观测(参见后者的窄带条目)。观测的带宽越宽,灵敏度越高,因此对于任何波长的连续观测或光度测量,都可以使用宽带(宽带)滤波器。

射电天文学中,宽带观测通常是指约100 MHz的频率宽度。

参考:COSMOS (swin.edu.au)

HPC 相关

FLOPS is floating point operations per second. This is used as a measurement because historically floating point operations has been very expensive operations compared to other operations. 每秒浮点运算次数,亦称每秒峰值速度,(英语:Floating-point operations per second;缩写:FLOPS),即每秒所运行的浮点运算次数。浮点(floating-point)指的是带有小数的数值,浮点运算即是小数的四则运算,常用来测量电脑运算速度或被用来估算电脑性能,尤其是在使用到大量浮点运算的科学计算领域中。因为FLOPS后缀的那个S代表,而不是复数,所以不能够省略。在多数情况下,测算FLOPS比测算每秒指令数(IPS)要准确。

浮点运算实际上包括了所有涉及浮点数的运算,在某类应用软件中常常出现,比较整数运算更用时间。现今大部分的处理器中都有浮点运算器。因此每秒浮点运算次数所量测的实际上就是浮点运算器的运行速度。而最常用来测量每秒浮点运算次数的基准程序(benchmark)之一,是Linpack

FLOPS在高性能计算机集群(超算)上可以使用这一公式得出:
${\displaystyle {\text{FLOPS}}={\text{racks}}\times {\frac {\text{nodes}}{\text{rack}}}\times {\frac {\text{sockets}}{\text{node}}}\times {\frac {\text{cores}}{\text{socket}}}\times {\frac {\text{cycles}}{\text{second}}}\times {\frac {\text{FLOPs}}{\text{cycle}}}}$

简化到计算机只拥有一块CPU的情况时,可以使用以下公式:

${\displaystyle {\text{FLOPS}}={\text{cores}}\times {\frac {\text{cycles}}{\text{second}}}\times {\frac {\text{FLOPs}}{\text{cycle}}}}$

Environment Modules

Environment Modules 给用户提供了一个通过modulefiles动态的修改环境变量的方法。

什么是 Environment Modules?

通常,用户在登录时通过为会话期间要引用的每个应用程序设置环境信息来初始化其环境。Environment Modules包是一个简化shell初始化的工具,它允许用户在使用modulefile进行会话期间轻松地修改环境。

每个modulefile包含为应用程序配置shell所需的信息。初始化Modules包后,可以使用modulefiles的module命令在每个模块的基础上修改环境。通常,modulefiles 可以使用module命令更改或设置shell环境变量,如PATH、MANPATH等。modulefile可以由系统上的许多用户共享,用户可以有自己的集合来补充或替换共享的modulefile。

模块可以使用 loadedunloaded 动态操作。支持所有主流的shell,比如 bash, ksh, zsh, sh, csh, tcsh, fish, 还有一些其他的脚本语言,如 perl, ruby, tcl, python, cmakeR.

模块在管理不同版本的应用程序时非常有用。模块也可以绑定到元模块中,元模块将加载一整套不同的应用程序。

快速示例

Here is an example of loading a module on a Linux machine under bash.

1
2
3
$ module load gcc/8.3
$ which gcc
/usr/local/gcc/8.3/linux-x86_64/bin/gcc

Now we’ll switch to a different version of the module

1
2
3
$ module switch gcc gcc/9.2
$ which gcc
/usr/local/gcc/9.2/linux-x86_64/bin/gcc

And now we’ll unload the module altogether

1
2
3
$ module unload gcc
$ which gcc
gcc not found

Now we’ll log into a different machine, using a different shell (tcsh).

1
2
3
% module load gcc/9.2
% which gcc
/usr/local/gcc/9.2/linux-aarch64/bin/gcc

Note that the command line is exactly the same, but the path has automatically configured to the correct architecture.

开始使用 Modules

Download latest version of Modules. Learn how to install it on Unix or how to install it on Windows. You may alternatively automatically retrieve and install Modules with your preferred package manager as Environment Modules is widely available. If you are upgrading from an older version of Modules, read the MIGRATING guide to learn all new features recently introduced.

Reference manual page for the module(1) and ml(1) commands and for modulefile(4) script provide details on all supported options. If you have questions, comments or development suggestions for the Modules community, please read the CONTRIBUTING guide.

搜索路径问题

1
2
3
4
5
6
7
#这个是关于引用博主和我自己的使用情况的一些总结:
#查看MODULEPATH
echo $MODULEPATH

#修改路径
#在默认的/usr/share/module/init/bash中添加最后一行
export MODULEPATH=/YOUR/PATH/:$MODULEPATH

modulefiles文件的书写

  • 文件的开头一定是#%Module1.0开始
  • 有几个命令
    • prepend 要修改的环境变量 路径
    • setenv 修改环境变量的值
    • conflict modulefile 如果这个modulefile已经被加载,则当前的modulefile不能被加载

一个模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#%Module1.0
proc ModulesHelp { } {
global version prefix

puts stderr "\t Loads the environment for my installed home folder HOME/local"
}

module-whatis "Loads the environment for my installed home folder HOME/local"

set HOME /home/svu/a0081742

prepend-path PATH $HOME/local/bin
prepend-path LIBRARY_PATH $HOME/local/lib
prepend-path LD_LIBRARY_PATH $HOME/local/lib
prepend-path LD_INCLUDE_PATH $HOME/local/include
prepend-path MANPATH $HOME/local/share/man

使用方法

  • module avail 显示可以使用的模块
  • module load 加载模块
  • module unload 卸载模块
  • module list 显示已经加载的模块

Ubuntu busybox 无法启动问题

屏幕错误提示

错误显示类似于:

1
2
3
4
5
6
7
8
9
10
11
12
mount: mounting /dev/disk/by-uuid/***************************** on /root
failed: Invalid argument
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /dev on /root/dev failed: No such file or directory
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /proc on /root/proc failed: No such file or directory
Target file system doesn't have /sbin/init
No init found. Try passing init= bootarg

Busybox v1.13.3 (Ubuntu 1:1.13.3-1ubuntu7) built-in shell (ash)
Enter 'help' for a list of built-in commands
(initramfs) _

解决方案

  1. 从Ubuntu10.04 live CD引导系统;
  2. 打开命令行;
  3. 运行sudo fdisk -l回车,目的是查看设备名称。输出类似于:
    1
    2
    3
    4
    5
    6
    7
    8
    Disk /dev/sda: 250.1 GB, 250059350016 bytes
    255 heads, 63 sectors/track, 30401 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Disk identifier: **********
    Device Boot Start End Blocks Id System
    /dev/sda1 * 1 30238 242886703+ 83 Linux
    /dev/sda2 30239 30401 1309297+ 5 Extended
    /dev/sda5 30239 30401 1309266 82 Linux swap / Solaris
    选择Linux所在分区: /dev/sda1。如果/boot单独分区了则选择/boot所在分区。(我个人认为)
  4. 运行sudo fsck /dev/sda1回车;
  5. 重启电脑,正常引导系统。

git reset

使用 git reset HEAD <file>... 来取消暂存。 所以,我们可以这样来取消暂存 CONTRIBUTING.md 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

renamed: README.md -> README

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: CONTRIBUTING.md

这个命令有点儿奇怪,但是起作用了。 CONTRIBUTING.md 文件已经是修改未暂存的状态了。

Note git reset 确实是个危险的命令,如果加上了 --hard 选项则更是如此。 然而在上述场景中,工作目录中的文件尚未修改,因此相对安全一些。