安卓手机OTG无法写入文件解决方法

解决方法:将移动设备用DiskGenius格式化成FAT32即可。本机MIUI使用NTFS格式只能读取无法写入,并且播放大视频拖动进度条时需要缓存时间,改成FAT32后播放视频可以随时拖动。手机自带文件管理器无法识别OTG,可以尝试使用ES文件管理器。

EasyExcel的简单使用

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 github地址:https://github.com/alibaba/easyexcel依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.17</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.7</version> </dependency>若是使用jar包方式请下载:https://hik.lanzous.com/i1qEtk5mvzi使用官方文档:https://www.yuque.com/easyexcel/doc/easyexcel一般操作官网都有,下列介绍不创建对象方式创建Excel,并且自定义列宽、单元格对齐方式。示例为导出表格其中代码设置样式参考:https://www.yuque.com/easyexcel/doc/write#W4u1e示例 response.reset(); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1")); ServletOutputStream out = response.getOutputStream(); // 头的策略 WriteCellStyle headWriteCellStyle = new WriteCellStyle(); // 内容的策略 WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现 HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); EasyExcel.write(out).registerConverter(new TimestampCovert()) .registerWriteHandler(horizontalCellStyleStrategy) .registerWriteHandler(new FixedColumnWidthStyleStrategy()) .head(Utils.toTead(titles)) .sheet("sheet1").doWrite(list); out.flush();Converter由于表格数据list来自数据库,包含Timestamp类型数据,因此这里需要自己写了个转换器:import com.alibaba.excel.converters.Converter;import com.alibaba.excel.enums.CellDataTypeEnum;import com.alibaba.excel.metadata.CellData;import com.alibaba.excel.metadata.GlobalConfiguration;import com.alibaba.excel.metadata.property.ExcelContentProperty;import java.sql.Timestamp;import java.text.SimpleDateFormat;public class TimestampCovert implements Converter<Timestamp> { @Override public Class supportJavaTypeKey() { return Timestamp.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } @Override public Timestamp convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { return Timestamp.valueOf(cellData.getStringValue()); } @Override public CellData convertToExcelData(Timestamp timestamp, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception { return new CellData<>(new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(timestamp)); }}详细可参考:https://blog.csdn.net/fsadkjl/article/details/105823830WriteHandler示例代码中使用了样式的与列宽的Handler,FixedColumnWidthStyleStrategy继承了AbstractColumnWidthStyleStrategy,代码如下:import com.alibaba.excel.metadata.CellData;import com.alibaba.excel.metadata.Head;import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;import org.apache.poi.ss.usermodel.Cell;import java.util.List;public class FixedColumnWidthStyleStrategy extends AbstractColumnWidthStyleStrategy { private int columnWidth = 23; @Override protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) { writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256); } public FixedColumnWidthStyleStrategy() { } public FixedColumnWidthStyleStrategy(int columnWidth) { this.columnWidth = columnWidth; }}headhead设置头信息,由于head是一个List<List<String>>集合,这里封装成方法,传表头集合进去生成合适的表头类型。 public static List<List<String>> toTead(List<String> titles) { List<List<String>> list = new ArrayList<List<String>>(); List<String> head = new ArrayList<String>(); for (String title : titles) { head.add(title); list.add(head); head = new ArrayList<String>(); } return list; }筛选列导出可以根据传入的需要显示的字段titles动态改变sql获取数据,若查出所有字段的话筛选如下: /** * 设置表格信息 * @param dataList 查询出的数据 * @param titles 需要显示的字段 * @return */ private static List<List<Object>> dataList(List<Object> dataList, List<String> titles) { List<List<Object>> list = new ArrayList<>(); for (Object person : dataList) { List<Object> data = new ArrayList<>(); for (String fieldName : titles) { /**通过反射根据需要显示的字段,获取对应的属性值*/ data.add(getFieldValue(fieldName, person)); } list.add(data); } return list; } /** * 根据传入的字段获取对应的get方法,如name,对应的getName方法 * @param fieldName 字段名 * @param person 对象 * @return */ private static Object getFieldValue(String fieldName, Object person) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + fieldName.substring(1); Method method = person.getClass().getMethod(getter); return method.invoke(person); } catch (Exception e) { logger.error("使用反射获取对象属性值失败", e); return null; } }参考:https://my.oschina.net/zjiamin/blog/4710076

VeraCrypt开源硬盘加密工具

VeraCrypt 是 TrueCrypt 的分支,于2013年6月发布,项目的主要开发者是来自法国的安全顾问 Mounir Idrassi 。Idrassi 创建 VeraCrypt 分支的动机是在 2012 年他被要求在客户产品中整合 TrueCrypt,他评估了 TrueCrypt代码后发现它存在一些问题,TrueCrypt 的主要弱点是不能防御暴力破解攻击。在加密系统分区时,TrueCrypt 使用 PBKDF2-RIPEMD160 算法进行 1000 次迭代;对于标准容器和非系统分区,TrueCrypt 最多迭代 2000 次。相比之下,VeraCrypt 使用 PBKDF2-RIPEMD160 算法对系统分区迭代 327,661 次,对于标准容器和非系统分区,迭代次数进一步增加到 655,331 次,大幅增加暴力破解难度。结果是,VeraCrypt 打开加密分区的速度略慢,而它的加密格式也不兼容于 TrueCrypt。另一个 TrueCrypt 分支 CipherShed 项目则努力兼容 TrueCrypt 加密格式。(以上介绍内容来自 Solidot)。可以说VeraCrypt 是 TrueCrypt停止维护的一个替代品,其官网:https://www.veracrypt.fr/en/Home.html支持windows、mac、linux平台还是挺不错的,不过加载速度不如windows的bitlocker,但是可以多平台使用,各有优劣吧。另兼容 TrueCrypt 的 CipherShed 官网:https://www.ciphershed.org/

Windows创建VHD加密盘、制作加密U盘教程

本来想下载百度上推荐的加密工具TrueCrypt,但是下载后打开,它弹窗说我电脑不是XP,说TrueCrypt项目早停止了,建议我用VHD跟BitLocker,于是我就一步一个脚印来设置VHD:1、win10用户快捷键windows+X键打开菜单,按K键打开磁盘管理2、点击操作->创建VHD3、在弹窗上选择位置,文件名随意例如4、我选择创建1G的盘,大小随意,点确定即可创建成功5、出现个新磁盘,带向下箭头的,点击它鼠标右键再点击初始化磁盘,分区格式随意,一般默认即可6、初始化后出现个未分配的磁盘,咱右键新建简单卷即可,后面的无脑下一步就好了,记得选择个合适的驱动号,例如我选择的驱动号是V,好了现在资源管理器出现了这个新磁盘7、我们右键它选择启用BitLocker8、输入密码后下一步,并将可以找回密码的凭证保存,最后一步若要用在U盘上使用 兼容模式 加密即可9、创建好了如图,不想用时可以跟U盘一样随时右键弹出10、使用时直接双击加密盘文件打开,会报错无法装载说要解锁,此时点击win10下边通知在弹窗中输入密码即可,如果这个密码框无意按没了,可以Windows+E打开资源管理器,点磁盘图标同样会出现密码框。以后vhd文件可以作为你的加密磁盘随时移动,可以移动到U盘、移动硬盘甚至备份到网盘。当然,其实你也可以给整个U盘进行bitlocker而不需要创建VHD,依据个人喜好使用吧!

Windows创建VHD加密盘、制作加密U盘教程

安卓MacroDroid充电语音提醒脚本

充电、拔掉电源、充满电都会有语音提醒,并且拔掉电源跟充满电会提示耗时多少充进去多少电。脚本如下,下载解压,文件管理器以MacroDroid打开方式打开即可。脚本下载:https://hik.lanzous.com/iu045jwwlwb

MacroDroid Pro v5.8.4安卓版下载

这是一款十分强大的安卓自动任务软件,可以自行设置出发条件及执行事件,在此之前也写过几个帖子。操作比tasker更简易。下载地址:https://hik.lanzous.com/ixP8Jjwtgij

在线证件照扣图网站稿定扣图

https://koutu.gaoding.com/

pycharm安装依赖包过慢解决方法

简单,在terminal中输入如下命令即可,例如安装requests:pip3 install requests -i http://pypi.douban.com/simple --trusted-host pypi.douban.com其他国内源参看:https://cway.top/post/831.html

java selenium webdriver无头模式参数设置

java webdriver无头模式参数设置Chrome设置mac linux需浏览器59版本以上,windows 60版本以上 ChromeOptions options = new ChromeOptions();// 设置 chrome 的无头模式 options.addArguments("--headless"); options.addArguments("--no-sandbox"); options.addArguments("--disable-gpu"); options.addArguments("--disable-dev-shm-usage"); WebDriver driver = new ChromeDriver(options);selenium add_argument 参数表https://peter.sh/experiments/chromium-command-line-switches/chrome_options.add_argument('--user-agent=""') # 设置请求头的User-Agentchrome_options.add_argument('--window-size=1280x1024') # 设置浏览器分辨率(窗口大小)chrome_options.add_argument('--start-maximized') # 最大化运行(全屏窗口),不设置,取元素会报错chrome_options.add_argument('--disable-infobars') # 禁用浏览器正在被自动化程序控制的提示chrome_options.add_argument('--incognito') # 隐身模式(无痕模式)chrome_options.add_argument('--hide-scrollbars') # 隐藏滚动条, 应对一些特殊页面chrome_options.add_argument('--disable-javascript') # 禁用javascriptchrome_options.add_argument('--blink-settings=imagesEnabled=false') # 不加载图片, 提升速度chrome_options.add_argument('--headless') # 浏览器不提供可视化页面chrome_options.add_argument('--ignore-certificate-errors') # 禁用扩展插件并实现窗口最大化chrome_options.add_argument('--disable-gpu') # 禁用GPU加速chrome_options.add_argument('–disable-software-rasterizer')chrome_options.add_argument('--disable-extensions')chrome_options.add_argument('--start-maximized')参考:https://blog.csdn.net/weixin_43968923/article/details/87899762火狐设置 FirefoxOptions options1 = new FirefoxOptions(); options1.addArguments("-headless");

Java selenium+webdriver使用教程

java selenium+webdriver使用教程webdriver驱动下载Chrome:http://npm.taobao.org/mirrors/chromedriver/https://chromedriver.storage.googleapis.com/index.htmlFirefox:https://github.com/mozilla/geckodriver/releases所需依赖只需要selenium-server依赖即可 <dependencies><!-- <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-api</artifactId> <version>3.141.59</version> </dependency>--> <!--或者用注释的坐标亦可--> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-server</artifactId> <version>3.141.59</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> </dependency> </dependencies>示例代码以下是模拟打开本站登陆页面,各位可使用Katalon Recorder浏览器插件自动生成代码,也可以参考下之前的一个示例 public static void main(String[] args) throws InterruptedException { System.setProperty("webdriver.chrome.driver", "C:\\Users\\Administrator\\Downloads\\chromedriver_win32\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().deleteAllCookies(); // 与浏览器同步非常重要,必须等待浏览器加载完毕 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://cway.top"); Thread.sleep(2000); driver.findElement(By.linkText("登录后台")).click(); Thread.sleep(2000); driver.quit(); driver.close(); }其他操作打开各种浏览器//IE浏览器System.setProperty("webdriver.ie.driver", ".\\Tools\\IEDriverServer.exe");WebDriver driver = new InternetExplorerDriver();//ChromeSystem.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");WebDriver driver = new ChromeDriver();//FireFox(自定义安装)System.setProperty("webdriver.firefox.bin", "D:\\ProgramFiles\\Mozilla Firefox\\firefox.exe");//FireFox版本大于48,默认安装System.setProperty("webdriver.firefox.marionette", ".\\Tools\\geckodriver.exe");//FireFox版本小于48System.setProperty("webdriver.firefox.marionette", ".\\Tools\\geckodriver.exe");WebDriver driver = new FirefoxDriver();亦可用ChromeDriverService类构建驱动String webDriverPath = LagouSpider.class.getResource("chromedriver.exe").getPath(); // 这里需要注意一定要和打开的Chrome版本匹配 System.setProperty("webdriver.chrome.driver", webDriverPath); // 构建驱动 ChromeDriverService service = new ChromeDriverService.Builder(). usingDriverExecutable(new File(webDriverPath)).usingAnyFreePort().build(); try { service.start(); } catch (IOException e) { e.printStackTrace(); } // 获取Web驱动 WebDriver driver = new RemoteWebDriver(service.getUrl(), DesiredCapabilities.chrome());只是最后要关闭service // 退出驱动线程 driver.quit(); // 关闭service服务 service.stop();打开URL// 后退,跳转到上一页driver.navigate().back();// 前进,跳转到下一页driver.navigate().forward ();// 当前页刷新driver.navigate().refresh();// 浏览器窗口最大driver.manage().window().maximize();// 自定义设置浏览器尺寸driver.manage().window().setSize(new Dimension(width, heigth));关闭浏览器// 关闭当前页面driver.close(); // 关闭由selenium所启动的所有页面driver.quit();返回当前页标题与URL // 返回当前页面的Ttile String title = driver.getTitle(); // 返回当前页面的url String currentUrl = driver.getCurrentUrl();其它常见方法// 返回当前的浏览器的窗口句柄 String currentWindowHandle = driver.getWindowHandle() // 返回当前的浏览器的所有窗口句柄 Set<String> allWindowHandles = driver.getWindowHandles(); // 返回当前页面的源码 String currentPageSource = getPageSource() // 通过xpath获取元素 使用By还可以通过其他条件获取 WebElement titleElement = driver.findElement(By.xpath(titleExpression)); //获取文本 String titleElementText = titleElement.getText(); //获取属性 String titleElementHref = titleElement.getAttribute("href");参考:https://www.cnblogs.com/andrew209/archive/2004/01/13/9011399.html