- gcc 支持的std
- 命令行加密解密文件
- 安装不同版本的gcc
- 交叉编译boost库
- ubuntu中的ssl
- curl post file use Multipart format
- vim tab setting
- send multipart/form-data with curl
- ubunut laptop 登录后GUI卡死问题解决
- disable service start at boot
- ubunut禁掉touchpad
- 远程修改账号密码
- Firewall in Centos7
- ESX安装windowsServer虚拟机时配置操作快捷键
- vs2017的15.9.31的企业版本remote问题
- ssh出现ubable to negotiate问题
- ubuntu dell 笔记本出现no wifi adapter
- ubuntu中禁掉通过systemd自启动的service
- minicom
- 交叉编译boost
- 交叉编译python3.6
- 2020/03/21
- 2019/11/21
- 2019/06/28
- 2019/02/02
- 2019/01/20
- 2018/10/18
- 2018/05/09
- 2017/11/23
- 2017/10/01
- 2017/04/01
- 2017/03/25
- 2017/03/20
- 2017/02/20
- 2017/01/20
- 2017/1/13
- 2016/1/7
- 2016/01/05
- 2016/12/25
- 2016/12/18
- 2016/12/04
- 2016/11/27
- 2016/11/26
- 2016/11/24
- 2016/11/22
- 2016/11/21
- 2016/11/18
- 2016/10/23
- 2016/10/16
- 2016/10/07
- 2016/10/04
- 2016/10/02
- 2016/10/01
- 2016/9/25
- 2016/9/20
- 2016/8/7
记性越来越差,遇到技术问题网上找到解决办法后,如果不记录下来,下次再遇到根本记不起来当时是怎样解决的。笔记中的一些知识点经过积累最终会汇总出一篇相对应的单篇。
gcc 支持的std
$ gcc -v --help 2> /dev/null | grep '^ *-std='
-std=<standard> Assume that the input sources are for <standard>
-std=f2003 Conform to the ISO Fortran 2003 standard
-std=f2008 Conform to the ISO Fortran 2008 standard
-std=f95 Conform to the ISO Fortran 95 standard
-std=gnu Conform to nothing in particular
-std=legacy Accept extensions to support legacy code
-std=c++0x Conform to the ISO 1998 C++ standard, with
-std=c++98 Conform to the ISO 1998 C++ standard
-std=c89 Conform to the ISO 1990 C standard
-std=c99 Conform to the ISO 1999 C standard
-std=c9x Deprecated in favor of -std=c99
-std=gnu++0x Conform to the ISO 1998 C++ standard, with GNU
-std=gnu++98 Conform to the ISO 1998 C++ standard with GNU
-std=gnu89 Conform to the ISO 1990 C standard with GNU
-std=gnu99 Conform to the ISO 1999 C standard with GNU
-std=gnu9x Deprecated in favor of -std=gnu99
-std=iso9899:1990 Conform to the ISO 1990 C standard
-std=iso9899:199409 Conform to the ISO 1990 C standard as amended in
-std=iso9899:1999 Conform to the ISO 1999 C standard
-std=iso9899:199x Deprecated in favor of -std=iso9899:1999
$ gcc -v --help 2> /dev/null | sed -n '/^ *-std=\([^<][^ ]\+\).*/ {s//\1/p}'
f2003
f2008
f95
gnu
legacy
c++0x
c++98
c89
c99
c9x
gnu++0x
gnu++98
gnu89
gnu99
gnu9x
iso9899:1990
iso9899:199409
iso9899:1999
iso9899:199x
命令行加密解密文件
//加密
gpg -c file.tar.gz
//清理密码缓存,防止出现不用输密码就可以解密文件
gpg-connect-agent reloadagent /bye
//解密文件
gpg -o file.tar.gz file.tar.gz.gpg
安装不同版本的gcc
假设需要在ubunut22.04上安装gcc-4.9,因为22.04自带的gcc版本为11,所以得配置两个版本的gcc并存。
//manually install gcc-4.9
$git clone git@github.com:chesc100/gcc-4.9-deb
$cd gcc-4.9-deb
$sudo dpkg -i *.deb
//make alternatives
$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 75 --slave /usr/bin/g++ g++ /usr/bin/g++-7
$sudo update-alternatives --config gcc
交叉编译boost库
boost的编译系统是非常特殊的,之前没有交叉编译过类似的开源库。
首先从boost官方资料查看编译参数和配置选项的语法。
配置交叉编译参数的基本方法就是创建user-config.jam
文件,并且要把这个文件发到boost编译系统搜索的某个目录中,比如$HOME目录下。config的语法如下:
using gcc : [version] : [c++-compile-command] : [compiler options] ;
注意最后的;
前面必须有空格,否则报语法错误。
执行:
echo "using gcc : 9.2.0 : aarch64-poky-linux-g++ : <compileflags>\"-I/opt/toolchain/xxx/include --sysroot=/opt/toolchain/xxx/rootfs\" <linkflags>\"--sysroot=/opt/toolchain/xxx/rootfs\" ;" > $HOME/user-config.jam
然后先执行./bootstrap --prefix=xxx
生成b2, 然后再执行./b2 toolset=gcc-9.2.0
进行编译, 其中toolset=gcc-9.2.0
和 usr-config.jam里面的using gcc : 9.2.0
是需要匹配的,不然编译系统无法判断是否启用user-config.jam这个配置。
为了了解我们创建的user-config.jam文件是否被加载,我们可以添加debug参数:
./b2 --debug-configuration toolset=gcc-9.2.0
ubuntu中的ssl
今天不小心删除了/usr/lib/x86_64-linux-gnu/下面的libssl.so.3相关的文件, 然后想通过apt install重新安装恢复一下,然后执行sudo apt remove openssl;sudo apt install openssl
,
错误的认为libssl.so来自于openssl这个pkg, 然后执行apt-cache depends openssl
发现有 libssl3, 然后执行sudo apt remove libssl3; sudo apt install libssl3
, 发现不行,实际上应该需要执行sudo apt --reinstall install libssl3
就可以了。
另外重点是要区分apt install libssl-dev
, apt install openssl
, apt install libssl3
的区别。
curl post file use Multipart format
curl -v -F filed1=@./tb.json http://tqauto.asuscomm.com:9529/api/v1/cmlWMM/bulktelemetry
vim tab setting
set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
send multipart/form-data with curl
curl -v -F filed1=@./engine.csv http://localhost:8080/api/v1/pmSzuSWPzQIa5ofGMehj/bulktelemetry
the filed1
will insert the header like Content-Disposition: form-data; name=filed1
and the filename
in the Content-Disposition is optional
ubunut laptop 登录后GUI卡死问题解决
dell laptop装了ubuntu+win10双系统,最近在没有关机直接合上笔记本后出现GUI卡死的问题。
查看dmesg,出现如下内核crash call trace:
[ 113.929194] RSP: 0018:ffffb01b4030f980 EFLAGS: 00010282
[ 113.929195] RAX: 0000000000000000 RBX: ffffffffffffff92 RCX: 0000000000000006
[ 113.929195] RDX: 0000000000000007 RSI: 0000000000000092 RDI: ffffa043f759c8c0
[ 113.929196] RBP: ffffb01b4030f9c8 R08: 00000000000004a1 R09: 0000000000000004
[ 113.929196] R10: 0000000000000000 R11: 0000000000000001 R12: ffffa043f5011b40
[ 113.929196] R13: ffffa043e6c7a400 R14: 0000000000000012 R15: ffffa043eb652b90
[ 113.929197] FS: 0000000000000000(0000) GS:ffffa043f7580000(0000) knlGS:0000000000000000
[ 113.929197] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 113.929198] CR2: 00007f8f28001358 CR3: 0000000238a0a001 CR4: 00000000003606e0
[ 113.929198] Call Trace:
[ 113.929214] nvkm_falcon_v1_enable+0x84/0x120 [nouveau]
[ 113.929229] nvkm_falcon_enable+0x3d/0x70 [nouveau]
[ 113.929243] ? nvkm_falcon_disable+0x48/0x50 [nouveau]
[ 113.929257] nvkm_falcon_reset+0x1b/0x20 [nouveau]
[ 113.929280] gm200_secboot_run_blob+0xe8/0x1b0 [nouveau]
[ 113.929302] gp102_secboot_run_blob+0x1bd/0x240 [nouveau]
[ 113.929304] ? _cond_resched+0x19/0x30
[ 113.929325] acr_r352_shutdown+0x47/0xb0 [nouveau]
[ 113.929346] acr_r352_fini+0xe/0x10 [nouveau]
[ 113.929367] gm200_secboot_fini+0x28/0x30 [nouveau]
[ 113.929388] nvkm_secboot_fini+0x23/0x30 [nouveau]
[ 113.929403] nvkm_subdev_fini+0x5f/0xb0 [nouveau]
[ 113.929425] nvkm_device_fini+0x87/0x120 [nouveau]
[ 113.929448] nvkm_udevice_fini+0x53/0x70 [nouveau]
[ 113.929463] nvkm_object_fini+0xbf/0x150 [nouveau]
[ 113.929478] nvkm_object_fini+0x76/0x150 [nouveau]
[ 113.929502] nvkm_client_suspend+0x13/0x20 [nouveau]
[ 113.929516] nvif_client_suspend+0x1d/0x20 [nouveau]
[ 113.929540] nouveau_do_suspend+0x10c/0x180 [nouveau]
[ 113.929563] nouveau_pmops_runtime_suspend+0x44/0xa0 [nouveau]
[ 113.929564] pci_pm_runtime_suspend+0x61/0x160
call trace 最后的[nouveau]
提示这是内核模块nouveau中发生的crash,nouveau是NVIDIA(英伟达)显卡的开源驱动。
google后发现解决类似问题的方法基本上都是放弃nouveau的驱动,或者直接放弃使用笔记本上的这个英伟达独立显卡,而是使用主板上自带的intel集成显卡。
因为我主要用来写代码,所以使用集成显卡足够了,于是在折腾一段时间后,决定还是放弃独立显卡,直接禁用掉。步骤如下:
- 创建blacklist -> vi /etc/modprobe.d/blacklist-nouveau.conf
- 在上面blcklist文件中添加如下内容:
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off
-
在内核中禁掉nouveau模块的加载 -> echo options nouveau modeset=0 sudo tee -a /etc/modprobe.d/nouveau-kms.conf - 更新配置生效 -> update-initramfs -u
- 最后需要重启电脑
disable service start at boot
执行sudo update-rc.d -f xxx remove
让xxx service不在开机时自启动
ubunut禁掉touchpad
- 执行
xinput disable 16
远程修改账号密码
通过RDP远程如何进入目标价的修改账号密码界面呢?直接ctrl + alt + del肯定是不行的:
- win + alt + o 唤起远程桌面的on-screnn键盘
- 然后物理按键ctrl + alt 加点击on-screnn键盘上的del
Firewall in Centos7
- 执行
firewall-cmd --get-active-zones
查看当前的zone - 执行
firewall-cmd --zone=xxx --list-all
查看xxx zone下的设置 - 执行
firewall-cmd --zone=xxx --permanent --add-port=80/tcp
添加80端口的放行 - 执行
firewall-cmd --reload
使能设置生效
ESX安装windowsServer虚拟机时配置操作快捷键
Windows 徽标键+Shift+M 将已最小化的窗口还原到桌面(对Windows 应用程序不会有影响) Windows 徽标键+R 打开“运行”对话框。 Windows 徽标键+T 将焦点设置到任务栏并循环浏览程序
ncpa.cpl 可打开“控制面板”\“网络和 Internet”\“网络连接”。 sysdm.cpl 可打开“控制面板”\“系统和安全”\“系统”\“高级系统设置”中提供的“系统属性”对话框。 appwiz.cpl 可打开“控制面板”\“程序”\“程序功能”\“卸载或更改程序”。 inetcpl.cpl 可打开“控制面板”\“网络和 Internet”\“Internet 选项”中提供的“Internet 属性”对话框。
vs2017的15.9.31的企业版本remote问题
在使用vs2017的remote运行调试ubuntu上的代码时,出现”error could not load cache”的问题,也就是ubuntu上的cmake无法执行build生成CMakeCache.txt文件。 网上查了很久,有人说将rsync改成sftp就可以了。果然,在CMakeSetting.json中将remoteCopySourcesMethod配置项改成’sftp’后问题解决了。至于原因,无法得知,应该是vs的bug。
ssh出现ubable to negotiate问题
ubuntu升级到20.04之后,ssh到某个设备出现,no matching key exchange method found.Their offer: diffie-hellman-group1-sha1
报错。
解决办法,手动加上算法支持:
sh -oKexAlgorithms=+diffie-hellman-group1-sha1 username@host_ip
ubuntu dell 笔记本出现no wifi adapter
sudo rmmod iwlmvm && sudo modprobe iwlmvm
ubuntu中禁掉通过systemd自启动的service
执行systemctl disable xxx
这个命令执行的结果其实就是将/etc/rcn.d/
中的对应S01xx文件重命名成K01xx文件,其中的rcn.d中的n就是当前的runlevel,执行runlevel
可以打印出当前runlevel。
然后比如我们执行systemctl disable emqx
, 那么就是将S01emqx重命名为K01emqx
minicom
how to enable log file
set config in “conig dialog” doesn’t work, should:
- first touch a log file e.g “2020-11-07.log”
- start with cmd “sudo minicom –device /dev/ttyUSB0 -c on –capturefile=/home/saiyn/work/logs/trans/2020-10-18.log”
交叉编译boost
-
./bootstrap/sh
-
在上面命令生成的文件里面将
using gcc
那行替换成using gcc : arm : /path/to/bin/arm-linux-xxx.g++ ;
注意上面的配置语句空格都不可以少。
-
./b2 toolset=gcc-arm
进行编译 -
./b2 install --prefix=/path/to/install
进行安装
从上面的编译过程可以看出,与一般的交叉编译不同的是,编译boost不需要指定RootFs,说明boost代码完全是自举的,没有依赖任何运行库。
交叉编译python3.6
./configure --host=arm-marvell-linux-gnueabi --target=arm-marvell-linux-gnueabi --prefix=/home/saiyn/work/job/diamond_python --build=x86_64-linux-gnu --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no --enable-optimizations
2020/03/21
例举系统中top 10占用磁盘空间的目录
du -a /usr | sort -n -r | head -n 10
2019/11/21
python代码需要root权限问题
在用pytest做c代码自动化测试时,难免测试的代码需要root权限,比如使用row_socket等等,这时第一反应肯定是在执行代码命令前面加上”sudo”, 比如 sudo pytest test_flush_reason.py –conf ./
但是,不幸的是,十有八九会出现: sudo pytest: not found
的问题,意思就是在root用户下找不到pytest.
比较好的一个解决办法是,在~/.bashrc
文件最后添加:
psudo() { sudo env PATH="$PATH" "$@"; }
保存退出后执行”source ~/.bashrc”, 然后执行:
psudo pytest test_flush_reason.py --conf ./
这样权限的问题就解决了。
2019/06/28
JLinkGDBServer -if JTAG -device STM32F103ZE
linux下文件编码和换行符问题
-
vim下修改已经存在文件中的中文编码格式:
:e ++enc=cp936
,修改后一个中文字符就是2个字节编码。 -
由于windows和unix使用不同的换行符导致在unix下执行windos下编辑的shell脚本文件时会出现脚本无法运行的问题。解决办法之一是 在vim下执行
:set ff=unix
2019/02/02
- 查看系统节拍:
grep 'CONFIG_HZ=' /boot/config-$(uname -r)
ubuntu软件安装问题
当出现dpkg: warning; files list for package 'xxxx' missing
问题时,
执行 sudo apt-get install --reinstall xxxx
进行修复。
ubuntu安装指定版本软件
当我们需要安装某个软件是,一般的做法就执行’sudo apt install xxx’,但是这样我们不确定我们安装的是哪个版本。
为了搞清楚我们即将安装的版本或者是选择其中一个版本安装,可以执行sudo apt-cache madison xxx
来查看,
然后执行sudo apt install xxx=yyy
来安装
2019/01/20
docker practice
-
run
docker ps -a
to see all containers include exited one. -
run
docker rm $(docker ps -a -q -f status=exited)
to rm all exited containers. -
setup a telnet server in docker
3.1 run docker exec -it aix apt-get install xinetd telnetd
to install
3.2 run docker exec -it aix /etc/init.d/xinetd start
to start server
2018/10/18
ubuntu16.04上安装curl和openssl
今天调试程序时发现,基于curl的应用程序访问不了https,通过添加设置curl中的CURLOPT_ERRORBUFFER
配置项,发现错误提示是protocal "https" is not supported or disable in curl
。
可以判断出是当时编译curl工程时没有配置使能ssl,执行./configure --with-ssl=/usr/lib/ssl
配置curl支持ssl。
但是配置完重新编译时出现如下错误:
网上查阅后初步判断是curl版本和openssl版本不匹配。执行curl --version -a
发现版本是curl-7.47.1,执行openssl version -a
发现版本是openssl 1.1.0g。于是通过github将openssl升级到了1.1.1-pre9,重新编译发现问题还是存在。
这时想到,可能是需要降低openssl的版本而不是升级,于是查看手边另外一台16.04的ubuntu笔记本,发现openssl是1.0.2g
的,在这台ubuntu下编译发现是正常的。
ubuntu上源码安装使用redis
-
执行
git clone git@github.com:antirez/redis.git
从github上克隆工程。 -
执行
git checkout tags/4.0.11
,本地代码切换到redis4.0.11最新稳定版本上。 -
执行
make V=1
编译带调试信息的redis。 -
执行
make test
验证编译后的redis是否正常。 -
执行
sudo make install
安装redis。 -
执行
cd utils;sudo ./install_server.sh
部署redis服务器。 -
接上步,一路回车默认。安装部署完成。
-
执行
redis-cli
查看redis服务器是否正常运行。
2018/05/09
windows network
1.执行net config workstation查看当前windows的workstation配置信息。
ubuntu上开发杂项
查看ubuntu版本
执行lsb_release -a
命令查看当前ubuntu版本信息。
ssh登陆
从一台ubuntu使用rsa私钥ssh登陆另外一台ubuntu使用如下命令:
sudo ssh -i diamond.txt root@10.0.0.2
上面diamod.txt是rsa私钥,root是登陆名,10.0.0.2是带登陆的ubuntu的ip地址。
搭建tftp服务
-
1) 执行
sudo apt-get install xinetd tftpd
安装服务器主程序。 -
2) 创建
/etc/xinetd.d/tftp
文件,内容如下:service tftp { protocol = udp port = 69 socket_type = dgram wait = yes user = nobody server = /usr/sbin/in.tftpd server_args = /tftpboot disable = no }
-
3) 创建共享目录: sudo mkdir /tftpboot sudo chmod -R 777 /tftpboot sudo chown -R nobody /tftpboot
-
4) 重启服务器: sudo service xinetd restart
or
sudo /etc/inin.d/xinetd restart
搭建ftp服务器
这里描述的是在ubuntu 16.04上搭建ftp服务器,在其他ubuntu机器上通过wget或者ftp文件访问。
- 1) 执行
sudo apt-get install vsftpd
,安装ftp服务端程序。
安装成功后会生成/etc/vsftpd.conf
配置文件,搭建可用的服务器主要就是正确配置这个文件。
-
2) 执行
sudo ufw status
确保防火墙没有屏蔽ftp对应的2o和21端口。 -
3) 创建准备被remote设备访问的文件夹,一般推荐执行下面命令新建用户,并在新用户家目录下创建待访问的文件夹。
$ sudo adduser saiyn_ftp
// 输入密码后,后面都直接按“ENTER就行了。
$ sudo mkdir /home/saiyn_ftp/ftp
$ sudo chown nobody:nogroup /home/saiyn_ftp/ftp
-
4) 执行
echo "vsftpd test file" | sudo tee /home/saiyn_ftp/test.txt
-
5) 编辑vsftpd.conf,修改如下内容:
write_enable=YES
…
chroot_local_user=YES
…
设置chroot_local_user为yes之后,可以方便我们访问目标文件,比如要访问上面的测试文件,如果使用wget在没有使能chroot_local_user时,
我们需要在url指定完全路径/home/saiyn_ftp/ftp/test.txt
,而使能之后就可以直接使用text.txt
。
另外还要在配置文件最后添加如下配置行来配合chroot_local_user功能:
`user_sub_token=$USER`
`local_root=/home/$USER/ftp`
最后,最重要的就是创建并配置用户列表,先在配置文件最后追加如下:
`userlist_enable=YES`
`userlist_file=/etc/vsftpd.userlist`
`userlist_deny=NO`
上面的userlist_deny控制着我们创建的list到底是白名单还是黑名单。
-
6) 执行
$echo "saiyn_ftp" | sudo tee -a /etc/vsftpd.userlist
添加白名单用户。 -
7) 执行
$sudo systemctl restart vsftpd
重启ftp使修改的配置生效。 -
8) 在另外一台ubuntu机器上执行
ftp -p 10.0.0.30
测试ftp服务器是否正常。输入正确的用户名和密码后成功登陆的显示如下:
登陆成功后,可以通过get
命令下载服务器上的文件,或者通过put
上传文件到服务器上。
-
9) 在另外一台机器上执行
wget ftp://saiyn_ftp:password@10.0.0.30/test.txt
可以直接下载服务器上的文件。 -
10) 如果需要更加安全,可以参照这篇文章继续进行配置。
搭建samba服务
Linux开发基本姿势就是windows使用便捷的代码编辑器,然后在ubuntu机器上进行编译测试。为了两个系统可以共享文件,最方便的方式就是ubuntu搭建samba server,windows电脑通过samba client访问server实现文件共享。ubuntu(16.04)下搭建samba server步骤如下:
-
1) 执行
sudo apt-get install samba samba-common
下载安装samba程序。 -
2) 执行
systemctl status smbd
可以查看刚刚安装的samba server是否正常工作。
-
3) 创建用户和待分享的目录,这步非常关键。
- a) 打开windows的cmd,执行
net config workstation
查看windows电脑所在的域,以及windows当前的用户名.这两个信息在配置ubuntu环境和samba配置时用到。
-
b) 如果你在windows上的用户名和你ubuntu上的用户名不同的话,那么需要执行
sudo adduser saiyn_chen
在ubuntu上创建一个同名用户,因为win10 上的smaba客户端在访问samba server时直接使用的是当前的windows用户名。 -
c) 执行
su -l saiyn_chen
切换用户,并在家目录下创建一个待分享的目录,假设是/home/saiyn_chen/public。 -
d) 执行
sudo smbpasswd -a saiyn_chen
,将用户添加到samba server访问用户列表中,因为win10不允许guest访问模式,所以这步很重要。
- a) 打开windows的cmd,执行
-
4) 编辑
/etc/samba/smb.conf
配置samba sever。-
a) 修改WORKGROUP 为windows中的实际所在域–TREND.
-
b) 在配置文件最后添加如下内容.
-
c) 执行
testparm
确认刚刚的配置修改是否正确。 -
d)确认配置修改正确后,执行
systemctl restart smbd
重启samba sever.
-
-
5) 在windows地址栏执行
\\10.64.80.170
,即可访问ubuntu上创建的public目录。
NFS
两个Linux系统之间交互文件最方便的方式还是NFS。
- Server setup
1.1 sudo apt-get install nfs-kernel-server
1.2 configure /etc/exports
like:
1.3 sudo systemctl restart nfs-kernel-server
- Client setup
2.1 sudo apt-get install nfs-common
2.2 sudo mount -t nfs -o nolock,tcp 192.168.1.111:/home/username/share /mnt
2017/11/23
Linux 日志
对于记录与log文件中的日志,或者是在没有串口实时打印内核日志时,怎样也能实时查看日志呢?
- 对于内核日志: car /proc/kmsg
- 对于其他日志:tail -f /var/log/*.log
linux内核版本修改记录
可以在这个网站上查看,Linux内核每个版本更新的详细内容。
2017/10/01
centos
之前一直折腾的是ubuntu,现在因为公司项目的原因需要经常折腾centos,玩过centos才发现原来ubuntu是如此的好用,centos太难用了。因为难用,所以更得多记录折腾的经验。
安装pip
- 执行yum install epel-relese 按照EPEL(Extra Packages for Enterprise Linux).
- 执行yum -y update 更新 epel
- 执行yum -y install python-pip
将markdown写的技术文章转换为pdf
坚持在github上写博客已经好几年了,公司领导希望我上面一些对同事有帮助的文章放进公司内部的共享系统中,作为我的分享输出。于是开始寻求怎样将mardown文件直接转换为pdf文件。
- 执行pip install grip 安装grip工具
- 执行grip your_mardown.md –export your_html.html 使用grip先将markdown文件转换为html文件,因为转换工程中需要下载github上的资源,所以必须联网
- 登录 http://wkhtmltopdf.org/downloads.html 复制对应版本的 wkhtmltopdf工具的下载地址
- 执行 wget xxxx xxxx就是复制的地址
centos7 yum 更新出现【Error 14】HTTP Error 404的问题
今天想在centos7上装载新软件时发现一直提示镜像访问失败的错误,执行yum update也是一样,解决办法如下:
- 执行yum clean all
- 执行rpm –rebuilddb
执行上面两条命令后就正常了。
2017/04/01
升级ubuntu16.04 到 16.10
- 1.执行如下命令
> $ sudo apt-get update
> $ sudo apt-get upgrade
> $ sudo apt-get dist-upgrade
- 2.打开系统设置->软件和更新->更新,切换下图中的选项到
For any new version
- 3.执行 update-manager -d, 这时可能会提示先安装一些其他的更新,并且会要求重启。如果进行重启,重启后再此执行
update-manager -d
,这时会出现如下对话框
- 4.再继续后面的升级动作时,会出现
http://archive.ubuntukylin.com:10006/ubuntukylin/dists/yakkety/main/binary-amd64/Packages 404 Not
这样的错误。比较坑,解决办法是去掉如下最后一个选项。
- 5.后面就按部就班了。
2017/03/25
源码安装vlc
从github下载vlc源代码,进入vlc官网查看编译安装的一些提示。首先是执行./bootstrap
,其实就是执行vlc里面一些自动生成代码的脚本,建立起基本的编译环境。
然后肯定是安装依赖库,对于如此好大的项目自然是要依赖很多第3方开源库,执行sudo apt-get build-dep vlc
,总是提示You must put some source URIs in your sources.lsit
,这篇帖子提示编辑etc/apt/sources.list
,然后remove the # in front of the lines for universe
,我大概看了一下我ubuntu系统中的sources.list,感觉这样修改应该是没有用的。真正解决问题的方法如下图,在系统设置->软件和更新
有个源代码的选项
,默认是没有勾上的,必须勾上才行。
网上这个帖子讲到可能是因为服务器设置的不对导致执行apt-get build-dep vlc
失败。
然后执行./configure --help | less
看看支持哪些配置项,因为一开始肯定不是很熟悉怎样配置比较合理,参考vlc官网给出的配置例子,执行其中的linux
条目下的配置项。
然后出现 configure: error: Requested 'libavcodec >= 57.37.100' but version of libavcodec is 56.60.100. Pass --disable-avcodec to ignore this error.
错误。执行 apt-get upgrade libavcodec-dev
,竟然没有用。
网上搜索解决办法,stackoverflow上有人遇到一样的问题,并且尝试了很多方法都不行,后来看到有人说升级ubuntu到16.10就可以了,因为16.10的ubuntu里面安装的是新版本的libavcodec。感觉这个方法应该靠谱,然后屁颠屁颠的从16.04升级到了16.10,满怀希望的再次运行配置,尼玛,提示configure: error: Requested 'libavcodec >= 57.37.100' but version of libavcodec is 57.24.102. Pass --disable-avcodec to ignore this error.
哭啊。
没办法,暂时还是添加--disable-avcodec
选规避这个错误。继续执行,发现出现:
configure: error: protoc compiler needed for chromecast was not found
错误。执行如下命令:
可以看出可以添加--disable-chromecast
选项来规避。最后配置成功的结果如下:
配置完成后就可以执行make进行编译了,编译到中途出现qt中的一处头文件错误,由于暂时找不到解决方法,并且没有GUI方面的需求,所以直接在配置中添加--disable-qt
和 --disable-sinks2
规避这个错误。然后重新编译,一切正常。所以目前的最终配置如下:
./configure --enable-x11 --enable-xvideo --disable-gtk --enable-sdl --enable-ffmpeg --with-ffmpeg-mp3lame --enable-mad --enable-libdvbpsi --enable-a52 --enable-dts --enable-libmpeg2 --enable-dvdnav --enable-faad --enable-vorbis --enable-ogg --enable-theora --enable-faac--enable-mkv --enable-freetype --enable-fribidi --enable-speex --enable-flac --enable-livedotcom --with-livedotcom-tree=/usr/lib/live --enable-caca --enable-skins --enable-skins2 --enable-alsa --disable-kde--disable-qt --enable-wxwindows --enable-ncurses --enable-release --disable-avcodec --disable-chromecast --disable-qt --disable-skins2
执行make install
进行安装,vlc默认安装路径是/usr/local
,其中在/usr/local/bin下安装了如下软件:
其中的cvlc就是不带GUI的软件,执行./cvlc
会出现找不到链接库的错误,这是因为安装目录/usr/local/lib
不在系统链接库搜索路径中,执行ldconfig /usr/local/lib
就可以了。
2017/03/20
The best way to resize a partition with Gparted on Ubuntu
今天终于解决了扩展自己ubuntu笔记本/usr
分区的容量。一年前自己购买了一个新的笔记本,网上大概看了一下如果安装ubuntu 16.04TLS系统,算是很顺利的安装好了。一直使用以来都很正常,但是
因为当时在进行分区时,没有经验,给/usr
分区只分配了4G空间,结果导致研究systemTap
时,一个2个多G的Linux镜像符号表都放不了。而且导致我很多软件都不敢直接安装,必须源码编译安装到其他分区。
网上关于resize a partition
的问题和回答很多,但是正确的理解其他人的经验和方法还是挺困难的,尤其是完全的英文问答。下面记录一下详细的解决过程.
使用的工具和环境搭建
网上看到最多的回答就是,running from a live CD or USB
以及load Gparted and ...
。这些回答其实完整的说明应该是:
- First, make a ubuntu live-cd or live-usb with your current ubuntu system.
- Second,shutdown your computer and insert the USb disk before turn on again.
- Third, select ‘Try ubuntu system….’ to running the ubuntu in your usb disk. That means all the partition of your disk driver is unmount.
- Fourth,type ‘sudo gparted’ to load Gparted.
首先呢,所谓的live-cd live-usb,就是让你的电脑从你的cd或者U盘中进行启动运行,这样你电脑硬盘上的所有分区都是未挂载使用状态,这样你就可以安全操作你的分区了。 做出一个live-usb花了我好一会精力,因为使用ubuntu系统时间不长没有多少经验。下面先记录一下指针过程以及碰到的问题。
首先看到网上有这么一篇文章,Installation/FromUSBStick 详细说明了任何制作。主要章节是Creating a bootable
Ubuntu USB flash drive form Ubuntu
,里面首先说明要打开一个软件,”You can find usb-creator-gtk in the Unity Dash by typing “Start Disk Creator” or usb-creator-kde in …“,哎,使用第一种方法尝试打开ubntu soft center总是闪退,最后执行sudo apt-get install usb-creator-kde
安装完成了。然后,启动这个usb-creator-kde,一开始弹出下面这个对话框,因为是者软件出问题不能正常使用。后来反反复复更新发现还是一样。后来就不管了直接操作,点击里面的其他
选项按钮,选中之前安装笔记本中ubuntu系统的镜像文件,呵呵,然后就发现底下的制作启动盘
的选项被激活了,说明这个软件在正常工作的,最后看着进度条正常的前进者感觉好开心。
然后,重起电脑,果然在启动时的提示选项框中多了一个”Try … ubuntu…“的选项,意思就是从你的U盘启动系统。启动好后,执行sudo gparted
,结果弹出一个警告提示框,提示系统实际的物理快和什么不匹配什么的,上网查了一下,没有影响直接点击忽略就可以了。然后弹出如下画面:
注:上图是我调整完之后截的图,其中./sda11 分区就是之前的/usr分区。
扩展某个分区的几种方法和本次采用的方法
网上关于如何扩展某个分区的回答很多,比较靠谱和对我比较有帮助的一个是,通过使用gparted来把你想扩展的分区合并该分区下面紧挨着的
一个unallocated分区,例如,如果我要用这种方法扩展/sda11分区,那么我首先必须把/sda12分区的前一部分截断出一个为分配的(unalloced)分区。如何截取出一块分区给/sda11合并成较大的分区呢?点击/sda11分区,右击并选择其中resie/move(更改大小/移动)
,出现如下所示:
其中的选项很简单,意思就是可以截断前后一定的分区大小,剩下的就是该分区保留下来作为新的空间大小。因为我的/sda12只剩200多兆可用,所以直接简单的截断/sda12前面的一段空间给/sda11肯定是不行的。我只能想办法把/home分区多的几十G合并给/sda11,但是因为/home是/sda16和/sda11中间间隔了5个分区,必须通过先把/sda16的一部分空间合并给/sda15,然后/sda15在把多的空间合并给/sda14。。。,就这样一直传递到/sda11.显然这样太麻烦,我又怕这样操作会丢失数据,所有放弃这种方法。
第二方法是,手动复制 一个分区到新的分区,然后修改系统相关配置文件,来达成目的。这个帖子回答质量较高,透露了一些比较长知识的细节。但是我没有直接按照他的方法去做,而是综合了前一种方法,把两个方法结合起来,形成我认为是最方便安全的方法。
首先如上图,其中/sda17就是我按照方法1从/sda16后面截断了一块20多个G的空间的新分区,具体做法:
- 1.从优盘启动启动ubuntu,执行
sudo gparted
启动gparted软件。- 2.右击/sda16,选中”resize/move”选项,设置”Free space following”为2G大小,意思就是截断/sda16后面一部分空间形成一个20G大小的
unalloced
空间。- 3.右击这个刚刚形成的为使用的空间,选择
new
,意思就是创建一个新的分区,里面的选项保持默认就行。假设新得到的分区为/sda17。- 4.右击/sda11分区(这个就是我想要扩展的/usr分区),选择
copy
,然后右击/sda17选择paste
。这样/sda17就立刻变成了我们想得到的新的/usr分区。注意此时,/sda17和/sda11具有一样的内容一样的uuid, 所有正式启动ubuntu后,会出现随机挂载其中一个,而另外一个完全看到的情况。这时很简单执行第5步。- 5.右击/sda11选择
New UUID
就可以了。
这样/sda17就光明正大的名正言顺的成为我们的新/usr分区了,满满的20多G,妈妈再也不用担心我的/usr分区不够用了。
最后记录一下第2篇帖子的几个非常实用的命令。
2017/02/20
mesa 3d
公司项目中开始搞VR相关的功能了,计划是使用egl(openGL – gbm – drm)方案。mesa 是OpenGL的开源实现。
找到mesa的官网,找到了git仓库地址,执行git clone git://anongit.freedesktop.org/git/mesa/mesa
获取源码。
编译
执行./autogen.sh
生成configure文件。出现configure: error: Python mako module v0.8.0 or higher not found
错误,但是发现还是生成了configure文件。
网上查了一下mako,是python的一个模板库,感觉影响应该不大。先不管它,执行./configure
,则,还是提示找不到mako的错误。执行./configure --help | grep -i mako
想看看是否有配置选项可以跳过这个错误,因为我的ubuntu笔记本/usr目录内存分配的很少,所以不想装不必要的软件包。
执行apt-cache search mako
看看应该安装哪个软件包。然后执行sudo apt-get install python-mako
进行安装。然后从新执行./configure
,则,又出现No package dri3proto found
。
还是先执行./configure --help | grep -i dri3proto
看看能不能通过配置选项跳过这个错误。恩,这次运气不错,确实是有配置选项的。执行./configure --disable-dri3
就可以了。
2017/01/20
Github 博客问题修复
1.开始在我的ubuntu笔记本上维护github pages后,就出现点击文章跳转404的问题,一直没有去解决,今天终于解决了。
2.问题主要是在_config.yml
中的baseurl
和url
的设置上,原来的版本是这样的:
#baseurl:"" #the subpath of your site, e.g. /blog/
#url: "http://yourdomain.com" # the base hostname & protocol for your site
也就是说上面的baseurl
和url
根本就没有显示设置。正确的设置如下:
baseurl: /
url: http://saiyn.github.io/homepage
线程相关
1.POSIX线程的特征测试宏是_POSIX_THREADS,可以把这个宏由于#ifdef
测试,也可以把_SC_THREADS常数由于调用sysconf函数,从而在运行时确定是否支持线程。
2.比较两个线程ID的可移植方式是使用下面的函数那进行,但是linux中使用无符号长整形数表示pthread_t
数据类型。
#include "pthread.h"
int pthread_equal(pthread_t tid1, pthread_t tid2);
3.进程中的任一线程调用了exit,_Exit或者_exit,那么整个进程就会终止。
4.当读写锁是写加锁状态时,所有试图对这个锁加锁的线程都会被阻塞;当是读加锁状态是,所有试图以读模式对它进行加锁的线程都可以得到访问权限。
5.当读写锁处于读模式状态时,如果有另外的线程试图以写模式加锁,那么读写锁通常会阻塞随后的读模式加锁请求,这样可以避免读模式锁长期占用。
6.传递给pthread_cond_wait
的互斥量对条件进行保护,调用者把锁住的互斥量传递函数,函数把调用线程放到等待条件的线程列表上,然后对互斥量进行解锁。这两个操作是原子的,这样就保证了
调用线程不会错过条件的任何变化。pthread_cond_wait
返回时,互斥量再次被锁住。
7.如果对线程属性stackaddr作了修改,系统就会假设我们自己管理栈,并使警戒区机制无效,等同于把guardsize线程属性设为0。
8.要把信号发送到进程,可以调用kill
;要把信号发送到线程,可以调用pthread_kill
。
线程与信号
#include "signal.h"
int pthread_kill(pthread_t thread, int signo);
9.可以传一个0值的signo来检查线程是否存在。如果信号的默认处理动作是终止该进程,那么把信号传递给某个线程仍然会杀掉整个进程。
守护进程
1.使用命令ps -axj
来查看系统守护进程的相关信息。其中-x
显示没有控制中断的进程状态。
2.父进程ID为0的各进程通常是内核进程,它们作为系统自举过程的一部分而启动。init是此种进程的例外,它是内核在自举时启动的用户层命令。
3.所有的用户层守护进程都是进程组的组长进程以及会话首进程,而且是这些进程组和会话中的唯一进程。
4.大多数守护进程的父进程是init进程。
5.为了正常运作,某些守护进程实现为单实例的,也就是在任一时刻只运行该守护进程的一个副本。
守护进程的惯例
- 如守护进程使用锁文件的方式进行单实例化,那么该文件通常存放在/var/run目录下。锁文件的名字通常是
name.pid
,name是该守护进程或服务的名字。
- 若守护进程支持配置选项,那么配置文件通常存放在/etc目录中。配置文件的名字通常是name.conf
- 守护进程可用命令启动,但通常它们是由系统初始化脚本之一(/etc/rc* 或者/etc/init.d/*)启动。如果在守护进程终止时,应该自动重新启动它,则我们可在/etc/inittab中为该守护进程包括
_respawn
记录项。这样,init就将重新启动该守护进程。
- 一般守护进程只在启动是读取配置文件,要想让守护进程能够在不重新启动的情况下重新读取配置的,可以通过让守护进程捕捉SIGHUP信号来重读配置文件。
2017/1/13
中断的系统调用
1.如果进程在执行一个低速的系统调用而堵塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行,返回出错,其errno被设置为EINTR.
2.与被中断的系统调用相关的问题是必须显示地处理出错返回。典型的代码如下:
again:
if((n = read(fd,buf.BUFFSIZE)) < 0){
if(errno == EINTR){
goto again;
}
/*handle other errors*/
}
2016/1/7
Linux基础
1.使用whatis
查看命令所处的man分类页面。man
常用的分类如下:
(1).用户可以操作的命令或者是可执行文件。
(2).系统核心可调用的函数和工具等。
(3).一些常用的函数和数据库。
2.使用which
查看程序的binary文件在哪个位置。
3.使用whereis
查看程序的搜索路径。
4.ls | cat -n
给每项文件前面增加一个id编号。
5.启动账号后自动执行的是文件.profile
,然后通过这个文件可设置自己的环境变量。
2016/01/05
信号
1.执行一个无效的内存引用会产生SIGSEGV信号。
2.进程调用kill(2)函数可将信号发送给另一个进程或者进程组,但是前提是接受信号进程和发送信号进程的所有者必须相同,或者发送信号的进程的所有者是超级用户。
3.用户可用kill(1)命令将信号发送其他进程。常用此命令终止一个失控的后台进程。
4.SIGKILL和SIGSTOP这两种信号是绝对不能被忽略的,同时也是不能被捕捉的。
5.sigsuspend()
函数将进程的信号屏蔽字设置为由sigmask
指向的值。在捕捉到一个信号或者发生了一个会终止该进程的信号前,该进程被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend
返回,并且将该进程的信号屏蔽字设置为调用sigsuspend
之前的值。
6.注意,sigsuspend
函数没有成功返回值。如果它返回到调用者,则总是返回-1
,并将errno
设置为EINTR
(表示一个被中断的系统调用)。
管道
管道的主要确定是单向性,管道线的成员除了终止外(在这种情况下,前一阶段的程序会在下一个写操作时得到SIGPIPE
信号)不可能回传控制信息。因此,传输数据的协议简化为接受端的输入格式。
2016/12/25
xdg-open
1.在ubuntu下,使用xdg-open <path>
打开任意格式的文件,例如pdf,vsd等等。
q
find
1.GNU find searches the directory tree rooted at each given starting-point until the outcome is known (the left hand side is false for -and
operators, true for -or
), at which point find moves on to the next file name.
grep pattern $(find . -name '*.pm' -or -name '*.pl' | grep -v .svn )
2.-exec command {};
All following arguments to find are taken to be arguments to the command until an argument consisting of ‘;’ is encountered. The string ‘{}’is replaced by the current file name being processed.
下面是一个删除日志文件的例子:
$find . -name "*log" -exec rm {};
3.查看当前目录下文件数,find . | wc -l
4.否定参数,查找所有非txt文本:find . ! -name "*.txt"
5.指定搜索深度:find . -maxdepth 1 ! -name "*.py" -type f
。
6.按时间搜索:
- -atime 访问时间(单位是天,分钟单位是-amin,以下类似)
- -mtime 内容被修改时间
- -ctime 元数据或者权限被修改时间
最近第7天被访问过的所有文件:find . -atime 7 -type f
(-7 ->最近7天内;+7 ->7天前)
7.-print0
使用’\0’作为文件的定界符,这样就可以搜索包含空格的文件。
8.
2016/12/18
python相关
1.执行pydoc modules
可以查看目前系统中已经安装的python模块。
SQLite
1.可以在内存中创建数据库
con = sqlite3.connect(":memory:")
2.在创建数据库时如果设置isolation_level=None
,那么每次对数据库的操作都会自动执行提交。
con = sqlite3.connect("test.db", isolation_level=None)
3.使用查询语句时,sqlite返回的是元祖列表而不是列表。
tags = cusor.execute("SELECT tags from papers").fetchall()
print tags
tags = [tag[0] for tag in tags]
print tags
...
[('saiyn',),('saiyn',)]
['saiyn','saiyn']
4.
2016/12/04
Install Samba service on My Raspberry Pi 3
1.执行sudo apt-get install samba samba-common-bin
,安装。
2.执行sudo vim /etc/samba/smb.conf
修改共享目录[home]
的权限配置。
3.执行sudo /etc/init.d/samba restart
,重启samba服务。
4.执行sudo smbpasswd -a pi
把系统默认用户pi添加到samba。
5.在window启动命令输入\\192.168.1.108\pi
就可以访问了。
2016/11/27
Install OpenCV on My Raspberry Pi 3
1.运行 raspi-config
可以进行一些图形化的配置。
2.今天在opencv/build执行cmake时出现几处头文件找不到的错误。其中一个报错是linux/videodev.h:no such file or directory
.在网上看到一样的问题。网上有人说:installing libv4l-dev creates a /usr/include/linux/videodev2.h
。看到这里就明白为什么会报这个错误了。然后执行下面命令可以解决问题。
$sudo apt-get install libv4l-dev
$cd /usr/include/linux
$sudo ln -s ../libv4l-videodev.h videodev.h
3.虽然解决了上面这个错误但是还有其他几个错误网上找不到类似的,不过网上的其他内容忽然让我想到,我只下载了opencv_contrib.zip
但是没有执行解压缩。果然,执行解压缩之后,再次执行cmake,一切顺利。
4.从上面2个步奏也可以看出opencv_contrib
里面肯定做了一些软件版本匹配的功能,这样就解决一些头文件找不到的问题。
5.安装是完全安装这个教程来的。
6.执行workon cv
进入cv virtual environment
,执行source ~/.profile
退出。
2016/11/26
调试ffplay
1.之前已经记录了如何生成带调试信息的ffplay_g
,但是在调试跟踪一些ffmpeg里的函数时发现
gdb打印single stepping until exit from function xxx which has no line number information
,意思就是相应的动态库不是debug版本的。
2.网上查阅发现,其实在执行make时已经生成了带调试信息的动态库,只是在执行make install时没有安装这些带调试信息的动态库。
3.解决办法是执行cp ./*/*.so* /usr/local/ffmpeg/lib
.就是将生成的所有的动态库复制到安装目录中。
4.在用gdb进行调试时发现,设置的断点已经进行单步跟踪时,程序出现乱跳现象,而且p一些变量时总是说变量已经被优化了。这是因为ffmpeg在编译时是默认开启优化选项的,所以为了正常调试要修改编译配置。方法是加上--disable-optimizations
。然后还要主要执行上面的第3项.
cscope的使用
1.在源代码根目录下运行cscope -Rbq
生成数据库,相应的文件为,cscope.out,cscope.in.out以及cscope.po.out.
2.在缺省情况下,cscope在生成数据库后会进入自己的查询界面,如果不想进入这个界面就加-b
选项。
3.要在vim中使用cscope,首先要将数据库添加进vim。可以在.vimrc中完成,也可以通过执行
:cs add cscope.out
来手动添加。
4.可以通过执行:cs show
来确认添加库的情况。
ctags 和 taglist插件的使用
vim下结合cscope、ctags以及taglist插件基本上就可以搭建出一个和source insight差不多的代码编辑游览环境了。
ubuntu 18.04下安装ctags和taglist很简单,步骤如下:
-
执行
sudo apt-get install exuberant-ctags
安装ctags。 -
从http://www.vim.org/scripts/script.php?script_id=273下载最新版本的taglist plugin。
-
把下载的文件copy到
~/.vim
目录下解压,解压后会生成plugin/taglist.vim
和doc/taglist.txt
两个文件。 -
进入到你的源码目录下执行
ctags -R *
生成tags文件。 -
vim 打开一个源码文件,执行
:Tlist
在左侧出现一个函数符号和变量的导航窗口。
调用fork()
之后父子进程之间的文件共享
1.fork的一个特性是父进程的所有打开的文件描述符都会被复制到子进程中,父,子进程的每一个相同的 打开描述符都共享一个文件表项。
2.因为是共享同一个文件表项,所以父,子进程对同一个文件使用了一个文件偏移量。
3.
2016/11/24
实用的命令(ubuntu)
1.使用dpkg -l
查看系统已经安装了哪些软件.
2.使用apt-cache search xxx
搜索本地缓存中的软件包。
3.使用ldd xxx
来查看xxx程序依赖哪些动态链接库。
GDB调试技巧
1.使能和定义core dump
$ulimit -c unlimited
$mkdir /var/cores
$echo "/var/cores/core.%e.%p" > /proc/sys/kernel/core_pattern
2.使用i proc m
(info proc mappings)查看内存映射,以确定一些地址是否为有效地址。
3.将断点设在汇编级粒度
(gdb)b func
...
...
(gdb)b *func + 289
上面这个289
是使用disasm
命令打印出你想断点的地址偏移量。
4.使用p/a 0Xxxxxxxxx
打印出地址的符号,有点类似与info symbol 0Xxxxxxx
。
5.使用回退功能让我们可以以出现问题的点为终点,倒着调试我们的程序。
(gdb)r
...
...
(gdb)record
(gdb)c
...
...
(gdb)reverse-stepi
每执行一次reverse-stepi
就回退一次汇编执行。
6.使用p/x $rdi
打印你所感兴趣的寄存器的值,执行man syscall
你会发现rdi
寄存器是x86_64架构处理器保存函数第一个入参的寄存器。保存第2个到第6个的分别为rsi,rdx,r10,r8,r9。如果函数入参超过6个,那么多出的参数将存储在内存中。
7.执行 cond 1 $rdi==0x0
命令设置条件断点,然后执行i b
查看目前已经设置的断点情况。
8.p 一个void *
类型的指针变量,会提示”attempt to dereference a generic pointer”错误。
2016/11/22
动态链接库
1.Linux发行版中动态链接库一般位于/lib和/usr/lib目录中。
2.Linux系统中的动态链接库配置文件一般位于/etc/ld.so.conf
文件中,里面存放的是可以被系统共享的动态链接库所在目录的名字。
3.位于/sbin目录下的ldconfig
命令主要搜索/lib和/usr/lib,以及配置文件/etc/ld.so.conf里所列目录下搜索可用的动态链接库文件。然后创建动态加载程序/lib/ld-linux.so.2所需要的链接和缓存文件(etc/ld.so.cache).
4.运行ldconfig <dir>
命令将指定目录下的动态链接库被系统共享起来。
理解inode节点
1.使用df -i
可以查看每个硬盘分区的inode总数和已经使用情况。
2.打开文件系统内部实际执行三步:首先,系统找到文件名对应的inode号码;其次,通过inode号码获取inode信息;最后,提取inode信息,找到文件数据所在的block,读出数据。
3.每个目录项由两部分组成,所包含文件的文件名,以及该文件名对应的inode号码。
4.目录文件的读写权限都是针对目录文件本身的,由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息,因为其他信息都存储在inode节点中,而读取inode节点的信息需要目录文件的执行权限。
5.因为目录.
和..
分别是当前目录的和父目录的硬链接,所以任何一个目录的硬链接数目对于2+子目录总数。
6.与硬链接相对应的是软链接,A文件的内容是B文件的路径,读取A文件时,系统会自动访问文件B。使用命令ln -s <file b> <file a>
创建a->b的软链接。
7.
2016/11/21
Linux dd
命令
- 1.if=文件名:输入文件名,缺省为标准输入。
- 2.ibs=bytes:一次输入字节数,obs=bytes:一次输出字节数,bs=bytes:读入/输出字节数
- 3.cbs=bytes:一次转字节数,即指定转换缓存区大小。
2016/11/18
1.执行apt autoremove
以删除安装一些软件所需的临时依赖包,这样可以释放一些空间。
如何编译出ffplay_g
1.编译出ffplay_g的第一步是能够编译出ffplay,网上查阅知悉前提是要安装了sdl。这样在配置和编译ffmpeg时,才能生成ffplay。因为ffmpeg里面 会自动去检测系统中是否已经安装了sdl。
2.在安装sdl1.2时出现“正试图覆盖/usr/bin/sdl-config,它同时被包含于软件包sdl-devel”错误。估计是之前安装的软件有冲突。现在准备
卸载sdl-devel试试看。果然,使用apt-get purge sdl-devel
卸载后在执行apt-get install sdl1.2
就可以正常安装了。
3.果然,在安装好sdl1.2之后,执行./configure --enable-shared --prefix=$HOME/install/ffmpeg --enable-debug --extra-cflags=-g --extra-ldflags=-g --enable-outdev=sdl
之后,可以看见Enable outdevs:
底下出现了sdl。其实,不加上--enable-outdev=sdl
也是可以的,因为执行
./configure --help | grep sdl
看到…
4.
du 和 ls 的区别
1.rm 删除一个被其他进程正在打开的文件时,该文件在磁盘上的数据并不会立即释放掉。因为rm其实只是删除了文件名到文件在磁盘位置的连接, 即相当于减小了该文件的引用计数。
2.使用lsof | grep deleted
命令可以查看所有被删除的但是文件句柄还没有释放的所有文件和打开该文件的进程。
2016/10/23
ffmpeg
编译可调试的ffmpeg,配置选项加上--enable-debug --extra-cflags=-g --extra-ldflags=-g
2016/10/16
GDB调试技巧
set scheduler-locking [on/off]
: If on. then only the current thread may run when the inferior is resumed.
这个命令的主要用途就是:The step mode optimizes for single-stepping, it prevents other theads from preempting the current thread while you are stepping, so that the focus of debugging does not change unexpectedly.
checkpoint
: Setting a bookmark to return to later.
这个命令主要用途是:If you’re stepping thru a program and you think you’re getting close to the point where things go wrong. you can save a checkpoint. Then. if you accidentally go too far and miss the critical statement, instead of having to restart your program from the beginning, you can just go back to the checkpoint and start again from there.
调试复杂的宏定义
: 在编译参数中添加-g3
,然后在遇到需要展开的宏时调用macro exp xxx
.
2016/10/07
Unix as IDE
1.记录一下微博上看到到的一篇技术文章Unix as ID中的精华。
首先是File and project management
:
a)There are other switches to GNU ls which are less frequently used.
- -t –List files in order of last modification date.
- -X –Group files by extension.
- -S –Sort by filesize.
- -R –List files recursively.
执行下面的命令可以add explanations of what each file is for and save it as an inventory file or add it to a README.
$ ls -XR | vim -
b)Finding files.
- find -name ‘*.c’ –Find files with names matching a shell-style pattern.
- find -path ‘test’ –Find fiiles with paths matching a shell-style pattern.
- find -mtime -5 –Find files edited within the last five days.
- find -newer server.c –Find files more recently modified than server.c.
Note,in particular,that all of these can be combined,for example to find C source files edited in the last two days:
$ find -name '*.c' -mtime -2
c)Searching files.
- grep -l –Print a list of files that match without printing the matches themselves.
grep -v –$ grep -r someVar . grep -v .svn
d)File metadata
The file
tool gives you a one-line summary of what kind of file you’re looking at.
$ find -exec file {} \;
.: directory
./.hanoi.swp: Vim swap file, version 7.3
./bits.c: C source, ASCII text
2016/10/04
gstreamer
1.使用grep时加上--exclude-dir=
参数指定搜索时需要排除的目录。
2.在测试gstreamer的demo程序时发现,如果不加上--gst-debug-level=4
命令行参数的话,调用插件库时会报找不到库的错误。
2016/10/02
gstreamer
1.运行df -hl
查看磁盘剩余空间。
2.今天在编译gstreamer的时候,提示NO packet glib-2.0 Found
,需要运行apt-get install libglib2.0-dev
而不是apt-get install glib2.0
.
3.由于系统的/usr
磁盘容量不足,在以源代码编译安装软件时,都将install
目录设置在容量较大的/home
下.配置gstreamer
安装目录很简单,就是在
执行make
前执行./configure --prefix=/home
。
4.一般以编译源代码安装软件都有一个设置PATH
和LD_LIBRARY_PATH
的过程。编辑/etc/profile
,在文件尾部添加export LD_LIBRARY_PATH=/home/lib:$LD_LIBRARY_PATH
以及eport PATH=/home/bin:$LD_LIBRARY_PATH
。
当然在修改配置文件后需要执行source /etc/profile
以使新配置立即生效。
5.gstreamer的编译使用了pkg-config
工具,所以在编译应用程序前,先要安装上面方式添加环境变量PKG_CONFIG_PATH
.
2016/10/01
vim 编程技巧
1.之前安装过TAGS插件,运行:Tlist
左侧弹出类似SI的左侧导航窗口。
2.Tab页游览目录,运行:Te
进行分页式游览。gt
-切换到下一页,gT
-切换到前一页。运行tabs
以查看当前分页情况。
vim c函数名高亮
1.在/etc/vim/vimrc
配置文件中通过syntax on
只能高亮代码中的部分符号和关键字。这是因为控制c代码的语法高亮的具体配置/usr/share/vim/vim74/syntax/c.vim
中
没有高亮函数名的控制。
2.较好的解决办法是新建~/.vim/syntax/c.vim
,并在其中添加如下配置:
syn match cFunctions "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
syn match cFunctions "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1
hi cFunctions gui=NONE cterm=bold ctermfg=blue
vim 剪辑板功能
不同于windows下,在ubuntu下想复制其他编辑器里面的内容或者是网页上的内容到vim下没有那么简单。因为vim中涉及到剪辑板有好多种,我们习惯进行的右击复制或者是ctl+c只是将内容复制到了 系统剪辑板中,所以在vim中直接按p肯定是不行的。需要执行下面的步骤:
首先执行命令查看当前的vim环境是否支持系统剪切板:
如果发现像上面图中clipboard和xterm_clipboard前面都是-
号,说明你当前的vim环境不支持访问系统剪切板。
这时需要执行
sudo apt-get install vim vim-scripts vim-gtk vim-gnome
然后再次执行命令发现,-
号变成了+
。
随便在网页上复制一段文字,然后打开vim,执行:reg
,你会发现有如下图所示的一行以+
开头的东西比较眼熟,那就是刚才我们复制的到系统剪切板中的内容。
最后按下3个组合建"+p
,加上shift
其实是4个组合键就可以将刚才网页上复制的东西粘贴过来了。
2016/9/25
解决ubuntu 16.04 下Realtek无线网卡rtl8723be信号差的问题
在ubuntu forums网站上找到了相关的帖子Realtek RTL8723BE weak wifi signal
,很多人遇到一样的问题,很多人也给了解决办法,但是很多方法不是没有用就是留了很多坑。
现在记录一下我的解决过程:
1.下载编译安装最新的驱动
#git clone git@github.com:lwfinger/rtlwifi_new.git //解决信号差问题的分支不在主干上,所以下载下过程后还要切换分支
#git branch -r
origin/HEAD -> origin/master
origin/kernel_version
origin/master
origin/rock
origin/rock.new_btcoex
#git checkout origin/rock.bew_btcoex /fix再这个分支上
#git branch
* (头指针分离于 origin/rock.new_btcoex)
master
#make
#make insatll
2.关掉Secure Boot
我就是在这里踩了坑,执行modprobe -v rtl8723be
时,总是报错“Required key noy available”,帖子上也有很多人遇到相同问题,然后有一个贴出了一大段命令,如何解决这个问题。
坑的是,他的方法没有用。后来自己bing了一下这个问题,别人的一段回答马上点醒了我:Since Ubuntu kernel4.4.0-20 the EFI_SECUER_SIG_ENFORCE
kermel config has been enabled.
That prevents from loading unsigned third party modules if UEFI Secure Boot is enbaled。
#mokutil --disable-validation //关掉UEFI Secure
#reboot
3.卸载旧驱动,加载新驱动
从前后会进入grub启动界面,在里面确认关掉UEFI Secure。重启完成后执行下面
最重要的是在/etc/modprobe.d/rtl8723be.conf
里面加上:options rtl8723be ant_sel=2
这么一行配置。
#modprobe -vr rtl8723be
#modeprobe -v rtl8723be
2016/9/20
搜狗输入中英切换的快捷键是ctrl+空格
树莓派3-开发环境搭建
前几天入手了目前最新的树莓派3,由于没有购买显示器并且没有可以通过网线连接到我树莓派的路由器,所以开发环境的搭建有点坎坷。
第一步:能够ssh登陆到树莓派
想要配置开发环境,由于没有显示器,首先得可以ssh上树莓派。直接通过笔记本本地连接树莓派,通过Advanced IP Scanner
软件始终扫描不到树莓派IP.
网上资源显示,树莓派默认是DHCP,但是我以前自己开发的网络设备就支持在dhcp超时一定时间后进入auto ip 模式,这样可以也可以直连访问。
没办法,只能第二天去公司,接上HDMI显示器和键盘开本地配置网络了。
静态IP的配置方法:
命令行配置wifi无线连接
树莓派上git配置和生成RSA用于clone github上的仓库
1.设置用户和邮箱
git config –global user.name “xxx” git config –global user.email “xxxx”
2.生成SSH秘钥 ssh-keygen -t rsa //直接回车3次,就将key默认放在/root/.ssh下
3.在github上添加ssh秘钥 cat /root/.ssh/id_rsa.pub复制到github中settting中。
1)#iwlist scan 执行上面命令查看周围可连接的无线设备,有时需要执行多次命令才能看到信息。 2)#vi /etc/wpa_supplicant/wpa_supplicant.conf 编辑上面的wifi配置文件,在文件最后添加如下内容 network={ ssid=””
2016/8/7
ubantu 16.04 安装deb软件包失败的问题
今天再安装搜狗输入法的时候,双击下载下来的deb安装包,没有什么反应,然后只是弹出系统错误的对话框。
既然双击安装不行,我就在命令行执行sudo dpkg -i xxx.deb
,结果提示依赖关系找不到,网上找到了解决办法。
就是先执行apt-get install -f
git使用的命令
使用git add <file>
将修改的文件添加到本地仓库缓冲区。
使用git commit -m "log"
将缓冲区的内容推送到本地仓库工作区。
使用git push origin <branch-name>
将本地修改同步到远程仓库。
当然如果是多人协作开发的仓库,则应该先执行git pull origin <branch-name>
同步到最新版本,然后在push自己修改的内容。