首页 文章 精选 留言 我的

精选列表

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

建站零基础入门【小白攻略】

使用阿里云建站有多种方式,本篇教程主要介绍自助建站的流程。 建站方式使用阿里云搭建网站有多种方式,您可参照下表选择合适的建站方式:建站方式 优势 适用人群自助建站 服务器购买、网站搭建、网站维护全程自主,弹性灵活。 希望自行设计、有动手意愿的用户。适用于刚接触云计算或对云服务器和建站不太了解的个人或小企业用户。云市场网站模板 即买即用,轻松便捷,后台管理方便,且有专人进行网站维护。 适合无特殊需求的个人和小企业用户,支持 PC、手机、微信等多种渠道,选择多样,成本较低。云市场企业官网定制 即买即用,轻松便捷,后台管理方便,且有专人进行网站维护。 适合看重网站个性化、预算相对充足、希望节省人力、使用需求迫切的企业用户。自助建站步骤步骤1. 选择服务器不同网站类型需要的ECS配置不同,请您

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

Python零基础学习笔记(一)

Python是一种解释型、面相对象、动态数据类型的高级程序设计语言。解释型:没有编译环节交互式:可以在一个python提示符,直接互动执行程序面向对象:支持面向对象的风格或代码封装在对象的编程技术初学者的语言:对初级程序员来说,支持广泛的应用程序开发,从简单的文字处理到www浏览器再到游戏都可以写。 特点: 易于学习:相对较少的关键字,结构简单,明确定义的语法 易于阅读:代码定义更为清晰 易于维护:成功点在于源码相当容易维护 一个广泛的标准库:有丰富的库,跨频台兼容性好unix/windows/macintosh 互动模式: 可移植:基于其开源代码的特性 可扩展:可以在python中调用c和c++语言 数据库:python提供所有主要商业数据库的接口 GUI编程:支持GUI,可以创建和移植到很多系统调用 可嵌入:可以将python嵌入到c/c++程序中 缺点: 运行速度慢 代码不能加密

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

Javascript基础之-强制类型转换(二)

上一章主要讲了转换到数字,字符串和布尔类型的一些知识点,那么这一讲接着上面的继续讲。 思考下面这个问题: console.log(+"123"); // 123 console.log(-"123"); // -123 console.log(+"abc"); // NaN console.log(-"abc"); // NaN +这个很容易理解,就是把字符串转成了数字,而-这个呢,除了把字符串转为数字以外,还会吧这个数字加否。所以无论+还是-都会进行类型转换,唯一的区别,就是-会置否而+不会。 那么+除了当作一元运算符外,还有一个更广为人知的就是作为加法运算符。 那么加法运算符的话,实际上是有两种可能性的,一种是字符串的拼接,另一种就是做运算。接下来咱们就对这方面详细的讲解一下。 先说结论,如果在+的其中有一个操作数是字符串或者可以转为字符串的话,那么就进行字符串拼接。 反之,如果俩都是数字的话,则进行加法运算。 这时候,肯定会有人问,假如说我有其他的数据类型呢,又不是数字又不是字符串,比如说数组啊,对象啊,布尔值啥的, 那么如果是引用数据类型,则先转为基本数据类型,再进行比较。 如果是布尔呢,如果加法的另一边是数字的话,那么他就会转为数字,如果是字符串的话,就直接拼接啦. 上面说了一大堆的理论的东西,想必大家看着也累了。来上例子。 console.log(true + 11); // 12 console.log(true + false); // 1 console.log(true + '11'); // "true11" 这个很明显可以看出,如果操作数是数字的话,或者说,操作数都是字符串的话,那么布尔值会先转为数字,再进行拼接操作,如果有一个操作数是字符串的话,那就不转啦,直接拼接。 那么如果是对象类型,它是先转为基本数据类型,怎么转呢,其实就是先调用valueOf,如果valueOf不存在,或者返回的不是基本数据类型,就调用toString,如果toString也没有或者是返回的不是基本数据类型呢,那估计就直接报错了,看例子。 var obj = { valueOf() { return [2, 3]; }, toString() { return "sss"; } } var obj1 = { valueOf() { return 111; }, toString() { return "abc"; } } var obj2 = { valueOf() { return []; }, toString() { return { abc: 'liuhaitao', } } } console.log(obj + 1); // "sss1" console.log(obj1 + 1); // 112 console.log(obj2 + 1); // "Cannot convert object to primitive value" 那么下面一个例子就很容易理解了。 console.log([1].valueOf()); // [1] console.log([1] + [2]); // 12 因为数组的valueOf的值依然为数组,所以他们转的时候,就会调用toString,所以就转成了字符串啦,俩字符串进行拼接,得到最终结果 减法运算符(-) 很显然,减法运算符就是做减法的,他很单纯,就只是做减法,但是呢,这个有一个知识点,就是,减法里的操作数,如果不是数字的话,那么会先转为数字类型的。 console.log("123" - 0); // 123 console.log([3] - [1]); // 2 console.log({valueOf() { return 3}} - {valueOf() { return 2}}); // 1 这个很明显,第一个和第二个的结果都是转为了数字再进行运算的,那第三个呢,其实这个就是对象的转化方式,如果有valueOf的话,会先执行valueOf找出基本类型值,没有或者不是基本类型值就找toString,最后呢,吧基本类型值转为数字再进行减法运算 。 好了,加法和减法都说完了,那么乘法和除法呢,其实和减法类似,都是转为数字这样的。 console.log("123" * 0); // 0 console.log([3] * [1]); // 3 console.log({valueOf() { return 3}} * {valueOf() { return 2}}); // 6 想看乘法和除法其他的细节和本文关系不是太大,所以就不细讲了,详情请查阅文档ecma文档: https://www.ecma-international.org/ecma-262/5.1/#sec-11.5.1 https://www.ecma-international.org/ecma-262/5.1/#sec-11.5.2 还有本节最后一部分,就是有关于逻辑与(&&)和逻辑或(||) 为啥要特地介绍他俩呢,因为他俩的语法和其他语言的语法特性似乎有那么一些区别。来看代码 var a = 42; var b = "abc"; var c = null; console.log(a || b); // 42 console.log(a && b); // "abc" console.log(c || b); // "abc" console.log(c && b); // null 这一块可以看出,他和其他语言的不同之处在于,他的运算的结果,并不是true和false,而是具体的值,也就是说 ||符号的时候,如果第一个操作数是true,则返回第一个操作数,如果是false返回第二个, &&相反,如果第一个操作数是true,则返回第二个操作数,如果是false则返回第一个。 那这个有啥用呢? 其实可以利用这个的特性简化我们的代码,比如说 function exec () { console.log('exec'); } true && exec(); // exec var a = undefined; var b = a || 10; console.log(b); // 10 这个代表了应用的两个方面,&&可以做函数执行的前置判断,后面那个呢,可以做缺省时的默认值,你可以仔细观察一下,在一些压缩代码工具,压缩完后的代码,很多都把if 条件判断改成了&&,这次知道原因了吧。 参考书籍《你不知道的Javascript中卷》 参考文章:https://codeburst.io/javascript-why-does-3-true-4-and-7-other-tricky-equations-9dd13cb2a92a 本文转载自http://www.lht.ren/article/8/

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

Javascript基础之-强制类型转换(一)

转换为字符串规则如下图代码: console.log(String(undefined)); // "undefined" console.log(String(null)); // "null" console.log(String(true)); // "true" console.log(String(+0)); // "0" console.log(String(-0)); // "0" console.log(String(-20)); // "-20" console.log(String(Infinity)); // "Infinity" console.log(String(new Number(123))) // 123 console.log(String(new Object())) // [object Object] console.log(100000000000000000000000000000); // 1e+29 大致就是普通其他基本类型转为字符串的话,就直接转为其值的字符串表达形式, 如果是基本类型的封装对象,会先拆封,然后再转为字符串, 如果是普通对象,则会调用其内部[class]的值, 如果是极大数和级小数,将会进行一些转化,具体规则请参考ecma 官方文档https://www.ecma-internationa... 请思考下面的代码 var obj = { toString() { return "toString"; } } console.log(String(obj)) // toString var obj1 = Object.create(null); obj1.valueOf = function() { return "valueOf"; } console.log(String(obj1)); // valueOf 上面这个代码似乎可以看出,实际上普通对象转为字符串的过程,似乎就是toString()的一个过程,也就是调用其内部toString()的一个过程 如果toString()没有咋办,调用valueOf,如果这个也没有呢,就直接报错了。 转换为数字的规则 普通转换为数字的规则如下: console.log(Number(true)); // 1 console.log(Number(0b1101)) // 13 console.log(Number(false)); // 0 console.log(Number("123")); //123 console.log(Number("123a")); //NaN console.log(Number(undefined)); // NaN console.log(Number(null)); // 0 不过呢,如果是对象类型的咋办呢,实际上同上的一点是,如果是基本类型封装后的对象,会先拆封,也就是转为基本类型值,然后再转为数字,比如说 console.log(Number(new String("123123"))); // 123123 console.log(Number([1])); // 1 console.log(Number([1, 3])); // NaN 可能你会疑惑,说,为啥数组只有一个数据的时候可以转换,有两个数据的时候就是NaN了呢,原因在这里,看代码 console.log([1].valueOf()); // [1] console.log([1, 3].valueOf()); // [1, 3] console.log([1].toString()); // 1 console.log([1, 3].toString()); //1, 3 可以看到,valueOf没有返回基本类型值,所以转而使用toString转为基本类型值,这俩字符串再转为数字的结果就一目了然了,和上面的是一样的 那么转为数字的过程中,valueOf和toString是哪个先执行的呢? 看代码 var a = { valueOf() { return 2; }, toString() { return 3; } } var b = { valueOf() { return [1, 3]; }, toString() { return 3; } } var c = { toString() { return 3; } } var d = Object.create(null); console.log(Number(a)); // 2 console.log(Number(b)); // 3 console.log(Number(c)); // 3 console.log(Number(d)); // Uncaught TypeError: Cannot convert object to primitive value 这个其实就说明了一个问题,就是说对象转数字的时候,会先找valueOf(),如果valueOf()没有,或者是说转的是非基本数据类型的,将会使用toString(),最后基本类型专成数字类型的,如果valueOf和toString()都没有,就直接报错了 转化为数字呢,除了以上使用Number(),还可以使用+符号,这个也可以实现从其他类型转换到字符串 console.log(+"abc"); // NaN console.log(+"1111"); //1111 console.log(+[1]); // 1 var obj = { valueOf() { return "1111"; } } console.log(+obj); // 1111 如果原数据类型是Date,那么可以用Number或者+转为以微秒为单位的unix时间戳 var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" ); console.log(+d); // 1408369986000 console.log(Number(d)); //1408369986000 parseInt和Number()的区别:看例子 var a = "123abc"; console.log(+a); // NaN console.log(parseInt(a)); // 123 console.log(parseInt("abc123")); // NaN 实际上,parseInt会从左往右进行解析,找到非字符串的时候停止,如果一开始就不可转为数字,那么就返回NaN parseInt其他一些坑点,这里就不细说了,想看的,可以找《你不知道的Javascript》了解细节 // 0 ("0" 来自于 "0.000008") console.log(parseInt( 0.000008 )); // 8 ("8" 来自于 "8e-7") console.log(parseInt( 0.0000008 )); // 250 ("fa" 来自于 "false") console.log(parseInt( false, 16 )); // 15 ("f" 来自于 "function..") console.log(parseInt( parseInt, 16 )); console.log(parseInt( "0x10" )); // 16 console.log(parseInt( "103", 2 )); // 2 转化为布尔值 下面是假值列表,理论上说,除了以下内容以外的值都是true console.log(Boolean(undefined)); console.log(Boolean(null)); console.log(Boolean(false)); console.log(Boolean(+0)); console.log(Boolean(-0)); console.log(Boolean(NaN)); console.log(Boolean("")); 这里有一点需要说明,规范里有提到,所有的对象都是true,所以这方面尤其需要注意的就是下面的例子了 console.log(Boolean(new Boolean(false))); // true console.log(Boolean(new String(""))); // true console.log(Boolean(new Number(0))); // true 返回的都是true,虽然他是对假值得封装,但是他们是对象,是对象就返回true,所以用假值对象或者其他看起来像价值的字符串来进行if判断是不靠谱的 var bObj = new Boolean(false); var a = []; var d = {}; var e = function() {} var f = "false"; var g = "0"; var h = "''"; if (a && d && e && f && g && h) { console.log('all right'); // all right } 一般显式的吧数据转为布尔型,除了使用Boolean()以外,还可以使用!!符号,也就是连着反转两次 console.log(!!undefined); // falseconsole.log(!!new Boolean(false)); // true 好了就到这里了,这一次因为东西比较零散,准备了一阵子,希望大家有所收获 参考书籍《你不知道的Javascript中卷》 本文转载自http://www.lht.ren/article/5/

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

Java SSM框架基础面试题

一、Spring面试题 1、Spring 在ssm中起什么作用?Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成。 两大核心: 1、IOC/DI(控制反转/依赖注入) :把dao依赖注入到service层,service层反转给action层,Spring顶层容器为BeanFactory。 2、AOP:面向切面编程 2、Spring的事务?编程式事务管理:编程方式管理事务,极大灵活性,难维护。 声明式事务管理:可以将业务代码和事务管理分离,用注解和xml配置来管理事务。 3、IOC 在项目中的作用?作用:Ioc解决对象之间的依赖问题,把所有Bean的依赖关系通过配置文件或注解关联起来,降低了耦合度。 4、Spring的配置文件中的内容?开启事务注解驱动 事务管理器 开启注解功能,并配置扫描包 配置数据库 配置SQL会话工厂,别名,映射文件 不用编写Dao层的实现类 5、Spring下的注解?注册:@Controller @Service @Component 注入:@Autowired @Resource 请求地址:@RequestMapping 返回具体数据类型而非跳转:@ResponseBody 6、Spring DI 的三种方式?构造器注入:通过构造方法初始化 setter方法注入:通过setter方法初始化 接口注入 7、Spring主要使用了什么模式?工厂模式:每个Bean的创建通过方法 单例模式:默认的每个Bean的作用域都是单例 代理模式:关于Aop的实现通过代理模式 8、IOC,AOP的实现原理?IOC:通过反射机制生成对象注入 AOP:动态代理 二、SpringMvc面试题 1、SpringMvc 的控制器是不是单例模式,如果是,有什么问题,怎么解决?问题:单例模式,在多线程访问时有线程安全问题 解决方法:不要用同步,在控制器里面不能写字段 2、SpringMvc 中控制器的注解?@Controller:该注解表明该类扮演控制器的角色 3、@RequestMapping 注解用在类上的作用?作用:用来映射一个URL到一个类或者一个特定的处理方法上 4、前台多个参数,这些参数都是一个对象,快速得到对象?方法:直接在方法中声明这个对象,SpringMvc就自动把属性赋值到这个对象里面 5、SpringMvc中函数的返回值?String,ModelAndView,List,Set 等 一般String,Ajax请求,返回一个List集合 6、SpringMvc中的转发和重定向?转发: return:“hello” 重定向 :return:“redirect:hello.jsp” 7、SpringMvc和Ajax之间的相互调用?通过JackSon框架把java里面对象直接转换成js可识别的json对象,具体步骤如下: 加入JackSon.jar 在配置文件中配置json的映射 在接受Ajax方法里面直接返回Object,list等,方法前面需要加上注解@ResponseBody 8、SpringMvc的工作流程图? 9、Struts2 和 SpringMvc的区别?入口不同:Struts2:filter过滤器 SpringMvc:一个Servlet即前端控制器 开发方式不同:Struts2:基于类开发,传递参数通过类的属性,只能设置为多例 SpringMvc:基于方法开发(一个url对应一个方法),请求参数传递到方法形参,可以为单例也可以为多例(建议单例) 请求方式不同:Struts2:值栈村塾请求和响应的数据,通过OGNL存取数据 SpringMvc:通过参数解析器将request请求内容解析,给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面,jsp视图解析器默认使用的是jstl。 三、Mybatis面试题 1、Ibatis和Mybatis?Ibatis:2010年,apache的Ibatis框架停止更新,并移交给了google团队,同时更名为MyBatis。从2010年后Ibatis在没更新过,彻底变成了一个孤儿框架。一个没人维护的框架注定被mybatis拍在沙滩上。 Mybatis:Ibatis的升级版本。 2、什么是Mybatis的接口绑定,有什么好处?Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便。 3、什么情况用注解,什么情况用xml绑定?注解使用情况:Sql语句简单时 xml绑定使用情况:xml绑定 (@RequestMap用来绑定xml文件) 4、Mybatis在核心处理类叫什么?SqlSession 5、查询表名和返回实体Bean对象不一致,如何处理?映射键值对即可 column:数据库中表的列名 property:实体Bean中的属性名 6、Mybatis的好处?把Sql语句从Java中独立出来。 封装了底层的JDBC,API的调用,并且能够将结果集自动转换成JavaBean对象,简化了Java数据库编程的重复工作。 自己编写Sql语句,更加的灵活。 入参无需用对象封装(或者map封装),使用@Param注解 7、Mybatis配置一对多? property:属性名 column:共同列 ofType:集合中元素的类型 select:要连接的查询 8、Mybatis配置一对一? property:属性名 select:要连接的查询 column:共同列 javaType:集合中元素的类型 9 、${} 和 #{}的区别?${}:简单字符串替换,把${}直接替换成变量的值,不做任何转换,这种是取值以后再去编译SQL语句。 {}:预编译处理,sql中的#{}替换成?,补全预编译语句,有效的防止Sql语句注入,这种取值是编译好SQL语句再取值。 总结:一般用#{}来进行列的代替10、获取上一次自动生成的主键值? 11、Mybatis如何分页,分页原理?RowBounds对象分页 在Sql内直接书写,带有物理分页 12、Mybatis工作原理? 原理: 通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory。 SqlSessionFactory开启一个SqlSession,通过SqlSession实例获得Mapper对象并且运行Mapper映射的Sql语句。 完成数据库的CRUD操作和事务提交,关闭SqlSession。 原文发布时间为:2019-1-6本文作者:唐_方本文来自云栖社区合作伙伴“ Web项目聚集地 ”,了解相关信息可以关注“ web_resource”微信公众号

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

Android 基础动画之 scale 渐变缩放

小菜最近在学习 ViewPager 的小动画,说来惭愧,工作这么久了一直没有认真了解过动画这部分,今天特意学习一下 Android 的基本动画。 Android 的基本的动画包括 alpha(透明度)/ scale(缩放)/ translate(位移) / rotate(旋转)四种,小菜今天学习一下 scale 渐变缩放动画效果。 Activity 绑定动画事件: mBtn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mV1.startAnimation(AnimationUtils.loadAnimation(AnimActivity.this, R.anim.anim_scale)); } }); layout.xml 显示动画效果 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/anim_btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="40dp" android:text="开始动画" /> <View android:id="@+id/anim_v1" android:layout_width="300dp" android:layout_height="150dp" android:layout_gravity="center" android:background="@color/colorAccent" /> </LinearLayout> anim.xml 设置动画属性 <?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3500" android:fromXScale="0.0" android:fromYScale="0.0" android:pivotX="100%p" android:pivotY="100%p" android:toXScale="1.0" android:toYScale="1.0" /> 代码很简单,小菜接下来逐条学习一下 anim_scale 中各条属性: 1. android:duration="3500" duration 代表动画过程中持续时常; 2. android:fromXScale="0.0" fromXScale 代表初始时横向 View 比例,0.0为从没有开始动画,1.0即 View 原尺寸,2.0即 View 原尺寸两倍;建议与 toXScale 共同使用; 3. android:fromYScale="0.0" fromYScale 为初始时纵向 View 比例,与 fromXScale 使用相同; 4. android:toXScale="1.0" toXScale 代表动画过程中横向变化尺寸比例,一般与 fromXScale 共同使用; 5. android:toYScale="1.0" toYScale 代表动画过程中纵向变化尺寸比例,一般与 fromYScale 共同使用; 6. android:pivotX="100%p" android:pivotY="100%p" pivotX 和 pivotY 是小菜重点学习的地方,小菜理解为动画起点坐标,可以为整数值、百分数(或者小数)、百分数p 三种样式。 整数值:android:pivotX="100" 整数值类型是相对于自身 View 来定义,以自身 View 左上角的点为原点,水平向右为正,竖直向下为正的坐标系中计算,设置的整数值为 px,为固定值。 百分数/小数:android:pivotX="100%" 百分数/小数类型是相对于自身 View 来定义,与整数值类似,只是坐标点是以自身 View 尺寸比例来计算而非固定值。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/anim_btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="40dp" android:text="开始动画" /> <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <View android:id="@+id/anim_v1" android:layout_width="300dp" android:layout_height="150dp" android:layout_gravity="center" android:background="@color/colorAccent" /> </FrameLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/background_dark" /> <View android:layout_width="1dp" android:layout_height="match_parent" android:layout_gravity="center" android:layout_marginRight="150dp" android:background="@android:color/background_dark" /> </FrameLayout> </LinearLayout> 百分数 + p: 这种方式是最特殊的,小菜理解为自身 View 与相对于某个父容器的大小,并非单纯的根据父容器大小尺寸位置。小菜为了测试方便,设置了一个固定的 400dp*400dp 的 LinearLayout,测试百分数 + p 的方式都正常,但是如果设置 View 居中或其他情况时跟小菜想的很有差距,小菜测试了很久,终于有一些了解。 百分比 + p 这种方式是相对的,既与父容器相关也与自身 View 相关,当设置 View 位置为居中或其他位置时,整个移动的坐标系也会变化,原点并非直接父容器左上角而是自身 View 左上角,整个移动布局根据 View 平移;而父容器是一个框架,动画的范围大小为父容器大小且只在父容器中进行展示。如图: 小菜这才了解到刚开始测试时并未设置 LinearLayout 的 gravity 或自身 View 的 layout_gravity 属性,默认是居左上角,此时与父容器左上角重合。 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/anim_btn1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="40dp" android:text="开始动画" /> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:layout_width="400dp" android:layout_height="400dp" android:background="#8099cc00" android:layout_marginLeft="50dp" android:layout_marginTop="125dp" android:gravity="center" android:orientation="horizontal" /> <LinearLayout android:layout_width="400dp" android:layout_height="400dp" android:background="#80008577" android:gravity="center" android:orientation="horizontal" > <View android:id="@+id/anim_v1" android:layout_width="300dp" android:layout_height="150dp" android:background="@color/colorAccent" android:gravity="center" android:text="Hello World!" /> </LinearLayout> <View android:layout_width="4dp" android:layout_height="4dp" android:layout_marginLeft="248dp" android:layout_marginTop="123dp" android:background="@android:color/background_dark" /> <View android:layout_width="4dp" android:layout_height="4dp" android:layout_marginLeft="48dp" android:layout_marginTop="323dp" android:background="@android:color/background_dark" /> <View android:layout_width="4dp" android:layout_height="4dp" android:layout_marginLeft="248dp" android:layout_marginTop="323dp" android:background="@android:color/background_dark" /> <View android:layout_width="4dp" android:layout_height="4dp" android:layout_marginLeft="448dp" android:layout_marginTop="523dp" android:background="@android:color/background_dark" /> </FrameLayout> </LinearLayout> 7. android:interpolator="@android:anim/accelerate_decelerate_interpolator" interpolator 代表缩放动画曲线,即动画由大变小,变换速率等,小菜目前还未学习到,后期补充。 小菜的动画部分是短板,正在从零学习,不对的请多多指正!

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

GeoMesa时空基础及应用场景

PPT下载地址:https://yq.aliyun.com/download/3266 视频回看:https://yq.aliyun.com/live/793 内容概要:GeoMesa是一款开源的基于分布式计算系统的面向海量时空数据查询与分析的工具包。本报告首先介绍了GeoMesa基于HBase系统的整体架构与部署架构,其次,分析了其时空索引原理与算法实现,最后简要介绍了GeoMesa与Spark、Kafka、Lambda等开源系统或架构的整合方式。 讲师:肖斐——阿里云数据库技术专家 直播地址HBase生态+Spark社区钉钉大群方式一:扫码入群看直播方式二:Link入群看直播https://dwz.cn/Fvqv066s 直播时间:每周二 18:00-18:30 分享;18:30- 18:45~ 问答

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

神经网络基础及Keras入门

神经网络定义 人工神经网络,简称神经网络,在机器学习和认知科学领域,是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 为了描述神经网络,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示: 可以看出,这个单一“神经元”的输入-输出映射关系其实就是一个逻辑回归(logistic regression)。 神经网络模型 所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入。例如,下图就是一个简单的神经网络: Keras实战 使用keras实现如下网络结构, 并训练模型: 输入值(x1,x2,x3)代表人的身高体重和年龄, 输出值(y1,y2) importnumpyasnp #总人数是1000,一半是男生 n=1000 #所有的身体指标数据都是标准化数据,平均值0,标准差1 tizhong=np.random.normal(size=n) shengao=np.random.normal(size=n) nianling=np.random.normal(size=n) #性别数据,前500名学生是男生,用数字1表示 gender=np.zeros(n) gender[:500]=1 #男生的体重比较重,所以让男生的体重+1 tizhong[:500]+=1 #男生的身高比较高,所以让男生的升高+1 shengao[:500]+=1 #男生的年龄偏小,所以让男生年龄降低1 nianling[:500]-=1 创建模型 fromkerasimportSequential fromkeras.layersimportDense,Activation model=Sequential() #只有一个神经元,三个输入数值 model.add(Dense(4,input_dim=3,kernel_initializer='random_normal',name="Dense1")) #激活函数使用softmax model.add(Activation('relu',name="hidden")) #添加输出层 model.add(Dense(2,input_dim=4,kernel_initializer='random_normal',name="Dense2")) #激活函数使用softmax model.add(Activation('softmax',name="output")) 编译模型 需要指定优化器和损失函数: model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) 训练模型 #转换成one-hot格式 fromkerasimportutils gender_one_hot=utils.to_categorical(gender,num_classes=2) #身体指标都放入一个矩阵data data=np.array([tizhong,shengao,nianling]).T #训练模型 model.fit(data,gender_one_hot,epochs=10,batch_size=8) 输出(stream): Epoch1/10 1000/1000[==============================]-0s235us/step-loss:0.6743-acc:0.7180 Epoch2/10 1000/1000[==============================]-0s86us/step-loss:0.6162-acc:0.7310 Epoch3/10 1000/1000[==============================]-0s88us/step-loss:0.5592-acc:0.7570 Epoch4/10 1000/1000[==============================]-0s87us/step-loss:0.5162-acc:0.7680 Epoch5/10 1000/1000[==============================]-0s89us/step-loss:0.4867-acc:0.7770 Epoch6/10 1000/1000[==============================]-0s88us/step-loss:0.4663-acc:0.7830 Epoch7/10 1000/1000[==============================]-0s87us/step-loss:0.4539-acc:0.7890 Epoch8/10 1000/1000[==============================]-0s86us/step-loss:0.4469-acc:0.7920 Epoch9/10 1000/1000[==============================]-0s88us/step-loss:0.4431-acc:0.7940 Epoch10/10 1000/1000[==============================]-0s88us/step-loss:0.4407-acc:0.7900 输出(plain)://Python学习开发705673780 进行预测 test_data=np.array([[0,0,0]]) probability=model.predict(test_data) ifprobability[0,0]>0.5: print('女生') else: print('男生') ### 输出(stream): 女生 关键词解释 input_dim: 输入的维度数 kernel_initializer: 数值初始化方法, 通常是正太分布 batch_size: 一次训练中, 样本数据被分割成多个小份, 每一小份包含的样本数叫做batch_size epochs: 如果说将所有数据训练一次叫做一轮的话。epochs决定了总共进行几轮训练。 optimizer: 优化器, 可以理解为求梯度的方法 loss: 损失函数, 可以理解为用于衡量估计值和观察值之间的差距, 差距越小, loss越小 metrics: 类似loss, 只是metrics不参与梯度计算, 只是一个衡量算法准确性的指标, 分类模型就用accuracy 看完觉得有所收获的朋友可以点赞加关注哦,谢谢支持!

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

WebRTC基础实践 - 1. WebRTC简介

WebRTC 是一个开源的实时通信项目, 主要目标是对Web/原生App平台上的语音、视频、以及数据传输等实时通讯提供支持。 WebRTC 主要包括以下 JavaScript API(点击链接可查看相关demo)。 getUserMedia(): 获取用户设备的音频和视频. MediaRecorder: 录制音频和视频. RTCPeerConnection: 流式传输两个客户端之间的音频与视频. RTCDataChannel: 在两个客户端之间传输数据流. WebRTC的平台支持情况 目前, PC版和Android版的 Firefox、Opera 和 Chrome 浏览器都支持WebRTC。 此外、iOS和Android的一些原生App也支持WebRTC。 译者注: 国内使用量巨大的360浏览器、搜狗浏览器兼容性基本和Chrome一致。当然, 推荐使用最新的版本(当前时间: 2018年6月28日)。 信令(signaling) WebRTC 通过 RTCPeerConnection 在浏览器之间进行流数据传输, 但还需要一种机制, 来协调通信以及发送控制指令, 这个过程就叫做信令控制. WebRTC 没有规定具体使用的协议或方法。 在本教程中, 我们使用 Socket.IO 来传递消息, 当然也可以使用 其他实现。 STUN和TURN简介 WebRTC 是基于点对点(peer-to-peer)网络设计的, 在理想环境中, 双方通过路由器进行直连. 但在现实世界中, 两个客户端之间, 需要穿透防火墙以及 NAT 网关, 如果直连失败, 则需要回退降级。所以, 为了应对各种复杂的网络环境, WebRTC API 需要使用 STUN 服务器的帮助, 来获取双方的公网IP, 如果对等连接失败, 则需要使用 TURN 服务器作为中继服务器. 现实世界中的网络环境是什么样子的呢, 请参考 WebRTC in the real world WebRTC的安全性 WebRTC的所有组件强制加密. 相关的JavaScript API也只能在安全的域名中使用(即 HTTPS 或者 localhost). 但WebRTC标准没有指定信令机制, 所以需要开发者确保使用了安全传输协议。 更多信息和资源, 请参考: http://webrtc.org/start 相关词汇对照: capture : 获取、抓取 audio : 音频 video : 视频 stream : 流 data stream : 数据流 record : 录制、记录 signaling : 信令 Encryption : 加密 relay server : 中继服务器 peer-to-peer: 点对点网络 原文链接: https://codelabs.developers.google.com/codelabs/webrtc-web/#0 翻译人员: 铁锚 - https://blog.csdn.net/renfufei 翻译日期: 2018年06月28日

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

JavaScript—Ajax基础知识梳理(29)

Ajax用一句话来说就是无须刷新页面即可从服务器取得数据。注意,虽然Ajax翻译过来叫异步JavaScript与XML,但是获得的数据不一定是XML数据,现在服务器端返回的都是JSON格式的文件。 完整的Ajax请求过程完整的Ajax请求过程 1.创建XMLHttpRequest实例2.发出HTTP请求 3.接收服务器传回的数据4.更新网页数据 下面先看一个红宝书上给出的发起Ajax请求的例子,API的用法在后面章节给出。 var xhr = new XMLHttpRequest(); // 创建XMLHttpRequest实例 xhr.onreadystatechange = function(){ if (xhr.readyState == 4){ // 判断请求响应过程阶段,4 阶段代表已接收到数据 if (xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { // 校验HTTP状态码 console.log(xhr.responseText); // 输出响应的文本 } else { console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码 } } }; xhr.open('get', 'example.txt', true); // 初始化xhr实例,或者说启动请求 xhr.send(null); // 设置HTTP请求携带参数,null为不带参数 Ajax请求过程详解 创建XMLHttpRequest实例从上面的的代码可以看出,创建一个XHR实例方式为: var xhr = new XMLHttpRequest(); 发出HTTP请求实例创建好后,首先需要启动一个HTTP请求,使用XHR的open()方法,open方法接受三个参数 XMLHttpRequest.open(method, url, isAsync) // 例如 xhr.open('get', 'http://www.baidu.com', true) 第一个参数为http请求使用方法,如('get','post'等),第二是参数是请求的url, 第三个参数代表是否异步发送请求(可选)。调用open()方法后会启动一个http请求,但它不会立即发送请求,处于待命状态。需要注意的是:请求的url必须要跟请求源域(origin)同域,也就是说协议、域名、端口号要一致,跨域请求要使用别的方法。接着调用send()方法就会发出这个http请求。 xhr.open('get', 'http://www.baidu.com', true) xhr.send(null) send()方法接受一个参数,为http请求发送的数据(通常用于'post'方法),如果为null,表示不发送数据。至此,一个异步的http请求就发送到了服务器。 接收服务器传回的数据3.1 发送同步请求 如果将open方法的第三个参数设为false,即为同步请求,当收到服务器的响应后,相应的数据会自动填充到XHR对象的属性中,主要包括以下四个: responseText:作为响应主体被返回的文本。 responseXML: 响应返回的XML文档,能接收到的前提是,响应的Content-Type字段的值为text/xml或者application/xml。 status: HTTP状态码。 statusText: HTTP状态码说明。 当客户端收到以上信息后,首先要判断HTTP状态码来确认响应是否成功,状态码在200-300之间表示请求成功,同时304代表请求资源未被修改,可使用浏览器本地缓存。如果成功就可以获取响应报文主体中的数据了。 xhr.open('get', 'http://www.baidu.com', false) xhr.send(null) if (xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { // 校验HTTP状态码 console.log(xhr.responseText); // 输出响应的文本 } else { console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码 } 3.2 发送异步请求如果将open方法的第三个参数设为true,即为异步请求。那么就需要一个事件来通知程序异步请求的结果是否返回。XHR对象中的readyState属性,表示请求/响应整个过程所处的阶段,它有五个值分为对应五个阶段: 0:未初始化。未调用open()方法。1:启动。已经调用open()方法,但未调用send()方法。2:发送。已调用send()方法,但未收到响应。3: 接收。已经接收到部分响应数据。4:完成。已经接受到全部响应数据。 readyState的值每变化一次,都会触发一次readStatechange事件,我们定义一个事件处理函数onreadStatechange(),并监听readyState == 4状态,就可以得知响应数据已全部收到,并进行下一步操作。那么就是文章开头给出的代码: var xhr = new XMLHttpRequest(); // 创建XMLHttpRequest实例 xhr.onreadystatechange = function(){ if (xhr.readyState == 4){ // 判断请求响应过程阶段,4 阶段代表已接收到数据 if (xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { // 校验HTTP状态码 console.log(xhr.responseText); // 输出响应的文本 } else { console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码 } } }; xhr.open('get', 'example.txt', true); // 初始化xhr实例,或者说启动请求 xhr.send(null); // 设置HTTP请求携带参数,null为不带参数 补充XHR中三个有用的事件 timeout事件当超出了设置时间还未收到响应,就会触发timeout事件,进而调用ontimeout事件处理程序。同时timeout也是XHR的一个属性,用于设置这个时间阈值。下面是用法: xhr.ontimeout = function() { alert('timeout!') } xhr.open('get', 'http://www.baidu.com', true) xhr.timeout = 1000 // 时间阈值设为1秒 xhr.send(null) load事件 load事件用于简化对readState值的判断,响应数据全部接收完毕后(也就是readState == 4)会触发load事件,使用onload事件处理函数进行后续操作,onload会接收一个event对象,它的target属性等于XHR对象,当然我们在定义这个事件处理函数时也可以不传入这个参数,来看下面的用法: var xhr = new XMLHttpRequest() xhr.onload = function () { if(xhr.status >=200 && xhr.status < 300 || xhr.status == 304) { console.log(xhr.responseText); // 输出响应的文本 } else { console.error(xhr.status, xhr.statusText); // 打印其他HTTP状态码 } } xhr.open('get', 'http://www.baidu.com', true) xhr.send(null) 这样就不用去关心readyState值的变化情况了。当然如果想在特定readyState值上做一些逻辑处理,还是要用之前的方法。 progress事件这个是很有用的一个事件,progress事件会在浏览器接收数据期间周期触发,代表整个请求过程的进度,它的事件处理程序onprogress接收一个event对象,event.target是XHR对象,另外event还有三个属性: lengthComputable:Boolean值,进度信息是否可用。position:已经接收到的字节数。totalSize:总共要接收的字节数,被定义在响应报文的Content-Length字段中。 如果响应报文中有Content-Length字段,那么我们就可以计算当前时刻响应数据的加载进度了,这也是之前看到的一个面试题。看下面的代码: xhr.onprogress = function(event) { if(event.lengthComputable) { console.log(`Received: ${(event.position/event.totalSize).toFixed(4)*100}%`); } } 其他还有很多有用的API,如FormData表单序列化,overrideMimeType()重写XHR响应的MIME类型等等

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

Python基础——mysql数据库、SQLAlchemy

一、MySQL常用操作 1、创建库 create database test; 2、创建表 create table student(id int not null); 3、授权一个用户 grant all privileges on *.* to 'username'@'%' identified by 'passwd'; 其中%通配所有地址 4、查询 select * from tabel_name where 条件1 and 条件2; 5、增加数据 insert into table_name (id, name, age, sex, grander) values (1, 'jsh', 25, 'M', 99), (2, 'Tom', 45, 'F', 88); 6、删除数据 delete from table_name where 条件判断; drop table table_name; 删除表 7、改数据(更新数据) update table_name set id=10 where 条件判断; 8、联合查询 select a.id, b.name from A a join B b on a.id=b.tid; 9、创建索引 create index idx_库名_表名_列名1_列名2 或 (列名1, 列名2) 10、查看SQL是否走索引 explain select * from student where name='JSH' 二、MySQL 数据库连接 1、Python2 使用mysqldb python3 使用 pymysql 2、创建链接 和游标 在mysql连接中,尽量使用一个连接,确保mysql的并发数 conn = pymysql.connect(host='', port=, user='', passwd='', db='') # cus = conn.curse() 3、执行MySQL语句 sql = "select * from Student;" # cus.execute(sql) # cus.fetchone() 获取单个 返回值 tuple # cus.fetchall() 获取多个 返回值 list(单个元素是tuple) # cus.fetchmany(size=n) 获取多个 4、关闭游标 和 链接 注意结合try exception finally的使用 cus.close() conn.close() 三、SQLAlchemy(对象关系映射) 1、创建引擎 engine = create_engine('mysql+pymysql://root:123456@192.168.6.137/sqlalchemy',echo=True) 2、创建session DBsession = sessionmaker(bind=engine) session = DBsession() 3、创建表 a. 获得engine b. metadata = MetaData(engine) c. student = Table('表名', metadata, Colume('id', Integer, primary_key=True), Colume('name', String(50)) d. metadata.create_all() 4、增加数据 a. 先要有一个模型 Base = declarative_base(0 class Student(Base): __tablename__ = 'student' id = Column(Integer, primary_key=True) name = Column(String(100), primary_key=True) b. 导入模型类,实例化该类, sutdent1 = Student(1, 'ling') c. session.add(单实例) session.add_all([实例1, 实例2]) 5、查询 # filter和filter_by的区别 # filter:可以使用> < 等,但是列必须是: 表.列, filter的等于号是== session.query(Student).filter(Student.id>100) # filter 不支持组合查询 session.query(Student).filter(Studnet.id>100).filter(name='ling') # filter_by: 可以直接写列,不支持< > filter_by 等于是== session.query(Student).filter_by(id==10) # filter_by 可以支持组合查询 session.query(Student).filter_by(name='ling' and id='342') # 模糊查询含有ling的关键字 select * from student where name like '%JSH%'; # 模糊查询 # session.query(Student).filter(Student.name.like('%JSH%')) # 获取数据的时候有两个方法: # one() 获取到的数据为 tuple # all() 获取到的数据为 list(单个元素是tuple) # 如果在查询中不写one(), 或者all() 得到的就是sql语句 6、更新 1. 先查出来 2. 跟新一下类所对应的属性值就ok session.commit() student1 = session.query(Student).filter(Student.id=1001) student1.name = "test" session.commit() 7、删除 # 1. 先查出来 # 2. 直接调用delete()方法就可以 # 3. 提交一下 8、统计count() 分组 # 只需要在查出来以后, 把one或者all替换成count() 9、分组group_by 查出来以后,把one或者all替换成group_by(属性)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

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文件系统,支持十年生命周期更新。

用户登录
用户注册