首页 文章 精选 留言 我的

精选列表

搜索[物理交互],共10005篇文章
优秀的个人博客,低调大师

openstack 之 控制节点物理机备份

由于生产环境的控制节点是单点,因此控制节点的备份工作至关重要。 控制节点备份主要包括两块,一块是配置文件的备份,一块是mysql数据库的备份。 1、数据库mysql的备份。对mysql进行全库备份,备份完成后将备份文件压缩打包传输到另外一台单独的备份服务器上: 备份openstack的mysql数据库并拷贝到192.168.8.66:/opt/backup/openstack_mysql/目录,其中192.168.8.66是备份服务器的IP地址,请根据实际情况调整。另外需要注意备份服务器的存储空间,选取比较大的文件系统存放,下面是备份脚本: 1 vim /backup/shell/backupmysql .sh #!/bin/bash backup_dir="/backup/mysql" filename="${backup_dir}/mysql-`hostname`-`eval date +%Y%m%d`.sql.gz" # Dump the entire MySQL database /usr/bin/mysqldump --opt --all-databases | gzip > $filename scp $filename 192.168.8.66:/opt/backup/openstack_mysql/ # Delete backups older than 7 days find $backup_dir -ctime +7 -type f -delete 加入定时程序: 1 crontab -e 0 0 * * * /backup/shell/backupmysql.sh &>/dev/null (注意,scp需要建立信任关系,在目的主机的authorized_keys中加入源主机的id_rsa_pub验证码) 2、备份openstack控制节点的的/etc目录: 1 vim /backup/shell/backup_etc .sh #!/bin/bash backup_dir="/backup/etc" filename="${backup_dir}/etc-`hostname`-`eval date +%Y%m%d`.gz" # Dump the entire MySQL database tar czf $filename /etc scp $filename 192.168.8.66:/opt/backup/openstack_files/ # Delete backups older than 7 days find $backup_dir -ctime +7 -type f -delete 由于控制节点的配置文件不会变更,因此,只需要备份最近一次修改后的etc目录即可。 本文转自yuweibing51CTO博客,原文链接:http://blog.51cto.com/yuweibing/1656455,如需转载请自行联系原作者

优秀的个人博客,低调大师

物理 AI 如何重构五类工业岗位

讨论人工智能与就业,最容易提出的问题是“哪些岗位会被替代”。但工业岗位很少是一项单独任务。设备运维工程师既要查看状态,也要进入现场确认;自动化与控制工程师既要编写逻辑,也要划定联锁、权限和回退条件;安全管理人员既要处理报警,也要在证据不完整时决定是否停工。人工智能可以吸收其中一部分任务,却不能自动接过整条责任链。

优秀的个人博客,低调大师

Java与Excel的交互!-

-1. Excel (POI) 1.1 导入poi报表需要的jar包 <poi.version>3.11</poi.version> <!-- <!-- Excel解析工具类 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi.version}</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>${poi.version}</version> </dependency> --> <!-- excel2003使用的包 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.11</version> </dependency> <!-- excel2007+使用的包 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.11</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.11</version> </dependency> 1.2.访问 $("#exportXlsBtn").click(function(){ // 下载效果 不能是ajax异步 <!-- $.ajax({ type: "GET", url: "/report/exportXls" }); --> location.href = "/excelInpost/downLoad?filename=运单模板表.xlsx"; }); 1.3 用法(页面) <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>运单批量导入</title> <!-- 导入jquery核心类库 --> <script type="text/javascript" src="../../js/jquery-1.8.3.js"></script> <!-- 导入easyui类库 --> <link rel="stylesheet" type="text/css" href="../../js/easyui/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="../../js/easyui/themes/icon.css"> <link rel="stylesheet" type="text/css" href="../../js/easyui/ext/portal.css"> <link rel="stylesheet" type="text/css" href="../../css/default.css"> <script type="text/javascript" src="../../js/easyui/jquery.easyui.min.js"></script> <script type="text/javascript" src="../../js/easyui/ext/jquery.portal.js"></script> <script type="text/javascript" src="../../js/easyui/ext/jquery.cookie.js"></script> <script src="../../js/easyui/locale/easyui-lang-zh_CN.js" type="text/javascript"></script> <script type="text/javascript" src="../../js/jquery.ocupload-1.1.2.js"></script> <script type="text/javascript"> $(function(){ $("#grid").datagrid({ url : '/wayBill/pageQuery', method:"GET", toolbar : [ { id : 'btn-download', text : '模板下载', iconCls : 'icon-save', handler : function(){ $.messager.confirm("提示","您确定下载模板吗?",function () { location.href = "/excelInpost/downLoad?filename=运单模板表.xlsx"; }) } },{ id : 'btn-upload', text : '批量导入', iconCls : 'icon-redo' },{ id : 'btn-refresh', text : '刷新', iconCls : 'icon-reload', handler : function(){ $("#grid").datagrid('reload'); } } ], columns : [[ { field : 'id', title : '编号', width : 120 , align : 'center' },{ field : 'goodsType', title : '产品', width : 120 , align : 'center' },{ field : 'sendProNum', title : '快递产品类型', width : 120 , align : 'center' },{ field : 'sendName', title : '发件人姓名', width : 120 , align : 'center' },{ field : 'sendMobile', title : '发件人电话', width : 120 , align : 'center' },{ field : 'sendAddress', title : '发件人地址', width : 120 , align : 'center' },{ field : 'recName', title : '收件人姓名', width : 120 , align : 'center' },{ field : 'recMobile', title : '收件人电话', width : 120 , align : 'center' },{ field : 'recCompany', title : '收件人公司', width : 120 , align : 'center' },{ field : 'recAddress', title : '收件人地址', width : 120 , align : 'center' } ]], pageList: [10,20,30], pagination : true, striped : true, singleSelect: true, rownumbers : true, fit : true // 占满容器 }); /*// 一键上传 $("#btn-upload").upload({ name: 'upload', // <input name="file" /> action: '/excelInpost/excelUp', // 提交请求action路径 enctype: 'multipart/form-data', // 编码格式 autoSubmit: true, // 选中文件提交表单 onComplete: function(response) { if(response=="success"){ $.messager.alert("提示信息","数据导入成功!","info"); $("#grid").datagrid("reload"); }else{ $.messager.alert("错误提示",response,"error"); } }// 请求完成时 调用函数 });*/ $("#btn-upload").upload({ action:"/excelInpost/excelUp", name:"myFile", onComplete:function () { $.messager.alert("提示信息","数据导入成功!","info"); $("#grid").datagrid("reload"); }, onSelect:function () { // 如果文件名字不符合要求,就阻止提交, // 1 关闭默认的自动提交 this.autoSubmit = false; // 2 获取文件名 var filename = this.filename(); // 3 正则表达式校验 // . 1个换行符意外的任意字符 // * 0-n个任意字符 // \. 标识. // (a|b) 只能出现a或者b var regex = /^.*\.(xls|xlsx)$/; // 校验 if (regex.test(filename)) { // 手动提交 this.submit(); }else{ // 不符合规则,不提交,给出提醒 $.messager.alert("提示","请选择xls或者xlsx结尾的文件") } } }) }); </script> </head> <body class="easyui-layout"> <div region="center"> <table id="grid"></table> </div> </body> </html> 1.4 用法(后台) --->自定义模板下载 /** * 模板下载 * @param filename 文件名 * @return * @throws Exception */ @GetMapping("/downLoad") public ResponseEntity<String> downLoadExcel(String filename) throws Exception { System.out.println(filename+"-------------------------------------------------------"); /** * 查找数据之后,下面只需要将内容写进xls中,然后下载 */ //1 创建工作簿 Workbook wb = new XSSFWorkbook(); //2 创建工作表 Sheet sheet = wb.createSheet(); /** * 定义公共变量 */ int rowNo=0,cellNo=0;//行号 和 列号 Row nRow = null;// 行对象通用变量 Cell nCell = null;// 单元格对象通用变量 /****************大标题打印****************/ //3 创建行 nRow = sheet.createRow(rowNo); // 设置行高 nRow.setHeightInPoints(36); //4 创建单元格 nCell = nRow.createCell(cellNo); //5 设置内容 nCell.setCellValue("运单数据"); //6 设置内容格式 // 合并单元格 //参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列 sheet.addMergedRegion(new CellRangeAddress(0, 0, (short) 0, (short) 9)); // 样式 CellStyle bigTitleCellStyle = bigTitleStyle(wb); nCell.setCellStyle(bigTitleCellStyle); rowNo++; nRow = sheet.createRow(rowNo); //小标题 String[] titles={"编号","产品","快递产品类型","发件人姓名","发件人电话","发件人地址","收件人姓名","收件人电话","收件人公司","收件人地址"}; for (int i = 0;i<titles.length;i++){ String title = titles[i]; //4 创建单元格 nCell = nRow.createCell(cellNo++);// 先创建单元格,然后在新增 //5 设置内容 nCell.setCellValue(title); //6 设置内容格式 nCell.setCellStyle(titleStyle(wb)); //设置列宽 -->自动 sheet.autoSizeColumn(i); sheet.setColumnWidth(i,sheet.getColumnWidth(i)*17/10); } //下载 DownloadUtil downloadUtil = new DownloadUtil(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); wb.write(byteArrayOutputStream); downloadUtil.download(byteArrayOutputStream,response,filename); return new ResponseEntity<>(HttpStatus.OK); } 1.5 上传导入 /** * 导入 * @return */ @RequestMapping("/excelUp") public ResponseEntity<Void> batchImport(@RequestParam("myFile") MultipartFile file){ try { // 1.1 获取文件名 String originalFilename = file.getOriginalFilename();// 文件名 String name = file.getName();//此名字对应<input> 文本框的name属性的值 // 1.2 设置保存的path String path = "d:\\"+ UUID.randomUUID().toString()+originalFilename; // 1.3 创建File--path File myFile = new File(path); // 1.4 复制 file.transferTo(myFile); // 解析xls,将数据存入数据库 // 2 创建Workbook // 2.1 创建输入流 FileInputStream is = new FileInputStream(myFile); // InputStream is = file.getInputStream(); // 2.2 创建Workbook Workbook wb = new XSSFWorkbook(is); // 3 获取Sheet Sheet sheet = wb.getSheetAt(0); // 定义List集合存放数据,最后一次性保存 List<WayBill> list = new ArrayList<>(); // 4 获取row for(Row row:sheet){ // 5 获取单元格数据 // 跳过第一行 if(row.getRowNum()==0 || row.getRowNum()==1){ continue; } // 如果第一列为空,整条数据都不读取 if(row.getCell(0)==null || (int) row.getCell(0).getNumericCellValue()==0){ continue; } WayBill wayBill = new WayBill(); //编号 int value0 = (int) row.getCell(0).getNumericCellValue(); wayBill.setId(value0); //产品 wayBill.setGoodsType(row.getCell(1).getStringCellValue()); //快递产品类型 wayBill.setSendProNum(row.getCell(2).getStringCellValue()); //发件人姓名 wayBill.setSendName(row.getCell(3).getStringCellValue()); //发件人电话 String value4 =""+ (int) row.getCell(4).getNumericCellValue(); wayBill.setSendMobile(value4); //发件人地址 wayBill.setSendAddress(row.getCell(5).getStringCellValue()); //收件人姓名 wayBill.setRecName(row.getCell(6).getStringCellValue()); //收件人电话 wayBill.setRecMobile(""+ (int) row.getCell(7).getNumericCellValue()); //收件人公司 wayBill.setRecCompany(row.getCell(8).getStringCellValue()); //收件人地址 wayBill.setRecAddress(row.getCell(9).getStringCellValue()); list.add(wayBill); } // 6 保存至数据库 wayBillService.saveWayBillAll(list); }catch (Exception e){ e.printStackTrace(); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } return new ResponseEntity<>(HttpStatus.OK); } public CellStyle bigTitleStyle(Workbook wb){ // 创建格式 CellStyle cellStyle = wb.createCellStyle(); // 水平对齐方式 cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 垂直居中 cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); // 设置字体 Font font = wb.createFont(); // 是数值的1/20 大小 font.setFontHeight((short) 480); font.setBold(true); font.setColor(Font.COLOR_RED); cellStyle.setFont(font); return cellStyle; } public CellStyle titleStyle(Workbook wb){ CellStyle cellStyle = wb.createCellStyle(); cellStyle.setBorderTop(CellStyle.BORDER_THIN); cellStyle.setBorderRight(CellStyle.BORDER_THIN); cellStyle.setBorderBottom(CellStyle.BORDER_THIN); cellStyle.setBorderLeft(CellStyle.BORDER_THIN); Font font = wb.createFont(); font.setFontHeight((short)300); cellStyle.setFont(font); return cellStyle; }

优秀的个人博客,低调大师

Android 与 WebView 数据交互

1. 创建Android 项目 打开Android Studio 创建一个空的Android项目 打开Android虚拟机,这里使用的是Genymotion 2. 添加webview 清空layout内容,添加WebView控件 <WebView android:id="@+id/web" android:layout_width="match_parent" android:layout_height="match_parent"/> 在MainActivity中创建引入webview @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView mweb = findViewById(R.id.web); mweb.loadUrl("http://www.baidu.com"); } 此时运行项目,发现android安装成功,webview也可以打开,但是页面请求失败,需要给APP添加联网权限。在AndroidManifest.xml的manifest标签内添加 <uses-permission android:name="android.permission.INTERNET"/> 此时运行项目,发现webview可以打开并且百度页面可以访问了,但是仔细发现webview并不是在自己的APP上打开的,而是弹出系统浏览器。因为webview只是载体,内容的渲染需要使用webviewChromClient类去实现此时需要setWebViewClient ... WebView mweb = findViewById(R.id.web); mweb.setWebViewClient(new WebViewClient()); mweb.loadUrl("http://www.baidu.com"); ... 运行APP后可以看到webview已经差不多是我们想要的了 3. 设置JavaScript可执行 仔细看会发现,通过上面步骤打开的百度首页跟我们平时看到的广告页面不一样,原因是WebView默认禁止了JS的执行。这也是我觉得百度首页做的比较好的地方,在无JS环境下仍可提供服务。 添加setJavaScriptEnabled ... mweb.setWebViewClient(new WebViewClient()); mweb.getSettings().setJavaScriptEnabled(true); mweb.loadUrl("http://www.baidu.com"); ... 此时再打开页面,就会发现广告出来了,并且页面很卡。 4. WebView 调用 Android 方法 1. 使用addJavascriptInterface 添加JS接口创建JavaScriptInterFace.java类,用来写JS调用方法 package com.test.myapplication; import android.util.Log; import android.webkit.JavascriptInterface; public class JavaScriptInterFace { @JavascriptInterface public String getValue(String name) { Log.d("tagee", "getValue:" + name); return "call back"; } } 因为安全问题,在Android4.2中JS只能访问带有 @JavascriptInterface注解的Java函数。 addJavascriptInterface注入 ... mweb.setWebViewClient(new WebViewClient()); mweb.getSettings().setJavaScriptEnabled(true); mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge"); // JSBridge 为 webview 中调用的对象名称 mweb.loadUrl("http://www.baidu.com"); ... 加载本地 html 文件 在app/src/main目录下面创建目录assets并新建a.html文件,写入如下代码 <!doctype html> <html lang="en"> <head></head> <body> <h1 id="h1">123</h1> <script> if(window.JSBridge){ alert(JSBridge.getValue('from JS')); } </script> </body> </html> 修改webview的loadUrl参数 mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge"); mweb.loadUrl("file:///android_asset/a.html"); 此时重新build,可以看到Logcat打印出from JS,并且页面弹窗。 2.通过loadUrl() loadUrl可以执行JavaScript代码,他有如下特征: 1. 调用`loadUrl`会刷新页面 2. 当参数为要执行的JS代码时,要有document对象,至少得load一个空白页,否则会失效 3. 若返回值为非空字符串,则会将返回值替换页面原本的内容 4. 可以调用html中的js代码,但需要在`onPageFinished`回调之后才能调用,并且注意第三点的影响,防止返回字符串替换文档 如: ... mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge"); mweb.loadUrl("javascript:aler(123)"); //因当前webview没用加载任何页面,脚本无效 ... mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge"); mweb.loadUrl("file:///android_asset/a.html"); mweb.loadUrl("javascript:'123'"); //此时页面被替换成123 protected void onCreate(Bundle savedInstanceState) { ... mweb.addJavascriptInterface(new JavaScriptInterFace(), "JSBridge"); mweb.setWebViewClient(new mWebViewClient()); mweb.loadUrl("file:///android_asset/a.html"); } ... private class mWebViewClient extends WebViewClient{ @Override public void onPageFinished(WebView view, String url) { view.loadUrl("javascript:callJS()");//callJS为a.html中定义的方法 super.onPageFinished(view, url); } } 实际使用时,Android更多的是调用远程JS代码,即将加载的JS代码路径改成url即可。或则直接拼接JS代码时也会放在闭包中执行,防止替换页面内容。 3. 通过evaluateJavascript() 如果是Android4.4后,推荐使用evaluateJavascript,比loadUrl效率更高,并且不会刷新页面。evaluateJavascript有两个参数,第一个为脚本内容,第二个则是脚本的执行结果。在onPageFinished调用: view.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { Log.d("tagee", value); } }); 4. 通过shouldOverrideUrlLoading() shouldOverrideUrlLoading是WebViewClient对象的一个"生命周期",用拦截URL的请求,监听网页地址的变化,返回ture或false来决定webview是否加载URL。 1. 若没有设置 WebViewClient 则由系统(Activity Manager)处理该 url,通常是使用浏览器打开或弹出浏览器选择对话框,即出现上文2.4的情况。 2. 若设置 WebViewClient 且该方法返回 true ,则说明由应用的代码处理该 url,WebView不跳转。 3. 若设置 WebViewClient 且该方法返回 false,则说明由 WebView 处理该 url,即用 WebView 加载该 url。 private class mWebViewClient extends WebViewClient{ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //此处可以解析url进行处理, //也可以直接调用view.loadUrl(url); 在当前的webview中跳转到新的url //若前端直接location.href="js://web?param1=123&param2=asd" Uri uri = Uri.parse(url); if ( uri.getScheme().equals("js")) { //可以在此处获取页面请求数据并处理 //或则直接跳转activity等 return true; } return false; } } 值得一提的是以前一直有一个误区,以为使用一个不可见的iframe标签,再动态改变其src也可以捕捉url变化达到传值的目的。测试过不可行,包括默认写入和动态创建iframe 4. 通过onJsAlert()、onJsConfirm()、onJsPrompt() 原理和上面一条一样,通过监听页面的弹窗事件,达到传值的目的,不细说了。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册