在Web开发中,有时需要对网页进行截图,以便进行页面预览、测试等操作。
而使用无头浏览器来实现截图功能,可以避免手动操作的繁琐和不稳定性。
这篇文章将介绍:使用Golang进行无头浏览器的截图,轻松实现页面预览、测试和模拟用户操作。
这篇文章发完,有朋友在朋友圈留言说:没想到还有这种骚操作~
还有朋友思路打开了:问我能不能自动实现移动滑块识别验证、能不能实现自动登录?
无头浏览器(Headless Browser)是一种没有图形用户界面的浏览器,它可以在后台运行,并通过编程接口来控制和操作浏览器。
无头浏览器通常用于自动化测试、网页截图、爬虫等场景,可以帮助我们更方便地进行网页操作和数据采集。
常见的无头浏览器包括Chrome Headless、PhantomJS、Puppeteer等。
在Golang中,可以使用chromedp
和rod
等库来实现无头浏览器截图的功能。
使用Golang实现无头浏览器截图可以在很多场景下发挥作用,以下是一些常见的场景:
网页截图:使用无头浏览器可以方便地对网页进行截图,可以用于生成网页快照、监控网页变化等。
自动化测试:使用无头浏览器可以模拟用户操作,可以用于自动化测试、自动化部署等。
网页爬虫:使用无头浏览器可以模拟浏览器行为,可以用于网页爬虫、数据采集等。
数据分析:使用无头浏览器可以获取网页数据,可以用于数据分析、机器学习等。
chromedp
chromedp
是一个基于Chrome或Chromium浏览器的DevTools协议的库,可以方便地控制浏览器进行截图、模拟用户操作等功能。
以下是使用chromedp
库实现无头浏览器截图的示例代码:
package main
import (
"context"
"io/ioutil"
"log"
"time"
"github.com/chromedp/cdproto/page"
"github.com/chromedp/chromedp"
)
func main() {
// 创建一个上下文
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
// 设置浏览器选项
opts := append(chromedp.DefaultExecAllocatorOptions[:],
chromedp.Flag("headless", true),
chromedp.Flag("disable-gpu", true),
chromedp.Flag("no-sandbox", true),
chromedp.Flag("disable-dev-shm-usage", true),
chromedp.Flag("remote-debugging-port", "9222"),
)
allocCtx, cancel := chromedp.NewExecAllocator(ctx, opts...)
defer cancel()
// 创建一个浏览器实例
ctx, cancel = chromedp.NewContext(allocCtx)
defer cancel()
// 导航到指定的URL
var buf []byte
err := chromedp.Run(ctx, chromedp.Navigate("http://www.baidu.com"), chromedp.Sleep(2*time.Second), chromedp.ActionFunc(func(ctx context.Context) error {
// 获取页面截图
var err error
buf, err = page.CaptureScreenshot().WithQuality(90).WithClip(&page.Viewport{X: 0, Y: 0, Width: 1920, Height: 1080, Scale: 1}).Do(ctx)
if err != nil {
return err
}
return nil
}))
if err != nil {
log.Fatal(err)
}
// 将截图保存到文件
err = ioutil.WriteFile("screenshot.png", buf, 0644)
if err != nil {
log.Fatal(err)
}
}
这段代码使用chromedp
库创建了一个无头浏览器实例,并导航到百度首页。
然后使用page.CaptureScreenshot()
函数获取页面截图,并将截图保存到screenshot.png
文件中。
把我上面的代码复制到main.go
文件中,安装依赖直接运行即可:
go mod tidy
go run main.go
执行效果如下:
需要注意的是,使用chromedp
库需要先安装Chrome或Chromium浏览器,并将其添加到系统的环境变量中。
rod
库rod
是另一个基于Chrome或Chromium浏览器的DevTools协议的库,可以方便地控制浏览器进行截图、模拟用户操作等功能。
以下是使用rod
库实现无头浏览器截图的示例代码:
package main
import (
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/proto"
"github.com/go-rod/rod/lib/utils"
"github.com/ysmood/gson"
)
func main() {
page := rod.New().MustConnect().MustPage("http://baidu.com").MustWaitLoad()
//简单模式,默认截图设置
page.MustScreenshot("my.png")
//自定义截图设置
img, _ := page.Screenshot(true, &proto.PageCaptureScreenshot{
Format: proto.PageCaptureScreenshotFormatJpeg,
Quality: gson.Int(90),
Clip: &proto.PageViewport{
X: 0,
Y: 0,
Width: 300,
Height: 200,
Scale: 1,
},
FromSurface: true,
})
_ = utils.OutputFile("my.jpg", img)
}
这段代码使用rod
库创建了一个无头浏览器实例,并导航到百度首页。
然后使用page.MustScreenshot()
函数获取页面截图,并将截图保存到my.png
文件中。
同样演示了使用page.Screenshot
自定义截图,并将自定义截图保存到了my.jpg
文件中。
需要注意的是,使用rod
库需要先安装Chrome或Chromium浏览器,并将其添加到系统的环境变量中。
rod
库示例代码的运行方式和chromedp
基本一致,略有区别的是我们需要根据提示,运行多次go run main.go
安装需要的插件:
碰到上面提示不用慌,再执行一次go run main.go
即可
执行效果如下:
再强调一遍,不管是使用chromedp
库还是rod
库,都需要先安装Chrome或Chromium浏览器,并将其添加到系统的环境变量中。
我文章中的演示是基于Mac OS。
本文介绍了如何使用Golang实现无头浏览器截图的功能。
通过使用chromedp
和rod
库,可以方便地控制浏览器进行截图、模拟用户操作等功能。
使用Golang实现无头浏览器截图的优势包括:
高效性:Golang是一种高效的编程语言,可以快速地处理大量数据和请求。
可扩展性:Golang具有良好的可扩展性,可以方便地扩展和修改代码。
跨平台性:Golang可以在多个平台上运行,可以方便地进行跨平台开发和部署。
安全性:Golang具有良好的安全性,可以有效地防止代码注入和攻击。
综上所述,使用Golang实现无头浏览器截图可以在很多场景下发挥作用,具有高效性、可扩展性、跨平台性和安全性等优势。
我的微信:wangzhongyang1993
视频号:王中阳Go
公众号:程序员升职加薪之旅
大家好,又见面了,我是你们的朋友全栈君。JAVA开发环境配置1window系统搭建java环境1.1下载JDK首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html,点击如下下载按钮:然后接受许可,选择相应的版本进行下载:1.2安装下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了。安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为C:\ProgramFiles(x86)\Java\jdk1.8.0_91。1.3配置环境变量1.安装完成后,右击”我的电脑”,点击”属性”,选择”高级系统设置”;2.选择”高级”选项卡,点击”环境变量”;然后就会出现如下图所示的画面:在”系统变量”中设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击”编辑”,不存在则点击”新建”。变量设置参数如下:变量名:JAVA_HOME变量值:C:\ProgramFiles(x86)\Java\
大家好,又见面了,我是你们的朋友全栈君。说到负载均衡的hash算法,自然会联想起如下这样的算法hash(object)%nodeTotal复制而在集群中,机器的动态上下线是常见的情况,如果集群是无状态的,那么上述的算法没有问题.但是如果是缓存之类的集群,节点的动态上下线会导致几乎所有的key的重新映射,这样造成的影响是数据错乱,相同备份的数据同时存在于集群中的多个节点,造成内存空间的浪费为了解决上述的问题,一致性哈希算法就被提出了 一致性哈希算法的目标是对于K个请求,节点的上下线只会引起K/nodeTotal的key重新映射,而在节点稳定的时候,同一个key的每次请求映射都是一样的一致性哈希算法实现原理如下 首先将node节点映射到一个圆上(圆的大小是2^32-1),然后将请求object映射到圆上,最后顺时针转动请求,转动的目的是让请求映射到node节点上原理图如下 上述的算法在node2被删除的情况下回发生什么呢?它会造成object3的请求映射到node3节点上,并且对于其他的请求没有发生变化,如图所示 如果添加了node4节点请求又会如何发生变化呢?变化是object2倍映射到
Apollo的部署和动态配置基础使用简介Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,以及能实现灰度发布等实现,配置修改后能够动态推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务器环境测试系统介绍系统Centos7java环境java1.8数据库MariaDB-10.2.9IP192.168.1.3安装java mkdir/data/software/ cd/data/software/ wgethttp://js.funet8.com/centos_software/jdk-8u211-linux-x64.tar.gz mkdir/usr/local/java/ tar-zxvfjdk-8u211-linux-x64.tar.gz-C/usr/local/java/ echo' exportJAVA_HOME=/usr/local/java/jdk1.8.0_211 exportJRE_HOME=${JAVA_HOME}/jre exportCLASSPATH=.:${JAVA_H
tar命令通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是必不可少的一个功能强大的工具。Linux中最流行的tar是麻雀虽小,五脏俱全,功能强大。使用tar命令,我们可以为Linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip或bzip2命令)。Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.
时间序列在很多的领域都是重要的结构化数据形式,例如经济学、金融、生态学、物理学等,其特点是:在多个时间点进行了观测许多时间序列是固定频率,即根据相同的规则定期出现时间序列也可以是没有规则的时间序列的应用时间戳固定的时间区间时间间隔笔记1:最广泛和最简单的时间序列是时间戳引起的 处理时间的3大模块:datetimetimecalendar下面?详细介绍3大模块的使用calendar日历模块calendar中,常用的方法是calendarcalendar(year,w=2,l=1,c=6):返回year年的日历,3个月一行,间隔距离(每2个月的间隔,总共2个间隔)为c,每个宽度间隔w字符,每行长度:21*w+18(3*6)+2*c打印2020年完整日历:importcalendar year=calendar.calendar(2020) print(year)复制isleap(year)判断某个年份是否是闰年leapdays(y1,y2)返回两个年份之间的闰年总数,包含y1,不包含y2month(year,month,w=2,l=1)返回的是year年month月的日历,两行标题,一周一
置中心用于统⼀管理配置,快速切换各个环境的配置。常用的配置中心springcloud开源的Confighttp://cloud.spring.io/spring-cloud-config/zookeeperConfig是一个分布式的配置管理中心,由configserver、configclient2部分组成,每个要从configserver是获取配置的服务节点都是configclient。使用git仓库存储配置config默认使⽤git仓库来存储配置,可以使用公司自己搭建的git服务器,也可以使⽤github、码云上的私人仓库。不推荐使用github上的仓库来存储配置,因为在国内使用github访问速度很慢,个人开发者建议使用码云。新建私人仓库,名称比如config-mall,不同环境的配置有2种方式(1)文件名指定配置文件都放在master分支下,比如用户服务的配置:user-service-dev.ymluser-service-testuser-service-prod.ymldev是开发环境,test是测试环境,prod是生产环境(2)分支指定(推荐)新建分支dev、testm
1.题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例: 给定一个链表:1->2->3->4->5,和k=2. 返回链表4->5.复制来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2.解题快指针先走k步随后快慢指针一起前进,直到快指针到达NULL慢指针指向倒数第k个节点classSolution{ public: ListNode*getKthFromEnd(ListNode*head,intk){ ListNode*fast=head,*slow=head; while(k--) fast=fast->next; while(fast) { f
前言哈喽,大家好,最近换了工作,为了更快的熟悉新环境,大部分精力都在学习公司的项目业务以及技术,所以公众号更新就少了(非常感谢各位依旧关注),但是我又学到了一些新的技术哈哈~~,又整理了一遍分享给各位。什么是mycat它是阿里开源的一个数据库中间件,专门为大数据量的项目做分库分表用的。有如下特点:一个彻底开源的,面向企业应用开发的大数据库集群支持事务、ACID、可以替代MySQL的加强版数据库一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQLServer结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品一个新颖的数据库中间件产品官网地址:http://www.mycat.org.cn/mycat权威指南:http://www.mycat.org.cn/document/mycat-definitive-guide.pdfmycat架构话不多说,一张mycat架构图就能让你知道mycat的角色以及作用。mycat1.6版本架构如下:由图可知,mycat位于数据库和应用层(APP)之间,它的角色就
本来没什么事,但看到有人用一大堆的if-else控制语句就有点火了,也不想想:用一个变量一次次除以虽然不同但有规律的数字,也不嫌累,纯粹一码农,没有任何脑子在里面,我也懒得整那么细了,直接上代码吧:varbyTime=[365*24*60*60*1000,24*60*60*1000,60*60*1000,60*1000,1000]; varunit=["年","天","小时","分钟","秒钟"]; functionstr(atime){ varct=newDate().getTime-atime.getTime(); if(ct<0){ return"瞎糊闹!" } varsb=[]; for(vari=0;i<byTime.length;i++){ if(ct<byTime[i]){ continue; } vartemp=Math.floor(ct/byTime[i]); ct=ct%byTime[i]; if(temp>0){ sb
之前写了关于Winsock的重叠IO模型,按理来说重叠IO模型与之前的模型相比,它的socket即是非阻塞的,也是异步的,它基本上性能非常高,但是它主要的缺点在于,即使我们使用历程来处理完成通知,但是我们知道历程它本身是在对应线程暂停,它借用当前线程的线程环境来执行完成通知,也就是说要执行完成通知就必须暂停当前线程的工作。这对工作线程来说也是一个不必要的性能浪费,这样我们自然就会想到,另外开辟一个线程来执行完成通知,而本来的线程就不需要暂停,而是一直执行它自身的任务。处于这个思想,WinSock提供了一个新的模型——完成端口模型。 完成端口简介完成端口本质上是一个线程池的模型,它需要我们创建对应的线程放在那,当完成通知到来时,他会直接执行线程。在这5中模型中它的性能是最高的。 在文件中我们也提到过完成端口,其实我们利用Linux上一切皆文件的思想来考虑这个问题就可以很方便的理解,既然我们需要异步的方式来读写网卡的信息,这与读写文件的方式类似,既然文件中存在完成端口模型,网络上存在也就不足为奇了。 对于完成端口Windows没有引入新的API函数,而是仍然采用文件中一堆相关的函数。可以使
前言让我们来看一下Java的广告词,来自http://www.java.com/zh_CN/about/:97%的企业桌面运行Java美国有89%的桌面(或计算机)运行Java全球有900万Java开发人员开发人员的头号选择排名第一的部署平台有30亿部移动电话运行Java100%的蓝光盘播放器附带了Java有50亿张Java卡在使用1.25亿台TV设备运行Java前5个原始设备制造商均提供了JavaME很牛逼不是吗?OK,这么牛逼的背后,我们Java开发人员有想过每天和我们朝夕相处的Java到底是什么呢?当然,很多人脑海里第一反应一定是,Java不就是一门编程语言吗,咱们每天写代码的语言啊。当然,这么说也是对的,只是Java实际包含的面更广,一起往下来看下。什么是Java经过了多年的发展,Java早已由一门单纯的计算机编程语言,演变为了一套强大的技术体系。是的,什么是Java,我想技术体系四个字应该是最好的概括了吧。Java设计者们将Java划分为3种结构独立但却彼此依赖的技术体系分支,它们分别对应着不同的规范集合和组件:JavaSE(标准版),主要活跃在桌面领域,主要包含了JavaA
【每日一语】如果你让别人来决定你的人生,你的内心永远不会感到踏实。——拿破仑深信服大数据研发工程师一面:1python怎么样2c语言熟么,问了几个c语言的东西。不会。3算法,跳台阶,斐波那契数列和dp方式都说了。4tcp的四次挥手中的time—wait状态何时出现,有什么意义。5操作系统的fork进程返回什么,应该是子进程号吧。6没什么问题了。二面:1自我介绍2为什么选这个岗位3了解hadoop的哪些组件,全部说了一遍。4讲一下hdfs的写入过程,发请求给namenode,返回一个地址进行写入,写入完告诉namenode,namenode完成副本备份。5讲一下项目中的难点,多线程,并发工具,并发容器。6讲一下如何设计一个高并发的秒杀系统7python了解么,讲一下线程和协程协程自带上下文,切换不需要刷新cpu上下文和寄存器。更适合并发。协程和线程适用场景的区别。8没了三面:1介绍2问了一下家庭情况和城市意向3大学有啥困难和挑战4研究生成绩,做了什么5评价自己6对我司有什么了解7加班怎么看 点击作者姓名与作者大佬交流~作者:How_2_Play_Life来源:牛客网(www.nowcod
雷军曾接受采访表示小米的核心战略是连接一切,已投资10亿美金启动内容投资并招募老将陈彤操盘。无独有偶,马化腾则表示腾讯未来最重要的是做好连接器和内容。坐拥微信和手Q的腾讯是最大的移动互联网公司,小米则是一家潜力无限的移动互联网公司。在这两个最移动化的公司,内容都与“连接”并列在一起成为两大核心战略,并非巧合。注意力时代内容为王在移动互联网各类基础设施跑马圈地完成后,不论是创业者还是大公司都转向三个新方向:硬件、O2O,还有内容。硬件是手机的衍伸、O2O是电商的实体化,内容则是互联网一直存在的庞大产业,因为产品最终都需要内容不断去填充,去抢占用户时间。工具型应用很容易迎来瓶颈,比如墨迹天气、美图秀秀等早期移动互联网工具都呈现出疲态,给用户提供高质量内容却永不过时。资讯、社区、社交、微博、影视、音乐、游戏、文学、动漫、秀场、教育,都属于内容。为何内容型业务在移动时代依然为王?有四个原因:1、精神需求。无论何时,人们都需要精神消费,物质生活充裕精神需求愈发强烈,内容很大程度满足了精神需求;2、缺乏好内容。内容大爆炸却存在劣币驱逐良币问题,版权等典型问题的逐步解决给好内容带来机会;3、注意力经
源代码:https://github.com/nnngu/LagouSpider效果预览思路1、首先我们打开拉勾网,并搜索“java”,显示出来的职位信息就是我们的目标。2、接下来我们需要确定,怎样将信息提取出来。查看网页源代码,这时候发现,网页源代码里面找不到职位相关信息,这证明拉勾网关于职位的信息是异步加载的,这也是一种很常用的技术。异步加载的信息,我们需要借助chrome浏览器的开发者工具进行分析,打开开发者工具的方法如下:点击Nerwork进入网络分析界面,这时候是一片空白,刷新一下界面就可以看到一系列的网络请求了。前面我们说到,拉勾网关于职位的信息是异步加载的,那么在这一系列的网络请求中,必定有某个请求发送给服务器,响应回来的是职位信息。正常情况下,我们可以忽略css,图片等类型的请求,关注点放在XHR这种类型请求上,如图:一共4个XHR类型的请求,我们逐个打开对比,分别点击Preview就能看到它们响应的内容。发现第一个请求就是我们要找的。如图:点击Headers,查看一下请求参数。如下图:到此,我们可以确定city参数就是城市,pn参数就是页数,kd参数就是搜索关键字。接
总结一些python编程中可能会用到的一些小工具namedtuple给tuple起个名字defnamedtuple(typename,field_names,verbose=False,rename=False): """Returnsanewsubclassoftuplewithnamedfields. >>>Point=namedtuple('Point',['x','y']) >>>Point.__doc__#docstringforthenewclass 'Point(x,y)' >>>p=Point(11,y=22)#instantiatewithpositionalargsorkeywords >>>p[0]+p[1]#indexablelikeaplaintuple 33 >>>x,y=p#unpacklikearegulartuple >>>x,y (1
大家好,又见面了,我是你们的朋友全栈君。knox错误总结windowsbrowser有时候打不开KnoxUIhosts文件添加Knox的{ {GATE_WAY}}ip的映射 就可以打开界面了打开Knoxadmin_UI后显示不完全需要下载特定的js,私信我即可解决Knox配置yarnservice报错2020-03-1717:07:13,311ERRORknox.gateway(GatewayDispatchFilter.java:isDispatchAllowed(155))-Thedispatchtohttp://10.1.236.56:8088/clusterwasdisallowedbecauseitfailsthedispatchwhitelistvalidation.Seedocumentationfordispatchwhitelisting.复制需要修改一下gateway.dispatch.whitelist.services属性,内容里删掉YARNUI,如果不删除,则会报错: 修改完重新调用 ERRORknox.gateway(GatewayFilter.java:
packagecn.wzx.www; importcom.rupeng.game.GameCore; publicclassbasicGameimplementsRunnable{ publicstaticvoidmain(String[]args){ //TODO自动生成的方法存根 GameCore.start(newbasicGame()); } @Override publicvoidrun(){ //TODO自动生成的方法存根 GameCore.setGameSize(690,1035); GameCore.setGameTitle("蓝色妖姬"); GameCore.alert("张杰勇敢飞,星星永相随!您是否愿意听一首歌?"); GameCore.loadBgView("z.jpg"); GameCore.playSound("张杰-北斗星的爱.mp3",true); GameCore.pause(5000); GameCore.setGameSize(690,388); GameCore.loadBgView("x.jpg"); GameCore.pause(5
#_*_coding:utf-8_*___author__='pythonwu'__date__="2018/7/2310:33"importpyaudioimportwaveimportsys#定义数据流块CHUNK=1024#iflen(sys.argv)<2:#print("Playsawavefile.\n\nUsage:%sfilename.wav"%sys.argv[0])#sys.exit(-1)#只读方式打开wav文件wf=wave.open(r'林俊杰-可惜没如果.wav','rb')#(sys.argv[1],'rb')p=pyaudio.PyAudio()#打开数据流stream=p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)#读取数据data=wf.readframes(CHUNK)#播放whiledata!='':stream.write(data)data=wf.
CentOS8.2切换阿里源 目录CentOS8.2切换阿里源前言1.备份原始源文件2.到阿里镜像站源文件3.生成仓库缓存4.更新系统 前言 为了使yum工具能快速的安装更新软件,我们需要将默认的yum国外源更换为国内源。 1.备份原始源文件 #进入目录/etc/yum.repos.d cd/etc/yum.repos.d #新建名称为bak的文件夹 mkdirbak #将所有源文件保存到bak文件夹里 mv*.repobak 复制 2.到阿里镜像站源文件 到阿里源下载站,下载对应系统的源文件并放到/etc/yum.repos.d目录下 链接地址:https://mirrors.aliyun.com/repo/ 3.生成仓库缓存 #清除yum仓库缓存 yumcleanall #生成新的仓库缓存 yummakecache 复制 4.更新系统 #更新 yumupdate 复制
C# ListView应用 1. 添加表头标题的方法 a. 直接在ListView控件上编写 b. 通过代码编写 1//动态添加lstv_ReaderList列表头 2/* 3lstv_ReaderList.Columns.Add("序号",50,HorizontalAlignment.Center); 4lstv_ReaderList.Columns.Add("读写器IP",90,HorizontalAlignment.Center); 5lstv_ReaderList.Columns.Add("读写器Port",75,HorizontalAlignment.Center); 6lstv_ReaderList.Columns.Add("本机Port",75,HorizontalAlignment.Center); 7lstv_ReaderList.Columns.Add("通讯方式",75,HorizontalAlignment.Center); 8lstv_ReaderList.Columns.Add("参数配置",80,Horizonta
一、简介 所谓制作根文件系统,就是创建各种目录,并且在里面创建各种文件。 二、编译/安装Busybox 从https://busybox.net/下载busybox-1.28.0.tar.bz2。 1.配置Busybox makemenuconfig复制 配置选项说明: BusyboxSettings---> GeneralConfiguration--->(一些通用的设置,一般不需要理会,采用默认) Support--long-options---> [*]Don'tuse/usr//这个选项也一定要选,否则makeinstall后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令. BuildOptions--->(待补充) 把喜歡的事情做到極緻。