首页 文章 精选 留言 我的

精选列表

搜索[个人博客],共10000篇文章
优秀的个人博客,低调大师

教你搭建个人/企业私有云盘-kodexplorer

环境说明: 系统版本:CentOS 6.9 x86_64 软件版本:nginx-1.12.2php-5.5.38 可道云kodexplorer4.37 1、nginx的编译安装 1.1 创建目录mkdir -p /service/toolsmkdir /applicationcd /service/toolswget http://nginx.org/download/nginx-1.12.2.tar.gz 下载或者上传nginx包 1.2 解压tar zxvf nginx-1.12.2.tar.gz 1.3 编译安装yum install gcc gcc-c++ glibc -y #安装编译器yum install pcre-devel zlib-devel openssl-devel –y 装pcre为了重写rewrite提供正则表达式库,装zlib为了gzip提供数据压缩用的函数库,装openssl为 Nginx 模块(如 ssl )提供密码算法、证书以及 SSL 协议等功能C语言源码包,需要编译才能使用编译安装三部曲 ./configure(指定编译参数:安装目录及版本) cd nginx-1.12.2 ./configure --prefix=/application/nginx-1.12.2 --pid-path=/var/run/nginx.pid --user=nginx --group=nginx --with-http_ssl_module ./configure -help #查看帮助 生成Makefile文件makemake是用来编译的,它从Makefile中读取指令,然后编译 cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs -I src/http -I src/http/modules \ -o objs/src/http/modules/ngx_http_geo_module.o \ src/http/modules/ngx_http_geo_module.c make installmake install是用来安装的,它也从Makefile中读取指令,安装到指定的位置 [root@Web01 nginx-1.12.2]# cd /application/nginx-1.12.2/ [root@Web01 nginx1.12.2]# ls -1 conf #配置文件 html #网站html文件 logs #日志 sbin #二进制的执行文件 1.4 配置 创建软链接 ln -s /application/nginx-1.12.2 /application/nginx ln -s /application/nginx/sbin/nginx /usr/bin/ useradd -M -s /sbin/nologin -r -u 88 nginx #创建用户 -M 不创建用户的HOME目录 -s shell 指定默认登录shell -r 创建系统账户 -u uid 为账户指定一个唯一的UID conf目录 fastcgi.conf 配合php uwsgi_params 配合python nginx.conf 主配置文件 mime.types 多媒体资源类型配置文件 最小化配置文件 grep -Ev '^$|#' nginx.conf.default >nginx.conf [root@Web01 conf]# grep -Ev '^$|#' nginx.conf.default >nginx.conf [root@Web01 conf]# cat nginx.conf worker_processes 1; #工作进程数 events { #event模块 worker_connections 1024; #默认工作连接数 } http { #http模块,nginx核心模块 include mime.types; #加载的多媒体资源类型配置文件 default_type application/octet-stream; #默认类型(16进制) sendfile on; #优化配置选项 keepalive_timeout 65; #长连接超时时间65秒 server { listen 80; #默认监听的端口 server_name localhost; #网站域名 location / { #网站站点根目录位置 root html; #网站文件 index index.html index.htm; #网站首页 } error_page 500 502 503 504 /50x.html; #错误页面500,502.503.504返回50x.html location = /50x.html { root html; } } } 1.5 启动 /application/nginx/sbin/nginx –t #语法检查并测试 /application/nginx/sbin/nginx #启动 /application/nginx/sbin/nginx -s reload #平滑重启,不影响用户访问 /application/nginx/sbin/nginx -s stop #关闭 /application/nginx/sbin/nginx -V #查看版本及安装的模块 启动后会生成几个temp目录浏览器访问 编译安装Nginx完成 2、编译安装php 2.1下载并安装相关编译器mkdir -p /service/tools #创建目录 cd /service/tools/ wget http://mirrors.sohu.com/php/php-5.5.38.tar.gz #下载包 tar xf php-5.5.38.tar.gz #解压 yum install gcc gcc-c++ glibc -y #安装编译器,如果已经编译安装了nginx则不需要此步骤 yum install -y libxml2-devel curl curl-devel libjpeg-devel libpng-devel freetype-devel 安装编译时所需库 cd php-5.5.38 #进入php-5.5.38目录 2.2 编译安装编译生成makefile** ./configure --prefix=/application/php-5.5.38 --with-jpeg-dir=/usr/lib64 --with-freetype-dir=/usr/lib64/ --with-curl --enable-fpm --enable-mbstring --with-gd --with-fpm-user=nginx --with-fpm-group=nginx make && make install 3、配置 [root@Web02 php-5.5.38]# ln -s /application/php-5.5.38 /application/php #创建软链接 [root@Web02 php-5.5.38]# ln -s /application/php/bin/* /usr/bin/ #创建命令软链接 [root@Web02 php-5.5.38]# cp php.ini-production /application/php-5.5.38/etc/php.ini 拷贝默认配置文件 [root@Web02 php-5.5.38]# cp /application/php-5.5.38/etc/php-fpm.conf.default /application/php-5.5.38/etc/php-fpm.conf 拷贝默认php-fpm配置文件,php-fpm 启动进程数 4、启动 [root@Web02 php-5.5.38]# /application/php/sbin/php-fpm #启动php [root@Web02 php-5.5.38]# netstat -lntup|grep 9000 #查看进程9000端口 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 97399/php-fpm 5、配置nginx使其支持php 查看nginx.conf.default有关php的部分(65-71行),将此内容添加到nginx.conf中,并修改fastcgi_param指定script文件名documentrootdocumentrootfastcgi_script_name可以在/application/nginx/conf/fastcgi.conf查看 65 #location ~ \.php$ { 66 # root html; 67 # fastcgi_pass 127.0.0.1:9000; 68 # fastcgi_index index.php; 69 # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; 70 # include fastcgi_params; 71 #} [root@Web02 php-5.5.38]# cd /application/nginx/conf/ [root@Web02 conf]# vim nginx.conf server { listen 80; server_name localhost; index index.php index.html index.htm; location / { root html; } location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME documentrootdocumentrootfastcgi_script_name; include fastcgi_params; } } } 这个配置的意思是 在浏览器中访问的.php文件,实际读取的是 $document_root(网站根目录)下的.php文件 -- 也就是说当访问127.0.0.1/index.php的时候,需要读取网站根目录下面的index.php文件,如果没有配置这一配置项时,nginx不回去网站根目录下访问.php文件,所以返回空白 配置项目中:include fastcgi_params; fastcgi_params 文件中含有各个nginx常量的定义,默认情况 SCRIPT_FILENAME = /scripts$fastcgi_script_name检查语法nginx -t 6、配置网盘,下载解压可道云kodexplorer [root@Web02 conf]# cd ../html/ #进入到站点目录 [root@Web02 html]# ls 50x.html index.html [root@Web02 html]# rm -rf * #删除原有的站点文件 [root@Web02 html]# wget http://static.kodcloud.com/update/download/kodexplorer4.37.zip 下载 [root@Web02 html]# unzip kodexplorer4.37.zip #解压 [root@Web02 html]# nginx #启动nginx 浏览器访问 根据提示操作 su -c 'setenforce 0' #关闭selinux,su -c 指定命令,用root执行 chmod -R 777 /var/www/html/ #按照提示修改权限 刷新页面重新访问,成功,设置管理员用户名和密码,进行登录及后续图形界面操作

优秀的个人博客,低调大师

Java个人知识点总结(基础篇)

基础篇 JDK常用的包 java.lang:这个是系统的基础类,比如String、Math、Integer、System和Thread, 提供常用功能。 java.io:这里面是所有输入输出有关的类,比如文件操作等 java.net:这里面是与网络有关的类,比如URL,URLConnection等。 java.util:这个是系统辅助类,特别是集合类Collection,List,Map等。 java.sql:这个是数据库操作的类,Connection, Statememt,ResultSet等 Get和Post的区别 1.get是从服务器上获取数据,post是向服务器传送数据, 2.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。 3.get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 4.在进行文件上传时只能使用post而不能是get。 Java多态的具体体现 面向对象编程有四个特征:抽象,封装,继承,多态。 多态有四种体现形式: 1. 接口和接口的继承。 2. 类和类的继承。 3. 重载。 4. 重写。 其中重载和重写为核心。 重载:重载发生在同一个类中,在该类中如果存在多个同名方 法,但是方法的参数类型和个数不一样,那么说明该方法被重 载了。 重写:重写发生在子类继承父类的关系中,父类中的方法被子 类继承,方法名,返回值类型,参数完全一样,但是方法体不 一样,那么说明父类中的该方法被子类重写了。 StringBuffer StringBuilder String区别 √ String字符串常量 不可变 使用字符串拼接时是不同的2个空间 StringBuffer字符串变量 可变 线程安全 字符串拼接直接在字符串后追加 StringBuilder字符串变量 可变 非线程安全 字符串拼接直接在字符串后追加 1.StringBuilder执行效率高于StringBuffer高于String. 2.String是一个常量,是不可变的,所以对于每一次+=赋值都会创建一个新的对象, StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append方 法,在原来的基础上进行追加,所以性能比String要高,又因为StringBuffer 是 线程安全的而StringBuilder是线程非安全的,所以StringBuilder的效率 高于 StringBuffer. 3.对于大数据量的字符串的拼接,采用StringBuffer,StringBuilder. Stringbuilder 执行效率要高于stringbuffer更高于string String是变量 是不可变的 所以在在+ = 赋值的时候创建新的对象 Stringbuffer stringbuilder俩个都是可变的,当在字符串拼接的时候可以采用appent方法,在原有的基础上追加,所以性能比string 更高 ,又因为stringbuffer是现成安全的 but stringbuilder是线程非安全的 所以 stringbuilder比stringbuffer效率更低 对于大数据字符串拼接可以采用stringbuffter或是 stringbuilder Hashtable与HashMap的区别 √ HashMap不是线程安全的,HashTable是线程安全。 HashMap允许空(null)的键和值(key),HashTable则不允许。 HashMap性能优于Hashtable。 Map 1.Map是一个以键值对存储的接口。Map下有两个具体的实现,分别是HashMap和HashTable. 2.HashMap是线程非安全的,HashTable是线程安全的,所以HashMap的效率高于HashTable. 3.HashMap允许键或值为空,而HashTable不允许键或值为空. Map是一个键值的存储接口 , map下还有俩个实现分别是 hashmap 和 hashtable Hashmap线程非安全的 hashtable是线程安全的 所以hashmap要比hashtable效率要高 Hashmap允许键值 为空 但是 hashtable不允许为空 九大隐式对象 输入/输出对象: request response out 作用域通信对象:session application pageContext Servlet对象: page config 错误对象:exception Forword(请求转发)与Redirect(重定向) 1、从数据共享上 Forword是一个请求的延续,可以共享request的数据 Redirect开启一个新的请求,不可以共享request的数据 2、从地址栏 Forword转发地址栏不发生变化 Redirect转发地址栏发生变化 八、JQurey总结 jquery是一个轻量级的js框架,具有跨浏览器的特性,兼容性好, 并且封装了很多工具,方便使用。 常用的有:选择器 ,dom操作 ,ajax(ajax不能跨域) ,特效,工具类 XML和Json的特点 Xml特点: 1、有且只有一个根节点; 2、数据传输的载体 3、所有的标签都需要自定义 4、是纯文本文件 Json(JavaScript Object Notation)特点: json分为两种格式: json对象(就是在{}中存储键值对,键和值之间用冒号分隔, 键值对之间用逗号分隔); json数组(就是[]中存储多个json对象,json对象之间用逗号分隔) (两者间可以进行相互嵌套)数据传输的载体之一 区别: 传输同样格式的数据,xml需要使用更多的字符进行描述, 流行的是基于json的数据传输。 xml的层次结构比json更清晰。 共同点: xml和json都是数据传输的载体,并且具有跨平台跨语言的特性。 request.getSession()、reqeust.getSession(false)和request.getSession(true) getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回该对象 getSession(false):当session存在时返回该session,否则返回null Page和PageContext的区别 Page是servlet对象;使用this关键字,它的作用范围是在同一页面。 PageContext是作用域通信对象;通常使用setAttribute()和getAttribute()来设置和获取存放对象的值。 Ajax总结 AJAX全称: 异步JavaScript及 XML(Asynchronous JavaScript And XML) Ajax的核心是JavaScript对象XmlHttpRequest(XHR)。 Ajax的优点: 提高用户体验度(UE) 提高应用程序的性能 进行局部刷新 AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术。 2.通过 AJAX,我们的 JavaScript 可使用JavaScript的XMLHttpRequest对象来直接与服务器进行通信。通过这个对象,我们的 JavaScript 可在不重载页面的情况与Web服务器交换数据,即可局部刷新。 3. AJAX在浏览器与 Web 服务器之间使用异步数据传输(HTTP 请求),这样就可使网页从服务器请求少量的信息,而不是整个页面,减轻服务器的负担,提升站点的性能。 AJAX可使因特网应用程序更小、更快,更友好,用户体验(UE)好。 5. Ajax是基于标准化并被广泛支持的技术,并且不需要插件和下载小程序 JSP9大隐视对象中四个作用域的大小与作用范围 四个作用域从大到小:appliaction>session>request>page application:全局作用范围,整个应用程序共享.生命周期为:应用程序启动到停止。 session:会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。 request:请求作用域,就是客户端的一次请求。 page:一个JSP页面。 以上作用范围使越来越小,request和page的生命周期都是短暂的,他们之间的区别就是:一个request可以包含多个page页(include,forward)。 List,Set,Collection,Collections √ [if !supportLists]1.[endif]List和Set都是接口,他们都继承于接口Collection,List是一个有序的可重复的集合,而Set的无序的不可重复的集合。Collection是集合的顶层接口,Collections是一个封装了众多关于集合操作的静态方法的工具类,因为构造方法是私有的,所以不能实例化。 2.List接口实现类有ArrayList,LinkedList,Vector。ArrayList和Vector是基于数组实现的,所以查询的时候速度快,而在进行增加和删除的时候速度较慢LinkedList是基于链式存储结构,所以在进行查询的时候速度较慢但在进行增加和删除的时候速度较快。又因为Vector是线程安全的,所以他和ArrayList相比而言,查询效率要低。 List和set都属于接口 他们都继承于collection List是一个有序的 可重复的 set是无序得到不可重复的 Collection是集合的顶层接口 , collections是封装可众多集合的操作的静态的工具类 因为他是私有化的所以他不可以实例化 List的接口实现类分为arraylist vertor linkedlist arraylist 和 verson是基于数组实现的,说以查询的时候较快 ,但是增加 与删除 的速度较慢。 Linkelist是基于链式存储 ,所以查询的时候较慢, 增加与删除数独较快, 又因为vertor线程安全 所以arraylist相比 效率 如果你依然觉得有些茫然,不如加入我的Java架构师之路:766529531 跟有多年Java开发经验的资深工程师聊一聊。也可获取免费的视频学习资料以及电子书学习资料喔! java的基本数据类型 数据类型 大小 byte(字节) 1(8位) shot(短整型) 2(16位) int(整型) 4(32位) long(长整型) 8(32位) float(浮点型) 4(32位) double(双精度) 8(64位) char(字符型) 2(16位) boolean(布尔型) 1位 附加: String是基本数据类型吗?(String不是基本数据类型) String的长度是多少,有限制?(长度受内存大小的影响) 冒泡排序 public class Sort { public static void sort() { Scanner input = new Scanner(System.in); int sort[] = new int[10]; int temp; System.out.println("请输入10个排序的数据:"); for (int i = 0; i < sort.length; i++) { sort[i] = input.nextInt(); } for (int i = 0; i < sort.length - 1; i++) { for (int j = 0; j < sort.length - i - 1; j++) { if (sort[j] < sort[j + 1]) { temp = sort[j]; sort[j] = sort[j + 1]; sort[j + 1] = temp; } } } System.out.println("排列后的顺序为:"); for(int i=0;i<sort.length;i++){ System.out.print(sort[i]+" "); } } public static void main(String[] args) { sort(); } } 二分查找法 十八、时间类型转换 public class DateFormat { public static void fun() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日"); String newDate; try { newDate = sdf.format(new SimpleDateFormat("yyyyMMdd") .parse("20121115")); System.out.println(newDate); } catch (ParseException e) { e.printStackTrace(); } } public static void main(String args[]) { fun(); } } 阶乘 public class Multiply { public static int multiply(int num) { if (num < 0) { System.out.println("请输入大于0的数!"); return -1; } else if (num == 0 || num == 1) { return 1; } else { return multiply(num - 1) * num; } } public static void main(String[] args) { System.out.println(multiply(10)); } } UE和UI的区别 UE是用户体验度 UI界面原型(用户界面)(相当于买房时用的模型) 设计UI的作用: 1、帮助程序员工作(界面已由美工设计完成) 2、提前让用户对项目有个宏观的了解,知道效果是什么样子。 osi七层模型 第一层:物理层 第二层:数据链路层 第三层:网络层 第四层:传输层 第五层:会话层 第六层:表示层 第七层:应用层 线程和进程的区别 1.线程(Thread)与进程(Process) 进程定义的是应用程序与应用程序之间的边界,通常来说一个进程就代表一个与之对应的应用程序。不同的进程之间不能共享代码和数据空间,而同一进程的不同线程可以共享代码和数据空间。 如果你依然觉得有些茫然,不如加入我的Java架构师之路:766529531跟有多年Java开发经验的资深工程师聊一聊。也可获取免费的视频学习资料以及电子书学习资料喔! 1、一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。 2、实现线程的两种方式:继承Thread类,实现Runable接口 jvm的内存结构 1、java虚拟机的内存结构分为堆(heap)和栈(stack),堆里面存放是对象实例也就是new出来的对象。栈里面存放的是基本数据类型以及引用数据类型的地址。 2、对于所谓的常量是存储在方法区的常量池里面。 内存泄露和内存溢出 内存泄露(memory leak),是指应用程序在申请内存后, 无法释放已经申请的内存空间.一次内存泄露危害可以忽略, 但如果任其发展最终会导致内存溢出(out of memory). 如读取文件后流要进行及时的关闭以及对数据库连接的释放。 内存溢出(out of memory)是指应用程序在申请内存时, 没有足够的内存空间供其使用。 如我们在项目中对于大批量数据的导入,采用分段批量提交的方式。 单例 单例就是该类只能返回一个实例。 单例所具备的特点: 1.私有化的构造函数 2.私有的静态的全局变量 3.公有的静态的方法 单例分为懒汉式、饿汉式和双层锁式 饿汉式: public class Singleton1 { private Singleton1() {}; private static Singleton1 single = new Singleton1(); public static Singleton1 getInstance() { return single; } } 懒汉式: public class Singleton2 { private Singleton2() {} private static Singleton2 single=null; public tatic Singleton2 getInstance() { if (single == null) { single = new Singleton2(); } return single; } } 线程安全: public class Singleton3 { private Singleton3() {} private static Singleton3 single ; public static Singleton3 getInstance() { if(null == single){ synchronized(single ){ if(null == single){ single = new Singleton3(); } } } return single; } } 参考: 通过双重判断来保证单列设计模式在多线程中的安全性, 并且它在性能方面提高了很多。 synchronized在方法上加锁 (同步锁) synchronized在代码块内部加锁 (同步代码块) synchronized(同步锁) 使用synchronized如何解决线程安全的问题? 1.synchronized在方法上加锁 2.synchronized在代码块内部加锁 1.懒汉 2.饿汉 3.双重判断 解析xml文件的几种技术 1、 解析xml的几种技术 1.dom4j 2.sax 3.jaxb 4.jdom 5.dom 1.dom4j dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。 2.sax SAX(simple API for XML)是一种XML解析的替代方法。相比于DOM,SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂。 3.jaxb JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数。 2、dom4j 与 sax 之间的对比:【注:必须掌握!】 dom4j不适合大文件的解析,因为它是一下子将文件加载到内存中,所以有可能出现内存溢出, sax是基于事件来对xml进行解析的,所以他可以解析大文件的xml 也正是因为如此,所以dom4j可以对xml进行灵活的增删改查和导航,而sax没有这么强的灵活性 所以sax经常是用来解析大型xml文件,而要对xml文件进行一些灵活(crud)操作就用dom4j 如果你依然觉得有些茫然,不如加入我的Java架构师之路:766529531跟有多年Java开发经验的资深工程师聊一聊。也可获取免费的视频学习资料以及电子书学习资料喔! 项目的生命周期 1.需求分析 2.概要设计 3.详细设计(用例图,流程图,类图) 4.数据库设计(powerdesigner) 5.代码开发(编写) 6.单元测试(junit 白盒测试)(开发人员) svn版本管理工具(提交,更新代码,文档) 7.集成测试 (黑盒测试,loadrunner(编写测试脚本)(高级测试)) 8.上线试运行 (用户自己体验) 9.压力测试(loadrunner) 10.正式上线 11.维护 OSCache的判断 Object obj = CacheManager.getInstance().getObj("oaBrandList"); //从缓存中取数据 if (null == obj) { obj = brandDao.getBrandList(); //如果为空再从数据库获取数据 //获取之后放入缓存中 CacheManager.getInstance().putObj("oaBrandList", obj); } return (List<OaBrand>)obj; 经常访问的技术网站 1.csdn(详细步骤的描述) 2.iteye(详细步骤的描述) 3.oschina(开源中国获取java开源方面的信息技术) 4.java开源大全 www.open-open.com(获取java开源方面的信息技术) 5.infoq(对java,php,.net等这些语言的一些最新消息的报道) 项目团队中交流的工具 飞秋(局域网) qq(局域网,外网) RTX(局域网,外网) 邮箱(局域网,外网) 平时浏览的书籍 实战经验: *** in action(实战) ***深入浅出 ***入门指南 思想基础: 大话设计模式 重构 java Exception体系结构 java异常是程序运行过程中出现的错误。Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在Java API中定义了许多异常类,分为两大类,错误Error和异常Exception。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常(非runtimeException),也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。 1、Error与Exception Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。 这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。 Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。 2、运行时异常和非运行时异常 运行时异常:都是RuntimeException类及其子类异常: IndexOutOfBoundsException索引越界异常 ArithmeticException:数学计算异常 NullPointerException:空指针异常 ArrayOutOfBoundsException:数组索引越界异常 ClassNotFoundException:类文件未找到异常 ClassCastException:造型异常(类型转换异常) 这些异常是不检查异常(Unchecked Exception),程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的。 非运行时异常:是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如: IOException、文件读写异常 FileNotFoundException:文件未找到异常 EOFException:读写文件尾异常 MalformedURLException:URL格式错误异常 SocketException:Socket异常 SQLException:SQL数据库异常 session和cookie的区别 session是存储在服务器端,cookie是存储在客户端的,所以安全来讲session的安全性要比cookie高,然后我们获取session里的信息是通过存放在会话cookie里的sessionid获取的。又由于session是存放在服务器的内存中,所以session里的东西不断增加会造成服务器的负担,所以会把很重要的信息存储在session中,而把一些次要东西存储在客户端的cookie里,然后cookie确切的说分为两大类分为会话cookie和持久化cookie,会话cookie确切的说是存放在客户端浏览器的内存中,所以说他的生命周期和浏览器是一致的,浏览器关了会话cookie也就消失了,然而持久化cookie是存放在客户端硬盘中,而持久化cookie的生命周期就是我们在设置cookie时候设置的那个保存时间,然后我们考虑一问题当浏览器关闭时session会不会丢失,从上面叙述分析session的信息是通过sessionid获取的,而sessionid是存放在会话cookie当中的,当浏览器关闭的时候会话cookie消失所以我们的sessionid也就消失了,但是session的信息还存在服务器端,这时我们只是查不到所谓的session但它并不是不存在。那么,session在什么情况下丢失,就是在服务器关闭的时候,或者是sessio过期,再或者调用了invalidate()的或者是我们想要session中的某一条数据消失调用session.removeAttribute()方法,然后session在什么时候被创建呢,确切的说是通过调用session.getsession来创建,这就是session与cookie的区别 字节流与字符流的区别 stream结尾都是字节流,reader和writer结尾都是字符流 两者的区别就是读写的时候一个是按字节读写,一个是按字符。 实际使用通常差不多。 在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流。 只是读写文件,和文件内容无关的,一般选择字节流。 final,finally,finalize三者区别 Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这个变 量的时候给它赋值 当final修饰方法时,该方法不能被重写 当final修饰类时,该类不能被继承 Final不能修饰抽象类,因为抽象类中会有需要子类实现的抽象方法,(抽 象类中可以有抽象方法,也可以有普通方法,当一个抽象类中没有抽象方 法时,这个抽象类也就没有了它存在的必要) Final不能修饰接口,因为接口中有需要其实现类来实现的方法 Finally: Finally只能与try/catch语句结合使用,finally语句块中的语句一定会执行,并且会在return,continue,break关键字之前执行 finalize: Finalize是一个方法,属于java.lang.Object类,finalize()方法是GC(garbage collector垃圾回收)运行机制的一部分,finalize()方法是在GC清理它所从属的对象时被调用的 Io流的层次结构 从流的方向 输入流 输出流 从流的类型上 字符流字节流 inputstream和outputstream都是抽象类 它们下面的实现包括 FileInputStream,BufferedInputStream FileOutputStream,BufferedOutputStream reader和 writer FileReader,BufferedReader,StringReader FileWriter,BufferedWriter,StringWriter,PrintWriter JAVA: Java是面向对象的,跨平台的,它通过java虚拟机来进行跨平台操作,它可以进行自动垃圾回收的【c语言是通过人工进行垃圾回收】,java还会进行自动分配内存。【c语言是通过指定进行分配内存的】,只需要new一个对象,这个对象占用了多少空间,不需要我们来管,java虚拟机负责管这些,用完之后也不需要我们来释放,java虚拟机会自动释放 JavaSE JavaEE JavaME区别 是什么: Java SE=Java Standard Edition=j2se = java 标准版 Java EE=Java Enterprise Edition=j2ee= java 企业版 Java ME=Java Mobile Edition=j2me = java移动版 特点: SE主要用于桌面程序(swing),控制台开发(main程序)。 EE企业级开发(JSP,EJB,Spring MVC,Struts,hibernate,ibatis等), 用于企业级软件开发,网络开发,web开发。 ME嵌入式开发(手机,小家电,PDA)。[苹果的ios,黑莓] 三者之间的关系: Java SE(Java Platform, Standard Edition,Java标准版)就是基于JDK和JRE的。 Java SE为Java EE提供了基础。 Java EE除了基于我们这个所谓的Java SE外,还新加了企业应用所需的类库 JDK JRE JVM的区别: Jdk【Java Development ToolKit】就是java开发工具箱, JDK是整个JAVA的核心里边包含了jre,它除了包含jre之外还包含了一些javac的工具类,把java源文件编译成class文件,java文件是用来运行这个程序的,除此之外,里边还包含了java源生的API,java.lang.integer在rt的jar包里边【可以在项目中看到】,通过rt这个jar包来调用我们的这些io流写入写出等 JDK有以下三种版本: J2SE,standard edition,标准版,是我们通常用的一个版本 J2EE,enterpsise edtion,企业版,使用这种JDK开发J2EE应用程序 J2ME,micro edtion,主要用于移动设备、嵌入式设备上的java应用程序 Jre【Java Runtime Enviromental】是java运行时环境,那么所谓的java运行时环境,就是为了保证java程序能够运行时,所必备的一基础环境,也就是它只是保证java程序运行的,不能用来开发,而jdk才是用来开发的,所有的Java程序都要在JRE下才能运行。 包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。 Jre里边包含jvm Jvm:【Java Virtual Mechinal】因为jre是java运行时环境,java运行靠什么运行,而底层就是依赖于jvm,即java虚拟机,java虚拟机用来加载类文件,java中之所以有跨平台的作用,就是因为我们的jvm 关系: J2se是基于jdk和jre, JDK是整个JAVA的核心里边包含了jre, Jre里边包含jvm 报错的状态码: 301 永久重定向 302 临时重定向 304 服务端 未改变 403 访问无权限 200 正常 404 路径 500 内部错误 协议以及默认的端口号 ftp 21 文件传输协议 Pop3 110 它是因特网 <http://baike.baidu.com/view/1706.htm>电子邮件 <http://baike.baidu.com/view/1524.htm>的第一个离线 <http://baike.baidu.com/view/113466.htm>协议标准 Smtp 25 简单邮件传输协议 http 80 超文本传输协议 oracle 默认端口号1521 mysql默认端口号 3306 抽象类与接口的区别 1.一个类只能进行单继承,但可以实现多个接口。 2.有抽象方法的类一定是抽象类,但是抽象类里面不一定有抽象方法; 接口里面所有的方法的默认修饰符为publicabstract,接口里的成员变量默认的修饰符为pulbic static final。 关系: 接口和接口继承 接口和抽象类抽象类实现接口 类和抽象类类继承抽象类 类和类继承 修饰符的作用 修饰符的作用范围: private default protected public 同一个类中可以 可以 可以 可以 同一个包的类中 可以可以 可以 不同包的子类中 可以可以 不同包的类中 可以 onready和onload的区别 1.onready比onload先执行 2.onready是在页面解析完成之后执行,而onload是在页面所有元素加载后执行 3.onload只执行最后一个而onready可以执行多个。 参考: [if !supportLists]1.[endif]执行时间window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行。 $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕。 2.编写个数不同 window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个 $(document).ready()可以同时编写多个,并且都可以得到执行 3.简化写法 window.onload没有简化写法 $(document).ready(function(){})可以简写成$(function(){}); 另外,需要注意一点,由于在$(document).ready() 方法内注册的事件,只要DOM 就绪就会被执行,因此可能此时元素的关联文件未下载完。例如与图片有关的html 下载完毕,并且已经解析为DOM 树了,但很有可能图片还没有加载完毕,所以例如图片的高度和宽度这样的属性此时不一定有效。要解决这个问题,可以使用Jquery 中另一个关于页面加载的方法---load() 方法。Load() 方法会在元素的onload 事件中绑定一个处理函数。如果处理函数绑定给window 对象,则会在所有内容( 包括窗口、框架、对象和图像等) 加载完毕后触发,如果处理函数绑定在元素上,则会在元素的内容加载完毕后触发。 Jquery 代码如下: $(window).load(function (){ // 编写代码 });等价于JavaScript 中的以下代码 Window.onload = function (){ // 编写代码 } switch默认接受的几种数据类型 Short, int, byte, char request 跟session的区别 1.他们的生命周期不同, request对应的是一次请求, session对应的是一次会话 2.request占用资源比较少,相对来说缺乏持续性, 而session资源消耗比较大,所以通常使用request来保存信息 找到解决svn冲突方法 对于svn冲突,可以采用手工处理将冲突的部分进行整合, 之后备份最新整合后的文件,采用覆盖更新的方式处理完 冲突之后,再把最新整合后的文件进行提交。 如果你依然觉得有些茫然,不如加入我的Java架构师之路:766529531跟有多年Java开发经验的资深工程师聊一聊。也可获取免费的视频学习资料以及电子书学习资料喔! 反射的描述 通过字符串可以动态创建java对象,并且可以动态访问方法, 属性等。 我们在项目中的时候封装过数据库jdbc的持久层, 其中就利用反射这项 技术来达到通用 和灵活的目的。

优秀的个人博客,低调大师

对Python装饰器的个人理解方法

0.说明 在自己好好总结并对Python装饰器的执行过程进行分解之前,对于装饰器虽然理解它的基本工作方式,但对于存在复杂参数的装饰器(装饰器和函数本身都有参数),总是会感到很模糊,即使这会弄懂了,下一次也很快忘记,其实本质上还是没有多花时间去搞懂其中的细节问题。 虽然网络上已经有很多这样的文章,但显然都是别人的思想,因此自己总是记不牢,所以花点时间自己好好整理一下。 最近在对《Python核心编程》做总结,收获了不少,下面分享一下我自己对于Python装饰器的理解,后面还提供了一个较为复杂的Python装饰器的执行过程的分解,可以参考一下。 1.Python装饰器的出现 在没有装饰器之前,如果要在类中定义一个静态方法,需要使用下面的方法: classMyClass(object): defstaticFoo(): staticFoo=staticmethod(staticFoo) 即要在该静态方法中加入类似staticmethod()内建函数将该方法转换为静态方法,这显然非常麻烦,而有了装饰器之后,就可以写成下面这样: classMyClass(object): @staticmethod defstaticFoo(): pass 这样就简洁很多了。 2.Python装饰器类型与理解 (1)无参数装饰器 一个装饰器 下面的情况: @f deffoo(): pass 其实就相当于: deffoo(): pass foo=g(foo) 多个装饰器 下面的情况: @g @f deffoo(): pass 就相当于: deffoo(): pass foo=g(f(foo)) (2)含参数装饰器 带有参数的一个装饰器 下面的情况: @decomaker(deco_args) deffoo(): pass 就相当于: deffoo(): pass foo=decomaker(deco_args)(foo) 用这样的思想去理解就非常好理解了:decomaker()用deco_args做了些事并返回函数对象,而该函数对象正是以foo作为其参数的装饰器。 下面多个装饰器的例子也是按这样的思想去理解。 带有参数的多个装饰器 下面的情况: @deco1(deco_arg) @deco2() deffoo(): pass 就相当于: deffoo(): pass foo=deco1(deco_arg)(deco2(foo)) 3.Python装饰器执行过程的手动分解 OK,有了上面的理论基础,理解下面一个较为复杂的装饰器就很容易了: fromfunctoolsimportwraps deflog(text): defdecorator(func): @wraps(func)#itworkslike:wraper.__name__=func.__name__ defwrapper(*args,**kwargs): print'%s%s():'%(text,func.__name__) returnfunc(*args,**kwargs) returnwrapper returndecorator @log('Hello') defnow(area): printarea,'2016-01-23' now('Beijing') print'Thenameoffunctionnow()is:',now.__name__ 执行如下: /usr/bin/python2.7/home/xpleaf/PycharmProjects/decorator_test/dec10.py Hellonow(): Beijing2016-01-23 Thenameoffunctionnow()is:now 对于该程序的执行过程,可以分析如下:1.先执行log('Hello')函数,此时返回了一个新的函数,只不过其中的text变量被替换为'Hello',所以用来装饰now函数的新的装饰器如下:defdecorator(func): @wraps(func)#itworkslike:wraper.__name__=func.__name__ defwrapper(*args,**kwargs): print'%s%s():'%('Hello',func.__name__) returnfunc(*args,**kwargs) returnwrapper2.所以此时的now函数,就相当于:now=decorator(now)3.即now就相当于:defnow(*args,**kwargs): print'%s%s():'%('Hello',old_now.__name__) returnold_now(*args,**kwargs) #现在的函数名称变为了now而不是wrapper,是因为使用了wraps装饰器 所以,输出的结果也就非常好理解了。 关于wraps,它也是一个装饰器,使用它的作用是,被我们用自定义装饰器修改后的函数,它的函数名称,即func.__name__跟原来是一样的,而它的工作原理正如上面所提及的,即: wraper.__name__=func.__name__ 也就是说,使用wraps可以不改变原来函数的属性,当然,上面只是简单说明了一下其工作原理,详细的可以参考wraps的源代码。 在GitHub上给出了10个理解装饰器的例子,可以参考一下:https://github.com/xpleaf/decorator 本文选中我的《Python回顾与整理》系列博文中的《Python回顾与整理9:函数和函数式编程》

优秀的个人博客,低调大师

2024 年 Kotlin Multiplatform 发展路线图 | 官方博客

记得加关注, Kotlin 之路不迷路! Kotlinlang.org 随着 Kotlin Multiplatform 最近稳定,世界各地的开发团队已经可以在生产中无缝、舒适地采用它。不过,这对于 KMP 及其生态系统来说仅仅是一个开始。为了让您获得优良的跨平台开发体验,JetBrains 计划在 2024年对核心 Kotlin Multiplatform 技术、Compose Multiplatform、KMP 工具和 KMP 库做出一系列深入改进。本文将介绍我们在这些领域的计划和优先事项。 Compose Multiplatform 我们致力于将 Compose Multiplatform打造成框架,供开发者创建在所有支持的平台上都一致、美观且高性能的应用程序。目前,我们的主要关注点是让 Compose for iOS 进入 Beta 版阶段,但同时也在推进其他事项。我们的计划: 使所有 Jetpack Compose 核心 API 和组件实现多平台。 提高 iOS 端的渲染性能。 使 Compose for iOS 应用中的滚动和文本编辑行为与 iOS 原生应用中的行为相同。 为共享所有类型的资源实现通用 API。 与 iOS 和桌面无障碍功能 API 集成。 提供多平台导航解决方案。 许多上述改进也有利于 Compose for Desktop。此外,我们也在提高其稳定性,并根据生产使用反馈进行改进。 我们还将继续探索 Compose for Web 的可能,特别是 Wasm。我们最近的目标是将其提升至 Alpha 版,其中包括: 允许您移植现有应用并重用所有通用代码。 支持不同的屏幕尺寸、方向和密度。 支持鼠标、触摸屏、实体键盘或屏幕键盘输入。 提高性能和二进制文件大小。 工具 我们致力于为 Kotlin Multiplatform 提供优异的 IDE 体验。这意味着不仅投资核心平台,例如,将 Kotlin IDE 插件迁移到 K2 编译器前端,还要为所有 Kotlin Multiplatform 目标和集成的代码库提供单一工具 (Fleet),从而消除在不同 IDE 之间不断切换的需求。 我们计划在您对使用 Fleet 进行 Kotlin Multiplatform 开发的反馈上快速迭代,确保满足您的需求,让您获得出色的开发体验。特别是,我们将在以下方面着重开展工作: 增强 Compose Multiplatform 支持,包括通用代码的实时预览和可视化调试工具。 帮助您进行项目配置的 IDE。 统一并增强 Multiplatform 项目所有部分的调试体验。 Multiplatform 核心 Kotlin Multiplatform 的一个流行场景是与 iOS 目标共享代码。我们希望关注在代码库中使用 Kotlin Multiplatform 框架的 iOS 开发者的开发体验。 这一领域的主要举措是直接从 Kotlin 导出到 Swift。这将消除 Objective-C 瓶颈,带来更广泛的 Swift 语言支持和更自然的 API 导出。此外,我们还在为 Kotlin 库作者创建专属工具。这些工具将提高 Kotlin API 导出到 Swift 时的兼容性和用户友好性。我们也在密切关注工具。IDE 和构建系统是开发者体验的重要组成部分,我们的目标是确保 Swift Export 顺利集成。 我们的其他举措包括加快 Kotlin/Native 编译速度、增强 CocoaPods 集成,以及引入对使用 SwiftPM 导出框架的支持。 我们还计划继续探索改进 Kotlin Multiplatform 应用程序构建设置的方式。在 Kotlin 1.9.20 中,我们对 Gradle Multiplatform DSL 发布了巨大改进,使其更易读写。我们将继续逐步完善。此外,我们正在测试 Amper,这是一个新的项目配置工具,专注于实用性、入门和 IDE 支持。 库生态系统 随着 Kotlin Multiplatform 生态系统的快速发展,库的向后兼容性变得至关重要。为此,JetBrains 团队和库创建者必须合作。我们的计划是: 改进 klib 格式,使库创建者可以利用其构建 JVM 库的知识。 在 Kotlin Multiplatform 库中实现与 JVM 相同的代码内联行为。 提供工具来确保您的多平台库公共 API 不会以不兼容的方式更改。 我们还将改进 KMP 库的发布流程。具体而言,我们计划: 无需 Mac 机器即可构建和发布 KMP 库。 为创建和发布 KMP 库提供模板和广泛的指导原则。 虽然 Kotlin Multiplatform 现已稳定,但我们仍在计划重大更新。请放心:以当前格式构建的库仍然可以与较新的 Kotlin 版本一起使用。 阅读更多内容 Kotlin Multiplatform 已经稳定并且可以投入生产环境 Compose Multiplatform 1.5.10 – 最佳入门时机 Amper – 提升构建工具用户体验 欢迎使用带有 Kotlin Multiplatform Tooling 的 Fleet Kotlin 路线图: https://kotlinlang.org/docs/roadmap.html 专注 Kotlin 领域的 2023 年度总结 凝聚 Kotlin 开发者的线上技术派对 一年一度 Kotlin 中文开发者大会 将在 12 月 16 至 17 日和大家线上见面。 10+ 位实力大咖将围绕 Kotlin Multiplatform、Android、 Kotlin 编译器插件、后端开发等 热门话题贡献精彩的技术演讲。 新增 Live Coding 环节, 带你上手 Compose Multiplatform。 还有来自 Kotlin 团队和社区小伙伴的 学习资源与经验分享。 陪你过一个专属 Kotlin 的充实周末! 点此查看大会议程安排 ✅ 也别忘了一键预约视频号开播提醒 ⏬ 您也可以访问我们的大会专属页面, 填写活动报名表单, 在大会开始前收到邮件提醒。 转至大会专属页面注册报名 本博文英文原作者: Egor Tolstoy 这就是 Kotlin 编程语言 简洁、跨平台、且有趣! 本文分享自微信公众号 - JetBrains(JetBrainsChina)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

优秀的个人博客,低调大师

精选博客系列|VMware如何实现多云基础设施

私有云,公有云,多云,边缘云...如今,组织的团队、数据和工作负载分布在各种环境中。毫无疑问,这导致了技术上的复杂性增加、安全风险加剧、成本飙升和云战略不连贯的问题。 “39%的高管难以在(他们的)公有云上实现一套共同的控制。” 使用VMware跨云服务,您可以从一个集中的控制中心运行、迁移、现代化、管理和保护应用程序,覆盖您所有的云环境。通过提供一体化云基础架构解决方案,管理者可以满足开发和运营的优先事项,同时管理开支。 “91%的高管正在寻求改善其公共云环境的一致性。” 跨云服务使各种战略性IT计划成为可能,例如: 1.使用VMware Cloud™可以在任何地方运行应用程序和工作负载 - 迁移和运行企业应用程序 - 在公共、本地和边缘环境中实现一致的运营 2.使用云管理进行监控和管理 - 单一管理控制台 - 跨云计算成本的可见性 - 基于利用率的资源优化和云订阅 3.使用VMware Tanzu™构建和运营云原生应用程序 - 使用Kubernetes构建和管理现代应用程序 - 一个开发环境,一个部署流程 - 适用于私有和公有云环境 4.安全的网络和环境 - 跨云连接和保护环境 - 检测风险并实现纠正 - 评估符合自定义或行业合规标准 视频链接:https://www.youtube.com/watch?v=T2vBNKwU0N0 本文作者:Dave Wolpert,VMware跨云服务的解决方案营销高级经理。 内容来源|公众号:VMware 中国研发中心 有任何疑问,欢迎扫描下方公众号联系我们哦~

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册