ffmpeg-4.3.1(linux-mac-window).7z
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了目前领先的音/视频编码库libavcodec。 FFmpeg是在 Linux 下开发出来的,但它可以在包括 Windows 在内的大多数操作系统中编译。这个项目是由 Fabrice Be【ffmpeg-4.3.1(linux-mac-window)】
1、ffmpeg-4.3.1-linux
2、ffmpeg-4.3.1-mac-static-64-bit
3、ffmpeg-4.3.1-window-static-32-bit
4、ffmpeg-4.3.1-window-static-64-bit
springmvcmybatis
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
">
<!-- 自动扫描 -->
<context:component-scan base-package="com.flong.*" />
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
</bean>
<!-- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" lazy-init="false">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
初始化连接大小
<property name="initialSize" value="${jdbc.initialSize}"></property>
连接池最大数量
<property name="maxActive" value="${jdbc.maxActive}"></property>
连接池最大空闲
<property name="maxIdle" value="${jdbc.maxIdle}"></property>
连接池最小空闲
<property name="minIdle" value="${jdbc.minIdle}"></property>
获取连接最大等待时间
<property name="maxWait" value="${jdbc.maxWait}"></property>
</bean>
-->
<bean id="dbPasswordCallback" class="com.flong.utils.DBPasswordCallback">
<description>数据库连接回调密码解密</description>
</bean>
<bean id="statFilter" class="com.alibaba.druid.filter.stat.StatFilter" lazy-init="true">
<description>状态过滤器</description>
<property name="logSlowSql" value="true" />
<property name="mergeSql" value="true" />
</bean>
<!-- 操作数据库删除,修改,添加的数据源 -->
<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" init-method="init" lazy-init="true">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${jdbc.initialSize}" />
<!-- 连接池最大数量 -->
<property name="maxActive" value="${jdbc.maxActive}" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${jdbc.minIdle}" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${jdbc.maxWait}" />
<!-- -->
<property name="defaultReadOnly" value="true" />
<property name="proxyFilters">
<list>
<ref bean="statFilter" />
</list>
</property>
<property name="filters" value="${druid.filters}" />
<property name="connectionProperties" value="password=${password}" />
<property name="passwordCallback" ref="dbPasswordCallback" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="timeBetweenLogStatsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
</bean>
<!-- 操作数据库读的数据源 -->
<bean id="readDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" init-method="init" lazy-init="true">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${jdbc.initialSize}" />
<!-- 连接池最大数量 -->
<property name="maxActive" value="${jdbc.maxActive}" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${jdbc.minIdle}" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${jdbc.maxWait}" />
<!-- -->
<property name="defaultReadOnly" value="true" />
<property name="proxyFilters">
<list>
<ref bean="statFilter" />
</list>
</property>
<property name="filters" value="${druid.filters}" />
<property name="connectionProperties" value="password=${password}" />
<property name="passwordCallback" ref="dbPasswordCallback" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="validationQuery" value="SELECT 'x'" />
<property name="timeBetweenLogStatsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}" />
</bean>
<!--利用AbstractRoutingDataSource实现动态数据源切换 -->
<bean id="dataSource" class="com.flong.utils.persistence.DynamicChooseDataSource" lazy-init="true">
<description>数据源</description>
<property name="targetDataSources">
<map key-type="java.lang.String" value-type="javax.sql.DataSource">
<!-- write -->
<entry key="write" value-ref="writeDataSource" />
<!-- read -->
<entry key="read" value-ref="readDataSource" />
</map>
</property>
<!--
从org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource这个类里面可以看到
defaultTargetDataSource这个对象,根据自己需求的情况默认的情况给一个默认的数据源.
-->
<property name="defaultTargetDataSource" ref="writeDataSource" />
<property name="methodType">
<map key-type="java.lang.String">
<!-- read -->
<entry key="read" value=",get,select,count,list,query" />
<!-- write -->
<entry key="write" value=",add,insert,create,update,delete,remove," />
</map>
</property>
</bean>
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 添加 mybatis-config配置上去。-->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- 扫描com.flong.pojo下面的所有类,减少mybatis的mapping所有实体类的路径(parameterType),直接写一个JavaBean即可 -->
<property name="typeAliasesPackage" value="com.flong.pojo"/>
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:mapping/*.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.flong.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置事务通知属性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 定义事务传播属性 -->
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="edit*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="new*" propagation="REQUIRED" />
<tx:method name="set*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="change*" propagation="REQUIRED" />
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" propagation="REQUIRED" read-only="true" />
<tx:method name="load*" propagation="REQUIRED" read-only="true" />
<tx:method name="*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 配置事务切面 -->
<aop:config>
<aop:pointcut id="serviceOperation" expression="execution(* com.flong.service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" />
</aop:config>
</beans>
Redis与简单的入门
2.1Redis准备工作
1)官方 http://redis.io
2.2Redis下载
github下载
https://github.com/MSOpenTech/redis/releases
Downloads
6.4 MBRedis-x64-3.0.500.msi
5.58 MBRedis-x64-3.0.500.zip
Source code (zip)
Source code (tar.gz)
百度网盘:http://pan.baidu.com/s/1HunuQ
2.3Redis安装与注意事项
1)我下载的到本地的文件是redis-windows-master
打开这个文件D:\Server\redis\redis-windows-master\downloads\redis64-2.6.12.1.zip这个目录下面有
redis.conf配置是window下使用启动redis所需要的文件,因为我本机是32bit的.我在官方也没找到然后redis64
把下面的文件拷贝过来,虽然上面是写着64.拷贝过来也可以启动。当然了,你不能直接用redis-windows-master
下面的所有
2)解压的redis包含的文件
redis-benchmark.exe
redis-check-aof.exe
redis-check-dump.exe
redis-cli.exe
redis-server.exe
解压直接双击 redis-server.exe文件启动redis系统会报一个错误,无法识别是32bit还是64bit的系统,从此验证
这个五个文件不能在32bit系统启动,当然这个不用担心,我已经下载好有32bit的redis的文件.redisbin_x32
3)自己创建bat后缀格式的批处理文件作为快捷键启动window服务,redis.conf这个文件可以自己随便定,有意义即可
并且必须要这个批处理能读取这个配置
A)start-redis.bat
redis-server redis.conf
B)service-install.bat
redis-server.exe --service-install redis.conf --loglevel verbose
C)uninstall-service.bat
redis-server --service-uninstall
4)使用redis命令启动。
A)首先进到redis的根目录下,加上我的文件目录放在,打开cmd命令窗体
D:\Server\redis>cd redisbin_x32出现如下截图表示成功:
Window搭建Redis
2.1Redis准备工作
1)官方 http://redis.io
2.2Redis下载
github下载
https://github.com/MSOpenTech/redis/releases
Downloads
6.4 MBRedis-x64-3.0.500.msi
5.58 MBRedis-x64-3.0.500.zip
Source code (zip)
Source code (tar.gz)
百度网盘:http://pan.baidu.com/s/1HunuQ
2.3Redis安装与注意事项
1)我下载的到本地的文件是redis-windows-master
打开这个文件D:\Server\redis\redis-windows-master\downloads\redis64-2.6.12.1.zip这个目录下面有
redis.conf配置是window下使用启动redis所需要的文件,因为我本机是32bit的.我在官方也没找到然后redis64
把下面的文件拷贝过来,虽然上面是写着64.拷贝过来也可以启动。当然了,你不能直接用redis-windows-master
下面的所有
2)解压的redis包含的文件
redis-benchmark.exe
redis-check-aof.exe
redis-check-dump.exe
redis-cli.exe
redis-server.exe
解压直接双击 redis-server.exe文件启动redis系统会报一个错误,无法识别是32bit还是64bit的系统,从此验证
这个五个文件不能在32bit系统启动,当然这个不用担心,我已经下载好有32bit的redis的文件.redisbin_x32
3)自己创建bat后缀格式的批处理文件作为快捷键启动window服务,redis.conf这个文件可以自己随便定,有意义即可
并且必须要这个批处理能读取这个配置
A)start-redis.bat
redis-server redis.conf
B)service-install.bat
redis-server.exe --service-install redis.conf --loglevel verbose
C)uninstall-service.bat
redis-server --service-uninstall
4)使用redis命令启动。
A)首先进到redis的根目录下,加上我的文件目录放在,打开cmd命令窗体
D:\Server\redis>cd redisbin_x32出现如下截图表示成功:
2.4启动redis-cli.exe
此时出现上面那个界面就可以双击redis-cli.exe文件
1)set tiemao命令的使用,使用此命令必须保证服务是启动的
一回车之后此时,可以看到这个服务这个窗体相应
2)设置了这个命令就可以用get tiemao
2.5redis命令
精髓Oralcle讲课笔记
-- 首先,以超级管理员的身份登录oracle
sqlplus sys/bjsxt as sysdba
--然后,解除对scott用户的锁
alter user scott account unlock;
--那么这个用户名就能使用了。
--(默认全局数据库名orcl)
1、select ename, sal * 12 from emp; --计算年薪
2、select 2*3 from dual; --计算一个比较纯的数据用dual表
3、select sysdate from dual; --查看当前的系统时间
4、select ename, sal*12 anuual_sal from emp; --给搜索字段更改名称(双引号 keepFormat 别名有特殊字符,要加双引号)。
5、--任何含有空值的数学表达式,最后的计算结果都是空值。
6、select ename||sal from emp; --(将sal的查询结果转化为字符串,与ename连接到一起,相当于Java中的字符串连接)
7、select ename||'afasjkj' from emp; --字符串的连接
8、select distinct deptno from emp; --消除deptno字段重复的值
9、select distinct deptno , job from emp; --将与这两个字段都重复的值去掉
10、select * from emp where deptno=10; --(条件过滤查询)
11、select * from emp where empno > 10; --大于 过滤判断
12、select * from emp where empno 10 --不等于 过滤判断
13、select * from emp where ename > 'cba'; --字符串比较,实际上比较的是每个字符的AscII值,与在Java中字符串的比较是一样的
14、select ename, sal from emp where sal between 800 and 1500; --(between and过滤,包含800 1500)
15、select ename, sal, comm from emp where comm is null; --(选择comm字段为null的数据)
16、select ename, sal, comm from emp where comm is not null; --(选择comm字段不为null的数据)
17、select ename, sal, comm from emp where sal in (800, 1500,2000); --(in 表范围)
18、select ename, sal, hiredate from emp where hiredate > '02-2月-1981'; --(只能按照规定的格式写)
19、select ename, sal from emp where deptno =10 or sal >1000;
20、select ename, sal from emp where deptno =10 and sal >1000;
21、select ename, sal, comm from emp where sal not in (800, 1500,2000); --(可以对in指定的条件进行取反)
22、select ename from emp where ename like '%ALL%'; --(模糊查询)
23、select ename from emp where ename like '_A%'; --(取第二个字母是A的所有字段)
24、select ename from emp where ename like '%/%%'; --(用转义字符/查询字段中本身就带%字段的)
25、select ename from emp where ename like '%$%%' escape '$'; --(用转义字符/查询字段中本身就带%字段的)
26、select * from dept order by deptno desc; (使用order by desc字段 对数据进行降序排列 默认为升序asc);
27、sel
Installanywhere
Installanywhere 是一款把软件程序打包成支持多平台安装软件的工具。installAnywhere针对两种用户设计了不同的开发环境:一种是common designer,另一种是Advanced Designer。当你第一次打开IA的时候,缺省的是common designer,你只需要做一些简单的配置,比如产品的名称,需要安装的文件,要不要绑定虚拟机等等,然后就可以build出一个安装程序了。Advanced Designer是为高级用户设置的,提供了更多,更丰富的功能,你可以用它来打造你所需要的安装程序。
第三第四季Android源代码和PPT
mars第三第四季Android源代码和PPT
HTML5&CSS;权威代码
《HTML5与CSS3权威指南》范例及代码
ExtJs精通入门电子书
精通JS脚本之ExtJS框架(附光盘1张)
《精通JS脚本之ExtJS框架》由浅入深地讲解了ExtJS在Web开发中的相关技术。本书共分17章,分别介绍了JavaScript的对象编程、JavaScript浏览器对象模型和事件机制、ExtJS的核心类库和组件、ExtJS的事件处理方式、设计进度条、设计工具栏和菜单栏、设计面板、设计表格、设计表单、设计数据表、对Ajax的支持以及如何调试等。最后利用一个商品信息管理系统和一个企业任务管理系统,向读者演示了ExtJS在实际项目中的应用以及实现流程。
《精通JS脚本之ExtJS框架》附有配套光盘,提供了书中实例的源代码和视频教学文件。此外,读者还可以通过访问itzcn网站来获得即时在线帮助。
《精通JS脚本之ExtJS框架》可以作为Web开发的自学参考书,也可以作为RIA Web程序开发的培训教材。
第1章 JavaScript入门必备
1.1 JavaScript语言概述
1.1.1 JavaScript简介
1.1.2 JavaScript特点
1.1.3 JavaScript与Java
1.2 第一个JavaScript程序
1.2.1 嵌入JavaScript
1.2.2 链接外部JavaScript文件
1.2.3 注意事项
1.3 基础语法
1.3.1 数据类型
1.3.2 变量与常量
1.3.3 运算符
1.4 流程控制语句
1.4.1 if条件语句
1.4.2 switch条件语句
1.4.3 while循环语句
1.4.4 do while循环语句
1.4.5 for循环语句
1.4.6 for in循环语句
1.4.7 try catch finally语句
1.4.8 其他语句
第2章 JavaScript浏览器对象模型与事件处理
2.1 浏览器对象模型
2.1.1 文档对象
2.1.2 表单及其元素对象
2.1.3 浏览器信息对象
2.1.4 窗口对象
2.1.5 网址对象
2.1.6 历史记录对象
2.2 基本事件处理
2.3 2级DOM事件模型
2.3.1 事件传播
2.3.2 注册事件处理程序
2.3.3 event对象
2.4 常用事件
2.4.1 键盘事件
2.4.2 鼠标事件
2.4.3 页面事件
第3章 开始使用ExtJS
3.1 ExtJS概述
3.1.1 ExtJS简介
3.1.2 ExtJS中的基本概念
3.1.3 ExtJS与常见JavaScript库的介绍与对比
3.2 创建第一个程序
3.2.1 下载ExtJS
3.2.2 部署到开发工具中
3.2.3 编写HelloWorld.html
3.2.4 运行调试ExtJS
3.3 辅助开发
3.3.1 调试工具Firebug
3.3.2 开发利器Spket
第4章 ExtJS事件机制
4.1 设计模式——观察者模式
4.2 自定义事件
4.3 浏览器事件
4.4 ExtJS中的事件
4.4.1 Function.call()/apply()方法
4.4.2 函数的作用域
4.4.3 Ext.lib.Event事件
4.4.4 Ext.util.Observable事件
4.4.5 Ext.EventManager事件
4.4.6 Ext.EventObject事件
4.5 各种事件登记方式
4.5.1 传统式登记
4.5.2 内联式登记
4.5.3 Dom Level2登记
4.6 高级组件事件
4.7 ExtJS键盘事件
第5章 ExtJS组件
5.1 核心组件
5.1.1 ExtJS组件结构
5.1.2 Ext.Component
5.1.3 Ext.BoxComponent
5.1.4 Ext.Container
5.1.5 Ext.Panel
5.1.6 Ext.TabPanel
5.2 信息提示框组件
5.2.1 Ext.MessageBox简介
5.2.2 Ext.MessageBox.alert()
5.2.3 Ext.MessageBox.confirm()
5.2.4 Ext.MessageBox.prompt()
5.2.5 Ext.MessageBox.wait()
5.2.6 Ext.MessageBox.show()
5.2.7 Ext.MessageBox的其他功能
5.3 进度条组件
5.3.1 Ext.ProgressBar简介
5.3.2 手工模式的进度条
5.3.3 自动模式的进度条
5.3.4 自定义样式的进度条
5.4 工具栏和菜单栏
5.4.1 Ext.Toolbar简介
5.4.2 只包含按钮的简单工具栏
5.4.3 包含多种元素的复杂工具栏
5.4.4 Ext.menu.Menu简介
5.4.5 最简单的菜单栏
5.4.6 创建三级或多级菜单
5.4.7 具有选择框的菜单
第6章 页面元素与模板
6.1 构成用户界面的元素
6.2 获取页面元素
6.3 元素常见的使用方法
6.3.1 常见的“显示/隐藏”方法
6.3.2 常见的“内容控制”方法
6.3.3 常见的“操控DOM”方法
6.3.4 常见的“尺寸大小/定位”方法
6.3.5 常见的“特效动画”方法
6.3.6 DomHelper简介
6.4 DomQuery入门
6.4.1 元素选择符Selector
6.4.2 属性选择符Attributes Selectors
6.4.3 CSS值元素选择符
6.4.4 Ext.query与Ext.select
6.5 应用模板
6.5.1 Ext.Template
6.5.2 Ext.XTemplate
第7章 设计表单类布局
7.1 Form表单简介
7.1.1 Form表单的基本配置
7.1.2 ExtJS对Form表单的封装
7.2 ExtJS的表单组件
7.2.1 文本输入控件Ext.form.TextField
7.2.2 多行文本输入控件Ext.form.TextArea
7.2.3 单选框
7.2.4 复选框
7.2.5 下拉列表框
7.2.6 日期输入控件Ext.form.DateField
7.2.7 在线编辑器Ext.form.HtmlEditor
7.3 ExtJS表单组件的综合应用
第8章 设计表格类布局
8.1 表格简介
8.1.1 表格的基本属性
8.1.2 制作第一个表格
8.2 表格常用功能详解
8.2.1 主要属性功能
8.2.2 自定义列宽度
8.2.3 执行按列排序
8.2.4 解决中文排序
8.2.5 格式化显示日期类型数据
8.3 美化表格
8.4 设置表格背景颜色
8.5 显示行号和复选框
8.5.1 显示行号
8.5.2 引用复选框
第9章 表格的高级功能
9.1 表格视图——Ext.grid.GridView
9.2 表格分页
9.2.1 添加表格分页显示工具条
9.2.2 从后台脚本获得分页数据
9.2.3 在表格顶部显示分页工具条
9.2.4 实现前台分页效果
9.3 可编辑表格控件——EditorGrid
9.3.1 制作第一个EditorGrid
9.3.2 添加一行数据
9.3.3 保存修改结果
9.3.4 验证EditGrid中的数据
9.3.5 限制输入数据的类型
9.4 PropertyGrid属性表格控件
9.4.1 PropertyGrid简介
9.4.2 只读的PropertyGrid
9.4.3 对name列强制排序并获得value
9.4.4 自定义编辑器
9.5 分组表格控件——Group
9.5.1 分组表格简介
9.5.2 Ext.grid.GroupingView的配置操作
9.6 可拖放的表格
9.6.1 拖放改变表格的大小
9.6.2 在同一个表格里拖放
9.6.3 表格之间的拖放
9.6.4 表格与树之间的拖放
第10章 设计树状结构布局
10.1 TreePanel的基本使用
10.1.1 创建一棵树
10.1.2 为树生枝展叶
10.1.3 树形的配置
10.1.4 使用TreeLoader获得数据
10.1.5 读取本地JSON数据
10.2 树的事件
10.3 右键菜单
10.4 修改节点的默认图标
10.5 从节点弹出对话框
10.6 节点提示信息
10.7 为节点设置超链接
10.8 树形的拖放
10.8.1 节点拖放的3种形式
10.8.2 叶子不能append
10.8.3 判断拖放的目标
10.8.4 树之间的拖放
10.9 树形过滤器TreeFilter
10.10 利用TreeSorter对树进行排序
10.11 树形节点视图——Ext.tree.TreeNodeUI
10.12 表格与树形的结合——Ext.ux.tree.ColumnTree
第11章 其他布局类简介
11.1 标准布局类
11.1.1 折叠布局——AccordionLayout
11.1.2 边框布局——BorderLayout
11.1.3 卡片式布局——CardLayout
11.1.4 列布局——ColoumnLayout
11.1.5 锚点布局——AnchorLayout
11.1.6 自适应布局——FitLayout
11.1.7 ContainerLayout
11.2 与布局有关的其他知识
11.2.1 父类Ext.Container公共配置与xtype的概念
11.2.2 使用Viewport
11.2.3 实现表单元素横排
第12章 ExtJS对Ajax的支持
12.1 Ext.Ajax介绍
12.1.1 Ext.Ajax.request方法详解
12.1.2 Ext.Ajax.request操作示例
12.1.3 Ext.Ajax.request提交XML数据
12.2 Ext.Updater基础
12.2.1 Ext.Updater.update方法
12.2.2 Ext.Updater.update操作示例
12.3 利用Ajax优化Web应用框架
12.3.1 多级联动菜单
12.3.2 Ajax修改用户密码
12.3.3 自动保存的网络记事本
12.3.4 网页计算器
第13章 设计数据驱动模式
13.1 XML/JSON数据格式比较
13.2 容器类MixedCollection
13.3 数据存储基本单元Record与dataField
13.3.1 dataField
13.3.2 Record
13.4 数据存储store
13.4.1 数据载入
13.4.2 对数据进行排序
13.4.3 从store 中获取数据
13.4.4 更新store 中的数据
13.4.5 加载及显示数据
13.5 数据代理
13.5.1 Ext.data.DataProxy
13.5.2 Ext.data.MemoryProxy
13.5.3 Ext.data.HttpProxy
13.5.4 Ext.data.ScriptTagProxy
13.6 数据读取器
13.6.1 Ext.data.DataReader
13.6.2 Ext.data.ArrayReader
13.6.3 Ext.data.JsonReader
13.6.4 Ext.data.XmlReader
13.7 Ext.ux.DWR
13.7.1 Ext.data.DwrProxy
13.7.2 Ext.data.DWRTreeLoader
13.7.4 Web服务端配置
13.7.5 服务层接口
第14章 ExtJS扩展
14.1 利用Ext.extend实现继承
14.2 与ExtJS扩展相关的预备知识
14.2.1 定义命名空间
14.2.2 使用xtype
14.3 用户扩展和插件
14.3.1 编写自定义用户扩展
14.3.2 常用插件UploadDialog
14.3.3 常用插件ManagedIFrame
14.4 使用ExtJS制作Flash统计报表
14.4.1 柱状图
14.4.2 折线图
14.4.3 饼状图
14.4.4 柱状栈图
第15章 调试JavaScript与HTML
15.1 Firebug的基本使用
15.1.1 开启或关闭Firebug
15.1.2 控制台
15.2 Firebug的应用
15.2.1 源代码调试
15.2.2 CSS调试
15.2.3 脚本调试
15.3 跟踪网络传输状态
15.4 在脚本文件中加入调试命令
15.5 在IE中使用Firebug
15.5.1 前端调试利器DebugBar
15.5.2 IE下的优秀JavaScript调试工具Companion.JS
15.5.3 DebugBar和Companion.JS的基本操作
15.6 调试技巧
15.6.1 在Firebug中直接调试脚本
15.6.2 调试代码运行速度
15.6.3 查看对象属性
第16章 ExtJS案例:商品信息管理系统
16.1 商品信息管理系统功能介绍
16.2 数据库设计和实现
16.2.1 数据库概念结构设计
16.2.2 数据库表设计
16.3 为项目做好准备
16.4 登录界面
16.5 栏目加载
16.6 为项目换肤
16.7 商品信息管理
16.7.1 商品信息的查询
16.7.2 商品信息的添加
16.7.3 商品信息的删除
16.7.4 商品信息的更新
第17章 ExtJS案例:企业任务管理系统
17.1 系统概述
17.2 需求分析
17.3 数据库设计
17.4 员工任务管理
17.4.1 个人任务处理
17.4.2 个人资料编辑
17.5 主管任务管理
17.5.1 部门计划处理
17.5.2 部门人员管理
17.6 系统管理员权限分配
Android华为C8812刷机教程
一、先刷Recovery (如果前面已经刷过recovery,就不需要再刷了)
1、在手机上开启USB调试,并安装驱动 (右键点 我的电脑-属性-设备管理器,查看有没有 android adb 驱动,一般连接过豌豆荚都有驱动了,没有的话可以自行安装,或者连接一次豌豆荚自动下载。)
(1) 在手机上选择“设置”,然后进入“开发人员选项”,勾选 “USB调试”
(2) 连接USB数据线
(3) 安装驱动,并检查驱动是否安装
2、手机进入 bootloader 状态 (也就是常说的 第一屏 状态)
(1) 在手机上选择“设置”,往下拖,找到“快速启动”,关闭
(2) 关机,并且拔掉数据线。并且关闭电脑上开启的豌豆荚、手机助手之类的工具
(3) 然后按 音量下 + 开机键,保持10秒左右,停留在第一屏,只显示华为菊花的状态,就是进入了 bootloader
3、把手机连接到电脑,运行recovery.exe,按提示进行
JSON入门例子
var obj,sid;//全局变量
$(document).ready(function() {
//看着DIV的样式(位置 ,高度,)
var stock=$("#stock").css("border","1px solid black")
.width("150px").css("position","absolute")
.css("z-index","99").css("background-color","blue")
.css("color","yellow");//隐藏
stock.hide();
var var_a=$("a");
//鼠标移上事件
var_a.mouseover(function(event){
var aNode=$(this);
var divNode=aNode.parent();
sid=divNode.attr("id");
update()
//找当前的位置
// var offset=aNode.offset();
// stock.css("left",offset.left+"px").css("top",offset.top+aNode.height()+"px");
/**
* 期望鼠标在右下方
*/
var $event=event||window.event;
stock.css("left",$event.clientX+5+"px").css("top",$event.clientY+5+"px");
stock.show();//显示DIV
});
//鼠标移开事件
var_a.mouseout(function(){
stock.hide();
});
getStockInfo();
//setInterval(getStockInfo, 1000);//设置每一秒钟变动股票
})
/**
* 获取信息
* @return
*/
function getStockInfo() {
$.post("JsonAction",null,function(data){
obj=eval(data);//
var S1=obj["112"];
var S2=obj["113"];
var sp1=$("#112").children("span");
sp1.html(S1.now);
if(S1.now>S1.yesterday){
sp1.css("color","red");//设置为红色
}else{
sp1.css("color","green");//绿色
}
var sp2=$("#113").children("span");
sp2.html(S2.now);
if(S2.now>S2.yesterday){
sp2.css("color","red");
}else{
sp2.css("color","green");
}
update()
});
}
/**
* 更新
* @return
*/
function update() {
var obje=obj[sid];
for (var pr in obje) {
if(pr!="name"){
$("#"+pr).children("span").html(obje[pr]);
}
}
}
spring源代码
package cn.javass.spring.chapter4;
import java.io.File;
import java.io.IOException;
import junit.framework.Assert;
import org.jboss.vfs.VFS;
import org.jboss.vfs.VirtualFile;
import org.jboss.vfs.spi.RealFileSystem;
import org.junit.Test;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
@SuppressWarnings("all")
public class ResourcePatternTest {
@Test
public void testClasspathPrefix() throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载
Resource[] resources = resolver.getResources("classpath:META-INF/INDEX.LIST");
Assert.assertEquals(1, resources.length);
//只加载一个匹配的Resource,且通过ResourceLoader.getResource进行加载
resources = resolver.getResources("classpath:META-INF/*.LIST");
Assert.assertTrue(resources.length == 1);
//只加载一个绝对匹配Resource,且通过ResourceLoader.getResource进行加载
resources = resolver.getResources("classpath:META-INF/MANIFEST.MF");
Assert.assertEquals(1, resources.length);
}
@Test
public void testClasspathAsteriskPrefix() throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//将加载多个绝对匹配的所有Resource
//将首先通过ClassLoader.getResources("META-INF")加载非模式路径部分
//然后进行遍历模式匹配
Resource[] resources = resolver.getResources("classpath*:META-INF/INDEX.LIST");
Assert.assertTrue(resources.length > 1);
//将加载多个模式匹配的Resource
resources = resolver.getResources("classpath*:META-INF/*.LIST");
Assert.assertTrue(resources.length > 1);
}
@Test
public void testClasspathAsteriskPrefixLimit() throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//将首先通过ClassLoader.getResources("")加载目录,
//将只返回文件系统的类路径不返回jar的跟路径
//然后进行遍历模式匹配
Resource[] resources = resolver.getResources("classpath*:asm-*.txt");
Assert.assertTrue(resources.length == 0);
//将通过ClassLoader.getResources("asm-license.txt")加载
//asm-license.txt存在于com.springsource.net.sf.cglib-2.2.0.jar
resources = resolver.getResources("classpath*:asm-license.txt");
Assert.assertTrue(resources.length > 0);
//将只加载文件系统类路径匹配的Resource
resources = resolver.getResources("classpath*:LICENS*");
Assert.assertTrue(resources.length == 1);
}
@Test
public void testFilekPrefix() throws IOException {
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("file:D:/*.txt");
Assert.assertTrue(resources.length > 0);
}
@Test
public void testVfsPrefix() throws IOException {
//1.创建一个虚拟的文件目录
VirtualFile home = VFS.getChild("/home");
//2.将虚拟目录映射到物理的目录
VFS.mount(home, new RealFileSystem(new File("d:")));
//3.通过虚拟目录获取文件资源
VirtualFile testFile = home.getChild("test.txt");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("/home/test.txt");
Assert.assertTrue(resources.length > 0);
System.out.println(resources[0].getClass());
}
}
在Eclipse下使用SVN-CC-GIT-VSS-CVS代码管理工具最终版详细说明书
在Eclipse下使用SVN-CC-GIT-VSS-CVS代码管理工具最终版详细说明书
sqlserver存储过程
---创建数据库
create database CRM;
--删除数据库
drop database CRM;
--创建一个表
if exists(select * from sysobjects where name='Users')
drop table Users
go
create table Users(
Id int identity(1,1) not null primary key, --顾客编号,主键 按一进行自动增长
UserName varchar(50)not null,
PassWord varchar(50)not null,
Address varchar(250)not null,
)
go
----------------------------------------插入100条数据进Users表,进行下面对分页做准备----------------
Begin
Declare @n bigint
Declare @Sql nvarchar(225)
set @n=0
While @n<100--导入100条相同的数据进Users表
Begin
Set @Sql='Insert into Users Values(''jilongliang'',''123456'',''广东阳春'')'
Exec (@Sql)
set @n=@n+1
End
End
------------查询一下是不是插入---------------
Select *from Users;
-------------------------存储过程创建语法-----------------------------------
/*
1.存储过程创建语法
create proc | procedure pro_name
[{@参数数据类型} [=默认值] [output],
{@参数数据类型} [=默认值] [output],
....
]
as
SQL_statements
*/
---------------------------------------------------------------------------------
-------------------------- 带参存储过程-----------------------------------
if (object_id('proc_find_users', 'P') is not null)
drop proc proc_find_users
go
create proc proc_find_users(@startId int, @endId int)
as
---between and 表示在那个两个数字之间
select * from users where Id between @startId and @endId
go
exec proc_find_users 42, 64;
---------------------------------------------------------------------------------
--------------------------------带通配符参数存储过程-----------------------------
if (object_id('proc_findUsersByName', 'P') is not null)
drop proc proc_findUsersByName
go
create proc proc_findUsersByName(@UserName varchar(20) = '%j%', @nextName varchar(20) = '%')
as
select * from Users where UserName like @UserName and UserName like @nextName;
go
exec proc_findUsersByName;
exec proc_findUsersByName '%l%', 'j%';
---------------------------------------------------------------------------------------
----------------------------------------带输出参数存储过程---------------------------------------
if (object_id('proc_getUsersRecord', 'P') is not null)
drop proc proc_getUsersRecord
go
create proc proc_getUsersRecord(
@Id int, --默认输入参数
@UserName varchar(20) out, --输出参数
@address varchar(20) output --输入输出参数
)
as
select @UserName = UserName, @address = address from Users where Id = @Id and Address = @address;
go
---------------声明变量
declare @id int,
@address varchar(20),
@UserName varchar(20),
@temp varchar(20);
set @id = 71;
set @temp = 1;
exec proc_getUsersRecord @id, @UserName out, @temp output;
select @UserName as 用户名, @temp as temp,@address as 地址;
print @UserName + '#' + @temp;
---------------------------------------------------------------------------------------
-----------------------------------不缓存存储过程---------------------------------------
--WITH RECOMPILE 不缓存
if (object_id('proc_temp', 'P') is not null)
drop proc proc_temp
go
create proc proc_temp
with recompile
as
select * from users;
go
exec proc_temp;
-----------------------------------加密存储过程-------------------------------------
--加密WITH ENCRYPTION
if (object_id('proc_temp_encryption', 'P') is not null)
drop proc proc_temp_encryption
go
create proc proc_temp_encryption
with encryption
as
select * from users;
go
exec proc_temp_encryption;
exec sp_helptext 'proc_temp';
exec sp_helptext 'proc_temp_encryption';
-----------------------------------带游标参数存储过程-------------------------------------
if (object_id('proc_cursor', 'P') is not null)
drop proc proc_cursor
go
create proc proc_cursor
@cur cursor varying output
as
set @cur = cursor forward_only static for
select Id, UserName, Address from Users;
open @cur;
go
--调用
declare @exec_cur cursor;
declare @Id int,
@UserName varchar(50),
@Address varchar(250);
exec proc_cursor @cur = @exec_cur output;--调用存储过程
fetch next from @exec_cur into @Id, @UserName, @Address;
while (@@fetch_status = 0)
begin
fetch next from @exec_cur into @Id, @UserName, @Address;
print 'Id: ' + convert(varchar, @Id) + ', name: ' + @UserName + ', Address: ' + @Address;
end
close @exec_cur;
deallocate @exec_cur;--删除游标
----------------------------------------------------------
select * from sys.messages;
--使用sysmessages中定义的消息
--------------------------------Query---------------------
Create PROCEDURE proc_LoginUser
@userName varchar(50),
@password varchar(50)
as
begin
select UserName,PassWord from Users
where UserName = @userName
and PassWord = @PassWord
end
GO
--这个Go注意不要放在Exec后面,否则报超出了存储过程、函数、
--触发器或视图的最大嵌套层数(最大层数为 32)
exec proc_LoginUser @userName = 'admin',@PassWord = 'admin'
--------------------------------Insert---------------------
Create proc proc_InsertUsers
@UserName varchar(50),
@PassWord varchar(50),
@Address varchar(150)
as
insert into proc_InsertUsers values(@UserName,@PassWord,@Address)
--------------------------------Update---------------------
--修改模块信息,根据模块Id
Create proc proc_UpdateUser
@UserName varchar(50),
@PassWord varchar(50),
@Address varchar(150),
@Id int
as
update Users set UserName=@UserName,PassWord=@PassWord ,Address=@Address
where Id = @Id
--------------------------------Delete---------------------
Create proc proc_DeleteById
@Id int
as
delete from Users where Id=@Id
-----------------------------------------------------------
-------------------------------------------------------------------------------------
----------------------------------分页存储过程--------------------------------------
-------------------------------------------------------------------------------------
If (object_id('pro_page', 'P') is not null)
drop proc proc_Page
GO
create procedure proc_Page(
@pageIndex int,
@pageSize int
)
as
declare @startRow int, @endRow int --声明变量
set @startRow = (@pageIndex - 1) * @pageSize +1 --设值
set @endRow = @startRow + @pageSize -1 --设值
select ID,UserName,Address,PassWord,t.number from --t.number的行号
(
select ID,UserName,Address,PassWord, row_number()
over (order by id asc) as number from Users
) t
where t.number between @startRow and @endRow;
GO
----执行
exec proc_Page 1, 3; -- 一页,三条数据
-------------------------------------------------------------------------------------
---存储过程、row_number完成分页
if (object_id('pro_page', 'P') is not null)
drop proc proc_cursor
-- drop proc pro_page
go
create proc pro_Page
@startIndex int,
@endIndex int
as
select count(*) as Total from Users; --计算出来总数
select * from (
select row_number() over(order by Id) as rowId, * from Users
) temp
where temp.rowId between @startIndex and @endIndex
go
exec pro_Page 1, 4
-------------------------------------------------------------------------------------
-------------------------------------数据库的函数--------------------------------------
exec sp_databases; --查看数据库
exec sp_tables; --查看表
exec sp_columns users;--查看列
exec sp_helpIndex users;--查看索引
exec sp_helpConstraint users;--约束
exec sp_stored_procedures;
exec sp_helptext 'sp_stored_procedures';--查看存储过程创建、定义语句
exec sp_rename users, stuInfo;--修改表、索引、列的名称
exec sp_renamedb myTempDB, myDB;--更改数据库名称
exec sp_defaultdb 'master', 'myDB';--更改登录名的默认数据库
exec sp_helpdb;--数据库帮助,查询数据库信息
exec sp_helpdb master;
-------------------------------------------------------------------------------------
---------------------------数据库的sp_rename重命名函数-------------------------------
--表重命名
exec sp_rename 'users', 'tb_users';
select * from tb_users;
--列重命名
exec sp_rename 'tb_users.name', 'sName', 'column';
exec sp_help 'tb_users';
--重命名索引
exec sp_rename N'tb_users.idx_cid', N'idx_cidd', N'index';
exec sp_help 'tb_users';
--查询所有存储过程
select * from sys.objects where type = 'P';
select * from sys.objects where type_desc like '%pro%' and name like 'sp%';
超级有影响力霸气的Java面试题大全文档
超级有影响力的Java面试题大全文档
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
5、String是最基本的数据类型吗?
基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类
6、int 和 Integer 有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型 封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
7、String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用 StringBuffers来动态构造字符数据。
8、运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
9、说出Servlet的生命周期,并说出Servlet和CGI的区别。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。
10、说出ArrayList,Vector, LinkedList的存储性能和特性
ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
11、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。
EJB包括Ses
Java常见的面试程序题
最常见的Java面试题大全的程序面试程序,很有影响力的哦!好好珍惜这个资料吧!有Java的常见面试题的冒泡,常见的算法,继承,多态
1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
张孝祥java就业面试宝典
孝祥java就业面试宝典,绝对的经典啊. ... 首页 资源分类 排行榜 帮助 高级搜索 · 下载频道>资源分类>开发技术>Java>张孝祥java就业面试宝典基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io 的语法,虚拟机方面的语法,其他。有些题来自网上搜集整理,有些题来自传智播客学员面试后的反馈,说真的,少数一些网上的面试题,我真怀疑其是否还有存在价值!
Android工程师面试题
百度 Android开发面试题
本文来自安卓航班网整理搜集 www.apkway.com
原文地址:http://www.apkway.com/forum.php?mod=viewthread&tid=2057
1、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,
都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进
程,所以说可以认为是同一个概念。
2、sim卡的EF 文件有何作用
sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本
身可以有自己的操作系统,EF就是作存储并和手机通讯用的
3、嵌入式操作系统内存管理有哪几种,各有何特性 ?
页式,段式,段页,用到了MMU,虚拟空间等技术
4、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度
予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作
出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工
业控制、军事设备、
航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可
分为软实时和硬实时两种,而android是基于 linux内核的,因此属于软实时。
5、一条最长的短信息约占多少byte?
中文70(包括标点),英文160个字节
6、 android中的动画有哪几类,它们的特点和区别是什么?
两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方
式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种 Frame动画,
传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
7、handler机制的原理
andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先
出原则。 Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程可以产生一个Looper 对象,由它来管理此线程里的
Message Queue(消息队列)。
2)Handler: 你可以构造Handler对象来与 Looper沟通,以便push新消息到
Message Queue里;或者接收Looper 从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而Android启动程序时会替它
建立一个Message Queue。
8、说说mvc模式的原理,它在android 中的运用
MVC(Model_view_contraller)” 模型_视图_控制器”。 MVC应用程序总是由这
三个部分组成。Event(事件)导致Controller 改变Model或View,或者同时改
变两者。只要 Controller改变了Models的数据或者属性,所有依赖的View都
会自动更新。类似的,只要Controller改变了View,View会
从潜在的Model中获取数据来刷新自己。
View重绘和内存泄露的好像是面试经常问的问题
1. View的刷新:
在需要刷新的地方,使用handle.sendmessage发送信息,然后在handle的
getmessage里面执行invaliate或者postinvaliate.
2. GC内存泄露
出现情况:
1.数据库的cursor没有关闭
2.构造adapter时,没有使用缓存contentview
衍生listview的优化问题-----减少创建 view的对象,充分使用
contentview,可以使用一静态类来优化处理getview的过程/
3.Bitmap对象不使用时采用recycle()释放内存
4.activity中的对象的生命周期大于activity
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]
还有其他问题,大家欢迎提出阿,可以是整体架构的,还有这个Hal层.
这篇文章会涉及到以下几个内容
一 Activity的生命周期
二 让Activity变成一个窗口:Activity 属性设定
三 你后台的Activity被系统
回收怎么办:onSaveInstanceState
四 调用与被调用:我们的通信使者 - Intent
一 Activity的生命周期
和其他手机 平台 的应用程序一样,Android的应用程序的生命周期是被统
一掌控的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不
能改变它,只能学习并适应它。
简单地说一下为什么是这样:我们手机在运行 一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程
序都会被中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源,
至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。言归正传,
Activity的基本生命周期如下代码所示:
Java 代码
public class MyActivity extends Activity
{
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
你自己写的Activity会按需要
重 载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,
他们被调用的顺序是 onCreate -> onStart ->onResume, 在Activity被干掉的
时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,
但是有人问了
,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的
一个Activity是全屏的那么:onPause->onStop ,恢复的时候
onStart->onResume ,如果打断
这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么只
是onPause ,恢复
的时候onResume 。
详细介绍一下这几个方法中系统在做什么以及我们应该做什么:
onCreate:
在这里创建界面,做一些数据的初始化工作
onStart:
到这一步变成用户可见不可交互的
onResume:
变成和用户可交互的,(在activity 栈系统通过栈的方式管理这些个Activity
的最上面,运行完弹出栈,则回到上一个Activity)
onPause:
到 这一步是可见但不可交互的,系统会停止动画等消耗CPU 的事情从上文的描
述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降
低,有可能被系统收回。在这里保存的数据,应该在 onResume里读出来,注意:
这个方法里做的事情时间要短,因为下一个activity不会等到这个方法完成才
启动
onstop:
变得不可见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调
用finish方法或者是系统为了节省空间将它暂时性的干掉,可以用
isFinishing()来判断它,如果你有一个Progress Dialog在线程中转动,请在
onDestroy里把他cancel掉,不然等线程结束的时候,调用Dialog的cancel
方法会抛异常的。
onPause,onstop, onDestroy,三种状态下 activity都有可能被系统干掉为
了保证程序的正确性,你要在onPause()里写上持久层操作的代码,将用户编辑
的内容都保存到存储介质上(一般 都是数据库)。实际工作中因为生命周期的
变化而带来的问题也很多,比如你的应用程序起了新的线程在跑,这时候中断了,
你还要去维护那个线程,是暂停还是杀 掉还是数据回滚,是吧?因为Activity
可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了,一般我都
是采用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问
题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟
大家分享。
二 让Activity变成一个窗口:Activity属性设定
讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东
西,那么很 简单你只需要设置一下Activity的主题就可以了在
AndroidManifest.xml 中定义 Activity的地方一句话:
Xml代码
android
:theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"
这就使你的应用程序变成对话框的形式弹出来了,或者 Xml代码
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
就 变成半透明的,[友情提示-.-]类似的这种activity的属性可以在
android.R.styleable 类的AndroidManifestActivity 方法中看到,
AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类
android.R.styleable
上面说的是属性名称,具体有什么值是在android.R.style中
可以看到,比如这个"@android:style/Theme.Dialog"就对应于
android.R.style.Theme_Dialog ,('_'换成'.' <--注意:这个是文章内容不是
笑脸)就可以用在描述文件
中了,找找类定义和描述文件中的对应关系就都明白了。
三 你后台的Activity被系统回收怎么办:onSaveInstanceState
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的
Activity B 这个时候A会执行
Java代码
public
void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
public void
onSaveInstanceState(Bundle outState) {
B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有
被回收,被回 收的A就要重新调用onCreate()方法,不同于直接启动的是这
回 onCreate()里是带上参数 savedInstanceState,没被收回的就还是
onResume就好了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你
维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate
就不会有它,所以用的时候要判断一下是否为空。
Java代码
if(savedInstanceState !=null){
long id =savedInstanceState.getLong("id");
}
if(savedInstanceState !=null){
就像官方的Notepad教程
里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记
住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。
这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不
需要特殊记住什么,哦,
没准你需要记住滚动条的位置... 四 调用与被调用:我们的通信使者Intent
要 说Intent了,Intent就是这个这个意图,应用程序间Intent进行交流,打
个电话啦,来个电话啦都会发Intent, 这个是Android架构的松耦合的精髓部
分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打
电话,很简单啊,看下代码先:
Java代码 :
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+ number));
startActivity(intent); 复制代码
扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。
什么读联系人,发短信啊,邮件啊,统统只需要扔出intent就好了,这个部分
设计地确实很好啊。
那Intent通过什么来告诉系统需要谁来接受他呢?
通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如
下:
Java代码
Intent intent = new Intent(this,MyActivity.class);
intent.getExtras().putString("id","1");
startActivity(intent);
Intent intent = new
Intent(this,MyActivity.class);intent.getExtras().putString("id","1");
tartActivity(intent);复制代码 第一种方式很明显,直接指定了MyActivity 为接受者,并且传了一些数据给
MyActivity,在MyActivity里可以用getIntent()来的到这个 intent 和数据。
第二种就需要先看一下AndroidMenifest中的 intentfilter的配置了
Xml代码
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:value="android.intent.action.EDIT" />
<action android:value="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:value="android.intent.action.EDIT" />
<action android:value="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
这里面配置用到了action, data, category 这些东西,那么聪明的你一定想到
intent里也会有这些东西,然后一匹配不就找到接收者了吗?
action其实就是一个意图的字符串名称。
上 面这段intent-filter的配置文件说明了这个Activity可以接受不同的
Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider 就知道了,
必须指定 mimeType才能让数据被别人使用。
不知道原理说明白没,总结一句,就是你调用别的界面不是直接 new那个界面,
而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,
而且符合了生命周期被系统管理的原则。
想知道category都有啥,Android为你预先定制好的action都有啥等等,请
亲自访问官方链接Intent
ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的logcat,每次
运行一个程序的时候是不是有一些信息比如:
Starting activity: Intent
{action=android.intent.action.MAINcategories={android.intent.category
.LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera
.GalleryPicker} }
再对照一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:)
一,listview你是怎么优化的。
二,view的刷新,之前说过
三,IPC及原理
四,Android多线程
五,Android为什么要设计 4大组件,他们之间的联系,不设计行不行(主要是
为了实现MVC模式,然而java中最难的模式也是这个,很少有产品能将这个模
式做得很好【Technicolor的面试官问的这个】)
六,service的周期,activity的周期,谈下你对Android内部应用的了解,比
如他做电话,以及联系人等等应用。框架层有很多东西还是多看看,熟悉 Android
怎么做的,不管你做应用程开发还是应用框架层开发很有好处的。
在就是你项目经验,突出你遇到什么难点,然后是怎么解决的!尽量将每个技术
点凸显出来,当然面试官有时候会为了体现你是否真正做过,他会问你,你在这
个应用中做那个模块,用了多少个类之类的问题。
偶尔有的面试官会问你,你用过Android自带的单元测试了没,怎么用的?
当然我面试过很多家单位,有的是做平板,手机,数字电视,有的是做出个 erp
之类的客户端等等,出于前面的三个,基本上都是将 Android的全部改掉,如果
真正要做Android的话,大家要学的还很多。
总 之,一句话,什么样的面试官都有,去面试的时候要做好一切心理准备,不
管是技术还是基础都得扎实。一个人的交谈能力也很重要,总之不是非常标准的
普通话, 最起码你说的得让别人听得懂,而且得把面试官讲得非常彻底,这样
你获得offer的机会更大,谈工资也有优势~~当然曾经一家公司的面试官跟我说
过,技术 是不惜钱的,只要你有能力,多少钱他都请。
1.View如何刷新?
2.DDMS与TraceView的区别?
3.activity被回收了怎么办?
4.在Java中如何引入 C语言?
参考答案 :
1.View 可以调用invalidate()和postInvalidate()这两个方法刷新
2.DDMS是一个程序执行查看器,在里面你可以看见线程和堆栈等信息,
TraceView是程序性能分析器
3.activity回收了,那就只有另起了
4.java调用C语言程序,可以用JNI接口来实现
上面答案仅作参考,毕竟我个人能力也有限嘛,难免会回答错误,呵呵.....
解答: 1.View受系统刷新(系统内部有个循环,监控事件、做业务处理、绘UI),
可以用postInvalidate()促使系统刷新。
2.(还真不知道)
3.请参照Activity生命周期,如果被系统destroy了,也就是说的回收,只
有从新start了
4.通过JNI调用。建议阅读《The Java Native InterfaceProgrammer's Guide
and Specification》,英文版的,从sun网站下吧。
c++面试大全文档(很全的哦)
金山软件公司c++面试题
一、请你就C/C++或者JAVA代码行数、注释行数统计工具的实现,描述一下:
1、 需要考虑哪些过滤条件?你如何处理?
答:过滤条件:(取得每行并去掉两头的空格后)
⑴空行,行的长度为0;⑵如果是以//开头,为注释行;⑶//在行中,并判断不是在字符串中,即“”中,为代码+注释混合行,//在“”中时为代码行;⑷如果/*在行中,判断是否是在“”内,否则为注释行,*/不在“”中时是结束 ;⑸/* */只在一行,判断行中是否有代码,无代码为注释行,有代码是混合行;⑹/* */多行,并且/*前无代码,/*后无代码,去掉其中空行都是注释行;⑺/* */多行,/*在代码后,或*/后有代码,有混合行;⑻一行中有2个/*并且就1个*/,此行为混合行,其后是注释行。
2、 怎样提升这个工具的易用性?
答:把这个工具设置成图形界面,用户只需输入文件名或者在文件对话框中选择文件即可点击运行输出结果。
本题只需要提供思路文档,不需要程序代码。
二、给定一个自然数n,试完成如下程序,它输出不大于n的所有素数(质数)。
1、 请提供程序代码,以及思路文档。
答:思路:求出一个数j的平方根sqrt(j),将j除以2~sqrt(j)之间的数,只要除尽一次,就不是素数,之后数j加2。
#include<stdio.h>
#include<math.h>
void main()
{ int N=1000;
int i,j,k,m=0;
for(j=1;j<N;j=j+2) /*1-N间的素数*/
{ k=(int)sqrt(j); /*求平方根*/
for(i=2;i<=k;i++)
{ if(j%i==0) /*只要除尽一次,就不是素数*/
break;
}
if(i>k) /*/除到k一直没除尽,是素数*/
printf("%d ",j);
}
}
3、 请分析一下可以从哪些角度可优化该程序的时间性能?
答:偶数(除了2)不能为素数;判断一个数j是否为素数,只要将其除以2 ~ sqrt(j)之间的素数,更进一步,没有必要对所有奇数进行试除,只需对所有sqrt(j)以内的所有质数试除就可以了。
三、高精度乘法
用户输入两个不大于 256 位的正整数,由程序进行乘法运算,并显示运算过程与结果。例:
输入:12, 32
仿QQ界面的UI开发源代码
本帖最后由 meimei 于 2012-6-4 18:00 编辑
最近,有点空闲的时间就拿QQ登录界面来模仿练手,做了个简单的登录界面。界面一般般吧,不算很漂亮,现在拿出来分享,希望大家一起学习与进步。有什么不足之处,请各位大侠多多赐教,谢谢。这个界面涉及到LinearLayout、TableLayout和RelativeLayout等等。话不多说,先把截图弄出来先。
1.界面预览图(这个是模拟器上面的预览图):
2.运行结果截图(这个是模拟器运行时的截图):
大家肯定发现了,预览图和实际运行的结果是有很大差别的。
3.大纲视图(Eclipse下截的图,这个直白行了):
4.XML代码(各个布局的说明已经很清楚了):
Docker+Jenkins+GitLab+Maven+SpringBoot&SpringCloud实现自动化构建镜像与部署详解
Docker+Jenkins+GitLab+Maven+SpringBoot&SpringCloud实现自动化构建镜像与部署详解
https://www.jianshu.com/p/bdb0642b7495
本文章会涉及Docker常见命令基础知识点结合不同场景实操一起使用。
本文章会涉及结合工作过程中部署不同环境服务器的项目案例场景为初心进行实际细讲。
本文章主要讲述Docker、Jenkins、GitLab、Git、JDK、SpringBoot、Maven等技术结合实现自动化运维部署(DevOps)应用工程,适合SpringCloud部署。
初衷想法:在学习过程中遇到比较有趣的问题、然而花了点心血和时间去整理,然而进行梳理出来一份文章比较完整有知识体系的DevOps自动化构建与部署工程文章,技术知识内容比较多,而且文章内容较长,然而分了几个章程来讲述。
xftp&xshell6.0.zip
Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作
银行ATM取款机系统项目案例实操
为了更好的了解SQL语法与知识体系
提高自身对SQL脚本的认识。如:SQL的结构,SQL的关键字的使用
在深入了解SQL之后可以提高自己的认知度,
比如:工作中不论是建表(建模)或是开发工作中,经过自身的学习,在不同的场景下使用它肯定会意想不到的收获的喜悦与丰收
SQL Server 2005 银行ATM取款机系统项目案例实操
Kotlin +SpringBoot + MyBatis完美搭建最简洁最酷的前后端分离框架
Kotlin +SpringBoot + MyBatis完美搭建最简洁最酷的前后端分离框架
Netty in Action和章节源代码
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序下载后压缩包中包含Netty in Action第五版英文版,Netty in Action阿里大牛精心翻译的中文版,还有本书的所有章节的源代码
Hadoop权威指南中文版PDF
Hadoop权威指南_中文版,Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。
OkHttpClientUtil封装类
封装OkHttp的异步求在子线程发起网络请求post,get,https请求代码类
PMBOK6指南
【高清_PMBOK_第六版_中文版】PMBOK是Project Management Body Of Knowledge的缩写, 指项目管理知识体系的意思,具体是美国项目管理协会(PMI)对项目管理所需的知识、技能和工具进行的概括性描述。本平台这里带来了最新的PMBOK第六版指南中文版及英文版下载,需要的朋友可下载!
项目管理协会的资格认证之所以能在如此广的行业和地域范围内被迅速认可,首先是项目管理本身的重要性和实用性决定的,其次很大程度上是得益于该项认证体系本身的科学性。PMI早在七十年代末就率先提出了项目管理的知识体系(Project Management Body of Knowledge,简称为PMBOK)。
该知识体系构成项目管理职业资格认证考试的基础。它的第一版是由PMI组织了200多名世界各国项目管理专家历经四年才完成,可谓集世界项目管理界精英之大成,避免了一家之言的片面性。而更为科学的是每隔数年,来自于世界各地的项目管理精英会重新审查更新PMBOK的内容,使它始终保持最权威的地位。
spring cloud zuul
Zuul的规则引擎允许通过任何JVM语言来编写规则和过滤器, 支持基于Java和Groovy的构建。(spring cloud zuul整合例子包能运行)
Spring Cloud Hystrix
Spring Cloud Hystrix 实现了断路器、线路隔离等一系列服务保护功能(整合例子,包能运行)
springcloud-Eureka
spring Cloud Netflix技术栈中,Eureka作为服务注册中心对整个微服务架构起着最核心的整合作用,因此对Eureka还是有很大的必要进行深入研究。(Eureka整合例子包能运行)
spring cloud config
spring cloud config&bus;整合例子包能运行,包含rabbitmq
Thinking In Java
《Thinking In Java》中文版
作者:Bruce Eckel
主页:http://www.BruceEckel.com
编译:Trans Bot
主页:http://member.netease.com/~transbot
致谢
--献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!
指导您利用万维网的语言进行面向对象的程序设计
完整的正文、更新内容及程序代码可从http://www.bruceeckel.com下载
从Java 的基本语法到它最高级的特性(网络编程、高级面向对象能力、多线程),《Thinking In Java》都
能对您有所裨益。Bruce Eckel优美的行文以及短小、精悍的程序示例有助于您理解含义模糊的概念。
面向初学者和某种程度的专家
教授Java 语言,而不是与平台有关的理论
覆盖Java 1.2 的大多数重要方面:Swing 和新集合
系统讲述Java 的高级理论:网络编程、多线程处理、虚拟机性能以及同非Java 代码的连接
320个有用的Java 程序,15000 行以上代码
解释面向对象基本理论,从继承到设计方案
来自与众不同的获奖作者Bruce Eckel
可通过万维网免费索取源码和持续更新的本书电子版
从www.BruceEckel.com获得配套 CD(含15 小时以上的合成语音授课)
读者如是说:“最好的 Java 参考书⋯⋯绝对让人震惊”;“购买Java 参考书最明智的选择”;“我见过的
最棒的编程指南”。
Bruce Eckel也是《Thinking in C++》的作者,该书曾获1995 年 SoftwareDevelopment Jolt Award最佳书
籍大奖。作为一名有20经验的编程专家,曾教授过世界上许多地区的人进行对象编程。最开始涉及的领域是
C++,现在也进军 Java。他是C++标准协会有表决权的成员之一,曾就面向对象程序设计这一主题写过其他 5
本书,发表过150多篇文章,并是多家计算机杂志的专栏作家,其中包括《Web Techniques》的Java 专栏。
曾出席过C++和 Java 的“软件开发者会议”,并分获“应用物理”与“计算机工程”的学士和硕士学位。
读者的心声
比我看过的 Java 书好多了⋯⋯非常全面,举例都恰到好处,显得颇具“智慧”。和其他许多 Java 书
籍相比,我觉得它更成熟、连贯、更有说服力、更严谨。总之,写得非常好,肯定是一本学习 Java
的好书。(Anatoly Vorobey,TechnionUniversity,Haifa,以色列)。
是我见过的最好的编程指南,对任何语言都不外如是。(Joakim ziegler,FIX系统管理员)
感谢你写出如此优秀的一本Java 参考书。(Dr. Gavin Pillay,Registrar,King Edward VII
Hospital,南非)
再次感谢您这本令人震惊的书。我以前真的有点儿不知所从的感觉(因为不是C 程序员),但你的书
浅显易懂,使我能很快掌握Java——差不多就是阅读的速度吧。能从头掌握基本原理和概念的感觉
真好,再也不用通过不断的试验和出错来建立概念模型了。希望不久能有机会参加您的讲座。
(Randall R. Hawley,Automation Technician,Eli Lilly & Co
kubernetes指南
Kubernetes指南
Kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的
开源版本,也是CNCF最重要的项目之一,主要功能包括:
基于容器的应用部署、维护和滚动升级
负载均衡和服务发现
跨机器和跨地区的集群调度
自动伸缩
无状态服务和有状态服务
广泛的Volume支持
插件机制保证扩展性
Kubernetes发展非常迅速,已经成为容器编排领域的领导者。Kubernetes的中文资料也
非常丰富,但系统化和紧跟社区更新的则就比较少见了。《Kubernetes指南》开源电子
书旨在整理平时在开发和使用Kubernetes时的参考指南和实践总结,形成一个系统化的
参考指南以方便查阅。欢迎大家关注和添加完善内容。
注:如无特殊说明,本指南所有文档仅适用于Kubernetes v1.6及以上版本。
高清Python核心编程_第3版_中文版
一、书籍简介
《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本。
《Python核心编程(第3版)》总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet客户端编程、多线程编程、GUI编程、数据库编程、Microsoft Office编程、扩展Python等内容。
《Python
核心编程(第3版)》第2部分讲解了与Web开发相关的主题,包括Web客户端和服务器、CGI和WSGI相关的Web编程、Django Web框架、云计算、高级Web服务。
《Python核心编程(第3版)》第3部分则为一个补充/实验章节,包括文本处理以及一些其他内容。
《Python核心编程(第3版)》适合具有一定经验的Python开发人员阅读。
二、书籍信息
作者:[美] Wesley
Chun 著;孙波翔,李斌,李晗 译
出版社: 人民邮电出版社
ISBN:9787115414779
版次:3
外文名称:Core
Python Applications Programming(3rd Edition)
开本:16开
出版时间:2016-05-01
正文语种:中文
三、书籍目录
第1部分 通用应用主题
第1章 正则表达式 2
1.1 简介/动机 3
1.2 特殊符号和字符 5
1.2.1 使用择一匹配符号匹配多个正则表达式模式 6
1.2.2 匹配任意单个字符 6
1.2.3 从字符串起始或者结尾或者单词边界匹配 7
1.2.4 创建字符集 8
1.2.5 限定范围和否定 8
1.2.6 使用闭包操作符实现存在性和频数匹配 9
1.2.7 表示字符集的特殊字符 10
1.2.8 使用圆括号指定分组 10
1.2.9 扩展表示法 11
1.3 正则表达式和Python语言 11
1.3.1 re模块:核心函数和方法 12
1.3.2 使用compile()函数编译正则表达式 13
1.3.3 匹配对象以及group()和groups()方法 14
1.3.4 使用match()方法匹配字符串 14
1.3.5 使用search()在一个字符串中查找模式(搜索与匹配的对比) 15
1.3.6 匹配多个字符串 16
1.3.7 匹配任何单个字符(.) 16
1.3.8 创建字符集([ ]) 17
1.3.9 重复、特殊字符以及分组 18
1.3.10 匹配字符串的起始和结尾以及单词边界 20
1.3.11 使用findall()和finditer()查找每一次出现的位置 21
1.3.12 使用sub()和subn()搜索与替换 22
1.3.13 在限定模式上使用split()分隔字符串 23
1.3.14 扩展符号 24
1.3.15 杂项 27
1.4 一些正则表达式示例 28
1.5 更长的正则表达式示例 33
1.5.1 匹配字符串 35
1.5.2 搜索与匹配……还有贪婪 37
1.6 练习 39
第2章 网络编程 42
2.1 简介 43
2.2 客户端/服务器架构 43
2.2.1 硬件客户端/服务器架构 43
2.2.2 软件客户端/服务器架构 44
2.2.3 银行出纳员作为服务器吗 44
2.2.4 客户端/服务器网络编程 45
2.3 套接字:通信端点 46
2.3.1 套接字 46
2.3.2 套接字地址:主机-端口对 47
2.3.3 面向连接的套接字与无连接的套接字 47
2.4 Python中的网络编程 48
2.4.1 socket()模块函数 49
2.4.2 套接字对象(内置)方法 49
2.4.3 创建TCP服务器 51
2.4.4 创建TCP客户端 54
2.4.5 执行TCP服务器和客户端 56
2.4.6 创建UDP服务器 58
2.4.7 创建UDP客户端 59
2.4.8 执行UDP服务器和客户端 60
2.4.9 socket模块属性 61
2.5 SocketServer模块 62
2.5.1 创建SocketServer TCP服务器 63
2.5.2 创建SocketServer TCP客户端 64
2.5.3 执行TCP服务器和客户端 65
2.6 Twisted框架介绍 66
2.6.1 创建Twisted ReactorTCP服务器 66
2.6.2 创建Twisted ReactorTCP客户端 67
2.6.3 执行TCP服务器和客户端 69
2.7 相关模块 69
2.8 练习 70
第3章 因特网客户端编程 74
3.1 因特网客户端简介 75
3.2 文件传输 75
3.2.1 文件传输因特网协议 75
3.2.2 文件传输协议 76
3.2.3 Python和FTP 77
3.2.4 ftplib.FTP类的方法 77
3.2.5 交互式FTP示例 78
3.2.6 客户端FTP程序示例 79
3.2.7 FTP的其他内容 80
3.3 网络新闻 81
3.3.1 Usenet与新闻组 81
3.3.2 网络新闻传输协议 82
3.3.3 Python和NNTP 83
3.3.4 nntplib.NNTP类方法 83
3.3.5 交互式NNTP示例 84
3.3.6 客户端程序NNTP示例 85
3.3.7 NNTP的其他内容 89
3.4 电子邮件 90
3.4.1 电子邮件系统组件和协议 90
3.4.2 发送电子邮件 91
3.4.3 Python和SMTP 92
3.4.4 smtplib.SMTP类方法 92
3.4.5 交互式SMTP示例 93
3.4.6 SMTP的其他内容 94
3.4.7 接收电子邮件 94
3.4.8 POP和IMAP 95
3.4.9 Python和POP3 95
3.4.10 交互式POP3示例 96
3.4.11 poplib.POP3类方法 97
3.4.12 客户端程序SMTP和POP3示例 98
3.4.13 Python和IMAP4 100
3.4.14 交互式IMAP4示例 100
3.4.15 imaplib.IMAP4类中的常用方法 101
3.5 实战 102
3.5.1 生成电子邮件 102
3.5.2 解析电子邮件 104
3.5.3 基于Web的云电子邮件服务 105
3.5.4 最佳实践:安全、重构 106
3.5.5 Yahoo! Mail 108
3.5.6 Gmail 112
3.6 相关模块 115
3.6.1 电子邮件 115
3.6.2 其他因特网客户端协议 115
3.7 练习 116
第4章 多线程编程 122
4.1 简介/动机 123
4.2 线程和进程 124
4.2.1 进程 124
4.2.2 线程 124
4.3 线程和Python 125
4.3.1 全局解释器锁 125
4.3.2 退出线程 126
4.3.3 在Python中使用线程 126
4.3.4 不使用线程的情况 126
4.3.5 Python的threading模块 128
4.4 thread模块 128
4.5 threading模块 132
4.5.1 Thread类 133
4.5.2 threading模块的其他函数 139
4.6 单线程和多线程执行对比 140
4.7 多线程实践 142
4.7.1 图书排名示例 142
4.7.2 同步原语 149
4.7.3 锁示例 149
4.7.4 信号量示例 156
4.8 生产者-消费者问题和Queue/queue模块 159
4.9 线程的替代方案 162
4.9.1 subprocess模块 163
4.9.2 multiprocessing模块 163
4.9.3 concurrent.futures模块 163
4.10 相关模块 165
4.11 练习 165
第5章 GUI编程 168
5.1 简介 169
5.1.1 Tcl、Tk和Tkinter 169
5.1.2 安装和使用Tkinter 170
5.1.3 客户端/服务端架构 170
5.2 Tkinter和Python编程 170
5.2.1 Tkinter模块:添加Tk到应用中 171
5.2.2 GUI编程介绍 171
5.2.3 顶层窗口:Tkinter.Tk() 173
5.2.4 Tk控件 173
5.3 Tkinter示例 174
5.3.1 Label控件 174
5.3.2 Button控件 175
5.3.3 Label和Button控件 175
5.3.4 Label、Button和Scale控件 176
5.3.5 偏函数应用示例 178
5.3.6 中级Tkinter示例 180
5.4 其他GUI简介 185
5.4.1 Tk接口扩展(Tix) 187
5.4.2 Python MegaWidgets(PMW) 188
5.4.3 wxWidgets和wxPython 188
5.4.4 GTK 和PyGTK 190
5.4.5 Tile/Ttk 192
5.5 相关模块和其他GUI 194
5.6 练习 196
第6章 数据库编程 198
6.1 简介 199
6.1.1 持久化存储 199
6.1.2 数据库基本操作和SQL 199
6.1.3 数据库和Python 201
6.2 Python的DB-API 203
6.2.1 模块属性 203
6.2.2 Connection对象 205
6.2.3 Cursor对象 206
6.2.4 类型对象和构造函数 207
6.2.5 关系数据库 209
6.2.6 数据库和Python:适配器 210
6.2.7 使用数据库适配器的示例 210
6.2.8 数据库适配器示例应用 215
6.3 ORM 226
6.3.1 考虑对象,而不是SQL 227
6.3.2 Python和ORM 227
6.3.3 员工角色数据库示例 228
6.3.4 SQLAlchemy 229
6.3.5 SQLObject 240
6.4 非关系数据库 245
6.4.1 NoSQL介绍 245
6.4.2 MongoDB 246
6.4.3 PyMongo:MongoDB和Python 246
6.4.4 总结 250
6.5 相关文献 250
6.6 练习 252
第7章 Microsoft
Office编程 256
7.1 简介 257
7.2 使用Python进行COM客户端编程 257
7.2.1 客户端COM编程 258
7.2.2 入门 258
7.3 入门示例 259
7.3.1 Excel 259
7.3.2 Word 261
7.3.3 PowerPoint 262
7.3.4 Outlook 264
7.4 中级示例 266
7.4.1 Excel 266
7.4.2 Outlook 268
7.4.3 PowerPoint 273
7.4.4 总结 280
7.5 相关模块/包 281
7.6 练习 281
第8章 扩展Python 286
8.1 简介和动机 287
8.1.1 Python扩展简介 287
8.1.2 什么情况下需要扩展Python 288
8.1.3 什么情况下不应该扩展Python 288
8.2 编写Python扩展 289
8.2.1 创建应用代码 289
8.2.2 根据样板编写封装代码 291
8.2.3 编译 296
8.2.4 导入并测试 297
8.2.5 引用计数 300
8.2.6 线程和全局解释器锁 301
8.3 相关主题 302
8.3.1 SWIG 302
8.3.2 Pyrex 302
8.3.3 Cython 302
8.3.4 Psyco 303
8.3.5 PyPy 303
8.3.6 嵌入Python 304
8.4 练习 304
第2部分 Web开发
第9章 Web客户端和服务器 306
9.1 简介 307
9.1.1 Web应用:客户端/服务器计算 307
9.1.2 因特网 308
9.2 Python Web客户端工具 310
9.2.1 统一资源定位符 310
9.2.2 urlparse模块 312
9.2.3 urllib模块/包 313
9.2.4 使用urllib2 HTTP验证的示例 317
9.2.5 将HTTP验证示例移植到Python3中 319
9.3 Web客户端 322
9.3.1 一个简单的Web爬虫/蜘蛛/机器人 322
9.3.2 解析Web页面 328
9.3.3 可编程的Web浏览 333
9.4 Web(HTTP)服务器 336
9.5 相关模块 339
9.6 练习 341
第10章 Web编程:CGI和WSGI 345
10.1 简介 346
10.2 帮助Web服务器处理客户端数据 346
10.2.1 CGI简介 346
10.2.2 CGI应用程序 347
10.2.3 cgi模块 348
10.2.4 cgitb模块 348
10.3 构建CGI应用程序 349
10.3.1 构建Web服务器 349
10.3.2 建立表单页 351
10.3.3 生成结果页面 352
10.3.4 生成表单和结果页面 353
10.3.5 全面交互的Web站点 357
10.4 在CGI中使用Unicode 362
10.5 高级CGI 364
10.5.1 mulitipart表单提交和文件上传 364
10.5.2 多值字段 364
10.5.3 cookie 365
10.5.4 cookie和文件上传 365
10.6 WSGI简介 373
10.6.1 动机(替代CGI) 373
10.6.2 服务器集成 374
10.6.3 外部进程 374
10.6.4 WSGI简介 375
10.6.5 WSGI服务器 376
10.6.6 参考服务器 377
10.6.7 WSGI应用示例 378
10.6.8 中间件及封装WSGI应用 378
10.6.9 在Python 3中使用WSGI 379
10.7 现实世界中的Web开发 380
10.8 相关模块 380
10.9 练习 381
第11章 Web框架:Django 384
11.1 简介 385
11.2 Web框架 385
11.3 Django简介 386
11.4 项目和应用 390
11.4.1 在Django中创建项目 390
11.4.2 运行开发服务器 393
11.5 “Hello World”应用(一个博客) 394
11.6 创建模型来添加数据库服务 396
11.6.1 设置数据库 396
11.6.2 创��表 398
11.7 Python 应用shell 400
11.7.1 在Django中使用Pythonshell 400
11.7.2 测试数据模型 402
11.8 Django管理应用 403
11.8.1 设置admin 403
11.8.2 使用admin 404
11.9 创建博客的用户界面 410
11.9.1 创建模板 411
11.9.2 创建URL模式 412
11.9.3 创建视图函数 415
11.10 改进输出 418
11.11 处理用户输入 422
11.11.1 模板:添加HTML表单 423
11.11.2 添加URLconf项 423
11.11.3 视图:处理用户输入 423
11.11.4 跨站点请求伪造 424
11.12 表单和模型表单 426
11.12.1 Django表单简介 426
11.12.2 模型表单示例 427
11.12.3 使用ModelForm来生成HTML表单 427
11.12.4 处理ModelForm数据 428
11.13 视图进阶 429
11.14 改善外观 431
11.15 单元测试 432
11.15.1 blog应用的代码审查 434
11.15.2 blog应用总结 439
11.16 中级Django应用:TweetApprover 439
11.16.1 创建项目文件结构 440
11.16.2 安装Twython库 445
11.16.3 URL结构 446
11.16.4 数据模型 449
11.16.5 提交新推文以便审核 453
11.16.6 审核推文 457
11.17 资源 465
11.18 总结 465
11.19 练习 466
第12章 云计算:Google
App Engine 470
12.1 简介 471
12.2 云计算 471
12.2.1 云计算服务的层次 472
12.2.2 App Engine 473
12.3 沙盒和App Engine SDK 476
12.4 选择一个App Engine框架 479
12.5 Python 2.7支持 485
12.5.1 一般差异 486
12.5.2 代码中的差异 486
12.6 与Django比较 487
12.6.1 开始“Hello World” 487
12.6.2 手动创建“Hello World”(Zip文件用户) 488
12.7 将“Hello World”改成一个
简单的博客 489
12.7.1 快速发现改动:30秒内将纯文本转成HTML 489
12.7.2 添加表单 490
12.7.3 添加Datastore服务 492
12.7.4 迭代改进 496
12.7.5 开发/SDK控制台 496
12.8 添加Memcache服务 502
12.9 静态文件 505
12.10 添加用户服务 505
12.10.1 Google账号验证 506
12.10.2 联合验证 507
12.11 远程API shell 507
12.12 问与答(Python实现) 509
12.12.1 发送电子邮件 509
12.12.2 接收电子邮件 510
12.13 使用XMPP发送即时消息 512
12.14 处理图片 514
12.15 任务队列(非定期任务) 514
12.15.1 创建任务 515
12.15.2 配置app.yaml 515
12.15.3 其他任务创建选项 516
12.15.4 将发送电子邮件作为任务 517
12.15.5 deferred包 519
12.16 使用Appstats进行分析 520
12.16.1 在app.yaml中添加标准处理程序 521
12.16.2 添加自定义Admin Console页面 521
12.16.3 作为内置界面启用界面 521
12.17 URLfetch服务 522
12.18 问与答(无Python实现) 522
12.18.1 Cron服务(计划任务作业) 523
12.18.2 预热请求 523
12.18.3 DoS保护 524
12.19 厂商锁定 524
12.20 资源 525
12.21 总结 526
12.22 练习 527
第13章 Web服务 530
13.1 简介 531
13.2 Yahoo!金融股票报价服务器 531
13.3 Twitter微博 534
13.3.1 社交网络 534
13.3.2 Twitter和Python 535
13.3.3 稍微长一点的API组合应用示例 537
13.3.4 总结 547
13.3.5 额外在线资源 548
13.4 练习 548
第3部分 补充/实验章节
第14章 文本处理 553
14.1 逗号分隔值(CSV) 554
14.1.1 CSV简介 554
14.1.2 再论股票投资组合示例 556
14.2 JSON 557
14.3 可扩展标记语言 561
14.3.1 XML简介 562
14.3.2 Python和XML 562
14.3.3 XML实战 566
14.3.4 *使用XML-RPC的客户端-服务器服务 569
14.4 参考文献 573
14.5 相关模块 574
14.6 练习 574
第15章 其他内容 577
15.1 Jython 578
15.1.1 Jython简介 578
15.1.2 Swing GUI开发示例 579
15.2 Google 581
15.2.1 Google 平台简介 582
15.2.2 Python和Google API 582
15.2.3 一个简单的社交媒体分析工具 582
15.3 练习 590
附录A 部分练习参考答案 593
附录B 参考表 597
B.1 Python关键字 597
B.2 Python标准操作符和函数 598
B.3 数值类型操作符和函数 599
B.4 序列类型操作符和函数 600
B.5 字符串格式化操作符转换符号 602
B.6 字符串格式化操作符指令 603
B.7 字符串类型内置方法 603
B.8 列表类型内置方法 605
B.9 字典类型内置方法 605
B.10 集合类型操作符和内置函数 606
B.11 文件对象方法和数据属性 607
B.12 Python异常 608
B.13 类的特殊方法 610
B.14 Python操作符汇总 612
附录C Python 3:一种编程语言进化的产物 614
C.1 为何Python在变化 614
C.2 都发生了哪些变化 615
C.2.1 print变成了print() 615
C.2.2 字符串:默认为Unicode编码 616
C.2.3 单类类型 616
C.2.4 更新异常的语法 617
C.2.5 整数的更新 618
C.2.6 迭代器无处不在 619
C.3 迁移工具 619
C.3.1 2to3工具 619
C.3.2 Python 2.6 620
C.4 结论 620
C.5 参考资料 620
附录D 利用Python 2.6 向Python 3迁移 622
D.1 Python 3:Python的下一代 622
D.2 整数 623
D.2.1 单整数类型 624
D.2.2 新型二进制和改进的八进制字符 624
D.2.3 经典除法或真除法 625
D.3 内置函数 626
D.3.1 print语句或print()函数 626
D.3.2 reduce()转移到了functools模块中 627
D.3.3 其他更新 627
D.4 面向对象编程:两种不同的类对象 628
D.5 字符串 629
D.6 异常 630
D.6.1 处理异常(使用as) 630
D.6.2 抛出异常 630
D.7 其他转换工具和技巧 631
D.8 编写兼容版本2.x和3.x的代码 632
D.8.1 对比print和print() 632
D.8.2 将你的方法导入解决方案中 633
D.8.3 整合在一起 634
D.9 结论 635
高清Netty5.0架构剖析和源码解读
Netty5.0 架构剖析和源码解读
作者:李林锋 版权所有 email neu_lilinfeng@ © Netty5.0 架构剖析和源码解读1 1. 概述2 1.1. JAVA 的IO演进2 1.1.1. 传统BIO通信的弊端2 1.1.2. Linux 的网络IO模型简介4 1.1.3. IO复用技术介绍7 1.1.4. JAVA的异步IO8 1.1.5. 业界主流的NIO框架介绍10 2.NIO入门10 2.1. NIO服务端10 2.2. NIO客户端13 3.Netty源码分析16 3.1. 服务端创建16 3.1.1. 服务端启动辅助类ServerBootstrap16 3.1.2. NioServerSocketChannel 的注册21 3.1.3. 新的客户端接入25 3.2. 客户端创建28 3.2.1. 客户端连接辅助类Bootstrap28 3.2.2. 服务端返回ACK应答,客户端连接成功32 3.3. 读操作33 3.3.1. 异步读取消息33 3.4. 写操作39 3.4.1. 异步消息发送39 3.4.2. Flush操作42 4.Netty架构50 4.1. 逻辑架构50 5. 附录51 5.1. 作者简介51 5.2. 使用声明51 1. 概述 1.1.JAVA 的IO演进 1.1.1. 传统BIO通信的弊端 在JDK 1.4推出JAVANIO1.0之前,基于JAVA 的所有Socket通信都采用 BIO 了同步阻塞模式( ),这种一请求一应答的通信模型简化了上层的应用开发, 但是在可靠性和性能方面存在巨大的弊端。所以,在很长一段时间,大型的应 C C++ 用服务器都采用 或者 开发。当并发访问量增大、响应时间延迟变大后, 采用JAVABIO作为服务端的软件只有通过硬件不断的扩容来满足访问量的激 增,它大大增加了企业的成本,随着集群的膨胀,系统的可维护性也面临巨大 的挑战,解决这个问题已经刻不容缓。 首先,我们通过下面这幅图来看下采用BIO 的服务端通信模型:采用BIO 通信模型的 1connect NewThread1 WebBrowse 2connect 2handle(Req) WebBrowse 3connect Acceptor NewThread2 WebBrowse WebBrowse 4connect NewThread3 3sendResponsetopeer NewThread4 图1.1.1-1 BIO通信模型图 服务端,通常由一个独立的Accepto 线程负责监听客户端的连接,接收到客户 端连接之后为客户端连接创建一个新的线程处理请求消息
weinxinpay
H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。
主要用于触屏版的手机浏览器请求微信支付的场景。可以方便的从外部浏览器唤起微信支付
支付宝源码demo
【旧版本】
下载之后解压有【MD5签名版本和RSA签名版本】文件
MD5签名版本
|————create_direct_pay_by_user-CSHARP-GBK
|————create_direct_pay_by_user-CSHARP-UTF-8
|————create_direct_pay_by_user-JAVA-GBK
|————create_direct_pay_by_user-JAVA-UTF-8
|————create_direct_pay_by_user-PHP-GBK
|————create_direct_pay_by_user-PHP-UTF-8
|————alipay.acquire.customs-CSHARP-GBK
|————alipay.acquire.customs-CSHARP-UTF-8
|————alipay.acquire.customs-JAVA-GBK
|————alipay.acquire.customs-JAVA-UTF-8
|————alipay.acquire.customs-PHP-GBK
|————alipay.acquire.customs-PHP-UTF-8
RSA签名版本
|————create_direct_pay_by_user-CSHARP-GBK
|————create_direct_pay_by_user-CSHARP-UTF-8
|————create_direct_pay_by_user-JAVA-GBK
|————create_direct_pay_by_user-JAVA-UTF-8
|————create_direct_pay_by_user-PHP-GBK
|————create_direct_pay_by_user-PHP-UTF-8
|————alipay.acquire.customs-CSHARP-GBK
|————alipay.acquire.customs-CSHARP-UTF-8
|————alipay.acquire.customs-JAVA-GBK
|————alipay.acquire.customs-JAVA-UTF-8
|————alipay.acquire.customs-PHP-GBK
|————alipay.acquire.customs-PHP-UTF-8
【新版本】
支付宝项目工程源码---Alipay-Source
支付宝官方例子工程源码---alipay.trade.page.pay-JAVA-UTF-8
SQL脚本生成器
一、简介
1.1前言
1、由于最近工作一直用Oracle,故对Oracle数据库研究为对象。
2、根据工作业务需求实际情况进行功能研发。为什么要开发呢?因为在数据库升级或者迁移的时候,为了保证不同环境不同数据库数据保持同步,故数据库SQL脚本非常作用。比如:数据库主脚本,副脚本,增量脚本。
3、 什么是主脚本、副脚本、增量脚本呢?
3.1、主脚本指数据库表或存储过程,视图脚本,序列等脚本。
3.2、副脚本指必须执行主脚本之后才执行的脚本。换句话说在没执行主键脚本的情况下,副脚本执行之后会回滚事务失败。
3.3、增量脚本指在执行主脚本或副脚本之后,根据需求对某个表添加/修改约束(主外键约束,长度约束等),添加/修改字段/添加数据等情况对数据库结构改变处理的一种行为脚本。
1.2作用
1、 快速产出自定义规则需要的SQL脚本。
2、减少人工编写SQL脚本出错率问题,完全通过程序检测SQL准确性。
3、帮助开发人员提高SQL编写效率,减少人工编写SQL开发成本问题。
4、帮助开发人员节约时间,同时避免繁琐不必要编写SQL的工作。
二、实现方式与原理
2.1实现方式
1、实现方式分:正向与逆向实现。什么是正向与逆行呢【是否有鸡还是有蛋,先后道理同等】
2、正向方式:首先把设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。
3、逆向方式:首先有数据库表,然后通过ORM持久化技术连接数据库再读取表的字段等属性出来,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。
2.2原理
对数据库软件内置核心表或视图查询出来存储用户行为表结构所有属性信息,对此属性结构信息进行分析与组装所需要SQL脚本。
阿里巴巴Java开发手册
目录
一 、编程规约 编程规约 ................................................................................................................................................................................ 1
( ( 一) ) 命名规约 命名规约 ................................................................................................................................................................ 1
( ( 二) ) 常量定义 常量定义 ................................................................................................................................................................ 3
( ( 三) ) 格式规约 格式规约 ................................................................................................................................................................ 4
( ( 四) ) P OOP 规约 规约 ................................................................................................................................................................ 6
( ( 五) ) 集合处理 集合处理 ............................................................................................................................................................. 10
( ( 六) ) 并发处理 并发处理 ............................................................................................................................................................. 12
( ( 七) ) 控制语句 控制语句 ............................................................................................................................................................. 15
( ( 八) ) 注释规约 注释规约 ............................................................................................................................................................. 16
( ( 九) ) 其它 其它 ....................................................................................................................................................................... 17
二、异常日志 二、异常日志 ............................................................................................................................................................................. 19
( ( 一) ) 异常处理 异常处理 ............................................................................................................................................................. 19
( ( 二) ) 日志规约 日志规约 ............................................................................................................................................................. 20
三、 三、L MySQL 规约 规约 ....................................................................................................................................................................... 22
( ( 一) ) 建表规约 建表规约 ............................................................................................................................................................. 22
( ( 二) ) 索引规约 索引规约 ............................................................................................................................................................. 23
( ( 三) ) L SQL 规约 规约 ............................................................................................................................................................. 25
( ( 四) ) M ORM 规约 规约 ............................................................................................................................................................. 26
四、工程规约 四、工程规约 ............................................................................................................................................................................. 27
( ( 一) ) 应用分层 应用分层 ............................................................................................................................................................. 27
( ( 二) ) 二方库规约 二方库规约 ......................................................................................................................................................... 28
( ( 三) ) 服务器规约 服务器规约 ......................................................................................................................................................... 30
五、安全规约 五、安全规约 ............................................................................................................................................................................. 31