首页 文章 精选 留言 我的

精选列表

搜索[安全],共10000篇文章
优秀的个人博客,低调大师

Coreboot 4.11 发布,快速、安全、灵活的开源固件

coreboot 项目发布了最新的 4.11 版本,此次发行周期比以往要短一些。该版本包含自 4.10 版本依赖超过 130 位开发者提交到 1630 个新的提交。其中有 30 位是 coreboot 首次贡献者。 此次版本主要包含几方面的更新: 代码清理 增强对 Intel 设备的支持,包括Kaby Lake 和 Cannon Lake 驱动;ARM Mediatek 8173 支持以及一些老的芯片支持 vboot 提升 新增 25 个主板支持包括如下列表: 新增主板支持列表: AMD PADMELON ASUS P5QL-EM EMULATION QEMU-AARCH64 GOOGLE AKEMI GOOGLE ARCADA CML GOOGLE DAMU GOOGLE DOOD GOOGLE DRALLION GOOGLE DRATINI GOOGLE JACUZZI GOOGLE JUNIPER GOOGLE KAKADU GOOGLE KAPPA GOOGLE PUFF GOOGLE SARIEN CML GOOGLE TREEYA GOOGLE TROGDOR LENOVO R60 LENOVO T410 LENOVO THINKPAD T440P LENOVO X301 RAZER BLADE-STEALTH KBL SIEMENS MC-APL6 SUPERMICRO X11SSH-TF SUPERMICRO X11SSM-F 完整的发行说明请看https://blogs.coreboot.org/blog/2019/11/19/announcing-coreboot-4-11/

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

使用 GPG 签名 Git 提交,让它安全可信

用过 Git 的人应该知道,Git 提交的用户名和邮箱通过 git config 设置的。 一般都会设置成自己的用户名和邮箱,但也可以随意设置。 也就意味着,任何人都可以以你的名义进行提交。 那么如何确保你的提交的可信度,证明它来自真正的你,而不是别人呢? 这里就可以通过使用 GPG 签名你的提交,然后通过 GPG 对它进行验证。 GitHub 支持使用 GPG 签名提交和标签。 GitLab 自 9.5 版本开始,也支持使用 GPG 签名提交了(目前尚不支持 GPG 验证标签)。 Gitee(码云)也支持使用 GPG 签名提交。 下面在 GitLab 12.3.5 及MacOS 环境下进行实际操作。 GitLab 是如何处理 GPG 呢? GitLab使用自己的密钥环来验证 GPG 签名。它不访问任何公钥服务器。 对于要由 GitLab 验证的提交: 提交者必须具有 GPG 公钥/私钥对。 提交者的公钥必须已上传到其 GitLab 帐户。 GPG 密钥中的一封电子邮件必须与提交者在 GitLab 中使用的经过验证的电子邮件地址匹配。 提交者的电子邮件地址必须与 GPG 密钥中验证的电子邮件地址匹配。 生成 GPG 密钥并上传 GPG key 到 GitLab 1、安装 GPG,MacOS 环境下可以使用 brew 安装 gpg: brew install gpg 2、用以下命令生成 GPG key。 它是一个交互式命令,会要求你选择使用哪种算法、密钥长度,指定密钥的有效期,输入你的真实姓名以及电子邮件等: 注意:该电子邮件必须与你 GitLab 中所使用的电子邮件相匹配。 gpg --gem-key 3、使用以下命令列出您刚刚创建的私密 GPG 密钥: gpg --list-secret-keys --keyid-format LONG <your_email> # 这里是 admin@example.com 4、复制以 sec 开头的 GPG 密钥 ID。以下示例中,它是 66DD4800155F7A2B secrsa2048/66DD4800155F7A2B 2019-10-31 [SC] [有效至:2021-10-30] 39033F321A83635ECD7FC8DA66DD4800155F7A2B uid[ 绝对 ] admin <admin@example.com> ssbrsa2048/53DD9CB77C862573 2019-10-31 [E] [有效至:2021-10-30] 5、导出该 ID 的公钥: gpg --armor --export pub66DD4800155F7A2B 6、复制公钥并将其添加到 GitLab 个人资料的设置中。 Gitlab 页面右上角,单击你的头像,Settings—> GPG keys,然后粘贴 GPG key。 将 GPG 密钥与 Git 关联 git config --global user.signingkey66DD4800155F7A2B # 或者 git config user.signingkey66DD4800155F7A2B 签名提交 1、Git 提交时,使用 -S 标记进行 GPG 签名: git commit -S -m“commit message" 2、此外,Git 可以设置默认使用 GPG 签名提交: git config --globalcommit.gpgsign true # 或者 git config commit.gpgsign true 在 GitLab 验证提交 1、在 GitLab 提交选项卡,签名的提交将显示包含“ Verified”或“ Unverified”的徽章,具体取决于 GPG 签名的验证状态。 2、通过单击 GPG 徽章,将显示签名的详细信息。 撤销(revoke)或删除 GPG key 此外,还可以撤销(revoke)或删除 GPG key。 它们不同之处在于: 撤销密钥将取消验证已签名的提交,通过使用此密钥验证的提交将变为未验证状态。如果你的密钥已被盗用,则应使用此操作。 删除密钥不会取消验证已签名的提交。使用此密钥验证的提交将保持验证状态。 在 Git 中通过命令行验证相关提交的签名 $ git log --show-signature -1 commit 374010d1af1de40fdf8f1f6f5cca0c0c60e4fe9d (HEAD -> master, origin/master, origin/HEAD) gpg: 签名建立于 四 10/31 11:24:16 2019 CST gpg: 使用 RSA 密钥 39033F321A83635ECD7FC8DA66DD4800155F7A2B gpg: 完好的签名,来自于 “admin <admin@example.com>” [绝对] Author: admin <admin@example.com> Date: Thu Oct 31 11:24:16 2019 +0800 update README.md

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

如何快速安全的插入千万条数据

前言 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库。 思路 1.估算文件大小 因为告诉文件有千万条,同时每条记录大概在20个字段左右,所以可以大致估算一下整个订单文件的大小,方法也很简单使用FileWriter往文件中插入一千万条数据,查看文件大小,经测试大概在1.5G左右; 2.如何批量插入 由上可知文件比较大,一次性读取内存肯定不行,方法是每次从当前订单文件中截取一部分数据,然后进行批量插入,如何批次插入可以使用insert(...)values(...),(...)的方式,经测试这种方式效率还是挺高的; 3.数据的完整性 截取数据的时候需要注意,需要保证数据的完整性,每条记录最后都是一个换行符,需要根据这个标识保证每次截取都是整条数,不要出现半条数据这种情况; 4.数据库是否支持批次数据 因为需要进行批次数据的插入,数据库是否支持大量数据写入,比如这边使用的mysql,可以通过设置max_allowed_packet来保证批次提交的数据量; 5.中途出错的情况 因为是大文件解析,如果中途出现错误,比如数据刚好插入到900w的时候,数据库连接失败,这种情况不可能重新来插一遍,所有需要记录每次插入数据的位置,并且需要保证和批次插入的数据在同一个事务中,这样恢复之后可以从记录的位置开始继续插入。 实现 1.准备数据表 这里需要准备两张表分别是:订单状态位置信息表,订单表; CREATE TABLE `file_analysis` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `file_type` varchar(255) NOT NULL COMMENT '文件类型 01:类型1,02:类型2', `file_name` varchar(255) NOT NULL COMMENT '文件名称', `file_path` varchar(255) NOT NULL COMMENT '文件路径', `status` varchar(255) NOT NULL COMMENT '文件状态 0初始化;1成功;2失败:3处理中', `position` bigint(20) NOT NULL COMMENT '上一次处理完成的位置', `crt_time` datetime NOT NULL COMMENT '创建时间', `upd_time` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 CREATE TABLE `file_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `file_id` bigint(20) DEFAULT NULL, `field1` varchar(255) DEFAULT NULL, `field2` varchar(255) DEFAULT NULL, `field3` varchar(255) DEFAULT NULL, `field4` varchar(255) DEFAULT NULL, `field5` varchar(255) DEFAULT NULL, `field6` varchar(255) DEFAULT NULL, `field7` varchar(255) DEFAULT NULL, `field8` varchar(255) DEFAULT NULL, `field9` varchar(255) DEFAULT NULL, `field10` varchar(255) DEFAULT NULL, `field11` varchar(255) DEFAULT NULL, `field12` varchar(255) DEFAULT NULL, `field13` varchar(255) DEFAULT NULL, `field14` varchar(255) DEFAULT NULL, `field15` varchar(255) DEFAULT NULL, `field16` varchar(255) DEFAULT NULL, `field17` varchar(255) DEFAULT NULL, `field18` varchar(255) DEFAULT NULL, `crt_time` datetime NOT NULL COMMENT '创建时间', `upd_time` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10000024 DEFAULT CHARSET=utf8 2.配置数据库包大小 mysql> show VARIABLES like '%max_allowed_packet%'; +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | max_allowed_packet | 1048576 | | slave_max_allowed_packet | 1073741824 | +--------------------------+------------+ 2 rows in set mysql> set global max_allowed_packet = 1024*1024*10; Query OK, 0 rows affected 通过设置max_allowed_packet,保证数据库能够接收批次插入的数据包大小;不然会出现如下错误: Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4980577 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable. at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3915) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2598) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2834) 3.准备测试数据 public static void main(String[] args) throws IOException { FileWriter out = new FileWriter(new File("D://xxxxxxx//orders.txt")); for (int i = 0; i < 10000000; i++) { out.write( "vaule1,vaule2,vaule3,vaule4,vaule5,vaule6,vaule7,vaule8,vaule9,vaule10,vaule11,vaule12,vaule13,vaule14,vaule15,vaule16,vaule17,vaule18"); out.write(System.getProperty("line.separator")); } out.close(); } 使用FileWriter遍历往一个文件里插入1000w条数据即可,这个速度还是很快的,不要忘了在每条数据的后面添加换行符(\n\r); 4.截取数据的完整性 除了需要设置每次读取文件的大小,同时还需要设置一个参数,用来每次获取一小部分数据,从这小部分数据中获取换行符(\n\r),如果获取不到一直累加直接获取为止,这个值设置大小大致同每条数据的大小差不多合适,部分实现如下: ByteBuffer byteBuffer = ByteBuffer.allocate(buffSize); // 申请一个缓存区 long endPosition = batchFileSize + startPosition - buffSize;// 子文件结束位置 long startTime, endTime; for (int i = 0; i < count; i++) { startTime = System.currentTimeMillis(); if (i + 1 != count) { int read = inputChannel.read(byteBuffer, endPosition);// 读取数据 readW: while (read != -1) { byteBuffer.flip();// 切换读模式 byte[] array = byteBuffer.array(); for (int j = 0; j < array.length; j++) { byte b = array[j]; if (b == 10 || b == 13) { // 判断\n\r endPosition += j; break readW; } } endPosition += buffSize; byteBuffer.clear(); // 重置缓存块指针 read = inputChannel.read(byteBuffer, endPosition); } } else { endPosition = fileSize; // 最后一个文件直接指向文件末尾 } ...省略,更多可以查看Github完整代码... } 如上代码所示开辟了一个缓冲区,根据每行数据大小来定大概在200字节左右,然后通过遍历查找换行符(\n\r),找到以后将当前的位置加到之前的结束位置上,保证了数据的完整性; 5.批次插入数据 通过insert(...)values(...),(...)的方式批次插入数据,部分代码如下: // 保存订单和解析位置保证在一个事务中 SqlSession session = sqlSessionFactory.openSession(); try { long startTime = System.currentTimeMillis(); FielAnalysisMapper fielAnalysisMapper = session.getMapper(FielAnalysisMapper.class); FileOrderMapper fileOrderMapper = session.getMapper(FileOrderMapper.class); fileOrderMapper.batchInsert(orderList); // 更新上次解析到的位置,同时指定更新时间 fileAnalysis.setPosition(endPosition + 1); fileAnalysis.setStatus("3"); fileAnalysis.setUpdTime(new Date()); fielAnalysisMapper.updateFileAnalysis(fileAnalysis); session.commit(); long endTime = System.currentTimeMillis(); System.out.println("===插入数据花费:" + (endTime - startTime) + "ms==="); } catch (Exception e) { session.rollback(); } finally { session.close(); } ...省略,更多可以查看Github完整代码... 如上代码在一个事务中同时保存批次订单数据和文件解析位置信息,batchInsert通过使用mybatis的<foreach>标签来遍历订单列表,生成values数据; 总结 以上展示了部分代码,完整的代码可以查看Github地址中的batchInsert模块,本地设置每次截取的文件大小为2M,经测试1000w条数据(大小1.5G左右)插入mysql数据库中,大概花费时间在20分钟左右,当然可以通过设置截取的文件大小,花费的时间也会相应的改变。 完整代码 Github

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Rocky Linux

Rocky Linux

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

用户登录
用户注册