Parameter type must not include a type variable or wildcard: java.util.Map<java.lang.String, ? extends okhttp3.RequestBody> (parameter #1)

Android (kotlin 开发) 应用访问接口,出现如下错误:

1
2
java.lang.IllegalArgumentException: Parameter type must not include a type variable or wildcard: java.util.Map<java.lang.String, ? extends okhttp3.RequestBody> (parameter #1)
for method StoryService.addStory

接口:

1
2
3
@Multipart
@POST("story")
fun addStory(@PartMap params: Map<String, RequestBody>): Call<Story>

解决办法,在 RequestBody 前添加注解 @JvmSuppressWildcards

1
2
3
@Multipart
@POST("story")
fun addStory(@PartMap params: Map<String, @JvmSuppressWildcards RequestBody>): Call<Story>

参考:

https://stackoverflow.com/questions/45785874/multipart-request-with-retrofit-partmap-error-in-kotlin-android

widget has an unresolved type,and thus it was upcasted to android.view.View

使用 KotlinView Binding 来绑定 View, 对于框架提供的控件没有任何问题,但是对自定义控件会出现如下错误:

比如,有自定义控件 com.example.customText

xx.xml

1
2
3
4
<com.example.customText
adnroid:id='@+id/custom_text'
...
/>

如果直接使用

1
custom_text.text = 'Hello'

会有如下错误

1
widget has an unresolved type 'com.example.customText',and thus it was upcasted to 'android.view.View'

需要先做类型转换:

1
2
val customtext as customText
customtext.text = 'Hello'

Laravel timestamp

博客数据库中有个 published_at 字段,主要是为了实现延迟发布的功能,但发现每次查看博文时,published_at 都会自动更新,打开博文时,唯一做的更新操作是为了统计浏览量: $post->increment('view_count',1);, SQL 如下:

1
update `posts` set `view_count` = `view_count` + 1, `updated_at` = '2017-08-17 18:30:33' where `id` = '1' and `posts`.`deleted_at` is null

并没有做更新 published_at 的操作呀?

后来去数据库查看字段设置,发现 published_at 默认勾选了 根据当前时间戳更新,而 created_atupdate_at 却默认没有勾选根据当前时间戳更新,而 created_atupdate_at 是同过 $this->timestamps() 生成的,于是查看 timestamps() 源码:

1
2
3
4
5
6
public function timestamps()
{
$this->timestamp('created_at')->nullable();

$this->timestamp('updated_at')->nullable();
}

原来这俩个字段默认设置允许为空,而我建立数据表是这样写的$table->timestamp('published_at'); ,默认不为空,于是做修改 $this->timestamp('published_at')->nullable(); ,解决问题。

可知, MySQL 中,timestamp 类型的字段,如果不允许为空,那么 mysql 会自动维护,所有的更新操作都会引起该字段值的改变。

Leaning Linux:包管理

打包格式和工具:

操作系统 格式 工具
Debian .deb apt, apt-cache, apt-get, dpkg
Ubuntu .deb apt, apt-cache, apt-get, dpkg
CentOS .rpm yum
Fedora .rpm dnf
FreeBSD Ports, txz make, pkg

更新包列表:

系统 命令
Debian / Ubuntu sudo apt-get update
sudo apt update
CentOS yum check-update
Fedora dnf check-update
FreeBSD Packages sudo pkg update
FreeBSD Ports sudo portsnap fetch update

更新已安装的包:

系统 命令 说明
Debian / Ubuntu sudo apt-get upgrade 只更新已安装的包
sudo apt-get dist-upgrade 可能会增加或删除包以满足新的依赖
sudo apt upgrade 同 apt-get upgrade
sduo apt full-upgrade 同 apt-get dist-upgrade
CentOS sudo yum update
Fedora sudo dnf upgrade
FreeBSD Packages sudo pkg upgrade
FreeBSD Ports less /usr/ports/UPDATING 使用 less 来查看 ports 的更新提示(使用上下光标键滚动,按 q 退出)
cd /usr/ports/ports-mgmt/portmaster && sudo make install && sudo portmaster -a 安装 portmaster 然后使用它更新已安装的 ports

搜索某个包:

系统 命令 说明
Debian / Ubuntu apt-cache search search_string
apt search search_string
CentOS yum search search_string
yum search all search_string 搜索所有的字段,包括描述
Fedora dnf search search_string
dnf search all search_string
FreeBSD Packages pkg search search_string
pkg search -f search_string
pkg search -D search_string
FreeBSD Ports cd /usr/ports && make search name=package
cd /usr/ports && make search key=search_string

查看某个软件包的信息:

系统 命令 说明
Debian / Ubuntu apt-cache show package 显示有关报的本地缓存信息
apt show package
dpkg -s package 显示包的当前安装状态
CentOS yum info package
yum deeplist package 列出包的依赖
Fedora dnf info package
dnf repoquery –requires package 列出包的依赖
FreeBSD Packages pkg info package 显示已安装的包的信息
FreeBSD Ports cd /usr/ports/category/port && cat pkg-descr

安装:

install

删除一个或多个已安装的包:

系统 命令 说明
Debian / Ubuntu sudo apt-get remove package
sudo apt remove package
sudo apt-get autoremove
CentOS sudo yum remove package
Fedora sudo dnf erase package
FreeBSD Packages sudo pkg delete package
sudo pkg autoremove
FreeBSD Ports sudo pkg delete package
cd /usr/ports/path_to_port && make deinstall