当前位置: 首页 > news >正文

sed awk 第二版学习(十一)—— 交互式拼写检查器 spellcheck.awk

目录

1. 脚本代码

2. 执行情况

3. 代码详解

(1)BEGIN 过程

(2)主过程

(3)END 过程

(4)支持函数

4. 附加说明


        这是一个基于 UNIX spell 程序的名为 spellcheck 的 awk 脚本,功能是将 spell 发现的每个单词都显示给用户,并询问是否要修改这个单词。可以在每次遇到这个单词时进行修改,或者可以一次将所有的拼写错误都改掉。用户还可以选择添加单词,这些单词以后将由 spell 从本地字典文件中找到。

        要让该脚本正常工作需要安装 spell 程序包及其字典。下面的命令安装 aspell 程序和英文字典:

yum -y install aspell aspell-en

1. 脚本代码

spellcheck.awk 脚本文件内容如下:
# spellcheck.awk -- 交互式拼写检查器
#
# 作者:Dale Dougherty
#
# 用法:awk -f spellcheck.awk [+dict] file
# 用 spellcheck 作为 shell 程序的名字
# SPELLDICT = "dict"
# SPELLFILE = "file"# BEGIN 操作完成下面的任务:
#      1) 处理命令行参数
#      2) 创建临时文件名
#      3) 执行 spell 程序来创建单词列表文件
#      4) 显示用户响应列表BEGIN {
# 处理命令行参数
# 至少两个参数 -- awk 和文件名if (ARGC > 1) {# 如果多于两个参数,第二个参数为 dictif (ARGC > 2) {# 测试如果字典被指定为“+”,将 ARGV[1] 赋给 SPELLDICTif (ARGV[1] ~ /^\+.*/)SPELLDICT = ARGV[1]elseSPELLDICT = "+" ARGV[1]# 将 ARGV[2] 赋给 SPELLFILESPELLFILE = ARGV[2]# 删除参数,这样 awk 将不把它们当作文件打开delete ARGV[1]delete ARGV[2]}# 不多于两个参数else {# 将文件 ARGV[1] 赋给 SPELLFILESPELLFILE = ARGV[1]# 测试本地字典文件是否存在if (! system ("test -r dict")) {# 如果存在,询问是否使用它printf ("Use local dict file? (y/n)")getline reply < "-"# 如果回答是,使用“dict”if (reply ~ /[yY](es)?/){SPELLDICT = "+dict"}}}} # 处理参数个数大于 1 的过程结束# 如果参数个数不大于 1,那么打印 shell 命令的用法else {print "Usage: spellcheck [+dict] file"exit 1}# 处理命令行参数的过程结束# 创建临时文件名,每个以 sp_ 开头wordlist = "sp_wordlist"spellsource = "sp_input"spellout = "sp_out"# 将 SPELLFILE 复制到临时输入文件system("cp " SPELLFILE " " spellsource)# 现在运行 spell 程序,将输出发送到 wordlistprint "Running spell checker ..."if (SPELLDICT)SPELLCMD = "spell " SPELLDICT " "elseSPELLCMD = "spell "system(SPELLCMD spellsource " > " wordlist )# 测试单词列表,看是否有拼错的单词出现if ( system("test -s " wordlist ) ) {
# 如果单词列表为空(或拼写命令失败),退出print "No misspelled words found."system("rm " spellsource " " wordlist)exit}# 将单词列表文件赋给 ARGV[1] 使得 awk 能读取它ARGV[1] = wordlist# 显示用户响应列表responseList = "Responses: \n\tChange each occurrence,"responseList = responseList "\n\tGlobal change,"responseList = responseList "\n\tAdd to Dict,"responseList = responseList "\n\tHelp,"responseList = responseList "\n\tQuit"responseList = responseList "\n\tCR to ignore: "printf("%s", responseList)
} # BEGIN 过程结束# 主过程,处理单词列表的每行,目的是显示拼错的单词并提示用户进行适当的处理。
{
# 设置拼错的单词misspelling = $1response = 1++word
# 打印拼错的单词并提示用户响应while (response !~ /(^[cCgGaAhHqQ])|^$/ ) {printf("\n%d - Found %s (C/G/A/H/Q/):", word, misspelling)getline response < "-"}
# 现在处理用户的响应
# CR - 回车表示忽略当前的单词
# 帮助if (response ~ /[Hh](elp)?/) {# 显示响应列表并再给出提示printf("%s", responseList)printf("\n%d - Found %s (C/G/A/Q/):", word, misspelling)getline response < "-"}
# 退出if (response ~ /[Qq](uit)?/) exit
# 添加到字典if ( response ~ /[Aa](dd)?/) {dict[++dictEntry] = misspelling}
# 对每个出现的都进行修改if ( response ~ /[cC](hange)?/) {# 读取收集的文件的每一行newspelling = ""; changes = ""while( (getline < spellsource) > 0){# 调用函数显示拼错单词的行,并提示用户对每个进行更正make_change($0)# 所有行都被加入到临时输出文件print > spellout}# 读完所有的行,关闭临时输入和临时输出文件close(spellout)close(spellsource)# 如果做了修改if (changes){# 显示被修改的行for (j = 1; j <= changes; ++j)print changedLines[j]printf ("%d lines changed. ", changes)# 在保存前执行确认confirm_changes()}}
# 全局修改if ( response ~ /[gG](lobal)?/) {# 调用函数来提示更正并显示被修改的行,在保存之前让用户确认所有的修改make_global_change()}
} # 主过程结束# END 过程使所有的修改成为永久性的。它覆盖原始文件并将单词添加到字典中,还删除临时文件。END {
# 如果到达这时只读取了一个记录,没有做修改,那么退出。if (NR <= 1) exit
# 用户必须对保存更正的文件给出确认while (saveAnswer !~ /([yY](es)?)|([nN]o?)/ ) {printf "Save corrections in %s (y/n)? ", SPELLFILEgetline saveAnswer < "-"}
# 如果答案是,那么将临时输入文件转移到 SPELLFILE 中,保存旧的 SPELLFILE 以防万一if (saveAnswer ~ /^[yY]/) {system("cp " SPELLFILE " " SPELLFILE ".orig")system("mv " spellsource " " SPELLFILE)}
# 如果答案为不,那么删除临时输入文件if (saveAnswer ~ /^[nN]/)system("rm " spellsource)# 如果单词已经被添加到字典中,那么提示用户确认保存在当前字典中。if (dictEntry) {printf "Make changes to dictionary (y/n)? "getline response < "-"if (response ~ /^[yY]/){# 如果没有定义字典,那么使用“dict”if (! SPELLDICT) SPELLDICT = "dict"# 遍历数组并将单词添加到字典中sub(/^\+/, "", SPELLDICT)for ( item in dict )print dict[item] >> SPELLDICTclose(SPELLDICT)# 排序字典文件system("sort " SPELLDICT "> tmp_dict")system("mv " "tmp_dict " SPELLDICT)}}
# 删除单词列表system("rm sp_wordlist")
} # END 过程结束# 函数的定义# make_change -- 提示用户对当前输入行中的拼写错误进行更正。
#                调用它自己找到字符串中的其它错误
#     stringToChange -- 初始为 $0,因此和 $0 的子串不匹配
#     len -- 从 $0 开始到被匹配字符串的末尾的长度
# 假定已经定义了 misspelling。function make_change (stringToChange, len, # 参数line, OKmakechange, printstring, carets) # 局部变量
{
# 在 stringToChange 中匹配拼错的单词,否则什么也不做if ( match(stringToChange, misspelling) ) {# 显示匹配的行printstring = $0gsub(/\t/, " ", printstring)print printstringcarets = "^"for (i = 1; i < RLENGTH; ++i)carets = carets "^"if (len)FMT = "%" len+RSTART+RLENGTH-2 "s\n"elseFMT = "%" RSTART+RLENGTH-1 "s\n"printf(FMT, carets)# 如果没有定义,提示用户更正if (! newspelling) {printf "Change to:"getline newspelling < "-"}# 回车表示忽略# 如果用户输入更正并确认while (newspelling && ! OKmakechange) {printf ("Change %s to %s? (y/n):", misspelling, newspelling)getline OKmakechange < "-"madechg = ""# 测试响应if (OKmakechange ~ /[yY](es)?/ ) {# 做修改(只在第一次遇到时)madechg = sub(misspelling, newspelling, stringToChange)}else if ( OKmakechange ~ /[nN]o?/ ) {# 提供重新更正的机会printf "Change to:"getline newspelling < "-"OKmakechange = ""}} # while 循环结束# 如果 len 为真,则处理 $0 的子串if (len) {# 对它进行汇编line = substr($0,1,len-1)$0 = line stringToChange}else {$0 = stringToChangeif (madechg) ++changes}# 将修改过的行放入数组中以备显示if (madechg)changedLines[changes] = ">" $0# 创建子串使得可以和其它情况相匹配len += RSTART + RLENGTHpart1 = substr($0, 1, len-1)part2 = substr($0, len)# 余下的部分中,是否存在拼错的单词make_change(part2, len)} # if 结构结束} # 函数 make_change() 结束# make_global_change -- 提示用户对所有拼错的行进行全局修改,没有参数
# 假定已经定义了 misspelling。function make_global_change( newspelling, OKmakechange, changes)
{
# 提示用户对当前拼错的单词进行更正printf "Globally change to:"getline newspelling < "-"# 回车表示忽略
# 如果有回答,确认while (newspelling && ! OKmakechange) {printf ("Globally change %s to %s? (y/n):", misspelling, newspelling)getline OKmakechange < "-"# 测试响应并做修改if (OKmakechange ~ /[yY](es)?/ ) {# 打开文件,读取所有的行while( (getline < spellsource) > 0){# 如果找到匹配,用 gsub 做修改并打印每个被修改的行。if ($0 ~ misspelling) {madechg = gsub(misspelling, newspelling)print ">", $0changes += 1 # 计算修改的行数}# 将所有行写入临时输出文件print > spellout} # 读取文件的 while 循环结束# 关闭临时文件close(spellout)close(spellsource)# 报告修改的数量printf ("%d lines changed. ", changes)# 保存修改前执行确认函数confirm_changes()} # if (OKmakechange ~ y) 结束# 如果更正没有被确认,提示输入新的单词else if ( OKmakechange ~ /[nN]o?/ ){printf "Globally change to:"getline newspelling < "-"OKmakechange = ""}} # 提示用户进行更正的 while 循环结束} # 函数 make_global_change() 结束# confirm_changes -- 在保存修改之前确认function confirm_changes( savechanges) {
# 在保存修改之前提示用户确认while (! savechanges ) {printf ("Save changes? (y/n)")getline savechanges < "-"}
# 如果确认,用输出代替输入if (savechanges ~ /[yY](es)?/)system("mv " spellout " " spellsource)
}

2. 执行情况

# 待检查的文件 ch00 中有五行内容
$ cat ch00
SparcStation
languauge
nawk
Utlitities
tar xvf filename# 执行脚本调用 spell 程序检查文件中单词的拼写错误,并执行响应的操作
$ awk -f spellcheck.awk ch00
Running spell checker ...
Responses: Change each occurrence,Global change,Add to Dict,Help,QuitCR to ignore: 
1 - Found SparcStation (C/G/A/H/Q/):a2 - Found Utlitities (C/G/A/H/Q/):c
Utlitities
^^^^^^^^^^
Change to:utilities
Change Utlitities to utilities? (y/n):y
>utilities
1 lines changed. Save changes? (y/n)y3 - Found filename (C/G/A/H/Q/):4 - Found languauge (C/G/A/H/Q/):g
Globally change to:language
Globally change languauge to language? (y/n):y
> language
1 lines changed. Save changes? (y/n)y5 - Found nawk (C/G/A/H/Q/):a6 - Found xvf (C/G/A/H/Q/):c
tar xvf filename^^^
Change to:
>tar xvf filename
1 lines changed. Save changes? (y/n)y
Save corrections in ch00 (y/n)? y
Make changes to dictionary (y/n)? y# 修改后的文件内容
$ cat ch00
SparcStation
language
nawk
utilities
tar xvf filename# 添加(或创建)到当前目录下字典文件中的单词
$ cat dict
SparcStation
nawk

        用由 spell 找到的有拼写错误的单词列表,spellcheck 可以提醒用户修改它们。在显示第一个单词之前,首先显示一个可执行操作的响应列表。输入响应“a”后跟一个回车键表示将这个单词加入列表,该列表用于更新字典,如本例中的 SparcStation 和 nawk。输入“c”将修改出现的每个错误,这时的响应使用户看到包含拼写错误的行并进行修改。在用户修改完所有错误后,显示修改的行,用户将被询问是否保存修改,如本例中的 Utlitities。输入“g”完成全局修改,在提示用户输入正确的拼写和确认输入后完成修改,将每个受影响的行显示出来且在前面加一个“>”,然后在保存修改前询问用户的确认,如本例中的 languauge。

        因为不能确定 xvf 是否是拼写错误,所以用户可以输入“c”来观察这行。在确认没有拼错之后,用户键入回车以忽略这个单词。也可以在出现拼错单词后直接回车以忽略该单词,如本例中的 filename。

        当单处理完 spell 返回的所有单词后,或者用户在这之前退出,将提示用户保存修改的文件和字典。

3. 代码详解

        spellcheck.awk 脚本可以分为以下四部分:

  • BEGIN 过程,处理命令行参数并执行 spell 命令来建立一个拼错单词列表。
  • 主过程,一次从列表中读取一个单词并提示用户输入正确的单词。
  • END 过程,保存(覆盖)文件,同时也将拼错单词列表以外的单词扩充到当前字典中。
  • 支持函数,调用它用于修改文件。

(1)BEGIN 过程

        BEGIN 过程的第一部分处理命令行参数。它检测如果 ARGC 比 1 大,则程序继续。也就是说,除了“awk”之外,必须给出文件名,这个文件名指定了 spell 要分析的文档。一个可选的字典文件名可以被作为第二个参数。尽管 spellcheck 命令并不支持 spell 的任何隐含选项,但 spellcheck 程序遵循 spell 的命令行接口。如果没有给出字典,那么程序执行 test 命令以确定文件 dict 是否存在。如果存在,提示用户确定利用这个文件作为字典文件。一旦处理了这些参数,将从 ARGV 数组中删除它们,这将防止它们被解释成文件名参数。

        BEGIN 过程的第二部分建立了一些临时文件,因为不想直接在原始文件上工作。在这个程序的末尾,用户将选择保存或放弃在临时文件上所做的工作。临时文件都是以“sp_”开始且在退出程序前被删除。

        这个过程的第三部分执行 spell 程序并建立一个单词列表。要测试这个文件是否存在并且在访问之前确保文件中包含内容。如果由于一些原因 spell 程序失败了,或者没有发现拼错的单词,文件 wordlist 会是空的。如果这个文件存在,则将这个文件名作为 ARGV 数组的第二个元素。这是一个不常用但可行的为 awk 将要访问的输入文件提供文件名的办法。注意,当 awk 被调用时,这个文件并不存在!在命令行中指定的文档文件名,不再存在于 ARGV 数组中。本例不是利用 awk 的主输入循环来读取这个文档文件,而是利用一个 while 循环来读取文件以发现并更正拼写错误。

        BEGIN 过程的最后一部分的任务是当显示一个拼错的单词时,定义和显示用户能做出的响应的列表。这个列表在程序开始运行时显示一次,以及当用户在主菜单中选择帮助时显示。将这个列表赋给一个变量,可以使得必要时在程序的不同点访问它,以避免重复定义。

(2)主过程

        主过程显示一个拼错的单词和提示用户输入适当的回答,其中的核心操作由两个用户自定义函数来处理。这个过程对每个拼错的单词都执行。

        wordlist 中的每个输入行的第一个字段,包含着拼错的单词并赋给 misspelling。在一个 while 循环中将拼错的单词显示给用户并提示用户作出响应。下面的正则表达式用于测试 response 的值:

while (response !~ /(^[cCgGaAhHqQ])|^$/)

        用户只能通过输入任意指定的字符或键入回车键(一个空行)退出这个循环。利用正则表达式测试用户输入有助于编写简单灵活的程序,如这里用户可以输入一个小写或大写字母 c 或以其开头的单词(如 Change)。

        主过程的余下部分由条件语句组成,用于测试用户指定的响应并执行相应的操作。“help”的作用是再次显示响应列表和重新显示提示。“quit”的操作是 exit,用于退出主程序并转到 END 过程。如果用户输入“add”,拼错的单词将被加入到数组 dict 中,并被添加到本地字典中。

        “Change”和“Global”响应使程序真正开始工作。当用户输入“c”或“change”时,将显示文档中的一个拼错的单词,然后提示用户做修改,这将在文档中每个出现拼写错误的地方发生。当用户输入“g”或“global”时,提示用户立即修改,并且将一次修改该单词所有的错误,不提示用户确认每个修改。这个工作主要由 make_change() 和 make_global_change() 两个函数来处理。回车表示忽略拼错的单词并得到列表中的下一个单词。这是主输入循环的默认操作,因此不需要为它设置条件。

(3)END 过程

        END 过程的目的是允许用户确认对文档或字典的任何永久性修改。下列情况之一将进入 END 过程:

  • spell 命令失败或没有发现任何拼错的单词。
  • 拼错单词列表已取尽。
  • 用户输入“quit”作为提示的响应。

        END 过程以一个条件语句开始来测试记录的个数是否小于或等于 1。当 spell 程序没有产生单词列表或当用户看到第一个记录之后输入“quit”时将产生这种情况。这种情况 END 过程将当作没有可保存的工作而退出。

        接着创建一个 while 循环来询问用户将所做的修改保存到文档。这需要用户对提示回答“y”或“n”。如果回答是“y”,临时输入文件将代替原始文档文件;如果回答是“n”,临时文件被删除。不接受其它的响应。

        下一步测试数组 dict 中是否有内容。它的元素是要添加到字典中的单词。如果用户同意将它们到字典中,这些单词将添加到上面所定义的当前字典中,否则添加到本地 dict 文件中。因为被 spell 读取的字典必须排序,因此将执行一个 sort 命令对送到临时文件的输出进行排序,这个临时文件将在后面的处理中覆盖原文件。

(4)支持函数

        这里有三个支持函数,其中两个用于完成大多数修改工作,第三个函数用于确定用户想要保存的所做的修改。当用户想在文档中“改变每个错误”时,主过程利用一个 while 循环每次读取文档的一行(这行成为 $0)。通过调用 make_change() 函数来确定这行中是否包含拼错的单词。如果有,显示这行并提示用户输入相应单词的正确拼写。

        如果在当前行没有找到拼错的单词,什么都不做。如果找到了,这个函数显示包含拼错单词的行并询问用户是否要改正。在显示当前行的下面有一排 ^ 符号用于标识拼错的单词。当前输入行被复制到 printstring 中,因为有必要改变这行以便显示。如果这个行包含一些制表符,在这个行的副本中每个制表符都用一个空格代替。这就解决了当制表符出现时如何对齐 ^ 符号的问题(当计算一行的长度时,一个制表符作为一个单独的字符计算,但实际上他显示时占用了更多的空格,通常是 5 到 8 个字符长)。

        当显示出这行后,函数提示用户输入正确的单词,然后接着显示用户输入的内容并请求确认。如果确认是正确的单词,则调用 sub() 函数进行修改。如果没有确认,讲给用户另外一个机会输入正确的单词。

        sub() 函数只修改一行中第一次出现的单词,要想让用户对每次修改做出确认,须要提取余下的部分中拼错的单词,而且不管第一次出现的单词是否被修改。为了完成这些功能,将函数 make_change() 设计成递归函数,它调用自己以在同一行上查找符合条件的其它单词。换句话说,当 make_change() 第一次被调用时,它查找整个 $0 并提取这一行中的第一个拼错的单词。然后它将这个行分为两部分 —— 第一部分包含到第一次出现的单词末尾的所有字符;第二部分包含这行的其它所有字符。然后它调用自己来提取第二部分中的拼错的单词。当递归调用时,这个函数使用了两个参数:

make_change(part2, len)

        第一个参数是要修改的字符串,当从主程序中调用时,它初始为 $0,但以后各次都是 $0 余下的部分。第二个参数的 len 或第一部分的长度,用来提取子串并在最后将两部分重新组合在一起。

        函数 make_change() 还用于将被改变的行收集到一个数组中:

# 将被改变的行放入数组中以便显示if (madechg)changedLines[changes] = ">" $0

        如果 sub() 执行成功,变量 madechg 将得到一个值。$0(两个部分已经重新组合在一起)被赋给一个数组元素。当读取文档中的所有行之后,主程序循环访问这个数组并显示所有被修改的行。然后调用函数 confirm_changes() 询问是否保存这些修改。它将用临时输出文件覆盖临时输入文件,保持修改了拼错单词后的完整结果。

        如果用户决定做“全局修改”,则调用函数 make_global_change() 来完成。这个函数和 make_change() 函数类似,但更简单,因为有现成的函数实现对每行的全局修改。

        这个函数提示用户输入正确的单词。设置 while 循环用于读取文档的所有行并使用函数 gsub() 实现修改。所有修改一次完成,不提示用户确认。当所有的行被读取后,函数显示已经修改的行并在保存它们之前调用函数 confirm_changes() 得到用户对这些修改的确认。

        函数 confirm_changes() 被主过程和 make_global_change() 函数调用,用来对产生的修改进行确认。设计这个函数是为了防止代码重复。它的目的就是当用文档文件的新版本(spellout)替换老版本(spellsource)时通知用户这些变化。

4. 附加说明

        spell 一个明显的问题是程序返回的拼写错误单词的顺序与单词在文件中出现的顺序可能不一致,这是一个已知问题。而且看代码可知,这个脚本的逻辑是用户选择了几次“c”,就会遍历几遍原文件,而原文件有多少行,就会执行多少遍 make_change() 函数,make_change() 还是个递归函数,性能可想而知:

if ( response ~ /[cC](hange)?/) {# 读取收集的文件的每一行newspelling = ""; changes = ""while( (getline < spellsource) > 0){# 调用函数显示拼错单词的行,并提示用户对每个进行更正make_change($0)# 所有行都被加入到临时输出文件print > spellout}

         除了可能的性能问题,仔细查看代码并做测试,会发现这个脚本还有 bug,如当原始文件只有一行时不会保存修改等。这本书是二十多年前写的,后来其实有更好的可用程序,如 aspell 就提供了更为全面的功能,如下图所示:

        因此权且将该脚本当作一个熟悉 awk 编程的练习。所有工作都由 awk 编程语言完成,包括 10 个 UNIX 命令,在 awk 中利用一致的语法和相同的结构来处理。当一部分工作在 shell 中完成而另一部分工作在 awk 中完成时,可能引起混淆,例如必须注意 if 条件在语法上的区别和如何引用变量。awk 的现代版本提供了可替代的 shell 执行命令及与用户连接的功能。

相关文章:

sed awk 第二版学习(十一)—— 交互式拼写检查器 spellcheck.awk

目录 1. 脚本代码 2. 执行情况 3. 代码详解 &#xff08;1&#xff09;BEGIN 过程 &#xff08;2&#xff09;主过程 &#xff08;3&#xff09;END 过程 &#xff08;4&#xff09;支持函数 4. 附加说明 这是一个基于 UNIX spell 程序的名为 spellcheck 的 awk 脚本&a…...

Android 应用测试的各种环境问题记录(Instrumentation测试)

报错记录 failed to configure packages targetSdkVersion&#xff08;未解决&#xff09; failed to configure com.demo.test.SettingsActivityTest.testOnCreate_withNullSavedInstanceState: Package targetSdkVersion34 > maxSdkVersion32 java.lang.IllegalArgumentE…...

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)

文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…...

问题记录-Java后端

问题记录 目录 问题记录1.多数据源使用事务注意事项&#xff1f;2.mybatis执行MySQL的存储过程&#xff1f;3.springBoot加载不到nacos配置中心的配置问题4.服务器产生大量close_wait情况 1.多数据源使用事务注意事项&#xff1f; 问题&#xff1a;在springBoot项目中多表处理数…...

YB2503HV:高效率降压IC,助力电动车、太阳能设备等领域的能源转换

今天我要向大家介绍一款引人注目的产品—— YB2503HV 100V 3A SOP8内置MOS 高效率降压IC。这款单片集成芯片具备可设定输出电流的开关型降压恒压驱动器功能&#xff0c;可广泛应用于电动车、太阳能设备、电子电池充电等领域。让我们一起来看看它的特点和应用吧&#xff01; 首先…...

Day47 | 动态规划 :线性DP 最长公共子序列最长公共子数组

Day47 | 动态规划 &#xff1a;线性DP 最长公共子序列&&最长公共子数组 动态规划应该如何学习&#xff1f;-CSDN博客 本次题解参考自灵神的做法&#xff0c;大家也多多支持灵神的题解 最长公共子序列 编辑距离_哔哩哔哩_bilibili 动态规划学习&#xff1a; 1.思考…...

【山大909算法题】2014-T1

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 为带表头的单链表类Chain编写一个成员函数Reverse&#xff0c;该函数对链表进行逆序操作&#xff08;将链表中的结点按与原序相反的顺序连接&#xff09;&#xff0c;要求逆序操作就地进行&#xff0c;不分配…...

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part2

资料来自李宏毅老师《生成式 AI》课程&#xff0c;如有侵权请通知下线 Introduction to Generative AI 2024 Spring 来源背景说明 该文档主要介绍了国立台湾大学&#xff08;NTU&#xff09;2024 年春季 “生成式人工智能&#xff08;GenAI&#xff09;” 课程的作业 5&#…...

【机器学习】如何使用Python的Scikit-learn库实现机器学习模型,并对数据进行预处理和特征缩放以提高模型性能?

使用Python的Scikit-learn库可以方便地实现机器学习模型&#xff0c;并对数据进行预处理和特征缩放以提高模型性能。以下是一个典型的工作流程&#xff0c;包括数据加载、预处理、特征缩放、模型训练和评估&#xff1a; 1. 安装Scikit-learn 确保已安装Scikit-learn库&#x…...

【SpringCloud详细教程】-04-服务容错--Sentinel

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…...

计算机学习

不要只盯着计算机语言学习&#xff0c;你现在已经学习了C语言和Java&#xff0c;暑假又规划学习Python&#xff0c;最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言&#xff0c;沿着这个方向继续往后学习知识就行。计算机语言是学不完的&#xff0c;而未来就…...

CSS - CSS One-Line

1. aspect-ratio 描述: 用于定义元素的宽高比&#xff0c;简化了以往使用“填充黑客”的方法。只需指定一个比率&#xff0c;浏览器会自动调整元素的尺寸 案例: .aspect-ratio-hd {aspect-ratio: 16/9; } .aspect-ratio-square {aspect-ratio: 1; /* 正方形 */ }2. object-…...

【AIGC】如何准确引导ChatGPT,实现精细化GPTs指令生成

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;准确引导ChatGPT创建爆款小红书文案GPTs指令案例&#x1f4af; 高效开发GPTs应用的核心原则明确应用场景和目标受众构建多样化风格模板提问与引…...

Redis主从架构

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的键值对存储系统&#xff0c;广泛应用于缓存、消息队列、实时分析等场景。为了提高系统的可用性、可靠性和读写性能&#xff0c;Redis提供了主从复制&#xff08;Master-Slave Replication&#xf…...

无人机探测:光电侦测核心技术算法详解!

核心技术 双光谱探测跟踪&#xff1a; 可见光成像技术&#xff1a;利用无人机表面反射的自然光或主动光源照射下的反射光&#xff0c;通过高灵敏度相机捕捉图像。该技术适用于日间晴朗天气下的无人机探测&#xff0c;具有直观、易于识别目标的特点。 红外成像技术&#xff1…...

34 基于单片机的指纹打卡系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC&#xff0c;采用两个按键替代指纹&#xff0c;一个按键按下&#xff0c;LCD12864显示比对成功&#xff0c;则 采用ULN2003驱动步进电机转动&#xff0c;表示开门&#xff0c;另一个…...

Day 26

进入贪心算法 基础理论 1、什么是贪心&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 Eg&#xff1a;一堆钞票&#xff0c;你可以拿走 10 张&#xff0c;想达到最大金额&#xff0c;要怎么拿&#xff1f; –》指定每一次拿最大的&#xff0…...

11.25c++继承、多态

练习&#xff1a; 编写一个 武器类 class Weapon{int atk; }编写3个武器派生类&#xff1a;短剑&#xff0c;斧头&#xff0c;长剑 class knife{int spd; }class axe{int hp; }class sword{int def; }编写一个英雄类 class Hero{int atk;int def;int spd;int hp; public:所有的…...

ThinkPad t61p 作SMB服务器,打印服务器,pc ,android ,ipad利用此服务器互传文件

1.在t61p上安装win7 2,配置好smb 服务 3.再安装好打印驱动程序 4.pc与win7利用系统的网络互相发现,映射为硬盘使用。 5.android&#xff0c;ipad安装ES文件浏览器访问win7 共享文件夹&#xff0c;互传文件。 6.android手机安装FE文件浏览器&#xff0c;可以利用花生壳外网…...

数据结构单链表,顺序表,广义表,多重链表,堆栈的学习

单链表 比如一个多项式&#xff0c;主要包括x的系数&#xff0c;x的指数&#xff0c;那么可以创建一个一维数组来存储它的系数和指数&#xff0c;用数组下标来表示。它的系数可以用数组下标对应的数组元素来储存。 可是这样储存会浪费空间所以采用单链表形式来存储。 即创建一…...

uniapp内嵌的webview H5与应用通信

H5端&#xff1a; 1、找到index.html引入依赖 <script type"text/javascript" src"https://unpkg.com/dcloudio/uni-webview-js0.0.3/index.js"></script> 2、在需要通讯处发送消息 uni.postMessage({data:{code:200,msg:"处理完成&q…...

黄仁勋:人形机器人在内,仅有三种机器人有望实现大规模生产

11月23日&#xff0c;芯片巨头、AI时代“卖铲人”和最大受益者、全球市值最高【英伟达】创始人兼CEO黄仁勋在香港科技大学被授予工程学荣誉博士学位&#xff1b;并与香港科技大学校董会主席沈向洋展开深刻对话&#xff0c;涉及人工智能&#xff08;AI&#xff09;、计算力、领导…...

Docker--harbor私有仓库部署与管理

目录 一、Harbor 简介 1.1 什么是Harbor 1.2 Harbor的特性 1.3 Harbor的构成 二、Harbor 部署 2.1 部署 Docker-Compose 服务 2.2 部署 Harbor 服务 &#xff08;1&#xff09;下载或上传 Harbor 安装程序 &#xff08;2&#xff09;修改harbor安装的配置文件 2.3 启…...

35 基于单片机的精确电压表DA-AD转换

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DAC0832和ADC0832检测电压&#xff0c;0到8.5V&#xff0c;设计复位电路 LED管显示实际稳压值&#xff0c;初始电压0 二、硬件资源 基于KEIL5编写C代码&#xff0c…...

Windows系统下安装Triton 3.0.0预编译Triton 2.1.0

Triton是一个用于编写高效自定义深度学习原语的语言和编译器。它旨在提供一个开源环境&#xff0c;使得编写代码的速度比CUDA更快&#xff0c;同时比其他现有的DSLs&#xff08;领域特定语言&#xff09;更灵活。 在开始安装之前&#xff0c;请确保您的系统满足以下要求&#x…...

Easyexcel(7-自定义样式)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09;Easyexcel&#xff08;5-自定义列宽&#xff09;Easyexcel&#xff08;6-单…...

ubuntu搭建k8s环境详细教程

在Ubuntu上搭建Kubernetes&#xff08;K8s&#xff09;环境可以通过多种方式实现&#xff0c;下面是一个详细的教程&#xff0c;使用kubeadm工具来搭建Kubernetes集群。这个教程将涵盖从准备工作到安装和配置Kubernetes的所有步骤。 环境准备 操作系统&#xff1a;确保你使用的…...

spark 写入mysql 中文数据 显示?? 或者 乱码

目录 前言 Spark报错&#xff1a; 解决办法&#xff1a; 总结一下&#xff1a; 报错&#xff1a; 解决&#xff1a; 前言 用spark写入mysql中&#xff0c;查看中文数据 显示?? 或者 乱码 Spark报错&#xff1a; Sat Nov 23 19:15:59 CST 2024 WARN: Establishing SSL…...

Python中的简单爬虫

文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…...

网络安全原理与技术思考题/简答题

作业1&#xff08;第1章、第2章、第8章&#xff09; 1. 网络安全的基本属性有哪些&#xff1f;简单解释每个基本属性的含义。网络安全的扩展属性包括哪些&#xff1f; 基本属性&#xff1a; 1.机密性(Confidentiality)&#xff1a; 含义&#xff1a;确保信息不被未授权的用户…...

技术周刊 | 前端真的凉了吗?2024 前端趋势解读

大家好&#xff0c;我是童欧巴。见字如面&#xff0c;万事胜意。 小雪已过&#xff0c;大家勿忘添衣御寒&#xff0c;欢迎来到第 135 期周刊。 大厨推荐 2024 前端趋势 The Software House 公司发布的前端状态调查报告&#xff0c;本版是迄今为止最全面的调查&#xff0c;共…...

Qt常用控件之按钮类控件

目录 QPushButton 添加图标 添加快捷键 QRadioButton 关于toggled 模拟点餐功能 QCheckBox 刚刚 QWidget 中涉及到的各种 属性/函数/使用方法&#xff0c;针对接下来要介绍的 Qt 的各种控件都是有效的&#xff0c;因为各种控件都是继承自 QWidget 的 接下来本篇博客就学…...

Wonder3D本地部署到算家云搭建详细教程

Wonder3D简介 Wonder3D仅需2至3分钟即可从单视图图像中重建出高度详细的纹理网格。Wonder3D首先通过跨域扩散模型生成一致的多视图法线图与相应的彩色图像&#xff0c;然后利用一种新颖的法线融合方法实现快速且高质量的重建。 本文详细介绍了在算家云搭建Wonder3D的流程以及…...

景联文科技:高质量数据采集标注服务引领AI革新

在当今这个数字化时代&#xff0c;数据已经成为推动社会进步和产业升级的关键资源。特别是在人工智能领域&#xff0c;高质量的数据是训练出高效、精准的AI模型的基础。景联文科技是一家专业的数据采集与标注公司&#xff0c;致力于为客户提供高质量的数据处理服务&#xff0c;…...

企业面试真题----阿里巴巴

1.HashMap为什么不是线程安全的&#xff1f; 首先hashmap就是为单线程设计的&#xff0c;并不适合于多线程环境&#xff0c;而hashmap的线程不安全原因主主要是以下两个原因&#xff1a; 死循环 死循环问题发生在jdk1.8之前&#xff08;不包含1.8&#xff09;&#xff0c;造…...

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【四】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

【C++知识总结2】C++里面的小配角cout和cin

一、引入 第一个关于输入输出的C代码 #include<iostream> // std是C标准库的命名空间名&#xff0c;C将标准库的定义实现都放到这个命名空间中 using namespace std; int main() {cout<<"Hello world!!!"<<endl;return 0; } 1. 使用cout标准输出…...

门控循环单元(GRU)与时间序列预测应用

一、GRU简介 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;简称GRU&#xff09;是一种简化版的LSTM&#xff08;长短期记忆网络&#xff09;&#xff0c;专门用于解决长序列中的梯度消失问题。与LSTM相比&#xff0c;GRU具有更简单的结构和较少的参数&#xff0c…...

Spring Boot 3 集成 Spring Security(2)授权

文章目录 授权配置 SecurityFilterChain基于注解的授权控制自定义权限决策 在《Spring Boot 3 集成 Spring Security&#xff08;1&#xff09;》中&#xff0c;我们简单实现了 Spring Security 的认证功能&#xff0c;通过实现用户身份验证来确保系统的安全性。Spring Securit…...

互联网摸鱼日报(2024-11-22)

互联网摸鱼日报(2024-11-22) 36氪新闻 学习马斯克不丢人&#xff0c;脸书也开始改造自己了 旅游行业趋势变了&#xff0c;增长还能从哪里寻找&#xff1f; 大厂入局后&#xff0c;小型小游戏团队能否继续喝一口汤&#xff1f; 一拥而上的“跨界咖啡”&#xff0c;是“走心”…...

RNN并行化——《Were RNNs All We Needed?》论文解读

InfoPaperhttps://arxiv.org/abs/2410.01201GitHubhttps://github.com/lucidrains/minGRU-pytorch个人博客地址http://myhz0606.com/article/mini_rnn 最近在看并行RNN相关的paper&#xff0c;发现很多都利用了Parallel Scanning算法。本文将从Parallel Scanning算法开始&…...

机器学习周志华学习笔记-第6章<支持向量机>

机器学习周志华学习笔记-第6章<支持向量机> 卷王&#xff0c;请看目录 6支持向量机6.1 函数间隔与几何间隔6.1.1 函数间隔6.1.2 几何间隔 6.2 最大间隔与支持向量6.3 对偶问题6.4 核函数6.5 软间隔支持向量机6.6 支持向量机6.7核方法 6支持向量机 支持向量机是一种经典…...

IP反向追踪技术,了解一下?

DOSS&#xff08;拒绝服务&#xff09;攻击是现在比较常见的网络攻击手段。想象一下&#xff0c;有某个恶意分子想要搞垮某个网站&#xff0c;他就会使用DOSS攻击。这种攻击常常使用的方式是IP欺骗。他会伪装成正常的IP地址&#xff0c;让网络服务器以为有很多平常的请求&#…...

2025蓝桥杯(单片机)备赛--扩展外设之UART1的原理与应用(十二)

一、串口1的实现原理 a.查看STC15F2K60S2数据手册: 串口一在590页&#xff0c;此款单片机有两个串口。 串口1相关寄存器&#xff1a; SCON:串行控制寄存器&#xff08;可位寻址&#xff09; SCON寄存器说明&#xff1a; 需要PCON寄存器的SMOD0/PCON.6为0&#xff0c;使SM0和SM…...

Linux 使用gdb调试core文件

core文件和gdb调试 什么是 core 文件&#xff1f;产生core文件的原因&#xff1f;core 文件的控制和生成路径gdb 调试core 文件引用和拓展 什么是 core 文件&#xff1f; 当程序运行过程中出现Segmentation fault (core dumped)错误时&#xff0c;程序停止运行&#xff0c;并产…...

Python后端flask框架接收zip压缩包方法

一、用base64编码发送&#xff0c;以及接收 import base64 import io import zipfile from flask import request, jsonifydef unzip_and_find_png(zip_data):# 使用 BytesIO 在内存中处理 zip 数据with zipfile.ZipFile(io.BytesIO(zip_data), r) as zip_ref:extracted_paths…...

【21-30期】Java技术深度剖析:从分库分表到微服务的核心问题解析

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 文章题目&#xff1a;Java技术深度剖析&#xff1a;从分库分表到微服务的核心问题解析 摘要&#xff1a; 本…...

Linux 中 find 命令使用详解

目录 一&#xff1a;基本语法二&#xff1a;搜索路径1、限制递归层级2、排除指定路径 三&#xff1a;匹配条件1、按照文件名搜索2、按文件类型搜索3、按文件大小搜索4、按文件权限搜索5、按文件所有者或所属组搜索6、按文件修改时间搜索 四&#xff1a;执行操作1、输出满足条件…...

云服务器部署WebSocket项目

WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;其设计的目的是在Web浏览器和Web服务器之间进行实时通信&#xff08;实时Web&#xff09; WebSocket协议的优点包括&#xff1a; 1. 更高效的网络利用率&#xff1a;与HTTP相比&#xff0c;WebSocket的握手只…...

林业产品智能推荐引擎:Spring Boot篇

1 绪论 1.1 选题背景 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。计算机软件可以针对不同行业的营业特点以及管理需求&#xff0c;设置不同的功能&…...