嵌入安防监控项目——BOA服务器的移植

news2024/11/15 8:47:17

目录

一、源码下载

1.1 boa简介:

1.2BOA再项目中的使用 

二、解压源码:

三、进入源码目录下的src目录:

四、make 编译源码:

五、建立安装目录

六、返回boa的顶层目录  --- 修改配置文件

七、建立测试页面

八、查看/boa目录下所有的文件:

九、测试效果

十、移植到A9开发板上:

十一、移植遇到的问题


一、源码下载

  http://www.boa.org/

  News! (last updated 23 February 2005)

  Latest Released Version (0.94.13) here (signature here)  --- 下载地址

1.1 boa简介:

其可执行代码只有大约60KB左右,Boa是一个单任务的HTTP服务器,Boa只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。Boa支持CGI。

Boa的设计目标是速度和安全。(CGI只是一个进程,用来提供接口),自动目录生成和自动文件枪支进行拼接。

Boa的主要设计目标是速度和安全性。安全性在“不能被恶意用户破坏”的意义上,不是“细粒度访问控制和加密通信”。

特点:可靠性和可移植性,Boa不是作为功能强大的服务器。

开发平台:GNU / Linux是目前的开发平台。

推荐:GoAhead   Apache2

这两家的服务是现在比较主流的学习阶段更推荐BOA

1.2BOA再项目中的使用 

我们使用QQ时,腾讯的服务器会完成加密解密和查找转发等过程。

而我们的BOA也差不多

我们服务器的左面是CGI可以是C语言也可以是Python是JAVA,右面是html语言,这句好比是两个外国人,语言不通没法交换信息啊。

这里我们先安装一个tree命令和windows里那个差不多。想起来高中的时候再学校的白板上一个tree装黑客的同学,哈哈哈哈。

 

 

两个可执行文件一个conf配置文件

log是保存错误认知的

www是保存网页的 

 

这个cgi就是我们的cgi这个www就是我们的网页,然后我们通过配置conf文件,让boa能找到cgi和www的位置。

 

 

进行回环测试

 

还可以跳转,这和web比小屋见大屋了。都比较简单。

下面再开发板上移植。 

跨平台移植三部曲:

  1./configure生成一个Makefile      ./configure  --prefix   --host

  2make

  3make install

二、解压源码:

  tar -xvf boa-0.94.13.tar.gz

三、进入源码目录下的src目录:

  cd boa-0.94.13/src/

在源码目录下配置与编译。执行

./configure

这是根据configure.in文件进行一系列的配置,生成config.status,configure,和Makefile文件。

如果无法执行,考虑权限,修改该目录下的configure的属性为可执行 chmod 755 configure

四、make 编译源码:

      问题1:

  目录: boa-0.94.13/src$ make

     yacc  -d boa_grammar.y

     make: yacc: Command not found

     make: *** [y.tab.c] Error 127

  解决方法:

     /boa-0.94.13/src$ sudo apt-get install bison

      问题2:

     yacc  -d boa_grammar.y

     gcc  -g -O2 -pipe -Wall -I.   -c -o y.tab.o y.tab.c

     ......

     lex  boa_lexer.l

     make: lex: Command not found

     make: *** [lex.yy.c] Error 127

  解决方法:

     /boa-0.94.13/src$ sudo  apt-get install flex

  WARNING: The following packages cannot be authenticated!

    libfl-dev flex

  Install these packages without verification? [y/N]

  E: Some packages could not be authenticated

  注意加参数-f 自动搜索依赖,下面选择 sudo  apt-get install flex -f

  Do you want to continue? [Y/n] y

  WARNING: The following packages cannot be authenticated!

    libfl-dev flex

  Install these packages without verification? [y/N] y

 问题3:     

  util.c: In function get_commonlog_time:

  util.c:100:39: error: pasting "t" and "->" does not give a valid preprocessing token

          time_offset = TIMEZONE_OFFSET(t);                                ^

  compat.h:120:30: note: in definition of macro TIMEZONE_OFFSET

   #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff                   ^

  make: *** [util.o] Error 1

问题描述:在compat.h文件中的宏定义问题:  ‘TIMEZONE_OFFSET

  解决方法:

     修改 boa-0.94.13/src$ vi compat.h  +120

     找到

     #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff

     修改成

     #define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff

     boa.c中的 vi   boa.c

     225     #if 0     //注释掉

     226         if (setuid(0) != -1) {

     227             DIE("icky Linux kernel bug!");

     228         }

     229     #endif             

这三行注释掉,否则boa启动时会出现“boa.c:226 - icky linux kernel bug!: No suchfile or directory错误”   

清除之前编译的内容 make clean (防止某些依赖的信息出现问题)

  重新make

  再次boa-0.94.13/src$ make

  make: Nothing to be done for `all'.

      make主要检查的是时间戳, 只要target比依赖的文件时间靠后它就认为不需要编译

五、建立安装目录

  sudo mkdir -p /boa   /boa/www   /boa/cgi-bin   /boa/log  

  src/defines.h中的

      #define SERVER_ROOT "/etc/boa"

修改为

  #define SERVER_ROOT "/boa"

      (这样boa程序启动时会在/boa目录下寻找boa.conf配置文件,并且将/boa文件夹作为服务器的根目录)。

      将需要的文件复制到安装目录中

  boa-0.94.13/src目录下生成的boaboa_indexer二进制文件复制到/boa

     sudo  cp  boa boa_indexer  /boa

  boa-0.94.13目录下的boa.conf文件复制到/boa

     sudo  cp  boa.conf  /boa

     可选项: arm-linux-strip boa(去掉boa中的调试信息,只是减小文件的大小可以执行也可以不执行)

  /etc/mime.types复制到/boa目录下

     sudo cp  /etc/mime.types  /boa

六、返回boa的顶层目录  --- 修改配置文件

  boa-0.94.13$ ls

      boa.conf   contrib  docs      extras       README

      ChangeLog  CREDITS  examples  Gnu_License  src

vi boa.conf //几乎全部指定到boa的目录下,这样方便我们进行管理

重新指定一些文件的生成路径,因为重新指定这些路径后会帮助我们深刻的理解关于boa服务器的工作机制

  Port  80 

  User  0 

  Group 0 

# bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址

#Listen 192.68.0.5

##### error_log和access_log会自动生成,只要指定生成路径就可以了。 

  ErrorLog /boa/log/error_log 

  AccessLog /boa/log/access_log    

##### 存放HTML文件的根路径 

  DocumentRoot /boa/www 

  UserDir public_html 

##### 默认页面,若之输入http://127.0.0.1/则会自动返回给浏览器默认页面index.html 

  DirectoryIndex index.html   

  ##### 保持默认 

  DirectoryMaker /boa/boa_indexer   //被修改

  KeepAliveMax 1000 

  KeepAliveTimeout 10 

  MimeTypes /boa/mime.types   //被修改

  DefaultType text/plain   

  #####指定传给cgi程序的PATH环境变量 

  CGIPath /bin:/usr/bin:/usr/local/bin  

  #####保持默认 

  Alias /doc /usr/doc  

  #####如果输入http://127.0.0.1/cgi-bin/test.cgi, boa服务器会到/boa/cgi-bin中寻找test.cgi程序。 

  ScriptAlias /cgi-bin/ /boa/cgi-bin/ 

     

七、建立测试页面

(1)index.html  ,将index.html 放在/boa/www目录下

  sudo cp index.html image.jpg /boa/www

  <html> 

     <body> 

         <h3>this is a test!</h3><br/> 

         <img src="image.jpg"/> 

         <h3>tree picture</h3><br/> 

         <a href="/cgi-bin/test.cgi">to cgi page</a>    //指定了cgi可执行文件存放的路径,默认从/boa的根目录开始查找

     </body> 

  </html>  

           

注意: 笔记本打开,另存为utf-8格式,自己添加一张图片到当前的目录下

(2)test.c, 使用gcc -o test.cgi test.c,将test.c编译生成test.cgi,后缀为cgi的类型

      编译后得到的test.cgi放在/boa/cgi-bin目录下,

  sudo cp test.cgi  /boa/cgi-bin/

 

  #include <stdio.h> 

  int main() 

  { 

    printf("Content-type:text/html\n\n"); //这句一定要加上 

    printf("<html><body>"); 

    printf("<font style=\"color:red; font-size:30px;\">Hello, CGI!</font><br/>"); 

    printf("<a href=\"/index.html\">return index.html</a>"); 

    printf("</body></html>"); 

    return 0; 

  } 

八、查看/boa目录下所有的文件:

上面有。

九、测试效果

进入/boa目录,使用./boa来运行boa服务器(当然也可将/boa路径加入系统PATH环境变量,这样不用进入/boa目录,直接输入boa就可以了)

      在浏览器中输入http://127.0.0.1/便可访问到默认的页面index.html,

  或:    http://192.168.1.200:80

         http://localhostip:port

      点击index.html页面中的超链接便可访问到cgi测试页面,点击test.cgi中的超链接又可返回index.html页面。

(1)index.html页面

  fengjunhui@ubuntu:/boa$ ./boa

[19/Jul/2017:08:44:28 +0000] log.c:73 - unable to dup2 the error log: Bad file descriptor

      解决方法:

这个问题其实就是你没有创建log文件夹,以及文件夹下的log_erroraccess_error文件引起的。只要在boa.conf中找到这两个文件的信息,将其路径改成自己需要的路劲,并在相应的位置创建对应文件就OK

   62 ErrorLog /boa/log/error_log

   74 AccessLog /boa/log/access_log

      fengjunhui@ubuntu:/boa$ ls  发现有log目录

      boa  boa.conf  boa_indexer  cgi-bin  log  mime.types  www

问题描述

log.c:73   unable to dup2 the error log: Bad file descriptor

问题解决:

Vi  log.c  +73

     扩展:

     函数名: dup2

     功能: 复制文件描述符

     用法: int dup2(int oldfd,int newfd);

  修改 src/log.c    

  注释掉

     if (dup2(error_log, STDERR_FILENO) == -1) {

         DIE("unable to dup2 the error log");

     }

     为:

   71 #if 0

   72         /* redirect stderr to error_log */

   73         if (dup2(error_log, STDERR_FILENO) == -1) {

   74             DIE("unable to dup2 the error log");

   75         }

   76 #endif 

      /boa目录下重新执行  ./boa 执行

  Cannot open /boa/log/access_log for logging: logfile open: Permission denied

  出错,因为不是root用户(虚拟机),权限不够。(A9开发板默认登录为root用户,不需要加sudo

  sudo ./boa

 

  然后再./boa  此时boa服务器就已经启动,打开ubuntu浏览器,输入ubuntuip地址,就可以看到你放在/var/www里的网页了。ok

     

测试结果:

  http://127.0.0.1/index.html

  this is a test!

     return to cgi page

     点击跳转:

     Hello, CGI!

     return index.html

     以上是在PC上部署BOA的大致步骤,仅供参考。  

     

问题描述:

fengjunhui@ubuntu:/boa$ sudo ./boa

[19/Jul/2017:13:44:11 +0000] boa.c:194 - unable to bind: Address already in use

     

如何关闭boa服务器:

  fengjunhui@ubuntu:~$ ps -axj | grep "boa"

   2102 24862 24860 24255 pts/18   24255 S    65534   0:00 ./boa

   2102 25735 25733 24255 pts/18   24255 S    65534   0:00 ./boa

  25753 25793 25792 25753 pts/4    25792 S+    1000   0:00 grep --color=auto boa

 

  kill -9 pidboa

  fengjunhui@ubuntu:~$ sudo kill -9 24862

  fengjunhui@ubuntu:~$ sudo kill -9 25733

重新启动boa,再次通过浏览器访问cgi,访问成功!

  fengjunhui@ubuntu:~/Boa-0.94/boa-0.94.13/src$ sudo cp boa_indexer boa /boa

  cp: cannot create regular file /boa/boa: Text file busy

  cp并不改变目标文件的inode,事实上它的实现是这样的:

  # strace cp test2 test 2&1 | grep open.*test

  open("test2", O_RDONLY|O_LARGEFILE) = 3

  Linux由于Demand Paging机制的关系,必须确保正在运行中的程序镜像(注意,并非文件本身)不被意外修改,

因此内核在启动程序后会锁定这个程序镜像的inode。这就是为什么cp在用“O_WRONLYO_TRUNC”模式open目标文件时会失败。

而先rmcp的话,新文件的inode其实已经改变了,原inode并没有被真正删除,直到内核释放对它的引用。

  fengjunhui@ubuntu:/boa$ sudo rm boa

  sudo cp boa_indexer boa /boa

     

     

扩展部分:

十、移植到A9开发板上:

      (注意修改源码,具体的现象可以参考视频,遇到问题推荐自己通过百度解决问题,会查资料也是一种能力)

  1. 移植boa到嵌入式linux上的方法和上面几乎一样,具体做法是\在

./configure

  生成Makefile后将Makefile中的

CC = gcc   CPP=gcc -E

改为

CC = arm-linux-gcc

CPP = arm-linux-gcc -E

然后make就可以了。

(2)重新拷贝修改后的文件:

  boa-0.94.13/src目录下生成的boaboa_indexer二进制文件复制到/boa

  boa-0.04.13目录下的boa.conf文件复制到/boa

  /etc/mime.types复制到/boa目录下

  test.cgi放在/boa/cgi-bin目录下,

  index.html image.jpg 放在/boa/www目录下

    

(3)拷贝文件到rootfs文件系统目录下:

     cd boa 进入boa文件目录

      移植到开发板后:    

     [root@fengjunhui boa]:~$ ./boa

     No such user: nobody

     解决方法:

         sudo vi boa.conf

         (1)Group的修改

            修改 Group nogroup  Group 0

         (2)user的修改

            修改 User nobody User 0

           

            [root@fengjunhui boa]:~$ ./boa

问题描述:

[01/Jan/1970:00:23:10 +0000] boa.c:211 - getpwuid: Success

  [01/Jan/1970:00:00:39 +0000] boa.c:211 - getpwuid: No such file or directory

      解决:修改src/boa.c

  注释掉下面两句话:

  #if 0

        if (passwdbuf == NULL) {

                DIE(getpwuid);

                }

                if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {

                DIE(initgroups);

                }

  #endif

           

      (2)移植boa到嵌入式linux后,在启动时若出现“gethostbyname:: Success  

            "然后程序退出,则需在原boa.conf文件中增加一行:

            ServerName  www.your.org.here

      然后重新运行boa,然后在主机浏览器输入开发板网址(http://开发板ip:port)

  [root@fengjunhui ]:~$ cd boa

  [root@fengjunhui boa]:~$ ls

  boa          boa_indexer  log          www

  boa.conf     cgi-bin      mime.types

  [root@fengjunhui boa]:~$ ./boa

  [01/Jan/1970:00:00:24 +0000] boa: server version Boa/0.94.13

  [01/Jan/1970:00:00:24 +0000] boa: server built Jul 19 2017 at 23:07:48.

  [01/Jan/1970:00:00:24 +0000] boa: starting server pid=1185, port 80

  [root@fengjunhui boa]:~$ [01/Jan/1970:00:01:30 +0000] request from 192.168.8.223 "GET /favicon.ico HTTP/1.1" ("/boa/www/favicon.ico"): document open: No such file or directory

  [01/Jan/1970:00:01:30 +0000] request from 192.168.8.223 "GET /favicon.ico HTTP/1.1" ("/boa/www/favicon.ico"): document open: No such file or directory

  这个问题不影响使用:

     

      问题描述:

  [01/Jan/1970:00:01:34 +0000] cgi_header: unable to find LFLF

  出错位置

      cgi_procee_header()

  对于错误 cgi_header: unable to find LFLF的补充

 

  浏览器中显示502 Bad Gateway

  The CGI was not CGI/1.1 compliant.

  解决方法:在Ubuntu端和A9端的交叉编译环境不一样,最好链接为静态库,这样不用单独提供库的支持

  <3>编译方式:arm-linux-gcc -static -o xxx.cgi  xxx.c

     

      可能的原因:

      <1>输出MIME格式错误,结尾一定要有两个换行符

     printf("Content-Type:text/html\n\n")

      <2>权限错误

     chmod 777 var/www/cgi-bin/xxx.cgi

      <3>编译方式:arm-linux-gcc -static -o xxx.cgi  xxx.c

      <4>备用方案:代码本身错误也会引起这个问题。实践中这个问题困扰了很久,一个字符串数组的处理有了问题,  提示的错误信息却是这个,开始一直郁闷于格式和权限,也可能是调用的一个小函数有些问题而导致的。所以在遇到这个问题时,如果输出格式和权限都正确的情况下,检查代码是个很好的选择

      测试:

Ubuntu上输入你板子的ip: http://192.168.1.100/ 

      OK ,实现了和直接在Ubuntu上操作一样的结果

输入指定的路径去访问:

http://192.168.1.100/index.html    

http://192.168.1.100/pass.html    跳转访问到指定的cgi 

指定是OK的。

 可选项:    ***----->然后给boa瘦身

     arm-none-linux-gnueabi-strip boa

fengjunhui@ubuntu:~/smartstorage/boa-0.94/boa-0.94.13/src$ arm-none-linux-gnueabi-strip boa

arm-none-linux-gnueabi-strip: Unable to recognise the format of the input file `boa'

我们并没有修改Makefile,那么这个时候编译生成的x86格式的boa

fengjunhui@ubuntu:~/smartstorage/boa-0.94/boa-0.94.13/src$ file boa

boa: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=95bed4fc9481ca5ac84616c6cfb2578f4e4d1a2f, not stripped

F

错误记录:

line: 1: Syntax error: word unexpected (expecting ")")

开发板上运行可执行程序报出错误:

line1: 1: Syntax error: word unexpected (expecting ")")

解决思路:

1.编译器的问题

arm-linux-gcc编译,可能原来是用gcc编译的。

假如是脚本,#!/bin/sh #!/bin/bash试试。

2.文件完整性

重新烧写或上传一遍。

3.编译命令问题 

比如我的一个测试程序test.c

arm-linux-gcc -o test.o -c test.c    //编译为目标文件

arm-linux-gcc -o test.o test.c        //编译为可执行文件

莫听竹林打叶声,何妨吟啸且前行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。

(--------------完------------)

boa.conf 内容详解:

25 Port 80

监听的端口号,缺省都是80,一般无需修改。注意,如果你的httpd服务器已经开启,那么你必须关掉或者重新设定端口号,

当你修改了模式http端口那么访问的时候要加上端口号,如http://localhostip:port

作为哪个用户运行,即它拥有该用户的权限,一般都是nobody,需 /etc/passwd中有nobody用户

User nobody

查看: vi /etc/passwd   18 nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin

作为哪个用户组运行,即它拥有该用户组的权限,一般都是nogroup,需要在/etc/group文件中有nogroup

Group nogroup

查看:  vi /etc/group   39 nogroup:x:65534:

是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用UTC时间

UseLocaltime

是否记录CGI运行信息,如果没有注释掉,则记录,注释掉则不记录

VerboseCGILogs

服务器名字

ServerName www.chad.com

是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web服务器。一般注释掉,即不需要启动

VirtualHost

非常重要,HTML文档的主目录。如果没有以/开始,则表示从服务器的根路径开始。注意,如果此处设置不正确,将不能打开网页

DocumentRoot /var/www

如果收到一个用户请求的话,在用户主目录后再增加的目录名

UserDir public_html

HTML目录索引的文件名,也是没有用户只指明访问目录时返回的文件名

DirectoryIndex index.html

HTML目录没有索引文件时,用户只指明访问目录时,boa会调用该程序生成索引文件然后返回给用户,因为该过程比较慢最好不执行,

可以注释掉或者给每个HTML目录加上DirectoryIndex指明的文件

DirectoryMaker /usr/lib/boa/boa_indexer

如果DirectoryIndex不存在,并且DirectoryMaker被注释,那么就用Boa自带的索引生成程序来生成目录的索引文件并输出到下面目录,

该目录必须是Boa能读写

DirectoryCache /var/spool/boa/dircache

一个连接所允许的HTTP持续作用请求最大数目,注释或设为0都将关闭HTTP持续作用

KeepAliveMax 1000

HTTP持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接

KeepAliveTimeout 10

指明mime.types文件位置。如果没有以/开始,则表示从服务器的根路径开始。可以注释掉避免使用mime.types文件,此时需要用AddType在本文件里指明

MimeTypes /etc/mime.types

文件扩展名没有或未知的话,使用的缺省MIME类型

DefaultType text/plain

提供CGI程序的PATH环境变量值

CGIPath /bin:/usr/bin:/usr/local/bin

将文件扩展名和MIME类型关联起来,和mime.types文件作用一样。如果用mime.types文件,则注释掉,如果不使用mime.types文件,则必须使用

AddType application/x-httpd-cgi cgi

指明文档重定向路径

Redirect /bar http://elsewhere/feh/bar

为路径加上别名

Alias /doc /usr/doc

非常重要,指明CGI脚本的虚拟路径对应的实际路径。一般所有的CGI脚本都要放在实际路径里,用户访问执行时输入站点+虚拟路径+CGI脚本名

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

用户可以根据自己需要,对boa.conf进行修改,但必须要保证其他的辅助文件和设置必须和boaconf里的配置相符,不然Boa就不能正常工作。

最后将修改好的boa.conf放在开发板上的/etc/boa目录下。

在上面的例子中,我们还需要创建日志文件所在目录/var/log/boa

创建HTML文档的主目录/var/www,将mime.types文件拷贝到/etc目录,

创建CGI脚本所在目录/var/www/cgi-bin/

mime.types文件用来指明不同文件扩展名对应的MIME类型,一般可以直接从Linux主机上拷贝一个,

大部分也都是在主机的/etc目录下,同样,将主机的mime.types文件拷贝到开发板上的/etc目录下。

十一、移植遇到的问题

首先./configure就出现问题了

生成log文件没有权限

chmod 777

然后sudo执行

 我发现这个configure文件其实也是makefile文件

 打开makefile文件把这些编译工具换成arm的

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

43-Golang中的goroutine!!!

Golang中的goroutine进程和线程说明并发和并行并发并行Go协程和Go主线程案例小结goroutine的调度机制MPG模式基本介绍MPG模式运行的状态1MPG模式运行的状态2设置GOlang运行的CPU数不同 goroutine之间如何通讯使用全局变量加锁同步改进程序进程和线程说明 1.进程就是程序在操作…

robosuite添加无碰撞的模型

1 前言 最近在使用robosuite时,需要在仿真环境中可视化物体的目标位置,从而方便观察训练情况,可视化的物体有以下要求: 形状尺寸与操作的物体一样半透明只有visual,不与场景其他物体有碰撞可以在每次step后设置位置,且固定在设定的位置,不受重力影响 2 方法 找了半天,最终确…

javaWeb核心04-CookieSession

文章目录会话技术1&#xff0c;会话跟踪技术的概述2&#xff0c;Cookie2.1 Cookie的基本使用2.2 Cookie的原理分析2.3 Cookie的使用细节2.3.1 Cookie的存活时间2.3.2 Cookie存储中文3&#xff0c;Session3.1 Session的基本使用3.2 Session的原理分析3.3 Session的使用细节3.3.1…

2018年MathorCup数学建模D题公交移动支付问题的评估方案解题全过程文档及程序

2018年第八届MathorCup高校数学建模挑战赛 D题 公交移动支付问题的评估方案 原题再现&#xff1a; 随着智能手机的普及和移动支付技术的提高,越来越多的支付手段可以转移到手机端。现有的现金缴费和实体公交卡刷卡的付费方式存在缺点&#xff0c;如公交卡在使用过程中存在着充…

Landsat8中*_MTL.txt文件详解

01 什么是*_MTL.txt文件&#xff1f;所有的Landsat8 1级数据产品中均包含MTL.txt(Metadata File)文件。Landsat MTL文件包含对数据的系统搜索和归档分类有益的信息。该文件还包含关于数据处理和恶对增强陆地卫星数据有重要价值的信息&#xff08;例如转换为反射率和辐射亮度&am…

Java 集合进阶(二)

文章目录一、Set1. 概述2. 哈希值3. 元素唯一性4. 哈希表5. 遍历学生对象6. LinkedHashSet7. TreeSet7.1 自然排序7.2 比较器排序8. 不重复的随机数二、泛型1. 概述2. 泛型类3. 泛型方法4. 泛型接口5. 类型通配符6. 可变参数7. 可变参数的使用一、Set 1. 概述 Set 集合特点&am…

AI领域通识

人工智能的架构&#xff1a;通常来说&#xff0c;人工智能架构分为四层&#xff1a;最底层的基础层一般由软硬件设施以及数据服务组成。软件设施主要包括智能云平台和大数据平台&#xff0c;比如国外的谷歌大数据平台和国内的百度智能云平台等&#xff1b;硬件设施主要包括CPU硬…

讨论基于最新的(v5或v6版本)UXP插件开发的开发框架的选择问题

看过我的上两篇文章后&#xff0c;相信你对UXP的开发环境已经有一定了解了&#xff0c;然后这里讨论一个问题&#xff0c;UXP的开发可以基于纯htmlcssjs、vue框架、react框架、svelte框架&#xff0c;就是到底用哪种方式开发更好了&#xff1f;一般情况是用自己最熟悉的或者是使…

使用vue脚手架创建vue项目

大家好&#xff0c;这里是 一口八宝周 &#x1f44f;欢迎来到我的博客 ❤️一起交流学习文章中有需要改进的地方请大佬们多多指点 谢谢 &#x1f64f;使用脚手架创建vue项目步骤&#xff1a;切换淘宝镜像npm config set registry https://registry.npm.taobao.org安装脚手架npm…

算法拾遗二十七之窗口最大值或最小值的更新结构

算法拾遗二十七之窗口最大值或最小值的更新结构滑动窗口题目一题目二题目三题目四滑动窗口 第一种&#xff1a;R&#xff0c;R右动&#xff0c;数会从右侧进窗口 第二种&#xff1a;L&#xff0c;L右动&#xff0c;数从左侧出窗口 题目一 arr是N&#xff0c;窗口大小为W&…

C++ linux下获取时间戳 秒、微妙、纳秒

1.例子#include <iostream>#include <sys/time.h>#include <cstdlib>#include <cstdio>#include <ctime>#include <cmath>#include <unistd.h>usingnamespace std;time_t clocktime(){time_t t time(NULL);std::cout << &quo…

聚势合力,电巢与SDIA协会“战略合作签约仪式”圆满落成

前言&#xff1a; 2023年03月02日下午&#xff0c;电巢科技与深圳市平板显示行业协会齐聚深圳南山电巢XR演播厅&#xff0c;共同举办了隆重的战略合作签约仪式。 双方就数字化建设、品牌赋能、人才培养、技术创新等企业服务深入合作上达成一致&#xff0c;合力为产业赋能&…

【OJ比赛日历】快周末了,不来一场比赛吗? #03.11-03.17 #12场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01;更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考&#xff0c;以比赛官网为准目录2023-03-11&…

netty-websocket 鉴权token及统一请求和响应头(鉴权控制器)

自己想法和实现&#xff0c;如果有说错的或者有更好的简单的实现方式可以私信交流一下(主要是实现握手时鉴权) 需求实现 握手鉴权是基于前台请求头 Sec-WebSocket-Protocol的本身socket并没有提供自定义请求头&#xff0c;只能自定义 Sec-WebSocket-Protocol的自协议 问题描述…

你几乎不知道的浏览器内置对象/事件/ajax

浏览器内置对象/事件/ajax 浏览器是⼀个 JS 的运⾏时环境&#xff0c;它基于 JS 解析器的同时&#xff0c;增加了许多环境相关的内容。⽤⼀张图表示各个运⾏环境和 JS 解析器的关系如下&#xff1a; 我们把常⻅的&#xff0c;能够⽤ JS 这⻔语⾔控制的内容称为⼀个 JS 的运⾏环…

Leetcode—环形链表

前言&#xff1a;给定一个链表&#xff0c;判断是否为循环链表并找环形链表的入口点 首先我们需要知道什么是双向循环链表&#xff0c;具体如下图所示。 对于链表&#xff0c;我们如何去判断链表是循环链表呢&#xff1f;又寻找入环点呢&#xff1f;我们可以利用快慢指针的方法…

Meta CTO:Quest 2生命周期或比预期更久

前不久&#xff0c;Meta未来4年路线图遭曝光&#xff0c;泄露了该公司正在筹备中的一些AR/VR原型。除此之外&#xff0c;还有消息称Quest Pro或因销量不佳&#xff0c;而不再迭代。毫无疑问&#xff0c;Meta的一举一动持续受到行业关注&#xff0c;而面对最近的爆料&#xff0c…

关于指针运算的一道题

目录 刚看到这道题的时候我也和大多数小白一样感到无从下手&#xff0c;但是在我写这篇博客的前几分钟开始我对这道题有了一点点的理解。所以我就想着趁热打铁&#xff0c;写一篇博客来记录一下我的想法。 题目如下&#xff1a; 画图&#xff1a; 逐一解答&#xff1a; 题一…

笔记:二叉树

学习了二叉树&#xff0c;今天来整理一下笔记吧&#xff01;一&#xff1a;树的理解树的度是不限制的&#xff0c;一个双亲结点可以有很多子节点&#xff0c;但是子节点是不能交叉的&#xff0c;也就是不能有环。树的的最大层次叫做这棵树的深度或者高度&#xff1b;树的代码表…

高三应该怎么复习

高三是学生们备战高考的重要一年&#xff0c;正确有序的复习可以有效地提高复习效率&#xff0c;下面是一些高效复习的方法和建议&#xff1a;1. 制定合理的学习计划和目标高三的学生要制定合理的学习计划和目标&#xff0c;适当的计划和目标可以使学习更有针对性和效率。建议根…