码迷,mamicode.com
首页 > 其他好文 > 详细

工作笔记

时间:2016-07-24 11:58:14      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

WMIWindows Management Instrumentation,Windows管理规范)是一项核心的Windows管理技术;用户可以使用WMI管理本地和远程计算机。

嵌入式Chromium框架,它主要目的是开发一个基于Google ChromiumWebbrowser控件;

HtppWebResponse类的作用用于在客户端获取服务器返回的相应信息

HttpResponse类用于在服务器处理客户端相应的信息

参考网址:

http://www.cnblogs.com/kissdodog/archive/2013/04/06/3002790.html

序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方。

Json的人全称是“JavaScript Object Notation,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式,web开发过程中,我们经常需要将从数据库中查询到的数据(一般为一个集合,列表或数组等)转换为JSON格式字符串传回客户端,这就需要进行序列化,这里用到的是JsonConvert对象的SerializeObject方法。其语法格式为:JsonConvert.SerializeObject(object).

@作用:1忽略转义字符2让字符串跨行3在标识符中的用法

Backgroundworker基本用法

Backgroundworker对线程的访问提供了一种安全的方式,对Thread的一次封装。用于在单独的线程上运行操作,Thread用于线程的创建和控制类。

Dispose:处理,在计算机技术英语中,是“文档摧毁”的意思。Close是关闭而已,不释放资源。就是把StreamReader读写文件流的数据清空了,不占用存储内存。

BackgroundWorker类中的主要用的这列属性方法和事件:

重要属性:

1.CancellationPending获取一个值,指示应用程序是否已请求取消后台操作,通过DoWork事件中判断CancellationPending属性可以认定是否需要后台操作。

2IsBusy获取一个值,指示BackgroundWorker是否正在运行异操作,程序中使用IsBusy属性用来确定后台操作是否正在使用中。

3WorkerReportsProgress获取或设置一个值,该值只是BackgroundWorker是否报告正在使用中。

4.在Task<TResult>完成时要运行的函数。在运行时,委托将作为一个参数传递给完成的任务

委托是一种安全的类似函数指针,但是它比指针安全的要安全的多,它可以把方法作为一个参数传递给另一个方法,可以理解为指向函数的引用。事件是一种消息机制,它是一种委托,委托不带方法体。

4WorkerSupportsCancellation获取或设置一个值,该值指示BackgroundWorker是否支持异步取消。设置为True时,程序可以调用CancelAsync方法提交终止挂起的后台请求操作。

重要方法:

CancelAsync请求取消挂起的后台操作

RunWorkerAsync开始执行后台操作

ReportProgress引发ProgressChanged事件

重要事件:

DoWork调用RunWokerAsync时发生

ProgressChanged调用ReportProgress时发生

RunWorkCompleted当后台操作已完成、被取消或引发异常时发生

//DeserializeObject()序列化SON语法是JavaScript对象表示法语法的子集。序列化与反序列化是深拷贝的一种典型的实现方式。

URI,统一资源标识Uniform Resource identifier.URL是具体的资源标识的方式。

1.Dowork:调用RunWorkAsync方法时发生

2.RunWorkerCompleted后台操作已完成、被取消或引发异常时发生

3.ProgressChange调用ReportProgress方法时发生。

Dowork事件处理程序中不操作任何用户界面对象。而通过ProgressChangeRunWorkerCompleted事件与界面进行通信。

事件。Event其实就是委托,就是一个委托就是指向多个函数,并分别回调这些函数。事件用在类中,用来实现一种通知机制,即告知外部,当前类的状态。

Serialize:序列化就是把一个对象保存到一个文件或数据库字段中,反序列化就是在适当的时候把这个文件再转化原来的对象使用。

C#禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的。当一个控件的InvokeRequired属性值为true时,说明有一个创建它意外的线程想访问它。Windows窗体中的控件被绑定到特定的线程,不具备线程安全性。因此如果从另一个线程调用控件的方法,那么必须使用控件的一个Invoke方法来将调用封送到适当的线程。该属性可用于确定是否必须调用Invoke方法,当不知道什么线程拥有控件时用。

前台线程结束后,整个程序也就结束了,即使还有后台线程正在运行,此时剩余的后台线程也会被停止。前台线程和后台线程对于一个进程而言,只有当所有的前台线程都终止时,这个进程才会结束;而当进程结束时,CLR会自动结束所有后台进程。

JavaScript先对URL编码,然后再向服务器提交,因为服务器的输出时一致的,所以就保证了服务器得到的数据格式统一

默认情况下,Task任务是由线程池线程异步执行的。

Stream流是字节序列的抽象概念,例如文件、输入/输出设备、内部进程通信或者TCP\IP套接字。

HTTP Data:

指定向服务器发送数据时所使用的HTTP方法,Get是缺省方法,提交的数据被附加到URL的末端,作为URL的一部分发送的服务器末端。仅仅是是拼接一个URL,然后直接向服务器请求数据。

GET请求获取由Request-URL所标识的资源。

Post方法会将表单中的信息作为一个数据块发送到服务器。

PUT请求服务器存储一个资源,并用Requset-RUI作为其标识

属性Action指定对表单数据进行处理的脚本地址

HTTP相应

在接收和解释请求消息后,服务器会返回一个HTTP相应消息。

三部分组成:状态行、消息包头、相应正文。

通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)TCP链接,HTTP服务器则在那个端口监听客户端发送过来的请求,一旦收到请求,服务器向客户端发回一个状态行

CEF3是多线程的,使用使用异步消息的方式来完成主进程和其他进程的通信,使用的是Chromium官方提供的API

API用法:在WindowsLinux上的所有进程享有相同的可执行文件

CefExecuteProcess()函数式负责执行子过程的逻辑。

Thread和线程的关系

一个进程的所有线程共享它的虚拟地址空间、全局变量和操作系统资源。进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据 和其它各种资源组成。

 ExecuteScriptAsync,异步执行,无返回值

 EvaluateScriptAsync,异步执行,有返回值。等待Js方法执行完后,获取返回值。

CefSharp是用C++/CLI的方式来调用Cef类库的

BrowserSubprocess .net写的一个伴随进程,主要负责处理JavaScript和后台线程。

Interrupt:如果终止工作线程,只能管到一次,线工作线程的下一次Sleep就管不到了,相当于一个continue操作。

Abort:相当于一个break操作,工作线程彻底停止掉

WebRTC目的是通过浏览器提供简单的JavaScript就可以达到实时通讯。

Thread创建的线程是前台线程,线程池中的是后台线程

getElementsByClassName() 方法返回文档中所有指定类名的元素集合,作为 NodeList 对象。

MAC(Medium Access Control,介质访问控制)MAC地址是收录在NetworkInterfaceCard(网卡)里的,MAC地址也叫硬件地址。16进制的数字组成。是识别LAN(局域网)节点的标识。也就是说在网络底层的物理传输过程中,是通过物理地址来识别主机的,它一定是全球唯一性的。MAC地址就如同我们的身份证号码,具有全球唯一性。

IP地址的分配是基于网络拓扑,MAC地址的分配是基于制造商。

MAC地址属于链接层的地址。 IP地址是网络层的地址

MAC地址是网卡的物理地址,厂家生产时就固定的,用于标识产品,就像人的胎记,IP地址是你上网时你的运营商分配给你的一个地址,类似于你的名字,允许你和别人通信用的。

CPUID是独一无二的,它是制造CPU的时候,厂家置入到CPU内部。

CefSharp.BrowserSubprocess :是.net写的一个伴随进程,主要负责Javascript和后台进程。

WebKit主要特点:

1该项目的主要重点是内容部署在万维网上的,基于标注的技术,如,HTMLCSSJavaScriptDOM中。并能够嵌入在WebKit在其他应用程序中,并用它作为一般用途的显示和交互引擎。

WebKit是一个开源的浏览器网页排版引擎,包含WebCore排版引擎和JSCore引擎。

核心部分,分析HtmlJavaScript的解析,布局渲染技术。

CasperJs 特点:

1是一个服务器端的JavaScriptAPI的无界面WebKit,它速度非常快而且对各种Web标准提供了原生支持,例如:Dom处理,和CSS选择器,JSON

2 CasperJs是一个用JavsScript编写的基于PhantomJS的导航脚本处理和测试工具。它让我们能够方便快捷的检测网站是否正常工作。

构建在WebKit之上。我们说CasperJS构建在WebKit之上,是因为CasperJS是基于PhantomJS的,而PhantomJS是一个无界面的WebKit环境,这意味着我们有一个真正的Web浏览器来执行和渲染网页。CasperJS隐藏了直接使用PhantomPS的一些缺陷,它简化了定义一个完成导航操作的步骤,它还提供了非常有用的函数封装、方法以及语法糖,它可以让我们快捷的完成任务。

WEB标准,网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)

环境变量(environment variables)一般是指操作系统中,用来指定操作系统的一些参数,它包含一个或多个应用程序使用到的信息。例如WindowsDOS操作系统中的Path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面找此程序外,还应到path 中 指定的路径去找。用户通过设置环境变量,来更好的运行进程。

Var casper = require(‘casper’).create(); 通过这个模块的create()方法来获取这个模块的一个实例。

evaluate()casperjs环境和你打开的网页之间的桥梁,也就是你使用evaluate()是在操作当前你打开的的DOM文档,是casperjs环境和DOM文档的一个交互,就像你在用浏览器的控制台控制html内容一样。最后可以看出thenEvaluate()方法是then()evaluate()方法的结合。这里的thenEvaluate()是继承上一个步骤后才运行的,而evaluate()方法不用等到上一个步骤运行结束就可以运行。

click(String selector) 对匹配表达式的元素执行一次点击.

UserAgent是指用户浏览器端的信息,用于浏览器识别,可以看出你的系统版本,浏览器版本,浏览器内核等,有些网站会根据这个信息来调整打开网站的类型,也是许多网站知道你用的是什么核心的浏览器的原因。

Qt 1991年奇趣科技开发的一个跨平台的C++图形用户界面程序框架

WebServes,通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,确切的说,Web服务器是专门处理HTTP请求,但是应用程序服务器是通过很多协议来为应用程序提供商业逻辑(business logic)

Cookie它记录了你的用户名,密码,浏览过的网页,停留的时间等信息,用于用户身份辨别。

Cookie是浏览器与服务器之间一些交互的数据,浏览器具有保存cookie的功能。

通常网站流量(traffic)是指网站的访问量,是用来买描述一个网站的用户数量以及用户所浏览的网页数量等指标。网站流量对于虚拟空间来说是指:用户在访问网站过程中,产生的数据量大小。

一个网站服务器所传送数据量的大小。

PV(Page View)值:是指一定时间范围内所有浏览该网站的访问者请求的页面数量之和。

Hist值:是指对每个页面元素的请求数量之和。(一个页面中任何一个图片或者Flash文件都算是一个页面元素)。

日浏览量,只一天之内,访问者请求的所有页面元素的字节数之和。

总流量=访问流量+下载流量=Page view*页面大小+下载文件大小*下载次数

PR(Page Rank)网页级别。,一个网站的外部链接数越多其PR值越高,并不能对网站排名产生绝对作用。Pr值高不一定流量就高。

软文:不是直白的广告表达方式都可以成为软文,

百度完全抛弃了IP这个指标,而启用了访客数这一指标,访客数要比IP数更能真实准确第反应用户的数量。

访问数(UV)访客数就是指一天之内到底有多少不同的用户访问了你的网站。

访问次数,访问次数是指访客完整打开了网站页面进行访问的次数。访问次数是网站的访问速度的衡量标准。访问次数一般会大于访问数。

把平均访问页数和平均访问时长这两个指标放在一起来衡量网站的用户体验。

用户点击进入页面后,可以看到页面的100%展现,也就是彻底翻页了,这样的点击才是有效的点击。

挂机宝是一项服务器虚拟化和自动化技术。它采用的是操作系统虚拟化技术

云服务器是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。

使用事件,可以方便的确定程序的执行顺序。事件简化了编程,操作系统知识简单的把消息传送给对象,由对象的事件驱动程序确定事件的处理方法,操作系统不必知道程序的内部工作机制,知识需要知道如何与对象进行对话,也就是如何处理消息。

委托(delegate):可以理解成为函数指针,不同的是委托是面向对象,而且是安全的。首先来说,委托的作用就是可以给类的方法传递其它类的方法而不必将类实例化。委托就是事件和响应事件的方法的桥梁。委托平级,事件与方法平级。一个事件可以委托给多个对象接受并处理。

智能客户端代表了一种全新的开发模式,既有Windows程序的强大用户界面,又可以享受Web应用升级和更新的便捷。

线程是基本的执行单元。单线程执行一系列应用程序指令,而且在应用程序中从头到尾都由单一的逻辑路径。所有的应用程序都至少有一个线程。

所有的.NET Framework应用程序都是使用单线程创建的,单线程用于执行该应用程序。在智能客户端应用程序中,这样的线程创建并管理用户界面(UI),因而称为UI线程。

应用程序既可以进行同步调用,也可以进行异步调用。同步调用在继续之前等待响应或返回值。如果不允许调用,就说调用被阻塞了。

异步或非阻塞调用不等待响应。异步调用时通过使用单线程的线程执行的。原始线程启动异步调用,异步调用使用另一个线程执行请求。而与此同时原始的线程继续处理。

使用UI线程中的同步调用: 1执行操纵UI的操作;2执行不会产生导致UI冻结的风险的操作。

使用UI线程中的异步调用:1执行不影响UI的后台操作;2调用位于网络的其他系统或资源;

3执行可能花费很长时间才能完成的操作。

后台线程不会阻塞当前进程的终止。在属于一个进程的所有前台线程终止后,公共语言运行库(CRL)就会结束进程,从而终止仍在运行的任何后台线程。

托管代码是-Microsoft的中间语言(IL),它只要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:1源代码编译为托管代码。2托管代码编译为Microsoft的平台专用语言。

1托管代码是一种中间语言,运行在CRL;非托管代码被编译为机器码,运行在机器上。

2托管代码独立与平台和语言,能更好的实现不同语言平台之间的兼容,非托管代码依赖于平台和语言。

3托管代码可享受CRL提供的服务(如安全监测、垃圾回收等),不需要自己完成这些操作;

在默认情况下,通过创建并启动新的Thread对象生成的所有线程都是前台线程,而从非托管代码进入托管执行环境中你的所有线程都标记为后台线程。

在大多数应用程序中,你会选择不同的线程设置成前台线程或者后台线程。通常,应该将侦听活动的线程设置为后台线程,而将负责发送数据的线程设置为前台线程,这样,在所有的数据发送完毕之前该线程不会被终止。只有在确认线程被系统随意终止的没有不利影响时,才应该使用后台线程。如果线程正在执行必须完成的敏感操作或事物操作,或者需要控制关闭线程的方式以便释放重要的资源,则使用前台线程。

如不不仔细一个线程就可能更改另一个线程正在使用的资源,其结果可能就是该资源处于一种不确定的状态而且处为不可用状态。

为了防止这些影响,当从两个或两个线程同时访问一个资源时,需要使用锁定和同步技术来协调这些尝试此资源的线程。

在许多常见的情况下,可以使用多线程来显著提高应用程序的响应能力和可用性。

Control.Invoke(Delegate)方法:在拥有此控件的基础窗口句柄的线程上执行指定的委托。 

在多线程处理的环境中,Task对象封装了所有的线程细节,这样他们就可以从UI中清晰的分离出来了。使用Task对象可以冲充分简化线程交互,Task对象虽然负责控制和管理后台线程,但是激发UI可以使用并且保证在UI线程的事件。

Web开发定义: Web开发是一个指代网页或网站编写的广义术语

前台负责与用户的交互显示数据,用到HTML标签布局页面。CSS样式渲染页面,JavaScript脚本编写动态交互性强的页面,后台编写处理一些复杂的业务逻辑程序,可以用C#,Java,Php等语言

 

1.客户端发送请求 2.服务器接受请求     3.服务器生成Html

4.服务器响应请求 5客户端接受响应      6.客户端解析Html

7.服务器发送资源文件 8.客户端加载资源文件  9.客户端从上到下加载

WebHeaderCollection 包含与请求或响应相关联的协议

Web服务器根据动态页面文件的内容和UIL中的参数,调用响应的资源,生成HTML页面。

在客户端,读写Json对象可以使用“.”操作符或[Key],Jon字符串转换为json对象使用eval()函数。

 

在服务器端,由.net对象转换为json字符窜优先使用JsonConvert对象的SerializeObject()方法,定制输出Json字符串使用LINQ to Json。有Json字符串转换为.net对象优先使用JsonConvert对象的DeserializeObject()方法,然后也可以使用Linq to Json

一个对象的方法只能由一个线程访问。

序列化:将对象转换为另一种媒介传输的格式过程,如,序列化一个对象,用Http通过internet在客户端和服务器之间传递该对象,在另一端反序列化从该流中重新获得对象。

ConstReadOnlyConst用来申明常量,而ReadOnly用来申明运行时常量。

TCP是传输控制协议,提供的是面向连接的,是可靠的,字节流服务,当客户端和服务器彼此进行数据交换的时候,必须在她们数据交换之前要进行TCP连接后才能传输数据。TCP提供超时重拨,检验数据功能。UDP是用户数据报协议。

值类型的值是存放栈中的,改变其值,不改变变量原有的值,而引用类型的值是存放在堆中的,其引用的地址是存放在堆栈听,改变其值也就改变了变量原有的值。

栈区,由编译器自动分配释放。堆区:一般由程序员分配释放。

Heap是堆,

值类型传递的是值的拷贝,引用类型传递的是值得引用,也就是数据在内存中的地址。

能用foreach便利访问的对象需要实现,IEnumerable接口和GetEnumerator()方法。

Propertyattribute的区别,property是指类向外提供的数据区域,而attribute则是描述对象在编译时或运行时的属性。这两者有本质的区别。

应用程序域可以理解为一种轻量级进程。起到安全的作用,占用资源小。

从值类型接口转换为引用类型装箱,从引用类型转换到值类型拆箱。

.net Remoting 的工作原理,服务器段向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。

WS(WebService)可以利用HTTP,穿透防火墙,而Remoting可以利用TCP/IP,二进制传送提高效率。

Abstract class interface的区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class)

接口(Interface)是抽象类的变体。在接口中,所有的方法都是抽象的。

C#中声明覆盖时,父类方法前加virtual关键字,表示该方法可以被覆盖,子类方法前加override,表示该方法覆盖。

多态性是指不同的对象调用相同的方法时,会产生不同的动作。

一个对象的synchronization方法只能由一个线程访问。

Sleep()方法是将当前线程挂起指定的时间。

Wait()释放对象上的锁并阻止当前线程,至到它重新获取该锁。

反射:动态获取程序集信息。

Static属性里面new。构造函数private

虚函数:可由子类继承并重写的函数。抽象函数:规定其非虚子类必须实现的函数,必须被重写。

Override:表示重写基类的虚方法,可以用基类的引用指向派生类对象来访问派生类的重写方法。

线程间不能间接的访问彼此的成员,那么要借用C#中的Delegate和控件类中的Invoke()方法来搞定。

Control.Invoke(Delegate):在拥有此控件线程的基础上执行指定的委托

Control.BeginInvoke(Delegate):在拥有此空间的基础上异步执行指定的委托

ControlInvoke方法和BeginInvoke都在主线程即UI线程。

 

BeginInvoke方法可以使用线程异步的执行委托所指向的方法,然后通过EndInvoke方法获得方法的返回值(EndInvoke方法的返回值是被调用方法的返回值),或是确定方法已经被成功调用。

当使用BeginInvoke异步调用方法时,如果方法未执行完成,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕。

Monitor类可以锁定一个对象,一个线程只有得到这把锁才可以对该对象进行操作。对象锁机制保证了在可能引起混乱的情况下一个时刻只有一个线程可以访问这个对象 。

同步和异步调用之间的选择:

应用程序既可以进行同步调用,也可以进行异步调用。同步调用在继续之前等待响应或返回值。如果不允许调用继续,就说调用被阻塞了。异步和非阻塞不等待响应。异步调用是通过使用单独的线程执行的。原始线程启动异步调用,异步调用使用另一个线程执行请求,而与此同时原始的线程继续处理。

.NETFramwork类库是类、接口和值类型的库,提供对系统功能的服务,且被设计构建为.NETFramework应用程序、组件和控件的基础。

我们都知道搜索引擎排名的时候,会根据用户搜索的关键词,来排列出相关度、质量最好的内容呈现给用户,相关性在搜索引擎排名中起着重要的作用。

UI线程又叫做界面线程,能够相应操作系统的特定消息,包括界面消息、鼠标键盘消息,自定义消息等。是普通的worker线程基础上加上消息循环来实现的。

UI:线程是Form程序运行的主线程,它负责界面的创建,更新等与界面直接有关的工作。

其他与消息循环无关的线程叫工作线程。

Windows窗体中的控件被绑定到特定的线程,不具备线程线程的安全性。如果从另一个线程调用控件的方法,那么必须使用控件的一个Invoke方法来将调用封送到适当的线程。

STA单线程单元,其含义是创建STA线程单元拥有它自己的线程。在任何一单元之内只能有一个线程,在STA模式中,对线程的所有调用都放到一个队列中。因此,STA线程永远不会同时执行多个办法,STA线程有自己的专有的数据,她们不会再线程之间共享数据。这种特种是这一线程非常安全,避免了数据的同步问题。STAMTA线程单元的最大的不同在于,在同一个单元中,MTA单元可以同时运行多个线程,并使用可用的共享资源,由于MTA模式支持同步执行多个线程,所以调用者负责同步多个线程之间的全局数据。

STA模型,意味着可以在任何线程上创建窗口,但窗口创建后就不能切换线程了

Windows系统为例,当worker线程处理完结束后,需要把结果返回给UI线程,好让界面能够更新显示最新的状态。

通常一个线程得以被操作系统调度运行,是因为符合当前的优先级配置,并且该线程有代码需要执行。

多线程处理可以使您能够确保程序”永不休眠”从而保持UI的快速响应。

UI冻结的原因在于,UI是个单线程程序,单线程不可能在等待CD-ROM驱动器读取操作的同时处理用户输入。

UI代码的性质是:它是从外部资源接收事件,如用户输入。它会在事件发生时对其进行处理,但却将大部分时间花在了等待时间的发生。如果可以构造辅助线程和UI线程之间的通讯.

系统将会维护一个或多个消息队列,所有产生消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接受句柄而将消息发送给拥有该窗口的程序的消息循环。每个运行的程序都由自己的消息循环,在循环中得到属于自己的消息并根据接受窗口的句柄调用响应的窗口过程。而在没有消息是消息循环就将控制权交给系统所以windows可以同时运行多个任务。

一个窗口中的所有控件属于同一个UI线程.

堆栈都是一种数据项按序排列的数据结构

Socket:是进程通讯的一种方式,即调用这个网络哭的一些API函数分布在不同的相关进程进行数据交换。

IP:地址,依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置。既对方的IP

通过使用套接字来达到进程贱通信为目的的编程就是网络编程

端口映射就是将外网主机的IP地址的一个端口映射到内网中的一台机器,提供相应的服务。

注册表是windows的核心,里面储存着大量的系统信息。

工作笔记

标签:

原文地址:http://www.cnblogs.com/onlyforliu/p/5700219.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!