玖叶教程网

前端编程开发入门

3分钟学会安装Win11 带你超越80%用户

嘴上很硬的微软终于在最近又软了,之前一直必须要求有TPM 2.0支持才能检测更新升级Windows11操作系统,最近有网友传出消息说是可以通过简单地注册表修改直接绕过这个限制,狼叫兽今天就拿一台大约十年前的搭载第四代酷睿i5-4200U处理器的笔记本来测试一下这个方法到底是否可行。

3分钟即可解锁更新

戴尔笔记本一开机就进入安全方式如何退出

第一个办法是:重新安装系统。这个可能是由于未知的原因导致的电脑故障,重新安装系统就可以方便的解决。

第二个办法是:按F8进入高级启动选项,选择最近一次的正确配置,从而可以正常启动电脑。安全退出安全模式。这个方法比较常用。

第三个办法是:去维修店检查,如果严重可以进行一下维修。

通过修改注册表,使用户无法进入Windows XP带有命令行的安全模式,避免他人在安全模式下利用net user命令修改其他用户的密码,同时限制受限用户访问并修改注册表,避免他人修改注册表启动安全模式。

vue3源码分析——实现组件的挂载流程


引言

<<往期回顾>>

  1. 手写vue3源码——创建项目
  2. 手写vue3源码——reactive, effect ,scheduler, stop

「死磕 Redis」——Redis 通信协议 RESP

我们在第一次成功安装完 Redis ,启动 Redis 服务后,都会通过 ping 命令来测试 Redis 服务是否启动成功,如果服务启动成功则会响应 PONG,否则启动失败。这么一个简单的过程就完成了 Redis 客户端 - 服务端的一次交互。

我们知道,Redis 客户端与服务端是通过命令的方式来完成交互过程的,主要分为两个部分:网络模型和序列化协议。前者讨论的是数据交互的组织方式,后者讨论的是数据如何序列化。本篇文章将分析后者即,Redis 的序列化协议。

USB2.0 High Speed MUX信号眼图测试

最近工作的时候,有同事负责的芯片有一颗USB2.0 MUX需要测试眼图,看USB2.0 HighSpeed眼图是否符合标准。我也是第一次接触用仪器对眼图测试,以下将测试的步骤记录下来,如果有需要的朋友们可以参考一下。

构造函数基本概念(构造函数基本概念及特点)

构造函数:

作用:在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的初始状态

要求:函数名=类型名,不能定义返回值类型,也不能有return语句

使用:Clock c(实参1, 实参2,……);

如果没有定义构造函数,编译器将在需要时自动生成一个默认构造函数,这个默认构造函数参数列表为空,且初始值可能不确定

单片机的骚操作!嘿嘿(单片机实操视频)


1.生日快乐(蜂鸣器)

/************************************************************************ 
[???t??] C51ò?à?3ìDò(éú2ú?ìà?) 
[1|?ü] í¨1yμ¥???ú?Y×àò?à? 
 2?é?ì????±£oJ9 
/**********************************************************************/ 	 
	 ORG 0000H
 JMP MAIN
 ORG 000BH
 JMP INTT0
 ORG 0100H 
MAIN: MOV SP,#60H
 MOV TMOD,#01H
 SETB ET0
 SETB EA
 SETB TR0
START0: ;clr P1.5
 MOV 30H,#00H
NEXT: MOV A,30H
 MOV DPTR,#TABLE
 MOVC A,@A+DPTR
 MOV R2,A
 JZ ENDD
 ANL A,#0FH
 MOV R5,A
 MOV A,R2
 SWAP A
 ANL A,#0FH
 JNZ SING
 CLR TR0
 JMP D1
SING: DEC A
 MOV 22H,A
 RL A
 MOV DPTR,#TABLE1
 MOVC A,@A+DPTR
 MOV TH0,A
 MOV 21H,A
 MOV A,22H
 RL A
 INC A
 MOVC A,@A+DPTR
 MOV TL0,A
 MOV 20H,A
 SETB TR0
D1: CALL DELAY
 INC 30H
 JMP NEXT
ENDD: CLR TR0
 JMP START0
INTT0:
 PUSH PSW
 PUSH ACC
 MOV TL0,20H
 MOV TH0,21H
 CPL P3.6
 POP ACC
 POP PSW
 RETI
DELAY: MOV R7,#02
DELAY0: MOV R4,#187
DELAY1: MOV R3,#248
 DJNZ R3,$
 DJNZ R4,DELAY1
 DJNZ R7,DELAY0
 DJNZ R5,DELAY
 RET
TABLE: DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H
 DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H
 DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
 DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H
 DB 82H,01H,81H,94H,84H,0B4H,0A4H,04H
 DB 82H,01H,81H,94H,84H,0C4H,0B4H,04H
 DB 82H,01H,81H,0F4H,0D4H,0B4H,0A4H,94H
 DB 0E2H,01H,0E1H,0D4H,0B4H,0C4H,0B4H,04H
TABLE1: DW 64260,64400,64524,64580,64684,64777,64820,64898
 DW 64968,65030,65058,65110,65157,65178,65217 
	END 

Modbus-RTU通信(MODBUS-RTU通信协议)

通常情况下我们做Modbus 通信的时候,都会先用测试软件进行测试,等通信测试通过之后,我们才会进行移植,我这边主要讲的是移植到PLC上,我现在这边还没有开始做PLC程序,那先把前期的用测试软件如何测试的写下吧。

首先打开Modbus_poll,这个软件挺好用的,网上有教程,如何使用

视频转换工具JAVA版本 比如VOB转MP4(转载)

有需求将VCD中的VOB文件转换成MP4的朋友们可以一试, 需要安装ffmpeg,再把bin目录加入到系统路径中,着实方便好用 感谢作者。附源码及原文地址

pacpathkage com.octopus;

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * 利用FFmpeg实现视频格式批量转化的工具
 * 
 * @author hw
 *
 */
public class FfmpegConvertUtil {


    
    private String lastMessage = "";// 当前最后一条消息
    private String currentFile = "";// 当前操作的文件
    //转换过程中的消息
    private StringBuffer sbMessages = new StringBuffer();
    //ffmpeg的实际路径,请在path中配置对应的bin
    private String ffmpegPath = null;

    private boolean isRunning = false;

    public static void main(String[] args) {
        FfmpegConvertUtil util = new FfmpegConvertUtil();
        util.new MainFrame(util);

    }

    /**
     * 处理某个文件夹
     */
    public void startProcess(String basepath) {
        if (ffmpegPath == null) {
            //在path环境变量中搜索ffmpeg程序的路径
            String path = System.getenv("path");
            String[] paths = path.split(";");
            for (String p : paths) {
                File file = new File(p);
                File[] files = file.listFiles();
                if (files != null && files.length > 0) {
                    for (File f : files) {
                        if (f.getAbsolutePath().toLowerCase().endsWith("ffmpeg.exe")) {
                            ffmpegPath = f.getAbsolutePath();
                            break;
                        }
                    }
                }
                if(ffmpegPath!=null) {
                    //无需再找
                    break;
                }
            }
            if (ffmpegPath == null) {
                JOptionPane.showMessageDialog(null, "找不到转换程序,请设置ffmpeg到path环境变量");
            }
        }
        //使用timer作为多线程的使用方式
        Timer timer = new Timer();
        ConvertTask task = new ConvertTask();
        task.basePath = basepath;
        timer.schedule(task, 1000, 10000);
    }

    public class ConvertTask extends TimerTask {

        public FfmpegConvertUtil util;

        public String basePath;

        @Override
        public void run() {
            isRunning = true;
            int count = 0;
            List<String> autoGenerateMp4 = findFilesToConvert(basePath);
            for (String path : autoGenerateMp4) {
                currentFile = path + "(一共有文件:" + autoGenerateMp4.size() + "剩余文件数:" + (autoGenerateMp4.size() - count)+")";
                convertAllOthersToMp4(path);
                count++;
                currentFile = "";
            }
            sbMessages.append(basePath + "当前文件夹下面内容已经处理完成\r\n");
            isRunning = false;

        }
    }

    /**
     * 得到需要转换的文件的列表
     * 
     * @param base     起始路径
     */
    public List<String> findFilesToConvert(String base) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sbMessages.append(sdf.format(new Date()) + ":" + base + "文件搜索开始\r\n");
        List<File> files = new ArrayList<File>();
        List<String> filesToConvert = new ArrayList<String>();
        listAllVideoFile(new File(base), files);
        for (File f : files) {
            filesToConvert.add(f.getAbsolutePath());
            sbMessages.append(sdf.format(new Date()) + ":" + f.getAbsolutePath() + "加入清单\r\n");

        }
        sbMessages.append(sdf.format(new Date()) + ":" + base + "文件搜索结束,共找到需要转换文件" + filesToConvert.size() + "个\r\n");
        return filesToConvert;

    }

    /**
     * 将一个视频文件转化为对应的mp4格式
     * @param filepath 要转的文件的绝对路径
     */
    public void convertAllOthersToMp4(String filepath) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (filepath == null) {
            return;
        }
        if (filepath.toLowerCase().endsWith(".mp4")) {
            sbMessages.append("************" + sdf.format(new Date()) + ":" + filepath + "是mp4文件,跳过转换。\r\n");
            return;
        }

        sbMessages.append("************" + sdf.format(new Date()) + ":" + filepath + "转换开始\r\n");
        String path = filepath.substring(0, filepath.lastIndexOf('.')) + ".mp4";
        byte[] buff = new byte[4096];

        try {
            String cmd = ffmpegPath + " -y -i \"" + filepath + "\" \"" + path + "\"";
            Process process = Runtime.getRuntime().exec(cmd);
            InputStream inputStream = process.getInputStream();

            InputStream errorStream = process.getErrorStream();
            while (process.isAlive()) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                }
                int len = inputStream.available() > 0 ? inputStream.read(buff) : 0;
                if (len > 0) {
                    lastMessage = new String(buff, 0, len);
                }
                len = errorStream.available() > 0 ? errorStream.read(buff) : 0;
                if (len > 0) {
                    lastMessage = new String(buff, 0, len);
                }

            }
        } catch (IOException e) {
            sbMessages.append("************" + "转换文件:" + path + "执行失败:" + e.getMessage() + "\r\n");
        }
        sbMessages.append("************" + sdf.format(new Date()) + ":" + filepath + "转换开始" + "\r\n");

    }

    
    /**
     * 根据后缀名判断是不是视频文件
     * @param fileName 要判断的文件名
     * @return 是否为视频文件
     */
    public boolean isVideoFile(String fileName) {
        String[] videoExts = new String[] { "vob", "wmv", "avi", "rmvb", "mov", "rm" };
        for (String ext : videoExts) {
            if (fileName.endsWith(ext)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取指定文件夹下指定文件类型的所有文件的完整路径
     * 
     * @param parent 起始文件夹
     * @param files 存放数据的集合
     */
    public void listAllVideoFile(File parent, List<File> files) {

        File[] listFiles = parent.listFiles();
        if (listFiles != null) {
            for (File f : listFiles) {
                if (f.isFile() && isVideoFile(f.getName().toLowerCase())) {

                    files.add(f);
                } else {
                    listAllVideoFile(f, files);
                }
            }
        }
    }

    /**
     * 窗体
     * @author Administrator
     *
     */
    public class MainFrame extends JFrame {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        private JButton btnChooseRootDir;

        private JTextArea txtMessages;
        private JLabel lblMessage;

        private JTextField txtCurrentFile;
        private JLabel lblCurrentFile;

        private JTextField txtChoosenDir;
        private JLabel lblChoosenDir;

        private JButton btnOpenDir;

        private javax.swing.Timer timerDisplay;

        public MainFrame(FfmpegConvertUtil util) {
            
            //使用代码构建界面
            this.getRootPane().setLayout(new FlowLayout(FlowLayout.LEFT, 10, 5));
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);

            btnChooseRootDir = new JButton("           选择转换文件夹          ");
            btnChooseRootDir.setSize(200, 30);
            btnChooseRootDir.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    JFileChooser chooser = new JFileChooser();
                    chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
                    int result = chooser.showOpenDialog(MainFrame.this);
                    if (result == JFileChooser.APPROVE_OPTION) {
                        txtChoosenDir.setText(chooser.getSelectedFile().getAbsolutePath());
                        util.startProcess(txtChoosenDir.getText());
                    }

                }
            });

            btnOpenDir = new JButton("          打开文件夹          ");
            btnOpenDir.setSize(200, 30);
            btnOpenDir.addActionListener(new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    try {
                        Runtime.getRuntime().exec("explorer \"" + txtChoosenDir.getText() + "\"");
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }

                }
            });

            txtCurrentFile = new JTextField();
            txtCurrentFile.setColumns(80);
            txtCurrentFile.setFont(new Font("微软雅黑", Font.PLAIN, 16));

            JLabel lblTemp = new JLabel("                                                            "
                    + "                                                                               ");
            lblTemp.setFont(new Font("微软雅黑", Font.PLAIN, 16));

            lblCurrentFile = new JLabel("当前处理中文件");
            lblCurrentFile.setFont(new Font("微软雅黑", Font.PLAIN, 16));

            txtChoosenDir = new JTextField();
            txtChoosenDir.setColumns(80);
            txtChoosenDir.setFont(new Font("微软雅黑", Font.PLAIN, 16));
            lblChoosenDir = new JLabel("当前处理的文件夹");
            lblChoosenDir.setFont(new Font("微软雅黑", Font.PLAIN, 16));

            lblMessage = new JLabel("处理消息显示");
            lblMessage.setFont(new Font("微软雅黑", Font.PLAIN, 16));
            txtMessages = new JTextArea(30, 105);
            JScrollPane pane = new JScrollPane(txtMessages, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                    JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

            timerDisplay = new javax.swing.Timer(5000, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    if (isRunning) {
                        if (sbMessages.length() > 8096) {
                            sbMessages.delete(0, lastMessage.length());
                        }
                        if (lastMessage != null) {
                            sbMessages.append(lastMessage + "\r\n");
                            lastMessage = null;
                        }

                        txtCurrentFile.setText(currentFile);
                        txtMessages.setText(sbMessages.toString());
                    } else {

                    }

                }
            });
            timerDisplay.start();

            this.getRootPane().add(btnChooseRootDir);
            this.getRootPane().add(btnOpenDir);
            this.getRootPane().add(lblTemp);
            this.getRootPane().add(lblChoosenDir);
            this.getRootPane().add(txtChoosenDir);
            this.getRootPane().add(lblCurrentFile);
            this.getRootPane().add(txtCurrentFile);

            this.getRootPane().add(lblMessage);
            this.getRootPane().add(pane);

            this.setSize(1200, 800);
            this.setResizable(false);

            this.setVisible(true);
        }
    }

}

一张表总览西门子PLC硬件数据类型

关注公众号【自动化与工程技术】,获取更多自动化资讯!


<< < 1 2 3 4 5 6 > >>
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言