请稍等ManixChen正在解析过程中………



欢迎来到 技术中心



补码 一共1条数据

为什么要用补码表示负数
抛开二进制不谈,我们先来看看10进制假设世界上没有负号且数字最大只有3位,我们要把 0~999 分成两部分,一部分表示负数,一部分表示正数,而且不影响他们的运算规律,应当如何去做?首先,最大的负数加上一等于零,那么用999表示最大的负数再合适不过,现在需要正负数各一半,那么正数部分应当为 0 ~ 499,负数部分应当为 500~999,我们暂时把这些表示负数的数字成为对照数字。验证一下,18 - 5 = 18 + 995 = 1013 = 13有没有一种计算方法可以方便地找出-5与995的关系呢?有,那就是999 - 5 + 1将这个规律推及到二进制中假设二进制数只有8位,那么8个1代表最大的负数,将这些数分为正负各一半,那么正数部分应该为 0 ~ 01111111,负数部分应当为 10000000 ~ 11111111。验证一下,00010010 - 00000101 = 00010010 + 11111011 = 00001101与十进制同理,-00000101的对照数字可以用相同方法计算出来,11111111 - 00000101 + 1等等,我们发现了一个特性,这真是一个神奇的特性!11111111 - 00000101 等于00000101 按位取反!现在,我们已经总结出了一点经验,在二进制中,负数的对照数字等于它的数值位按位取反再加一。对于一个二进制负数来说,它是有符号的,因此他的第一位为符号位,剩余的为数值位,那么完整的表述就是负数的对照数字为符号位不变,数值位按位取反再加一,这个对照数字就是补码。最后回答一下标题中的问题,显而易见,使用补码的好处就是,可以用加法来计算减法,从而简化电路设计。

computer 一共2条数据

IP详细介绍-类型分类
#分类IP通过地址开头判断类型,将以 0,10,110 开头的地址分为ABC三类将ip转换成十进制后A类地址第一个字节在 0 - 127 之间,B类地址第一个字节在 128 - 191 之间C类地址第一个字节在 192 - 223 之间然后剩下的位被分为网络号与主机号,主机有两个特殊的值:主机号全部为0的ip代表一个网段主机号全部为1的ip代表广播地址,应用程序可以通过这个ip将信息发送到该网段下的所有主机#子网掩码IP寻址时还需用到子网掩码,子网掩码与IP等长,由连续的1组成ip中被子网掩码掩去(对ip进行与运算)的部分将被视为网络号,剩余部分将被视为主机号如需要划分5个子网,其二进制为101,这将在ip中占去3位,3位可以划分出6(2 ^ 3 - 2)个子网满足5个子网的要求一个byte中占去前3位后为11100000,该子网掩码十进制为224#私有地址tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下:10.0.0.0/8:10.0.0.0~10.255.255.255172.16.0.0/12:172.16.0.0~172.31.255.255192.168.0.0/16:192.168.0.0~192.168.255.255ip后面的斜线和数字,表示ip的中网络号所占的位数例如172.16.0.0/12表示将前12位全部作为网络号,效果等同于子网掩码 255.240.0.0
为什么要用补码表示负数
抛开二进制不谈,我们先来看看10进制假设世界上没有负号且数字最大只有3位,我们要把 0~999 分成两部分,一部分表示负数,一部分表示正数,而且不影响他们的运算规律,应当如何去做?首先,最大的负数加上一等于零,那么用999表示最大的负数再合适不过,现在需要正负数各一半,那么正数部分应当为 0 ~ 499,负数部分应当为 500~999,我们暂时把这些表示负数的数字成为对照数字。验证一下,18 - 5 = 18 + 995 = 1013 = 13有没有一种计算方法可以方便地找出-5与995的关系呢?有,那就是999 - 5 + 1将这个规律推及到二进制中假设二进制数只有8位,那么8个1代表最大的负数,将这些数分为正负各一半,那么正数部分应该为 0 ~ 01111111,负数部分应当为 10000000 ~ 11111111。验证一下,00010010 - 00000101 = 00010010 + 11111011 = 00001101与十进制同理,-00000101的对照数字可以用相同方法计算出来,11111111 - 00000101 + 1等等,我们发现了一个特性,这真是一个神奇的特性!11111111 - 00000101 等于00000101 按位取反!现在,我们已经总结出了一点经验,在二进制中,负数的对照数字等于它的数值位按位取反再加一。对于一个二进制负数来说,它是有符号的,因此他的第一位为符号位,剩余的为数值位,那么完整的表述就是负数的对照数字为符号位不变,数值位按位取反再加一,这个对照数字就是补码。最后回答一下标题中的问题,显而易见,使用补码的好处就是,可以用加法来计算减法,从而简化电路设计。

XML 一共1条数据

XML使用语法以及注意事项
XML 文档可以包含非 ASCII 字符,为了避免错误,需要规定 XML 编码,或者将 XML 文档存为 Unicode,两者需要保持一致。必须包含根元素,该元素是所有其他元素的父元素。所有元素都必须有关闭标签对大小写敏感属性值须加引号,如果属性本身包含引号,就用单引号包围属性< 和 & 是非法的,用实体引用代替文档中的空格不会被删节,而html只会保留1个XML以 LF 存储换行名称不能以数字或者标点符号或“xml”(或者 XML、Xml)开始,不能包含空格,避免-.:字符元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。Internet Explorer 5 拥有对 XML 的支持,但是 XSL 部分与 W3C 的官方标准不兼容!#NameSpaceXML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:xmlns:namespace-prefix="namespaceURI"默认的命名空间,省去前缀:xmlns="namespaceURI"#构建模块 元素 属性 实体 PCDATA:会被解析器解析的文本,这些文本将被解析器检查实体以及标记。解析器将能识别PCDATA包含的元素,并将其作为节点 CDATA:不会被解析器解析的文本。某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。 CDATA 部分由 “<![CDATA[” 开始,由 “]]>” 结束,包含的内容将被解析器忽略,CDATA 部分不能包含字符串 “]]>”,也不允许嵌套的 ,标记 CDATA 部分结尾的 “]]>” 不能包含空格或折行。:<script><![CDATA[function matchwo(a,b){if (a < b && a < 0) then { return 1; }else { return 0; }}]]></script>#CSSXML文本展示效果可以被CSS渲染,建议使用XSLT<?xml version="1.0" encoding="ISO-8859-1"?><?xml-stylesheet type="text/css" href="cd_catalog.css"?>#XSLTXSLT 是首选的 XML 样式表语言。XSLT (eXtensible Stylesheet Language Transformations) 远比 CSS 更加完善,XSLT 可以把 XML 文档转换为其他格式,比如 XHTML。XSLT#DTDDTD:XML Type Definition ,文档类型定义,建议使用XSD##XML文档定义:<!DOCTYPE 根元素 [元素声明]><?xml version="1.0"?><!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>]><note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body></note>!ELEMENT note (第三行)定义 note 元素有四个元素:”to、from、heading,、body”!ELEMENT to (第四行)定义 to 元素为 “#PCDATA” 类型##外部DTD<!DOCTYPE 根元素 SYSTEM "文件名"><?xml version="1.0"?><!DOCTYPE note SYSTEM "note.dtd"><note><to>George</to><from>John</from><heading>Reminder</heading>...

IP 一共1条数据

IP详细介绍-类型分类
#分类IP通过地址开头判断类型,将以 0,10,110 开头的地址分为ABC三类将ip转换成十进制后A类地址第一个字节在 0 - 127 之间,B类地址第一个字节在 128 - 191 之间C类地址第一个字节在 192 - 223 之间然后剩下的位被分为网络号与主机号,主机有两个特殊的值:主机号全部为0的ip代表一个网段主机号全部为1的ip代表广播地址,应用程序可以通过这个ip将信息发送到该网段下的所有主机#子网掩码IP寻址时还需用到子网掩码,子网掩码与IP等长,由连续的1组成ip中被子网掩码掩去(对ip进行与运算)的部分将被视为网络号,剩余部分将被视为主机号如需要划分5个子网,其二进制为101,这将在ip中占去3位,3位可以划分出6(2 ^ 3 - 2)个子网满足5个子网的要求一个byte中占去前3位后为11100000,该子网掩码十进制为224#私有地址tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下:10.0.0.0/8:10.0.0.0~10.255.255.255172.16.0.0/12:172.16.0.0~172.31.255.255192.168.0.0/16:192.168.0.0~192.168.255.255ip后面的斜线和数字,表示ip的中网络号所占的位数例如172.16.0.0/12表示将前12位全部作为网络号,效果等同于子网掩码 255.240.0.0

tomcat 一共1条数据

Http 一共2条数据

Custom Fileupload
本文的目的是简要说明如何编写一个文件上传组件,使他的功能类似 commons-fileupload, 并在结尾处提供了完整代码的获取方式。#HTTP本文讨论的是基于 HTTP 协议的文件上传,下面先来看看 HTTP 请求的真面目。首先,用 JavaSe 类库中的 Socket 搭建一个超简单的服务器,这个服务器只有一个功能,就是完整地打印整个 HTTP 请求体。public class Server { private ServerSocket serverSocket; public Server() throws IOException{ serverSocket = new ServerSocket(8080); } public void show() throws IOException{ while(true){ Socket socket = serverSocket.accept(); byte[] buf = new byte[1024]; InputStream is = socket.getInputStream(); OutputStream os = new ByteArrayOutputStream(); int n = 0; while ((n = is.read(buf)) > -1){ os.write(buf,0,n); } os.close(); is.close(); socket.close(); System.out.println(os); } } public static void main(String[] args) throws IOException { new Server().show(); }}将服务器运行起来之后,在浏览器中输入地址:http://localhost:8080在我的机器上,显示如下内容,可以看到,这个一个get请求下面利用一个 html 的 form表单提交 post 请求 <form action="http://localhost:8080" method="post" enctype="multipart/form-data"> <input type="text" name="time" value="1970-01-01"/> <input type="file" name="file"/> <input type="submit"/> </form>在我的机器上,显示如下内容注意图中被红色框起来的部分,第一个红框指示了本次请求中,用来分隔不同元素的分隔线。每个元素将以此分隔线作为第一行,后面紧跟对元素的描述,描述与内容用空行分隔。分隔线的后面加两个小短横代表整个请求体结束,即EOF。我们需要做的工作,就是利用分隔线,从请求体中分离出每个元素,分析HTTP请求头的工作可以交给Servlet。#分析那么,如何分离呢?java中的 InputStream 只能读取一次,所以我们想要方便地分析一个流,最直接的办法就是将其缓存下来。RandomAccessFile 或许能够满足需求,RandomAccessFile 可以提供一个指针用于在文件中的随意移动,然而需要读写本地文件的方案不会是最优方案。先将整个流读一遍将内容缓存到内存中? 这种方案在多个客户端同时提交大文件时一定是不可靠的。最理想的方案可能是,我只需要读一遍 InputStream , 读完后将得到一个有序列表,列表中存放每个元素对象。很明显,JavaSe的流没有提供这个功能我们知道从 InputStreeam 中获取内容需要使用 read 方法,返回 -1 表示读到了流的末尾,如果我们增强一下read的功能,让其在读到每个元素末尾的时候返回 -1,这样不就可以分离出每个元素了吗,至于判断是否到了整个流的末尾,自有办法。#设计如何增强read方法呢?read方法要在读到元素末尾时返回-1 , 一定需要先对已读取的内容进行分析,判断是否元素末尾。我的做法是,内部维护一个buffer,read方法在读取时先将字节写入到这个buffer中,然后分析其中是否存在分隔线,然后将buffer中可用的元素复制...

Https 一共1条数据

ssl 一共1条数据

Java 一共15条数据

RMI

Java RMI 指的是远程方法调用 (Remote Method Invocation)。RMI能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法, 其威力体现在它强大的开发分布式网络应用的能力上,它可以被看作是RPC的Java版本。

Servlet乱码分析

我们知道,web浏览器会将form中的内容打包成HTTP请求体,然后发送到服务端,服务端对请求体解析后可以得到传递的数据。这当中包含两个过程:encodedecode

spring security 探秘
概述Spring Security这是一种基于Spring AOP和Servlet过滤器的安全框架。它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权。在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术。 概述 Filter HTTP FilterChain FilterSecurityInterceptor AuthenticationManager AccessDecisionManager SecurityMetadataSource本文的宗旨并非描述如何从零开始搭建一个 “hello world” 级的demo,或者列举有哪些可配置项(这种类似于词典的文档,没有比参考书更合适的了),而是简单描述spring-security项目的整体结构,设计思想,以及某些重要配置做了什么。本文所有内容基于spring-security-4.0.1.RELEASE ,你可以在Github中找到它,或者使用Maven获取,引入spring-security-config是为了通过命名空间简化配置。<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>4.0.1.RELEASE</version></dependency><dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>4.0.1.RELEASE</version></dependency>Filterspring-security的业务流程是独立于项目的,我们需要在web.xml中指定其入口,注意该过滤器必须在项目的过滤器之前。<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <servlet-name>/*</servlet-name></filter-mapping>值得一提的是,该过滤器的名字具有特殊意义,没有特别需求不建议修改,我们可以在该过滤的源码中看到,其过滤行为委托给了一个delegate对象,该delegate对象是一个从spring容器中获取的bean,依据的beanid就是filter-name。@Overrideprotected void initFilterBean() throws ServletException { synchronized (this.delegateMonitor) { if (this.delegate == null) { if (this.targetBeanName == null) { this.targetBeanName = getFilterName(); } WebApplicationContext wac = findWebApplicationContext(); if (wac != null) { this.delegate = initDelegate(wac); } } }}HTTP我们可以在security中声明多个http元素,每个http元素将产生一个FilterChain,这些FilterChain将按照声明顺序加入到FilterChainProxy中,而这个FilterChainProxy就是web.xml中定义的springSecurityFilterChain内部的deleg...
WebService
WSDLdefinitions 为根节点,属性为 name:WS 名称,默认为“实现类 + Service” targetNamespace:WS 目标命名空间,默认为“WS 实现类对应包名倒排后构成的地址”definitions的5个子节点 types:描述了 WS 中所涉及的数据类型 portType:定义了 WS 接口名称portType.name(endpointInterface默认为“WS 实现类所实现的接口”),及其操作名称,以及每个操作的输入与输出消息 message:对相关消息进行了定义(供 types 与 portType 使用) binding:提供了对 WS 的数据绑定方式 service:WS 名称及其端口名称service_port.name(portName默认为“WS 实现类 + Port”),以及对应的 WSDL 地址SOAPheaderbody#一、产品soap风格 (JAX-WS规范JSR-224)JAX-WS RI:https://jax-ws.java.net/ Oracle 官方提供的实现Axis:http://axis.apache.org/CXF:http://cxf.apache.org/rest风格 (JAX-RS规范JSR-339)Jersey:https://jersey.java.net/ Oracle 官方提供的实现Restlet:http://restlet.com/RESTEasy:http://resteasy.jboss.org/CXF:http://cxf.apache.org/#二、JDK发布与调用##1.发布###定义接口//此注解必须@WebServicepublic interface HelloService { String say();}###实现接口@WebService(serviceName = "HelloService", portName = "HelloServicePort", endpointInterface = "org.sllx.practice.jdkws.HelloService")public class HelloServiceImpl implements HelloService { @Override public String say() { return "helloWorld"; }}###发布服务public class Server { public static void main(String[] args){ String address = "http://localhost:8081/ws/soap/hello"; HelloService helloService = new HelloServiceImpl(); Endpoint.publish(address, helloService); System.out.println("ws is published [" + address + "?wsdl]"); }}访问http://localhost:8081/ws/soap/hello?wsdl即可查看详情##2.调用###静态客户端wsimport http://localhost:8080/ws/soap/hello?wsdl//通过 WSDL 地址生成 class 文件jar -cf client.jar . //通过 jar 命令将若干 class 文件压缩为一个 jar 包rmdir /s/q demo //删除生成的 class 文件(删除根目录即可)public static void main(String[] args){ HelloService_Service hss = new HelloService_Service(); HelloService hs = hss.getHelloServicePort(); System.out.println(hs.say());}###动态代理客户端只需提供HelloService接口,无需jarpublic static void main(String[] args){ try { URL wsdl = new URL("http://localhost:8081/ws/soap/hello?wsdl"); QName serviceName = new QName("http://j...
Java8 新特性
#1 语言新特性##1.1 Lambda自动推测形参类型eArrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );指定形参类型eArrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );方法体可以用{}包裹Arrays.asList( "a", "b", "d" ).forEach( e -> { System.out.print( e ); System.out.print( e );} );effectively final,lambda引用的对象会自动转为finalString separator = ",";Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.print( e + separator ) );##1.2 FunctionalInterface函数接口就是只具有一个方法的普通接口,这样的接口,可以被隐式转换为lambda表达式,然而,一旦在此接口中增加了方法,它将不再是函数接口,使用lambda时也将编译失败。@FunctionalInterface注解可以约束接口的行为,默认方法与静态方法不会影响函数接口@FunctionalInterfacepublic interface Functional { void method();}##1.3 接口默认方法public interface Defaulable { // Interfaces now allow default methods, the implementer may or // may not implement (override) them. default String notRequired() { return "Default implementation"; } }public class DefaultableImpl implements Defaulable {} public class OverridableImpl implements Defaulable { @Override public String notRequired() { return "Overridden implementation"; }}##1.4 接口静态方法private interface DefaulableFactory { // Interfaces now allow static methods static Defaulable create( Supplier< Defaulable > supplier ) { return supplier.get(); }}##1.5 方法引用可以将类中既有 方法引用为lambdapublic static class Car { public static Car create( final Supplier< Car > supplier ) { return supplier.get(); } public static void collide( final Car car ) { System.out.println( "Collided " + car.toString() ); } public void repair() { System.out.println( "Repaired " + this.toString() ); } public void follow( final Car another ) { System.out.println( "Following the " + another.toString() ); }}①构造器引用,语法为 Class::new,效果如同 () -> new Class()Car car = Car.create( Car::new );final List< Car > cars = Arrays.asList...
Java Concurrent

线程拥有通过程序运行的独立的并发路径,并且每个线程都有自己的程序计数器,称为堆栈和本地变量。线程存在于进程中,它们与同一进程内的其他线程共享内存、文件句柄以及进程状态。

Java虚拟机
#一、走近JAVA##第一章、走近JAVAjava技术体系###1.1 jdk1.7的主要特性G1收集器JSR-292对非JAVA语言的调用支持ARM指令集?Sparc指令集?新语法:原生二进制(0b开头),switch支持字符串,”<>”操作符,异常处理改进,简化变长参数方法调用,面向资源的try-catch-finally多核并行:java.util.concurrent.forkjoinopenJdk子项目Sumatra:为java提供使用GPU、APU运算能力的工具java并行框架:hadoop MapReduceScala,Erlang,Clojure天生具备并行计算能力###1.2 虚拟机历史classic/exact vm → hotspot vm(sun jdk 与 open jdk 共同的虚拟机) → oracle 收购 bea与sun 拥有JRockit VM 与 Hotspot VMjit编译器 → OSR 栈上替换(on-stack replace)jsr : Java Specification Requests java规范请求###1.3 Open Service Gateway Initiative(OSGI)一种java模块化标准《深入理解OSGI:Equinox原理,应用与最佳实践》混合语言:运行于java平台上的其他语言:Clojure,JRuby/Rails,Groovy#二、自动内存管理机制##第二章、java内存区域与内存溢出异常###2.1 运行时数据区####2.1.1 程序计数器程序计数器是一块比较小的内存空间,可以看成是当前线程所执行的字节码的行号指示器,字节码解释器通过改变计数器的值来选取指令。java多线程通过轮流切换实现,每个线程都需要有一个独立的计数器,这类内存称为”线程私有”的内存。这是java虚拟机唯一没有规定任何OutOfMemoryError情况的区域。线程私有。####2.1.2 java虚拟机栈每个方法对应一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口等,每个方法的执行对应着一个栈帧在虚拟机中的入栈与出栈。线程私有。局部变量表存放了编译期可知的各种基本数据类型、对象引用(reference类型,不等同于对象本身)、returnAddress类型long,double占两个局部变量空间,其余占一个,局部变量表所需空间在编译时确定,运行期不会改变。####2.1.3本地方法栈与java虚拟机栈作用类似,区别是虚拟机栈执行java方法,本地方法栈执行native方法。线程私有。 以上三个线程私有的内存区域,随线程而生,随线程而灭,无需考虑垃圾回收####2.1.4 java堆最大的空间,所有线程共享,用于存放对象实例(数组也是对象),GC管理的主要区域,GC基本采用分代收集算法(新生代,老年代,永久代(方法区))。java堆只需要逻辑连续,不要求物理连续####2.1.5 方法区所有线程共享,存储类信息、常量、静态变量、字段描述,方法描述,即时编译器编译后的代码等。Hotspot中称为永久代。####2.1.6 运行时常量池是方法区的一部分,class文件中包含类的版本,字段,方法,接口,常量池等。运行时常量池具备动态性,class常量池反之。####2.1.7 直接内存使用nativie函数分配堆外内存,然后在堆中通过DirectoryByteBuffer对象作为这块内存的引用。不会受到java堆大小的限制,会受到本机总内存以及处理器寻址空间的限制。###2.2 HotSpot虚拟机对象探秘####2.2.1 对象的创建(1)检查能否在常量池定位到一个类的符号引用,(2)检查这个类是否已被加载、解析和初始化过,如果没有,执行相应加载过程(3)从java堆中分配确定大小的内存,有两种分配方式:指针碰撞与空闲列表,取决于垃圾收集器是否带有压缩整理功能(4)分配空间的线程安全:同步或者本地线程分配缓冲,是否使用TLAB:-XX:+/-UseTLAB(5)分配完成后,空间初始化为零值,设置对象头信息(6)执行(构造方法),字段赋值####2.2.2 对象的内存布局:对象头,实例数据,对齐填充(1)对象头包括两部分信息: 第一部分:存储对象自身的运行时数据,如 hashcode,GC分代年龄,锁状态标识,线程持有的锁,偏向线程ID,偏向时间戳等 第二部分:类型指针,即对象指向它的类元数据的指针,虚拟机以此确定对象是哪个类的实例,数组长度(if)(2)实例数据:类中字段的内容,默认分配策略总是将相同宽度的字段分配到一起,所以子类较窄的变量可能插入父类变量的空隙中(3)对齐填充:不是必然存在的,仅仅起到占位符的作用,因为对象大小以及对象头的大...
Effective Java
#一 创建和销毁对象##1.考虑用静态工厂方法代替构造器静态工厂方法的优势:1.有名称,可以见名知义了解获取对象的特点2.不必每次调用时都创建一个对象3.可以返回原类型的任何子类型对象4.创建参数化类型实例时,可以使代码更简洁(右边无需再写一遍)5.不可变对象可以进行缓存,以提升性能##2.遇到多个构造器参数时要考虑用构建器构建器优势:1.重叠构造器代码冗余2.JavaBean模式阻止了将类做成不可变的可能3.builder可以进行参数检查4.无论创建多少个对象,builder只需要一个,且可以在创建不同对象时进行调整,或者自动填充某些域 。不足:创建对象前需要先创建builder##3.用私有构造器或者枚举类型强化Singleton属性不使用枚举时:1.构造器私有2.构造器抛出异常 if(INSTANCE!=null) throw3.序列化时必须声明所有实例域都是瞬时(transient)的,并提供一个readResolve方法返回现有的单例##4.通过私有构造器强化不可实例化的能力并在构造器中抛出异常##5.避免创建不必要的对象1.如果对象是不可变的,将始终可以重用2.对于给定对象的适配器,不需要创建多个实例,例如:对于同一Map对象的keySet方法,每次返回的都是同一个对象3.优先使用基本类型,而不是装箱类型4.通过维护对象池来避免创建对象并不是好主意,除非对象非常昂贵(数据库连接池).##6.消除过期的对象引用内存泄露常见来源:1.无意识的对象保持(只要是类自己管理内存,程序员就应该警惕内存泄露问题)2.被遗忘在缓存中的对象引用(考虑用WeakHashMap实现缓存)3.监听器和其他回调没有显式地取消注册4种引用:1.强引用 Object obj = new Object();: 只要强引用还存在,GC永远不会回收2.软引用 SoftReference:用来描述一些有用但不必需的对象,在系统将要发生内存溢出之前,GC会对软引用对象进行回收,若回收后仍没有足够内存,才会抛出异常。3.弱引用 WeakReference:也是用来描述非必需对象的,但是强度比软引用更弱,弱引用对象只能生存到下一次GC发生之前,当GC工作时,无论内存是否足够,都会回收弱引用对象4.虚引用 PhantomReference:也称为幽灵引用或幻影引用,是最弱的一种引用关系。一个对象是否有虚引用存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个实例。 为对象设置一个虚引用的唯一目的就是能在这个对象被GC回收时收到一个系统通知。##7.避免使用终结方法1.终结方法不能保证会被及时执行,也不能保证会被执行,所以不应该依赖终结方法来更新重要的持久状态2.终结方法中发生的异常不会使线程终止,也不会打印栈轨迹,对象将处于破坏状态3.终结方法有非常严重的性能损失4.如果需要终止资源,应该显式地提供终止方法(io中的close方法),通常与try-finally结合使用,以确保及时终止注意:1.除非作为安全网或者终止非关键资源,否则不要使用终结方法,最好就当没这个方法2.如果使用了终结方法,要记住super.finalize3.如果终结方法作为安全网,要记录终结方法的非法用法4.如果终结方法所属的类不是final的,请考虑使用终结方法守卫者#二 通用方法##8.覆盖equals时请遵守通用约定必须遵守自反性、对称性、传递性、一致性、非空性可以用&&连接所有对field的比较结果使代码简洁诀窍:1.先使用== 操作符比较以优化性能2.使用instanceof检查类型是否正确可以同时搞定null判断3.只比较关键域,可以通过关键域计算出来的冗余域不需要比较4.优先比较最可能不同、开销最低的域5.对float,double用compare特殊处理,对数组用Arrays.equals处理6.覆盖equals时总要覆盖hashCode7.不要企图让equals太智能,不需要考虑参数可能存在的等价关系8.不要修改equals方法的参数类型(修改了就不是覆盖了),@Override可以避免这一点9.里氏替换原则10.优先用组合+公有视图的方式扩展值组件,而不是用继承##9.覆盖equals时总要覆盖hashCode1.相同的对象必须具有相同的hashCode(在hash表中,hashCode用来定位hash bucket,如果相等的对象有不同的hashCode,那么hash表将从错误的hash bucket中寻找对象,最后会判定为不存在)2.用result = 31 * result + c的方式获取hashCode,result初值设为17,c为每个域的散列值3.能够通过关键域计算出来的冗余域可以排除4.如果计算hashCode开销很大,可...
Custom Fileupload
本文的目的是简要说明如何编写一个文件上传组件,使他的功能类似 commons-fileupload, 并在结尾处提供了完整代码的获取方式。#HTTP本文讨论的是基于 HTTP 协议的文件上传,下面先来看看 HTTP 请求的真面目。首先,用 JavaSe 类库中的 Socket 搭建一个超简单的服务器,这个服务器只有一个功能,就是完整地打印整个 HTTP 请求体。public class Server { private ServerSocket serverSocket; public Server() throws IOException{ serverSocket = new ServerSocket(8080); } public void show() throws IOException{ while(true){ Socket socket = serverSocket.accept(); byte[] buf = new byte[1024]; InputStream is = socket.getInputStream(); OutputStream os = new ByteArrayOutputStream(); int n = 0; while ((n = is.read(buf)) > -1){ os.write(buf,0,n); } os.close(); is.close(); socket.close(); System.out.println(os); } } public static void main(String[] args) throws IOException { new Server().show(); }}将服务器运行起来之后,在浏览器中输入地址:http://localhost:8080在我的机器上,显示如下内容,可以看到,这个一个get请求下面利用一个 html 的 form表单提交 post 请求 <form action="http://localhost:8080" method="post" enctype="multipart/form-data"> <input type="text" name="time" value="1970-01-01"/> <input type="file" name="file"/> <input type="submit"/> </form>在我的机器上,显示如下内容注意图中被红色框起来的部分,第一个红框指示了本次请求中,用来分隔不同元素的分隔线。每个元素将以此分隔线作为第一行,后面紧跟对元素的描述,描述与内容用空行分隔。分隔线的后面加两个小短横代表整个请求体结束,即EOF。我们需要做的工作,就是利用分隔线,从请求体中分离出每个元素,分析HTTP请求头的工作可以交给Servlet。#分析那么,如何分离呢?java中的 InputStream 只能读取一次,所以我们想要方便地分析一个流,最直接的办法就是将其缓存下来。RandomAccessFile 或许能够满足需求,RandomAccessFile 可以提供一个指针用于在文件中的随意移动,然而需要读写本地文件的方案不会是最优方案。先将整个流读一遍将内容缓存到内存中? 这种方案在多个客户端同时提交大文件时一定是不可靠的。最理想的方案可能是,我只需要读一遍 InputStream , 读完后将得到一个有序列表,列表中存放每个元素对象。很明显,JavaSe的流没有提供这个功能我们知道从 InputStreeam 中获取内容需要使用 read 方法,返回 -1 表示读到了流的末尾,如果我们增强一下read的功能,让其在读到每个元素末尾的时候返回 -1,这样不就可以分离出每个元素了吗,至于判断是否到了整个流的末尾,自有办法。#设计如何增强read方法呢?read方法要在读到元素末尾时返回-1 , 一定需要先对已读取的内容进行分析,判断是否元素末尾。我的做法是,内部维护一个buffer,read方法在读取时先将字节写入到这个buffer中,然后分析其中是否存在分隔线,然后将buffer中可用的元素复制...

synchronized 一共1条数据

Lock 一共1条数据

fileupload 一共1条数据

Custom Fileupload
本文的目的是简要说明如何编写一个文件上传组件,使他的功能类似 commons-fileupload, 并在结尾处提供了完整代码的获取方式。#HTTP本文讨论的是基于 HTTP 协议的文件上传,下面先来看看 HTTP 请求的真面目。首先,用 JavaSe 类库中的 Socket 搭建一个超简单的服务器,这个服务器只有一个功能,就是完整地打印整个 HTTP 请求体。public class Server { private ServerSocket serverSocket; public Server() throws IOException{ serverSocket = new ServerSocket(8080); } public void show() throws IOException{ while(true){ Socket socket = serverSocket.accept(); byte[] buf = new byte[1024]; InputStream is = socket.getInputStream(); OutputStream os = new ByteArrayOutputStream(); int n = 0; while ((n = is.read(buf)) > -1){ os.write(buf,0,n); } os.close(); is.close(); socket.close(); System.out.println(os); } } public static void main(String[] args) throws IOException { new Server().show(); }}将服务器运行起来之后,在浏览器中输入地址:http://localhost:8080在我的机器上,显示如下内容,可以看到,这个一个get请求下面利用一个 html 的 form表单提交 post 请求 <form action="http://localhost:8080" method="post" enctype="multipart/form-data"> <input type="text" name="time" value="1970-01-01"/> <input type="file" name="file"/> <input type="submit"/> </form>在我的机器上,显示如下内容注意图中被红色框起来的部分,第一个红框指示了本次请求中,用来分隔不同元素的分隔线。每个元素将以此分隔线作为第一行,后面紧跟对元素的描述,描述与内容用空行分隔。分隔线的后面加两个小短横代表整个请求体结束,即EOF。我们需要做的工作,就是利用分隔线,从请求体中分离出每个元素,分析HTTP请求头的工作可以交给Servlet。#分析那么,如何分离呢?java中的 InputStream 只能读取一次,所以我们想要方便地分析一个流,最直接的办法就是将其缓存下来。RandomAccessFile 或许能够满足需求,RandomAccessFile 可以提供一个指针用于在文件中的随意移动,然而需要读写本地文件的方案不会是最优方案。先将整个流读一遍将内容缓存到内存中? 这种方案在多个客户端同时提交大文件时一定是不可靠的。最理想的方案可能是,我只需要读一遍 InputStream , 读完后将得到一个有序列表,列表中存放每个元素对象。很明显,JavaSe的流没有提供这个功能我们知道从 InputStreeam 中获取内容需要使用 read 方法,返回 -1 表示读到了流的末尾,如果我们增强一下read的功能,让其在读到每个元素末尾的时候返回 -1,这样不就可以分离出每个元素了吗,至于判断是否到了整个流的末尾,自有办法。#设计如何增强read方法呢?read方法要在读到元素末尾时返回-1 , 一定需要先对已读取的内容进行分析,判断是否元素末尾。我的做法是,内部维护一个buffer,read方法在读取时先将字节写入到这个buffer中,然后分析其中是否存在分隔线,然后将buffer中可用的元素复制...

Flex 一共1条数据

Flex
#产品 Adobe® Flex™ SDK Adobe® Flex™ Builder™ Adobe® Flex™ Data Services Adobe® Flex™ Charting #Flex基础##应用程序模型用容器(如Box)控件(如Button)来描述用户的操作界面##MVC模型 模型/Model 组件封装了数据和与数据相关的行为。 视图/View 组件定义了应用程序的用户界面。 控制器/Controller 组件则负责处理程序中的数据连接。 ##Flex 编程模型Flex 包含了Flex 类库、MXML 和ActionScript 编程语言,以及Flex 编译器和调试器。 MXML 和 ActionScript 编程语言都提供了访问Flex 类库的能力。通常的做法是:使用MXML 去定义用户界面的元素,使用ActionScript 去定义客户端的逻辑并进行控制。Flex 类库包括了Flex 组件、管理器和行为。##Flex 元素 Flex framework MXML ActionScript 3.0 CSS 图形资源 数据 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Panel> <mx:TextArea text="Say hello to Flex!" /> <mx:Button label="Close" /> </mx:Panel></mx:Application>##发布方式 客户端模式,即应用程序只运行在客户端上而不需要服务器资源。 使用简单的RPC 访问服务器数据,即使用HTTPService(HTTP GET 或POST 请求)和WebService(通过使用SOAP)。 Flex Data Services 模式,可以提供更为高级的特性,如数据同步、安全增强等等。 #界面布局样式<mx:Style> { fontSize: 36px; fontWeight: bold; }</mx:Style>外部样式<mx:Style source="styles.css"/>##控制应用程序的外观 大小/Sizes,即组件或应用程序的高度和宽度。 样式/Styles,即一组特性,如字体、排列方式、颜色等。它们都是通过层叠样式( CSS)来进行设置的。 皮肤/Skins,即可以进行改变的组件视觉元素。 行为/Behaviors,即Flex 组件在视觉或听觉效果方面的变化。 视图状态/View state 可以让你通过修改它的基础内容,来改变组件或程序的内容和外观。 变换/Transitions 可以让你定义屏幕上发生改变的视图状态。 ##受约束的布局受约束的布局可以确保用户界面中的组件在程序窗口大小发生变化时,也能自动地作出调节。备注:可以通过使用嵌套的布局容器/nested layout container 来实现相同的目的创建受约束的布局,你必须将容器的布局属性设置为绝对方式( layout="absolute")备注:帆布容器/canvas container 并不需要进行layout=”absolute”的属性设置,因为它默认是绝对布局方式。在Flex 中,所有的约束都是被设置为与容器的相对距离,它们不可能被设置为相对于其它控件控件ComboBox,List,HorizontalList。#事件与行为外部ActionScript<mx:Script source="myFunctions.as" />被事件触发的行为mxml中的组件被赋予id后,在as中将可以直接作为对象进就行操作,如例子中的vBoxvar locales:ArrayCollection = new ArrayCollection([{label:"en_us", data:"en_us"},{label:"zh_cn", data:"zh_cn"}]);var child:ComboBox = new ComboBox();child.dataProvider=locales;vBox.addChild(child);...

ActionScript 一共1条数据

Flex
#产品 Adobe® Flex™ SDK Adobe® Flex™ Builder™ Adobe® Flex™ Data Services Adobe® Flex™ Charting #Flex基础##应用程序模型用容器(如Box)控件(如Button)来描述用户的操作界面##MVC模型 模型/Model 组件封装了数据和与数据相关的行为。 视图/View 组件定义了应用程序的用户界面。 控制器/Controller 组件则负责处理程序中的数据连接。 ##Flex 编程模型Flex 包含了Flex 类库、MXML 和ActionScript 编程语言,以及Flex 编译器和调试器。 MXML 和 ActionScript 编程语言都提供了访问Flex 类库的能力。通常的做法是:使用MXML 去定义用户界面的元素,使用ActionScript 去定义客户端的逻辑并进行控制。Flex 类库包括了Flex 组件、管理器和行为。##Flex 元素 Flex framework MXML ActionScript 3.0 CSS 图形资源 数据 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Panel> <mx:TextArea text="Say hello to Flex!" /> <mx:Button label="Close" /> </mx:Panel></mx:Application>##发布方式 客户端模式,即应用程序只运行在客户端上而不需要服务器资源。 使用简单的RPC 访问服务器数据,即使用HTTPService(HTTP GET 或POST 请求)和WebService(通过使用SOAP)。 Flex Data Services 模式,可以提供更为高级的特性,如数据同步、安全增强等等。 #界面布局样式<mx:Style> { fontSize: 36px; fontWeight: bold; }</mx:Style>外部样式<mx:Style source="styles.css"/>##控制应用程序的外观 大小/Sizes,即组件或应用程序的高度和宽度。 样式/Styles,即一组特性,如字体、排列方式、颜色等。它们都是通过层叠样式( CSS)来进行设置的。 皮肤/Skins,即可以进行改变的组件视觉元素。 行为/Behaviors,即Flex 组件在视觉或听觉效果方面的变化。 视图状态/View state 可以让你通过修改它的基础内容,来改变组件或程序的内容和外观。 变换/Transitions 可以让你定义屏幕上发生改变的视图状态。 ##受约束的布局受约束的布局可以确保用户界面中的组件在程序窗口大小发生变化时,也能自动地作出调节。备注:可以通过使用嵌套的布局容器/nested layout container 来实现相同的目的创建受约束的布局,你必须将容器的布局属性设置为绝对方式( layout="absolute")备注:帆布容器/canvas container 并不需要进行layout=”absolute”的属性设置,因为它默认是绝对布局方式。在Flex 中,所有的约束都是被设置为与容器的相对距离,它们不可能被设置为相对于其它控件控件ComboBox,List,HorizontalList。#事件与行为外部ActionScript<mx:Script source="myFunctions.as" />被事件触发的行为mxml中的组件被赋予id后,在as中将可以直接作为对象进就行操作,如例子中的vBoxvar locales:ArrayCollection = new ArrayCollection([{label:"en_us", data:"en_us"},{label:"zh_cn", data:"zh_cn"}]);var child:ComboBox = new ComboBox();child.dataProvider=locales;vBox.addChild(child);...

script 一共2条数据

JS 闭包

在JS中,当内部的方法被其他对象引用,如果内部的方法使用了外部方法的变量,将造成外部方法无法释放,变量将被保持,此时将形成闭包。

Flex
#产品 Adobe® Flex™ SDK Adobe® Flex™ Builder™ Adobe® Flex™ Data Services Adobe® Flex™ Charting #Flex基础##应用程序模型用容器(如Box)控件(如Button)来描述用户的操作界面##MVC模型 模型/Model 组件封装了数据和与数据相关的行为。 视图/View 组件定义了应用程序的用户界面。 控制器/Controller 组件则负责处理程序中的数据连接。 ##Flex 编程模型Flex 包含了Flex 类库、MXML 和ActionScript 编程语言,以及Flex 编译器和调试器。 MXML 和 ActionScript 编程语言都提供了访问Flex 类库的能力。通常的做法是:使用MXML 去定义用户界面的元素,使用ActionScript 去定义客户端的逻辑并进行控制。Flex 类库包括了Flex 组件、管理器和行为。##Flex 元素 Flex framework MXML ActionScript 3.0 CSS 图形资源 数据 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Panel> <mx:TextArea text="Say hello to Flex!" /> <mx:Button label="Close" /> </mx:Panel></mx:Application>##发布方式 客户端模式,即应用程序只运行在客户端上而不需要服务器资源。 使用简单的RPC 访问服务器数据,即使用HTTPService(HTTP GET 或POST 请求)和WebService(通过使用SOAP)。 Flex Data Services 模式,可以提供更为高级的特性,如数据同步、安全增强等等。 #界面布局样式<mx:Style> { fontSize: 36px; fontWeight: bold; }</mx:Style>外部样式<mx:Style source="styles.css"/>##控制应用程序的外观 大小/Sizes,即组件或应用程序的高度和宽度。 样式/Styles,即一组特性,如字体、排列方式、颜色等。它们都是通过层叠样式( CSS)来进行设置的。 皮肤/Skins,即可以进行改变的组件视觉元素。 行为/Behaviors,即Flex 组件在视觉或听觉效果方面的变化。 视图状态/View state 可以让你通过修改它的基础内容,来改变组件或程序的内容和外观。 变换/Transitions 可以让你定义屏幕上发生改变的视图状态。 ##受约束的布局受约束的布局可以确保用户界面中的组件在程序窗口大小发生变化时,也能自动地作出调节。备注:可以通过使用嵌套的布局容器/nested layout container 来实现相同的目的创建受约束的布局,你必须将容器的布局属性设置为绝对方式( layout="absolute")备注:帆布容器/canvas container 并不需要进行layout=”absolute”的属性设置,因为它默认是绝对布局方式。在Flex 中,所有的约束都是被设置为与容器的相对距离,它们不可能被设置为相对于其它控件控件ComboBox,List,HorizontalList。#事件与行为外部ActionScript<mx:Script source="myFunctions.as" />被事件触发的行为mxml中的组件被赋予id后,在as中将可以直接作为对象进就行操作,如例子中的vBoxvar locales:ArrayCollection = new ArrayCollection([{label:"en_us", data:"en_us"},{label:"zh_cn", data:"zh_cn"}]);var child:ComboBox = new ComboBox();child.dataProvider=locales;vBox.addChild(child);...

generic 一共1条数据

type 一共1条数据

Linux 一共1条数据

SSH
##登陆-p指定主机的端口$ ssh -p port user@host默认端口为22$ ssh user@host默认使用本机用户名$ ssh host##过程 远程主机接收到用户的登陆请求,把自己的公钥发给用户 用户使用这个公钥,将密码加密后发回来 远程主机用自己的私钥,解密登陆密码,如果密码正确,就同意用户登陆 此处如果有攻击者截取了用户请求,再将自己的公钥发送给用户,然后就可以用自己的私钥解密出用户的私密信息,这就是中间人攻击 应对的方法:用户首次连接远程主机时,远程主机将发送一段128位长的公钥指纹,用户需要自行与远程主机网站发布的公钥指纹进行对比以判断真伪,当用户信任了此公钥后,它将被保存在$HOME/.ssh/known_hosts中,下次连接时无需再次确认。##公钥登陆原理:用户将自己的公钥保存在远程主机上,登录时,远程主机向用户发送一段随机码,用户用自己的私钥签名后,在发回远程主机,远程主机用实现保存的公钥进行验证,如果成功,表示用户的身份正确,无需输入密码 用户生成一对自己的密钥 将用户的公钥内容添加到 $HOME/.ssh/authorized_keys中(可以用ssh-copy-id user@host进行该操作) 重启ssh服务 /etc/init.d/ssh restart 公钥登陆相关配置 /etc/ssh/sshd_config RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys##远程操作 直接操作 $ ssh user@host command 用户和远程主机之间,建立命令和数据的传输通道 将当前目录下的src文件,复制到远程主机的$HOME目录 $ tar czv src | ssh user@host "tar xz" 将远程主机$HOME目录下面的src文件,复制到用户的当前目录 $ ssh user@host "tar cz src" | tar xzv##绑定本地端口ssh -D port user@host-D 指定与远程host建立隧道的本地端口##本地端口转发假定localhost是本地主机,remotehost是远程主机,这两台主机之间无法连通。但是,另外还有一台boardhost,可以同时与前面两台主机互连。在本机键入如下命令$ ssh -L localPort:remotehost:remotePort boardhostL参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”该命令的意思是指定SSH绑定本地端口localPort,然后指定boardhost将所有的数据,转发到目标主机remotehost的remotePort端口 remotehost是boardhost 的相对地址(或绝对地址),因为数据其实是由boardhost 传输到remotehost中的,与localhost无关这样一来localhost与remotehost之间将形成私密隧道,访问localPort就等于访问remotePort##远程端口转发假定hostA是本地主机,hostB是远程主机,这两台主机之间无法连通,而且,boardhost是一台内网主机,即boardhost可以访问hostA,但是hostA无法访问boardhost在boardhost键入如下命令$ ssh -R portA:hostB:portB hostAR参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口“。这条命令的意思,就是让hostA监听它自己的portA端口,然后将所有数据经由boardhost,转发到hostB的portB端口。对boardhost来说hostA是远程机器,在boardhost机器上指定hostA监听某个端口,称为远程端口转发 远程端口转发的前提条件是,hostA和boardhost两台主机都有sshd和ssh客户端,其原理就是:一开始由hostA充当Server,boardhost充当Client,boardhost发起请求建立一个连接;连接建立完成后,hostA就可以使用这个连接将充当Clinet,将数据转发至boardhost充当的Server;boardhost接收到数据后又需要充当Client将数据转发到hostB##其他参数N参数,表示只连接远程主机,不打开远程shell;T参数,表示不为这个连接分配TTY。这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作。$ ssh -NT...

命令 一共1条数据

SSH
##登陆-p指定主机的端口$ ssh -p port user@host默认端口为22$ ssh user@host默认使用本机用户名$ ssh host##过程 远程主机接收到用户的登陆请求,把自己的公钥发给用户 用户使用这个公钥,将密码加密后发回来 远程主机用自己的私钥,解密登陆密码,如果密码正确,就同意用户登陆 此处如果有攻击者截取了用户请求,再将自己的公钥发送给用户,然后就可以用自己的私钥解密出用户的私密信息,这就是中间人攻击 应对的方法:用户首次连接远程主机时,远程主机将发送一段128位长的公钥指纹,用户需要自行与远程主机网站发布的公钥指纹进行对比以判断真伪,当用户信任了此公钥后,它将被保存在$HOME/.ssh/known_hosts中,下次连接时无需再次确认。##公钥登陆原理:用户将自己的公钥保存在远程主机上,登录时,远程主机向用户发送一段随机码,用户用自己的私钥签名后,在发回远程主机,远程主机用实现保存的公钥进行验证,如果成功,表示用户的身份正确,无需输入密码 用户生成一对自己的密钥 将用户的公钥内容添加到 $HOME/.ssh/authorized_keys中(可以用ssh-copy-id user@host进行该操作) 重启ssh服务 /etc/init.d/ssh restart 公钥登陆相关配置 /etc/ssh/sshd_config RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys##远程操作 直接操作 $ ssh user@host command 用户和远程主机之间,建立命令和数据的传输通道 将当前目录下的src文件,复制到远程主机的$HOME目录 $ tar czv src | ssh user@host "tar xz" 将远程主机$HOME目录下面的src文件,复制到用户的当前目录 $ ssh user@host "tar cz src" | tar xzv##绑定本地端口ssh -D port user@host-D 指定与远程host建立隧道的本地端口##本地端口转发假定localhost是本地主机,remotehost是远程主机,这两台主机之间无法连通。但是,另外还有一台boardhost,可以同时与前面两台主机互连。在本机键入如下命令$ ssh -L localPort:remotehost:remotePort boardhostL参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”该命令的意思是指定SSH绑定本地端口localPort,然后指定boardhost将所有的数据,转发到目标主机remotehost的remotePort端口 remotehost是boardhost 的相对地址(或绝对地址),因为数据其实是由boardhost 传输到remotehost中的,与localhost无关这样一来localhost与remotehost之间将形成私密隧道,访问localPort就等于访问remotePort##远程端口转发假定hostA是本地主机,hostB是远程主机,这两台主机之间无法连通,而且,boardhost是一台内网主机,即boardhost可以访问hostA,但是hostA无法访问boardhost在boardhost键入如下命令$ ssh -R portA:hostB:portB hostAR参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口“。这条命令的意思,就是让hostA监听它自己的portA端口,然后将所有数据经由boardhost,转发到hostB的portB端口。对boardhost来说hostA是远程机器,在boardhost机器上指定hostA监听某个端口,称为远程端口转发 远程端口转发的前提条件是,hostA和boardhost两台主机都有sshd和ssh客户端,其原理就是:一开始由hostA充当Server,boardhost充当Client,boardhost发起请求建立一个连接;连接建立完成后,hostA就可以使用这个连接将充当Clinet,将数据转发至boardhost充当的Server;boardhost接收到数据后又需要充当Client将数据转发到hostB##其他参数N参数,表示只连接远程主机,不打开远程shell;T参数,表示不为这个连接分配TTY。这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作。$ ssh -NT...

SSH 一共1条数据

SSH
##登陆-p指定主机的端口$ ssh -p port user@host默认端口为22$ ssh user@host默认使用本机用户名$ ssh host##过程 远程主机接收到用户的登陆请求,把自己的公钥发给用户 用户使用这个公钥,将密码加密后发回来 远程主机用自己的私钥,解密登陆密码,如果密码正确,就同意用户登陆 此处如果有攻击者截取了用户请求,再将自己的公钥发送给用户,然后就可以用自己的私钥解密出用户的私密信息,这就是中间人攻击 应对的方法:用户首次连接远程主机时,远程主机将发送一段128位长的公钥指纹,用户需要自行与远程主机网站发布的公钥指纹进行对比以判断真伪,当用户信任了此公钥后,它将被保存在$HOME/.ssh/known_hosts中,下次连接时无需再次确认。##公钥登陆原理:用户将自己的公钥保存在远程主机上,登录时,远程主机向用户发送一段随机码,用户用自己的私钥签名后,在发回远程主机,远程主机用实现保存的公钥进行验证,如果成功,表示用户的身份正确,无需输入密码 用户生成一对自己的密钥 将用户的公钥内容添加到 $HOME/.ssh/authorized_keys中(可以用ssh-copy-id user@host进行该操作) 重启ssh服务 /etc/init.d/ssh restart 公钥登陆相关配置 /etc/ssh/sshd_config RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys##远程操作 直接操作 $ ssh user@host command 用户和远程主机之间,建立命令和数据的传输通道 将当前目录下的src文件,复制到远程主机的$HOME目录 $ tar czv src | ssh user@host "tar xz" 将远程主机$HOME目录下面的src文件,复制到用户的当前目录 $ ssh user@host "tar cz src" | tar xzv##绑定本地端口ssh -D port user@host-D 指定与远程host建立隧道的本地端口##本地端口转发假定localhost是本地主机,remotehost是远程主机,这两台主机之间无法连通。但是,另外还有一台boardhost,可以同时与前面两台主机互连。在本机键入如下命令$ ssh -L localPort:remotehost:remotePort boardhostL参数一共接受三个值,分别是”本地端口:目标主机:目标主机端口”该命令的意思是指定SSH绑定本地端口localPort,然后指定boardhost将所有的数据,转发到目标主机remotehost的remotePort端口 remotehost是boardhost 的相对地址(或绝对地址),因为数据其实是由boardhost 传输到remotehost中的,与localhost无关这样一来localhost与remotehost之间将形成私密隧道,访问localPort就等于访问remotePort##远程端口转发假定hostA是本地主机,hostB是远程主机,这两台主机之间无法连通,而且,boardhost是一台内网主机,即boardhost可以访问hostA,但是hostA无法访问boardhost在boardhost键入如下命令$ ssh -R portA:hostB:portB hostAR参数也是接受三个值,分别是”远程主机端口:目标主机:目标主机端口“。这条命令的意思,就是让hostA监听它自己的portA端口,然后将所有数据经由boardhost,转发到hostB的portB端口。对boardhost来说hostA是远程机器,在boardhost机器上指定hostA监听某个端口,称为远程端口转发 远程端口转发的前提条件是,hostA和boardhost两台主机都有sshd和ssh客户端,其原理就是:一开始由hostA充当Server,boardhost充当Client,boardhost发起请求建立一个连接;连接建立完成后,hostA就可以使用这个连接将充当Clinet,将数据转发至boardhost充当的Server;boardhost接收到数据后又需要充当Client将数据转发到hostB##其他参数N参数,表示只连接远程主机,不打开远程shell;T参数,表示不为这个连接分配TTY。这个两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作。$ ssh -NT...

Effective 一共1条数据

Effective Java
#一 创建和销毁对象##1.考虑用静态工厂方法代替构造器静态工厂方法的优势:1.有名称,可以见名知义了解获取对象的特点2.不必每次调用时都创建一个对象3.可以返回原类型的任何子类型对象4.创建参数化类型实例时,可以使代码更简洁(右边无需再写一遍)5.不可变对象可以进行缓存,以提升性能##2.遇到多个构造器参数时要考虑用构建器构建器优势:1.重叠构造器代码冗余2.JavaBean模式阻止了将类做成不可变的可能3.builder可以进行参数检查4.无论创建多少个对象,builder只需要一个,且可以在创建不同对象时进行调整,或者自动填充某些域 。不足:创建对象前需要先创建builder##3.用私有构造器或者枚举类型强化Singleton属性不使用枚举时:1.构造器私有2.构造器抛出异常 if(INSTANCE!=null) throw3.序列化时必须声明所有实例域都是瞬时(transient)的,并提供一个readResolve方法返回现有的单例##4.通过私有构造器强化不可实例化的能力并在构造器中抛出异常##5.避免创建不必要的对象1.如果对象是不可变的,将始终可以重用2.对于给定对象的适配器,不需要创建多个实例,例如:对于同一Map对象的keySet方法,每次返回的都是同一个对象3.优先使用基本类型,而不是装箱类型4.通过维护对象池来避免创建对象并不是好主意,除非对象非常昂贵(数据库连接池).##6.消除过期的对象引用内存泄露常见来源:1.无意识的对象保持(只要是类自己管理内存,程序员就应该警惕内存泄露问题)2.被遗忘在缓存中的对象引用(考虑用WeakHashMap实现缓存)3.监听器和其他回调没有显式地取消注册4种引用:1.强引用 Object obj = new Object();: 只要强引用还存在,GC永远不会回收2.软引用 SoftReference:用来描述一些有用但不必需的对象,在系统将要发生内存溢出之前,GC会对软引用对象进行回收,若回收后仍没有足够内存,才会抛出异常。3.弱引用 WeakReference:也是用来描述非必需对象的,但是强度比软引用更弱,弱引用对象只能生存到下一次GC发生之前,当GC工作时,无论内存是否足够,都会回收弱引用对象4.虚引用 PhantomReference:也称为幽灵引用或幻影引用,是最弱的一种引用关系。一个对象是否有虚引用存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个实例。 为对象设置一个虚引用的唯一目的就是能在这个对象被GC回收时收到一个系统通知。##7.避免使用终结方法1.终结方法不能保证会被及时执行,也不能保证会被执行,所以不应该依赖终结方法来更新重要的持久状态2.终结方法中发生的异常不会使线程终止,也不会打印栈轨迹,对象将处于破坏状态3.终结方法有非常严重的性能损失4.如果需要终止资源,应该显式地提供终止方法(io中的close方法),通常与try-finally结合使用,以确保及时终止注意:1.除非作为安全网或者终止非关键资源,否则不要使用终结方法,最好就当没这个方法2.如果使用了终结方法,要记住super.finalize3.如果终结方法作为安全网,要记录终结方法的非法用法4.如果终结方法所属的类不是final的,请考虑使用终结方法守卫者#二 通用方法##8.覆盖equals时请遵守通用约定必须遵守自反性、对称性、传递性、一致性、非空性可以用&&连接所有对field的比较结果使代码简洁诀窍:1.先使用== 操作符比较以优化性能2.使用instanceof检查类型是否正确可以同时搞定null判断3.只比较关键域,可以通过关键域计算出来的冗余域不需要比较4.优先比较最可能不同、开销最低的域5.对float,double用compare特殊处理,对数组用Arrays.equals处理6.覆盖equals时总要覆盖hashCode7.不要企图让equals太智能,不需要考虑参数可能存在的等价关系8.不要修改equals方法的参数类型(修改了就不是覆盖了),@Override可以避免这一点9.里氏替换原则10.优先用组合+公有视图的方式扩展值组件,而不是用继承##9.覆盖equals时总要覆盖hashCode1.相同的对象必须具有相同的hashCode(在hash表中,hashCode用来定位hash bucket,如果相等的对象有不同的hashCode,那么hash表将从错误的hash bucket中寻找对象,最后会判定为不存在)2.用result = 31 * result + c的方式获取hashCode,result初值设为17,c为每个域的散列值3.能够通过关键域计算出来的冗余域可以排除4.如果计算hashCode开销很大,可...

JVM 一共1条数据

Java虚拟机
#一、走近JAVA##第一章、走近JAVAjava技术体系###1.1 jdk1.7的主要特性G1收集器JSR-292对非JAVA语言的调用支持ARM指令集?Sparc指令集?新语法:原生二进制(0b开头),switch支持字符串,”<>”操作符,异常处理改进,简化变长参数方法调用,面向资源的try-catch-finally多核并行:java.util.concurrent.forkjoinopenJdk子项目Sumatra:为java提供使用GPU、APU运算能力的工具java并行框架:hadoop MapReduceScala,Erlang,Clojure天生具备并行计算能力###1.2 虚拟机历史classic/exact vm → hotspot vm(sun jdk 与 open jdk 共同的虚拟机) → oracle 收购 bea与sun 拥有JRockit VM 与 Hotspot VMjit编译器 → OSR 栈上替换(on-stack replace)jsr : Java Specification Requests java规范请求###1.3 Open Service Gateway Initiative(OSGI)一种java模块化标准《深入理解OSGI:Equinox原理,应用与最佳实践》混合语言:运行于java平台上的其他语言:Clojure,JRuby/Rails,Groovy#二、自动内存管理机制##第二章、java内存区域与内存溢出异常###2.1 运行时数据区####2.1.1 程序计数器程序计数器是一块比较小的内存空间,可以看成是当前线程所执行的字节码的行号指示器,字节码解释器通过改变计数器的值来选取指令。java多线程通过轮流切换实现,每个线程都需要有一个独立的计数器,这类内存称为”线程私有”的内存。这是java虚拟机唯一没有规定任何OutOfMemoryError情况的区域。线程私有。####2.1.2 java虚拟机栈每个方法对应一个栈帧,存储局部变量表、操作数栈、动态链接、方法出口等,每个方法的执行对应着一个栈帧在虚拟机中的入栈与出栈。线程私有。局部变量表存放了编译期可知的各种基本数据类型、对象引用(reference类型,不等同于对象本身)、returnAddress类型long,double占两个局部变量空间,其余占一个,局部变量表所需空间在编译时确定,运行期不会改变。####2.1.3本地方法栈与java虚拟机栈作用类似,区别是虚拟机栈执行java方法,本地方法栈执行native方法。线程私有。 以上三个线程私有的内存区域,随线程而生,随线程而灭,无需考虑垃圾回收####2.1.4 java堆最大的空间,所有线程共享,用于存放对象实例(数组也是对象),GC管理的主要区域,GC基本采用分代收集算法(新生代,老年代,永久代(方法区))。java堆只需要逻辑连续,不要求物理连续####2.1.5 方法区所有线程共享,存储类信息、常量、静态变量、字段描述,方法描述,即时编译器编译后的代码等。Hotspot中称为永久代。####2.1.6 运行时常量池是方法区的一部分,class文件中包含类的版本,字段,方法,接口,常量池等。运行时常量池具备动态性,class常量池反之。####2.1.7 直接内存使用nativie函数分配堆外内存,然后在堆中通过DirectoryByteBuffer对象作为这块内存的引用。不会受到java堆大小的限制,会受到本机总内存以及处理器寻址空间的限制。###2.2 HotSpot虚拟机对象探秘####2.2.1 对象的创建(1)检查能否在常量池定位到一个类的符号引用,(2)检查这个类是否已被加载、解析和初始化过,如果没有,执行相应加载过程(3)从java堆中分配确定大小的内存,有两种分配方式:指针碰撞与空闲列表,取决于垃圾收集器是否带有压缩整理功能(4)分配空间的线程安全:同步或者本地线程分配缓冲,是否使用TLAB:-XX:+/-UseTLAB(5)分配完成后,空间初始化为零值,设置对象头信息(6)执行(构造方法),字段赋值####2.2.2 对象的内存布局:对象头,实例数据,对齐填充(1)对象头包括两部分信息: 第一部分:存储对象自身的运行时数据,如 hashcode,GC分代年龄,锁状态标识,线程持有的锁,偏向线程ID,偏向时间戳等 第二部分:类型指针,即对象指向它的类元数据的指针,虚拟机以此确定对象是哪个类的实例,数组长度(if)(2)实例数据:类中字段的内容,默认分配策略总是将相同宽度的字段分配到一起,所以子类较窄的变量可能插入父类变量的空隙中(3)对齐填充:不是必然存在的,仅仅起到占位符的作用,因为对象大小以及对象头的大...

算法 一共1条数据

八种排序
##1.直接插入排序基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。/** * 形象描述:踢馆 * 直接插入排序(从小到大) * @param src 待排序的数组 */public void straight_insertion_sort(int[] src){ int tmp; for (int i = 0; i < src.length; i++) { tmp = src[i]; int j = i - 1; //向前匹配,凡是比自己大的都往后移一位,碰到不比自己大的直接跳出 for (; j >= 0 && tmp<src[j] ; j--) { src[j+1] = src[j]; } //j-1位置匹配失败,在后一位插入 src[j+1] = tmp; }}##2.希尔排序(缩小增量排序)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中相同位置的元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,再对每组中相同位置的元素进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。/** * 希尔排序(缩小增量排序)(从小到大) * @param src */public void shell_sort(int[] src){ int inc = src.length; int tmp; while(true){ inc = (int)Math.ceil(inc/2);//增量,亦即每组长度 //遍历每组进行排序的元素索引,具体看内部注释 for (int x = 0; x < inc; x++) { //以下内容即插入排序,但是搜索头步进inc,回顾时步退inc //这是一个模拟,可以想象为:将src分组,每组长度为inc,然后对每组的第0,1,2,3...个元素分别进行插入排序 //即:第二组的第一个元素与第一组的第一个元素进行插入排序,第三组的第一个元素与第一二组的第一个元素进行插入排序... // 第二组的第二个元素与第一组的第二个元素进行插入排序,第三组的第二个元素与第一二组的第二个元素进行插入排序... // ... for (int i = x + inc; i < src.length; i += inc) { tmp = src[i]; int j = i - inc; for (; j >= 0 && tmp < src[j]; j-=inc) { src[j + inc] = src[j]; } src[j + inc] = tmp; } } //不必担心增量为1时会完全等同于普通的直接插入排序,进而造成性能问题 //原因:在排序过程中匹配时遵循"小者胜,大者让"的原则,因此在搜索头进行回顾匹配时,会很快(1~2个元素左右)碰上不久前刚刚打败过自己的对手. if(inc == 1){ break; } }}##3.简单选择排序基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。/** * 简单选择排序(从小到大) * @param src */public void select_sort(int[] src){ int pos,tmp,j; //定义最小值索引,最小值缓存,最小值检索起点索引 //在每个i位置放入合适的值:i==0时放最小值;i==1时放第二小的值... for (int i = 0; i < src.length; i++) { //假定i位置的值就是合适的值 tmp = src...

algorithm 一共1条数据

八种排序
##1.直接插入排序基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。/** * 形象描述:踢馆 * 直接插入排序(从小到大) * @param src 待排序的数组 */public void straight_insertion_sort(int[] src){ int tmp; for (int i = 0; i < src.length; i++) { tmp = src[i]; int j = i - 1; //向前匹配,凡是比自己大的都往后移一位,碰到不比自己大的直接跳出 for (; j >= 0 && tmp<src[j] ; j--) { src[j+1] = src[j]; } //j-1位置匹配失败,在后一位插入 src[j+1] = tmp; }}##2.希尔排序(缩小增量排序)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中相同位置的元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,再对每组中相同位置的元素进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。/** * 希尔排序(缩小增量排序)(从小到大) * @param src */public void shell_sort(int[] src){ int inc = src.length; int tmp; while(true){ inc = (int)Math.ceil(inc/2);//增量,亦即每组长度 //遍历每组进行排序的元素索引,具体看内部注释 for (int x = 0; x < inc; x++) { //以下内容即插入排序,但是搜索头步进inc,回顾时步退inc //这是一个模拟,可以想象为:将src分组,每组长度为inc,然后对每组的第0,1,2,3...个元素分别进行插入排序 //即:第二组的第一个元素与第一组的第一个元素进行插入排序,第三组的第一个元素与第一二组的第一个元素进行插入排序... // 第二组的第二个元素与第一组的第二个元素进行插入排序,第三组的第二个元素与第一二组的第二个元素进行插入排序... // ... for (int i = x + inc; i < src.length; i += inc) { tmp = src[i]; int j = i - inc; for (; j >= 0 && tmp < src[j]; j-=inc) { src[j + inc] = src[j]; } src[j + inc] = tmp; } } //不必担心增量为1时会完全等同于普通的直接插入排序,进而造成性能问题 //原因:在排序过程中匹配时遵循"小者胜,大者让"的原则,因此在搜索头进行回顾匹配时,会很快(1~2个元素左右)碰上不久前刚刚打败过自己的对手. if(inc == 1){ break; } }}##3.简单选择排序基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。/** * 简单选择排序(从小到大) * @param src */public void select_sort(int[] src){ int pos,tmp,j; //定义最小值索引,最小值缓存,最小值检索起点索引 //在每个i位置放入合适的值:i==0时放最小值;i==1时放第二小的值... for (int i = 0; i < src.length; i++) { //假定i位置的值就是合适的值 tmp = src...

排序 一共1条数据

八种排序
##1.直接插入排序基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。/** * 形象描述:踢馆 * 直接插入排序(从小到大) * @param src 待排序的数组 */public void straight_insertion_sort(int[] src){ int tmp; for (int i = 0; i < src.length; i++) { tmp = src[i]; int j = i - 1; //向前匹配,凡是比自己大的都往后移一位,碰到不比自己大的直接跳出 for (; j >= 0 && tmp<src[j] ; j--) { src[j+1] = src[j]; } //j-1位置匹配失败,在后一位插入 src[j+1] = tmp; }}##2.希尔排序(缩小增量排序)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中相同位置的元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,再对每组中相同位置的元素进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。/** * 希尔排序(缩小增量排序)(从小到大) * @param src */public void shell_sort(int[] src){ int inc = src.length; int tmp; while(true){ inc = (int)Math.ceil(inc/2);//增量,亦即每组长度 //遍历每组进行排序的元素索引,具体看内部注释 for (int x = 0; x < inc; x++) { //以下内容即插入排序,但是搜索头步进inc,回顾时步退inc //这是一个模拟,可以想象为:将src分组,每组长度为inc,然后对每组的第0,1,2,3...个元素分别进行插入排序 //即:第二组的第一个元素与第一组的第一个元素进行插入排序,第三组的第一个元素与第一二组的第一个元素进行插入排序... // 第二组的第二个元素与第一组的第二个元素进行插入排序,第三组的第二个元素与第一二组的第二个元素进行插入排序... // ... for (int i = x + inc; i < src.length; i += inc) { tmp = src[i]; int j = i - inc; for (; j >= 0 && tmp < src[j]; j-=inc) { src[j + inc] = src[j]; } src[j + inc] = tmp; } } //不必担心增量为1时会完全等同于普通的直接插入排序,进而造成性能问题 //原因:在排序过程中匹配时遵循"小者胜,大者让"的原则,因此在搜索头进行回顾匹配时,会很快(1~2个元素左右)碰上不久前刚刚打败过自己的对手. if(inc == 1){ break; } }}##3.简单选择排序基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。/** * 简单选择排序(从小到大) * @param src */public void select_sort(int[] src){ int pos,tmp,j; //定义最小值索引,最小值缓存,最小值检索起点索引 //在每个i位置放入合适的值:i==0时放最小值;i==1时放第二小的值... for (int i = 0; i < src.length; i++) { //假定i位置的值就是合适的值 tmp = src...

Concurrent 一共1条数据

Java Concurrent

线程拥有通过程序运行的独立的并发路径,并且每个线程都有自己的程序计数器,称为堆栈和本地变量。线程存在于进程中,它们与同一进程内的其他线程共享内存、文件句柄以及进程状态。

新特性 一共1条数据

Java8 新特性
#1 语言新特性##1.1 Lambda自动推测形参类型eArrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );指定形参类型eArrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );方法体可以用{}包裹Arrays.asList( "a", "b", "d" ).forEach( e -> { System.out.print( e ); System.out.print( e );} );effectively final,lambda引用的对象会自动转为finalString separator = ",";Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.print( e + separator ) );##1.2 FunctionalInterface函数接口就是只具有一个方法的普通接口,这样的接口,可以被隐式转换为lambda表达式,然而,一旦在此接口中增加了方法,它将不再是函数接口,使用lambda时也将编译失败。@FunctionalInterface注解可以约束接口的行为,默认方法与静态方法不会影响函数接口@FunctionalInterfacepublic interface Functional { void method();}##1.3 接口默认方法public interface Defaulable { // Interfaces now allow default methods, the implementer may or // may not implement (override) them. default String notRequired() { return "Default implementation"; } }public class DefaultableImpl implements Defaulable {} public class OverridableImpl implements Defaulable { @Override public String notRequired() { return "Overridden implementation"; }}##1.4 接口静态方法private interface DefaulableFactory { // Interfaces now allow static methods static Defaulable create( Supplier< Defaulable > supplier ) { return supplier.get(); }}##1.5 方法引用可以将类中既有 方法引用为lambdapublic static class Car { public static Car create( final Supplier< Car > supplier ) { return supplier.get(); } public static void collide( final Car car ) { System.out.println( "Collided " + car.toString() ); } public void repair() { System.out.println( "Repaired " + this.toString() ); } public void follow( final Car another ) { System.out.println( "Following the " + another.toString() ); }}①构造器引用,语法为 Class::new,效果如同 () -> new Class()Car car = Car.create( Car::new );final List< Car > cars = Arrays.asList...

WebService 一共1条数据

WebService
WSDLdefinitions 为根节点,属性为 name:WS 名称,默认为“实现类 + Service” targetNamespace:WS 目标命名空间,默认为“WS 实现类对应包名倒排后构成的地址”definitions的5个子节点 types:描述了 WS 中所涉及的数据类型 portType:定义了 WS 接口名称portType.name(endpointInterface默认为“WS 实现类所实现的接口”),及其操作名称,以及每个操作的输入与输出消息 message:对相关消息进行了定义(供 types 与 portType 使用) binding:提供了对 WS 的数据绑定方式 service:WS 名称及其端口名称service_port.name(portName默认为“WS 实现类 + Port”),以及对应的 WSDL 地址SOAPheaderbody#一、产品soap风格 (JAX-WS规范JSR-224)JAX-WS RI:https://jax-ws.java.net/ Oracle 官方提供的实现Axis:http://axis.apache.org/CXF:http://cxf.apache.org/rest风格 (JAX-RS规范JSR-339)Jersey:https://jersey.java.net/ Oracle 官方提供的实现Restlet:http://restlet.com/RESTEasy:http://resteasy.jboss.org/CXF:http://cxf.apache.org/#二、JDK发布与调用##1.发布###定义接口//此注解必须@WebServicepublic interface HelloService { String say();}###实现接口@WebService(serviceName = "HelloService", portName = "HelloServicePort", endpointInterface = "org.sllx.practice.jdkws.HelloService")public class HelloServiceImpl implements HelloService { @Override public String say() { return "helloWorld"; }}###发布服务public class Server { public static void main(String[] args){ String address = "http://localhost:8081/ws/soap/hello"; HelloService helloService = new HelloServiceImpl(); Endpoint.publish(address, helloService); System.out.println("ws is published [" + address + "?wsdl]"); }}访问http://localhost:8081/ws/soap/hello?wsdl即可查看详情##2.调用###静态客户端wsimport http://localhost:8080/ws/soap/hello?wsdl//通过 WSDL 地址生成 class 文件jar -cf client.jar . //通过 jar 命令将若干 class 文件压缩为一个 jar 包rmdir /s/q demo //删除生成的 class 文件(删除根目录即可)public static void main(String[] args){ HelloService_Service hss = new HelloService_Service(); HelloService hs = hss.getHelloServicePort(); System.out.println(hs.say());}###动态代理客户端只需提供HelloService接口,无需jarpublic static void main(String[] args){ try { URL wsdl = new URL("http://localhost:8081/ws/soap/hello?wsdl"); QName serviceName = new QName("http://j...

closure 一共1条数据

JS 闭包

在JS中,当内部的方法被其他对象引用,如果内部的方法使用了外部方法的变量,将造成外部方法无法释放,变量将被保持,此时将形成闭包。

javascript 一共13条数据

javascript 脚手架制作

** 通用脚手架 **

本脚手架主要方便个人开发,常用的项目脚手架个模板自己封装便于使用,在企业中节约重复造轮子的时间, 包含VUE脚手架常用的插件功能,其实就是提升复用率,目前完成了VUE3的PC端模版

npm i manix-sun-cli
manix-sun-cli create <project name>
根据需求选择即可
  1. vue3 PC端后台模板
  2. vue2 PC端后台模板
  3. vue3 移动端模板
  4. vue2 移动端模板
  5. 微信小程序模板
javascript webpack配置

1.前端模块化打包初识 commonjs语法形式

> user.js
const login = function(formData){
  console.log("logoing")
  return {}
}
const register = function(formData){
  console.log("register")
}
module.exports = {
  login:login,
  register:register
}
>login_index.js  引入
const user =require('./user.js')
const resp = user.login({})
javascript开启网页录制功能ES6语法 async
var body = document.body;    
body.addEventListener("click",async function(){        
    var stream = await navigator.mediaDevices.getDisplayMedia({video: true});         
    var mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9") ?"video/webm; codecs=vp9" :"video/webm";        
    var mediaRecorder = new MediaRecorder(stream, {mimeType: mime});         
    //录制        
     var chunks = [];        
      mediaRecorder.addEventListener('dataavailable', function(e) {chunks.push(e.data)})         
       //停止        
       mediaRecorder.addEventListener('stop', function(){            
           var blob = new Blob(chunks, {type: chunks[0].type});            
           var url = URL.createObjectURL(blob);            
           var a = document.createElement('a');            
           a.href = url;            
           a.download = 'video.webm';            
           a.click();       
       })       
    //手动启动       
    mediaRecorder.start()   
});
javascript ES6重点语法记录

** 常用的API *** 一、下面是 Proxy 支持的拦截操作一览,一共 13 种。 ``` get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy[‘foo’]。 set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = v或proxy[‘foo’] = v,返回一个布尔值。 has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值。 deleteProperty(target, propKey):拦截delete proxy[propKey]的操作,返回一个布尔值。 ownKeys(target):拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、for…in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。 getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。 defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc)、Object.defineProperties(proxy, propDescs),返回一个布尔值。 preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值。 getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象。 isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值。 setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。 apply(target, object, args):拦截 Proxy 实例作为函数调用的操作,比如proxy(…args)、proxy.call(object, …args)、proxy.apply(…)。 construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(…args)。

javascript vue3 props 验证属性

HTML、CSS相关 HTML5 HTML5新特性 增强了表单,input新增了一些type: color—-定义调色板 tel—–定义包含电话号码的输入域 email—定义包含email地址的输入域 search–定义搜索域 number–定义包含数值的输入域 date—-定义选取日、月、年的输入域 Video视频标签; Audio音频标签; 语义化标签;datatime-local 定义文档类型的简写 地理定位;拖放api;Canvas图形绘制;富文本Web Storage:localStorage:没有时间限制的数据存储;sessionStorage:在浏览器关闭的时候就会清除

javascript webpack经常用的插件包

一、 ** webpack安装配置 ,纯手动,官网提供了脚本这里不做介绍**

  1. npm install nodemon -g nodemon可以替代node 来观察代码更改并自动 启动关闭程序 全局安装即可, 后续使用命令nodemon server.is 替代 npde server.js
javascript lodashjs常见对象的所有操作

* 简单介绍 *** Lodash 能够大幅度提高前端 JavaScript 编程的效率和可读性,使得代码编写更加快捷、简洁、易懂。如果你还没有使用过 Lodash,建议尝试使用它来优化你的项目,提高开发效率。向大家介绍或简单的展示一下它的能力,或许能够吸引到你。Lodash 是一个流行的 JavaScript 实用工具库,提供了许多常用的函数和工具,能够方便地处理集合、字符串、数值、函数等多种数据类型,减少编写重复代码的时间和精力。Lodash 的 API 设计与 ES6 的新特性相似,同时兼容了更早的浏览器版本。Lodash 支持模块化加载,可以通过 npm 或在浏览器中直接引入来使用。 Lodash 有多达 300 多个函数,每个函数都有详细的文档和示例,能够快速地满足各种编程需求。同时,Lodash 的功能也非常完善,比如数组、对象等的操作,以及日期、数学计算、函数式编程等多方面支持。Lodash 还提供了链式调用的方式,简化操作的流程。 *** npm install lodash **

JS 闭包

在JS中,当内部的方法被其他对象引用,如果内部的方法使用了外部方法的变量,将造成外部方法无法释放,变量将被保持,此时将形成闭包。

ajax 一共1条数据

ES5 一共1条数据

sql 一共1条数据

database 一共1条数据

ScriptEngineManager 一共1条数据

Bean 一共1条数据

Validation 一共1条数据

spring 一共1条数据

spring security 探秘
概述Spring Security这是一种基于Spring AOP和Servlet过滤器的安全框架。它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权。在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术。 概述 Filter HTTP FilterChain FilterSecurityInterceptor AuthenticationManager AccessDecisionManager SecurityMetadataSource本文的宗旨并非描述如何从零开始搭建一个 “hello world” 级的demo,或者列举有哪些可配置项(这种类似于词典的文档,没有比参考书更合适的了),而是简单描述spring-security项目的整体结构,设计思想,以及某些重要配置做了什么。本文所有内容基于spring-security-4.0.1.RELEASE ,你可以在Github中找到它,或者使用Maven获取,引入spring-security-config是为了通过命名空间简化配置。<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>4.0.1.RELEASE</version></dependency><dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>4.0.1.RELEASE</version></dependency>Filterspring-security的业务流程是独立于项目的,我们需要在web.xml中指定其入口,注意该过滤器必须在项目的过滤器之前。<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <servlet-name>/*</servlet-name></filter-mapping>值得一提的是,该过滤器的名字具有特殊意义,没有特别需求不建议修改,我们可以在该过滤的源码中看到,其过滤行为委托给了一个delegate对象,该delegate对象是一个从spring容器中获取的bean,依据的beanid就是filter-name。@Overrideprotected void initFilterBean() throws ServletException { synchronized (this.delegateMonitor) { if (this.delegate == null) { if (this.targetBeanName == null) { this.targetBeanName = getFilterName(); } WebApplicationContext wac = findWebApplicationContext(); if (wac != null) { this.delegate = initDelegate(wac); } } }}HTTP我们可以在security中声明多个http元素,每个http元素将产生一个FilterChain,这些FilterChain将按照声明顺序加入到FilterChainProxy中,而这个FilterChainProxy就是web.xml中定义的springSecurityFilterChain内部的deleg...

security 一共1条数据

spring security 探秘
概述Spring Security这是一种基于Spring AOP和Servlet过滤器的安全框架。它提供全面的安全性解决方案,同时在Web请求级和方法调用级处理身份确认和授权。在Spring Framework基础上,Spring Security充分利用了依赖注入(DI,Dependency Injection)和面向切面技术。 概述 Filter HTTP FilterChain FilterSecurityInterceptor AuthenticationManager AccessDecisionManager SecurityMetadataSource本文的宗旨并非描述如何从零开始搭建一个 “hello world” 级的demo,或者列举有哪些可配置项(这种类似于词典的文档,没有比参考书更合适的了),而是简单描述spring-security项目的整体结构,设计思想,以及某些重要配置做了什么。本文所有内容基于spring-security-4.0.1.RELEASE ,你可以在Github中找到它,或者使用Maven获取,引入spring-security-config是为了通过命名空间简化配置。<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>4.0.1.RELEASE</version></dependency><dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>4.0.1.RELEASE</version></dependency>Filterspring-security的业务流程是独立于项目的,我们需要在web.xml中指定其入口,注意该过滤器必须在项目的过滤器之前。<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <servlet-name>/*</servlet-name></filter-mapping>值得一提的是,该过滤器的名字具有特殊意义,没有特别需求不建议修改,我们可以在该过滤的源码中看到,其过滤行为委托给了一个delegate对象,该delegate对象是一个从spring容器中获取的bean,依据的beanid就是filter-name。@Overrideprotected void initFilterBean() throws ServletException { synchronized (this.delegateMonitor) { if (this.delegate == null) { if (this.targetBeanName == null) { this.targetBeanName = getFilterName(); } WebApplicationContext wac = findWebApplicationContext(); if (wac != null) { this.delegate = initDelegate(wac); } } }}HTTP我们可以在security中声明多个http元素,每个http元素将产生一个FilterChain,这些FilterChain将按照声明顺序加入到FilterChainProxy中,而这个FilterChainProxy就是web.xml中定义的springSecurityFilterChain内部的deleg...

servlet 一共1条数据

Servlet乱码分析

我们知道,web浏览器会将form中的内容打包成HTTP请求体,然后发送到服务端,服务端对请求体解析后可以得到传递的数据。这当中包含两个过程:encodedecode

encode 一共1条数据

Servlet乱码分析

我们知道,web浏览器会将form中的内容打包成HTTP请求体,然后发送到服务端,服务端对请求体解析后可以得到传递的数据。这当中包含两个过程:encodedecode

rmi 一共1条数据

RMI

Java RMI 指的是远程方法调用 (Remote Method Invocation)。RMI能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法, 其威力体现在它强大的开发分布式网络应用的能力上,它可以被看作是RPC的Java版本。

design 一共1条数据

基础知识-设计模式与原则

设计模式的定义:在某情境下,针对某问题的某种解决方案。但是满足此定义的方案并不一定是设计模式,设计模式要求解决方案必须是可复用的。 设计模式的作用大体上是:优化结构,消除依赖,将面向过程转为面向对象。按照功能,一般可以将设计模式分为创建型行为型结构型三大类。 本文将列举这些设计模式,并对每个设计模式进行简要描述,描述格式为:名称,定义,案例,适用性,结构,效果,应用,相关。

pattern 一共1条数据

基础知识-设计模式与原则

设计模式的定义:在某情境下,针对某问题的某种解决方案。但是满足此定义的方案并不一定是设计模式,设计模式要求解决方案必须是可复用的。 设计模式的作用大体上是:优化结构,消除依赖,将面向过程转为面向对象。按照功能,一般可以将设计模式分为创建型行为型结构型三大类。 本文将列举这些设计模式,并对每个设计模式进行简要描述,描述格式为:名称,定义,案例,适用性,结构,效果,应用,相关。

设计模式 一共1条数据

基础知识-设计模式与原则

设计模式的定义:在某情境下,针对某问题的某种解决方案。但是满足此定义的方案并不一定是设计模式,设计模式要求解决方案必须是可复用的。 设计模式的作用大体上是:优化结构,消除依赖,将面向过程转为面向对象。按照功能,一般可以将设计模式分为创建型行为型结构型三大类。 本文将列举这些设计模式,并对每个设计模式进行简要描述,描述格式为:名称,定义,案例,适用性,结构,效果,应用,相关。

原则 一共1条数据

基础知识-设计模式与原则

设计模式的定义:在某情境下,针对某问题的某种解决方案。但是满足此定义的方案并不一定是设计模式,设计模式要求解决方案必须是可复用的。 设计模式的作用大体上是:优化结构,消除依赖,将面向过程转为面向对象。按照功能,一般可以将设计模式分为创建型行为型结构型三大类。 本文将列举这些设计模式,并对每个设计模式进行简要描述,描述格式为:名称,定义,案例,适用性,结构,效果,应用,相关。

面向对象 一共1条数据

基础知识-设计模式与原则

设计模式的定义:在某情境下,针对某问题的某种解决方案。但是满足此定义的方案并不一定是设计模式,设计模式要求解决方案必须是可复用的。 设计模式的作用大体上是:优化结构,消除依赖,将面向过程转为面向对象。按照功能,一般可以将设计模式分为创建型行为型结构型三大类。 本文将列举这些设计模式,并对每个设计模式进行简要描述,描述格式为:名称,定义,案例,适用性,结构,效果,应用,相关。

node 一共1条数据

npmpackage 一共1条数据

web 一共1条数据

vue3 一共3条数据

vue常用的知识点
  1. ** 如何检测对象变化? ** 由于 JavaScript特性的限制,Vue.js不能检测到对象属性的添加或删除。因为Vue.js在初始化时将属性转化为 getter/setter,所以属性必须在data对象中定义,才能在初始化时让Vue.js转换它并让它响应,例如以下代码

pinia 一共1条数据

vue插件 一共1条数据

web播放器 一共1条数据

window 一共1条数据

windows下将服务文件一键打包成应用程序自动执行

在这个容器化包管理时代,前端打包工具等满天飞的时代想必你也会比较感兴趣这个话题(Webpack,Rollup,RequireJS,browserify)

很多小伙伴估计都没有听说过这个名词,打包工具其实就是将做好的程序用用户可以看到的方式制作成一个对应操作系统下的可执行应用,Windows下面必然就是打包成 .exe为后缀的,说起来高大上,其实就是一个难者亦易的事情,具体你看我怎么操作的就知道的

打包 一共1条数据

windows下将服务文件一键打包成应用程序自动执行

在这个容器化包管理时代,前端打包工具等满天飞的时代想必你也会比较感兴趣这个话题(Webpack,Rollup,RequireJS,browserify)

很多小伙伴估计都没有听说过这个名词,打包工具其实就是将做好的程序用用户可以看到的方式制作成一个对应操作系统下的可执行应用,Windows下面必然就是打包成 .exe为后缀的,说起来高大上,其实就是一个难者亦易的事情,具体你看我怎么操作的就知道的

InnoSetup 一共1条数据

windows下将服务文件一键打包成应用程序自动执行

在这个容器化包管理时代,前端打包工具等满天飞的时代想必你也会比较感兴趣这个话题(Webpack,Rollup,RequireJS,browserify)

很多小伙伴估计都没有听说过这个名词,打包工具其实就是将做好的程序用用户可以看到的方式制作成一个对应操作系统下的可执行应用,Windows下面必然就是打包成 .exe为后缀的,说起来高大上,其实就是一个难者亦易的事情,具体你看我怎么操作的就知道的

ES6 一共10条数据

javascript 脚手架制作

** 通用脚手架 **

本脚手架主要方便个人开发,常用的项目脚手架个模板自己封装便于使用,在企业中节约重复造轮子的时间, 包含VUE脚手架常用的插件功能,其实就是提升复用率,目前完成了VUE3的PC端模版

npm i manix-sun-cli
manix-sun-cli create <project name>
根据需求选择即可
  1. vue3 PC端后台模板
  2. vue2 PC端后台模板
  3. vue3 移动端模板
  4. vue2 移动端模板
  5. 微信小程序模板
javascript webpack配置

1.前端模块化打包初识 commonjs语法形式

> user.js
const login = function(formData){
  console.log("logoing")
  return {}
}
const register = function(formData){
  console.log("register")
}
module.exports = {
  login:login,
  register:register
}
>login_index.js  引入
const user =require('./user.js')
const resp = user.login({})
javascript开启网页录制功能ES6语法 async
var body = document.body;    
body.addEventListener("click",async function(){        
    var stream = await navigator.mediaDevices.getDisplayMedia({video: true});         
    var mime = MediaRecorder.isTypeSupported("video/webm; codecs=vp9") ?"video/webm; codecs=vp9" :"video/webm";        
    var mediaRecorder = new MediaRecorder(stream, {mimeType: mime});         
    //录制        
     var chunks = [];        
      mediaRecorder.addEventListener('dataavailable', function(e) {chunks.push(e.data)})         
       //停止        
       mediaRecorder.addEventListener('stop', function(){            
           var blob = new Blob(chunks, {type: chunks[0].type});            
           var url = URL.createObjectURL(blob);            
           var a = document.createElement('a');            
           a.href = url;            
           a.download = 'video.webm';            
           a.click();       
       })       
    //手动启动       
    mediaRecorder.start()   
});
javascript ES6重点语法记录

** 常用的API *** 一、下面是 Proxy 支持的拦截操作一览,一共 13 种。 ``` get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy[‘foo’]。 set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = v或proxy[‘foo’] = v,返回一个布尔值。 has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值。 deleteProperty(target, propKey):拦截delete proxy[propKey]的操作,返回一个布尔值。 ownKeys(target):拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)、for…in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。 getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。 defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc)、Object.defineProperties(proxy, propDescs),返回一个布尔值。 preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值。 getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象。 isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值。 setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。 apply(target, object, args):拦截 Proxy 实例作为函数调用的操作,比如proxy(…args)、proxy.call(object, …args)、proxy.apply(…)。 construct(target, args):拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(…args)。

javascript vue3 props 验证属性

HTML、CSS相关 HTML5 HTML5新特性 增强了表单,input新增了一些type: color—-定义调色板 tel—–定义包含电话号码的输入域 email—定义包含email地址的输入域 search–定义搜索域 number–定义包含数值的输入域 date—-定义选取日、月、年的输入域 Video视频标签; Audio音频标签; 语义化标签;datatime-local 定义文档类型的简写 地理定位;拖放api;Canvas图形绘制;富文本Web Storage:localStorage:没有时间限制的数据存储;sessionStorage:在浏览器关闭的时候就会清除

javascript webpack经常用的插件包

一、 ** webpack安装配置 ,纯手动,官网提供了脚本这里不做介绍**

  1. npm install nodemon -g nodemon可以替代node 来观察代码更改并自动 启动关闭程序 全局安装即可, 后续使用命令nodemon server.is 替代 npde server.js
javascript lodashjs常见对象的所有操作

* 简单介绍 *** Lodash 能够大幅度提高前端 JavaScript 编程的效率和可读性,使得代码编写更加快捷、简洁、易懂。如果你还没有使用过 Lodash,建议尝试使用它来优化你的项目,提高开发效率。向大家介绍或简单的展示一下它的能力,或许能够吸引到你。Lodash 是一个流行的 JavaScript 实用工具库,提供了许多常用的函数和工具,能够方便地处理集合、字符串、数值、函数等多种数据类型,减少编写重复代码的时间和精力。Lodash 的 API 设计与 ES6 的新特性相似,同时兼容了更早的浏览器版本。Lodash 支持模块化加载,可以通过 npm 或在浏览器中直接引入来使用。 Lodash 有多达 300 多个函数,每个函数都有详细的文档和示例,能够快速地满足各种编程需求。同时,Lodash 的功能也非常完善,比如数组、对象等的操作,以及日期、数学计算、函数式编程等多方面支持。Lodash 还提供了链式调用的方式,简化操作的流程。 *** npm install lodash **

lodash 一共1条数据

javascript lodashjs常见对象的所有操作

* 简单介绍 *** Lodash 能够大幅度提高前端 JavaScript 编程的效率和可读性,使得代码编写更加快捷、简洁、易懂。如果你还没有使用过 Lodash,建议尝试使用它来优化你的项目,提高开发效率。向大家介绍或简单的展示一下它的能力,或许能够吸引到你。Lodash 是一个流行的 JavaScript 实用工具库,提供了许多常用的函数和工具,能够方便地处理集合、字符串、数值、函数等多种数据类型,减少编写重复代码的时间和精力。Lodash 的 API 设计与 ES6 的新特性相似,同时兼容了更早的浏览器版本。Lodash 支持模块化加载,可以通过 npm 或在浏览器中直接引入来使用。 Lodash 有多达 300 多个函数,每个函数都有详细的文档和示例,能够快速地满足各种编程需求。同时,Lodash 的功能也非常完善,比如数组、对象等的操作,以及日期、数学计算、函数式编程等多方面支持。Lodash 还提供了链式调用的方式,简化操作的流程。 *** npm install lodash **

css 一共1条数据

javascript css3常用属性

CSS允许文本内容换行显示的方法有: 1.使用white-space属性:white-space属性可以控制文本内容的换行显示, 它有三个值,分别是normal、nowrap和pre,normal表示换行显示,nowrap表示不换行显示,pre表示按照原始格式显示,也就是按照原始文本中的换行符进行换行显示。 2.使用word-wrap属性:word-wrap属性可以控制文本内容的换行显示, 它有两个值,分别是normal和break-word,normal表示按照原始文本中的换行符进行换行显示,break-word表示在文本内容超出容器宽度时,会自动换行显示。 3.使用word-break属性:word-break属性可以控制文本内容的换行显示,它有三个值, 分别是normal、break-all和keep-all,normal表示按照原始文本中的换行符进行换行显示,break-all表示在文本内容超出容器宽度时,会自动换行显示,keep-all表示在文本内容超出容器宽度时,会自动换行显示,但是会保留单词的完整性。

css3 一共1条数据

javascript css3常用属性

CSS允许文本内容换行显示的方法有: 1.使用white-space属性:white-space属性可以控制文本内容的换行显示, 它有三个值,分别是normal、nowrap和pre,normal表示换行显示,nowrap表示不换行显示,pre表示按照原始格式显示,也就是按照原始文本中的换行符进行换行显示。 2.使用word-wrap属性:word-wrap属性可以控制文本内容的换行显示, 它有两个值,分别是normal和break-word,normal表示按照原始文本中的换行符进行换行显示,break-word表示在文本内容超出容器宽度时,会自动换行显示。 3.使用word-break属性:word-break属性可以控制文本内容的换行显示,它有三个值, 分别是normal、break-all和keep-all,normal表示按照原始文本中的换行符进行换行显示,break-all表示在文本内容超出容器宽度时,会自动换行显示,keep-all表示在文本内容超出容器宽度时,会自动换行显示,但是会保留单词的完整性。

props 一共2条数据

javascript vue3 props 验证属性

HTML、CSS相关 HTML5 HTML5新特性 增强了表单,input新增了一些type: color—-定义调色板 tel—–定义包含电话号码的输入域 email—定义包含email地址的输入域 search–定义搜索域 number–定义包含数值的输入域 date—-定义选取日、月、年的输入域 Video视频标签; Audio音频标签; 语义化标签;datatime-local 定义文档类型的简写 地理定位;拖放api;Canvas图形绘制;富文本Web Storage:localStorage:没有时间限制的数据存储;sessionStorage:在浏览器关闭的时候就会清除

vite 一共1条数据

jekyll 一共1条数据

elementplus 一共1条数据

git-pages 一共1条数据

blog 一共1条数据

免费博客 一共1条数据

Mardown语法 一共1条数据

编辑器 一共1条数据

github 一共3条数据

Jekyll Vue3免费博客制作

起因 其实近两年使用VUE场景多起来了我就想着把手上的项目都使用Vue重构一下,这样一看,我算是一个完美主义者吧,哈哈^__^ 这个项目其实也是之前的老项目基于ryby jekyll Liquid 模板解析的一个静态博客,其实经历还挺久的这个项目,应该16年我大学那会就翻墙弄的,后面因为兴趣爱好问题,静态博客无法满足自己的需求,其实有部分也在于之前精力有限,没有一直去定制所谓的模板,其实前端还是比较重要的,直接很大程度影响用户体验,所以深感前端重要性,也是打算把这个博客简单重构一下,奈何本人文化有限和能力有限,缺乏一个审美到位的UI合伙人,我的博客就一直搁浅,最近也是逼了自己一把,过年这几天就在家写了下,自己抄,哦,还是说借鉴了一部分网站的样式主题简单定制了下,其实这不是最关键的,关键的是你现在可以直接访问我的博客简单看看效果,下面是我简单重构的记录

远程秘钥 一共1条数据

Jekyll 一共2条数据

Jekyll Vue3免费博客制作

起因 其实近两年使用VUE场景多起来了我就想着把手上的项目都使用Vue重构一下,这样一看,我算是一个完美主义者吧,哈哈^__^ 这个项目其实也是之前的老项目基于ryby jekyll Liquid 模板解析的一个静态博客,其实经历还挺久的这个项目,应该16年我大学那会就翻墙弄的,后面因为兴趣爱好问题,静态博客无法满足自己的需求,其实有部分也在于之前精力有限,没有一直去定制所谓的模板,其实前端还是比较重要的,直接很大程度影响用户体验,所以深感前端重要性,也是打算把这个博客简单重构一下,奈何本人文化有限和能力有限,缺乏一个审美到位的UI合伙人,我的博客就一直搁浅,最近也是逼了自己一把,过年这几天就在家写了下,自己抄,哦,还是说借鉴了一部分网站的样式主题简单定制了下,其实这不是最关键的,关键的是你现在可以直接访问我的博客简单看看效果,下面是我简单重构的记录

免费建站 一共2条数据

Jekyll Vue3免费博客制作

起因 其实近两年使用VUE场景多起来了我就想着把手上的项目都使用Vue重构一下,这样一看,我算是一个完美主义者吧,哈哈^__^ 这个项目其实也是之前的老项目基于ryby jekyll Liquid 模板解析的一个静态博客,其实经历还挺久的这个项目,应该16年我大学那会就翻墙弄的,后面因为兴趣爱好问题,静态博客无法满足自己的需求,其实有部分也在于之前精力有限,没有一直去定制所谓的模板,其实前端还是比较重要的,直接很大程度影响用户体验,所以深感前端重要性,也是打算把这个博客简单重构一下,奈何本人文化有限和能力有限,缺乏一个审美到位的UI合伙人,我的博客就一直搁浅,最近也是逼了自己一把,过年这几天就在家写了下,自己抄,哦,还是说借鉴了一部分网站的样式主题简单定制了下,其实这不是最关键的,关键的是你现在可以直接访问我的博客简单看看效果,下面是我简单重构的记录

新手建站 一共2条数据

Jekyll Vue3免费博客制作

起因 其实近两年使用VUE场景多起来了我就想着把手上的项目都使用Vue重构一下,这样一看,我算是一个完美主义者吧,哈哈^__^ 这个项目其实也是之前的老项目基于ryby jekyll Liquid 模板解析的一个静态博客,其实经历还挺久的这个项目,应该16年我大学那会就翻墙弄的,后面因为兴趣爱好问题,静态博客无法满足自己的需求,其实有部分也在于之前精力有限,没有一直去定制所谓的模板,其实前端还是比较重要的,直接很大程度影响用户体验,所以深感前端重要性,也是打算把这个博客简单重构一下,奈何本人文化有限和能力有限,缺乏一个审美到位的UI合伙人,我的博客就一直搁浅,最近也是逼了自己一把,过年这几天就在家写了下,自己抄,哦,还是说借鉴了一部分网站的样式主题简单定制了下,其实这不是最关键的,关键的是你现在可以直接访问我的博客简单看看效果,下面是我简单重构的记录

VUE 一共2条数据

Jekyll Vue3免费博客制作

起因 其实近两年使用VUE场景多起来了我就想着把手上的项目都使用Vue重构一下,这样一看,我算是一个完美主义者吧,哈哈^__^ 这个项目其实也是之前的老项目基于ryby jekyll Liquid 模板解析的一个静态博客,其实经历还挺久的这个项目,应该16年我大学那会就翻墙弄的,后面因为兴趣爱好问题,静态博客无法满足自己的需求,其实有部分也在于之前精力有限,没有一直去定制所谓的模板,其实前端还是比较重要的,直接很大程度影响用户体验,所以深感前端重要性,也是打算把这个博客简单重构一下,奈何本人文化有限和能力有限,缺乏一个审美到位的UI合伙人,我的博客就一直搁浅,最近也是逼了自己一把,过年这几天就在家写了下,自己抄,哦,还是说借鉴了一部分网站的样式主题简单定制了下,其实这不是最关键的,关键的是你现在可以直接访问我的博客简单看看效果,下面是我简单重构的记录

面试 一共1条数据

vue常用的知识点
  1. ** 如何检测对象变化? ** 由于 JavaScript特性的限制,Vue.js不能检测到对象属性的添加或删除。因为Vue.js在初始化时将属性转化为 getter/setter,所以属性必须在data对象中定义,才能在初始化时让Vue.js转换它并让它响应,例如以下代码

webpack 一共3条数据

javascript 脚手架制作

** 通用脚手架 **

本脚手架主要方便个人开发,常用的项目脚手架个模板自己封装便于使用,在企业中节约重复造轮子的时间, 包含VUE脚手架常用的插件功能,其实就是提升复用率,目前完成了VUE3的PC端模版

npm i manix-sun-cli
manix-sun-cli create <project name>
根据需求选择即可
  1. vue3 PC端后台模板
  2. vue2 PC端后台模板
  3. vue3 移动端模板
  4. vue2 移动端模板
  5. 微信小程序模板
javascript webpack配置

1.前端模块化打包初识 commonjs语法形式

> user.js
const login = function(formData){
  console.log("logoing")
  return {}
}
const register = function(formData){
  console.log("register")
}
module.exports = {
  login:login,
  register:register
}
>login_index.js  引入
const user =require('./user.js')
const resp = user.login({})

代码压缩 一共2条数据

javascript webpack配置

1.前端模块化打包初识 commonjs语法形式

> user.js
const login = function(formData){
  console.log("logoing")
  return {}
}
const register = function(formData){
  console.log("register")
}
module.exports = {
  login:login,
  register:register
}
>login_index.js  引入
const user =require('./user.js')
const resp = user.login({})

java 一共1条数据

免费激活Idea的热部署插件JRebel,解决连接失败报错,提供下载地址
免费激活Idea之热部署插件JRebel,解决连接失败报错

JRebel是一个实用的插件,它可以让你在不重启服务器的情况下,修改Java程序并即时生效。相信大家都有这样的经历:每次修改代码后都需要重新编译、打包、部署,然后重启服务器,这个过程非常耗时且繁琐。但是,如果你使用了JRebel,你就可以摆脱这些烦恼,轻松享受修改代码后立即生效的快感!

脚手架 一共1条数据

javascript 脚手架制作

** 通用脚手架 **

本脚手架主要方便个人开发,常用的项目脚手架个模板自己封装便于使用,在企业中节约重复造轮子的时间, 包含VUE脚手架常用的插件功能,其实就是提升复用率,目前完成了VUE3的PC端模版

npm i manix-sun-cli
manix-sun-cli create <project name>
根据需求选择即可
  1. vue3 PC端后台模板
  2. vue2 PC端后台模板
  3. vue3 移动端模板
  4. vue2 移动端模板
  5. 微信小程序模板