使用rufus制作启动盘

准备:

  1. u盘
  2. 系统镜像
  3. rufus

首先在电脑上下载rufus

rufus直接下载地址https://github.com/pbatard/rufus/releases/download/v3.21/rufus-3.21p.exe

之后下载系统镜像

可以利用网站i tell you下载系统镜像,也可以通过下方连接下载

itellyou:

  1. https://next.itellyou.cn/ 推荐使用
  2. https://msdn.itellyou.cn/

win11

win10

win7

之后将u盘插入电脑启动rufus

rufus教程

rufus教程

创建启动盘后重启电脑进入bios

将u盘选择到首选项后重启电脑就会进入安装界面进行安装即可

jupyter添加anaconda的python环境

首先安装环境

1
conda create -n foo python=3.8

之后在虚拟环境中安装ipykernel

1
conda install -n foo ipykernel

然后安装到jupyter中

1
2
python -m ipykernel install --user --name foo --display-name "conda_foo"
Installed kernelspec foo in C:\Users\Administrator\AppData\Roaming\jupyter\kernels\foo

之后启动jupyter就可以了

修改博客有感

把博客转为hexo后,发现以前发的文章有许多格式问题,于是趁着居家办公想要修复一下,但是越修复越头疼.

没想到以前写的那么小白,还能写的津津有味.

也没想到时间居然已经过去了2年了.

虽然没成为大牛,但终究不当小白了,什么都能瞎扯一段.

linux 出现Segmentation fault错误怎么办?

我是在linux上执行npm -v的时候出现了这个错误。

百度搜了一下说是内存问题,然而检查了一下进程情况,发现并没有占多少资源。

那么显而易见,不是这个原因。

那么在这之前我做了什么操作呢?

我用n下载了新版本的node,但是没有下载成功。

那么检查一下node可否使用

node -v发现也不能使用

那么显而易见,就是因为n的问题

输入n发现没有选择对应的node版本,我们选择一下node 14.15.0即可。

退出后再使用npm -v,发现可以正常使用了。

Segmentation fault

面向Ubuntu编程

本地环境弄得一团糟,懒得整理,所以借着学习Sanic的机会,在服务器上搭了一个python环境,使用的anaconda来管理不同版本不同需求的python环境.

首先就是需要一台服务器,我是用的虎年回馈在腾讯云买的,3年264还可以.
然后去anaconda官网下载bash文件执行安装.
我是参考的这个教程来做的,我把关键步骤摘出来了.
参考链接https://blog.csdn.net/zimiao552147572/article/details/105455258

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
1.官网下载Anaconda安装包
https://www.anaconda.com/distribution/#download-section
选择 64-Bit (x86) Installer (506 MB)

2.安装
bash Anaconda3-2019.10-Linux-x86_64.sh
注意:
安装过程会出现多次ENTER或YES,按要求输入,直到安装结束
直接按enter查看协议,然后一直enter下去,
看到 [yesno] 直接输入yes 然后按enter,进入下一步。

3.配置环境变量
1.打开.bashrc文件 vim ~/.bashrc 或者 vim /etc/profile
文件末尾添加一行 export PATH="/home/用户名/anaconda3/bin:$PATH"
还没装vim可以执行:sudo apt-get install vim
2.使配置马上生效 source ~/.bashrc 或者 source /etc/profile
3.修改只读文件方式:
1.方式一:使用root修改只读文件
sudo passwd root
su - root
2.方式二
VIM强制保存只读文件的方法底行命令模式执行 :w !sudo tee %
然后出现选项:确定([O]), 加载文件((L))
然后按L,再按ZZ即可

4.查看是否安装成功
输入 conda --version 查看版本信息

安装的时候需要退出root权限,我之前就是在root权限下安装的,然后安装到了root/anaconda3中,但是在默认权限下是使用不了的,然后换回root也不行,所以要在默认的权限下安装.

安装完成后会出现一个问你是否设置环境的选项

1
2
3
installation finished.
Do you wish the installer to initialize Anaconda3
by running conda init? [yesno]

请选择yes
然后再刷新一下文件source ~/.bashrc即可

之后创建环境,我创建了一个3.8的环境,虽然小版本跟我本地不一样,但是大版本一致

1
conda create --name python38 python=3.8

然后进入环境即可

1
conda activate python38

之后创建文件名为run的python文件,输入print(‘hello world!’)
保存退出,然后输入python run.py,会打印出hello world!
然后我们想不适用python就执行run.py文件,那么就需要在文件前加上

1
2
#!python位置
#!/usr/bin/env/python

这个python位置我们自然要使用conda创建的环境中的python,输入which python3会出现python的位置,把这个位置复制到#!后面即可

ps: 其实不需要那么麻烦的配置环境变量,在安装完成后source ~/anaconda3/bin/activate 启动conda,然后在环境里使用conda init 就会自动配置好anaconda环境,之后退出环境即可.https://blog.csdn.net/radiantjeral/article/details/110288050

ubuntu安装node

1
2
3
4
5
6
7
apt update
apt upgrade
apt install npm
npm install -g npm
npm install -g n
n xx.xx.xx
hash -r

首先是更新服务器的apt,然后安装npm,全局更新npm版本到最新或者指定版本npm install -g [email protected],之后全局安装n,再用n安装node,我一般都是指定版本 n xx.xx.x,然后hash -r就可以正常使用了

使用腾讯云轻量级应用服务器+calibre-web搭建在线云图书馆

之所以搞这个,其实就是想要一个可以跟着我一起走的pdf阅读器

首先在服务器上安装docker
然后拉取 johngong/calibre-web

1
docker pull johngong/calibre-web:latest

之后创建容器

1
2
3
4
5
6
7
8
9
10
11
12
13
docker create  \
--name=calibre-web \
-p 8083:8083 \
-p 8080:8080 \
-v /配置文件位置:/config \
-v /书库:/library \
-v /自动添加文件夹:/autoaddbooks \
-e UID=1000 \
-e GID=1000 \
-e CALIBRE_SERVER_USER=用户名 \
-e CALIBRE_SERVER_PASSWORD=用户密码 \
--restart unless-stopped \
johngong/calibre-web:latest

这里建议映射8083:8083,我测试别的端口不能用
启动

1
docker start calibre-web

停止

1
docker stop calibre-web

如果不想配置可以直接输入下面的指令

1
docker run -d --name calibre -p 8083:80 -v /www/xxxx/data:/data talebook/calibre-webserver

默认账号admin默认密码admin123
配置参考

参数

说明

--name=calibre-web

容器名

-p 8083:8083

calibre-web web访问端口,默认用户名: admin 默认密码: admin123

-p 8080:8080

calibre-server web访问端口

-v /配置文件位置:/config

calibre-web与calibre-server配置位置文件

-v /书库:/library

calibre-web与calibre-server书库默认位置

-v /自动添加文件夹:/autoaddbooks

calibre自动添加图书文件夹位置

-e UID=1000

uid设置,默认为1000

-e GID=1000

gid设置,默认为1000

-e ENABLE_CALIBRE_SERVER=true

(true

false)设定开启calibre-server,默认开启

-e ENABLE_CALIBRE_SERVER_OPDS=false

(true

false)开启calibre-server的OPDS功能,默认不开启,arm可能不可用

-e CALIBRE_SERVER_USER=用户名

calibre-server 用户名

-e CALIBRE_SERVER_PASSWORD=用户密码

calibre-server 用户密码

-e CALIBRE_SERVER_WEB_LANGUAGE=zh_CN

calibre-server web界面语言,默认中文,详见calibre-server其它语言

-e CALIBRE_ASCII_FILENAME=true

(true

false)设定false时calibre支持中文目录

-e CALIBRE_WEB_LANGUAGE=zh_Hans_CN

(zh_Hans_CN

en)calibre-web初始界面语言,详见calibre-web其它语言

-e TZ=Asia/Shanghai

系统时区设置,默认为Asia/Shanghai

-e CALIBREDB_OTHER_OPTION=

为自动添加脚本中calibredb命令添加其它参数,例如:duplicates命令[-d]

-e DOUBAN_SEARCH=false

(true

false)设定开启豆瓣搜索,默认不开启

可参考docker文档:https://hub.docker.com/r/johngong/calibre-web

用node跑excel时遇到了内存溢出的问题

报错信息:

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
[19372:00000188FE38D750]   482437 ms: Scavenge 13679.5 (14045.6) -> 13666.6 (14045.6) MB, 14.4 / 0.0 ms  (average mu = 0.989, current mu = 0.992) allocation failure
[19372:00000188FE38D750] 482469 ms: Scavenge 13680.9 (14045.6) -> 13668.1 (14045.9) MB, 14.0 / 0.0 ms (average mu = 0.989, current mu = 0.992) allocation failure
[19372:00000188FE38D750] 484236 ms: Scavenge (reduce) 13687.5 (14061.0) -> 13683.4 (14061.0) MB, 14.4 / 0.0 ms (average mu = 0.989, current mu = 0.992) allocation failure


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
1: 00007FF65F861DDF napi_wrap+109135
2: 00007FF65F806D06 v8::internal::OrderedHashTable<v8::internal::OrderedHashSet,1>::NumberOfElementsOffset+33350
3: 00007FF65F807AD6 node::OnFatalError+294
4: 00007FF6600D64CE v8::Isolate::ReportExternalAllocationLimitReached+94
5: 00007FF6600BB31D v8::SharedArrayBuffer::Externalize+781
6: 00007FF65FF6574C v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1516
7: 00007FF65FF502EB v8::internal::NativeContextInferrer::Infer+59339
8: 00007FF65FF3571F v8::internal::MarkingWorklists::SwitchToContextSlow+57503
9: 00007FF65FF4947B v8::internal::NativeContextInferrer::Infer+31067
10: 00007FF65FF4050D v8::internal::MarkCompactCollector::EnsureSweepingCompleted+6269
11: 00007FF65FF486CE v8::internal::NativeContextInferrer::Infer+27566
12: 00007FF65FF4C64B v8::internal::NativeContextInferrer::Infer+43819
13: 00007FF65FF55E82 v8::internal::ItemParallelJob::Task::RunInternal+18
14: 00007FF65FF55E03 v8::internal::ItemParallelJob::Run+643
15: 00007FF65FF29583 v8::internal::MarkingWorklists::SwitchToContextSlow+7939
16: 00007FF65FF409CC v8::internal::MarkCompactCollector::EnsureSweepingCompleted+7484
17: 00007FF65FF3F204 v8::internal::MarkCompactCollector::EnsureSweepingCompleted+1396
18: 00007FF65FF3CD18 v8::internal::MarkingWorklists::SwitchToContextSlow+87704
19: 00007FF65FF6B4F1 v8::internal::Heap::LeftTrimFixedArray+929
20: 00007FF65FF6D5D5 v8::internal::Heap::PageFlagsAreConsistent+789
21: 00007FF65FF627F1 v8::internal::Heap::CollectGarbage+2033
22: 00007FF65FF609F5 v8::internal::Heap::AllocateExternalBackingStore+1365
23: 00007FF65FF7AD76 v8::internal::Factory::AllocateRaw+166
24: 00007FF65FF8F49F v8::internal::FactoryBase<v8::internal::Factory>::NewRawTwoByteString+79
25: 00007FF65FE9BD70 v8::base::TimeDelta::operator!=+31136
26: 00007FF65FE9DF57 v8::base::TimeDelta::operator!=+39815
27: 00007FF65FE9BFCA v8::base::TimeDelta::operator!=+31738
28: 00007FF66004873B v8::internal::Builtins::builtin_handle+80267
29: 00007FF660048CD3 v8::internal::Builtins::builtin_handle+81699
30: 00007FF66015F0FD v8::internal::SetupIsolateDelegate::SetupHeap+464173
31: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
32: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
33: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
34: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
35: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
36: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
37: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
38: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
39: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
40: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
41: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
42: 00007FF6600F7A02 v8::internal::SetupIsolateDelegate::SetupHeap+40498
43: 00007FF6600F56BE v8::internal::SetupIsolateDelegate::SetupHeap+31470
44: 00007FF6600F52AC v8::internal::SetupIsolateDelegate::SetupHeap+30428
45: 00007FF65FFC5959 v8::internal::Execution::CallWasm+1657
46: 00007FF65FFC51BF v8::internal::Execution::Call+191
47: 00007FF6600B0797 v8::Function::Call+615
48: 00007FF65F83146E napi_unref_threadsafe_function+3278
49: 00007FF65F835517 node::Start+1159
50: 00007FF65F835911 node::Start+2177
51: 00007FF65F883D71 node::LoadEnvironment+49
52: 00007FF65F7C03E3 v8::internal::OrderedHashTable<v8::internal::OrderedHashSet,1>::NumberOfBucketsOffset+9299
53: 00007FF65F8351C7 node::Start+311
54: 00007FF65F6967CC RC4_options+339660
55: 00007FF66063B1EC v8::internal::compiler::RepresentationChanger::Uint32OverflowOperatorFor+152748
56: 00007FFD89657034 BaseThreadInitThunk+20
57: 00007FFD89F02651 RtlUserThreadStart+33

将跑的数据加进excel中,发现出现了MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory这个问题,于是百度查了好久,最后找到了一个不算方法的方法。

https://support.snyk.io/hc/en-us/articles/360002046418-JavaScript-heap-out-of-memory
在powershell中输入下面这个指令,将内存值调大一点,可以解决一点点问题,但是看我的报错会发现并没有解决,只要你调的内存不够,还是会继续报错。

1
$env:NODE_OPTIONS="--max-old-space-size=8192"

工作总结

手上的活终于忙完了,所以准备写一下工作总结,记录一下目前遇到的问题,以及相应的解决方法。

内容

首先说一下目前的工作内容吧,其实跟在学校学的关系不是很大,目前做的是内容采集,具体的就不说了。
我上手的两个论坛,一个是死的,一个是活的,死的论坛我用python随便爬爬就获取到了,然后活的论坛本来是想用python采集的,毕竟比较熟悉,但是不是很清楚该怎么更新数据—持续化采集。

后来大哥说用puppeteer+kafka+minio进行采集,三个词我一个不认识。
幸亏时间比较充足,所以简单的了解了一下就上手去做了,在公司明白的一个内容就是,不一定需要你了解原理,你只需要会用就行了,我kafka和minio直接看的文档,复制的。用起来还可以,但是让我布服务器的话,我是不行的。

问题

1.mysql存储不了xF0x9Fx98x8A

err: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xF0\x9F\x98\x8A' for column 'content' at row 1
这个其实一开始很迷,不知道为啥会出这个错,后来发现是因为表情存不进去。。。但是自己试了一下,表情是可以存进mysql的。

解决方法是打印了一下html,发现表情的位置被黑问号替代了,被�这个符号替代了。然后就存不进mysql了,疯狂尝试都没有找到结果,后来找到了这个帖子才解决。https://stackoverflow.com/questions/65175881/puppeteer-failed-to-render-emojis-when-running-in-ubuntu貌似是因为字体不支持,安装一下支持表情的字体,就可以发现能采集到表情了。

1
apt install fonts-noto-color-emoji

2.mysql断开连接,The server closed the connection

mysql断开连接
这个是真的没有想到,原因大概是因为数据库连接超时,貌似是因为数据库有一个最大连接时间,超过这个时间就会断开,然后我这边数据其实是在启动的时候开启一边数据库,然后就等着kafka生产消费了,不会再次连接数据库,真的让我很困扰。

当时觉得应该可以的一个方法就是我这边设置一个循环,一直去找数据库查询一下数据,随便整个就行了,保持活跃,当时觉得可行,但是因为我这边出现问题,就没有尝试,后来仔细想想,应该是不行的,因为我这边数据其实是一直在往数据库写的,并且调用的是连接数据库,然后执行sql。

后来找到了一个pool,数据库连接池,这个是让我觉得真的可行的方法,并且现在我就用上了,不知道会不会出错。
https://github.com/mysqljs/mysql这个可以看一下GitHub的文档,有比较详细的内容,当然如果需要中文的话,https://www.cnblogs.com/enix/p/3654894.html推荐这一篇。

3.mysql连接池卡死

这个就没有报错了,直接卡进程里,就是啥报错也没有,但是就是不往下进行了,这个真的很迷,后来突然想到了大哥跟我说的一句话,“你这个把释放放在了调用前面,可能会拿不到数据吧”这一句话让我想起来我好像只给成功执行sql语句的连接加了释放,如果出错的话,貌似不会释放连接,然后再一想,好像出现卡死的都是有报错的。所以给出现错误的也加上释放应该就可以了。

4.Linux更换node版本

虽然说是这些问题都不是node的问题(大概),但是我还是决定换一下node版本,更换成我本机上的node–14.15.0好像,更换成这个版本。
因为我依稀记得当时装node是先去下载一个Linux版本的,然后解压,之后link就行了,但是自己试了一下发现不行(这是因为我当时用n 更新了一下node,所以就不行了,方法应该大概是可行的)

然后查了好多都没整好,后来想起来我更新版本用的n,这个好像大概也可能会降级吧。
查了一下发现真的可以,n xxxxx就行了,n 版本号就会下载对应版本的node了,n怎么安装?npm install n -g,-g是为了全局能够使用(大概是这样的)

5.minio上传失败S3Error: The provided ‘x-amz-content-sha256’ header does

反正具体的报错我就不写了,这是因为minio上传的时候,图片不在当前位置,加个延时就行了,本来我是这边下载了马上就上传,但是服务器出现了种种问题没有下载成功,然后这边就上传,就会出现这个问题。

6.node传表情到MySQL

这个问题是真的折磨人啊,但是最后还是想到了,问题出现在node连接数据库的编码格式上,我们把编码格式设置成utf8mb4即可,太难了,真没想到是这样的问题,一直以为编码这个东西只需要设置数据库就行了,在写这点内容的时候,突然就想到以前用python的时候,连接数据库也是要设置编码的,太难以置信了,我真。。
https://stackoverflow.com/questions/64737590/character-encoding-issue-node-js-mysql
https://stackoverflow.com/questions/20411440/incorrect-string-value-xf0-x9f-x8e-xb6-xf0-x9f-mysql最后是靠这两篇文章让我想起来还有编码格式这个东西的,感谢!!

7.一些补充

首先就是用puppeteer的时候,记得每一个page用完都要关闭,如果想要达到最好的效果,最好是关闭launch,然后再次启动。

然后再就是node 使用moment模块转化时间的时候,记得要用大写的HH表示24小时制。这一点是真的坑啊,我还以为不加后面的a这个参数就是24加了就是12呢,太坑了,写数据的时候看怎么下午2点写的凌晨2点。
moment(values.data).format('YYYY-MM-DD HH:mm:ss')-----24小时

moment(values.data).format('YYYY-MM-DD hh:mm:ss')-----12小时


然后就简单写到这里吧,有好多错误其实都忘记了。想到再补。

node mysql模块返回insertid为0解决方法

在用nodejs向MySQL插入数据的时候,获取返回值发现insertid一直是0,然后再获取的时候会获得比最新小1的值,比如说最新插入的值为1122,获取的id就是1121。

后来发现是因为获取id的时候,没有等待query执行完成就获取id了,而我们应该等待query执行完成后再获取id,这样才能获取到当前id。

但是当时给query加上await了,为什么不会执行呢?

因为query不支持异步操作,所以要重写query函数。

创建一个Promise然后将query放在里面进行执行,就可以了。

1
2
3
4
5
6
7
8
9
10
11
async function query(query,params){
return new Promise((resolve,reject)=>{
db.query(query,params,(err,results)=>{
if(err){
reject(err.message)
} else {
resolve(results.insertId);
}
})
});
}