Latest Linux Distributions on LattePanda and Kernel Customization

前言 Preface

原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正。从此以后,尽量使用双语,英语水平有限,贻笑大方,万事开头难。

有时候买到心仪的东西,特别盼着早点到货,然后隔一会就去打开手机客户端刷新一下查看快递信息,时间久了浪费生命,所以想着用电脑帮我查,有变动告诉我。

[TOC]

软硬件环境:

LattePanda、Python3.8、Arduino 18.12、Lubuntu 20.04。

本项目将分为三个部分:

Latest Linux Distributions on LattePanda and Kernel Customization | 为LattePanda安装Ubuntu 20.04并重新编译优化内核

Core Code to Track the Packages | 包裹监视追踪项目的核心代码

Additional Features like Tracking People with Wifi Using Kismet | 额外功能例如识别人在旁边时的智能化动作

本项目预计实现以下功能Features:

网页前端添加待监视信息

查询的所有快递历史记录

自定义查询频率

快递信息变动时微信通知

人在家中时额外LED、Speaker、Dashboard等提醒

本项目后期准备添加以下功能TODO:

使用微信等添加待监视快递信息,或者小程序

添加中文语音播报

整合进Home Assisant Dashboard

最后可以了解到的知识包括:

Install and setup latest Ubuntu for LattePanda | 在LattePanda上安装配置最新版Ubuntu

Interaction  between MPU and MCU on LattePanda with Firmata protocol | LattePanda上Linux和Arduino使用Firmata协议进行交互

Python GUI Programming with remi | Python图形化编程(使用remi)

Usage of TinyDB——a lightweight database 破折号还是逗号?| 介绍轻量级数据库TinyDB的使用

Wechat notification via ServerChan | 使用Server酱实现微信通知功能

Tracking people with wifi using kismet | 使用Kismet识别人是否在旁边

Using Kismet REST-like API | 使用Kismet的API

Text To Speech with Python | 语音合成播报

Home Assistant | HA的一些整合与应用

本文为第一部分。看到社区的活动,觉得很有趣,加上有个Intel 和 DFRobot合办的活动,需要Intel CPU,我的是AMD CPU,也没有神经开发棒,然后拿出LattePanda(以下称胖哒) 作为可行性验证。基板准备用LattePanda v1,系统准备转成Linux,方便开发。安装Linux的过程中发现一些问题,本文分享相关经验。另外LattePanda Alpha / Delta 相关架构类似,一些内容也有参考价值。

1. 准备

为什么要使用Linux | Why do we prefer to use Linux

Linux可定制化更高,用来开发更熟悉。

选择Ubuntu还是Mint | Ubuntu or Mint: which one to choose?

Mint 最新版基于Ubuntu 18.04,pass。但不喜欢Ubuntu的Unity桌面,加上LattePanda性能捉襟见肘,所以我们选择使用比较轻量级的LXQt桌面(之前是LXDE,使用Qt重写)的Lubuntu,基于openbox,能看到遗留。感兴趣的也可以看看来自TW的LXQt开发者洪任諭醫師的一些介绍:一、二。

1.1 现状

通过网上冲浪可知,目前关于在LattePanda上运行Linux有以下信息:

Caution:

官方文档写着Official Supported Version: S70CR200 Version,但实际我的S70CR110也是可用。

mop讲的设置bios里的南桥相关,新版ubuntu里无需设置。

以上三个都有一个共同的特点:OUTDATED。我们需要更好的软硬件兼容性以及主流的Linux版本和内核支持。当然,从以上还是能获得一些有价值的信息,也就是我们需要解决的问题。

1.2 面临的问题

rtl8723bs wifi & bluetooth driver

HDMI audio output issue

Goodix touch panel dirver

PWM? 这个我暂时不知道啥问题

1.3 探索

为啥LattePanda有上述问题要解决呢,主要和胖哒采用的Intel Atom x5 z8350 CPU有关,其规格如下:

Intel Atom x5 z8350, (Code Name: Cherry Tail, Original Target: Lightweight tablets / High-end Smartphones. Microarchitectures: Airmont——the 14 nm die shrink of Silvermont, more info, Via), remember that there is no avx instruction set supported, therefore, recompile is need to run newer version of Tensorflow.

原来z8350设计用于Windows平板以及手机,并没有考虑Linux兼容性,所以有很多问题,特别是驱动上,总结起来有以下:

无线和蓝牙功能:使用RTL8723BS模块,SDIO接口,2.4GHz 802.11bgn,bt4.0,RealTek官网仅提供了Windows驱动

触摸屏:使用Goodix gt911 方案

甚至默认最大仅支持2GB内存,不过国内魔改支持4GB,但是据说内存带宽也减半。

202006294851..png (93.03 KB, 下载次数: 1)

2020-6-29 14:48 上传

在Linux Kernel 4.12之前,需要手动安装RTL8723BS模块的驱动,但是Since Linux 4.12, rtl8723bs has been merged,这就很像早几年在树莓派上使用小米随身wifi(mt7601u芯片),最初需要自己编译安装驱动,后来也合并到内核里开箱即用了,可以看到mop的内核还是4.11。

Caution:

LattePanda Delta 采用的Intel Celeron N4100同样不支持avx指令集,所以想要运行新版的Tensorflow,需要自行编译。参考《Tensorflow-Intel-Atom-CPU》

采用z8350的设备有很多,比如Lenovo Miix 310 和Chuwi Hi10 Pro,其中联想的miix310属于笔记本,更接近胖哒的使用情景。

参考链接:

1.4 发现

字里行间我们发现两个东西:Ian Morrison's isorespin.sh 和kernel_gcc_patch。

1.4.1 isorespin.sh

简而言之,就是使用Intel Bay Trail 和 Cherry Trail处理器的设备安装Linux会遇到一些兼容性问题,特别是HDMI输出、系统假死以及无线驱动,Linux 4.11 解决了HDMI音频输出和系统假死的问题,4.12解决了无线驱动的问题。而Ian Morrison(Linuxium)则更进一步,开发了isorespin.sh这个工具,可以制作适合上述CPU的带有Linux Mainline内核的新版Ubuntu ISO安装镜像。另外Ian也是 cnx-software网站的作者之一。——Via

我们使用该脚本来定制化Linux系统,而且作者有做好的最新系统镜像可供下载。目前支持自定义64bit Ubuntu、Ubuntu Flavoured、LinuxMint等等。

202006291895..png (225.34 KB, 下载次数: 1)

2020-6-29 14:48 上传

该脚本针对Intel Atom处理器做了如下改进:

Add a GRUB 32-bit bootloader to allow ISOs to boot on the many Intel Atom devices limited by their BIOS.

Add functionality to boot ISOs on any Intel Apollo device regardless of the BIOS settings.

Upgrade the kernel to the latest mainline version or to a specific version to benefit from recent patch functionality e.g. for audio and wifi/bluetooth or to use a rolling (HWE) kernel.

Add (or remove) repositories, software packages, scripts and files to allow the installation of firmware and favourite programs.

Preseed or perform set-up commands and scripts and also change system defaults and kernel boot parameters.

Add persistence so that the ISO can retain data, installed software packages and settings across reboots.

Create a server ISO that works on both 32-bit and 64-bit bootloaders found on various low cost Intel Atom mini PCs or one that works on the more recent Apollo and Gemini Lake mini PCs..

--atom include the flags, packages, scripts and commands that I recommend when respinning an ISO for a device with an Intel Atom (Bay Trail or Cherry Trail) processor and mirrors the manual invocations of  '-l rtl8723bX_4.12.0_amd64.deb -f linuxium-install-UCM-files.sh -f wrapper-linuxium-install-UCM-files.sh -f linuxium-install-broadcom-drivers.sh -f wrapper-linuxium-install-broadcom-drivers.sh -c wrapper-linuxium-install-UCM-files.sh -c wrapper-linuxium-install-broadcom-drivers.sh'.

遇着宝了,似乎我们的问题都可以一揽子解决,是否真的可以高枕无忧呢?这里下载Lunbutu 20.04 LTS Atom。

1.4.2 kernel_gcc_patch

项目主页 | Kernel patch enables gcc optimizations for additional CPUs.

由于Atom x5-8350和Celeron N4100相对性能比较低,操作系统默认会使用generic内核,着眼于兼容性普适性,就是安装好之后大多数的硬件都可以运行起来。所以我们可以针对性地重新编译内核,以期获得更高的性能。另外本项目也支持Celeron N4100 (Intel Goldmont Plus family of low-power Atom processors——Gemini Lake)。

202006292844..png (45.81 KB, 下载次数: 1)

2020-6-29 14:48 上传

注意这里是我理解错了,generic是实时性方面的东西,具体见参考链接所述

2. 整活

2.1 Install Lubuntu Customized for Cherry Trail CPU

制作安装U盘

我用balenaEtcher将作者ISO安装镜像烧录到U盘上,插上制作好的U盘(不支持从mSD卡启动),开机按ESC或者Del进入到bios,更改boot设置即可,忘记看是不是 默认U盘启动顺序最高了,大家可以试试。

可以从清华镜像站下载原版镜像以供定制。

硬盘分区

esp分区 | 必须要有,100MB就行,flag: boot

root分区,xfs文件系统,反正ext4不是emmc的最优解,后续还要改改默认调度模式

swap,根据内存大小,2-4G选择1:1即可。我这里4G。

插电!启动!

我是插HDMI连接显示器,不是用的MIPI接口的显示屏(以下称IGD, 内置图形显示),然后显示器上只有壁纸没有图标和任务栏,原来主输出跑到没连接的IGD上了。这整的真的是。。。盲开终端,然后输入sudo poweroff先关上机,然后插上显示屏和触控面板,发现触控面板没反应。

202006298275..png (320.69 KB, 下载次数: 1)

2020-6-29 14:48 上传

#### 2.2 Post-Installation Setup

好的,目前需要测试上面提到的问题以及解决HDMI输出和触控面板的问题。先插上专用IPS屏,设置HDMI为主输出,然后安装OpenSSH,我们通过MobaXterm连接到LP,具体可以参考我的文章《忘掉VNC/RDP,拿起手中的MobaXterm轻松上手远程桌面》。

选择Openbox desktop 是图形界面,默认的LXQt目前MobaXterm不支持,仅支持LXDE。

选择Interactive shell 是传统终端界面

202006292472..png (181.34 KB, 下载次数: 1)

2020-6-29 14:49 上传

安装必要的软件:

sudo apt install openssh-server tmux

2.2.1 测试无线、蓝牙、音频输出功能

我们下载的是作者为atom处理器制作的镜像,根据isorespin.sh使用介绍:

--atom include the flags, packages, scripts and commands that I recommend when respinning an ISO for a device with an Intel Atom (Bay Trail or Cherry Trail) processor and mirrors the manual invocations of  '-l rtl8723bX_4.12.0_amd64.deb -f linuxium-install-UCM-files.sh -f wrapper-linuxium-install-UCM-files.sh -f linuxium-install-broadcom-drivers.sh -f wrapper-linuxium-install-broadcom-drivers.sh -c wrapper-linuxium-install-UCM-files.sh -c wrapper-linuxium-install-broadcom-drivers.sh'.

也就是安装了rtl8723bs的无线蓝牙固件,注意有些是系统带驱动driver但是不带正确的固件firmware,也不能正确使用。增加了音频输出的UCM文件。

我们来测试一下:

202006291536..png (80.31 KB, 下载次数: 1)

2020-6-29 14:49 上传

蓝牙部分使用bluetoothctl,参考https://wiki.archlinux.org/index.php/Bluetooth#Console,成功连上了我的手机

202006296470..png (502.56 KB, 下载次数: 1)

2020-6-29 14:49 上传

无线部分可以用iwconfig、iw list等命令,可以看到该无线网卡支持``monitor模式,为我们下面使用kismet进行无线嗅探提供了硬件基础,关于无线网卡的介绍可以参考我的文章:UP Board USB无线网卡选购指南。

连接无线网络 CLI

了解一番发现使用的是networkmanager,图形化很好弄,CLI的话就是nmcli:

$ nmcli device status

DEVICE           TYPE      STATE         CONNECTION

wlx001f1fa92b87  wifi      connected     nww

wlan0            wifi      disconnected  --

$ nmcli device wifi list ifname wlan0

$ sudo nmcli device wifi connect nww password PASSWORD ifname wlan0

以上命令即可,注意改成你的无线网络名称SSID和密码。具体可以参考nm操作指南。

202006292338..png (135.61 KB, 下载次数: 1)

2020-6-29 14:49 上传

声音输出的话,LXQt桌面自带的任务栏右下角调节widget支持不好,使用的是pavucontrol进行控制,图形菜单栏里也有,实测HDMI音频输出和3.5mm都正常。

其他相关命令:

dmesg | grep XXX

lsmod | grep XXX

lshw

lsusb

lspci

2.2.2 默认输出设置为HDMI

这个很头疼,我是先用专用屏上去连无线网安装ssh server后从SSH里面暂时用。虽然进入桌面后手动更改主/副输出后,可以正常使用,但是重启还是一个样,所以干脆关闭IGD输出。

查看How to Disable Internal Display from BIOS?,官方说的BIOS->"Chipset"->"North Bridge"->"IGD - LCD Control"->"Force Lid Status"->"Off"没用,最后参考k3dAR的回帖解决: add kernel parameter: video=DSI-1:d

怎么做到的呢?查看archwiki的Kernel parameters页面:

sudo nano /etc/default/grub

# 在GRUB_CMDLINE_LINUX_DEFAULT这行处”前添加video=DSI-1:d

# 例如GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=cb38daad-4618-4b36-98de-1915abb168cf video=DSI-1:d"

# 重新生成grub.cfg文件

sudo grub-mkconfig -o /boot/grub/grub.cfg

# TODO:使用sed进行更改

重启生效,想要启用IGD,步骤同上,删除添加的那句话。如果我们想要生成默认关闭IGD的镜像,参考isorespin.sh的介绍,添加grub内容,生成iso镜像参数为isorespin.sh -i xxx.iso --atom -g "video=DSI-1:d"

2.2.3 解决触控面板驱动问题

安装之后主要功能正常,但是触摸屏不行,以为是我没插好,试了好几次都一样,使用xinput list命令没看到,使用dmesg | grep Goodix可以看到识别了一个设备,但是没有正确驱动;进系统使用lsmod goodix也有加载,怀疑是驱动不正确问题。

202006292379..png (649.22 KB, 下载次数: 1)

2020-6-29 14:49 上传

可以看到触控面板主控芯片为Goodix GT911

dmesg | grep goodix # 能识别到设备,但是有报错

lsmod # 我不记得输出什么样的,大家可以自己瞅瞅

xinput list # 识别不到Goodix Capacitive TouchScreen

参考以下内容,可以发现Goodix驱动确实存在问题。而且在Linux内核里能看到GT911相关内容,很困惑。

# 编译驱动

git clone https://gitlab.com/AdyaAdya/goodix-touchscreen-linux-driver

cd goodix-touchscreen-linux-driver

make

# 测试驱动(删除原驱动并加载刚编译的驱动),我这里成功

sudo su

rmmod goodix

insmod goodix.ko

# 安装驱动

xz goodix.ko

mv goodix.ko.xz /lib/modules/$(uname -r)/kernel/drivers/input/touchscreen/goodix.ko.xz

重启之后可用。

完整的debug命令:

$ dmesg | grep -i goodix

$ cat /proc/bus/input/devices | grep -B 1 -A 8 -i goodix

# libinput list-devices | grep -A 17 -i goodix

# libinput debug-events

$ xinput list

2.3 Recompile kernel to increase performance | 重新编译内核(待优化)

前文说过针对Atom X5 z8350重新编译内核,可以些许提高性能,现在就来实际操作一番。

sjqlwy@LattePanda:~$ uname -a

Linux LattePanda 5.6.8 #1 SMP Sat May 2 23:36:54 CST 2020 x86_64 x86_64 x86_64 GNU/Linux

sjqlwy@LattePanda:~$ cat /proc/version

Linux version 5.6.8 (sjqlwy@LattePanda) (gcc version 9.3.0 (Ubuntu 9.3.0-10ubuntu2)) #1 SMP Sat May 2 23:36:54 CST 2020

202006295293..png (49.93 KB, 下载次数: 1)

2020-6-29 14:49 上传

这是我在LattePanda上为它自己编译的内核,不带genetic字样。编译花了一个多小时?建议在其他性能更强的电脑上进行编译。

2.3.1 下载源码并打上补丁

打开Linux Kernel网站可以看到最新的Stable版是5.6.x,下载下来备用。建议阅读Linux内核版本介绍与查询。Ubuntu自带的内核讲究一个通用性,所以我们使用patch来针对z8350重新编译内核,以期获得更好的性能。好在已经有人做了,并且进行了日常维护,移步:kernel_gcc_patch。

CPU Family

GCC Optimization

Intel Silvermont family of low-power Atom processors

-march=silvermont

Intel Goldmont family of low-power Atom processors (Apollo Lake and Denverton)

-march=goldmont

Intel Goldmont Plus family of low-power Atom processors (Gemini Lake)

-march=goldmont-plus

教程使用silvermont,怎么没看到我们需要的Cherry Trail ,这些代码都是啥意思?查找Intel Atom的相关Wiki,了解到如下内容。

Cherry Trail、Apollo Lake、Gemini Lake等是Code Name开发代号

Silvermont、Goldmont、Airmont等是CPU微架构

微架构下又有子集,例如Airmont是Silvermont的子集,Goldmont Plus是的子集

Goldmont Plus——Gemini Lake——Celeron N4100(Mobile processors)

Airmont——Cherry Trail ——Atom X5 z8350(consumer SoCs aimed at tablets)

Airmont is the 14 nm die shrink of Silvermont(22 nm)

2.3.2 编译内核

这里我们下载enable_additional_cpu_optimizations_for_gcc_v9.1+_kernel_v5.5+.patch(5.6)放到Linux源码所在文件夹里。

This patch works with gcc versions 9.1+ and with kernel version 5.5+ and should

NOT be applied when compiling on older versions of gcc due to key name changes

of the march flags introduced with the version 4.9 release of gcc

如果使用Ubuntu 20.04则编译环境gcc版本、kernel版本都满足,否则需要进行设置

patch -p1 < PATCH_NAME.patch 会报错

sudo apt-get install gcc make libncurses5-dev libssl-dev bison flex libelf-dev

patch -Np1 -i /path/to/patch

make menuconfig

此时在 "Processor type and features -> Processor family"中可以选择 "Intel Silvermont family of low-power Atom processors (Silvermont)"了。

202006299673..png (206.59 KB, 下载次数: 1)

2020-6-29 14:49 上传

make -j4 bindeb-pkg # 编译内核,根据机器性能大约需要20m-2h不等

sudo dpkg -i linux*.deb # 安装编译好的内核,会自动设置grub

重启即可看到已经启用了新的内核。

参考:

2.3.3 番外1 升级gcc

上面讲到使用该补丁需要gcc 9.1以上,但是我在我的其他机器上(Ubuntu 18.04 LTS)可以看到默认安装的是gcc 7.5,这将导致安装失败。

ubuntu@VM-126-41-ubuntu:~$ gcc --version

gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0

你正在运行 Debian稳定版 因为你更偏好选择 Debian 稳定版分支。它运行得很好,但是只有一个问题:与其他发行版相比,它的软件有一点过时了。这便是 backports 出现的原因。

root@build-server:~# gcc --version

gcc (Ubuntu 9.3.0-11ubuntu0~18.04.1) 9.3.0

# Ubuntu 20.04 不存在该问题

sjqlwy@LattePanda:~$ gcc --version

gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0

2.3.4 番外2 阻止apt更改内核

我们运行apt upgrade时会提醒你安装generic内核,我们使用apt-mark命令来阻止这一行为。

apt list --installed

dpkg-query -l # 输出更清晰

apt-mark hold # 将改为apt upgrade里提示的所有内核相关的包

apt-mark unhold

apt-mark showhold

参考:

2.3.5 docker 支持

2.3.6 TODO

更改默认IO调度,增加文件系统支持,提高emmc性能和寿命

3. 总结

最终我们比较完美地在LattePanda上安装了Lunbutu 20.04,解决了BT/Wifi/Audio Output/Touch Panel以及IGD的问题,并使用优化内核提高了LP的性能,后续有时间的话可以自己定制适合LP的ISO镜像,包括:

默认关闭内置输出,采用HDMI输出信号

优化过的内核,支持Docker,更好的性能

预装触摸屏驱动

更改io调度和添加更多文件系统支持

预装SSH Server

4、Reference | 参考

--debug | 显示更多信息

--interactive | 进入root shell,自定义更改。例如修改mirrorlist

--dist-upgrade | 更彻底的升级,可以配合--debug使用

If you do not require low latency for your system then please use the -generic kernel.

If you need a low latency system (e.g. for recording audio) then please use the -preempt kernel as a first choice. This reduces latency but doesn't sacrifice power saving features. It is available only for 64 bit systems (also called amd64).

If the -preempt kernel does not provide enough low latency for your needs (or you have an 32 bit system) then you should try the -lowlatency kernel.

If the -lowlatency kernel isn't enough then you should try the -rt kernel

If the -rt kernel isn't enough stable for you then you should try the -realtime kernel

-generic——>preempt——>lowlatency——>rt——>realtime,越往后延迟越低,耗电越高

Latest improvements to isorespin.sh | rclone copy GDrive:rclone/ ~/downloads

ubuntu安装minisat_为LattePanda安装Lubuntu 20.04并优化内核(已更新)相关推荐

  1. Linux桌面环境最轻量,轻量之王:LUBUNTU 20.04体验简评

    Lubuntu 一直是轻量级 Linux 发行版的杰出代表.当然,从绝对意义上而言,Lubuntu 并不是最轻量的,但是综合考虑易用性.流行度等因素,Lubuntu 是当之无愧的轻量之王. Lubun ...

  2. linux ubuntu桌面下载,Lubuntu 20.04 LTS 发布下载,LXQt为默认桌面

    LUbuntu团队已宣布提供长期支持(LTS)版本Lubuntu 20.04.该版本使用LXQt桌面(大多数以前的版本使用LXDE作为默认桌面),并使用Calamares系统安装程序,而不是大多数其他 ...

  3. linux qt android知乎,Lubuntu 20.04 点评:轻量、简约、文雅 | Linux 中国

    Lubuntu 20.04 LTS 与之前的 LTS 版本有很大的不同.它旨在给你一个更完善的体验,而不仅仅是关注旧电脑.请关于 Lubuntu 20.04 的内容. 作者:Dimitrios Sav ...

  4. 远程ubuntu 20.04的nvidia驱动自动更新,机器重启后,ToDesk或者向日葵等远程连接黑屏,解决办法:为远程设备添加虚拟显示器

    0 避坑提醒 第4部分的解决办法,很多网友反映,会导致物理显示器不能用!请仔细阅读文章里的解决办法. 请仔细阅读第5部分的特别注意事项,虚拟显示器会和物理显示器冲突.让虚拟显示器和物理显示器同时工作的 ...

  5. 优麒麟 20.04 pro更换内核

    安装环境: vware workstation pro 16虚拟机 安装的优麒麟20.04 pro系统 系统镜像名:ubuntukylin-20.04-pro-amd64.iso 内核版本: 1 安装 ...

  6. Ubuntu 20.04入门操作(持续更新)

    Ubuntu常见问题 文章目录 Ubuntu常见问题 1. 软件安装和卸载 1.1 安装.卸载.更新软件 1.3 常用软件 1.3.1 WPS Office 1.3.2 vim 1.3.3 Nextc ...

  7. 麒麟电脑linux微信版本过低,在优麒麟Ubuntu Kylin 20.04系统上快速安装微信和QQ的方法...

    在优麒麟Ubuntu Kylin 20.04系统上安装微信和QQ非常的简单,因为在软件商店中存在这两款应用,所以直接就可以在软件商店中快速安装它们了. 1.新安装的Ubuntu Kylin 20.04 ...

  8. 如何在 Ubuntu 20.04 上安装和使用 Docker

    如何在 Ubuntu 20.04 上安装和使用 Docker Docker 是一个开源的容器化平台,它允许你构建,测试,并且作为可移动的容器去部署应用,这些容器可以在任何地方运行.一个容器表示一个应用 ...

  9. ubuntu系统配置中文输入法以及安装ros2,docker等开发环境

    ubuntu系统重装后环境配置步骤 1 如果安装英文需要中文汉化 可以在设置里面更换语言然后restart 最好选择保留旧的文件名称 2 更换源(清华镜像源) 更新系统的软件包 sudo apt up ...

最新文章

  1. Centos7.5虚拟机无法ping通网关、外网IP地址
  2. 如何让两个输入框保持长度一直_投篮如何保持直线,为什么有些职业球员手臂弯曲投篮一直直...
  3. yum源 php7.2,云服务器:CentOS7 yum安装PHP7.2的操作方法
  4. 【Android】android开发之splash闪屏页的四种实现方式,启动页的实现教程。
  5. 《西游记》原著的一点读后感
  6. 最新卡通渲染效果图(附带一张次世代帅哥)
  7. ORACLE连接数据库(备忘)
  8. Spring 基础技术点
  9. uml边界类例子_面向对象UML笔记
  10. Oracle笔记整理
  11. python基础:变量与数据类型
  12. linux下mac风格菜单栏,Mac 菜单栏样式太单调?不妨用这个小工具自己动手定制
  13. 小新700linux网卡驱动,联想小新air无线网卡驱动-联想小新air笔记本无线网卡驱动下载v2.1 官方最新版-西西软件下载...
  14. 对MC9S12XS128MAL中TIM、PIT、RTI的一点理解
  15. 如何对CPU过载进行排查
  16. Java——通过Java代码从ftp服务器下载文件
  17. CSS中如何撑起内容为空的div
  18. 惊蛰时节,最好看的微信公众号图文排版,全在这里了
  19. 完全拷贝的一份,程序员阅读书单
  20. python3 实现火车票查询 代码+知识点

热门文章

  1. Dell XPS13 9350 安装win7,遇到的坑
  2. 三菱电梯c语言程序代码破解,三菱电梯LEHY-C故障代码大全
  3. 【文献汇总-持续更新】TSN时延敏感网
  4. 基于PaddleTS的LSTNet时序预测模型实现中国人口预测
  5. Python 笔记 --函数
  6. 湖北省高职计算机本科学校有哪些,盘点最新湖北十大高职高专院校排名,湖北最好的高职院校有哪些?...
  7. 利用powershell管理office365
  8. java 提醒小工具_【JAVA】一个简单的定时提醒小程序
  9. android系统的简单定制
  10. 2345王牌输入法的卸载