2019-07-15 22:40:13    4    0    0

最近因为一点兴趣接触了一下Vue这个框架, 好用是很好用, 官方自带中文文档, 讲的也挺好, 就是有一个地方难受了我很久……

[Vue warn]: Property or method "handleAvatarSuccess" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.
found in
---> at src/components/VideoItem.vue
at packages/form/src/form.vue
at packages/container/src/main.vue
at src/components/SceneShow.vue
at packages/main/src/main.vue
at packages/container/src/main.vue... (1 recursive calls)
at src/components/HelloWorld.vue
at src/App.vue

报这个错的原因是什么呢?

先不着急, 我们仔细看看一个.vue 文件的script标签里, 有什么呢?

有data(),computed(),props(),methods()……

methods()!

methods()!

Java    2019-07-15 17:29:40    4    0    0

最近面试被一位牛逼的面试官吊起来打了……

记录一下其中一道题目, 当时虽然想象出结果了, 但是不敢确定。

最近终于停下来了一会, 又想起来这道题目, 干脆用代码来证明一下自己的想法确实没有错。

  1. public class VideoApplicationTest {
  2. private volatile int count = 5;
  3. @Test
  4. public void testReentrant() {
  5. Runnable syncTask = this::reentrantSyncFunc;
  6. ExecutorService executorService = Executors.newFixedThreadPool(10);
  7. for (int i = 0; i < 3; i++)
  8. executorService.execute(syncTask);
  9. }
  10. public synchronized void reentrantSyncFunc() {
  11. count--;
  12. if (count > 0) {
  13. System.out.println("currentThread: " + Thread.currentThread().getName());
  14. System.out.println("currentCount: " + count);
  15. System.out.println(Thread.currentThread().getName() + " continue");
  16. reentrantSyncFunc();
  17. } else {
  18. System.out.println("currentThread: " + Thread.currentThread().getName());
  19. System.out.println("currentCount: " + count);
Java 设计模式    2019-05-06 17:46:52    7    0    0

单例模式

单例模式算是最简单的一种设计模式了。

基本上所有讲设计模式的文章或者博客都会把他放到最前面。

虽然这种模式最简单, 但是很多地方都能够用到, 比如说曾经风靡于各个博客公众号和各类管理系统的Shiro框架, 有经典的 Spring, 都广泛的使用了单例模式。

这篇文章, 将会按照是什么, 为什么, 怎么做来讲解单例模式。

什么是单例模式

单例模式的定义是什么呢?

引用自 Wikipedia - 单例模式 :

单例模式, 也叫单子模式, 是一种常用的软件设计模式。在应用这个模式时, 单例对象的类必须保证只有一个实例存在。

为什么是单例模式

同样引用自 Wikipedia - 单例模式, 单例模式的作用 :

许多时候整个系统只需要拥有一个的全局对象, 这样有利于我们协调系统整体的行为。比如在某个服务器程序中, 该服务器的配置信息存放在一个文件中, 这些配置数据由一个单例对象统一读取, 然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

怎么做出一个单例

1.抽象类

最简单粗暴的方式, 利用JVM的类加载原理, 写一个抽象类, 这个类是天然单例, 且一定能保证在JVM的生命周期内是单例。

这种方式最常用在需要全局唯一的工具类中, 如ShiroSecurityUtil

  1. public abstract class Singleton {
  2. public static Object doSomething(){
  3. // doSomething...
  4. }
  5. }

2.使用final关键字

参考Wikipedia - 单例模式 Java 实现

又名饿汉模式

这种方法的好处在于我们不需要担心单例类无意间被继承而失去全局唯一的特性, 同时还可以自由的在单例中添加非静态方法。

  1. public class Singleton {
  2. pri
Java    2019-05-06 14:36:38    4    0    0

Java到底是值传递还是引用传递

目录:


我第一次见到这个问题其实应该追溯到当年在培训机构的时候,讲师的一句话。

在这之后很长一段时间我都没有怎么去深究这方面的问题。

后来有一天很偶然的想起来有这么一件事情, 就顺手查了一下 StackOverflow, Wikipedia 和知乎。

引用传递还是值传递

Wikipedia:

Wikipedia 上求值策略词条关于传值调用的描述:

传值调用(Call by value)

"传值调用"求值是最常见的求值策略, C和Scheme这样差异巨大的语言都在使用。在传值调用中实际参数被求值,其值被绑定到函数中对应的变量上(通常是把值复制到新内存区域)。如果函数或过程能把值赋给它的形式参数, 则被赋值的只是局部拷贝——就是说, 在函数返回后调用者作用域里的曾传给函数的任何东西都不会变。

传值调用不是一个单一的求值策略, 而是指一类函数的实参在被传给函数之前就被求值的求值策略。尽管很多使用传值调用的编程语言(如Common Lisp、Eiffel、Java)从左至右的求值函数的实际参数,某些语言(比如OCaml)从右至左的求值函数和它们的实际参数, 而另一些语言(比如Scheme和C)未指定这种次序(尽管它们保证顺序一致性)。

Wikipedia 上求值策略词条关于传引用调用的描述:

传引用调用(Call by reference)

在"传引用调用"求值中, 传递给函数的是它的实际参数的隐式引用而不是实参的拷贝。通常函数能够修改这些参数(比如赋值), 而且改变对于调用者是可见的。因此传引用调用提供了一种调用者和函数交换数据的方法。传引用调用的语言中追踪函数调用的副

Java JWT    2019-04-28 14:36:00    6    0    0

手写一个 Java JWT

第一次正式听说 JWT 是因为某个不记得名字的公众号推的一篇文章 - 《讲真, 别再使用JWT了!》

在这之前我虽然知道 OAuth2, 但却不知道这种携带 token 进行校验的方式有一个这么正经的名字 - Json Web Token(简称JWT)

JWT的官方网站: jwt.io

非常简洁, 就像这套标准的思想一样简洁。

祖师爷赏饭, 自然是要发扬吃饱了就要造轮子的精神, 自己手动实现一个 Java 版的 JWT

惊不惊喜,意不意外

再说一个更惊喜更意外的事情——

我手头排了一堆想做的事情,等轮到这个项目都不知道什么时候了哈哈哈

����

Nginx Linux Shell    2019-04-24 09:24:07    13    0    0

Nginx 一键安装脚本(附带部分官方文档说明)

本脚本参考 Nginx官方文档 - installing-nginx-open-source

参考了一些别人的安装教程

脚本包含:
* prebuilt 包的 yum 安装
* source 包的编译安装
* 通过 wget, make, make install 安装编译依赖
* 通过 yum 升级编译依赖
* 包含自己常用的 Nginx module: core, http_ssl_module, stream, stream_ssl_module, mail, mail_ssl, file-aio, http_v2_module, threads
* 每一个步骤的相关注释
* 其他 module 功能的相关注释

编译 Nginx 需要的相关依赖: pcre, zlib, openssl

  1. #!/bin/bash
  2. # 参考 https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/
  3. # 注册成为系统服务部分参考 https://www.jianshu.com/p/79059b06a121
  4. # Nginx其他模块参考 https://segmentfault.com/a/1190000002797601
  5. echo -e "install prebuilt nginx from yum?[y/n]: \c"
  6. read _INSTALL_FROM_YUM
  7. if [[ "y" == "${_INSTALL_FROM_YUM}" ]]; then
  8. # Install the prerequisites:
  9. # 安装依赖
  10. yum -y install yum-utils
  11. # To set up the yum repository, create the file named /etc/yum.repos.d/
2019-04-19 13:55:53    7    0    0

关于接下来个人笔记和博客的几个想法

最开始想到使用笔记和博客,其实是因为看到许多人,包括一些大牛们,都会在GitHub,简书,CSDN,开源中国,或者自建博客中分享自己的知识,技能和看法。另一方面也是为了记录一些自己的工作上遇到的瓶颈,遇到的问题,以及生活中的点点滴滴,聊以自娱。

于是就有了目前的这个笔记博客平台 - leanote

这个平台是一个基于Go语言的,结合了笔记和博客功能的一套开箱即用的笔记框架。但是这个框架给我感觉像是一个半成品,不够成熟,也不够精巧,它太大太泛了。

因此,在后面的时间里,这个笔记或博客的底层可能会有所改变。
比如说:
1. 可以直接部署在 GitHub 上的 平台 - Jekyll
2. 基于 Python 语言和 Django 框架的博客框架。

最终我的目标是希望能够做出一个自研的博客平台。
毕竟枯燥的学习也挺累的,咱们总要找点有意思的事情做不是吗;)

zookeeper Linux 分布式 分布式锁 注册中心    2019-04-18 17:36:02    8    0    0

关于 zookeeper 包下载的一个坑

zookeeper 作为目前来说工作常用, 面试常考的注册中心分布式锁来说已经变成一项必须要掌握的技能。所以在自己电脑上装一个 zookeeper, 平时没事的时候捣鼓一下是很有必要的。

但是!

zookeeper 的安装包下载是个大坑啊。

GitHub 上 zookeeper 项目 release 页的包是 不可以 直接下载下来用的。用 Maven 打包也行不通, zkServer 子项目配置文件读取一个 git 配置时错误。估计还要下载一个git才行。

错误的示范:

  1. 打开GitHub - zookeeper - release页
  2. 下载合适的版本
  3. 解压 tar
  4. 复制并修改zoo.cfg配置文件
  5. 运行 zookeeper ./bin/zkServer start
  6. 报错啦~>_<~
  1. ZooKeeper JMX enabled by default
  2. Using config: /data/woke/zookeeper-release-3.4.14/bin/../conf/zoo.cfg
  3. Starting zookeeper ... STARTED
  4. # 查看错误日志
  5. less zookeeper.out
  6. Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain

2019.04.25 更新

GitHub - zookeeper - release页 下载所需版本的 tar包后, 进入Maven 中央仓库下载对应版本的jar包到解压后的目录中, 再运行 bin/zkServer start 似乎也可以

2019.04.29 更新

从别的地方又看到一个办法, 从这里http://archive.apache.org/dist/zookeeper/下载tar

正确的打开方式:

  1. 打开Apache ZooKeeper 官网, 点击 Apache ZooKeeper™ Releases 下的 Download 按钮
  2. 找到合适的版本开始下载
  1. #
2019-04-04 13:43:59    9    0    0

Maven私服踩坑录

辛辛苦苦干了几个月,项目终于要发布第一个版本了,感觉自己牛逼哄哄的啊。

推送 git,打好 tag, 配置 Jenkins,立即构建,Build Success,老子横空出世。

打开 Xshell,连接服务器,

打开 postman,写好参数,Send!

  1. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jacksonUtil': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.nsw.report.util.baidutongji.JacksonUtil] from ClassLoader [org.springframework.boot.loader.LaunchedURLClassLoader@20ad9418]
  2. at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:265) ~[spring-beans-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
  3. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1236) ~[spring-beans-5.1.3.RELEASE.jar!/:5.1.3.RELEASE]
Linux DNS    2019-04-04 11:42:07    8    0    0

访问百度域名UnknownHost

百度这么叼, 也会有域名无法访问的时候?

最近就碰上这个事情了, 调用百度的 Http API, 结果报了个 UnknownHostException 异常。

  1. java.net.UnknownHostException: api.baidu.com: unknown error
  2. at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_101]
  3. at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) ~[na:1.8.0_101]
  4. at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) ~[na:1.8.0_101]
  5. at java.net.InetAddress.getAllByName0(InetAddress.java:1276) ~[na:1.8.0_101]
  6. at java.net.InetAddress.getAllByName(InetAddress.java:1192) ~[na:1.8.0_101]
  7. at java.net.InetAddress.getAllByName(InetAddress.java:1126) ~[na:1.8.0_101]
  8. at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45) ~[httpclient-4.5.6.jar!/:4.5.6]
  9. at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java
1/2