分类目录归档:程序设计

程序设计

vi/vim基本用法和部分指令

vi的基本概念

  1. 命令行模式(command mode)
    控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入 插入模式 或 底行模式 。
  2. 插入模式(Insert mode)
    只有在插入模式下,才可以进行文字输入,该模式下按 ESC 键可回到命令行模式。
  3. 底行模式(last line mode)
    将文件 保存 或 退出 ,也可以设置编辑环境,如寻找字符串、列出行号……等。
  1. 进入 vi
    比如我要编辑一个名为 myfile 的文本文件,只要输入 vi myfile 即可进入这个文件的vi编辑界面。刚进入vi是处于命令行模式,这时是不能编辑文本的,需要切换到插入模式才能够输入或删除文字。
  2. 切换至插入模式编辑文件
    在命令行模式下按一下字母 i 就可以进入插入模式,这时你就可以↑↓←→移动光标到对应位置,然后输入或删除文本了。
  3. 退出 vi 和保存文件
    在命令行模式下,输入 : 键进入底行模式,例如:
    :w newname (将文件重命名为 newname 保存)
    :wq (保存并退出 vi,后面加入 ! 如 :wq! 则是强制保存退出)
    :q (不保存退出 vi,后面加入 ! 如 :q! 则是强制不保存退出)

命令行模式功能键

  1. 插入模式
    要进入插入模式有以下三种选择
    按 i 进入:插入模式后,是从光标当前位置开始输入文件
    按 a 进入:插入模式后,是从目前光标所在位置的下一个位置开始输入文字
    按 o 进入:插入模式后,是插入新的一行,从行首开始输入文字。
  2. 从插入模式切换为命令行模式
    按 ESC 键。
  3. 移动光标
    vi 可以直接用键盘上的 ↑↓←→ 来移动光标,但正规用法是使用小写英文字母 h 、 j 、 k 、 l 来控制光标左、下、上、右移一格。
    按 ctrl+b :屏幕往“后”移动一页。
    按 ctrl+f :屏幕往“前”移动一页。
    按 ctrl+u :屏幕往“后”移动半页。
    按 ctrl+d :屏幕往“前”移动半页。
    按数字 0 :移到文章的开头。
    按 G :移动到文章的最后。
    按 $:移动到光标所在行的“行尾”。
    按 ^:移动到光标所在行的“行首”
    按 w:光标跳到下个字的开头
    按 e:光标跳到下个字的字尾
    按 b:光标回到上个字的开头
    按 #l:光标移到该行的第 # 个位置,如:5l,56l。
  4. 删除文字
    x :每按一次,删除光标所在位置的“后面”一个字符。
    #x :例如,「6x」表示删除光标所在位置的“后面”6个字符。
    X :大写的X,每按一次,删除光标所在位置的“前面”一个字符。
    #X :例如,「20X」表示删除光标所在位置的“前面”20个字符。
    dd :删除光标所在行。
    #dd :从光标所在行开始删除#行
  5. 复制
    yw :将光标所在之处到字尾的字符复制到缓冲区中。
    #yw :复制#个字到缓冲区
    yy :复制光标所在行到缓冲区。
    #yy :例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
    p :将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
  6. 替换
    r :替换光标所在处的字符。
    R :替换光标所到之处的字符,直到按下 ESC 键为止。
  7. 返回上一步操作
    u :比如你在插入模式下误删了文本内容,想返回上一步,需先按 ESC 键进入命令行模式,然后按下 u 键,回到上一个操作。按多次 u 可以执行多次恢复。
  8. 恢复撤销操作
    ctrl+r :如果按 u 不小心返回过头了,那么可以按下 ctrl+r 恢复上一步撤销操作,同样可执行多次。
  9. 更改
    cw :更改光标所在处的字到字尾处
    c#w :例如,「c3w」表示更改3个字
  10. 跳至指定的行
    ctrl+g列出光标所在行的行号。
    #G:例如,「15G」,表示移动光标至文章的第15行行首。

底行模式下命令简介

  1. 列出行号
    set nu :在文件中的每一行前面列出行号。
  2. 跳到文件中的某一行
    # :# 号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了
  3. 查找字符
    /关键字 :先按 / 键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 n 向后查找。
    ?关键字:先按 ? 键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 n 向前查找。
  4. 保存文件
    w :冒号后输入字母 w 就可以将文件保存起来
  5. 退出 vi
    q :退出不保存,如果按 q 无法退出vi,可以在后面加个 ! 强制退出 vi
    wq :保存并退出,记住w在前要先保存才能退出

vi 命令列表

  1. 命令模式下的一些键的功能
    h 左移光标一个字符
    l 右移光标一个字符
    k 光标上移一行
    j 光标下移一行
    ^ 光标移动至行首
    0 数字“0”,光标移至文章的开头
    G 光标移至文章的最后
    $ 光标移动至行尾
    Ctrl+f 向前翻屏
    Ctrl+b 向后翻屏
    Ctrl+d 向前翻半屏
    Ctrl+u 向后翻半屏
    i 在光标位置前插入字符
    a 在光标所在位置的后一个字符开始增加
    o 插入新的一行,从行首开始输入
    ESC 从输入状态退至命令状态
    x 删除光标后面的字符
    #x 删除光标后的#个字符
    X (大写X),删除光标前面的字符
    #X 删除光标前面的#个字符
    dd 删除光标所在的行
    #dd 删除从光标所在行数的#行
    yw 复制光标所在位置的一个字
    #yw 复制光标所在位置的#个字
    yy 复制光标所在位置的一行
    #yy 复制从光标所在行数的#行
    p 粘贴
    u 取消操作
    cw 更改光标所在位置的一个字
    #cw 更改光标所在位置的#个字
  2. 底行模式下的一些指令
    w newname 将正在编辑的文件重命名为 newname 并保存
    wq 保存并退出 vi
    q 放弃所有修改,退出vi
    set nu 显示行号
    / 或 ? 查找,在 / 后输入要查找的内容
    n 与 / 或 ? 一起使用,如果查找的内容不是想要找的关键字,按 n 或向后(与 / 联用)或向前(与 ? 联用)继续查找,直到找到为止。

WordPress站点搬迁至AWS Lightsail


2024年底搬到AWS,一直运行良好。但不知缘故,今年5月的时候,站点崩溃了。只能回滚到去年年底了。所以还是要备份啊!


发现AWS的lightsail不错,1 GB RAM,2 个 vCPU,40 GB SSD的比较适合,速度也可以。
采用AWS提供bitnami的Wordpress预装,自带Let’s Encrypt,简单方便。
其中需要注意的是,在配置域和子域时别忘了添加上顶点域 (example.com) 及其www子域 (www.example.com) ,否则带www时无法验证证书。
搬迁使用All-in-One WP Migration插件。

不过需要改一下上传文件的限制,具体如下。
1.找到bitnami包中的php.ini文件并修改

sudo vi /opt/bitnami/php/etc/php.ini

按i找到以下内容,按要上传的大小修改:
value max_input_time 300
value max_execution_time 300
value memory_limit 512M
value post_max_size 512M
value upload_max_filesize 512M
按Esc后:wq!保存退出

2.测试配置文件是否书写正确配置

sudo apachectl configtest

显示Syntax OK

3.重启服务

sudo /opt/bitnami/ctlscript.sh restart

然后用All-in-One WP Migration上传备份的数据文件就搬迁完成了。

在Oracle Cloud免费云上部署LAMP系统

写在前面的话
申请到了甲骨文云的免费4核24G的服务器,如果没什么问题的话,等阿里云到期后打算搬过去作为长期据点。
P.S. 经济形势算是彻底呜呼哀哉了,长期时间、大比例降杠杆已成必然,要做好开源节流。

~~~更新后续~~~
!!!一周后发现甲骨文云未经通知回收了我的实例。经此一役,对Oracle Cloud失去信任,不建议使用甲骨文云服务。


Install WordPress with LAMP on Oracle Linux (OCI)

准备工作
-注册Oracle Cloud免费云
-创建实例
-配置网关放行80和443端口


实例磁盘配置及挂载

#查看实例是否有数据盘
sudo fdisk -l
#查看数据盘是否分区格式化
sudo lsblk

#对数据盘分区
#如有必要,切换root操作
sudo -i

#挂载网站数据
fdisk /dev/sdb
n
p
1
wq

#对数据盘格式化
mkfs.ext4 /dev/sdb1

#查看挂载情况
df -ahT

#建立挂载目录
mkdir /var/www/html

#添加启动挂载
sudo sh -c echo '/dev/sdb1 /var/www/html ext4 defaults 0 0'>>/etc/fstab

#挂载分区
mount -a

#更新
sudo yum -y update

安装Apache

#查看系统版本
cat /etc/redhat-release

#查看当前防火墙的状态
sudo systemctl status firewalld
#临时关闭防火墙(如有必要)
#sudo systemctl stop firewalld
#查看SELinux的当前状态
#getenforce
#临时关闭SELinux(如有必要)
#sudo setenforce 0

#安装Apache服务
sudo yum install httpd
#查看Apache的版本号
httpd -v
#启动Apache服务并设置服务开机自启动
sudo systemctl start httpd
sudo systemctl enable httpd
sudo systemctl status httpd

在iptables中放行http和https端口
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

#如果使用SELinux,它默认会阻止HTTP服务器进行网络连接,设置apache可以连接网络。
sudo setsebool -P httpd_can_network_connect true

#配置Apache
/etc/httpd/conf/httpd.conf
#配置方法请参见鸟哥的Linux私房菜

#添加启动挂载
sudo sh -c echo '/dev/sdb1 /var/www/html ext4 defaults 0 0'>>/etc/fstab
#挂载分区
mount -a
systemctl daemon-reload

调整apache网站目录的权限

#查看apache的用户组和用户名
ps -ef | grep apache
#修改权限
sudo chown -R apache:apache /var/www/html
cd /var/www
sudo find . -type d -exec sudo chmod 0755 {} \;
sudo find . -type f -exec sudo chmod 0644 {} \;
#设置网站目录权限为755,只有root用户对目录拥有读写执行的权限,用户组有读执行权限,其它用户有读执行权限。
#设置网站文件权限为644,只有root用户对网站文件有更改的权限,http服务器只有读取文件的权限,其它用户有读执行权限。

#改变SELinux文件属性即修改文件的安全上下文
sudo chcon -t httpd_sys_content_t /var/www/html -R
sudo chcon -t httpd_sys_rw_content_t /var/www/html -R

安装mysql

#到Mysql的yum仓库查看相应的版本信息https://dev.mysql.com/downloads/repo/yum/

#下载对应的RPM package
oracle linux 8:
sudo wget https://repo.mysql.com//mysql80-community-release-el8-9.noarch.rpm
oracle linux 9:
sudo wget https://repo.mysql.com//mysql80-community-release-el9-5.noarch.rpm

#安装RPM package
oracle linux 8:
sudo yum -y install mysql80-community-release-el8-9.noarch.rpm
oracle linux 9:
sudo yum -y install mysql80-community-release-el9-5.noarch.rpm

#添加Mysql Yum仓到系统的仓库列表
yum repolist enabled | grep mysql.*-community

#(仅)Oracle Linux 8包含一个默认启用的MySQL模块,除非该模块被禁用,否则它会屏蔽MySQL存储库提供的包。
#yum module disable mysql

#安装mysql
sudo yum install mysql-community-server
sudo systemctl start mysqld
sudo systemctl enable mysqld
sudo systemctl status mysqld

#获取MySQL的初始密码
sudo grep "password" /var/log/mysqld.log

#配置MySQL的安全性
sudo mysql_secure_installation
#>重置root账号的密码。(需输入上一步的初始密码)
#>输入Y删除匿名用户账号。
#>输入Y禁止root账号远程登录。
#>输入Y删除test库以及对test库的访问权限。
#>输入Y重新加载授权表。

#重启服务mysql
sudo systemctl restart mysqld

安装PHP

sudo yum install php
sudo yum install -y php-mysqlnd php-zip php-gd php-intl
sudo yum install php-imagick
sudo systemctl restart httpd

#查看php版本及php.ini配置文件的位置
php -v
php --ini

#编辑PHP配置文件php.ini
vim /etc/php.ini
#改变文件上传限值(分别是最大执行时间、最大内存限制、最大POST数据量、最大文件上传大小)
max_execution_time = 300
memory_limit = 512M
post_max_size = 128M
upload_max_filesize = 128M

#重启php
sudo systemctl restart php-fpm

#在Apache网站根目录创建测试文件
sudo sh -c 'echo "<!--?php phpinfo(); ?-->" > /var/www/html/phpinfo.php'

#输入http://实例公网IP/phpinfo.php
#安全起见,测试后删除phpinfo.php。

配置数据库

sudo mysql -u root -p
例如:
#创建一个名叫wordpress_db的数据库;
#创建一个名为wordpress_user的用户,密码为password,连接到wordpress_db数据库;
#刷新权限;
#退出数据库
> CREATE DATABASE wordpress_db;
> CREATE USER wordpress_user@'localhost' IDENTIFIED BY 'password';
> GRANT ALL PRIVILEGES ON wordpress_user.* TO 'wordpress_user'@'localhost';
> FLUSH PRIVILEGES;
> EXIT

#若用phpmyadmin,需改一下密码方式。
sudo mysql -u root -p
alter user 'wordpress_user'@'localhost' identified with mysql_native_password by 'password';

#重启服务mysql
sudo systemctl restart mysqld

安装phpMyadmin

#用于管理Mysql,导入导出修改替换等操作。
#创建phpMyAdmin数据存放目录
sudo mkdir -p /var/www/html/phpmyadmin

#返回系统主目录并下载phpMyAdmin压缩包
#查看版本https://www.phpmyadmin.net/downloads
cd
sudo wget --no-check-certificate https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.zip

#安装unzip工具并解压phpMyAdmin压缩包
sudo yum install -y unzip
sudo unzip phpMyAdmin-5.2.1-all-languages

#复制phpMyAdmin文件到准备好的数据存放目录
sudo mv phpMyAdmin-5.2.1-all-languages/* /var/www/html/phpmyadmin

#http://实例公网 IP/phpmyadmin,访问phpMyAdmin登录页面

Let’s Encrypt – Free Certificates on Oracle Linux

SSL相关配置
前置条件已解析域名至服务器

#查看/etc/httpd/modules下是否有mod_ssl.so模块,若无则安装
sudo yum install mod_ssl

#查看在 /etc/httpd/conf.modules.d 目录下的 00-ssl.conf 配置文件找到
LoadModule ssl_module modules/mod_ssl.so

#用于加载 SSL 模块的配置语句,若已注释,请去掉首行的注释符号。

#在/etc/httpd/conf.modules.d中新建一个 00-rewrite.conf。在新建文件中添加以下内容
LoadModule rewrite_module modules/mod_rewrite.so

#在 httpd.conf 配置文件中添加如下内容:
Directory "/var/www/html"
##自动http重定向至https
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
/Directory

安装Let’s Encrypt并设置certbot自动更新
#可参考cetbot.eff.org

#安装official EPEL release
sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

#安装snap
sudo dnf install -y snapd
sudo systemctl enable --now snapd.socket
sudo systemctl start snapd
sudo ln -s /var/lib/snapd/snap /snap

#安装并更新core
sudo snap install core
sudo snap refresh core

#安装certbot
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

#生成新证书
#For Apache:
/usr/bin/certbot certonly --webroot -w /var/www/html --email example@example.com -d example.com -d www.example.com

#配置apache,若只有一个网站也可以直接配置/etc/httpd/httpd.conf和/etc/httpd/conf.d/ssl.conf
ServerName example.com
Serveralias www.example.com
DocumentRoot /var/www/html
ErrorLog /var/log/httpd/example.com-error_log
CustomLog /var/log/httpd/example.com-access_log combined

SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
SSLCACertificateFile /etc/letsencrypt/live/example.com/chain.pem

#设置自动更新证书
sudo certbot renew --dry-run

查找并替换WordPress的Mysql数据库中的域名

无论是更换域名,还是从 http:// 更改为 https ://,我们都可以使用 MySQL 的 replace功能,来替换数据库中的 字段。
如果要将 WordPress 网站迁移到不同的域名,使用PHPMYADMIN进入数据库管理。点击SQL,执行SQL语句:
UPDATE‘表名’SET‘字段’=REPLACE(’字段’,’待替换内容’,’替换值’);

例如,从域名old_domain.com迁移到域名new_domain.com。或者将数据库中所有http://old_domain.com替换为https://old_domain.com,可以执行下面的 SQL 语句:

wp_options 表
wp_options 表是 WordPress 配置表,在home和siteurl字段中,可以配置网站的 URL 。

UPDATE wp_options SET option_value = replace(option_value, 'old_domain.com', 'new_domain.com') WHERE option_name = 'home' OR option_name = 'siteurl';

wp_posts 表
wp_posts表的post_content字段中的包含所有文章内容。如果文章中有指向其他文章的内部永久链接,需要替换该表中的链接 URL。

UPDATE wp_posts SET post_content = replace(post_content, 'old_domain.com', 'new_domain.com');

wp_postmeta 表
wp_postmeta表包含所有的属性和自定义字段,例如 ACF (高级自定义字段)中的meta_value字段。如果自定义字段中包含旧的链接,也需要在此处替换它们。

UPDATE wp_postmeta SET meta_value = replace(meta_value, 'old_domain.com', 'new_domain.com');

wp_comments 表
wp_comments表包含所有的文章评论内容,其中也可能包含指向其他文章的旧链接。

UPDATE wp_comments SET comment_content = replace(comment_content , 'old_domain.com', 'new_domain.com');

CUDA、cudatoolkit和cuDNN的关系

什么是CUDA、cudatoolkit和cuDNN

CUDA: Compute Unified Device Architecture. 是NVIDIA用于GPU的并行计算平台和编程模型。Nvidia官方提供的CUDA 库是一个完整的工具安装包,其中提供了 Nvidia驱动程序、开发 CUDA 程序相关的开发工具包等可供安装的选项。

Anaconda 安装的 cudatoolkit,其主要包含应用程序在使用 CUDA 相关的功能时所依赖的动态链接库。

cuDNN: GPU-accelerated library of primitives for deep neural networks. 是NVIDIA用于DNN的GPU加速库。

CUDA 与 cudatoolkit 的区别

Nvidia 官方提供安装的 CUDA Toolkit 包含了进行 CUDA 相关程序开发的编译、调试等过程相关的所有组件。但对于 Pytorch 之类的深度学习框架而言,其在大多数需要使用 GPU 的情况中只需要使用 CUDA 的动态链接库支持程序的运行,就像常见的可执行程序一样,不需要重新进行编译过程,只需要其所依赖的动态链接库存在即可正常运行。在安装了 cudatoolkit 后,只要系统上存在与当前的 cudatoolkit 所兼容的 Nvidia 驱动,则已经编译好的 CUDA 相关的程序就可以直接运行,而不需要安装完整的 Nvidia 官方提供的 CUDA Toolkit。

Tensorflow各版本对应的cuda, cudatoolkit, cudnn

版本 Python 版本 编译器 构建工具 cuDNN CUDA
tensorflow-2.6.0 3.6-3.9 GCC 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.5.0 3.6-3.9 GCC 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.4.0 3.6-3.8 GCC 7.3.1 Bazel 3.1.0 8.0 11.0
tensorflow-2.3.0 3.5-3.8 GCC 7.3.1 Bazel 3.1.0 7.6 10.1
tensorflow-2.2.0 3.5-3.8 GCC 7.3.1 Bazel 2.0.0 7.6 10.1
tensorflow-2.1.0 2.7、3.5-3.7 GCC 7.3.1 Bazel 0.27.1 7.6 10.1
tensorflow-2.0.0 2.7、3.3-3.7 GCC 7.3.1 Bazel 0.26.1 7.4 10.0
tensorflow_gpu-1.15.0 2.7、3.3-3.7 GCC 7.3.1 Bazel 0.26.1 7.4 10.0
tensorflow_gpu-1.14.0 2.7、3.3-3.7 GCC 4.8 Bazel 0.24.1 7.4 10.0
tensorflow_gpu-1.13.1 2.7、3.3-3.7 GCC 4.8 Bazel 0.19.2 7.4 10.0

网站升级主题版本时需要修改的内容

1、修改脚注上的Powered by WordPress为备案信息
/**
*在footer.php中找到 ,并替换下面的

<a href="<?php echo esc_url( __( 'https://wordpress.org/', 'twentytwelve' ) ); ?>" class="imprint" title="<?php esc_attr_e( 'Semantic Personal Publishing Platform', 'twentytwelve' ); ?>">
<?php
/* translators: %s: WordPress */
printf( __( 'Proudly powered by %s', 'twentytwelve' ), 'WordPress' );
?>
</a>

为:*/

<?php _e("Copyright", '101kPa'); ?> &copy; 2011-<?php echo date('Y'); ?> &middot; <?php _e("All Rights Reserved", '101kPa'); ?> &middot; <?php _e("101kPa.com by", '101kPa'); ?> <a href=" https://www.101kpa.com/?page_id=2">J.Y. WANG</a><br />
<a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener">京ICP备10041129号</a><strong> | </strong><a href="http://www.beian.gov.cn" target="_blank" rel="noopener">京公网安备11010802012744号</a>

2、修改翻页插件
/**
*在functions.php中部找到下面的内容,并替换

<div class="nav-previous"><?php next_posts_link( __( '<span class="meta-nav">&larr;</span> Older posts', 'twentyten' ) ); ?></div>
<div class="nav-next"><?php previous_posts_link( __( 'Newer posts <span class="meta-nav">&rarr;</span>', 'twentyten' ) ); ?></div>

为:*/

<?php wp_pagenavi(); ?>

3、替换Gravatar头像为Cravatar头像
/**
由于Gravatar全球通用头像被墙,会影响网页速度。将替换Gravatar头像为Cravatar头像。
*在functions.php尾部添加下面的函数
*/

if ( ! function_exists( 'get_cravatar_url' ) ) {
    function get_cravatar_url( $url ) {
        $sources = array(
            'www.gravatar.com',
            '0.gravatar.com',
            '1.gravatar.com',
            '2.gravatar.com',
            'secure.gravatar.com',
            'cn.gravatar.com'
        );
        return str_replace( $sources, 'cravatar.cn', $url );
    }
    add_filter( 'um_user_avatar_url_filter', 'get_cravatar_url', 1 );
    add_filter( 'bp_gravatar_url', 'get_cravatar_url', 1 );
    add_filter( 'get_avatar_url', 'get_cravatar_url', 1 );
}

4、不显示博客页和单内容页的特色图像
/**
*如果在帖子中设置了特色图片,WordPress主题会在单内容页的顶部和博客页(文章页)显示一个大的特色图片。
*为不显示博客页和单内容页的特色图像,需要将content.php文件中第20行-24行注释掉,如下:
*/

<?php
# if ( ! post_password_required() && ! is_attachment() ) :
# the_post_thumbnail();
# endif;
?>