Oliver

Java开发 — 文件编码导致的中文乱码问题的通用解决方法

  1. Java读取文件时,可以使用文件流;若文件格式为csv,也可以使用opencsv等库进行读写。但是在涉及到中文时,常常出现乱码问题,这是由于文件的编码和读取时使用的文件流的编码不一致导致的。
  2. 涉及中文时,我们通常使用“UTF-8”,“gbk”等常见的编码格式进行文件的存储。正常情况下,是可以顺利存取的。但是在特殊情况如所使用的wps、excel版本问题,存取、另存、修改后保存等操作后,文件编码改变,且不为常见的“UTF-8”,“gbk”等格式,代码读取时则会出现乱码现象。
  3. 在网络上搜索并研究后,我发现了一种万全的解决方法:读取时检测文件的编码类型,使用该编码类型进行文件流的初始化,后续进行文件的读写时,编码则固定为原来格式,且可以适配所有可识别的编码,无需局限于常见的“UTF-8”,“gbk”等格式。

下面是相关样例

//此处的file为MultipartFile的对象,若为普通的file对象,则可以使用下面的getMultipartFile方法进行转换

       // 解析文件
       byte[] bytes = file.getBytes();
       String encoding = getEncoding(bytes);

     /**
     * 获取文件编码类型
     *
     * @param bytes 文件bytes数组
     * @return 编码类型
     */
    public static String getEncoding(byte[] bytes) {
        String defaultEncoding = "UTF-8";
        UniversalDetector detector = new UniversalDetector(null);
        detector.handleData(bytes, 0, bytes.length);
        detector.dataEnd();
        String encoding = detector.getDetectedCharset();
        detector.reset();
        if (encoding == null) {
            encoding = defaultEncoding;
        }
        return encoding;
    }

    public static MultipartFile getMultipartFile(File file) {
        FileItem item = new DiskFileItemFactory().createItem("file"
                , MediaType.MULTIPART_FORM_DATA_VALUE
                , true
                , file.getName());
        try (InputStream input = new FileInputStream(file);
             OutputStream os = item.getOutputStream()) {
            // 流转移
            IOUtils.copy(input, os);
        } catch (Exception e) {
            throw new IllegalArgumentException("Invalid file: " + e, e);
        }

        return new CommonsMultipartFile(item);
    }

在使用上面的方法获取到相关的文件编码后,存取文件时使用此编码进行即可,如下。

        DataInputStream in = new DataInputStream(new FileInputStream(tempFile));
        InputStreamReader inputStreamReader = new InputStreamReader(in, Charset.forName(encoding));
CSVReader csvReader = new CSVReader(inputStreamReader);

注意,这里可以不使用CSVReader,使用其他的读取方法,设定文件编码也是一样的。使用上述策略可以完全解决java开发中的文件中文乱码问题。

地理空间系列知识(一)WKT、WKB、GeoJSON简介

1.WKT、WKB、GeoJSON

WKT(Well-known text)是开放地理空间联盟OGC(Open GIS Consortium )制定的一种文本标记语言,用于表示矢量几何对象、空间参照系统及空间参照系统之间的转换。

WKB(well-known binary) 是WKT的二进制表示形式,解决了WKT表达方式冗余的问题,便于传输和在数据库中存储相同的信息。

GeoJSON 一种JSON格式的Feature信息输出格式,它便于被JavaScript等脚本语言处理,OpenLayers等地理库便是采用GeoJSON格式。此外,TopoJSON等更精简的扩展格式。

2. WKT与GeoJSON

WKT与geojson分为点、线、面、几何集合四种:

1、Point, MultiPoint

2、LineString, MultiLineString

3、Polygon, MultiPolygon

4、GeometryCollection

可以由多种Geometry组成,如:GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))

TypeWKTGeoJSON
PointPOINT (30 10){ “type”: “Point”, “coordinates”: [30, 10] }
LineStringLINESTRING (30 10, 10 30, 40 40){ “type”: “LineString”, “coordinates”: [ [30, 10], [10, 30], [40, 40] ] }
PolygonPOLYGON ((30 10, 40 40, 20 40, 10 20, 30 10)){ “type”: “Polygon”, “coordinates”: [ [[30, 10], [40, 40], [20, 40], [10, 20], [30, 10]] ] }
PolygonPOLYGON ((35 10, 45 45, 15 40, 10 20, 35 10),
(20 30, 35 35, 30 20, 20 30))
{ “type”: “Polygon”, “coordinates”: [ [[35, 10], [45, 45], [15, 40], [10, 20], [35, 10]], [[20, 30], [35, 35], [30, 20], [20, 30]] ] }
MultiPointMULTIPOINT ((10 40), (40 30), (20 20), (30 10)){ “type”: “MultiPoint”, “coordinates”: [ [10, 40], [40, 30], [20, 20], [30, 10] ] }
MultiPointMULTIPOINT (10 40, 40 30, 20 20, 30 10){ “type”: “MultiPoint”, “coordinates”: [ [10, 40], [40, 30], [20, 20], [30, 10] ] }
MultiLineStringMULTILINESTRING ((10 10, 20 20, 10 40),
(40 40, 30 30, 40 20, 30 10))
{ “type”: “MultiLineString”, “coordinates”: [ [[10, 10], [20, 20], [10, 40]], [[40, 40], [30, 30], [40, 20], [30, 10]] ] }
MultiPolygonMULTIPOLYGON (((30 20, 45 40, 10 40, 30 20)),
((15 5, 40 10, 10 20, 5 10, 15 5)))
{ “type”: “MultiPolygon”, “coordinates”: [ [ [[30, 20], [45, 40], [10, 40], [30, 20]] ], [ [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]] ] ] }
MultiPolygonMULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)),
((20 35, 10 30, 10 10, 30 5, 45 20, 20 35),
(30 20, 20 15, 20 25, 30 20)))
{ “type”: “MultiPolygon”, “coordinates”: [ [ [[40, 40], [20, 45], [45, 30], [40, 40]] ], [ [[20, 35], [10, 30], [10, 10], [30, 5], [45, 20], [20, 35]], [[30, 20], [20, 15], [20, 25], [30, 20]] ] ] }
WKT与geojson的主要区别是wkt是单独用来表示空间点线面数据的,而geojson还可以用来表示空间数据和属性数据的集合;WKB是采用二进制存储表示点线面。

nodesCatch V2.0节点筛选工具使用教程

nodesCatch是由youtube上的不良林大佬写的一款软件,可以实现快速筛选代理节点的有效性,对节点进行批量测速等功能,软件内置了clash和xray内核任君选择,十分便利。

首先是大佬的视频,放在开头:

软件下载地址:https://github.com/bulianglin/demo/blob/main/nodesCatch-V2.0.rar

大佬的说明网页:https://bulianglin.com/archives/nodescatch.html

支持测速的协议:

Shadowsocks
ShadowsocksR
Vmess
Vless(使用Xray内核)
Trojan
socks5
http(s)

使用步骤

首先我们打开软件,可以看到界面非常简洁

第一步,是寻找节点池,或者自己搭建节点池

寻找节点:打开谷歌,搜索栏中键入带参数的搜索方式:inurl:clash/proxies

就可以找到非常多的节点池,如图:

如果是自己搭建节点池,可以参考我之前的文章:

我们有了节点池的链接地址以后,复制该地址,打开软件,点击下方的订阅管理

点击订阅列表,将节点池的地址复制进去并保存

随后点击导入到节点列表即可

当然这个软件也支持其他导入方法,例如复制节点链接如ssr,ss,trojan,vmess等形式链接直接在软件界面ctrl+v粘贴,将Clash的yaml配置文件直接拖进软件等,都可以识别并导入。

导入节点后就可以进行节点筛选了

在操作栏中,首先是快速模式,打开时收到提示

这个300KB和10%可以明显发现就是上面我们自己设置的限定时间,峰值速度,下载百分比等参数

接下来是内核选择和延迟,低速节点阈值设置

这两个内核大佬给出的建议是,如果你想要更快速或者节点里有vless类型的话,那就选Xray,但是可能测出来准确率没有Clash高。没有其他情况我个人还是建议选Clash内核(clash内核不支持vless)

再下面就是重头戏,测速模块

延迟结果数设定:在延迟筛选达到自己预设的数量时才开始测速(一键测速无用节点自动删除)

可以选择只测延迟或者速度,设置好参数点击一键测速接即可。测速完成会提示是否保存配置,点是就可以,同时可以通过下方的保存配置手动保存clash配置文件。我们其实也可以选中一些节点右键,进行手动测速,即与v2rayN操作类似。

在得到保存的clash配置文件后,将配置文件拖进clash中,即可直接使用。同时我们可以选中节点,右键输出为链接等形式,供V2rayN等其他软件使用。

还有其他问题可以在下面评论,或者去大佬的github提issue。

附上大佬的Github链接和大佬的TG频道群组链接:

GITHUB:https://github.com/bulianglin

TG频道:https://t.me/s/buliang00

TG群组:https://t.me/joinchat/R2EOZPceSMFhZGZh

宝塔所建WordPress域名迁移中一些问题的解决方法

一、域名迁移

1.何为域名迁移?

即我有原域名AAA.com下的一个wp博客网站,但是这个AAA.com域名要到期了或者有自己更喜欢的域名,则需要对域名进行迁移操作。

2.迁移过程

由于宝塔网站设置的限制存在,在这里选用的是先使用宝塔自带的功能备份站点及数据库,完成后将原站点及其配套的数据库删除。重新新建一个域名为BBB.com的新网站(即使用你想更换的域名建站)。值得注意的是,在删除网站时其实不需要删除数据库,这里只是为了保证严谨。然后在www/backup/site目录下找到之前的网站备份压缩包,将其解压到新建的网站的根目录下。(详情请谷歌宝塔wordpress备份恢复)

完成上面步骤后,修改新建的站点的权限为755并勾选包含子文件夹选项。修改wp_config.php中的数据库相关信息,重启nginx即可。(固定链接伪静态、ssl证书要重新配置)

附:伪静态代码:

location /
{
	 try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

3.在迁移过程中出现了什么问题?

问题一:出现403 Forbiden nginx 错误:

解决方案:

使用ping工具查看域名解析情况,发现已经正常解析,但是仍出现一直403的情况。后来发现403是重定向至原域名下的403错误,而非新域名下的错误。初步排查和cf解析无关,与ssl证书也无关。在修改数据库表项之后应该不会再重定向过去,检查重定向也没有记录。怀疑为really simple ssl等插件导致的重定向,疑惑了很久以后通过强制设定主页网址解决。即在wp_config.php的末尾加入代码:

define('WP_HOME','https://oliverhou.com');
define('WP_SITEURL','https://oliverhou.com');

问题二:变更cloudflare解析后仍解析至原域名,但是原域名证书和解析记录已被删除,导致直接报错DNS ERROR 1016

解决方案:

原先是讲旧域名解析记录直接删除,在新域名处添加新纪录。但是不知为何需要将旧域名修改指向再删除才生效,可能是修改可以设置TTL为一分钟可以马上生效的原因。故修改旧域名指向后再删除,随后错误变为问题一

还有关于插件等问题未提及但是也仍需注意。同时在迁移时需要使用SQL语句修改域名关键信息,参考代码:

UPDATE wp_options SET option_value = replace(option_value, 'old_domain.com', 'new_domain.com') WHERE option_name = 'home' OR option_name = 'siteurl';
UPDATE wp_posts SET post_content = replace(post_content, 'old_domain.com', 'new_domain.com');
UPDATE wp_postmeta SET meta_value = replace(meta_value, 'old_domain.com', 'new_domain.com');
UPDATE wp_comments SET comment_content = replace(comment_content , 'old_domain.com', 'new_domain.com');

上述代码参考网站(网站内还有别的情况的代码):

2022年1月SCNU编译原理期末原题回忆

  1. 我们知道正则表达式是不能表示下面的情形的:一个b的前后跟着同样个数的a,运用编译原理知识,给出两种解决办法。
  2. 写出DFA最小化的算法(这个和下面的算法题真的是写实验的代码)
  3. 写出消除直接和间接坐公因子的算法
  4. 写出有加减乘除取余的后缀表达式的文法并画出LR(1)DFA图,构造其LALR(1)分析表
  5. 写出正则表达式的文法,并写出它生成四元组时相应的语义动作
  6. TINY语法题:
    (1) 使用自顶向下方法分析时,希望给TINY语言添加for循环,需要对原文法进行哪些改造?请写出改造后的文法规则
    (2) 请写出相应的生成语法树时的代码

这里也附上我的github地址,里面有四个实验,完成程度不高请见谅,并附上我同学用C#写的开源的语法分析完全体(包括LL1,LR0,SLR1,LR1,LALR1;且全部支持查看分析表)

四个实验分别是:

  • 实验一:Scanner
  • 实验二:正则表达式转NFA转DFA转最小化DFA并生成相应的词法分析程序
  • 实验三:LL(1)分析器
  • 实验四:TINY+语法树生成器(即TINY文法改造)

p.s:实验详情见我的GIthub仓库中的readme说明

我的Github地址:https://github.com/hjy2000?tab=repositories

我同学的项目地址:https://github.com/lgbgbl/Syntax-Analysis

最后告诫同学们,千万不要下载直接抄,自己看着代码实现一次才是对期末的最好保障。

2022/03/05更新:

补充一个0xFFFF上发现的2021年的考题,链接如下:

https://blog.charfole.top/2021%E5%B9%B41%E6%9C%88%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86%E8%80%83%E9%A2%98%E6%B1%87%E6%80%BB.html

Xray(VLESS+XTLS或trojan+tls)+BTpanel+wordpress使用nginx共存搭建过程的探索

1.服务器背景

这台机子已经运行了很久的wordpress,https是最近才加上的。等于有一台服务器预装了BT+wordpress,,所以只需要再安装xray即可。这篇文章的起因是以前搭建博客时没有想怎么和其他服务共用443端口,在使用一键脚本搭建xray时,发现二者直接搭建是不能实现共存的。

2.开始搭建

首先介绍一下完整过程、出现的问题和解决方法。

这里参考了波仔的做法:https://www.v2rayssr.com/xraybt.html

视频在这里

2.1 安装宝塔和相关环境

搭建宝塔的步骤这里就不展开了,具体看波仔的帖子,值得注意的有几点:

  • 不一定需要安装aapanel(宝塔国际版),普通版的宝塔也是可以做到的
  • 在cloudflare解析时不要开启小云朵,亲测搭建完开启cf加速是没有办法连接的,申请证书的时候也有影响
  • 也不一定需要1G的内存,512M内存加swap也是可以做到的
  • BBR不一定要开,自己选择(链接:https://www.v2rayssr.com/bbr.html
  • 在安装完宝塔安装LNMP时建议五个组件全装而不是像视频中波仔一样安装部分组件,建议安装插件上的系统防火墙,管理防火墙很方便

2.2 安装Xray并调试

首先我们安装Xray的官方版本

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install -u root

然后生成一个随机编码备用

cat /proc/sys/kernel/random/uuid # 粘贴到VPS运行即可生成 UUID

安装完成后,在VPS目录 /usr/local/etc/xray 找到 config,json 文件,粘贴下面的配置文件

(下面的三处域名是必须修改的)

首先这里是xray的vless+xtls模式:

{
    "log": {
        "loglevel": "warning"
    }, 
    "inbounds": [
        {
            "listen": "0.0.0.0", 
            "port": 443, 
            "protocol": "vless", 
            "settings": {
                "clients": [
                    {
                        "id": "5272bc0d-9852-4af7-b2f0-979b1faf2973",
                                                   //此处改为你的UUID
                        "level": 0, 
                        "email": "[email protected]",  
                                             //此处为邮箱地址,随便填
                        "flow":"xtls-rprx-direct"
                    }
                ], 
                "decryption": "none", 
                "fallbacks": [
                    {
                        "alpn": "h2", 
                        "dest": 8002   //此处为回落端口,若更改,请更改后面Nginx的相应配置
                    }
                ]
            }, 
            "streamSettings": {
                "network": "tcp", 
                "security": "xtls", 
                "xtlsSettings": {
                    "serverName": "qq.bozai.us",  //修改为你的域名
                    "alpn": [
                        "h2", 
                        "http/1.1"
                    ], 
                    "certificates": [
                        {
                            "certificateFile": "/www/server/panel/vhost/cert/qq.bozai.us/fullchain.pem", //修改为你的域名
                            "keyFile": "/www/server/panel/vhost/cert/qq.bozai.us/privkey.pem" //修改为你的域名
                        }
                    ]
                }
            }
        }
    ], 
    "outbounds": [
        {
            "protocol": "freedom", 
            "settings": { }
        }
    ]
}

下面是trojan的修改方法:

 {
    "log": {
        "loglevel": "warning"
    },
    "inbounds": [
 {
            "listen": "0.0.0.0",
            "port": 443,
            "protocol": "trojan",
            "settings": {
                "clients": [
                    {
                        "password":"440221",
                        "email": "[email protected]", //此处为邮箱地址,随便修改
                        "level": 0,
                        "flow": "xtls-rprx-direct"        
                    }
                ],
                "decryption": "none",
                "fallbacks": [
                    {
               
                        "dest": 2222   //此处为回落端口,若更改,请更改后面Nginx的相应配置
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls",
                "tlsSettings": {
                    "serverName": "oliverhou.com", //修改为你的域名
                    "alpn": [
                        "h2",
                        "http/1.1"
                    ],
                    "certificates": [
                        {
                            "certificateFile": "/www/server/panel/vhost/cert/oliverhou.com/fullchain.pem", //修改为你的域名 注意证书的位置 破解版宝塔把cert改成ssl
                            "keyFile": "/www/server/panel/vhost/cert/oliverhou.com/privkey.pem" //修改为你的域名 注意证书的位置 破解版宝塔把cert改成ssl
                        }
                    ]
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "settings": { }
        }
    ]
 }

最后补充一下多协议同端口回落

 {
    "log": {
        "loglevel": "warning"
    },
    "inbounds": [

 {
            "listen": "0.0.0.0",
            "port": 443,
            "protocol": "trojan",
            "settings": {
                "clients": [
                    {
                        "password":"440221",
                        "email": "[email protected]", //此处为邮箱地址,随便修改
                        "level": 0,
                        "flow": "xtls-rprx-direct"        
                    }
                ],
                "decryption": "none",
                "fallbacks": [
                    {
               
                        "dest": 2222   //此处为回落端口,若更改,请更改后面Nginx的相应配置
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls",
                "tlsSettings": {
                    "serverName": "oliverhou.com", //修改为你的域名
                    "alpn": [
                        "h2",
                        "http/1.1"
                    ],
                    "certificates": [
                        {
                            "certificateFile": "/www/server/panel/vhost/cert/oliverhou.com/fullchain.pem", //修改为你的域名 注意证书的位置 破解版宝塔把cert改成ssl
                            "keyFile": "/www/server/panel/vhost/cert/oliverhou.com/privkey.pem" //修改为你的域名 注意证书的位置 破解版宝塔把cert改成ssl
                        }
                    ]
                }
            }
        }
,//每个协议块用,号隔开
{
            "listen": "0.0.0.0",
            "port": 443,
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "3e708264-834f-4c23-a40c-cfe9ae958f11", //此处改为你的UUID
                        "level": 0,
                        "email": "[email protected]", //此处为邮箱地址,随便修改
                        "flow":"xtls-rprx-direct"
                    }
                ],
                "decryption": "none",
                "fallbacks": [
                    {
                        "alpn": "h2",
                        "dest": 2222   //此处为回落端口,若更改,请更改后面Nginx的相应配置
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "xtls",
                "xtlsSettings": {
                    "serverName": "oliverhou.com", //修改为你的域名
                    "alpn": [
                        "h2",
                        "http/1.1"
                    ],
                    "certificates": [
                        {
                            "certificateFile": "/www/server/panel/vhost/cert/oliverhou.com/fullchain.pem", //修改为你的域名 注意证书的位置 破解版宝塔把cert改成ssl
                            "keyFile": "/www/server/panel/vhost/cert/oliverhou.com/privkey.pem" //修改为你的域名 注意证书的位置 破解版宝塔把cert改成ssl
                        }
                    ]
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "settings": { }
        }
    ]
 }

其实还可以添加更多的协议,或者每个协议都可以用不同的端口,然后在网站配置中添加相应修改,这里就不再赘述

这里如果不熟悉的朋友可以直接输入指令vi /usr/local/etc/xray/config,json 使用vim修改(或者用宝塔的文件管理更方便)

完成上述步骤后,需要为我们的网站申请证书(我的已经有了就不演示了,波仔帖子这里没问题,注意,不要开启强制https,因为后面我们修改nginx会把80重定向至443就已经相当于强制https了,开启会导致重定向过多

搞定这一步就来到了网站设置界面(这里注意,波仔的帖子并不适用于所有情况,具体看下面)

在宝塔里打开网站设置界面,找到配置文件这一选项

首先在代码第一行插入如下代码(记得修改两处域名为你自己的域名)

server {
    listen       0.0.0.0:80;
    server_name  qq.bozai.us;#这里要改为自己的域名
    return 301 https://qq.bozai.us$request_uri;
}

然后修改下一个server块内的代码

注释443那一行,然后修改listen 80的那一行为listen 回落端口 http2

注意:这里的回落端口就是上面xray配置文件中对应的Dest端口

然后把原有的443那一行注释掉(搭建wordpress时没有开启https的可能没有这一行,可忽略这个提示)

最后加入一行代码,保持我们的博客访问时的格式

add_header Content-Security-Policy "upgrade-insecure-requests";

到这里就修改完了,具体参考如下图

最后我们测试一下xray

分别输入下面命令,查看 Xray 是否正常运行,若是有问题,就是配置文件出错



systemctl restart nginx
systemctl status nginx

systemctl restart xray
systemctl status xray

如图,就是ok了

接下来就是在v2rayN里配置相关的信息并导出节点连接,具体配置如图(trojan的也是类似)

(注意:clash并不支持vless,所以更推荐大家使用trojan的fallback)

最后这里说几个问题

1.首先是上面提到的,开启CDN无法连接,貌似在vless+xtls或者trojan下cdn加速(点亮小云朵)xray是没有办法工作的(具体情况不详,也可能是我记错了),所以在解析域名时要么直接不用cloudflare用自家的域名解析最好,或者不开启小云朵即可

2.第二,在开启https后访问网页可能会提示重定向过多,或者使用了ssl插件也可能会出现这种情况,这时候就需要修改配置文件了,具体操作看这个帖子

https://www.wppop.com/wordpress-https-you-cannot-visit-this-page.html

3.第二点不生效可能是证书问题,或者是特殊情况,必要时还需要使用phpadmin进数据库修改wp-option表中的字段,这也是我前面说的建议最好五个插件全都装,不是所有人都会mysql -u -p进数据库的

4.还有不明白直接看project X的文档最直截了当

https://xtls.github.io/Xray-docs-next/

5.上面的xray配置文件如果报错,尝试删除所有//后面的中文备注

6.该教学仅供参考,读者需遵守法律,热爱国家,不应将其用于非法活动

有问题可以在下面留言

We are back online!

因为一些不可抗力因素导致网站宕机,进行恢复还原使用了一定的时间。也丢失了大量图片和一些文章,But anyway,we are back.

Ubuntu21.04更新小记——Grub引导乱了!

1. 更新前的平静

原来一直使用20.04的我看到20.10果断更新,完美成功,纵享丝滑,但是在这一次21.04我同样果断更新之后,出现了一个说是问题不算严重,但是又不太舒服的Bug。更新前情况相似的话可以参考,等待一段时间再更新。

2. 具体情况

2.1 我认为的亮点

首先此次更新的亮点之一就是更换了桌面的运作方式,使得桌面的自定义和逻辑上更为先进。原先Gnome桌面是依赖X.org的原理来运行的,而本次的STS版本21.04使用了Wayland来作为桌面运作方式,总之就是更为流畅。虽然但是,这个默认桌面壁纸真嘟有点丑。

其次,使用了最新版的内核5.11,而在20.10是只能停留在5.8的版本的。而这个内核就是罪魁祸首了。

2.2 我的情况

我的Ubuntu是双系统的,电脑大概情况如下:

首先WIN10是装载在一个单独的128G的固态SSD中的,引导单独存在。而我的Ubuntu是安装在我的机械硬盘中的,安装的时候是专门有一个空的Ext4的分区来安装的,就是图中硬盘1的中间一百多G。而Ubuntu的引导就是那个名为boot的1G 的分区,可以看到是在机械硬盘的。此前引导找不到会自动进Grub2 GNU界面(ubuntu的通病),但是此前的Grub和内核都在机械硬盘,此次更新自动把我的Gtrub直接装到了WIN分区的EFI(混乱)。别问我怎么知道的,问就是进BIOS看到了。所以现在如果发生找不到内核的情况,输入Exit是没有办法进入Ubuntu的(之前可以,因为Grub和内核在同一磁盘,可以找到,而Ubuntu对于非系统所在的磁盘是所谓Media挂载的(就是文件映射),所以是不可能找到不同磁盘下的内核的),现在遇到这种情况只能强行关机,然后进入BIOS手动选引导项,十分的不舒服。

2.3 解决方法

  • 尝试在Grub界面修改手动Boot,即手动加在内核,但是ls查看,只有WIN的硬盘没有Ubuntu的,很明显不开机情况Media没有被挂载
  • 尝试手动在BIOS进入系统后修复Grub,即使用sudo apt update–grub2命令,仍然无法解决
  • 尝试手动修改conf文件,一样失败

2.4 建议

可以直接从Ubuntu20版本升级Ubuntu21.04的情况如下:

  • 单系统:Ubuntu是单系统(全盘,即没有装WIN只有linux)
  • 双系统:Ubuntu安装时没有选其他,引导和WIN在一起,两个系统也在同一物理磁盘(上面的磁盘都是指物理磁盘而非分盘)
  • 使用的是VM等虚拟机(相当于全盘)

注意:升级系统也会重置所有驱动(这里注意Linux的驱动是由内核提供的),如果内核不支持原有驱动就会刷掉,比如CUDA等,需要全部重新安装,很麻烦!!

引用图片出处:http://blog.yixao.net/tech/22681.html

斐讯N1原系统写入openwrt,开启科学上网,解锁锐捷校园网多网卡限制

1.准备工作

硬件准备:

斐讯n1一台
USB鼠标:主要用来点击打开adb模式
HDMI: 连接盒子到外接显示装置,如电视或者显示器
双公头USB: 主要用来刷机使用(一般不需要)
盒子网线: 用来连接路由器或者网线
U盘:用来写入openwrt镜像,或者其他系统镜像
笔记本电脑一台

软件准备:

首先前往下面的连接下载所有的工具和镜像

https://drive.google.com/file/d/1bStWBM1TBNTwsVEgLadwxd9KTYQ7icXh/view?usp=sharing

然后下载在你的笔记本电脑安装balenaEtcher,并将准备好的U盘写入相关镜像,资源包中有两个镜像,建议使用56+的那个

2.系统降级

警告:使用 Docker 请在更新固件前 注意备份 Docker 相关数据 及 文件夹,以免升级后丢失

将你的盒子通电,接上USB鼠标和HDMI线

然后快速点击屏幕上的版本号4次,提示开启ADB即可(关闭也是这样操作)

然后将你的盒子和你的笔记本电脑连接到同一局域网下,记下盒子右下角的IP地址

然后打开下载的工具中的文件夹,打开onekey,运行里面的run.bat

选择2,然后输入你盒子的ip地址

等待盒子重启(可能要几分钟),即完成降级

如果输入ip地址提示error:device offlline,一般是ADB没打开或者Bug了,重新进行上面的打开关闭adb操作即可

重启完就可以关闭窗口了

2.通过U盘启动openwrt

打开所下载的工具中的傻瓜包文件夹

运行U盘启动.bat

同样输入盒子的IP地址,盒子将会重启,进入跑代码界面(没截图,就是一堆代码飞飞飞)

这样就进入了U盘中的op系统

3.写入EMMC

如果想要将u盘中的系统写入盒子中,将盒子鼠标拔下,接上键盘,等待盒子代码长时间不动时,按回车,进入命令行,输入

./install.sh

即可写入,等到提示完成,即写入成功,断电后拔掉U盘,重新启动盒子,即成功写入系统

这一步非必须,不想写入的同学可以不做

如果输入命令提示XXXXX not found

则需要更换方法

将笔记本连接到名为openwrt的wifi,打开浏览器,输入192.168.123.2

输入用户名和密码,用户名和密码默认为root和password

点击系统,命令行,登陆也是上面的账号密码,进入ROOT后重新输入上面的代码即可

4.有线连接锐捷校园网

首先进入盒子的面板,同样点击系统栏的内的软件包

然后进入界面点击可用软件包,找到mentohust(可以搜索也可以点字母排序找)

点击安装,配置后面再说

这里其实有的固件已经预装了mentohust,则可以跳过这一步安装

然后我们点击网络,无线,进去修改wifi密码(自己喜欢)

保存后重新连接openwrt的wifi,进入控制面板

点击网络,接口,可以看到Lan点击修改,物理设置

将eth0上的选项关闭,点保存

然后将你的网线接上盒子,回到接口界面,点击添加新接口,按下图设置,然后点提交

注:大部分的锐捷都是DHCP,但是也有静态,所以要网上找找看,或者查看你的笔记本连接校园网时是否为DHCP

然后点击修改,防火墙设置,新建一个

再次回到接口界面,点击WAN上的修改MAC地址(这一步重要)

同样这里需要看你电脑平时的MAC地址,将其填入后保存,这样的话其实已经可以看到有流量在跑了,但是还没有认证所以上不了网

然后我们回到主界面进入命令行

输入下面的代码

mentohust -u你的学号 -p你的密码 -b2 -neth0 -a1 -d1 -v3.3

提示认证成功,服务为XXXX,即可关闭命令行,使用电脑打开百度,发现已经成功连接校园网

但是有的学校使用的是V3版本的认证算法,这里不知道可不可行,不可行的话,要自行谷歌搜索一下交叉编译mentohust V3之类的代替方法

20220322更新:大部分新版本固件不会集成mentohust,需要手动上传编译好的mentohust固件并进入命令行手动开启(即同上)建议方法为上传后使用下面命令将文件拷贝至默认root目录

cp /tmp/upload/mentohust mentohust

固件地址:

https://mscnueducn-my.sharepoint.com/:u:/g/personal/20182131055_m_scnu_edu_cn/EWURwKeHgKtInn5hYay0zfcBxr2dlmw7cxaQx8PsUq-qPQ?e=97Z7Cu

5.开启科学上网

查看主界面左边GFW一栏有很多应用,随便你选择哪一个,这里我用的是opencalsh(笔记本以前用Clash for win)

点进去将你的订阅配置好,更新,然后选好自动切换等规则,把DNS配置那里全部打钩,保存修改,就成功科学上网啦!

在网络一栏还有很多服务,这里建议开启网络加速里的BBR加速和DNS加速

6.At last

最新N1固件地址

G大网盘:

https://pan.gd772.com/OpenWrt/N1%E5%8E%86%E5%8F%B2%E5%9B%BA%E4%BB%B6

本文参考文章:

https://www.right.com.cn/forum/thread-3160780-1-2.html

本文参考视频

特别感谢

gz772 F大 恩山论坛

Win10环境下人声提取工具(spleeter)库的安装与使用

1.下载并安装Anaconda最新版本

1.1官网下载:

https://www.anaconda.com/products/individual

官网访问慢的话,可以试试清华大学的镜像

https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

1.2安装

安装提示一步一步安装即可,主要要勾选安装到系统环境变量(WIN)

1.3修改配置文件condarc

在C:\users\你的用户名目录下面,找到.condarc文件并打开(没有就新建一个)

将下面的文本复制进去,设置Anacoonda使用清华镜像(国内访问比较快)

channels:
  - defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

2.安装Spleeter

2.1 创建单独的运行环境

名称取为music(或者其他你喜欢的也行)并激活

这一步非必须,可直接进行步骤2-2安装Spleeter

:如果你本来装有其他版本的Anaconda python(3.8及以上或者2.X等旧版本),则必须创建一个新环境为3.6或3.7,因为最新版的Spleeter只支持3.6或者3.7

打开anaconda终端,分步输入下面的代码:

conda activate base
conda create -n music python=3.7
conda activate music

如果命令行最左方出现了(music)C:/XXX则为成功

2.2安装Spleeter库及依赖

打开anaconda终端输入下面的代码,安装Spleeter,如果网络过慢建议挂外国代理

:该库并没有清华镜像,所以只能耐心等待,若报错要排查网络环境多次尝试,外国源都这样。。

conda install -c conda-forge spleeter

3.下载预训练模型

前往下面的链接地址下载对应系统版本的tar.gz包并解压到指定目录,具体位置为 C:/Users/你的用户名

https://github.com/deezer/spleeter/releases

4.分离提取人声

把需要分离的原始音乐文件 1.mp3 放在C:\users\你的用户名 目录下,然后打开Anaconda终端(记得要进入music的虚拟环境下),然后输入命令运行:

spleeter separate -i 1.mp3 -p spleeter:2stems -o output

如果出现下面两句即为成功,分离的人声和伴奏都保存在你的用户名目录下的output文件夹下

注:如果出现Cannot convert a symbolic Tensor (strided_slice_4:0) to a numpy array,代表你的Numpy版本过高,直接降级为1.19以下一般可以解决

5.建议

如果你是一个程序员或者计算机专业学生,还是建议使用linux进行安装,会简单很多,少去很多不必要的麻烦,对于大量音频的训练大可以安装GPU版本的TensorFlow和Cuda,当场起飞!

参考文章:https://www.cnblogs.com/eternalpal/p/13169825.html

VPS在宝塔LNMP环境下搭建proxypool获取免费Clash和V2ray节点

VPS 安装宝塔

https://www.bt.cn/bbs/thread-19376-1-1.html

下载相关文件

在虚拟机的根目录新建一个文件夹,名字随意

进入新建的文件夹,远程下载主程序代码

https://github.com/xiaofei-ya/proxypool/releases/download/v0.5.3/proxypool-linux-amd64-v0.5.3.gz
该版本为最新版,还没有继续更新,详情可以留意这个github仓库

解压在当前文件夹并重命名为 proxypool,并确定权限为 755(以上也可)

同样远程下载另外两个配置文件

https://raw.githubusercontent.com/xiaofei-ya/proxypool/master/config/config.yaml
配置文件
https://raw.githubusercontent.com/xiaofei-ya/proxypool/master/config/source.yaml
资源文件

解析域名

cloudflare 或者别的域名解析到自己的 VPS 地址

首先将自己的域名加入Cloudflare(或者其他CDN)

cloudflare参考教程:https://zhuanlan.zhihu.com/p/82909515

!!!注意这里域名解析的小黄云如果项目失败的话把它变灰再试一次,因为这个项目不需要加速,只需要DNS代理跳转

将SSL设置为完全严格

边缘证书会出现这个,这样就代理成功啦!ping这个网址就可以ping通

配置文件

双击打开配置文件 config

domain 就是你刚刚在CDN解析的域名

source-files 这里把前面的文件夹去掉,留下./source.yaml 即可

cral-interval 是爬虫爬取间隔,设置为 720 即可,不必过于频繁

下方 speedtest 可以打开或者关闭速度测试

网站反代

宝塔网站里添加一个网站,域名为刚刚解析好并填入配置文件的网址。

申请一个 ssl 证书,并打开强制 https

然后添加一个反向代理,代理到本机的 12580 端口(其他自定义也可以但是要和配置文件一致)

这里要提示一下,如果申请Let’s Encrypt不成功,请升级nginx版本和PHP版本

参考版本:Nginx:1.19 PHP:8.0

增加 / 删除抓取源

根据他给的格式自己进行添加 / 删除

其中TG频道直接填写TG频道网址后面的频道名字:

例如:https://t.me/GCPUS则填入GCPUS

其他条目自行百度或者评论留言

运行程序

使用ssh 启动程序

运行完输入ps -ef 查看进程是否有./config/source.yaml
若有即为成功,不成功原因可能有:config.yaml或者source.yaml格式错误

nohup ./proxypool -c config.yaml 1>>run.log 2>>run.log &

更新配置 / 重启程序

代码

cd /123 # cd后面是你自己设置的根目录路径
ps -ef

然后输入 kill -s 9 ./proxypool -c config.yaml 对应的 PID

比如我这里就是 kill -s 9 595199 # 每个人的 PID 是不一样的!

这样就结束进程了

再次启动使用启动命令即可

nohup ./proxypool -c config.yaml 1>>run.log 2>>run.log &

程序有启动时间,请在 3 分钟后刷新页面查看是否生效

Demo

代理池:https://proxy.olivers.works/

Fork 项目地址:https://github.com/xiaofei-ya/proxypool

节点筛选教程

我来啦!

这个站点会记录一些我这个垃圾程序员(大学生)的平时开发的经历和经验。希望大家多多支持!