2022 Beijing

三年,北京

2020,疫情之初,迎接了新的工作,新的挑战

转眼三年了。

如今要回去了。

好像终于有空,回来看看曾经在做的东西,曾经的想法

记录于此。。

Photo

在Ubuntu18下adb连接不上android手机的解决方案

不多bb,直接上解决方案:
谷歌提供的方法

1.修改/etc/udev/rules.d/51-android.rules的方法:

在该文件下添加(如无则自己创建)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"

这样做是让adb对usb设备具有访问权限,但是完全可以sudo adb devices

2.通过上面办法还是不能识别adb,说明安卓的VID没有添加到adb中,需要手动添加

添加的文件位置与你第一次启动adb server有关,如你在root上启动adb server,则其位置在/root/.android/adb_usb.ini,否则其位置在$HOME/.android/adb_usb.ini下,如果$HOME为空,则在/tmp/.android/adb_usb.ini

我三个地方都没有找到,就在$HOME/.android/下创建了文件

获取VID方法是插上设备敲lsusb,拔下设备敲lsusb
单独的那个类似Bus 001 Device 034: ID 2006:5010就是插入的设备,VID为2006

adb_usb.ini中加入0x2006保存,然后adb kill-server杀掉adb重新启动即可

最全的Java笔试题库之选择题篇-(1-60)(转载)

1-60

1. 下面中哪两个可以在A的子类中使用:( )

1
2
3
4
5
class A {
protected int method1 (int a, int b) {
return 0;
}
}

A. public int method 1 (int a, int b) { return 0; }
B. private int method1 (int a, int b) { return 0; }
C. private int method1 (int a, long b) { return 0; }
D. public short method1 (int a, int b) { return 0; }

解答:AC
主要考查子类重写父类的方法的原则
B,子类重写父类的方法,访问权限不能降低
C,属于重载
D,子类重写父类的方法 返回值类型要相同或是父类方法返回值类型的子类

Read More

elementUI 表格 获取数据后this.$refs.xxx.toggleRowSelection无效

使用elementUI构建样式界面时,有一个跨页多选数据的需求,尝试在跳转其他页后根据已存的数据来判断是否已勾选
官网有一个toggleRowSelection(row,selection)方法
按着elementUI官网给出的示例一直不能触发toggleRowSelection
根据网上给出的解决办法

  • 获取数据后在需要进行勾选操作的外面套一个$nextTick即可
1
2
3
4
5
this.$nextTick(() => {
this.deviceTableData.map((v) => {
this.$refs.deviceTable.toggleRowSelection(v, true))
}
})

原因是:

$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM

暂时还没有搞懂

2018

学校

spring boot整合mybatis查询数据库返回Map字段为空不返回

在实际开发中遇到了使用resultMap返回数据时,表里数据为null就不返回该字段,对于前端一些组件的数据绑定来说不太方便
解决方法:

  • 在spring boot整合mybatis中,可以加入
1
2
3
mybatis:
configuration:
call-setters-on-nulls: true

即可

  • 如果只使用mybatis,可以在mybatis-config.xml中加入
1
2
3
4
<settings>  
<setting name="cacheEnabled" value="true"/>
<setting name="callSettersOnNulls" value="true"/>
</settings>
  • 在spring和mybatis环境下,可以配置来引入上面的配置
1
2
3
4
5
6
7
8
9
10
11
12
<bean id="saasSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="saasDataSource" />
<!-- 实体对象 -->
<property name="typeAliasesPackage" value="com.nicchagil.mybatis3spring3intg.bean" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations">
<list>
<value>classpath*:com/acs/saasdb/*/mapper/*Mapper.xml</value>
</list>
</property>
<property name="configLocation" value="classpath:/spring/mybatis-config.xml"></property>
</bean>

mybatis报错invalid comparison java.util.Date and java.lang.String

在实际开发中遇到需要进行时间筛选的情况,mapper文件片段如下

1
2
3
4
5
6
<if test="beginTime!=null and beginTime!=''">
<![CDATA[and DATE_FORMAT(A.begin_time, '%Y-%m-%d %H:%T:%s') >= DATE_FORMAT(#{beginTime}, '%Y-%m-%d %H:%T:%s')]]>
</if>
<if test="endTime!=null and endTime!=''">
<![CDATA[and DATE_FORMAT(A.end_time, '%Y-%m-%d %H:%T:%s') <= DATE_FORMAT(#{endTime}, '%Y-%m-%d %H:%T:%s')]]>
</if>

结果抛出如标题所示的错误

1
invalid comparison java.util.Date and java.lang.String

查了一下大概是因为

mybatis 3.3.0中对于时间参数进行比较时的一个bug. 如果拿传入的时间类型参数与空字符串进行对比判断会引发异常

然后把代码改为

1
2
3
4
5
6
<if test="beginTime!=null">
<![CDATA[and DATE_FORMAT(A.begin_time, '%Y-%m-%d %H:%T:%s') >= DATE_FORMAT(#{beginTime}, '%Y-%m-%d %H:%T:%s')]]>
</if>
<if test="endTime!=null">
<![CDATA[and DATE_FORMAT(A.end_time, '%Y-%m-%d %H:%T:%s') <= DATE_FORMAT(#{endTime}, '%Y-%m-%d %H:%T:%s')]]>
</if>

即可

前端学习汇总导航

做一个前端知识库的导航,把学过/看过/自己写的东西记录在这里

前端

浏览器回流(reflow)与重绘(repaint)

回流(reflow)与重绘(repaint)


script标签中的deferasync

defer和async的区别


Js高程笔记

JavaScript高级程序设计笔记

类型检测

  1. typeof操作符并不可靠,在判断引用类型如[],{},function(){}以及null的返回值都是object
  2. 对于instanceof来说,也存在不可靠的情况,它存在多个全局作用域,比如一个页面包含多个iframe
    var isArray = value instanceof Array看起来可以检测是否为数组,但是如果value是在另一个frame中定义的数组,则isArrayfalse
  3. 最好的解决办法利用Object原生的toString方法,例子如下
    1
    2
    3
       function isArray(value) {
    return Object.prototype.toString.call(value) === '[object Array]'
    }
  4. 但是使用toString检测非原生构造函数时都将返回[object Object]
  5. 所以可以利用这里来判断是否是原生的JSON
    1
    var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON) == "[object JSON]"

防篡改对象

不可扩展对象

  • 使用Object.preventExtensions(object)来阻止object增加其他属性和方法

密封的对象

  • 使用Object,seal(object)来保护object对象属性不可被添加和删除

JS事件循环/宏任务/微任务理解

JS事件循环/宏任务/微任务理解

前段时间做了一道题,涉及到异步的执行,事件的处理,早期也只是粗略看过一些,没有详细去学习,导致做错了:( 现在来好好学一学

1.前言

当时的题目是:

1
2
3
4
5
6
7
console.log('start')
var temp = true
setTimeout(() => {
temp = false
}, 1000)
while(temp){}
console.log('end')

问:end会不会输出,为什么?

我的回答是会,当时的想法是JS执行完同步任务之后,处理异步任务,能够跳出while循环,然后打印end

结果是错的!

下面学习下JS对于事件的处理机制,学习自JS事件循环机制(event loop)之宏任务/微任务

2.学习

事件处理

2.1 JS对于同步任务的处理

  • 同步任务直接进入主线程运行

2.2 JS对于异步任务的处理

  • 异步任务进入Event Table并注册回调函数
  • 指定事件完成时,将函数移入Event Queue
  • 当主线程的任务执行完毕后,会从Event Queue读取对应的函数,进入主线程

2.3 上述过程的重复执行构成了事件循环机制

3.反思

回过头来看,同步任务while进入主线程执行后并不会空闲,导致并不能从Event Queue中读取任务来执行,所以并不会打印end

4.更多

更细致的来看微任务(MicroTask)、宏任务(MacroTask)的概念

宏任务/微任务

emmmm.反正没人看,有空了接着记录一下