普通视图

发现新文章,点击刷新页面。
昨天以前Chancel's blog

2024北海道9天旅游攻略

作者 chancel
2024年10月15日 08:00
1. 准备

1.1. 日本签证

日本不对国内免签,签证可选途径 淘宝/飞猪 等途径,日本的旅游签证私人无法申请,要通过官方指定的旅社进行签证,官方指定旅社列表(广州):

这次选了三年多次签证,主签所需资料:

  • 赴日申请表
  • 护照原件
  • 身份证、户口本彩色复印件
  • 近半年白底 35*45mm 彩照2张
  • 最近12个月完税证明彩色复印件
  • 最近24个月的完税证明录屏

亲属的副签需要:

  • 赴日申请表
  • 护照原件
  • 身份证、户口本彩色复印件
  • 近半年白底 35*45mm 彩照2张
  • 与主签的关系证明(结婚证、出生证、关系公证等)

三年多次出签后如无意外需要在90天内访问日本一次,如有意外耽搁行程90天内无法出行则通过旅行社向领事馆报备

回国后需要销签(三年多次需要):

  • 往返机票、酒店截图
  • 登机牌拍照
  • 日本签证页
  • 入境章拍照

1.2. 物品清单参考

必需品

类型 物品内容 备注
证件 身份证、信用卡、护照
网络 随身WI-FI或特定流量卡 淘宝
交通 Suica卡或Pasmo卡 iPhone 可以使用虚拟 Suica 卡
电量 电源转换头、充电头、数据线
其他 签字笔

其他

类型 物品
必带 一次性内裤、零钱包、常用药、洗面奶、牙刷牙膏、护肤品
衣服 上衣、裤子、袜子、手套、帽子、睡衣、围巾
女性 化妆包、干发巾
电子设备 充电宝、微单、手持稳定器、无线耳机
其他 便携煮水壶(热水)、手机支架

1.3. 交通

日本的许多交通叫法与国内有区别,大致与国内对比参考如下

日本 国内
各类列车(如:JR特急/普通列车、机场快线) 国内高铁/动车
地下铁(如:南北线、东西线) 国内地铁
路面电车(如:札幌市电、9天狗山索道线) 国内公交车

在日本如果有短期内深度体验某个地区的考虑,可以购买JR PASS(Japan Rail Pass),可以在电商平台购买,可以根据行程来看看是否划算

JR Pass是一种为游客提供的经济实惠的特殊铁路通行证,允许在指定时期内(通常是3/5/7/14/21)无限次乘坐

此外,最常见的交通卡就是关西的ICOCA卡(以大阪为代表)和关东的Suica(以东京为代表),这2张卡都可以在全国范围内使用地铁、巴士以及便利店

注:ICOCA卡和Suica卡仅是发行的地区不同,在使用上可以说没有任何区别

在 2024 年后日本推行了智能支付,在 iPhone 上使用 Apple Pay 直接添加 Suica 卡,随用随充,更加方便

1.4. 入境

在 2024 年 1 月后,日本入境流程支持线上提前申报,比入境时填写效率要高很多

入境流程在下飞机后先检疫录指纹,然后去做入境审查,随后取行李,在海关处申报后入境

入境审查与海关申报现可以提前在线上申报 VJW (Visit Japan Web)

VJW需要资料护照、机票以及一个邮箱,在申请成功会后得到一个二维码,在检疫以及入境审查处可以通过扫码快速通过

1.5. Q & A

不懂英文以及日文影响大吗?

  • 不大,日本人的英文也不怎么样,购买物品处通常有中文售货员

哪些 App 或者网站是必须的?

  • Google 地图
  • Google 翻译
  • kakuku.com 用于查找购物比价的网站

什么是免税?

  • 购物点标识提示 tax free 是针对外国游客的免消费税优惠,在购物时咨询店员是否 tax free 即可
  • 商城免税通常是现场立减或前往购物中心统一退税柜台退税(出关时,游客需要把这些小票摘掉放在指定的购物篮中)

日本有哪些需要注意的?

  • 交通:日本早晚高峰的电车拥挤程度较高,旅行者可尽量避开这个时间段乘车
  • 热水:没有,习惯喝热水的朋友请注意了,在日本普通小饭店一般仅提供自取冰水
  • 烟民:公共场合禁烟,请按照图标寻找吸烟点
  • 小费:日本没有给小费的习惯
  • 砍价:日本所有商品基本全部明码标价,可以询问店员是否有其他折扣优惠
  • 靠左行走:日本人的交通和行走、乘扶梯在大部分情况下靠左;大阪电梯靠右,可注意地上的引导标识

还有哪些小技巧?

  1. 在各大交通站和景点往往都有纸质的旅游指南,而且往往有中文版,带走看一看往往会让你发现不是那么大众的特色玩法和美食
  2. 游玩东京的话,机场和游客中心的绿色东京旅游指南小册子非常有用,不仅详细介绍了东京各个区域的景点和地图,还能够凭借册子获得很多博物馆的票价优惠,这都是本地人难以享受到的游客福利,值得好好利用
  3. 推荐需要戴眼镜的朋友在日本配一副眼镜,日本产的眼镜质量好,价格透明,服务周到,比在国内配高级眼镜要实惠很多
  4. 日本二手名包和名表往往品相新,价格便宜,且保障真品,所以超值

2. 北海道攻略

北海道根据区域划分,可以根据需要自行组合游玩的地点:

区域 景点 特色
道央区域 札幌、小樽、定山溪、登别、洞爷湖 情书取景地、火山温泉、火山不冻湖、粉雪天堂
道北区域 旭川、带广、富良野、美瑛 动物园企鹅散步、欧式村落、花田、十胜川温泉、
道东区域 网走、北见、阿赛湖、钏路 湿地动物、赏雪泡温泉、小狐狸、破冰船看流冰
道南区域 函馆 百万夜景

2.1. 札幌

札幌市(さっぽろし / Sapporo shi)是位于日本北海道道央地区的都市,为北海道首府以及石狩振兴局本部所在地

交通:

  1. 北海道城市之间往返可以全靠JR,淘宝可买3/4/5/6/7日的JR Pass票
  2. JR Pass票可以在新千岁机场下来进行兑换,乘坐时向工作人员出示即可
  3. 新千岁机场前往札幌市区有3种方案
    • 班次少但速度快的JR特别快速Airport号,33分钟,4班/day
    • 班次多但速度慢的JR快速Airport号,37分钟,5班/hour
    • 不赶时间但行李多可选高速巴士,65分钟

在札幌住宿可以很方便的去往北海道各个景点,合适作为新千岁机场落地休息的第一站

3. 规划

出发时间:2023.12.21 - 2025.12.29, 共计 8 夜 9 天

规划如下:

日期 规划 备注
10.29 3年多次签证
11.12 签证到手
12.21 广州 -> 无锡 -> 大阪关西 关西停留一夜
12.22 大板关西 -> 新千岁机场 -> 札幌 附近玩玩
12.23 札幌酒店 小樽游玩天狗山,15点前上到山顶
12.24 登别酒店 地狱谷、熊牧场
12.25 登别酒店 洞爷湖畔、简仓展望台、湖景温泉酒店
12.26 大阪酒店
12.27 大阪 City Walk 元离宫二条城、金阁寺、八坂神社、知恩院、八坂之塔、四条河原町(购物)、锦市场(吃饭)
12.28 大阪City Walk 购物、逛逛景点
12.29 大阪关西 -> 无锡 -> 广州

3.1. 机票
日期 出发时间 到达时间 出发地点 到达地点 座位号 航班号 出票平台
2024-12-21 08:05 10:20 白云机场(CAN) T1 无锡机场(WUX) T2 22E, 22F 山东航空 ZH9821 www.travelgo.com
2024-12-21 13:45 17:00 无锡机场(WUX) T1 关西机场(KIX) T1 22A, 22B 山东航空 ZH0675 www.travelgo.com
2024-12-22 08:00 09:55 关西机场(KIX) T2 新千岁机场(CTS) D 21A, 21B 日本樂桃航空 MM103 www.trip.com
2024-12-26 19:00 21:25 新千岁机场(CTS) D 关西机场(KIX) T2 20A, 20B 日本樂桃航空 MM116 www.trip.com
2024-12-29 13:10 15:05 关西机场(KIX) T1 无锡机场(WUX) T1 23F, 23E 山东航空 ZH0674 www.travelgo.com
2024-12-29 19:20 21:55 无锡机场(WUX) T2 白云机场(CAN) T1 23F, 23E 山东航空 ZH9830 www.travelgo.com

3.2. 酒店
日期 名称 价格 含税以及其他费用
12.21 - 12.22 R Hotel Kansai Airport 500.08
12.22 - 12.24 Richmond Hotel Sapporo Ekimae 1502.00
12.24 - 12.26 Toya Kanko Hotel 2522.00
12.26 - 12.29 via inn abeno tennoji 2766.12
合计 / 7290

登别酒店可以参考登别官方推荐的酒店,部分带有私汤:

4. 尾声

不足之处

  • 无锡机场是军用机场,起飞降落均是要关闭遮阳板的
  • 座位要尽量选择靠前的位置才不会被机翼挡住视线
  • 大阪入关的人太多,排队要非常久
  • 北海道的交通确实非常不方便

参考资料

Too many open files in system

作者 chancel
2024年7月14日 08:00
在Linux中,"Too many open files in system" 是指程序尝试打开的文件描述符(包括文件和网络套接字)的数量超过了系统或用户设置的限制

你可以使用 lsof 命令来检查系统中当前打开的文件描述符:

Bash
lsof | wc -l

文件描述符限制的存在是为了保护系统资源和确保系统稳定性,以下是设置文件描述符限制的几个主要原因:

  1. 系统资源保护
  2. 稳定性和性能
  3. 安全性

文件描述符限制是操作系统的一种保护机制,通过限制每个进程可以打开的文件和套接字数量,确保系统资源的合理分配和使用,防止资源耗尽,提高系统的稳定性和安全性

用户级别的限制可以通过 ulimit 来查看

Bash
ulimit -n

也可以手动增加这个值

Bash
ulimit -n <新的限制值>

描述符的配置文件位于:/etc/security/limits.conf

Linux下使用Bash遍历文件夹语法解析

作者 chancel
2024年6月14日 08:00
1. 概述

经常需要使用bash批量处理文件格式,每次都要查询一些基础语法很麻烦

所以以遍历文件夹目录处理图片为例总结一些使用Bash遍历处理文件夹时常见的语法

2. 遍历

Bash遍历的方法比较简单,与大部分编程语言的for循环没有明显区别

Bash
#/bin/sh
#author: chancel.yang

for file in ./*
do
    if test -f "$file"
    then
        echo -e "$file"
    fi
done

脚本输出如下

Bash
➜ bash demo.sh  
./a.png  
./b.png  
./c.jpg  
./demo.sh

这种遍历在大部分情况下都很实用

3. 路径处理

上面的输出中会发现执行的脚本demo.sh也在其中,而且只能针对当前路径进行处理

那么试试添加自定义路径,然后将demo脚本放到其他位置

Bash
#/bin/sh  
#author: chancel.yang  

path="/mnt/SDA/TMP/test"  

for file in $path/*  
do  
if test -f "$file"
then  
    echo -e "$file"
fi  
done

输出如下

Bash
➜ bash /mnt/SDA/TMP/demo.sh  
/mnt/SDA/TMP/test/a.png  
/mnt/SDA/TMP/test/b.png  
/mnt/SDA/TMP/test/c.jpg

在实际处理中,可以将$path调整为入参,脚本如下

Bash
#/bin/sh  
#author: chancel.yang  
for file in $1/*  
do  
if test -f "$file"
then  
    echo -e "$file"
fi  
done

执行如下

Bash
➜ bash demo.sh "/mnt/SDA/TMP/test"
/mnt/SDA/TMP/test/a.png
/mnt/SDA/TMP/test/b.png
/mnt/SDA/TMP/test/c.jpg

$0是文件名是名称,如demo.sh

除了$[number]获取传递进来的参数外,还有一些常见的特殊参数值可以直接使用

参数 说明
$# 参数总个数
$$ 当前PID号

4. 提取文件名

上面添加自定义路径之后,输出 $file 也携带了路径信息,实际使用时多要用到文件名,扩展名等

下面演示如何提取文件路径、文件名(带扩展名)、文件名、扩展名

Bash
#/bin/sh  
#author: chancel.yang  

path="/mnt/SDA/TMP/test"  

for file in $path/*  
do  
if test -f "$file"
then
    echo "dirname: $(dirname $file)"
    echo "filename: $(basename $file)"  
    filename=$(basename $file)  
    echo "filename(suffix): ${filename%%.*}"
    echo "suffix: ${filename#*.}"
fi  
done

执行后输出如下

Bash
➜ bash demo.sh  
dirname: /mnt/SDA/TMP/test  
filename: a.png  
filename(suffix): a  
suffix: png  
dirname: /mnt/SDA/TMP/test  
filename: b.png  
filename(suffix): b  
suffix: png  
dirname: /mnt/SDA/TMP/test  
filename: c.jpg  
filename(suffix): c  
suffix: jpg

如果后缀有多个,如a.tar.gz,其他不常见的提取如下

Bash
filename='a.tar.gz'
# a.tar
${file%.*}
# gz
${file##*.}

5. 条件判断

5.1. test与[]

Bash提供test关键字进行条件判断,偶尔也会看到if [ string1 != string2 ]

上面俩个写法是等价的,即test[两者是等价的,都是Bash中的关键字,区别是[要求最后一个参数必须是]

由于[是一个关键字,而]是一个参数,所以必须有空格,[string1 != string2]这种没有空格的写法是错误的

由于两者是等价的,所以以下针对test进行说明,将脚本中的test condition等价替换成[ condition ]也是成立的

5.2. 判断运算符

以下是常见的条件判断示例脚本

Bash
#/bin/sh
#author: chancel.yang

a=100
b=200
c=100

echo -e "a="$a", b="$b", c="$c

if test "$a" -eq "$c"
then
    echo -e "a = c"
fi

if test "$a" -ne "$b"
then
    echo -e "a != b"
fi

if test "$b" -gt "$a"
then
    echo -e "b > a"
fi


dirname=`pwd`
filename=$dirname/demo.sh

echo -e "dirname: "$dirname", filename: "$filename

if test -d "$dirname"
then
    echo -e $dirname" is a folder"
fi
if test -f "$filename"
then
    echo -e $filename" is a file"
fi

执行输出如下

Bash
➜ bash demo.sh
a=100, b=200, c=100
a = c
a != b
b > a
dirname: /mnt/SDA/TMP, filename: /mnt/SDA/TMP/demo.sh
/mnt/SDA/TMP is a folder
/mnt/SDA/TMP/demo.sh is a folder

条件判断数值类型时,其常见运算符参数列表如下

参数 说明
-eq 相等
-ne 不相等
-gt >
-ge >=
-lt <
-le <=

判断条件文件时,其常见运算符参数列表如下

参数 说明
-e 文件存在
-r 文件存在且可读
-w 文件存在且可写
-x 文件存在且可执行
-s 文件存在且内容不为空
-d 是目录
-f 是文件

文件与数值内容的判断相对简单,接下来看看比较复杂的字符串判定

test中,判断字符串为空时,-z表示当字符串为空时返回True,-n表示字符串不为空时返回True

Bash
#/bin/sh
#author: chancel.yang

string_1=""
string_2="hello"

if test -z "$string_1"
then
    echo -e "string_1 is null"
fi

if test -n "$string_2"
then
    echo -e "string_2 is not null"
fi

执行输出如下

Bash
➜ bash demo.sh  
string_1 is null  
string_2 is not null

使用test进行判断时,推荐使用双引号括起来变量,否则因为变量内容带空格而达不到预期的执行效果

考虑到变量如路径可能是用户输入的,除了双引号来避免变量路径中带有空格外,还可以使用[[]]来避免内容拆分

5.3. 特殊的[[]]

[test判断时都会对内容进行拆分,如test="go to"会被识别成goto两个参数

[不同,[[]]均是命令,]]并不是参数

以下代码演示两者的不同

Bash
#/bin/sh
#author: chancel.yang

a="go to"

# 此处会报错
if test $a == "go to"
then
    echo -e "$a == 'go to'"
fi

# 此处添加双引号可以正确判断
if test "$a" == "go to"
then
    echo -e "$a == 'go to'"
fi

# 此处无需双引号也可以正确判断
if [[ $a == "go to" ]]
then
    echo -e "$a == 'go to'"
fi

输出如下

Bash
➜  bash demo.sh
demo.sh: line 7: test: too many arguments
go to == 'go to'
go to == 'go to'

6. 图片转换例子

到这里,写一个遍历脚本的基本语法已经齐全,下面是一个转换指定目录中所有文件为webp图片的遍历脚本,以供参考

Bash
#/bin/sh
#author: chancel.yang
#date: 2022-06-14
show_help() {
    echo "$0 [-h|-?|--help] [--who me] [--why hhh]"
    echo "-h|-?|--help    显示帮助"
    echo "--path          文件夹路径"
}

while [[ $# -gt 0 ]]; do
    case $1 in
    -h | -\? | --help)
        show_help
        exit 0
        ;;
    --in)
        in="${2}"
        shift
        ;;
    --out)
        out="${2}"
        shift
        ;;
    *)
        echo -e "Error: $0 invalid option '$1'\nTry '$0 --help' for more information.\n" >&2
        exit -1
        ;;
    esac
    shift
done

if !(test "$in")
then
    echo "Please run --help for usage"
    exit
fi
if !(test "$out")
then
    echo "Please run --help for usage"
    exit
fi

if !(test -d "$in")
then
    echo "Error: $in is not a folder"
    exit
fi

if test -f "$out"
then
    echo "Error: $out is a file"
    exit
fi

if [ ! -d "$out" ]; then
  mkdir $out
fi

for file in $in/*
do
    filename=$(basename $file)
    if test -f "$file"
    then
        /usr/bin/ffmpeg -i $file -c:v libwebp $out/${filename%%.*}.webp
        echo "$file convert to $out/$filename.webp"
    fi
done

echo -e "Convert success"

参考资料

Python3多种方案连接Informix数据库

作者 chancel
2024年6月14日 08:00
1. 背景

最近需要使用Python连接IBM的Informix数据库

系统环境

  • Cent7 OS
  • Python3.7.2
  • Informix数据库

使用DBeaver作为客户端尝试连接Informix,确认了本地连接到数据库是没有问题的,这里假定连接信息如下

  • Host: 127.0.0.1
  • Port: 50000
  • Username: chancel
  • Password: chancel
  • Database: my-test

在Python端采用多个方式进行连接,遇到了各种各样奇怪的问题,包括超时错误、数据库不存在、驱动错误等等

考虑到DBeaver是采用JDBC进行连接的,连接并没有出现问题,最后用Python+JDBC的方式来连接数据库方才成功

如果DBeaver连接没有问题,而其他库都跟我一样或多或少有问题,那么可优先考虑JayDeBeApi的连接方式

2. 方案

2.1. JayDeBeApi(推荐)

安装jaydebeapi

TEXT
pip install JayDeBeApi

jdbc驱动需要手动下载

下载后解压到指定目录,我这里存放于

  • /home/chancel/codes/python/informix/informix-jdbc-complete-4.50.4.1.jar

Python连接代码如下

Python
import jaydebeapi
conn = jaydebeapi.connect("com.informix.jdbc.IfxDriver",
                           "jdbc:informix-sqli://127.0.0.1:50000/my-test:INFORMIXSERVER=my-ids",
                           ["chancel", "chancel"],
                           "/home/chancel/codes/python/informix/informix-jdbc-complete-4.50.4.1.jar")

curs = conn.cursor()
print(curs)

连接正常,可以正常查询数据

2.2. SQLAlchemy

安装SQLAlchemy

Bash
pip3 install sqlalchemy sqlalchemy-informix

注意要安装sqlalchemy-informix,否则将出现以下错误

TEXT
Exception has occurred: NoSuchModuleError
Can't load plugin: sqlalchemy.dialects:informix

编写连接的代码

Python
from sqlalchemy import create_engine

engine = create_engine("informix:///?Server=127.0.0.1&;Port=50000&User=chancel&Password=chancel&Database=my-test")
conn = engine.connect()
print(conn)

执行后错误如下,显示数据库连接不存在,多次尝试后仍出现这个错误无法解决

TEXT
Exception has occurred: OperationalError
(ibm_db_dbi.OperationalError) ibm_db_dbi::OperationalError: [IBM][CLI Driver] SQL1024N  A database connection does not exist.  SQLSTATE=08003 SQLCODE=-1024

2.3. ifpyx

实现可参考Python仓库:OpenInformix/IfxPy - github.com

按照说明文档不但需要ODBC Diver还需要部署CSDK,部署成本较高

参考代码

Python
import IfxPy
ConStr = "SERVER=ids0;DATABASE=my-test;HOST=127.0.0.1;SERVICE=50000;UID=chancel;PWD=chancel;"informix_password)
conn = IfxPy.connect( ConStr, "", "")
print(conn)
IfxPy.close(conn)

执行后仍然出错,显示缺少so库文件,我安装的是较为高版本的IBM Clent SDK,没有这个库里对应的SO文件

检阅文档后感觉问题可能出在CSDK安装上

2.4. ibm_db

实现可参考Python仓库:ibmdb/python-ibmdb - github.com

安装ibm_db

Bash
pip3 install ibm_db

用代码验证能否连接

Python
import ibm_db
conn_str='database=my-test;hostname=127.0.0.1;port=50000;protocol=sockets;uid=chancel;pwd=chancel'
ibm_db_conn = ibm_db.connect(conn_str,'','')
print(ibm_db_conn)

执行出错,多次尝试后仍然提示数据库名不存在,原因不明

TEXT
Exception has occurred: Exception
[IBM][CLI Driver] SQL1013N  The database alias name or database name "" could not be found.  SQLSTATE=42705 SQLCODE=-1013

2.5. pydoc

实现参考Python仓库:mkleehammer/pyodbc - github.com

按照官方文档说明,我们需要借助ODBC的驱动才能使用,不同安装系统可以参考文档说明

pyodbc - Install

对于Ubuntu1804

Bash
sudo apt install python3-pip python3-dev unixodbc-dev
pip3 install --user pyodbc

对于Cent7OS

Bash
sudo yum install epel-release
sudo yum install python-pip gcc-c++ python-devel unixODBC-devel
pip install --user pyodbc

检查安装情况

Bash
odbcinst -j

# 输出如下
unixODBC 2.3.6
DRIVERS............: /etc/unixODBC/odbcinst.ini
SYSTEM DATA SOURCES: /etc/unixODBC/odbc.ini
FILE DATA SOURCES..: /etc/unixODBC/ODBCDataSources
USER DATA SOURCES..: /home/chancel/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

用代码测试连接

Python
import pyodbc
cnxn = pyodbc.connect('DRIVER={CData ODBC Driver for Informix};Server=127.0.0.1;Port=50000;Server=my_ids;User=chancel;Password=chancel;Database=my-test;')
print(cnxn)

提示"CData ODBC Driver for Informix file not found"

Ubuntu1804并未出现此情况,只在Cent7OS下出现,经验证,Cen7OS需要手动在/etc下创建odbcinst.ini与odbc.ini文件

Bash
sudo ln -s /etc/unixODBC/odbcinst.ini /etc/odbcinst.ini
sudo ln -s /etc/unixODBC/odbc.ini /etc/odbc.ini

运行不再出现异常,但很可惜,一直显示连接超时,猜测与Informix的数据库版本有关

TEXT
Exception has occurred: OperationalError
('08001', '[08001] [unixODBC]It timed out to get data. (-1) (SQLDriverConnect)')

3. 参考资料

文章内容参考了以下文章

使用Rsync结合Inotify实现双机文件热备

作者 chancel
2024年6月14日 08:00
1. 背景

现代Web应用很常见会将用户相关缓存例如头像/附件等文件存储到到本地磁盘,用于程序读取,数据库记录文件的位置即可

这种常规的做法在同步数据库应用的时候就必须保证文件缓存也要一起同步

Linux下最常见的同步工具便是Rsync工具

rsync是类unix系统下的数据镜像备份工具——remote sync。一款快速增量备份工具 Remote Sync,远程同步 支持本地复制,或者与其他SSH、rsync主机同步

搭配Inotify则可以做到实时备份文件

Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。

2. 配置

为了方便称呼,将需要备份(数据来源)的服务器称为 Master服务器,简称M服务器,对进行备份存储的服务器称为 Slave服务器,简称S服务器

2.1. Slave服务器初始化

操作系统选用与需要备份的服务器一致,选用国内最常见的 Cent7.6 OS

安装操作系统之后禁止ROOT登录与密码登录,更新国内源并更新操作系统

Bash
cd /etc/yum.repos.d/
sudo mkdir repo_bak
sudo mv * repo_bak/
sudo wget http://mirrors.aliyun.com/repo/Centos-7.repo
sudo wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
sudo yum clean all && sudo yum makecache
sudo yum update

使用 fdisk -l查看附属硬盘情况,此处用于存储的硬盘为 /dev/vdb,初始化硬盘并格式化之后挂载它

Bash
sudo fdisk /dev/vdb
sudo mkfs.ext4 /dev/vdb1
sudo mkdir /mnt/vdb
sudo mount /dev/vdb1 /mnt/vdb

将挂载写入到开机启动中 /etc/fstab

Bash
# 查看硬盘UUID
ll /dev/disk/by-uuid


# 参考我的fstab文件
[chancel@yofus-dev-0002 yum.repos.d]$ cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Wed Feb 27 06:58:16 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=4c2c090d-4228-49fc-9cbe-3920b3bf287c /                       ext4    defaults        1 1
UUID=661e9d9e-d80e-4b8a-b52e-01522e96ab2e /mnt/vdb ext4 defaults 0 0

2.1.1. Slave服务器的同步配置

首先安装 rsync

Bash
sudo yum -y install rsync

然后编辑配置文件 sudo vim /etc/rsyncd.conf,配置内容参考下面例子

TEXT
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
 uid = root
 gid = root
 use chroot = no
 max connections = 10
 strict modes = no
 # pid文件,如无法再次启动可删除
 pid file = /var/run/rsyncd.pid
 lock file = /var/run/rsyncd.lock
 log file = /var/run/rsyncd.log
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# [ftp]
#        path = /home/ftp
#        comment = ftp export area
[example]
# 本地存放的目录
path = /mnt/vdb/
comment = example rsync backup
ignore errors
read only = no
write only = no
# 多个IP地址可以使用空格隔开 例如 192.168.11.11/24
hosts allow = *
list = false
# 可自定义,确保对目录有写入权限
uid = chancel
gid = chancel
auth users = hot
# 密码文件,内容为“账户:密码”
secrets file = /etc/rsync_user.pass

添加用于备份的用户列表,新增 /etc/rsync_user.pass文件,用户列表格式为 user:password,文件内容如下

TEXT
hot:0a1e9969c6466600e1fb1180fdad7910

修改用户列表文件权限为只读 sudo chmod 400 /etc/rsync_user.pass

添加开机自启rsync,此处端口可自定义,注意与端口客户端保持一致和防火墙放行 sudo echo "/usr/bin/rsync --port=30488 --daemon" >>/etc/rc.local

Cent7需要进一步解锁rc.local权限,否则开机不会启动 sudo chmod 700 /etc/rc.local

S服务器到此配置完毕,重启之后查看rsync进程服务是否正常启动

2.2. Master服务器的同步配置

安装rsync和inotify-tools、supervisord

TEXT
yum -y install rsync inotify-tools supervisord

如果inotify-tools无法通过yum安装(已安装则跳过此步骤),也可从github下载自行编译安装,下面给出参考例子,下载地址可能失效,请自行上GITHUB找

TEXT
# 创建inotiify文件夹
sudo mkdir /opt/inotify-tools-3.14/
sudo chown chancel:chancel /opt/inotify-tools-3.14/
mkdir /tmp/inotify-tools && cd /tmp/inotify-tools
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz 
tar -zxf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
# 编译并安装
./configure --prefix=/opt/inotify-tools-3.14/
make && make install

紧接着创建 /etc/rsync_user.pass文件并修改权限,注意M服务器的rsync用户配置文件不需要用户名,只需要输入密码即可

TEXT
sudo echo "0a1e9969c6466600e1fb1180fdad7910" > /etc/rsync_user.pass
sudo chmod 600 /etc/rsync_user.pass

测试同步能否正常运行,如若不能正常运行请根据提示自行排查问题

TEXT
sudo rsync -vzrtopg --delete --progress --password-file=/etc/rsync_user.pass --port=30488 /mnt/vdb/odoo/data_dir hot@139.9.51.220::example

测试同步正常之后,创建自动同步脚本并使用Supervisor后台运行,编辑脚本 sudo vim /etc/inoitify-tools.sh

Bash
#!/bin/bash
/opt/inotify-tools-3.14/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' -e close_write,delete,create,attrib /mnt/vdb/odoo/data_dir \
| while read files
        do
        rsync -vzrtopg --delete --progress --password-file=/etc/rsync_user.pass --port=30488 /mnt/vdb/odoo/data_dir hot@139.9.51.220::example
                echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
        done

3. 测试

为了验证脚本的能力,我们这里尝试添加10w个小文件用于测试 seq 1000000 | xargs -i dd if=/dev/zero of={}.dat bs=1024 count=1

查看文件同步以及日志输出 tail -100f /tmp/rsync.log是否正常

如若正常,配置后台运行Supervisor,编辑 sudo vim /etc/supervisor.d/inoitify-tools.conf

TEXT
[program:inoitify-tools]
command=bash /etc/inoitify-tools.sh
user=chancel
stopsignal=INT
autostart=true
autorestart=true
startsecs=3
stderr_logfile=/var/log/supervisor/inoitify-tools.error.log
stdout_logfile=/var/log/supervisor/inoitify-tools.output.log

使用Docker容器取代虚拟机作为远程开发的容器

作者 chancel
2023年10月19日 08:00
一直以来,我的开发环境都是使用Visual Studio Code(以下简称VSC)远程SSH进行开发

远程开发有以下几个好处:

  1. 环境统一:无论是在公司或是在外都是保持同一份代码以及同一个系统开发环境,不用记住多个开发环境的细节
  2. 强隔离:虚拟机只有开发环境,不需混装office、通讯软件和VPN等复杂软件
  3. 低要求:对客户端要求低,只要安装VSC即可

而远程服务器的系统我通常选择是虚拟机+Debian12,再通过Gost组网就可以实现在任何网络下的随时访问

但是这套方案的不足之处:

  1. 文件与网络均被隔离:由于虚拟系统与宿主系统是完全隔离的,这就导致在部分开发场景需要反复下载上传文件(如配置文件),涉及调试web时也要更改0.0.0.0才能访问
  2. 硬件资源切割:虚拟机需要规划好性能,提前划出硬盘、CPU、网络等资源作为独立的虚拟资源,尤其涉及到显卡训练等场景非常不便捷

解决以上不足之处的方案就是采用Docker来替换虚拟化,Docker的轻量级虚拟可以很好的弥补这些缺点,与宿主机实现统一网络环境与文件系统

下面是实践一个Debian12容器作为开发容器的实践

1. Debian12容器

debian12容器实现的目标如下

  1. Host网络:采用host网络,无需映射端口方便web应用调试
  2. 持久化存储:对代码目录做持久化存储,和宿主机双向绑定,方便更改文件

为了方便迁移容器,此次采用docker-compose来构建

1.1. 镜像构建

Docker设计理念与虚拟机不同,一个容器是生命进程等于一个应用的生命进程,而不是虚拟机这种完全独立的操作系统

所以要给容器一个永久运行的应用,ssh服务就合适

构建一个Dockerfile文件如下

Docker
FROM debian:12.1

ENV TZ=Asia/Shanghai

# Software install
RUN apt-get update && \
    apt-get install -y openssh-server vim wget git zsh curl unzip gcc make openssl


# Create new user 'chancel'
RUN useradd -m chancel && \
    echo 'chancel:chancel' | chpasswd

# SSH configuration
RUN mkdir -p /run/sshd && \
    ssh-keygen -A && \
    echo 'root:root' | chpasswd && \
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config && \
    sed -i 's/#Port 22/Port 30022/' /etc/ssh/sshd_config

CMD ["/usr/sbin/sshd", "-D"]

容器说明:

  1. 安装的基础服务如ssh、git等
  2. 创建了一个用户chancelroot
  3. 更改ssh服务的端口为30022和不允许root登录

构建镜像

Bash
sudo docker build -t debian12:latest . --no-cache

1.2. 代码目录

为了方便宿主机器与容器共享代码目录,创建一个目录debian12用于存放容器的代码文件

将上面的Dockerfile放入debian12/debian12中,代码文件夹codes也放入debian12文件夹中,再创建一个docker-compose.yaml文件

最终目录结构如下

Bash
chancel@R7-4750G ~/Docker/debian12$ tree -L 2                                                                               
.
├── codes
│   ├── golang
│   ├── nodejs
│   ├── python
│   └── web
├── debian12
│   └── Dockerfile
└── docker-compose.yaml

6 directories, 2 files

到此,初始化工作基本完成,我们创建一个docker-compose.yaml文件,内容如下

YAML
version: '3'
services:
  debian12:
    build: ./debian12
    image: debian12:latest
    container_name: debian1
    restart: always
    network_mode: host
    hostname: debian12
    volumes:
      - "./codes:/codes"
      - "/etc/localtime:/etc/localtime:ro"

启动容器

Bash
sudo docker-compose up

1.3. 连接

运行成功后,在宿主机使用ssh容器连接

Bash
ssh root@127.0.0.1 -p 30022

连接后可以根据需要自行进行系统设置了

1.4. 备份

容器比起虚拟机而言,更容易被删除,所以定时做冷备也是保持开发环境稳定重要的一环

以上面的容器debian12为例,这里在做完初步的系统设置后,创建一个新的备份镜像

Bash
sudo docker commit debian12 debian12_backup_image

如果需要迁移,或者考虑冷备的话还可以将这个新的备份镜像保存为tar文件

Bash
sudo docker save -o debian12_backup_image.tar debian12_backup_image

迁移到其他具备docker环境的服务器上,使用load就可以将这个镜像重新导入

Bash
docker load -i debian12_backup_image.tar

2. 问题

Docker的镜像debian:12.1并非完整操作系统,在日常使用会出现不少小问题,以下是一些记录与修复

2.1. 光标输入错位

这是缺失中文编码的问题,输入locale可以检查

Bash
chancel@6a57fa21dec6 locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=zh_CN.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
LC_TELEPHONE=zh_CN.UTF-8
LC_MEASUREMENT=zh_CN.UTF-8
LC_IDENTIFICATION=zh_CN.UTF-8
LC_ALL=

修复需要安装locales,如下

Bash
sudo apt install -y locales

运行选择默认的语言编码

Bash
sudo dpkg-reconfigure locales

在弹出的所有语言编码中选择你需要的默认语言编码,我这里选择的是120. en_US.UTF-8 UTF-8

2024日本东京札幌旅游攻略

作者 chancel
2023年10月25日 08:00
1. 准备

1.1. 日本签证

日本不对国内免签,签证可选途径

  • 淘宝
  • 飞猪

一般所需资料

  • 在职证明原件
  • 护照原件、身份证正反面、户口本整本的彩色复印件
  • 近半年白底彩照2张(3.5*4.5cm)
  • 赴日申请表和紧急联系人表
  • 财力证明(任选其一):近12个月工资卡10万、去年或近12个月纳税2500元以上税单、10万定期存款(已存3个月以上)、近半年银行流水最终余额10万

初次可能需提供超过 3w 的余额证明以及最近半年的流水账

签证通过后有效期一般是90天,在签证信息上可以看到起始日期和结束日期,可以在这段时间内任意安排出入境旅游

1.2. 物品清单参考

必带物品清单

类型 物品内容 备注
证件 身份证、信用卡、护照
信息 酒店入住信息 复印纸质备用
网络 随身WI-FI或特定流量卡 淘宝
交通 Suica卡或Pasmo卡 可在Apple Pay中申请虚拟的Suica卡
必备 电源转换头、手机电脑数据线以及充电头
电子设备 充电宝、微单、手持稳定器、无线耳机
其他 签字笔、便携煮水壶(热水)、手机支架

日用品清单

类型 物品
必带 一次性内裤、零钱包、常用药、洗面奶、牙刷牙膏、护肤品
衣服 上衣、裤子、袜子、手套、帽子、睡衣、围巾
女性 化妆包、干发巾

1.3. 交通

日本的许多交通叫法与国内有区别,大致与国内对比参考如下

日本 国内
各类列车(如:JR特急/普通列车、机场快线) 国内高铁/动车
地下铁(如:南北线、东西线) 国内地铁
路面电车(如:札幌市电、9天狗山索道线) 国内公交车

在日本如果有短期内深度体验某个地区的考虑,可以购买JR PASS(Japan Rail Pass)JR Pass是一种为游客提供的经济实惠的特殊铁路通行证,允许在指定时期内(通常是3/5/7/14/21)无限次乘坐,可以在电商平台购买,可以根据行程来看看是否划算。

此外,最常见的交通卡就是关西的ICOCA卡(以大阪为代表)和关东的Suica(以东京为代表),这2张卡都可以在全国范围内使用地铁、巴士以及便利店,非常方便,他们之间的区别仅是发行的地区不同。在2024年后日本大力推行智能支付,现在不需要购买这两种卡的实体卡了,在iPhone上使用Apple Pay可以直接添加Suica卡,随用随充,非常方便

1.4. 入境

在2024年1越后,日本更新了入境流程,现在支持线上提前申报,相较于填写入境申请更加简便

入境流程通常为:下飞机->检疫->录指纹->入境审查->拿行李->海关申报->出机场自由活动

其中,入境审查与海关申报以往是需要填纸质资料,现在可以提前在线上申报VJW(即Visit Japan Web

VJW需要资料如下:

  1. 护照
  2. 机票
  3. 一个可供注册的邮箱

具体的申请可以参考网站或自行搜索攻略,在申请成功会后得到一个二维码,在检疫以及入境审查处可以通过扫码快速通过

1.5. Q & A

不懂英文以及日文影响大吗?

  • 不大,日本人的英文也不怎么样,而且中文提示以及中文店员非常多,无需担心

哪些 App 或者网站是必须的?

  • Google 地图
  • Google 翻译
  • kakuku.com 用于查找购物比价的网站

食物怎么样?

  • 日本常见的快餐食物包括拉面、乌冬面、荞麦面、米饭套餐(牛肉饭、咖喱饭、猪排饭、炸鸡、猪肉等主菜+米饭)、意面套餐等

什么是免税?

  • 购物点标识提示tax free是针对外国游客的免消费税优惠,在购物时咨询店员是否tax free即可,通常是现场立减或前往购物中心统一退税柜台退税(出关时,游客需要把这些小票摘掉放在指定的购物篮中)

日本有哪些需要注意的?

  • 交通:日本早晚高峰的电车拥挤程度较高,旅行者可尽量避开这个时间段乘车
  • 热水:没有,习惯喝热水的朋友请注意了,在日本普通小饭店一般仅提供自取冰水
  • 烟民:公共场合禁烟,请按照图标寻找吸烟点
  • 小费:日本没有给小费的习惯
  • 砍价:日本所有商品基本全部明码标价,可以询问店员是否有其他折扣优惠
  • 靠左行走:日本人的交通和行走、乘扶梯在大部分情况下靠左;大阪电梯靠右,可注意地上的引导标识

还有哪些小技巧?

  1. 在各大交通站和景点往往都有纸质的旅游指南,而且往往有中文版,带走看一看往往会让你发现不是那么大众的特色玩法和美食
  2. 游玩东京的话,机场和游客中心的绿色东京旅游指南小册子非常有用,不仅详细介绍了东京各个区域的景点和地图,还能够凭借册子获得很多博物馆的票价优惠,这都是本地人难以享受到的游客福利,值得好好利用
  3. 推荐需要戴眼镜的朋友在日本配一副眼镜,日本产的眼镜质量好,价格透明,服务周到,比在国内配高级眼镜要实惠很多
  4. 日本二手名包和名表往往品相新,价格便宜,且保障真品,所以超值

2. 札幌东京富士山

2.1. 札幌

此次出发首站是札幌,主要景点根据下图来规划

札幌的交通

  1. 北海道城市之间往返可以全靠JR,淘宝可买3/4/5/6/7日的JR Pass票
  2. JR Pass票可以在新千岁机场下来进行兑换,乘坐时向工作人员出示即可
  3. 新千岁机场前往札幌市区有3种方案
    • 班次少但速度快的JR特别快速Airport号,33分钟,4班/day
    • 班次多但速度慢的JR快速Airport号,37分钟,5班/hour
    • 不赶时间但行李多可选高速巴士,65分钟

2.2. 河口湖

河口湖查询未来7天的能见度,避免扑空

事实上,由于酒店都需要提前定,如不是深度游或者初次去,建议将酒店定在东京,这样如果天气好的话随时可以购票去河口湖玩,如果天气不好则可以留在东京购物

河口湖的交通

  1. 从东京出发河口湖可选JR富士急行线新宿-河口湖站共4130日元
  2. 也可以选择大巴,大巴可提前在highwayexpress bus购买

2.3. 东京

东京有名的景点非常多,可自行搜索,交通也发达,当然购物也是极大的方便

3. 行程规划

出发时间:2023.02.14 - 2023.02.25, 共计 11 夜 12 天

3.1. 日期表

计划如下

时间 安排 备注
2023.12.27 单次签证
2024.01.11 签证通过
2024.01.12 机票出票 广州 -> 札幌
2024.02.14 新千岁机场
2024.02.15 札幌 北海道神宫、狸小路商店街、大通公园、北海道大学、薄野欢乐街、札幌时计台
2024.02.16 小樽 小樽运河、八音盒馆、天狗山、朝里站、小樽堺町通、船见坂
2024.02.17 登别 登别地狱谷、登别温泉镇、伊达时代村、洞爷湖、熊牧场
2024.02.18 旭川+美瑛+富良野 旭川动物园、旭川拉面村、美瑛青池、白须瀑布、美瑛圣诞树、七星之树、富良野森林精灵露台
2024.02.19 河口湖
2024.02.20 河口湖 新仓山浅间神社、日川时计店
2024.02.21 河口湖 山口湖踩单车环游
2024.02.22 东京
2024.02.23 东京
2024.02.24 东京
2024.02.25 广州

3.2. 时刻表

基于大的行程,预订机票以及大巴票、团体票等,做成一个简易的时刻表用于旅行时参考

日期 时间 安排 网上值机 备注
02.14 07:30 - 10:00 白云机场T1 >> 浦东国际机场T1
11:25 - 15:00 浦东国际机场T1 >> 中部国际机场T1
16:55 - 18:35 中部国际机场T1 >> 新千岁机场D ❌(自动值机) 注意行李非直挂
02.19 13:10 - 14:55 新千岁机场D >> 东京羽田机场T1
17:15 (上⻋)巴⼠总(Busta)-(下⻋)河⼝湖
02.22 18:40 (上⻋)河⼝湖 - (下⻋)巴⼠总(Busta)
02.25 08:40 -- 11:05 东京羽田机场T3 >> 浦东国际机场T1
16:15 - 18:55 浦东国际机场T1 >> 白云国际机场T1

4. 复盘

4.1. 机票酒店费用参考

这次花费如下

项目 明细 支出 备注
机票 广州 >> 札幌 4,334 2乘客,价格含2次转机(上海、名古屋)
札幌 >> 东京 1,520 2乘客
东京 >> 广州 4,044 2乘客
酒店 札幌酒店 3,444 5夜双床房
河口湖酒店 1,384 3夜双床房
东京酒店 2,480 3夜双床房
合计 17,216

4.2. 不足之处

在这次旅游上前期计划没有考虑周到之处,大致如下

  • 机票
    • 机票应尽量考虑有直飞选直飞,中转的次数多一次都是相当吃力
    • 转机有行李直挂尽量在中转机场确认行李状况,因为行李装车是需要时间的,中转时间过短的行程是很容易行李延误,行李延误了你到目的地就没有行李箱了
    • 回程机票尽量请选择日本本地航司,本地航司支持Face Express,即快速值机、快速安检过海关,而国际航司经常是提前3个小时开放值机,排队值机+排队海关结束就登机了,无缘免税店
    • 行李延误了也不用怕,在机场登记行李延迟,然后给航司以及国内民航投诉电话12326去电投诉,要求赔偿
  • 生活
    • 北海道没有那么冷,衣服不需要多带,当地的衣服非常便宜,甚至比广州还要低40%的价格,2个人带2行李箱衣服过多了
    • 选酒店上,能有早餐就有早餐,日本的早餐选择偏少也偏贵
    • 如果行李过多又用不上的话,可以使用黑猫快递提前寄过去机场,这样就不用带非常多的行李到处穿梭了
  • 其他
    • 拨打国内私人电话是+86,但如果要拨打地方公共服务,则需要加区号并省却前面的0,比如给广州的移动10086电话就是+862010086,020是广州区号,省却前面的0换+86即可
    • 在出国前,提前开通手机的漫游服务(免费),漫游服务可以让你在日本也有SIM卡信号,只要不上网不接打电话都是免费的
    • 如果出国后才需要漫游服务会比较麻烦,你需要拨打SIM卡归属地的运营商服务并接入人工服务登记让专员处理,提供身份证+户主姓名就可以让专员在后台开通

5. 尾声

参考资料

羽毛球球技大涨

作者 chancel
2023年8月22日 08:00
本文是用于收集文字版的羽毛球知识分享

1. 打球

1.1. 打球基础

羽毛球击球要点如下

1.2. 经验分享

技战术分享

  • 发完球,要举拍
  • 接发球,推反手
  • 放完网,原地封
  • 网前时,短握拍
  • 遇直线,挑斜线
  • 遇斜线,挑直线
  • 多杀球,少挑球
  • 同伴放,速后退
  • 同伴封,连续杀
  • 杀中吊,吊中杀
  • 杀直线,慎斜杀
  • 接杀球,守半场
  • 多变线,冷静打
  • 多变速,少失误
  • 轮转跑,多补位

对抗技巧

  • 劈吊和滑板求速不求贴,收吊飞的慢,你吊那么慢?我在后场都能三步奔过来噢
  • 接球左脚在前,右脚前掌落地,如果对方偷后场,那就右脚前掌往前蹬,左脚往后并步,如果对方发小球,右脚往后蹬,上前随你搓勾挑
  • 反手高远球,还是靠手臂外旋挥速快,一是立臂,二看手表
  • 弓箭步可以提升网前能力,跑任何步伐,特别是弓箭步,膝盖不要超过脚尖,你的膝盖会废的
  • 打完球,拍子及时立着抬拍,及时衔接第二拍,别指向地面
  • 跳着杀球速不一定比站着杀快,这是误区,但是跳着杀落点更靠前,这是个三角函数问题
  • 单打尽量不要重杀,不容易连贯,对面一旦防守成功,攻守之势异也
  • 针对反手位打,因为不是专业选手,反手多多少少都有点问题
  • 平推比放网对付矮个子球员好使
  • 快不一定是球速快,也可以是变节奏,快的核心是"骗"

启动步意识

  • 把对面击球声想象成发令枪,在“啪”!的一瞬间,下蹲做启动步!一瞬间,早一点晚一点都不行!

1.3. 上课总结

来自个人的上课简记

2. 羽毛球选择

以下是选择羽毛球的基础知识

格令(grain),符号 gr,量度质量单位[1],旧译英厘、个、颗、喱[2]或粒[3]。

羽毛球品牌 价格 飞行 耐打 综合性价比
亚狮龙 4 号 80+ ★★★★ ★★★ 3.75
奥加林 AC5 80+ ★★★★ ★★★★ 4

待上手

  • 极亘的 4.6.7.8 号
  • 李宁的 a+90、100、300、cp-a+300
  • yy-05
  • 飞烨的 a1.1.3.5
  • 欧亚风 05

3. 来源

资料来源,本文的所有权属于来源各位资料,本人仅做合集,如有侵权请联系我删除

❌
❌