citavi合并重复文献题录

文章目录

  • 一、宏macro的使用方法
  • 二、合并重复题录的macro代码
    • 2.1 下载并加载macro代码
    • 2.2 显示重复题录并合并
    • 2.3 合并的规则
    • 2.4 其他
  • 附:macro代码

一、宏macro的使用方法

参考官方文档 Using macros - Citavi 6 Manual

  1. Macro files have the .cs file extension. If you received the macro in a ZIP archive, be sure to extract it from the ZIP first.
  2. Start Citavi and open the project you want to work on.
  3. Important Back up the project before running a macro on it (File>Create backup > Creating a backup). Creating a backup is very important because the changes made by a macro cannot be undone!
  4. Many macros apply to the current selection only, so if you want them to apply only to some references, use the filter or search features to create a selection first. (You can identify a macro that applies to the current selection because the macro’s program code will contain a command with the ending “.GetFilteredReferences()”.)
  5. Click Tools > Macro editor or press Alt+F11 to open the macro ediotr. It can take a few seconds for the macro editor to open.
  6. In the Macro Editor, on the File menu, click Open and choose the macro file (.cs) you prepared in step 1.
  7. Click Compile. No errors should appear in the lower pane of the window.
  8. Click Run to run the macro. You will be asked to confirm that you created a backup. If you haven’t, click Cancel, create the backup, and then continue.

二、合并重复题录的macro代码

2.1 下载并加载macro代码

下载地址: https://github.com/istvank/Citavi-Macros/blob/master/merge-duplicates.cs
打开macro editor操作面板并加载下载的.cs文件
在这里插入图片描述

Citavi的宏其实类似于一个临时插件,用一次加载一次。

2.2 显示重复题录并合并

在这里插入图片描述

然后选中两个重复的题录(目前的macro代码只支持两个合并),点击 run(在上一步的时候已经点过 Compile),即可合并。
在这里插入图片描述

2.3 合并的规则

  • 对于Reference面板中的内容,如果遇到不一样的信息,则把两个信息合并,用 // 分开。一个有另一个没有的则取并集。
  • 对于划分的category和group也不会丢弃信息,而是取并集。
  • 但对于其他部分的内容,比如Evaluation和Abstract,则只保留一个。(应该是保留列表中靠前的一个)
  • 附件的话会把附件都放进来,不会删除某个附件。
  • 笔记的话内容都会保留,但排序靠后的题录的笔记会损失和pdf文件的超链接。

2.4 其他

重启Citavi后,之前加载的macro代码会清空失效。

附:macro代码

如不方便下载,可自己建立一个 .cs 代码文件。

// Copyright 2018 István Koren
// 
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
// 
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.using System;
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Forms;using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Citavi.Shell;
using SwissAcademic.Collections;// Implementation of macro editor is preliminary and experimental.
// The Citavi object model is subject to change in future version.public static class CitaviMacro
{public static void Main(){//if this macro should ALWAYS affect all titles in active project, choose first option//if this macro should affect just filtered rows if there is a filter applied and ALL if not, choose second option//ProjectReferenceCollection references = Program.ActiveProjectShell.Project.References;        List<Reference> references = Program.ActiveProjectShell.PrimaryMainForm.GetSelectedReferences();//if we need a ref to the active projectSwissAcademic.Citavi.Project activeProject = Program.ActiveProjectShell.Project;if (references.Count == 2){if (references[0].ReferenceType == references[1].ReferenceType){string originalTitle = references[0].Title;// CreatedOn, check which one is older and then take that CreatedOn and CreatedByif (DateTime.Compare(references[0].CreatedOn, references[1].CreatedOn) > 0){// second reference is older// CreatedOn is write-protected. We therefore switch the references...Reference newer = references[0];references[0] = references[1];references[1] = newer;}// ModifiedOn is write-protected. It will be updated anyways now.// Abstract, naive approach...if (references[0].Abstract.Text.Trim().Length < references[1].Abstract.Text.Trim().Length){references[0].Abstract.Text = references[1].Abstract.Text;}// AccessDate, take newer one//TODO: accessdate would need to be parsed// right now, we just check if there is one, we take it, otherwise we leave it empty.if (references[0].AccessDate.Length < references[1].AccessDate.Length){references[0].AccessDate = references[1].AccessDate;}// Additionsreferences[0].Additions = MergeOrCombine(references[0].Additions, references[1].Additions);// CitationKey, check if CitationKeyUpdateType is 0 at one reference if yes, take that oneif ((references[0].CitationKeyUpdateType == UpdateType.Automatic) && (references[1].CitationKeyUpdateType == UpdateType.Manual)){references[0].CitationKey = references[1].CitationKey;references[0].CitationKeyUpdateType = references[1].CitationKeyUpdateType;}// CoverPathif (references[0].CoverPath.LinkedResourceType == LinkedResourceType.Empty){references[0].CoverPath = references[1].CoverPath;}// CustomFields (1-9)references[0].CustomField1 = MergeOrCombine(references[0].CustomField1, references[1].CustomField1);references[0].CustomField2 = MergeOrCombine(references[0].CustomField2, references[1].CustomField2);references[0].CustomField3 = MergeOrCombine(references[0].CustomField3, references[1].CustomField3);references[0].CustomField4 = MergeOrCombine(references[0].CustomField4, references[1].CustomField4);references[0].CustomField5 = MergeOrCombine(references[0].CustomField5, references[1].CustomField5);references[0].CustomField6 = MergeOrCombine(references[0].CustomField6, references[1].CustomField6);references[0].CustomField7 = MergeOrCombine(references[0].CustomField7, references[1].CustomField7);references[0].CustomField8 = MergeOrCombine(references[0].CustomField8, references[1].CustomField8);references[0].CustomField9 = MergeOrCombine(references[0].CustomField9, references[1].CustomField9);// Date (string typereferences[0].Date = MergeOrCombine(references[0].Date, references[1].Date);// Date2 (string type)references[0].Date2 = MergeOrCombine(references[0].Date2, references[1].Date2);// DOIreferences[0].Doi = MergeOrCombine(references[0].Doi, references[1].Doi);// Editionreferences[0].Edition = MergeOrCombine(references[0].Edition, references[1].Edition);// EndPageif (references[0].PageRange.ToString() == ""){references[0].PageRange = references[1].PageRange;}// Evaluation, naive approach...if (references[0].Evaluation.Text.Trim().Length < references[1].Evaluation.Text.Trim().Length){references[0].Evaluation.Text = references[1].Evaluation.Text;}// HasLabel1 and HasLabel2if (references[1].HasLabel1){references[0].HasLabel1 = references[1].HasLabel1;}if (references[1].HasLabel2){references[0].HasLabel2 = references[1].HasLabel2;}// ISBNreferences[0].Isbn = MergeOrCombine(references[0].Isbn.ToString(), references[1].Isbn.ToString());// Languagereferences[0].Language = MergeOrCombine(references[0].Language, references[1].Language);// Notesreferences[0].Notes = MergeOrCombine(references[0].Notes, references[1].Notes);// Numberreferences[0].Number = MergeOrCombine(references[0].Number, references[1].Number);// NumberOfVolumesreferences[0].NumberOfVolumes = MergeOrCombine(references[0].NumberOfVolumes, references[1].NumberOfVolumes);// OnlineAddressreferences[0].OnlineAddress = MergeOrCombine(references[0].OnlineAddress, references[1].OnlineAddress);// OriginalCheckedByreferences[0].OriginalCheckedBy = MergeOrCombine(references[0].OriginalCheckedBy, references[1].OriginalCheckedBy);// OriginalPublicationreferences[0].OriginalPublication = MergeOrCombine(references[0].OriginalPublication, references[1].OriginalPublication);// PageCount (text)//TODO: apparently it is a calculated field// PageCountNumeralSystem (int=0)//TODO: apparently it is a calculated field// PageRangeNumberingType (int=0)//TODO: apparently it is a calculated field// PageRangeNumeralSystem (int=0)//TODO: apparently it is a calculated field// ParallelTitlereferences[0].ParallelTitle = MergeOrCombine(references[0].ParallelTitle, references[1].ParallelTitle);// PeriodicalID, naive approach...if ((references[0].Periodical == null) || (((references[0].Periodical != null) && (references[1].Periodical != null)) && (references[0].Periodical.ToString().Length < references[1].Periodical.ToString().Length))){references[0].Periodical = references[1].Periodical;}// PlaceOfPublicationreferences[0].PlaceOfPublication = MergeOrCombine(references[0].PlaceOfPublication, references[1].PlaceOfPublication);// Pricereferences[0].Price = MergeOrCombine(references[0].Price, references[1].Price);// PubMedIDreferences[0].PubMedId = MergeOrCombine(references[0].PubMedId, references[1].PubMedId);// Rating (take average)references[0].Rating = (short) Math.Floor((decimal) ((references[0].Rating + references[1].Rating) / 2));// (!) ReferenceType (not supported)// SequenceNumber (take the one of first, as second reference will be deleted)// ShortTitle, check if ShortTitleUpdateType is 0 at one reference if yes, take that oneif ((references[0].ShortTitleUpdateType == UpdateType.Automatic) && (references[1].ShortTitleUpdateType == UpdateType.Manual)){references[0].ShortTitle = references[1].ShortTitle;}else if ((references[0].ShortTitleUpdateType == UpdateType.Manual) && (references[1].ShortTitleUpdateType == UpdateType.Manual)){references[0].ShortTitle = MergeOrCombine(references[0].ShortTitle, references[1].ShortTitle);}// SourceOfBibliographicInformationreferences[0].SourceOfBibliographicInformation = MergeOrCombine(references[0].SourceOfBibliographicInformation, references[1].SourceOfBibliographicInformation);// SpecificFields (1-7)references[0].SpecificField1 = MergeOrCombine(references[0].SpecificField1, references[1].SpecificField1);references[0].SpecificField2 = MergeOrCombine(references[0].SpecificField2, references[1].SpecificField2);references[0].SpecificField3 = MergeOrCombine(references[0].SpecificField3, references[1].SpecificField3);references[0].SpecificField4 = MergeOrCombine(references[0].SpecificField4, references[1].SpecificField4);references[0].SpecificField5 = MergeOrCombine(references[0].SpecificField5, references[1].SpecificField5);references[0].SpecificField6 = MergeOrCombine(references[0].SpecificField6, references[1].SpecificField6);references[0].SpecificField7 = MergeOrCombine(references[0].SpecificField7, references[1].SpecificField7);// StartPage//TODO: see page range// StorageMediumreferences[0].StorageMedium = MergeOrCombine(references[0].StorageMedium, references[1].StorageMedium);// Subtitlereferences[0].Subtitle = MergeOrCombine(references[0].Subtitle, references[1].Subtitle);// SubtitleTagged//TODO: we are not merging SubtitleTagged as that changes the Subtitle as well//references[0].SubtitleTagged = MergeOrCombine(references[0].SubtitleTagged, references[1].SubtitleTagged);// TableOfContents, naive approach...                if ((references[0].TableOfContents == null) || (((references[0].TableOfContents != null) && (references[1].TableOfContents != null)) && (references[0].TableOfContents.ToString().Length < references[1].TableOfContents.ToString().Length))){references[0].TableOfContents.Text = references[1].TableOfContents.Text;}// TextLinksreferences[0].TextLinks = MergeOrCombine(references[0].TextLinks, references[1].TextLinks);// Titlereferences[0].Title = MergeOrCombine(references[0].Title, references[1].Title);// TitleTagged//TODO: we are not merging TitleTagged as that changes the Title as well//references[0].TitleTagged = MergeOrCombine(references[0].TitleTagged, references[1].TitleTagged);// TitleInOtherLanguagesreferences[0].TitleInOtherLanguages = MergeOrCombine(references[0].TitleInOtherLanguages, references[1].TitleInOtherLanguages);// TitleSupplementreferences[0].TitleSupplement = MergeOrCombine(references[0].TitleSupplement, references[1].TitleSupplement);// TitleSupplementTagged//TODO: we are not merging TitleSupplementTagged as that changes the TitleSupplement as well//references[0].TitleSupplementTagged = MergeOrCombine(references[0].TitleSupplementTagged, references[1].TitleSupplementTagged);// TranslatedTitlereferences[0].TranslatedTitle = MergeOrCombine(references[0].TranslatedTitle, references[1].TranslatedTitle);// UniformTitlereferences[0].UniformTitle = MergeOrCombine(references[0].UniformTitle, references[1].UniformTitle);// Volumereferences[0].Volume = MergeOrCombine(references[0].Volume, references[1].Volume);// Yearreferences[0].Year = MergeOrCombine(references[0].Year, references[1].Year);// ReservedData//TODO: apparently cannot be set// RecordVersion (?)//TODO: apparently cannot be set// FOREIGN KEY fields// Locationsforeach(Location location in references[1].Locations){if (!references[0].Locations.Contains(location)){references[0].Locations.Add(location);}}// Groupsreferences[0].Groups.AddRange(references[1].Groups);// Quotationsreferences[0].Quotations.AddRange(references[1].Quotations);// ReferenceAuthors//references[0].Authors.AddRange(references[1].Authors);foreach (Person author in references[1].Authors){if (!references[0].Authors.Contains(author)){references[0].Authors.Add(author);}}// ReferenceCategoryreferences[0].Categories.AddRange(references[1].Categories);// ReferenceCollaboratorforeach (Person collaborator in references[1].Collaborators){if (!references[0].Collaborators.Contains(collaborator)){references[0].Collaborators.Add(collaborator);}}// ReferenceEditorforeach (Person editor in references[1].Editors){if (!references[0].Editors.Contains(editor)){references[0].Editors.Add(editor);}}// ReferenceKeywordforeach (Keyword keyword in references[1].Keywords){if (!references[0].Keywords.Contains(keyword)){references[0].Keywords.Add(keyword);}}// ReferenceOrganizationforeach (Person organization in references[1].Organizations){if (!references[0].Organizations.Contains(organization)){references[0].Organizations.Add(organization);}}// ReferenceOthersInvolvedforeach (Person otherinvolved in references[1].OthersInvolved){if (!references[0].OthersInvolved.Contains(otherinvolved)){references[0].OthersInvolved.Add(otherinvolved);}}// ReferencePublisherforeach (Publisher publisher in references[1].Publishers){if (!references[0].Publishers.Contains(publisher)){references[0].Publishers.Add(publisher);}}// ReferenceReference// adding ChildReferences does not work//references[0].ChildReferences.AddRange(references[1].ChildReferences);Reference[] childReferences = references[1].ChildReferences.ToArray();foreach (Reference child in childReferences){child.ParentReference = references[0];}// SeriesTitle, naive approachif ((references[0].SeriesTitle == null) || (((references[0].SeriesTitle != null) && (references[1].SeriesTitle != null)) && (references[0].SeriesTitle.ToString().Length < references[1].SeriesTitle.ToString().Length))){references[0].SeriesTitle = references[1].SeriesTitle;}// change crossreferencesforeach (EntityLink entityLink in references[1].EntityLinks){if (entityLink.Source == references[1]){entityLink.Source = references[0];}else if (entityLink.Target == references[1]){entityLink.Target = references[0];}}// write Note that the reference has been mergedif (references[0].Notes.Trim().Length > 0){references[0].Notes += " |";}references[0].Notes += " This reference has been merged with a duplicate by CitaviBot.";// DONE! remove second referenceactiveProject.References.Remove(references[1]);}else{MessageBox.Show("Currently this script only supports merging two references of the same type. Please convert and try again.");}}else{MessageBox.Show("Currently this script only supports merging two references. Please select two and try again.");}}private static string MergeOrCombine(string first, string second) {first = first.Trim();second = second.Trim();// do not compare ignore case, otherwise we might lose capitalization information; in that case we rely on manual edits after the mergeif (String.Compare(first, second, false) == 0){// easy case, they are the same!return first;}else if (first.Length == 0){return second;}else if (second.Length == 0){return first;}else{return first + " // " + second;}}    
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ES系列】(一)简介与安装

首发博客地址 首发博客地址[1] 系列文章地址[2] 教学视频[3] 为什么要学习 ES? 强大的全文搜索和检索功能&#xff1a;Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;使用倒排索引和分布式计算等技术&#xff0c;提供了强大的全文搜索和检索功能。学习 ES 可以掌…

【性能测试】Jenkins+Ant+Jmeter自动化框架的搭建思路

前言 前面讲了Jmeter在性能测试中的应用及扩展。随着测试的深入&#xff0c;我们发现在性能测试中也会遇到不少的重复工作。 比如某新兴业务处于上升阶段&#xff0c;需要在每个版本中&#xff0c;对某些新增接口进行性能测试&#xff0c;有时还需要在一天中的不同时段分别进行…

【强化学习】MDP马尔科夫链

基本元素 状态集&#xff1a;表示智能体所处所有状态的全部可能性的集合。类似的集合&#xff0c;行为集&#xff0c;回报集决策&#xff1a;规定我在某个状态下&#xff0c;我做出某个action马尔可夫链&#xff1a;学术上来说是无记忆性质。说白了就是我只在乎我目前的状态。…

【C语言】入门——指针

目录 ​编辑 1.指针是什么 2.指针类型和指针运算 2.1指针-整数 2.2指针-指针 2.3指针的关系运算 3.野指针 3.1野指针成因 &#x1f44d;指针未初始化&#xff1a; &#x1f44d;指针越界访问&#xff1a; &#x1f44d;指针指向空间释放&#xff1a; 3.2如何规避野指针 …

超图嵌入论文阅读2:超图神经网络

超图嵌入论文阅读2&#xff1a;超图神经网络 原文&#xff1a;Hypergraph Neural Networks ——AAAI2019&#xff08;CCF-A&#xff09; 源码&#xff1a;https://github.com/iMoonLab/HGNN 500star 概述 贡献&#xff1a;用于数据表示学习的超图神经网络 (HGNN) 框架&#xf…

【探索Linux】—— 强大的命令行工具 P.8(进程优先级、环境变量)

阅读导航 前言一、进程优先级1. 优先级概念2. Linux查看系统进程3. PRI&#xff08;Priority&#xff09;和NI&#xff08;Nice&#xff09; 二、环境变量1. 概念2. 查看环境变量方法3. 环境变量的组织方式4.通过代码获取环境变量5. 环境变量的特点 总结温馨提示 前言 前面我们…

线性空间、子空间、基、基坐标、过渡矩阵

线性空间的定义 满足加法和数乘封闭。也就是该空间的所有向量都满足乘一个常数后或者和其它向量相加后仍然在这个空间里。进一步可以理解为该空间中的所有向量满足加法和数乘的组合封闭。即若 V 是一个线性空间&#xff0c;则首先需满足&#xff1a; 注&#xff1a;线性空间里面…

命令执行漏洞(附例题)

一.原理 应用有时需要调用一些执行系统命令的函数&#xff0c;如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等&#xff0c;当用户能控制这些函数的参数时&#xff0c;就可以将恶意系统命令拼接到正常命令中&#xff0c;从而造成命令执行攻击。 二.利用条…

基于Matlab实现多个图像增强案例(附上源码+数据集)

图像增强是数字图像处理中的一个重要步骤&#xff0c;它通过一系列的算法和技术&#xff0c;使图像在视觉上更加清晰、明亮、对比度更强等&#xff0c;以便更好地满足人们的需求。在本文中&#xff0c;我们将介绍如何使用Matlab实现图像增强。 文章目录 部分源码源码数据集下载…

【Arduino25】液晶模拟值实验

硬件准备 LCD1602显示屏&#xff1a;1 个 220欧的电阻&#xff1a;1 个 旋钮电位器&#xff1a;1 个 面包板&#xff1a;1个 杜邦线&#xff1a;若干 硬件连线 软件程序 #include <LiquidCrystal.h>LiquidCrystal lcd(12,11,5,4,3,2);void setup(){lcd.begin(16,2);…

element-ui 修改tooltip样式

1.表格tooltip 统一修改 <el-table:data"tableDatas"tooltip-effect"light" .el-tooltip__popper.is-light {background: #FFF;box-shadow: 0px 0px 8px 1px rgba(0,0,0,0.16);border-radius: 4px;opacity: 1;border: none;&[x-placement^top] .p…

Android笔记(二十八):在雷电模拟器安卓7.0+上使用Charles抓包详细教程

背景 由于手头没有合适的真机,所有经常使用雷神模拟器来跑项目,模拟器也需要能够抓包看看接口返回的数据,以便自测调试。本文记录了如何在雷电模拟器安卓7.0+上使用Charles抓包,其他模拟器没试过。 最终效果 浏览器打开百度网页,能抓到百度页面数据 具体步骤 模拟器…

POI-TL制作word

本文相当于笔记&#xff0c;主要根据官方文档Poi-tl Documentation和poi-tl的使用&#xff08;最全详解&#xff09;_JavaSupeMan的博客-CSDN博客文章进行学习&#xff08;上班够用&#xff09; Data AllArgsConstructor NoArgsConstructor ToString EqualsAndHashCode public …

1.创建项目(wpf视觉项目)

目录 前言本章环境创建项目启动项目可执行文件 前言 本项目主要开发为视觉应用&#xff0c;项目包含&#xff08;视觉编程halcon的应用&#xff0c;会引入handycontrol组件库&#xff0c;工具库Masuit.Tools.Net&#xff0c;数据库工具sqlSugar等应用&#xff09; 后续如果还有…

骨传导耳机对身体有损伤吗、骨传导耳机好不好

骨传导耳机是相对安全的&#xff0c;不会对身体造成损伤。它们的工作原理是通过将声音振动传递到颅骨&#xff0c;然后通过骨骼传导到内耳&#xff0c;而不是直接通过传统的扬声器将声音发送到耳朵。 这种声音的传导方式有一潜在的优势&#xff0c;接下来就和大家说说&#xff…

51单片机简易时钟闹钟八位数码管显示仿真( proteus仿真+程序+原理图+报告+讲解视频)

51单片机简易时钟闹钟八位数码管显示仿真( proteus仿真程序原理图报告讲解视频&#xff09; 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图元器件清单 5. 设计报告6. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 51单片机…

Test2

方案 markdownTypora picGo jsdelivr github仓库 bloghelper Typora&#xff1a; 本地 Markdown 编辑器&#xff0c;用于本地编写文档 PicGo&#xff1a;一个用于快速上传图片并获取图片 URL 链接的工具&#xff0c;可以与 Typora 集成&#xff0c;实现黏贴图片后自动上传图…

【数据结构】二叉搜索树——二叉搜索树的概念和介绍、二叉搜索树的简单实现、二叉搜索树的增删查改

文章目录 二叉搜索树1. 二叉搜索树的概念和介绍2. 二叉搜索树的简单实现2.1二叉搜索树的插入2.2二叉搜索树的查找2.3二叉搜索树的遍历2.4二叉搜索树的删除2.5完整代码和测试 二叉搜索树 1. 二叉搜索树的概念和介绍 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&…

网络技术学习十三:DNS(域名服务器)

DNS 域名 产生背景 通过IP地址访问目标主机&#xff0c;不便于记忆 通过容易记忆的域名来标识主机位置 域名的树形层次化结构 根域 领级域 主机所处的国家/区域&#xff0c;注册人的性质 二级域 注册人自行创建的名称 主机名 区域内部的主机的名称 由注册人自行创建…

stm32(GD32,apm32),开优化后需要特别注意的地方

提到优化就不得不提及 volatile 使用场景 1&#xff1a;中断服务程序中修改的供其它程序检测的变量&#xff0c;需要加volatile&#xff1b; : 2&#xff1a;多任务环境下各任务间共享的标志&#xff0c;应该加volatile&#xff1b; 3&#xff1a;并行设备的硬件寄存器&#x…