使用Option的正确姿势
我们会频繁地使用Scala的Option,用以解决类似Null Object之类的问题。某种程度讲,使用Option必然会减少对空指针引用判断的丑陋代码,结合For Comprehension,确乎是Scala编程中的一把利器。我在博客《引入Option优雅地保证健壮性》与《并非Null Object这么简单》中都详细对Option的本质与运用进行剖析与介绍。然而,Option虽然好,我们却不可“贪杯”哦!从语义上讲,Option代表一种容器(Monad)非空即有的两种状态,例如List的headOption就是对Option的合理诠释。那么,是否只要是两种状态的业务场景,就可以使用Option呢?例如,将函数的参数类型定义为Option类型,用以表示用户传参的选择:传入实际值或者不传值。这是否是得体的姿势?Daniel Westheide发表的博文When Option Is Not Good Enough旗帜鲜明地表达了反对意见。他给出这样的一个案例:根据产品标题与零售商信息查询Offer:def searchOffers(
productTitle: Option[String],
retailer: Option[Retailer]
): Seq[Offer] = ???作为这个函数的调用者,我们该怎么看待这两个Option参数传递的业务含义?如果productTitle为None,是表示忽略productTitle的值,仅仅搜索符合retailer条件的offers;还是搜索没有提供productTitle的Offer记录?同样,retailer参数也传递了如此模糊不清的意图!好的代码尤其是接口应该是”不言自明“清晰地传递开发者意图。落到具体的业务场景,则代码就应该恰到好处干净利落地表现其业务含义。接口体现准确的业务通用语言(ubiquitous language),是DDD的核心价值。如果我们为这两个搜索条件定义表达业务含义的代数数据类型(algebraic data types),如下代码所示,表意无疑要清晰许多:sealed trait SearchCriteriaobject SearchCriteria {
final case object MatchAll extends SearchCriteria
final case class Contains(s: String) extends SearchCriteria
}
sealed trait RetailerCriteriaobject RetailerCriteria {
final case object AnyRetailer extends RetailerCriteria
final case class Only(retailer: Retailer) extends RetailerCriteria
}
def searchOffers(
product: SearchCriteria,
retailer: RetailerCriteria
): Seq[Offer] = ???SearchCriteria与RetailerCriteria作为两个查询条件,分别提供了各自的查询语义,显然要比过分抽象的Some与None更加清晰可读。引入这样的代数数据类型不仅可以让代码的表意更清晰,还可更好地应对需求的变化。对于现有的SearchCriteria定义而言,倘若要牵强附会,确实可以强词夺理地说:MatchAll就是None的语义,而Contains则对应着Some。然而,如果需求要求增加完全匹配的查询场景,对于Option类型而言,该如何表达?回到SearchCriteria的定义,我们可以轻松地为其增加一种类型:object SearchCriteria {
final case object MatchAll extends SearchCriteria
final case class Contains(s: String) extends SearchCriteria
final case class Exactly(s: String) extends SearchCriteria}比较Option而言,增加了一种新的类型,却极大地提高了代码的可读性,也为代码的未来扩展奠定了基础。与获得的收益相比,仅仅是付出新增类型的微末代价,何足道哉!
2023计算机领域顶会(A类)以及ACL 2023自然语言处理(NLP)研究子方向领域汇总
2023年的计算语言学协会年会(ACL 2023)共包含26个领域,代表着当前前计算语言学和自然语言处理研究的不同方面。每个领域都有一组相关联的关键字来描述其潜在的子领域, 这些子领域并非排他性的,它们只描述了最受关注的子领域,并希望能够对该领域包含的相关类型的工作提供一些更好的想法。1.计算机领域顶会(A类)会议简称主要领域会议全称官网截稿时间会议时间CVPR2023计算机视觉The IEEE/CVF Conference on Computer Vision and Pattern Recognition 2023https://cvpr2023.thecvf.com/2022.11.112023.6.18ICCV2023计算机视觉IEEE International Conference on Computer Visionhttps://iccv2023.thecvf.com/2023.3.82023.9.30ECCV2022计算机视觉European Conference on Computer Visionhttps://eccv2022.ecva.net/-------2022.10.23AAAI2023人工智能National Conference of the American Association for Artificial Intelligencehttps://aaai-23.aaai.org/2022.8.82023.2.7IJCAI 2023人工智能National Conference of the American Association for Artificial Intelligencehttps://ijcai-22.org/#2022.8.82023.2.7NIPS2023机器学习International Joint Conference on Artificial Intelligencehttps://neurips.cc/Conferences/20222023.012023.07ICML 2023机器学习International Conference on Machine Learninghttps://icml.cc/2023.012023.06.24ICLR 2023机器学习International Conference on Learning Representationshttps://iclr.cc/Conferences/20232022.09.212023.05.01ICSE 2023软件工程International Conference on Software Engineeringhttps://conf.researchr.org/home/icse-20232022.09.012023.05.14SIGKDD 2023数据挖掘ACM International Conference on Knowledge Discovery and Data Mininghttps://kdd.org/kdd2022/index.html2023.022023.08SIGIR 2023数据挖掘ACM International Conference on Research and Development in Information Retrievalhttps://sigir.org/sigir2022/2023.012023.07ACL 2023计算语言Association of Computational Linguisticshttps://www.2022.aclweb.org/2022.112023.05ACM MM 2023多媒体ACM International Conference on Multimediahttps://2023.acmmmsys.org/participation/important-dates/2022.11.182023.6.7WWW2023网络应用International World Wide Web Conferencehttps://www2023.thewebconf.org/2022.10.62023.05.01SIGGRAPH 2023图形学ACM SIG International Conference on Computer Graphics and Interactive Techniqueshttps://s2022.siggraph.org/2023.012023.08CHI 2023人机交互ACM Conference on Human Factors in Computing Systemshttps://chi2023.acm.org/2022.09.082023.04.23CSCW 2023人机交互ACM Conference on Computer Supported Cooperative Work and Social Computinghttps://cscw.acm.org/2023/2023.01.152023.10.13CCS 2023信息安全ACM Conference on Computer and Communications Securityhttps://www.sigsac.org/ccs/CCS2022/2023.012023.11VLDB 2023数据管理International Conference on Very Large Data Baseshttps://www.vldb.org/2023/?submission-guidelines2023.03.012023.08.28STOC 2023计算机理论ACM Symposium on the Theory of Computinghttp://acm-stoc.org/stoc2022/2022.112023.062.ACL 2023自然语言处理(NLP)研究子方向领域汇总(一)计算社会科学和文化分析 (Computational Social Science and Cultural Analytics)人类行为分析 (Human behavior analysis)态度检测 (Stance detection)框架检测和分析 (Frame detection and analysis)仇恨言论检测 (Hate speech detection)错误信息检测和分析 (Misinformation detection and analysis)人口心理画像预测 (psycho-demographic trait prediction)情绪检测和分析 (emotion detection and analysis)表情符号预测和分析 (emoji prediction and analysis)语言和文化偏见分析 (language/cultural bias analysis)人机交互 (human-computer interaction)社会语言学 (sociolinguistics)用于社会分析的自然语言处理工具 (NLP tools for social analysis)新闻和社交媒体的定量分析 (quantiative analyses of news and/or social media)(二)对话和交互系统 (Dialogue and Interactive Systems)口语对话系统 (Spoken dialogue systems)评价指标 (Evaluation and metrics)任务型 (Task-oriented)人工介入 (Human-in-a-loop)偏见和毒性 (Bias/toxity)事实性 (Factuality)检索 (Retrieval)知识增强 (Knowledge augmented)常识推理 (Commonsense reasoning)互动讲故事 (Interactive storytelling)具象代理人 (Embodied agents)应用 (Applications)多模态对话系统 (Multi-modal dialogue systems)知识驱动对话 (Grounded dialog)多语言和低资源 (Multilingual / low-resource)对话状态追踪 (Dialogue state tracking)对话建模 (Conversational modeling)(三)话语和语用学 (Discourse and Pragmatics)回指消解 (Anaphora resolution)共指消解 (Coreference resolution)桥接消解 (Bridging resolution)连贯 (Coherence)一致 (Cohesion)话语关系 (Discourse relations)话语分析 (Discourse parsing)对话 (Dialogue)会话 (Conversation)话语和多语性 (Dialugue and multilinguality)观点挖掘 (Argument mining)交际 (Communication)(四)自然语言处理和伦理 (Ethics and NLP)数据伦理 (Data ethics)模型偏见和公正性评价 (Model bias/fairness evaluation)减少模型的偏见和不公平性 (Model bias/unfairness mitigation)自然语言处理中的人类因素 (Human factors in NLP)参与式和基于社群的自然语言处理 (Participatory/community-based NLP)自然语言处理应用中的道德考虑 (Ethical considerations in NLP)透明性 (Transparency)政策和治理 (Policy and governance)观点和批评 (Reflections and critiques)(五)语言生成 (Generation)人工评价 (Human evaluation)自动评价 (Automatic evaluation)多语言 (Multilingualism)高效模型 (Efficient models)少样本生成 (Few-shot generation)分析 (Analysis)领域适应 (Domain adaptation)数据到文本生成 (Data-to-text generation)文本到文博生成 (Text-to-text generation)推断方法 (Inference methods)模型结构 (Model architectures)检索增强生成 (Retrieval-augmented generation)交互和合作生成 (Interactive and collaborative generation)(六)信息抽取 (Information Extraction)命名实体识别和关系抽取 (Named entity recognition and relation extraction)事件抽取 (Event extraction)开放信息抽取 (Open information extraction)知识库构建 (Knowledge base construction)实体连接和消歧 (Entity linking and disambiguation)文档级抽取 (Document-level extraction)多语言抽取 (Multilingual extraction)小样本和零样本抽取 (Zero-/few-shot extraction)(七)信息检索和文本挖掘 (Information Retrieval and Text Mining)段落检索 (Passage retrieval)密集检索 (Dense retrieval)文档表征 (Document representation)哈希 (Hashing)重排序 (Re-ranking)预训练 (Pre-training)对比学习 (Constrastive learning)(八)自然语言处理模型的可解释性与分析 (Interpretability and Analysis of Models in NLP)对抗性攻击/例子/训练 (Adversarial attacks/examples/training)校正和不确定性 (Calibration/uncertainty)反事实和对比解释 (Counterfactual/contrastive explanations)数据影响 (Data influence)数据瑕疵 (Data shortcuts/artifacts)解释的忠诚度 (Explantion faithfulness)特征归因 (Feature attribution)自由文本和自然语言解释 (Free-text/natural language explanation)样本硬度 (Hardness of samples)结构和概念解释 (Hierarchical & concept explanations)以人为主体的应用评估 (Human-subject application-grounded evaluations)知识追溯、发现和推导 (Knowledge tracing/discovering/inducing)探究 (Probing)稳健性 (Robustness)话题建模 (Topic modeling)(九)视觉、机器人等领域的语言基础 (Language Grounding to Vision, Robotics and Beyond)视觉语言导航 (Visual Language Navigation)跨模态预训练 (Cross-modal pretraining)图像文本匹配 (Image text macthing)跨模态内容生成 (Cross-modal content generation)视觉问答 (Visual question answering)跨模态应用 (Cross-modal application)跨模态信息抽取 (Cross-modal information extraction)跨模态机器翻译 (Cross-modal machine translation)(十)大模型(Large Language Models)预训练 (Pre-training)提示 (Prompting)规模化 (Scaling)稀疏模型 (Sparse models)检索增强模型 (Retrieval-augmented models)伦理 (Ethics)可解释性和分析 (Interpretability/Analysis)连续学习 (Continual learning)安全和隐私 (Security and privacy)应用 (Applications)稳健性 (Robustness)微调 (Fine-tuning)(十一)语言多样性 (Language Diversity)少资源语言 (Less-resource languages)濒危语言 (Endangered languages)土著语言 (Indigenous languages)少数民族语言 (Minoritized languages)语言记录 (Language documentation)少资源语言的资源 (Resources for less-resourced languages)软件和工具 (Software and tools)(十二)语言学理论、认知建模和心理语言学 (Linguistic Theories, Cognitive Modeling and Psycholinguistics)语言学理论 (Linguistic theories)认知建模 (Cognitive modeling)计算心理语言学 (Computational pyscholinguistics)(十三)自然语言处理中的机器学习 (Machine Learning for NLP)基于图的方法 (Graph-based methods)知识增强的方法 (Knowledge-augmented methods)多任务学习 (Multi-task learning)自监督学习 (Self-supervised learning)对比学习 (Contrastive learning)生成模型 (Generation model)数据增强 (Data augmentation)词嵌入 (Word embedding)结构化预测 (Structured prediction)迁移学习和领域适应 (Transfer learning / domain adaptation)表征学习 (Representation learning)泛化 (Generalization)模型压缩方法 (Model compression methods)参数高效的微调方法 (Parameter-efficient finetuning)少样本学习 (Few-shot learning)强化学习 (Reinforcement learning)优化方法 (Optimization methods)连续学习 (Continual learning)对抗学习 (Adversarial training)元学习 (Meta learning)因果关系 (Causality)图模型 (Graphical models)人参与的学习和主动学习 (Human-in-a-loop / Active learning)(十四)机器翻译 (Machine Translation)自动评价 (Automatic evaluation)偏见 (Biases)领域适应 (Domain adaptation)机器翻译的高效推理方法 (Efficient inference for MT)高效机器翻译训练 (Efficient MT training)少样本和零样本机器翻译 (Few-/Zero-shot MT)人工评价 (Human evaluation)交互机器翻译 (Interactive MT)机器翻译部署和维护 (MT deployment and maintainence)机器翻译理论 (MT theory)建模 (Modeling)多语言机器翻译 (Multilingual MT)多模态 (Multimodality)机器翻译的线上运用 (Online adaptation for MT)并行解码和非自回归的机器翻译 (Parallel decoding/non-autoregressive MT)机器翻译预训练 (Pre-training for MT)规模化 (Scaling)语音翻译 (Speech translation)转码翻译 (Code-switching translation)词表学习 (Vocabulary learning)(十五)多语言和跨语言自然语言处理 (Multilingualism and Cross-Lingual NLP)转码 (Code-switching)混合语言 (Mixed language)多语言 (Multilingualism)语言接触 (Language contact)语言变迁 (Language change)语言变体 (Language variation)跨语言迁移 (Cross-lingual transfer)多语言表征 (Multilingual representation)多语言预训练 (Multilingual pre-training)多语言基线 (Multilingual benchmark)多语言评价 (Multilingual evaluation)方言和语言变种 (Dialects and language varieties)(十六)自然语言处理应用 (NLP Applications)教育应用、语法纠错、文章打分 (Educational applications, GEC, essay scoring)仇恨言论检测 (Hate speech detection)多模态应用 (Multimodal applications)代码生成和理解 (Code generation and understanding)事实检测、谣言和错误信息检测 (Fact checking, rumour/misinformation detection)医疗应用、诊断自然语言处理 (Healthcare applications, clinical NLP)金融和商务自然语言处理 (Financial/business NLP)法律自然语言处理 (Legal NLP)数学自然语言处理 (Mathematical NLP)安全和隐私 (Security/privacy)历史自然语言处理 (Historical NLP)知识图谱 (Knowledge graph)(十七)音系学、形态学和词语分割 (Phonology, Morphology and Word Segmentation)形态变化 (Morphological inflection)范式归纳 (Paradigm induction)形态学分割 (Morphological segementation)子词表征 (Subword representations)中文分割 (Chinese segmentation)词性还原 (Lemmatization)有限元形态学 (Finite-state morphology)形态学分析 (Morphological analysis)音系学 (Phonology)字素音素转换 (Grapheme-to-phoneme conversion)发音建模 (Pronunciation modeling)(十八)问答 (Question Answering)常识问答 (Commonsense QA)阅读理解 (Reading comprehension)逻辑推理 (Logic reasoning)多模态问答 (Multimodal QA)知识库问答 (Knowledge base QA)语义分析 (Semantic parsing)多跳问答 (Multihop QA)生物医学问答 (Biomedical QA)多语言问答 (Multilingual QA)可解释性 (Interpretability)泛化 (Generalization)推理 (Reasoning)对话问答 (Conversational QA)少样本问答 (Few-shot QA)数学问答 (Math QA)表格问答 (Table QA)开放域问答 (Open-domain QA)问题生成 (Question generation)(十九)语言资源及评价 (Resources and Evaluation)语料库构建 (Corpus creation)基线构建 (Benchmarking)语言资源 (Language resources)多语言语料库 (Multilingual corpora)词表构建 (Lexicon creation)语言资源的自动构建与评价 (Automatic creation and evaluation of language resources)自然语言处理数据集 (NLP datasets)数据集自动评价 (Automatic evaluation of datasets)评价方法 (Evaluation methodologies)低资源语言数据集 (Datasets for low resource languages)测量指标 (Metrics)复现性 (Reproducibility)用于评价的统计检验 (Statistical testing for evaluation)(二十)语义学:词汇层面 (Semantics: Lexical)一词多义 (Polysemy)词汇关系 (Lexical relationships)文本蕴含 (Textual entailment)语义合成性 (Compositionality)多词表达 (Multi-word expressions)同义转换 (Paraphrasing)隐喻 (Metaphor)词汇语义变迁 (Lexical semantic change)词嵌入 (Word embeddings)认知 (Cognition)词汇资源 (Lexical resources)情感分析 (Sentiment analysis)多语性 (Multilinguality)可解释性 (Interpretability)探索性研究 (Probing)(二十一)语义学:句级语义、文本推断和其他领域 (Semantics: Sentence-Level Semantics, Textual Inference and Other Areas)同义句识别 (Paraphrase recognition)文本蕴含 (Textual entailment)自然语言推理 (Natural language inference)逻辑推理 (Reasoning)文本语义相似性 (Semantic textual similarity)短语和句子嵌入 (Phrase/sentence embedding)同义句生成 (Paraphrase generation)文本简化 (Text simiplification)词和短语对齐 (Word/phrase alignment)(二十二)情感分析、文本风格分析和论点挖掘 (Sentiment Analysis, Stylistic Analysis and Argument Mining)论点挖掘 (Argument mining)观点检测 (Stance detection)论点质量评价 (Argument quality assessment)修辞和框架 (Rhetoric and framing)论证方案和推理 (Argument schemes and reasoning)论点生成 (Argument generation)风格分析 (Style analysis)风格生成 (Style generation)应用 (Applications)(二十三)语音和多模态 (Speech and Multimodality)自动语音识别 (Automatic speech recognition)口语语言理解 (Spoken language understanding)口语翻译 (Spoken language translation)口语语言基础 (Spoken language grounding)语音和视觉 (Speech and vision)口语查询问答 (QA via spoken queries)口语对话 (Spoken dialog)视频处理 (Video processing)语音基础 (Speech technologies)多模态 (Multimodality)(二十四)文摘 (Summarization)抽取文摘 (Extractive summarization)摘要文摘 (Abstractive summarization)多模态文摘 (Multimodal summarization)多语言文摘 (Multilingual summarization)对话文摘 (Conversational summarization)面向查询的文摘 (Query-focused summarization)多文档文摘 (Multi-document summarization)长格式文摘 (Long-form summarization)句子压缩 (Sentence compression)少样本文摘 (Few-shot summarization)结构 (Architectures)评价 (Evaluation)事实性 (Factuality)(二十五)句法学:标注、组块分析和句法分析 (Syntax: Tagging, Chunking and Parsing)组块分析、浅层分析 (Chunking, shallow-parsing)词性标注 (Part-of-speech tagging)依存句法分析 (Dependency parsing)成分句法分析 (Constituency parsing)深层句法分析 (Deep syntax parsing)语义分析 (Semantic parsing)句法语义接口 (Syntax-semantic inferface)形态句法相关任务的标注和数据集 (Optimized annotations or data set for morpho-syntax related tasks) 句法分析算法 (Parsing algorithms)语法和基于知识的方法 (Grammar and knowledge-based approach)多任务方法 (Multi-task approaches)面向大型多语言的方法 (Massively multilingual oriented approaches)低资源语言词性标注、句法分析和相关任务 (Low-resource languages pos-tagging, parsingand related tasks)形态丰富语言的词性标注、句法分析和相关任务 (Morphologically-rich languages pos tagging,parsing and related tasks)
(二十六)主题领域:现实检测 (Theme Track: Reality Check)因为错误的原因而正确 (Right for the wrong reasons)实际运用中的教训 (Lessons from deployment)(非)泛化能力 [(Non-)generalization](非)复现能力 [(Non-)reproducibility)]评价 (Evaluation)方法 (Methodology)负面结果 (Negative results)人工智能噱头和期待 (AI hype and expectations)科学 vs 工程 (Science-vs-engineering)其他领域的结合 (Lessons from other fields)
一、计算机系统概论
一、计算机系统简介1.计算机软硬件概念总结如下:(1)硬件进行了相应的封装,对软件提供了接口。比如提供了指令集。(2)软件可以利用这些指令集编写能够完成这些指令功能的软件。系统软件为硬件提供了接口,完成自己的功能。比如说对系统中的软硬件资源进行管理,为用户提供人机交互界面。应用软件应用系统软件提供的接口,调用系统软件的功能,实现自己的功能。2.计算机系统的层次结构(1)现代计算机(2)发展多层次结构:微指令之间有一定的先后顺序,多条微指令构成了一个微程序,一个微程序对应一个机器指令。(3)软硬件分布(虚线为软硬件的接口)3.计算机组成和计算机体系结构区别如下:二、计算机的基本组成1.冯诺依曼计算器特点:以运算器为中心:2.计算机硬件框图以存储器为中心:现代计算机组成:3.计算机工作(1)指令(2)计算机组成框图(3)思维导图(重点)这里我将这些概念都整合在了一张思维导图里面,可能有不全的地方。如下:(4)加减乘除操作约定步骤这里不做过多解释了,图里面写的很清楚。记得对照框图分析。(有点糊,不懂的可以去看书或者视频)4.分析(1)主机完成 一条指令有三个步骤:主机结构包含了运算器、控制器和存储器。①运算器的核心是ALU,还有三个寄存器(ACC\X\MQ)。②控制器包含了CU,还有两个寄存器(IR\PC)。③存储器主要包含三部分,存储体、MAR、MDR。主机+I\O --> 计算机的硬件系统记住这个图:取数指令==取数指令的功能==把保存在内存单元M中的数据,取到ACC寄存器中。为了完成这个操作,在控制器(CU)的控制之下,需要把指令中的地址部分(PC)送给存储器(MAR)。以便我们将数据从存储体中取出来。<1> 取指令刚才对控制器进行分析的时候,已经指出,要执行的指令的地址,保存在PC中。指令是保存在存储体中的。所以取指令的第一个操作,就是PC要把指令的地址送给MAR。①PC将指令的地址送给MAR;再由MAR送给存储体。②在控制器的控制下,存储体把指定存储单元中保存的那一条”取数指令”取出来,送入MDR中。③此时指令已经在MDR中了。取出来的指令最终送入IR里面。因为IR的功能,就是保存当前正在执行的指令。<2> 分析指令把指令寄存器中保存的“指令操作码”部分送给CU。在图上表示是非常简单的。实际上大量的操作是在控制单元内部进行的。后面再慢慢探讨。经过译码以后,可以看见,在CU上面,有很多信号,就是有由这些信号,去控制相应的执行部件去执行指令、要求。现在从IR开始,因为IR中保存了当前指令,同时也保存了当前这条指令操作数的地址。(IR中有指令的操作码也有地址码)把IR的地址码部分把地址取出,送入MAR。再由MAR将地址送入存储体。在控制器的控制之下,从存储器中,把取数指令要取的数取出来,存入MDR中。然后送入ACC。解释:第一次从PC中取指令,交给IR。IR反馈给CU,CU经过分析发现该指令是取数指令。数的地址在IR的取数指令中存着,然后CU告诉IR去取数,所以第二次从IR开始是取数并把数存到ACC中。存数指令==功能==将ACC中保存的数据放入存储体中指定的单元。要执行的指令的地址保存在PC中,指令保存在存储体中。<1> 取指令把指令从存储体中取出来。必须要知道指令的地址(指令的地址保存在PC中)。所以还是从PC开始。①把指令的地址送给MAR②由MAR送给存储体③在控制单元CU的控制下,从存储体指定的存储单元中,把指令取出来,放入MDR中。④再次由控制单元控制下,把MDR取出来的指令送入IR(控制器)中。<2> 分析指令将IR中保存的指令的操作码部分,送给CU。由CU对指令进行分析。通过分析,就能知道指令要做什么样的操作。CU就会发出相应的控制信号来完成指令要求的操作。现在的指令是存数指令。<3> 存数①在CU的控制下,把IR中地址码部分送入MAR。②再由MAR送入送入存储体,告诉存储体现在有一个数据要存进来,地址是多少。③将ACC中的内容送入MDR。因为ACC中保存了从存储体中输入和输出的数据。④在控制器的控制下,将MDR中的数据,保存到存储体中。除此之外,还有加法减法乘数指令等。可以自行试一下,在这里如何进行的。(2)完成编写的程序下面再来看一下编写的程序是如何运行的。比如:将程序和数据保存到计算机(内存)中,是通过输入设备来做的。控制器要知道程序的首地址,所以要把程序的首地址送到指定寄存器中(PC)。 PC中就保存了要执行指令的地址。 然后启动机器,开始执行程序。 程序是由一条一条指令构成的。执行程序的过程,实际上就是执行多条指令的过程总和。比如现在执行第一条指令(取数指令),要进行三步。(把X的值从内存单元中取出来,保存在ACC中。)<1> 取指令将指令从给定的内存单元中取出,放在IR中。具体操作:PC给出“取数指令”这个指令所在内存单元的地址,PC将该地址送给MAR。然后MAR将地址送给M(存储体)。M存储体将指令拿出来之后,送入MDR,再由MDR送入IR。<2> 分析指令将指令的操作码部分,送给CU。IR是指令寄存器,里面保存了指令。可以将它的操作码用OP表示。即:OP(IR)。将操作码部分送给CU,就是这样写:OP(IR)->CU。由CU对操作码进行分析。<3>执行指令这是一个取数指令。要取的数据的地址保存在IR的地址码部分。AD表示地址码部分:AD(IR)。将地址送给MAR。再由MAR送给存储体M。把数据从给定的存储单元中取出之后,再放入MDR寄存器。(MDR和MAR实际上是接口寄存器。)MDR获得数据之后,要完成取数指令的功能,就要把数据送入ACC。经过这三步,取数指令就完成了。剩下的乘法指令,从取指令、分析、执行,具体应该做什么操作。大家可以自己试一下。如果直接进行下一条乘法指令,是取不出来的。因为当前PC中,保存的地址,还是第一条指令(取数指令)的地址。执行完取数指令之后,需要对PC的值进行调整。实际上,在取址操作结束以后,PC的值在分析指令和执行指令中没有用到。所以,在取指令结束之后,就可以对PC的值进行调整了。让PC加1,再送到PC中。其他的指令都可以用这种方式进行分析。每三条对应完成一条指令的过程。最后保存指令之后,就可以进行打印。当然打印指令也要进行取指令、分析和执行三步。最后停机。三、硬件技术指标1.机器字长CPU一次能够处理数据的位数。(8位)与CPU中的寄存器位数有关。在之前介绍的模型机中,机器字长和ACC寄存器、X寄存器、MQ寄存器的长度相同。为了简化问题,存储单元的长度(存储字长)和寄存器的长度也是相同的。并不是所有计算机都是这样,这里是之前模型机的假设而已。一般来说,机器字长越长,机器的性能越好。比如:64位操作:两个64位相加,它们的和保存在64位寄存器中。如果机器字长是8位,寄存器的位数也是8位。那么要完成64位加法,就要做8次加法运算。如果机器字长是64位,寄存器的位数也是64位。那么要完成64位加法,就要做1次加法运算。2.运算速度(1)主频和核数主频和核数并不是机器速度的直接指标。(2)吉普森法机器是用来执行指令的。机器的速度,可以用指令执行的速度来进行衡量。一台机器的指令集中可能有很多指令,这些指令,哪一条指令可以代表计算机的速度呢?①把指令集中每一条指令的执行时间加在一起,然后计算平均值。有问题!不同指令的执行频率不一致,有的指令虽然执行很慢,但是出现频率非常低。它对整个机器执行性能影响并不大。②按照每一条指令出现的频率,来计算指令执行时间的加权平均值。即吉普森法。fi:每一条指令在程序中出现的频率。动态使用频率(执行后,计算在执行过程中,每一条指令出现的频率)、静态使用频率(直接计算每一条指令出现的频率,不用执行)(3)时钟周期数时钟周期数:越少越好。最好一条指令只需要一个时钟周期就可以完成。计算机里面的时间是离散的,机器由时钟来进行驱动。CPI指标是指:执行一条指令需要多少个时钟周期。C:时钟周期 P:每一个 I:指令也需要计算平均值。把指令集中所有的指令的CPI计算出来,然后根据它的静态使用频率或者动态使用频率,采用加权平均的方法来计算每一条指令需要多少使用周期。现代计算机(比如超标量计算机),同时可以有多条指令进入流水线。每一个周期可以完成多条指令。为了衡量这种指令的机器性能。另外的指标叫做IPC,就是和CPI相反,指一个时钟周期能够完成多少条指令。(4)MIPSMIPS:每秒执行百万条指令M:百万I:指令P:每S:秒每秒执行的指令数越多,说明机器速度越快。这里面其实还要看每一条指令,具体执行了多少算数运算,或者多少逻辑运算,指令的复杂程度如何等。(5)FLOPS以上都是从指令执行的角度来衡量计算机的速度。实际上,在执行程序的时候。执行指令只是一个手段,目的是要完成算数或者逻辑运算。衡量机器的运行速度,一个更合理的指标是在相同时间里面,完成了多少算数或者逻辑运算。FLOPS:每一秒完成了多少浮点运算。(机器能够做多少操作的角度来进行衡量。)3.存储容量存储容量:越大越好。用存放二进制信息的总位数进行衡量。四、写在最后《计算机组成原理》系列参考书籍:参考视频:计算机组成原理(哈工大刘宏伟)
【论文速递】TNNLS2022 - 一种用于小样本分割的互监督图注意网络_充分利用有限样本的视角
【论文速递】TNNLS2022 - 一种用于小样本分割的互监督图注意网络_充分利用有限样本的视角【论文原文】:A Mutually Supervised Graph Attention Network for Few-Shot Segmentation: The Perspective of Fully Utilizing Limited Samples获取地址:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9733415
CSDN下载:https://download.csdn.net/download/qq_36396104/87379693博主关键词: 小样本学习,语义分割,图注意力网络,互监督摘要:全监督语义分割在许多计算机视觉任务中表现良好。然而,这是耗时的,因为训练一个模型需要大量的像素级注释样本。小样本分割最近成为解决这个问题的一种流行方法,因为它只需要少量带注释的样本就可以推广到新的类别。然而,如何充分利用有限的样本仍然是一个悬而未决的问题。因此,本文提出了一种相互监督的小样本分割网络。首先,对中间卷积层的特征映射进行融合,增强特征表示能力;其次,将支持图像和查询图像组合成二部图,采用图注意网络避免空间信息丢失,增加支持图像像素数,指导查询图像分割;第三,利用查询图像的注意图作为先验信息,增强支持图像分割,形成相互监督的机制。最后,将中间层的注意图进行融合,送入图推理层进行像素类别推断 。在PASCAL VOC-5i数据集和FSS-1000数据集上进行了实验,结果表明了该方法的有效性和性能优于其他基线方法。关键词 -小样本学习,图注意网络,图推理,图像分割,相互监督体制(MSR)。简介:DEEP神经网络在目标检测、语义分割和自动字幕等计算机视觉任务中取得了显著的成功。这些方法依赖于大规模的人类标注数据集的可用性,例如PASCAL VOC [1], ImageNet[2]和COCO[3]。然而,注释这些数据集非常耗时、繁琐且容易出错。语义分割已应用于许多计算机视觉任务,如自动驾驶[4]、人机交互[5]、图像搜索引擎[6]、手术用医疗设备[7]。由于密集的像素级预测问题,用于语义分割任务的标注需要更多的劳动。近年来,基于全卷积网络(FCN)[8]的最先进的语义分割框架取得了显著的进展;然而,缺乏注解良好的数据集阻碍了实际应用中的性能改进。为了降低标注成本,提出了一些带有粗标注的弱监督方法;这些方法包括边界框[9]、涂鸦[10]、点[11]和图像级别标签[12]。虽然这些方法确实降低了数据注释的难度,但训练数据集仍然需要额外的处理,而且这些模型不能适应新的类别。例如,自动驾驶模型无法适应不同国家的驾驶规则,计算机辅助诊断算法无法准确诊断新的疾病类别,网络异常检测算法无法发现新的安全漏洞类型。对于新的类别,网络必须重新训练。然而,当只有少数新样本可用时,网络容易过拟合。随着元学习技术的发展,在仅有少量标注样本的情况下,如何取得满意的分割结果已成为研究的热点。元学习的目标是学会学习,它模仿人类从少数甚至一个样本中识别新类别的能力。小样本学习是将元学习应用于监督范式,主要用于图像分类。 从另一个角度来看,语义分割可以看作是一个像素级的分类问题。Shaban et al.[14]提出了一种单shot语义分割方法,仅使用一张图像及其对应的像素级注释即可获得像素级分割掩码。这可能是第一次将小样本方法应用于分割任务。Rakelly等人[15]提出了Co-FCN方法,仅使用密集和稀疏注释实现少镜头分割。这些方法将支持图像的特征压缩成一个向量,通过掩码平均池化操作来指导分割。然而,掩码平均池化操作不可避免地会丢失支持图像中的空间信息。考虑到在小样本学习范式中样本有限,充分利用上下文信息并快速聚焦于关键对象特征是很重要的。 Zhang等[16]整合了中间层的信息,增强了特征的多样性。近年来,注意力机制被广泛应用于分割任务中,用于聚焦关键目标区域。Hu等人[17]提出了一种基于注意的小样本语义分割方法,该方法将注意机制应用于支持分支和查询分支之间的多尺度特征。Wang等[18]用图形注意取代了传统的注意。他们发现,激活的像素往往只集中在支持图像的一个非常小的区域。因此,只使用少量像素来指导查询图像分割,这对分割性能产生了不利影响。因此,作者在训练过程中调整激活区域,以利用支持图像中更多的前景对象像素。他们认为高权重像素应该被抑制,低权重像素应该被加强。但是,它们的权重调整策略并不合理,会引入噪声像素,导致查询图像分割不正确。支持图像的非判别区域容易导致查询图像的语义混叠。 例如,背景像素被错误地分割为前景像素。Fig. 1. Overview of graph attention.为了克服这些缺点,我们设计了一个小样本学习框架。在我们提出的方法中使用了典型的双分支结构,其中每个分支充当一个特征提取器网络。在该方法中,特征提取器网络被划分为几个中间层,以获得多尺度特征。从不同中间层获得的特征图被发送到图注意模块(GAM)。GAM旨在鼓励更多的前景像素来指导分割,如图1所示。提取器网络生成的特征向量被映射到图的节点上。我们定义了两种不同类型的边来构造图:图内边和图间边。图内边通过邻居创建机制生成,图内边连接在支持图的标记节点和查询图的所有节点之间。支持图像和查询图像的图结构共同构建二部图,将网格数据转换为图数据。然后,利用基于空间信息的图卷积网络来表示图数据。节点通过聚合自己的特征和邻居的特征来表示。通过计算图的边权值,将标签从支持图像传播到查询图像。这样做有利于充分利用有限的样本,同时避免空间信息的丢失。 然后,为了避免引入不正确的分割,提出了一种创新的权值调整方法,鼓励支持图像中有更多的标注像素来指导查询图像的分割过程。 然后,在每个中间层上引入双分支互监督网络。在将支持图像发送到GAM之前,使用支持掩码丢弃支持图像的背景。然后,利用该结果指导查询图像的分割。同样,生成的查询图像注意图用于删除查询图像的背景。从而形成一个相互监督的区域(MSR),并通过逐步迭代得到多层前景注意图。MSR打破了传统的仅使用支持图像来指导分割的方法。 查询图像参与网络训练,提高分割性能,有利于充分利用有限的样本。此外,采用混合损失函数加快了网络的收敛速度。最后,融合来自不同中间层的注意图,并将其发送到图推理层(GRLs)来推断像素类别。我们的主要贡献总结如下。1)利用支持图像和查询图像的特征映射构造二部图,并设计GAM计算它们之间的边权值。然后,根据边缘权值将标签从支持图像传播到查询图像。此外,我们提出了一种权重调整策略,以鼓励更多的前景像素参与分割过程。2)采用MSR充分利用中间层的多层信息,鼓励支持图像和查询图像相互学习。最后,对两个损失进行了相加,加快了小样本学习网络的收敛速度。3)我们在Pascal VOC-5i和FSS-1000数据集上演示了我们的方法的有效性,并实现了最先进的性能。本文其余部分的组织如下。第二部分介绍了相关技术和最新进展。第三节详细说明了拟议的网络。第四部分报告实验设置和结果。第五节讨论了结果并提出了今后的工作建议。Fig. 2. Detailed design of our proposed method with three parts: 1) two feature extractor branches; 2) the GAM; and 3) the GRL.AIEarth是一个由众多领域内专家博主共同打造的学术平台,旨在建设一个拥抱智慧未来的学术殿堂!【平台地址:https://devpress.csdn.net/aiearth】 很高兴认识你!加入我们共同进步!
Yolov5+图像分割+百度AI接口——车牌实时检测识别系统
一、Yolov5介绍之前有些一篇文章——《Yolov5:强大到你难以想象──新冠疫情下的口罩检测》,详细链接为 :Yolov5:强大到你难以想象──新冠疫情下的口罩检测,里面有对Yolov5的简介,这两天的学习我对Yolov5的了解更加深入,在知网上查阅了不少资料,总结一下:YOLOv5 算法整体主要有 3 部分组成: Backbone、 Neck 和 Prediction, 以 YOLOv5s 模型为例整体算法结 构如下所示. Backbone 主要有 Conv, C3 和 SPPF 基 本网络模块组成, 其主要功能就是提取图像特征信息, C3 模块使用残差网络结构, 可以学习到更多的特征信 息, SPPF 模块是空间金字塔池化, 也是 Backbone 网络 的输出端, 主要功能是将提取到的任意大小的特征信 息转换成固定大小的特征向量. Neck 网络采用 FPN+ PAN 的特征金字塔结构网络, 可以实现不同尺寸目标 特征信息的传递, 可以有效解决多尺度问题. Prediction 采用 3 种损失函数分别计算目标分类损失, 目标定位损失和置信度损失, 并通过 NMS 提高网络检测的准确 度. 模型默认输入图像尺寸大小为 640×640的 3 通道图像, 最终输出格式是 3×(5+ncls), ncls 表示目标检测分类 数量。 YOLO 算法从总体上看, 是单阶段端到端的基于 anchor-free 的检测算法. 将图片输入网络进行特征提 取与融合后, 得到检测目标的预测框位置以及类概率. 而 YOLOv5 相较前几代 YOLO 算法, 模型更小、部署 灵活且拥有更好的检测精度和速度, 适合实时目标检 测. YOLOv5 根据模型不同深度和不同特征图宽度划 分为 YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 四个模型. 其中 YOLOv5s 是最小的模型,本文车牌检测既是用YOLOv5s模型。二、图像分割图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像素赋予相同的编号。 主要是用opencv进行矩阵切割,img = cv2.imread('图片.jpg')dst = img[num1:num2,num3:num4] #裁剪坐标为[y0:y1, x0:x1]我们看一个demo,还记得我们之前写的人脸识别算法吗?我们进行一下改进,之前的效果是: 我们将代码优化一下,不仅要在原图上用红框标记出来,而且要切割出来。代码如下:1. import cv2 as cv
2.
3.
4. def face_detect_demo(img):
5. img = cv.resize(img, dsize=(800, 800))
6. gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
7. face_detect = cv.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
8. face = face_detect.detectMultiScale(gary, 1.004, 28, 0, (40, 40), (50, 50))
9. count = 1
10. for x, y, w, h in face:
11. cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 225), thickness=4)
12. dst = img[y:y + h, x:x + w]
13. # cv.imshow("demo",dst)
14. cv.imwrite("temp/face_{0}.jpg".format(count), dst)
15. count += 1
16. cv.imshow("result", img)
17. # img.save("result.jpg") # 保存图片
18. cv.imwrite(r"final_result.jpg", img)
19.
20. img = cv.imread("photo.jpg")
21. face_detect_demo(img) # 检测单个图片
22.
23. while True:
24. if ord("q") == cv.waitKey(1):
25. break
26. cv.destroyAllWindows()检测结果如下,我们就将所有人脸分割出来啦! 三、百度AI百度智能云AR开放平台提供领先的AR技术能力与一站式平台工具,开放感知跟踪、人机交互等40+技术能力。它提供了很多技术的接口,比如说人脸识别,文字识别,语言识别等等。 这次我们通过调用文字识别的接口,用来识别我们本地图片上的文字,详细教程可以看这位博主的:百度AI调接口教程。对了,大家记得领一下百度免费送的优惠,要不然程序运行会报错,别问我怎么知道的,问就是搞了两个半小时总结出来的。这个过程可以理解为调用百度文字识别这个函数,传入本地的一张图片,它可以返回本地图片上的文字。只不过这个函数不是内置的,需要你去配置才能够使用。代码如下:1. # 测试百度在线图片文本识别包
2. # 导入百度的OCR包
3.
4. from aip import AipOcr
5.
6. if __name__ == "__main__":
7. # 此处填入在百度云控制台处获得的appId, apiKey, secretKey的实际值
8. appId, apiKey, secretKey = ['28509942', 'HbB3GChFwWENkXEI7uCuNG5V', 'IRnFhizLzlXnYFiNoq3VcyLxRHaj2dZU']
9. # 创建ocr对象
10. ocr = AipOcr(appId, apiKey, secretKey)
11. with open('D:/cartarget/result_1.png', 'rb') as fin:
12. img = fin.read()
13. res = ocr.basicGeneral(img)
14. print(res['words_result'][0]['words']) 这里的appId, apiKey, secretKey需要更换成自己的,图片检测的位置也要换成自己的。我是要下载SDK运行的,你们也可以试试别的方法。四、Yolov5+图片分割+百度AI车牌实时检测识别系统4.1流程图Visio浅浅画了一个流程图,用来表达整个项目的逻辑: 4.2数据集下载首先是数据集下载,我用的是CCPD2020的数据集,CCPD2020数据集采集方法应该CCPD2019数据集类似。CCPD2020仅仅有新能源车牌图片,包含不同亮度,不同倾斜角度,不同天气环境下的车牌。CCPD2020中的图像被拆分为train/val/test数据集,train/val/test数据集中图片数分别为5769/1001/5006。我用的时候取了100张train,80张val和20张test。CCPD2020数据集(数据大小865.7MB)下载链接我也分享给大家,不用谢!链接:https://pan.baidu.com/s/11IgwwsCjsTRuLOnewx51lw?pwd=5rvf 提取码:5rvf4.3Yolov5模型训练然后是Yolov5模型的训练,详细代码还是看之前那篇口罩检测的文章吧,配置文件只要改这几个。数据集的配置文件:mask_data.yaml:修改train的路径 注意是 /(反斜杠)修改val的路径修改类别 nc :1、2 names [“标签名称1”、“标签名称2”] 具体几个看你的类别有几个模型配置文件: yolov5s.yaml修改类别个数 nc:1、2这里贴上检测数据,由于是用CPU跑的,考虑到时间问题,我这里仅训练了20次,用时在40min左右。 可以看到,识别的精度为80%左右,还是比较可观的,通过增大epoch的值,可以调整成100,识别率达到95%是没有问题的。4.3PyQt5可视化界面点击上传图片按钮上传图片,从本地选择一张图片。 再点击开始检测 ,调用训练好的pt模型进行识别。左边为原图,右边为检测之后的图, 可以看到这辆车的车牌已经被框选出来,做了标记。4.4opencv切割图片我自定义了一个split.py,里面只有一个split函数,目的就是为了切割图片,这里是运用了封装思想。在windows.py文件中通过import导入,就可以直接运用这个函数了。以下为split.py文件内容。1. import cv2 as cv
2. def split(list_1,img,i):
3. dst = img[int(list_1[1]):int(list_1[3]),int(list_1[0]):int(list_1[2])] # 裁剪坐标为[y0:y1, x0:x1] xyxy
4. cv.imwrite("D:/cartarget/result_{0}.png".format(i+1), dst)
5.
6.
7. # list_1 =[231,1391,586,1518]
8. # img = cv.imread('train_25.jpg')
9. # split(list_1,img,0)接着需要对windows.py进行修改,在检测图片detect_img函数中,添加1. tem_list = []
2. tem_list.append(int(xyxy[0]))
3. tem_list.append(int(xyxy[1]))
4. tem_list.append(int(xyxy[2]))
5. tem_list.append(int(xyxy[3]))
6. print("准备切割!")
7. split.split(tem_list, im0,count_1)
8. count_1 += 1
9. print("切割完成!")这样,Yolov5检测出几个目标,就会调用几次split方法从而切割出来几张子图片,由于这里图片只有一辆车,所有只有一个检测目标,所以只会得到一个车牌。 4.5调用百度AI进行图片检测这个逻辑就很好理解啦!只要把上面这个图片丢给百度文字识别去识别内容就好啦!1. if __name__ == "__main__":
2. # 此处填入在百度云控制台处获得的appId, apiKey, secretKey的实际值
3. appId, apiKey, secretKey = ['28509942', 'HbB3GChFwWENkXEI7uCuNG5V', 'IRnFhizLzlXnYFiNoq3VcyLxRHaj2dZU']
4. # 创建ocr对象
5. ocr = AipOcr(appId, apiKey, secretKey)
6. with open('name.png', 'rb') as fin:
7. img = fin.read()
8. res = ocr.basicGeneral(img)
9. print(res['words_result'][0]['words']) 可以看到识别完全正确!大功告成!五、总结这个车牌识别系统到这里就算正式结束啦!感觉收获还是蛮多的,对Yolov5的理解更加深刻,Opencv的运用更加熟练,PyQt5也算是熟悉了。目标检测、图片分割、图像搜索、增强和特效、动作识别等等,慢慢觉得这些功能更像是一个个拼图,想要完成一个较大的工程,需要将一个个小功能拼在一起。机器学习的路程还很漫长,很多知识我都未曾了解,其中的数学原理更是知之甚少。未来的学习还很漫长,人工智能的领域依然辽阔而精彩。车牌检测这个项目只是一个载体,项目本身并不重要,重要的是项目背后学到的知识,定期总结才能更好的接受知识吧!好啦,今天的分享就到这里啦!
【学习笔记】黑马程序员Node.js全套入门教程 | 基础篇
【学习笔记】黑马程序员Node.js全套入门教程 | 基础篇⛄最近要写一些npm命令发现文件读写和路径API忘记了,索性直接复习了一遍NodeJS,边学边忘真的痛苦。⛄本文包含以下内容:对NodeJS的基础介绍,NodeJS的内置包的简单介绍,CommonJS模块化介绍,npm包下载与发布介绍。⭐注:本文是对黑马程序员Node.js全套入门教程的学习笔记记录,加入了一些自己的练习改动与思考。⭐推荐大家去看原视频:黑马程序员Node.js全套入门教程初识NodeJs思考与认识JS为什么可以在浏览器中被执行====浏览器====
待执行的JS代码
↓
JavaScript解析引擎
====浏览器====浏览器中含有JavaScript解析引擎负责解析JS代码不同的浏览器使用不同的JavaScript解析引擎:Chrome => V8Firefox => OdinMonkey(奥丁猴)Safri => JSCoreIE浏览器 => Chakra(查克拉)等...Chrome浏览器的V8解析引擎性能最好为什么JavaScript可以操作DOM和BOM====浏览器====
DOMAPI BOMAPI AjaxAPI
↓
待执行的JS代码(调用WebAPI)
↓
JavaScript解析引擎每个浏览器都内置了DOM、BOM这样的API函数,因此,浏览器中的JavaScript才可以调用它们。浏览器中的JavaScript运行环境运行环境是指代码正常运行所需的必要环境。====Chrome浏览器运行环境====
V8引擎 内置API
↑ ↓
待执行的JavaScript代码
====Chrome浏览器运行环境====V8引擎负责解析和执行JavaScript 代码。内置API是由运行环境提供的特殊接口,只能在所属的运行环境中被调用。JavaScript能否做后端开发JS可以在浏览器中运行,我们需要通过Node.js让JS代码在服务端运行Node.js 简介什么是Node.jsNode.js 是一个基于Chrome V8引擎的JavaScript运行环境。官网地址:Node.js (nodejs.org)Node.js中的JavaScript运行环境====Node.js运行环境====
V8引擎 内置API(fs path http JS内置对象等)
↑ ↓
待执行的JavaScript代码
====Chrome浏览器运行环境====浏览器是JavaScript 的前端运行环境。Node.js 是JavaScript的后端运行环境。Node.js 中无法调用DOM和BOM等浏览器内置API。Node.js 可以做什么Node,js作为一个JavaScript 的运行环境,仅仅提供了基础的功能和API。然而,基于Node.,js提供的这些基础能,很多强大的工具和框架如雨后春笋,层出不穷,所以学会了Node.js,可以让前端程序员胜任更多的工作和岗位。基于 Express 框架 (opens new window),可以快速构建 Web 应用基于 Electron 框架 (opens new window),可以构建跨平台的桌面应用基于 restify 框架 (opens new window),可以快速构建 API 接口项目读写和操作数据库、创建实用的命令行工具辅助前端开发等...安装Node.js如果希望通过Node.,js 来运行Javascript 代码,则必须在计算机上安装Node.js环境才行。前往官网下载安装:节点.js (nodejs.org)区分LTS版本和Current版本的不同LTS为长期稳定版,对于追求稳定性的企业级项目来说,推荐安装LTS版本的Node.js。Current 为新特性尝鲜版,对热衷于尝试新特性的用户来说,推荐安装Current 版本的Node.js。但是,Current 版本中可能存在隐藏的Bug 或安全性漏洞,因此不推荐在企业级项目中使用Current版本的 Node.js查看已安装的Node.js版本号打开终端输入node -v,即可查看node.js版本号什么是终端终端(英文: Terminal)是专门为开发人员设计的,用于实现人机交互的一种方式。使用node <js文件名>运行js文件常用模块fs文件系统模块fs 模块是Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。导入模块// Nodejs内置模块 无需额外安装
const fs = require('fs')读取文件内容使用fs.readFile()方法,可以读取指定文件中的内容fs.readFile(path[, options], callback)参数解释:path:必选参数,字符串,表示文件的路径。options:可选参数,表示以什么编码格式来读取文件。callback:必选参数,文件读取完成后,通过回调函数拿到读取的结果,该函数会传入两个参数。err:文件读取错误时发生的报错dataStr:文件内容示例代码const fs = require('fs')
fs.readFile('./test.text', 'utf8', function (err, dataStr) {
// 如果读取成功,则err为null
// 如果读取失败,err的值为错误对象
if(err) {
console.log(err)
}
console.log('+++++++++')
// 打印成功的结果
console.log(dataStr)
})写入文件内容使用fs.writeFile0方法,可以向指定的文件中写入内容,语法格式如下该方法只能创建文件,不能创建目录fs.writeFile(file, data[, options], callback)参数解释:file:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。data:必选参数,表示要写入的内容。options:可选参数,表示以什么格式写入文件内容,默认值是utf8。callback:必选参数,文件写入完成后的回调函数,该函数会传入一个参数。err:文件写入错误时发生的报错示例代码const fs = require('fs')
fs.writeFile('./write.text', 'Hello FS Module!', 'utf8', function (err) {
// 如果写入成功,则err为null
// 如果写入失败,err的值为错误对象
if (err) {
console.log(err)
}
})处理路径问题在使用fs 模块操作文件时,如果提供的操作路径是以./或../开头的相对路径时,很容易出现路径动态拼接错误的问题。原因:代码在运行的时候,会队执行node命令时所处的目录,动态拼接出被操作文件的完整路径。(相对于用户所在目录,而不是相对于文件目录)__dirname__dirname表示当前文件所处的目录,更改后可解决路径问题const fs = require('fs')
fs.readFile(__dirname + '/test.text', 'utf8', function (err, dataStr) {
// ...
})
fs.writeFile(__dirname + '/write.text', 'Hello FS Module!', 'utf8', function (err) {
// ...
})path路径模块path模块是Node.js官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。导入模块// Nodejs内置模块 无需额外安装
const fs = require('fs')路径拼接使用path.join(方法,可以把多个路径片段拼接为完整的路径字符串,语法格式如下path.join([...path])参数解释:path:路径片段的序列()const path = require('path')
const pathStr = path.join('/a', '/b/c', '../', './d', 'e')
console.log(pathStr) // \a\b\d\e
const pathStr2 = path.join(__dirname, './files/1.text')
console.log(pathStr2) // 将相对路径转化为绝对路径与 __dirname 使用字符串加法的不同如果使用字符串加法__dirname + './a'会在路径中多出一个点(.)使用path.join可以解决此问题获取路径中的文件名使用path.basename()方法,可以获取路径中的最后一部分,经常通过这个方法获取路径中的文件名,语法格式如下path.basename(path[, ext])参数解释:path:必选参数,表示一个路径的字符串ext:可选参数,表示文件扩展名使用示例const path = require('path')
const fpath = '/a/b/c/index.html'
let fullName = path.basename(fpath)
console.log(fullName) // index.html
let nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt) // index获取路径中的文件扩展名使用path.extname)方法,可以获取路径中的扩展名部分path.extname(path)参数解释:path:必选参数,表示一个路径的字符串使用示例const path = require('path')
const fpath = '/a/b/c/index.html'
let fext = path.extname(fpath)
console.log(fext) // .htmlhttp模块http模块是Node.js 官方提供的、用来创建 web服务器的模块。通过 http模块提供的 http.createServer()方法,就能方便的把一台普通的电脑,变成一台Web服务器,从而对外提供Web资源服务。服务器和普通电脑的区别在于,服务器上安装了web服务器软件,例如:IIS、Apache等。通过安装这些服务器软件,就能把一台普通的电脑变成一台web服务器。在Node.js 中,我们不需要使用IIS、Apache等这些第三方web服务器软件。因为我们可以基于Node,js提供的http模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供web服务。基本四步导入http模块创建web服务器实例为服务器实例绑定request事件,监听客户端请求启动服务器导入模块const http = require('http')创建web服务器实例const server = http.createServer()为服务器绑定request事件server.on('request', (req, res) => {
console.log('Someone visit our web server.')
const url = req.url // 请求地址
const method = req.method // 请求url
// 根据路径判断返回不同内容
let content = '<h1>404 Not found!</h1>'
if(url === '/' || url === '/index.html') {
content = '<h1>首页</h1>'
}
res.setHeader('Content-Type', 'text/html; charset=utf-8') // 设置响应头
res.end(content) // 向客户端响应内容
})启动服务器server.listen(80, () => {
console.log('http server running at http://127.0.0.1')
})模块化模块分类Node.js 中根据模块来源的不同,将模块分为了3大类,分别是内置模块(内置模块是由Node.js官方提供的,例如fs、path、http等)自定义模块(用户创建的每个.js文件,都是自定义模块)第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)加载模块// 加载内置fs模块
const fs = require('fs')
// 加载用户自定义模块
const custom - require('./custom.js')
// 加载第三方模块
const moment - require('moment')注意:使用require方法加载其它模块时,会执行被加载模块中的代码。模块作用域和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。该作用域防止了全局变量污染的问题module对象在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息id,path,exports,parent,filename等...module.exports在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用。外界用require()方法导入自定义模块时,得到的就是 module.exports所指向的对象。代码示例// moduleA.js
// 导出变量
module.exports.username = 'zs'
module.exports.sayHello = function() {
console.log('Hello!')
}// main.js
// 导入并使用变量
const moduleA = require('./moduleA.js')
moduleA.sayHello()exports对象由于module.exports单词写起来比较复杂,为了简化向外共享成员的代码,Node提供了exports对象。默认情况下,exports和module.exports 指向同一个对象。最终共享的结果,还是以module.exports指向的对象为准。时刻谨记,require)模块时,得到的永远是 module.exports指向的对象console.log(module.exports) // {}
console.log(exports) // {}
console.log(module.exports === exports) // true CommonJS规范Node.js遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖。CommonJS规定:每个模块内部,module变量代表当前模块。module变量是一个对象,它的exports属性(即module.exports)是对外的接口。加载某个模块,其实是加载该模块的 module.exports属性。require)方法用于加载模块。模块加载机制模块第一次加载后会被缓存,即多次调用 require() 不会导致模块的代码被执行多次,提高模块加载效率。内置模块加载内置模块加载优先级最高。自定义模块加载加载自定义模块时,路径要以 ./ 或 ../ 开头,否则会作为内置模块或第三方模块加载。导入自定义模块时,若省略文件扩展名,则 Node.js 会按顺序尝试加载文件:按确切的文件名加载补全 .js 扩展名加载补全 .json 扩展名加载补全 .node 扩展名加载报错第三方模块加载若导入第三方模块, Node.js 会从当前模块的父目录开始,尝试从 /node_modules 文件夹中加载第三方模块。如果没有找到对应的第三方模块,则移动到再上一层父目录中,进行加载,直到文件系统的根目录。例如,假设在 C:\Users\bruce\project\foo.js 文件里调用了 require('tools'),则 Node.js 会按以下顺序查找:C:\Users\bruce\project\node_modules\toolsC:\Users\bruce\node_modules\toolsC:\Users\node_modules\toolsC:\node_modules\tools目录作为模块加载当把目录作为模块标识符进行加载的时候,有三种加载方式:在被加载的目录下查找 package.json 的文件,并寻找 main 属性,作为 require() 加载的入口如果没有 package.json 文件,或者 main 入口不存在或无法解析,则 Node.js 将会试图加载目录下的 index.js 文件。若失败则报错npm与包包概念Node.js 中的第三方模块又叫做包。就像电脑和计算机指的是相同的东西,第三方模块和包指的是同一个概念,只不过叫法不同。来源不同于Node.js 中的内置模块与自定义模块,包是由第三方个人或团队开发出来的,免费供所有人使用。Node.js 中的包都是免费且开源的,不需要付费即可免费下载使用。为什么需要包由于Node.js 的内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发的时,效率很低。包是基于内置模块封装出来的,提供了更高级、更方便的API,极大的提高了开发效率。包和内置模块之间的关系,类似于jQuery和浏览器内置API之间的关系。从哪里下载包国外有一家IT公司,叫做npm, Inc.这家公司旗下有一个非常著名的网站: https://www.npmjs.com/,它是全球最大的包共享平台,你可以从这个网站上搜索到任何你需要的包,只要你有足够的耐心!npm, Inc.公司提供了一个地址为https://registry.npmjs.org/的服务器,来对外共享所有的包,我们可以从这个服务器上下载自己所需要的包。如何下载包npm, Inc.公司提供了一个包管理工具,我们可以使用这个包管理工具,从https://registry.npmjs.org/服务器把需要的包下载到本地使用。这个包管理工具的名字叫做Node Package Manager (简称npm包管理工具),这个包管理工具随着Node.js的安装包一起被安装到了用户的电脑上。npmnpm是Nodejs官方的包管理工具。初次装包完成后,在项目文件夹下多一个叫做node_ modules的文件夹和package-lockjson的配置文件。node_modules 文件夹用来存放所有已安装到项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包。package-lockjson 配置文件用来记录node modules目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。# 初始化npm配置文件
# -y表示使用配置默认选项
# 执行后出现 package.json 文件
npm init -y
# 下载包
npm install <包名称>
# 删除包
npm uninstall <包名称>
# 切换镜像源加速下载
npm config set registry=https://registry.npm.taobao.org/
# 在执行npm install命令时,如果提供了-g参数,则会把包安装为全局包。
# 全局包会被安装到C:\Users\用户目录VAppData\RoamingInpm\node_modules目录下。
npm install <包名称> -g上述命令只能在英文的目录下成功运行!所以,项目文件夹的名称一定要使用英文命名,不要使用中文,不能出现空格。运行npm install命令安装包的时候,npm包管理工具会自动把包的名称和版本号,记录到package.json 中。// packge.json
{
"name": "nodeNpm",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}发布包新建itheima-tools文件夹,作为包的根目录在itheima-tools文件夹中,新建如下三个文件:package.json(包管理配置文件)index.js(包的入口文件)README.md(包的说明文档)// packge.json
{
"name": "myTool", // 包名称
"version": "1.0.0", // 包版本
"description": "", // 包的描述
"main": "index.js", // 包的入口文件
"scripts": { // 包的可执行指令
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [], // 搜索关键字,使用那些关键字可以搜索到该作者
"author": "", // 包的作者
"license": "ISC" // 包遵循的开源协议
}// main.js
module.export = {
add(a, b){
return a+b
}
}包根目录中的README.md文件,是包的使用说明文档。通过它,我们可以事先把包的使用说明,以 markdown的格式写出来,方便用户参考。README文件中具体写什么内容,没有强制性的要求;只要能够清晰地把包的作用、用法、注意事项等描述清楚即可。我们所创建的这个包的 README.md文档中,会包含以下6项内容:安装方式、导入方式、格式化时间、转义HTML中的特殊字符、还原HTML中的特殊字符、开源协议npm发布注册npm账号访问https://www.npmjs.com/网站,点击 sign up按钮,进入注册用户界面填写账号相关的信息:Full Name、Public Email、Username、Password点击Create an Account按钮,注册账号登录邮箱,点击验证链接,进行账号的验证登录npm账号npm账号注册完成后,可以在终端中执行npm login命令,依次输入用户名、密码、邮箱后,即可登录成功。注意:在运行npm login命令之前,必须先把下包的服务器地址切换为npm的官方服务器。否则会导致发布包失败!# 输入账号密码后即可成功登录
npm login发布# 将包发布在npm上
npm publish
# 删除发布的包
npm unpublish <包名> --forcenpm unpublish命令只能删除72小时以内发布的包。npm unpublish 删除的包,在24小时内不允许重复发布发布包的时候要慎重。尽量不要往npm上发布没有意义的包!⛄以上便是基础篇的全部内容了,学习后能让你对NodeJS有一个大致的了解。
IDA基本使用
学习逆向工程需要熟悉一个反汇编器的使用,学会阅读汇编语言,学会编写脚本和查找资料IDA是功能很强大的一款反汇编机器,本文保姆级讲解了IDA的基本使用关于汇编语言的学习我总结了另一篇文章汇编语言快速入门_光无影的博客-CSDN博客序言It was the best of times,it was the worst of times,it was the age of wisdom,it was the age of foolishness,it was the epoch of belief,it was the epoch of incredulity.it was the season of Light,it was the season of Darkness,it was the spring of hope,it was the winter of despair,we had everything before us,we had nothing before us.we were all going direct to Heaven,we were all going direct the other way. ——A Tale of Two Cities今天,万物互联,普适计算。整个世界的构造都由程序操纵起来。A handful of people working at a handful of tech companies steer the thoughts of billions of people every day.你可曾听过赛博朋克这个词,科幻作家布鲁斯·博斯克创造了这个词。赛博朋克Cyberpunk是由网络Cyber和朋克Punk组成。而cyber的词源是控制论cybernetics,是20世纪重要的思想运动。punk则代表着治理与反叛两个概念的纠缠。科幻作家布鲁斯·博斯克创造了“赛博朋克”,并把该名设定为自己短篇小说的名字,形容迷失的年轻一代:他们是抗拒父母的权威、与主流社会格格不入、利用电脑技术钻漏洞和制造麻烦的技术宅。经典的赛博朋克角色是边缘且性格疏远的独行者。赛博朋克深受科幻作者的喜爱,很成功的电影作品有《黑客帝国》。赛博朋克类小说中的世界是反乌托邦式的,涉及日常生活受到急剧改变的科技影响,普及的计算机化信息笼罩全球,以及侵入性的人体改造。在赛博朋克的作品中,一边是闪烁着霓虹灯光的摩天大楼,富人们在此享受生活,但在阴暗的角落里,到处是黑帮、流氓、抢劫犯的身影,穷人们只能靠电子产品来麻痹自己。闪烁的霓虹灯和摩天大楼上五彩斑斓的大屏幕,让人联想到了《三体》中的超信息时代。赛博朋克有时也专指这种视觉美学风格。Hacker ,这个词是用来形容那些热衷于解决问题、克服限制的人。他们是崇尚自由的,乐于追根究底、穷究问题的特质。从广义上来说,任何职业都可以成为Hacker 。你可以是一个木匠黑客。不一定是高科技。只要与技能有关,并且倾心专注于你正在做的事情,你就可能成为黑客。Hacker有别于Cracker,真正的Hacker遵守黑客守则,不破坏任何系统。IDA是一个功能强大的反汇编器,学习逆向有别于按照一个框架去编写程序,需要灵活的头脑和痴迷于逆向分析的精神。你是在玩解密游戏而不是去建造一座大厦。本文是将最核心的IDA的使用做了一个总结,删去了为了逻辑严密,内容全面的教科书式的讲解,只总结最和核心有用的实际操作,并且详细配置了图片,对于一些动态调试的具体内容,后续会有专门的博客,将链接贴在这篇文章中,希望大家在阅读完这篇文章之后就能上手使用IDA。开始阅读核心部分吧IDA Pro简介IDA Pro就是一款递归下降反汇编器反汇编器使用的算法包括:线性扫描反汇编算法、递归下降反汇编算法IDA并非一款免费软件,为用户提供了一款功能有限的免费版本,不提供最新版本的功能百度词条:交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA。是最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器!IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序, 被公认为最好的花钱可以买到的逆向工程利器。IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种CPU指令集其中包括Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。IDA的基本用法ida文件加载可以打开IDA->菜单栏file->open(选择一个二进制文件)也可以将要分析的二进制文件拖到ida图标上IDA桌面简介你看过有关黑客的视频吗,一台性能很高的电脑上下着绿色的字符串雨,黑客盯紧屏幕检索其中的关键信息。当然这是有一定艺术化处理的,不一定都是绿色的界面。当然你可以根据自己的喜好配置成这样。但是有一点是肯定的,IDA的有关操作需要你查看很多界面,有很多不同的信息需要你整合分析。涉及栈,反汇编代码,反编译代码,程序中包含的字符串等等很多有关需要逆向分析的程序的信息。资深搞逆向工作可以考虑准备一台很大的显示屏。下面我们来认识一下IDA的这些窗口(View)。导航带 概况导航栏,也叫作导航带,光标悬停在导航带任何位置会指出其在二进制文件中的位置Options-color可以修改导航栏的颜色反汇编窗口 上图是图形视图,按空格键可以和文本视图相互切换.text:004028EE为区域名称加虚拟地址图中.text是代码段 Ctrl+“+”可以或者Ctrl加鼠标滚轮实现界面的缩放views->open subviews->Disassembly可以打开另一个反汇编窗口,每个反汇编窗口互相独立,可以一个查看图形,另一个查看文本 IDA使用不同的箭头颜色来表示不同的流条件跳转Yes是绿色箭头,No是红色箭头,默认为蓝色箭头文本窗口右边是箭头窗口用于描述非线性流程 ,虚线是条件跳转,实线是非条件跳转粗实线表示程序将控制权交给程序中的以前的某个地址,通常表示程序中存在循环是反汇编形成的汇编语言代码按下“;”可以添加注释,用于逆向分析时使用图中 ; CODE XREF: _main+209↑j是自动生成的表示此处有交叉引用的注释_main+209↑j表示一个地址,形式是函数+偏移量,↑表示该地址在上面交叉引用暂不做介绍函数窗口为 IDA在数据库中识别的每一个函数,双击一个函数,会跳转到反汇编窗口这个函数所在的位置十六进制窗口Hex view 显示的是程序内容和列表的标准十六进制代码每行十六个字节还会显示对应的ASCII字符(!!!所以有时string窗口显示的字符串不好查看时,可以打开Hex view查看)右键->Sychronize with可以选择时是否与某个反汇编窗口相互关联,关联后,两个窗口会同时改变位置结构体窗口显示二进制文件中使用的任何复杂的数据结构(C结构体和联合)使用:为标准数据结构的布局提供现成的参考为你提供一种方法,发现程序使用的自定义数据结构时,帮助你创建自己的,可用作内存布局的数据结构枚举窗口显示检测到的标准枚举数据类型(C enum)可以自定义枚举类型Strings窗口 views->open subviews->Strings打开窗口显示的是从二进制文件中提取出来的一组字符串,以及字符串所在的地址从中可以查找程序中使用的字符串(有时也可以用Hex view查勘字符串,但是一般在string窗口中检索想要的关键字符串)与交叉引用相结合可以快速定位字符串,跟踪到程序中引用这个字符串的位置Names窗口 显示全局名称名称是指对一个程序虚拟地址的符号引用F常规函数L库函数I导入的名称C命名代码D数据A字符串数据ACDU反汇编的代码并不是完美的,需要手动进行调试ACDU可以将一段数据类型转化成代码(C),数据(D),未定义的二进制数据(U),字符(A)例如: 选择一段数据,按下A交叉引用概念交叉引用是一个地址引用一个地址根据图论的知识,可以把地址看成节点,把交叉引用看成边分为代码交叉引用和数据交叉引用代码交叉引用(函数调用,顺序执行和跳转)三种基本的流普通流,跳转流,调用流普通流:就是顺序执行,默认执行流,执行紧跟在后面的指令跳转流:无条件分支和条件分支分配到一跳转流,注释中出现j后缀调用流:调用一个函数使用调用流,使用后缀p数据数据交叉引用读取交叉引用:访问某个内存位置写入交叉引用:写入内内存偏移量交叉引用:引用某个位置的地址访问交叉引用列表指定位置Ctrl+x指定位置Views->Open Subviews->Cross—References 双击一个位置就可以跳转到这个位置IDA静态分析静态分析,就是根据反汇编器生成的结果,在不运行这个程序的情况下,逆向分析这个程序的运行过程。当然反汇编器是机械的根据算法来生成反汇编代码,而逆向和防止逆向是相互竞争的,为了防止逆向,机器代码掺杂了脏字节之类的东西,导致反汇编算法不能正确分析,这是也需要我们手动来调整。而且反汇编生成的代码的变量没有任何实际意义,当我们分析清楚其功能的时候,可以重命名。也可以加注释辅助逆向分析。名称IDA会自动生成生成与虚拟地址和与栈帧变量有关的名称,这些名称不能帮助我们认识位置和变量的用途,称为哑名IDA可以修改名称修改参数,局部变量,函数名称按快捷键N可以将光标位置的变量,函数重命名,输入一个空名称IDA会生成默认名称 修改地址的名称按快捷键N将光标位置的地址重命名 重命名寄存器按快捷键N将光标位置的寄存器重命名当编译器将变量分配在寄存器中,而不是程序栈上时为了更好地引用这个变量,需要重命名寄存器IDA注释 使用“:”,或者“;”快捷键函数操作新建函数添加一个手动分析,IDA没有分析出来的函数删除函数删除一个认为IDA分析错误的函数代码和数据的相互转换 使用快捷键ACDU字符串IDA能是识别大量的字符串格式,默认会搜索并格式化成C风格可以切换字符串格式指定数组IDA生成的反汇编代码很少提供数组大小的信息只有数组第一个元素被引用要生成一个便于分析的数组需要手动创建选择数组第一个元素,菜单栏选择Edit->Array创建数组的时候,确保将数组中的第一个元素的大小更改为适当的值,从而为数组的元素选择适当的大小 IDA脚本脚本可以帮助我们完成很多重复的工作,IDA的脚本是针对IDA的工作的脚本。脚本语言又被称为扩建的语言, 或者动态语言, 是一种编程语言, 用来控制软件应用程序。脚本的使用方式和IDC语法IDA脚本_光无影的博客-CSDN博客IDA插件概念IDA插件是经过编译的,功能更加强大的IDC脚本通常和热键,菜单关联插件可能是通用的处理各种二进制文件或者提供各种处理器体系结构使用构建插件插件在Windows上是有效的DLL文件,扩展名为.plx,.pmc,.plx64,lmc64安装插件将编译好的插件模块复制到plugins目录当中插件配置配置插件通过/plugins/plugins.cfg文件中的设置IDA动态调试有时候程序在运行过程中会生成一些关键的数值,而人力通过静态分析的结果模拟程序的运行来推出这些中间的数值可能很麻烦。简单重复的工作是计算机所擅长的而不是人,所以我们可以让这个程序运行起来,得到这些中间过程的数值。这就是动态调试。调试器通常用于执行以下两种任务(大概了解)分析与已崩溃进程有关的内存映像,以一种完全受控的方式执行进程调试会话以一个接受调试的进程为起点大多数调试器能够依附在一个正在进行的进程上选择一个进程之后,调试器将捕获该进程的内存快照,以此创建一个临时数据库。除这个正在运行进程的内存映像之外,临时数据库中还包含该进程加载的所有共享库,这使得这个数据库比我们常见的数据库要复杂得多开始动态调试1.Debugger->Select Debugger 或按快捷键F9使用EXE文件可以使用Local Windows Debugger如果是ELF文件应该放在Linux上用远程调试IDA动态调试ELF文件_光无影的博客-CSDN博客2.Debuugger->Start Process 或者F9开始调试3.IDA将显示警告信息 选择Yes,选择No会退出进程控制调试器的功能是能严密监控并修改它所调试的进程的行为所以有一些调试的命令Continue 继续执行一个暂停的进程。执行将继续,直到遇到一个断点暂停 F9Pause 暂停一个正在运行的进程 使用工具栏按钮Terminate 终止一个正在运行的进程 Step into 执行下一条指令,如果下一条是函数调用,就进入函数第一条 F7Step over 执行下一条指令 如果下一条是一个函数调用,会跨过 F8Run Until Return 执行当前函数到返回 Ctrl+F7Run to Cursor 执行进程,直到执行到达当前的光标位置 F9断点调试时候执行到设置断点的位置会中断指定位置F2快捷键设置断点 断点处红色显示IDA调试器支持硬件断点和条件断点跟踪Debugger->Tracing->Tracing OptionsIDA的拓展用法IDA的第三方图形外部流程图Views->Graphs->Flow Chart外部调用图Views->Graphs->Function Calls显示函数调用的层次结构外部交叉引用图Views->Graphs->Xrefs FromNow, you can try to do some really interesting things with IDA.Come!Let's act.
《科技与人:元宇宙与未来产业跨界对话》电子版地址
《科技与人:元宇宙与未来产业跨界对话》当计算机视觉、人机交互、AR/VR、数字孪生等计算技术一步一步发展,为现实物理世界在数字空间中复制一个“新视界”,各行各业如何在这一次数字化全新浪潮中前瞻探索、布局未来,通过全息数字交互技术赋予行业新的生命力?本次科技与人系列论坛邀请来自学术界、技术界、金融界的大咖,展开元宇宙科技与未来行业的跨界对话。对时下热门的元宇宙冷思考,探讨技术的普惠之路,共同探索人类数字世界的全新空间。
电子版下载地址:https://developer.aliyun.com/ebook/7526
电子书:
</div>
询问ChatGPT对于多模态知识图谱的理解,以及如何构建一个多模态知识图谱?
什么是多模态多模态指的是使用不同的模态(或方式)来表示信息。在人类交流中,模态通常指使用不同的感官通道来传输信息,例如语言、文字、图像、声音或触觉。多模态通信意味着同时使用多种模态来传输信息,这可以使信息更加丰富、准确和易于理解。例如,在讲课时,教师可能会使用多种模态来向学生传输信息。他可能会使用语言来讲解概念,同时使用图表、图像和视频来展示例子和演示实例。这样,学生就可以从多个感官通道获取信息,使得他们更容易理解和记住所学内容。在计算机领域,多模态也可以指使用多种输入输出设备来交互的方式。例如,用户可以使用键盘、鼠标和手势来与计算机交互,而计算机可以通过屏幕、扬声器和触觉反馈等方式向用户传输信息。总的来说,多模态可以使信息传输更加丰富、准确和易于理解,对人类交流和计算机交互都很重要。什么是多模态知识图谱多模态知识图谱是指使用多种模态(或方式)来表示知识的知识图谱。知识图谱是一种将知识表示为实体和实体之间关系的方法,常常使用图形的形式来表示。在多模态知识图谱中,除了使用文本来表示实体和关系之外,还可以使用其他模态来表示知识。例如,在多模态知识图谱中,可以使用图像、视频、声音等来表示实体。这样,知识图谱就可以更加丰富地表示信息,使得人们更容易理解和记住知识。多模态知识图谱也可以使用多种输入输出设备来交互。例如,用户可以使用键盘、鼠标和手势来查询知识图谱,而知识图谱可以通过屏幕、扬声器和触觉反馈等方式向用户展示信息。总的来说,多模态知识图谱可以使知识表示更加丰富、准确和易于理解,对知识检索和学习都很有帮助。多模态和知识图谱有什么关系多模态和知识图谱之间有着密切的关系。知识图谱是一种将知识表示为实体和实体之间关系的方法,常常使用图形的形式来表示。在多模态知识图谱中,除了使用文本来表示实体和关系之外,还可以使用其他模态来表示知识。例如,在多模态知识图谱中,可以使用图像、视频、声音等来表示实体。这样,知识图谱就可以更加丰富地表示信息,使得人们更容易理解和记住知识。多模态知识图谱也可以使用多种输入输出设备来交互。例如,用户可以使用键盘、鼠标和手势来查询知识图谱,而知识图谱可以通过屏幕、扬声器和触觉反馈等方式向用户展示信息。总的来说,多模态知识图谱是将多模态的概念应用到知识图谱中的一种方式,使得知识表示更加丰富、准确和易于理解,对知识检索和学习都很有帮助。知识图谱和多模态知识图谱的关系知识图谱是一种以图形形式表示知识的工具,它由实体(如人、事物、地点等)和实体之间的关系组成。知识图谱可以使用文本、图像、音频和视频等不同的模态来表示知识。多模态知识图谱是一种使用多种模态来表示知识的知识图谱。它可以使用文本、图像、音频和视频等多种模态来表示知识,使得信息更加丰富、准确和易于理解。总的来说,多模态知识图谱是一种比普通知识图谱更加丰富和多样化的知识图谱,它可以使用多种模态来表示知识,从而帮助人们更好地理解信息如何构建一个多模态知识图谱构建多模态知识图谱的步骤如下:确定知识图谱的目标和范围:首先,需要确定知识图谱的目标是什么,以及要在知识图谱中包含哪些知识。这可以帮助你为知识图谱定义合适的结构和内容。收集和组织知识:接下来,需要收集和组织知识,包括文本、图像、视频、声音等各种模态的知识。在这个过程中,可以使用工具来帮助你提取实体和关系,并将它们组织成符合知识图谱结构的形式。设计知识图谱的结构:在确定了知识图谱的目标和范围之后,需要设计知识图谱的结构。这可以帮助你确定实体和关系的类型,并规定如何在知识图谱中表示这些实体和关系。建立知识图谱:根据知识图谱的结构,使用适当的工具建立知识图谱。这可以通过编程或使用现成的知识图谱工具来实现。测试和评估知识图谱:最后,需要对知识图谱进行测试最后,需要对知识图谱进行测试和评估,以确保它能够正常工作并满足你的需求。在测试过程中,你可以对知识图谱进行查询,并评估它的准确性和可用性。如果发现问题,可以修改知识图谱以提高性能。在构建多模态知识图谱时,需要注意以下几点:确保知识图谱能够准确地表示知识:在组织知识时,要确保知识图谱能够准确地表示知识。这可以通过对知识进行质量控制和清晰的设计来实现。考虑使用的模态:在设计知识图谱时,要考虑使用哪些模态来表示知识。这取决于知识的内容和你的目标。考虑交互方式:在设计知识图谱时,也要考虑使用哪些交互方式,例如键盘、鼠标和手势等。这可以使知识图谱更易于使用。关注性能:在建立知识图谱时,要注意性能,确保知识图谱能够快速响应查询并显示结果。总的来说,构建多模态知识图谱是一个复杂的过程,需要考虑许多因素,包括知识图谱的目标和范围、知识的来源和质量、使用的模态和交互方式以及知识图谱的性能。但是,通过组织和设计知识图谱,可以使知识表示更加丰富、准确和易于理解,对知识检索和学习都很有帮助。多模态知识图谱的应用领域有哪些?多模态知识图谱可以用于各种不同的领域,因为它可以使用多种模态来表示知识,使得信息更加丰富、准确和易于理解。一些常见的应用领域包括:教育:多模态知识图谱可以用于制作教学材料,帮助学生理解知识。例如,可以使用图像、视频和声音来帮助学生学习新的概念。医学:多模态知识图谱可以用于制作医学教材,帮助医生和护士更好地理解疾病和治疗方法。例如,可以使用图像和视频来帮助医生更好地理解疾病症状和治疗方法。商业:多模态知识图谱可以用于制作商业文档,帮助员工更好地理解公司流程和政策。例如,可以使用图像和视频来帮助员工更好地理解公司流程。科学:多模态知识图谱可以用于制作科学文档,帮助科学家和工程师更好地理解科学原理和实验数据。例如,可以使用图像、视频和声音来帮助科学家和工程师更好地理解实验数据。艺术:多模态知识图谱可以用于制作艺术文档,帮助艺术家和观众更好地理解艺术作品。例如,可以使用图像、视频和声音来帮助观众更好地理解艺术作品。总的来说,多模态知识图谱可以用于各种不同的领域,帮助人们更好地理解信息。多模态知识图谱在农业领域有哪些应用多模态知识图谱在农业领域有以下应用:农田管理:多模态知识图谱可以用于帮助农民更好地管理农田,例如通过使用图像和视频来展示农田的状态和种植情况。农作物诊断:多模态知识图谱可以用于帮助农民诊断农作物的问题,例如通过使用图像来比较农作物的正常和异常状态。农业技术培训:多模态知识图谱可以用于帮助农民学习新的农业技术,例如通过使用视频来演示如何使用农业机械。农业市场信息:多模态知识图谱可以用于帮助农民了解农产品市场信息,例如通过使用图像来展示农产品的价格趋势。农业科学研究:多模态知识图谱可以用于帮助农业科学家研究农业问题,例如通过使用视频和声音来记录农田的变化情况。总的来说,多模态知识图谱可以用于帮助农民更好地管理农田、诊断农作物问题、学习新的农业技术、了解农产品市场信息以及帮助农业科学家研究农业问题。多模态知识图谱可以通过使用图像、视频和声音等模态来帮助农民和农业科学家更好地理解信息,从而提高农业生产效率和质量。多模态知识图谱有哪些发展前景多模态知识图谱具有广阔的发展前景,因为它可以使用多种模态来表示知识,使得信息更加丰富、准确和易于理解。一些可能的发展前景包括:大规模知识图谱:随着知识图谱技术的发展,可能会出现大规模的多模态知识图谱,包含数十亿个实体和关系。这些知识图谱将能够帮助人们更好地理解世界,并解决许多复杂的问题。人工智能应用:多模态知识图谱可以与人工智能技术结合使用,例如自然语言处理和图像识别。这可以帮助人们更好地理解信息,并自动执行复杂的任务。在线教育:多模态知识图谱可以用于制作在线教育材料,帮助学生更好地理解课程内容。例如,可以使用图像、视频和声音来帮助学生学习新的概念。社交媒体:多模态知识图谱可以用于帮助人们更好地理解社交媒体内容,例如通过使用图像和视频来更好地理解推文。健康管理:多模态知识图谱可以用于帮助人们更好地管理健康,例如通过使用图像和视频来帮助人们了解健康状况和康复方案。智能家居:多模态知识图谱可以用于帮助人们更好地使用智能家居设备,例如通过使用图像和视频来帮助人们了解如何使用智能家居设备。总的来说,多模态知识图谱具有广阔的发展前景,可以用于解决许多不同的问题,并帮助人们更好地理解信息。
操作系统笔记
操作系统笔记概念,功能和目标进程是程序的执行过程,执行前要把程序先放到内存操作系统作为资源的管理者的功能操作系统作为用户和硬件的接口的功能命令接口:允许用户直接使用程序接口:允许用户通过程序简介使用GUI:现代操作系统中最流行的图形用户接口命令接口分为:联机命令接口和脱机命令接口联机命令接口称为交互式命令接口脱机命令接口称为批处理命令接口bat文件dll文件,系统调用系统调用被称为广义指令用户可以使用形象的图形界面进行操作在纯硬件的基础上实现什么功能操作系统的特征并发和共享是最基本的特征并发两个或者多个时间在同一时间间隔内发生,宏观上是同时发生,微观上是交替发生与并行不同,并行不存在交替操作系统伴随着“多道程序技术”而出现的共享资源共享,是指系统中的资源中多个并发执行的进程同事使用分为互斥共享方式和同时共享方式虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体是存在的,而逻辑上的对应物是用户感受到的空分复用技术(如虚拟存储器技术)时分复用技术(如虚拟处理器)没有并发性,就谈不上虚拟性异步在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进并发和共享的关系失去了并发性共享性也就失去了意义失去了共享性,无法实现并发两者互为存在条件操作系统的发展和分类1.手工操作阶段打孔表示1,不打孔表示0用户独占全机,人机速度矛盾导致资源利用率极低2.单道批处理系统(操作系统的雏形)纸带通过外围机进入磁带,并监督程序负责控制作业的输入,输出缓解了人机速度矛盾,资源利用率提升内存中只能有一道程序运行,资源利用率依然很低3.多道批处理系统操作系统正式诞生,并引入了中断技术,由操作系统负责管理这些程序的运行资源利用率大幅提升用户相应时间长,没有人机交互功能4.分时操作系统计算机以时间片为单位,轮流为各个用户作业服务,各个用户可以通过终端与计算机交互解决了人机交互问题不能优先解决一下紧急任务5.实时操作系统能够优先响应一些紧急的任务,某些紧急任务不需要时间片排队主要特点是及时性和可靠性分为硬实时操作系统和软实时操作系统6,网络操作系统7.分布式操作系统8.个人计算机操作系统操作系统的运行机制与体系结构1.什么是指令机器语言指令2.有的指令没有影响,加减乘除有的指令有很高的权限,比如:内存清零指令,如果用户程序可以使用这个指令。就意味着一个用户可以将其他用户的内存数据随意清零,这样做显然是很危险的指令分为特权指令和非特权指令特权之灵不允许普通用户使用3.CPU如何判断是否可以执行特权指令分为两种处理器状态:用户态(目态)和核心态(管态)4.用程序状态寄存器PSW中的某个标志位来标识当前处理器处于什么状态,0为用户态,1为管态5.两种程序:内核程序:运行在核心态应用程序:运行在用户态,只执行非特权指令6.最接近裸机的不部分是内核7.分为时钟处理,中断处理和原语(设备驱动,CPU切换等)8.时钟管理实现计时功能原语是最接近硬件的部分,这种程序的运行具有原子性,只能一起呵成买不可中断9.操作系统的内核可能还有:进程管理,存储器管理,设备管理不同的操作系统,内核的功能可能不一样10.操作系统体系结构可以分为大内核和微内核11.大内核优点是有高性能缺点是内核代码庞大,结构混乱,难以维护微内核的优点是内核功能少,结构清晰,方便维护缺点是需要频繁地在核心态和用户态之间切换,性能低中断和异常中断中断机制的诞生早期各个程序只能串行执行,系统资源利用率低发生中断意味着操作系统的介入,开展管理工作中断的概念和作用中断的分类内中断(异常)称为异常,例外,陷入CPU内部,与当前执行的指令有关外中断简称为中断,是狭义的中断CPU外部,与当前执行的指令无关分为自愿中断和强迫中断强迫中断分为硬件故障(如:缺页)和软件中断(如:除0)外中断的处理过程发生中断就意味着需要操作系统的介入,开展管理工作当中断发生时,CPU立即进入核心态进程暂停运行,操作系统内核对中断进行处理用户态和核心态的切换是怎么实现的进入核心态通过中断实现的,中断是唯一途径进入用户态是通过执行一个特权指令,将程序状态字PSW的标志设置为“用户态”