1. LNMP 环境安装 链接: https://lnmp.org/install.html,如果一键安装成功,网页打开 IP 就可以直接看到 LNMP 环境配置成功的界面。看不到,可能原因有:阿里云 ecs 需要开放80端口:https://yq.aliyun.com/ask/59920spm=5176.10695662.1996646101.searchclickresult.71d87d2do0KvGc
2. 添加虚拟主机,使用域名访问: https://lnmp.org/faq/lnmp-vhost-add-howto.html
3. 部署 Laravel 项目, 配置了 vhost 仍报错 500,可能有一下两个原因: ⑴ 删除根目录下因为配置 vhost 生成的 .user.ini,官方 https://lnmp.org/faq/lnmp-vhost-add-howto.html#user.ini LNMP 1.4上如果不想用防跨目录或者修改.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。 ⑵ 根目录运行 chmod -R 777 storage 和 chmod -R 777 bootstrap,给予这两个目录权限 4. laravel 配置路由除了根目录出现 404 解决办法 https://blog.csdn.net/fatong3/article/details/53493519
在server {}里加上 location / { try_files $uri $uri/ /index.php?$query_string; } 保存,重启nginx lnmp nginx restart 5. laravel 项目中使用了 Laravel/Excel 插件来构建导出 excel 功能,部署后不能实现功能,原因是 LNMP 环境下需要手动去安装 php fileinfo扩展。 https://www.
本博客多为与信息安全相关的博文,我希望以此来记录自己的学习轨迹,如有错误,欢迎交流指正。
终于下定决心入门ctf,在实验吧上尝试第一道题、迈出第一步。 原题链接:http://ctf5.shiyanbar.com/web/houtai/ffifdyop.php 先看源码 关注这里的sql语句
sql = "SELECT * FROM admin WHERE username = 'admin' and password = '".md5($password,true)."'"; 然后,发现密码被MD5加密了,就是搜索与MD5相关内容,发现下面这些内容。 原博文链接:https://blog.csdn.net/qq_31481187/article/details/59727015
MD5注入
$sql = "SELECT * FROM admin WHERE pass = '".md5($password,true)."'"; md5($password,true)将MD5值转化为了十六进制 思路比较明确,当md5后的hex转换成字符串后,如果包含 ‘or’ 这样的字符串,那整个sql变成
SELECT * FROM admin WHERE pass = ''or'6<trash>' 提供一个字符串:ffifdyop
于是直接输入ffifdyop就可以得到flag了。 其实先是发现ffifdyop就在url中,抱着碰运气的想法成功了。
https://maoao530.github.io/2017/01/18/package-install/
本文介绍APK的安装流程。
一、安装流程图 APK安装流程,总体可以下图流程,用ProcessOn画的,凑合看:
从上图我们可以看到apk安装到最后都会调用到这个flow:
PMS.scanPackageTracedLI => PMS.scanPackageLI => PMS.scanPackageDirtyLI
关于这个flow,之前的博客有详细介绍过,本文不再展开 : https://maoao530.github.io/2017/01/10/packagemanager/
后续的博文会根据这张图展开说明。
二、APK文件结构 APK(Android Package),可以看做是一个zip压缩包,可以通过解压缩工具解开,其文件结构如下:
目录 or 文件描述assert存放的原生资源文件,通过AssetManager类访问libnative库文件META-INF存放签名信息,用来保证APK包的完整性和系统的安全。系统安装APK时,应用管理器会按照对应算法对包里文件做校验,如果校验结果与META-INF中内容不一致,则不会安装这个APK。res种资源文件系统会在R.java里面自动生成该资源文件的ID,所以访问这种资源文件比较简单,通过R.XXX.ID即可AndroidManifest.xml每个应用都必须定义和包含,描述应用的名字、版本权限、引用的库文件等信息。apk中的AndroidManifest.xml经过压缩,可以通过AXMLPrinter2工具解开。classes.dex是JAVA源码编译后生成的JAVA字节码文件。但Android使用的dalvik虚拟机与标准的JAVA虚拟机不兼容,dex文件与class文件相比,不论是文件结构还是opcode都不一样。resources.arsc编译后的二进制资源文件。 三、APK安装方法 APK有下面4种安装方法:
方法描述开机过程中安装开机时完成,没有安装界面,如系统应用、其它预置应用adb工具安装没有安装界面,adb install/push xxxx.apk第三方应用安装通过packageinstaller.apk进行安装,有安装界面,如打开文件管理器并点击sdk卡里APK文件网络下载应用安装通过google market应用完成,没有安装界面 简单说明下apk安装的基本过程:
拷贝目标apk到指定文件目录调用scanPackageLI为apk文件在系统中注册信息 四、应用程序安装过程 上述几种安装方法最终都通过PackageManagerService.scanPackageLI完成,总结起来大致有以下三种方式:
adb push:
PackageManagerService的内部类AppDirObserver实现了监听app目录的功能,当把某个APK文件放到app目录下面时,PMS会收到ADD_EVENTS事件
frameworks\base\services\java\com\android\server\pm\PackageManagerService.java
adb install:
安装入口函数为Pm.runInstall
frameworks\base\cmds\pm\src\com\android\commands\pm\Pm.java
网络下载应用安装和第三方应用安装:
安装入口函数为ApplicationPackageManager.installPackage
frameworks\base\core\java\android\app\ApplicationPackageManager.java
接下来我们来分别详细说明这些安装流程:
五、adb push Android 4.4平台,PackageManagerService的内部类AppDirObserver实现了监听app目录的功能,当把某个APK文件放到app目录下面时,PMS会收到ADD_EVENTS事件。
如果是添加事件,则调用scanPackageLI,并使用updatePermissionsLPw授权;如果是删除事件则调用removePackageLI移除该apk的相关信息。最后都要调用writeLPr重新保存相关信息到packages.xml。
关于AppDirObserver具体如何监听的,可以查看:AppDirObserver
不过我在android 7.0 sdk里面没有看到这个类,难道7.0把这个功能砍了?手头没有7.0平台,不好验证。
我猜测现在通过adb push apk到data/app或者system/app的apk,如果这个监听的功能砍了,那么应该是会通过reboot重启系统,走PMS.main流程,scanDir–>scanPackageLI去安装apk。
以上待填坑。
六、adb install adb install 的安装方式,会调用system/core/adb/commandline.cpp中的adb_commandline函数:
1
2
3
4
5
adb_commandline
install_app_legacy or install_app
Access denied for user 'root'@'localhost':拒绝用户'root'@'localhost'的访问。
出现这个报错语句的一般原因是输入了错误的密码,也有可能是是root帐户默认不开放远程访问权限。
相关的解决方法是重新设置密码和修改root用户的远程访问权限。
解决方案:打开MySQL目录下的my.ini文件,把“skip-grant-tables”添加进[mysqld]里面,保存并关闭文件。(MySQL8.0路径为:C:\ProgramData\MySQL\MySQL Server 8.0下面)
停止MySQL服务通过命令行进入MySQL的bin目录,输入“mysql -u root -p”(不输入密码),回车即可进入数据库。执行“use mysql;”,使用mysql数据库。执行“update user set password=PASSWORD("123456") where user='root';”(修改root的密码)打开MySQL目录下的my.ini文件,删除“skip-grant-tables”,保存并关闭文件。重启MySQL服务。在命令行中输入“mysql -u root -p 123456”,即可成功连接数据库。
可重入锁和不可重入锁 概念区分 当一个线程获得当前实例的锁lock,并且进入了方法A,该线程在方法A没有释放该锁的时候,是否可以再次进入使用该锁的方法B?
不可重入锁:在方法A释放锁之前,不可以再次进入方法B
可重入锁:在方法A释放该锁之前可以再次进入方法B;如ReentrantLock和synchronized
原理分析 不可重入锁的实现:
public class Lock {
private boolean isLocked = false;
public void lock() throws InterruptedException{
while(isLocked){//如果已经被获取锁,则当前线程只能等待
wait();
}
isLocked = true;
}
public void unLock(){
isLocked = false;
}
}
可重入锁的实例:
public class ReinnerLock {
private boolean isLocked = false;
Thread thread = null;//当前的线程
public void lock() throws InterruptedException{
Thread currentThread = Thread.currentThread();
while(isLocked && thread!=currentThread){
wait();
}
isLocked = true;
thread = currentThread;
Graphlib是一个用于直接或间接地制作或修改图画的javascript库
一、基本概念 (1)、Graphlib只有一个图形类型,我们需要先创建它的实例
var g = new graphlib.Graph(); 默认情况下,将创建一个不允许多边或复合节点的有向图,构造提供了三个参数: 1. directed 该值为true时图为有向图,default:true 2. multigraph 该值为true时允许一个图在同一对节点之间有多个边,default:false 3. compound 该值为true时允许图具有复合节点-节点可以是其他节点的父节点, default:false 创建有向多边复合图:
var g = new Graph({ directed: true, compound: true, multigraph: true }); (2)、节点和边的表示
1.设置节点的id
var g = new graphlib.Graph(); g.setNode('a-id', 'a-text'); console.log('a-id'); // 'a-text' //所有与节点相关的函数都使用此id作为唯一标识。 2.边是通过连接的节点来识别的
var g = new graphlib.Graph(); g.setEdge('source', 'target', 'text'); console.log(g.edge('source', 'target')); 3.边对象 edgeObjs 用来唯一地识别单个对象中的边缘,用于各种边缘查询
(3)、多图
(4)、复合图
(5)、默认标签
二、API (1)、graph.isDirected() 是否为有向图
(2)、graph.isMultigraph() 是否为多图
(3)、graph.isCompound() 是否为复合图
IDEA 如何使用JRebel 部署web项目呢?
【Jrebel 破解码:http://139.199.89.239:1008/88414687-3b91-4286-89ba-2dc813b107ce
Tomcat 注意设置那两项。】
步骤
(1)安装JRebel插件
File|Settings...
输入JRebel进行搜索,然后安装.
注意:安装完JRebel插件之后需要重启IDEA.
(2)配置tomcat
Run|
依次点开Defaults-Tomcat Server-Local,进入Local Tomcat(Tomcat模板)的设置界面
点击Configure,设置Tomcat路径,并单击OK保存
修改"Update" 动作和tomcat端口号
server选项卡,设置On Update action 和 On frame deactivation 两个动作都更新类和资源
(3)配置输入的classes目录
File|Project structure
进入"Project"标签页
修改"Project compiler output"为D:\software\eclipse\workspace2\<项目名称>\src\main\webapp\WEB-INF\classes
设置modules的代码编译输出目录. 点击modules 设置右侧 use module compile output path
都是设置为D:\software\eclipse\workspace2\<项目名称>\src\main\webapp\WEB-INF\classes
指定Web.xml和WebRoot的路径. 点击web,分别指定
Web Module deployment descriptor 路径为 D:\software\eclipse\workspace2\convention\src\main\webapp\WEB-INF\web.xml
和 Web Resource Directory的路径 为 D:\software\eclipse\workspace2\convention\src\main\webapp
点击Apply.
进入Artifacts 标签页,修改Output directory:
(4)添加对应project的应用服务器
去掉"After launch"的勾选
保存之后并点击Deployment选项卡,
选择exploded那项
右边设置访问的uri即应用路径,
保存,回到server选项卡,设置On Update action 和 On frame deactivation 两个动作都更新类和资源
分享一个我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailclimb/Java-Guide
本文出自:
http://blog.onlycatch.com/post/自旋锁
我对原文做了一点补充与修改,我觉得这篇文章写的非常非常好。深入学习,不光可以深入掌握自旋锁,可能提高自己的编程思想。原文作者对于自旋锁的思考很棒,为他点个赞。
在我的上一篇文章:《面试必备之乐观锁与悲观锁》 已经为大家对比了乐观锁与悲观锁。我们知道CAS算法是乐观锁的一种实现方式,CAS算法中又涉及到自旋锁,所以这里给大家讲一下什么是自旋锁。
简单回顾一下CAS算法 CAS算法 即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数
需要读写的内存值 V进行比较的值 A拟写入的新值 B 当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个<font color="red">自旋操作</font>,即不断的重试。
什么是自旋锁? <font color="red">自旋锁(spinlock)</font>:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。
它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
Java如何实现自旋锁? 下面是个简单的例子:
public class SpinLock { private AtomicReference<Thread> cas = new AtomicReference<Thread>(); public void lock() { Thread current = Thread.currentThread(); // 利用CAS while (!cas.compareAndSet(null, current)) { // DO nothing } } public void unlock() { Thread current = Thread.currentThread(); cas.compareAndSet(current, null); } } lock()方法利用的CAS,当第一个线程A获取锁的时候,能够成功获取到,不会进入while循环,如果此时线程A没有释放锁,另一个线程B又来获取锁,此时由于不满足CAS,所以就会进入while循环,不断判断是否满足CAS,直到A线程调用unlock方法释放了该锁。
第四章 数据库 一、 Flask架构中的数据库二、DATABASE Migrate数据库迁移三、Flask-SQLAlchemy设置1、设置SQLITE数据库引擎uri2、初始化DB对象及迁移对象 四、数据库模型(类似关系型数据库表结构)五、生成迁移库六、第一个数据库迁移七、数据库升级和降级八、数据库表关系九、玩乐时间 在实际网站开发中,开发者在本地进行开发,测试成功后再把新版本的功能发布的正式应用环境。不断更新升级的过程,怎么能快速的在本地及正式环境中同步数据呢?那就需要下边的知识——数据库迁移技术。 一、 Flask架构中的数据库 其实在FLASK中,是没有自带数据库功能,但是,它可以与各种流行的数据库软件轻易结合,它把这种选择留给开发人员,这正是Flask的灵活支持。
虽然可供选择的数据库很多,比如关系型数据:mysql、PostgreSQL、mssql、oracle等,还有非关系型数据库。但是,本示例还是选用轻巧的关系型数据库sqlite(没有数据库引擎)。如果要把此应用发布到生产环境,仅需要把数据库引擎切换到其他类型的数据库。
第三章,我们就引进了几个flask的扩充库。这次,为了更好的管理数据库操作,需要一个第三方的库flask-sqlalchemy。
介绍下ORM
ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类、对象、方法或者类实例来完成。
SQLAlchemy 是Python 社区最知名的 ORM 工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型。它可以适用各种数据库。
安装flask-sqlalchemy。 注意:先要激活虚拟环境再安装。
pip install flask-sqlalchemy 二、DATABASE Migrate数据库迁移 个人理解:这里的迁移不是仅指数据库文件的整体迁移(备份及还原、附加数据库等),也包含微小数据结构改变操作。
实际应该是所有数据库操作动作对应的语言脚本,通过这些脚本可以快速重复同样的操作。
很多的数据教程会提到怎么新建、使用数据库操作,但是当APP应用的数据结构变化或扩展后的相关操作,教程很少会提及。
尤其关系型数据库的关系结构复杂,一旦结构改变,相应的数据就需要对应改变。
安装flask-migrate
pip install flask-migrate 注意:先要激活虚拟环境再安装。 三、Flask-SQLAlchemy设置 1、设置SQLITE数据库引擎uri 如前边的章节介绍一样,把此处的设置内容,增添到config.py文件中。
path.dirname:去掉路径中的文件名称。
os.path.abspath:获取绝对路径。
file:当前文件的路径。
import os basedir = os.path.abspath(os.path.dirname(__file__)) #__file__用来获得模块所在的路径. class Config(object): # ... SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \ #获取环境变量为DATABASE_URL值(windows系统中环境变量的path参数) 'sqlite:///' + os.path.join(basedir, 'app.db') #拼接一个sqlite接口引擎 SQLALCHEMY_TRACK_MODIFICATIONS = False #设置为False后,不会记录数据的变更记录。 2、初始化DB对象及迁移对象 app/init.
开机启动分多种方式,介绍一种简单的方式,在/etc/rc.local配置一下启动脚本即可。其中rc.local运行在操作系统完全引导成功但是尚未启动login shell之前(也就是说rc.local运行于系统shell级别),此时配置在/etc/profiles或bashrc里的环境变量并未得到执行,因此在rc.local执行阶段看不到任何环境变量。本文以Ubuntu16.04系统为例说明,先看一下默认的rc.local的样子:
要解决在系统shell中无法加载环境变量可以通过如下方法: 通过source /etc/profile进行加载环境变量,但同时需要修改第一行为#!/bin/bash,由于bash是sh的增强版本,source命令在sh中不识别。当然也可以直接在rc.local里面通过类似export JAVA_HOME=xxx的方式进行动态添加,但显然这种方式就不太通用了。
以下介绍rc.local中的两种使用场景:
以root用户自启动脚本 由于系统shell默认以root权限执行,因此可以直接在rc.local写待启动的脚本即可 以普通用户自启动脚本 由于开机默认是以root权限执行,因此这种方式需切换到普通用户在执行脚本即可。 其中红框内的意思是切换到songhongwei用户,然后执行引号中的命令。
欢迎访问http://xyoj.xynu.edu.cn/ranklist.php练习系统
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM 调度并执行,这并不意味着线程就会立即运行。run()方法是线程启动后要进行回调(callback)的方法。
综上:
如果当前的VC不使用Interface Builder,请覆盖这个方法,反之如果使用了,则一定不能覆盖这个方法(you must not overridethis method)。loadView这个方法负责创建当前VC的根视图的视图层级(view hierachy),在这里给self.view赋值(non-nilvalue),并且不要调用[super loadView];(Your custom implementation of this method should not call super);viewDidLoad用来做额外的初始化(additional initialization); 原文链接
1、如何实现排序
a 命名查询:
public interface ParamsRepository extends JpaRepository<CwParams, String>,JpaSpecificationExecutor<CwParams> { List<CwParams> findAllByOrderByCodeDesc();//根据code倒序查询 } b 基于Sort:
public ResponseResult listRecord(RecordCondition condition) { LocalResponseResult responseResult = super.buildResponseResult(condition); Pageable pageable = new PageRequest(condition.getPage() - 1, condition.getSize(),new Sort(Sort.Direction .DESC,"id"));//创建分页条件和排序条件 Specification<CwStopRecord> specification = (Specification<CwStopRecord>) (root, query, cb) -> { List<Predicate> list = new ArrayList<>(); //条件全为空则执行无条件查询 if (StringUtils.isNotBlank(condition.getType())) { Predicate p1 = cb.equal(root.get("type"), condition.getType()); list.add(p1); } if (StringUtils.isNotBlank(condition.getCarNo())) { Predicate p2 = cb.like(root.get("carNo"), "%" + condition.getCarNo() + "
2018-07-24 15:38:07.647 INFO 20368 --- [ main] c.e.playspring.PlayspringApplication : Starting PlayspringApplication on LAPTOP-P96OGO0J with PID 20368 (C:\project\playspring\target\classes started by DK in C:\project\playspring) 2018-07-24 15:38:07.651 INFO 20368 --- [ main] c.e.playspring.PlayspringApplication : No active profile set, falling back to default profiles: default 2018-07-24 15:38:07.729 INFO 20368 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@13e39c73: startup date [Tue Jul 24 15:38:07 CST 2018]; root of context hierarchy 2018-07-24 15:38:08.376 WARN 20368 --- [ main] o.
HTTP协议:
什么是HTTP,Http是超文本传输协议,从浏览器到服务器称为请求,从服务器回到浏览器称之为响应
请求对象:(HttpServletRequest):
请求对象分为请求头,请求行以及请求实体下面分别来讲一下:
请求行包括:传输方式(get或post) 请求的地址(url) 协议的版本
请求头中只有:只有键值对形式存在的参数
请求实体:post传参方式,需要注意的是,当传输方式为get时,表单中的值是在地址的问号后面,
当传输方式为post时值是在请求实体中
HttpServletRequest的本质上就是HTTP协议的请求所封装的
请求对象中的方法:
1》获取请求行中的内容
Request.getMethod() 获取请求方式
Request.getRequestURI() 获取地址栏中?之前端口之后
Request.getRequestURL() 获取?之前所有,返回StringBuffer
Request.getScheme() 获取协议
Request.getContextPath() 获取根目录
Request.getQueryString() 获取?之后
2》获取请求头中的内容:
Request.getHeader(键) 键是不区分大小写的
3》获取网络信息:
request.getRemoteAddr() 获取客户端ip地址
Request.getRemotePort() 获取客户端的端口
Request.getLocalAddr() 获取服务器IP地址
Request.getLocalPort() 获取服务器端口号
4》获取表单参数:
首先获取单键单值:
Request.getParameter(键) 返回String,需要注意的是如果没有键返回的是null,
有键而没有值返回空字符串;
获取同键不同值(主要针对复选框):
request.getParameterValues(键) 返回一个String[]
获取所有键的集合:
Request.getParameterNames() 返回的是Enumeration,也就是一个容器
While(enum对象.hasMoreElements()){
enum对象.nextElement();
}
如何解决请求中的乱码问题:
request.setCharacterEncoding(当前项目的编码集)
注意:
本身对请求实体进行编码,针对于post编码。如果需要对get同时一起编码,需要在配置端口号的地方添加useBodyEncodingForURI="true"。
响应对象:(HttpServletResponse)
响应行:包含协议版本,状态码,还有状态描述
响应头:也是键值对的形式存在的
响应实体:字符串或者是流信息
HttpServletResponse响应对象:
设置响应头:
response.setHeader(键,值) 忽略大小写
设置刷新,refresh
可以单独写秒数,代表的是多少秒后刷新本页面
也可以写秒数;url="地址" 代表的是多少秒后刷新并跳转到指定地址
设置响应的编码集:
Response.setHeader("content-type","text/html;charset=服务器编码集")
1、上传实体工具类:
public class FileUpload { private String fileName; //文件名 private String filePath; //文件路径 private String [] allowType = {"jpg", "jpeg", "bmp" , "png", "gif", "zip", "xlsx", "apk","bin"}; //允许的文件类型 private Integer maxSize = 2 * 1024 * 1024; //文件最大值,默认4M private Integer minSize = 1; //文件最小值,默认1B /** * 默认构造方法 */ public FileUpload() {} /** * 设置参数 * @param fileName 文件名 * @param filePath 文件路径 * @param allowType 允许的文件类型 * @param maxSize 文件最大值 * @param minSize 文件最小值 */ public FileUpload(String fileName, String filePath, String[] allowType, Integer maxSize, Integer minSize) { if(fileName !
1、相对路径:就是相对于自己的目标文件的位置。(指以当前文件所处目录而言文件的位置)————以引用文件之间网页所在位置为参考基础,而建立出的目录路径。因此当保存于不同目录的网页引用同一个文件时,所使用的路径将不相同,故称之为相对。
2、绝对路径:是指文件在硬盘上真正存在的路径。(指对站点的根目录而言某文件的位置)————以web站点为根目录为参考基础的目录路径,之所以成为绝对,意指当所有网页引用同一文件时,所引用的路径都是一样的。
3、相对路径使用“/”字符作为目录的分隔字符,而绝对路径可以使用“\”或“/”字符作为目录的分隔字符
------------------------------------------------------------#下面以网页制作为例-#--------------------------------------------------------
假设你的网页在如下位置:D:\WORK\web\111.html,而图片在D:\WORK\web\images\111.JPG 有以下两种情况:
一,你在网页中直接以D:\WORK\web\images\111.JPG这个路径表示你的图片。<这个就是图片的绝对路径> 二,你在网页中以: images\111.JPG来表示你的这个图片。<这个是图片的相对路径>
---------------------------------------------------------------------------------------------------------------------------------------------------
4、在把绝对路径转化为相对路径的时候,两个文件绝对路径中相同的部分都可以忽略,不做考虑,只要考虑他们不同之处就可以了。
5、. 代表目前所在的目录 ..代表上一层目录 /代表根目录
参考网址:http://blog.csdn.net/huazhangena/article/details/7587720
1、下载redis压缩包并解压
2、修改配置文件——redis.windows.conf
3、打开cmd,切换到redis解压路径
输入redis-server --service-install redis.windows.conf --loglevel verbose命令注册服务:
4、输入redis-server --service-start开启服务:
5、打开window管理可以看到:
6、测试"hello word",在命令窗口输入redis-cli.exe,打开服务端:
三点求圆心以及半径模板
double X,Y,R; struct Point{ double x,y; }pp[maxn]; double dis(Point x,Point y) { return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y)); } void solve(Point a,Point b,Point c)//三点共圆圆心公式 { X=( (a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*(a.y-c.y)-(a.x*a.x-c.x*c.x+a.y*a.y-c.y*c.y)*(a.y-b.y) ) / (2*(a.y-c.y)*(a.x-b.x)-2*(a.y-b.y)*(a.x-c.x)); Y=( (a.x*a.x-b.x*b.x+a.y*a.y-b.y*b.y)*(a.x-c.x)-(a.x*a.x-c.x*c.x+a.y*a.y-c.y*c.y)*(a.x-b.x) ) / (2*(a.y-b.y)*(a.x-c.x)-2*(a.y-c.y)*(a.x-b.x)); R=sqrt((X-a.x)*(X-a.x)+(Y-a.y)*(Y-a.y)); //return (Point){x,y}; }
JOCL 介绍 jocl实际上就是对opencl用java语言进行了封装,许多代码都和opencl一样,这一点使得用过opencl的可以非常快的上手,可以到github查看源码
由于java没有指针,所以jocl不得不用Pointer来获取地址,这样就感觉jocl其实看起来比opencl还要复杂
JOCL 开发环境搭建 参考别人的文章https://my.oschina.net/qutter... 完成jocl开发环境搭建
更新显卡驱动安装opencl驱动,应该最新版本的显卡驱动都是支持opencl的,可以用 GPU Caps Viewer 来测试,如果没有,AMD的话可以到https://support.amd.com/en-us... 下载驱动 下载opencl sdk
Inter https://software.intel.com/en... AMD https://developer.amd.com/too... Nvidia https://developer.nvidia.com/... 下载安装jdk http://www.oracle.com/technet...,不要忘了设置环境变量下载安装eclipse http://www.eclipse.org/downlo... 下载jar包 http://www.jocl.org/downloads...,需要提取里面的相应jar文件放到项目Referenced Libraries里面,把dll文件放到jdk安装路径/bin下现在可以直接到官网 http://www.jocl.org/samples/s... 找sample来运行了 封装JOCL 原始的jocl就是对opencl的C语言的重写,是比较麻烦的,下面给出封装代码
PackJocl.java
package jocl; import static org.jocl.CL.CL_CONTEXT_PLATFORM; import static org.jocl.CL.CL_DEVICE_TYPE_GPU; import static org.jocl.CL.CL_MEM_COPY_HOST_PTR; import static org.jocl.CL.CL_MEM_READ_ONLY; import static org.jocl.CL.CL_TRUE; import static org.jocl.CL.clBuildProgram; import static org.jocl.CL.clCreateBuffer; import static org.jocl.CL.clCreateCommandQueue; import static org.jocl.CL.clCreateContext; import static org.jocl.CL.clCreateKernel; import static org.jocl.CL.clCreateProgramWithSource; import static org.
该网址包含 Indian_pines, Salinas, Pavia Centre and University, Cuprite, Kennedy Space Center, Botswana等常用高光谱数据及其标签,数据格式为mat
网址链接:Hyperspectral Remote Sensing Scenes
数据目录
————————————————
版权声明:本文为CSDN博主「wild kindom」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39393430/article/details/88640908
摘自《基于深度卷积神经网络的高光谱图像分类》徐敏
1.Indian Pines 数据集
Indian Pines 是最早的用于高光谱图像分类的测试数据,由机载可视红外成像光谱仪(AVIRIS)于 1992 年对美国印第安纳州一块印度松树进行成像,然后截取尺寸为 145×145 的大小进行标注作为高光谱图像分类测试用途。
AVIRIS 成像光谱仪成像波长范围为 0.4-2.5μm,是在连续的 220 个波段对地物连续成像的,但是由于第 104-108,第 150-163 和第 220 个波段不能被水反射,因此,我们一般使用的是剔除了这 20 个波段后剩下的 200 个波段作为研究的对象。
该光谱成像仪所成的图像的空间分辨率约为 20m,因此,其较容易产生混合像元,给分类带来难度。
图 2.1(a)是抽取其中 3 个波段的二维矩阵叠加作为 RGB 图像三个通道所成的伪彩色图像。该数据总共有 21025个像素,但是其中只有 10249 个像素是地物像素,其余 10776 个像素均为背景像素,在实际分类中,这些像素是需要剔除的,由于截取的这块区域均是庄稼,总共有 16类,因此不同的地物具有较为相似的光谱曲线,而且这 16 类中,样本的分布极不均匀
145*145=21025=10776(背景,黑)+10249(多种地物,彩) 10249=各类地物占得像素个数。
2.Pavia University 数据集
1.在oracle官网和plsql developer官网下载安装即可,不用配置其他的什么。
2.汉化和注册就是可以在csdn下载汉化包和注册码,安装和注册即可。
3.我的下载里面有这些资源,可以和我联系或者自己去下载。
变量名的注意问题----变量名的命名规范,要遵循驼峰命名法
1.变量的名字要有意义
2.变量名有一定的规范:一般以字母,$符号,下划线开头,中间或者后面可以有$符号,字母,数字
3.变量名一般都是小写的
4.变量名如果是多个单词,第一个单词的首字母是小写的,后面的所有单词的首字母都是大写的,这种命名方式成为:驼峰命名法
var bigNumber = 10;
(代码下方有红线,可能是出错了,但是不一定就是有错)
5.不能使用关键字(系统自带的一些单词不能使用)
6.不会单词用拼音,拼音也要用驼峰命名法
7.
游戏开发: C C++
做网站(后台):java PHP donet
java--技术或者语言
php--技术or语言
ios--技术
变量的初始化和命名
怎么知道我存入了这个变量??
console.log---把内容输出在浏览器的控制台中
webStorm中打开的页面中,网页地址不是相对或者绝对路径 在一个小型服务器中运行的
案例--变量的交换
将两个变量交换
变量的贾环的第一个思路:使用第三方的变量进行交换
第二种方式交换--一般适用于数字的交换
使代码变得更规范更漂亮 [有空隙]------Ctrl+Alt+L----->格式化代码的(设置代码有很好的格式,代码如果是错的,这个快捷键就没有效果)
位运算
注释
1.解释代码的意思
2.注释不需要的代码
单行注释:一般用在一行代码上面 多行注释:一般用在函数或者一段代码上面注释后的代码不执行 第三种注释
原始数据类型
number,string,booleam(true(真1),false(假0)),null,undefined,object
什么时候是undefined变量声明了,没有赋值,结果也是undefined函数没有明确返回值,如果接收了,结果也是undefined如果一个变量的结果Undefined和一个数字进行计算,结果:NaN不是一个数字,也没有意义 获取这个变量的数据类型-----tyoeof 来获取变量的类型 类型:数字 字符串 null undefined 对象写法 yoeof 变量名
tyoeof (变量名)
当一个变量的复制为null的时候,他的变量类型就是一个对象 现在是Null
数据类型转换
num = 98.76;-----小数(其他的语言中,浮点型----单精度,双精度浮点);
数字类型有范围 结果为false
Infinity(无穷大)Infinity(负无穷大) 不是数字不要用==去判断
console.log(sum)的结果是NaN 136行结果为true
135行结果为NaN
总结数字类型;number类型无论是整数还是小数都是数字类型不要用小数去验证小数不要使用NaN判断是不是NaN,应该使用isNaN(值或者是变量)想要表示八进制:以0开头想要表示十六进制:0x开头 字符串类型 可以使用单引号,也可以使用双引号 想知道字符串的个数有多少个--也就是这个字符串的长度是多少
大数据实时流式数据处理是大数据应用中最为常见的场景,与我们的生活也息息相关,以手机流量实时统计来说,它总是能够实时的统计出用户的使用的流量,在第一时间通知用户流量的使用情况,并且最为人性化的为用户提供各种优惠的方案,如果采用离线处理,那么等到用户流量超标了才通知用户,这样会使得用户体验满意度降低,这也是这几年大数据实时流处理的进步,淡然还有很多应用场景。因此Spark Streaming应用而生,不过对于实时我们应该准确理解,需要明白的一点是Spark Streaming不是真正的实时处理,更应该成为准实时,因为它有延迟,而真正的实时处理Storm更为适合,最为典型场景的是淘宝双十一大屏幕上盈利额度统计,在一般实时度要求不太严格的情况下,Spark Streaming+Flume+Kafka是大数据准实时数据采集的最为可靠并且也是最常用的方案,大数据实时流式数据采集的流程图如下所示:
在本篇文章中使用Flume+Kafka+Spark Streaming具体实现大数据实时流式数据采集的架构图如下:
转发请标明原文地址:原文地址
对Flume,Spark Streaming,Kafka的配置如有任何问题请参考笔者前面的文章:
Flume跨服务器采集数据
Spark Streaming集成Kafka的两种方式
Kafka的简单使用以及原理
开发环境、工具:
Linux操作系统,JDK环境,SCALA环境、CDH5版本软件SparkKafka_2.10-0.8.2.1Flume-1.5.0-cdh5.3.6-binZookeeper-3.4.5 下面我们就开始进行实战配置:
Flume文件配置
首先创建两个配置文件分别来启动两个Agent。
exec-memory-avro.conf:
# The configuration file needs to define the sources, # the channels and the sinks. # Sources, channels and sinks are defined per agent, # in this case called 'agent' f1.sources = r1 f1.channels = c1 f1.sinks = k1 #define sources f1.sources.r1.type = exec f1.sources.r1.command =tail -f /opt/datas/flume.log #define channels f1.
1、先去腾讯官网申请一个免费的证书,下载下来传到服务器端
2、找到nginx配置文件,加入一下配置下 【http内】
server { listen 443; # 默认端口443 server_name www.94phper.com; # 自己的域名 root /var/www/html/https; # 访问的路径 ssl on; # 开启ssl证书访问 ssl_certificate ../crt/1_94phper.com_bundle.crt; # ssl_certificate_key ../crt/2_94phper.com.key; ssl_session_timeout 10m; # session有效期10分钟 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 协议版本 按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置 ssl_prefer_server_ciphers on; location / { index index.html index.htm; # 默认访问文件 } } 3、重启nginx 如果提示这个:nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/nginx.conf:
到解压的nginx目录下 ./configure --with-http_ssl_module 当执行上面语句,出现./configure: error: SSL modules require the OpenSSL library.
cat命令的用途是连接文件或标准输入并打印。
1.命令格式:
cat [选项] [文件]...
2.命令功能:
cat主要有三大功能:
1.一次显示整个文件:cat filename --常用来显示文件内容
2.从键盘创建一个文件:cat > filename --创建新文件
3.将几个文件合并为一个文件:cat file1 file2 > file --将几个文件连接起来显示
3.常用命令参数:
-n, --number 对输出的所有行编号,由1开始对所有输出的行数编号
-s, --squeeze-blank 有连续两行以上的空白行,就代换为一行的空白行 -b, --number-nonblank 对非空输出行编号
-E, --show-ends 在每行结束处显示 $
4.使用实例:
1).把log2012.log的文件内容加上行号后输入 log2013.log 这个文件里
命令:cat -n log2012.log log2013.log 2).把log2012.log的文件内容加上行号后输入 log.log 这个文件里 命令:cat -n log2012.log > log.log
3).把log2012.log和log2013.log 的文件内容加上行号(空白行不加)之后将内容附加到log.log里
命令:cat -b log2012.log log2013.log log.log
4).使用here doc来生成文件
[hduser0401@dev-l002782 ~]$ cat > 20160913.log <<EOF
> Hello
> Welcome to Linux World
PDF2Excel.exe程序使用说明
作者博客地址:http://www.yooongchun.cn/
功能介绍:程序从txt文件中读取内容然后抽取指定内容,要抽取的关键词需要写入Excel中,一个PDF样本如下示例: 保存到Excel的样本如下图示意:
最终提取的结果如下示意:
用法:
首先将PDF转换为TXT文件,转换方法如下:
使用迅捷转换器转换 将所有需要转换的TXT文件放在一个文件夹内
双击运行PDF2Excel.exe ,弹出如下界面:
- 依次选择TXT文件夹路径,Excel路径,保存路径 - 运行程序得到结果 完整项目及代码下载地址:https://github.com/yooongchun/04_PDF2Excel_key-value
获取帮助:
作者:yooongchunEmail:yooongchun@foxmail.com微信公众号:yooongchun小屋网站:www.yooongchun.comCSDN博客:https://blog.csdn.net/zyc121561
Assets和Objects
Assets是存储在硬盘上的文件,保存在Unity项目的Assets文件夹下,比如贴图,材质,模型,音频都是Assets。一些Assets中含有Unity的原生数据,例如材质,其他Asset则需要转换成原生格式例如FBX文件
Objects适用于描述某个资源的特定实例的序列化数据集合 可以是Unity使用的任意类型的资源 mesh script audiocilp Assets和Objects之间存在一对多的关系,也就是说,Asset文件内能包含一个
所有的UnityObject.Objects都可以引用其他的UnityEngine.Objects被引用的物体可以和引用物体位于同一个Asset文件内,也可以是由其他Asset文件导入的 例如材质文件通常有一个或多个纹理对象的引用 纹理通常来自纹理资源文件导入的
序列化时候这些文件有两部分数组组成文件GUID和LocalID 文件GUID存储了资源的Asset文件 LocalID是局部唯一的 在每个Asset文件中LocalID是唯一的标记Asset文件中的每个Object
打开材质本身可以看见LocalID mate可以看见guid
GUID提供文件路径的抽象表示,只是使用GUID关联具体的文件 由于一个Asset文件可以包含多个Object文件因此需要用LocalID明确标记每个不同的Object如果一个文件Asset文件关联的GUID丢失 name所有对该文件的Objects的引用将丢失 mate文件丢失,unity会重新生成
unity维护了一个具体文件路径与GUID的映射关系 当一个Assset被加载或导入,就会新增一个映射项,该映射项将文件路径与文件的GUID对应起来 如果meta文件丢失但其文件路径没变,unity保证生成的GUID不变 如果Asset文件路径变化meat文件没有一起移动,那么所有对该Asset引用会丢失
资源导入
非unity原生资源必须导入进unity才能使用,通过asset importer实现的在资源导入时自动调用 导入的结果是一个或多个Objects在unity中你可以看到一个父对象包含多个子对象 公用一个GUID ,内部文件通过LocalID区分
实例ID
尽管GUID和LocalID健壮耐用,但是GUID的比较耗时,因此Unity在内部维护一份缓存,这份缓存将GUID和LocalID独一无二的整数,这些整数被称为InstanceID,每当有新的Objects加入到缓存中,InstanceID以简单的单吊递增的方式进行复制,缓存维护了Instanceid guid localid (后两个在磁盘上)以及Object在内存中的实例(如果object已经加载到内存中)之间的映射 维护相互之间的引用关系,通过Instanceid快速找到对应的加载的object,如果object没有加载那么可以通过GUID和LocalID来找到Object源数据,然后加载相应的object
程序启动时,项目内置对象(比如场景中使用的对象)的数据 以及在Resources文件夹中的对象的数据将被初始化到InstanceID缓存中,当运行时有新的资源加载时 以及在Assetbundle中加载对象时,就会在缓存中添加Instanceid项,Instanceid只有被认为已经过时的情况下才会从缓存中删除 这种情况发生在一个AssetBundle被卸载时,除了对导致对应的Instanceid认为过时,GUID,LocalID之间的映射数据也会被从内存中删除,如果AssetBundle重新加载的话 那么从该AssetBundle加载每一个对象都会创建一个新的Instanceid
所有程序集在应用程序第一次启动时会被全部加载进来 可以使得不同的monobehaver可以引用共同的具体类
资源的生命周期 有两种加载Onject的方式:自动加载和显示的手动加载 当一个InstanceID被解引用其对应的Object当前没有加载到内存中,并且object的源数据能被定位到Object会自动加载 Object还能够在脚本中手动加载,AssetBundle.loadasset方式加载Object,如果一个文件GUID和LocalID都没有对应的InsanceID,或者InstanceID对应的Object没有被加载并且对应的GUID和LocalID是无效的Object就不会加载,但引用关系会保留出现missing
Object会在下列时刻被自动加载:
映射到该Object的Instance ID被反向引用(Dereference)Object当前没有被加载到内存中Object的源数据可以被定位 显式地加载Object。当Object被加载后,Unity会通过把每个引用的File GUID和Local ID转换到Instance ID来查找引用目标。如果满足了下面的两个条件,在Object的Instance ID首次被反向引用时它会被请求式(On-demand)的加载:
Instance ID引用了一个当前没有被加载的ObjectInstance ID在缓存中含有合法的File GUID和Local ID Object卸载的情况
1清理未被引用的asset是 未被引用的Object会被自动卸载 当场景切换或Resources.unloadunusedassets会触发,这一过程仅卸载那些没有被引用的Object —— 一个Object只会在没有任何Mono变量或其他的活动Object持有对它的引用的时候才能被卸载。另外,所有被标记为HideFlags.DontUnloadUnusedAsset和HideFlags.HideAndDontSave的对象都不会被卸载。
2来自Resources文件夹的Object在调用resource.unladasset函数时销毁但Instanceid会被保留,并且含有有效的FileID和LocalID条目,如果在Object销毁后有任何对对象的引用时,unity会重新通过instanceID找到GUID和LocalID 然后加载进来
WPF中的键盘事件用法如下:
在需要监听键盘事件的界面XAML中注册键盘按下的事件KeyDown=”LoginWindow_KeyDown”。 <Window x:Class="WpfAcef.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow" Height="350" Width="525"
KeyDown="MainWindows_Keydown">
<Grid x:Name="ContentGrid">
</Grid>
</Window>
2、后台代码处理对不同键盘的响应:
private void MainWindows_Keydown(object sender, KeyEventArgs e)
{
//判断用户的按键是否为Alt+F4
if (e.KeyStates == Keyboard.GetKeyStates(Key.F4) && Keyboard.Modifiers == ModifierKeys.Alt)
{
e.Handled = true;
MessageBox.Show("请输入解锁密码!");
}
}
需要注意的是参数时System.Windows.Input.KeyEventArgs 而不是System.Windows.Forms.KeyEventArgs!
package cn.edu.jxnu.leetcode.scala import util.control.Breaks._ /** * Java是指令式风格,Scala是函数式风格。 * 在Scala中,应该尽量适用循环,而是应用函数的方式来处理。 * Scala并没有提供break和continue语句来退出循环,那么如果我们又确实要怎么办呢,有如下几个选项: * 1. 使用Boolean型的控制变量。 * 2. 使用嵌套函数,从函数当中return * 3. 使用Breaks对象中的break方法(这里的控制权转移是通过抛出和捕获异常完成的,尽量避免使用这套机制) * 4. 递归函数重写循环 */ object ScalaLoopOps{ def main(args: Array[String]) = { val list = List(21, 214, -4352, 65436, 7534) breakTest1(list) breakTest2(list) contniueTest1(list) continueTest2(list) continueTest3(list) } def breakTest1(list: List[Int]) = { println("breakable语句块来实现break操作") breakable { for (elem <- list) if (elem < 0) break else println(elem) } } def breakTest2(list: List[Int]) = { println("
题目描述 给定一个任意大小的非负整数N,求出1~N的整数中1出现的次数
例如1~13中1出现了6次(1,10,11,12,13)。
输入描述 一共有T组测试数据。
第一行输入一个T,代表T组测试数据。
接来下为T行,每行输入一个整数N,1<N<=100000000。
输出描述 输出为T行,每行对于对应的N,输出1到N中1出现的总个数。
输入样例 2 13 20 输出样例 6 12 AC代码如下:
#include <iostream> #include <cstdio> using namespace std; int count2(int n) { int count = 0; int factor = 1; int lower = 0; int higher = 0; int curr =0; while(n/factor != 0) { lower = n - n/factor*factor; curr = (n/factor)%10; higher = n/(factor*10); switch(curr) { case 0: count += higher * factor; break; case 1: count += higher * factor + lower + 1; break; default: count += (higher+1)*factor; } factor *= 10; } return count; } int main(int argc, char** argv) { int t; cin>>t; while(t--) { int n; cin>>n; int ans=count2(n); cout<<ans<<endl; } return 0; }
题目描述 有一个N个数的数组,想要将数组从小到大排好序,但是只允许下面这个操作:
任取数组中的一个数然后将它放置在数组的最后一个位置。
求最少操作多少次可以使得数组从小到大有序。
输入描述 一共有T组测试数据。
第一行输入一个整数T(T<=100),表示测试数据的组数。
每组测试数据第一行输入一个正整数N,第二行输入N个整数。(N <= 50, 每个数的绝对值小于等于1000)
输出描述 对于每组测试数据,输出一个整数表示最少的操作次数。
输入样例 3 4 19 7 8 25 6 6 1 7 2 5 4 6 5 2 4 3 1 6 输出样例 2 3 5 AC代码如下:
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; int a[51]; int b[10000+51]; int main(int argc, char** argv) { int t; cin>>t; while(t--) { int n; cin>>n; int ans=n-1; for(int i=0;i<n;i++) { cin>>a[i]; b[a[i]+10000]=i; } sort(a,a+n); for(int i=0;i<n-1;i++) { if(b[a[i]+10000]<=b[a[i+1]+10000]) { ans--; } else { break; } } cout<<ans<<endl; } return 0; }
Unity项目中Assets目录下常见的文件类型
1.资源文件 2.代码文件 3.序列化文件 4.文本文档 5.非序列文件 6.Meat文件
资源文件值一些创建好不能修改的文件。比如FBX文件 ,贴图文件 ,音频文件 ,视频文件 ,动画文件等 这些文件在导入unity中都会再导入时进行转化,每一个类型对应着一个AsssetImporter,比如ModelImporter,AudioImporter,TextureImporter等
代码文件 包括所有的代码文件,代码库文件,Shader文件等在导入时,unity会进行一次编译
序列化文件 通常指unity能够序列化的文件,一边是unity自身的类型prefab,mat,unity3d等 这些文件能在运行时直接反序列化成对应类的一个实例
文本文档 unity能够识别成TextAsset 比如txt xml
非序列文件
meta文件主要有两个作用
1.定义在他同目录下,同名的非mate文件的唯一id:guid 对于unity的序列化文件来说,引用的对象就是这个guid
2.存储资源文件的importsetting属性 每次修改导入设置都会修改mate文件
Mate文件详解
由于mate文件的重要性 先来看一下mate文件的数据结构。mate文件实质上是一个文本文档采用YAML的格式书写。unity序列化的文件都是采用这种格式书写的
fileFormatVersion: 2 guid: 775866e3b54d59e4980effb0aac22008 timeCreated: 1467775326 licenseType: Pro TextureImporter: fileIDToRecycleName: {} serializedVersion: 2 mipmaps: mipMapMode: 0 enableMipMap: 0 linearTexture: 0 correctGamma: 0 fadeOut: 0 borderMipMap: 0 mipMapFadeDistanceStart: 1 mipMapFadeDistanceEnd: 3 bumpmap: convertToNormalMap: 0 externalNormalMap: 0 heightScale: 0.25 normalMapFilter: 0 isReadable: 0 grayScaleToAlpha: 0 generateCubemap: 0 cubemapConvolution: 0 cubemapConvolutionSteps: 7 cubemapConvolutionExponent: 1.
str_replace替换字符串 $str = 'abcde'; str_replace('a', 'c', $str); ‘a’ => ‘c’
==========================================
$str = '12345sdfasdf'; str_replace(['a', 'b'], 'c', $str); ‘a’ => ‘c’ ‘b’ => ‘c’
==========================================
$str = 'dfgsdafgbsdfg'; str_replace(['a', 'b'], ['c', 'd'], $str); ‘a’ => ‘c’ ‘b’ => ‘d’
方法一:set(gca, 'XTick',[-3*pi -2*pi -pi 0 pi 2*pi 3*pi], 'XTickLabel', {'-3\pi','-2\pi','-\pi','0','\pi','2\pi','3\pi'});
方法二:ax = gca; ax.XTickLabel={'-8\pi','-2\pi','-\pi','0','\pi','2\pi','3\pi'};
对其实现的一个方法是: 采用继承Thread类 重写run方法。
import java.text.SimpleDateFormat; import java.util.Date; /** * 创建一个线程,在控制台不断输出当前时间,精确到时分秒,每隔一秒输出一次。 * * @author 三一 * * @time 2018-7-18 * */ public class test { public static void main(String[] args) { Thread thread = new MyThread(); thread.start(); } } // 通过继承Thread类 来重写run方法 class MyThread extends Thread { //通过正则式来设置输出的时间格式 SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //重写run()方法 public void run() { while (true) { String str = s.format(new Date()); System.out.println(str); try { //间隔时间1秒 Thread.
例如数据库有两个表,一张员工基本信息表,一张员工工资表。外键的存在,是确保工资表的员与员工基本信息表中的员工相对应。如果没有外键约束,那么当你给员工工资表添加员工工资的时候可以不受到员工基本上信息表的约束,也就是说你可以添加任何人的工资信息(并不是来自本公司)。
#include <stdio.h> int main() { int n,i; printf("请输入字符的个数:"); scanf("%d", &n); char a[n+1]; printf("请开始输入字符":); getchar(); for(i = 0; i < n; i++) { scanf("%c", &a[i]); } a[n] = '\0'; printf("你输入的字符串是:%s\n", a); return 0; } 本段程序首先输入n值,输入后利用变量n来定义数组长度。该种用法在C99标准中提出,编译器可以使用。 同时要注意两个scanf()之间要加入一个getchar(),将换行符’\n’从缓存器中清除,避免数据替代。
#include <stdio.h> int main() { int i =5, j; j = ++i; printf("i = %d, j = %d\n", i, j); i = 5; j = i++; printf("i = %d, j = %d\n", i, j); return 0; } 以上程序运行结果为i = 6, j = 6 i =6, j = 5。 由此我们可以看出,++i是先执行完i的自加1,再使用i的值。 而i++则是先使用i的值,再执行i的自加1。
Python提供多种数据类型来存放数据项集合,主要包括序列(列表list和元组tuple),映射(如字典dict),集合(set),下面对这几种数据类型分别介绍。
Python中list,tuple,dict和set的主要区别:
一句话来概括四种数据类型的区别是:tuple是一个不可改变的list,set是一个没有Value的dict,list和set的数据是可变的,tuple和dict的数据是不可变的!
list和set的数据可变的,tuple和dict的数据是不可变的。list是最自由的,可以使用索引、切片,可以进行计算和修改;tuple是不自由的,数据不能更改,但是和list一样具有序列,可以用索引和切片;dict是半自由的,自由体现在键值对的无序,可以通过key去索引value的值,不自由体现在数据操作只能通过key来实现,键值对是不可变类型;set是半自由的,自由体现在它通过list传值给它,数据类型是可变的,还可以改变list中的值,数据集是无序的,不重复的,可以进行计算,不自由体现在无法使用索引和切片准确定位。
1 .list
list是一个使用方括号括起来的有序元素集合;
List 可以作为以 0 下标开始的数组,任何一个非空 list 的第一个元素总是 L[0],负数索引从 list 的尾部开始向前计数来存取元素。任何一个非空的 list 最后一个元素总是 L[-1];
有分片功能,两个list可以相加;
append 向 list 的末尾追加单个元素;
insert 将单个元素插入到 list 中; extend 用来连接 list,使用一个 list 参数进行调用;
append 接受一个参数, 这个参数可以是任何数据类型, 并且简单地追加到 list 的尾部;
index 在 list 中查找一个值的首次出现并返回索引值;
要测试一个值是否在 list 内, 使用 in, 如果值存在, 它返回 True, 否则返为 False ;
remove 从 list 中删除一个值的首次出现;
pop 可以删除 list 的最后一个元素, 然后返回删除元素的值,用索引删除制定位置的值;
2.tuple
tuple是不可变的list,创建了一个tuple就不能以任何方式改变它;
定义tuple是将整个元素集是用小括号括起来,是有序集合;
tuple的索引与list一样从0开始,所以一个非空的tuple的第一个元素总是t[0];
负数索引与 list 一样从 tuple 的尾部开始计数;
项目有一个新需求,需要定时执行某一作业。采用quartz1.8.6。由于项目模块多导致项目启动很慢。而定时作业的时间小于系统启动时间。这样导致在项目没有启动完成,作业就已经工作。部分类没有初始化。虽然使用try捕捉错误,保证系统能正常启动。但是本人有一点小小的强迫症。我想能不能规定作业延迟加载等系统启动成功后,再执行作业。在网上百度一下,都是讲的在spring的整合下延迟加载,可惜项目没有使用spring。完美的避开了所以的解决方案。研究的一下spring的延迟加载,是在scheduler类配置一个delay属性。所以就看quartz的web启动类。QuartzInitializerServlet。在类中有一个start-delay-seconds属性(单位是s)。
是设置quartz延迟加载的。
Web.xml配置
转自:https://blog.csdn.net/qq_36855191/article/details/79299216
在这里分享一个很方便的网站,在线阅读pdm文件,打开这个网址放pdm文件进去,即可打开,十分方便快捷。
:http://www.dmanywhere.cn/
但功能还是不够强大,经常用到的兄弟还是应该下载powerdesigner,毕竟在线版的资源有限,所以功能很不完善。
网上有很多不错的安装破解教程
学习powerdesigner入门教程点击打开链接
三维曲线绘图命令
1.plot3命令:是plot命令的扩展。
二维三维图形绘制。
>> x=1:0.1:10; >> y=sin(x); >> z=cos(x); >> plot(y,z); >> plot3(x,y,z) 绘制空间线。
>> x=0:0.1:10; >> y=0:0.2:20; >> z=0:pi/100:pi; >> plot3(x,y,z) 2.ezplpt3命令:专门绘制符号函数的命令。
画出圆锥螺线的图像。
>> syms t >> x=t*cos(t); >> y=t*sin(t); >> z=t; >> ezplot3(x,y,z,[0,20*pi]) >> title('圆锥螺线') >> xlabel('tcos(t)') >> ylabel('tsin(t)') >> zlabel('t') 三维网格命令
1.mesh命令
2.ezmesh命令
三维曲面命令
1.surf命令
2.ezsurf命令
柱面与球面:cylinder与sphere
“模电”课程设计任务书 简易测温电路 2018 年 01 月 15日
目录
1. 设计任务描述 ………………………………………………… - 1 -
1.1 设计任务 ………………………………………………… - 1 -
1.2 设计要求 ………………………………………………… - 1 -
1.3 设计目的 ………………………………………………… - 1 -
2. 设计思路 ………………………………………………… - 1 -
3. 设计框图 ………………………………………………… - 2 -
4. 各部分电路设计及原理分析 ………………………………… - 3 -
4.1 输出信号电路 ………………………………………… - 3 -
4.2 比较器 ……………………………………………… - 3 -
4.3 模拟电路图 ………………………………………… - 4 -
4.4 扩展模块 ……………………………………………… - 6 -
1、隔离电源:电源的输入回路和输出回路之间没有直接的电气连接,输入和输出之间是绝缘的高阻态,没有电流回路。
2、非隔离电源:输入和输出之间有直接的电流回路,例如,输入和输出之间是共地的。
涉及可能触电的场合,如从电网取电,转成低压直流的场合,需用隔离的AC-DC电源;
开关电源“正激”与“反激”的工作原理 反激式:反激式开关电源是指使用反激高频变压器隔离输入输出回路的开关电源。“反激”指的是在开关管接通的情况下,当输入为高电平时输出线路中串联的电感为放电状态;相反,在开关管断开的情况下,当输入为高电平时输出线路中的串联的电感为充电状态。
工作原理: 变压器的一次和二次绕组的极性相反,这大概也是Flyback名字的由来: a.当开关管导通时,变压器原边电感电流开始上升,此时由于次级同名端的关系,输出二极管截止,变压器储存能量,负载由输出电容提供能量。 b.当开关管截止时,变压器原边电感感应电压反向,此时输出二极管导通,变压器中的能量经由输出二极管向负载供电,同时对电容充电,补充刚刚损失的能量。 反激电路的演变: 可以看作是隔离的Buck/Boost电路: 在反激电路中,输出变压器T除了实现电隔离和电压匹配之外,还有储存能量的作用,前者是变压器的属性,后者是电感的属性,因此有人称其为电感变压器,有时我也叫他异步电感。 正激电源
正激式变压器开关电源输出电压的瞬态控制特性和输出电压负载特性,相对来说比较好,因此,工作比较稳定,输出电压不容易产生抖动,在一些对输出电压参数要求比较高的场合,经常使用。
所谓正激式变压器开关电源,是指当变压器的初级线圈正在被直流电压激励时,变压器的次级线圈正好有功率输出。
单端正激式:
双管正激式:
由上三张图可知,反激的变压器可以看作一个带变压功能的电感,是一个buck-boost电路。正激的变压器是只有变压功能,整体可以看成一个带变压器的buck电路。二次侧接第一个整流二极管的负端接电解电容的是反击,接电感的是正激。
总地来说,正激反激工作原理不同,正激是初级工作次级也工作,次级不工作有续流电感续流,一般是CCM模式。功率因数一般不高,而且输入输出和变比占空比成比例。反激是初级工作,次级不工作,两边独立开来,一般DCM模式下,理论上是单位功率因数,但是变压器的电感会比较小,而且需要加气隙,所以一般适合中小功率情况.一般的电源书都会有具体的介绍和设计公式。
正激变压器是理想的,不储能,但是由于励磁电感(Lp)是有限值,励磁电流使得磁芯B会大,为避免磁通饱和,变压需要辅助绕组进行磁通复位;反激变压器工作形式可以看做耦合电感;电感先储能,再放能。由于反激变压器的输入、输出电压极性相反,固当开关管断开之后,次级可以提供磁芯一个复位电压,因而反激变压器不需额外增加磁通复位绕组。
主要区别
正激反激主要区别在高频变压器的工作方式不同但他们在同一象限上。正激是当变压器原边开关管导通时同时能量被传递到负载上,当开关管截止是变压器的能量要通过磁复位电路去磁。反激是和正激相反,当原边开关管导通时给变压器存储能量。但能量不会加在负载上,当开关管截止时,变压器的能量释放到负载侧。正激开关电源,后面多的那个二级管是续流二级管,一般输出部分还会多加一个储能电感,正激和反激最重要的区别是变压器初次级的相位是反相的。
最大区别
正激与反激的工作最大区别是,当开关管关断时,正激的输出主要靠储能电感和续流二级管来维持输出,而反激的输出主要靠变压器次级释放能量来维持输出。正激电路不宜做多路输出,正激电路要用脉宽调整做稳压必须在次极整流以后串电感,不然输出电压主要由输入决定,与脉宽影响不大,脉宽只影响输出纹波。如用正激电路做多路输出原理上存在的问题:如每路输出不用电感,那么对输入变化没有稳压作用,且没有开关电源应有的安全性。如果每路加电感:那么输出电压在理论上与负载大小有关,不参与反馈的回路就不正。
反激电路在原理上就适合多路输出稳压。反激电路首先储能,后把能量按各路的电压比率供应给每一路,先可以认为每路的输出比例是不变的(实际有误差看下面),按电流谁需要多给谁多的原则分配。
关于反馈
被反馈的这一路总是很准的因为就是按找他来反馈的,但反馈的一路一定要有一点负载。不然会加大输出各路间的不平衡。可以用多路加权来进行反馈,就可以使误差的矢量和为零,通俗点让误差在各路间均衡,哪路的权重大,哪路的精度就高。变压器遵守各个瞬态电压比等于线圈比,这是理解中用得最多的一个条件。
关于开关电源
正激式是开关管导通时变压器次级电路工作,反激式是开关管截止时变压器次级电路工作(开关截止,主级能量传递给次级,次级工作开关闭合,主级电感线圈存储能量)。 正激式开关电源输出必需有续流二极管而反激式没有(它们的变压器绕法也不一样。反激式变压器初次极工作时间相反而正激式初次极工作时间相同)正激跟反激相比最大的问题的用的器件更多,虽然好像没多几个,但都是必不可少,而且成本都是很高的。电路比反激式变压器开关电源多用一个大储能滤波电感,以及一个续流二极管。 正激式变压器开关电源输出电压受占空比的调制幅度,相对于反激式变压器开关电源来说要低很多,因此,正激式变压器开关电源要求调控占空比的误差信号幅度比较高,误差信号放大器的增益和动态范围也比较大。
正激式变压器开关电源为了减少变压器的励磁电流,提高工作效率,变压器的伏秒容量一般都取得比较大,并且为了防止变压器初级线圈产生的反电动势把开关管击穿,正激式变压器开关电源的变压器要比反激式变压器开关电源的变压器多一个反电动势吸收绕组,因此,正激式变压器开关电源的变压器的体积要比反激式变压器开关电源的变压器的体积大。
正激式变压器开关电源还有一个更大的缺点是在控制开关关断时,变压器初级线圈产生的反电动势电压要比反激式变压器开关电源产生的反电动势电压高。因为一般正激式变压器开关电源工作时,控制开关的占空比都取在0.5左右,而反激式变压器开关电源控制开关的占空比都取得比较小。
应用区别
正激式变压器不蓄积能量,只担负偶合传输,反激式变压器需把开通过程中的能量蓄积在本身,关断过程中再释放:正激式绕组同相位,反激式绕组反相;正激式变压器不用调节电感值,反激式需调节。正激式工作存在剩磁为防饱和需消磁电路,本身不蓄能需要蓄能线圈和续流二极管,反激式不用。
反激主要用在150-200瓦以下的情况,正激则用在150w到几百瓦之间。之所以反激更广范就是因为我们日常中100w以下的电源比较常见,应用比较常见,所以也就比较广泛啦。原理就是一个通过储能再通过变比进行变压的,一个是直接通过变比进行变压的。正激初级绕组同名端都是正极所以叫正激,反激一个在正,一个在负所以叫反激。
反激式可做小功率,成本低,调试相对简单些,所以在小功率电源中常用。它们的区别: 主变压器方面, 正激的需增加消磁绕组,当然也有的用增加两个二极管在主绕组进行消磁,无论如何正激电源必须增加消磁回路。反激不用增加输出储能电感,因为能量能储存在次级线圈中 ,正激须增加输出储能电感,且整流部分需增加续流二极管。
低成本电源
阻容降压
1uf电容提供72ma左右
一秒钟插拔100次也没问题
当然缺点还是那些缺点,带电,空载功耗大什么的是没得办法
优点就是成本低
其实除了rc降压,
原边反馈的acdc成本一样很低
近期有个小产品安全等级提高了,rc改为了ACDC,5v800ma
电路结构其实比rc不会复杂太多。
成本嘛,芯片5毛,变压器1块多。
带负载500ma时,输出纹波 小于50mVpp
输出后边加了一个π型滤波,阻抗按照50欧算的。
1. 百度搜索maven 官网下载最新版本
2. 配置环境变量 m2_home 到path
3. 配置maven conf settings.xml 文件
4. 在 settings.xml 文件内设置 localRespository, mirror , jdk
5. 下面是整个 settings.xml 文件
6. 配置完成 执行命令 mvn help:system 初始化
7. 配置idea 可以使用了 <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~
本文由林岑影 发表于云+社区专栏
容器实例服务(Container Instance Service , CIS)可以帮您在云上快捷、灵活的部署容器,让您专注于构建程序和使用容器而非管理设备上。无需预购 CVM,您就可以在几秒内启动一批容器来执行任务。您也可以通过 kubernetes API 把已有 kubernetes 集群的 pod 调度到 CIS 上以处理突增业务。CIS 根据您实际使用的资源计费,可以帮您节约计算成本。使用 CIS 可以极大降低您部署容器的门槛,降低您执行 batch 型任务或处理业务突增的成本。
本文将介绍Kubernetes部署和容器工作负载的相关内容。包含管理容器生命周期,部署多容器应用程序,扩展工作负载以及与Kubernetes进行协同工作。本文包括一些概念和命令,教大家快速入门Kubernetes,并入门CIS。
介绍 Kubernetes是一个用于管理容器化应用程序的开源容器资源编排工具。
本文中,您将应用一些容器化的概念来构建、部署和管理Kubernetes中端到端的微服务应用程序。本文中使用的示例Web应用程序是一个用Node.js编写的“待办事项列表”应用程序,它使用MongoDB作为数据库。
本次将从Dockerfile中为此应用程序构建容器镜像,将镜像推送到Docker Hub,然后部署到您的集群。以便在未来您将扩展应用程序以满足不断增长的需求。
准备 要完成本文,您需要:
Kubernetes集群,您可以参考腾讯云开发者实验室产品进行入门。用于存储镜像的Docker Hub帐户。在本地机器安装docker,您也可以参考腾讯云开发者实验室产品进行入门。 第一步,使用Dockerfile构建镜像 首先我们将通过Web应用打包到Docker镜像中。
首先切换到您的主目录,然后使用Git从GitHub上的克隆本文的示例Web应用程序。
cd ~ git clone https://github.com/janakiramm/todo-app.git 复制代码 从Dockerfile构建容器镜像。使用-t命令注册用户名,镜像名称和可选标记标记镜像。
docker build -t sammy/todo . 复制代码 确认镜像已成功构建并正确标记。
Sending build context to Docker daemon 8.238MB Step 1/7 : FROM node:slim ---> 286b1e0e7d3f Step 2/7 : LABEL maintainer = "
今天在初始化react-native项目的时候,总是报错,发现是因为最新的react-native版本(0.56)和我本地的node版本不符合导致的,最新版本要求node 版本>=8。
…中间截图省略 我决定安装0.55.4版本的(之前安装这一版本是没问题的),如何安装react-native指定版本呢? 首先:npm cache clean –force $ react-native init demo –version 0.55.4
还有另外一个参数:verbose,这个是用来在初始化的时候显示详情的,比如安装了什么模块,进度如何等等。
完整命令:$ react-native init demo –verbose –version 0.55.4
语法错误(SyntaxError) 语法错误(SyntaxError)是python中新手最常见的错误对与此种方法,对于这种错误只能看报错在第几行,然后往上找错误:
a = b = 0 if a = b: print(a) #SyntaxError: invalid syntax 索引错误(IndexError) 我们在使用序列的时候经常会遇到索引错误(IndexError),对于这种错误我们一般要看索引的值是否超出了范围:
# 索引错误 str = '12345678' print(str[99]) IndexError: string index out of range 类型错误(TypeError) 类型错误(TypeError),这种错误往往是因为使用的方法中传递的参数与期望的参数不一致造成的,我们可以通过报错的类型来进行代码的修正:
# 类型错误 a = '123' b = 123 print(a + b) # TypeError: must be str, not int 缩进错误(IndentationError) 缩进错误(IndentationError),在python中语句块没有c那样复杂的语法而他的语法则是靠缩进,因此python对缩进有严格的要求,对于此类错误,我们只要书写代码规范即可避免,若遇到这种错误往往是报错行数上面的语句没有的到期望的缩进造成的:审查上边语句,根据语句补全缩进或者减少缩进就行。
# 缩进错误 a = b = 0 if a==0: print('123') # IndentationError: expected an indented block 键错误(KeyError) 键错误(KeyError),一般情况下python这中错误都是存在与字典中的,而且大部分为引用key值且字典里没有该key值造成的。