VS 设置dll保存目录,使得exe和dll不在同一目录 ##设置dll延迟加载
增加DLL的搜索路径,代码中添加如下代码
const char *dll_path = { “.\dll” };
SetDllDirectory(dll_path);
本文来自:
https://blog.csdn.net/d4567star/article/details/82993777
一.题目名称:用不同的算法求最大公约数。
二.题目背景:通过使用“辗转相除法”“穷举法”“更相减损法”“Stein算法”来计算最大公因数,并且比较四种方法各自使用的时间。
三.题目分析:不同的方法有不同的解题步骤与思路,此题要求用四种不同的算法来计算最大公因数并且进行时间比较,我的想法是利用一个主函数分别调用四个函数算法,定义一个时间函数来计算时间,初始化一个随机数序列方便测试,因为四种算法是用两个整型数进行比较,而若要进行时间比较,一组数据是远远不够的,所以我的想法是,定义一个函数,将产生的随机数保存在一个数组内存在函数中,再逐个的进行运用与调用来完成时间比较。
四.所用方法
1.辗转相除法
算法过程:1.设两数为a,b设其中a做被除数,b做除数,t为余数
2.较大值存于a,较小值存于b 3.求a%b的余数赋值于t;
4.若t=0则b为最大公约数;
5.如果t!=0,则将b的值赋给a、b的值赋给t,返回第二步后再次进行计算。
算法代码:
void divisor1(int a,int b)
{
int t; //定义一个整型变量
if(a<b) //判断输入a,b的大小 {
t=a;a=b;b=t; //交换大小
}
while(b!=0) {
t=a%b; //求余
a=b; //互换
b=t;
}
cout<<"the highest common divisor is "<<a<<endl;
}
算法流程图:
2.穷举法
算法过程:1.设两数为a,b,并且定义一个t;
2.比较a,b大小,将较小值赋给t;
3.若t大于0,则进行判断,截止条件为当a,b同时将t整除时,t为最大公因数;
4.若不符合截止条件,则t进行递减继续进行第三步。
算法代码:
void divisor2(int a,int b) {
int t;
t=(a>b)?b:a; //将较小值赋给t
while(t>0)
{
if(a%t==0 && b%t==0) //截止条件为a,b同时可以将t整除
{
break;
}
t--; //t递减直到可以整除为止
}
cout<<"the highest common divisor is "
使用 Git 进行版本控制时,要习惯他的工作流程,Git 的工作流程是,先在工作区创建项目并编写代码,然后将写好的文件添加到暂存区,最后将暂存区里的文件提交到历史版本库。如下图所示:
每向版本历史库做一次提交, Git 就会生成一个新的项目版本,这样的话,你就能很容易地找到之前的版本,在之前的版本上继续开发。使用git log命令就可以很方便地查看项目的版本演变历史。
单个分支 git log最简单的使用方式就是在当前分支下直接输入git log命令,该命令的作用是查看当前分支点所有提交记录(或者说是版本历史)。
git log #显示全部的版本历史 如果想让它简洁地显示,可以在后面加一个--oneline的选项,意思是每条版本历史只显示一行。
git log --oneline #简洁地显示版本演变历史 还可以指定显示最新的几条记录,在git log的后面加上-nx选项就好了,实际使用的时候,-nx中的x要换成具体的数字,比如:
git log -n2 #查看最近的两条记录 当然-nx与--oneline这两个选项也可以结合起来使用:
git log -n2 --oneline #简洁地显示最近两条记录 多个分支 前面我们只演示了如何在单个分支上使用git log命令,但是在实际的开发中,往往不止一个分支,当有多个分支时,git log命令该如何使用呢?
为了演示方便,我们先创建一个分支,用如下命令:
git checkout -b temp 9b56fe338ae3a33a4bc373c75597aec91dc5a2eb 其中,temp是用户自定义的分支名,9b56fe338ae3a33a4bc373c75597aec91dc5a2eb是版本标识,代表着你要以哪个版本为基础创建分支,如下图所示:
分支创建好之后,使用下面这个命令查看本地有多少分支:
git branch -v 上图中的master是主分支,而temp就是我们刚才创建的分支。
创建完分支后,Git 默认会留在你创建的这个分支中,这个时候如果输入git log命令,显示的就是当前temp分支的版本演变历史。
对 temp 分支下的readme.txt文件做一下修改,然后将其提交到版本历史库里面。
输入以下命令,可以查看所有分支的版本演变历史:
git log --all 但是这样看起来难免有些眼花缭乱,分不清分支之间的父子关系。那么你可以在后面加一个选项--graph,使之用图形化的方式显示。
git log --all --graph #以图形化的方式显示版本演变历史 这样就可以很明显地看出各分支的关系以及版本演变历史。
如果你想在当前分支下查看其他分支的版本演变历史,可以在git log命令后面加上分支名来查看指定分支的版本演变历史:
git log master # 查看master分支的版本演变历史 以上就是git log命令的几个常用选项,各个选项可以根据你的需求相互组合,比如,我想查看所有分支的最近的两条版本演变历史,并且让他以图形化的方式显示,而且还要简洁的地显示。那么可以这样输入命令:
ModelSim-Altera或ModelSim-INTEL已经包含了预编译库,不需要自己再编译库,但是每次仿真的时候需要指定库文件的目录。
一般库文件目录在X:\XXXXFPGA\XX.X\modelsim_ase\altera\verilog下
转载于:https://blog.51cto.com/14231739/2360282
idea导出db2的建表语句问题 问题:(本次只是简单记录一下问题,防止以后再次遇到)
1、使用idea创建db2表索引是,不管下边这个Unique是否选择,等创建完成之后重新进来查看(或者用idea生成sql),都会显示为 勾选状态(也就是唯一索引)
2、使用idea的SQL Generate生成建表语句时,其普通索引会显示为“唯一索引” (具体原因尚未查明,可以我用的驱动版本过低导致)
解决:
1、使用db visualize或者使用命令生成ddl语句
2、查看:索引
执行: select * from syscat.indexes where tabname = ‘表名’;
查询结果:包含一个UNIQUERULE 该字段可以有三个值:P/U/D
其中:P:主键 U:唯一索引 D:普通索引
玩过 Ubuntu Linux 系统的人都知道,更改系统的 open files 最大限制,一般都是通过以下方法来做:
第一步:打开终端并敲入以下命令以打开一个配置文件
$: sudo gedit /etc/security/limits.conf
第二步:在打开的文件中增加以下几行配置并保存关闭
......
* soft nofile 65536
* hard nofile 65536
# End of file
第三步:注销当前账户,并重新登录,打开终端后敲入以下命令进行验证
$ ulimit -a
......
open files (-n) 65536
......
这样几步就可大功告成!
但是,以上这些操作只能在 Ubuntu 16.04 及以下版本才能有效——到了 Ubuntu 18.04,却不起作用?百思不得其解,各种百度后无果,只好打开必应进行一番 E 文搜索,结果找到一篇老外的文章(https://superuser.com/questions/1200539/cannot-increase-open-file-limit-past-4096-ubuntu)。其中最有用的几句如下:
In Summary If you want to increase the limit shown by ulimit -n, you should:
Modify /etc/systemd/user.conf and /etc/systemd/system.conf with the following line (this takes care of graphical login):
功能介绍:
使用python实现简单的+-*/^()运算.
要求:
命令行输入表达式输入10^(-10)~10^(10)整数,且运算结果也属于此范围。实现简单的+-*/^()运算。输出结果保留10位有效整数,且不足时不能补零。 思路:将任务分解,逐层实现括号里面的运算。实现加减运算——>递归计算所有加减运算。实现乘除运算——>递归实现所有乘除运算。乘方运算——>递归实现所有乘方运算。按优先级进行基本运算 乘方——乘除——加减。
代码实现:
import re import sys def power_function(s): # 计算乘方 if '^' in s: ret = pow(float(s.split('^')[0]), float(s.split('^')[1])) else: pass return ret # print(power_function('10^-10')) def remove_power(s): # 递归计算不含括号里面的乘方 if '^' not in s : return s else: k = re.search(r'-?[\d\.]+\^-?[\d\.]+', s).group() # 提取乘方表达式 s = s.replace(k, str(power_function(k))) return remove_power(s) # print(remove_power('10^-10')) def multiply_divide(s): #计算乘除 ret = float(s.split('*')[0]) * float(s.split('*')[1]) if '*' in s else float(s.
1.环境:手机和电脑处于同一个局域网
2.打开电脑 右上角Wi-Fi标志,选择 打开网络偏好设置
3.打开手机 设置 -> 无线局域网 -> 选择与电脑相同的wifi -> 点击ℹ -> 配置代理 -> 选择手动 -> 服务器:填2中获取到的当前局域网内的IP地址 端口:8888 4.手机证书信任
4.1 打开 Charles -> Help -> SSL Proxying -> Install Charles Root Certificate in Mobile Device or Remote Broswer
4.1.1 弹出
Configure your device to use Charles as its HTTP proxy on 192.168.10.156:8888, then browse to chls.pro/ssl to download and install the certificate.
4.2 打开手机 在手机浏览器上输入“chls.pro/ssl”下载证书 Charles Proxy CA 选择安装
HashMap:http://note.youdao.com/noteshare?id=e32e2db7a51e085648b09b6a0d95f999
ConcurrentHashMap: http://note.youdao.com/noteshare?id=21e11fe1b54d1ba72ea3f74c31a022eb
日期类型转换 使用mapper.setDateFormat();来设置日期转换
@Select("select * from ${tableName}") List<Map<String, Object>> getTableData(@Param("tableName") String tableName); List<Map<String, Object>> tableDatas = tableDataMapper.getTableData("user"); for (Map<String, Object> tableData: tableDatas) { ObjectMapper mapper = new ObjectMapper(); String data = mapper.writeValueAsString(tableData); System.out.println(data); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")); data = mapper.writeValueAsString(tableData); System.out.println(data); System.out.println("============="); } 对于byte的处理 public static ObjectMapper getObjectMapperForUplink() { ObjectMapper mapper = new ObjectMapper(); // mapper.configure(SerializationFeature.INDENT_OUTPUT, true); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 处理字节 SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(byte[].class, getByteSerialize()); mapper.registerModule(simpleModule); // 处理日期 mapper.
"scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "lint": "eslint --ext .js,.vue src", "build": "cross-env NODE_ENV=development env_config=dev node build/build.js", "build:prod": "cross-env NODE_ENV=production env_config=prod node build/build.js", "build:sit": "cross-env NODE_ENV=production env_config=sit node build/build.js" }, 1.以上为我的npm脚本,执行 npm run + scripts的key,就相当于执行scripts的key对应的value,
如:执行 npm run dev 等同于执行 webpack-dev-server --inline --progress --config build/webpack.dev.conf.js, 即启动程序
2.build,build:prod,build:sit分别代表给本地环境,生产环境,测试环境打包。
3.脚本涵义:如 cross-env NODE_ENV=decelopment env_config=dev node build/build.js
cross-env:可以跨平台地设置及使用环境变量(npm i --save-dev cross-env 安装使用)
NODE_ENV: config文件夹下对应环境配置的NODE_ENV值
env_config: config文件夹下对应环境配置的env_config 值
一、JDK安装
查看CentOS自带JDK是否已安装
1
[root@test ~]# yum list installed |grep java
若有自带安装的JDK,应如下操作进行卸载CentOS系统自带Java环境
1
2
3
4
5
6
7
8
9
10
[root@test ~]# java -version
java version "1.7.0_181"
OpenJDK Runtime Environment (rhel-2.6.14.8.el6_9-x86_64 u181-b00)
OpenJDK 64-Bit Server VM (build 24.181-b00, mixed mode)
[root@test ~]# yum -y remove java-1.7.0-openjdk*
[root@test ~]# yum -y remove tzdata-java.noarch
[root@test ~]# java --version
-bash: /usr/bin/java: No such file or directory
查看yum库中的Java安装包
1
2
3
4
1. goland License: http://idea.youbbs.org 失效 http://idea.iblue.me 可用 2019年3月6号更新 只限于18.2以下版本的使用,激活码从18.2开始失效,可使用的最高版本:goland-2018.1.7.exe
2. Activation code 激活方式 一直可用 只不过每天都要激活一次。。。 1. 断开外网。 2.将下面的code复制到 Activation code 里面。 56ZS5PQ1RF-eyJsaWNlbnNlSWQiOiI1NlpTNVBRMVJGIiwibGljZW5zZWVOYW1lIjoi5q2j54mI5o6I5p2DIC4iLCJhc3NpZ25lZU5hbWUiOiIiLCJhc3NpZ25lZUVtYWlsIjoiIiwibGljZW5zZVJlc3RyaWN0aW9uIjoiRm9yIGVkdWNhdGlvbmFsIHVzZSBvbmx5IiwiY2hlY2tDb25jdXJyZW50VXNlIjpmYWxzZSwicHJvZHVjdHMiOlt7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IkFDIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiUFMiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJHTyIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IkRNIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiQ0wiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJSQyIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IlJEIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJSTSIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDIwLTAzLTEwIn0seyJjb2RlIjoiREIiLCJwYWlkVXBUbyI6IjIwMjAtMDMtMTAifSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9LHsiY29kZSI6IlJTVSIsInBhaWRVcFRvIjoiMjAyMC0wMy0xMCJ9XSwiaGFzaCI6IjEyMjkxNDk4LzAiLCJncmFjZVBlcmlvZERheXMiOjAsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-SYSsDcgL1WJmHnsiGaHUWbaZLPIe2oI3QiIneDtaIbh/SZOqu63G7RGudSjf3ssPb1zxroMti/bK9II1ugHz/nTjw31Uah7D0HqeaCO7Zc0q9BeHysiWmBZ+8bABs5vr25GgIa5pO7CJhL7RitXQbWpAajrMBAeZ2En3wCgNwT6D6hNmiMlhXsWgwkw2OKnyHZ2dl8yEL+oV5SW14t7bdjYGKQrYjSd4+2zc4FnaX88yLnGNO9B3U6G+BuM37pxS5MjHrkHqMTK8W3I66mIj6IB6dYXD5nvKKO1OZREBAr6LV0BqRYSbuJKFhZ8nd6YDG20GvW6leimv0rHVBFmA0w==-MIIElTCCAn2gAwIBAgIBCTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE4MTEwMTEyMjk0NloXDTIwMTEwMjEyMjk0NlowaDELMAkGA1UEBhMCQ1oxDjAMBgNVBAgMBU51c2xlMQ8wDQYDVQQHDAZQcmFndWUxGTAXBgNVBAoMEEpldEJyYWlucyBzLnIuby4xHTAbBgNVBAMMFHByb2QzeS1mcm9tLTIwMTgxMTAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQAF8uc+YJOHHwOFcPzmbjcxNDuGoOUIP+2h1R75Lecswb7ru2LWWSUMtXVKQzChLNPn/72W0k+oI056tgiwuG7M49LXp4zQVlQnFmWU1wwGvVhq5R63Rpjx1zjGUhcXgayu7+9zMUW596Lbomsg8qVve6euqsrFicYkIIuUu4zYPndJwfe0YkS5nY72SHnNdbPhEnN8wcB2Kz+OIG0lih3yz5EqFhld03bGp222ZQCIghCTVL6QBNadGsiN/lWLl4JdR3lJkZzlpFdiHijoVRdWeSWqM4y0t23c92HXKrgppoSV18XMxrWVdoSM3nuMHwxGhFyde05OdDtLpCv+jlWf5REAHHA201pAU6bJSZINyHDUTB+Beo28rRXSwSh3OUIvYwKNVeoBY+KwOJ7WnuTCUq1meE6GkKc4D/cXmgpOyW/1SmBz3XjVIi/zprZ0zf3qH5mkphtg6ksjKgKjmx1cXfZAAX6wcDBNaCL+Ortep1Dh8xDUbqbBVNBL4jbiL3i3xsfNiyJgaZ5sX7i8tmStEpLbPwvHcByuf59qJhV/bZOl8KqJBETCDJcY6O2aqhTUy+9x93ThKs1GKrRPePrWPluud7ttlgtRveit/pcBrnQcXOl1rHq7ByB8CFAxNotRUYL9IF5n3wJOgkPojMy6jetQA5Ogc8Sm7RG6vg1yow== 将附加信息去掉,如:
点击OK;
3. 两分钟后在开启外网。
demo地址:https://github.com/chenjy512/appdemo.git demo可能有点乱
问题:最近需要在手机端开发下滑分页功能,这就需要涉及到ios与安卓系统的兼容问题。在实际开发过程中遇到了:
1.手机浏览器不支持windos.open 与 windos.close 函数,
2.所以使用两个iframe来实现打开关闭页面,那么就遇到了一个是在当前页面滑动分了,一个是在iframe下滑动分页。至于为什么这样后面来解释。
下滑动加载分页 前提需要搭建一个springmvc工程,用于ajax数据传输
mobile.jsp页面用户下滑获取数据
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <base href="<%=basePath%>"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>滑动到底部加载下一页内容</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="
springboot集成mybatis源码分析-启动加载mybatis过程(二) 1、springboot项目最核心的就是自动加载配置,该功能则依赖的是一个注解@SpringBootApplication中的@EnableAutoConfiguration
2、EnableAutoConfiguration主要是通过AutoConfigurationImportSelector类来加载
以mybatis为例,*selector通过反射加载spring.factories中指定的java类,也就是加载MybatisAutoConfiguration类(该类有Configuration注解,属于配置类)
16 package org.mybatis.spring.boot.autoconfigure; 60 重点:SqlSessionFactory 和 SqlSessionTemplate 两个类 61 /** 62 * {@link EnableAutoConfiguration Auto-Configuration} for Mybatis. Contributes a 63 * {@link SqlSessionFactory} and a {@link SqlSessionTemplate}. 64 * 65 * If {@link org.mybatis.spring.annotation.MapperScan} is used, or a 66 * configuration file is specified as a property, those will be considered, 67 * otherwise this auto-configuration will attempt to register mappers based on 68 * the interface definitions in or under the root auto-configuration package.
// // ViewController.swift // SK_Kingfisher // // Created by coder on 2019/3/6. // Copyright © 2019 AlexanderYeah. All rights reserved. // import UIKit import Kingfisher class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let imgViewA = UIImageView(frame: CGRect(x: 100, y: 200, width: 150, height: 150)); self.view.addSubview(imgViewA); // 最为简单的使用方式 let url = URL(string: "http://t2.hddhhn.com/uploads/tu/201610/198/scx30045vxd.jpg"); // 等待指示器 imgViewA.
学习了一下laya感觉和unity差不多,就开始撸了一下 写了个简单的框架,UI使用的fugi
整个程序入口Main。 Game包含了整个程序基础功能。
离线安装Miktex/CTEX的宏包Package
import UIKit var str = "Hello, playground" // 1 字符串转Int Double Float var str1 = "818"; // 转Int var val1 = Int(str1); // 转Double var val2 = Double(str1); // 转float var val3 = Float(str1); // 如果是25.0 转 Int,则需要先转为Double 类型再将其转为Int类型 var val4 = "25.0"; let count = Double(val4); let val4_int = Int(count); print(val3!); // 2 数字转为字符串 var num1 = 25; var str2 = "\(num1)"; // 如果是Int 类型的话 直接进行转 var str3 = String(num1); // 如果是Double 类型的话 可以通过以下方式进行转换 var str4 = String(stringInterpolationSegment: num1); // 3 数字相互转换 var num2 = 25.
ag-Grid是速度最快,功能最丰富的JavaScript datagrid组件, 没有之一, 事实证明了它确实是业内口碑最高的框架之一
Datagrid是您在用户界面中可能多次遇到的问题。它是一个以表格形式显示数据的组件。数据中的每个项目都显示为一行,分为项目字段的列。网格已经存在了很长时间,主要是在桌面上,但现在在网络应用UI中并不常见。
今天,大多数公司和软件工程师选择现有的解决方案,因为与定制实施相关的复杂性和高成本。毫无疑问,大量第三方JS数据网格可用作免费或付费版本。选择使用哪一个本身往往是一个挑战。你是怎样做的?
在开发人员确保网格满足功能和性能要求之后,他们会看到集成和配置它的容易程度。此外,如果小部件附带精心设计的文档,这些文档分解了所有功能并提供了示例,那么开发人员倾向于在其应用程序中使用它。
ag-Grid is ALL ag-Grid is Everything
本文以JavaScript网格示例为特色,演示了集成和配置ag-Grid的难易程度。这是一本入门指南,旨在通过复制/粘贴在不到5分钟的时间内完成。完成基本设置后,我们将查看控制它们的一些功能和配置选项。
让我们开始吧!
快速上手..
在过去几年中,我们正在目睹Cambrian Explosion of JavaScript项目设置配置。似乎每天都有人为JavaScript开发人员提供了一种新的,更好的方式来构建和分发他们的应用程序。但是,出于此设置的目的,我们将坚持使用从CDN加载ag-Grid脚本的最简单的无构建,单个HTML文件设置。
基础的HTML就不写了, 将ag-Grid添加到您的项目中, extreamly easy~~
我们将从unpkg CDN加载必要的脚本和样式。将以下内容添加到 head元素:
< script src = “ https://unpkg.com/ag-grid-community/dist/ag-grid-community.min.noStyle.js ” > </ script > < link rel = “ stylesheet ” href = “ https://unpkg.com/ag-grid-community/dist/styles/ag-grid.css ” > < link rel = “ stylesheet ” href = “ https://unpkg.com/ag-grid-community/dist/styles/ag-theme-balham.css ” > 上面的行导入 agGrid 组件,ag-grid.css 定义网格结构的 样式表以及一个可用的网格主题 ag-theme-balham.
os: ubuntu 16.04
db: mysql 5.7.25
mysql_install_db is deprecated as of MySQL 5.7.6 because its functionality has been integrated into mysqld, the MySQL server. To initialize a MySQL installation, invoke mysqld with the --initialize or --initialize-insecure option. For more information, see Section 2.10.1, “Initializing the Data Directory”. mysql_install_db will be removed in a future MySQL release.
之前初始化mysql数据库命令 mysql_install_db 从MySQL 5.7.6 开始废弃,使用 mysqld 初始化数据库
mysqld # which mysqld # mysqld --verbose --help -I, --initialize Create the default database and exit.
Omxpalyer 一款具有 GPU 优化的树莓派播放软件。
命令行操作:
阻塞性。
切换:
聚焦于当前,并强制终止。
线程,共享内存。
线程:
使得播放与接收命令不相互阻塞,保证可以接受到数据与正常播放视频。
共享内存:
切换视频,需要知道,什么时候切换,切换到哪一个。
可以单独开辟一片空间 malloc 作为信息的存储。
运行的程序必定有进程。当丢失焦点时,可以通过杀死进程结束进程。killall -9
收到切换信息,保存到共享内存。
播放线程读取共享内存,数据比对得操作。
Coding:
// thread while(1) { int index = *((int*)msg); system("sudo killall -9 /usr/bin/omxplayer.bin"); int index_old = *((int *)msg); if(index_old == index) { system(keep_show); } else {} } // main int index = 0; res = pthread_create(&sound,NULL,thread,&index); pthread_detach(sound); //Makefile serial : serial_ama.o gcc -o serial serial_ama.o -lpthread serial_ama.o : serial_ama.c serial_ama.
错误信息如下:
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xb8 in position 1: ordinal not in range(128)
解决方法:
1.找出C:\Python27\Lib下的napath.py文件,在join函数的第一行添加如下两行代码,设置默认字符编码
reload(sys) sys.setdefaultencoding('gbk') 2.添加完成之后记得保存。
3.重新打开Terminal窗口安装所需要的包!!!
4.完美解决!!!!
find函数在< algorithm >库中,使用时注意导入,
find函数的定义如下所示:
_InputIterator find(_InputIterator __first, _InputIterator __last, const _Tp& __val)
参数中,第一个为数组的起始位置,第二个为数组的终点,可以这样理解[begin, end),在这个范围内查找val这个值,注意它的返回类型是一个迭代器,与指针类似,这意味着我们不能直接把它作为下标来使用,但是用它减去_InputIterator __first就是我们需要的下标了,见下面一个小栗子
#include <iostream> #include <algorithm> using namespace std; int main(void){ int a[5] = {5,3,2,1,4}; int* q = find(a, a+5, 3); int r = q - a; printf("位置为:%d\n", r); printf("值为:%d\n", *q); return 0; }
本篇论文作者提出了在CNN中加入一个16次递归层,增加递归层深度可以有效提升性能表现,并且不为其他卷积层引入新的参数。由于使用标准的梯度下降DRCN很难训练,所以作者又提出了两个概念:递归监管和跳过连接
转载:receptive field 和 filter 的含义 https://blog.csdn.net/ture_dream/article/details/53240985
基础模型:
最初的模型主要包括三个副网络:嵌入,推断和重建网络
推断网络解决SR的主要问题。在该网络中,分析大图像区域由单个递归层完成。 每次递归都应用相同的整流线性单元的卷积。 对于大于1×1的卷积滤波器,每次递归都会扩大感受野。
MLP是啥?https://baike.baidu.com/item/MLP/17194455?fr=aladdin
嵌入网和推断网都是用3×3的filter,这是因为对嵌入网来说,图像梯度比超分辨率的原始图像数据所含信息更多;对于推断网来说,3×3的filter使得隐藏层状态只传递给相邻像素。重建网络同样十分重视直接相邻像素
嵌入网f1(x):
推断网f2(x):
重建网f3(x):
梯度爆炸:在训练过程中梯度发生巨大涨幅
梯度消失:与梯度爆炸相反
因为这两个原因,距离很远的两个像素的联系学习就变得非常困难,另外在多层递归下存储精确副本也没有想象中的容易
所以作者提出两个新模型:
递归监管:监管所有的递归来降低梯度消失/爆炸的影响。作者假设相同的表示在推断网的卷积层中可以一次又一次的使用,所有相同的重塑网也可以用来为所有的递归提供HR预测结果。所以重塑网输出D个预测结果(D即递归深度)并且同时监管训练中所有的预测结果。作者使用D个中间预测结果来计算最后的输出,这些结果在测试中被平均。w主要在训练过程中优化。显然,如果监测信号直接从损失层回到早期的递归层,反向传播的计算会容易很多
跳过连接:在SR中,输入输出图像高度相关,带着大多数的输入value到网络终端是不可避免但很没有效率的。由于梯度问题以及横跨在输入和输出之间的递归,学习一个input和output之间简单的线性关系是非常难的。所以作者添加了一个层可以直接从输入层跳跃到重建层,这对于语义分割网络来讲是非常成功的。有两个优点,一是网络可以在递归过程中存储输入信号,二是精确的输入副本信号可以在预测过程中使用。
语义分割网络?https://blog.csdn.net/sinat_35496345/article/details/79609529
wd代表在递归过程中从每个中间隐藏状态重塑得到的预测的权重
最小二乘回归?
通过反向传播SGD优化
对于无递归层的w初始化使用he等人提出的方法,有递归层的则将所有w设置为0。所有层b设置为0。
最后DRCN的方法在相同的dataset上与现存的A+,RFL,SRCNN,SelfEx对比性能表现。有的方法比如A+和RFL无法预测图像边缘所以需要裁剪,DRCN并不需要,并且本方法产生了相对于图像的锐利的边缘,和其他方法所生成的HR的边缘是模糊的所不同。
结论:
DRCN有效地在利用大图像背景信息时重新使用了w参数。为了降低训练模型的难度,DRCN使用了递归检测和跳过连接,并且证明了本方法领先其他现存方法在基本dataset上。展望未来,可以尝试更深的递归层次来利用图像的背景信息。作者相信他们的方法可以很容易地应用于其他图像恢复问题,例如去噪和压缩伪影去除。
import requests import re from bs4 import BeautifulSoup def getHtmlText(url, ulist): r = requests.get(url) soup = BeautifulSoup(r.text, 'html.parser') movie_title = soup.find_all('span',class_='title') movie_link = soup.find_all('div', class_='hd') linkinfo = [] for link in movie_link: linkinfo.append(link.a.attrs['href']) movie_rate = soup.find_all('span',class_='rating_num') movie_intro = soup.find_all('span',class_='inq') infolist = [] for title in movie_title: #剔除标题中的冗杂信息 例如港台译名 if title.text.find('/')== -1: infolist.append(title.string) for i in range(len(movie_link)): ulist.append([infolist[i], linkinfo[i], movie_rate[i].text, movie_intro[i].text]) def printText(ulist): # print('名称\t\t\t评分\t\t\t\t链接') for i in range(len(ulist)): u = ulist[i] # print(u[0],'\t\t', u[2],'\t\t', u[1],'\n\n一句话短评: ', u[3],'\n') print1('名称', u[0]) print1('评分', u[2]) print1('链接', u[1]) print1('短评', u[3]) #.
消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。
无论是 RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其它等,都有的一些基本原理、术语、机制等,总结分享出来,希望大家在使用消息队列技术的时候能够快速理解。
1. 消息生产者、消息者、队列 消息生产者Producer:发送消息到消息队列。消息消费者Consumer:从消息队列接收消息。Broker:概念来自与Apache ActiveMQ,指MQ的服务端,帮你把消息从发送端传送到接收端。消息队列Queue:一个先进先出的消息存储区域。消息按照顺序发送接收,一旦消息被消费处理,该消息将从队列中删除。 2. 设计Broker主要考虑 1)消息的转储:在更合适的时间点投递,或者通过一系列手段辅助消息最终能送达消费机。2)规范一种范式和通用的模式,以满足解耦、最终一致性、错峰等需求。3)其实简单理解就是一个消息转发器,把一次RPC做成两次RPC。发送者把消息投递到broker,broker再将消息转发一手到接收端。
总结起来就是两次RPC加一次转储,如果要做消费确认,则是三次RPC。 3. 点对点消息队列模型 点对点模型 用于 消息生产者 和 消息消费者 之间 点到点 的通信。
点对点模式包含三个角色:
消息队列(Queue)发送者(Sender)接收者(Receiver) 每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,可以放在 内存 中也可以 持久化,直到他们被消费或超时。
特点
每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中) 发送者和接收者之间在时间上没有依赖性 接收者在成功接收消息之后需向队列应答成功 4. 发布订阅消息模型Topic 高并发架构系列:MQ消息队列的12点核心原理总结
发布订阅模型包含三个角色:
主题(Topic)发布者(Publisher)订阅者(Subscriber) 多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
特点
每个消息可以有多个消费者:和点对点方式不同,发布消息可以被所有订阅者消费 发布者和订阅者之间有时间上的依赖性。 针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。 为了消费消息,订阅者必须保持运行的状态。 5.点对点和发布订阅的区别 生产者发送一条消息到队列queue,只有一个消费者能收到。
发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。
6. 消息的顺序性保证 基于Queue消息模型,利用FIFO先进先出的特性,可以保证消息的顺序性。
7. 消息的ACK机制 即消息的Ackownledge确认机制,为了保证消息不丢失,消息队列提供了消息Acknowledge机制,即ACK机制,当Consumer确认消息已经被消费处理,发送一个ACK给消息队列,此时消息队列便可以删除这个消
息了。如果Consumer宕机/关闭,没有发送ACK,消息队列将认为这个消息没有被处理,会将这个消息重新发送给其他的Consumer重新消费处理。
8.最终一致性的设计思路 主要是用“记录”和“补偿”的方式。
本地事务维护业务变化和通知消息,一起落地,然后RPC到达broker,在broker成功落地后,RPC返回成功,本地消息可以删除。否则本地消息一直靠定时任务轮询不断重发,这样就保证了消息可靠落地broker。
broker往consumer发送消息的过程类似,一直发送消息,直到consumer发送消费成功确认。
我们先不理会重复消息的问题,通过两次消息落地加补偿,下游是一定可以收到消息的。然后依赖状态机版本号等方式做判重,更新自己的业务,就实现了最终一致性。
如果出现消费方处理过慢消费不过来,要允许消费方主动ack error,并可以与broker约定下次投递的时间。
对于broker投递到consumer的消息,由于不确定丢失是在业务处理过程中还是消息发送丢失的情况下,有必要记录下投递的IP地址。决定重发之前询问这个IP,消息处理成功了吗?如果询问无果,再重发。
事务:本地事务,本地落地,补偿发送。本地事务做的,是业务落地和消息落地的事务,而不是业务落地和RPC成功的事务。消息只要成功落地,很大程度上就没有丢失的风险。
9. 消息的事务支持 消息的收发处理支持事务,例如:在任务中心场景中,一次处理可能涉及多个消息的接收、处理,这应该处于同一个事务范围内,如果一个消息处理失败,事务回滚,消息重新回到队列中。
10. 消息的持久化 消息的持久化,对于一些关键的核心业务来说是非常重要的,启用消息持久化后,消息队列宕机重启后,消息可以从持久化存储恢复,消息不丢失,可以继续消费处理。
11. 消息队列的高可用性 在实际生产环境中,使用单个实例的消息队列服务,如果遇到宕机、重启等系统问题,消息队列就无法提供服务了,因此很多场景下,我们希望消息队列有高可用性支持,例如
目录
1.dto
1-1.UserInfo
2.rules
2-1.after
2-1-1.UserInfoAfterRuleValid.java
2-2.before
2-2-1.UserInfoBeforeRuleValid.java
2-3.valid
2-3-1.UserInfoValidServiceImpl.java
3.validator
3-1.service
3-1-1.AfterRuleValidService.java
3-1-2.BeforeRuleValidService.java
3-1-3.RuleValidService.java
3-2.RulesValid.java
3-3.RuleValidator.java
4.test
4-1.Main.java
依赖包:
jboss-logging-3.3.2.Final.jar
validation-api-2.0.1.Final.jar
commons-lang-2.5.jar
classmate-1.3.4.jar
hibernate-validator-6.0.12.Final.jar
本文利用Hibernate Validator校验工具进行拓展,旨于代码优化与规则校验集中管理。
转载请注明出处:https://blog.csdn.net/jevonsCSDN/article/details/88047276 【Jevons’Blog】
代码结构:
下面开始贴代码: 1.dto 1-1.UserInfo package validator.dto; import javax.validation.constraints.NotNull; import validator.rules.after.UserInfoAfterRuleValid; import validator.rules.before.UserInfoBeforeRuleValid; import validator.rules.valid.UserInfoValidServiceImpl; import validator.validator.RulesValid; @RulesValid(vaildClass = { UserInfoValidServiceImpl.class },beforeClass={UserInfoBeforeRuleValid.class},afterClass={UserInfoAfterRuleValid.class}) public class UserInfo { @NotNull private java.lang.String insurantName; private java.lang.String insurantCertiType; private java.lang.String insurantCertiNo; private java.lang.String insurantGender; private java.lang.String insurantMobile; /** * insurantName */ public java.
google搜索默认是点击链接后当前页面被新页面覆盖,不进行跳转。
设置为每次点击链接打开新标签的方法:
1.打开google首页
2.点击右下角的设置
3.勾选在浏览器新窗口打开搜索结果
使用vs编译qt程序,选择本地Windows调试器,文件路径很长时可以编译,当文件路径过长(eg:190+字符),报错:
error MSB3491: 未能向文件写入命令行。指定的路径或文件名太长,或者两者都太长。完全限定文件名必须少于 260 个字符,并且目录名必须少于 248 个字符。 Vs编译问题解决:配置属性-常规-修改输出目录和中间目录
使用vs在路径很长的文件夹新建工程,无法新建:
向文件路径很长的文件夹拷贝文件,提示目标路径过长,甚至无法拷贝:
在文件路径很长的文件夹下新建文件夹,无法新建:
Vs环境下选择远程Windows、web浏览器、web服务调试,无法启动调试。
安装 aconda 后ubuntu系统终端界面前部出现(base)字样 参考链接:https://www.cnblogs.com/devilmaycry812839668/p/10349602.html
解决办法 1.打开一个终端 ,输入命令:gedit ~/.bashrc
2.在 .bashrc文件最后面添加命令:conda deactivate
再重新打开终端即可消除base字样
若在终端中输入conda deactivate,也可消除base字样,但是一次性的,再次打开终端依然存在base字样。在.bashrc文件添加命令:conda deactivate可以永久消除base字样。
Android中画图介绍(矩形、圆形)
主要分为以下几步:
MainActivity中
矩形图:
//1 实例化bitmap对象(@Override宣纸)
Bitmap bitmap = Bitmap.createBitmap( 600,600, Bitmap.Config.ARGB_8888 );
//2 实例化canvs对象(画架)
Canvas canvas = new Canvas( bitmap );
//3 实例化paint对象(画具)、
Paint paint = new Paint();
paint.setColor( Color.RED );
paint.setStrokeWidth( 10 );
//4 画图
canvas.drawRect( 120,50,400,400,paint );
//5 将图片显示在image图片控件上面
iv.setImageBitmap( bitmap );
填充蓝色圆形图(类似于矩形图):
//1.画布,实例化bitmap
Bitmap bitmapCircle = Bitmap.createBitmap( 800,800, Bitmap.Config.ARGB_8888 );
//2.画架,实例化canvas
Canvas canvasCircle = new Canvas( bitmapCircle );
//3.画具,paint
Paint paintCircle = new Paint( );
1、在分页组件中加入ref以控制节点
<el-pagination background layout="prev, pager, next" :page-size="10" :current-page="screenList.pageNo" @current-change="handleCurrentChange" :total="total" ref="pagination"> </el-pagination> 2、设置pagination属性
this.$nextTick(() => { this.$refs.pagination.internalCurrentPage = pageNo; }) 用途:可用于跳转详情页时保存列表的当前页码,从详情页回来时加载保存的页码。
例子:当前页码5,跳转详情回来时会重置为1,即使修改pageNo为5,页面显示的还是1,此时可用这种方法。
属性说明:
pageNo:当前页码(需要保存的页码数)
pageSize:每页显示数据条数
例如:我的列表每页有10条,然后我是从第3页跳转到详情的,那pageNo就是3,pageSize就是10。
total:数据总数量
2020-3-12更新:
在element-ui 2.13.0版本中,修改pageNo会自动同步过去,不用手动修改了。
import ClickableStatusBarComponent from './component/clickableStatusBarComponent'; // import HaearCustomComponent from './component/HaearCustomComponent' const defaultColDef = { width:300, // 宽度 editable: true, // 是否可编辑 suppressMenu: false, // 显示 cellStyle:{color:"#000",backgroundColor:"fff"}, // √ hide:false, // √ sortable: true, resizable: true, filter: true, menuTabs: ['filterMenuTab','generalMenuTab'], // 有效值为:'filterMenuTab','generalMenuTab'和'columnsMenuTab' TODO filterMenuTab无效 // headerComponentParams: { menuIcon: "fa-bars" }, // columnGroupShow:false, // 是否在组打开/关闭时显示列 // toolPanelClass:[], // suppressToolPanel:false, // checkboxSelection:false, // rowDrag:false, // suppressResize:false, // suppressAggFuncInHeader:true, }; const localeText={ page: "页", more: "
目录
QPushButton使用setStyleSheet设置背景图片
和css一样设置setStyleSheet
转载:pyqt5实现按钮添加背景图片以及背景图片的切换
QPushButton使用setStyleSheet设置背景图片 具体设置背景图片的方法有两种:
self.button.setStyleSheet("QPushButton{background-image: url(img/1.png)}") 然而对于这种方法背景图片无法进行边框的自适应,可以使用下面的方法
self.button.setStyleSheet("QPushButton{border-image: url(img/1.png)}") 可以做到自适应边框
和css一样设置setStyleSheet self.button.setStyleSheet("QPushButton{border-image: url(img/1.png)}" "QPushButton:hover{border-image: url(img/1_1.png)}" "QPushButton:pressed{border-image: url(img/1_1.png)}") 具体实现了按钮背景图片,以及鼠标划过按钮的背景切换,以及按下按钮的背景切换。
然而在按下按钮,我需要直接进行图片切换,且不回到原来的背景上。
self.button.clicked.connect(self.button_change) def button_change(self): # 切换图标变亮 self.button.setStyleSheet('QPushButton{border-image:url(img/1_1.png)}')
1.变异凯撒 把flag转化为ascii码,加密密文转化为ascii码, 因为是凯撒加密,所以思考移动的位数,分别是加了5,6,7,8.。。。
所以移动的位次是从5递加
得到结果
ascii码值转化,得到flag,
flag{Caesar_variation}。
2.奇怪的短信 根据题目提示,是奇怪的短信,然后一串不长的阿拉伯数字,把手机键盘调出来,然后拼音9键,例如33,第一个3代表数字,第二个3代表3所对应的字母,依次找出来即可。
3.围在栏杆中的爱 首先摩斯密码解密后
提交不正确,根据提示QWE和ABC,考虑替代密码。
置换对应关系如下:
a b c d e f g h i j k l m n o p q r s t u v w x y z
q w e r t y u i o p a s d f g h j k l z x c v b n m
得到另一密码:rhasbenvaoylii
解密
倒叙后得到flag.
4. 疑惑的汉字 当铺密码:
在运行代码时,有时候会出现一些warning信息,如果代码是在跑循环的话,则会在控制台打印多次warning信息,这会使得warning信息占满整个控制台,失去了有效的历史记录。对于这种情况,python有一个标准模块warnings,可以利用这个模块对warning信息进行过滤和处理,使得其不再一直打印,如下代码所示,其作用是让各种不同的warning信息分别只打印一次。
import warnings warnings.filterwarnings(action='once') 对于action参数的具体说明,可以看下图,读者可以给参数赋不同的值实现不同的功能。更详细的说明可看这里。
通过pip安装graphviz模块后,进行sklearn的决策树文档操作输出决策树模型结果时报错,报错内容为:GraphViz’s executables not found。
通过了解得知:graphviz是属于一个独立的软件,需要到官网下载安装包解压,将bin的路径添加到环境变量。
下载网址链接:https://graphviz.gitlab.io/_pages/Download/Download_windows.html
添加环境变量方法:
1、定位到高级系统设置:
2、定位‘环境变量’
3、点击‘新建’,将bin的路径复制进去
将路径添加到环境变量后还是报错,于是在代码块运行以下语句,不在报错:
卡尔曼滤波算法是一种基于最小均方误差的最优线性递归滤波方法,以状态方程和观测方程为基础,运用递归方法来预测线性系统变化。
状态方程(1)和观测方程(2)如下:
X(k)是k时刻的状态向量,A是状态系统矩阵,ξ是状态系统噪声;
Z(k)是k时刻的观测向量,H是观测系统矩阵,η是观测系统噪声;
系统噪声假设为不相关的零均值的高斯白噪声,ξ,η协方差分别为Q、R。
卡尔曼滤波可概述为状态预测过程(3-4)和状态修正过程(5-7)
状态预测方程:
误差协方差预测方程:
卡尔曼滤波增益:
状态修正方程:
修正误差协方差矩阵:
状态预测方程以状态方程为基础,求状态预测向量和误差协方差预测向量
状态修正方程以观测方程为基础,修正状态预测向量,得到向量并通过计算求出最小误差协方差矩阵。
我们首先设定初始参数,读取视频序列。然后进行背景估计,产生初始化背景图像。然后依次读取视频序列,利用Kalman滤波算法,根据上一帧估计的背景和当前帧数据得到当前帧的前景目标。然后对前景目标进行连通计算,检测出运动目标。最后保存运动目标位置坐标,作为接下来训练神经网络的输入。
max与max_element简析 max(a,b),返回a,b两者之间的较大值
max_element(r, r+6),返回数组r中[0, 6)之间的最大值的迭代器,
使用max_element返回的值减去数组头地址即为该最大值在数组的序号
min 和 min_element的区别同上,看到下面的例子你就会明白了
程序代码 #include <iostream> #include <algorithm> using namespace std; int main(void) { int a[6] = {5, 3, 2, 6, 1, 4}; int b = a[0]; int c = a[1]; cout<<max(b, c)<<" "<<min(b,c)<<endl; //输出为5 3 cout<<max_element(a, a+6) - a<<endl;// 输出为3 cout<<*max_element(a, a+6)<<endl;//输出为 6 cout<<min_element(a, a+6) - a<<endl;// 输出为4 cout<<*min_element(a, a+6)<<endl; //输出为1 return 0; } 运行截图
在应急响应时,开机启动项是必查的项,下面梳理一下关于开机启动与服务相关需要排查的点。直接从init开始说。
RHEL5、RHEL6、RHEL7的init系统分别为SysV init、Upstart、Systemd
CentOS 5 启动流程如下:
1)加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动设备; 2)读取并执行第一个启动设备内MBR(主引导分区)的Boot Loader(即是gurb等程序); 3)依据Boot Loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序; 4)在硬件驱动成功后,Kernel会主动调用init进程(/sbin/init),init的配置文件/etc/inittab; 5)init执行/etc/rc.d/rc.sysinit文件来准备软件的操作环境(如网络、时区等); 6)init执行runlevel的各个服务的启动(script方式); 7)init执行/etc/rc.d/rc.local文件; 8)init执行终端机模拟程序mingetty来启动login程序,最后等待用户登录。 init程序会读取init的配置文件/etc/inittab,并依据此文件来进行初始化工作。/etc/inittab文件主要作用是指定运行级别,执行系统初始化脚本(/etc/rc.d/rc.sysinit),启动相应运行级别下的服务和启动终端。
[root@jianshe_28 admin]# cat /etc/inittab # # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org> # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # System initialization.
在eclipse里查看一些jar下的class文件,有时却会显示Source Not Found。 遵循以下操作即可解决: 1.从windows选项下选择”perferences”。 2.在”perferences”对话框下选择java->Installed JREs 。 3.选中”jre7”并点击右侧”Edit”。 4.在”Edit JRE”对话框中找到对应的jar,例如rt.jar,点击展开选择”Source Attachment”。 5.在”Source Attachment”对话框下,选择”External location”,路径设为JDK根目录,源文件就是该路径下的src.zip。
按照题目输出三角形
输入 :2
输出
A
BBB
输入: 3
输出
A
BBB
CCCCC
import java.util.Scanner; public class L1 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); int n=sc.nextInt(); for(int i=1;i<=n;i++) { String s=""; for(int j=i;j<n;j++) { s=s+" "; } System.out.print(s); for(int j=0;j<2*i-1;j++) { char c=(char) ('A'+i-1); System.out.print(c); } System.out.println(s); } } }
Mysql Truncated incorrect time value 发现一个mysql的问题,当我们做数据定时更新操作的时候,比如说定时作废48小时内未付款的订单的时候,如果用到mysql TIMEDIFF(var1,var2)函数
例如:UPDATE justice_user_customer SET STATUS=0 WHERE TIMEDIFF(SYSDATE(),update_time)>='48:00:00'
这个sql一开始没有问题,完全正常,但是某一天会突然报错,会出现Truncated incorrect time value: '1000:59:44' 这样奇怪的错误,根本原因是这个函数是算两个日期的时间差,但是他的取值最大只到838:59:59(不到35天)
所以会出现这样一个现象,一开始执行成功的sql,到了某一天不知不觉的报错了!
为了防止出现这样的错误,改用如下sql
UPDATE justice_user_customer SET STATUS=0 WHERE UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(update_time)>172800(2天)
--摘录官方文档函数的解释
timediff(expr1,expr2)
timediff() returns expr1 – expr2 expressed as a time value. expr1 and expr2 are time or date-and-time expressions, but both must be of the same type. unix_timestamp(), unix_timestamp(date)
if called with no argument, returns a unix timestamp (seconds since '1970-01-01 00:00:00' utc) as an unsigned integer.
灵魂两问:
new 的原理是什么?通过 new 的方式创建对象和通过字面量创建有什么区别? 生成对象方式
let a = {age: 1}; console.log(a.age) // 1 function Bar() { this.age = 1; } let b = new Bar(); console.log(typeof a) // object console.log(b.age) // 1 在调用 new 的过程中会发生以下四件事(摘自JavaScript高级程序设计,2019-07-22):
新生成一个对象将构造函数的作用域赋值给新对象(即绑定新对象的 this)执行构造函数中的代码(即为这个新对象添加属性)返回新对象 构造一个最简单版 new:
function _new() { // 创建一个新对象 let newObj = {}; // 获取构造函数 let Constructor = Array.prototype.shift.call(arguments); // 连接新对象原型,新对象可以访问原型中的属性 newObj.__proto__ = Constructor.prototype; // 执行构造函数,即绑定 this,并且为这个新对象添加属性 Constructor.apply(newObj, arguments); // 返回该对象 return newObj; } 其实,对于创建一个对象来说,都是通过 new 产生的,字面量创建一个对象本质是通过 new Object(),而且更推荐这种方式创建对象。因为使用构造函数的方式创建对象需要通过作用域链一层层找到 Object。
本篇为接上一篇对于HoloLens入门教程的深入研究
https://blog.csdn.net/gaofei12300/article/details/87712223
本篇主要是讲一下关于HoloLens视线触发,有点类似与制作cardboard小圆点的功能,可以用于触发一些事件的发生。
首先需要创建一个小圆点,可以创建一个球体,用于当作小圆点,缩小为0.1左右吧,根据自己的需要做调试。
下面贴出相关代码。将写好的脚本挂在你创建的球上即可。
有任何问题直接留言,看到会回复。 可以添加unity交流QQ群 207019099 备注“Hololens”。
public MeshRenderer meshRender; public Camera mainCamera; // Start is called before the first frame update void Start() { meshRender = gameObject.GetComponentInChildren<MeshRenderer>(); mainCamera = Camera.main; } // Update is called once per frame void Update() { Vector3 headPosition = mainCamera.transform.position; //视角 Vector3 gazeDicection = mainCamera.transform.forward; RaycastHit hit; if (Physics.Raycast(headPosition, gazeDicection, out hit)) { meshRender.enabled = true; transform.position = hit.point; transform.rotation = Quaternion.
本文适合已经了解Kotlin基本用法,想更加深入的使用Kotlin方法和性能的同学们
如果你是Kotlin小白,可以先了解一下Kotlin的基础用法
Kotlin-中文官网基础用法
解构声明 我们在一个文件中定义一个Person类
data class Person(val name: String, val age: Int) 我们可以通过简单的语法获得这个类的name和age属性
val (name, age) = Person("tom", 11) println(name) println(age) 上面的Person是数据类(data class)当我们定义一个普通的类,不能简单的通过下面的方法获取name和age的值
class Dog(val name: String, val age: Int) val (nameDog, ageDog) = Dog("James", 5) 为什么数据类可以,普通类就不可以呢? 因为数据类帮我们实现了解构声明需要的componentN方法这个N可以是1或者2等.
标准库中的let, takeIf, takeUnless,apply, also,with,run方法 let let方法接收一个参数,参数是个方法。这个方法的名字叫block。let接收的方法是一个穿入值是T类型返回值是R类型的方法。并且我们知道这个方法的反回值就是整个let方法的返回值。绕口,见谅
// Java if (message != null) { System.out.println(message) } // Kotlin 如果message是null下面这行忽略 message?.let { println(it) } takeIf 定义
/** * Returns `this` value if it satisfies the given [predicate] or `null`, if it doesn't.
需要修改somaxconn
linux内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。
echo 2048 > /proc/sys/net/core/somaxconn 但是这样系统重启后保存不了
在/etc/sysctl.conf中添加如下
net.core.somaxconn = 2048
然后在终端中执行
sysctl -p
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题。
前言 如题,今天介绍 SpringBoot 的 声明式事务。
Spring 的事务机制 所有的数据访问技术都有事务处理机制,这些技术提供了 API 用于开启事务、提交事务来完成数据操作,或者在发生错误时回滚数据。
而 Spring 的事务机制是用统一的机制来处理不同数据访问技术的事务处理,Spring 的事务机制提供了一个 PlatformTransactionManager 接口,不同的数据访问技术的事务使用不同的接口实现,如下表:
数据访问技术实现JDBCDataSourceTransactionManagerJPAJPATransactionManagerHibernateHibernateTransactionManagerJDOJdoTransactionManager分布式事务JtaTransactionManager 声明式事务 Spring 支持声明式事务,即使用注解来选择需要使用事务的方法,他使用 @Transactional 注解在方法上表明该方法需要事务支持。被注解的方法在被调用时,Spring 开启一个新的事务,当方法无异常运行结束后,Spring 会提交这个事务。如:
@Transactional public void saveStudent(Student student){ // 数据库操作 } 复制代码 注意,@Transactional 注解来自于 org.springframework.transcation.annotation 包,而不是 javax.transaction。
Spring 提供一个 @EnableTranscationManagement 注解在配置类上来开启声明式事务的支持。使用了 @EnableTranscationManagement 后,Spring 容器会自动扫描注解 @Transactional 的方法与类。@EnableTranscationManagement 的使用方式如下:
@Configuration @EnableTranscationManagement public class AppConfig{ } 复制代码 注解事务行为 @Transactional 有如下表所示的属性来定制事务行为。
属性含义propagation事务传播行为isolation事务隔离级别readOnly事务的读写性,boolean型timeout超时时间,int型,以秒为单位。rollbackFor一组异常类,遇到时回滚。(rollbackFor={SQLException.class})rollbackForCalssName一组异常类名,遇到回滚,类型为 string[]noRollbackFor一组异常类,遇到不回滚norollbackForCalssName一组异常类名,遇到时不回滚。 类级别使用 @Transactional @Transactional 不仅可以注解在方法上,还可以注解在类上。注解在类上时意味着此类的所有 public 方法都是开启事务的。如果类级别和方法级别同时使用了 @Transactional 注解,则使用在类级别的注解会重载方法级别的注解。
一、熟悉Python数据分析的工具 1、了解数据分析常用工具 目前主流的数据分析语言有Python、R、Matlab三种程序语言。其中Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起,是一门更易学,更严谨的程序设计语言。R语言则是用于统计分析,绘图的语言和操作环境,它是属于GNU系统的一个自由、免费、源代码开放的软件。MATLAB主要是进行矩阵运算、绘制函数与数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
2、了解Python数据分析的优势 不同数据分析工具对比,可以发现Python是一门应用十分广泛的计算机语言,在数据科学领域具有无可比拟的优势。Python正在逐渐成为数据科学领域的主流语言。Python数据分析主要包含以下5个方面优势。
语法简单精炼,对于初学者来说,比起其他编程语言,Python更容易上手。 有很强大的库,结合在编程方面的强大实力,可以只使用Python这一种语言去构建以数据为中心的应用程序。功能强大。从特性观点来看,Python是一个混合体。丰富的工具集使它介于传统的脚本语言和系统语言之间。Python不仅具备所有脚本语言简单和易用的特点,还提供了在编译语言中的高级软件工程工具。不仅适用于研究和原型构建,同时也适用于构建生产系统。研究人员和工程技术人员使用同一种编程工具将会给企业带来非常显著的组织效益,并降低企业的运营成本。Python是一门胶水语言。Python程序能够以多种方式轻易地与其他语言的组件“粘接”在一起。例如,Python的C语言API可以帮助Python程序灵活地调用C程序。这意味着用户可以根据需要给Python程序添加功能,或者在其他环境系统中使用Python。 二、掌握Jupyter Notebook常用功能 1、掌握Jupyter Notebook的基本功能 (1)启动Jupyter Notebook
在安装完成Python,配置好环境变量并安装了Jupyter Notebook后,在Windows系统下的命令行,或者Linux系统下的终端中输入命令“jupyter notebook”,即可启动Jupyter Notebook。
(2)新建一个Notebook
打开Jupyter Notebook以后会在系统默认浏览器中出现Jupyter Notebook主页。
单击右上方的“New”,可出现下拉菜单。
在下拉菜单中选择需要创建的Notebook类型。其中,“TextFile”为纯文本型,“Folder”为文件夹,“Python 3”表示Python运行脚本,灰色字体表示不可用项目。单击“Python 3”,进入Python脚本编辑状态界面。
(3)Jupyter Notebook的界面及其构成
Notebook文档是由一系列单元(Cell)构成,主要有两种形式的单元。
代码单元。这里是读者编写代码的地方,通过按“shift+Enter”组合键运行代码,其结果显示在本单元下方。代码单元左边有“In [ ]:”编号,方便使用者查看代码的执行次序。
Markdown单元。在这里对文本进行编辑,采用Markdown的语法规范,可以设置文本格式,插入链接,图片甚至数学公式。同样按“shift+Enter”组合键运行Markdown单元来显示格式化的文本。
Jupyter Notebook编辑界面类似于Linux的Vim编辑器,在Notebook中也有两种模式。
编辑模式。编辑文本和代码。选中单元并按“Enter”键进入编辑模式,此时单元左侧显示绿色竖线。
命令模式。用于执行键盘输入的快捷命令。通过“Esc”键进入命令模式,此时单元左侧显示蓝色竖线。
如果要使用快捷键,首先按“Esc”键进入命令模式,然后按相应的键实现对文档的操作。比如切换成代码单元“Y”或Markdown单元“M”键,或者在本单元的下方增加一单元“B”键,查看所有快捷命令可以按“H”键。
2、掌握Jupyter Notebook的高级功能 (1)Markdown
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。Jupyter Notebook的Markdown单元功能相比基础的Markdown更加强大,下面将从数学公式编辑,标题,列表,字体,表格等5个方面进行介绍。
(a)标题的引用
标题是标明文章和作品等内容的简短语句,读者写报告或者写论文,标题的引用是不可或缺的,尤其论文的章节等需要使用不同级别的标题。Markdown作为一个的排版工具,一般使用类Atx形式,在首行前加1个“#”字符代表一级标题,前加2个“#”字符代表二级标题,以此类推。
(b)列表
列表是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。列表一般被分为两种,一种是无序列表,使用一些图标标记,没有序号,没有顺序排列;另一种是有序列表,使用数字标记,有顺序排列。Markdown对于无序列表,使用星号,加号或者减号作为列表标记;Markdown对于有序列表则是使用数字+“.”+“ ”(1个空格)表示。
(c)加粗/斜体
文档中为了凸显部分内容,一般对文字使用加粗或斜体,使得该部分内容变得更加醒目。对于Markdown排版工具而言,通常使用星号“*”和底线“_”作为标记字词的符号。两个星号或底线包围表示被加粗,三个星号或底线包围表示斜体。
(d)表格
Markdown同样也可以绘制表格,代码的第一行表示表头,第二行分隔表头和主体部分,从第三行开始每一行代表一个表格行;列与列之间用管道符号“|”隔开,原生方式的表格每一行的两边也要有管道符。
(e)数学公式编辑
LaTeX是写科研论文的必备工具,不但能实现严格的文档排版,而且能编辑复杂的数学公式。在Jupyter Notebook的Markdown单元中也可以使用LaTeX的语法来插入数学公式。在文本行中插入数学公式,使用两个“$”符号,比如质能方程“$E = mc^2$”。如果要插入一个数学区块,则使用两个“$$”符号。比如“$$ z = \frac{x}{y} $$”表示z=x/y。
在输入上述公式LaTeX表达式后运行结果。
(2)导出功能
Notebook还有一个强大的特性,就是其导出功能。可以将Notebook导出为多种格式。
如HTML,Markdown,ReST,PDF(通过LaTeX)和Raw Python等格式。其中导出PDF功能,可以让读者不用写LaTex即可创建漂亮的PDF文档。读者还可以将Notebook作为网页发布在自己的网站上。甚至,可以导出为ReST格式,作为软件库的文档。导出功能在左上方“File”下拉菜单的“Download as”的项目中。
文章未经博主同意,禁止转载!