最近些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

记得三年前用Selenium写过自动测试,只不过当时用的LocalWebDriver,必须要在本地先安装浏览器(WebDriver)才可以。最近一个偶然的机会,要做一个爬虫网站的评估,所以就重新调查了一下。意外的发现原来有RemoteWebDriver这么便利的东西。通过搭建一个RemoteWebDriver,就可以替代本地的WebDriver,而且,搭建RemoteWebDriver也是异常的简单。搭建RemoteWebDriver主要有两种方法: 搭建好了RemoteWebDriver服务器以后,怎么连接进行测试了,下面有一段示例代码: 参考文章:https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a

Read More

事到如今,对于基础的git command还是掌握的不够透彻。说来也是十分惭愧。 讲一下git rebase -i 的利用场景。如果我想把自己的feature branch rebase到最新的master。然后feature branch有很多commit,然后跟master还有conflict的话,rebase的操作将会变得十分漫长。因为需要解决多次conflict的问题。 为了避免这种情况,我们可以通过rebase -i,把多次commit汇总成一个,这样,merge只需要进行一次就OK了。 使用方法如下: 首先git log –oneline确认base commit git rebase -i xxxx(commit number) 打开vim editorpick最顶端的commit,下面的commit s掉。 保存退出

Read More

使用ec2搭建的springboot的服务,偶尔会碰到一些问题,导致service挂掉。为了保证服务的可持续性,打算使用cloudwatch+lambda自动监视,实现service的自动重启。 cloudwatch,主要用来监视,报警,可以设置为5分钟内healthcheck ng的情况下,报警到sns。然后sns的通知,又可以是lambda的trigger。这样就可以让lambda去重启server了。

Read More

上次说了几个使用DI为前提的情况下的测试速度优化方案。这里想再总结下怎么通过不使用DI(Standalone模式)去进行测试。 然后这次总结的主要是Repository层面的Standalone模式的测试。需要实现Standalone模式,主要需要解决这么几个问题: 创建DataSource 创建EntityManager 创建DSLContext(如果使用了jooq) 实例化JpaRepository 创建DataSource可以参考下面这段代码,当然最好这些property可以从spring的配置文件里读取。 创建EntityManager的话,主要有两种方式,一种是带transacation的: 还有一种是不带transacation的: DSLContext的话,像下面这种方法比较简单: 最后,如果你使用了JpaRepository,那么就需要对它实例化才能使用: 在我的项目中,因为还使用了Customize的JpaRepository,所以这里还有另外一种写法:

Read More

最近有个项目,需要对接把系统的master数据同步到salesforce。第一次接触salesforce,认证这块儿也不是特别懂。查阅了官方的文档,因为这次对接是服务器到服务器端,最后发现有下面两种方式可以采用: Username-Password Flow Server-toServer Flow Username-Password Flow的话,实现起来比较简单,像下面这样指定grant_type=password类型,然后附上其他相关参数就能获得sessionId,后面的通信中,在header 里设置 Authorization: Bearer sessionId就OK了。但是,这个方式虽然简单,官方当前已经不推荐了。因为把账号密码放在get request的parameter中的做法实在是风险太大了。万一泄漏,整个salesforce账号都很危险。 所以,最后还是决定使用更安全的Server-to-Server Flow。这个用法相对来说也更加复杂一些。具体实现大概有这么几个步骤: 1. 创建并上传签名证书 创建电子签名,主要需要以下几个步骤:– 创建密钥– 创建公钥– 创建证书以上都可以通过openssl命令实现: 密钥的话,需要自己保存,只有自己有权限。打开文件的话,可以看到 —–BEGIN RSA PRIVATE KEY—–

Read More
Close Bitnami banner
Bitnami