vimrc: vim配置文件
<src
Write your post here.
<src
Write your post here.
git init .
git clone --depth=1 https://...
--depth=1
表示只下载一部分历史
git add --all
git commit -m "sth"
git pull
git push origin master
git config --global http.proxy http://proxy.mycompany:80
git config --global core.quotepath false
git config --global core.editor "vim"
从包管理器中安装 git-lfs
,windows版本已经包含了
git lfs install
git lfs track "*.psd"
git add .gitattributes
git lfs track "*.png"
git lfs track "*.jpg"
git lfs track "*.jpeg"
git lfs track "*.gif"
git lfs track "*.mp4"
git lfs track "*.mpeg"
git lfs track "*.mkv"
.gitattributes
文件内容为
*.pdf filter=lfs diff=lfs merge=lfs -text *.jpg filter=lfs diff=lfs merge=lfs -text *.jpeg filter=lfs diff=lfs merge=lfs -text *.png filter=lfs diff=lfs merge=lfs -text *.gif filter=lfs diff=lfs merge=lfs -text *.ico filter=lfs diff=lfs merge=lfs -text *.eps filter=lfs diff=lfs merge=lfs -text *.bmp filter=lfs diff=lfs merge=lfs -text *.psb filter=lfs diff=lfs merge=lfs -text *.tiff filter=lfs diff=lfs merge=lfs -text *.wbmp filter=lfs diff=lfs merge=lfs -text *.webp filter=lfs diff=lfs merge=lfs -text
pip install git-remote-dropbox
/.config/git/git-remote-dropbox.json or ~/.git-remote-dropbox.json
~{"default":"token"}
git config --global alias.dropbox '!git-dropbox-manage'
git clone "dropbox:///path/to/repo"
git remote add origin "dropbox:///path/to/repo"
pdftk C:\Users\Sid\Desktop\doc.pdf dump_data output C:\Users\Sid\Desktop\doc_data.txt
pdftk C:\Users\Sid\Desktop\doc.pdf update_info C:\Users\Sid\Desktop\doc_data.txt output C:\Users\Sid\Desktop\updated.pdf
目录文件格式:
BookmarkBegin
BookmarkTitle: PDF Reference (Version 1.5)
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: Contents
BookmarkLevel: 2
BookmarkPageNumber: 3
其中字符应编码成 html entitle 的样子。 可以用 https://tool.oschina.net/encode , https://www.online-toolz.com/tools/unicode-html-entities-convertor.php 这里的 Native/Unicode 转换工具。
或者python
u"阿斯顿".encode('ascii', 'xmlcharrefreplace')
def utf8_to_ascii_xml(filename):
with open(filename,'r',encoding='utf-8') as fi:
lines = fi.readlines()
lines_ascii = [x.encode('ascii', 'xmlcharrefreplace') for x in lines]
with open(f"{filename}.ascii", 'wb') as fi:
fi.writelines(lines_ascii)
常用正则替换
s/\(.*\),\(.*\)/BookmarkBegin\nBookmarkTitle: \1\nBookmarkLevel: 2\nBookmarkPageNumber: \2/
# import
import pytesseract
from PIL import Image
import numpy as np
import pandas as pd
import re
# 利用 OCR 生成目录
print(pytesseract.image_to_string(Image.open('a.png')))
# 手动编辑目录,使用 orgmode 的表格
data = pd.read_csv("a.txt", sep="|")
darr = np.array(data)
darr[:,1] = [i.strip() for i in darr[:,1]]
darr[:,2] = [i.strip() for i in darr[:,2]]
darr[2:,3] = darr[2:,3]+9
data = pd.DataFrame(darr[:,1:-1])
data
# 生成目录格式并保存
block = """BookmarkBegin
BookmarkTitle: {title}
BookmarkLevel: {level}
BookmarkPageNumber: {page}
"""
txt = ""
for line in darr:
index = line[1]
title = line[2]
page = line[3]
if index == '' or index[-1] == '.':
level = 1
else:
level = 2
txt += block.format(title=f"{index} {title}", level=level, page=page)
with open("b.txt",'w') as fi:
fi.writelines(txt)
pdftk in1.pdf in2.pdf cat output out1.pdf
ddjvu -format=pdf -quality=85 -verbose a.djvu a.pdf
pdftk in.pdf burst output out_%04d.pdf
本文是 A. O. Gogolin, A. A. Nersesyan, A. M. Tsvelik 的 "Bosonization and Strongly Correlated Systems" 一书的序言,简短地回顾了强关联领域和1990年以前的玻色化方法的历史,对了解强关联领域很有帮助。
本地转发,顾名思义就是把本地主机端口通过待登录主机端口转发到远程主机端口上去。
本地转发通过参数 -L 指定,格式:-L [本地主机:]本地主机端口:远程网络主机:远程网络主机端口。加上ssh待登录主机,这里就有了三台主机。
举例:~ssh -L 0.0.0.0:50000:host2:80 user@host1~ 。这条命令将host2的80端口映射到本地的50000端口,前提是待登录主机host1上可以正常连接到host2的80端口。
畅想一下这个功能的作用:
远程转发是指把登录主机所在网络中某个端口通过本地主机端口转发到远程主机上。
远程转发通过参数 -R 指定,格式:-R [登录主机:]登录主机端口:本地网络主机:本地网络主机端口。
举例:~ssh -R 0.0.0.0:8080:host2:80 user@host1~ 。这条命令将host2的80端口映射到待登录主机host1的8080端口,前提是本地主机可以正常连接host2的80端口。
畅想一下这个功能的作用:
注意:
相对于本地转发和远程转发的单一端口转发模式而言,动态转发有点更加强劲的端口转发功能,即是无需固定指定被访问目标主机的端口号。这个端口号需要在本地通过协议指定,该协议就是简单、安全、实用的 SOCKS 协议。
动态转发通过参数 -D 指定,格式:-D [本地主机:]本地主机端口。相对于前两个来说,动态转发无需再指定远程主机及其端口。它们由通过 SOCKS协议 连接到本地主机端口的那个主机。
举例:~ssh -D 50000 user@host1~ 。这条命令创建了一个SOCKS代理,所以通过该SOCKS代理发出的数据包将经过host1转发出去。
怎么使用?
如果是普通命令行应用,使用proxychains-ng,参考命令如下:
brew install proxychains-ng
vim /usr/local/etc/proxychains.conf # 在ProxyList配置段下添加配置 "socks5 127.0.0.1 50000"
proxychains-ng wget http://host2 # 在其它命令行前添加proxychains-ng即可
如果是ssh,则用以下命令使用socks5代理:
ssh -o ProxyCommand='/usr/bin/nc -X 5 -x 127.0.0.1:5000 %h %p' user@host2
畅想一下这个功能的作用:
ssh-keygen -t rsa
根据提示设置文件名和密码
将公钥追加到目标服务器的 $HOME/.ssh/authorized_keys
文件中,该文件的权限应为 600
, .ssh
目录权限应为 700
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
cat ~/.ssh/a_rsa.pub >> ~/.ssh/authorized_keys
测试一下
ssh username@localhost
在 ~/.ssh/config
中配置别名,就不用记 ip 了。
# 指定使用 bash 登录
Host thbash
HostName 10.0.0.101
User username
RequestTTY yes
RemoteCommand bash
# 指定使用 zsh 登录
Host th
HostName 10.0.0.101
User username
RequestTTY yes
RemoteCommand zsh
# 最基本的设置
Host group1
Hostname 10.0.5.90
User username
.service
可以不写,会自动补全。unit
, unit
有多种类型包括 .service, .target
等 # 查看系统所有安装的服务项
systemctl list-unit-files --type=service
# 查看系统所有运行的服务项
systemctl list-units --type=service
# 查看系统所有开机自启动的服务项
systemctl list-unit-files --type=service | grep enabled
# 查看指定服务项状态
systemctl status <服务项名称>
# 查看服务项的依赖关系
systemctl list-dependencies <服务项名称>
# 查看系统启动耗时
systemd-analyze
# 查看各项服务启动耗时
systemd-analyze blame | grep .service
# 启动服务
systemctl start <服务项名称>
# 停止服务
systemctl stop <服务项名称>
# 重启服务
systemctl restart <服务项名称>
# 重新读取配置文件
# 如果该服务不能重启,但又必须使用新的配置,这条命令会很有用
systemctl reload <服务项名称>
# 使服务开机自启动
systemctl enable <服务项名称>
# 使服务不要开机自启动
systemctl disable <服务项名称>
# 禁用服务
# 这可以防止服务被其他服务间接启动,也无法通过 start 或 restart 命令来启动服务。
systemctl mask <服务项名称>
# 不再禁用服务
systemctl unmask <服务项名称>
# 重新读取所有服务项
# 修改、添加、删除服务项之后需要执行以下命令。
systemctl daemon-reload
服务文件都存放在 /etc/systemd/system/
中,后缀名为 .service
Type=simple
表示启动并一直运行ExecStart=/...
表示要执行的命令,路径要写全WantedBy=multi-user.target
表示当用户能登录的时候就该启动这个服务了User=name
表示运行程序时使用的用户,默认为 root
[Unit]
Description=My Startup
[Service]
Type=simple
ExecStart=/path/to/server --server
[Install]
WantedBy=multi-user.target
/etc/systemd/system/jupyterlab.service
# start jupyter lab
[Unit]
Description=jupyter lab
After=nginx.target
[Service]
Type=simple
Environment="PATH='/home/username/.local/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games'" "PYTHONPATH='/home/username/.local/bin:/usr/lib/python39.zip:/usr/lib/python3.9:/usr/lib/python3.9/lib-dynload:/home/username/.local/lib/python3.9/site-packages:/usr/local/lib/python3.9/dist-packages:/usr/lib/python3/dist-packages:/home/username/.local/lib/python3.9/site-packages/IPython/extensions:/home/username/.ipython'"
ExecStart=/home/username/.local/bin/jupyter lab --LabApp.app_dir=/home/username/.local/share/jupyter/lab --notebook-dir=/home/username/Projects --allow-root --config=/home/username/.jupyter/jupyter_lab_config.py
[Install]
WantedBy=multi-user.target
配置文件路径: /etc/systemd/system/path-to-dir.mount
。
注意:文件名必须是挂载路径名,例如要把 /dev/sdb1
挂载到 /mnt/sds
,配置文件应该叫做 mnt-sds.mount
[Unit]
Description=mount
[Mount]
What=/dev/sdb1
Where=/mnt/sds
Options=defaults
[Install]
WantedBy=local-fs.target
systemctl --user
剩下一样。$HOME/.config/systemd/user
里loginctl enable-linger username
让开机时自启动用户参考 FossLinux 的文章。
apt install samba
假定已经有一个本地用户 mylocaluser
# 创建 smb 的组
/usr/sbin/addgroup smbgroup
# 把用户加到组里
/usr/sbin/usermod -aG smbgroup mylocaluser
# 设置用户的远程密码,可以与本地登录密码不同
smbpasswd -a mylocaluser
首先一定要备份一份
cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
配置文件修改如下,没有的项目就加进去,已有的就修改一下
[global]
# 允许用户登录
security = user
[homes]
read only = no
如果要加入其它登录地址,例如 smb://ip/newport
就如下配置
[newport]
path = /path/to/files
valid users = @smbgroup
guest ok = no
writable = yes
browsable = yes
从别处软链接过来的文件夹打不开,因为没有配置软链接的权限,只要在 [global]
里加入下面的内容就行了。
参考:这个博客
[global]
wide links = yes
symlinks = yes
unix extensions = no
把一组向量正交化的常用方法就是 Gram-Schmidt 正交化过程。 这个过程基于投影 $$ \mathrm{proj}_u(v) = \frac{\langle u,v \rangle}{\langle u , u \rangle} u $$ 每一次迭代得到一个与之前所有矢量都正交的新矢量 $$ \begin{array}{lll} b_1 &=& a_1 \\ b_2 &=& a_2 - \mathrm{proj}_{b_1}(a_2) \\ b_3 &=& a_3 - \mathrm{proj}_{b_1}(a_3) - \mathrm{proj}_{b_2}(a_3) \\ b_k &=& a_k - \sum_{i=1}^{k-1}\mathrm{proj}_{b_i}(a_k) \end{array} $$
import numpy as np
def proj(u, v, do_norm=False):
if do_norm:
result = np.vdot(u,v) / np.linalg.norm(u,u) * u
else:
result = np.vdot(u,v) * u
return result.flatten()
def gram_schmidt(A):
b = A.copy()
b[:,0] = b[:,0] / np.linalg.norm(b[:,0])
for i in range(1, A.shape[1]):
b[:,i] = (b[:,i]
- np.sum(np.apply_along_axis(
lambda u: proj(u, b[:,i]),
0,
b[:,:i]),
axis=1).flatten())
b[:,i] = b[:,i] / np.linalg.norm(b[:,i])
return b
a = np.random.rand(4,4)
b = gram_schmidt(a)
from itertools import combinations
for i,j in combinations(range(4),2):
print(np.isclose(b[:,i] @ b[:,j], 0))
$$ Ax^{(k)} = x^{(k+1)} $$
只要把任何一个初始随机向量反复地被一个矩阵作用,同时除以一个足够大的数保证不超过数值精度,那么最终的收敛结果就是矩阵的最大本征矢。
这种方法可行的原因是,矩阵可以看做是一个线性变换,对任何一个向量连续地作用同一个变换的结果,总是会让这个向量趋近于变换的主向量,也就是矩阵的最大本征值对应的本征矢。
import numpy as np
def power_iteration(A, num_simulations: int, v0=None):
if v0 is None:
v = np.random.rand(A.shape[1])
else:
v = v0
for _ in range(num_simulations):
v = A @ v / np.max(v)
return v
a = np.random.rand(4,4)
e2,v2=np.linalg.eig(a)
ei2 = e2.argmax()
e2[ei2], v2[:,ei2] / np.linalg.norm(v2[:,ei2])
v1 = power_iteration(a, 1000)
(a @ v1 / v1)[0], v1/ np.linalg.norm(v1)
与幂法完全相同,只不过迭代的是矩阵的逆,显然矩阵的逆的最大本征值就是原矩阵的模最小的本征值。 $$ A^{-1}x^{(k)} = x^{(k+1)} $$ 不过由于矩阵求逆计算复杂度很大,可以把它转化成求线性方程组: $$ A x^{(k+1)} = x^{(k)} $$
def inverse_power_iteration(A, num_simulations: int, v0=None):
if v0 is None:
v = np.random.rand(A.shape[1])
else:
v = v0
for _ in range(num_simulations):
v = np.linalg.solve(A, v)
# v = np.linalg.inv(A) @ v
v = v / np.max(v)
return v
a = np.random.rand(4,4)
e2,v2=np.linalg.eig(a)
ei2 = np.abs(e2).argmin()
e2[ei2], v2[:,ei2] / np.linalg.norm(v2[:,ei2])
v1 = inverse_power_iteration(a, 1000)
1/ (np.linalg.inv(a) @ v1 / v1)[0], v1/ np.linalg.norm(v1)
Nikola 是一个 python 写的静态博客生成器。参见官网getnikola 。主要的特色是原生支持 orgmode 和 ipynb 格式作为博客,看起来很方便。
date +"%F %T UTC%:z"
tags 用逗号分隔, category 被看做一个词。
#+BEGIN_COMMENT
.. title: nikola: static site generator
.. slug: nikola-static-site-generator
.. date: 2020-12-19 15:19:12 UTC+08:00
.. tags: python, blog
.. category: tools
.. link:
.. description:
.. type: text
.. has_math: true
#+END_COMMENT
blog here.
"metadata": {
"nikola": {
"title": "Power Method for Eigenvalues",
"slug": "power-method-for-eigenvalues",
"date": "2020-12-19 15:20:52 UTC+08:00",
"tags": "Numerical Algorithm,Linear Algebra",
"category": "Algorithm",
"link": "",
"description": "",
"type": "text"
}
}