Hello World

2023 年 06 月 11 日

诗歌

聂鲁达【智利】

我简直无以言表,我

瞠目结舌

我头脑发热或羽翼失修

而使灵魂有点蠢动

我一意孤行

去诠释那团火


我记下第一行苍白文字

变态的、空洞无物、纯粹

的痴言乱语、一整个无知者的

终极智慧


而忽然间我瞥见

天堂之锁开启

诸多星辰、离离草木

镶边的幻影

迷一般地

与箭、火焰和花丛

以及寥廓长夜、寰宇浑然一体



软件开发中的问题归根结底是人的问题

需求设计:
    基本上到现在我就没见到过合格的理清疑问、细化细节的需求设计。
    很多人过来一个需求,就几句话,这算什么需求?

低效的沟通:
    有的人只会浪费时间写很长的邮件,却不拎起电话,或者当面来问。
    一件事情可以反复来回好几天,而本来可以只花十多分钟。

不切实际的项目进度安排:
    我发现很多项目经理只会强调早就失去意义的截止日期。
    我们搞工程,如果做出来的是个垃圾产品,死守预设日期有什么意义?

过多的会议:
    很多会,是和工程项目无关的。往往在大公司这种情况比较常见,
    因为个人往往会被摊上很多乱七八糟的事情,越往上越多。

垃圾网络。
    国情,不解释。

猪队友:
    很多问题,归根结底都是人的问题。
    比如:对技术缺乏“工匠精神”,能完成任务就好,从来不考虑其它方面、是否能进一步改进等等。
    对新技术缺乏敏感度,甚至抵触。
    缺乏团队精神,喜欢强调自己的职责范围,不在他所认为的范围内的事情,就不管不问。
    缺乏谦虚,自以为是,没有相互学习的精神。很多讨论,变成站队、甚至面子问题。

宝贝读物

  • <<我的情绪小怪兽>>
    引导宝宝如何理解情绪,为以后更好的控制管理自己的情绪打下基础。 情绪管理很重要,直接影响人际交往,问题解决,自信心等。
  • <<小灯泡情绪管理绘本>>
    来自韩国的"暖心"情绪绘本,为儿童的性情培养提供全面的解决方案,用一段段温情的亲子时光引导孩子. 学会正当释放情绪,培养健康快乐心态.

学习笔记

open edx

编程类开放书籍荟萃

流程图

sudo snap install drawio


匿名网盘
短链接服务

各类程序员学习路线图

Linux log日志占用
# Linux log日志占用
#Linux使用df -h检查磁盘文件,可以看到/run目录下有日志目录/run/log/journal,占用了数G空间。

du --max-depth=1 -h

#在日志目录下有很多历史累积的日志。

#Linux log日志清理
#检查当前journal使用磁盘量

journalctl --disk-usage

# 清理方法可以采用按照日期清理,或者按照允许保留的容量清理,只保存2天的日志,最大500M
journalctl --vacuum-time=2d
journalctl --vacuum-size=500M

#如果要手工删除日志文件,则在删除前需要先轮转一次journal日志
# systemctl kill --kill-who=main --signal=SIGUSR2 systemd-journald.service

要启用日志限制持久化配置,可以修改 /etc/systemd/journald.conf

SystemMaxUse=16M
ForwardToSyslog=no

然后重启

systemctl restart systemd-journald.service

# 检查journal是否运行正常以及日志文件是否完整无损坏
journalctl --verify

Ubuntu 编译源码包

http://blog.sina.com.cn/s/blog_476d8cf30100lnd4.html

$ sudo apt-get source tree

$ sudo apt-get build-dep tree

$ cd tree-1.5.1.2
$ sudo dpkg-buildpackage

#  构建 vlc 打包环境
apt-get update
apt-get install curl -y
curl -o /etc/apt/sources.list http://mirrors.163.com/.help/sources.list.trusty
apt-get update
sudo apt-get build-dep vlc -y
#sudo apt-get source vlc

镜像下载地址

源列表

$ curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ curl -o /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
$ sudo yum makecache


# centos/fedora 安装epel扩展源 并更换为科大开源镜像
$ sudo yum -y install epel-release
$ sudo sed -e 's!^mirrorlist=!#mirrorlist=!g' \
         -e 's!^#baseurl=!baseurl=!g' \
         -e 's!//download\.fedoraproject\.org/pub!//mirrors.ustc.edu.cn!g' \
         -e 's!http://mirrors\.ustc!https://mirrors.ustc!g' \
         -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo

Fodora 中文社区软件源

Ubuntu 源列表

# ubuntu14.04  163源
$ sudo wget -O /etc/apt/sources.list  http://mirrors.163.com/.help/sources.list.trusty
# sudo curl -o /etc/apt/sources.list http://mirrors.163.com/.help/sources.list.trusty

# ubuntu 14.04 更换阿里源
$ grep "archive.ubuntu.com" /etc/apt/sources.list && \
       sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list

# 科大源
$ sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
#  APT工具集使用的默认配置文件是/etc/apt/apt.conf
$ sudo tee /etc/apt/apt.conf <<-'EOF'
Acquire::http::proxy "http://127.0.0.1:8123/";
Acquire::https::proxy "https://127.0.0.1:8123/";
EOF

# 1.使用-o选项
sudo apt-get -o Acquire::http::proxy="http://127.0.0.1:8123/" update

# 2. 使用-c选项

$ sudo tee ~/apt_proxy.conf <<-'EOF'
Acquire::http::proxy "http://127.0.0.1:8123/";
Acquire::https::proxy "https://127.0.0.1:8123/";
EOF
sudo apt-get -c ~/apt_proxy.conf update


# 3. 如果我们设置了环境变量APT_CONFIG,那么APT工具集将使用APT_CONFIG指向的配置文件。
$ export APT_CONFIG=~/apt_proxy.conf
$ sudo apt-get update
apt-get download  <your_package_here> #  Download the binary package into the current directory
####################
apt-get clean
apt-get --download-only install <your_package_here>
cp /var/cache/apt/archives/*.deb <your_directory_here>

待研究

Udpcast


P2P File Transfer
https://github.com/ypingcn/P2PChat-Qt https://github.com/aanrv/P2P-File-Transfer-Client https://www.cnblogs.com/snake-hand/p/3148366.html https://blog.csdn.net/hackertom/article/details/73692902

http://www.isjian.com/

Linux From Scratch

https://linux.cn/lfs/LFS-BOOK-7.7-systemd/index.html

http://www.linuxfromscratch.org/

前端框架(js)
Meteor
BitTorrent
# 制作种子
mktorrent -a http://192.168.8.204:18888/announce -o drbl-live-xfce.iso.torrent /home/jxm/Downloads/drbl-live-xfce.iso
# or
ctorrent -t ~/Downloads/virtualbox-5.1.deb -u http://192.168.8.204:18888/announce -s virtualbox-5.1.deb.torrent

# 启动下载
ctorrent virtualbox-5.1.deb.torrent -s ~/Downloads/virtualbox-5.1.deb
BT Tracker List
https://github.com/ngosang/trackerslist https://newtrackon.com/
bittorrent文件编辑工具
  • BEncode Editor
  • TrackerEditor

邮箱

企业云邮箱各个服务器地址及端口信息如下:

收件服务器地址:

        POP 服务器地址:pop3.mxhichina.com 端口110,SSL 加密端口995
        或
        IMAP 服务器地址:imap.mxhichina.com 端口143,SSL 加密端口993

发件服务器地址:
        SMTP 服务器地址:smtp.mxhichina.com 端口25, SSL 加密端口465

ROS

  • PlotJuggler
apt-get install ros-melodic-plotjuggler ros-melodic-plotjuggler-ros





example
环境搭建
# 更换阿里源
sed -i 's/cn.archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list
sed -i 's/ports.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list # arm

#  添加 ROS源
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
sudo apt-get update

#apt-cache search ros-kinetic
sudo apt-get install ros-melodic-desktop-full --yes --allow-unauthenticated

# sudo apt-get install ros-kinetic-slam-gmapping -y # 地图建模

sudo rosdep init
rosdep update
sudo apt-get install python-rosinstall \
                     python-rosinstall-generator \
                     python-wstool \
                     build-essential --yes --allow-unauthenticated
source /opt/ros/kinetic/setup.sh

########################################
# install  ros melodic  on ubuntu 18.04
########################################
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
rosdep update

sudo apt install ros-melodic-desktop-full
# sudo apt-get install rosbash
# sudo apt-get install ros-melodic-rosbash ros-melodic-rosbash-params # install and reboot , roscd
sudo apt-get install ros-${ROS_DISTRO}-rosbash ros-${ROS_DISTRO}-rosbash-params

apt-cache search ros-melodic
# 小乌龟
source /opt/ros/melodic/setup.sh
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
常用命令
roscore

rqt_graph   #  查看节点关系

echo $ROS_PACKAGE_PATH

catkin_init_workspace

catkin_create_pkg <package_name> [depend1] [depend2] ... [dependn]
#catkin_create_pkg learning_communication std_msgs rospy roscpp
catkin_make

## 只编译白名单
catkin_make -DCATKIN_WHITELIST_PACKAGES="ros_pyqt;pyqt_gui;rqt_gui"
## 不编译,黑名单列表里面的包
catkin_make -DCATKIN_BLACKLIST_PACKAGES="dyn_cfg_gui;qt_ros_test;ros_cmake;qt4rosgui;test_gui;vizlib_test;rqt_mypkg;ros_cv_gui"

rosrun [package_name] [node_name]
rosnode
rosnode list                # 获得运行节点列表
rosnode info node-name      # 获得特定节点的信息
rosnode ping node-name      # 测试节点是否连通
rosnode kill node-name      # 终止节点
rospack
rospack -h
rosparam
rosparam set     set parameter             设置参数
rosparam get     get parameter             获得参数值
rosparam load    load parameters from file 从文件中加载参数到参数服务器
rosparam dump    dump parameters to file   将参数服务器中的参数写入到文件
rosparam delete  delete parameter          删除参数
rosparam list    list parameter names      列出参数服务器中的参数
rostopic
 rostopic -h

 rostopic type /sent_messages
 rosmsg info can_msgs/Frame

 #                           src topic   =>    des topic
 rosrun topic_tools relay /cv_camera/image_raw /camera/image_raw

 rostopic pub /chatter std_msgs/String  'hello'  # 发一次
 rostopic pub /chatter std_msgs/String -r 1 -- '{data: hello}' # 一秒发一次

 rostopic pub  /sent_messages can_msgs/Frame  -r 1 -- \
'{header: auto,id: 15, is_rtr: 0,is_extended: 0,is_error: 0,dlc: 8,data: [1,2,3,4,5,6,7,9]}'
roslaunch
一 node标签

    在<node>标签指定一个ROS 节点,这是最常见的roslaunch标签, 因为它支持最重要的功能: 启动和关闭节点。

    roslaunch不保证节点开始的顺序。
    因为没有办法从外部知道节点何时被完全初始化,所以所有被启动的节点必须是稳健的,以便以任何顺序启动。

二 示例

    <node name ="listener1" pkg ="rospy_tutorials" type ="listener.py" args =" -  test" respawn ="true"/>
        启动"listener1" 节点,使用listener.py从可执行rospy_tutorials 包与所述命令行参数--test。
        如果节点死亡,它将自动重新生成。

    <node name ="bar1" pkg ="foo_pkg" type ="bar" args ="$(find baz_pkg)/resources/map.pgm"/>
        从foo_pkg包中启动bar1节点。此示例使用替换参数将可移植引用传递到 baz_pkg/resources/map.pgm .

三 属性

    pkg ="mypackage" 节点包。
    type ="nodetype"
        节点类型。必须有一个具有相同名称的相应可执行文件。
    name ="nodename"
        节点基名称。注意:name不能包含命名空间。请改用ns属性。

    args ="arg1 arg2 arg3" (可选)
        传递参数到节点。
    machine =“machine-name” (可选)
        在指定机器上启动节点。

    respawn ="true" (可选)
        如果节点退出,则自动重新启动节点。
    respawn_delay ="30" (可选,默认为0)ROS indigo中的新功能
        如果respawn为true,请在尝试重新启动之前检测到节点故障后等待respawn_delay秒。

    required = "true" (可选)
        ROS 0.10:如果节点死亡,杀死整个roslaunch。

    ns ="foo" (可选)
        在"foo"命名空间中启动节点。
    clear_params ="true | false" (可选)
        在启动前删除节点的私有命名空间中的所有参数。
    output =“log | screen” (可选)

        如果'screen',stdout / stderr从节点将被发送到屏幕。
        如果是“log”,stdout / stderr输出将被发送到 $ROS_HOME/log中的日志文件,
        stderr将继续发送到屏幕。默认值为“log”。
    cwd =“ROS_HOME | node” (可选)
        如果为“node”,则节点的工作目录将设置为与节点的可执行文件相同的目录。
        在C Turtle中,默认值为“ROS_HOME”。在Box Turtle(ROS 1.0.x)中,默认值是'ros-root'。
        使用'ros-root'在C Turtle中已被弃用。

    launch-prefix ="prefix arguments" (可选)

        用于预先添加到节点的启动参数的命令/参数。
        这是一个强大的功能,使您能够启用gdb,valgrind,xterm,漂亮或其他方便的工具。

四 元素

    您可以在<node>标记中使用以下XML 标签:

    <env>
        为节点设置环境变量。

    <remap>
        为此节点设置重新映射参数。
        <remap from="/original_name" to="/new_name"/>

    <rosparam>
        将rosparam文件加载到此节点的〜 / local命名空间中。

        <rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml"
                command="load" ns="local_costmap" />

    <param>
        在节点的〜 / local命名空间中设置一个参数。
rosbag
rosbag -h

rosbag record -a
rosbag record /topic_name1 /topic_name2 /topic_name3
rosbag record -O/-o filename.bag /topic_name1 #  -O (大写) 后跟录制数据包的名字。
                                              #  -o(小写)则只是给数据包的名字加前缀。

rosbag record -a -O filename.bag -x "/monitor/(.*)" #记录过滤掉/monitor/*之外的其他topic

# 在运行rosbag record命令的窗口中按Ctrl-C退出该命令,即结束数据记录。

# 现在在~/bagfiles目录中应该会看到一个以日期和时间命名并以.bag作为后缀的 rosbag 文件,
# 它包含rosbag record运行期间发布的 topic。

如果在 launch 文件中使用 rosbag record 命令,如下

<node pkg="rosbag" type="record" name="bag_record" args="/topic1 /topic2"/>

默认存放路径是 ~/.ros 中。

rosbag info filename.bag
  • 回放
rosparam set /use_sim_time true # 使用的是仿真时间

# launch文件 设置
# <param name="use_sim_time" value="false" />



rosbag play <bagfile>
rosbag play ros.bag  /original_name:=/new_name  # rosbag remap topoic name
rosbag play -r 2 <bagfile> # 两倍的速度发布topic。 -r 后面的数字对应播放速率。
rosbag play -l  <bagfile>  # -l == --loop  循环播放
rosbag play <bagfile> --topics /topic1  # 只播放感兴趣的 topic
rosbag play <bagfile> -d <sec> # 等待一定时间之后发布bag文件中的内容 ;  rosbag  help play  | grep delay

# 在上述播放命令执行期间,空格键可以暂停播放。
  • 过滤
rosbag filter IN.bag OUT.bag 'topic == "/turtle1/command_velocity"'
rosbag filter skoda.bag skoda_filter.bag  "topic == '/BrakeCmd' or topic == '/SteeringCmd' or topic == '/ThrottleCmd' or topic== '/rosout' or topic=='/rosout_agg'"
  • 压缩 compress
# 有时候我们的包太大了,会导致打开很慢。比如25G的KITTI数据包可能需要10分钟打开。
# rosbag提供了两种压缩格式:BZ2和LZ4。
# 其中BZ2占用硬盘小,但播放慢。LZ4虽然对体积的压缩不多,但打开速度提高了数倍。
# 另外,此命令会自动备份要压缩的数据包,命名会加一个origin,所以无需担心。

rosbag compress --lz4 slam_2019-12-14-23-24-43_filter.bag

————————————————

原文链接:https://blog.csdn.net/a850565178/article/details/105820624

rosdep
rosdep install AMAZING_PACKAGE
rosdep install --from-paths src --ignore-src -r -y # 用于安装工作空间中所有包的依赖项
  • rosdep update一直timeout的问题 !
find  /usr/lib/python2.7/dist-packages/rosdep2/ -name "*.py" | xargs grep -n  "DOWNLOAD_TIMEOUT\ ="

#  将  DOWNLOAD_TIMEOUT = 15.0 的值,改大一点就可以了
知识点
CATKIN_IGNORE
touch /path/to/catkin_ws/your/package/CATKIN_IGNORE
ROSINFO
export ROSCONSOLE_FORMAT='[${severity}] [${time}]${node}--${function}-${line}: ${message}'

# ${line}     for __LINE__
# ${function} for __func__
# ${file}     for __FILE__
# ${node}     for the node name, no pre-processor equivalent.
package
  • image_transport

    # 解压缩
    # /cv_camera/image_raw/compressed  => /cv_camera/image_decompressed
    rosrun image_transport republish compressed in:=/cv_camera/image_raw \
                                               out:=/cv_camera/image_decompressed
    
    # /simulator/camera_node/image/compressed  => /image_raw
    rosrun image_transport republish compressed in:=/simulator/camera_node/image \
                                               out:=/cv_camera/image_decompressed
    
    <launch>
        <node name="image_decompresser" type="republish" pkg="image_transport" output="screen" args="compressed in:=/simulator/camera_node/image raw out:=/image_raw">
        </node>
    </launch>
    
  • 订阅 rtsp topic 发送 rtsp - ros_rtsp

  • rocon_rtsp_camera_relay
    mkdir -p  work_dir/src
    cd  work_dir/src
    git clone  --depth 1 https://github.com/robotics-in-concert/rocon_devices.git
    cd ../
    catkin_make
    
    source devel/setup.zsh
    
    # export ROCON_RTSP_CAMERA_RELAY_URL=rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov # public rtsp test url
    export ROCON_RTSP_CAMERA_RELAY_URL=rtsp://192.168.2.100:5540/ch0
    roslaunch rocon_rtsp_camera_relay rtsp_camera_relay.launch --screen
    
    rosrun rqt_image_view rqt_image_view /rtsp_camera_relay/image
    

 tar xzvf flycapture2-2.13.3.31-amd64-pkg_Ubuntu18.04.tgz
 cd flycapture2-2.13.3.31-amd64

 # README
 # Ubuntu 18.04:
 sudo apt-get install libraw1394-11 libavcodec57 libavformat57        \
     libswscale4 libswresample2 libavutil55 libgtkmm-2.4-1v5              \
     libglademm-2.4-1v5 libgtkglextmm-x11-1.2-0v5 libgtkmm-2.4-dev        \
     libglademm-2.4-dev libgtkglextmm-x11-1.2-dev libusb-1.0-0


 sudo bash install_flycapture.sh
 y
 y
 ${USER}
 y


To do this just add "raw1394" to the /etc/modules file.
# vim /etc/modules-load.d/modules.conf

#
git clone --depth  1 https://github.com/ros-drivers/pointgrey_camera_driver.git
source devel/setup.zsh
roslaunch pointgrey_camera_driver camera.launch

rostopic list

rviz
# imu
sudo apt-get install ros-melodic-imu-tools
_images/rviz_imu_plugin.png
tf变换
_images/Yaw_Axis_Corrected.svg
rosrun tf tf_monitor <source_frame> <target_target>
rosrun tf tf_echo <source_frame> <target_target>
rosrun tf view_frames
# << ROS机器人开发实践 >> Page 64
rosrun tf static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
rosrun tf static_transform_publisher x y z qx  qy  qz  qw frame_id child_frame_id period_in_ms
<!-- << ROS机器人开发实践 >> Page 64 -->
<launch>
<node pkg="tf" type="static_transform_publisher" name="world_to_map" args="0 0 0 0 0 0 /world /map 10" />
<node pkg="tf" type="static_transform_publisher" name="map_to_mobility" args="0 0 0 0 0 0 /map /mobility 10" />
</launch>
  • API

  • tf namespace
    • tf::TransformListener Class Reference
    cpp python type
    transformQuaternion() transformQuaternion() geometry_msgs/QuaternionStamped
    transformVector() transformVector3() geometry_msgs/Vector3Stamped
    transformPoint() transformPoint() geometry_msgs/PointStamped
    transformPose() transformPose() geometry_msgs/PoseStamped
    transformPointCloud() transformPointCloud() sensor_msgs/PointCloud
     static geometry_msgs::Quaternion createQuaternionMsgFromRollPitchYaw (double roll,
                                                                           double pitch,
                                                                           double yaw)
    
     void tf::Quaternion::setRPY(const tfScalar &   roll,
                                 const tfScalar &   pitch,
                                 const tfScalar &   yaw)
    
    // 将 tf::Quaternion 转换成  geometry_msgs::Quaternion
    static void quaternionTFToMsg ( const Quaternion &bt,
                                    geometry_msgs::Quaternion &msg)
    
  • geometry_msgs

ROS 分布式
sudo apt-get install chrony # 时间同步


export ROS_MASTER_URI=http://${MasterHostName}:11311
export ROS_HOSTNAME=192.168.1.102
export ROS_IP=192.168.1.102
export ROS_MASTER_URI=http://192.168.1.102:11311

#
export ROS_MASTER_URI=http://192.168.1.102:11311

https://www.jianshu.com/p/872dc7b514f1?utm_campaign

创建Deb安装包
sudo apt-get install python-bloom=0.10.2-100
# or sudo pip install -U bloom

#sudo apt-get install dpkg-dev debhelper
sudo apt-get install fakeroot=1.22-2ubuntu1
# 1. Create debian structure

#    To make a debian folder structure from the ROS package
#    you must cd into the package to be in the same folder where package.xml file is.
bloom-generate rosdebian --os-name ubuntu --os-version bionic --ros-distro melodic
# bloom-generate rosdebian --ros-distro melodic

# 2. Create binary debian
fakeroot debian/rules binary
  • 生成的deb安装包,依赖本地deb包

      1. 创建文件 rosdep.yaml
    pm_gnss_msgs:
        ubuntu: ros-melodic-pm-gnss-msgs
    
      1. /etc/ros/rosdep/sources.list.d/50-my-packages.list 编辑
    yaml file:///mnt/waypoint_follower/waypoint_follower_1.0/src/pure_pursuit_ext/rosdep.yaml
    
      1. 然后
    rosdep update                   # 更新本地
    rosdep db | grep  pm_gnss_msgs  # 查看
    
sensor
velodyne
_images/velodyne_default.png _images/velodyne-2.png
Motor RPM: 转速,范围(0-1200), 默认 600

Host(Destination)
    - IP Address    : 广播地址 255.255.255.255
                    : 单播地址 接收端(UDP Server)设备 IP , eg: 10.158.51.29
                      接收端设备IP,必须和此IP一致。


    - Data Port     : 网络端口 , default 2368
roslaunch velodyne_pointcloud VLP16_points.launch port:=2368
roslaunch velodyne_pointcloud VLP16_points.launch port:=2371

# topic
#    - /velodyne_points
LIO-SAM
docker pull daocloud.io/jiangxumin/lio_sam_utils:latest

docker run --rm --name=lio_sam_utils  -it -v $(pwd):/root/host_dir daocloud.io/jiangxumin/lio_sam_utils:latest
CAN BUS
Peak-CAN
# 1. install depends
sudo apt-get install linux-headers-`uname -r`  \
                libpopt-dev g++

# 2. build
tar -xzf peak-linux-driver-X.Y.Z.tar.gz
cd peak-linux-driver-X.Y.Z

make -j $(nproc)
make -C driver netdev
make -C lib
make -C test
make -C libpcanbasic


# 3. install
sudo make -C driver install
sudo make -C lib install
sudo make -C test install
sudo make -C libpcanbasic install

ip l | grep can

# 4.0 load peak_usb
sudo modprobe peak_usb # 卸载 sudo modprobe -r peak_usb

# 4.1  reboot
sudo shutdown -r now

# 5.  set can0  up
sudo ip link set can0 up type can bitrate 500000
ip -details -statistics link show can0

# 6.  test send
sudo apt-get install can-utils
cansend can0 123#0102030405060708
cangen -v can0   # 随机生成can消息
candump can0


### SecureBoot如果是 enable 状态,  需要进入 BOIS , 将 secure boot 关闭
### linux secure boot 状态查询:
mokutil --sb-state
pcanview
wget -q http://www.peak-system.com/debian/dists/`lsb_release -cs`/peak-system.list -O- | sudo tee /etc/apt/sources.list.d/peak-system.list
wget -q http://www.peak-system.com/debian/peak-system-public-key.asc -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get install pcanview-ncurses

  • jetson Tx2 install python-can
tar xzvf python-can-3.2.0.tar.gz
cd python-can-3.2.0/
ls
python3 setup.py build
python3 setup.py install --user

auto can0
iface can0 inet manual
        #pre-up ip link set $IFACE type can bitrate 125000 listen-only off
        pre-up /sbin/ip link set $IFACE type can bitrate 500000 triple-sampling on
        up /sbin/ifconfig $IFACE up
        down /sbin/ifconfig $IFACE down


auto vcan0
iface vcan0 can static
    bitrate 0  # NEEDED but not supported
    pre-up /sbin/ip link add dev $IFACE type vcan
    up /sbin/ip link set $IFACE up
    down /sbin/ip link set $IFACE down
#######################
## create vcan
#######################
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set vcan0 up
sudo ip link add dev vcan1 type vcan
sudo ip link set vcan1 up
ip l

## connect  vcan0 vcan1
sudo modprobe can-gw
sudo cangw -A -s vcan0 -d vcan1 -e
sudo cangw -A -s vcan1 -d vcan0 -e


rosrun socketcan_bridge socketcan_bridge_node _can_device:=vcan0
rostopic pub  /sent_messages can_msgs/Frame  -r 1 --  \
'{header: auto,id: 15, is_rtr: 0,is_extended: 0,is_error: 0,dlc: 8,data: [1,2,3,4,5,6,7,9]}'

rosrun socketcan_bridge socketcan_to_topic_node _can_device:=vcan0
rosrun socketcan_bridge topic_to_socketcan_node _can_device:=vcan0
$ sudo apt-get install ros-${ROS_DISTRO}-socketcan-interface \
                        ros-${ROS_DISTRO}-ros-canopen
$ rosrun socketcan_interface socketcan_dump can0 # dump
$ rosrun socketcan_interface socketcan_bcm can0  0.5 12#12345678 # id=12 周期0.5s

ZLG PCIe
  • ZLG PCIe-91XX系列LINUX驱动
#下载 PCIe-91XX系列LINUX驱动
wget https://www.zlg.cn/data/upload/software/Can/zpcican_socket.rar

# md5sum zpcican_socket.rar
# 6b3f6ee0f0aa8f84f2e2f6304f845fb4  zpcican_socket.rar

apt-get install unrar
unrar x zpcican_socket.rar

cd zpcican_socket/zpcican_socket_2018_11_07/

sed -i "s/4.4.0-31-generic/$(uname -r)/"  Makefile

make
# sudo modprobe sja1000
# sudo insmod zpcican.ko

sudo mkdir /lib/modules/$(uname -r)/kernel/drivers/net/can/zlg
sudo cp zpcican.ko /lib/modules/$(uname -r)/kernel/drivers/net/can/zlg/
sudo depmod
sudo modprobe zpcican

sudo tee -a /etc/modules-load.d/modules.conf <<-'EOF'
zpcican
EOF
advSocketCAN
sudo apt-get install -y flex bison
sudo tee /etc/modules-load.d/modules.conf <<-'EOF'
lp
    can
    can_dev
    can_raw
advsocketcan
    advcan_sja1000
EOF
sed -i "s/SUBDIRS/M/g"   advSocketCAN_V1.0.1.0/driver/Makefile
20c20
<   $(MAKE) -w -C $(KDIR) SUBDIRS=$(PWD) modules
---
>   $(MAKE) -w -C $(KDIR) M=$(PWD) modules
make
sudo make install
  • 系统内核
# 安装 18.04.4 lts :  http://old-releases.ubuntu.com/releases/18.04.4/
# 安装 18.04.5 lts
#           http://releases.ubuntu.com/releases/bionic/ubuntu-18.04.5-desktop-amd64.iso.torrent

# 4.15.0-20-generic
# KERNAL_VERSION=5.0.0-23-generic  # Ubuntu 18.04.4
# KERNAL_VERSION=5.3.0-59-generic  # Ubuntu 18.04.4

KERNAL_VERSION=$(uname -r)
KERNAL_VERSION=5.4.0-42-generic    # Ubuntu 18.04.5

sudo apt-get install linux-image-${KERNAL_VERSION} \
                     linux-headers-${KERNAL_VERSION} \
                     linux-modules-extra-${KERNAL_VERSION} # depends can-dev.ko

sudo apt-mark hold linux-image-${KERNAL_VERSION}  # 禁用系统升级

sudo apt-get install vim make gcc openssh-server

sudo shutdown -r now  #  重启


##  modinfo  ./advcan_sja1000.ko | grep depend
sudo apt-get install linux-modules-extra-$(uname -r) # depends can-dev.ko
# 安装内核
sudo apt-get install linux-headers-$(uname -r) linux-image-$(uname -r)

uname  -r # 查看当前内核版本
dpkg --get-selections | grep linux-image # 查看已安装内核镜像
sudo apt-mark hold linux-image-5.0.0-23-generic # 禁止内核更新
sudo apt-mark unhold linux-image-5.0.0-23-generic #解除禁用


# 或者 修改配置
#
#  修改系统配置,在/etc/apt/apt.conf.d目录下
#  10periodic、20auto-upgrades配置中1改为0即可
# /etc/default/grub
# sudo update-grub


grub_timeout_style=menu # 这里可以选择menu或者是hidden

GRUB_DEFAULT="Ubuntu 高级选项>Ubuntu,Linux 5.4.0-42-generic"
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu,Linux 5.4.0-42-generic"
GRUB_DEFAULT="1> 3"
can-dbc-parser

sudo apt-get install -y socat

socat -d -d pty,raw,echo=0 pty,raw,echo=0

sudo socat -d -d pty,raw,echo=0,link=/dev/ttyS0 pty,raw,echo=0,link=/dev/ttyS1
sudo apt-get install ros-melodic-uvc-camera
sudo apt-get install "ros-melodic-image-*"
sudo apt-get install ros-melodic-rqt-image-view

rosrun uvc_camera uvc_camera_node
rosrun image_view image_view image:=/image_raw
EMQ- MQTT

  • 在容器中搭建运行EMQ服务器(MQTT服务器)
  • 各个服务端口说明:
    • 1883:MQTT 协议端口
    • 8883:MQTT/SSL 端口
    • 8083:MQTT/WebSocket 端口
    • 8080:HTTP API 端口
    • 18083:Dashboard 管理控制台端口
  • 访问地址:http://服务器IP:18083
    • 默认用户名:admin
    • 默认密码:public
docker run --name emq \
    -p 18083:18083 \
    -p 1883:1883 \
    -p 8084:8084 \
    -p 8883:8883 \
    -p 8083:8083 \
    -d emqx/emqx

# pub.py

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: " + str(rc))

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('127.0.0.1', 1883, 600) # 600为keepalive的时间间隔
client.publish('fifa', payload='amazing', qos=0)
# sub.py
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: " + str(rc))

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('127.0.0.1', 1883, 600) # 600为keepalive的时间间隔
client.subscribe('fifa', qos=0)
client.loop_forever() # 保持连接
# sub.py

import paho.mqtt.client as mqtt
import time

#HOST = "127.0.0.1"
HOST = "192.168.2.102"
PORT = 1883

def client_loop():
    client_id = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
    client = mqtt.Client(client_id)    # ClientId不能重复,所以使用当前时间
    client.username_pw_set("jxm", "public")  # 必须设置,否则会返回「Connected with result code 4」
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect(HOST, PORT, 60)
    client.loop_forever()

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("test")

def on_message(client, userdata, msg):
    print(msg.topic+" "+msg.payload.decode("utf-8"))

if __name__ == '__main__':
    client_loop()
# pub.py

# import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish
import time

HOST = "127.0.0.1"
PORT = 1883
def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("test")

def on_message(client, userdata, msg):
    print(msg.topic+" "+msg.payload.decode("utf-8"))

if __name__ == '__main__':
    client_id = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
    # client = mqtt.Client(client_id)    # ClientId不能重复,所以使用当前时间
    # client.username_pw_set("admin", "123456")  # 必须设置,否则会返回「Connected with result code 4」
    # client.on_connect = on_connect
    # client.on_message = on_message
    # client.connect(HOST, PORT, 60)
    # client.publish("test", "你好 MQTT", qos=0, retain=False)  # 发布消息

    publish.single("test", "你好 MQTT", qos = 1,hostname=HOST,port=PORT,
                   client_id=client_id,auth = {'username':"jxm",
                                               'password':"public"})
  • C/C++
# C
man libmosquitto
vscode
  • 在 VSCode 中, c_cpp_properties.json 的"包含路径"如下所示.
"includePath": [
    "/home/shisato/catkin_ws/devel/include/**",
    "/opt/ros/melodic/include/**",
    "/home/shisato/catkin_ws/src/package_name/include/**",
    "/usr/include/**"
]
ctrl+shift+B

ROS2

培养解决问题的能力
    Coding is really just problem-solving, Don't be a programmer,be a problem-solver.
    写代码并不难,难得是如何解决问题,如何正确的解决问题,如何用简单高效的方案解决正确问题。

    编程其实只是一个工具,一个把任务自动化的工具。学习编程是为了解决现实中的问题的。

    学习新语言也是为了更高效更便捷的解决某个问题, 在问题解决之前,往往需要不断的调查,重写。
    所以编程,是在培养我们自己去发现问题、解决问题的能力.而这个能力也可以运用到生活的方方面面,永远不过时。

colcon build --symlink-install  --packages-select-by-dep  socketcan_bridge
colcon build --symlink-install  --packages-select  socketcan_bridge
  • Node
# 检查 turtlesim 是否已经安装
ros2 pkg executables turtlesim

ros2 node list
ros2 topic list
ros2 service list
ros2 action list


ros2 run <package_name> <executable_name>

ros2 node list

ros2 node info <node_name>

# 重映射
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

ros2 lifecycle set <nodename> shutdown  # kill node 有待验证
  • Topic
ros2 topic list

ros2 topic list -t

ros2 topic echo /turtle1/cmd_vel

# 主题信息
# ros2 topic info /turtle1/cmd_vel

# 消息类型
ros2 msg show std_msgs/String       # dashing
ros2 interface show std_msgs/String # galactic

# 消息频率
ros2 topic hz /turtle1/pose

# 消息发布
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}" # 1 Hz

ros2 topic pub --once /sent_messages can_msgs/msg/Frame  \
    "{header: { frame_id: 'map'} , id: 15, is_rtr: 0,is_extended: 0, is_error: 0, dlc: 8, data: [1,2,3,4,5,6,7,9]}"
ros2 topic pub --once /sent_messages can_msgs/msg/Frame  \
    "{header: {stamp: {sec: 0, nanosec: 0}, frame_id: 'map'} , id: 15, is_rtr: 0,is_extended: 0, is_error: 0, dlc: 8, data: [1,2,3,4,5,6,7,9]}"
  • Services
  • Parameters
ros2 param list
ros2 param get <node_name> <parameter_name>
ros2 param set <node_name> <parameter_name> <value>

ros2 param dump <node_name>
ros2 param load <node_name> <parameter_file>

ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
  • Actions
  • Recording adn playing back data
ros2 bag record <topic_name>

ros2 bag record /turtle1/cmd_vel

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose


ros2 bag info <bag_file_name>

ros2 bag play subset

git clone https://github.com/ros2/examples.git

git clone https://hub.fastgit.org/ros2/examples.git

---

LGSVL
galactic
apt-get install ros-galactic-lgsvl-msgs
mkdir  -p ros2_ws/src

git clone -b galactic-devel https://github.com/lgsvl/ros2-lgsvl-bridge.git  ros2_ws/src/ros2-lgsvl-bridge

cd ros2_ws

rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO

colcon build --cmake-args '-DCMAKE_BUILD_TYPE=Release'

. ~/ros2-lgsvl-bridge/install/setup.bash
lgsvl_bridge [--port 9090] [--log D]

Autoware

Autoware
autoware

  • Documentation
  • Autoware Universe
  • MkDocs Build

    ## 2022.09.26
    
    sudo pip3 install mkdocs==1.3.1
    
    pip3 install --user fontawesome-markdown==0.2.6
    pip3 install --user python-markdown-math==0.8
    pip3 install --user mdx_truly_sane_lists==1.3
    pip3 install --user plantuml-markdown==3.6.3
    pip3 install --user mkdocs-awesome-pages-plugin==2.8.0
    pip3 install --user mkdocs-exclude==1.0.2
    pip3 install --user mkdocs-macros-plugin==0.7.0
    pip3 install --user mkdocs-material===8.5.3
    pip3 install --user mkdocs-same-dir==0.1.1
    
    
    mkdocs serve -a 0.0.0.0:8000
    
  • IDL
安装
# # 更换阿里源, 网速快; 缺点, 当碰巧,阿里源正在和官方源同步的时段,会无法安装
# sed -i 's/cn.archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list # X86 中文
# sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list    # X86 英文
# sed -i 's/ports.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list      # arm

sudo apt-get -y update
sudo apt-get -y install git

######################################################
### geographiclib-tools
######################################################
sudo apt install geographiclib-tools
## sudo geographiclib-get-geoids egm2008-1

## http://192.168.2.100:8089/s/kQN2Gme9b5gkeSk?path=%2Fgeographiclib
tar xofjC egm2008-1.tar.bz2 /usr/share/GeographicLib
## tar xofjC egm2008-2_5.tar.bz2 /usr/local/share/GeographicLib

######################################################
### libtorch  ???/
######################################################
# Download http://192.168.2.100:8089/s/kQN2Gme9b5gkeSk?path=%2F
sudo unzip libtorch-1.6.0+cu11.1.zip -d /usr/local/

#
git clone https://github.com/autowarefoundation/autoware.git
cd autoware

./setup-dev-env.sh


cd autoware
mkdir src
vcs import src < autoware.repos

sudo apt-get install ros-galactic-pacmod3-msgs

source /opt/ros/galactic/setup.bash
rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO

定位
编译
###################################
# Autoware (install egm2008-1)
###################################

# file: egm2008-1.tar.bz
# size: 155M
# link: https://nchc.dl.sourceforge.net/project/geographiclib/geoids-distrib/egm2008-1.tar.bz
# 迅雷下载
sudo tar xofjC  egm2008-1.tar.bz2 /usr/share/GeographicLib

# https://geographiclib.sourceforge.io/html/geoid.html


###################################
# LibTorch (download)
###################################

# gdown https://drive.google.com/u/0/uc?id=1eNh3F3xCQ4AMJEHtwb1dhshSyzWMjoc8 -O /tmp/libtorch.zip
# Lantern 下载
yolo
sudo apt-get install ros-galactic-v4l2-camera

ros2 launch tensorrt_yolo tensorrt_yolo.launch.xml \
    engine_file:=${HOME}/autoware.galactic/install/tensorrt_yolo/share/tensorrt_yolo/data/yolov3.engine
Autoware.AI
https://pic2.zhimg.com/80/v2-f36c99478ce4d0b7ecd8b8ad61a9ed95_720w.jpg
一 环境搭建
1 安装 CUDA 10.0
  • Step 1 : revmoe nvidia

    sudo apt-get remove --purge nvidia*
    
  • Step 2 : Install cuda 10.0

    下载链接: cuda-repo-ubuntu1804_10.0.130-1_amd64.deb

    ## Install cuda
    ## https://developer.nvidia.com/cuda-toolkit-archive
    sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
    sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
    sudo apt-get update
    sudo apt-get install cuda-10-0
    
  • Step 3 : Install cuDNN

    先下载 cuDNN v7.5.0 (Feb 21, 2019), for CUDA 10.0 ; 需要注册账号登录才能下载.

    ## https://developer.nvidia.com/rdp/cudnn-archive
    ## cuDNN v7.5.0 (Feb 21, 2019), for CUDA 10.0
    
    sudo dpkg -i libcudnn7_7.5.0.56-1+cuda10.0_amd64.deb
    
  • Step 4 : 添加环境变量

    在 ${HOME}/.bash_aliases 添加

    ##################################
    #  CUDA
    ##################################
    export CUDA_HOME=/usr/local/cuda-10.0
    export PATH=$PATH:$CUDA_HOME/bin
    export LD_LIBRARY_PATH=${CUDA_HOME}/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
    
    source ${HOME}/.bash_aliases
    # 查看 CUDA 版本
    nvcc -V
    
  • Step 5 : 重启系统

    sudo shutdown -r now
    
2 安装 ROS melodic
2.1 更新 ROS源地址
# # 更换阿里源, 网速快; 缺点, 当碰巧,阿里源正在和官方源同步的时段,会无法安装
# sed -i 's/cn.archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list # X86 中文
# sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list    # X86 英文
# sed -i 's/ports.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list      # arm

#  添加 科大ROS源
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
sudo apt-get update
2.2 安装 ROS
  • 执行安装脚本
# 按照提示输入,当前用户密码
# x86_64
wget -qO - https://raw.githubusercontent.com/my-rds-store/my_space/master/source/autoware/src/ros_instal.sh | bash
wget -qO - https://raw.fastgit.org/my-rds-store/my_space/master/source/autoware/src/ros_instal.sh | bash

# Arm - Nvidia Jetson AGX
wget -qO - https://github.com/my-rds-store/my_space/raw/master/source/autoware/src/ros_install_agx.sh | bash
wget -qO - https://raw.fastgit.org/my-rds-store/my_space/master/source/autoware/src/ros_install_agx.sh
  • x86_64安装脚本的源码如下:

    ##############################
    # Install ROS  melodic
    ##############################
    
    sudo tee /etc/resolv.conf <<-'EOF'
    nameserver 114.114.114.114
    nameserver 8.8.8.8
    EOF
    
    sudo apt install libc6:i386 --yes --allow-unauthenticated
    #sudo apt-get install cuda-10-0
    
    sudo apt-get install openssh-server vim --yes --allow-unauthenticated
    sudo apt-get install python3-pip --yes --allow-unauthenticated
    sudo apt-get install ros-melodic-desktop-full --yes --allow-unauthenticated
    sudo apt-get install ros-melodic-desktop-full --yes --allow-unauthenticated --fix-missing
    
    sudo apt-get install ros-melodic-rosbash ros-melodic-rosbash-params --yes --allow-unauthenticated 
    
    tee ${HOME}/.bash_aliases <<-'EOF'
    ##################################
    #  CUDA
    ##################################
    export CUDA_HOME=/usr/local/cuda-10.0
    export PATH=$PATH:$CUDA_HOME/bin
    export LD_LIBRARY_PATH=${CUDA_HOME}/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
    
    export CPLUS_INCLUDE_PATH=/usr/local/include/eigen3:${CPLUS_INCLUDE_PATH}  # autoware : --- stderr: glviewer
    
    source /opt/ros/melodic/setup.bash
    rosclean purge -y
    EOF
    source /opt/ros/melodic/setup.bash
    
    
    sudo apt-get install python-rosinstall \
                         python-rosinstall-generator \
                         python-wstool \
                         build-essential --yes --allow-unauthenticated
    
    
    sudo apt install -y python-catkin-pkg python-rosdep ros-$ROS_DISTRO-catkin
    sudo apt install -y python3-pip python3-colcon-common-extensions python3-setuptools python3-vcstool 
    
    ##############
    sudo tee /etc/resolv.conf <<-'EOF'
    nameserver 8.8.8.8
    nameserver 114.114.114.114
    EOF
    
    sudo rosdep init
    rosdep update
    
    ##############
    sudo tee /etc/resolv.conf <<-'EOF'
    nameserver 114.114.114.114
    nameserver 8.8.8.8
    EOF
    
    
    
    sudo apt-get install libarmadillo-dev libglew-dev libssh2-1-dev python-flask python-requests wget --yes --allow-unauthenticated
    
    ######## pip
    mkdir ${HOME}/.pip
    sudo tee ${HOME}/.pip/pip.conf <<-'EOF'
    [global]
    index-url = https://mirrors.aliyun.com/pypi/simple/
    
    #(legacy|columns)
    format = columns
    
    [install]
    trusted-host=mirrors.aliyun.com
    EOF
    
    #######
    sudo apt-get install vim openssh-server --yes --allow-unauthenticated
    
    
    # #sudo apt-get install nvidia-docker2
    # sudo apt-get install curl --yes --allow-unauthenticated
    # sudo apt-get install chromium-browser --yes --allow-unauthenticated
    
    sudo apt-get install libsdl1.2-dev --yes --allow-unauthenticated
    
    # 
    # #sudo apt-get install aptitude
    # #sudo aptitude install  ros-melodic-desktop-full --yes --allow-unauthenticated
    
3 源码编译 Autoware
  • step 1 : Install Eigen (线性算术的C++模板库)
  • 主页
#wget http://bitbucket.org/eigen/eigen/get/3.3.7.tar.gz #Download Eigen 失效
wget -O 3.3.7.tar.gz https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz

mkdir eigen && tar --strip-components=1 -xzvf 3.3.7.tar.gz -C eigen #Decompress

cd eigen && mkdir build && cd build && cmake .. && make && sudo make install #Build and install

cd ../../ && rm -rf 3.3.7.tar.gz && rm -rf eigen #Remove downloaded and temporary files
  • step 2 : Build Autoware

注意

NVIDIA Jetson AGX Xavier
    需要 将libopencv-dev 版本
     4.1.1-2-gd5a58aa75 降为 3.2.0+dfsg-4ubuntu0.1

    sudo apt-get install libopencv-dev=3.2.0+dfsg-4ubuntu0.1
build autoware 1.13.0 on NVIDIA Jetson AGX Xavier
cd vendor/mrt_cmake_modules
git checkout 9ddefc0
mkdir -p autoware.ai/src
cd autoware.ai


# Download 1.14.0
wget https://raw.fastgit.org/Autoware-AI/autoware.ai/1.14.0/autoware.ai.repos
sed -i "s/github.com/hub.fastgit.org/" autoware.ai.repos

# 使用官方 lanelet2
# sudo apt-get install  ros-melodic-lanelet2

# Download master
wget -O autoware.ai.repos "https://raw.githubusercontent.com/Autoware-AI/autoware.ai/master/autoware.ai.repos"

vcs import src < autoware.ai.repos

## Install dependencies using rosdep.
rosdep update # 如遇失败, 需登梯子,原因不解释

# 或者执行,也可以
wget -qO - https://raw.fastgit.org/my-rds-store/my_space/master/source/ros/shell/rosdep_repair.sh | bash

rosdep update


rosdep install -y --from-paths src --ignore-src --rosdistro $ROS_DISTRO

# Without CUDA Support
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release

# With CUDA support
AUTOWARE_COMPILE_WITH_CUDA=1 colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release

# With CUDA support build gnss_localizer only
# AUTOWARE_COMPILE_WITH_CUDA=1 colcon build --packages-up-to gnss_localizer \
#                                --cmake-args -DCMAKE_BUILD_TYPE=Release

  • step 2 : Run Autoware
cd autoware.ai
source install/setup.bash
roslaunch runtime_manager runtime_manager.launch
  • lidar_apollo_cnn_seg_detect
#参考: https://www.cnblogs.com/hgl0417/p/12114955.html

sudo apt install -y libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt install -y --no-install-recommends libboost-all-dev
sudo apt install -y libopenblas-dev #libatlas-base-dev
sudo apt install -y libgflags-dev libgoogle-glog-dev liblmdb-dev

git clone --depth 1 https://hub.fastgit.org/BVLC/caffe.git $HOME/caffe

URL_PATH=https://raw.fastgit.org/my-rds-store/my_space/master/source/autoware/src/caffe
wget -O $HOME/caffe/Makefile.config  $URL_PATH/Makefile.config

# for arm  plantform
set -i "s/x86_64/aarch64/" $HOME/caffe/Makefile.config

cd  $HOME/caffe; make &&  make distribute


tee ${HOME}/.bash_aliases <<-'EOF'
export LD_LIBRARY_PATH=$HOME/caffe/distribute/lib:$LD_LIBRARY_PATH
export APOLLO_CNNSEG=/home/promote/Autoware/APOLLO_CNNSEG
EOF

# lidar_apollo_cnn_seg_detect patch
cd ${HOME}/Autoware/src/autoware/core_perception/lidar_apollo_cnn_seg_detect
wget -O lidar_apollo_cnn_seg_detect.patch ${URL_PATH}/lidar_apollo_cnn_seg_detect.patch
git apply lidar_apollo_cnn_seg_detect.patch

#下载 APOLLO_CNNSEG
#https://github.com/ApolloAuto/apollo/tree/master/modules/perception/production/data/perception/lidar/models/cnnseg
#https://hub.fastgit.org/ApolloAuto/apollo/tree/master/modules/perception/production/data/perception/lidar/models/cnnseg
4. Autoware Docker 镜像
 git clone -b 1.14.0 https://github.com/Autoware-AI/docker.git

 cd docker/generic

 mkdir ${HOME}/shared_dir

./run.sh --ros-distro melodic            # 有 nvidia cuda支持
./run.sh --ros-distro melodic --cuda off # 无 nvidia cuda支持
# root 用户下
xhost +
# for armv8
docker pull autoware/arm64v8:1.14.0-melodic
5. 学习资料
三 CARLA Simulator
# 0.9.10 depends
pip install --user pygame numpy

python -m pip install pygame==2.0.1 # 0.9.10.1


#export CARLA_ROOT=${HOME}/shared_dir/carla
#export PYTHONPATH=${PYTHONPATH}:${CARLA_ROOT}/PythonAPI/carla/dist/carla-0.9.10-py2.7-linux-x86_64.egg
#export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla

#export CARLA_AUTOWARE_CONTENTS=${HOME}/work2/carla/linux/carla-autoware/autoware-contents


# 安装 carla
mkdir carla
tar xzvf CARLA_0.9.10.1.tar.gz  -c carla
mv AdditionalMaps_0.9.10.1.tar.gz ./carla/Import/

# 导入 AdditionalMaps
cd carla
./ImportAssets.sh
ros-bridge
git clone -b 0.9.10.1  https://github.com/carla-simulator/ros-bridge.git --recursive
# cd ros-bridge
# git submodule update --init --recursive

# install depends
sudo apt-get install ros-melodic-ackermann-msgs ros-melodic-derived-object-msgs
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch \
    host:=192.168.8.6 town:=Town03 vehicle_filter:=vehicle.toyota.prius  \
    spawn_point:="0.700499,-189.727951,0.2,0,0.000000,-91.413536"
carla-autoware
SDL_VIDEODRIVER=offscreen ./CarlaUE4.sh -opengl

roslaunch carla_autoware_agent carla_autoware_agent.launch town:=Town03 host:=192.168.8.6
四 LGSVL Simulator
# ubuntu18.04 Install lgsvls imulator
sudo apt install libcanberra-gtk-module libcanberra-gtk3-module # Failed to load module "canberra-gtk-module"
sudo apt-get install libgtk2.0-0:i386 libglib2.0-0:i386 libgdk-pixbuf2.0-0:i386 # 待验证
sudo apt-get install vulkan-utils # 解决: No supported renderes found, exiting
##
${HOME}/.config/unity3d/LG\ Silicon\ Valley\ Lab/LGSVL\ Simulator
${HOME}/.config/unity3d/LGElectronics/SVLSimulator-2021.3
Windows LGSVL地图及配置文件,下载保存路径为

2020早期版本
        %userprofile%\AppData\Locallow\LG Silicon Valley Lab\LGSVL Simulator\

2021版本
        %userprofile%\AppData\locallow\LGElectronics
cp -rvf  ./src/autoware/simulation/lgsvl_simulator_bridge/*  \
         ./install/lgsvl_simulator_bridge/share/lgsvl_simulator_bridge/
source install/setup.bash
roslaunch runtime_manager runtime_manager.launch

# start
roslaunch rosbridge_server rosbridge_websocket.launch

# nvidia  jetson AGX  Xavier  depend
sudo apt-get install python-bson python-tornado


五 学习笔记
使用GNSS进行定位
gnss_localizer

https://github.com/autowarefoundation/autoware/issues/492

find . -name "*.py" -or -name "*.yaml"| xargs grep -in plane
find . -name "*.c*" -or -name "*.h*" -or -name "*.launch" -or -name "*.py" | xargs grep -in set_plane

vim ./autoware/utilities/runtime_manager/scripts/computing.yaml +1281
vim ./autoware/utilities/autoware_launcher/plugins/refs/nmea2tfpose.yaml +11

vim ./autoware/core_perception/gnss_localizer/launch/fix2tfpose.launch +4
vim ./autoware/core_perception/gnss_localizer/nodes/nmea2tfpose/nmea2tfpose_core.cpp +46

vim ./autoware/common/gnss/src/geo_pos_conv.cpp +52
路径跟踪基本配置
<!-- lgsvl-tf.launch -->

<launch>
<node pkg="tf"  type="static_transform_publisher" name="world_to_map" args="0 0 0 0 0 0 /world /map 10" />
<node pkg="tf"  type="static_transform_publisher" name="map_to_mobility" args="0 0 0 0 0 0 /map /mobility 10" />
</launch>
Autoware Camera-LiDAR Calibration Package
# calibration_publisher

CALIBRATION=$(pwd)/calibration/autoware_lidar_camera_calibration.yaml

roslaunch runtime_manager calibration_publisher.launch target_frame:=velodyne camera_frame:=camera file:=${CALIBRATION} \
register_lidar2camera_tf:=True publish_extrinsic_mat:=True publish_camera_info:=True \
camera_info_topic:=/camera_info2  \
image_topic_src:=/image_raw  \
projection_matrix_topic:=/projection_matrix  \
camera_id:=/cv_camera


# points2image
roslaunch runtime_manager  points2image.launch  camera_id:=/cv_camera camera_info_src:=/camera_info2

#######################################################################
#
# rosrun topic_tools relay /cv_camera/image_raw /image_raw

#CALIBRATION=$(pwd)/calibration/autoware_lidar_camera_calibration.yaml
#roslaunch runtime_manager calibration_publisher.launch target_frame:=velodyne camera_frame:=camera file:=${CALIBRATION}  \
#        register_lidar2camera_tf:=True publish_extrinsic_mat:=True publish_camera_info:=True \
#        camera_info_topic:=/camera_info  \
#        image_topic_src:=/image_raw       \
#        projection_matrix_topic:=/projection_matrix camera_id:=/

# #points2image
#roslaunch runtime_manager  points2image.launch  camera_id:=/ camera_info_src:=camera_info
Traffic Light Recognition
使用YOLOv3进行检测
Step 1: 安装Yolo3
Step 2: usb_cam
sudo apt install v4l-utils

v4l2-ctl --list-devices

###

sudo apt install ros-melodic-cv-camera

rosparam set cv_camera/device_id 2

rosrun cv_camera cv_camera_node

rostopic echo /cv_camera/image_raw
mkdir -p usb_cam
cd usb_cam

#git clone https://github.com/bosch-ros-pkg/usb_cam src
git clone https://github.com/ros-drivers/usb_cam.git src

catkin_make
source devel/setup.bash

roscore  &
source devel/setup.bash
roslaunch usb_cam usb_cam-test.launch
Step 3
  • Computing->Detection->vision_detector->vision_darknet_yolo3/[app]
_images/01.png _images/02.png
  • 打卡 Rviz
_images/03.png _images/04.png _images/6.png
  • How to use object detection package in Autoware

$ git diff

diff --git a/rslidar_pointcloud/launch/cloud_nodelet.launch b/rslidar_pointcloud/launch/cloud_nodelet.launch
index 6f0869a..a3ef4e9 100644
--- a/rslidar_pointcloud/launch/cloud_nodelet.launch
+++ b/rslidar_pointcloud/launch/cloud_nodelet.launch
@@ -15,6 +15,9 @@
     <param name="device_ip" value="$(arg device_ip)" />
     <param name="msop_port" value="$(arg msop_port)" />
     <param name="difop_port" value="$(arg difop_port)"/>
+
+    <!-- support autoware  -->
+    <param name="frame_id" type="string" value="velodyne"/>
   </node>

   <node pkg="nodelet" type="nodelet" name="$(arg manager)_cloud"
@@ -24,5 +27,7 @@
     <param name="angle_path" value="$(find rslidar_pointcloud)/data/rs_lidar_16/angle.csv" />
     <param name="channel_path" value="$(find rslidar_pointcloud)/data/rs_lidar_16/ChannelNum.csv" />

+       <!-- support autoware  -->
+       <remap from="rslidar_points" to="/points_raw"/>
   </node>
 </launch>
rostopic echo /points_raw     | grep frame_id
问题记录
op_behavior_selector 状态及 END 状态
  • 问题分析
// autoware/common/op_planner/src/DecisionMaker.cpp + 148

void DecisionMaker::CalculateImportantParameterForDecisionMaking(const PlannerHNS::VehicleState& car_state,
 const int& goalID, const bool& bEmergencyStop, const std::vector<TrafficLight>& detectedLights,
 const TrajectoryCost& bestTrajectory)
{

    // .......

    /* m_CarInfo.max_deceleration 对应
       op_local_planner)/launch/op_common_params.launch 的参数 maxDeceleration */

    if(m_CarInfo.max_deceleration != 0)
        pValues->minStoppingDistance = -pow(car_state.speed, 2)/(m_CarInfo.max_deceleration);
    // ...........
    double critical_long_front_distance =  m_CarInfo.wheel_base/2.0 + m_CarInfo.length/2.0 + m_params.verticalSafetyDistance;

    if(ReachEndOfGlobalPath(pValues->minStoppingDistance + critical_long_front_distance, pValues->iCurrSafeLane))
        pValues->currentGoalID = -1;   // 触发 GoalStateII  进入 FINISH_STATE 状态
    else
        pValues->currentGoalID = goalID;

    // ******

}

/*
   ...
*/

bool DecisionMaker::ReachEndOfGlobalPath(const double& min_distance, const int& iGlobalPathIndex)
{
    if(m_TotalPath.size()==0) return false;

    PlannerHNS::RelativeInfo info;
    PlanningHelpers::GetRelativeInfo(m_TotalPath.at(iGlobalPathIndex), state, info);

    double d = 0;
    for(unsigned int i = info.iFront; i < m_TotalPath.at(iGlobalPathIndex).size()-1; i++)
    {
        d+= hypot(m_TotalPath.at(iGlobalPathIndex).at(i+1).pos.y - m_TotalPath.at(iGlobalPathIndex).at(i).pos.y,
                  m_TotalPath.at(iGlobalPathIndex).at(i+1).pos.x - m_TotalPath.at(iGlobalPathIndex).at(i).pos.x);
        if(d > min_distance)  // 停车距离 大于 最小停车距离, 返回 False, -> 正常
        return false;
    }
    return true;  // 停车距离 小于 最小停车距离, 返回 True, -> 最终触发 FINISH_STATE
}
// autoware/common/op_planner/src/BehaviorStateMachine.cpp

BehaviorStateMachine* GoalStateII::GetNextState()
{
    PreCalculatedConditions* pCParams = GetCalcParams();

    if(pCParams->currentGoalID == -1){
        return FindBehaviorState(FINISH_STATE);  // 触发 END 停车状态
    } else
    {
        pCParams->prevGoalID = pCParams->currentGoalID;
        return FindBehaviorState(FORWARD_STATE);
    }
}
Other
GPS
gpsd

gpsd是一个GPS的守护进程,用以侦听来自GPS接收器的位置信息,并将这些位置信息转换成一种简化的格式。这样就可以使用其他程序对这些数据进行分析并制作图表等。该软件包中有一个客户端,用以显示当前可见GPS卫星(如果有的话)的位置和速度。它也可以使用差分全球定位系统/ IP协议。

sudo apt-get install gpsd gpsd-clients

gpsfake
  • 使用gpsfake模拟GPS数据

    1. 将假的gps数据存到文件中,命名为test.log.
    
           nc localhost 20175  >> test.log
           或者
           curl <phone ip>:port >> test.log
    
    2. ls /dev/pts,查看现在有什么设备。我的有三个,分别是0,1,ptmx。
    
    3. gpsfake -c 0.2 test.log  #  0.2秒 发送一条数据
    
    4. ls /dev/pts再次查看。这时候有四个了,分别是0,1,2,ptmx.
    
    5. cat /dev/pts/2. 就可以看到假的gps数据了。
    
    6. gpsd -F -D3 -N /dev/pts/2
    
    7 cgps 或者 gpsmon
    
    # 8.
    rosrun gpsd_client gpsd_client _host:=localhost _port:=2947
    
    #9.
    rostopic echo /fix
    
nmea_navsat_driver
gpsfake -c 0.2 test.log  #  0.2秒 发送一条数据

rosrun nmea_navsat_driver nmea_serial_driver _port:=/dev/pts/7 _baud:=4800

rostopic list
rostopic echo /fix
rostopic echo /vel
rostopic echo /time_reference
Jetson AGX Xavier
刷机 sdkmanager_1.1.0-6343
jetpack 4.3

Configuration

nvpmodel introduces seven different “modes” on the Jetson AGX Xavier. The following table breaks down the modes which describe which CPU, GPU, DLA and VA cores to use along with their clock frequency, and the memory controller frequency.

NVPMODEL CLOCK CONFIGURATION

Mode Name EDP 10W 15W 30W 30W 30W 30W
MAXN MODE_10W MODE_15W MODE_30W_ALL MODE_30W_6CORE MODE_30W_4CORE MODE_30W_2CORE
Power Budget n/a 10W 15W 30W 30W 30W 30W
Mode ID 0 1 2 3 4 5 6
Number of Online CPUs 8 2 4 8 6 4 2
CPU Maximal Frequency
(MHz)
2265.6 1200 1200 1200 1450 1780 2100
GPU TPC 4 2 4 4 4 4 4
CPU Maximal Frequency
(MHz)
1377 520 670 900 900 900 900
DLA Cores 2 2 2 2 2 2 2
DLA Maximal Frequency
(MHz)
1395.2 550 750 1050 1050 1050 1050
Vision Accelerator (VA) cores 2 0 1 1 1 1 1
VA Maximal Frequency
(MHz)
1088 0 550 760 760 760 760
Memory Maximal Frequency
(MHz)
2133 1066 1333 1600 1600 1600 1600
tegrastats

sudo nvpmodel --query
sudo nvpmodel -q --verbose

sudo nvpmodel -p --verbose
sudo nvpmodel -m 0  # 0 - MAXN ;
                    # 1 - MODE_10W ;  默认
                    # 2 - MODE_15W ;
                    # 3 - MODE_30W_ALL ;
                    # 4 - MODE_30W_6CORE ;
                    # 5 - MODE_30W_4CORE ;
                    # 6 - MODE_30W_2CORE ;


sudo jetson_clocks --show

echo 255 > target_pwm
sudo cp -vf target_pwm /sys/devices/pwm-fan/target_pwm  # 风扇开到最大

  • QT5
sudo apt-get install qt5-default qtcreator -y
sudo  apt isntall libqt5charts5 libqt5charts5-dev

  • ubuntu sudo 免密码
sudo tee /etc/sudoers.d/nopasswd4sudo <<- 'EOF'
nvidia ALL=(ALL) NOPASSWD : ALL
EOF

########################################

sudo cat <<EOF > /tmp/nopasswd4sudo
${USER} ALL=(ALL) NOPASSWD : ALL
EOF
sudo chown root:root /tmp/nopasswd4sudo
sudo mv /tmp/nopasswd4sudo  /etc/sudoers.d/nopasswd4sudo


# 开机自启动
sudo tee -a /etc/rc.local <<- 'EOF'
#!/bin/bash
bash /enable_CAN.sh &
exit 0
EOF

sudo chmod a+x /etc/rc.local
######################
# enable_CAN.sh
######################

sudo modprobe can
sudo modprobe can_raw
sudo modprobe mttcan

#############################
# 用devmem修改寄存器
#############################
sudo busybox devmem 0x0c303000 32 0x0000C400
sudo busybox devmem 0x0c303008 32 0x0000C458
sudo busybox devmem 0x0c303010 32 0x0000C400
sudo busybox devmem 0x0c303018 32 0x0000C458

# # 检查寄存器
# sudo busybox devmem 0x0c303000    # 0x0000C055
# sudo busybox devmem 0x0c303008    # 0x0000C055
# sudo busybox devmem 0x0c303010    # 0x0000C059
# sudo busybox devmem 0x0c303018    # 0x0000C059

# 配置标准CAN  500k
sudo ip link set can0 type can bitrate 500000
sudo ip link set can1 type can bitrate 500000

# 配置为仲裁段500k, 数据段2M的的CANFD:
#sudo ip link set can0 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on
#sudo ip link set can1 type can bitrate 500000 dbitrate 2000000 berr-reporting on fd on

# 设置本地回环
#sudo ip link set can0 type can bitrate 500000 loopback on
#sudo ip link set can1 type can bitrate 500000 loopback on


#sudo ip link set down can0
#sudo ip link set down can1

sudo ip link set up can0
sudo ip link set up can1

#
cansend can0 "601#b110ff"
cansend can1 "601#b110ff"


#sudo nvpmodel -m 0

sudo echo 255 > target_pwm
sudo cp -vf target_pwm /sys/devices/pwm-fan/target_pwm  # 风扇开到最大

# 禁用串行控制台
#sudo systemctl stop nvgetty
#sudo systemctl disable nvgetty
#udevadm trigger  # 串口 /dev/ttyTHS0

#
# sudo stty -F /dev/ttyUSB0 -a

modprobe can        // 插入 can 总线子系统
modprobe can-raw    // 插入can 协议模块
modprobe can-bcm
modprobe can-gw
modprobe can-dev
modprobe mttcan      //真正的can口支持

# 禁用串行控制台 ttyTHS*
sudo systemctl stop nvgetty
sudo systemctl disable nvgetty
udevadm trigger  # 串口 /dev/ttyTHS0

# sudo usermod -a -G dialout $USER
## sudo chmod a+wrx /dev/ttyTHS0

1

sudo vim /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml
<!-- and go ahead and add the following key into the XML file. -->

 <key name='enabled' type='b'>
    <summary>Enable remote access to the desktop</summary>
    <description>
    If true, allows remote access to the desktop via the RFB
    protocol. Users on remote machines may then connect to the
    desktop using a VNC viewer.
    </description>
    <default>false</default>
 </key>
 # 更新
# Then compile the Gnome schemas with the glib-compile-schemas command.

sudo glib-compile-schemas /usr/share/glib-2.0/schemas

# 关闭 encryption of the VNC
#  或者使用图形界面配置工具 dconf editor 'sudo apt-get install dconf-editor'

gsettings set org.gnome.Vino require-encryption false
gsettings set org.gnome.Vino prompt-enabled false

2

打开 startup applications .

添加 command /usr/lib/vino/vino-server.

然后,重启系统

_images/startup_applications.png

3

vncviewer 192.168.2.105:5900
Jetson Nano
# jtop : 安装实时查看CPU,GPU状态工具

sudo pip3 install jetson-stats

jtop


# 关闭图形界面
sudo systemctl set-default multi-user.target
sudo reboot

# 开启图形界面
sudo systemctl set-default graphical.target
sudo reboot
惠普暗影精灵5 Plus

惠普暗影精灵5 Plus 装 ubuntu 18.04 踩到的坑.

ACPI Error: No handler or method for GPE => kernel 5.5 rc1 已经修正了这个问题。 kernel >= 5.5 的 Ubutnu 应该不存在这个问题

安装步骤 刻录 Ubuntu 18.04 U盘启动

装系统-> 选择 UEFI 启动
    当看到“Try Ubuntu", “Install Ubuntu”, “…” 这个黑色界面的时候按"e",然后可以看到一段英文,把段落中的"quiet splash"修改成"nomodeset",修改完按F10重启。(重要:不这样操作可能会卡住,无法启动安装器)
    安装器若启动不起来,多尝试几次.

安装过程,联网更新软件,并且勾选 第三方库安装.

===========

安装完毕,重启
在ubuntu选项上按e,进入启动命令编辑, 把段落中的"linux"打头的一行,找到quiet splash替换为text acpi=off,然后按F10启动。


进入桌面,更改为 国内源,然后 软件更新.

打开software updater,选择additional drivers,点击NVIDIA driver 435,点击Apply Changes。


安装完驱动,不要重启,打开终端,安装vim,然后sudo vim /etc/default/grub,修改一下两行:

GRUB_CMDLINE_LINUX_DEFAULT="text"
GRUB_CMDLINE_LINUX="pci=nommconf"
echo "options snd-hda-intel model=auto" | sudo tee -a /etc/modprobe.d/alsa-base.conf
echo "options snd-hda-intel dmic_detect=0" | sudo tee -a /etc/modprobe.d/alsa-base.conf
echo "blacklist snd_soc_skl" | sudo tee -a /etc/modprobe.d/blacklist.conf
shutdown -r now
usb无线wifi
sudo apt install git dkms
git clone https://github.com/aircrack-ng/rtl8812au.git
cd rtl8812au
sudo ./dkms-install.sh

WebRTC

要使用 WebRTC 实现视频传输,需要先了解一些基本的概念和原理。WebRTC 是一种实时通信协议,用于在网页浏览器之间实现音频、视频和数据的传递。它基于 HTML5 和 JavaScript 技术,可以直接在浏览器中运行而不需要任何插件。

想要使用 Python 进行 WebRTC 的开发,可以考虑使用 Python 的 web 框架 Flask 或者 Django。这两个框架都提供了路由和模板等相关功能,可以方便你进行业务逻辑的开发。

另外推荐使用 webrtc-native,这是一个 Python 包,它提供了一组 Python 的 API,允许你使用 WebRTC 协议进行音频/视频传输等功能的开发。

当然,如果你对 WebRTC 的底层技术比较熟悉,你也可以直接使用 Python 的网络编程模块(如 socket)以及 WebRTC 原生的 API 进行开发。

总体而言,要实现 WebRTC 的视频传输,需要以下步骤:

使用 Python 框架搭建服务器,并设置好相应的路由。

使用 webrtc-native,或者用 Python 配合 WebRTC 原生的 API 来实现 SDP 协议的生成和交换。

实现基于 WebRTC 的音视频数据传输功能。

在客户端使用 WebRTC API,建立本地的媒体流,并在连接成功后将其传输给服务器端。

实现 WebRTC 点对点的连接和通讯功能。

希望这些信息对你有所帮助!
环境搭建
  • webrtc-streamer <https://hub.docker.com/r/mpromonet/webrtc-streamer>
    • 支持arm64
    • 局域网,手机浏览器可以显示图像,但是 pc端 浏览器,不显示图像
  • 待验证

qemu命令总结

_images/Qemu-logo-small.png
_images/apple-touch-icon.png
PCI 透传
$ tail -f /var/log/syslog
$ tail -f /var/log/libvirt/qemu/${domain}.log
vim /etc/default/grub
add " intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1"
GRUB_CMDLINE_LINUX="quiet splash loglevel=2 intel_iommu=igfx_off i915.hvm_boot_foreground=1 i915.enable_cmd_parser=0 i915.enable_hangcheck=0 loglvl=all guest_loglvl=all conring_size=4M noreboot intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1"

OR

#add  " intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1"
$ vim /boot/grub/grub.cfg
$ tee hostdev.xml <<-"EOF"
<hostdev mode='subsystem' type='pci' managed='yes'>
  <driver name='vfio'/>
  <source>
        <address domain='0x0000' bus='0x00' slot='0x14' function='0x0'/>
  </source>
</hostdev>
EOF

$ sudo virsh nodedev-dettach pci_0000_00_14_0
$ sudo virsh nodedev-reattach pci_0000_00_14_0

$ virsh attach-device --config ${domain} ./hostdev.xml
$ virsh attach-device ${domain} ./hostdev.xml

$ virsh detach-device ${domain} ./hostdev.xml
常用命令
$ cat /usr/share/libvirt/cpu_map.xml
$ virsh cpu-models x86_64
# virsh
#  https://wiki.libvirt.org/page/Failed_to_connect_to_the_hypervisor

virsh --connect qemu+ssh://username@remove.host.com/system list
virsh --connect qemu+ssh://root@192.168.8.204/system --all

# spice端口
netstat -ntpl | grep qemu
virsh domdisplay --type spice {Id or Name}

# 创建镜像
qemu-img create -f qcow2 ubuntu-14.04.qcow2 20G
qemu-img info ubuntu-14.04.qcow2

# 镜像压缩
qemu-img convert -p -c -O qcow2 source.img destination.qcow2

# resize
qemu-img resize source.qcow2 +10G

# 创建外部快照
qemu-img create -f qcow2 -b base.qcow2 snapshot.qcow2

# 内部快照
qemu-img snapshot -l    source.qcow2  # 查看
qemu-img snapshot -c s1 source.qcow2  # 创建
qemu-img snapshot -a s1 source.qcow2  # 还原

# Committing Changes
# https://dustymabe.com/2015/01/11/qemu-img-backing-files-a-poor-mans-snapshotrollback/
#
$ sudo qemu-img info /guests/F21server.qcow2.snap
image: /guests/F21server.qcow2.snap
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 15M
cluster_size: 65536
backing file: /guests/F21server.img

$ sudo qemu-img commit /guests/F21server.qcow2.snap
Image committed.

# 重改基础镜像
$ qemu-img rebase [-u] -b /PATH/TO/base.qcow2 linux.qcow2 # -u 指 unsafe 模式,需检验,常用于基础镜像移动位置或重命名之后.
virsh snapshot-create-as --domain srv7 --name srv7-snapshot_1  # 创建快照
virsh snapshot-list srv7                                       #  列出
virsh snapshot-info srv7 srv7-snapshot_1                       #  info
virsh snapshot-revert srv7 srv7-snapshot_1                     #  还原
virsh snapshot-delete srv7 srv7-snapshot_1                     #  删除
磁盘
# ubuntu 14 安装libguestfs
$ sudo apt-get install libguestfs-tools

# centos 7 安装libguestfs
$ yum install libguestfs-winsupport  # ntfs
$ yum install libguestfs-tools       # virt-format
$ sudo qemu-img create -f qcow2 disk 20G
$ sudo virt-format --filesystem ntfs -a disk.qcow2

$ virt-ls -a  image.qcow2 /
$ virt-copy-in test.txt -a  image.qcow2 /
CD
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='unsafe'/>
  <source file='/data/disk/3601b740-5726-11e8-a561-5254007aa05f_D.qcow2'/>
  <target dev='vdb' bus='virtio'/>
</disk>
<disk type='file' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <source file='/cdata/isos/Windows-7-Ultimate-SP1-x64-677408.iso'/>
  <target dev='hda' bus='ide'/>
  <readonly/>
</disk>
<disk type='file' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <source file='/cdata/isos/virtio-win.iso'/>
  <target dev='hdb' bus='ide'/>
  <readonly/>
</disk>
<disk type='file' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <source file='/cdata/isos/mcos-tools.iso'/>
  <target dev='hdc' bus='ide'/>
  <readonly/>
</disk>
<disk type='file' device='floppy'>
  <driver name='qemu' type='raw'/>
  <source file='/cdata/isos/virtio-win.vfd'/>
  <target dev='fda' bus='fdc'/>
  <readonly/>
</disk>
声卡
  1. 查询支持的声卡

    [localhost ~] $ sudo /usr/libexec/qemu-kvm --soundhw ?
    Valid sound card names (comma separated):
    ac97        Intel 82801AA AC97 Audio
    hda         Intel HD Audio
    pcspk       PC speaker
    
    -soundhw all will enable all of the above
    

2 增加声卡

[localhost ~] $ sudo /usr/libexec/qemu-kvm --soundhw all

Creating Guests with PXE

Red Hat Enterprise Linux 6 Virtualization Host Configuration and Guest Installation Guide

Vim

屏幕显示按键
安装vim
INSTALL
$ sudo apt-get install vim vim-scripts vim-doc
$ sudo apt-get install vim-addon-manager # 插件管理
$ sudo apt-get install vim-gnome         # 系统黏贴板支持
升级vim

升级vim

$ sudo add-apt-repository ppa:jonathonf/vim
$ sudo apt-get update && sudo apt-get upgrade
$ sudo apt-get install vim-nox

# vimrc 配置
set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1
set termencoding=utf-8
set fileformats=unix

" 设置gvim
winpos 100 100          "设置初始界面位置
set lines=25 columns=85 "设置初始界面大小

set gfn=Courier_New:h14 # 字体 字号
colorscheme torte      # 主题
set guioptions-=m      # 隐藏菜单栏
set guioptions-=T      # 隐藏工具栏目
:set fileencoding       ,  查看编码
:set fileencoding=utf-8 , 然后 w 存盘 一下即可转化为 utf8 格式,
:set fileencodings=utf-8 ,然后 w 存盘 一下即可转化为 utf8 格式,
:set fileencodings=cp936 ,然后 w 存盘 一下即可转化为 ANSI 格式。
VI 技巧
命令行模式下输入

:6,9 co 12   复制第6行到第9行之间的内容到第12行后面。


有时候不想费劲看多少行或复制大量行时,可以使用标签来替代
光标移到起始行,输入ma
光标移到结束行,输入mb
光标移到粘贴行,输入mc
然后 :

:'a , 'b co 'c   复制操作
:'a , 'b m  'c   剪切操作

要删除多行的话,可以用 :
:5, 9 de

YouCompleteMe
安装

Ubuntu Linxu x64

$ sudo apt-get install build-essential cmake
$ sudo apt-get install python-dev python3-dev

$ sudo apt-get install golang           # 搭建go环境
$ cp -vrf /mnt/.vim/bundle/*  ~/.vim/bundle/

$ git clone --depth 1 --recursive https://github.com/Valloric/YouCompleteMe.git \
        $HOME/.vim/bundle/YouCompleteMe

$ cd $HOME/.vim/bundle/YouCompleteMe

$ cd crfasrnn
$ git submodule update --init --recursive

$ ./install.py --clang-completer  # c/c++
$ ./install.py --gocode-completer # go
$ ./install.py --all
Vundle
Plugin 'Valloric/YouCompleteMe'
YouCompleteMe的配置

YouCompleteMe的配置

YouCompleteMe的配置 2

$HOME/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py 添加:

flags = [
'-Wall',
  ...
'-isystem',
'./tests/gmock/include',
'-isystem',       # 此行及以下,为添加行,检索 C/C++头文件
'/usr/include',
'-isystem',
'/usr/include/c++/5.4.0',
'-isystem',
'/usr/include',
'/usr/include/x86_64-linux-gnu/c++',
]
vim实用技巧

参见

$ vim-addons status
$ vim-addons install omnicppcomplete

如何判断文件类型?

防止vim 鼠标右键黏贴,排版错乱。 设置: .. code-block:: bash

:set paste

  • 技巧 24 面向列块的可视模式编辑表格数据

  • 技巧 30 在指定范围上执行普通模式命令

    normal

  • 技巧51 用精确的文本对象选择区

    xml 编写技巧

  • 录制宏: qa 操作序列 q, @a, @@

示例

在一个只有一行且这一行只有“1”的文本中,键入如下命令:

  • qaYp<C-a>q→
    • qa 开始录制
    • Yp 复制行
    • <C-a> 增加1
    • q 停止录制
    • @a→ 在1 下面写2
    • @@→ 在2 下面写3
    • 100@@ 会创建新的100行,并把数据增加到103
http://yannesposito.com/Scratch/img/blog/Learn-Vim-Progressively/macros.gif

查看当前文件是什么类型了

:set filetype

Vim升华之树形目录插件NERDTree安装图解

  1. Vim升华之树形目录插件NERDTree安装图解

http://www.linuxidc.com/Linux/2013-06/86048.htm

  1. 每天一个vim插件–vim-multiple-cursors (foocoder.com)

  2. Vim常用插件——前端开发工具系列

http://web.jobbole.com/83226/

  1. vi/vim使用进阶: 开启文件类型检测

http://easwy.com/blog/archives/advanced-vim-skills-filetype-on/

  1. plugin、autoload、ftplugin有什么区别

http://www.cnblogs.com/chris-cp/p/4581593.html

  1. filetype---- 文件类型检测

http://liuzhijun.iteye.com/blog/1846123

project

孤独症患者
白衬衫花格子
一
她说,她见过夏天的雪、看过逆流的河、走过倒垂天际的彩虹,和透明的人做爱。
她说,她听着一首叫做《Riverside 》的歌的时候爱上了我。
我听完后告诉她,这首歌很孤独。
她说,她就是因为孤独才爱上我。

她没有跟我道别。
我静静的坐在倒垂的彩虹上,看着逆流的河上那个小姑娘在唱歌。
河里还漂浮着昨晚未曾融化的雪。
我将手伸进自己的体内,却触摸不到自己的心跳。

二
她跟他说,我爱你。
她眼神望的却是他的后面。

她和他在餐桌相对而坐。
她脸带笑意的看着他的背后。
他转过头,空无人影。

他拥着她睡着。
她的手在他的背后,
虚空中,她好像握住了另一个人的手。

三
她做了一个光怪陆离的梦。
她梦见她生活在空无一人的城市里面。
在偌大的餐厅里面一个人吃饭;
在空无一人的街道上独自逛街;
在漆黑的夜晚里抱着被子睡着。

她戴上眼镜,穿上高跟鞋,塞着耳机出门。
她瞥见的脸每一张都是陌生的。
她见过的每一个人都是匆匆路过。
她忽然间觉得,生活和昨晚的梦没有什么不同。

四
他右手捧着玫瑰,
生日快乐,亲爱的;
他单膝下跪,左手拿着钻戒,
嫁给我吧,宝贝。

他替她梳头,替她画眉,替她穿上婚纱。
他挽着她的手,登上教堂楼顶。
阳光很美,美的像血。
他的瞳孔最后印着她支离破碎的脸盘。

Mac

# 1. set proxy
$ export ALL_PROXY=socks5://127.0.0.1:1080
# or
# sudo git config --global http.proxy  socks5://127.0.0.1:1080
# sudo git config --global https.proxy socks5://127.0.0.1:1080

# 2. install Homebrew
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
$ diskutil list #显示当前所有得磁盘情况
$ diskutil unmountDisk /dev/disk1 #卸载U盘上的所有磁盘
$ dd if={ISO_IMAGE_HERE_} of=/dev/disk1 bs=1m #拷贝磁盘

# 显示进度
$ brew install pv
$ pv -petr ubuntu-11.10-desktop-i386.iso | sudo dd of=/dev/disk2 bs=1m`

# For Ubuntu
$ suod apt-get install pv
$ sudo tee /usr/local/bin/pvdd <<-'EOF'
pv -petr $1 | sudo dd of=$2 bs=4096
EOF
$ sudo chmod a+x /usr/local/bin/pvdd


# or
$ sudo dd if=ubuntu.iso of=/dev/sdb  bs=4M
$ watch  -n 5 "sudo pkill -USR1 ^dd$"
$ open -a appname args...

Git



alternate text
Git 安装与配置
Git 常用命令
git config
git config --global -e  # 默认为 --global
git config  -e    # or git config --edit
git config --list
git config --global core.editor vim  # 配置默认编辑器 vim

#  设置代理服务- 全局
git config --global http.proxy  socks5://127.0.0.1:1080 # 代理服务器
git config --global https.proxy socks5://127.0.0.1:1080

git config --global --unset http.proxy   # 撤销代理服务器
git config --global --unset https.proxy

git config --global --get http.proxy   # 查询理服务器
git config --global --get https.proxy


#设置代理服务 - 只对github.com
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080

#取消代理
git config --global --unset http.https://github.com.proxy


# 记住密码
$ git config credential.helper store # 永久记住密码
$ git config credential.helper cache  # 临时记住密码15分钟
$ git config credential.helper 'cache --timeout=3600' # 临时记住密码1小时
撤销与回退
$ git rm    --cached path              # 撤销add 文件
$ git rm -r --cached path              # 撤销add 目录

$ git checkout <commit_id> <path>      # 回退单个文件到某一次提交
$ git checkout <branc_name> -- <path>  # checkout file from a brach

$ git revert <commit_id>
# git revert是用一次新的commit来回滚之前的commit, 而git reset是直接删除指定的commit。

$ git commit --amend                   # 修改commit 备注信息
Create New branch
$ git branch  <new_branch_name> <commit_id>
$ git checkout -b  <new_branch_name> <commit_id>
$ git branch -a   # 查看分支(本地 + 远程)
$ git push origin --delete <new_branch_name>   # 删除远程分支
Gitignore
# 忽略,指定文件之外的所有文件
$ tee .gitignore <<-'EOF'
/*

!Dockerfile
!init.sh
!sources.list
!*.md
EOF
git log
$ git log --stat  #  --stat,查看修改了那些文件,仅显示简要的增改行数统计

# https://www.cnblogs.com/Sir-Lin/p/6064844.html
$ git log -- filename  <path>  # 查看某文件的修改历史
$ git show <commit-id> <path>
$ git log -b <branch_name>
$ git log --graph --all
$ git cherry-pick xxx
$ git add  <path>

#####################
# about git diff
#####################

$ git diff --cached
# Compare files from two different branches
$ git diff <branch_name> <another_branch_name> -- <path>

# 比较不同分支,不同文件
$ git diff 4.2.0-dev-fix:./src/model/offline_vm/hotplug_usb.py \
           4.2.0-vgt_passthough:./src-core/model/offline_vm/hotplug_usb.py
$ git pull --rebase origin master
git lfs
apt-get install git-lfs
git lfs clone <repo>
git submodule
git submodule add url path/to/name
git submodule add <repo> <dir>          # 添加 子模块
git submodule add -b tractor --force <url> path
                                        # 删除 子模块


git submodule init                      # 初始化子模块
git submodule status                    # 查看子模块
git submodule update                    #

##########################
#    跟新,子模块
##########################
git submodule foreach git pull origin master # 拉取所有子模块
git submodule sync                      #
git add .                               #
git push origin master                  #


git clone <repository> --recursive      # 递归的方式克隆整个项目
git submodule update --init --recursive     # 更新子模块
git submodule update --recursive --remote   # 更新子模块
git tag
# 打TAG也就是发布版本
$ git tag -a v1.4 -m "version 1.4"
$ git show v1.4   # 查看
$
$ git push --tags
$ git push my_origin --tags

$ git tag -d  tag_name

如果还不能理解可以到这里看看是linus是怎么给Linux内核打的TAG,TAG看起来像什么:https://github.com/torvalds/linux/releases

git patch
########################################
# 当前分支,打patch
########################################
# 1、生成patch(在代码修改后没有commit之前的状态执行,进入想生成patch的目录即可)
git diff > project.patch
# 2、打patch,方法和linux的diff一样
patch -p0 < project.patch
git apply project.patch  //也可用这个命令打patch

###################################################
# 不同分支,不同文件,打pacth,
# 将 my_dev 对比 master的修改,打成path
###################################################
git diff master my_dev -- src/view/setting/other_seting.py > other_seting.py.pacth

# 此时branch 位于 master
git apply other_seting.py.pacth
打包发布
git archive --format zip --output /path/to/file.zip master # 将 master 以zip格式打包到指定文件
Send Mail
$ sudo apt-get install -y git-email

# config
$ git config --local user.email "jiang_xmin@massclouds.com"
$ git config --local user.name  "jiang_xmin"
$ git config --local sendemail.smtpserver     "smtp.qiye.163.com"
$ git config --local sendemail.smtpencryption "tls"
$ git config --local sendemail.smtpuser        "jiang_xmin@massclouds.com"
$ git config --local sendemail.smtpserverport "25"
# git config --local sendemail.smtppass       'passwd'

$ git config --local sendemail.annotate     true
$ git config --local sendemail.chainreplyto true
$ git config --local sendemail.confirm      always
$ git config --local sendemail.to jxm_zn@163.com  # sendo to

# send
$ git send-email --no-chain-reply-to --annotate --confirm=always --to=jxm_zn@163.com  master -1
Github
# 未加速
git clone https://github.com/Autoware-AI/autoware.ai.git

# 加速
git clone https://github.com.cnpmjs.org/Autoware-AI/autoware.ai.git
git clone https://hub.fastgit.org/Autoware-AI/autoware.ai.git


git clone
git clone https://ghproxy.com/https://github.com/stilleshan/ServerStatus

wget & curl
wget https://ghproxy.com/https://github.com/stilleshan/ServerStatus/archive/master.zip
wget https://ghproxy.com/https://raw.githubusercontent.com/stilleshan/ServerStatus/master/Dockerfile
curl -O https://ghproxy.com/https://github.com/stilleshan/ServerStatus/archive/master.zip
curl -O https://ghproxy.com/https://raw.githubusercontent.com/stilleshan/ServerStatus/master/Dockerfile
sudo gedit /etc/hosts

添加

151.101.185.194 http://github.global.ssl.fastly.net
192.30.253.112  http://github.com

保存,退出,并重启网络

/etc/init.d/networking restart
Gitlab
搭建Gitlab
docker run --name='gitlab-ce' -d \
      -p 10022:22 -p 10080:80 \
      --restart always \
      --volume /data/gitlab/config:/etc/gitlab \
      --volume /data/gitlab/logs:/var/log/gitlab \
      --volume /data/gitlab/data:/var/opt/gitlab \
      gitlab/gitlab-ce

sudo docker run --detach \
    --hostname gitlab.example.com \
    --env GITLAB_OMNIBUS_CONFIG="external_url 'http://192.168.8.100:10080'; gitlab_rails['lfs_enabled'] = true;" \
    --publish 10443:443 --publish 10080:80 --publish 10022:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:10.2.4-ce.0


# 更改物理机主机,sshd端口
sudo sed -i 's/#Port\ 22/Port\ 1022/g' /etc/ssh/sshd_config
sudo shutdown -r now

#
sudo docker run --detach \
   --hostname "192.168.1.100" \
   --env GITLAB_OMNIBUS_CONFIG="gitlab_rails['lfs_enabled'] = true;" \
   --publish 10443:443 --publish 80:80 --publish 22:22 \
   --name gitlab \
   --restart always \
   --volume /srv/gitlab/config:/etc/gitlab \
   --volume /srv/gitlab/logs:/var/log/gitlab \
   --volume /srv/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ee:13.9.1-ee.0
# /srv/gitlab/config/gitlab.rb
pages_external_url "http://192.168.1.100/"
gitlab_pages['enable'] = true
搭建Gitlab-CI 持续集成
快速使用
1. Install gitlab-runner
docker run -d --name gitlab-runner --restart always \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

# or
docker run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest
2. Registering Runners
$ docker exec -it gitlab-runner gitlab-runner register

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
https://gitlab.com

Please enter the gitlab-ci token for this runner
xxx

Please enter the gitlab-ci description for this runner
[hostame] my-runner

Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag

Whether to run untagged jobs [true/false]:
[false]: true

Whether to lock Runner to current project [true/false]:
[true]: false

Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
docker

Please enter the Docker image (eg. ruby:2.1):
alpine:latest
$ sudo docker exec -it gitlab-public-runner gitlab-runner register -n \
        --url "https://gitlab.com/" \
        --registration-token "REGISTRATION_TOKEN" \
        --executor docker \
        --description 2.3-docker-gitlab-runner  \
        --docker-image ubuntu:14.04  \
        --docker-privileged true\
        --locked false \
        --run-untagged true \
        --tag-list public-runner,another-tag

# add volumes
$ sudo docker exec -it gitlab-public-runner gitlab-runner register -n \
        --url https://gitlab.com/ \
        --registration-token REGISTRATION_TOKEN \
        --executor docker \
        --description "My Docker Runner" \
        --docker-image "docker:latest" \
        --docker-volumes /var/run/docker.sock:/var/run/docker.sock
3. gitlab-ci.yml
gitlab-ci 环境变量
  • CI_REPOSITORY_URL
  • CI_PIPELINE_URL
  • CI_PROJECT_URL : Project url
  • CI_SERVER_NAME
  • CI_COMMIT_REF_NAME : 分支名
$ echo "$CI_REPOSITORY_URL"
http://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@172.19.2.57/jiang_xmin/gitlib-ci_test.git
$ echo "$CI_PIPELINE_URL"
http://172.19.2.57/jiang_xmin/gitlib-ci_test/pipelines/149
$ echo "$CI_PROJECT_URL"
http://172.19.2.57/jiang_xmin/gitlib-ci_test
$ echo "$CI_SERVER"
yes
$ echo "$CI_SERVER_NAME"
GitLab
$ echo "$CI_COMMIT_REF_NAME"
dev
$ IP=`echo "$CI_PROJECT_URL" | sed "s/^http:\/\///"| sed "s/\/.*$//"`
$ echo "$IP"
172.19.2.57
4. gitlab-runner 常用命令
$ sudo gitlab-runner register
$ sudo gitlab-runner unregister --name "name"
$ sudo gitlab-runner list
$ sudo gitlab-runner verify
Triggering pipelines through the API
curl -X POST \
     -F token=c180975fb840ba2b5c942347a58f90 \
     -F ref=master \
     http://192.168.1.102/api/v4/projects/7/trigger/pipeline
downloading-the-latest-artifacts
# pirvite  project
curl -L  --header "PRIVATE-TOKEN: nDU2GenxaCiNouREB91n"  \
    "http://192.168.1.102/jiang_xmin/mc-terminal/-/jobs/artifacts/4.2.0-dev/download?job=job1" \
    -o artifacts.zip

# public project
curl -L -o artifacts.zip \
"http://192.168.1.102/jiang_xmin/mc-terminal/-/jobs/artifacts/4.2.0-dev/download?job=job1"

wget -O artifacts.zip  \
http://192.168.1.102/jiang_xmin/mc-terminal/-/jobs/artifacts/4.2.0-dev/download?job=job1

####
curl -L -o mcstudent_offline_4.2.1-11-g54157f0_amd64.deb \
http://192.168.1.102/jiang_xmin/mc-terminal/-/jobs/artifacts/4.2.0-dev/raw/BUILD/mcstudent_offline_4.2.1-11-g54157f0_amd64.deb?job=job1

wget -O mcstudent_offline_4.2.1-11-g54157f0_amd64.deb \
http://192.168.1.102/jiang_xmin/mc-terminal/-/jobs/artifacts/4.2.0-dev/raw/BUILD/mcstudent_offline_4.2.1-11-g54157f0_amd64.deb?job=job1
Advanced
$ sudo gitlab-runner register
$ sudo gitlab-runner register -c "$HOME/.gitlab-runner/config.toml"

$ sudo gitlab-runner unregister --name "name"
$ sudo gitlab-runner list
$ sudo gitlab-runner verify
FAQ
# 关闭蓝灯后,push失败
connect to 127.0.0.1 port 38897: Connection refused

# 查看
$ env | grep -i proxy

# 清空环境变量
$ export http_proxy=""
$ export https_proxy=""
$ export HTTP_PROXY=""
$ export HTTPS_PROXY=""
How to remove submodule

1. Delete the relevant line from the .gitmodules file.
2. Delete the relevant section from .git/config.
3. Run git rm --cached path_to_submodule (no trailing slash).

4. Remove directory .git/modules/<submodule name>
! [remote rejected] master -> master (shallow update not allowed)

$ git fetch --unshallow
$ git fetch --unshallow origin

与村下作诗一首



有酒的日子就得死 喝一次死一次

我在看那叶子死 那风死

在看我死以后

我死以后

就让那叶子点燃我 让那风把我骨灰吹进你眼里

你再也看不见我了

你梦里梦见我 梦看清了我

那是我老了的样子 我也知道你就是个婊子

可是我真想你啊 你赤裸着给我跳舞

给我看生活的高潮 闻死亡的味道



你啊你

你听我喝下这酒 燃起这烟

听我打了个嗝 听我决定要去流浪 听这世间的繁华不过尔尔

你啊你

你把眼睛换成星星 把身体换成我走不完的路程

用你的一生置换我的一生

鲜血淋漓在我的双脚上

荆棘的不是路 而是我自己啊

你啊 我想你定和这荆棘有所关联

否则 我怎会痛不欲生

烟戳在心窝上 不如你疼



故事开始在我死以后

我死以后 清晨的太阳开始复活

在山头唱首悲歌 唱你安宁地死在牢笼

你被野狼啮去了肉 被鹰啄去了头 被虎剔去了骨 你的灵魂开始在大地铺陈

在岸边谱曲挽歌 谱渔船撞上西边日落

水鸟立在岸边歌唱 俯视水下沉船 俯视水里埋葬的夕阳

在灯塔流浪的一生哼成调 千山万水的温情游弋喉咙里

那些在夜晚闪过的光 在白日停留的人 化成杯里的苦酒 久久沉醉

杯酒换盏 人去几回 一曲未落 一曲又起 我死在万千故事里

后记(村下南北):

我爱的不是酒,但我总跟在所有人都醉后才开始醉,可能这有点矫情。 这是一个与诗与烟相关的夜晚,自然
酒是少不了的。今日,是一个叫做向死而生的生辰。我们总活在夜里,总在一口酒和一口烟之间念叨出零碎的
诗,也许诗不够好,但却是相隔千万里的两个人所诞生的“孩子”。我们都有千言万语,可脱口而出的总是“你
这个傻逼”。

祝你生日快乐,也祝你能在往后的艰辛苦楚里快乐,干杯。

后记(向死而生):

我不是个好人,我们都不是什么好人。我们有什么可耻之处自己最清楚。我们变得完美的时候,就在握紧酒
瓶的时候。我们所有苟且不堪的日子,那些所有遗忘了自己的人们,都被一气喝下,然后变成腥骚的尿。
(村下,走一个)我不知道还能活多少年,不知道将来的日子里,还会丢失多少朋友。还好,时间永远是现
在,那些过去的和未来的…………都在酒里,干杯。

诗歌,出自邻居的耳朵,邻居的耳朵网站已于2018年2月28日正式关停

Python


# python2   SimpleHTTPServer
python -m SimpleHTTPServer 8008

# python3
python -m http.server 8008
# 查找python安装包的路径 site-packages

python -m site              # 系统目录
python -m site --user-site  # 用户目录
打包

  • python3编译成pyc文件
python3 -m compileall -b .           # -b: 生成的pyc与源代码在同一目录
find . -name '*.py' |xargs rm -rf    # . 删除py文件
find . -name 'pycache' |xargs rm -rf # 删除pycache目录
国内镜像源
  • Linux
mkdir $HOME/.pip
tee $HOME/.pip/pip.conf <<-'EOF'
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com
EOF
  • Windows
在文件夹的地址栏输入 %appdata% (即进入这个文件夹)。

在当前文件夹下新建一个pip文件夹。

进入pip文件夹,新建一个pip.ini文件
virtualenv
# old  version
#virtualenv --no-site-packages venv
#virtualenv -p /usr/bin/python3.6  --no-site-packages venv

# new version 20.0.13
virtualenv --python=python3 venv
source venv/bin/activate #启动环境
deactivate  # 退出删除环境


pip freeze  # 查看当前安装版本
pip freeze > requirements.txt
python 语法规则
  • python规则指定,所有在赋值语句左面的变量都是局部变量
a=5
def func():
    # global a  # 注释掉此行,报错
    a = a+11
    print a

func()

python库

# 键盘事件监听
from pykeyboard import PyKeyboardEvent
import time

class TapRecord(PyKeyboardEvent):
  def __init__(self):
    PyKeyboardEvent.__init__(self)

  def tap(self, keycode, character, press):
    print(time.time(), keycode, character, press)

t = TapRecord()
t.run()

# 查看字符串 编码
import chardet
fencoding=chardet.detect(u"test string")
print fencoding

# 从URL地址提取文件名
import os
url = 'http://www.jb51.net/images/logo.gif'
filename = os.path.basename(url)
print(filename)

# 去除扩展名
print os.path.splitext(filename)[0]

# 打印方法名
import inspect
import sys
for  method in  inspect.getmembers(sys.path):
    print method
Linux 下编译windows Exe
sudo apt-get install wine32 winetricks
winetricks python

cd ~/.wine/drive_c/Python26
#wine msiexec /i python-2.7.15.msi /L*v log.txt
wine msiexec /i python-2.7.15.msi

wine python.exe Scripts/pip.exe install pyinstaller -i    https://pypi.mirrors.ustc.edu.cn/simple
wine python.exe Scripts/pip.exe install --upgrade pip -i  https://pypi.mirrors.ustc.edu.cn/simple
#wine python.exe Scripts/pip.exe install pyserial -i    https://pypi.mirrors.ustc.edu.cn/simple

cd ~/workspace

tee HelloWorld.py <<-"EOF"
print('hello world!')
EOF

wine ~/.wine/drive_c/Python27/Scripts/pyinstaller.exe --onefile HelloWorld.py
wine dist/HelloWorld.exe
sudo dpkg --add-architecture i386 # 开启32位架构支持
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/' /etc/apt/sources.list
apt-get update

apt-get install -y curl
apt-get install -y wine32
#apt-get install -y --fix-missing winetricks

curl -o python-2.7.15.msi https://www.python.org/ftp/python/2.7.15/python-2.7.15.msi
wine msiexec /i python-2.7.15.msi /q   #Dockerfile 有问题???, 手动安装没问题
rm -f  python-2.7.15.msi

PY_HOME=${HOME}/.wine/drive_c/Python27
wine ${PY_HOME}/python.exe ${PY_HOME}/Scripts/pip.exe install pyinstaller   -i  https://pypi.mirrors.ustc.edu.cn/simple
wine ${PY_HOME}/python.exe ${PY_HOME}/Scripts/pip.exe install --upgrade pip -i  https://pypi.mirrors.ustc.edu.cn/simple

build install python
# 编译前安装 , 否则pip 报错误
sudo apt-get install openssl
sudo apt-get install libssl-dev
示例
UDP 接收超时
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#coding=utf-8
import socket,sys
import time

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

IP=socket.gethostbyname(socket.gethostname())
s.settimeout(30) #设置超时  
s.bind((IP,1080))

print ("等待数据中。。。。")
while True:
    try:
        s.settimeout(0.02)    # 200ms 超时
        d,a=s.recvfrom(8192)

        print ("%s%s发来数据 :%s "%(a,time.ctime(),d))
#        s.sendto('[%s] %s'%(time.ctime(),d),a)  
#        print ("收到数据并且返回到:",a)  
    except socket.timeout:
        print ("时间到!")

s.close()

Java

Android

APK 证书
keytool -genkeypair -alias serverkey -keypass 111111 -storepass 111111 \
     -dname "C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihoo.com" \
     -keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore
android{
    ...
    ...
   signingConfigs {
         myrelease {
             storeFile file( System.getProperty("user.home") + "/.android/debug.keystore")
             keyAlias "AndroidDebugKey"
             storePassword  "android"
             keyPassword  "android"
         }
     }
    buildTypes {
        release {
            signingConfig   signingConfigs.myrelease
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            signingConfig   signingConfigs.myrelease
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
学习资料
sdkmanager
$ sdkmanager --list
$ sdkmanager 'extras;m2repository;com;android;support;constraint;constraint-layout;1.0.0-alpha8'
adbshell
# 打开Android Terminal Emulatror后,输入如下的内容:
su  -root # 切换到root
setprop service.adb.tcp.port 5555
stop adbd
start adbd
$ ./gradlew assembleRelease
$ ./gradlew assembleDebug
$ adb install  app/build/outputs/apk/release/app-release.apk

$ adb shell pm list package                   # list all installed packages
$ adb shell pm uninstall  com.example.client

$ adb shell am start    com.example.client/com.example.client.MainActivity  # start
$ adb shell am start -n com.example.client/com.example.client.MainActivity  # restart


adb connect 192.168.0.105
adb devices
adb --help
adb install dangbeimarket_4.3.5_277_yunji.apk
remote-debugging-with-android-emulator

$ git clone https://github.com/guolindev/booksource
搭建环境
Android studio gradle 无法获取 pom文件
Download
官方下载地址
https://developer.android.com/studio/index.html
google developers
https://developers.google.cn/
api doc
http://www.embeddedlinux.org.cn/androidapi/
required
$ sudo apt-get install lib32z1 lib32ncurses5 lib32stdc++6
$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386
alternate text

https://jcenter.bintray.com/com/android/tools/build/

Android studio 关闭 初次启动更新

Android SDK 在线更新镜像服务器资源
中国科学院开源协会镜像站地址:
大连东软信息学院镜像服务器地址:
http://mirrors.neusoft.edu.cn 端口:80
北京化工大学镜像服务器地址:
上海GDG镜像服务器地址:
http://sdk.gdgshanghai.com 端口:8000
alternate text
$HOME/.gradle/wrapper/dists/gradle-4.0-milestone-1-all/2rnr7rhi2zsmkxo9re7615fy6/gradle-4.0-milestone-1
/home/jxm/.gradle/wrapper/dists/gradle-4.0-milestone-1-all/2rnr7rhi2zsmkxo9re7615fy6/gradle-4.0-milestone-1-all.zip
修改vim快捷键

File->Settings->Other Settings->Vim Emulation

alternate text

Select Methods to Override/Implement

移动UI框架
常见问题
$ sudo adb kill-server
$ sudo adb start-server

#then connect your device turn Debugging on and type
$ adb devices

https://github.com/YachaoLiu/spice-client-android

C/C++

Glib/GTK

Book
# 1、安装gcc/g++/gdb/make 等基本编程工具
sudo apt-get install build-essential

# 2、安装 libgtk2.0-dev libglib2.0-dev 等开发相关的库文件
sudo apt-get install gnome-core-devel

# 3、用于在编译GTK程序时自动找出头文件及库文件位置
sudo apt-get install pkg-config

# 4、安装 devhelp GTK文档查看程序
sudo apt-get install devhelp

# 5、安装 gtk/glib 的API参考手册及其它帮助文档
sudo apt-get install libglib2.0-doc libgtk2.0-doc

# 6、安装基于GTK的界面GTK是开发Gnome窗口的c/c++语言图形库
sudo apt-get install glade libglade2-dev

# 7、安装gtk2.0 或者 将gtk+2.0所需的所有文件统通下载安装完毕
sudo apt-get install libgtk2.0-dev

# 查看GTK库版本

# 1.查看 2.x 版本
pkg-config --modversion gtk+-2.0

# 2.查看pkg-config的版本
pkg-config --version

# 3.查看是否安装了gtk
pkg-config --list-all grep gtk
数据结构



Protobuf
# ubuntu install protobuf
sudo apt-get install  libprotobuf-dev
sudo apt-get install protobuf-compiler

#
g++ write.cpp addressbook.pb.cc  -o write `pkg-config --cflags --libs protobuf`
g++ read.cpp  addressbook.pb.cc  -o read  `pkg-config --cflags --libs protobuf`
SRC_DIR:=../../proto
DST_DIR:=.
all:
        protoc -I=${SRC_DIR} --cpp_out=${DST_DIR}    ${SRC_DIR}/gps_path_tracking.proto
        protoc -I=${SRC_DIR} --python_out=${DST_DIR} ${SRC_DIR}/gps_path_tracking.proto
# Qt .pro add this line
unix|win32: LIBS += -pthread -lprotobuf -pthread -lpthread
boost
sudo apt-get install libboost-all-dev

g++ test.cpp -lboost_system -lboost_filesystem
C/C++编译器的预定义宏
#include <stdio.h>


#define PT_MAKE_STR(x)      { #x, PT_MAKE_STR_ESC(x) }
#define PT_MAKE_STR_ESC(x)    #x


typedef struct
{
        const char *name;
        const char *value;
} MACRO_T;


/* Compilers */const MACRO_T g_compilers[ ] =
{
#ifdef __INTEL_COMPILER        /* Interl C++ */
        PT_MAKE_STR( __INTEL_COMPILER ),
#endif

#ifdef _MSC_VER                        /* Visual C++ */
        PT_MAKE_STR( _MSC_VER ),
#endif

#ifdef __GNUC__                        /* GCC */
        PT_MAKE_STR( __GNUC__ ),
#endif

#ifdef __DMC__                        /* DMC++ */
        PT_MAKE_STR( __DMC__ ),
#endif

#ifdef __ARMCC_VERSION        /* ARM C/C++ */
        PT_MAKE_STR( __ARMCC_VERSION ),
#endif
};


/* Operation system */const MACRO_T g_platforms[ ] =
{

#ifdef __i386__
        PT_MAKE_STR(__i386__),
#endif

#ifdef __x86_64__
        PT_MAKE_STR(__x86_64__),
#endif

#ifdef __AMD64__
        PT_MAKE_STR(__AMD64__),
#endif

#ifdef __amd64__
        PT_MAKE_STR(__amd64__),
#endif

#ifdef __ia64__
        PT_MAKE_STR(__ia64__),
#endif

#ifdef __alpha__
        PT_MAKE_STR(__alpha__),
#endif

#ifdef __arm__
        PT_MAKE_STR(__arm__),
#endif

#ifdef __sparc__
        PT_MAKE_STR(__sparc__),
#endif

#ifdef __arch64__
        PT_MAKE_STR(__arch64__),
#endif

#ifdef __aarch64__
        PT_MAKE_STR( __aarch64__ ),
#endif

#ifdef __powerpc__
        PT_MAKE_STR(__powerpc__),
#endif

#ifdef __powerpc64__
        PT_MAKE_STR(__powerpc64__),
#endif

#ifdef __ppc__
        PT_MAKE_STR(__ppc__),
#endif

#ifdef __ppc64__
        PT_MAKE_STR(__ppc64__),
#endif

#ifdef _WIN32                        /* Windows 32 or Windows 64 */
        PT_MAKE_STR( _WIN32 ),
#endif

#ifdef _WIN64                        /* Windows 64 */
        PT_MAKE_STR( _WIN64 ),
#endif

#ifdef __MINGW32__                /* Windows32 by mingw compiler */
        PT_MAKE_STR( __MINGW32__ ),
#endif

#ifdef __CYGWIN__                /* Cygwin */
        PT_MAKE_STR( __CYGWIN__ ),
#endif

#ifdef __linux__                /* linux */
        PT_MAKE_STR( __linux__ ),
#endif

#ifdef __FreeBSD__                /* FreeBSD */
        PT_MAKE_STR( __FreeBSD__ ),
#endif

#ifdef __NetBSD__                /* NetBSD */
        PT_MAKE_STR( __NetBSD__ ),
#endif

#ifdef __OpenBSD__                /* OpenBSD */
        PT_MAKE_STR( __OpenBSD__ ),
#endif

#ifdef __sun__                /* Sun OS */
        PT_MAKE_STR( __sun__ ),
#endif

#ifdef __MaxOSX__                /* MAC OS X */
        PT_MAKE_STR( __MaxOSX__ ),
#endif

#ifdef __unix__                        /* unix */
        PT_MAKE_STR( __unix__ ),
#endif
};


/* Other useful */const MACRO_T g_others[ ] =
{
#ifdef __DATE__
        PT_MAKE_STR( __DATE__ ),
#endif

#ifdef __TIME__
        PT_MAKE_STR( __TIME__ ),
#endif

#ifdef _BSD_SOURCE
        PT_MAKE_STR( _BSD_SOURCE ),
#endif

#ifdef _POSIX_SOURCE
        PT_MAKE_STR( _POSIX_SOURCE ),
#endif

#ifdef _XOPEN_SOURCE
        PT_MAKE_STR( _XOPEN_SOURCE ),
#endif

#ifdef _GNU_SOURCE
        PT_MAKE_STR( _GNU_SOURCE ),
#endif

#ifdef __GNUC_MINOR__
        PT_MAKE_STR( __GNUC_MINOR__ ),
#endif

#ifdef __VERSION__
        PT_MAKE_STR( __VERSION__ ),
#endif

#ifdef __unix
        PT_MAKE_STR( __unix ),
#endif

};



int main( int argc, char **argv )
{
        int i;

        printf( "/* Compiler definitions. */\n" );
        for( i = 0; i < sizeof( g_compilers ) / sizeof( g_compilers[ 0 ] ); ++i )
        {
                printf( "#define %s %s\n", g_compilers[ i ].name, g_compilers[ i ].value );
        }
        printf( "\n" );

        printf( "/* Platform definitions. */\n" );
        for( i = 0; i < sizeof( g_platforms ) / sizeof( g_platforms[ 0 ] ); ++i )
        {
                printf( "#define %s %s\n", g_platforms[ i ].name, g_platforms[ i ].value );
        }
        printf( "\n" );

        printf( "/* Other definitions. */\n" );
        for( i = 0; i < sizeof( g_others ) / sizeof( g_others[ 0 ] ); ++i )
        {
                printf( "#define %s %s\n", g_others[ i ].name, g_others[ i ].value );
        }
        printf( "\n" );

        return 0;
}
GeographicLib
// main.cpp
#include <iostream>
#include <exception>
#include <cmath>
#include <GeographicLib/Geocentric.hpp>
#include <GeographicLib/LocalCartesian.hpp>

#include <iomanip>

using namespace std;
using namespace GeographicLib;
int main() {
    cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(8); //输出一个右对齐的小数点后两位的浮点数。
  try {
    Geocentric earth(Constants::WGS84_a(), Constants::WGS84_f());
    // Alternatively: const Geocentric& earth = Geocentric::WGS84();
    const double lat0 = 48 + 50/60.0, lon0 = 2 + 20/60.0; // Paris
    LocalCartesian proj(lat0, lon0, 0, earth);
    {
      // Sample forward calculation
      double lat = 50.9, lon = 1.8, h = 0; // Calais
      double x, y, z;
      proj.Forward(lat, lon, h, x, y, z);
      cout << x << " " << y << " " << z << "\n";
    }
    {
      // Sample reverse calculation
      double x = -38e3, y = 230e3, z = -4e3;
      double lat, lon, h;
      proj.Reverse(x, y, z, lat, lon, h);
      cout << lat << " " << lon << " " << h << "\n";
    }
  }
  catch (const exception& e) {
    cerr << "Caught exception: " << e.what() << "\n";
    return 1;
  }
}
apt-get install libgeographic-dev

g++ main.cpp `pkg-config --cflags --libs geographiclib`
# CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)
project(localCartesian_test LANGUAGES CXX)

#find_package(PkgConfig REQUIRED)
include(FindPkgConfig)

#pkg_search_module(GEOGRAPHICLIB REQUIRED IMPORTED_TARGET geographiclib>=1.49) # 检查包并使用第一个可用包
pkg_check_modules(GEOGRAPHICLIB REQUIRED IMPORTED_TARGET geographiclib>=1.49)  # 检查所有相应的包


#include_directories(${GEOGRAPHICLIB_INCLUDE_DIRS})
include_directories(PkgConfig::GEOGRAPHICLIB)

add_executable(${PROJECT_NAME} main.cpp)

#target_link_libraries(${PROJECT_NAME}  ${GEOGRAPHICLIB_LIBRARIES})
target_link_libraries(${PROJECT_NAME}  PkgConfig::GEOGRAPHICLIB)

UTF-8是一种变长字节编码方式。
对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;
如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,
其余各字节均以10开头。UTF-8最多可用到6个字节。

如表:


1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

因此UTF-8中可以用来表示字符编码的实际位数最多有31位,即上表中x所表示的位。
除去那些控制位(每字节开头的10等),这些x表示的位与UNICODE编码是一一对应的,位高低顺序也相同。
实际将UNICODE转换为UTF-8编码时应先去除高位0,然后根据所剩编码的位数决定所需最小的UTF-8编码位数。
因此那些基本ASCII字符集中的字符(UNICODE兼容ASCII)只需要一个字节的UTF-8编码(7个二进制位)便可以表示
gcc
  • -Wno-unused-function: 发现不使用的函数不警告
  • 全局环境变量( C_INCLUDE_PATH / CPLUS_INCLUDE_PATH )添加自定义的头文件路径
  • -rpath: 用于指定运行动时态库搜索路径

Rust

Rust编程语言官方文档:https://www.rust-lang.org/zh-CN/learn
这是官方提供的学习教程和API文档,包含了从基础语法到高级概念的全面介绍和详细说明,可谓是Rust学习的必备资料之一。

视频教程:Rust编程入门 (B站课程):https://www.bilibili.com/video/BV1zQ4y147kN
这是B站上比较受欢迎的Rust视频教程之一,适合初学者快速入门。教程内容从基本类型和控制流开始讲起,涵盖了函数、模块、trait等Rust语言特性,且实践代码充分,易于理解和运用。

Rust By Example(中文版):https://doc.rust-lang.org/stable/rust-by-example/
这是一个Rust的在线示例库,共收录了200多个实用例子,并配以详尽解析和注释。可以较好地帮助初学者理解Rust核心概念、常见问题和最佳实践,同时也有利于Rust语言技巧的提升和应用场景的拓展。

Rust 程序设计语言(中文版):https://kaisery.github.io/trpl-zh-cn/
这是一本Rust的免费在线书籍,作者将它定义为针对初学者和有经验的程序员编写的全面教程。其中除了介绍Rust的基础语法等内容外,还涵盖了系统编程、CLI工具编写、Web开发等多个领域的应用案例。对于想要深入学习和掌握Rust的开发者来说,该书是相当重要的参考资料之一。

Rust 语言核心原理与实践 (豆瓣) :
https://book.douban.com/subject/34931557/
这是一本Rust高级编程的中文书籍,旨在理解Rust底层架构、内存安全、异步编程、高阶类型抽象等技术特性。对于想要深入去理解Rust背后更加高深的编程知识和思维方式的人来说,会有很大收获。

Qt

Qt学习 开源项目
QML
qml online
/* test.qml */

import QtQuick 2.0

Rectangle {
    id: test
    width: 100; height: 30

    Text {
        anchors.fill:parent;
        text: textData;
    }
}
from PyQt5.QtQuick import  QQuickView
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl

app = QApplication([])

view = QQuickView()
rootContext = view.rootContext()
rootContext.setContextProperty("textData", "Hello world")
view.setSource(QUrl("test.qml"))
view.show()
app.exec_()


PyQt4
Nullege is a search engine for Python source code

Qt Style Sheets Examples

PyQt 学习示例
git clone --depth 1  https://github.com/pyqt/examples.git
播放器
QMultimedia
QCamera
$ sudo apt-get install smplayer
QT环境搭建: QT-4.8 在windows下的使用
http://blog.csdn.net/qq_22122811/article/details/63684008
知识点
// QTableWidget
this->ui->tablewidget->setSelectionBehavior(QAbstractItemView::SelectRows);  //单击选择一行
this->ui->tablewidget->setSelectionMode(QAbstractItemView::SingleSelection); //设置只能选择一行,不能多行选中
this->ui->tablewidget->setEditTriggers(QAbstractItemView::NoEditTriggers);   //设置每行内容不可更改
this->ui->tablewidget->setAlternatingRowColors(true);                        //设置隔一行变一颜色,即:一灰一白
# install qt4
$ sudo apt-get install qt4-dev-tools qt4-doc qt4-qtconfig qt4-demos qt4-designer -y --force-yes

# qtcreator-3.5.1 depends
$ sudo apt-get install libgstreamer-plugins-base0.10-0
StyleSheet
sudo apt-get install ttf-wqy-zenhei fonts-wqy-microhei #安装字体

fc-list # 查看字体命令
font: bold;  是否粗体显示
border-image:"";  用来设定边框的背景图片。
border-radius:5px;  用来设定边框的弧度。可以设定圆角的按钮
border-width: 1px;  边框大小


font-family:"微软雅黑";  来设定字体所属家族,
font-size:20px;      来设定字体大小
font-style:"";       来设定字体样式
font-weight:20px;    来设定字体深浅

background-color: green;  设置背景颜色
background:transparent;   设置背景为透明
color:rgb(241, 70, 62);   设置前景颜色
selection-color:rgb(241, 70, 62);  用来设定选中时候的颜色

qproperty-alignment: AlignCenter; /*居中*/
qproperty-text: '文字';
qproperty-wordWrap: true; /* 自动换行*/



 min-height: 32px;
 max-height: 32px;
 min-width: 80px;
 max-width: 80px;
 padding: 5px;


可以使用border-top,border-right,border-bottom,border-left分别设定按钮的上下左右边框,
同样有border-left-color, border-left-style, border-left-width.等分别来设定他们的颜色,样式和宽度
/************************
*   横向 Slider
************************/
QSlider::groove:horizontal {
        border: 1px solid #4A708B;
        background: #C0C0C0;
        height: 5px;
        border-radius: 1px;
        padding-left:-1px;
        padding-right:-1px;
}

QSlider::sub-page:horizontal {
        background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
            stop:0 #B1B1B1, stop:1 #c4c4c4);
        background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1,
            stop: 0 #5DCCFF, stop: 1 #1874CD);
        border: 1px solid #4A708B;
        height: 10px;
        border-radius: 2px;
}

QSlider::add-page:horizontal {
        background: #575757;
        border: 0px solid #777;
        height: 10px;
        border-radius: 2px;
}

QSlider::handle:horizontal {
    background: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5,
    stop:0.6 #45ADED, stop:0.778409 rgba(255, 255, 255, 255));

    width: 11px;
    margin-top: -3px;
    margin-bottom: -3px;
    border-radius: 5px;
}

QSlider::handle:horizontal:hover {
    background: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0.6 #2A8BDA,
    stop:0.778409 rgba(255, 255, 255, 255));

    width: 11px;
    margin-top: -3px;
    margin-bottom: -3px;
    border-radius: 5px;
}

QSlider::sub-page:horizontal:disabled {
        background: #00009C;
        border-color: #999;
}

QSlider::add-page:horizontal:disabled {
        background: #eee;
        border-color: #999;
}

QSlider::handle:horizontal:disabled {
        background: #eee;
        border: 1px solid #aaa;
        border-radius: 4px;
}


/************************
*   纵向 Slider
************************/

QSlider::groove:vertical {
        border: 1px solid #4A708B;
        background: #C0C0C0;
        width: 5px;
        border-radius: 1px;
        padding-left:-1px;
        padding-right:-1px;
        padding-top:-1px;
        padding-bottom:-1px;
}

QSlider::sub-page:vertical {
        background: #575757;
        border: 1px solid #4A708B;
        border-radius: 2px;
}

QSlider::add-page:vertical {
        background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
            stop:0 #c4c4c4, stop:1 #B1B1B1);
        background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1,
            stop: 0 #5DCCFF, stop: 1 #1874CD);
        border: 0px solid #777;
        width: 10px;
        border-radius: 2px;
}

QSlider::handle:vertical
{
        background: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0.6 #45ADED,
        stop:0.778409 rgba(255, 255, 255, 255));

        height: 11px;
        margin-left: -3px;
        margin-right: -3px;
        border-radius: 5px;
}

QSlider::sub-page:vertical:disabled {
        background: #00009C;
        border-color: #999;
}

QSlider::add-page:vertical:disabled {
        background: #eee;
        border-color: #999;
}

QSlider::handle:vertical:disabled {
        background: #eee;
        border: 1px solid #aaa;
        border-radius: 4px;
}

Opencv

  • 百度云盘 -- Books/OpenCV官方教程中文版(Python书签版)

Nginx


# 在配置proxy_pass代理转发时,如果后面的url加/,表示绝对根路径;如果没有/,表示相对路径

sudo tee ${HOME}/.nginx/default.conf
<<-'EOF'
upstream my_server {
    server 192.168.1.100:81;
    keepalive 2000;
}

server {
    listen       80;
    server_name  127.0.0.1;
    client_max_body_size 1024M;
    location / {
        proxy_pass http://my_server/videos/;
        proxy_set_header Host $host:$server_port;
    }
}
EOF

sudo docker run -d --restart=always -p 82:80 -v ${HOME}/.nginx/default.conf:/etc/nginx/conf.d/default.conf \
--name alpine_nginx_proxy \
jiangxumin/alpine-nginx:latest

下载工具研究

Aria2
Examble
$ sudo  aria2c --allow-overwrite  -x5 -o abc.qcow2 http://192.168.100.109:8889/offline_imge.qcow2
$ sudo  aria2c --continue=true  --allow-overwrite  -x5 -o abc.qcow2 http://192.168.100.109:8889/offline_imge.qcow2
$ sudo  aria2c --enable-rpc=true -D --disable-ipv6 --check-certificate=false

$ sudo aria2c   --enable-rpc \
                --rpc-listen-all \
                --continue  \
                --max-concurrent-downloads=1 \
                --max-connection-per-server=10 \
                --rpc-max-request-size=1024M

lightweight markup language

Makedown
```mermaid
graph TD
    A[Christmas] -->|Get money| B(Go shopping)
    B --> C{Let me think}
    C -->|One| D[Laptop]
    C -->|Two| E[iPhone]
    C -->|Three| F[fa:fa-car Car]
```

```mermaid
gantt
    dateFormat  YYYY-MM-DD

    title 软件开发甘特图

    section 设计
        需求:done,des1, 2019-01-06,2019-01-08
        原型:active,des2, 2019-01-09, 3d
        UI设计:des3, after des2, 5d
        未来任务:des4, after des3, 5d

    section 开发
        学习准备理解需求:crit, done, 2019-01-06,24h
        设计框架:crit, done, after des2, 2d
        开发:crit, active, 3d
        未来任务:crit, 5d
        休息时间:2d

    section 测试
        功能测试:active, a1, after des3, 3d
        压力测试:after a1, 20h
        测试报告: 48h
```

```mermaid
sequenceDiagram
    小程序 ->> 小程序 : wx.login()获取code
    小程序 ->> + 服务器 : wx.request()发送code
    服务器 ->> + 微信服务器 : code+appid+secret
    微信服务器 -->> - 服务器 : openid
    服务器 ->> 服务器 : 根据openid确定用户并生成token
    服务器 -->> - 小程序 : token
```

```mermaid
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#ff0000'}}}%%
        graph TD
          A[Christmas] -->|Get money| B(Go shopping)
          B --> C{Let me think}
          B --> G[/Another/]
          C ==>|One| D[Laptop]
          C -->|Two| E[iPhone]
          C -->|Three| F[fa:fa-car Car]
          subgraph section
            C
            D
            E
            F
            G
          end
```
|姓名|爱好|
|----|----|
|张三|足球<br>篮球
|李四|羽毛球<br>乒乓球

You could just use some HTML in your Markdown:

<img src="drawing.jpg" alt="drawing" width="200"/>

Or via style attribute (not supported by GitHub)

<img src="drawing.jpg" alt="drawing" style="width:200px;"/>

Or you could use a custom CSS file as described in this answer on Markdown and image alignment

![drawing](drawing.jpg)

CSS in another file:

img[alt=drawing] { width: 200px; }
reStructuredText
配置文件说明 conf.py
  • version

项目主版本, 用来替代 |Version|. 例如,对于Python文档, 就像2.6

  • release

完整版本,用来替换 |release|, 正如在HTML模板中. 例如,对于Python文档。正如 2.6.0rc1

如果你不需要在version 和 release 做区别,只需要将它们设置为相同即可。
  • 不显示 View page source

html_copy_source

html_copy_source=False
html_show_sourcelink=False

参考 The build configuration file

支持中文搜索
一. Read the docs 支持中文搜索
  1. 修改conf.py

    # import os
    

    改为

    import os
    
  2. 在 conf.py添加

    on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
    if on_rtd:
        latex_elements = {
        # The paper size ('letterpaper' or 'a4paper').
        #'papersize': 'letterpaper',
        # The font size ('10pt', '11pt' or '12pt').
        #'pointsize': '10pt',
        # Additional stuff for the LaTeX preamble.
        'preamble': r'''
        \hypersetup{unicode=true}
        \usepackage{CJKutf8}
        \DeclareUnicodeCharacter{00A0}{\nobreakspace}
        \DeclareUnicodeCharacter{2203}{\ensuremath{\exists}}
        \DeclareUnicodeCharacter{2200}{\ensuremath{\forall}}
        \DeclareUnicodeCharacter{2286}{\ensuremath{\subseteq}}
        \DeclareUnicodeCharacter{2713}{x}
        \DeclareUnicodeCharacter{27FA}{\ensuremath{\Longleftrightarrow}}
        \DeclareUnicodeCharacter{221A}{\ensuremath{\sqrt{}}}
        \DeclareUnicodeCharacter{221B}{\ensuremath{\sqrt[3]{}}}
        \DeclareUnicodeCharacter{2295}{\ensuremath{\oplus}}
        \DeclareUnicodeCharacter{2297}{\ensuremath{\otimes}}
        \begin{CJK}{UTF8}{gbsn}
        \AtEndDocument{\end{CJK}}
        ''',
        }
    else:
        latex_elements = {
            'papersize' : 'a4paper',
            'utf8extra' : '',
            'inputenc'  : '',
            'babel'     : r'''\usepackage[english]{babel}''',
            'preamble' : r'''
            \usepackage{ctex}
            ''',
        }
    
二. 本地支持中文搜索
安装结巴
$ sudo pip install --upgrade pip==9.0.1  -i https://pypi.mirrors.ustc.edu.cn/simple
$ sudo pip install jieba==0.38  -i https://pypi.mirrors.ustc.edu.cn/simple
修改sphinx
  1. 下载zh_CN.py

    $ git clone https://github.com/bosbyj/sphinx.search.zh_CN.git
    
  2. 复制 zh_CN.py 到 sphinx 的 search 目录下,如:

    • Windows
      C:\Python27\Lib\site-packages\sphinx\search
      
    • ubuntu
      $HOME/.local/lib/python2.7/site-packages/sphinx/search/
      
      or
      /usr/local/lib/python2.7/dist-packages/Sphinx-1.5.5-py2.7.egg/sphinx
      
  3. 编辑search 目录下的 __init__.py 找到:

# maps language name to module.class or directly a class
languages = {
    'da': 'sphinx.search.da.SearchDanish',
    'de': 'sphinx.search.de.SearchGerman',
    'en': SearchEnglish,
    'es': 'sphinx.search.es.SearchSpanish',
                ... ...
    'sv': 'sphinx.search.sv.SearchSwedish',
    'tr': 'sphinx.search.tr.SearchTurkish',
    'zh': 'sphinx.search.zh.SearchChinese',
}

修改成:

# maps language name to module.class or directly a class
languages = {
    'da': 'sphinx.search.da.SearchDanish',
    'de': 'sphinx.search.de.SearchGerman',
    'en': SearchEnglish,
    'es': 'sphinx.search.es.SearchSpanish',
                ... ...
    'sv': 'sphinx.search.sv.SearchSwedish',
    'tr': 'sphinx.search.tr.SearchTurkish',
    'zh': 'sphinx.search.zh.SearchChinese',
 'zh_CN': 'sphinx.search.zh_CN.SearchChinese',
}
重新make文档
  1. 修改 source/conf.py
language = "zh_CN"
  1. Build html
$ make html
配置本地生成pdf
一. 安装rst2pdf
$ sudo pip install rst2pdf  -i https://pypi.mirrors.ustc.edu.cn/simple
二. 配置rst2pdf

告诉sphinx我们安装了rst2pdf,并且将其作为插件使用。修改conf.py中配置:

on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
if on_rtd:
    extensions = ['sphinx.ext.autodoc',
         'sphinx.ext.doctest',
         'sphinx.ext.intersphinx',
         'sphinx.ext.todo',
         'sphinx.ext.coverage',
         'sphinx.ext.ifconfig',
         'sphinx.ext.viewcode',
         'sphinx.ext.githubpages',
         ]
else:
    extensions = [
      'sphinx.ext.autodoc',
      'rst2pdf.pdfbuilder'
    ]

在conf.py中添加PDF相关的配置:

# -- Options for PDF output --------------------------------------------------

# Grouping the document tree into PDF files. List of tuples
# (source start file, target name, title, author, options).
#
# If there is more than one author, separate them with \\.
# For example: r'Guido van Rossum\\Fred L. Drake, Jr., editor'
#
# The options element is a dictionary that lets you override
# this config per-document.
# For example,
# ('index', u'MyProject', u'My Project', u'Author Name',
#  dict(pdf_compressed = True))
# would mean that specific document would be compressed
# regardless of the global pdf_compressed setting.

pdf_documents = [
    ('index', u'HanLP Handbook', u'HanLP Handbook', u'hankcs'),
]

# A comma-separated list of custom stylesheets. Example:
pdf_stylesheets = ['a3','zh_CN']

# Create a compressed PDF
# Use True/False or 1/0
# Example: compressed=True
#pdf_compressed = False

# A colon-separated list of folders to search for fonts. Example:
#pdf_font_path = ['C:\\Windows\\Fonts']

# Language to be used for hyphenation support
pdf_language = "zh_CN"

# Mode for literal blocks wider than the frame. Can be
# overflow, shrink or truncate
pdf_fit_mode = "shrink"

# Section level that forces a break page.
# For example: 1 means top-level sections start in a new page
# 0 means disabled
#pdf_break_level = 0

# When a section starts in a new page, force it to be 'even', 'odd',
# or just use 'any'
#pdf_breakside = 'any'

# Insert footnotes where they are defined instead of
# at the end.
#pdf_inline_footnotes = True

# verbosity level. 0 1 or 2
#pdf_verbosity = 0

# If false, no index is generated.
#pdf_use_index = True

# If false, no modindex is generated.
#pdf_use_modindex = True

# If false, no coverpage is generated.
#pdf_use_coverpage = True

# Documents to append as an appendix to all manuals.
#pdf_appendices = []

# Enable experimental feature to split table cells. Use it
# if you get "DelayedTable too big" errors
#pdf_splittables = False

# Set the default DPI for images
#pdf_default_dpi = 72

# Enable rst2pdf extension modules (default is only vectorpdf)
# you need vectorpdf if you want to use sphinx's graphviz support
#pdf_extensions = ['vectorpdf']

# Page template name for "regular" pages
#pdf_page_template = 'cutePage'

# Show Table Of Contents at the beginning?
# pdf_use_toc = False

# How many levels deep should the table of contents be?
pdf_toc_depth = 2

# Add section number to section references
pdf_use_numbered_links = False

# Background images fitting mode
pdf_fit_background_mode = 'scale'
三. 样式表

在项目根目录下创建一个 zh_CN.json ,写入:

{
  "embeddedFonts": [
    "simsun.ttc"
  ],
  "fontsAlias": {
    "stdFont": "simsun",
    "stdBold": "simsun",
    "stdItalic": "simsun",
    "stdBoldItalic": "simsun",
    "stdMono": "simsun",
    "stdMonoBold": "simsun",
    "stdMonoItalic": "simsun",
    "stdMonoBoldItalic": "simsun",
    "stdSans": "simsun",
    "stdSansBold": "simsun",
    "stdSansItalic": "simsun",
    "stdSansBoldItalic": "simsun"
  },
  "styles": [
    [
      "base",
      {
        "wordWrap": "CJK"
      }
    ],
    [
      "literal",
      {
        "wordWrap": "None"
      }
    ]
  ]
}

四. 本地生成pdf

$ make pdf

参考 rst2pdf拓展sphinx生成PDF

graphviz 画图

Using PlantUML

INSTALL
$ sudo  apt-get install graphviz
conf.py
# 通过配置开启graphviz插件
# extensions = ['sphinx.ext.graphviz']
extensions.append('sphinx.ext.graphviz')


#######################################################################
# -- Options for graphviz  seting -------------------------------------
#######################################################################

# 设置 graphviz_dot 路径
graphviz_dot = 'dot'

# 设置 graphviz_dot_args 的参数,这里默认了默认字体
graphviz_dot_args = ['-Gfontname=Georgia',
                     '-Nfontname=Georgia',
                     '-Efontname=Georgia']
# 输出格式,默认png,这里我用svg矢量图
graphviz_output_format = 'svg'
在线编辑器
config-file
  • https://docs.readthedocs.io/en/stable/config-file/v2.html#
INSTALL
$ sudo pip install --upgrade pip -i https://pypi.mirrors.ustc.edu.cn/simple

# for mac
$ sudo pip install six --upgrade --ignore-installed six

$ sudo pip install sphinx==1.5.5  sphinx-autobuild==0.6.0 -i https://pypi.mirrors.ustc.edu.cn/simple
$ sudo pip install sphinx_rtd_theme==0.2.4  -i https://pypi.mirrors.ustc.edu.cn/simple
$ sudo python -m pip install m2r  # 支持Markdown

$ sudo  apt-get install graphviz # suport  graphviz
latex
# 然后安装构建 PDF 所需的 TeX Live 相关包。
sudo apt -y install texlive-xetex \
                    texlive-latex-recommended \
                    texlive-latex-extra \
                    texlive-fonts-recommended \
                    texlive-fonts-extra \
                    texlive-lang-english \
                    texlive-lang-chinese \
                    texlive-lang-cjk \
                    latexmk


# 然后安装构建 texlive 所有包。
sudo apt -y install texlive-full

make latexpdf
  • svg 图片转pdf
sudo apt-get install inkscape python3-sphinxcontrib.svg2pdfconverter

# pip3 install  sphinxcontrib-svg2pdfconverter==1.2.0
extensions = [
    # ... ,
    # ... ,
    'sphinxcontrib.inkscapeconverter'
]

extensions = [
    'recommonmark',           # sport markdown
    'sphinx_markdown_tables', # sport markdown tables
    'sphinx_math_dollar',     # sport math
    'sphinx.ext.mathjax',     # sport math
    'sphinxcontrib.inkscapeconverter' # svg convert to pdf
    ]
  • xindy - index generator for structured documents like LaTeX or SGML
sudo apt-get install xindy
建立sphinx工程
$ sphinx-quickstart

$ echo "build/" >> .gitignore
> Separate source and build directories (y/n) [n]: y

修改 conf.py

language = "zh_CN"
html_theme = 'sphinx_rtd_theme'
# language = "zh_CN"
sed -i "s/^language =.*$/language = 'zh_CN'/g" source/conf.py
# html_theme = 'sphinx_rtd_theme'
sed -i "s/^html_theme =.*$/html_theme = 'sphinx_rtd_theme'/g" source/conf.py

## 手动注释掉,关闭: loading intersphinx inventory from https://docs.python.org/objects.inv...
# intersphinx_mapping = {'https://docs.python.org/': None}
Webhook
GitHub
alternate text alternate text
Gitlab

Gitee

代码
.. code-block:: sh

        #!/bin/sh
        echo "hello world"
.. literalinclude:: filename
   :linenos:
   :language:
   :lines:
   :start-after:
   :end-before:
   :emphasize-lines:
表格
.. csv-table::
:header: A, B, A and B
:widths: 5, 10, 5

False, False, False
True, False, False
False, True, False
True, True, True

.. csv-table:: Table Title
:file: ./csv/name.csv
:widths: 30, 70
:header-rows: 1
标题
级别 标题
01 =
02 -
03 `
04 :
05 '
06 "
07 ~
08 ^
09 _
10 *
11 +
12 #
13 <
14 >
图片
.. image:: ./images/pic1.png
        :scale: 60%

.. image:: ./images/pic2.png
        :width:  380px
        :height: 253px


.. image:: ./x.gif
       :height: 660px
       :width: 580 px
       :scale: 70%
       :alt: alternate text
       :align: center

.. raw:: html

   <hr width=50 size=10>

.. raw:: html
   :url: http://docutils.sourceforge.net/docs/ref/rst/directives.html
公式
$\acute{X_r}$


.. math::

v_r=\acute{X_r}  cos \varphi +\acute{Y_r}sin\varphi


$$
\acute{X_f}cos( \varphi + \delta_f)−\acute{Y_f}sin( \varphi +  \delta_f)=0
$$

$$
\acute{X_r}​sin\varphi − \acute{Y_r} cos\varphi=0
$$


.. math::

\acute{X_r} = \acute{Y_r} {sin\varphi \over cos\varphi}​


.. math::

v_r = \acute{Y_r}{sin\varphi \over cos\varphi}cos\varphi + \acute{Y_r}sin\varphi
    = {{\acute{Y_r}cos\varphi^2+\acute{Y_r}sin\varphi^2} \over sin\varphi }
    = sin\varphi \acute{Y_r}


X_f = X_r + lcos\varphi


.. math::

R = { v_r \over \omega }


.. math::

\delta_f = arctan( {\omega l \over v_r} ) = arctan ( {l \over R} )


.. math::

\delta_f = arctan({l \over R})


$$\gamma = {1 \over r} ={2x \over l^2}$$


$$\delta_f =arctan({l \gamma} )$$


$$= {{(a∆_x)^2 + (b∆_y)^2 + (a∆_y)^2 + (b∆_x)^2} \over {( a^2 + b^2)}}$$


.. math::

d = {{ | a x_0 + b y_0 + c | } \over { \sqrt{ a^2 + b^2} }}
修改页面宽度

Another option is to create a stylesheet in source/_static with just the css you want, e.g.

.wy-nav-content {
    max-width: none;
}

/*or*/

.wy-nav-content {
    max-width: 1200px !important;
}

Make sure the directory is referenced in source/conf.py - I believe by default there's a line to do this, i.e.

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".

html_static_path = ['_static']

Then create a custom layout in source/_templates/layout.html and do something like this to include your stylesheet

{% extends "!layout.html" %}
{% block extrahead %}
    <link href="{{ pathto("_static/style.css", True) }}" rel="stylesheet" type="text/css">
{% endblock %}
Assuming you called your stylesheet style.css
GPT4使用技巧
  • 通过 bing chart 使用 GPT4 翻译

    使用GPT4将下面的内容翻译成中文:

LaTeX

INSTALL
##############
# Ubuntu
##############
$ sudo apt-get install texlive-full # 完全安装
$ sudo apt-get install texlive

# Install Edit
$ sudo apt-get install texmaker
$ sudo apt-get install texstudio

############
#  mac
############

$ brew cask install mactex

# Install Edit
$ brew cask install texstudio
Quick start (ubuntu)

编写 text.tex

\documentclass{ctexart}
\title{First \LaTeX Document}
\author{Jiang Xumin}

% 思源字体
\setCJKmainfont[BoldFont = Noto Sans CJK SC]{Noto Serif CJK SC}
\setCJKsansfont{Noto Sans CJK SC}
\setCJKfamilyfont{zhsong}{Noto Serif CJK SC}
\setCJKfamilyfont{zhhei}{Noto Sans CJK SC}

\begin{document}
\maketitle

你好, \LaTeX!

\CJKfamily{zhhei}  这是黑体

\CJKfamily{zhsong} 这是宋体

\end{document}
$ xelatex text.tex  # 编译 ==> pdf
$ evince text.pdf   # 查看
编辑器

$ docker pull  tiagoboldt/sharelatex-docker
$ docker run -d --restart=always -p 3000:3000 --name=sharelatex-docker  -v /srv/sharelatex-data:/data tiagoboldt/sharelatex-docker:latest

# 生成管理员用户
$ docker exec -t sharelatex-docker /bin/bash -c  'cd /sharelatex/ && grunt user:create-admin --email jiang_xmin@massclouds.com'

# 设置管理员用密码
$ google-chorme  http://localhost:3000/user/password/set?passwordResetToken=${TOKEN}


LaTeX/Source Code Listings
#!/usr/bin/env python
#coding=utf-8
#file name:  source_filename.py

improt os

def func()
    print "hello world"
\documentclass[UTF8]{ctexart}


\usepackage{listings}

\begin{document}
        \lstinputlisting[language=Python]{source_filename.py}
\end{document}
关于字体

$ git clone --depth 1  https://github.com/dolbydu/font.git adobe-fonts
$ sudo mkdir -p   /usr/share/fonts/adobe
$ sudo cp -rvf adobe-fonts/* /usr/share/fonts/adobe/

# 生成字体信息
$ sudo mkfontscale
$ sudo mkfontdir
$ sudo fc-cache -f -v

# 查看
$ fc-list :lang=zh-cn
# 思源字体 ubuntu
$ sudo apt-get install -y fonts-noto-cjk fonts-noto-cjk-extra

  • setmainfont{...}
    衬线字体,论文中西文部分默认使用的字体。这里的默认字体都会是 Times New Roman。Linux 下也有同名字体。
  • setsansfont{...}
    是西文默认无衬线字体。一般可能出现在大标题等显眼的位置。 这一部分经常碰上的字体会是 Helvetica/Arial。Linux下有Helvetica,前缀是 -adobe-helvetica-* 。这是一个古老的非抗锯齿版本(也就是不用 fontconfig 配置而使用 xfontsel),所以如今的 XWindow 环境应该不会再使用它作为屏幕字体。
  • setmonofont{...}
    是西文默认的等宽字体。一般用于排版程序代码。打印机字体。Courier 或者 Courier New 是常见的 Word 选项。Linux 下一般会有 Courier,但很少能看见 Courier New。

  • setCJKmainfont[BoldFont={...},ItalicFont={...}]{...}
    指定中文(或韩文日文)的默认字体。衬线字体, 通常情况下,大部分文档论文会要求用宋体{SimSun}排版。 Linux 下可能用文鼎宋体代替,不过效果可能较差。 另一点是和西文不同的地方,这个设置允许我们指定粗体和斜体应用何种字体代替。之所以有这个区别,是因为中文不使用粗体表示强调,也不使用斜体表示引文或书名号。我一般会指定BoldFont 和 ItalicFont 为某种黑体, Windows 环境下是SimHei,Linux下我会用文泉驿正黑避免版权问题。 有些高校的论文模板,比如就是明确要求强调段落必须使用楷体(SimKai),只能照着要求设置。
  • setCJKsansfont{...}
    无衬线字体
  • setCJKmonofont{...}
    等宽字体,打印机字体。
  • 衬线字体与无衬线字体区别
  • 如何优雅的选择默认字体(font-family)

\setCJKmainfont{隶书}
% \setCJKmainfont{[Lishu.TTF]}     % 当前目录字体 Lishu.TTF

%\setCJKfamilyfont{msyahei}{Microsoft YaHei}
\setCJKfamilyfont{msyahei}{微软雅黑}
学习文档
离线文档
# 手册
$ texdoc texdoc     # texdoc

$ texdoc ctex       # CTEX 宏集手册
$ texdoc lshort-zh  # 一份不太简短的 L A TEX 2
$ texdoc graphic    # 图片
$ texdoc longtable  # 长表格宏包
$ texdoc tabu       # 综合表格宏包
在线文档
知识点
  • 超链接
%1.1 使用的包
\usepackage[colorlinks,linkcolor=blue]{hyperref}

%1.2 插入链接的代码
\href{http://v.youku.com/}{Youku video}

Docker

Repositories
docker login --username=jiang_xmin -e sample.aliyun.com registry.aliyuncs.com  # 登录阿里云

安装与配置
安装与启动
#####################################
# 官方安装,速度慢
#####################################
curl -sSL https://get.docker.com/ | sh

#####################################
# 基于国内源,速度快
#####################################

# fedora/centos
curl -sSL https://gitee.com/my_shell/linux_install_shell/raw/master/docker/docker_centos7.sh | bash

# debian/ubuntu
curl -sSL https://gitee.com/my_shell/linux_install_shell/raw/master/docker/docker_ubuntu14.04.sh | bash
wget -qO - https://gitee.com/my_shell/linux_install_shell/raw/master/docker/docker_ubuntu14.04.sh | bash

# centos 6 安装老版本,docker
sudo yum install -y docker.io
#  启动docker server

# ubuntu
sudo service docker start

# centos
sudo systemctl enable docker
sudo systemctl start  docker
配置
sudo mkdir -p /etc/docker

# 1. 指定 镜像加速地址
#    https://docker.mirrors.ustc.edu.cn     # 中科大
#    https://hub-mirror.c.163.com           # 163
#    https://4lmb1y64.mirror.aliyuncs.com

# 2. 指定 Docker root dir
# 3. 指定 DNS

sudo tee -a /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
    "graph": "/home/docker/docker_image",
    "dns": ["114.114.114.114","8.8.8.8"],
    "insecure-registries": ["192.168.2.100:8086"]
}
EOF

# 重启
sudo systemctl daemon-reload
sudo systemctl restart docker

sudo service  docker restart   # ubuntu

# 查看
docker info
去掉sudo权限
#可以添加docker组
sudo groupadd docker

#添加用户到docker组
sudo gpasswd -a $USER docker

# docker服务重启 (CentOS7的場合)
sudo systemctl restart docker
Nvidia Docker
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list


sudo apt-get update

sudo apt-get install -y nvidia-docker2

sudo systemctl restart docker
代理
sudo mkdir -p /etc/systemd/system/docker.service.d

sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<-'EOF'
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
EOF

sudo tee /etc/systemd/system/docker.service.d/https-proxy.conf <<-'EOF'
[Service]
Environment="HTTPS_PROXY=https://proxy.example.com:443/"
EOF

# Flush changes:
systemctl daemon-reload

# Restart Docker:
systemctl restart docker

# Verify that the configuration has been loaded:
systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.example.com:80/

# Or, if you are behind an HTTPS proxy server:

systemctl show --property=Environment docker
Environment=HTTPS_PROXY=https://proxy.example.com:443/

# test
docker pull k8s.gcr.io/kube-apiserver-amd64:v1.11.0
常用镜像
常用命令

Docker Commandlind

镜像
docker images --help

docker images      # 列出本地镜像

docker commit -m "do something" -a "do something ..." {CONTAINER ID} {REPOSITORY:TAG}  # 镜像commit
docker commit -m "add start.sh" -a "add start.sh ..." e0dfc0f706ce   jxm/my_space:v3  # 镜像commit

docker rmi {REPOSITORY:TAG}  # 删除本地镜像

# 本地镜像重命名
docker tag  {ORIGIN_REPOSITORY:TAG} {NEW_NAME:TAG}
docker tag  {IMAGE_ID}              {NEW_NAME:TAG}
docker rmi  {ORIGIN_REPOSITORY:TAG}

docker image prune  # 清理none镜像
docker rmi $(docker images | grep none | awk '{print $3}' | xargs)


# 从docker hub 搜索镜像
docker search centos
容器
容器-create/run/rm
docker create --help
docker create -i -t --name=my_test  ubuntu:14.04  /bin/bash  #  创建容器

docker run --help
# 守护态运行``
docker run -d -p 3080:80 --name={CONTAINER_NAME}  {REPOSITORY:TAG}  /bin/bash -c " while true; do echo hello world; sleep 1; done"
docker run -d --restart=always -p 3080:80 --name={CONTAINER_NAME} {REPOSITORY:TAG}  /root/start.sh  #开机自启动

docker run -it --net host \
                --ipc=host  \
                -e LANG=C.UTF-8  \
                -e DISPLAY=${DISPLAY} \
                --env="QT_X11_NO_MITSHM=1" \
                -v /tmp/.X11-unix:/tmp/.X11-unix \
                -v /home/promote/Pictures:/home/Pictures -v /home/promote/Videos:/home/Videos \
                --name lidar \
                --gpus all \
                --runtime nvidia \
                --device /dev/snd \
                --privileged \
                sensor:v1.6 /bin/bash

# 启动一个容器
docker start --help
sdocker start/stop {CONTAINER_NAME}  # 启动/停止容器

docker --help
docker attach {CONTAINER_NAME}  # 进入容器

docker rm --help
docker rm  {CONTAINER_NAME}/{CONTAINER_ID}  # 删除一个容器
docker rm `sudo docker ps -a -q`            # 删除全部容器
容器-exec
docker exec  --help
docker exec -it {CONTAINER_NAME} /bin/bash
容器-root权限
docker run -d --privileged {REPOSITORY:TAG}

#  参数privileged ,container内的root拥有真正的root权限。
#  否则,container内的root只是外部的一个普通用户权限。
#  privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
#  甚至允许你在docker容器中启动docker容器。

docker run -d --cap-add SYS_NET_ADMIN {REPOSITORY:TAG}

# 让容器拥有除了MKNOD之外的所有内核权限
docker run --cap-add=ALL --cap-drop=MKNOD ...
容器-logs
# 查看日志
docker logs --help
docker logs -f       {CONTAINER ID}       # 日志
docker logs --follow {CONTAINER ID}
# 在/var/lib/docker/containers/目录下
# 找到对应的container id,然后进去,
# 执行  echo "" > ${container id}.log 即可
容器-ps
#``查询``
docker ps  --help
docker ps         # 显示UP状态的容器
docker ps  -a     # 显示所有容器
docker ps  -as    # 显示所有容器,显示容器大小
容器-导入导出
# 导出导入
docker export --help
docker export {CONTAINER ID}  > ubuntu.tar # 导出容器

cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0  # 导入容器快照

docker import --help
# 通过指定 URL 或者某个目录来导入容器
docker import http://example.com/exampleimage.tgz example/imagerepo

docker save  --help
docker save -o nextcloud.tar nextcloud  # 导出镜像
docker load -i nextcloud.tar            # 导入镜像
容器-reame
#  容器重命名
docker rename  --help
docker rename {ORIGIN_NAME}  {NEW_NAME}
docker rename {CONTAINER ID} {NEW_NAME}
容器-port
# 查看端口
docker port --help
docker port {CONTAINER ID}
docker port {CONTAINER ID}  80
容器-数据卷
# 指定数据卷
docker run -i -i --name=web -v /src/webapp:/opt/webapp  ubuntu:14.04

# 查看数据卷
docker inspect {NAMES}

# 数据卷容器
docker run -d --volumes-from={NAME/ID} --name=my_space_build  alpine/my_space_build:v1
docker-compose
pip install docker-compose==1.24.0
# docker-compose.yml
version: "3.0"
services:
  autoware:
    privileged: true
    image: autoware/autoware:latest-melodic-cuda
    container_name: ros-test
    runtime: nvidia
    user: 'root'
    working_dir: /mnt
    #restart: always
    network_mode: "host"
    #ports:
    #  - "8080:80"
    volumes:
      - /tmp/.X11-unix:/tmp/.X11-unix:rw
      - /home/promote/work/proj:/mnt
    environment:
      - DISPLAY=:1
      #- USER_ID=1000
      #- QT_X11_NO_MITSHM=1
      - QT_LOGGING_RULES="*=false"
    hostname: 'HP-Laptop'
    extra_hosts:
      - "HP-Laptop:127.0.0.1"
    entrypoint: ["/bin/bash", "-c", "while true; do echo hello world; sleep 1; done"]
Dockerfile
# This is a comment
FROM ubuntu:14.04

MAINTAINER Jiangxumin <cjaingxumin@gmail.com>

USER    root
WORKDIR /root

# ENV TEST  123

COPY install.sh ./
COPY run.sh ./

RUN ./install.sh

VOLUME ["/data1","/data2"]
EXPOSE 22
EXPOSE 80
EXPOSE 443

CMD ["/bin/bash","/root/run.sh"]

# apt-get安装,可以加上 --no-install-recommends 这个参数,不安装非必须的依赖包
# pip安装,加上pip --no-cache-dir
# yum clean all && rm -rf /var/cache/yum/* ;  for cenotos
$ docker build . -t  ${image name}
$ docker run -d --restart=always -p 8901:8080 -v $HOEM/Video:/mediadrop/data/media --name=mediadrop acaranta/mediadrop
  1. EXPOSE

    格式为 EXPOSE <port> [<port>...] 。 告诉Docker服务端容器暴露的端口

buildx
sudo apt-get install -y qemu qemu-user-static binfmt-support debootstrap

mkdir -p ~/.docker/cli-plugins/
cd ~/.docker/cli-plugins/ || exit
wget https://github.com/docker/buildx/releases/download/v0.8.2/buildx-v0.8.2.linux-amd64
mv buildx-v0.8.2.linux-amd64 docker-buildx
chmod a+x ~/.docker/cli-plugins/docker-buildx
  • Edit file /etc/docker/daemon.json, add "experimental":true
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    },
    "experimental":true,
"insecure-registries": ["192.168.2.100:8086" ]
}
sudo systemctl restart docker

docker buildx version
## http
sudo tee  $HOME/.config/buildkit/buildkitd.toml <<-'EOF'
[registry."192.168.2.100:8086"]
  http = true
EOF

## create  builder
docker buildx create --use --platform=linux/amd64,linux/arm64 \
    --name localbuilder  \
    --config $HOME/.config/buildkit/buildkitd.toml

docker buildx use localbuilder

docker exec -t buildx_buildkit_localbuilder0 cat  /etc/buildkit/buildkitd.toml

docker buildx ls              #  list builder
docker buildx rm localbuilder #  delect
docker buildx build --platform=linux/amd64,linux/arm64 -t 192.168.2.100:8086/v2x/test:v1 . --push
jetson Nano 运行 ros rviz
# step 1
docker run  --rm -it --net host \
                --ipc=host  \
                -e LANG=C.UTF-8  \
                -e DISPLAY=${DISPLAY} \
                --env="QT_X11_NO_MITSHM=1" \
                -v /tmp/.X11-unix:/tmp/.X11-unix \
                --name ros-noetic \
                --gpus all \
                --runtime nvidia \
                --privileged \
                dustynv/ros:noetic-desktop-l4t-r35.2.1 \
                /bin/bash


# step 2
xhost +

# step 3
roscore & sleep 5 ; rviz
#NVIDIA_Nona 下查看 CPU/GPU/内存使用率

sudo pip3 install jetson-stats

jtop

jetson_release
Docker私有仓库

http: server gave HTTP response to HTTPS client , 解决,添加如下:

{
   "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
   "insecure-registries": ["192.168.8.204:5000"]
}

Kubernetes

每天5分钟玩转容器技术
Docker
K8s
kubeadm token list

# get --discovery-token-ca-cert-hash
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
搭建


测试
#################
# busybox.yaml
#################
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
sudo kubectl create -f ./busybox.yaml
sudo kubectl get rc
sudo kubectl get pods
sudo kubectl describe pod mysql
FAQ

问题:

########################3
# Centos7
########################3

#sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
$ sudo kubectl apply -f ./kube-flannel.yml
unable to recognize "./kube-flannel.yml": Get http://localhost:8080/api?timeout=32s: dial tcp [::1]:8080: connect: connection refused
unable to recognize "./kube-flannel.yml": Get http://localhost:8080/api?timeout=32s: dial tcp [::1]:8080: connect: connection refused
unable to recognize "./kube-flannel.yml": Get http://localhost:8080/api?timeout=32s: dial tcp [::1]:8080: connect: connection refused
unable to recognize "./kube-flannel.yml": Get http://localhost:8080/api?timeout=32s: dial tcp [::1]:8080: connect: connection refused
unable to recognize "./kube-flannel.yml": Get http://localhost:8080/api?timeout=32s: dial tcp [::1]:8080: connect: connection refused
The connection to the server localhost:8080 was refused - did you specify the right host or port

解决: 需要开启 api server 代理端口:

# 查看端口是否代理:
$ curl localhost:8080/api

# 开启端口代理:
$ kubectl proxy --port=8080 &

Rancher

Vagrant

Vagrant 插件
#  查看 插件
$ vagrant plugin list

$ vagrant plugin install vagrant-share --plugin-clean-source --plugin-source https://gems.hashicorp.com

$ yum install libvirt-devel
$ vagrant plugin install vagrant-libvirt --plugin-clean-source --plugin-source  https://mirrors.ustc.edu.cn/rubygems/
$ vagrant plugin install vagrant-mutate --plugin-clean-source --plugin-source  https://mirrors.ustc.edu.cn/rubygems/
$ vagrant plugin install vagrant-rekey-ssh --plugin-clean-source --plugin-source  https://mirrors.ustc.edu.cn/rubygems/
Vagrant-libvirt
初始化
vagrant init centos/7
更名存储池

Vagrant会尝试使用一个名为default的存储池, 如果这个default存储池不存在就会尝试在/var/lib/libvirt/images上创建这个defualt存储池。 CentOS7默认安装libvirt环境,已经在/var/lib/libvirt/images目录上创建了名为images的存储池, 所以需要修改Vagrantfile配置文件中定义provider。

Vagrant.configure("2") do |config|
  config.vm.provider "libvirt" do |libvirt|
    libvirt.storage_pool_name = "images"
  end
end
启动

为告知Vagrant主机使用的provider是vagrant-libvirt, 而不是默认的virtualbox, 设置环境变量(这样vagrant up命令就不需要加上--provider libvirt参数)

vagrant up --provider libvirt
# or
export VAGRANT_DEFAULT_PROVIDER=libvirt ; vagrant up
Vagrant box Init
vagrant init ubuntu/trusty64
vagrant init my-box https://boxes.company.com/my.box
vagrant init my-box ../mybox_storage/my.box

# eg :
$ vagrant init  bionic-server-cloudimg-amd64     https://mirrors.shu.edu.cn/ubuntu-cloud-images/bionic/20180802/bionic-server-cloudimg-amd64-vagrant.box
$ vagrant init  CentOS-7-x86_64-Vagrant-1805_01  https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1805_01.VirtualBox.box
$ vagrant init  Fedora-Cloud-Base-Vagrant-28-1.1 http://mirrors.163.com/fedora/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-Vagrant-28-1.1.x86_64.vagrant-virtualbox.box
Vagrant box Add

Vagrant会将所下载的box,保存到 ~/.vagrant.d/boxes 目录下

$ vagrant box add --name mybox ../mybox_storage/my.box
$ vagrant box add        mybox http://someurl.com/mybox.box
$ vagrant box add --name mybox http://someurl.com/mybox.box

# eg :
$ vagrant box add --name bionic-server-cloudimg-amd64     https://mirrors.shu.edu.cn/ubuntu-cloud-images/bionic/20180802/bionic-server-cloudimg-amd64-vagrant.box
$ vagrant box add --name CentOS-7-x86_64-Vagrant-1805_01  https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1805_01.VirtualBox.box
$ vagrant box add --name Fedora-Cloud-Base-Vagrant-28-1.1 http://mirrors.163.com/fedora/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-Vagrant-28-1.1.x86_64.vagrant-virtualbox.box
Base box download
  • Ubuntu cloud

    https://mirrors.ustc.edu.cn/ubuntu-cloud-images/server/server/bionic/20180802/bionic-server-cloudimg-amd64-vagrant.box
    https://mirrors.shu.edu.cn/ubuntu-cloud-images/bionic/20180802/bionic-server-cloudimg-amd64-vagrant.box
    
  • Centos cloud

    https://mirrors.ustc.edu.cn/centos-cloud
    https://mirrors.ustc.edu.cn/centos-cloud/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-1805_01.VirtualBox.box
    
  • Fedora cloud
    http://mirrors.163.com/fedora/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-Vagrant-28-1.1.x86_64.vagrant-virtualbox.box
    https://mirrors.ustc.edu.cn/fedora/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-Vagrant-28-1.1.x86_64.vagrant-virtualbox.box
    https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-Vagrant-28-1.1.x86_64.vagrant-virtualbox.box
    https://mirrors.aliyun.com/fedora/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-Vagrant-28-1.1.x86_64.vagrant-virtualbox.box
    https://mirrors.shu.edu.cn/fedora/releases/28/Cloud/x86_64/images/Fedora-Cloud-Base-Vagrant-28-1.1.x86_64.vagrant-virtualbox.box
    
基于Virtual box 创建Vagrant box
# virtualBox 导入虚拟机
$ VBoxManage import ./UCS-Virtualbox-Demo-Image.ova --vsys 0 --eula accept
# 查看虚拟机 id
$ vboxmanage lisb vms

"UCS 4.1" {acef4c0a-35be-4640-a214-be135417f04d}
You can now package that VM as a Vagrant box:

# 基于虚拟机 id 生成 vagrant box
$ vagrant package --base acef4c0a-35be-4640-a214-be135417f04d --output UCS.box
打包 Vagrant box
# 打包成box
$ vagrant package  --output newBox.box
# 重新打包 box
$ vagrant box repackage <name>          <provider> <version>
$ vagrant box repackage ubuntu/trusty64 virtualbox 20180330.0.0
provison

provison并不会每次都执行,只有在这三种情况下provision才会运行:

# 1. 首次执行vagrant up
$  vagrant up

# 2. 执行
$ vagrant provision

# 3. 执行
$ vagrant reload --provision
Vagrant Snapshot
$ vagrant snapshot --help


$ vagrant snapshot list    "snapshot_name"
$ vagrant snapshot save    "snapshot_name"  # 创建快照
$ vagrant snapshot delete  "snapshot_name"  # 删除快照
$ vagrant snapshot pop     "snapshot_name"
$ vagrant snapshot push    "snapshot_name"
$ vagrant snapshot restore "snapshot_name"  # 从快照还原
Vagrantfile
config.vm.box = "mc_termian_test"

# The url from where the 'config.vm.box' box will be fetched if it
# doesn't already exist on the user's system.

config.vm.box_url = "../boxs/mc_termianl.box"
config.ssh.username = 'root'
config.ssh.password = 'rootroot'

# 挂在目录
config.vm.synced_folder "../data", "/vagrant_data"

config.vm.provider "virtualbox" do |vb|
  # Display the VirtualBox GUI when booting the machine
  vb.gui = true

  vb.name = "vagrent_ubuntu14"

  # Customize the amount of memory on the VM:
  vb.memory = "1024"
  vb.cpus = 4

  # enable hardware virtualization technology
  vb.customize ["modifyvm", :id, "--pae",      "on"]
  vb.customize ["modifyvm", :id, "--hwvirtex", "on"]
  vb.customize ["modifyvm", :id, "--vtxvpid",  "on"]
  vb.customize ["modifyvm", :id, "--vtxux",    "on"]

  ## Remote display (VRDP support)
  # vb.customize ["modifyvm", :id, "--vrde", "on"]
  # vb.customize ["modifyvm", :id, "--vrdeport", "3940"] # change here to a free port,fefault :3389

end

# 网络
# config.vm.network "public_network", ip: "192.168.2.176" , bridge: "en0"
set proxy
# Install proxyconf:
$ vagrant plugin install vagrant-proxyconf
#Configure your Vagrantfile:
config.proxy.http     = "http://yourproxy:8080"
config.proxy.https    = "http://yourproxy:8080"
config.proxy.no_proxy = "localhost,127.0.0.1"
about mc_termianl
# Install VirtualBox Guest Additions
wget -O /etc/apt/sources.list  http://mirrors.163.com/.help/sources.list.trusty
apt-get install -y gcc make perl
apt-get clean
mount /dev/cdrom /media/cdrom
cd /media/cdrom
./VBoxLinuxAdditions.run

Virtualbox

Install Virtualbox


  • Install oracle virtualbox on ubuntu

    sudo apt-add-repository "deb http://download.virtualbox.org/virtualbox/debian $(lsb_release -sc) contrib"
    wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
    sudo apt-get update
    sudo apt-get install virtualbox-5.x dkms
    
    # load kernel model
    sudo /sbin/vboxconfig
    
  • Install oracle virtualbox on centos

    curl -o /etc/yum.repos.d/virtualbox.repo  http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
    yum makecache
    sudo yum --enablerepo=epel install -y dkms
    sudo yum install -y virtualbox-5.x
    
    # load kernel model
    sudo /sbin/vboxconfig
    
Install Extension_Pack
VBoxManage extpack install ~/Oracle_VM_VirtualBox_Extension_Pack-5.2.16.vbox-extpack




Virtualbox enable hardware virtualization technology
$ vboxmanage list vms
"bionic-server-cloudimg-amd64" {39f472bf-1d9c-4e6a-a11f-fbfccb2f3171}

# 修改
$ vboxmanage  modifyvm  bionic-server-cloudimg-amd64 --hwvirtex on
$ vboxmanage  modifyvm  bionic-server-cloudimg-amd64 --hwvirtex on
# 查看
$ vboxmanage showvminfo bionic-server-cloudimg-amd64 |grep -i hardw
VirtualBox修改现有虚拟磁盘大小
Remote display (VRDP support)
VBoxManage modifyvm "VM name" --vrde on
Virtual networking
# The Network Address Translation (NAT) service works in a similar way to a home router, grouping the systems using it into a network and preventing systems outside of this network from directly accessing systems inside it, but letting systems inside communicate with each other and with systems outside using TCP and UDP over IPv4 and IPv6.

# A NAT service is attached to an internal network. Virtual machines which are to make use of it should be attached to that internal network. The name of internal network is chosen when the NAT service is created and the internal network will be created if it does not already exist. An example command to create a NAT network is:

VBoxManage natnetwork add --netname natnet1 --network "192.168.15.0/24" --enable

# Here, "natnet1" is the name of the internal network to be used and "192.168.15.0/24" is the network address and mask of the NAT service interface. By default in this static configuration the gateway will be assigned the address 192.168.15.1 (the address following the interface address), though this is subject to change. To attach a DHCP server to the internal network, we modify the example as follows:

VBoxManage natnetwork add --netname natnet1 --network "192.168.15.0/24" --enable --dhcp on

# or to add a DHCP server to the network after creation:

VBoxManage natnetwork modify --netname natnet1 --dhcp on

# To disable it again, use:

VBoxManage natnetwork modify --netname natnet1 --dhcp off

# DHCP server provides list of registered nameservers, but doesn't map servers from 127/8 network.

To start the NAT service, use the following command:

VBoxManage natnetwork start --netname natnet1
# If the network has a DHCP server attached then it will start together with the NAT network service.

VBoxManage natnetwork stop --netname natnet1
# stops the NAT network service, together with DHCP server if any.

# To delete the NAT network service use:

VBoxManage natnetwork remove --netname natnet1
# This command does not remove the DHCP server if one is enabled on the internal network.

# Port-forwarding is supported (using the --port-forward-4 switch for IPv4 and --port-forward-6 for IPv6):

VBoxManage natnetwork modify --netname natnet1 --port-forward-4 "ssh:tcp:[]:1022:[192.168.15.5]:22"
# This adds a port-forwarding rule from the host's TCP 1022 port to the port 22 on the guest with IP address 192.168.15.5. Host port, guest port and guest IP are mandatory. To delete the rule, use:

VBoxManage natnetwork modify --netname natnet1 --port-forward-4 delete ssh
# It's possible to bind NAT service to specified interface:

VBoxManage setextradata global "NAT/win-nat-test-0/SourceIp4" 192.168.1.185
# To see the list of registered NAT networks, use:

VBoxManage list natnetworks
创建虚拟机
# https://blog.csdn.net/anyjack/article/details/54861226
URL="http://192.168.8.25/jxm/mc_client_iso/MCCR-student-offline-4.2.1_201808122301.iso"
ISO_NAME=`basename $URL`

VM_NAME="redhat67v0"

curl -o $ISO_NAME $URL
mkdir virtualbox
VBoxManage createhd --filename virtualbox/${VM_NAME} --size 51240

#ls -lrt ./virtualbox/
VBoxManage createvm --name ${VM_NAME} --register
VBoxManage modifyvm ${VM_NAME} --ostype linux
VBoxManage modifyvm ${VM_NAME} --memory 4096  # MB

VBoxManage storagectl ${VM_NAME} --name IDE --add ide --controller PIIX4 --bootable off
VBoxManage storagectl ${VM_NAME} --name SATA --add sata --controller IntelAhci --bootable on

VBoxManage storageattach ${VM_NAME} --storagectl IDE --port 0 --device 0 --type dvddrive --medium  $ISO_NAME
VBoxManage storageattach ${VM_NAME} --storagectl SATA --port 0 --device 0 --type hdd --medium virtualbox/${VM_NAME}.vdi

VBoxManage modifyvm ${VM_NAME} --nic1 nat --nictype1 82540EM --cableconnected1 on

vboxmanage modifyvm ${VM_NAME} --vrde on
vboxmanage modifyvm ${VM_NAME} --vrdeport 3400

vboxmanage startvm ${VM_NAME} --type=headless

## 查看正在运行的vbox系统,关机。
#vboxmanage list runningvms
#vboxmanage controlvm ${VM_NAME} poweroff
#VBoxManage showvminfo ${VM_NAME} |grep -i sata

## 仅注销虚拟机
# VBoxManage unregistervm ${VM_NAME}

## 删除虚拟机(!!!会删除所有虚拟硬盘,谨慎操作!!!)
# VBoxManage unregistervm --delete ${VM_NAME}

DataBase

Mysql
$ sudo docker pull mariadb

$ docker run --name some-mysql   -p 3306:3306 -e MYSQL_ROOT_PASSWORD=rootroot -d mysql:latest
$ docker run --name some-mariadb -p 8306:3306 -e MYSQL_ROOT_PASSWORD=rootroot -d mariadb:latest

# For Sysvinit Systems
$ sudo  service mysql start|stop|restart|reload|status
# or
$ sudo  /etc/init.d/mysql start|stop|restart|reload|status

# For Systemd Systems #
$ sudo systemctl start|stop|restart|reload|status  mariadb.service
# or
$ sudo systemctl start|stop|restart|reload|status  mysql.service
# or
$ sudo systemctl start|stop|restart|reload|status  mariadb
# or
$ sudo systemctl start|stop|restart|reload|status  mysql

select 查询,中文显示乱码

set names utf8;
set names gbk;

MySQL 5.1参考手册 MySQL 教程

登陆
$ mysql -h localhost -u root -p

$ mysql -h localhost -u root -p -P 8306  # 指定端口号
数据库操作
#  创建数据库
mysqladmin -u root -p create 数据库名;
Enter password:******
/* 创建数据库 */
CREATE DATABASE db_name;

SHOW DATABASES;  -- 查看数据库
USE  db_name;    --  选中数据库
SHOW TABLES;     -- 查看数据库中的表
DROP DATABASE db_name;   -- 删除数据库
[root@host]# mysqladmin -u root -p drop 数据库名;
Enter password:******
数据表操作
/* 创建表 */

-- CREATE TABLE 表名(字段名1 字段类型,....字段名n 字段类型n);
CREATE TABLE table_name(column_1 data_type_1,....column_n data_type_n);

CREATE TABLE emp(
        ename    VARCHAR(10),
        hiredate DATE,
        sal      FLOAT(10,2),
        deptno   INT(2)
    );



USE account;
CREATE TABLE book2(
        id INT  NOT NULL  AUTO_INCREMENT,
        uname   VARCHAR(30),
        email   VARCHAR(100),
        passwd  VARCHAR(30),
        PRIMARY KEY ( id )
        );
$ mysql -u root -p  -D account < create_table.sql ;
USE ACCOUNT;
SOURCE ./create_table.sql
-- .\  ./create_table.sql
DESC table_name;   -- 查看表结构


/* 查看表的创建语句 */
-- SHOW CREATE TABLE table_name \G;
SHOW CREATE TABLE table_name;


DROP TABLE table_name;  -- 删除表
指定表引擎和字符集

在创建表最后,我们常用MyISAM或者InnoDB引擎。在指定引擎时,我们可以使用:

ENGINE=InnoDB

指定表默认字符集:

/*指定表默认字符集*/
DEFAULT CHARSET=utf8

CREATE TABLE emp (
    useraname varchar(10) DEFAULT NULL,
    password date DEFAULT NULL,
  )ENGINE=InnoDB DEFAULT CHARSET=utf8;
表结构 导入/导出
# 导入
mysqldump -uroot -prootroot databasefoo table1 table2 > foo.sql
mysqldump -uroot -prootroot sva_rec date_drv         > foo.sql
# 导出
mysql -uroot databasefoo < foo.sql
# 导出整个数据库
# mysqldump -u用户名 -p密码  数据库名 > 导出的文件名
mysqldump -uroot -prootroot  db_name  > ./db_name.sql

#导出一个表,包括表结构和数据
# mysqldump -u用户名 -p 密码  数据库名 表名> 导出的文件名
mysqldump -uroot -prootroot db_name db_name> ./db_name.sql


#导出一个数据库结构
mysqldump -uroot -prootroot -d db_name > ./db_name.sql

# 导出一个表,只有表结构
# mysqldump -u用户名 -p 密码 -d数据库名  表名> 导出的文件名
mysqldump -uroot -prootroot -d db_name db_name> ./db_name.sql
/*导入数据库 source*/
SOURCE ./wcnc_db.sql

/*删除一条记录*/
DELETE FROM table_name WHERE id=2;
数据库从另外一台导入
$ sudo systemctl stop  mariadb.service
# 替换 /val/lib/mysql 目录
$ sudo cp -r /val/lib/mysql  /val/lib/mysql.bak
$ sudo cp -r new_mysql  /val/lib/mysql
$ sudo chown -R mysql:mysql /val/lib/mysql
服务器数据库损坏修复
1. 关闭使用数据库的服务
systemctl stop mccenter
systemctl stop zabbix-server
2.用恢复模式启动数据库

编辑数据库配置文件 /etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

# Settings user and group are ignored when systemd is used.

# If you need to run mysqld under a different user or group,

# customize your systemd unit file for mariadb according to the

# instructions in http://fedoraproject.org/wiki/Systemd

# innodb_force_recovery = 2

# innodb_purge_threads = 0

max_allowed_packet = 500M

wait_timeout = 600

[mysqld_safe]

log-error=/var/log/mariadb/mariadb.log

pid-file=/var/run/mariadb/mariadb.pid

#

# include all files from the config directory

#

!includedir /etc/my.cnf.d
  • 在[mysqld]下添加 innodb_force_recovery = 2 ,其中等号右侧的数值应该从1到6逐个测试。
  • 在[mysqld]下添加 innodb_purge_threads = 0
  • 在[mysqld]下添加 max_allowed_packet = 500M
  • 在[mysqld]下添加 wait_timeout = 600
#重启数据库服务
systemctl restart mariadb

如果长时间没有完成,则用 ctrl + c 停止命令执行。继续修改配置文件,增大 innodb_force_recovery 的值。 然后重启数据库服务。

如果重启数据库命令执行完成,用 systemctl status mariadb ,命令查看数据库服务是否已经启动。 如果没有,继续修改配置文件,增大 innodb_force_recovery 的值。然后重启数据库服务。 重复前面的步骤,直到数据库成功启动。

3.备份数据库
mysqldump -uroot --all-databases  > all_mysql_backup.sql
4.清空数据库
systemctl  stop  mariadb  #关闭数据库服务
cp -r  /var/lib/mysql/ /var/lib/mysql.bak # 备份数据库
rm -rf /var/lib/mysql/* #删除数据库
5.正常启动数据库
# 修改配置文件: 注释掉修改的配置项
# vi /etc/my.cnf
sed -i 's/^innodb_force_recovery =.*$/# innodb_force_recovery = 2/' /etc/my.cnf
sed -i 's/^innodb_purge_threads =.*$/# innodb_purge_threads = 0/'   /etc/my.cnf

systemctl restart mariadb #重启数据库
6.恢复数据库数据
mysql -uroot -e "source /root/all_mysql_backup.sql"
7.修改数据库用户权限
mysql -uroot #登录数据库shell。
/*修改数据库用户权限*/
update user set host = '%'  where user ='root';
flush privileges;
quit;
mysql -uroot #登录数据库shell。
/*创建zabbix用户*/
create user 'zabbix'@'%'identified by 'zabbix';

/*给zabbix用户数据库zabbix的操作权限:*/
grant all on zabbix.* to'zabbix'@'%';
flush privileges;
quit;
8.启动停掉的服务
systemctl start mccenter
systemctl start zabbix-server
sqlite

https://www.sitepoint.com/getting-started-sqlite3-basic-commands/

$ sqlite3 < test.sql
$ sqlite3 dbasename.db
sqlite> .open dbasename.db
PostgreSQL
Book
Oracle
Install
server
  • downlaod server

  • docker

       #修改/etc/selinux/config文件,设置为disable
       sed 's/SELINUX=.*$/^SELINUX=disable/g'  /etc/selinux/config
    
       docker pull wnameless/oracle-xe-11g
    
       docker run -d -p 49160:22 -p 49161:1521 wnameless/oracle-xe-11g
       #49160是ssh访问端口,初始密码admin
       #49161是数据库访问端口
    
    .. code::
    
         hostname: localhost
         port: 49161
         sid: xe
         username: system/sys
         password: oracle
    
  • 静默安装(待验证) * Centos7安装Oracle 11gR2 * CentOS 7静默(无图形化界面)安装Oracle 11g

Client
dpkg -i  oracle-instantclient-basic*.rpm
dpkg -i  oracle-instantclient-sqlplus*.rpm
dpkg -i  oracle-instantclient-devel*.rpm

export  ORACLE_HOME=/usr/lib/oracle/11.2/client64
export  TNS_ADMIN=$ORACLE_HOME/network/admin
export  NLS_LANG='simplified chinese_china'.ZHS16GBK
export  LD_LIBRARY_PATH=$ORACLE_HOME/lib
export  PATH=$ORACLE_HOME/bin:$PATH

# connect
sqlplus64 system/oracle@//192.168.8.204:49161/xe

select name from v$database;

cat test.sql
SELECT table_name FROM user_tables;
exit;

sqlplus64 system/oracle@//192.168.8.204:49161/xe @/root/test.sql

Linux

split分割文件

http://blog.csdn.net/whu_zhangmin/article/details/45870077

$ split -b 4000M -d -a 1 cm-11.tar.gz cm-11.tar.gz.

# 使用split命令,-b 4000M 表示设置每个分割包的大小,单位还是可以k
#  -d "参数指定生成的分割包后缀为数字的形式
# -a x来设定序列的长度(默认值是2),这里设定序列的长度为1

# 执行命令后,生成压缩包如下:
-rw-r--r--  1 root     root      4194304000 May 20 14:00 cm-11.tar.gz.0
-rw-r--r--  1 root     root      4194304000 May 20 14:02 cm-11.tar.gz.1
-rw-r--r--  1 root     root      4194304000 May 20 14:03 cm-11.tar.gz.2
-rw-r--r--  1 root     root      4194304000 May 20 14:05 cm-11.tar.gz.3
-rw-r--r--  1 root     root      4194304000 May 20 14:06 cm-11.tar.gz.4
-rw-r--r--  1 root     root      4194304000 May 20 14:08 cm-11.tar.gz.5
-rw-r--r--  1 root     root      4194304000 May 20 14:09 cm-11.tar.gz.6
-rw-r--r--  1 root     root      2256379886 May 20 14:10 cm-11.tar.gz.7

# 合并文件
$ cat cm-11.tar.gz.* | tar -zxv
7zip
$ 7za a -t7z w7_64_5200u_comp.qcow2.7z w7_64_5200u_comp.qcow2 -mx9
tar 打包
$ tar czvf test.tar.gz *         # 压缩当前文件夹下非隐藏文件的文件
$ tar czvf ../abc.tgz  .[!.]* *  # 压缩当前文件夹下所有文件,排除两个隐藏文件夹"."和“..”

$ tar -tf  name.tgz  # 查看压缩包内容
nohub
nohup /root/runoob.sh > /dev/null 2>&1 &
nohup /root/runoob.sh > runoob.log 2>&1 &
常见问题
# 1. umount.nfs: /mnt: device is busy
$ fuser -vm /mnt  #  查看挂载点,被那些进程占用
磁盘坏道
$ badblocks -b 4096 -c 16 /dev/hda1 -o hda-badblocks-list
$ badblocks -s -v /dev/sda
  • nettop
网络配置
配置Mac 地址
/etc/init.d/networking stop
ifconfig eth0 hw ether 02:01:02:03:04:08
/etc/init.d/networking start

/etc/init.d/network stop
ip link set eth0 address 02:01:02:03:04:08
/etc/init.d/network start
Bringing interfaces up/down
# ip
$ sudo  ip link set dev <interface> up
$ sudo  ip l    s   dev <interface> down

# ifconfig
$ sudo  /sbin/ifconfig <interface> up
$ sudo  /sbin/ifconfig <interface> down
ip 命令使用
ip addr add 192.168.2.1/24 dev enp0s25 #添加IP地址
ip addr del 192.168.2.1/24 dev enp0s25 #删除IP地址

ip link set enp0s25 up/down

sudo ip route show
sudo ip route add default via 192.168.2.1 # 添加默认路由
sudo ip route del default via 192.168.2.1 #

# 修改Mac 地址
sudo ip link set dev wlp0s20f3 down
sudo ip link set dev wlp0s20f3 address 00:01:4f:00:15:f1
sudo ip link set dev wlp0s20f3 up
CentOS 网络
TYPE=Ethernet
DEVICE=enp2s0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.8.25
NETMASK=255.255.255.0
GATEWAY=192.168.8.254
DNS1=114.114.114.114
DNS2=180.76.76.76
ubuntu 网络
auto lo
iface lo inet loopback

auto enp1s0
iface enp1s0 inet manual

auto br0
iface br0 inet dhcp

bridge_ports enp1s0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
bridge_maxage 12
# /etc/network/interfaces 添加
auto enp0s25
iface enp0s25 inet static
address 192.168.0.88
netmask 255.255.255.0
gateway 192.168.0.1
sudo apt-get install resolvconf

# interfaces 方式修改 DNS,  在 /etc/network/interfaces 添加
dns-nameserver xx.xx.xx.xx  # 单个 重启电脑生效
dns-nameserver xxx.xxx.xx.xx
dns-nameservers xxx.xxx.xxx.xxx xxx.xxx.xx.xxx  # 多个 重启电脑生效
# resolvconf 方式修改 dns
#    /etc/resolv.conf                     # 临时
#    /etc/resolvconf/resolv.conf.d/head   # sudo resolvconf -u  更新

nameserver xxx.xxx.xx.xxx
nameserver xx.xx.xx.xx
无线网卡
sudo apt-get install lshw
sudo apt-get install wireless-tools wpasupplicant

#Ubuntu Server默认的情况下不会启用无线网卡,需要手动来启用无线网卡。
sudo lshw -numeric -class network
sudo ifconfig -a

#检查是哪一个接口来支持无线连接
sudo iwconfig
#启动无线网卡WLAN0
sudo ip link set wlan0 up
# 查看 SSID
sudo iwlist wlan0 scanning | egrep 'Cell |Encryption|Quality|Last beacon|ESSID'

#生成无线路由密钥。这一步就是根据你无线网络的SSID和密码,来生成WLAN需要的配置文件
wpa_passphrase ESSID password > /etc/wpa_config.conf
# or
wpa_passphrase SSID  password > /etc/wpa_config.conf

# 设置无线网络。
# 编辑/etc/network/interfaces文件,将wlan添加到其中:
tee -a /etc/network/interfaces <<-'EOF'
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_config.conf
EOF

# 重新启动计算机。根据我实际的操作结果来看,配置好了之后虽然说无线网卡被启用了,但是驱动貌似没加载全。
# 因此需要重启Ubuntu Server以便完整启用无线网卡。
防火墙
  • Iptables与Firewalld防火墙

  • Centos防火墙设置与端口开放的方法

    systemctl start/stop firewalld      # 启动/禁用防火墙
    systemctl enable/disable firewalld  # 设置开机自动启动/禁用开机自启动
    
    firewall-cmd --reload               # 重启防火墙
    
    # 查看防火墙状态
    systemctl status firewalld
    firewall-cmd --state
    
    firewall-cmd --version  # 版本
    
    firewall-cmd --get-active-zones           # 查看区域信息
    firewall-cmd --get-zone-of-interface=eth0 # 查看指定接口所属区域信息
    
    # 将接口添加到区域(默认接口都在public)
    firewall-cmd --zone=public --add-interface=eth0 # (永久生效再加上 --permanent 然后reload防火墙)
    
    # 设置默认接口区域
    firewall-cmd --set-default-zone=public(立即生效,无需重启)
    
    firewall-cmd --reload          # 或
    firewall-cmd --complete-reload # (两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,
                                   #  第二个需要断开连接,类似重启服务)
    
    
    # 查看指定区域所有打开的端口
    firewall-cmd --zone=public --list-ports
    
    # 在指定区域打开端口(记得重启防火墙)
    firewall-cmd --zone=public --add-port=80/tcp             # 临时,重启失效
    firewall-cmd --zone=public --add-port=80/tcp --permanent # 永久生效再加上
    
    firewall-cmd --panic-on    # 拒绝所有包
    firewall-cmd --panic-off   # 取消拒绝状态
    firewall-cmd --query-panic # 查看是否拒绝
    
    
    # 说明:
    #   –zone              作用域
    #   –add-port=8080/tcp 添加端口,格式为:端口/通讯协议
    #   –permanent         永久生效,没有此参数重启后失效
    
8. 定时任务
$ export EDITOR=vim
$ crontab -e

$ service cron status/start/stop/restart
$ systemcltl  restart crond
# 每天 23 点 1 分 执行
# m h  dom mon dow   command
1 23 * * *  /root/workspace_for_docker/mk_mcstudent_iso.sh
https://images2015.cnblogs.com/blog/1173412/201706/1173412-20170627141421461-845471341.png
流量监控
iftop
$ brew install iftop # mac
$ export PATH=$PATH:/usr/local/sbin
nethogs
$ brew install nethogs # mac
$ export PATH=$PATH:/usr/local/sbin
nload
$ apt-get install nload
查看硬件温度
$ sudo apt-get install lm-sensors
$ sudo yum     install lm_sensors

#  CPU  温度
$ sensors-detect
$ sensors

#  硬盘温度
$ sudo apt-get install hddtemp
$ sudo hddtemp /dev/sda1

#  cpu 使用
$ sudo apt-get install sysstat
$ mpstat
$ vmstat

$ watch -d -n 1 'echo free;mpstat;echo;free -m;echo temp; sudo hddtemp /dev/sd? ;echo; sensors'
网络唤醒
sudo apt-get install  -y etherwake

wakeonlan    E4:3A:6E:06:39:0A
# or
sudo etherwake -i eth0  E4:3A:6E:06:39:0A
Linux 快速原型工具 Pencil
Ubuntu制作apt源
  • nginx
apt install nginx
  • nginx辑配置文件
server {
 error_log /var/log/nginx/apt_server.log info;
 listen  8080;
 #server_name www.example.com;
 root /var/www/apt_server;
 autoindex on;

 location / {
  #index index.html index.htm;
 }
}
nginx -t reload  #重载配置
  • 初始化仓库目录
mkdir -p /var/www/apt_server
cd /var/www/apt_server
mkdir -p dists/zesty/main/binary-amd64
mkdir -p dists/zesty/main/binary-i386
mkdir -p dists/zesty/main/binary-arm64
ln -s /var/cache/apt/archives /var/www/apt_server/packages


sudo apt-get install dpkg-dev
  • 建立包列表及依赖信息文件
cd /var/www/apt_server/
dpkg-scanpackages packages /dev/null | gzip > dists/zesty/main/binary-amd64/Packages.gz
dpkg-scanpackages packages /dev/null | gzip > dists/zesty/main/binary-i386/Packages.gz
dpkg-scanpackages packages /dev/null | gzip > dists/zesty/main/binary-arm64/Packages.gz

  • 加入源地址 /etc/apt/sources.list
deb http://{IP}:8080 zesty main
deb [arch=amd64] http://{IP}:8080 zesty main
deb [arch=i386] http://{IP}:8080 zesty main
deb [arch=arm64] http://{IP}:8080 zesty main
sudo apt-get update --allow-insecure-repositories

sudo apt-get install vim --allow-unauthenticated

    # 注意事项:需要加上这个 --allow-unauthenticated选项。
    #           本地的源是没有签名的,直接更新ubuntu下的apt会提示找不到release文件,
    #           是一种不安全的源,默认是被禁用的。
  • 递归下载所需deb包及依赖包
#edit your package list.
PACKAGES="wget
          tcpdump
          unzip"

# get dep recurse
DEPS=$(apt-cache depends --recurse --no-recommends --no-suggests \
          --no-conflicts --no-breaks --no-replaces --no-enhances \
          --no-pre-depends ${PACKAGES} | grep "^\w" )

echo $DEPS

# download all deps
cd /var/www/ubuntu/packages/
apt-get download $DEPS
  • apt-mirror 待研究
gdialog
#!/bin/bash

#test the gDialog
height=24
width=80
text="text"
filename="/home/ocean/.bashrc"

gdialog --title "testbox" --textbox "$filename" $(($height*4)) $width
gdialog --title "checklist" --checklist "$text" $height $width   2   "1" "aaaa" "on"  "2" "bbbb" "on" # list_height [tag text status]
gdialog --title "infobox" --infobox "$text =========" $height $width
gdialog --title "inputbox" --inputbox  "$text" $height $width "initial string"
gdialog --title "menu" --menu "$text" $height $width 2 "1" "aaaa" "2" "bbbb"    #menu_height [tag item]
gdialog --title "msgbox" --msgbox "$text========" $height $width
gdialog --title "radiolist" --radiolist "$text" $height $width 2 "1" "aaaa" "on" "2" "bbbb" "off"
gdialog --title "yesno" --yesno "$text" $height $widch
硬盘分区格式化与挂载
  • 添加磁盘分区
root@localhost:~# fdisk /dev/vdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x7de2444b.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-146800639, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-146800639, default 146800639):
Using default value 146800639

Command (m for help): w
The partition table has been altered!
# 格式化
mkfs -t ext4 -c /dev/vdb1
mkfs.ext4 -c /dev/vdb1
# /etc/fstabe
# sudo  blkid  查看 磁盘UUID
UUID=fd05da95-d9f5-4a3e-8cf3-41c9dff1f5b8  /home    ext4  defaults   0  0
# or
/dev/vdb1  /home    ext4  defaults   0  0
# lvm 减少逻辑卷的空间,释放给其他逻辑卷使用

###############################
# 1. 减少逻辑卷ssd-cdata的空间
###############################
umount /dev/mapper/ssd-cdata           # 卸载 ssd-cdata

e2fsck -f /dev/mapper/ssd-cdata        # 检车逻辑卷上 剩余空间

resize2fs /dev/mapper/ssd-cdata 10G    # 将文件系统减少到 10G

lvreduce -L 10G /dev/mapper/ssd-cdata  # 将逻辑卷减少到 10G

mount /dev/mapper/ssd-cdata /cdata     # 挂载重新使用


###############################
#  2. 增加逻辑卷ssd-data的空间
###############################

pvscan           # 查看剩余,未分配空间

lvextend -L +13.90G  /dev/mapper/ssd-data   # 逻辑卷增加10G

lvs               # 查看

# 同步文件系统
resize2fs  /dev/mapper/ssd-data   # resize2fs命令,针对的是ext2、ext3、ext4文件系统
xfs_growfs /dev/mapper/ssd-data  # xfs_growfs命令,针对的是xfs文件系统


###############################
#  扩容
###############################

# 1 建立新的分区
fdisk  -l /dev/vda
partprobe

# 2 新建新的pv
pvcreate /dev/vda3
pvdisplay
pvscan

# 3 # 放大 VG
# vgcreate -s 16M centos /dev/vda3
vgextend centos /dev/vda3
vgdisplay

# 4  增加 LV
lvextend -L +50G /dev/mapper/centos-root
lvdisplay

# 5 完整的将lv 容量,扩充到整个文件系统
# resize2fs /dev/mapper/centos-root
xfs_growfs /dev/mapper/centos-root
df -hT
#
curl http://ip-api.com/json/

# 获取 public ip
$ curl icanhazip.com
$ curl ipecho.net/plain; echo
$ curl ifconfig.me
$ curl  -s freegeoip.net/xml/ | grep "<IP>" | sed 's/<\/.*$//g' | sed 's/^.*>//g'

# get <CountryCode>
$ curl  -s freegeoip.net/json/ | sed "s/^.*country_code\":\"//g" | sed 's/\".*$//g'
$ curl  -s freegeoip.net/xml/ | grep "<CountryCode>" | sed 's/<\/.*$//g' | sed 's/^.*>//g'

#
$ curl freegeoip.net/json/github.com
$ curl freegeoip.net/json/baidu.com
$ curl ipinfo.io/8.8.8.8
$ curl ipinfo.io/8.8.8.8/country

# https://github.com/fiorix/freegeoip
# https://ipstack.com/
Ubuntu 修改 启动时间等待
# Ubuntu14.04 , Ubuntu18.04

sed -i 's/^.*GRUB_TIMEOUT=.*$/GRUB_TIMEOUT=0/' /etc/default/grub
sed -i 's/timeout=10/timeout=0/' /etc/grub.d/30_os-prober
update-grub
禁止ubuntu 更新内核
检查端口通不通
查看端口占用
$ sudo netstat -anp | grep ":80\ "
检查端口通不通
  1. python 检查端口通不通

    #!/usr/bin/env python
    #coding=utf8
    
    ip = '192.168.5.204'
    port  = 5900
    
    import socket
    
    sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
    sk.settimeout(1)
    
    try:
        sk.connect((ip,port))
        print 'Server %s:%s  OK!' % (ip,port)
    except Exception:
        print 'Server %s:%s not connect!' % (ip,port)
    sk.close()
    
  2. nc命令检查端口通不通

    $ nc  -vz 192.168.5.204 5904
    
  3. telnet 命令检查端口通不通

    $ telnet 192.168.5.204 5900
    
  4. 查看当前使用的端口

    $ netstat -anlp | grep -w LISTEN
    $ netstat -aunp      # udp
    
Systemd
# Ubuntu 目录为 /lib/systemd/system/
# Centos 目录为 /usr/lib/systemd/system/

systemctl cat sshd.service

# 修改后,reload
systemctl daemon-reload

systemctl reload *.service #重新加载服务配置文件 ?????????????????

systemctl enable  massclouds-core
systemctl disable massclouds-core

systemctl start   massclouds-core
systemctl stop    massclouds-core
systemctl restart massclouds-core

# list enabled ...
systemctl list-unit-files | grep enabled

# 查看日志
journalctl -f -u massclouds-core
example
[Unit]
Description=xinit
#After=systemd-user-sessions.service
[Service]
#Environment=DISPLAY=:0.0
Type=simple
ExecStart=/usr/bin/startx  /usr/bin/openbox
StandardOutput=syslog
#KillMode=process
[Install]
WantedBy=multi-user.target
#WantedBy=graphical.target
[Unit]
Description=massclouds-core
[Service]
Type=simple
ExecStart=/opt/massclouds_core/bin/massclouds
KillMode=process
[Install]
WantedBy=multi-user.target
#WantedBy=graphical.target  # 图形用户

[Unit]
Description : 服务的简单描述
Documentation : 服务文档
Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
Requires:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。
Wants:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。
[Service]
Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
PIDFile:pid文件路径
ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecReload:指定单元停止时执行的命令或者脚本。
ExecStop:指定单元停止时执行的命令或者脚本。
PrivateTmp:True表示给服务分配独立的临时空间
Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。
StandardOutput=console代表打印输出到系统日志文件,StandardOutput=tty代表打印输出到串口
[Install]
Alias:为单元提供一个空间分离的附加名字。
RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
Also:指出和单元一起安装或者被协助的单元。
DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。

UNIX

  • AIX 查看系统位数
getconf HARDWARE_BITMODE  # 查看系统位数


# 要确定您安装的 AIX 的级别,请运行以下命令:
oslevel
# 或
uname -vr


oslevel -r # 要确定发行版的维护包,请运行以下命令:


lslpp -L    # 要确定特定的 LPP 或文件集的级别


lslpp -L | pg # 要确定所有 LPP 或文件集的级别


# 要显示有关您系统上的硬件信息,请运行以下命令:
lscfg -vp | pg
prtconf|pg   # 可以较全的列出系统及硬件信息

Shell

Bash
更改用户名
#To change username (it is probably best to do this without being logged in):
sudo usermod -l newUsername oldUsername
# This however, doesn't rename the home folder.

# To change home-folder, use
sudo usermod -d /home/newHomeDir -m newUsername
更改tilix
sudo update-alternatives --config x-terminal-emulator

#  选择 tilix.wrapper  对应的 标号,  更改 默认 启动
修改文件名 rename
sudo apt-get instal rename

rename -n 's/Screenshotfrom302.mp4/p/' *.png   # 列出需要重命名的文件,只显示,不执行修改
rename -v 's/Screenshotfrom302.mp4/p/' *.png   # 执行修改,列出已重命名的文件

rename 'y/A-Z/a-z/' *  # 文件名 大写改小写
rename 's/[ ]+//g'  *  # 去除文件名的空格
rename 's/^/myend/' *  # 文件头加入字符串 myend
rename 's/$/myend/' *  # 文件尾加入字符串 myend
判断安装包,有没有安装
  • Ubuntu
#!/bin/bash

dpkg -s $1 &> /dev/null

if [ $? -eq 0 ]; then
    echo "Package  is installed!"
else
    echo "Package  is NOT installed!"
fi

# OR
dpkg -l | grep -qw package || apt-get install package
if ! rpm -qa | grep -qw vim; then
    yum install vim
fi

# or
rpm -qa | grep -qw glibc-static || yum install vim
sftp文件批量上传与下载
#!/bin/bash
# apt-get install lftp

# 上传文件

#SFTP配置信息

USER=jxm  #用户名
PASSWORD=123456  #密码

SRCDIR=/home/jxm/Documents  #待上传文件根目录
DESDIR=/tmp                 #FTP目录

IP=127.0.0.1
PORT=22

# 修改 IFS
OIFS=$IFS
IFS=$(echo -en "\n\b")

#获取文件
cd ${SRCDIR}
#FILES=`ls`  #目录下的所有文件
#FILES=`find ${SRCDIR} -mmin -50 -name '*.mp4'` #修改时间在执行时间五分钟之前的文件
FILES=`find ${SRCDIR} -name '*.pdf'`

for FILE in ${FILES}
do
    echo ${FILE}
#发送文件 (关键部分)
lftp -u ${USER},${PASSWORD} sftp://${IP}:${PORT} <<EOF
set sftp:auto-confirm yes
cd ${DESDIR}/
lcd ${SRCDIR}
put '${FILE}'
by
EOF
done
IFS=$OIFS    # 恢复IFS
#!/bin/bash

# 下载文件

USER=root
PASSWORD=5EYS40T04BMF  # 密码

SRCDIR=/u02/dab        # 下载文件目录
DESDIR=/u01/sftpFiles  # FTP目录(待下载文件目录)

IP=192.168.1.10
PORT=22

lftp -u ${USER},${PASSWORD} sftp://${IP}:${PORT}<<EOF
cd ${DESDIR}
lcd ${SRCDIR}
get text.xml  #需要下载的文件为text.xml
by
EOF
Shell 统计代码行数
# 文件名 空格问题 ???
find . -type f  -name "*.c*" -or -name "*.h**"  -or -name "*.msg"   | xargs cat | wc -l | sort -k2
total=0
find . -type f  -name "*.c*" -or -name "*.h**"  -or -name "*.msg" | while read FILE; do
     #you see use grep instead wc ! for properly counting
     count=$(grep -c ^ < "$FILE")
     let total=total+count #in bash, you can convert this for another shell
     #echo "$FILE has $count lines ===>  $total"
     echo "TOTAL LINES COUNTED ...  :  $total"
done
echo "TOTAL LINES COUNTED:  $total" #打印为 0 ?????
Shell 获取文件名和后缀名
$ file="thisfile.txt"
$ echo "filename: ${file%.*}"
filename: thisfile
$ echo "extension: ${file##*.}"
extension: txt
$ basename '/a/b/c/name.txt'    #用于去掉路径信息,返回纯粹的文件名
name.txt

dirname  #获取文件路径
shell 文件所在路径
#!/usr/bin/env bash
#coding=utf-8

#VERSION="123" # 版本号
#DATETIME=`date -d today +"%Y%m%d%H%M"`               # 时间

SELF_RELATIVE_DIR=`dirname $0`                       # 获取 脚本文件所在的相对路径
#SELF_ABSOLUTE_DIR=$(readlink -f "$SELF_RELATIVE_DIR")
SELF_ABSOLUTE_DIR=`readlink -f "$SELF_RELATIVE_DIR"` # 当前 脚本文件,所在的绝对路径

export PYTHONPATH=$PYTHONPATH:$SELF_ABSOLUTE_DIR


#python $1
ipython
  • apt
apt install --only-upgrade <packagename>

# 用apt升级单个软件包

apt-get upgrade [-u]

# 升级所以已经安装的包裹为最新可用版本.
# 不会安装新的或移除老的包裹.
# 如果一个包改变了倚赖关系而需要安装一个新的包裹,那么它将不会被升级,而是标志为 hold .
# apt-get update 不会升级被标志为 hold 的包裹 (这个也就是 hold 的意思).请看下文如何手动设置包裹为 hold .
# 我建议同时使用 ‘-u’ 选项,因为这样你就能看到哪些包裹将会被升级.
apt-get install时如何指定安装版本
$ sudo apt-get install package=version
拷贝文件并且示进度
$ rrsync  -a -P  path1   path2
$ sync
只拷贝软连接
$ sudo cp -d $HOME/bin/FoxitReader /usr/local/bin/
Sed 命令
sed -i '3s/^/your_test\n/' test.txt      # 在第3行前,插入一行
sed -i "3s/$/\nyour_test/" test.txt      # 在第3行后,插入一行


sed -i '3s/your_test/my_test/' test.txt  # 修改第三行
查找当前目录,及其子目录,” .c “ 文件脚本
#!/usr/bin/env bash

for file in `find ./ -type f -name "*.c"`;
do
    echo $file
    # do something
done

# delete pyc
find . -name '*.pyc' -delete

# File's data was last modified n*24 hours ago
find  -type f  -mtime +10  -name "mcstudent_offline*"

find ./  -type f -perm -111 #查看具有可执行权限的文件
find -type  f  -name  '*.cpp'  |   xargs  grep  '关键字'    # 查找含有某字符串的所有文件
chmod a+x `find ./ -type f -name '*.c'`                     # 修改当前目录及其子目录,文件属性
service --status-all                                        # 查看进程服务
判断文件中包含字段
File=/etc/yum.conf
#WORD='proxy'
WORD='^proxy=.*$'
if  ! grep $WORD "$File"  ; then
  echo  "$WORD not fond in $File"
else
  echo  "${WORD} in $File"
fi
判断文件是否存在
实现代码一
#!/bin/sh

myPath="/var/log/httpd/"
myFile="/var /log/httpd/access.log"
fsda1="/dev/sda1"

# 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -x "$myPath"]; then
 mkdir "$myPath"
fi

# 这里的-d 参数判断$myPath是否存在
if [ ! -d "$myPath"]; then
 mkdir "$myPath"
fi

# 这里的-b 参数判磁盘块设备是否存在
if [ -b "$fsda1" ]; then
        echo  "Fond $fsda1"
else
        echo  "Not fond $fsda1"
fi

# 这里的-f参数判断$myFile是否存在
if [ ! -f "$myFile" ]; then
 touch "$myFile"
fi

# 其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
 echo "$myVar is empty"
 exit 0
fi

# 两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
 echo '$var1 eq $var2'
else
 echo '$var1 not eq $var2'
fi
实现代码二
#如果文件夹不存在,创建文件夹
if [ ! -d "/myfolder" ]; then
 mkdir /myfolder
fi

#shell判断文件,目录是否存在或者具有权限

folder="/var/www/"
file="/var/www/log"

# -x 参数判断 $folder 是否存在并且是否具有可执行权限
if [ ! -x "$folder"]; then
 mkdir "$folder"
fi

# -d 参数判断 $folder 是否存在
if [ ! -d "$folder"]; then
 mkdir "$folder"
fi

# -f 参数判断 $file 是否存在
if [ ! -f "$file" ]; then
 touch "$file"
fi

# -n 判断一个变量是否有值
if [ ! -n "$var" ]; then
 echo "$var is empty"
 exit 0
fi

# 判断两个变量是否相等
if [ "$var1" = "$var2" ]; then
 echo '$var1 eq $var2'
else
 echo '$var1 not eq $var2'
fi
  • -f 和-e的区别 Conditional Logic on Files
  • -a file exists.
  • -b file exists and is a block special file.
  • -c file exists and is a character special file.
  • -d file exists and is a directory.
  • -e file exists (just the same as -a).
  • -f file exists and is a regular file.
  • -g file exists and has its setgid(2) bit set.
  • -G file exists and has the same group ID as this process.
  • -k file exists and has its sticky bit set.
  • -L file exists and is a symbolic link.
  • -n string length is not zero.
  • -o Named option is set on.
  • -O file exists and is owned by the user ID of this process.
  • -p file exists and is a first in, first out (FIFO) special file or named pipe.
  • -r file exists and is readable by the current process.
  • -s file exists and has a size greater than zero.
  • -S file exists and is a socket.
  • -t file descriptor number fildes is open and associated with a terminal device.
  • -u file exists and has its setuid(2) bit set.
  • -w file exists and is writable by the current process.
  • -x file exists and is executable by the current process.
  • -z string length is zero.

是用 -s 还是用 -f 这个区别是很大的!

乱码
# 解决解压Windos 压缩包文件名,乱码
unzip -O cp936 a.zip

# convmv 待验证
sudo apt-get install convmv

IED

Vscode
配置
{
    "workbench.colorTheme": "Monokai",
    "files.autoSave": "off",
    "editor.renderControlCharacters": true,
    "window.zoomLevel": 1,
    "workbench.iconTheme": "material-icon-theme",
    "C_Cpp.updateChannel": "Insiders",
    "cmake.configureOnOpen": true,
    "ycmd.path": "/home/promote/.vim/bundle/YouCompleteMe/third_party/ycmd",
    "ycmd.global_extra_config": "/home/promote/.vim/bundle/YouCompleteMe/.ycm_extra_conf.py",
    "ycmd.enabled_languages": [

        "cpp",
        "c"
    ],
    "http.proxySupport": "off",
    "files.exclude": {
        "**/*.pyc": true
    },
    "markdown-pdf.styles": [
        "/home/promote/.vscode/extensions/my-mkdown-pdf.styles/markdown-pdf_css/markdown.css"
    ],

    // "markdown-pdf.headerTemplate": "<div style=\"font-size: 9px; margin-left: 1cm;\"> <span class=\"title\"></span></div> <div style=\"font-size: 9px; margin-left: auto; margin-right: 1cm; \"> <span class='date'></span></div>"
    "markdown-pdf.headerTemplate":
        "<div style=\"font-size: 9px; margin-left: 1cm;\"> <span>山东派蒙</span></div> <div style=\"font-size: 9px; margin-left: auto; margin-right: 1cm; \"> <span class='date'></span></div>"
}
远程开发和调试
一、安装pycharm-debug.egg
  1. 在pycharm安装目录PyCharm 4.5.4debug-eggs下找到pycharm-debug.egg
  2. 将pycharm-debug.egg安装到远程主机上(easy_install安装)
二、配置远程解释器
_images/setting_project_interpreter.PNG _images/config_remote_interpreter.png
  1. 如有必要,修改Python解释器路径。
  2. 点击右上角齿轮,选择添加远程解释器。
  3. 选中ssh credentials,填写host(IP),远程主机用户名和对应的密码。如有必要,修改Python解释器路径。
  4. 填写好后,点击OK。
三、配置部署
  1. 点击tools,选择deployment,点击configuration..

    _images/config_deployment.png _images/deployment_connection.png
  2. 在deployment界面,点击+,弹出add server界面

    _images/add_server.png
  3. 输入服务端的名字,选择传输协议(可以是sftp)

  4. 设置连接
    1. host 填写主机IP
    2. 端口
    3. root path
    4. user name
    5. password
    _images/deployment_connection.png
  5. 设置映射(Mappings)
    1. 设置本地目录路径
    2. 设置远程目录路径
    _images/deployment_mapping.png
  6. 点击tools,选择deployment,选中Automatic Upload

    _images/auto_upload.png
四、配置debug
  1. 点击Run,点击Edit Configurations,打开Run/Debug configuration

    _images/config_run_debug.png
  2. 配置path mapping:
    1. 点击path mappings后面的...,打开edit path mappings
    2. 点击+,添加local path(本地运行目录),添加remote path(远程运行目录)
    3. 确认path mappings都是正确的
    _images/edit_run_debug.png

Windows

子系统
更换默认子系统安装位置
LxRunOffline.exe list  % 查看我们的子系统版本

% 记下我们的版本号,然后输入LxRunOffline move -n {version} -d {dir}

在这里{version}填写我们刚才查到的版本号,{dir}改为我们需要移动到的目录

% 例如我要把Ubuntu-18.04移动到我新建的文件夹D:\WinLinux下,那么我需要输入

LxRunOffline move -n Ubuntu-18.04 -d D:\WinLinux  然后确认回车耐心等待移动结束就行
C:\Users\jiang\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs

Mingw32 (fedora)

yum install mingw32*

-mwindows

https://gtk-win.sourceforge.io/home/index.php/Main/Downloads



mingw32-pkg-config --libs --cflags gtk+-2.0

mingw32-pkg-config --list-all

ls /usr/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig/
./configure --host=i686-w64-mingw32

make --CXXFLAGS+=-mwindow
How to find library dependencies of Windows DLL
# install
yum install mingw-binutils-generic.x86_64
# Show dependencies dll
mingw-objdump -p a.exe | grep DLL

# install
yum install binutils
# Show dependencies dll
objdump -p a.exe  | grep DLL
$ yum install mingw32-nsis.x86_64  mingw32-nsiswrapper.noarch

$ makensis project.nsi

NSIS

Downloads and install
windows
Fedora
$ sudo yum install mingw32-nsis.x86_64
How to use
# Windows
"C:\Program Files\NSIS\makensis.exe examble.nsi

# Fedora
$ makensis examble.nsi

Dnsmasq

DNS服务

http://374400.blog.51cto.com/364400/1428126/

https://wiki.debian.org/HowTo/dnsmasq https://manpages.debian.org/jessie/dnsmasq-base/dnsmasq.8.en.html

http://www.yunweipai.com/archives/8664.html http://chuansong.me/n/471642951828 http://debugo.com/dnsmasq/ http://blog.csdn.net/linuxnews/article/details/51034338

# slove "dnsmasq: setting capabilities failed: Operation not permitted" https://hub.docker.com/r/fayehuang/centos-serf/~/dockerfile/

# /etc/dnsmasq.conf

user=root
interface=br0
except-interface=virbr0,lo   #不想监听
#listen-address=192.168.5.204,127.0.0.1
no-dhcp-interface=br0        # br0禁止dhcp服务

strict-order
all-servers   #发起查询,选择回应最快的一条作为查询结果返回
resolv-file=/etc/dnsmasq.resolv.conf  # 配置Dnsmasq其他指向的DNS服务器

no-hosts                        # 不想使用/etc/hosts
addn-hosts=/etc/dns_add_hosts   # 存放域名解析列表

cache-size=5000  # 设置dns缓存大小,默认为150条

cat /etc/dns_add_hosts

58.56.27.130   mcgit.net
192.168.2.3    jiangxumin.net
124.133.33.114 mcedu.net
192.168.5.166  ftp.jiangxumin.net

cat /etc/dnsmasq.resolv.conf

nameserver 223.5.5.5
nameserver 223.6.6.6
nameserver 114.114.114.114
nameserver 180.76.76.76
nameserver 8.8.8.8
$ sudo netstat -anlp | grep ":53 "  # 查看53端口,是否占用
$ sudo netstat -anlp | grep -w LISTEN | grep ":53 "

$ sudo dnsmasq --test             # 测试配置是正确
$ sudo systemctl restart dnsmasq  # 重启dnsmasq服务
$ sudo systemctl status dnsmasq   # 查看 dnsmasq 服务状态
$ sudo nslookup  jiangxumin.com

$ sudo dnsmasq  -C /etc/dnsmasq.conf  # 启动dnsmasq 进程 指定配置文件
DHCP服务
interface=br0
bind-dynamic
dhcp-range=192.168.106.1,192.168.106.240,1h
dhcp-option=1,255.255.255.0
dhcp-option=3,192.168.106.254
dhcp-option=6,114.114.114.114,
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases
Nat转发
  • 两个网卡:
    • enp2s0 : 连接外网, 192.168.8.25
    • enp3s0 : dhcp server, 192.168.16.254

enp3s0配置

# 网卡地址配置成 网管地址
# cat /etc/sysconfig/network-scripts/ifcfg-enp3s0

DEVICE=enp3s0
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static

IPADDR=192.168.16.254
NETMASK=255.255.255.0

dnsmasq 配置

#/etc/dnsmasq.conf

user=root
bind-dynamic
#interface=enp2s0,enp3s0
interface=enp3s0
except-interface=enp2s0,lo
dhcp-range=192.168.16.50,192.168.16.200,1h

no-dhcp-interface=enp2s0         #   br0禁止dhcp服务

dhcp-option=1,255.255.255.0
dhcp-option=3,192.168.16.254  # 网关
dhcp-option=6,8.8.8.8,180.76.76.76
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases

# Mac地址绑定
dhcp-host=00:1f:16:19:e2:df,192.168.16.122,infinite
dhcp-host=00:e0:6f:69:e6:e8,192.168.16.123,infinite

防火墙net转发

# add
iptables -t nat -A POSTROUTING -s 192.168.16.0/24 -j SNAT --to 192.168.8.25

# delete
#iptables -t nat -D POSTROUTING -s 192.168.16.0/24 -j SNAT --to 192.168.8.25

# show
iptables -t nat -nL

apache

配置
显示目录
<Directory "/home/ftpdir">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>
设置字符编码
AddDefaultCharset UTF-8
IndexOptions Charset=UTF-8

#AddDefaultCharset GB2312
#AddDefaultCharset GBK
显示全名
Options +Indexes
<IfModule mod_autoindex.c>
  IndexOptions NameWidth=*
</ifModule>

X11 and openbox

Install and Start
sudo apt-get install -y xorg openbox
export DISPLAY=:0.0
sudo xhost +local:root
sudo sartx /usr/bin/openbox
安装资源监视器
$ apt-get install xfce4-taskmanager
$ apt-get install gnome-system-monitor
安装chrominum-browser和googlepinyin
1. Install

主要安装如下几个包,以及其所依赖的包。

  • adobe-flashplugin
  • chromium-browser
  • ibus
  • ibus-gtk
  • ibus-gtk3
  • ibus-pinyin
  • ibus-googlepinyin
  • ibus-clutter
  • im-config
  • dbus-x11
$ sudo tar xzvf  chrome_and_pinyin.tgz
$ sudo cd  pack
$ sudo dpkg -i *.deb
alternate text
2. Config
$ ibus  engine  googlepinyin
alternate text
3. How to use
$ chromium-browser --user-data-dir=/tmp www.baidu.com
alternate text

常用工具安装极其配置

网络文件系统
NFS (for ubuntu14.04)
1). NFS Server
# Install NFS Server
$ sudo apt-get install nfs-kernel-server
# 在 /etc/exports 添加
tree -a /etc/exports<<-'EOF'
/home/jxm/workspace *(rw,sync,no_root_squash,no_subtree_check)
EOF
# Restart NFS Server
$ sudo /etc/init.d/rpcbind restart            # 重启rpcbind
$ sudo /etc/init.d/nfs-kernel-server restart  # 重启nfs

# 查看
$ showmount -e 127.0.0.1

# 查看挂载
$ sudo df -Th
2). NFS Client
# 安装NFS Client
$ sudo apt-get install  nfs-common

# 查看服务器共享文件
$ showmount -e 192.168.1.122

# 挂载
$ sudo mount -t nfs 192.168.1.122:/home/jxm/workspace /mnt
$ sudo mount.nfs  192.168.1.122:/home/jxm/workspace /mnt
CIFS (Ubuntu 14.04)
1). 设置共享

在要挂载的windows系统中找到需要挂载的硬盘或者文件夹,把它设置为共享, 如:在D盘下建立文件夹**cifs_shared**, 设为共享.

2). 安装与配置
# 1. 安装 cifs-utils
$ sudo apt-get install  cifs-utils

# 2. 在linux系统/mnt目录下创建一个文件夹
$ mkdir /mnt/work

# 3. 挂载
$ sudo mount -t cifs -o username=jxm,password=123456 //192.168.2.102/cifs_shared /mnt
$ sudo mount.cifs -o username="jxm",password="123456",uid=jxm,gid=jxm  //192.168.2.102/cifs_shared /mnt

更改文件夹权限。给mount共享文件夹所在组的写权限:

$ sudo mount.cifs -o username="jxm",password="123456",uid=jxm,gid=jxm,dir_mode=0777 //192.168.2.102/cifs_shared /mnt/
$ sudo mount.cifs //192.168.2.102/cifs_shared /mnt -o file_mode=0777,dir_mode=0777,rw,username=jxm,password=123456,iocharset=utf8
$ sudo mount.cifs //192.168.2.102/cifs_shared /mnt -o file_mode=0777,dir_mode=0777,rw,username=jxm,password=123456,iocharset=cp93
$ sudo mount.cifs //192.168.100.252/Public /mnt
alternate text
FTP服务 (Centos 7)
docker run -d --restart=always  --name ftpd_server -p 21:21 -p 30000-30009:30000-30009 -e "PUBLICHOST=localhost"  \
-e FTP_USER_NAME=mccr -e FTP_USER_PASS=123456 -e FTP_USER_HOME=/home/mccr \
 -v /home:/home  \
stilliard/pure-ftpd
# 1). 安装vsftpd
$ sudo  yum install -y vsftpd

# 2). 修改配置文件 /etc/vsftpd/vsftpd.conf
##########################################
# 如下图修改: anonymous_enable=NO
##########################################

# 3). 添加用户
$ sudo  mkdir /home/ftpdir/jxm
$ sudo  useradd -d /home/ftpdir/jxm -s /sbin/nologin jxm
# or
$ sudo  useradd -d /home/ftpdir/jxm -s /bin/sh jxm

$ sudo  passwd jxm

# 4). 删除用户:
$ sudo  userdel  jxm

# 5). 禁用防火墙
$ sudo  systemctl stop firewalld.service
$ sudo  systemctl disable firewalld.service

# 6). 重启ftp
$ sudo  systemctl restart vsftpd

Ftp遇到的问题 ::::::::::::::::::::::::::::;

tee -a  /etc/vsftpd/vsftpd.conf <<-'EOF'
reverse_lookup_enable=NO
EOF

alternate text
挂载Ftp目录(Ubuntu 14.04)
# 1). 安装curlftpfs
$ sudo apt-get install  curlftpfs

# 2). 挂载
$ sudo curlftpfs -o codepage=gbk  ftp://username:password@192.168.8.25   /mnt
$ sudo curlftpfs -o codepage=utf-8 ftp://username:password@192.168.8.25/public /mnt
x11vnc
  1. 安装与启动
# 安装 x11 openbox
# apt-get install xserver-xorg x11-xserver-utils
$ sudo apt-get install xorg openbox

# 安装x11vnc:
$ sudo apt-get install x11vnc

# 设置VNC的连接密码:
$ sudo x11vnc -storepasswd
$ sudo x11vnc -storepasswd 123456 ~/.vnc/passwd
$ sudo x11vnc -storepasswd 123456 /etc/x11vnc.pass

#. 启动VNC Server:
$ sudo  x11vnc -forever -shared -rfbauth ~/.vnc/passwd
  1. 开机自启动
$ cp ~/.vnc/passwd /etc/x11vnc.pass

编辑 /etc/init/x11vnc.conf

start on login-session-start
script
/usr/bin/x11vnc -auth /var/run/lightdm/root/:0 -noxrecord -noxfixes \
-noxdamage -rfbauth /etc/x11vnc.pass -forever -bg -rfbport 5900 -o \
/var/log/x11vnc.log
end script

参考: Ubuntu安装X11VNC https://yq.aliyun.com/ziliao/29494

安装WPS for Linux
启动WPS for Linux后,出现提示"系统缺失字体" 。

1. 下载缺失的字体文件,然后复制到Linux系统中的/usr/share/fonts文件夹中。

        国外下载地址:https://www.dropbox.com/s/lfy4hvq95ilwyw5/wps_symbol_fonts.zip

        国内下载地址:https://pan.baidu.com/s/1eS6xIzo

2. 将解压的字体,拷贝到 /usr/share/fonts/wps-office/

4. 重启 wps

参考: http://www.cnblogs.com/liangml/p/5969404.html

Barrier 一套键鼠同时控制多台电脑
sudo apt-get install barrier

sudo snap install barrier

FSearch : Linux 版本的 Everything
sudo add-apt-repository ppa:christian-boxdoerfer/fsearch-daily
sudo apt-get update
sudo apt install fsearch-trunk

tmux
$ sudo apt-get install tmux # ubuntu
$ sudo brew    install tmux    # osX
C-b ?          显示快捷键帮助

c-b : set -g display-panes-time 2000
C-b : Up, Down
      Left, Right  更改窗口大小

C-b q          显示分隔窗口的编号
C-b q 0-9      切换到窗口的编号对应的窗口

C-b C-o        调换窗口位置,类似与vim 里的C-w
C-b 空格键     采用下一个内置布局
C-b !          把当前窗口变为新窗口
C-b "          模向分隔窗口
C-b %          纵向分隔窗口
C-b o          跳到下一个分隔窗口
C-b 上下键     上一个及下一个分隔窗口
C-b ALT-方向键 调整分隔窗口大小
C-b c          创建新窗口
C-b 0~9        选择几号窗口
C-b c          创建新窗口
C-b n          选择下一个窗口
C-b l          切换到最后使用的窗口
C-b p          选择前一个窗口
C-b w          以菜单方式显示及选择窗口
C-b t          显示时钟
C-b ;          切换到最后一个使用的面板
C-b x          关闭面板
C-b &          关闭窗口
C-b s          以菜单方式显示和选择会话

C-b d          退出tumx,并保存当前会话,这时,tmux仍在后台运行,
               可以通过tmux attach进入 到指定的会话
tee ${HOME}/.tmux.conf  <<-'EOF'
#延时时间 1200 ms
set -g display-panes-time 1200
EOF


$ tmux list-sessions

$ tmux attach-session   # 附加
项目管理系统 taiga 安装部署
git clone https://github.com/taigaio/taiga-docker.git

# 修改ip, `docker-compose.yml`
# 把里面的所有的 `localhost` 都替换为服务器IP, 我的ip 为 192.168.2.100

# 运行容器
./launch-all.sh

# 生成管理员账户
./taiga-manage.sh createsuperuser


# 浏览器访问
#  http://192.168.2.100:9000.

X11

Install
sudo apt-get install -y xorg openbox
export DISPLAY=:0.0
sudo xhost +local:root

xinit
#!/bin/sh

#  $Home/.xinitrc
# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

# invoke global X session script
# . /etc/X11/Xsession
exec openbox-session
tee  .config/openbox/autostart.sh  <<-'EOF'
if [ `xrandr | grep eDP-1 | grep -c ' connected '` -eq 1 ]; then
        if [ `xrandr | grep ^DP-1 | grep -c ' connected'` -eq 1 ]; then
                # xrandr --output DP-1 --auto --primary --output eDP-1 --auto --right-of DP-1
                xrandr --output DP-1 --auto --primary
                echo "==="
        fi
        if [ `xrandr | grep ^HDMI-1 | grep -c ' connected '` -eq 1 ]; then
                # xrandr --output HDMI-1 --auto --primary --output eDP-1 --auto --right-of HDMI-1
                xrandr --output HDMI-1 --auto --primary
        fi
fi
feh --bg-fill   ~/Wallpapers/background.jpeg
# feh --bg-tile   ~/Wallpapers/tile8.jpg
# feh --bg-center ~/Wallpapers/paperart5.jpg
EOF
自 动 登 陆
sudo mkdir /etc/systemd/system/getty@tty1.service.d
tee /etc/systemd/system/getty@tty1.service.d/override.conf  <<- 'EOF'
[Service]
ExecStart=
ExecStart=-/sbin/agetty --noissue --autologin 帳戶名稱 %I $TERM
Type=idle
EOF
# 登陆自启动
tee  /root/.bash_profile <<-'EOF'
if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then
    xinit  # or start x11
    exec startx
    exit 1
fi
EOF
tee /root/.xinitrc <<-'EOF'
#!/bin/sh

#  $Home/.xinitrc
# /etc/X11/xinit/xinitrc

exec openbox-session
EOF

tee  .config/openbox/autostart.sh  <<-'EOF'
# start  client
EOF


ssh -AY user@host
ssh -AY user@host xterm

sudo yum install xorg-x11-xauth xterm
sed -i 's/#X11Forwarding yes/X11Forwarding yes/g' /etc/ssh/sshd_config
systemctl restart sshd

ssh -Y user@host

# test
yum install gnome-clocks.x86_64
gnome-clocks

科学上网

一枝红杏出墙来!!!
alternate text
VPS厂商
快速搭建
方案1(未加速)
$ curl -sSL https://get.docker.com/ | sh

# server
$ sudo firewall-cmd --zone=public --add-port=8500/udp --permanent  # 开启服务端 端口

$ docker run -d --restart=always --name ssserver -p 6443:6443 mritd/shadowsocks -s "-s 0.0.0.0 -p 6443 -m aes-256-cfb -k rootroot --fast-open"

# client
$ docker run -d --restart=always --name ssclient -p 1080:1080 mritd/shadowsocks \
  -m "ss-local" -s "-s $SSSERVER_IP -p 6443 -b 0.0.0.0 -l 1080 -m aes-256-cfb -k rootroot --fast-open"
方案2 (kcptun 加速,24小时内 被封)
# server
$ sudo firewall-cmd --zone=public --add-port=8500/udp --permanent  # 开启服务端 端口
$ sudo docker run -d --restart=always --name ssserver -p 6443:6443 -p 8500:8500/udp mritd/shadowsocks \
  -m "ss-server" -s "-s 0.0.0.0 -p 6443 -m aes-256-cfb -k meiyoumima --fast-open -n 5 " \
  -x -e "kcpserver" -k "-t 127.0.0.1:6443 -l :8500 -mode fast2"

# client
$ sudo docker run -d --restart=always --name ssclient -p 1080:1080 mritd/shadowsocks \
  -m "ss-local" -s "-s 127.0.0.1 -p 8500 -b 0.0.0.0 -l 1080 -m aes-256-cfb -k meiyoumima --fast-open" \
  -x -e "kcpclient" -k "-r $SSSERVER_IP:8500 -l :8500 -mode fast2"
方案3 Udp2raw-tunnel
# ssserver
docker run -d --restart=always --name ssserver -p 6443:6443 mritd/shadowsocks -s "-s 0.0.0.0 -p 6443 -m aes-256-cfb -k rootroot --fast-open"

# kcptun server
./server_linux_amd64 -t "0.0.0.0:6443" -l ":4000" -mode fast2  -mtu 1200

# hudp2raw server
./udp2raw_amd64 -s -l 0.0.0.0:2096 -r 0.0.0.0:4000 -k "passwd:meiyoumima" --raw-mode faketcp -a


####-------- G -- F -- W  -------####

# hudp2raw client
./udp2raw_amd64 -c -r $SERVER_IP:2096 -l 0.0.0.0:4000 --raw-mode faketcp -a -k "passwd:meiyoumima"


# kcptun client
./client_linux_amd64  -r "0.0.0.0:4000" -l ":8388" -mode fast2 -mtu 1200

# ssclient
sudo docker run -d  --name ssclient -p 1081:1080 mritd/shadowsocks -m "ss-local" -s "-s 192.168.2.3 -p 8388 -b 0.0.0.0 -l 1080 -m aes-256-cfb -k rootroot --fast-open"
1. 牛逼的shadowsocks
安装 shadowsocks
# ubuntu
$ export LC_ALL=C
$ sudo apt-get install python-pip

$ sudo pip install --upgrade pip -i https://pypi.mirrors.ustc.edu.cn/simple
$ sudo pip install shadowsocks  -i https://pypi.mirrors.ustc.edu.cn/simple
配置 shadowsocks
Server
#  1. 手动启动

$ sudo ssserver -p 8388 -k password -m aes-256-cfb --user nobody -d start

# 2. 配置自动启动(ubuntu)
$ sudo tee /etc/shadowsocks.json <<-'EOF'
{
    "server":"my_server_ip",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false,
    "workers": 100
}
EOF

$ sudo tee /etc/init.d/shadowsocks-start.sh <<-'EOF'
#! /bin/sh
### BEGIN INIT INFO
# Provides:          shadowsocks
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $time
# Should-stop:       $network $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: shadowsocks.
### END INIT INFO
/usr/local/bin/ssserver -c /etc/shadowsocks.json -d start
EOF

# 设置启动等级:
$ sudo chmod a+x /etc/init.d/shadowsocks-start.sh
$ sudo update-rc.d shadowsocks-start.sh defaults 90

$ service shadowsocks-start.sh start/stop/restart
Client
  • Ubuntu
$ sudo tee /etc/shadowsocks.json <<-'EOF'
{
    "server":"my_server_ip",
    "server_port":8388,
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"mypassword",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": true,
    "workers": 100
}
EOF

# workers - 并发数

# 手动启动,停止
$ sudo sslocal -c /etc/shadowsocks.json
$ sudo sslocal -c /etc/shadowsocks.json -d start
$ sudo sslocal -c /etc/shadowsocks.json -d stop
$ sudo sslocal -c /etc/shadowsocks.json -d restart

# 配置开机自启动
$ sudo tee /etc/init.d/shadowsocks-start.sh <<-'EOF'
#!/bin/sh
### BEGIN INIT INFO
# Provides:          shadowsocks
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $time
# Should-stop:       $network $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: shadowsocks.
### END INIT INFO
/usr/local/bin/sslocal -c /etc/shadowsocks.json -d start
EOF

# 设置启动等级:
$ sudo chmod a+x /etc/init.d/shadowsocks-start.sh
$ sudo update-rc.d shadowsocks-start.sh defaults 90

# 测试
$ google-chrome --proxy-server=socks5://127.0.0.1:1080
kcptun 加速
属性 客户端 服务器
listener_port 与shadowsocks交互的端口 对外的端口
target_ip 服务器的IP 本机
target_port 服务器的端口(listen_port) 与shadowsocks交互的端口

2. 神奇的SwitchyOmega
配置代理
alternate text
配置自动切换

导入在线,规则列表,立即更新情景模式

在线规则列表:
https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt
alternate text
3. polipo http/https的代理转发

Shadowsocks是我们常用的代理工具,它使用socks5协议,而终端很多工具目前只支持http和https等协议,对socks5协议支持不够好, 所以需要将socks协议转换成http协议.

# ubuntu
$ sudo apt-get install polipo
$ sudo polipo -v
$ man polipo
# the default values.  See /usr/share/doc/polipo/examples/config.sample

# mac
$ brew  search polipo
$ sudo mkdir /etc/polipo
$ sudo tee /etc/polipo/config <<-'EOF'

# This file only needs to list configuration variables that deviate
# from the default values.  See /usr/share/doc/polipo/examples/config.sample
# and "polipo -v" for variables you can tweak and further information.

logSyslog = true
logFile = /var/log/polipo/polipo.log

socksParentProxy = "127.0.0.1:1080"
socksProxyType = socks5

proxyAddress = "0.0.0.0"
proxyPort = 8123
allowedClients = 127.0.0.1, ::1, 192.168.8.0/24

EOF

# ubuntu
$ sudo service polipo restart

# mac
$ sudo mkdir /var/log/polipo
$ sudo polipo socksParentProxy=localhost:1080
socksParentProxy : 上级代理ip,端口
socksProxyType   : 是上级代理类型

proxyAddress     : 监听的ip
proxyPort        : 是本地监听端口
allowedClients   : 是允许连接ip范围
# 以ubuntu 测试通过
echo -e "\n------------------------------------------\n"
curl ip.gs
#curl ifconfig.me
echo -e "\n------------------------------------------\n"

export https_proxy=https://127.0.0.1:8123
export  http_proxy=http://127.0.0.1:8123
export HTTPS_PROXY=https://127.0.0.1:8123
export  HTTP_PROXY=http://127.0.0.1:8123

curl ip.gs
#curl ifconfig.me
echo -e "\n------------------------------------------\n"

$ git config --global http.proxy=localhost:8123
4. 端口转发
#端口转发
lcx.exe -slave 192.168.8.6 8888 127.0.0.1 9666
lcx.exe -listen  8888 8889  #将 8888 转发到 8889

## 代理
lcx.exe -tran 8889 127.0.0.1 9666


## 端口转发示例3
lcx.exe -slave 192.168.8.100 8888 127.0.0.1 9666    # windows  端运行 无界端口 127.0.01:9666
./portmap -m 2 -p1 8889 -h2  192.168.8.100 -p2 8888   # Linux端(192.168.8.100)  ,上网配置 8889


## 待研究: https://www.freebuf.com/articles/network/244567.html

ssh -L 1080:127.0.0.1:1080 192.168.3.19
ssh -L 1089:127.0.0.1:1089 promote@192.168.3.19
内网穿透 tailscaled
################################################################
# Server: Enable IP forwarding
################################################################

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf

################################################################
# Server : If your Linux node uses firewalld
################################################################

firewall-cmd --permanent --add-masquerade


################################################################
# Server or client
################################################################

docker run  -d --restart=always \
    --name=tailscaled \
    -v /var/lib:/var/lib \
    -v /dev/net/tun:/dev/net/tun \
    --network=host \
    --privileged \
    tailscale/tailscale:v1.26.0 \
    tailscaled


docker exec tailscaled tailscale up --advertise-routes=192.168.3.0/24,192.168.2.0/24 --reset # For Server

docker exec tailscaled tailscale up                  # For Windows , macOS client
docker exec tailscaled tailscale up --accept-routes  # For linux client

tensorflow

docker pull tensorflow/tensorflow

docker run --name="tensorflow" -d -p 8888:8888 tensorflow/tensorflow

# nvidia-docker
docker run  --name="tensorflow-gpu" --runtime=nvidia -it -p 8888:8888 tensorflow/tensorflow:latest-gpu

其他

\[\sigma_\mathrm{mean} = \frac{\sigma}{\sqrt{N}}\]
\[\begin{split}\begin{bmatrix} 1 & 3\\ -2 & 0 \end{bmatrix} \begin{bmatrix} -1 \\ 2 \end{bmatrix} = \begin{bmatrix} 5 \\ 2 \end{bmatrix}\end{split}\]
windows 计算 MD5 SHA1  SHA256
> certutil -hashfile D:\filename.txt MD5
> certutil -hashfile D:\filename.txt SHA1
> certutil -hashfile D:\filename.txt SHA256
系统常见问题
Windows镜像下载地址
https://msdn.itellyou.cn/
qbittorrent
http://www.qbittorrent.org/
OBS Studio
官网
https://obsproject.com/

搭建RTMP服务器

Docker

# https://hub.docker.com/r/jasonrivers/nginx-rtmp/
$ sudo docker run -d  -p 1935:1935 -p 8088:8080  --rm  jasonrivers/nginx-rtmp

# or
# https://github.com/alfg/docker-nginx-rtmp
$ sudo docker run -d -p 1935:1935 -p 8080:80 --rm alfg/nginx-rtmp

windows

http://www.hangge.com/blog/cache/detail_1325.html

SPAW 分区

Linux系统swappiness参数在内存与交换分区之间优化作用

Linux VPS的使用过程中,SWAP交换分区是一个很重要系统缓存分区。他是在内存不够用的情况下,从硬盘中临时分出一部分空间系统当做内存使用。但是,如果SWAP的占用超过30%的时候,系统的性能就会受到影响,这时候就要刷新SWAP。

# 可以执行命令刷新一次SWAP(将SWAP里的数据转储回内存,并清空SWAP里的数据)
$ sudo swapoff -a && sudo swapon -a


$ cat /proc/sys/vm/swappiness  # 查看
$ sysctl -q vm.swappiness      # 查看当前设置

# 临时设置
$ sudo sysctl vm.swappiness=10

# 永久设置
$ sudo echo "vm.swappiness=10" >> /etc/sysctl.conf
$ sysctl -p  # 激活
CenterOS
  1. 检查某服务是否开机启动

    # chkconfig dnsmasq
    
  2. 开启/禁止 某服务开机启动

    # chkconfig dnsmasq on/off
    # systemctl enable/disable  dnsmasq
    
  3. 启动/停止/重启 某服务

    # systemctl start/stop/restart dnsmasq
    
amixer

amixer的用法(音频编码音量控制)

  1. 查看:
$ sudo alsamixer
$ sudo amixer -D pulse
$ sudo amixer scontrols   # 查看,哪些选择可以控制
  1. 声音设置
$ amixer -D pulse sset "Master" on
$ amixer -D pulse sset "Master" off    // 静音
$ amixer set "Master" 100%

$ amixer set "PCM" 94%    #  6100u 华科 噪音
  1. 录音设置
$ amixer set "Capture" 100%

$ amixer set "Front Mic Boost" 53%
$ amixer set "Rear Mic Boost"  53%

alsamixer设置默认声卡及调节音量保存配置

$ sudo apt-get install alsa-base alsa-utils alsa-oss alsa-tools

# 1. 如果默认声卡不是需要的
# 在home目录添加.asoundrc文件

$ sudo tee $HOME/.asoundrc <<-'EOF'
defaults.ctl.card 1 defaults.pcm.card 1
EOF

# 数字1代表声卡序号
# 可以通过以下指令查看

$ cat /proc/asound/cards

# 2. alsamixer调节声音
# Master和PCM是必须打开的。
# Master和PCM声道默认是静音的,标记是MM,用左右方向键选择,按M来修改为OO就是开启,上下键调节音量大小。
# 配置好之后执行:
$ alsactl store # 保存配置, 配置会保存在/var/lib/alsa/asound.state
nmcli命令

2.3.使用 NETWORKMANAGER 命令行工具 NMCLI

$ nmcli help
$ nmcli c help

$ nmcli con show
$ nmcli dev show eth0
rmp and yum
查询含有 *rdma.so 的rpm 包
yum provides *rdma.so
Fedora 开启SSH服务
https://my.oschina.net/atttx123/blog/58100
nginx

ubutnu 源制作
  • https://gist.github.com/awesomebytes/ce0643c1ddead589ab06e2a1e4c5861b

  • Requirements
    • Python (I used 2.7).
    • dpkg-scanpackages: sudo apt-get install dpkg-dev
    • gzip: sudo apt-get install gzip
    1. Create your debian hosting folder structure
    mkdir simple_debian_repo
    cd simple_debian_repo
    mkdir debian
    
    1. Add your .deb files to the debian folder
    cp my_awesome_thing.deb simple_debian_repo/debian
    
    1. Create Packages.gz file
    # You'll need to do this every time you add/update a .deb.
    dpkg-scanpackages debian /dev/null | gzip -9c > debian/Packages.gz
    

    You'll get an output similar to

    dpkg-scanpackages: warning: Packages in archive but missing from override file:
    dpkg-scanpackages: warning:   my_awesome_thing.deb
    dpkg-scanpackages: info: Wrote 1 entries to output Packages file.
    
    1. Run a webserver to host it
    cd simple_debian_repo/
    python -m SimpleHTTPServer 8000
    
    1. Configure any machine to point to your new debian repository
    tee  /etc/apt/sources.list <<-"EOF"
    deb [trusted=yes] http://127.0.0.1:8000 debian/
    EOF
    
    apt-get update
    apt-cache search  "deb包“
    
    Note:

    that the packages will be non authenticated, so if you want to stop having warnings you'll need to add the [trusted=yes]

ubuntu 好用的工具
# Indicator Stickynotes - Ubuntu 桌面便签小工具
sudo add-apt-repository ppa:umang/indicator-stickynotes
sudo apt-get update
sudo apt-get install indicator-stickynotes
问题
Apache2
重启Apache2出现:
Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName.问题
在/etc/apache2/apache2.conf文件最后加上:
# Server Name
ServerName localhost
# centos 目录或文件名中文显示
# vim /etc/httpd/conf/httpd.conf
AddDefaultCharset UTF-8
IndexOptions Charset=GBK

插入youku视频


插入github 视频


插入gitliab 视频


插入百度云盘

remote-viewer

--hotkeys=release-cursor="" # 屏蔽 ctrl+alt