Group Details

二次元爱好者

用爱发电~

  • 说说我SpringCloud微服务碰到的神奇的坑

    最近在学微服务,学到Eureka注册中心的安全验证这一节时,按照文档的说法,先添加了spring-boot-starter-security依赖,然后在配置文件中设置了账号密码,并添加配置类用来忽略服务注册时的CSRF验证

    package org.bkcloud.config;
    
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().ignoringAntMatchers("/eureka/**");
            super.configure(http);
        }
    }
    

    然后,当我的服务用账号密码注册到注册中心时,却提示

    com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

    我花了几个小时各种改配置 ,重新启动,仍然无法解决。我甚至尝试过直接禁用CSRF防护,也没有效果。
    最终,我重启IDE,重新运行程序,问题莫名其妙就解决了


    总结

    此次问题

    • 原因:未知
    • 解决方法:未知
    • 感想:一脸懵逼
    posted in 编程
  • 理性讨论,360和百度到底谁更流氓

    反正,👴已经被他们恶❤🤮了
    腾讯阿里好歹不会在明面上恶心你,顶多后台挂几个程序窃取你个人信息,360和百度真是让你直接心态爆炸

    posted in 水区
  • Tomcat 10要改用Jakarta EE了!

    前因是Eclipse Foundation与Oracle谈判破裂,因此Eclipse Foundation与Jakarta EE社区不再能使用javax.*包空间,因此代码必须做出改变,把javax.*下的内容迁移到jakarta.*(Oracle法务部牛逼)


    然后,Tomcat 10,2020年2月开始测试,使用的是新的包空间,因此几乎所有涉及到Java代码的web应用都需要做出更改,SpringFramework也不能幸免
    刚才我去Tomcat官网下载了10.0.0-M5版本并把我部署在Tomcat 9上的SpringBoot应用部署到上面,果然在启动阶段就直接报错了:

    java.lang.IllegalStateException: Failed to load ApplicationContext
    Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [org.bkcloud.HelloMVCApplication]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.web.servlet.support.SpringBootServletInitializer
    Caused by: java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.web.servlet.support.SpringBootServletInitializer
    Caused by: java.lang.IllegalStateException: Failed to introspect Class [org.springframework.boot.web.servlet.support.SpringBootServletInitializer] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@15db9742]
    Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContext
    Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletContext
    

    Tomcat 10提供了官方的迁移工具,可以把9的项目迁移到10,但是需要从GitHub下载源码,自己编译,而且版本号居然是0.0.1
    总之,目前完全没动力从9迁移到10,还是等Spring和Tomcat适配完毕再考虑吧,我还是比较喜欢无痛迁移

    posted in 编程
  • MSVC和GCC的二进制文件为毛不兼容啊!!!

    用C++写了个调用Python脚本的功能,代码和Python官方文档上的Embedding Python in Another Application部分差不多,结果在Py_Initialize()处无限崩溃,头文件库文件动态链接库什么的都添加好了,但就是崩溃
    后来我在其他地方找到了这么一句话

    On Windows, the (non-source) Python Windows installer can be used. Make sure that you use the same compiler as the one that your Python distribution is built with.

    总之就是,你的项目和Python的编译器必须相同,而我的Python用的是MSVC,项目用的是MinGW
    我打开VS,复制黏贴一气呵成,编译运行,成功

    淦...这尼玛是天坑啊,MinGW和MSVC的二进制文件居然不兼容,浪费了老子一晚上的时间

    posted in 编程
  • 碰到个很神奇的问题,Qt计时器读数不准确

    需要统计一个精确到1ms的时间
    一开始我用的是QTimer类,间隔1ms让一个整形量自增1,结果发现QTimer效率还是太低,虽然可以精确到毫秒,但是没法准确控制间隔为1ms,具体来说平均间隔大约为1.2ms。
    不过后来我发现这个量没必要由我自己去维护,Qt内置了QElapsedTimer类,专门用来计时,可以精确到μs,使用elapsed()方法直接获取start()开始计时后经过的毫秒数。最终测试结果确实比较准确,平均间隔可以达到1.0ms。
    不过我录了一个120FPS的视频逐帧分析后发现,这个读数的尾数浮动其实非常大,理论上120FPS的视频每帧间隔是8.33ms,但是用elapsed()方法获取到的整形值的间隔却是4-11,浮动高达大约50%。理论上可以精确到μs的计时器不可能在ms数量级上产生这么大的误差啊...
    虽然有可能是GUI绘制耗时产生的误差,但是原来使用QTimer时也没遇到这么大的误差。


    显示当前经过毫秒的源代码如下

    #include "msecsgetter.h"
    #include "ui_msecsgetter.h"
    
    #include <QDateTime>
    
    //定义重绘GUI的间隔,单位ms
    #define INTERVAL 4
    
    MSecsGetter::MSecsGetter(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::MSecsGetter)
    {
        ui->setupUi(this);
    
        timer = new QTimer(this); //定时器,用来定时触发重绘GUI
        tick = new QElapsedTimer(); //计时器,用来记录经过的毫秒数
    
        //当计时器完成一次计时后,将GUI上的label内数字重绘为当前经过的毫秒数
        connect(timer, &QTimer::timeout,
                [=]()
        {
            ui->label->setText(QString::number(startTime + tick->elapsed()));
        });
    
        startTime = QDateTime::currentMSecsSinceEpoch(); //以自1970-01-01 00:00:00经过的毫秒数为初值
    
        //启动定时器和计时器
        tick->start();
        timer->start(INTERVAL);
    
    }
    
    MSecsGetter::~MSecsGetter()
    {
        delete ui;
    }
    

    后续:找到问题原因了,GUI重绘间隔的问题,把间隔调成1就好了,不过因为GUI重绘比较耗时(至少比让一个整形自增费时),所以会有约1ms的误差

    posted in 编程
  • RE: 感觉解数独的算法好复杂啊

    算法解数独其实是个经典问题。。。

    posted in 编程
  • 感觉解数独的算法好复杂啊

    前言:在Google Play上下载了一个数独小游戏,玩了几把之后开始思考怎么利用程序解数独。
    感觉用程序算法来实现还是挺复杂的。
    首先要把9*9的数独矩阵表示出来,需要在数独类中维护一个9*9的二维向量,每个九宫格用一个含有9个Cell实例的向量存放,并且提供一个优先级队列,用来存放数独的计算任务,以及提供一些进行操作的接口

    Class Sodoku
    {
    public:
        Sodoku(); //默认构造函数
        Sodoku(const Sodoku &sodoku); //根据给定的已经填充一部分的数独生成一个数独实例的构造函数
        ~Soduku(); //析构函数
    
    private:
        std::vector< std::vector<Cell> >; //用来存放数独的81个格子,不使用int表示是因为高难度数独中每个格子的状态难以确定,需要添加一些标注辅助解谜
        std::priority_queue<Cell>; //优先级队列,用来根据每个格子被解出的预期存放格子,并在解谜算法中进行遍历
    
    protected:
        void run(); //用来开启一个新线程,高难度数独解起来很慢,所以最好采取多线程的方式进行处理
        void deal(Cell c); //用来遍历优先级队列并更改格子状态的函数,解谜算法的重点
        void insert(Cell c, int n); //将数字插入格子的算法
        void mark(Cell c, int n); //对格子进行标注的算法,解答高难度数独时需要用到
        void remove_from_queue(Cell c); //当一个格子状态被确定后(即填入数字后),将格子从优先级队列中移除的算法
    
    //可能还有其他必需的成员函数或成员,用来辅助解答
    
    }
    

    表示单个格子的Cell类,至少需要存放这个格子填入的数字,这个格子的标注,以及这个格子的状态(是否被遍历等)

    Class Cell
    {
    public:
        Cell(); //默认构造函数
        Cell(int n); //根据数字直接构造出一个填好数字的单元格
        ~Cell(); //析构函数
    
    private:
        int digit; //表示填入这个格子的数字
        bool is_visit; //表示该格子是否已被遍历
        std::list<int> marks; //表示当前格子被标注的数字,解答高难度数独时起到辅助解答的作用
    
    //可能还需要其他成员、方法来辅助解答
    
    } 
    

    之后,剩下的就是利用排除法等解答数独的方法实现具体的接口了,不过我能力和时间有限,暂时就不写具体实现了
    总体来说,解答数独本身算法实现已经较难了,如果想高效实现,估计需要相当好的逻辑思维以及算法和数据结构知识

    posted in 编程
  • RE: FFmpeg的环境到底是想要多难搞啊

    嗯。 windows 不配当开发用的 OS

    posted in 编程
  • RE: 现在找个工作怎么这么难啊

    不过我真的很喜欢Python和C++,想靠他们吃饭

    去搞算法吧

    posted in 水区
  • 现在找个工作怎么这么难啊

    想进入互联网行业写代码,但是本科专业不是计算机相关的
    不想写前端,虽然基础我也会,但是我对做界面没那么感兴趣,我还是更喜欢写各种底层逻辑以及交互,也就是后端
    Java会一些,但是感觉条条框框太多了,写个项目的配置文件都要研究半天,不如C/C++灵活高效
    目前用的最多的就是Python和C++,而且对于个人团队来说,Python写后端,前端用html瞎写一点,C++用来开发客户端,足够了
    然而企业好像不这么想,首先招聘要求就有计算机相关专业,其次基本清一色的招Java程序员,C/C++倒是有,但是基本都是架构工程师之类的职位,还要求几年的工作经验。Python就更少了,目前本地只看到一个算法开发工程师要求Python的
    不知道是不是因为我这2线小城市对互联网的需求也就这些
    不过我真的很喜欢Python和C++,想靠他们吃饭

    posted in 水区