数学公式OCR识别php 对接mathpix api 使用公式编译器

数学公式OCR识别php 对接mathpix api

    • 一、注册账号
      • 官网网址:https://mathpix.com
    • 二、该产品支持多端使用
      • 注意说明(每月10次)
    • 三、api 对接
      • 第一步创建create key
      • php对接api
        • 这里先封装两个请求函数,get 和post ,通过官方文档我们可以知道,有的api 需要用get 有的需要post .
      • 下面我们开始发送请求的封装的一些函数
        • 对接图片识别的api
        • 对接PDF 识别的api
          • 第一步 发送请求
          • 第二步骤,获取处理的格式以及处理状态
          • 第三步骤,获取处理的结果
          • 第四步骤,拿到自己想要的结果进行文件写入。
    • 四。其他相关

项目开发中使用公式编译器,也参与开发过公式编译器,国内的巨头,金山,腾讯,这个网页版的编辑器公式这一块就比较糟糕,满足不了试题,公式的情况,后来自己开发的网页版公式编译器,现在对接了ocr 公式识别,国内的ocr 也是很糟糕。只能说针对数学公式这一块比较差,车辆车牌识别,身份证这种就比较简单做的比较好。

一、注册账号

官网网址:https://mathpix.com

如下图所示:
在这里插入图片描述

二、该产品支持多端使用

移动端,电脑PC端
在这里插入图片描述在这里插入图片描述

注意说明(每月10次)

下载注册登录既可以使用客户端,新用户账号每月可免费使用10次图片转识别或者pdf识别次数,每月清零。
有其他途径下载的需要支付1美元的可以每个月使用50~1000次,这个我没有用过,看别人说的,1美元应该是激活使用,看了都是19年早起其他博主发的帖子。这个能找到最好。

三、api 对接

我们由于是工具类所以我们自己开发的对接的需要使用api 接口服务对接。下面就简单说明一下api 对接把,登录账号进入个人中心如右侧栏目
在这里插入图片描述

第一步创建create key

。点击选择API 上图红线标注的地方进入即到如下图界面,说明,创建Key 需要绑定一张信用卡。信用卡的用途是用户激活账号和每月用量的一个账单统计计费,直接通过该卡直接扣款。这个也是比较方便的,不向有的平台直接会员或者按年套餐,用量付费这个大家都比较好接受。绑定卡以后会有一个扣款激活,我这里直接扣款是19.9$ 这个目前活动可以不限制类型的api 接口。后期可能会调整。这个19.9 $ 就是一个激活账号作用,激活后会默认创建一个key 如下图,当然你也可以创建多个key 根据不同的产品单独计费使用,多个接口可以用一个key使用。
在这里插入图片描述

官网api 对接文档链接,点击即可进入
官方啊的api 文档写的也是比较专业的,类死与国内的api 比较分类多,个人感觉基本差不多。
下一步就是我们来使用这个api 对接:

php对接api

个人使用的是php 语言,所以这里代码示例就用thinkphp5+ 演示了。官方gethub 和其他的博主用的都是python 示例。基本差不多。都一样把。语法不同,规则不同而已。

这里先封装两个请求函数,get 和post ,通过官方文档我们可以知道,有的api 需要用get 有的需要post .

封装的两个函数get 和post 代码如下。注意类面用到上面我们注册的app_id 和app_key。这个大家都知道,这个就是用来确定身份呢的。对结果阿里,腾讯,百度,都知道。

app_id 和app_key

    function api_request_curl($url, $postData = array()) {

        if (empty($url)) return '';
        $postData = json_encode($postData);

        $curl = curl_init();  //初始化
        curl_setopt($curl,CURLOPT_URL,$url);  //设置url
        curl_setopt($curl,CURLOPT_HTTPAUTH,CURLAUTH_BASIC);  //设置http验证方法
        curl_setopt($curl, CURLOPT_TIMEOUT,30);
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);  //设置curl_exec获取的信息的返回方式
        curl_setopt($curl,CURLOPT_POST,1);  //设置发送方式为post请求
        curl_setopt($curl,CURLOPT_POSTFIELDS,$postData);  //设置post的数据

        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                'app_id:**********',
                'app_key:**********',
                'Content-Type: application/json',
                'Content-Length: ' . strlen($postData))
        );

        $result = curl_exec($curl);
        if($result === false){
            throw new Exception('Http request message :'.curl_error($curl));
        }
        $result = json_decode($result,true);
        return $result;
    }

     /**
     * get请求
     * @param $url
     * @param string $msg
     * @return mixed
     */
    public function api_request_get($url){
       if (empty($url)) return '';
        $curl = curl_init();  //初始化
        curl_setopt($curl,CURLOPT_URL,$url);  //设置url
        curl_setopt($curl,CURLOPT_HTTPAUTH,CURLAUTH_BASIC);  //设置http验证方法
        curl_setopt($curl, CURLOPT_TIMEOUT,30);
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);  //设置curl_exec获取的信息的返回方式
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                'app_id:********',
                'app_key:**********'
            )
        );

        $result = curl_exec($curl);
        if($result === false){
            throw new Exception('Http request message :'.curl_error($curl));
        }

        curl_close($curl);
        return $result;
    }

下面我们开始发送请求的封装的一些函数

下面是我们用到的api 接口,根据自己的使用场景来选择api 接口即可。

https://api.mathpix.com/v3/app-tokens //token 使用
https://api.mathpix.com/v3/text
https://api.mathpix.com/v3/latex
https://api.mathpix.com/v3/pdf

对接图片识别的api

这里简单说明一下蹄片识别的情况,图片可以直接用图片地址(必须全路径)作为参数来使用。也可以用过file 文件上传来使用,我这里是直接把本都图片上传到服务器,拿到全路径进行一个post请求,请求结果和参数都在下面函数包含,大家可以看看返回的格式,图片识别一般都是快速响应的,一般都会请求后直接返回一个结果如下代码块的内容。

     * ocr pdf 识别转docx 处理
     * @param $pdfurl
     * @return \think\response\Json
     */
    public function mathpixphoto($photo_path="https://mathpix-ocr-examples.s3.amazonaws.com/cases_hw.jpg")

    {
    	
        //https://api.mathpix.com/v3/app-tokens
        //https://api.mathpix.com/v3/text
        //https://api.mathpix.com/v3/latex
        //https://api.mathpix.com/v3/pdf
        //图形转文本实例1
        $url = 'https://api.mathpix.com/v3/text';
        $data['src'] = "https://mathpix-ocr-examples.s3.amazonaws.com/cases_hw.jpg";
        $data['math_inline_delimiters'] = ["$", "$"];
        $data['rm_spaces'] = true;
        回调参数如下
        {"request_id":"2024_01_12_52927e584385e276cc6cg","version":"RSK-M122p1","image_width":850,"image_height":332,"is_printed":false,"is_handwritten":true,"auto_rotate_confidence":1.1920927533992653e-7,"auto_rotate_degrees":0,"confidence":0.9990236759185791,"confidence_rate":0.9990236759185791,"latex_styled":"f(x)=\\left\\{\\begin{array}{ll}\nx^{2} & \\text { if } x<0 \\\\\n2 x & \\text { if } x \\geq 0\n\\end{array}\\right.","text":"$f(x)=\\left\\{\\begin{array}{ll}x^{2} & \\text { if } x<0 \\\\ 2 x & \\text { if } x \\geq 0\\end{array}\\right.$"}

        图形转文本实例
        $url = 'https://api.mathpix.com/v3/text';
        $data['src'] = $path;
        $data['formats'] = ["text", "data", "html"];
        $data['data_options']=['include_asciimath'=>true,'include_latex'=>true];
       
        回调参数如下(需要转义json) json 解析直接报错,需要转义
        {
          "confidence": 0.9982182085336344,
          "confidence_rate": 0.9982182085336344,
          "is_printed": false,
          "is_handwritten": true,
          "data": [
            {
              "type": "asciimath",
              "value": "lim_(x rarr3)((x^(2)+9)/(x-3))"
            },
            {
              "type": "latex",
              "value": "\\lim _{x \\rightarrow 3}\\left(\\frac{x^{2}+9}{x-3}\\right)"
            }
          ],
          "html": "<div><span  class=\"math-inline \" >\n<asciimath style=\"display: none;\">lim_(x rarr3)((x^(2)+9)/(x-3))</asciimath><latex style=\"display: none\">\\lim _{x \\rightarrow 3}\\left(\\frac{x^{2}+9}{x-3}\\right)</latex></span></div>\n",
          "text": "\\( \\lim _{x \\rightarrow 3}\\left(\\frac{x^{2}+9}{x-3}\\right) \\)"
        }
          $res = $this->api_request_curl($url,$data);
         return $res;
 }
        
对接PDF 识别的api

这里主要和大家说一下pdf 的识别,pdf 我的操作流程是,上传pdf 到服务器或者是oss(阿里) ,obs(腾讯)、七牛云等一些第三方存储。这样我们拿到一个文件地址(全路径)然后直接发送请求。
pdf 对接官方文档提供了4个步骤,分几个步骤也可以理解毕竟系统识别处理文件也有一个过程,这个就是智者见智。

第一步 发送请求

把自己想要ocr 识别的pdf 文件发送给mathpix 告诉对方我要ocr 识别这个文件的内容,请求后会给返回一个pdf_id 或者错误提示,这里我们需要将pdf_id 进行存储,方便处理后面的逻辑。

pdf_id

第二步骤,获取处理的格式以及处理状态

获取转化的状态

“status”:“completed”, 代表完成

第三步骤,获取处理的结果

获取自己第一步需要转化的内容,比如我把pdf 文件需要ocr 识别后转化为docx 或者html 或者zip

“status”:“completed”,代表完成

第四步骤,拿到自己想要的结果进行文件写入。

pdf 转化后的内容写入自己的文件,比如我们需要把数学试卷的pdf 通过ocr api 识别成html 网页格式和docx 格式,一个用于网页展示,一个用于本地文件下载。识别的公式都是可编辑的公式。
*注意 这里的返回结果都是已经转化后的内容直接写入就行了。比如html 格式就是html 内容,直接写入即可。docx 格式就是docx 内容直接写入文件就行。(小插曲之前自己搞个phpword 创建写入一直失败,后来写入text 文本发现就是word的源文件格式,真笑了。)

这里我在函数写了一个sleep_pdf_status 意思就是延迟循环查看处理状态可以省掉低二步骤,第三步骤 ,大家也知道php 的请求延迟最长不超过60s 所以我们通过延迟循环来判断结果这样可以直接写入文件。

sleep_pdf_status

pdf 处理也会返回一个pdf_id 我们可以将该参数进行存储,比如第一次延迟循环返回失败后,在次通过pdf_id获取结果,我测试的基本上一个循环都能成功,也有不成功的,不成功的我们直接重新发起获取结果的函数自己写的就可以了 reissue_pdf_math 这个函数,

reissue_pdf_math

file_put_contents php写入就用该函数就行,下面代码块有

/**
     * ocr pdf 识别转docx 处理
     * @param $pdfurl
     * @return \think\response\Json
     */
    public function mathpixpdf($pdfurl="")

    {
        //PDF ocr 识别 第一步 上传
        $url = 'https://api.mathpix.com/v3/pdf';
        $data['url'] = "".$pdfurl."";//"https://deyouw.oss-cn-beijing.aliyuncs.com/document/20240115/user_125/57522.pdf";
        $data['conversion_formats']=['html'=>true,'docx'=>true,'tex.zip'=>true]; 
        $res = $this->api_request_curl($url,$data);
        $pdf_id = $res['pdf_id'];
        $res = $this->sleep_pdf_status($pdf_id);
        return $res;
        // var_dump($res);
        // exit;
        //返回一个pdifid 需要自己记录一下案例如下
        // {"pdf_id":"2024_01_12_9536370a2434175d0c6dg"}



         //PDF ocr 识别 第二部,获取转化状态
        // $url = 'https://api.mathpix.com/v3/pdf/2024_01_15_2cf99221f2144139723fg';
        // $res = $this->api_request_get($url);
        // var_dump($res);
        //返回参数:处理中
        // {
        //   "status": "split",
        //   "num_pages": 9,
        //   "percent_done": 11.11111111111111,
        //   "num_pages_completed": 1
        // }
        //返回参数:完成
        // {
        //     "status":"completed",
        //     "version":"RSK-P107",
        //     "input_file":"https://deyouw.oss-cn-beijing.aliyuncs.com/document/20240112/user_125/83323.pdf",
        //     "num_pages":2,
        //     "num_pages_pdf":2,
        //     "num_pages_completed":2,
        //     "percent_done":100
        // }

        //PDF ocr 识别 第三部,获取转化需要的内容
        // $url = 'https://api.mathpix.com/v3/converter/2024_01_12_9536370a2434175d0c6dg';
        // $res = $this->api_request_get($url);
        // 返回相应参数:完成

        // {
        //     "status":"completed",
        //     "version":"RSK-P107",
        //     "conversion_status":{
        //         "tex.zip":{
        //             "status":"completed"
        //         },
        //         "docx":{
        //             "status":"completed"
        //         }
        //     }
        // }

        // 第四部 -下载所需要的的格式内容html 
        // $url = 'https://api.mathpix.com/v3/converter/2024_01_15_e8b33807c27cb8bf847ag.html';
        // $text = $this->api_request_get($url); 

        // $filename = "ocr/docx/".time().".html"; // txt文件名
         
        // // 将内容写入到txt文件中
        // if (file_put_contents($filename, $text) !== false) {
        //     return $filename;
        //     echo "成功将内容写入到html文件中!";
        // } else {
        //     return 202;
        //     echo "无法将内容写入到html文件中。";
        // }
        // echo "https://deyouw.com/example.html";
        // exit;

        // 第四部 -下载所需要的的格式内容 docx 
        // $time = time().getmyuid();
        // $url = 'https://api.mathpix.com/v3/converter/'.$pdf_id.'.html';
        // $text = $this->api_request_get($url); 
        // $filename = "ocr/html/".$time.".html"; // txt文件名
         
        // // 将内容写入到txt文件中
        // if (file_put_contents($filename, $text) !== false) {
        //     $data['html'] =  $filename;
        //     echo "成功将内容写入到html文件中!";
        // } else {
        //     return 202;
        //     echo "无法将内容写入到html文件中。";
        // }
       
        // sleep(3);

        // $url = 'https://api.mathpix.com/v3/converter/'.$pdf_id.'.docx';
        // $text = $this->api_request_get($url); 

        // $filename = "ocr/html/".$time.".docx"; // txt文件名
         
        // // 将内容写入到txt文件中
        // if (file_put_contents($filename, $text) !== false) {
        //    $data['doc'] =  $filename;
        //     echo "成功将内容写入到docx文件中!";
        // } else {
        //     return 202;
        //     echo "无法将内容写入到docx文件中。";
        // }
        // return $data;
        // $this->create_word(file_get_contents($filename));
        // $this->create_word($text);
        
        // 返回相应参数:完成

        // {
        //     "status":"completed",
        //     "version":"RSK-P107",
        //     "conversion_status":{
        //         "tex.zip":{
        //             "status":"completed"
        //         },
        //         "docx":{
        //             "status":"completed"
        //         }
        //     }
        // }
         // $data['formats'] = ["text", "html"]; //text", "html" "latex"
        // $data['data_options']=['include_asciimath'=>true,'include_latex'=>true];

        //BASE64 格式
       // $data['app_id'] = config('mathpix')['app_id'];
       // $data['app_key'] = config('mathpix')['app_key'];

        // $res = $this->api_request_curl($url,$data);
        //r.json()['text']
        // return $res;

    }

    //客户端重新获取
    public function reissue_pdf_math($pdf_id){
       return $res = $this->sleep_pdf_status($pdf_id);
    }
    //获取内容
    public function pdf_ocr($pdf_id){
        $url = 'https://api.mathpix.com/v3/converter/'.$pdf_id;
        $res = $this->api_request_get($url);
        $res = json_decode($res,true);
        return $res;
    }

     /**
     *获取转化的状态返回参数
     *PDF ocr 识别 第三部,获取转化需要的内容
     */
    public function sleep_pdf_status($pdf_id){
        
        $status = 0;
        //循环查找最多响应30秒结束
        for ($i=0; $i < 10; $i++) { 
            $res = $this->pdf_ocr($pdf_id);
            if($res == NULL || $res == null || empty($res)){
                $status = 2;
            }
        
            if(array_key_exists('error', $res)){  
               $status = 2;
            }
            if(array_key_exists('status', $res) && $res['status'] == "completed"){ //完成状态
               $status = 1;
               continue;
            }
            sleep(3); //秒执行
        }
        
        if($status==1){
            $url = 'https://api.mathpix.com/v3/converter/'.$pdf_id.'.html';
            $text = $this->api_request_get($url); 
            
            if(empty($text)){
                $res = ['status'=>203,'pdf_id'=>$pdf_id,'msg'=>'相应超时失败,请下次重新请求'];
                return $res;
            }
            $filename = "ocr/html/".time().rand(1111,9999).".html"; // html文件名
            
            // 将内容写入到txt文件中
            if (file_put_contents($filename, $text) !== false) {
                $data['html'] =  $filename;
                // echo "成功将内容写入到html文件中!";
            } else {
                $data['html'] =  "html转化成功、写入失败";

                // return 202;
                // echo "无法将内容写入到html文件中。";
            }
           
            $url = 'https://api.mathpix.com/v3/converter/'.$pdf_id.'.docx';
            $text2 = $this->api_request_get($url);
            if(empty($text2)){
                $res = ['status'=>203,'pdf_id'=>$pdf_id,'msg'=>'相应超时失败,请下次重新请求'];
                return $res;
            }
            $filename = "ocr/html/".time().rand(1111,9999).".docx"; // docx文件名
            
            // 将内容写入到txt文件中
            if (file_put_contents($filename, $text2) !== false) {
               $data['docx'] =  $filename; 
                // echo "成功将内容写入到docx文件中!";
            } else {
                $data['docx'] =  "docx转化成功、写入失败"; 
                // return 202;
                // echo "无法将内容写入到docx文件中。";
            }
            $data['pdf_id']=$pdf_id;
            $data['status'] = 200;
           
            return $data;
        }else{
            $res = ['status'=>203,'pdf_id'=>$pdf_id,'msg'=>'相应超时失败,请下次重新请求'];
            return $res;
        }
        
    }

四。其他相关

###下面是其他博主的发表的关于mathpix 客户端工具使用,csdn 这个论坛国内比较好,里面的大哥确实挺多的感谢他们的分享
mathpix安装和使用详细教程
使用Mathpix识别和转换富含公式的PDF为Markdown

后面会整合一下markdown 编辑器来实现ocr 识别后,编辑和预览。有兴趣的伙伴可以试着搞个demo
Editor.md
这次就这些内容,不论学习或者工作中遇到问题,想办法解决,都可以发帖,互相学习互相进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/361519.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kotlin快速入门系列11

Kotlin的集合 集合类 Java类库有一套相当完整的容器集合类用来持有对象。跟Java一样&#xff0c;集合类存放的都是对象的引用&#xff0c;而非对象本身(我们经常说的集合指的是集合中对象的引用)&#xff0c;Kotlin的集合类是在Java的集合类库基础上进行的优化&#xff0c;新引…

拥抱变局,坚韧向新|复旦大学-华盛顿大学EMBA项目C20毕业典礼

12月初&#xff0c;复旦大学-华盛顿大学EMBA项目20班的学员们前往美国&#xff0c;完成了项目最后一次移动课堂&#xff0c;并在奥林商学院举办了毕业典礼。      20班的学员们在项目20周年之际入学&#xff0c;也是疫情以来第一个正式恢复线下授课的班级。虽然经历了一些波…

《二叉树》——3(层序遍历)

目录 前言&#xff1a; 层序遍历: 解析&#xff1a; 前言&#xff1a; 本文主讲链式二叉树的层序遍历&#xff0c;在前面的张篇blog我们初步实现了链式二叉树递归部分的内容&#xff0c;对于递归算法的学习和思维方式我们仍然需要不断加强&#xff0c;所以将对链式二叉树进行…

Docker本地部署Firefox浏览器并结合内网穿透公网访问

文章目录 1. 部署Firefox2. 本地访问Firefox3. Linux安装Cpolar4. 配置Firefox公网地址5. 远程访问Firefox6. 固定Firefox公网地址7. 固定地址访问Firefox Firefox是一款免费开源的网页浏览器&#xff0c;由Mozilla基金会开发和维护。它是第一个成功挑战微软Internet Explorer浏…

Python pip 不是内部或外部命令...

文章目录 1 问题截图2 解决办法2.1 配置环境变量2.2 试试 pip3 3 扩展分析3.1 查询 Python 版本及位数3.2 查询 Python 安装路径3.3 查询当前 pip 的版本 1 问题截图 2 解决办法 2.1 配置环境变量 2.2 试试 pip3 根据安装的 Python 版本不同&#xff0c;使用的 pip 也会不同若…

ESP8266 AP配网

首先引入需要的库 #include <WiFiManager.h> // https://github.com/tzapu/WiFiManager 在setup() 方法中设置网络名称等待登录连接 void setup(){Serial.println("Wait for Smartconfig");WiFi.mode(WIFI_STA);WiFiManager wm;bool res;res wm.autoConnec…

基础小白快速入门python------Python程序设计结构,循环

循环在计算机中&#xff0c;是一个非常重要的概念&#xff0c;是某一块儿代码的不断重复运行&#xff0c;是一种逻辑思维 在编程中的体现&#xff0c;运用数学思维加代码结合加数据&#xff0c;就构成了一个循环。 在Python中&#xff0c;循环主要分为三大类 for循环 while循…

面试必考精华版Leetcode450. 删除二叉搜索树中的节点

题目&#xff1a; 代码&#xff08;首刷看解析&#xff09;&#xff1a; class Solution { public:TreeNode* deleteNode(TreeNode* root, int key) {if(rootnullptr){return nullptr;}if(root->val > key ){root->left deleteNode(root->left,key);return root;…

EXCEL VBA实现重复字段出现次数并列显示

EXCEL VBA实现重复字段出现次数并列显示 Sub dotest() Dim arr, dApplication.ScreenUpdating FalseSet d CreateObject("Scripting.Dictionary")With Sheets("Sheet2")r .Cells(.Rows.Count, "a").End(xlUp).Rowarr .[a1].Resize(r, 1)En…

幻兽帕鲁服务器多少钱?服务器租借价格一览表

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

福布斯财富增长榜前十富豪身价暴增3.5万亿!他们致富的秘诀究竟是?

按照《福布斯》最新的数据显示&#xff0c;今年全球前十位财富增长最多的富豪的身家总共增加了4900亿美元&#xff08;约3.5万人民币&#xff09;&#xff0c;大家可能对于3.5万亿没什么概念&#xff0c;但是换算一下&#xff0c;中国一共才14亿人&#xff0c;如果把这3.5万亿平…

测试环境搭建整套大数据系统(二:安装jdk,mysql)

一&#xff1a;安装JDK 参考 https://blog.csdn.net/weixin_43446246/article/details/123328558 二&#xff1a;安装mysql 1.因为我们安装cdh6.3.2。cdh支持的是5.6和5.7版本的mysql。 2. 步骤 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.…

基于Android的成人教育课程学习考试系统uniAPP的 小程序_12lo1

APP性能需求 &#xff08;1&#xff09;会员在安卓App页面各种操作可及时得到反馈。 &#xff08;2&#xff09;该平台是提供给多个会员使用的平台&#xff0c;会员使用之前需要注册登录。登录验证后&#xff0c;会员才可进行各种操作[10]。 &#xff08;3&#xff09;管理员用…

书写触感细腻的电容触控笔,透明造型超好看,西圣Pencil2上手

iPad在配上手写笔之后&#xff0c;才能才能充分发挥优势&#xff0c;实现除看视频之外的更多功能。很多人入手iPad的初衷都是工作或者学习&#xff0c;如果只拿来观剧或玩游戏就太浪费了。当然了&#xff0c;现实情况下&#xff0c;Apple Pencil高昂的定价也是很多人望而却步的…

Android组件化中的Arouter学习

假设现在有两个业务组件登录和问答模块之间需要进行通信&#xff0c;可能会想到用反射的方式&#xff0c;是可以但是会影响性能&#xff0c;而写的代码比较多类名这些要记清楚。 路由可以看做表&#xff0c;每个map对应一张表 我们可以试着这么写&#xff0c;完成MainActivity跳…

WINDOWS中电源设置小工具

你可以使用WinPowerSet&#xff0c;玩CS2之前&#xff0c;把电源设置为“高性能”&#xff0c;玩后设置为“平衡”。 WinPowerSet 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1iOp29c4ica9L47t_l9lZ2w?pwdd248 提取码&#xff1a;d248 最近新配了一台12…

由《幻兽帕鲁》私服漏洞引发的攻击面思考

《幻兽帕鲁》私服意外丢档 当了一天的帕鲁&#xff0c;回家开机抓帕鲁的时候发现服务器无法连接。运维工具看了下系统负载发现 CPU 已经跑满。 故障排查 登录服务器进行排查发现存在可疑的 docker 进程。 经过一番艰苦的溯源&#xff0c;终于在命令行历史中发现了端倪 攻击…

Java多线程--线程安全问题练习题

文章目录 &#xff08;1&#xff09;练习题1&#xff08;2&#xff09;练习题2&#xff08;3&#xff09;练习题3 现在咱们线程一共说了这么几件事情&#xff0c;如下&#xff1a; 具体文章见专栏。 接下来看几个练习题吧。 &#xff08;1&#xff09;练习题1 &#x1f30b;题…

实现单点登录

指再多系统应用群中登录一个系统&#xff0c;便可在其他所有系统中得到授权而无需再次登录&#xff0c;包括单点登录与单点注销两部分。 相比于单系统登录&#xff0c;sso需要一个独立的认证中心&#xff0c;只有认证红心能接受用户的用户名密码等安全信息&#xff0c;其他系统…

N65总账凭证管理凭证查询(sql)

--核算账簿 select code , name , pk_setofbook from org_setofbook where ( pk_setofbook in ( select pk_setofbook from org_accountingbook where 1 1 and ( pk_group N0001A11000000000037X ) and ( accountenablestate 2 ) ) ) order by code;--核算账簿 select code …