张帅依的博客

积累点滴.

Archlinux安装deb文件

以安装ue为例

  1. 解压deb:ar -x uex_4.2.0.11_amd64.deb
  2. 解压data:tar xzvf data.tar.gz
  3. cd usr/bin下运行uex发现缺少libpn12.so.0。
  4. 编译libpng12.so.0。下载libpng-1.2.52.tar.gz解压后./configure && make
  5. 链接.libs/libpng12.so.0.52.0到/lib64下。
  6. 也可以通过ldd uex检查一下动态库是否完整。我自己编译了libpng12后就可以运行了
  7. 网上有人说删除自己用户目录下的.idm/uex/uex.conf就可以再试用30天,还没试过。

Gdb使用

常用命令

  1. r 运行程序
  2. c 当中断后继续运行
  3. n 单步运行(跳过函数)
  4. s 单步运行(进入函数)
  5. q 退出gdb
  6. l 显示代码

    断点

  7. 函数中设置断点:b XXX.c: n 在XXX.c的第n行设置断点
  8. 条件断点: b XXX.c :n if cmd 当cmd为true时在XXX.c的第n行停

    打印

  9. p XX 打印XX的值
  10. 打印数组 p *a@len 打印数组a中的前len个数值

Octave入门

archlinux系统安装octave:sudo pacman -S octave
命令结尾有’;‘不回显结果,没有则回显。

1 创建矩阵

输入A = [ 1, 1, 2; 3, 5, 8; 13, 21, 34 ]
A = 1 1 2 3 5 8 13 21 34

输入B = rand(3, 2)
B = 0.19238 0.18948 0.31423 0.43650 0.26412 0.84209

2 运算

2*A
ans =
    2    2    4
    6   10   16
    26   42   68
A*B
ans =
    1.0349    2.3102
    4.2613    9.4876
    18.0799   40.2607
A'*A
ans =
    179    289    468
    289    467    756
    468    756   1224

3 解线性方程组

使用’\‘解线性方程组,Ax=b,x=A\b
A = [ 2, 0; 0, 2 ]; b = [ 2; 1 ]; x = A \ b x = 1.00000 0.50000

4 绘图

抛物线
x=-2;0.01;2; y=x.*x; plot(x,y) 其中’.‘点乘指的是分别相乘。

Linux测试常用命令

关内核打印

内核打印在串口上输出时有时会影响系统响应速度,尤其是内核中断里的打印,如果中断中打印在串口上输出,有时会造成意想不到的错误
echo 0 > /proc/sys/kernel/printk
所有的内核打印都不在串口上输出,默认可使用4。
查看内核打印有两个方法dmesg或cat /proc/kmsg

查看cpu主频

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor查看当前CPU管理策略
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq当前CPU主频
通过echo命令可直接修改scaling_governor和scaling_max_freq。

查看进程内存使用

cat /proc/[pid]/status其中VmRSS一项就是内存使用情况

ip命令

ip addr 查看ip地址
ip link show 查看设备硬件信息
ip link set wlp3s0 down 关闭wlp3s0设备
ip route show 查看路由信息      
ip address add 172.18.88.82/16 dev eth0 添加ip      
ip address del 172.18.88.82/16 dev eth0 删除ip

C解析命令行参数getopt_long

getopt_long支持长选项的命令行参数解析,我的例子

  1. 单个字符,表示选项
  2. 单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg
  3. 单个字符后跟两个冒号,表示该选项后可以有参数也可以没有参数。如果有参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg

NDK编译zlib和libpng

下载zlib-1.2.8.tar.xz和libpng-1.6.13.tar.xz,解压tar -xJvf xx.tar.xz

编译zlib

编写zlibbuild.mk文件,对照源码下的win32/Makefile.gcc文件填写LOCAL_SRC_FILES项:

LOCAL_PATH:= $(call my-dir)  

include $(CLEAR_VARS)  

LOCAL_SRC_FILES := \
    adler32.c \
    compress.c \
    crc32.c \
    deflate.c \
    gzclose.c \
    gzlib.c \
    gzread.c \
    gzwrite.c \
    infback.c \
    inffast.c \
    inflate.c \
    inftrees.c \
    trees.c \
    uncompr.c \
    zutil.c  

LOCAL_MODULE:= libz  

include $(BUILD_STATIC_LIBRARY)

编写build文件

ndk-build \
NDK_PROJECT_PATH=`pwd` \
APP_ABI=armeabi-v7a \
APP_PLATFORM=android-14 \
APP_BUILD_SCRIPT=`pwd`/zlibbuild.mk \
TARGET_PRODUCT=alltarget \
$@

执行. build编译

编译libpng

参照源码下的scripts/makefile.gcc文件填写LOCAL_SRC_FILES项:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES := \
    png.c \
    pngerror.c \
    pngget.c \
    pngmem.c \
    pngpread.c \
    pngread.c \
    pngrio.c \
    pngrtran.c \
    pngrutil.c \
    pngset.c \
    pngtrans.c \
    pngwio.c \
    pngwrite.c \
    pngwtran.c \
    pngwutil.c

LOCAL_MODULE := libpng

LOCAL_LDLIBS := -lz

include $(BUILD_SHARED_LIBRARY)

编译时提示缺少pnglibconf.h文件,解决办法使用源码下的scripts/pnglibconf.h.prebuilt文件,ln -s scripts/pnglibconf.h.prebuilt pnglibconf.h

Nginx 学习

配置

配置文件:/etc/nginx/nginx.conf,将

location /images/ {
        root   /data;
}

加入/etc/nginx/nginx.conf

启动

sudo systemctl start nginx

测试

将cap_jar.jpg复制到/data/images/目录下,运行wget http://localhost/images/cap_jar.jpg 可将文件下载下来

Ndk相关

头文件

在android-ndk-r9c/platforms/android-14/arch-arm/usr/include/下可以查看ndk相关的头文件,比如android/log.h

编译工具

编译工具在android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin/下。

调试命令addr2line

addr2line 0x08048258 -e test -f

gdbserver

在android端运行gdbserver :1234 –attach 96 #:1234是端口号,96 是进程ID
在pc端运行adb forward tcp:1234 tcp:1234 #端口映射,将pc机的1235端口映射到手机的1234端口
运行arm-linux-androideabi-gdb

(gdb) target remote:1234

Python Ctypes使用c库

我的例子

调用c++

c++编写的so库要加上extern “C”,要不然找不到函数

传递字符串

使用c_char_p(b”xxxx”)传递字符串,如果直接用xxx的话,c层只能得到一个字符。

from ctypes import *
rpng = cdll.LoadLibrary("/home/zsy/lqbz/java/librpng.so")
rpng.savejar2png(c_char_p(b"testEn.jar"), c_char_p(b"test.png"), c_char_p(b"cvout.png"))

python调用shell

我的例子
os.system(“adb push libjni.so /system/lib”)

加密模式和填充方式

模式介绍

  1. 电码本模式(Electronic Codebook Book(ECB))
    这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。
  2. 密码分组链接模式(Cipher Block Chaining (CBC))
    这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

    填充方式

    JCE中支持AES,支持的模式和填充方式
    JCE中AES支持五中模式:CBC,CFB,ECB,OFB,PCBC;支持三种填充:NoPadding,PKCS5Padding,ISO10126Padding。不支持SSL3Padding。不支持“NONE”模式。

其中AES/ECB/NoPadding和我现在使用的AESUtil得出的结果相同(在16的整数倍情况下)。不带模式和填充来获取AES算法的时候,其默认使用ECB/PKCS5Padding。

算法/模式/填充                   16字节加密后数据长度         不满16字节加密后长度
AES/CBC/NoPadding              16                         不支持
AES/CBC/PKCS5Padding           32                         16
AES/CBC/ISO10126Padding        32                         16
AES/CFB/NoPadding              16                         原始数据长度
AES/CFB/PKCS5Padding           32                         16
AES/CFB/ISO10126Padding        32                         16
AES/ECB/NoPadding              16                         不支持
AES/ECB/PKCS5Padding           32                         16
AES/ECB/ISO10126Padding        32                         16
AES/OFB/NoPadding              16                         原始数据长度
AES/OFB/PKCS5Padding           32                         16
AES/OFB/ISO10126Padding        32                         16
AES/PCBC/NoPadding             16                         不支持
AES/PCBC/PKCS5Padding          32                         16
AES/PCBC/ISO10126Padding       32                         16

可以看到,在原始数据长度为16的整数倍时,假如原始数据长度等于16n,则使用NoPadding时加密后数据长度等于16n,其它情况下加密数据长度等于16(n+1)。在不足16的整数倍的情况下,假如原始数据长度等于16n+m[其中m小于16],除了NoPadding填充之外的任何方式,加密数据长度都等于16(n+1);NoPadding填充情况下,CBC、ECB和PCBC三种模式是不支持的,CFB、OFB两种模式下则加密数据长度等于原始数据长度。