英勇投弹手
✨📖【超好用的安卓阅读APP——阅读】📖✨
嗨,亲爱的小伙伴们!今天要和大家分享一款我最近发现的超级实用的安卓阅读APP——阅读!这款APP简直是爱书人的福音,赶快来看看吧!💖
🌟功能亮点🌟
1️⃣ 丰富的书源导入:不论你喜欢的是经典文学、现代小说,还是各类热门连载,这里统统都有哦~ 📚✨
3️⃣ 无广告打扰:专注于阅读,不被广告打扰,享受纯粹的书香气息!😌
4️⃣ 多种格式支持:各种文学作品都能轻松导入,让你的书单不再单一!📖💫
🔍【实际使用体验】🔍
作为一个“书虫”,我总是在寻找更好的阅读工具。试用了这个APP之后,我真的爱上了它!界面简洁明了,让我可以很快找到自己想看的书。而且导入书源超级简单,只需几步,就能将自己喜欢的文档添加进去,真的是太方便啦~ 🙌💕
📝【小贴士】📝
如果你也是个爱看小说的人,不妨试试看这款APP哦~ 绝对能提升你的阅读体验,更重要的是,你再也不用担心找不到好看的小说啦!⏳💕
📅快把《阅读》下载到你的手机上,让我们一起沉浸在文字的海洋中吧~ 🌊✈️
👉🏻 点击下方链接立即体验吧!🎉👇🏻
https://web.ugreen.cloud/web/#/share/6058525e6ac24a989ad06e72beb26af3 提取码:5J68
#种草 #安卓阅读 #好用的APP #书虫必备 #文学之美
英勇投弹手
安卓APP推荐!跳过广告就靠它——李跳跳!** ✨🌟
🌟✨ 超级实用的安卓APP推荐!跳过广告就靠它——李跳跳! ✨🌟
大家好呀~ 今天我要给大家安利一款我最近发现的绝佳神器——李跳跳!🎉 作为一个日常使用很多APP的小白,我每次打开应用时被广告折磨得不行,真的快受不了了!😩 直到我遇到了这个神奇的APP,它让我轻松告别了那些烦人的开屏广告!
🔍 李跳跳的神奇功能:
1️⃣ 瞬间跳过广告:打开任何应用时,自动帮你一键跳过开屏广告,再也不怕浪费时间啦!
2️⃣ 简洁易用界面:操作简单,老少皆宜,刚开始使用也完全不需要担心🙌。
3️⃣ 超强兼容性:几乎支持市面上所有主流APP,无论是游戏还是社交软件,都能轻松搞定哦!
🤔 使用体验:
自从下载了李跳跳,我再也不用等待那些令人抓狂的广告了,每次都能秒进我的应用里,真的是太开心了!想想每天能省下多少时间去做自己喜欢的事情呀~💖
📲 下载方法:
在各大安卓应用商店都没有上架😂😂😂
浏览器访问下载
https://web.ugreen.cloud/web/#/share/b29c1660741944d1a0334e608681642d 提取码:3A6C
下载安装, 然后导入跳过规则即可!
下面是规则文件
https://web.ugreen.cloud/web/#/share/9cb7068945cb4d3192208f272457823e 提取码:9HFF
打开 “李跳跳”,点击 “更多”,点击右上角三个小点,点击 “导入规则”,长按输入框,选择 “粘贴”,点击“保存”。
⚠ 建议长按输入框,以调用系统自带的粘贴功能,请不要通过第三方 App (例如:输入法、微信等)作为中介进行复制,否则可能会出现规则被截断,粘贴不全导致格式错误的问题
使用教程PDF
https://web.ugreen.cloud/web/#/share/07db8a4ef13847b5b8699d28c3144dbe 提取码:E763
💬 小小总结:
如果你和我一样厌烦广告,不妨试试这款李跳跳吧,它绝对会成为你手机中的必备良品!✨ 快把这篇种草文分享给身边的小伙伴,一起享受无广告的快乐吧~ 🎈
快去体验一下吧!💖📱 #李跳跳 #告别广告 #安卓必备
英勇投弹手
KeymouseGo
功能:记录用户的鼠标键盘操作,通过触发按钮自动执行之前记录的操作,可设定执行的次数,可以理解为 精简绿色版 的 按键精灵。 用途:在进行某些操作简单、单调重复的工作时,使用本软件就可以很省力了。自己只要做一遍,然后接下来就让电脑来做。
英勇投弹手
Fay
- Fay是一个集成了语言模型和数字字符的开源数字人类框架。它为不同的应用程序提供零售、助手和代理版本,如虚拟购物指南、广播、助手、服务员、教师和基于语音或文本的移动助手。 - 开发人员可以利用该项目简单地构建各种类型的数字人或数字助理。该项目各模块之间耦合度非常低,包括声音来源、语音识别、情绪分析、NLP处理、情绪语音合成、语音输出和表情动作输出等模块。每个模块都可以轻松地更换。
英勇投弹手
miya
**模块介绍** 1. 采用alibaba nacos 注册中心与配置中心 2. miya-gataway 网关,同一处理请求,连接各个服务 3. miya-auth 授权认证中心,管理令牌 4. miya-common 通用模块 5. miya-system 系统管理(权限) 6. miya-monitor-Admin 监控admin 7. miya-pay 支付服务: 整合支付宝 + 微信 + 银行卡 支付 8. miya-order 订单服务 9. miya-warehouse 仓储服务
英勇投弹手
连续
连续第二天的测试,功能完好无 bug
英勇投弹手
第一篇
这是第一篇分享,还没想好写什么,那就先这样吧。
英勇投弹手
Java解析网页内容
Java解析网页内容
- IO 流读取网页内容
try {
//创建一个URL实例
URL url = new URL("http://www.baidu.com");
StringBuffer result = new StringBuffer();
try {
//通过URL的openStrean方法获取URL对象所表示的自愿字节输入流
InputStream is = url.openStream();
InputStreamReader isr = new InputStreamReader(is,"utf-8");
//为字符输入流添加缓冲
BufferedReader br = new BufferedReader(isr);
//读取数据
String data = br.readLine();
//循环读取数据
while (data!=null){
//输出数据
result.append(data).append("\n");
System.out.println(data);
data = br.readLine();
}
br.close();
isr.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(result.toStrin
英勇投弹手
IDEA 最新版激活
工具软件下载, 见下文图片
目前官方最新版本是2024.2.4,亲测工具支持最新版本,按教程操作即可。工具一键激活,执行完,输入文中提供的专属激活码,就可以成功激活。
1. 下载软件, 解压缩
2. 进入目录 \jihuo-tool-2024.2.1\jetbra\scripts
3. Windows系统双击执行脚本 install-current-user.vbs Mac/Linux系统执行命令 sudo bash install.sh
4. 在弹出的提示框点击确定, 等待执行结束弹出ok
5. 重启idea, Mac/Linux 重启电脑, 启动idea选择注册码激活.
6. 下载专属激活码, 专属激活码下载
英勇投弹手
JDK8 stream 流的简单使用:过滤、分组、遍历、求和、去重
JDK8 stream 流的简单使用
- 2020年4月15日
- 排序,分组,遍历,求和,去重等
***
测试Demo 实体
package com.ezhiyang.controller;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Caixiaowei
* @ClassName Demo.java
* @Description 测试demo
* @createTime 2020年04月15日 15:01:00
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Demo {
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
}
- 使用了lombok 插件
- @Data 所有属性的get和set方法,toString(), hashCode(), equals()
- @AllArgsConstructor 生成含所有属性的构造函数
- @NoArgsConstructor 生成无参构造
测试
@Test
public void testStream() {
List list = Lists.newArrayList(new Demo("张三", 15), new Demo("李四", 20));
System.out.println("list: " + JSONObject.toJSONString(list));
// 过滤
List collect = list.stream().filter(demo -> demo.getAge() > 15).collect(Collectors.toList());
System.out.println("过滤 age > 15 data: " + JSONObject.toJSONString(collect));
// 分组
Map> listMap = list.stream().collect(Collectors.groupingBy(demo -> demo.getName()));
System.out.println("按名字分组 listMap: " + JSONObject.toJSONString(listMap));
// 遍历
list.stream().forEach(demo -> {
System.out.print("name: ");
System.out.println(demo.getName());
});
// 排序1
collect.clear();
collect = list.stream().sorted((d1, d2) -> {
return d2.getAge().compareTo(d1.getAge());
}).collect(Collectors.toList());
System.out.println("按age倒序 collect: " + JSONObject.toJSONString(collect));
// 排序2--正序
collect.clear();
collect = list.stream()
.sorted(Comparator.comparing(Demo::getAge))
.collect(Collectors.toList());
System.out.println("按age正序 collect: " + JSONObject.toJSONString(collect));
// 排序3--倒叙
collect.clear();
collect = list.stream()
.sorted(Comparator.comparing(Demo::getAge).reversed())
.collect(Collectors.toList());
System.out.println("按age倒叙 collect: " + JSONObject.toJSONString(collect));
// 求和
Integer sum = list.stream().map(Demo::getAge).reduce(0, (a, b) -> a + b);
System.out.println("求和 sum: " + sum);
Integer sum = list.stream()
.filter(e ->(e.getAge() != null)) // 过滤null, 否则报空指针
.map(Demo::getAge).reduce(0, Integer::sum);
List list = Lists.newArrayList(1, null, 3);
Integer reduce = list.stream()
.filter(x -> x != null) // // 过滤null, 否则报空指针
.reduce(Integer::sum).get();
}
- 控制台打印
list: [{"age":15,"name":"张三"},{"age":20,"name":"李四"}]
过滤 age > 15 data: [{"age":20,"name":"李四"}]
按名字分组 listMap: {"李四":[{"age":20,"name":"李四"}],"张三":[{"age":15,"name":"张三"}]}
name: 张三
name: 李四
按age倒序 collect: [{"age":20,"name":"李四"},{"age":15,"name":"张三"}]
求和 sum: 35
按对象属性值去重
- 测试User对象
@Data
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer sex;
private String email;
}
- 测试, 注意去重属性为空或者null 则会报错,先过滤空/null
public static void main(String[] args) {
List users = new ArrayList();
users.add(new User(1L, "张三", 1, "1111@qq.com"));
users.add(new User(2L, "大漂亮", 2, "2222@qq.com"));
users.add(new User(3L, "大漂亮", 1, "3333@qq.com"));
if (!CollectionUtils.isEmpty(users)) {
List list = users.stream()
.filter(c -> !StringUtils.isEmpty(c.getName())) // 过滤null, 否则报空指针
.filter(distinctByKey(user -> user.getName())).collect(Collectors.toList());
System.out.println(list);
}
}
/**
* 按属性去重
* @param keyExtractor
* @param
* @return
*/
private static Predicate distinctByKey(Function keyExtractor) {
Map seen = new ConcurrentHashMap();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}
输出结果: [User(id=1, name=张三, sex=1, email=1111@qq.com), User(id=2, name=大漂亮, sex=2, email=2222@qq.com)]
list 转 map
Map map = list.stream().collect(Collectors.toMap(User::getId, Function.identity()));
当id出现重复的时候会报错,
1. 可以用 Collectors.toMap(keyMapper, valueMapper, mergeFunction) 的重载方法解决, 用后面的值覆盖前面的值
Map map = list.stream().collect(Collectors.toMap(User::getId, u -> u, (u1, u2) -> u1));
英勇投弹手
redisson分布式锁
maven依赖
org.redisson
redisson-spring-boot-starter
3.16.0
org.glassfish
jakarta.el
redis 配置
spring:
redis:
host: 127.0.0.1
port: 6379
password:
database: 0
lettuce:
pool:
# 最大活跃链接数 默认8
max-active: 100
# 最大空闲连接数 默认8
max-idle: 10
# 最小空闲连接数 默认0
min-idle: 5
timeout: 30000
redisson 工具类
package com.miya.demo.common.util;
import com.miya.demo.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.concurrent.locks.Lock;
/**
* redisson锁工具类
*
* @author Caixiaowei
* @date 2022/06/21
*/
@Component
@Slf4j
public class RedissonLockUtil {
private static final long DEFAULT_WAIT_TIME = 5L;
@Autowired
RedissonClient redissonClient;
/**
* 加锁后运行
*
* @param lockName 锁名称
* @param runnable Runnable
*/
public void runWithLock(String lockName, Runnable runnable) {
Lock lock = redissonClient.getLock(lockName);
runWithLock(lock, lockName, DEFAULT_WAIT_TIME, runnable, true);
}
/**
* 加锁后运行
*
* @param lockName 锁名称
* @param waitTime 等待时间,超过之后取锁失败
* @param runnable Runnable
*/
public void runWithLock(String lockName, Long waitTime, Runnable runnable) {
Lock lock = redissonClient.getLock(lockName);
runWithLock(lock, lockName, waitTime, runnable, true);
}
public void runWithLock(Lock lock, String lockName, Long waitTime, Runnable runnable, boolean logEnabled) {
if (waitTime == null) {
waitTime = DEFAULT_WAIT_TIME;
}
try {
boolean lockOn = lock.tryLock(waitTime, java.util.concurrent.TimeUnit.SECONDS);
if (lockOn) {
if (logEnabled) {
log.info("Try lock [{}] success.", lockName);
}
try {
runnable.run();
} finally {
lock.unlock();
}
} else {
throw new BusinessException(String.format("Try lock [%s] fail.", lockName));
}
} catch (InterruptedException e) {
if (logEnabled) {
log.info("Try lock [{}] fail with exception.", lockName);
}
throw new BusinessException(e);
}
}
}
应用demo
public void demo() {
String lockKey = "xxxx"
redissonLockUtil.runWithLock(lockKey, () -> {
// todo 业务逻辑
});
}
英勇投弹手
LocalDateTime 与时间戳相互转换
/**
* LocalDateTime 转 时间戳(秒级别)
*
* @param localDateTime
* @return Long
* @author Caixiaowei
* @updateTime 2020/9/8 10:17
*/
public static Long localDateTimeToSecond(LocalDateTime localDateTime) {
Long epochSecond = localDateTime.toEpochSecond(ZoneOffset.ofHours(8));
return epochSecond;
}
/**
* LocalDateTime 转 时间戳(毫秒级别)
*
* @param localDateTime
* @return Long
* @author Caixiaowei
* @updateTime 2020/9/8 10:17
*/
public static Long localDateTimeToMilliseconds(LocalDateTime localDateTime) {
long milliseconds = localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
return milliseconds;
}
/**
* 时间戳(秒) 转 LocalDateTime
*
* @param second 时间戳(秒)
* @return LocalDateTime
* @author Caixiaowei
* @updateTime 2020/9/8 10:20
*/
public static LocalDateTime secondToLocalDateTime(Long second) {
LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(second, 0, ZoneOffset.ofHours(8));
return localDateTime;
}
/**
* 时间戳(毫秒) 转 LocalDateTime
*
* @param milliseconds 时间戳(毫秒)
* @return LocalDateTime
* @author Caixiaowei
* @updateTime 2020/9/8 10:20
*/
public static LocalDateTime millisecondsToLocalDateTime(Long milliseconds) {
LocalDateTime localDateTime = Instant.ofEpochMilli(milliseconds).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
return localDateTime;
}
英勇投弹手
Git 仓库迁移
Git 仓库迁移
- 完整的迁移代码和提交信息等.
- 先把Git仓库信息clone 到本地,然后push 到新的Git 仓库
克隆git 信息到本地
git clone --bare 原来的git地址
push Git到新仓库
- clone 下来会出现一个同名的xxx.git 文件夹
cd xxx.git
git push --mirror 新的git地址
英勇投弹手
python http requests 怎么实现模拟登录,提交表单?
百度登陆的话,你这样应该是登陆失败吧。百度登陆没有那么简单的,参考网页我弄丢了好像。你要么用 Firebug 分析百度的登陆流程,要么参考这个 https://github.com/liyangjie/baidupcsapi,要么等我写博客介绍吧。注意,要登陆百度,首先要访问百度的任意页面取得一个 cookie,然后才能 POST 登陆信息的。
英勇投弹手
如何理解HTTP PATCH是非幂等的?
所谓幂等,通俗来讲就是不管执行多少次,所造成的后果都一样,比如 DELETE /my/resource/123 不管执行多少遍都是删除 123 这个资源,不会造成把 456 给删了;再如 POST /my/resource 数据 name=张三&age=60 每执行一次就加一个张三,这是非幂等的。那回到 PATCH 上,如何理解它是非幂等呢,功能是更新部分内容没错,但对它的定义这个是不全的,完整描述如下:
The PATCH Method
The PATCH method requests that a set of changes described in the request entity be applied to the resource identified by the Request- URI. The set of changes is represented in a format called a "patch document" identified by a media type. If the Request-URI does not point to an existing resource, the server MAY create a new resource, depending on the patch document type (whether it can logically modify a null resource) and permissions, etc.
其中有很重要一句说明,如果 URI 对应的资源不存在,服务端可以创建一个新资源。
详见 https://tools.ietf.org/html/r...
英勇投弹手
502, 503和504的区别
参考 HTTP 状态码详解与选用
英勇投弹手
前端开发, 怎样有效管理 hosts 文件的频繁修改?
神器SwitchHosts
英勇投弹手
chrome devtools 中 network 一栏中的 Finish 时间代表着什么?
DOMContentLoaded 和 Load
DOMContentLoaded 和 Load 分别对应 页面 DOMContentLoaded 和 Load 事件触发的时间点,即:
DOMContentLoaded:DOM树构建完成。即HTML页面由上向下解析HTML结构到末尾封闭标签</html> 。
Load:页面加载完毕。 DOM树构建完成后,继续加载html/css 中的图片资源等外部资源,加载完成后视为页面加载完毕。
DOMContentLoaded 会比 Load 时间小,两者时间差大致等于外部资源加载的时间。
Finish
Finish 时间与DOMContentLoaded 和 Load 并无直接关系。
Finish 时间是页面上所有 http 请求发送到响应完成的时间,HTTP1.0/1.1 协议限定,单个域名的请求并发量是 6 个,即Finish是所有请求(不只是XHR请求,还包括DOC,img,js,css等资源的请求)在并发量为6的限制下完成的时间。
Finish 的时间比 Load 大,意味着页面有相当部分的请求量,
Finish 的时间比 Load 小,意味着页面请求量很少,如果页面是只有一个 html文档请求的静态页面,Finish时间基本就等于HTML文档请求的时间。(如下图)
页面发送请求和页面解析文档结构,分属两个不同的线程,
所以 Finish 时间与DOMContentLoaded 和 Load 并无直接关系。
英勇投弹手
springboot项目中异步调用有哪几种方式
如题, 在springboot项目中, 想要异步调用其他的方法, 有那几中常见的方案
英勇投弹手
微信小程序引入其它js的方法,使用require和import有什么区别?
import和require的区别node编程中最重要的思想就是模块化,import和require都是被模块化所使用。
遵循规范require 是 AMD规范引入方式import是es6的一个语法标准,如果要兼容浏览器的话必须转化成es5的语法
调用时间require是运行时调用,所以require理论上可以运用在代码的任何地方import是编译时调用,所以必须放在文件开头
本质require是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量import是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require
英勇投弹手
微信小程序接入地图,规划的起始点 溢出地图 ,请问如何设置才不会出现这种情况
找到方法了,没有仔细看文档,这里有说明
添加了padding之后在iphone手机上能正常显示
效果图:
英勇投弹手
nginx 如何把https 代理到 http 或者代理到本地(127.0.0.1)
已经解决。nginx配置。
server {
listen 443 ssl;
server_name www.****.com; ssl on;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_certificate ./https/214319235880580.pem;
ssl_certificate_key ./https/214319235880580.key;
location / {
# root html;
# index index.html index.htm;
proxy_pass http://www.****.com;
}
location /server/ {
client_max_body_size 0;
proxy_connect_timeout 300s;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_redirect off;
proxy_hide_header Vary;
proxy_set_header Accept-Encoding '';
proxy_set_header Host $host;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
proxy_pass http://**.**.**.***:10103/;
}
英勇投弹手
element-ui 怎么让table的列头不换行
根据el的api实现的解决方案,通过 table 的 render-header 自己手动处理label
:render-header ="labelFunction"
labelFunction 代码如下:global.elTableHeadFunction = function (h,l,fontSize) {
let f = 14;
if(typeof(fontSize) != "undefined" && fontSize != null){
f = fontSize;
}
//列头的实际宽度
let width = l.column.realWidth;
//14:字体大小 32 是el表格的左右 padding 的合
let maxFontCount = Math.floor((width-32)/f)-1;
let chars = l.column.label.split("");
var label = "";
if(maxFontCount < chars.length){
for (let i = 0; i < maxFontCount; i++){
label += chars[i];
}
label +="..";
}else{
label = l.column.label;
}
return label;
};
英勇投弹手
element-ui 的el-date-picker的format设置之后是怎么用的呢?
经测试,format只影响前端显示部分,并不会影响具体的数据。解决方案参见:https://segmentfault.com/q/10...
英勇投弹手
我能动态设置el-input的readonly吗
v-bind:readonly="readonly"可以了,这样设置就OK了
英勇投弹手
element ui 的datePicker 日期控件怎么获取到鼠标选中的时间?
额 ,是题目太简单 大神们都懒得回答吗!!
英勇投弹手
el-table中怎么动态设置选中行的背景颜色?
可以借助row-style这个方法来实现但它是作用在tr上的,首先需要把作用在td上的默认选中样式覆盖成透明色
.el-table .current-row > td {
background: transparent !important;
}
然后直接处理就行 参考这个例子
英勇投弹手
sql问题之where条件的优先级
还是从运算符优先级分析
not最高,其次是and,最低是or,从左到右求值,括号可改变优先级
英勇投弹手
mysql 怎么统计七天内的订单,和每日的订单啊?
七天内的订单:
SELECT * FROM t_order WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(create_time);
七天内每天的订单数量,先用where条件查出七天内的订单,再用group by 对每天进行分组就行了:
SELECT DATE(create_time) createtime,COUNT(*) FROM t_order WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= DATE(create_time) GROUP BY createtime;
英勇投弹手
sql怎么随机取50条数据?
select * from table order by rand() limit 50;
英勇投弹手
SQLAlchemy中模糊查询,如何like多个关键字
from sqlalchemy import and_
words = ['%三%', '%猫%']
rule = and_(*[table.u_name.like(w) for w in words])
table.query.filter(rule)
英勇投弹手
【MySQL】求一个SQL语句的优化
加个变量
where @st:=instr(...) order by @st;
英勇投弹手
为什么计算结果返回-0
你可以先看看first(a*100)/last(a)的结果,因为精度的原因它的值可能大于100
英勇投弹手
请问下dolphindb中用不同的python去run同样的脚本,里面有相同的内存表定义,会互相影响吗?
DolphinDB会话隔离,变量只在当前会话有效。
英勇投弹手
单表分类取最值的SQL如何实现效率最高?
@sub 同学先排序再 group by 的方法是可以的,这里再写一种效率更高的方法。当然对 logintime 建立索引是非常可取的一点。select userid,dat from tbl t where t.logintime = (select max(logintime) from tbl where userid = t.userid)
参考:分组计算的SQL设计探讨
英勇投弹手
怎么用自定义泛型实现下面的代码,怎么优化
谢邀先来简单粗暴的。。。。竟然想把两个方法合一,很简单,其实合一的时候,就是把公共部分用同一个东西表示,楼上已有兄弟有建议用接口,是可以的,不过竟然属性和代码结构差不多,lambda+泛型应该就可以解决
我们可以看到,那两个方法,需要归一的地方就两个
customer.getDone()和client.getDone()
customer.setLocation("hongkong")和client.setLocation("hongkong")
这两个地方的对应的方法分别就应该是Predicate和Consumer了,所以我们可以建立这么一个公共方法execute
public <T> void execute(T t, Predicate<T> donePredicate, Consumer<T> locationConsumer){
if(donePredicate.test(t)){
locationConsumer.accept(t);
}
System.out.println("result: "+ t);
}
所以之前的两个方法execute_customer和execute_client就可以改为
public void execute_customer(Customer customer){
this.execute(customer, Customer::getDone, c -> c.setLocation("hongkong"));
}public void execute_client(Client client){
this.execute(client, Client::getDone, c -> c.setLocation("hongkong"));
}
不过不建议你这么写。。。毕竟三个参数的方法,还是很长了。。。并且Customer和Client在业务上本身可能也没有啥联系,强行整合代码,只会给以后的维护带来巨大理解成本,因为它们只是恰好有两个相同的字段,恰好他们的处理模式一样
但是我们可以换个角度思考,既然恰好它们有两个相同的字段,恰好他们处理模式一样,题主也想把他们合在一个方法里,那我们不看Customer和Client,光看属性location和isDone,光看方法里if的处理,是不是就可以说明,他们两个属性合在一起代表着一个业务,一个独立于Customer和Client的业务,它有自己的属性location和isDone,也有自己的行为,那就是if的处理,假如我们设定这么一个业务叫Location,那它一定可以写成
public class Location {
private String location;
private Boolean isDone;
// get set toString ... public void execute(){
if(this.getDone()){
this.setLocation("hongkong");
}
}
}
这样的话,Customer和Client就变成
public class Customer {
private Location location;
}public class Client {
private Location location;
}
因此Order里的方法就变成
public void execute_customer(Customer customer){
customer.getLocation().execute();
}public void execute_client(Client client){
client.getLocation().execute();
}
嗯嗯,这么写,赶脚完美的雅痞,当然一切还是以实际业务来决定,我只是根据当前题主提供的信息做了一些猜想,并且写出的一种方式,实际业务可能需要调整,仅供参考,就酱
===============================小小更新==============================
评论里题主提到如何用接口来整合,其实这也是面向接口编程的小实例哈,面向接口编程,就是需要把整个业务逻辑按照接口预定义的方式组装起来,出现接口的调用的地方,即业务抽象的点
其实和之前的抽象点差不多,还是
customer.getDone()和client.getDone()
customer.setLocation("hongkong")和client.setLocation("hongkong")
这两个点之前用函数式接口表示的,此时用接口去表示,比如我们定义这样一个功能接口,就叫ILocation吧,那它可以这么表示
public interface ILocation{
Boolean getDone();
void setLocation(String location);
}
为什么要这么写,是恰好,这两个方法的命名方式就是Client和Customer中的属性set,get方法,这样就减少了写实现方法的必要,之后Client和Customer就可以这么表示
@Getter
@Setter
public class Client implements ILocation{
private String location;
private Boolean isDone;
}@Getter
@Setter
public class Customer implements ILocation{
private String location;
private Boolean isDone;
}
因为set和get方法方法都已经实现了ILocation,用了lombok的注解后,代码可以啥都不加了(lombok对于默认的Boolean类型属性的get方法是getIsDone,所以若是需要的话,不要加is开头)
之后在Order那里就可以这么写一个公用方法
public void execute(ILocation location){
if(location.getDone()){
location.setLocation("hongkong");
}
}
接口实现大体就是这样,仅供参考,就酱
=============================2018-11-21新问题更新===============================回答问题之前,还是要说明一点哈,任何代码的整合,要么是要在业务范围内可以合并,要么就是公共结构或工具抽取,过分强行的整合代码,只会胡乱增加业务之间的耦合,给后续扩展开发带来极大的不变
回到题主的新问题中,可以看到,这个时候已经不是简单靠传入参数就解决了(虽然也还是可以,不过那么写实在不太友好,也不利于扩展),这次我们可以从直接两段方法中简单抽象出这么一个业务过程
public <T> List<T> retrieveEntityRecords(RequestParam request) { List<String> ids = request.getId();
String location = request.getLocation();
boolean idsCk = CollectionUtils.isNotEmpty(ids) && ids.size() > 0;
boolean locationCk = !StringUtils.isEmpty(location);
List<T> result;
try {
if (idsCk) {
if (locationCk) {
// use [ids location] query db
} else {
// use [ids] query db
}
} else {
if (locationCk) {
// use [location] query db
} else {
// query all record in db
}
}
} catch (Exception e) {
throw new SystemException();
}
return result;
}
以上这段代码应该就是之前两个方法的主干代码了,也是这次要整合的业务核心代码,我们还是学上个问题一样,把公共部分抽离处理啊,其他需要具体实现的那就用接口来实现了,那具体需要实现的就是这4行注释了
// use [ids location] query db
// use [ids] query db
// use [location] query db
// query all record in db
那所以我们定义这么一个接口ILocationIdsQuery(个人理解就是按照Location和id进行查询的公共逻辑,所以这么简单取名了),它就定义有这么4个抽象方法
public interface ILocationIdsQuery<T> {
List<T> queryByIdsAndLocation(List<String> ids, String location);
List<T> queryByIds(List<String> ids);
List<T> queryLocation(String location);
List<T> query();
}
这么定义下来,就会发现其实这和customerRepository和clientRepository的接口方法一致,如果你的customerRepository和clientRepository没有公共的父类接口,那么这个时候你可以给它们都加个一个父类接口ILocationIdsQueryExecutor,并补充他们的实现,如果本身customerRepository和clientRepository就有这么一个公共的父类接口,那就可以不用定义这么一个新接口了
有了这么一个公共接口之后,那就简单了,直接开一个工具类LocationIdsQueryUtils(保持业务的一致性,方便其他人看看代码,所以就取了这么一个名字)
public class LocationIdsQueryUtils {public static <T> List<T> doQuery(ILocationIdsQuery<T> locationIdsQuery, RequestParam request){
List<String> ids = request.getId();
String location = request.getLocation();
boolean idsCk = CollectionUtils.isNotEmpty(ids) && ids.size() > 0;
boolean locationCk = !StringUtils.isEmpty(location);
List<T> result;
try {
if (idsCk) {
if (locationCk) {
// use [ids location] query db
result = locationIdsQuery.queryByIdsAndLocation(ids, location);
} else {
// use [ids] query db
result = locationIdsQuery.queryByIds(ids);
}
} else {
if (locationCk) {
// use [location] query db
result = locationIdsQuery.queryByLocation(location);
} else {
// query all record in db
result = locationIdsQuery.queryAll();
}
}
} catch (Exception e) {
throw new SystemException();
}
return result;
}
}
那有了这么一个工具类,剩下的就好写多了,直接调用工具类即可
public List<Customer> retrieveEntityRecords(RequestParam request) {
List<Customer> result = LocationIdsQueryUtils.doQuery(customerRepository, request);
return result;
}public List retrieveEntityRecords(RequestParam request) {
List result = LocationIdsQueryUtils.doQuery(clientRepository, request);
return result;
}
大体就是这样,仅供参考,就酱
英勇投弹手
ubuntu 安装mysql自动输入密码
牛掰
英勇投弹手
问一个电商网站商品表和商品分类表的设计?
淘宝的类目体系是一个单独的项目,专门有人做类目的维护。而且分前台类目和后台类目,前台类目面向用户,后台类目面向技术。前后台类目通过类目的属性完成映射关系。
类目不是无限可分的。任何一个类目都是通过一组属性定义的。商品有了属性才归到一个类目下。如手机是一个类目,但华为手机不是一个类目,只是具有品牌:华为属性的手机,当然手机不会只具有品牌一个属性。但是所有的手机都归属于手机这个类目。
淘宝类目是树形结构,最高只有4级,所有的商品有一个类目id,这个类目id一定是一个叶子类目。非叶子类目不能挂商品。上面举例的手机就是一个叶子类目。
其实淘宝的类目体系中,属性才是最重要的。
英勇投弹手
flex布局如何让每个元素宽度自适应,而不是平分
当然可以,而且应该仅需给项目设置flex auto:
英勇投弹手
chrome拦截支付宝的支付新窗口,如何解决?
https开头的好像不会被拦截
英勇投弹手
stackoverflow 排序算法如何在网站中实现?
一些排名的算法,虽然不是 stackoverflow也是投票排名的网站hack news : 基于用户投票的排名算法(一)
Reddit: 基于用户投票的排名算法(二)Reddit排名算法工作原理
英勇投弹手
go语言开发网站
上面的仁兄推荐的这本开源书不错,我就是看这本书开始学习Go的。https://github.com/astaxie/build-web-application-with-golang
但如果你以前没有关注过或不熟悉web的话,建议再看补习下HTML基本知识:http://www.w3school.com.cn
学习Go,我到是经常去官方看手册,看他们的blog,建议也看下:http://golang.org
英勇投弹手
absolute定位为什么会随着滚动条滚动?
设置overflow: auto; parent高度小于child高度出现滚动条child1距离parent顶部20px;当然会滚上去了,你如果设置成相对于parent的父辈定位的话 就不会滚
英勇投弹手
HTML 格式的邮件如何定义 CSS
经过google搜索,发现gmail目前支持inline的css方式。这里http://www.campaignmonitor.com/css/可以找到各个邮件客户端对css样式的支持情况。这里还有一篇不错的文章: http://groundwire.org/labs/email-publ...,介绍了一些在email中使用html和css的最佳实践。Why gmail blocked the css? http://stackoverflow.com/questions/15...看来只能悲剧的inline了。
英勇投弹手
ajax fetch获取不到数据提示需要跨域(肯定没有跨域)
因为 http://aabb:8088/Service/ 与 http://aabb:8088 是两个不同的域名
英勇投弹手
ajax能跨域post吗?
跨域ajax浏览器的兼容性不好解决jsonp只能GET跨域POST从来都是可以的
构造<form>表单想action给谁都可以跨域POST,并且想得到返回结果,需要对方服务器做一些配合思路:
== a.com/post.html ==<script>
function postcallback(data){
}
</script>
<form action="http://b.com/api.php" method="post" target="ifr-result"><input ....></form>
<iframe name="ifr-result"></iframe>
== a.com/ifr-callback.php ==<?php
header('Content-type: text/javascript');
echo '<script>';
//回调原页面上函数处理返回结果
echo 'window.top.postcallback(' .$_GET['data']. ');';
echo '</script>';
== b.com/api.php ==<?php
//....
$data = '{"ret":0,"msg":"ok"}';
// ** 让结果跳转到a.com域 **
header("Location: http://a.com/ifr-callback.php?data=".urlencode($data));
英勇投弹手
ajax与form表单提交
把验证过程放在输入过程中。提前确定是否允许提交~
英勇投弹手
Event Loop 中异步任务的疑问◔ ‸◔?
说下我的理解吧,先明确几个基本概念
js引擎只负责实现ecmascript标准,按照标准执行代码,它不关心也不知道event loop的存在,你给它什么代码它就执行什么
event loop是 js运行环境内部使用的机制,运行环境也就是Node以及各种各样的浏览器
js引擎执行代码时会有一个执行栈,执行栈中的代码执行完毕后,浏览器(JS运行环境)才会从event queue中取出事件,如果该事件有对应的callback,则再次交给js引擎执行。
所有的事件在产生后都会被浏览器放到event queue中,事件可以来源于鼠标键盘、网络IO、定时器等。event queue一般是由多个不同优先级的队列组成,分别对应不同类型的事件,具体的细节由实现者自己决定。
现在,根据你描述的问题,我尝试还原一下整个过程。
浏览器取得HTML文件后,做的第一件事就是解析HTML(它内部有另外的模块来做这件事),构建DOMTree,当遇到script标签,会停止解析,交给js引擎执行标签内的javascript代码块,这就是我们通常说的js会阻塞页面渲染。 此时js引擎执行栈中只有第一个script标签内的代码。一旦这段代码执行完毕,浏览器会检查event queue,这个时候,根据event queue的情况以及浏览器自身的实现策略就可能会有不同的结果。
浏览器可能会按照先后顺序,或者它预定的优先级依次取出全部事件给js引擎执行callback,还有可能为了加快页面渲染速度,只取出部分高优先级事件。
最后浏览器继续解析页面,遇到下一个script标签再次交给js引擎执行代码
我在Chrome57下多次执行了你的代码,只会出现第1,3种情况
这很好理解,当第一段script执行完时,chrome取出事件时,忽略低优先级的timeout事件,如果已经有xhr事件则取出,没有就继续解析HTML,碰到第二个script再次用js引擎执行。
最后,已上纯属个人见解。有些概念其实依赖于具体的实现的,不同浏览器的差异可能会导致表现出来的行为就不一样,要深入的了解细节只能去看它们的源码了。。。
英勇投弹手
如何正确判断js数据类型
由于具体实现上的问题,在实际的项目应用中,typeof只有两个用途,就是检测一个元素是否为undefined,或者是否为function。为何呢?JavaScript Garden整理出来了如下表格:Value function typeof
-------------------------------------
"foo" String string
new String("foo") String object
1.2 Number number
new Number(1.2) Number object
true Boolean boolean
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
[1,2,3] Array object
new Array(1, 2, 3) Array object
new Function("") Function function
/abc/g RegExp object
new RegExp("meow") RegExp object
{} Object object
new Object() Object object
所以我们一般用“鸭子类型”来做流程控制,好晚了,不多讲,去搜一下吧。
一定要区分这些东西?Object.prototype.toString()有一个妙用,如果我们以某个特别的对象为上下文来调用该函数,它会返回正确的类型。我们需要做的就是手动处理其返回的字符串,最终便能获得typeof应该返回的正确字符串。可以用来区分:Boolean, Number, String, Function, Array, Date, RegExp, Object, Error等等。jQuery.type()就是这样实现的。以下代码从jQuery源码中抽取出来,可以直接用。var class2type = {} ;
"Boolean Number String Function Array Date RegExp Object Error".split(" ").forEach(function(e,i){
class2type[ "[object " + e + "]" ] = e.toLowerCase();
}) ;
//当然为了兼容IE低版本,forEach需要一个polyfill,不作细谈了。
function _typeof(obj){
if ( obj == null ){
return String( obj );
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[ class2type.toString.call(obj) ] || "object" :
typeof obj;
}
使用结果:_typeof(new String())
->"string"
_typeof("123")
->"string"
_typeof(new RegExp())
->"regexp"
_typeof(null)
->"null"
英勇投弹手
dnspod的彩蛋怎么生成的
送你两篇文章:
基于 canvas 将图片转化成字符画
国庆节到了,献给 sf 社区的礼物
具体思路很简单,就是:扫描图片相应位置的像素点,再计算出其灰度值,根据灰度值的大小,分别用字符 #*+“ 和空格来填充。在第二个链接(国庆节到了,献给 sf 社区的礼物)中,我又对第一个 ANSII 图进行了升级,不仅仅显示出了 SF 字样,而且这个字样还是一个可以直接运行的 javascript 代码,代码的运行结果会输出 segmentfault。