解决宿主机Mac不能访问虚拟机中CentOS的Tomcat服务器

情况描述

虚拟机中的系统为CentOS,充当服务器,但是开启Tomcat后,在宿主机Mac中无法访问,显示请求被拒接,如下:
这里写图片描述
除此之外,但是可以使用ssh,也可以ping通

分析

初步认为就是防火墙的问题,但是参考iptables的一些停用方法,直接显示没有iptables这个服务;后面想验证到底是宿主机还是虚拟机的问题,在5000端口,跑了一个简单的Flask服务器(在虚拟机中可通过本机ip地址+端口号进行访问),在宿主机中仍然无法访问,同时也通过其他的一些设备来访问相应的服务器,都无法访问,从这里看来,问题还是出在了虚拟机中;后面又在宿主机mac中开启了一个服务器,在虚拟机和其它局域网设备中都可以访问,因此断定还是虚拟机的问题。那么,没有安装iptables的CentOS,究竟是出了什么问题呢?

解决办法

因为我使用的是CentOS 7,使用iptables的版本是7以前的,CentOS 7使用firewall作为防火墙。

查看已经开放的端口:firewall-cmd --list-ports
开启端口:firewall-cmd --zone=public --add-port=80/tcp --permanent

命令含义:

1
2
3
–zone #作用域
–add-port=80/tcp #添加端口,格式为:端口/通讯协议
–permanent #永久生效,没有此参数重启后失效

重启、停止、禁用、查看防火墙

1
2
3
4
firewall-cmd --reload #重启firewall
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

因此结合上述命令来看,需要将8080端口添加到防火墙的开放端口中,然后重新载入防火墙的配置即可。如下:

1
2
3
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

最后面来一张成功访问的截图:
这里写图片描述

参考:https://www.cnblogs.com/oskyhg/p/7293915.html

Maven构建项目

Maven常见的打包方式有:

  • jar
    jar工程,很显然就是pom工程的子工程,由pom工程来管理。
  • war
    war工程是一个web工程,是可以直接放到tomcat下运行的工程。
  • pom
    pom工程一般都是父工程,管理jar包的版本、maven插件的版本、统一的依赖管理,它是一个聚合工程。其实说白了它只有一个pom.xml文件,一般是作为父工程出现的,只是定义了一些依赖、插件、还有一些版本号等等。

使用maven的好处

  • 依赖管理、jar包、工程之间的依赖。
    Maven定义了软件开发的整套流程体系,并进行了封装,开发人员只需要指定项目的构建流程,无需针对每个流程编写自己的构建脚本。
  • 项目构建。实现项目的一步构建。
    除了项目构建,Maven最核心的功能是软件包的依赖管理,能够自动分析项目所需要的依赖软件包,并到Maven中心仓库去下载。
    管理Jar包的依赖。
    管理工程之间的依赖关系,即可使用Maven依赖其他的工程。
  • 工程聚合、继承、依赖。

构建父工程

父工程应该是一个pom工程。在父工程中定义依赖的jar包的版本信息。Maven插件的版本。即其它项目通过依赖父工程项目,来统一版本号及其他信息。

聚合

该项目中可以聚合几个其它的项目,然后打包成一个war包。

Cmake的基本使用

这几天项目中接触到了NDK相关的东西,顺便把Cmake相关的东西补了一下。搞明白了之后, 使用CLion都得心应手了!这篇博客记录一些自己使用到了的并且理解了用法。

Cmake是什么

cmake最终生成的是相应的所需要的Makefile,但是Makefile有很多种,因此它可以起到一个跨平台的作用。

使用基本指令

命令 解释 示例
add_library 生成库,如.so add_library(TestLib SHARED library.c library.h)
add_executable 生成可执行文件 add_executable(leetcode007 leetcode_007.cpp)
target_link_libraries 链接其他库到目标库或者可执行文件上 target_link_libraries(executor ${PROJECT_SOURCE_DIR}/../TestCppLib/cmake-build-debug/libTestLib.so)
include_directories 添加其他需要编译的文件 include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include )

CLion中的应用

每添加一个可执行的程序,就会添加一个运行目标。明白怎么搞成像Code::Blocks那样的功能了,加上它的代码提示,要上天啊。
这里写图片描述
生成的so库在这里
这里写图片描述
更多可参考:http://www.hahack.com/codes/cmake/

安卓系统应用调试脚本

这是一个对之前写的脚本的记录档案,自己也看不太懂当时的写法了,羞愧。用一个 repo 放这些脚本代码感觉有些浪费,干脆整个文章记录曾经的那段历史吧!

这代码的主要目的就是想少敲点命令,一步到位,做一个快男!

说明 - AndroidROMTools

Android run script tools for debugging system apps or frameworks. This was used by myself when debugging system apps or frameworks. In this project, module names was not given to avoid the project name, but the main structure was reminded.

此脚本主要分成一个入口与两个模块,详细的树状图如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
├── README.md
├── btool
├── modules
│   ├── handleFramework.sh
│   ├── handleXxxx.sh
│   └── handleXxxxxx.sh
└── utils
├── handleSpecificTask.sh
├── init.sh
├── printOperationTip.sh
├── tipWhenNotImplement.sh
└── tipWhenParametersError.sh

2 directories, 10 files

入口

名字叫 btool,为啥起这个怪名字,我也不知道。

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
# initialize variables
var1=$1
var2=$2
var3=$3
UTILS_DIR=~/.PersonalTools/utils
MODULES_DIR=~/.PersonalTools/modules

case $var1 in
"init" )
${UTILS_DIR}/init.sh
;;
"log" )
adb logcat -b main \*:E | grep "TAG"
;;
"wxxxx" )
${MODULES_DIR}/handleXXXX.sh $var2 $var3
;;
"txxxx" )
${MODULES_DIR}/handlexxxxxx.sh $var2 $var3
#${UTILS_DIR}/tipWhenNotImplement.sh $var1
;;
"txxxx" )
${UTILS_DIR}/tipWhenNotImplement.sh $var1
;;
"mxxxx" )
${UTILS_DIR}/tipWhenNotImplement.sh $var1
;;
* )
#${UTILS_DIR}/tipWhenParametersError.sh init xxxxxx *xxxxxx* *xxxxxx* *xxxxxx*
if [ "${var1}" == "" ]; then
${UTILS_DIR}/tipWhenParametersError.sh init xxxx *xxxx* *xxxxxx* *xxxxxx*
elif [ -f ${MODULES_DIR}/$var1.sh ]; then
#${UTILS_DIR}/tipWhenParametersError.sh init xxxxxx *xxxxxx* *xxxxxx* *xxxxxx*
${MODULES_DIR}/$var1.sh
else
${UTILS_DIR}/tipWhenParametersError.sh init xxxxxx *txxxxxx* *txxxxxx* *mxxxxxx*
${UTILS_DIR}/tipWhenNotImplement.sh "${var1}"
fi
;;
esac
exit

Utils

  • 初始化:init.sh

    1
    2
    3
    #!/bin/bash
    adb root
    adb wait-for-device remount
  • 打印带颜色的字符:printOperationTip.sh

    1
    2
    3
    4
    5
    6
    #!/bin/bash
    #echo -e "\e[31;43m-----------------------------------------------------------\e[0m"
    echo ""
    echo -e "\e[31;47m\t"$1"\t\e[0m"
    echo ""
    #echo -e "\e[31;43m-----------------------------------------------------------\e[0m"
  • 模块未完成的告警提示:tipWhenNotImplement.sh

    1
    2
    #/bin/bash
    echo -e "\nModule < \e[41m$1\e[0m \e[31m>NOT IMPELEMNT!\e[0m\n"
  • 参数错误提示:tipWhenParametersError.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #/bin/bash
    #clear
    echo ""
    echo -e "\e[31;42mOops! Please give me the \e[0m\e[1;5;40;31mcorrect\e[0m\e[31;42m parameters!!!\e[0m"
    echo ""

    params=""
    cnt=1;
    for i in $@;
    do
    if [ $cnt != 1 ]; then
    params=$params",\e[1;5;31;40m "$i" \e[0m"
    else
    params="\e[1;5;31;40m "$i" \e[0m"
    fi
    cnt=$(($cnt+1))
    done
    if [ $cnt == 1 ]; then
    params="\e[4;31mNONE\e[0m"
    fi
    echo -e "\e[33mavaliable parameters are :\e[0m" $params"\n"
  • 处理特定任务:handleSpecificTask.sh

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    #!/bin/bash

    UTILS_DIR=~/.PersonalTools/utils

    OP_INDEX=$1
    PROJECT_SRC_DIR=$2
    APP_SRC_DIR=$3
    APP_OUT_DIR=$4
    APP_REMOTE_DIR=$5
    APP_PKG_NAME=$6
    PROJECT_LUNCH_IDX=$7

    #for i in $@; do
    #statements
    # echo $i
    #done

    # for compile SnapCamera APK in


    #if [ -f /tmp/btoollog ]; then
    #echo "exist"
    #else
    #echo "/tmp/btoollog not exists"
    #mkdir /tmp/btoollog
    #fi

    function compileModifiedSourceCode(){
    ${UTILS_DIR}/printOperationTip.sh "<Prepare to Compile>"
    cd ${PROJECT_SRC_DIR}
    pwd
    source build/envsetup.sh
    lunch ${PROJECT_LUNCH_IDX}
    cd ${APP_SRC_DIR}
    pwd
    mm
    }

    function makeSureCloseCompletelyAndReopen(){
    ${UTILS_DIR}/printOperationTip.sh "<Prepare to force-stop APK>"

    echo -e "\n\e[32m\ttry to stop app\e[0m"
    adb shell am force-stop ${APP_PKG_NAME}
    echo -e ""

    echo -e "\n\e[32m\ttry to start app\e[0m"
    adb shell am start -n ${APP_PKG_NAME}
    echo -e ""
    }

    function pushCompiledAPK2Phone(){
    ${UTILS_DIR}/printOperationTip.sh "<Prepare to Push APK>"
    cd ${APP_OUT_DIR}
    #pwd
    #echo "${APP_OUT_DIR}"
    adb push . ${APP_REMOTE_DIR}
    #adb push oat/arm64/$appname.odex /system/priv-app/$appname/oat/arm64/$appname.odex
    if [ $? -eq 0 ]; then
    echo -e "\n\e[32m\tpush app to phone successfully\e[0m"
    fi
    echo -e ""
    }

    function checkPushedFilesStatus(){
    ${UTILS_DIR}/printOperationTip.sh "<Prepare to Check Push Result>"
    adb shell ls -l ${APP_REMOTE_DIR} ${APP_REMOTE_DIR}/oat/arm64/
    if [ $? -eq 0 ]; then
    echo -e "\n\e[32m\tconnect to phone successfully\e[0m"
    fi
    echo -e ""
    }

    case $1 in
    "0" )
    compileModifiedSourceCode
    pushCompiledAPK2Phone
    makeSureCloseCompletelyAndReopen
    checkPushedFilesStatus
    ;;
    "1" )
    compileModifiedSourceCode
    ;;
    "2" )
    pushCompiledAPK2Phone
    ;;
    "3" )
    makeSureCloseCompletelyAndReopen
    ;;
    "4" )
    checkPushedFilesStatus
    ;;
    "subl" )
    subl ${APP_SRC_DIR}
    ;;
    "src" )
    echo ${APP_SRC_DIR}
    ;;
    * )
    ${UTILS_DIR}/tipWhenParametersError.sh 0 1 2 3 4 subl src
    echo -e "\t\e[1;4;5;31;40m 0 \e[0m\t : \e[33m1 -> 2 -> 3 -> 4\e[0m"
    echo -e "\t\e[1;4;5;31;40m 1 \e[0m\t : \e[33mCompile Modified Source Code\e[0m"
    echo -e "\t\e[1;4;5;31;40m 2 \e[0m\t : \e[33mPush Compiled APK 2 Phone\e[0m"
    echo -e "\t\e[1;4;5;31;40m 3 \e[0m\t : \e[33mClose App\e[0m"
    echo -e "\t\e[1;4;5;31;40m 4 \e[0m\t : \e[33mShow App Info\e[0m"
    echo -e "\t\e[1;4;5;31;40m subl \e[0m\t : \e[33mOpen App Src With Sublime Text\e[0m\n"
    echo -e "\t\e[1;4;5;31;40m src \e[0m\t : \e[33mPrint SRC path\e[0m\n"
    ;;
    esac

模块

  • Android Framework 处理:handleFramework.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/bash
    SRC_HOME=/home/ckt/work/xxxxxx/msm8909_go/LINUX/android/frameworks/base
    OUT_HOME=/home/ckt/work/xxxxxx/msm8909_go/LINUX/android/out/target/product/msm8909go/system/framework

    cd /home/ckt/work/xxxxxx/msm8909_go/LINUX/android/

    source build/envsetup.sh
    lunch 29
    make framework
    make snod

    adb push ${OUT_HOME}/arm/boot.oat /system/framework/arm/
    adb push ${OUT_HOME}/arm/boot.art /system/framework/arm/

    adb push ${OUT_HOME}/framework.jar /system/framework/
    adb push ${OUT_HOME}/framework-res.apk /system/framework/

    adb reboot bootloader
  • 桌面时钟:handleXxxx.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #/bin/bash

    UTILS_DIR=~/.PersonalTools/utils

    PROJECT_DIR="/home/ckt/work/android8"
    PROJECT_SRC_DIR=${PROJECT_DIR}
    PROJECT_OUT_DIR=${PROJECT_DIR}/out/target/product/msm8953_64
    PROJECT_LUNCH_IDX=39

    DESKCLOCK_SRC_DIR=${PROJECT_SRC_DIR}/packages/apps/DeskClock/
    DESKCLOCK_OUT_DIR=${PROJECT_OUT_DIR}/system/app/DeskClock/
    DESKCLOCK_PKG_NAME=com.android.deskclock
    DESKCLOCK_REMOTE_DIR=/system/app/DeskClock


    case $1 in
    "deskclock" )
    ${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${DESKCLOCK_SRC_DIR} ${DESKCLOCK_OUT_DIR} ${DESKCLOCK_REMOTE_DIR} ${DESKCLOCK_PKG_NAME} ${PROJECT_LUNCH_IDX}
    ;;
    * )
    ${UTILS_DIR}/tipWhenParametersError.sh deskclock
    ;;
    esac
  • 多媒体应用:handleXxxxxx.sh

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #!/bin/bash

    UTILS_DIR=~/.PersonalTools/utils

    PROJECT_DIR="/home/ckt/work/xxxxxxx/LINUX/android"
    PROJECT_SRC_DIR="${PROJECT_DIR}"
    PROJECT_OUT_DIR="${PROJECT_DIR}/out/target/product/msm8909go"
    PROJECT_LUNCH_IDX=29

    SOUNDRECORDER_SRC_DIR="${PROJECT_SRC_DIR}/packages/apps/SoundRecorder/"
    SOUNDRECORDER_OUT_DIR="${PROJECT_OUT_DIR}/system/priv-app/SoundRecorder/"
    SOUNDRECORDER_PKG_NAME=com.android.soundrecorder
    SOUNDRECORDER_REMOTE_DIR=/system/priv-app/SoundRecorder

    GALLERY_SRC_DIR="${PROJECT_SRC_DIR}/packages/apps/Gallery2/"
    GALLERY_OUT_DIR="${PROJECT_OUT_DIR}/system/app/Gallery2/"
    GALLERY_PKG_NAME=com.android.gallery3d
    GALLERY_REMOTE_DIR=/system/app/Gallery2

    SNAPDRAGONMUSIC_SRC_DIR="${PROJECT_SRC_DIR}/packages/apps/Music/"
    SNAPDRAGONMUSIC_OUT_DIR="${PROJECT_OUT_DIR}/system/app/Music/"
    SNAPDRAGONMUSIC_PKG_NAME=com.android.music
    SNAPDRAGONMUSIC_REMOTE_DIR=/system/app/Music

    CLOCK_SRC_DIR="${PROJECT_SRC_DIR}/packages/apps/DeskClock"
    CLOCK_OUT_DIR="${PROJECT_OUT_DIR}/system/app/DeskClock"
    CLOCK_PKG_NAME=com.android.deskclock
    CLOCK_REMOTE_DIR=/system/app/DeskClock

    case $1 in
    "soundrecorder" )
    ${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${SOUNDRECORDER_SRC_DIR} ${SOUNDRECORDER_OUT_DIR} ${SOUNDRECORDER_REMOTE_DIR} ${SOUNDRECORDER_PKG_NAME} ${PROJECT_LUNCH_IDX}
    ;;
    "gallery" )
    ${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${GALLERY_SRC_DIR} ${GALLERY_OUT_DIR} ${GALLERY_REMOTE_DIR} ${GALLERY_PKG_NAME} ${PROJECT_LUNCH_IDX}
    ;;
    "music" )
    ${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${SNAPDRAGONMUSIC_SRC_DIR} ${SNAPDRAGONMUSIC_OUT_DIR} ${SNAPDRAGONMUSIC_REMOTE_DIR} ${SNAPDRAGONMUSIC_PKG_NAME} ${PROJECT_LUNCH_IDX}
    ;;
    "clock" )
    ${UTILS_DIR}/handleSpecificTask.sh $2 ${PROJECT_SRC_DIR} ${CLOCK_SRC_DIR} ${CLOCK_OUT_DIR} ${CLOCK_REMOTE_DIR} ${CLOCK_PKG_NAME} ${PROJECT_LUNCH_IDX}
    ;;
    * )
    ${UTILS_DIR}/tipWhenParametersError.sh soundrecorder gallery music clock
    ;;
    esac

目前这些脚本对我来说,已无实际用途,不能保证准确性,只是做一个纪念,纪念那段无知却在挣扎的时光。

ProjectA 项目辅助脚本档案

本文主要记录在做 ProjectA 时用到的 Python 脚本,因为用得频繁,所以做成了脚本,避免重复输命令。

项目树状结构图如下:

1
2
3
4
5
6
.
├── CommonTips.py
├── DumpPhotos.py
├── FallWithMask.py
├── OfflineSoRunner.py
└── main.py

它主要的功能是:

  • 从 Android 手机拉取照片(需要手机连接到电脑并且安装好 adb 命令)
  • 在 Android 手机上以 shell 的形式跑 so 库算法,一般是在 apk 上运行
  • 这个带 mask 分析已经看不懂是什么意思了

入口:main.py

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
28
29
30
31
32
import CommonTips
import DumpPhotos
import OfflineSoRunner
import FallWithMask
sub_model_name = 'Main Menu'
op_info = '''\n--------------Main Menu--------------
| 【0】:Dump照片
| 【1】:离线跑算法库
| 【2】:带mask分析跌倒视频''' + CommonTips.tip_ops+'-------------------------------------\n'
print(op_info)

while True:
cmd = input('('+sub_model_name+')'+CommonTips.tip_input_cmd)

if cmd.isdigit():
cmd = int(cmd)
if cmd == 0:
DumpPhotos.main()
elif cmd == 1:
OfflineSoRunner.main()
elif cmd == 2:
FallWithMask.main()
else:
print(CommonTips.tip_arg_error)
else:
if 'h' == cmd.lower():
print(op_info)
elif 'q' == cmd.lower():
print(CommonTips.tip_quit)
break
else:
print(CommonTips.tip_arg_error)

提示输出:CommonTips.py

1
2
3
4
5
6
7
8
9
tip_arg_error = '''--------------------------
| X 参数错误,请重新输入! |
--------------------------\n'''
tip_quit = "已退出子模块"
tip_input_cmd = "请输入命令:"
tip_ops = '''\n|************************************
| 【h】:打印本帮助
| 【q】:退出本模块
'''

拉取照片:DumpPhotos.py

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import os

import CommonTips

sub_model_name = 'Dump照片'

save_path = "C:\\Users\\D22433\\Desktop\\DumpPhotos\\"
remote_path = "/sdcard/AlgoTest/"

pull_photo_2_local = "adb pull "+remote_path+" "+save_path
del_local_photos = "del /Q "+save_path+"\\*"
del_remote_photos = 'adb shell "rm -rf '+remote_path+'/*"'

op_info = '''--------------Dump照片--------------
| 【0】:从安卓端拉取dump照片至本地
| 【1】:删除本地dump照片
| 【2】:删除安卓dump照片
| 【3】:删除本地&安卓dump照片''' + CommonTips.tip_ops+'-----------------------------------'


def main():
print(op_info)
while True:
cmd = input('('+sub_model_name+')'+CommonTips.tip_input_cmd)

if cmd.isdigit():
cmd = int(cmd)
if cmd == 0:
os.system(pull_photo_2_local)
elif cmd == 1:
os.system(del_local_photos)
elif cmd == 2:
os.system(del_remote_photos)
elif cmd == 3:
os.system(del_local_photos)
os.system(del_remote_photos)
else:
print(CommonTips.tip_arg_error)
else:
if 'h' == cmd.lower():
print(op_info)
elif 'q' == cmd.lower():
print(CommonTips.tip_quit)
break
else:
print(CommonTips.tip_arg_error)


if __name__ == '__main__':
main()

离线跑 so 库:OfflineSoRunner.py

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# -*- coding:utf-8 -*-
import os
import CommonTips

sub_model_name = '跑离线算法库'

model_path_local = 'E:\\ProjectA\\latestModel'
model_path_remote = '/sdcard/apache/model/'

exe_path_local = 'E:\\projects\\Android\\projectA_app\\app\\build\\intermediates\\cmake\\debug\\obj\\arm64-v8a\\executor'
exe_path_remote = '/system/app/'

so_path_local = 'E:\\ProjectA\\latestLib'
so_path_remote = '/system/lib64/'

cmd_push_model = 'adb push ' + model_path_local + ' ' + model_path_remote
cmd_push_exe = 'adb push ' + exe_path_local + ' ' + exe_path_remote
cmd_grant_permission = 'adb shell chmod 777 /system/app/executor'
cmd_push_so = 'adb push ' + so_path_local + ' ' + so_path_remote

op_info = '''--------------跑离线算法库--------------
| 【0】:推送算法库所需要的数据文件
| 【1】:推送算法库so文件
| 【2】:推送可执行文件并授予运行权限
| 【3】:执行可执行文件
| 1 for testing checkFall
| 2 for testing detectFaceNumber
| 3 for testing extractFaceFeature
| others for quit.''' + CommonTips.tip_ops + '----------------------------------------'


def main():
print(op_info)
while True:
cmd = input('('+sub_model_name+')'+CommonTips.tip_input_cmd)
if cmd.isdigit():
cmd = int(cmd)
if cmd == 0:
os.system(cmd_push_model)
elif cmd == 1:
os.system(cmd_push_so)
elif cmd == 2:
os.system(cmd_push_exe)
os.system(cmd_grant_permission)
elif cmd == 3:
while True:
choice = input("测试选项:")
if choice == '1' or choice == '2' or choice == '3':
# do something about checkFall
command = 'adb shell "/system/app/executor ' + choice + ' `ls /sdcard/TestData' + choice + '`"'
print(command)
os.system(command)
else:
break
else:
print(CommonTips.tip_arg_error)
else:
if 'h' == cmd.lower():
print(op_info)
elif 'q' == cmd.lower():
print(CommonTips.tip_quit)
break
else:
print(CommonTips.tip_arg_error)


if __name__ == '__main__':
main()

带 mask 分析:FallWithMask.py

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import os

import CommonTips

sub_model_name = '带mask跌倒检测'

exe_path = 'E:\\ProjectA\\TestVideoWithMask\\TestVideoWithMask.exe'
video_path = 'E:\\ProjectA\\videos'
remote_path = '/sdcard/LuPingDaShi/Rec/'

op_info = '--------------带mask跌倒检测--------------'


def main():
# pull videos
pull = input("是否要从Android拉取视频(y/N):")
if pull == 'y':
os.system('adb pull '+remote_path+' '+video_path+' ')
os.system('adb shell rm '+remote_path+'* ')

files = os.listdir(video_path)
print("可用来测试的视频 :")
for f in range(0, len(files)):
print('【'+str(f)+'】 : '+files[f])

while True:
idx = input('(' + sub_model_name + ')' + "请选择序号:")

if idx.isdigit():
idx = int(idx)
if idx >= len(files) or idx < 0:
print(CommonTips.tip_arg_error+"---数组越界")
else:
os.system(exe_path + ' ' + video_path + '\\' + files[idx]+' >> log.txt')
else:
if 'h' == idx.lower():
print(op_info)
elif 'q' == idx.lower():
print(CommonTips.tip_quit)
break
elif 'r' == idx.lower():
files = os.listdir(video_path)
print("可用来测试的视频 :")
for f in range(0, len(files)):
print('【' + str(f) + '】 : ' + files[f])
else:
print(CommonTips.tip_arg_error)


if __name__ == '__main__':
main()

MyEclipse中Maven的配置与使用

Maven可以帮你搞定一些项目上的包依赖,与Android Studio中的Gradle有点类似,当然也有很大的不一样。目前认识还是有点粗浅,期待后续的深入。

配置

虽然MyEclipse上面也集成了Maven,但是版本比官网上的低一些。从官网上面下载最新的软件包,找个合适的位置解压,然后在环境变量中加入所解压目录下的bin目录。
这里写图片描述

具体的配置方式,视不同的Shell,修改不同的配置文件。再此处为zsh,修改了~/.zshrc的内容如下:
这里写图片描述
检查配置是否成功
这里写图片描述
还需要修改conf目录下的setting.xml文件的localRepository的路径。从注释我们可以看到,如果不设置的话,默认是在~/.m2/repository目录下。该目录的主要功能就是存放Maven从仓库里面下下来的包。
这里写图片描述

接下来在MyEclipse中集成我们下载后解压的Maven。打开Preference,依次选择Maven中的InstallationsUser Settings,添加Maven的路径以及配置文件后如下:
这里写图片描述
这里写图片描述

到此基本配置完成。

创建Maven项目

网上的博客,创建Maven项目的方式有很多,尚不清楚它们会不会有什么差异。不过能达到使用Maven的功能就没差了吧。

第一次创建Maven项目时,它从服务器上面下载jar包会花费很长的时间,请耐心等待

方法一:创建JavaWeb项目同时添加Maven支持

感觉这种方法流程较简单。创建流程如下:
New一个Web Project,然后勾上Add Maven Support选项
这里写图片描述
重复选择下一步,直到出现Maven的相关设置。这里被建议选择Standard Maven JEE project structure。其实就是项目的目录结构不一样。之后,选择到Finish即可完成创建。
这里写图片描述
创建后如下,但是请注意啊,这已经是第二次创建了。所以再重复一下:
第一次创建Maven项目时,它从服务器上面下载jar包会花费很长的时间,请耐心等待
这里写图片描述

方法二:创建Maven Web项目

选择创建一个Maven Project
这里写图片描述
选择创建
这里写图片描述
后续按实际需求填写即可

使用

在该项目的pom.xml中添加依赖信息,然后点击Build Project,Maven就会把相关的依赖信息都找齐到本项目中。

【工具使用】Linux实用命令之文件搜索

在工作中,经常遇到只知道一些模糊、大致的名字的一些类名或字段,从已知的一个目录下去搜索。然而有些命令实在是太好用了,好用到赞不绝口,也有一些命令,老是忘记。。。

find

最常用的场景是在framework目录下,有一些类,只知道类名,但是不知道它的具体的路径,总不可能去一个一个搜吧,还有一个可行的是去百度,但是这也不是很适合,因为还有更快的。

这个命令的功能实在是太强大了,所以按需而罗列吧。

  • 按文件名查找
    find dirname -name "filename"
    find dirname -name "*filename*" (使用正则表达式)
    find dirname -iname "filename" (忽略大小写)
    find dirname -name "filename 2> /dev/null" (忽略错误信息)

grep

这个也是一个强大的命令,配合正则表达式也是一个逆天的存在,但是一般情况下会我用到它的场景也就是两种:

  • 查找某个目录下所有的某列包含某字符串的文件
    grep -Rn "PatternSequence" . (找到并显示行号,不要太好用!)
  • 查找某文本中所有的含有某字符串的列
    这个不解释

git使用笔记

记录自己在使用git中所用到的命令,算是半个笔记吧~

git merge & git rebase

参考

git初次运行时的配置

三个地方

  • 系统级别,/etc/gitconfig, 修改此选项时需要加上 --system选项
  • 当前用户级别,~/.gitconfig, 修改此选项时需要加上--global选项
  • 当前仓库级别,.git/config。
    低级别覆盖高级别的配置信息。

配置信息

  • 用户名 git config --global user.name "John Doe"
  • 用户邮箱 git config --global user.email [email protected]
  • 编辑器 git config --global core.editor vim

查看信息

  • 查看所有配置信息 git config --list
  • 查看某项配置信息 git config user.name

忽略文件

.gitignore文件忽略不想进行版本控制的文件。
参考https://github.com/github/gitignore

命令的详情

git add

三个作用:

  • 添加追踪
  • 添加到暂存区
  • 标记冲突文件状态为已解决

git status -s

如果嫌弃不带-s的命令输出的信息太繁杂,那么可以使用这个。
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。
出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。

查看修改

git diff 查看尚未暂存的文件更新了哪些部分
git diff --staged 查看已暂存的将要添加到下次提交里的内容

提交更新

git commit

-m 添加一段信息,作为提交说明
-a 跳过暂存区,直接将已追踪的文件暂存起来并提交
–amend 此次提交的结果替代上次提交的结果

删除文件

git rm

从已跟踪文件清单中移除(确切地说,是从暂存区域移除),并连带从工作目录中删除指定的文件
-f 删除之前修改过并且已经放到暂存区域的文件
–cached 把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中

移动文件(或重命名)

git mv
等价于

1
2
3
mv 
git rm
git add

查看提交

git log

-p 显示每次提交的差异
-p -2 显示最近两次的差异
–stat 每次提交的简略的统计信息
–graph 显示 ASCII 图形表示的分支合并历史。
–pretty使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和format(后跟指定格式)。

移除暂存文件

git reset HEAD <file>... 将文件从暂存区移除

撤销文件的修改内容

git checkout -- <file>... 将此文件做的文件全部撤销

使用总结

git基本命令

git init 在执行命令的目录下创建git仓库

git add * 添加所有的文件到缓存区

git commit * -m 提交所有追踪的文件到git仓库

git pull origin master 从远程仓库拉代码到本地git仓库

git push origin master 将自己的代码推送到远程git仓库

创建新的分支

git branch 显示所有的分支

git branch -a 显示所有的分支包括远程的分支

git checkout -b branch_name 创建branch_name分支并切换到该分支上

git checkout branch_name 切换到branch_name分支上

关于.gitignore文件

这个文件顾名思义是起到忽略作用的,在git仓库中使用此文件,将不需要添加进git仓库的文件排除在外。可是在使用的时候,会遇到向其中添加了文件名,却
不起作用的情况。很奇怪,参考网上的说法,当已经添加该文件进入git仓库后,再在.gitignore中除去该文件,就会遇到这种情况,我就是属于这种情况,这时需要将其从仓库中删除,然后再执行git add时就会忽略掉该文件..gitignore只对未追踪的文件有过滤效果。可参考如下代码

1
2
3
git rm -r --cached .
git add .
git commit -m "comment"

关于本地分支与远程分支的链接关系

当从远程仓库上面拉下代码之后,其中有若干分支,如若想在本地建立一个分支,并使之与远程分支中的某个分支对应,那么该如何操作呢?

git checkout --track origin/branch_name local_branch_name 这个命令会自动创建local_branch_name,如果它已经存在了,那么将执行失败~

查看、删除远程仓库分支/Tag

试了试将所有的feature分支都推送到远程仓库,后来发现那个分支基本上没啥用,在将feature分支merge到dev分支上后,feature分支就一直处于当初的那个状态,当dev一直向前走的时候,你再次回到该feature分支,相当于回到了dev分支之前的某个节点,因此我认为将其推送到远程仓库是没有多大的意义的,所以动起了删掉所有本地和远程仓库中已merge的feature分支。

首先是查看远程仓库里面所含有的feature分支:

1
2
3
4
5
6
7
8
9
asahi@asahis-MBP  ~/AndroidStudioProjects/NHKNews   master  git branch -a
dev
feature-remote
* master
remotes/origin/HEAD -> origin/master
remotes/origin/dev
remotes/origin/feature-main-page
remotes/origin/feature-remote
remotes/origin/master

当使用git branch -d feature-main-page之后,得到的结果如上,可是我只是删除了本地的分支,远程的分支依然还在,该如何删除这个远程仓库里面的分支呢?有git命令为git push origin --delete origin/feature-main-page,可是出现错误,不能删除,因此试了另外一个命令git push origin :feature-main-page,成功删除。然后对于feature-remote分支,直接使用前条命令,可将本地与远程仓库里面的分支一起删除.

再次使用git remote show origin,查询得到的结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
* remote origin
Fetch URL: [email protected]:xuchuanjun/NHKNews.git
Push URL: [email protected]:xuchuanjun/NHKNews.git
HEAD branch: master
Remote branches:
dev tracked
master tracked
Local branch configured for 'git pull':
master merges with remote master
Local refs configured for 'git push':
dev pushes to dev (up to date)
master pushes to master (up to date)

总结:超强的总结