最近些Vue的时候碰到的一个小问题,下面这段示例代码,obj的hideField,当状态更新时,画面显示并不会更新。刚开始并不知道,后来从Vue的官方文档上也看到了解说。如果是动态追加的property,是不会自动更新状态的。 参考URL: https://jp.vuejs.org/v2/guide/reactivity.html

Read More

Selenium 最常见也是功能比较全面的爬虫工具,网上有很多使用Python+Selenium的教程,都比较言简易懂。我最初接触Selenium是用来做测试,因为有自动截图的功能,跑完每个case以后,自动截图保存一下,回头可以人工再确认,特别方便。然后Selenium还有RemoteWebDriver,可以把Selenium作为一个microservice部署到其他服务器,实现分布式。当然,Selenium最大的优点是,最接近浏览器操作,很多网站会有反爬虫的机制,Selenium可以绕过大部分(像看图填数字之类的可能还比较困难)。 Jsoup 最近碰到Selenium无法解决的一个问题就是文件下载,尤其是RemoteWebDriver的时候,下载文件特别费劲。Jsoup是一个比较简单好用的通信库,对于爬虫检查不是很严格的网站,都可以用它来获取。 HtmlUnit 个人认为介于Selenium和Jsoup之间。比Jsoup稍微更接近native的浏览器。

Read More

在系统不是特别复杂的前提下,合理的使用Spring JPA确实是挺方便的。尤其是使用repository接口,对于一些简单的sql,只需要把method名字写好,在启动程序的时候Spring就会帮你做check,测试都能省掉。但是,Spring JPA方便归方便,如果你不能准确的把握其中的细节,系统到后面数据躲起来,性能上是要大打折扣的。所以,只有准确的把握Spring JPA的编程陷阱,并且熟知他们的解决方案,才能更好的发挥Spring JPA的功效。 之前也总结过几篇JPA的编程陷阱。这次我想说一下如何N+1问题。 何为N+1问题?简单的说,就是我们想通过查询取N条数据的时候,这里面存在表间关系,理想情况下我们只需要通过JOIN就能通过1次SQL文的查询实现。但是,如果你把这个事情交给JPA去做的话,在某些情况下,需要执行N+1次SQL的查询才能取到结果。 例: 假设有这样的两个表 然后,有这么两个UserRepository。 首先UserRepository,这种情况下JPA其实是是会帮你去做inner join把user_category的信息也取出来的。但是,UserCategoryRepository的findByName的话,因为是被动的关联关系,JPA是不会inner join去取的。这种情况就会发生N+1。 除去上面这种情况,还有就是下面这样的例子: 我自己写了一段JPQL的语句,想通过自定义的查询语句去查询user表。那么,上面这种写法也肯定会发生N+1问题。 具体N+1问题怎么去解决。JPA提供了一个方案就是使用FETCH JOIN。前面那个JPARepository的接口需要自己写SQL语句。后面entityManager的例子我们实际来看一下: 写法其实很简单,但是注意这里写的是JOIN FETCH,跟native SQL的JOIN是不一样的。具体关于JPQL的写法,可以查看官方文档。 以上就是对JPA N+1问题的解读,希望以后可以更高效的使用JPA。 https://www.logicbig.com/tutorials/java-ee-tutorial/jpa/fetch-join.html

Read More

这次想说一下自定义组件的赋值问题。为了在画面中使用日期选择,导入了vue-calendar,示例代码如下: 因为需要使用的地方有多处,所以打算把它做成一个自定义组件。 然后,在view界面就可以通过下面的方式使用了: 这里说一下,component 里面,为什么要把value和dateValue分开,因为给component赋值的时候,只能通过props进行赋值。如果赋值完需要更新的话,就必须使用data或者compute进行绑定。不然的话,就会爆出下面的错误: 上面的组件的写法,可以实现父到子之间的赋值传递,但是子组件里的值改变的时候,不会跟父组件进行联动。为了实现子组件到组件的赋值联动,还需要加上下面这么一段: 子组件的值改变的时候,通过watch检测出来,然后执行 this.$emit(‘input’, val), 这段代码需要解释一下,下面两种方式作用其实是相同的。 在子组件执行 this.$emit(‘input’, val) ,其实是触发了父组件的input event。这样就可以把值传递会去了。 所以,总结一下就是,父→子之间通过props进行传值,然后子→父通过$emit进行传值。最后,完整的示例代码如下: 参考文章:https://jp.vuejs.org/v2/guide/components-custom-events.htmlhttps://vcalendar.io/datepicker.htmlhttps://recruit.cct-inc.co.jp/tecblog/vue-js/vue-emit-props/

Read More

最近碰到一个对我来说挺棘手的问题的。因为自己本来就是网络知识相对薄弱,花了好久才解决掉,所以就想着一定要好好记录下来。大概就是有两个不同的VPC,然后现在有一个新开发的Batch,需要同时访问这两个VPC内的数据库服务器。简单画了一个网络图: 目的就是为了实现instance A和B之间的通信。刚开始的时候,为了不搞的那么复杂,我把instance 改为了global access available,但是不太好用。调查了一下原因是amazon进行域名解析的时候,会把instance B的域名解析为内网地址。 当然,如果不写域名,直接写域名解析后的global ip address的话,是可以进行访问的。但是因为没有申请static global ip,所以可能会出现重启服务器以后ip变化的情况。还是必须考虑如何在两个VPC之间进行通信。查阅了一下,两个VPC之间通信的话,大概有三种方式: VPC Peering Transit Gateway VPN 这次,采用了相对简单的VPC Peering。大致的设置步骤如下: 创建VPC Peering Connection 修改Route Table这篇文章(https://qiita.com/yuppi/items/fe540e4e05920294a41c)里面讲述的很清楚 需要注意的点主要有两个:

Read More
Close Bitnami banner
Bitnami