Decorative image frame

打工日记001

掐指一算,上一次更新已经是三年前的事情了,在这三年的时间里,我完成了开题、中期、毕业答辩,求职、入职、开始打工,当然也白交了两年域名费用并且把markdown和Hexo的语法忘了个精光😅本着花出去的时间和钱绝不能浪费的原则,终于下定决心爬起来更新了!主要内容是打工过程中学到的一些或热或冷的零碎知识,希望未来一年里能把打工日记里的碎片慢慢都整理出来…

win本的一些小毛病

打开电脑的第一感觉就是一段时间不用有点不顺手了,先把边边角角的毛病修补一下。

更新git版本

打开blog的文件夹,首先就发现git版本已经一个世纪没有更新了,被VScode警告要么更新要么滚(。首先查看当前git版本:

1
2
3
4
5
6
git --version

# 2.17.1以上版本执行
git update-git-for-windows
# 2.17.1以下版本执行
git update

无法将“XXX”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

碰到的每个win本都会犯的一个神奇毛病,解决方案是打开控制面板搜索“高级系统设置”,在里面把system32文件夹加到Path里。其实系统变量里已经有了,但是在用户变量里再添加一次神奇地解决了问题,虽然不知道为什么但能用就好…

在markdown中使用emoji

再也没有什么可以阻拦我在blog里添加表情包了!在两个冒号中间加入对应的表情代码就可以,表情代码列表参见《Markdown 使用 Emoji 表情_markdown表情_三年不回来的博客-CSDN博客》

(让我来试一试:flushed:

Ubuntu从安装到使用备忘录

修完了笔记本现在轮到修服务器了,公司给配了一台年纪不小配置不低的工作站,拾掇拾掇也可以跑两个小模型。系统太过老旧,只能从头安装,百废待兴。

安装Ubuntu 22.04.01 jammy jellyfish

  1. 创建系统盘:不要用UltraISO,用rufus,可选择免安装版本
  2. 安装时:hp按esc进入BIOS,如果在boot选项里找不到U盘,关机重新拔插启动盘后重启,不要尝试boot from file(虽然这个选项中可以识别到系统盘)
  3. 网络:公司网络使用PEAP认证,直接输入账号密码是无法保存设置的,因为PEAP默认先检测CA证书,勾选不检查CA证书后可正常连接;否则会重复提示确认/输入账号密码,这是由于系统在反复检查CA证书导致的的
  4. 换源:更换阿里源,官网有教程,但要注意修改代号。官网给出的20.04 LTS源对应的Codename是20.04.4的focal,我安装的是20.04.1的jammy jellyfish,不同版本ubuntu使用的软件源是不一致的,故而在安装各种包的时候持续报错“无法修正错误,因为您要求某些软件包保持现状,就是他们破坏了软件包间的依赖关系”。

Ubuntu出现”E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。”的正确解决姿势

Codename可通过lsb_release -a指令查看。修改源(/etc/apt/sources.list)前记得进行备份,以防万一需要回滚。

安装ENVD

首先安装docker

Docker 安装 (完整详细版)

  1. 注意安装deb前要完成Prerequisites,https://docs.docker.com/desktop/install/ubuntu/ 这个链接中的第一部分,以及https://docs.docker.com/engine/install/ubuntu/#set-up-the-repository 中的set repository
  2. 这里docker run hello-world时报错daemon连接超时,是因为找不到/etc/docker/daemon.json(也有可能是因为国外源速度太慢),需要创建该文件,顺便换成国内源:

Docker配置国内镜像源_柚子君.的博客-CSDN博客_配置docker镜像源

然后安装envd

GitHub - tensorchord/envd: 🏕️ Reproducible development environment for AI/ML

虽然系统预装了python 但并没有预装pip,使用以下命令安装pip3和envd

1
2
3
4
5
6
7
8
9
sudo apt install python3-pip
pip3 install --pre --upgrade envd
# 对于非root用户,会报出权限错误:
# PermissionError: [Errno 13] 权限不够: '/usr/local/lib64/python3.6'
# 此时可以在pip3命令中加入参数 --user,使得软件安装在当前用户的目录下
# --user Install to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on
# Windows. (See the Python documentation for site.USER_BASE for full details.)

pip3 install --pre --upgrade --user envd

安装之后理论上应该bootstrap,但是电脑提示找不到命令envd,经过一番丢人询问后发现是pip3路径没有加入PATH,把$HOME/.local/bin加入PATH即可(感谢ENVD大佬们不笑之恩…

使用Wine安装Win版微信和企业微信

Wine可以允许用户在Ubuntu上运行一些windows程序,这里用来安装微信和企微,安装ref:

  1. wine官网:https://www.winehq.org/announce/8.0.2

  2. 网上搜到的教程:Ubuntu 18.04 Wine下安装微信并成功解决疑难杂症_wine 微信_samsu0108的博客-CSDN博客

安装完成后直接去下载windows安装包,打开时直接选择用wine运行。安装完发现没法输入文字,需要安装riched20

  1. 不能输入_wine下微信不能输入文字的解决方案_流川枫海的博客-CSDN博客

  2. 使用 wine 安装微信遇到的问题解决方法 - y1j2x34 - 博客园

于是安装riched20,又发现有两个程序下不下来。。。真的会谢,费了老劲儿在gayhub上找到了资源(百度盘: 点我

最后的结果是微信可以正常使用但经常闪退,企业微信是完全打不开。要注意用wine安装的微信传文件只能靠拖拽,右键另存为是摸不到正常的ubuntu文件系统路径的。

安装electron-ssr

使用electron打包好的ssr,安装方便快捷,操作丝滑流畅,安装后可能需要手动设置一下系统代理。原作者已删裤隐退了,backup仓库:运行electron-ssr后报错且无法访问外网 · Issue #26 · qingshuisiyuan/electron-ssr-backup · GitHub

安装倒是简单,但是怎么也连不上外网,一个世纪后才终于修好了electron-ssr 再次见到了我的Chrome插件和书签……两个令人印象深刻的bug:

  1. 设置python-is-python3;
  2. ssr调库的时候在libsodium和libcrypto前面都又加了一个lib,混乱中立人懒得定位问题直接两个软链接

啊 这久违的村通网的感觉

ftplib下载JRA-55逐日数据

关于JRA55-Daily资料

丑话说在前头:我从未见过如此傻逼的再分析资料!!!

之前我用NCEP的再分析资料比较多,基本是按层次分类,逐月变量一个变量一个文件,逐日变量一年一个文件。ERA那就不说了,鼠标咔咔一通点人自动给你生成下载脚本,拖下来直接跑上就万事大吉。JRA55就不一样了,打开说明文档的一瞬间我就感到大事不妙:它的变量是一组一组存放的,并且命名方式也与我熟悉的规则相去甚远,更不用说官方页面上写了巨大的“由于服务器压力过大,建议大家下一个小时歇一个小时,并每十二小时登出一次以免服务器崩溃”……

以上都是序曲,当真正打开JRA服务器的时候我才感觉到了什么叫两眼一黑:

JRA55逐日资料的存储逻辑是这样的:打开FTP服务器,首先看到的是data01~data20一共20个文件夹,外加一个叫JRA55的文件夹

JRA服务器

点进这个文件夹,再点进Hist,就可以看到不同时次的数据各自的目录。注意:这三个目录都是链接,并不是真实的绝对路径。

JRA55-daily

点进Daily后进入了逐日数据的子目录,此时链接已经把我带到了data19这个文件夹(。到这里还没有结束,我准备先下载高度场数据,于是点进了anl_p125文件夹。在等待了漫长的5分钟后,终于加载出了文件夹下的全部内容:每年每月一个文件夹,足足700多个软链接……

yyyymm

更不要说每个链接底下都是混着放的一大堆变量,而每个变量又都是每天4个时次各一个文件,而且还是GRIB格式,下载的时候需要记得顺带捎上它们的说明文件。第一天我写完下载脚本美滋滋地挂上就回去了,第二天回来一看,好家伙才下了一年就找不到路径了,再仔细一看原来是新的一年他换了一个data文件夹存!而且如果你以为“换一个文件夹”等价于“data文件夹序号+1”那就太天真了,你的逻辑说了不算,目录安排的顺序说了才算,具体的大家自己看看就知道了,实在无力吐槽。

此时经历了n次下载失败的我已经完全抓狂,只想说JRA你自己不会搞就外包出去啊!!整理一下会死吗!!!!

实现方式

综上所述,脚本需要实现这样的功能:

  1. 进入Daily数据的总目录,并根据目录下给出的每个月的yyyymm文件夹链接,获取每个月的实际存储路径。
  2. 进入yyyymm文件夹,挑选出需要的变量对应的文件名。
  3. 由于获取到的文件名排列也是混乱的,为了确认下载进度,对其根据时次进行排序。
  4. 每个文件下载前,若本地已存在对应文件,还需检查文件完整性。

使用到的包

re - 正则表达式

官方文档点我,主要用到了两个函数:

  1. re.match - 匹配文件开头,用于挑选需要的变量
  2. re.search - 提取文件末尾的时次信息用于排序

正则表达式是怎么也绕不开的一个常用包,不过我用得还不是很顺溜,有机会再去慢慢研究。

os- 文件/目录方法

中文文档点我,英文文档点我,菜鸟教程点我

操作本地文件目录,切换文件夹(os.chdir),查询文件大小(os.path.getsize),拼接路径(os.path.join)等。

ftplib - ftp协议客户端

重头戏来了,在这之前我都不知道FTP服务器具体都有哪些指令,为了下这个数据把这个包里所有函数都仔仔细细看了一遍,自己整理了一个表,另外还有一些补充说明,放在文章末尾。

ftplib

pandas & datetime - 时间与日期

网上查了查怎么生成指定时间段内yyyymm的列表,结果发现好些都是写的循环一个一个加出来的,实在是太不优雅(。所以引入了pandas,用一下它的date_range函数。也许其它的包也能实现,不过鉴于我只学了一个pandas,就先有啥用啥啦!

实际脚本

脚本存放在Github,鉴于我还是没搞懂代码高亮怎么整,今天也还是上图。(polacode这个插件真的不错子!

这里本地文件是以wb方式打开,所以如果下载不完全是会直接覆盖本地文件 重新下载。如果单个文件较大的话可以考虑酌情修改。

sftp_py_v2.0

使用效果:

实操

ftp补充说明

ftp-MLSD

ftp工作模式

ftp指令

彩蛋

回来面对半年没见的台式机还有点陌生,重要的是我竟然忘了把wsl映射为网络驱动器是怎么整的了。直接把绝对路径

1
C:\Users\User\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu16.04onWindows_79rhkp1fndgsc\LocalState\rootfs

按照规则改写一下输进映射网络驱动器会报错,后来发现是因为…这是本机地址不算在网络驱动器里【。

正确的操作应该是添加以下地址为网络驱动器。

1
\\wsl$\Ubuntu-16.04

小盆友,你学废了吗???

下载指定时间段NCEP-R1数据

这篇文章一开始写在2019年6月19日,今天(勉强)实现当时扑街了的python做法,修整一下补个档!

文件存放在GitHub:仓库地址戳我


Bash脚本实现

os模块相关:链接

os模块下的基本文件查询等:链接

wget的用法:linux wget 命令用法详解(附实例说明)

NCEP/NCAR Reanalysis 1:按pressure分层

Shell中判断文件,目录是否存在


好的以上内容都是为了写一个【自动下载数据】的脚本

脚本主要功能是下载指定时间段、指定变量数据,并按变量分类存放

仅下载指定时间主要是为了方便使用cdo

(所以也可以在脚本最后直接加上cdo指令)

脚本主要问题是不会检测已存在的文件下载是否完整。脚本运行期间文件的完整性会由wget的断点续传保证,但如果脚本运行中断,下一次运行前需要手动检查上次的最后一个文件是否被完整下载,若没有完整下好,建议删掉最后一个文件后再重新运行脚本。

当然我是把它提交到服务器后台去运行,不需要担心这种情况了哈哈哈哈哈哈

脚本如下!

00_download_ncep1.sh


Python脚本实现(2020 update)

因为NCEP这个数据是存储在一个ftp服务器上的,所以使用了ftplib来做这个下载。

服务器是匿名登陆的,主要目的也是实现只下载指定期间的数据并按变量存放。但是对于偶尔也会出现的“同一个目录下放了同一种变量的两种数据”的情况,暂时还没有考虑,也暂时不会检查文件是否已经存在or是否完整。另外还想过要增加进度条,目前还没整明白怎么搞。

参考文档:

没参考得上的文档:

00_download_ncep1.py

本来是想传代码上来的,但是还没搞明白怎么用highlight.js做高亮,万一高亮太丑那还不如不高亮了哈哈哈哈哈!等搞明白再来更新!

LOFTER搬家小工具

LOF事件一发不可收拾,下定决心搬家了。

过程其实很简单,简单介绍一下步骤,万一还有别人要搬家呢2333


搬家主要步骤

1.登录LOFTER,在首页标题栏【更多】->【导入导出】,将博客导出为xml文件(长文章会被略过)

2.使用LOFTER2Hexo工具,将xml切分为适用于Hexo的Markdown格式,图片会被自动下载并上传到(大概是CSDN的)图床。不熟悉代码的盆友可以试试另外一个姐妹写的Lofter2Hexo,好处是有图形界面,问题是有图形界面我反而搞不懂了…该工具还在更新维护中!

3.打开powershell,hexo new新建文档,把转换好的Markdown文件复制过来稍加修改,完成!


一些小细节

图片资源管理

分割好的Markdown文件里包含的图片链接都是重新上传的网络图床链接,但是因为个人习惯的原因,我还是用了本地保存下来的图片,通过文章资源文件夹的方式进行管理。这个页面还同时给出了正确引用图片的方式。

对于那些想要更有规律地提供图片和其他资源以及想要将他们的资源分布在各个文章上的人来说,Hexo也提供了更组织化的方式来管理资源。这个稍微有些复杂但是管理资源非常方便的功能可以通过将 config.yml 文件中的 post_asset_folder 选项设为 true 来打开。

1
2
_config.yml
post_asset_folder: true

当资源文件管理功能打开后,Hexo将会在你每一次通过 hexo new 命令创建新文章时自动创建一个文件夹。这个资源文件夹将会有与这个文章文件一样的名字。将所有与你的文章有关的资源放在这个关联文件夹中之后,你可以通过相对路径来引用它们,这样你就得到了一个更简单而且方便得多的工作流。

域名解析

这次鼓捣途中顺便搞了搞域名,之前的教程大多使用A类型记录,先ping一下Github再把得到的IP写进记录。0202了,实在不应该再用这种Github换一次ip就要失效一次的解析方式了。只需要添加两个CNAME记录,然后等解析生效就可以,@记录可以让你直接通过域名访问blog,www记录可以让你通过www.域名访问blog。

Github仓库那边,只要在Setting里直接把custom domain改成你买的域名就行了。但hexo g后CNAME文件也会失效,所以需要更改样式,避免每次都要修改这一项。具体步骤在下一小节。

众所周知Safari有一个“添加到主屏幕”功能,如果能配上一个可爱的图标,那几乎就可以伪装成一个APP了。悲伤的是Safari在没有特殊设置的情况下,默认使用网页截图作为图标,我于是吭哧吭哧画了一只小松鼠,鼓捣了半天终于拥有了自己的logo:

实际使用中还有两种语句n种语法(参考这里这里),我的用法很简单,就是在index.html的head部分加上一句

1
<link rel="apple-touch-icon-precomposed" href="safari-icon.png">

然后把’safari-icon.png’这张图往仓库一丢,过一会会就生效了!

但是每次重新生成页面之后都要重复一遍以上操作又很麻烦,所以在把这篇文章发出去之后,我躺在床上不死心地搜了搜,发现我应该改的是样板,也就是theme的文件!于是把上一行加在了这个文件里,添加favicon的下一行

1
2
3
4
5
E:\hexo\hexo\themes\ocean\layout\_partial\head.ejs

<% if (theme.favicon){ %>
<link rel="shortcut icon" href="<%- theme.favicon %>">
<link rel="apple-touch-icon-precomposed" href="safari-icon.png">

然后把icon和favicon.ico这个文件放在同一个文件夹里(theme下source里),顺便把CNAME文件也放进去以避免每次都要重新解析,测试了一下,成功!

p.s.不知道尺寸有没有限制,我用的是144*144的位图,还是挺清楚的

五月最后一周的NCL笔记

大家好!又是一个边骂NCL弱智一边写NCL的星期过去了!
我来汇报这星期新发现的bug!!!(。


【Resource类】

 如果你也想给你的Panel图加上一个Color Bar,那你或许大概有可能也会用到如下resource设置:

1
2
3
4
5
6
7
8
9
10
11
12
panel_res                            = True        

panel_res@gsnPanelDebug = True ;输出各子图的ndc坐标信息
panel_res@gsnPanelLabelBar = True ;打开panel的Label Bar
panel_res@lbOrientation = "Horizontal"
panel_res@pmLabelBarOrthogonalPosF = -0.015 ;把Label Bar往下挪一点
panel_res@pmLabelBarWidthF = 0.4 ;设置Bar的宽度
panel_res@lbLabelFontHeightF = 0.012 ;设置Bar的字体大小
panel_res@gsnPanelBottom = 0.05 ;放不下了,给画布底下加长点儿

panel_res@lbBoxLinesOn = True
panel_res@lbBoxLineColor = "grey77" ;设置Bar中框线的颜色

中间比较神奇的就是虽然大部分Panel图资源都通过plot manager(pm)实现,但其方向和字体宽度等都仍然由label bar(lb)分类下的属性设置。另外不得不特别提一句的就是

  • gsnPanelDebug:一个强烈推荐panel图排版不如人意的人试着打开的开关,不细说,但是着实好用!
  • pmLabelBarOrthogonalPosF/pmLabelBarParallelPosF:前者设定垂直于label bar方向的ndc坐标偏移,后者设定平行于label bar方向的ncd坐标偏移,因而对于水平和垂直方向的label bar二者的方向是不同的。ndc坐标也是又一个NCL神奇设定,简而言之就是以左上角为(x=0.00,y=1.00),然后y轴向下递减,x轴向右增加的这么一个坐标系。上述设置中涉及到0.xx的数字也大概是以这个坐标系为参考的…吧。
    (附:NDC坐标示意图)


【Function类】

dtrend, dtrend_n, dtrend_msg_n

 使用最小二乘法去除数据的线性趋势,其中最后一个允许数据中包含缺测值。

1
2
3
dtrend(y, return_info) - 对最右边一维去趋势
dtrend_n(y, return_info, dim) - 对dim指定的维去趋势
dtrend_msg_n(x, y, remove_mean, return_info, dim) - 同上一个,但允许缺测值

 其中return_info如果设置为True,返回值就会包括两个attribute,一个是去掉的趋势slope,一个是我也不知道用来干嘛的y_intercept,均为一维序列,如果要用它俩画图需要先reshape一下。最后一个函数里的第一个参数x是y需要去趋势那一维的坐标信息,一般直接取y&time(以时间维为例)即可。remove_mean正常情况下设为True。这系列函数都会保留坐标和atr信息,无需拷贝坐标信息。

mask

 “保护”一个变量中符合给定条件的部分,而把其他都设为缺测值。

 八百年搞不清楚的一个函数,每用一次都要查一次,常查常忘。此函数接收三个参数:

1
mask(array, marray, mvalue)

 其中mvalue原则上为scalar,如果是多维的,则维度需要与array匹配,或者与array的右侧几维匹配。此函数的功能是把array中对应位置的marray不等于mvalue的部分设为缺测值,即mask掉第2和第3个参数不等的部分。这个思路就十分离谱,比如我想要mask掉波作用通量Fx中西风风速uwnd小于5的部分,我需要这么写:

1
Fx = mask(Fx, uwnd.lt.5, False)

 结论就是使用时,第二个参数写上想要mask的条件判断式,第三个参数写False。。。

clmDayTLL/clmDayTLLL, calcDayAnomTLL

 用于计算逐日气候态(年循环)和从原数据中去除年循环。

 前两个函数的主要差别就是一个接收三维数据一个接收思维数据,除原数据之外还需要提供一个yyyyddd数据,对应输入数据的时间维,其中ddd指的是”在一年中是第几天“,取值范围为001-365。计算yyyyddd可以通过cd_calendar(time, -2)yyyymmdd_to_yyyyddd实现,也可以cd_calendar(time, 0)然后提取结果的(:,0:2)再使用day_of_year(year, month, day)实现。

calcDayAnomTLL接收一个clmDayTLL函数输出的结果作为参数,操d的是这个函数他…没有四维版本!所以四维数据要转换为三维处理完再reshape回去。多说无益,上一个我实际使用的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
hgt_tmp   = f->hgt;(:,{1000,850,500,200},:,:)
lat = f->lat
lon = f->lon
timetmp = f->time

timehgt = cd_calendar(timetmp, -2) ;return YYYYMMDD in integer
yyyyddd = yyyymmdd_to_yyyyddd(timehgt)

dims_hgt = dimsizes(hgt_tmp)
ntime = dims_hgt(0)
nlev = dims_hgt(1)
nlat = dims_hgt(2)
nlon = dims_hgt(3)

hgt_tmp2 = reshape(hgt_tmp, (/ntime,nlev,nlat*nlon/)) ;TLLL->TLL as required by function
hgt_tmp2!0 = "time"
hgt_tmp2!1 = "level"
hgt_tmp2!2 = "lat_and_lon"
hgt_tmp2&time = hgt_tmp&time
hgt_tmp2&level = hgt_tmp&level
printVarSummary(hgt_tmp2)

hgt_clm_366 = clmDayTLL(hgt_tmp2, yyyyddd)
hgt = reshape(calcDayAnomTLL(hgt_tmp2, yyyyddd, hgt_clm_366), dims_hgt)
copy_VarCoords(hgt_tmp, hgt)
printVarSummary(hgt)

此处不得不再次感叹ncl的博大精深!真是太tm有想法了!

填色中央设置为透明

 最后再献丑给大家分享一个自己写的段子,主要功能是把等值线填色图靠近中间值的几个level填色设置成透明,这样就可以省去填色等值分开画还要overlay的麻烦。原理也很简单:把rgba值的最后一个值设为0,因此rgb格式的色表需要手动加上最后一维(值均设为255.0)

 透明半径由set_trans_radius = n指定,如果填色总格数是偶数,则两侧各涂n格;如果为奇数,则中间一格及左右两侧各n-1格设为无色。例如:一共14格填色,n=1,则第7和第8格设为无色;一共15格填色,n=1,则第8格被设为无色。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
res@cnLevelSelectionMode        = "ExplicitLevels"

lv = fspan(-0.075, 0.075, 11)
cl = ispan(20, 108, 8)

colors_tmp = read_colormap_file("MPL_BrBG")
dim_colors = dimsizes(colors_tmp)

colors_tmp!0 = "index"
colors_tmp&index = ispan(0, dim_colors(0)-1, 1)
colors_tmp!1 = "rgba"
colors_tmp&rgba = ispan(1, 4, 1)

colors_work = (/colors_tmp({cl},:)/)

res@cnLevels = lv
res@cnFillColors = colors_work(:,:)

set_trans_radius = 1 ;设置透明半径

if (dimsizes(cl)%2.eq.0) then
set_trans = (dimsizes(cl)/2)-1
set_trans_start = set_trans-set_trans_radius+1
set_trans_end = set_trans+set_trans_radius

colors_work(set_trans_start:set_trans_end,:) = conform_dims((/set_trans_radius*2,4/), (/255.0,255.0,255.0,0.0/)/255.0, 1)
else
set_trans = (dimsizes(cl)-1)/2
set_trans_start = set_trans-set_trans_radius+1
set_trans_end = set_trans+set_trans_radius-1

colors_work(set_trans_start:set_trans_end,:) = conform_dims((/set_trans_radius*2,4/), (/255.0,255.0,255.0,0.0/)/255.0, 1)
end if
res@cnFillColors = colors_work(:,:)

 效果图如下:


【物理概念类】

波作用通量(Wave Activity Flux):

 常用的是Takaya & Nakamura在2001年提出的版本,无需时间平均,公式如下:

 在做合成分析的时候,高度场可以采用合成好的异常场,但是U和V要注意还是使用平均背景场的,是的看走眼用了异常风的就是上周的我!

 顺便推荐一个北海道大学zemi的讲义,总结了各代波作用通量的定义,不过内容是日文,地址点我

垂直水汽积分散度 (VIMFC)

 说到这个又是一个虚惊一场的故事。某日算完该量画完图,突然觉得水汽辐合的位置不对(负的水汽散度代表辐合),检查程序发现计算时竟然乘以了一个-1,一下子头皮发麻…不会是算错了吧!赶紧检查公式:

 正的VIMFC对应着净的降水,即大气失去水分,但是从计算过程看来,这个-1一乘到底还是把辐合辐散给对调了,毕竟垂直积分uq和vq的时候可没有乘以-1.具体情况之后再研究,附上一个示例脚本链接

不管怎么说,我这一周算是放假啦!

Hexo和VS Code笔记

距离上一篇笔记刚过去了一个星期,果然只有折腾新电脑的时候新奇玩意最多…在LOF记笔记也算是我为数不多的好习惯之一了,没错我就是那种每次装一个东西都会踩同样的坑的人【。

之前折腾很久的hexo,前两天给自己搞起来了,之前不懂电脑的时候真的花了好大劲(((。但是因为暂时还没有搞懂markdown写博客是怎么整,所以笔记暂时继续还是在LOF上写,后面搞清楚了可能就会转到博客上去。写个电脑学习笔记还要被ban我真是服了tmd气了!

另外就是终于吃了朋友的安利用上了VS Code,真是太太太太太tmd好用了令人怀疑它下一步就能自动生成代码替我工作了!火速又按头男票吃了VS安利,一会会记一下个人在使用过程中装的几个小插件,毕竟回北京之后还得给台式机再装一遍….

开始正题!


【关于hexo】

搭建hexo博客的时候参考了当时保存的笔记,但是现在回头看发现当时的教程有些死板,讲解也不很清楚,所以重新找了几个,比较清楚的是这个:

需要建站的话基本跟着第一个链接做就可以了。
另外之后域名解析的时候可能还会用到:

所有教程的步骤基本都是【安装Git和Node.js -> npm安装hexo -> 初始化部署本地页面 -> 部署到github】,初学的时候只知道跟着做了,回头看的话觉得有些步骤也不必特别死板

  • 首先git在建站过程中主要是在最后一步派上作用,即部署到github,只想要本地运行的话根本不需要安装git。我是在确定本地界面能够运行的时候才下了git对hexo文件夹做了初始化,也没有任何差别。

  • 要说我为什么拖着不装git,其实就是我嫌弃大家都用的git bash太丑了…全程操作我都是在cmd下做的。另外我真的很容易忘掉git安完之后需要初始化,也就是

    1
    2
    git config --global user.name "yourname"
    git config --global user.email "your@mail.com"
  • 以及,cmd基本命令里切换文件夹是直接输入e:这样,但是切换到文件夹还是用cd命令,显示当前文件夹内容是用dir而不是ls。我太南了!

  • Node.js还是要先装的,不然hexo无法在浏览器端运行,而且不装Node.js也没法通过npm命令下载hexo。这个玩意到底是干啥的我也没搞明白,目前体感它就是负责在浏览器端运行网站脚本的框架。

  • 更新网页三部曲hexo c && hexo g && hexo d(本地运行则最后的d改成s)

  • 更换主题:去github直接把主题项目打个zip下载下来,当然也可以用git从项目链接拉取不过我嫌慢(。)在themes文件夹下解压,文件夹名称是主题的名称。然后在_config.yml下把theme:后面的文字改成新主题名字就行了。

  • 部署部分,有的人会教你上传SSH公钥,这样就可以不用每次都弹窗登陆GitHub。但是我觉得对于初心者来说还是点点鼠标登陆比较方便!我才不会说是因为我根本记不得自己的GitHub密码全靠chrome自动填充呢

  • github仓库名称要和用户名一致这种老生常谈也就不说了,只说两个我搞错的地方:一个是部署的时候复制的仓库http url,到.github.io就行了,我把后面的.git也复制上去了导致deploy的时候文件推送上去了但网页是404。。。另一个就是虽然私有仓库也可以部署hexo,但是你要是真的把仓库设为私有网页也会404,我到最后放弃治疗了才发现主要是因为我没有充钱。。。

到这里就是我做的所有事情了,写文章美化啥的目前还没搞懂,下次有空搞了再继续!


【关于VS Code】

没啥好说的就是两个字NB。基本上所有的插件都可以点点鼠标安装,这里只列我用着觉得好爽的插件和网页方便一键直达

第一个基本安上就能用无需设置,只要Ctrl+Shift+P输入Remote-xxx,选择config那个然后填入设置信息即可。

(还没搞懂怎么插入图片所以此处缺一张图)

启动的时候就在左边菜单的remote explorer打开就行,ssh打开方式也一样。
(还没搞懂怎么插入图片所以此处缺一张图)

NCL语法包在remote插件打开的远程环境下是需要重新安装的,不然就会显示plain text,如果打开文件发现没有高亮就可以在插件栏检查一下是不是远程端没装语法包。

另外SSH插件,我一开始用的是密码登陆,但是它请求密码实在是太太太频繁了,所以今天还是用上了ssh-keygen,我参考的是这个

简而言之就是看看【电脑自己有没有公钥-私钥对 -> 没有的话就生成一个,有的话直接继续 -> 把自己电脑的公钥上传到服务器 -> 把上传上去的内容加入到服务器的authorized_keys文件里】就万事大吉了。另附几个中文版本的

以上です!
最后再感叹一句我什么时候写论文也能这么参考文献头头是道的就好了(((。


今天参考的Markdown基本语法

iPad/iOS设置webssh APP的tunnel功能

出差在外,需要访问单位内网的服务器(172.xxx.xxx.xxx),有相应账号密码一套,同时还有一台可以从外网接入的跳板机/堡垒机(159.xxx.xxx.xxx),另有账号密码一套。

最简单的实现方法当然是ssh两次,但这样没法使用sftp功能,所以尝试设置常用的ssh APP - webssh的tunnel功能。但这个神奇的软件是一个德(?)国人个人开发的,官方的文档网站竟然404 no found,搜索引擎也是遍地搜不着这个软件的相关使用心得,只能自己琢磨着设置,好不容易最后成功了,设置如下

原理如下图:tunnel的功能是从本地登陆跳板机159,并令本地起端口654映射到目标机器172的默认端口22. 启动tunnel后,再登陆本地起的端口,该端口已经被映射到了目标机器的默认端口,因此需要输入目标机器的账号密码。

tunnel设置如下

ssh设置如下

P.S.在使用tunnel的情景下是可以直接使用sftp和scp的,但先登录跳板机再ssh到目标服务器的话,使用scp会把文件保存到跳板机的相应位置。使用tunnel的情况下,iPad可以通过App提供的sftp相关功能进行文件的上传下载,本地文件夹一般是app自己的目录下的文件夹,想要保存到文件的话需要自己去文件里把它抠出来。