Mac上使用网易Mumu模拟器踩坑指北

前言 为了给mac找一款合适的android模拟器,先前使用的Nox player,但是老哥这Mac版本好几年都不更新了,使用的VirtualBox也不兼容。 替代者 网易MuMu模拟器 号称非常快,主要是Mac版本有更新。其它的都不行。 配置Charles抓包 以为找到了一个非常好的模拟器,没想到配置Charles抓包时遇到很多问题(我这使用的是Mumu版本是1.9.1) SSL代理配置问题 正常情况下的代码只需要配置ip和端口就可以,但是发现配置保存后,不能进行输入,修改成无代理就又可以了,后来各种找发现还得在配置中不使用代理中要配置10.0.2.2这个ip,好像是模拟器内部要用这个地址。 SSL证书安装问题 配置好代码ip后,要下载Charles的证书并安装,这时要配置模拟器的解锁密码,如果遇到输入正确密码后不能安装的问题,则可以考虑重新配置一下密码,大于6位的吧 多开问题 对于Nox player可以进行真正意义的完全多开(模拟器环境隔离),Mumu只是实现了简单的多开,不能使用不同版本的app,目测只是一个镜像。但是好在能使用了,希望后续开发团队可以支持。 软件窗口问题 如果在Mac使用窗口操作工具对Mumu进行操作,则可能一下子就找不到应用了,只能重启,正确的使用方式是使用Mumu菜单中的窗口下的拼贴功能,使用起来还不错。

2020-02-11 ·  (🌟Updated: 2020-02-11) · 1 min · 17 words · tomyli

2020-ARTS-打卡第五天

Algorithm 题目描述 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。leetcode-20 Example 输入: “()” -> 输出: true 输入: “()[]{}” -> 输出:true 题目解答 此种题目可以使用栈来进行处理,主要有几个核心点 入参数为奇数则一定不匹配 对于左括号,直接进行push操作 对于右括号,对栈进行pop操作与右括号进行匹配 最后栈为空则说明所有都匹配成功 public class BracketMatching { public boolean isValid (String s) { if (null == s || s.length() % 2 != 0) return false; Stack<Character> stack = new Stack<>(); Map<Character, Character> map = new HashMap<>(); map.put(')', '('); map.put('}', '{'); map.put(']', '['); for (char c : s.toCharArray()) { if (!map.containsKey(c)) { stack.push(c); } else if (stack.empty() || map.get(c) != stack.pop()) { return false; } } return stack.empty(); } Review code-smells-mutation本文是Idea作者代码味道系列的第四篇。讲述了作者对一个近百行的方法进行重构的过程,主要是因为可变变量的坏味道。 ...

2020-02-06 ·  (🌟Updated: 2020-02-09) · 1 min · 122 words · tomyli

2020-ARTS-打卡第四天

Algorithm 题目描述 给定一个链表,判断链表中是否有环。 Example 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 题目解答 首先能想到的解法是使用一个Set存储已经遍历过的节点,如果在遍历中节点已经存在于Set中,则说明链表是有环的,这种解法额外使用了其它的数据结构。另一种更好的方法就是使用快慢指针的方式,类似于跑道上的套圈,如果快的人追上了慢的人则说明是有环的,否则就是快的人先到达终点(即访问到最后的Null) public class CycleSolution { public static boolean hasCycle(ListNode node) { ListNode slow = node; ListNode fast = node; while (slow != null && fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; if (slow == fast) { return true; } } return false; } } 快慢指针的解法的时间复杂度为O(n),空间复杂度为O(1),因为只使用了两个指针。 ...

2020-02-01 ·  (🌟Updated: 2020-02-01) · 1 min · 102 words · tomyli

2020-ARTS-打卡第三天

Algorithm 题目描述 反转一个单链表。 Example 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 题目解答 迭代解法 class Solution3 { public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode current = head; while (current != null) { ListNode tempNode = current.next; current.next = prev; prev = current; current = tempNode; } return prev; } } 第一次搞链表的题,还真是给难住了。此题的核心就是当前节点的指针要指向前一个节点,处理过程中还要考虑节点的丢失问题,所以要有一个变量保存当前节点的前一个节点,还要有一个变量来保存当前节点的下一个节点,方便后续的指针前移。此解法的时间复杂度为O(n),因其不需要额外的空间,所以空间复杂度为O(1)。 递归解法 class Solution3 { public ListNode reverseList2(ListNode node) { if (node == null || node.next == null) { return node; } ListNode current = reverseList2(node.next); node.next.next = node; node.next = null; return current; } } 此解的核心在于当有一部分是反转时,后续的反转问题,对于node.next.next = node这句,使用A->B两个节点进行示例,A.next为B,A.next.next为B.next,A.next.next = A为B.next = A,这样就实现了A与B两个节点的反转。这个递归看着还是有点懵,多看看就好了。 ...

2020-01-24 ·  (🌟Updated: 2020-01-24) · 1 min · 178 words · tomyli

2020-ARTS-打卡第二天

Algorithm 题目描述 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 Example 输入123->true 输入-123->false 输入12->true 题目解答 class Solution2 { public boolean isPalindrome(int x) { if(x < 0) { return false; } if(x % 10 == 0 && x != 0) { return false; } int reverseNumber = 0; while (x > reverseNumber) { reverseNumber = reverseNumber * 10 + x % 10; x /= 10; } return reverseNumber == x || x == reverseNumber / 10; } } 最简单暴力的方法是把int转换成String进行处理,String反转一半再与后续的进行比较,对于溢出的数字一定不是回文字。此方法则可以更快速的解决问题,关键是怎么找到当前数字的一半位置,可以使用当前数字pop与反转数字的push相比较,当push后的值大于pop后的值则说明到达了数字长度的一半了,对于奇数位的数字则可以使用reverseNumber/10来判断,因为中间的单个字默认就是回文字。此算法的时间复杂度为O(log(n)),空间复杂度为O(1)。 ...

2020-01-16 ·  (🌟Updated: 2020-01-17) · 1 min · 141 words · tomyli

2020-ARTS-打卡第一天

Algorithm 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 Example 输入123->321 输入-123->-321 输入120->21 题目解答 import java.util.*; public class Solution1 { public int[] reverseNumber(int num) { int res = 0; while(num != 0) { int pod = num % 10; if(res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && pod > 7)) { return 0; } if(res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && pod < -8)) { return 0; } res = res * 10 + pod; num = num / 10; } return res; } } 此题主要考察对栈的使用,如果不使用其它辅助类,则要考虑Int的整数溢出问题。时间复杂度O(log(n)),空间复杂度为O(1) ...

2020-01-08 ·  (🌟Updated: 2020-01-08) · 1 min · 189 words · tomyli

Maven发布401问题排查

日志问题现象 Caused by: org.apache.maven.shared.transfer.artifact.deploy.ArtifactDeployerException: Failed to deploy artifacts: Could not transfer artifact com.aa.bb:client:jar:1.0.0-20191231.021137-1 from/to company::default (http://test.company.local/nexus/repository/maven-snapshots): Transfer failed for http://test.company.local/nexus/repository/maven-snapshots/com/aa/bb/client/1.0.0-SNAPSHOT/client-1.0.0-20191231.021137-1.jar 401 Unauthorized 根据提示,401未授权,表面来看就是发布的权限未认证 排查步骤 settings文件是否配置了发布的用户名与密码,且用户有deploy的权限 <servers> <server> <id>myid</id> <username>myuser</username> <password>mypasswd</password> </server> </servers> 查看deploy插件的版本 如果是2.X的版本,可以使用以下命令进行发布 mvn -DaltDeploymentRepository=company::default::http://test.compnay.local/nexus/repository/maven-snapshots clean package deploy 如果是3.X的版本,则需要按3.X版本进行指定发布 mvn deploy:deploy-file -Dfile=xxx-1.0.0-SNAPSHOT.jar -Durl=http://test.local/nexus/content/repositories/snapshots -DrepositoryId=test-snapshot Deploy 3.0.0-M1的发布bug 如果配置的deploy的插件为3.0.0-M1,则可参考3.0.0-M1 401 bug 进行修改,具体就是指定depoly版本为2.8,根据插件作者的回复感觉就是3.0.0-M1与altDeploymentRepository参数不能一起用

2019-12-31 ·  (🌟Updated: 2019-12-31) · 1 min · 51 words · tomyli

那些有用maven命令

查看当前系统的配置信息 排查问题可以查看当前maven所依赖系统的所有变量(系统变量或者环境变量)信息 mvn help:system 查看当前有效的settings文件 maven的配置文件分为全局配置与个人配置,全局配置在$M2_HOME/conf/下,个人配置一般在~/.m2/下,此时查看当前有效的settings配置可以使用 mvn help:effective-settings 查看Settings配置的值 以下命令可以查看settings文件中的settings->servers的配置 mvn -q -Dexpression=settings.servers -DforceStdout help:evaluate 使用help:evaluate可以查看所有的配置信息 指定发布到其它仓库 Deploy插件2.X版本发布 有时候在pom文件中指定了发布的仓库地址,但是又需要发布到另一个仓库,这时可以指定-DaltDeploymentRepository来实现 mvn -DaltDeploymentRepository=id::layout::url 具体说明参见deploy:deploy Deploy插件3.0.0-M1版本发布 /data/mvn/bin/mvn org.apache.maven.plugins:maven-deploy-plugin:3.0.0-M1:deploy-file -DgroupId=com.qqreader -Dfile=./target/$(/data/mvn/bin/mvn -q -Dexpression=project.build.finalName -DforceStdout help:evaluate).jar -Durl=http://testurl.local/nexus/content/repositories/snapshots -DrepositoryId=snapshot-id

2019-12-31 ·  (🌟Updated: 2020-01-03) · 1 min · 33 words · tomyli

JAVA8问题处理回顾-持续更新

金额累加问题 使用Reduce进行累加操作,参考这里 List<BigDecimal> bdList = new ArrayList<>(); //populate list BigDecimal result = bdList.stream().reduce(BigDecimal.ZERO, BigDecimal::add); 查找集合的最后一个元素 JAVA8的Stream只提供了FindFirst功能,没有FindLast功能,可以使用Reduce来实现查找最后一个元素的效果 import java.util.*; import java.util.stream.*; public class GetLastEleFromCollection { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aaa"); list.add("idddd"); list.add("bbbb"); String lastElement = list.stream() .reduce((first, second) -> second) .orElse(null); System.out.println(lastElement); } } bbbb 比较两个时间是否是同一天 import java.time.*; import java.time.temporal.*; public class CompareDay { public static void main(String[] args) { final LocalDateTime now = LocalDateTime.now(); final LocalDateTime localDateTime = LocalDateTime.of(2019, 9, 29, 0, 0, 0); System.out.println(localDateTime.truncatedTo(ChronoUnit.DAYS).isEqual(now.truncatedTo(ChronoUnit.DAYS))); } } true 实现与Python的zip函数功能 import java.util.*; import java.util.function.*; public class Zip { public static void main(String[] args) { List<List<Integer>> result = handle(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6), (i, j) -> Arrays.asList(i, j)); System.out.println(result); } public static <T, U, R> List<R> handle(List<T> list, List<U> list1, BiFunction<T, U, R> biFunction) { List<R> result = new ArrayList<>(); for(int i = 0; i < list.size(); i ++) { result.add(biFunction.apply(list.get(i), list1.get(i))); } return result; } } [[1 (\, 4)] (\, [2 (\, 5)]) (\, [3 (\, 6)])] 多个Predicate链 import java.util.*; import java.util.stream.*; import java.util.function.*; public class MorePredicate { public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6); final Predicate<Integer> predicate = i -> i % 2 == 0; final Predicate<Integer> predicate1 = predicate.and(integer -> integer > 5); List<Integer> result = list.stream() .filter(predicate1) .collect(Collectors.toList()); System.out.println(result); } } [6]

2019-08-24 ·  (🌟Updated: 2019-09-29) · 2 min · 220 words · tomyli

Apollo Client自定义问题拾遗

由于公司很多服务要接入Apollo配置中心,并且对于项目的接入有网络要求,根据官方说明,需要自定义Client来完成 接入步骤 新建maven项目 在Idea中新建maven项目,基于quickstart构建 增加项目依赖 官方说明的建议在新的client中依赖Apollo官方的client,再根据业务进行扩展,所以maven依赖apollo-client,公司项目的网络访问需要通过L5来进行,所以还要依赖L5的jar,目前这个jar包没有maven坐标,只能以lib方式引入 自定义MetaServer 关键的部分,自定义满足公司网络条件的MetaServer,Apollo官网说明是实现MetaServerProvider且Order值小的Providor被使用,按照说明进行实现 Maven打包Client 执行 mvn clean install 进行打包,解压jar包发现就只有一个Providor的实现类,这样jar运行有问题。需要把新Client所有的依赖都打进jar包,在网上找了半天,需要在POM中增加maven的plugin的配置,如下: <!-- 打包所有的maven依赖到jar包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <artifactSet> <excludes> <exclude>junit:junit</exclude> </excludes> </artifactSet> </configuration> </execution> </executions> </plugin> <!-- 添加依赖的非maven jar包 --> <plugin> <groupId>com.googlecode.addjars-maven-plugin</groupId> <artifactId>addjars-maven-plugin</artifactId> <version>1.0.5</version> <executions> <execution> <goals> <goal>add-jars</goal> </goals> <configuration> <resources> <resource> <directory>${basedir}/lib</directory> </resource> </resources> </configuration> </execution> </executions> </plugin> 由于项目中使用了maven依赖与非maven依赖,所以上述的两个插件都要使用。增加了上面两个插件后再运行打包命令查看生成的jar就发现所有的依赖都在jar中了。 项目中使用Client 选择一个项目在测试环境进行配置调试,自定义的Meta Server一直没有生效,所以查找官方文档,由于自定义Providor是通过SPI方式实现的,所以正确的实现方式是新建resource文件夹,指定MetaServerProvider的真正实现类的带包名类才可以,哎,找了我好久。 后续操作 后续会把client上传到内部maven仓库,完善配置API,使业务方可以零配置来使用配置中心。 总结 Maven的打包机制还是不清晰,处理打包问题费了很多时间,要好好重新学习一下 Apollo的官方文档还需要再仔细阅读,有问题多查issue,因为可能有人已经遇到了 多读读源码,真正的体会大牛的软件设计思想

2019-07-01 ·  (🌟Updated: 2019-07-01) · 1 min · 70 words · tomyli