UNIX环境高级编程 学习笔记 第六章 系统数据文件和信息

2023-11-13

UNIX系统口令文件(POSIX.1称其为用户数据库)包含以下字段,这些字段也包含在头文件pwd.h中定义的passwd结构中:
在这里插入图片描述
由于历史原因,口令文件/etc/passwd是一个ASCII文件,其中的每行都包含以上各字段,字段之间用冒号分隔。

/etc/passwd文件的例子:
在这里插入图片描述
有关口令文件的登录项的注意点:
1.通常有一个用户名为root的登录项,用户ID为0,是超级用户。

2.加密口令字段是一个占位符x,较早期的UNIX系统版本中,该字段存放加密后的密码,但将加密后的密码放在一个人人可读的文件中是一个安全漏洞,所以现在将加密口令放在另一个文件中。

3.某些字段可能为空(连续两个冒号表示两个冒号之间的字段为空)。如加密口令字段为空,则用户没有口令。注释字段为空没有任何影响,如上图的squid登录项。

4.shell字段包含一个可执行程序名,它被用作该用户的登录shell,此字段为空时,默认值为/bin/sh。用户squid的登录项的shell字段为/dev/null,这是一个设备而非可执行文件,目的是阻止任何人以用户squid登录到系统。

5.shell字段填为/bin/false时也可阻止特定用户登录系统,它简单地直接以不成功(非0)状态终止;shell字段也可填为/bin/true来阻止特定用户登录,它直接以成功(0)状态终止。某些系统提供nologin命令,它打印可定制的出错信息,然后以非0状态终止。

6.nobody用户在系统中被特别设计用于运行一些服务或进程,而不是为了与用户交互,它的用户ID(65534)和组ID(65534)不提供任何特权。该用户ID和组ID只能访问人人都可读写的文件(假设用户65534和组65534不拥有任何文件,实际就应该如此)。

7.提供finger命令的某些UNIX系统支持返回注释字段中的附加信息给调用者,finger命令要求注释字段按顺序包含各部分内容:用户姓名、办公室地点、办公室电话号、家庭电话号,各部分之间用逗号分隔,如果注释字段中的用户姓名字段是一个&,则它会被替换为登录名:
在这里插入图片描述
注释字段只是一个注释,不由系统实用程序解释。

某些系统提供vipw命令,允许管理员通过此命令编辑口令文件,此命令用于编辑/etc/passwd和/etc/shadow文件,这两个文件分别存储了系统用户和密码的信息,它以一个安全的方式来修改系统用户的密码和其他信息,因为它会在编辑时锁定这两个文件,这样其他进程就不能修改它们,保证了数据的一致性和完整性。vipw命令会启动一个编辑器(默认是vi或vim),你可以在其中编辑/etc/passwd和/etc/shadow文件,修改用户的信息,比如用户名、UID、GID、Shell、密码等。注意,修改这些文件需要root权限,所以只有系统管理员可以执行这个命令。执行vipw命令时,还会检查/etc/passwd和/etc/shadow文件的语法和格式是否正确,如果发现错误会给出相应的提示。系统也常常由图形用户界面(GUI)提供类似的功能。

POSIX.1定义了两个获取口令文件项的函数,给出用户登录名或UID后,就能查看相关项:
在这里插入图片描述
ls命令会使用getpwuid函数,将文件i节点中的数字用户ID映射为用户登录名。login命令会使用getpwnam函数。

以上函数返回的passwd结构通常是函数内部的静态变量,再次调用其内容会被重写。

SUS的XSI扩展中的有关口令文件的函数,可期望所有UNIX实现都提供这些函数,但POSIX.1标准没有定义这三个函数(POSIX标准是SUS标准的组成部分):
在这里插入图片描述
每次调用getpwent时,它返回口令文件中的下一个记录项(首次调用时,在返回第一条口令文件项前,还会做打开口令文件操作),每次调用此函数时都重写返回的passwd结构。对此函数返回的口令文件项的顺序无要求,有些系统使用散列算法对口令文件中各项排序。

setpwent函数rewind到口令文件的开头,使得下次调用getpwent时返回第一条口令文件项。

endpwent函数会关闭getpwent函数打开的口令文件,用这个函数关闭打开的口令文件的原因是getpwent函数不知道何时应该关闭口令文件。

getpwnam函数的一个实现:

#include <pwd.h>
#include <string.h>

struct passwd *getpwnam(const char *name) {
    struct passwd *ptr;

    setpwent();    // 确保调用者在以前已经调用getpwent打开了口令文件的情况下,rewind到文件开始处
    while ((ptr = getpwent()) != NULL) {
        if (strcmp(name, ptr->pw_name) == 0) {
		    break;
		}
    }
    endpwent();
    return ptr;    // ptr is NULL if no match found
}

加密口令是经单向加密算法处理过的用户口令副本,不能从加密口令反变换到原来的口令,但可对口令进行猜测,将猜测的口令经单向算法变换成加密形式,然后将其与用户的加密口令相比较。

某些系统将加密口令存放在阴影口令文件中,该文件至少要包含用户名和加密口令,与该口令相关的其他信息也可放在该文件中:
在这里插入图片描述
阴影口令文件不应是一般用户可以读取的,仅有少数几个程序需要访问加密口令,如login、passwd,这些程序常常是设置用户ID为root的程序。

Linux 3.2.0和Solaris 10中访问阴影口令文件的函数:
在这里插入图片描述
FreeBSD 8.0和Mac OS X 10.6.8中没有阴影口令结构,这两个系统中附加的账户信息(如账户有效期)存放在口令文件中。

UNIX组文件(POSIX.1称其为组数据库)包含以下字段,这些字段包含在头文件grp.h定义的group结构中:
在这里插入图片描述
字段gr_mem是一个指针数组,其中每个指针指向一个属于该组的用户名,该数组以null指针结尾。

POSIX.1定义的返回指定组的group结构的函数:
在这里插入图片描述
这两个函数也常返回指向一个静态变量的指针,每次调用时都重写该静态变量。

搜索整个组文件(由SUS的XSI扩展定义,不是基本POSIX.1组成,所有UNIX都提供这3个函数):
在这里插入图片描述
setgrent函数打开组文件(如它尚未打开)并rewind它。

用户执行newgrp命令可更改用户所在的实际组ID,执行不带参数的newgrp命令可回到与该用户名相同的预设组。

4.2 BSD引入了附属组ID,一个用户除了属于一个组外,还可属于至多16个另外的附属组。文件访问权限也修改为:不仅将进程的有效组ID与文件的组ID相比,也将所有附属组ID与文件的组ID比较。

POSIX.1早期版本中附属组ID特性是可选的。常量NGROUPS_MAX规定了附属组ID的数量,常用值为16。

获取和设置附属组ID的函数:
在这里插入图片描述
POSIX.1只说明了getgroups函数,因为setgroups和initgroups函数是特权操作,所以它们并非POSIX.1的组成部分。Mac OS X 10.6.8中,initgroupus函数的basegid参数的类型为int。

getgroups函数将进程所属用户的各附属组ID填到grouplist参数中,填入数量最多是参数gidsetsize个,返回实际填写到数组中的附属组ID数。如果参数gidsetsize为0,则函数不修改grouplist参数,但会返回附属组ID数,这样可确定grouplist参数数组的长度,以便进行分配空间。

setgroups函数可由root用户调用为调用进程设置附属组ID表,参数grouplist是组ID数组,参数ngroups说明了数组中的元素数(此值不能大于NGROUPS_MAX)。

通常只有initgroups函数调用setgroups函数(因此initgroups函数也需要超级用户权限),initgroups函数一般读整个组文件,然后用组文件中数据初始化username参数表示的用户的附属组,参数basegid也会加入用户的附属组中。login命令在用户登录时会调用此函数。

不同平台存储用户和组信息的方式:
在这里插入图片描述
Mac OS X只在单用户模式下使用/etc/passwd和/etc/master.passwd(单用户模式下可执行系统的维护任务,通常此模式下会关闭系统服务,如目录服务守护进程),在正常的多用户模式期间,目录服务守护进程提供对用户和组账户信息的访问。

对于阴影口令文件中的不活动字段,Solaris将其定义为自用户上次登录后到下次账户自动失效之间的天数,Linux将其定义为达到口令失效的尚余天数。

很多系统中,用户和组数据库是用网络信息服务(Network Information Service,NIS)实现的,管理员可编辑数据库的主副本,然后将它自动分发到组织中所有服务器上,客户联系服务器查看用户和组的有关信息,NIS+轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)提供了类似功能。很多客户通过配置文件/etc/nsswitch.conf控制管理每一类信息的方法。

对于除口令文件和组文件外的一些系统数据文件,一般为每个数据文件至少提供3个函数:
1.get函数:读下一条记录,如果要读的文件未打开,则先打开该文件,此函数通常返回指向一个结构的指针,该指针指向一个静态存储类结构,当到达文件尾端时返回空指针。

2.set函数:打开相应数据文件(如果该文件未打开),然后rewind该文件。

3.end函数:关闭相应数据文件。

除以上3个函数外,如果数据文件支持某种形式的键搜索,则也提供搜索指定键对应数据的例程,如口令文件有getpwnam函数搜索指定用户名的记录和getpwuid函数搜索指定用户ID的记录。
在这里插入图片描述
Solaris中,上图里的最后4个文件都是符号链接,链接到/etc/inet下的同名文件上。

FreeBSD中,阴影口令文件是/etc/master.passwd,可使用特殊命令编辑该文件,该命令会产生阴影口令文件的一个副本,该副本名为/etc/passwd;另外,此命令也产生一个/etc/master.passwd文件的散列副本(/etc/spwd.db)和一个/etc/passwd的散列副本(/etc/pwd.db),这些散列副本为更大的系统提供更好的性能。

大多UNIX系统都提供下列两个数据文件:utmp文件记录当前登录到系统的各个用户;wtmp文件跟踪各个登录和注销事件。在V7中,这两个文件中写入的是以下结构的二进制记录:
在这里插入图片描述
登录时,login程序填写此类型结构,然后将其写入utmp文件和wtmp文件,注销时,init进程将utmp文件中的相应记录擦除(每个字节都填为null字节),并将一个新纪录(此记录的ut_name字段为0)添加到wtmp文件中。在系统重启动后和更改系统时间前后,都会在wtmp文件追加特殊的记录项。who命令读取utmp,并以可读形式打印其中内容(当前登录用户信息);last命令读wtmp文件并打印其中记录。

utmp结构中的信息在V7中有20字节,在SVR2中被扩充为36字节,而在SVR4中被扩充为多于350字节。

Solaris中,utmp和wtmp文件在/var/adm目录下;FreeBSD 8.0和Linux 3.2.0中,这两个文件的路径为/var/run/utmp和/var/log/wtmp;Mac OS X 10.6.8中,utmp和wtmp文件不存在。

POSIX.1定义的返回与主机和操作系统相关信息的函数:
在这里插入图片描述
此函数执行时会填写传入到name参数的utsname结构,POSIX.1只定义了该结构中最少需提供的字段,这些字段都是以null结尾的字符数组,每个数组的长度由实现确定:
在这里插入图片描述
utsname结构中的内容可由uname命令打印。

utsname结构没有给出POSIX.1版本的信息,应使用宏_POSIX_VERSION获得此信息。

BSD派生的系统提供gethostname函数,它只返回主机名,该名字通常是TCP/IP网络上主机的名字:
在这里插入图片描述
namelen参数指定name参数的长度,如果空间足够,则返回的字符串以null结尾,否则不确定。

现在POSIX.1也定义了gethostname函数,该标准指定最大主机名长度为HOST_NAME_MAX。
在这里插入图片描述
hostname命令可获取和设置主机名,主机名通常在系统自举时设置,文件名由程序/etc/rc或init取自一个启动文件。

UNIX内核提供的基本时间服务是计算自协调世界时(Coordinated Universal Time,UTC)的19700101 00:00:00时间以来经过的秒数,这个秒数存放于数据类型time_t,称其为日历时间。

返回当前的UNIX时间戳:
在这里插入图片描述
时间戳作为函数值返回,如果参数calptr非空,时间戳同时也存放在该参数指向的空间。

POSIX.1的实时扩展增加了对多个系统时钟的支持,在SUS v4中,控制这些时钟的接口从可选组移到基本组。时钟通过clockid_t类型进行标识:
在这里插入图片描述
以下函数可获取特定时钟的时间:
在这里插入图片描述
当参数clock_id设为CLOCK_REALTIME时,由于timespec结构把时间表示为秒和纳秒,因此在系统支持高精度时间值的情况下,colck_gettime函数比time函数的精度更高。

获取特定时钟的精度:
在这里插入图片描述
如果参数clock_id表示的时钟的精度为1毫秒,则tsp参数指向的timespec结构的tv_sec字段为0,tv_nsec字段为1000000。

设置特定时钟的时间:
在这里插入图片描述
更改时钟值需要特权,有些时钟是不能修改的。

System V派生的系统使用stime函数设置系统时间;BSD派生的系统使用settimeofday函数设置系统时间。

SUS v4指定gettimeofday函数已经弃用,但还有很多程序使用它,因为它相比于time函数能提供更高的精度(微秒级):
在这里插入图片描述
tzp参数的唯一合法值是NULL,其他值会产生不确定的结果,某些平台用tzp参数说明时区,这完全依实现而定,SUS对此没有定义。

gettimeofday函数返回以timeval结构表示的UNIX时间戳,该结构将UNIX时间戳表示为秒和微秒。

取得UNIX时间戳后,通常调用函数将其转换为tm结构:
在这里插入图片描述
然后通常调用另一函数将tm结构转换为人可读的时间和日期,各个时间函数之间的关系:
在这里插入图片描述
上图中用虚线表示的函数受环境变量TZ的影响,它们会用TZ的值代替系统默认时区,如果TZ定义为空串,则使用UTC(世界各地的时区都是用与UTC的正负偏移量来表示的)。

tm结构中秒的最大值超过59,因为这样可以表示闰秒;除月、日外,tm结构中其他字段都以0开始;如果夏令时生效,则夏令时标志为正,如果为非夏令时时间,则该标志为0,如果此信息不可用,则其值为负。

SUS的以前版本允许双闰秒,tm_sec字段的最大值为61,UTC的正式定义不允许双闰秒,因此现在tm_sec值最大值定义为60。

将UNIX时间戳转换为tm结构:
在这里插入图片描述
localtime函数可将日历时间转换为本地时间(即考虑时区和夏令时标志);gmtime函数将日历时间转换成UTC的tm结构。

将tm结构转换为日历时间:
在这里插入图片描述
将tm结构转换为格式化字符串:
在这里插入图片描述
函数asctime和ctime能用于产生一个26字节的可打印字符串,类似date命令的输出,但这些函数已被标记为弃用,因为它们容易出现缓冲区溢出的问题。

strftime_l函数允许调用者指定时区。strftime使用TZ环境变量指定时区。

参数tmptr指向一个tm结构,是要格式化的时间值,格式化的结果存放在参数buf表示的数组中,数组的大小由maxsize参数指明(单位为字节数),如果缓冲区能容纳格式化的结果和一个null终止符,则该函数返回在buf中存放的字节数(不含null),否则函数返回0。

format参数控制输出的格式,其中的“转换说明”会转换为特定的时间,其他字符原样输出,ISO C规定的“转换说明”如下:
在这里插入图片描述
strftime函数的每个转换说明产生一个定长的输出字符串,因此format参数字符串中没有字段宽度修饰符。

上图中%U表示该日期在该年中所属的周数,包含第一个星期日的周是第一周。%W与%U类似,但它将包含第一个星期一的周看做第一周。%V认为如果包含了1月1日的那周包含了新一年的4天及以上的天数,那么该周为一年中的第一周,否则该周被认为是上一年的最后一周。

strftime函数对某些转换说明支持修饰符,可使用E和O修饰符产生本地支持的另一种格式,某些系统支持另一些非标准的扩充支持。

使用strftime函数:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    time_t t;
    struct tm *tmp;
    char buf1[16];
    char buf2[64]; 

    time(&t);
    tmp = localtime(&t);
    if (strftime(buf1, 16, "time and date: %r, %a %b %d %Y", tmp) == 0) {
        printf("buffer length 16 is too small\n");
    } else {
        printf("%s\n", buf1);
    }

    if (strftime(buf2, 64, "time and date: %r, %a %b %d %Y", tmp) == 0) {
        printf("buffer length 64 is too small\n");
    } else {
        printf("%s\n", buf2);
    }

    exit(0);
}

运行它:
在这里插入图片描述
strptime函数将字符串时间分解为tm结构:
在这里插入图片描述
参数format给出了buf参数指向的缓冲区内的字符串的格式,format参数中的转换说明与strftime函数的转换说明稍有不同:
在这里插入图片描述
加密口令要从阴影文件中获取而不能从口令文件中获取(在FreeBSD 8.0中,仅当调用者的有效用户ID为0时,即是root用户时,getpwnam或getpwuid函数返回的口令文件项的加密口令字段pw_passwd含加密口令;Mac OS X 10.6.8中,加密口令无法通过本章中的函数获取)。

在系统Linux 3.2.0和Solaris 10上,有超级用户权限时,可用以下程序从阴影口令文件中获取加密口令,如没有超级用户权限,调用getspnam会返回EACCESS错误:

#include <stdio.h>
#include <shadow.h>
#include <stdlib.h>

int main() {    // Linux/Solaris version
    struct spwd *ptr;

    if ((ptr = getspnam("sar")) == NULL) {
        printf("getspnam error\n");
		exit(1);
    }
    printf("sp_pwdp = %s\n", (ptr->sp_pwdp == NULL || ptr->sp_pwdp[0] == 0) ? "(null)" : ptr->sp_pwdp);
    exit(0);
}

在FreeBSD 8.0中,在具有超级用户权限时,可用以下程序从口令文件中输出加密口令,如果没有超级用户权限,则加密字段为星号:

#include <pwd.h>
#include <stdlib.h>
#include <stdio.h>

int main() {
    struct passwd *ptr;

    if ((ptr = getpwnam("sar")) == NULL) {
        printf("getpwnam error\n");
		exit(1);
    }
    printf("pw_passwd = %s\n", (ptr->pw_passwd == NULL || ptr->pw_passwd[0] == 0) ? "(null)" : ptr->pw_passwd);
    exit(0);
}

以上程序在Mac OS X 10.6.8上,不管运行时用户是什么权限都输出星号。

使用strftime函数输出类似date命令的格式化串:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAXLINE 1024

int main() {
    time_t caltime;
    struct tm *tm;
    char line[MAXLINE];

    if ((caltime = time(NULL)) == -1) {
        printf("time error\n");
		exit(1);
    }
    if ((tm = localtime(&caltime)) == NULL) {
        printf("localtime error\n");
		exit(1);
    }
    if (strftime(line, MAXLINE, "%a %b %d %X %z %Y\n", tm) == 0) {
        printf("strftime error\n");
		exit(1);
    }
    fputs(line, stdout);
    exit(0);
}

运行它:
在这里插入图片描述
可见strftime函数输出TZ环境变量表示的时区的时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UNIX环境高级编程 学习笔记 第六章 系统数据文件和信息 的相关文章

  • 如何使用 bash 粘贴来自单独文件的列?

    我想用分隔符 合并不同的列表 第一个列表有 2 个单词 cat first one who 第二个列表有 10000 个单词 cat second languages more simple advanced home expert tes
  • 如何在Linux中获取带有图标的活动应用程序

    我想找到一种方法获取活动应用程序的列表及其名称和图标 实际上 我正在使用此命令来获取所有活动进程 wmctrl lp 示例输出 0x03800002 0 3293 user notebook XdndCollectionWindowImp
  • 如何从C程序执行C程序的shell中更改环境变量?

    我想改变的值PATHC 程序中的变量 然后在运行该程序的 shell 中查看更改后的值 做这样的事情 include
  • 如何在 VIm 和终端中始终拥有相同的当前目录?

    我希望我的终端当前目录跟随我的 VIM 目录 Example 在终端中 gt pwd gt Users rege gt vim 然后在VIM中 cd Users rege project
  • VMA和ELF段之间的关系

    我需要确定 ELF 可执行文件的可加载段的 VMA VMA 可以从以下位置打印 proc pid maps VMA 之间的关系如下所示maps可加载段对我来说也很清楚 每个段由一个或多个 VMA 组成 内核使用什么方法从 ELF 段形成 V
  • 如何在 Linux/Unix 上根据文件类型添加文件扩展名?

    这是一个关于 Unix shell 脚本 任何 shell 的问题 但任何其他 标准 脚本语言解决方案也将受到赞赏 我有一个充满文件的目录 其中文件名是这样的哈希值 fd73d0cf8ee68073dce270cf7e770b97 fec8
  • 如何使用 netcat 发送文件并保持连接?

    我发出命令 netcat serveraddress myport lt MY FILE 问题是 一旦文件发送完毕 netcat 就会发送一条消息来关闭连接 发送该文件后 我需要从控制台写入消息 我记得对标准输入做了一些事情 是这样的吗 n
  • 为什么符号链接的权限默认为所有许可?

    当我使用创建硬链接时ln ln testfile txt testfile2 txt 文件硬链接 通过 inode 表中两个别名的相同 inode 编号进行确认ls li 对硬链接文件具有与原始名称文件相同的初始权限 1222285 rw
  • 如何从 Unix 文件中删除空行

    我需要从输入文件中删除所有空白行并写入输出文件 这是我的数据如下 11216 33 1032747 64310 1 0 0 1 878 0 0 0 1 1 1 087 5 1 1 18 JAN 13 000603221321 11216 3
  • 使用 xlib 在屏幕顶部绘图

    我想在屏幕上的所有窗口顶部绘制一些图元 我在 C 中找到了一些代码并尝试将其移植以使用 python 的 xlib from Xlib display import Display from Xlib import X from Xlib
  • 在 bash 脚本中检测鼠标点击

    我想知道如何在后台运行 bash 脚本 每当用户单击鼠标时该脚本都会执行某些操作 即运行脚本或命令或其他任何内容 即使终端关闭 我也希望它继续运行 有任何想法吗 谢谢 如果您使用的是X11 您可以尝试xdotool捕获鼠标事件 它会是这样的
  • 如何在 *nix 中登录时运行脚本?

    我知道我曾经知道如何做到这一点 但是 如何在 unix 中登录时运行脚本 bash 可以 From 维基百科 Bash http en wikipedia org wiki Bash 28Unix shell 29 当 Bash 启动时 它
  • 如何捕获 X 错误?

    我尝试在网上搜索 但我必须注意 找到有关 X 编程这方面的材料并不容易 我使用 X 和 GLX 来创建 OpenGL 上下文 我已经知道我当前的显卡驱动程序仅支持 OpenGL API 版本 3 3 但我希望我的应用程序能够尝试创建任何类型
  • UNIX 查找:与 -newer 选项相反的选项是否存在?

    我知道unix的find命令有这个选项 find version GNU find version 4 1 newer file Compares the modification date of the found file with t
  • 在 Python 中删除 root 权限

    我想让一个Python程序开始侦听端口80 但之后执行时无需root权限 有没有办法放弃 root 或在没有 root 的情况下获取端口 80 如果没有 root 权限 您将无法在端口 80 上打开服务器 这是对操作系统级别的限制 因此 唯
  • 从 root Android 应用程序运行二进制文件

    我想运行一个二进制文件 dev local名为native 我通过adb推送它 具有root权限 为了实现这一点 我编写了以下代码 try root Runtime getRuntime exec su DataOutputStream o
  • 查找从 unix 命令行输入的单词出现的次数

    对于文件file1 txt其中包含 Apple fruit Apple tree Tree AApple AApklle Apple apple TREE Apple 我想查找该单词出现的次数Apple 输出应该是4 我的 script s
  • 很好的 C 库集合? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个很好的 ANSI C 库集合 用于处理向量 哈希映射 二进制树 字符串处理等 Try g
  • Bash:将输出传输到后台进程?

    我想将一个进程放入后台 然后多次将数据传递给它 例如 cat The command I want to write into cat pid Getting the process id of the cat process echo h
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也

随机推荐

  • Eclispse中Run on Server窗口让选择Server,但已经存在的选择不了

    对于这种问题 通常是因为版本不匹配造成的 jdk版本 Dynamic Web Modules版本 只要改到相应版本就好了 jdk7 时Dynamic Web Modules应设为2 5 如果无法修改 可以新建一个工程 在新建工程时选择Dyn
  • 记忆深处有尘埃——Memory Compiler

    Memory是大家Floorplan中经常使用到一个器件 而且需要花费不少时间去摆放它 Memory的种类很多 各种类型还分别具有不同的参数 那大家有没有想过 对一个设计来说 我们是如何去选择合适的memory类型 不同的类型有什么区别 在
  • 作为一名程序员,如何开展自己的副业?月赚三万的真实故事

    作为一名程序员 除了敲代码之外还应该有一些副业 我们都是程序员 大多数都是普通人 都在替别人打工 虽然收入在别人眼中挺高 但是连个首付都付不起 这时 首先得要发展副业 与其拿着死工资 还不如做些啥 今天 我所说的不是教大家如何去挣很多钱 而
  • mavon-editor 页面回显使用turndown将HTML转为markdown

    1 安装npm install turndown npm install turndown 2页面使用 v model markdowntext
  • 后端接口返回近万条数据,前端渲染缓慢,content Download 时间长的优化方案

    前言 性能优化 是前端绕过不去的一道门槛 甚是重要 最近一年 也很少有机会在项目中进行前端性能优化 一直在忙于业务开发 最近终于是来了机会 遇到了这样的场景 心里也甚是激动 写个随笔记录下性能优化的过程及逻辑 有需要的可以参考下 场景 后端
  • 机器学习实战笔记8(kmeans)

    前面的7次笔记介绍的都是分类问题 本次开始介绍聚类问题 分类和聚类的区别在于前者属于监督学习算法 已知样本的标签 后者属于无监督的学习 不知道样本的标签 下面我们来讲解最常用的kmeans算法 1 kmeans算法 算法过程 Kmeans中
  • Spring核心思想 IOC 、 AOP

    Spring核心思想 IOC AOP IOC 1 什么是IOC 2 IOC解决了什么问题 IoC解决对象之间的耦合问题 3 IOC和DI的区别 AOP 1 什么是AOP 2 AOP在解决什么问题 3 为什么叫切面编程 内容就不展示了 里面已
  • Python自动检查哪位学生未提交作业

    最近期未需要对学生提交的作业进行统计 给平时成绩 总共交了8次作业 每个作业都有2个班 数量太多 于是就利用Python写了一个程序来自动实现 思想 获取指定路径下的所有文件名 如果文件名中包含了学生的名字 因为提交作业的时候以学号 名字进
  • 基于TMF SID的高可扩展性数据模型

    基于TMF SID的高可扩展性数据模型 前言 此文根据TMF SID规范撰写 欢迎大家提出建议和意见 TMF文档版权信息 Copyright TeleManagement Forum 2013 All Rights Reserved Thi
  • Flutter Windows应用开发环境配置

    为什么要入Flutter开发的坑 首先在当今Windows开发已经逐渐成为一个偏小众的领域 不仅要涉及的知识面广 还对开发人员的要求不低 界面的精美也成为一个重要因素 目前已知的Windows 客户端主要分成以下几种 开发语言 Qt C C
  • Android登录 之 Twitter登录

    作为Android登录 之 GooglePlay登录的姊妹篇 这俩篇主要是对接国外平台登录的文章 作者文笔并不好 但是 管他呢 实现功能不就得了嘛 Twitter官网 兄弟们自带梯子啊 然后按照流程 创建申请什么的 也就不多说了 接下来就是
  • Google C++风格指南 阅读笔记

    这个Google C 风格指南出得太好了 有很多C 的问题 其实通过阅读这份文档就可以了 相信读完后 可以在简历上加上一句 具有良好的编码风格 哈哈 下面记录一下我的读书笔记吧 整份文档的中文版本我已经上传到了资源里面 1 头文件 1 1头
  • 在vue使用jsx来解决template中复杂的逻辑处理

    1 首先安装依赖 npm install postcss loader autoprefixer babel loader babel core 2 在 babelrc文件中修改 把 presets env stage 2 plugins
  • 【Python】Windows如何在cmd中切换python版本

    相信很多小伙伴都会有像我一样经历 在windows中装了很多python版本 那么如果我们正式使用的时候应该如何切换呢 方法一 从环境变量中切换python 第一步 打开环境变量 第二步 打开系统变量中Path变量 第三步 将你想使用的Py
  • spring 多个切面的执行顺序及原理

    最近和同事聊起来了springAOP的话题 说了到多个切面的时候程序是怎么执行的 我们常用的spring事务本身也是一个切面 使用的AOP原理 本人从网上找了一些资料 然后根据这些资料进行一下总结 资料地址 1 https blog csd
  • CodeLlama本地部署的实战方案

    大家好 我是herosunly 985院校硕士毕业 现担任算法研究员一职 热衷于机器学习算法研究与应用 曾获得阿里云天池比赛第一名 CCF比赛第二名 科大讯飞比赛第三名 拥有多项发明专利 对机器学习和深度学习拥有自己独到的见解 曾经辅导过若
  • C++:没有与参数列表匹配的构造函数

    报错 E0289 没有与参数列表匹配的构造函数 sales data sales data 实例 初始化一个实例对象 类内定义的构造函数 报错原因 构造函数中第二个参数的类型为 unsigned 而引用只能是引用一个对象 实例化对象时 括号
  • 神经网络(十四)Pytorch完整模型训练和调用GPU加速

    一 模型的训练 Step1 准备数据集 import torchvision train data torchvision dataset CIFAR10 data train True transform torchvision ToTe
  • 微信投屏服务器出错,微信发布7.0.21版本,修复异常问题,增加超实用新功能

    原标题 微信发布7 0 21版本 修复异常问题 增加超实用新功能 iOS微信又更新了 今天发布v7 0 21版本 距离上次更新才两个礼拜的时间 以往微信的更新频率是比较慢的 这次之所以如此之快地发布新版本 感觉是与问题修复有关 因为之前有一
  • UNIX环境高级编程 学习笔记 第六章 系统数据文件和信息

    UNIX系统口令文件 POSIX 1称其为用户数据库 包含以下字段 这些字段也包含在头文件pwd h中定义的passwd结构中 由于历史原因 口令文件 etc passwd是一个ASCII文件 其中的每行都包含以上各字段 字段之间用冒号分隔