为SpringBoot应用添加可以配置的拦截器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
@ConditionalOnExpression("${cache.response.enabled:false}")
public class FilterRegistrationBeanConfigration {
@Bean
public FilterRegistrationBean filterRegistrationBean() {
return new FilterRegistrationBean() {{
setFilter(new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
HttpServletResponse responseToUse = new ContentCachingResponseWrapper(response);
filterChain.doFilter(request, responseToUse);
((ContentCachingResponseWrapper) responseToUse).copyBodyToResponse();
}
});
}};
}
}
1
cache.response.enabled=true

git的各种常用操作

远程分支删除后,本地依旧可以看到的解决方法

使用命令 git branch -a,可以看到很多本地和远程都删除了的分支。

使用命令 git remote show origin,可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息。

使用命令 git remote prune origin,可以删除远程仓库已经不存在的分支。

Fix 线上bug的git流程

假如我们现在在develop分支开发,平时都是合并到dev。然后发布的时候合并到master发布。那么我们现在就有三个分支 dev develop master。这个时候线上出现了bug,需要紧急修复。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
git satash --先保存自己现在在写的代码
git checkout master
git checkout -b fix
--然后修改代码之后合并到master发布。
git commit
git push

--发布后先切到master拉取最新代码
git checkout master
git pull

--然后切回之前开发的develop分支,把修改的代码合并到develop
git checkout develop
git stash pop
git merge master
git checkout -d fix

--develop开发完成后合并到dev就可以完成一次开发流程

通过Gmail发送Alertmanager邮件

1 启用 IMAP

登录邮箱,点击转发和 POP/IMAP

2 开启两步验证

3 生成应用密码

可以看一下 Google官方链接 。未开启两步验证不能生成应用密码。

4 更改Alertmanager的配置文件

1
2
3
4
5
global:
smtp_smarthost: 'smtp.gmail.com:587'
smtp_from: 'GMAIL_ACCOUNT'
smtp_auth_username: 'GMAIL_ACCOUNT'
smtp_auth_password: 'GMAIL_AUTH_TOKEN'

Lucene为不同的Field添加不同的Analyzers

Lucene为不同的Field添加不同的Analyzers

可以利用Lucene自带PerFieldAnalyzerWrapper。

1
2
3
4
5
6
Analyzer defaultAnalyzer = new PinyinAnalyzer();
Map<String,Analyzer> fieldAnalyzers = new HashMap<>();
//Defines an analyzer to use for the specified field.
fieldAnalyzers.put("name",new StandardAnalyzer());
fieldAnalyzers.put("fieldName",new SmartChineseAnalyzer());
PerFieldAnalyzerWrapper analyzerWrapper = new PerFieldAnalyzerWrapper(defaultAnalyzer,fieldAnalyzers);

但是这样创建了以后就不能动态修改了,在早期的Lucene版本中PerFieldAnalyzerWrappers是自带addAnalyzer的方法的,在最新版本fieldAnalyzers的权限变成了private final。不过没关系,可以用反射的方法来获取fieldAnalyzers。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private PerFieldAnalyzerWrapper analyzerWrapper;

PerFieldAnalyzerWrapper getAnalyzerWrapper() {
if (analyzerWrapper == null) {
analyzerWrapper = new PerFieldAnalyzerWrapper(new PinyinAnalyzer());
}
return analyzerWrapper;
}


void addNewAnalyzer(String fieldName, Analyzer analyzer) {
PerFieldAnalyzerWrapper wrapper = getAnalyzerWrapper();
Map<String, Analyzer> map = new HashMap<>();
try {
Field field = PerFieldAnalyzerWrapper.class.getDeclaredField("fieldAnalyzers");
field.setAccessible(true);
if (!field.get(wrapper).equals(new HashMap<>())) {
map = (Map<String, Analyzer>) field.get(wrapper);
}
map.put(fieldName, analyzer);
} catch (Exception e) {
e.printStackTrace();
}
analyzerWrapper = new PerFieldAnalyzerWrapper(new PinyinAnalyzer(), map);
}

[medium] linked list cycle

难度: 中等 标题:带环链表

给定一个链表,判断它是否有环。

思路

一开始想到的思路是放到hashmap里,每次前进一格就查询在hashmap中是否存在。存在则返回true,遇到null就返回false。但是这样需要额外空间。

后来的思路是两个指针first和second。second每次前进两格,first前进一格。若有环,second必定追上first。

思路想到后调试了很久,总是超出内存范围。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @return: True if it has a cycle, or false
*/
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null){
return false;
}
ListNode first = head;
ListNode second = head;
while (first != null && second != null && second.next != null){
second = second.next.next;
first = first.next;
if (first == second){
return true;
}
}
return false;
}
}

链接

https://www.lintcode.com/zh-cn/problem/linked-list-cycle/

PS4-初音未来-歌姬计划 Future-Tone-完美心得

奖杯

奖杯很简单,没有任何难度奖杯。只需要每首歌打一遍(难度不限),然后观看39首歌的PV,并且在看的过程中拍照就可以获得全部奖杯。不过由于歌曲数量多,所以要花的时间也挺长的,另外一个缺点是没有白金奖杯。

画面

有史以来画面最好的初音,1080P 60FPS,给人带来的享受是完全不同的。

性价比

500多港币有200多首歌,而初音X F1 F2等,需要300多港币,只有30首歌左右。

性价比爆表。

[PSV] √Letter-方根书简白金评价和感想

评分 :7

+优秀的人设。

+PSV上第一款中文文字游戏。

=好听但是略显单调的音乐。

-令人厌烦的地图探索系统。

-无法跳过的第八章。

-有一些奇怪的剧情。

杂谈

突然发现两个礼拜没有更新博客了,难道是因为找到工作的原因么。

两个礼拜以来更新的第一篇博客居然还是游戏,不知道HR看到会怎么想。

6月13号入的游戏,到7月21号白金花了一个月,不过真正认真玩的时间也就四天。

[easy]Two Sum

难度: 简单 标题:Two Sum 求和

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution.

Example:
Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

思路

方法1 :两层循环,先选定一个数,然后遍历它之后的数,假如符合条件则返回坐标。

方法2:把traget - nums[i]放入hashmap。然后查询 nums[i] 在不在hashmap里,假如在的话就说明他和之前的某个数字加起来等于traget;

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//代码 1
public class Solution {
public int[] twoSum(int[] nums, int target) {
int a[] = new int[2];
for(int i = 0;i < nums.length -1;i++){
a[0] = i;
for(int j = i + 1;j < nums.length;j++){
a[1] = j;
if((nums[a[0]] + nums[a[1]]) == target){
return a;
}
}
}
return a;
}
}

//代码2
public class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.get(nums[i]) != null) {
int[] result = {map.get(nums[i]), i};
return result;
}
map.put(target - nums[i], i);
}
int[] result = {};
return result;
}
}

链接

https://leetcode.com/problems/two-sum/

[easy] Delete Node in a Linked List

难度: 简单 标题:Delete Node in a Linked List 删除链表的节点

Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.

Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -> 4 after calling your function.

思路

A->B->C->D

原本要删除B,知道A,只需要A.next= B.next;

现在只提供B,无法提供 A 时只能把 C 复制到 B,然后删除 C 即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}

链接

https://leetcode.com/problems/delete-node-in-a-linked-list/

[medium]Integer Break

难度: 中等 标题:整数拆分

Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.

For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).

Note: You may assume that n is not less than 2 and not larger than 58.

Hint:

There is a simple O(n) solution to this problem.
You may check the breaking results of n ranging from 7 to 10 to discover the regularities.

把一个整数拆分成几个数字,使得他们的积最大。

思路

可以把1-10的拆分结果都列出来,发现当 n > 6 以后,(n - 3) = 3 * n。所以可以吧n = 2 - 6的结果先列出来,然后把6以上的数拆掉若干个3,直到能在表中查到。

开始用的是switch,发现语句太繁琐了,就使用一维数组。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//递归
public class Solution {
public int integerBreak(int n) {
int a[] = {1,2,4,6,9};
if(n < 7){
return a[n-2];
}
else return 3 * integerBreak(n-3);
}
}

//非递归
public class Solution {
public int integerBreak(int n) {
int a[] = {1,2,4,6,9};
if(n < 7){
return a[n-2];
}
int val = 1;
while(n >= 7){
val = 3 * val;
n = n-3;
}
return a[n-2] * val;
}
}

链接

https://leetcode.com/problems/integer-break/

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×