最近在一台安装了GeForce GTX 970
显卡的机器上,一直无法安装Ubuntu 16.04.3
系统的时候,一直卡住在如下界面:
16款荣放(RAV4)2.0版加装飞歌导航G6S二代异响消除
当时买RAV4
的时候,展车是改装了10.2
存屏幕的,当时脑子一冲动,就要求4S
店加装,结果就是这个飞歌导航G6S
二代。
刚刚安装好,还是不错的,但是半年左右的样子,就开始出现异响,后来声音越来越大,一直吱吱吱的不停,都有些神经衰弱了。
于是手工拆开,自己动手解决异响问题。
HP ProLiant MicroServer Gen8升级BIOS
注意,升级BIOS,不需要创建启动U盘,更不需要安装Windows系统,只需要网页端通过iLO操作即可实现。
iLO 当前的版本分为硬件版本和软件版本
- 硬件版本目前主要是 iLO 4 和 iLO 5,后者是 Gen10 在使用。登录 iLO 管理后台页面的头部会提示你 iLO4/5。
- 软件版本目前 iLO 4 的最新版本是 2.73.2,iLO 5 因为用不上没有做了解。在 iLO 管理后台登录界面上会有一行小字提示。
可以根据 升级 HP MicroServer Gen8 iLO 秘笈 的介绍,从HPE官网搜索并下载BIOS文件(官网建议下载Windows 版本的升级包,里面文件解压缩后最少),也可以从本站下载BIOS
固件 iLO2.5 或者 HP Gen8 BIOS 20190404。
iLO2.5 解压缩完成后,其中的cp031064 gen8 bios 2015.11.02.exe
就是我们需要升级的BIOS
固件。
HP Gen8 BIOS 20190404 解压缩出来的cp039540.exe
也是我们需要升级的BIOS
固件,这个是目前最新的版本。
我们用7z
等解压缩软件,解压缩出里面的文件,iLO 2.5中的CPQJ0612.F62
或者 HP Gen8 BIOS 20190404 中的CPQJ0613.684
就是我们的升级文件,两者都可以,一般建议用最新的 HP Gen8 BIOS 20190404 里面的文件。
HP ProLiant MicroServer Gen8升级到iLO4 2.54/2.73/2.82.5
iLO
是Integrated Ligths-out
的简称,是HP
服务器上集成的远程管理端口,它是一组芯片内部集成vxWorks
嵌入式操作系统,通过一个标准RJ45
接口连接到工作环境的交换机。只要将服务器接入网络并且没有断开服务器的电源,不管HP
服务器的处于何种状态(开机、关机、重启),都可以允许用户通过网络进行远程管理。简单来说,iLO
是高级别的远程KVM
系统,可以将服务器的显示信息显示在本地,并且使用本地的键盘鼠标控制、操作服务器,并可以将本地的光盘镜像、文件夹作为虚拟光驱映射并加载到服务器中。使用iLO
,可以完成低层的BIOS
设置、磁盘RAID
配置、操作系统的安装等底层的工作,并且可以在完成系统安装后实现系统的远程控制与管理。
iLO 当前的版本分为硬件版本和软件版本
- 硬件版本目前主要是 iLO4 和 iLO 5,后者是 Gen10 在使用。登录 iLO 管理后台页面的头部会提示你 iLO4/5。
- 软件版本目前 iLO4 的最新版本是 2.73.2,iLO5 因为用不上没有做了解。在 iLO 管理后台登录界面上会有一行小字提示。
iLO 2.73版本新增了基于HTML5
的远程控制台,比以前方便多了,建议升级这个版本。
可惜HP
官网上并没有在明显的位置找到iLO
的升级文件下载的地方,可参考 升级 HP MicroServer Gen8 iLO 秘笈 的介绍,自己搜索下载需要的版本。也可依赖网友们共享已经下载完成的更新文件。
Linux下编辑ISO文件的方法
我们知道Windows
下有类似UltraISO
的这样的软件可以用来编辑ISO
文件,可引导ISO
也没有问题。近来在Linux
下玩的比较多,正好要改个ISO
,于是就开始找Linux
下有没有类似的软件。
Ubuntu
软件中心里有一款叫ISOMaster
的软件,可以创建和修改ISO
文件。
Python matplotlib.pyplot.draw()在不同版本中的差别导致界面绘制异常问题
在Ubuntu
系统上进行如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install python-dev $ sudo apt-get install python-pip $ sudo pip install --upgrade pip $ sudo pip install --upgrade urllib3 $ sudo pip install numpy $ sudo pip install matplotlib |
之后执行如下测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import sys import numpy as np import matplotlib.pyplot as plt plt.ion() (fig, axis) = plt.subplots() bar_plot = axis.barh(0, 8,linewidth = 0) bar_plot.color= '#ffff00' for i in range(20): axis.set_xlim(xmax = max(i + 1, 10)) plt.draw() if sys.version_info < (3, 0): raw_input("Press Enter to continue...") else: input("Press Enter to continue...") |
上面的测试代码在Ubuntu 14.04.5
版本上是可以正常执行的,对应的matplotlib
的版本是matplotlib 1.3.1
,但是放到Ubuntu 16.04.2
系统上则是无法正常显示的,对应的matplotlib
的版本是matplotlib 1.5.1
。
造成这个问题的原因在于matplotlib.pyplot.draw()
,这个函数行为的改变,早期这个函数是同步更新界面的,后来的版本却变成了空闲异步更新界面,只有当matplotlib.pyplot.pause(interval)
被调用的时候才会刷新界面。
所以只需要上面的代码修改成如下即可在不同版本之间兼容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import sys import numpy as np import matplotlib.pyplot as plt plt.ion() (fig, axis) = plt.subplots() bar_plot = axis.barh(0, 8,linewidth = 0) bar_plot.color= '#ffff00' for i in range(20): axis.set_xlim(xmax = max(i + 1, 10)) plt.draw() plt.pause(0.00001) if sys.version_info < (3, 0): raw_input("Press Enter to continue...") else: input("Press Enter to continue...") |
注意,我们在matplotlib.pyplot.draw()
调用后面增加了matplotlib.pyplot.pause(interval)
的调用。
貌似调用fig.canvas.flush_events()
更合适?
查看matplotlib
的版本使用如下代码:
1 2 |
import matplotlib as mpl print mpl.__version__ |
参考链接
OpenCV使用cv::imshow在子线程中更新图片不刷新
在Ubuntu 16.04
上测试OpenCV 3.2
,遇到一个在子线程中更新图像,而界面不刷新的问题。
1 |
$ sudo apt-get install libopencv-dev |
编译执行如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <pthread.h> #include <opencv/cv.h> #include <opencv/highgui.h> #include <stdio.h> #include <stdlib.h> void* imshowWorker(void*){ for(int i = 0;i < 100;i++){ char str[10+1]; snprintf(str, 10,"%d",i); cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 ); cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 )); cv::imshow("Number View", img ); if(i > 90){ i = 0; } } } int main(void){ cv::namedWindow("Number View"); pthread_t id; pthread_create(&id,NULL,imshowWorker,NULL); getchar(); return (0); } |
1 |
$ g++ opencv_imshow.cpp -I `pkg-config --libs opencv` -lpthread -o opencv_imshow |
可以看到,上面的代码执行之后,界面并没有出现,即使出现也没有刷新。
这个问题是由于界面更新必须在主线程中执行,需要手工通知主线程。
修改后的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <pthread.h> #include <opencv/cv.h> #include <opencv/highgui.h> #include <stdio.h> #include <stdlib.h> void* imshowWorker(void*){ for(int i = 0;i < 100;i++){ char str[10+1]; snprintf(str, 10,"%d",i); cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 ); cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 )); cv::imshow("Number View", img ); cv::waitKey(30); if(i > 90){ i = 0; } } } int main(void){ cv::namedWindow("Number View"); pthread_t id; pthread_create(&id,NULL,imshowWorker,NULL); getchar(); return (0); } |
也就是每次更新图片后手工调用代码
1 |
cv::waitKey(30); |
这个等候时间,只要大于0
即可,比如:
1 |
cv::waitKey(1); |
参考链接
文件'/var/lib/update-notifier/package-data-downloads/partial/adobe-flashplugin_20170912.1.orig.tar.gz'无法被用户'_apt'访问,无法降低权限以进行下载。 - pkgAcquire::Run (13: 权限不够)
最近在更新Ubuntu 16.04
系统的时候,发现总是在安装Adobe Flash
更新的时候失败,提示如下信息:
1 2 3 4 5 6 7 8 9 |
正在处理用于 update-notifier-common (3.168.5) 的触发器 ... flashplugin-installer: processing... flashplugin-installer: downloading http://archive.canonical.com/pool/partner/a/adobe-flashplugin/adobe-flashplugin_20170912.1.orig.tar.gz 获取:1 http://archive.canonical.com/pool/partner/a/adobe-flashplugin/adobe-flashplugin_20170912.1.orig.tar.gz [30.4 MB] 37% [1 /var/lib/update-notifier/package-data-downloads/partial/adobe-flashplugi 已下载 30.4 MB,耗时 10分 11秒 (49.8 kB/s) W: 文件'/var/lib/update-notifier/package-data-downloads/partial/adobe-flashplugin_20170912.1.orig.tar.gz'无法被用户'_apt'访问,无法降低权限以进行下载。 - pkgAcquire::Run (13: 权限不够) E: 下载失败 |
如果系统语言是英文的,可能看到下面的信息:
1 |
W: Can't drop privileges for downloading as file '/var/lib/update-notifier/package-data-downloads/partial/adobe-flashplugin_20170912.1.orig.tar.gz' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied) |
解决方法如下:
1 2 3 4 5 6 7 |
$ sudo chown -R _apt:root /var/lib/update-notifier/package-data-downloads/partial/ $ sudo rm /var/lib/update-notifier/package-data-downloads/partial/*.FAILED $ sudo apt install --reinstall update-notifier-common $ sudo apt-get install --reinstall flashplugin-installer |
这样,就可以正常安装更新了。
参考链接
在Makefile中检查gcc版本
问题描述
我想使用一些在旧的GCC
版本中不可用的GCC
警告开关(例如-Wtype-limits
)。
有没有一个简单的方法来检查GCC
版本?
最佳解决方案
我不会说容易,但是可以使用GNU make
的SHELL
函数来执行gcc --version
命令,然后使用ifeq
条件表达式来检查版本号,并适当地设置CFLAGS
变量。
以下是一个简单的MakeFile
示例:
1 2 3 4 5 6 7 8 9 10 |
CC = gcc GCCVERSION = $(shell gcc --version | grep ^gcc | sed 's/^.* //g') CFLAGS = -g ifeq "$(GCCVERSION)" "4.4.3" CFLAGS += -Wtype-limits endif all: $(CC) $(CFLAGS) prog.c -o prog |
注意:不存在ifgt
语法。但是可以使用expr
命令进行比较。
例子如下:
1 2 3 4 5 6 7 8 9 10 |
CC = gcc GCCVERSIONGTEQ4 := $(shell expr `gcc -dumpversion | cut -f1 -d.` \>= 4) CFLAGS = -g ifeq "$(GCCVERSIONGTEQ4)" "1" CFLAGS += -Wtype-limits endif all: $(CC) $(CFLAGS) prog.c -o prog |
次佳解决方案
要将完整的3
部分GCC
版本(不仅第一位数字)转换成数字格式,适合比较(例如40701
)使用
1 |
gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$/&00/' |
其中解决了任何版本部分中双数字版本号的可能性,以及gcc -dumpversion
输出内容缺少3
个部分的可能性(在一些较早的GCC
版本中存在这种情况)。
所以要测试MakeFile
中的版本,使用(注意$$
里面的最后一个sed
命令)
1 2 3 4 |
GCC_GTEQ_472 := $(shell expr `gcc -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g' -e 's/\.\([0-9]\)/0\1/g' -e 's/^[0-9]\{3,4\}$$/&00/'` \>= 40702) ifeq "$(GCC_GTEQ_472)" "1" ... endif |
第三种解决方案
我刚刚遇到这个问题,我需要测试GCC
的前两位数字,想要一个比上面sed
过滤字符串更复杂的操作。我使用bc
进行比较,因为它支持浮点数(expr
将非整数(non-integers
)都视为字符串):
1 2 3 4 |
GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif |
如果在GCC 4.9
之后发布了GCC 4.10
,那么用sed
处理是必要的:
1 2 3 4 |
GCC_VER_GTE44 := $(shell echo `gcc -dumpversion | cut -f1-2 -d.` \>= 4.4 | sed -e 's/\./*100+/g' | bc ) ifeq ($(GCC_VER_GTE44),1) ... endif |
参考链接
Ubuntu 16.04.3系统上OpenPTrack V1版本安装配置(Kinect V2)
对于Ubuntu 14.04.5
系统上的安装操作,请参考Ubuntu 14.04.5系统上OpenPTrack V1版本安装配置(Kinect V2)
下面是我自己fork
出来修改后的代码在Ubuntu 16.04.3
系统上的安装操作
要求机器上必须有CUDA 8.0/9.0
支持的显卡才可以。
1.从GitHub上获取项目代码
1 2 3 |
$ sudo apt-get install git -y $ cd ~ $ git clone https://github.com/wangqiang1588/open_ptrack_org.git open_ptrack |
2.安装ROS
1 2 3 4 5 6 |
$ cd open_ptrack/scripts $ chmod +x *.sh $ ./ros_install.sh $ source /opt/ros/kinetic/setup.bash $ ./ros_configure.sh |
3.安装OpenPTrack
1 2 3 |
$ sudo apt-get install libdrm-dev $ ./openptrack_install.sh |
4.链接OpenPTrack
目录
1 |
$ ln -s ~/workspace/ros/catkin/src/open_ptrack ~/open_ptrack |
5.Kinect V2
驱动程序安装
检查当前用户目录下的.bashrc
文件,注释掉如下内容:
1 |
export KINECT_DRIVER=openni |
然后执行如下命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Nvidia Jetson TX1/TX2 不要安装这个 $ sudo apt-get install nvidia-375-dev # Nvidia Jetson TX1/TX2不支持OpenCL,因此编译的时候,不要安装ocl-icd-opencl-dev $ sudo apt-get install ocl-icd-opencl-dev $ sudo apt-get install m4 $ sudo apt-get install automake $ sudo apt-get install libjpeg-dev $ sudo ln -s -f /usr/lib/`uname -m`-linux-gnu/libturbojpeg.so.0 /usr/lib/`uname -m`-linux-gnu/libturbojpeg.so $ sudo apt-get install libglewmx-dev $ sudo apt-get install libudev-dev $ sudo ln -s -f /lib/`uname -m`-linux-gnu/libudev.so.1 /lib/`uname -m`-linux-gnu/libudev.so $ cd ~/workspace/ros/catkin/src $ source ~/.profile $ roscd open_ptrack/../scripts $ chmod +x kinect2_install.sh $ ./kinect2_install.sh |
6.重新编译代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
UBUNTU_VERSION=`lsb_release -c -s` ROS_DISTRO=hydro if [ $UBUNTU_VERSION = trusty ] || [ $UBUNTU_VERSION = saucy ] ; then ROS_DISTRO=indigo elif [ $UBUNTU_VERSION = xenial ] ; then ROS_DISTRO=kinetic fi GCC_VERSION=`gcc -dumpversion | cut -f1 -d.` source /opt/ros/$ROS_DISTRO/setup.bash cd ~/workspace/ros/catkin catkin_make --pkg calibration_msgs catkin_make --pkg opt_msgs #GCC 5 bug out of memory if [ $GCC_VERSION > 4 ] ; then catkin_make --force-cmake -j 1 else catkin_make --force-cmake fi |
执行如下命令:
1 |
$ roscore |
检查当前用户目录下的.bashrc
文件,然后注释掉如下内容:
1 |
export KINECT_DRIVER=openni |
上面语句如不注释,会导致程序启动时候的崩溃。
新建一个Shell
,执行如下命令
1 2 |
$ cd ~/workspace/ros/catkin/devel/lib/kinect2_bridge $ sudo ./kinect2_bridge |
执行此步的时候如果提示找不到Kinect
设备,请重启一下系统再试试。
7.测试系统
可能需要重新插拔一下Kinect
的USB
数据线,然后执行如下命令
1 |
$ roslaunch kinect2_bridge kinect2_bridge.launch |
执行之后,等待十几秒,然后Ctrl+C
中断执行。
执行完成后,执行
1 |
$ roslaunch tracking detection_and_tracking_kinect2.launch |
之后,会弹出三个界面出来。