From 9ab9d2f3a711b01ec1dcde12967e119c2de4bd81 Mon Sep 17 00:00:00 2001 From: renjianbo <18691577328@163.com> Date: Mon, 12 Jan 2026 11:20:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Obsidian/2026-01-05 个人文档管理.md | 15 + docs/Obsidian/adb调试命令/adb常用命令.md | 189 ++ docs/Obsidian/adb调试命令/常用linux命令.md | 2863 +++++++++++++++++ ...以在技术专项、团队效能和个人成长三大领域构建更懂你的专属助手.md | 214 ++ ...成一个专项事务助手吗,比如公司正规化事务助手.md | 82 + docs/Obsidian/git/Git add . 后如何撤销.md | 321 ++ docs/Obsidian/git/git常用命令.md | 230 ++ docs/Obsidian/saars开发/aitsc维护命令.md | 160 + ...saar系统是什么,可以解决哪些场景需求的问题.md | 50 + docs/Obsidian/saars开发/数据库配置.md | 3 + .../saars开发/营养师/健康营养师分析数据.md | 115 + .../saars开发/营养师/营养师分析数据.md | 102 + ...过3年的framework开发,写过python后台。我想创业,不知道可以具体怎么来做?.md | 56 + docs/Obsidian/欢迎.md | 5 + .../生活/教育/9个国家级免费学习平台.md | 61 + docs/Obsidian/资源网站.md | 25 + docs/Obsidian/重要笔记.md | 78 + docs/Obsidian/高频命令.md | 80 + 18 files changed, 4649 insertions(+) create mode 100644 docs/Obsidian/2026-01-05 个人文档管理.md create mode 100644 docs/Obsidian/adb调试命令/adb常用命令.md create mode 100644 docs/Obsidian/adb调试命令/常用linux命令.md create mode 100644 docs/Obsidian/dify/作为安卓高级开发工程师,除了项目管理,你完全可以在技术专项、团队效能和个人成长三大领域构建更懂你的专属助手.md create mode 100644 docs/Obsidian/dify/使用dify,可以生成一个专项事务助手吗,比如公司正规化事务助手.md create mode 100644 docs/Obsidian/git/Git add . 后如何撤销.md create mode 100644 docs/Obsidian/git/git常用命令.md create mode 100644 docs/Obsidian/saars开发/aitsc维护命令.md create mode 100644 docs/Obsidian/saars开发/互联网saar系统是什么,可以解决哪些场景需求的问题.md create mode 100644 docs/Obsidian/saars开发/数据库配置.md create mode 100644 docs/Obsidian/saars开发/营养师/健康营养师分析数据.md create mode 100644 docs/Obsidian/saars开发/营养师/营养师分析数据.md create mode 100644 docs/Obsidian/创业/我是一名从事android 应用的开发者,写过多款应用,写过微信小程序,写过h5,也做过3年的framework开发,写过python后台。我想创业,不知道可以具体怎么来做?.md create mode 100644 docs/Obsidian/欢迎.md create mode 100644 docs/Obsidian/生活/教育/9个国家级免费学习平台.md create mode 100644 docs/Obsidian/资源网站.md create mode 100644 docs/Obsidian/重要笔记.md create mode 100644 docs/Obsidian/高频命令.md diff --git a/docs/Obsidian/2026-01-05 个人文档管理.md b/docs/Obsidian/2026-01-05 个人文档管理.md new file mode 100644 index 0000000..9cec09a --- /dev/null +++ b/docs/Obsidian/2026-01-05 个人文档管理.md @@ -0,0 +1,15 @@ + +增加或者修改文档 + +使用大模型将新增文档更新到目录中 + +可以将学习笔记目录下的文件添加入mkdocs.yml中 + + +可以将docs目录下的文件添加入mkdocs.yml中 + +上传代码 +git add . && git commit -m "测试" && git push origin master + +计算云拉取代码并重启服务 +cd ~/devops/mkdocs && git pull origin master && docker-compose restart \ No newline at end of file diff --git a/docs/Obsidian/adb调试命令/adb常用命令.md b/docs/Obsidian/adb调试命令/adb常用命令.md new file mode 100644 index 0000000..e75f07a --- /dev/null +++ b/docs/Obsidian/adb调试命令/adb常用命令.md @@ -0,0 +1,189 @@ +adb devices           获取链接的设备 + +adb get-state         获取设备状态 + +adb start-server     启动adb服务 + +adb kill-server       关闭adb服务 + +adb connect          连接设备 + +adb disconnect      断开设备 + +adb install 软件名称 apk 安装软件 + +adb install -r 软件名称 apk 重新安装软件 + +adb uninstall apk包名  卸载软件 + +adb uninstall -k  包名 保留数据卸载 + +adb logcat      查看手机上的运行日志,可以用此项来查错 + +adb push  本地路径  安卓路径   本地向安卓传输数据 + +adb pull  安卓路径  本地路径      从安卓端下载到本地 + +Adb remount         重新挂载系统文件 + +Adb get-serilno     获取系列号 + +Adb shell dmesg    打印内核的调试信息 + +Adb reboot            重启手机 + +Adb reboot recovery 重启手机到recovery界面 + +Adb reboot bootloader        重启手机到bootloader界面 + +Adb version   查看版本 + +adb shell        进入手机终端 + +adb shell screencap  /sdcard/sreen.png   截图 + +adb shell dumpsys battery 查看电量 + +adb shell dumpsys cpuinfo  获取cpu信息 + +adb shell svc wifi enable   打开wifi + +adb shell svc wifi disable  关闭wifi + +adb shell wm size   查看分辨率 + +adb shell momkey -p 包名 -v 100    单应用-100个随机事件压力测试 + +adb shell momkey -p 包名 -p 包名 -v -v 100   多应用-100个随机事件压力测试 + + am 命令(activity manager) + +adb shell am start -n packagename/activity    直接启动 + +adb shell am start -S packagename/activy       先停止在启动 + +adb shell am start -W packagename/activy     等待启动完成 + +action adb shell am start -a android.intent.action.CALL -d [tel:10086](tel:10086)   拨打电话 + +adb shell am start -a android.intent.action.VIEW -d 百度一下,你就知道      打开网页 + +adb shell am monitor          打开软件启动监控 + + adb shell am force-stop packagename          强制关闭app + +Pm 命令(package manager) + +Adb shell pm list package          列出安装包所有应用名 + +Adb shell pm list package -3      列出所有第三方包 + +Adb shell pm dump packagename           应用详细信息 + +Adb shell pm path       安装的应用包的apk 位置 + +Adb shell pm install     安装设备上的apk + +adb shell pm clear  包名   清理程序数据 + +Input 命令 + +Adb shell input text aimomo             键盘输入aimomo + +Adb shell input tap 300 700              模拟点击x=300,y=700 + +Adb shell input keyevent KEYCODE_HOME 模拟点击home键 + +Adb shell input swipe 300 500 300 900 模拟滑动 + +adb 常用命令使用指南,希望对你有帮助 + +1、 adb devices 查看设备列表 + +查看电脑已连接Android 设备列表,多行显示表示连接多个Android设备,每行前面的字符串表示Android设备的SN号 + +2、adb  get-state 获取连接状态 device offline unkown + +3、adb install -r  APK路径 安装应用 + +apk文件所在的文件路径,包括apk,如D:/hello.apk,注意需要打开的cmd路径不要带有中文,否则,部分电脑可能会提示安装失败 + +4、adb uninstall 应用包名,应用卸载   查看自己安装的包名,adb uninstall -k hello.apk 下载应用,但保留缓存数据 + +5、adb connect 设备ip地址,如果电脑与设备在同一局域网内,Android设备的连接ip 地址,可连接成功 + +6、adb push 电脑上的文件 路径 sdcard/  将电脑的文件输入到手机上 + +      如文件D:/hello.apk, adb push D:/hello.apk  /sdcard、hello.apk + +7、adb pull  /sdcard/文件路径 指定的pc目录,将文件拷贝到pc,文件保存的路径直接与cmd打开的路径相同 + +8、adb reboot 或加参数-p设备进行重启 + +9、 adb shell pm clear 包名 清除应用数据 + +10 、adb shell pm list packages -3 查看第三方安装的应用包名,卸载应用前,一般可通过该指令查看包名 + +11、adb shell am force-stop 包名 关闭应用 + +12、adb shell screencap /sdcard/screen.png  截屏幕 + +13、adb shell screenrecord /sdcard/hello.mp4 屏幕视频录制,测试时可使用 + +14、adb logcat 抓取日志 + +如果要过滤日志,可通过adb logcat | findstr "输入过滤的内容" + +15、adb shell wm size 查看屏幕大小 + +16、 adb shell getprop查看配置信息 + +如:adb shell getprop ro.build.version.sdk 查看api版本 + +17、adb shell input keyevent 4 相当于返回键,返回上一页 + +18、adb shell df 查看手机存储信息 + +19、adb shell  pm disable-user com.android.launcher3 禁用系统应用 + +20、 adb shell pm enable com.android.launcher3 启用系统 ,需要root权限 + +21、adb start-server | kill-server //启动或关闭adb服务进程 + +22、adb shell cat /sys/class/net/wlan0/address   //获取mac地址 + +23、adb shell monkey -p 包名 --throttle 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v –s 1540475754297 100  monkey测试 + +24、adb shell ls /system/bin  查看当前设备可以使用的所有命令 + +25、adb shell input text "[www.baidu.com](http://www.baidu.com)",在编辑的文本框中输入编辑文字 + +26、adb shell svc wifi enable | disable   打开或关闭wifi + +27、adb shell svc data enable |disable 打开或关闭移动网络 + +28、adb shell input swipe 760 500 600 320 点击屏幕,根据实际坐标点击 + +29、adb shell mkdir   /sdcard/创建目录 + +30、cat /proc/cpuinfo // 查看CPU信息,如果为内存,则cat/proc/meminfo + +31、cat /data/misc/wifi/*.conf 查看wifi密码,需要root权限 + +32、 mount -o remount,rw / 当root权限之后,仍提示file system read only时,先执行adb root ,接着执行adb remount, mount -o remount,rw / 然后执行该指令 + +33、(1)setprop service.adb.tcp.port 5555 (2)stop adbd (3)start adbd 使用wifi连接失败时, + +34、adb shell dumpsys activity | findstr “mFocus” 获取当前的activity + +35、adb shell settings put global policy_control immersive.full=* + +36、仅隐藏状态栏:adb shell settings put global policy_control immersive.status=* + +37、仅隐藏虚拟键:adb shell settings put global policy_control immersive.navigation=* + +38、恢复:adb shell settings put global policy_control null + +39、完全隐藏  adb shell wm overscan 0,0,0,0 + +40、旋转屏幕 \ No newline at end of file diff --git a/docs/Obsidian/adb调试命令/常用linux命令.md b/docs/Obsidian/adb调试命令/常用linux命令.md new file mode 100644 index 0000000..e87671c --- /dev/null +++ b/docs/Obsidian/adb调试命令/常用linux命令.md @@ -0,0 +1,2863 @@ +目录 + +一、进程管理 + +二、系统信息 + +三、关机 (系统的关机、重启以及登出 ) + +四、文件和目录 + +五、文件搜索 + +六、挂载一个文件系统 + +七、磁盘空间 + +八、系统负载 -- top + +九、用户和群组 + +十、文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消 + +十一、文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消 + +十二、打包和压缩文件 + +十三、OS包管理器 + +①、RPM 包 - (Fedora, Redhat及类似系统) + +②、YUM 软件包升级器 - (Fedora, RedHat及类似系统) + +③、DEB 包 (Debian, Ubuntu 以及类似系统) + +④、APT 软件工具 (Debian, Ubuntu 以及类似系统) + +十四、文本查看、处理 + +①、查看文件内容 + +②、文本处理 + +十五、vim专题 + +①、大小写转换 + +②、字符串处理专题 + +③、vi中文本操作 + +④、vim基础操作 + +⑤、shell脚本中的注释(单行注释/多行注释) + +十五、字符设置和文件格式转换 + +十六、文件系统分析 + +十七、初始化一个文件系统 + +十八、SWAP文件系统 + +十九、备份 + +二十、光盘操作 + +二一、网络 - (以太网和WIFI无线) + +二二、JPS工具 + +二三、crontab调度器 + +①、语法 + +二四、Shell编程相关 + +①、内置变量 + +②、数据结构 + +1、数组 + +for i in in {1..10}; do rm -f hadoop-cmf-hive-HIVEMETASTORE-nn1.testhdp.com.log.out.$i;done + +2、字典dict 或 Map + +3、管道输出中执行下一条指令 + +4、循环、迭代逻辑控制 + +5、break 与 contine区别 + +6、大文件拆分处理 + +7、awk + +8、实现脚本中切换用户并执行该用户相关的命令操作 + +③、echo在shell中控制颜色&闪烁显示 + +1、在shell中显示色彩 + +​ + +二十五、程序开机自启动服务配置 + +二十六、持续监控Linux命令的执行情况 + +Linux和windows相比,很多管控都需要用命令来操作。windows以直观的可视化的方式操作,特别适合在桌面端PC上操作执行相应的软件。 + +而Linux命令行方式的操作,特别是在服务器端编程、管理、运维方面,更加简单、短小、精悍。短短一行组合命令,即可完成在windows需要各种加工、整合的复杂高效的功能操作。 + +一、进程管理 + +w 显示当前在线用户情况 + +my_adm pts/0    111.111.111.111    三15   24:58   2:51   0.02s sshd: my_admin [priv] + +root     pts/3    111.111.111.112      13:15    3:47m  0.35s  0.35s -bash + +my_adm pts/5    111.111.111.113    15:14    2.00s  0.54s  0.02s sshd: my_admin [priv] + +pkill -kill -t pts/??  杀掉指定名字的进程,如上述的pts/5 + +传送门:Linux中Kill进程的N种方法 + +二、系统信息 + +arch 显示机器的处理器架构(1) + +uname -m 显示机器的处理器架构(2) + +uname -r 显示正在使用的内核版本 + +dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) + +hdparm -i /dev/hda 罗列一个磁盘的架构特性 + +hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 + +cat /proc/cpuinfo 显示CPU info的信息 + +cat /proc/interrupts 显示中断 + +cat /proc/meminfo 校验内存使用 + +cat /proc/swaps 显示哪些swap被使用 + +cat /proc/version 显示内核的版本 + +cat /proc/net/dev 显示网络适配器及统计 + +cat /proc/mounts 显示已加载的文件系统 + +lspci -tv 罗列 PCI 设备 + +lsusb -tv 显示 USB 设备 + +date 显示系统日期 + +ctime=`date +%Y-%m-%dT%k:%M:%S` #格式化时间,如2018-01-13T11:09:19, 注意%k 与 %H的区别,前者返回9,后者返回09. + +YESTERDAY=`date +%Y-%m-%d -d "-1 days"` 获取昨日日期 + +cal 2007 显示2007年的日历表 + +date 041217002007.00 设置日期和时间 - 月日时分年.秒 + +clock -w 将时间修改保存到 BIOS + +查询网关地址(如将centos服务器网络获取类型由dhcp切换为static时,需要获取到ip及网关信息进行固化配置时会用到,如本地ip为10.34.0.123,则通过如下命令查询到网关为第一个3.254): + +[root@file-server ~]# netstat -rn + +Kernel IP routing table + +Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface + +0.0.0.0         10.34.3.254     0.0.0.0         UG        0 0          0 enp3g0 + +10.34.0.0       0.0.0.0         255.255.252.0   U         0 0          0 enp3g0 + +192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 virbr0 + +CentOS / RedHat 系列,查看操作系统信息(如果没有lsb_release命令, 使用"yum install redhat-lsb"安装): + +[root@server-test online]# lsb_release -a + +LSB Version:    :core-4.1-amd64:core-4.1-noarch + +Distributor ID:    CentOS + +Description:    CentOS Linux release 7.5.1804 (Core) + +Release:    7.5.1804 + +Codename:    Core + +三、关机 (系统的关机、重启以及登出 ) + +shutdown -h now 关闭系统(1) + +init 0 关闭系统(2) + +telinit 0 关闭系统(3) + +shutdown -h hours:minutes & 按预定时间关闭系统 + +shutdown -c 取消按预定时间关闭系统 + +shutdown -r now 重启(1) + +reboot 重启(2) + +logout 注销 + +四、文件和目录 + +cd /home 进入 '/ home' 目录' + +cd .. 返回上一级目录 + +cd ../.. 返回上两级目录 + +cd 进入个人的主目录 + +cd ~user1 进入个人的主目录 + +cd - 返回上次所在的目录 + +pwd 显示工作路径 + +ls 查看目录中的文件 + +ls -F 查看目录中的文件 + +ls -l 显示文件和目录的详细资料 + +ls -a 显示隐藏文件 + +ls *[0-9]* 显示包含数字的文件名和目录名 + +tree 显示文件和目录由根目录开始的树形结构(1) + +lstree 显示文件和目录由根目录开始的树形结构(2) + +mkdir dir1 创建一个叫做 'dir1' 的目录' + +mkdir dir1 dir2 同时创建两个目录 + +mkdir -p /tmp/dir1/dir2 创建一个目录树 + +rm -f file1 删除一个叫做 'file1' 的文件' + +rmdir dir1 删除一个叫做 'dir1' 的目录' + +rm -rf dir1 删除一个叫做 'dir1' 的目录并同时删除其内容 + +rm -rf dir1 dir2 同时删除两个目录及它们的内容 + +mv dir1 new_dir 重命名/移动 一个目录 + +cp file1 file2 复制一个文件 + +cp dir/* . 复制一个目录下的所有文件到当前工作目录 + +cp -a /tmp/dir1 . 复制一个目录到当前工作目录 + +cp -a dir1 dir2 复制一个目录 + +ln -s file1 lnk1 创建一个指向文件或目录的软链接 + +ln file1 lnk1 创建一个指向文件或目录的物理链接 + +touch -t 0712250000 file1 修改一个文件或目录的时间戳 - (YYMMDDhhmm) + +file file1 outputs the mime type of the file as text + +iconv -l 列出已知的编码 + +iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding. + +find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick) + +五、文件搜索 + +find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录 + +find / -user user1 搜索属于用户 'user1' 的文件和目录 + +find /home/user1 -name \*.bin 在目录 '/ home/user1' 中搜索带有'.bin' 结尾的文件 + +find /usr/bin -type f -atime +100 搜索在过去100天内未被使用过的执行文件 + +find /usr/bin -type f -mtime -10 搜索在10天内被创建或者修改过的文件 + +find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 结尾的文件并定义其权限 ^                        find /tmp -name \*.hprof -exec rm -f {} \;批量删除java堆栈.hprof文件 + +find / -xdev -name \*.rpm 搜索以 '.rpm' 结尾的文件,忽略光驱、捷盘等可移动设备 + +locate \*.ps 寻找以 '.ps' 结尾的文件 - 先运行 'updatedb' 命令 + +whereis halt 显示一个二进制文件、源码或man的位置 + +which halt 显示一个二进制文件或可执行文件的完整路径 + +grep -rn "query_string" *  Linux目录下全局查找所有文件中是否包含指定字符串(-r:递归;-n:显示行号) + +六、挂载一个文件系统 + +mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 + +umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载点 '/ mnt/hda2' 退出 + +fuser -km /mnt/hda2 当设备繁忙时强制卸载 + +umount -n /mnt/hda2 运行卸载操作而不写入 /etc/mtab 文件- 当文件为只读或当磁盘写满时非常有用 + +mount /dev/fd0 /mnt/floppy 挂载一个软盘 + +mount /dev/cdrom /mnt/cdrom 挂载一个cdrom或dvdrom + +mount /dev/hdc /mnt/cdrecorder 挂载一个cdrw或dvdrom + +mount /dev/hdb /mnt/cdrecorder 挂载一个cdrw或dvdrom + +mount -o loop file.iso /mnt/cdrom 挂载一个文件或ISO镜像文件 + +mount -t vfat /dev/hda5 /mnt/hda5 挂载一个Windows FAT32文件系统 + +mount /dev/sda1 /mnt/usbdisk 挂载一个usb 捷盘或闪存设备 + +mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 挂载一个windows网络共享 + +七、磁盘空间 + +df -h 显示已经挂载的分区列表 + +ls -lSr |more 以尺寸大小排列文件和目录 + +du -sh dir1 估算目录 'dir1' 已经使用的磁盘空间' + +du -sk * | sort -rn 以容量大小为依据依次显示文件和目录的大小 + +rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) + +dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小为依据显示已安装的deb包所使用的空间 (ubuntu, debian类系统) + +hdfs dfs -du /dw/default | sort -rn | head -n 10 | awk '{printf("%.2f\t\t%.2f\t\t%s\t\n",$1/1024/1024/1024,"\t"$2/1024/1024/1024,"\t"$3)}'  查询hdfs文件系统中表文件大小,按从大到小的顺序排列(取前10列),单位GB + +八、系统负载 -- top + +top -d 20 -p 1303                             将进程号1303的系统负载,每隔20秒刷新一次。英文状态下,按住c键,将展示进行的详细环境信息,对于java程序调试来说,非常友好。 + +top -d 20 -n 3 -b > test.txt                  每隔20秒,一共执行3次, 将统计结果导入到test.txt文件中。           + +top命令显示不全,添加-w参数: + +命令为: + +top -b -n 1 + +-b为 批处理模式,-n为刷新的次数 + +发现信息显示不全,最后man top,加一个参数w后,完全显示 + +top -b -n 1 -w 512 + +如果需要显示完整的COMMAND命令,使用top -c参数 + +top -c -bw 500 + +查看完整进程名, 按500个字符长度查看(这样基本可以查看到完整的命令) + +其他参数列表,官方解释: + +1. COMMAND-LINE Options + +       The command-line syntax for top consists of: + +         -hv|-bcHiOSs -d secs -n max -u|U user -p pid -o fld -w [cols] + +       The typically mandatory switch ('-') and even whitespace are completely optional. + +       -h | -v  :Help/Version + +            Show library version and the usage prompt, then quit. + +       -b  :Batch-mode operation + +            Starts top in Batch mode, which could be useful for sending output from top to other programs or to a file.  In this mode, top will not accept input and runs until the iterations limit you've set with the `-n' command-line option or until killed. + +       -c  :Command-line/Program-name toggle + +            Starts top with the last remembered `c' state reversed.  Thus, if top was displaying command lines, now that field will show program names, and visa versa.  See the `c' interactive command for additional information. + +       -d  :Delay-time interval as:  -d ss.t (secs.tenths) + +            Specifies the delay between screen updates, and overrides the corresponding value in one's personal configuration file or the startup default.  Later this can be changed with the `d' or `s' interactive commands. + +            Fractional  seconds  are honored, but a negative number is not allowed.  In all cases, however, such changes are prohibited if top is running in Secure mode, except for root (unless the `s' command-line option was used).  For additional information on + +            Secure mode see topic 6a. SYSTEM Configuration File. + +       -H  :Threads-mode operation + +            Instructs top to display individual threads.  Without this command-line option a summation of all threads in each process is shown.  Later this can be changed with the `H' interactive command. + +       -i  :Idle-process toggle + +            Starts top with the last remembered `i' state reversed.  When this toggle is Off, tasks that have not used any CPU since the last update will not be displayed.  For additional information regarding this toggle see topic 4c. TASK AREA Commands, SIZE. + +       -n  :Number-of-iterations limit as:  -n number + +            Specifies the maximum number of iterations, or frames, top should produce before ending. + +       -o  :Override-sort-field as:  -o fieldname + +            Specifies the name of the field on which tasks will be sorted, independent of what is reflected in the configuration file.  You can prepend a `+' or `-' to the field name to also override the sort direction.  A leading `+' will force sorting  high  to + +            low, whereas a `-' will ensure a low to high ordering. + +            This option exists primarily to support automated/scripted batch mode operation. + +       -O  :Output-field-names + +            This option acts as a form of help for the above -o option.  It will cause top to print each of the available field names on a separate line, then quit.  Such names are subject to nls translation. + +       -p  :Monitor-PIDs mode as:  -pN1 -pN2 ...  or  -pN1,N2,N3 ... + +            Monitor only processes with specified process IDs.  This option can be given up to 20 times, or you can provide a comma delimited list with up to 20 pids.  Co-mingling both approaches is permitted. + +            A pid value of zero will be treated as the process id of the top program itself once it is running. + +            This is a command-line option only and should you wish to return to normal operation, it is not necessary to quit and restart top  --  just issue any of these interactive commands: `=', `u' or `U'. + +            The `p', `u' and `U' command-line options are mutually exclusive. + +       -s  :Secure-mode operation + +            Starts top with secure mode forced, even for root.  This mode is far better controlled through the system configuration file (see topic 6. FILES). + +       -S  :Cumulative-time toggle + +            Starts  top  with  the  last  remembered `S' state reversed.  When Cumulative time mode is On, each process is listed with the cpu time that it and its dead children have used.  See the `S' interactive command for additional information regarding this + +            mode. + +       -u | -U  :User-filter-mode as:  -u | -U number or name + +            Display only processes with a user id or user name matching that given.  The `-u' option matches on  effective user whereas the `-U' option matches on any user (real, effective, saved, or filesystem). + +            Prepending an exclamation point ('!') to the user id or name instructs top to display only processes with users not matching the one provided. + +            The `p', `u' and `U' command-line options are mutually exclusive. + +       -w  :Output-width-override as:  -w [ number ] + +            In Batch mode, when used without an argument top will format output using the COLUMNS= and LINES= environment variables, if set.  Otherwise, width will be fixed at the maximum 512 columns.  With an argument, output width can be decreased or  increased + +            (up to 512) but the number of rows is considered unlimited. + +            In normal display mode, when used without an argument top will attempt to format output using the COLUMNS= and LINES= environment variables, if set.  With an argument, output width can only be decreased, not increased.  Whether using environment vari‐ + +            ables or an argument with -w, when not in Batch mode actual terminal dimensions can never be exceeded. + +            Note: Without the use of this command-line option, output width is always based on the terminal at which top was invoked whether or not in Batch mode. + +九、用户和群组 + +groupadd group_name 创建一个新用户组 + +groupdel group_name 删除一个用户组 + +groupmod -n new_group_name old_group_name 重命名一个用户组 + +useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 "admin" 用户组的用户 + +useradd user1 创建一个新用户 + +userdel -r user1 删除一个用户 ( '-r' 排除主目录) + +usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性 + +passwd 修改口令 + +passwd user1 修改一个用户的口令 (只允许root执行) + +chage -E 2005-12-31 user1 设置用户口令的失效期限 + +pwck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的用户 + +grpck 检查 '/etc/passwd' 的文件格式和语法修正以及存在的群组 + +newgrp group_name 登陆进一个新的群组以改变新创建文件的预设群组 + +案例 1: + +#### 1-创建用户、2-追加附加组、3-删除附加组 + +# 1 + +useradd san_zhang -m + +passwd san_zhang san_zhang@163.com + +# 从管道输出中修改密码(如果非root且可以转为root,请使用sudo) + +echo san_zhang@163.com | sudo passwd --stdin san_zhang + +#----------------------------------------------------- + +# 2 + +usermod -aG hdfs san_zhang (将san_zhang追加到附加组hdfs中(可以添加多个附加组,多个组之间用空格隔开,如"hdfs,yarn,spark"),其默认在san_zhang中) + +此时查看其所在的用户组,可以发现其所属组为san_zhang,附加组为hdfs,如下: + +id san_zhang + +uid=1001(san_zhang) gid=1001(san_zhang) groups=1001(san_zhang),992(hdfs) + +引申: + +如果上一步顺序写错,误将hdfs追加到san_zhang用户组中,如使用了如下错误的命令: + +usermod -aG san_zhang hdfs + +则此时查看hdfs所属组,就会发现其也在san_zhang组下了 + +id hdfs + +uid=995(hdfs) gid=992(hdfs) groups=992(hdfs),994(hadoop),1001(san_zhang) + +这时再查看san_zhang组,就会看到误加入的hdfs用户了 + +groups san_zhang + +san_zhang : san_zhang hdfs + +#----------------------------------------------------- + +# 3 + +gpasswd -d hdfs san_zhang (从san_zhang组中删除误加入的hdfs用户) + +执行后的日志:Removing user hdfs from group san_zhang + +#----------------------------------------------------- + +案例 2: + +统计某个分组下有哪些用户 + +[root@cdh01 ~]# grep hdfs /etc/group + +hdfs:x:993: + +[root@cdh01 ~]# awk -F : '{print $1,$4}' /etc/passwd | grep '993' + +hdfs 993 + +十、文件的权限 - 使用 "+" 设置权限,使用 "-" 用于取消 + +ls -lh 显示权限 + +ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 + +chmod ugo+rwx directory1 设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限 + +chmod go-rwx directory1 删除群组(g)与其他人(o)对目录的读写执行权限 + +chown user1 file1 改变一个文件的所有人属性 + +chown -R user1 directory1 改变一个目录的所有人属性并同时改变改目录下所有文件的属性 + +chgrp group1 file1 改变文件的群组 + +chown user1:group1 file1 改变一个文件的所有人和群组属性 + +find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件 + +chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 - 运行该文件的用户也被赋予和所有者同样的权限 + +chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 + +chmod g+s /home/public 设置一个目录的SGID 位 - 类似SUID ,不过这是针对目录的 + +chmod g-s /home/public 禁用一个目录的 SGID 位 + +chmod o+t /home/public 设置一个文件的 STIKY 位 - 只允许合法所有人删除文件 + +chmod o-t /home/public 禁用一个目录的 STIKY 位 + +十一、文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消 + +chattr +a file1 只允许以追加方式读写文件 + +chattr +c file1 允许这个文件能被内核自动压缩/解压 + +chattr +d file1 在进行文件系统备份时,dump程序将忽略这个文件 + +chattr +i file1 设置成不可变的文件,不能被删除、修改、重命名或者链接 + +chattr +s file1 允许一个文件被安全地删除 + +chattr +S file1 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 + +chattr +u file1 若文件被删除,系统会允许你在以后恢复这个被删除的文件 + +lsattr 显示特殊的属性 + +十二、打包和压缩文件 + +bunzip2 file1.bz2 解压一个叫做 'file1.bz2'的文件 + +bzip2 file1 压缩一个叫做 'file1' 的文件 + +gunzip file1.gz 解压一个叫做 'file1.gz'的文件 + +gzip file1 压缩一个叫做 'file1'的文件 + +gzip -9 file1 最大程度压缩 + +rar a file1.rar test_file 创建一个叫做 'file1.rar' 的包 + +rar a file1.rar file1 file2 dir1 同时压缩 'file1', 'file2' 以及目录 'dir1' + +unrar x file1.rar 解压rar包   #如果无unrar命令,参考:Linux CentOS 7.0 下 rar unrar的安装 + +tar -cvf archive.tar file1 创建一个非压缩的 tarball + +tar -cvf archive.tar file1 file2 dir1 创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件 + +tar -tf archive.tar 显示一个包中的内容 + +tar -xvf archive.tar 释放一个包 + +tar -xvf archive.tar -C /tmp 将压缩包释放到 /tmp目录下 + +tar -cvfj archive.tar.bz2 dir1 创建一个bzip2格式的压缩包 + +tar -jxvf archive.tar.bz2 解压一个bzip2格式的压缩包 + +tar -cvfz archive.tar.gz dir1 创建一个gzip格式的压缩包 + +tar -zxvf archive.tar.gz 解压一个gzip格式的压缩包 + +zip file1.zip file1 创建一个zip格式的压缩包 + +zip -r file1.zip file1 file2 dir1 将几个文件和目录同时压缩成一个zip格式的压缩包 + +unzip file1.zip 解压一个zip格式压缩包 + +十三、OS包管理器 + +①、RPM 包 - (Fedora, Redhat及类似系统) + +rpm -ivh package.rpm 安装一个rpm包 + +rpm -ivh --nodeps package.rpm 安装一个rpm包而忽略依赖关系警告 + +rpm -U package.rpm 更新一个rpm包但不改变其配置文件 + +rpm -F package.rpm 更新一个确定已经安装的rpm包 + +rpm -e [--nodeps] package_name.rpm 删除一个rpm包[--nodeps表示忽略依赖关系] + +rpm -qa 显示系统中所有已经安装的rpm包 + +rpm -qa | grep httpd 显示所有名称中包含 "httpd" 字样的rpm包 + +rpm -qi package_name 获取一个已安装包的特殊信息 + +rpm -qg "System Environment/Daemons" 显示一个组件的rpm包 + +rpm -ql package_name 显示一个已经安装的rpm包提供的文件列表 + +rpm -qc package_name 显示一个已经安装的rpm包提供的配置文件列表 + +rpm -q package_name --whatrequires 显示与一个rpm包存在依赖关系的列表 + +rpm -q package_name --whatprovides 显示一个rpm包所占的体积 + +rpm -q package_name --scripts 显示在安装/删除期间所执行的脚本l + +rpm -q package_name --changelog 显示一个rpm包的修改历史 + +rpm -qf /etc/httpd/conf/httpd.conf 确认所给的文件由哪个rpm包所提供 + +rpm -qp package.rpm -l 显示由一个尚未安装的rpm包提供的文件列表 + +rpm --import /media/cdrom/RPM-GPG-KEY 导入公钥数字证书 + +rpm --checksig package.rpm 确认一个rpm包的完整性 + +rpm -qa gpg-pubkey 确认已安装的所有rpm包的完整性 + +rpm -V package_name 检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 + +rpm -Va 检查系统中所有已安装的rpm包- 小心使用 + +rpm -Vp package.rpm 确认一个rpm包还未安装 + +rpm2cpio package.rpm | cpio --extract --make-directories *bin* 从一个rpm包运行可执行文件 + +rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 从一个rpm源码安装一个构建好的包 + +rpmbuild --rebuild package_name.src.rpm 从一个rpm源码构建一个 rpm 包 + +②、YUM 软件包升级器 - (Fedora, RedHat及类似系统) + +yum install package_name 下载并安装一个rpm包 (如: yum -y install zip unzip) + +yum localinstall package_name.rpm 将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 + +yum update package_name.rpm 更新当前系统中所有安装的rpm包 + +yum update package_name 更新一个rpm包 + +yum remove package_name 删除一个rpm包 + +yum list | grep tmux  列出所有可安裝的软件清单命令 + +yum search package_name 在rpm仓库中搜寻软件包 + +yum clean packages 清理rpm缓存删除下载的包 + +yum clean headers 删除所有头文件 + +yum clean all 删除所有缓存的包和头文件 + +③、DEB 包 (Debian, Ubuntu 以及类似系统) + +dpkg -i package.deb 安装/更新一个 deb 包 + +dpkg -r package_name 从系统删除一个 deb 包 + +dpkg -l 显示系统中所有已经安装的 deb 包 + +dpkg -l | grep httpd 显示所有名称中包含 "httpd" 字样的deb包 + +dpkg -s package_name 获得已经安装在系统中一个特殊包的信息 + +dpkg -L package_name 显示系统中已经安装的一个deb包所提供的文件列表 + +dpkg --contents package.deb 显示尚未安装的一个包所提供的文件列表 + +dpkg -S /bin/ping 确认所给的文件由哪个deb包提供 + +④、APT 软件工具 (Debian, Ubuntu 以及类似系统) + +apt-get install package_name 安装/更新一个 deb 包 + +apt-cdrom install package_name 从光盘安装/更新一个 deb 包 + +apt-get update 升级列表中的软件包 + +apt-get upgrade 升级所有已安装的软件 + +apt-get remove package_name 从系统删除一个deb包 + +apt-get check 确认依赖的软件仓库正确 + +apt-get clean 从下载的软件包中清理缓存 + +apt-cache search searched-package 返回包含所要搜索字符串的软件包名称 + +十四、文本查看、处理 + +①、查看文件内容 + +cat file1 从第一个字节开始正向查看文件的内容 + +tac file1 从最后一行开始反向查看一个文件的内容 + +more file1 查看一个长文件的内容 + +less file1 类似于 'more' 命令,但是它允许在文件中和正向操作一样的反向操作 + +head -2 file1 查看一个文件的前两行 + +tail -2 file1 查看一个文件的最后两行 + +tail -f /var/log/messages 实时查看被添加到一个文件中的内容 + +②、文本处理 + +cat file1 file2 ... | command <> file1_in.txt_or_file1_out.txt general syntax for text manipulation using PIPE, STDIN and STDOUT + +cat file1 | command( sed, grep, awk, grep, etc...) > result.txt 合并一个文件的详细说明文本,并将简介写入一个新文件中 + +cat file1 | command( sed, grep, awk, grep, etc...) >> result.txt 合并一个文件的详细说明文本,并将简介写入一个已有的文件中 + +grep Aug /var/log/messages 在文件 '/var/log/messages'中查找关键词"Aug" + +grep ^Aug /var/log/messages 在文件 '/var/log/messages'中查找以"Aug"开始的词汇 + +grep [0-9] /var/log/messages 选择 '/var/log/messages' 文件中所有包含数字的行 + +grep Aug -R /var/log/* 在目录 '/var/log' 及随后的目录中搜索字符串"Aug" + +grep -E 'string_1|string_2' /var/log/test.log 在日志中同时查询包含 string_1或包含string_2的记录 + +# 匹配redis中, field 中包含以1到4位数字开头,以"_已下单"结尾的字符, 并将其 value 值带出来(-A1) + +redis-cli -h 111.111.111.111 -p 7001 -c -a ${PASSWORD} --raw hgetall 2022-03-24_ORDER_STAT | grep -E "^[[:digit:]]{1,4}_已下单" -A1 + +grep -Hnr docker * 在本层或子文件夹里递归查找包含指定字符“docker”的文件,并显示文件名+行号,如果精确匹配文本,加o参数。参数含义:(H:每次匹配时将文件名打印出来;n:打印字符串所在的行号;r:递归查找;o:精确匹配到单词,多一个字符都不行) + +“grep显示匹配行的上下行内容”专题: + +grep -A2 2 test.txt  返回匹配行和匹配行的后两行 + +grep -B2 2 test.txt  返回匹配行和匹配行的前两行 + +grep -C2 2 text.txt 或者 grep -A2 -B2 2 test.txt 返回匹配行和匹配行的前后两行 + +-A -B -C 后面跟阿拉伯数字 + +-A 返回匹配后和它后面的n行,(After,之后)。 + +-B 返回匹配行和它前面的n行,(Before,之前)。 + +-C 返回匹配行和它前后各n行,通-A和-B联用,(Context,上下文即前后)。 + +sed -i 's/string1/string2/g' example.txt 将example.txt文件中的 "string1" 替换成 "string2"(如果不加-i参数,则在内存中替换; 添加-i参数,则在文件中直接替换) + +sed '/^$/d' example.txt 从example.txt文件中删除所有空白行 + +sed '/ *#/d; /^$/d' example.txt 从example.txt文件中删除所有注释和空白行 + +echo 'hElloWorld' | tr '[:lower:]' '[:upper:]' 找出所有的小写字母并全部替换为大写字母 + +sed -e '1d' result.txt 从文件example.txt 中排除第一行 + +sed -n '/string1/p' 查看只包含词汇 "string1"的行 + +sed -e 's/ *$//' example.txt 删除每一行最后的空白字符 + +sed -e 's/string1//g' example.txt 从文档中只删除词汇 "string1" 并保留剩余全部 + +sed -n '1,5p;5q' example.txt 查看从第一行到第5行内容 + +sed -n '5p;5q' example.txt 查看第5行 + +sed -e 's/00*/0/g' example.txt 用单个零替换多个零 + +sed -i '3i helloword' test.txt   在test.txt文件的第三行插入‘helloword’字符串 + +“sed按指定字符串删除”专题: + +用sed删除匹配到字符串的行: + +语法:sed-i'/关键字符/d'文件名 + +举例1:匹配"\etc\install.sh" + +set -i '/\/etc\/install.sh/d' 1.txt + +/ 搜索 + +匹配\/etc\/install.sh,就是“/etc/install.sh” + +-i 表示操作在源文件上生效.否则操作内存中数据,并不写入文件中. + +在分号内的/d表示删除匹配的行。 + +举例2: + +删除以a开头的行 + +sed -i '/^a.*/d' tmp.txt + +^a表示开头是a, .*表示后跟任意字符串 + +Example-1:  使用sed进行文本批量替换 + +#!/bin/bash + +ddl_file_path=/c/Users/user/Downloads/sqoop_data/hive_2_mysql + +ls $ddl_file_path | while read f; + +do + +echo "--------->"$ddl_file_path/$f + +## Template + +#sed -i 's///g' $ddl_file_path/$f + +#sed -i "s///g" $ddl_file_path/$f + +sed -i 's/111.111.111.111:3306/222.222.222.222:3307/g' $ddl_file_path/$f + +sed -i "s/'password_1'/'password_2'/g" $ddl_file_path/$f + +done + +# echo -e "=========>\n\t Files contains keyword "/WARN:" in path $ddl_file_path are deleted!!!" + +#!/bin/bash + +set -x + +## Template + +#sed -i 's///g' $ddl_file_path/$f + +#sed -i "s///g" $ddl_file_path/$f + +## Func 1 - 实现在所有文件的第四行、第五行插入指定文本 + +ddl_file_path=/e/迅雷下载/user_data_after + +ls $ddl_file_path | while read f; + +do    + +    # 如果文件不是文件夹类型,才允许插入操作 + +    if [ ! -d $f ];then + +        echo "--------->"$ddl_file_path/$f + +        sed -i '4i retries=10' $ddl_file_path/$f + +        sed -i '5i retry.backoff=3' $ddl_file_path/$f + +    fi + +done + +## Func 2 - 如果文件夹不存在,则创建;反之提示文件已存在 + +if [ ! -d "beijing" ];then + +    mkdir beijing + +else + +    echo "File already exists" + +fi + +文件类型的参数判别大全: + +shell脚本判断文件类型 + +shell判断文件,目录是否存在或者具有权限 + +#!/bin/sh + +myPath="/var/log/httpd/" + +myFile="/var/log/httpd/access.log" + +# 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限 + +if [ ! -x "$myPath"]; then + +mkdir "$myPath" + + fi + + # 这里的-d 参数判断$myPath是否存在 + + if [ ! -d "$myPath"]; then + + mkdir "$myPath" + + 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 + +文件的判别逻辑大全: + +-------------------------------------------------------------------- + +-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 参数的区别 + +cat -n file1 标示文件的行数 + +cat example.txt | awk 'NR%2==1' 删除example.txt文件中的所有偶数行 + +echo a b c | awk '{print $1}' 查看一行第一栏 + +echo a b c | awk '{print $1,$3}' 查看一行的第一和第三栏 + +paste file1 file2 合并两个文件或两栏的内容 + +paste -d '+' file1 file2 合并两个文件或两栏的内容,中间用"+"区分 + +sort file1 file2 排序两个文件的内容 + +sort file1 file2 | uniq 取出两个文件的并集(重复的行只保留一份) + +sort file1 file2 | uniq -u 删除交集,留下其他的行 + +sort file1 file2 | uniq -d 取出两个文件的交集(只留下同时存在于两个文件中的文件) + +comm -1 file1 file2 比较两个文件的内容只删除 'file1' 所包含的内容 + +comm -2 file1 file2 比较两个文件的内容只删除 'file2' 所包含的内容 + +comm -3 file1 file2 比较两个文件的内容只删除两个文件共有的部分 + +综合案例: + +①:本机tcp各种状态数统计 + +netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' + +CLOSE_WAIT 2 + +ESTABLISHED 276 + +SYN_SENT 2 + +TIME_WAIT 63270 + +awk 'BEGIN { + +   sum = 0; for (i = 0; i < 20; ++i) { + +      sum += i; if (sum > 50) exit(10); else print "Sum =", sum + +   } + +}' + +②:使用cut提取文本字符串: + +按“:”分割,提取/etc/passwd中第1,3,4,5列数据,按原分隔符":"进行拼接。 + +[hdfs@cdh01 test]$ head -n 5 /etc/passwd | cut -d : -f 1,3-5 + +root:0:0:root + +bin:1:1:bin + +daemon:2:2:daemon + +adm:3:4:adm + +xixi:4:7:xixi + +③:使用uniq进行滤重 + +cut的具体用法,如下: + +A).去除重复行 + +sort target_file | uniq + +B).查找非重复行 + +sort target_file | uniq -u + +C).查找重复行 + +sort target_file | uniq -d + +D).统计每一个文件出现的次数 + +sort target_file | uniq -c + +④:排序 + +sort linux下的排序工具 + + 参数说明: + +-r降序排列 + +-u去重 + +-n以数字大小排序(默认是首字母排序) + +-t指定分隔符 这里我们指定'|'为分隔符 + +-k指定分隔后的第几位进行排序 这里我们指定第2位 + +任务:report.txt文件里有以下内容:记录了一些方法的执行时间,要求按执行时间降序排列. + +命令:sort -run -k 2 -t '|' report.txt + + 1 void com.dustpan.zeus.core.service.MergeService.startService(int)|2 + + 2 void com.dustpan.zeus.core.service.InitShopDateService.startService(int)|1 + + 3 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|475 + + 4 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|96 + + 5 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|1013 + + 6 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|184 + + 7 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|729 + + 8 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|14 + + 9 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|394 + +10 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|90 + +11 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|569 + +12 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|796 + +13 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|1648 + +14 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|82 + +15 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|1018 + +16 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|14 + +17 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|937 + +18 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|17 + +19 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|601 + +20 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|52 + +21 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|5081 + +22 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|388 + +23 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|198 + +24 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|11 + +25 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|203 + +26 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|11 + +27 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|241 + +28 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|13 + +29 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|176 + +30 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|12 + +31 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|206 + +32 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|33 + +33 boolean com.dustpan.zeus.core.service.MergeService.executeGePrintSyncTask()|242 + +34 boolean com.dustpan.zeus.core.service.InitShopDateService.executeInitShopTask()|19 + +案例一、找出本文件夹中包含my_test_calendar关键字的所有文件(含全路径+文件名),并滤重。 + +查询hive_sh目录下,包含搜索关键字'my_test_calendar'的文本出现的文件及关键字所在的行,将文件(文件路径+文件名) 字段提取出来,并做滤重处理。 + +[hdfs@nn1 hive_sh]$ find . -type f | xargs grep -rn 'my_test_calendar' | cut -d : -f 1 | uniq + +案例二、查找所有出现指定文本的文件并滤重(进阶版) + +#### # 脚本说明 + +#### + +#### 遍历 hive_tables.txt 文件中的所有表(如 hive_table_1),查找其在指定目录/data/program/hive_sh/下的文件中,是否使用到。如果查到重复出现该文本的文件,做滤重处理。 + +#### + +#### cat query_table_usage_in_hive.sh + +#### ----------------------------------------------- + +#!/bin/bash + +while read tbl + +do + +echo ------------------Handle table: $tbl-------------- + +find /data/program/hive_sh/ -type f | xargs grep -rn $tbl | cut -d : -f 1 | uniq > ./output/${tbl}_result.txt + +done < hive_tables.txt + +案例三、查找内存耗用top3的app + +ps auxw | head -1;ps auxw|sort -rn -k4|head -5 + +十五、vim专题 + +①、大小写转换 + +: vim大小写转换_郭耀今 -- 蓝天白云-CSDN博客_vim大写转小写 + +②、字符串处理专题 + +总结: + +掐头(删左侧: ①#:删左侧;②##:贪婪删左侧)去尾(删右侧: ①%:删右边;②%%:贪婪删右侧) + +1、linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 ) + +2、Linux Bash Shell字符串截取 + +3、Shell 截取字符串 + +4、shell脚本字符串截取的8种方法 + +5. Linux-shell脚本字符串截取 + +6. linux中shell变量$#,$@,$0,$1,$2的含义解释/Shell中的${}、##和%%使用范例/export + +7.Shell 命令中的特殊替换、模式匹配替换、字符串提取和替换 + +8.shell变量里的字符替换 + +③、vi中文本操作 + +vi/vim 中在每行行首或行尾插入指定字符串 + +行首 :%s/^/your_word/ + +行尾 :%s/$/your_word/ + +按键操作: + +注释(列模式方式):ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。 + +删除:先按v,进入visual模式,横向选中列的个数(如”#”注释符号,需要选中两列),再按Esc,再按ctrl+v 进入列编辑模式,向下或向上移动光标,选中注释部分,然后按d, 就会删除注释符号(#)。 + +PS:当然不一定是shell的注释符”#”,也可以是”//”,或者其他任意的字符;vim才不知道什么是注释符呢,都是字符而已。 + +案例: + +vim 列编辑模式 + +使用替换命令: + +替换命令语法: + +:[addr]s/源字符串/目标字符串/[option] + +全局替换: + +:%s/源字符串/目标字符串/g + +参数说明: + +[addr]——表示检索范围,省略时表示当前行。 + +"%":表示整个文件,同"1,$"; + +".,$":从当前行到文件尾; + +s:表示替换操作 + +[option]:表示操作类型 + +g:全局替换 + +c:表示进行确认 + +p:表示替换结果逐行显示(Ctrl+L恢复屏幕) + +省略option:默认仅对每行第一个匹配串进行替换 + +如果在源字符串和目标字符串中有特殊字符,需要使用“\”转义 + +举例: + +在全部内容的行首添加//号注释 + +:% s/^/\/\//g + +在2~50行首添加//号注释 + +:2,50 s/^/\/\//g + +在2~50行首删除//号 + +:2,50 s/^\/\///g + +全局替换(全文替换、全部替换): + +:%s/原字符/希望替换的字符/g + +④、vim基础操作 + +在命令模式下: + +1、填到指定行,如5 + +:5 + +2、跳到最后一行 + +G(shift + g) + +3、跳到行首 + +gg + +4、转到第N行,如第7行 + +7G + +5、删除所有内容 + +A).使用shift+g转到最后一行 + +B).命令模式下输入:1,.d + +引申:深处第3行到最后一行 + +A).使用shift+g转到最后一行 + +B).命令模式下输入:3,.d + +6、删除光标所在字符 + +x + +7、删除表过所在前的字符(大写X) + +X + +8、删除到下一个单词开头 + +dw + +9、删除到本单词末尾 + +de + +10、删除到本单词末尾包括标点在内 + +dE + +11、删除到前一个单词 + +db + +12、删除到前一个单词包括标点在内 + +dB + +13、删除一整行 + +dd + +14、删除光标位置到本行结尾 + +ud$ + +15、删除光标位置到本行开头 + +d0 + +在vim中 ,“.”当前行 ,“1,.”表示从第一行到当前行 ,“d”删除,3dd代表删除三行。 + +16、vim 统计单词匹配数量 + +:%s/hello world/&/gn + +上句统计hello world 在全文出现的次数 + +如果要统计从50行到100行,出现的次数,则使用: + +:50,100s/hello world//gn + +⑤、shell脚本中的注释(单行注释/多行注释) + +1、单行注释 + +"#" 置于行首位置 + +2、多行注释 + +A) 方式一 + +:< page.html 将一个文本文件转换成html + +recode -l | more 显示所有允许的转换格式 + +十六、文件系统分析 + +badblocks -v /dev/hda1 检查磁盘hda1上的坏磁块 + +fsck /dev/hda1 修复/检查hda1磁盘上linux文件系统的完整性 + +fsck.ext2 /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 + +e2fsck /dev/hda1 修复/检查hda1磁盘上ext2文件系统的完整性 + +e2fsck -j /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 + +fsck.ext3 /dev/hda1 修复/检查hda1磁盘上ext3文件系统的完整性 + +fsck.vfat /dev/hda1 修复/检查hda1磁盘上fat文件系统的完整性 + +fsck.msdos /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 + +dosfsck /dev/hda1 修复/检查hda1磁盘上dos文件系统的完整性 + +十七、初始化一个文件系统 + +mkfs /dev/hda1 在hda1分区创建一个文件系统 + +mke2fs /dev/hda1 在hda1分区创建一个linux ext2的文件系统 + +mke2fs -j /dev/hda1 在hda1分区创建一个linux ext3(日志型)的文件系统 + +mkfs -t vfat 32 -F /dev/hda1 创建一个 FAT32 文件系统 + +fdformat -n /dev/fd0 格式化一个软盘 + +mkswap /dev/hda3 创建一个swap文件系统 + +十八、SWAP文件系统 + +mkswap /dev/hda3 创建一个swap文件系统 + +swapon /dev/hda3 启用一个新的swap文件系统 + +swapon /dev/hda2 /dev/hdb3 启用两个swap分区 + +十九、备份 + +dump -0aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的完整备份 + +dump -1aj -f /tmp/home0.bak /home 制作一个 '/home' 目录的交互式备份 + +restore -if /tmp/home0.bak 还原一个交互式备份 + +rsync -rogpav --delete /home /tmp 同步两边的目录 + +rsync -rogpav -e ssh --delete /home ip_address:/tmp 通过SSH通道rsync + +rsync -az -e ssh --delete ip_addr:/home/public /home/local 通过ssh和压缩将一个远程目录同步到本地目录 + +rsync -az -e ssh --delete /home/local ip_addr:/home/public 通过ssh和压缩将本地目录同步到远程目录 + +dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr 'dd of=hda.gz' 通过ssh在远程主机上执行一次备份本地磁盘的操作 + +dd if=/dev/sda of=/tmp/file1 备份磁盘内容到一个文件 + +tar -Puf backup.tar /home/user 执行一次对 '/home/user' 目录的交互式备份操作 + +( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr 'cd /home/share/ && tar x -p' 通过ssh在远程目录中复制一个目录内容 + +( tar c /home ) | ssh -C user@ip_addr 'cd /home/backup-home && tar x -p' 通过ssh在远程目录中复制一个本地目录 + +tar cf - . | (cd /tmp/backup ; tar xf - ) 本地将一个目录复制到另一个地方,保留原有权限及链接 + +find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录 + +find /var/log -name '*.log' | tar cv --files-from=- | bzip2 > log.tar.bz2 查找所有以 '.log' 结尾的文件并做成一个bzip包 + +dd if=/dev/hda of=/dev/fd0 bs=512 count=1 做一个将 MBR (Master Boot Record)内容复制到软盘的动作 + +dd if=/dev/fd0 of=/dev/hda bs=512 count=1 从已经保存到软盘的备份中恢复MBR内容 + +二十、光盘操作 + +cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force 清空一个可复写的光盘内容 + +mkisofs /dev/cdrom > cd.iso 在磁盘上创建一个光盘的iso镜像文件 + +mkisofs /dev/cdrom | gzip > cd_iso.gz 在磁盘上创建一个压缩了的光盘iso镜像文件 + +mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件 + +cdrecord -v dev=/dev/cdrom cd.iso 刻录一个ISO镜像文件 + +gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom - 刻录一个压缩了的ISO镜像文件 + +mount -o loop cd.iso /mnt/iso 挂载一个ISO镜像文件 + +cd-paranoia -B 从一个CD光盘转录音轨到 wav 文件中 + +cd-paranoia -- "-3" 从一个CD光盘转录音轨到 wav 文件中(参数-3) + +cdrecord --scanbus 扫描总线以识别scsi通道 + +dd if=/dev/hdc | md5sum 校验一个设备的md5sum编码,例如一张 CD + +二一、网络 - (以太网和WIFI无线) + +ifconfig eth0 显示一个以太网卡的配置 + +ifup eth0 启用一个 'eth0' 网络设备 + +ifdown eth0 禁用一个 'eth0' 网络设备 + +ifconfig eth0 192.168.1.1 netmask 255.255.255.0 控制IP地址 + +ifconfig eth0 promisc 设置 'eth0' 成混杂模式以嗅探数据包 (sniffing) + +dhclient eth0 以dhcp模式启用 'eth0' + +route -n show routing table + +route add -net 0/0 gw IP_Gateway configura default gateway + +route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 configure static route to reach network '192.168.0.0/16' + +route del 0/0 gw IP_gateway remove static route + +echo "1" > /proc/sys/net/ipv4/ip_forward activate ip routing + +hostname show hostname of system + +host [www.example.com](http://www.example.com) lookup hostname to resolve name to ip address and viceversa(1) + +nslookup [www.example.com](http://www.example.com) lookup hostname to resolve name to ip address and viceversa(2) + +ip link show show link status of all interfaces + +mii-tool eth0 show link status of 'eth0' + +ethtool eth0 show statistics of network card 'eth0' + +netstat -tup show all active network connections and their PID + +netstat -tupl show all network services listening on the system and their PID + +tcpdump tcp port 80 show all HTTP traffic + +iwlist scan show wireless networks + +iwconfig eth1 show configuration of a wireless network card + +hostname show hostname + +host [www.example.com](http://www.example.com) lookup hostname to resolve name to ip address and viceversa + +nslookup [www.example.com](http://www.example.com) lookup hostname to resolve name to ip address and viceversa + +whois [www.example.com](http://www.example.com) lookup on Whois database + +二二、JPS工具 + +jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。 + +    我想很多人都是用过unix系统里的ps命令,这个命令主要是用来显示当前系统的进程情况,有哪些进程,及其 id。 jps 也是一样,它的作用是显示当前系统的java进程情况,及其id号。我们可以通过它来查看我们到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),和他们的进程号(为下面几个程序做准备),并可通过opt来查看这些进程的详细启动参数。 + +     使用方法:在当前命令行下打 jps(需要JAVA_HOME,没有的话,到改程序的目录下打) 。 + +jps存放在JAVA_HOME/bin/jps,使用时为了方便请将JAVA_HOME/bin/加入到Path. + +$> jps + +23991 Jps + +23789 BossMain + +23651 Resin + +比较常用的参数: + +-q 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数 + +$>  jps -q + +28680 + +23789 + +23651 + +-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null + +$> jps -m + +28715 Jps -m + +23789 BossMain + +23651 Resin -socketwait 32768 -stdout /data/aoxj/resin/log/stdout.log -stderr /data/aoxj/resin/log/stderr.log + +-l 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名 + +$> jps -l + +28729 sun.tools.jps.Jps + +23789 com.asiainfo.aimc.bossbi.BossMain + +23651 com.caucho.server.resin.Resin + +-v 输出传递给JVM的参数 + +$> jps -v + +23789 BossMain + +28802 Jps -Denv.class.path=/data/aoxj/bossbi/twsecurity/java/trustwork140.jar:/data/aoxj/bossbi/twsecurity/java/:/data/aoxj/bossbi/twsecurity/java/twcmcc.jar:/data/aoxj/jdk15/lib/rt.jar:/data/aoxj/jd + +k15/lib/tools.jar -Dapplication.home=/data/aoxj/jdk15 -Xms8m + +23651 Resin -Xss1m -Dresin.home=/data/aoxj/resin -Dserver.root=/data/aoxj/resin -Djava.util.logging.manager=com.caucho.log.LogManagerImpl - + +Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl + +sudo jps看到的进程数量最全 + +jps 192.168.0.77 + +列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099 + +(前提是远程服务器提供jstatd服务) + +注:jps命令有个地方很不好,似乎只能显示当前用户的java进程,要显示其他用户的还是只能用unix/linux的ps命令。 + +详细情况请参考sun官方文档。 + +[http://java.sun.com/j2se/1.7.0/docs/tooldocs/share/jps.html](http://java.sun.com/j2se/1.7.0/docs/tooldocs/share/jps.html) + +GO TOP INDEX ^ + +Microsoft Windows networks (SAMBA) + +nbtscan ip_addr netbios name resolution + +nmblookup -A ip_addr netbios name resolution + +smbclient -L ip_addr/hostname show remote shares of a windows host + +smbget -Rr smb://ip_addr/share like wget can download files from a host windows via smb + +mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share mount a windows network share + +-b file            若文件存在且是一个块特殊文件,则为真 + +-c file            若文件存在且是一个字符特殊文件,则为真 + +-d file            若文件存在且是一个目录,则为真 + +-e file            若文件存在,则为真 + +-f file            若文件存在且是一个规则文件,则为真 + +-g file            若文件存在且设置了SGID位的值,则为真 + +-h file            若文件存在且为一个符合链接,则为真 + +-k file            若文件存在且设置了"sticky"位的值 + +-p file            若文件存在且为一已命名管道,则为真 + +-r file            若文件存在且可读,则为真 + +-s file            若文件存在且其大小大于零,则为真 + +-u file            若文件存在且设置了SUID位,则为真 + +-w file            若文件存在且可写,则为真 + +-x file            若文件存在且可执行,则为真 + +-o file            若文件存在且被有效用户ID所拥有,则为真 + +-z string          若string长度为0,则为真 + +-n string          若string长度不为0,则为真 + +string1 = string2  若两个字符串相等,则为真 + +string1 != string2 若两个字符串不相等,则为真 + +int1 -eq int2      若int1等于int2,则为真 + +int1 -ne int2      若int1不等于int2,则为真 + +int1 -lt int2      若int1小于int2,则为真 + +int1 -le int2      若int1小于等于int2,则为真 + +int1 -gt int2      若int1大于int2,则为真 + +int1 -ge int2      若int1大于等于int2,则为真 + +!expr              若expr为假则复合表达式为真。expr可以是任何有效的测试表达式 + +expr1 -a expr2     若expr1和expr2都为真则整式为真 + +expr1 -o expr2     若expr1和expr2有一个为真则整式为真 + +特殊变量 + +$0                 正在被执行命令的名字。对于shell脚本而言,这是被激活命令的路径 + +$n                 该变量与脚本被激活时所带的参数相对应。n是正整数,与参数位置相对应($1,$2…) + +$#                 提供脚本的参数号 + +$*                 所有这些参数都被双引号引住。若一个脚本接收两个参数,$*等于$1$2 + +$@                 所有这些参数都分别被双引号引住。若一个脚本接收到两个参数,$@等价于$1$2 + +$?                 前一个命令执行后的退出状态, 常用于判断上一个命令的执行结果, 以辅助判断下游分支逻辑的执行 + +$$                 当前shell的进程号。对于shell脚本,这是其正在执行时的进程ID + +$!                 前一个后台命令的进程号 + +二三、crontab调度器 + +①、语法 + +Linux下的任务调度分为两类:系统任务调度和用户任务调度。Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。用户自己设置的计划任务则使用crontab 命令。在CentOS系统中: + +cat /etc/crontab + +SHELL=/bin/bash + +PATH=/sbin:/bin:/usr/sbin:/usr/bin + +MAILTO=root + +HOME=/ + +# For details see man 4 crontabs + +# Example of job definition: + +# .---------------- minute (0 - 59) + +# | .------------- hour (0 - 23) + +# | | .---------- day of month (1 - 31) + +# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... + +# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat + +# | | | | | + +# * * * * * user-name command to be executed + +前四行是用来配置crond任务运行的环境变量: + +》第一行SHELL变量指定了系统要使用哪个shell,这里是bash; + +》第二行PATH变量指定了系统执行命令的路径; + +》第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户; + +》第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。 + +用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。 + +用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段: + +》前五段是时间设定段; + +》第六段是要执行的命令段 + +crontab表达式 格式如下: + +minute hour day month week command + +在以上各个字段中,还可以使用以下特殊字符: + +"*"代表所有的取值范围内的数字,如月份字段为*,则表示1到12个月; + +"/"代表每一定时间间隔的意思,如分钟字段为*/10,表示每10分钟执行1次。 + +"-"代表从某个区间范围,是闭区间。如“2-5”表示“2,3,4,5”,小时字段中0-23/2表示在0~23点范围内每2个小时执行一次。 + +","分散的数字(不一定连续),如1,2,3,4,7,9。 + +注:由于各个地方每周第一天不一样,因此Sunday=0(第一天)或Sunday=7(最后1天)。 + +case: 每隔2分钟,删除指定目录下,创建时间超过10个小时的文件 + +*/2 * * * * /bin/sh -c "find /tmp/hadoop-hdfs/mapred/local -cmin +600 -type d -exec rm -rf {} \;" >> /var/lib/hadoop-hdfs/auto_remove_mr_output.out + +二四、Shell编程相关 + +①、内置变量 + +1、declare + +declare声明变量的使用,总结如下: + +declare [+/-][选项] 变量名 + +选项: + +   -:给变量添加类型属性 + +   +:取消变量的类型属性 + +  -a:将变量声明为数组型,-A将声明一个关联数组,俗称字典。  关联知识:Shell 数组与关联数组详解及实例代码(https://www.jb51.net/article/103915.htm) + +  -i:将变量声明为整型 + +  -x:将变量声明为环境变量 + +  -r:将变量声明为只读变量 + +  -p:查看变量的被声明的类型 + +declare -i 说明: + +和 (())、let、$[] 不同,declare -i的功能非常有限,仅支持最基本的数学运算(加减乘除和取余),不支持逻辑运算(比较运算、与运算、或运算、非运算),所以在实际开发中很少使用。 + +declare -i m n ret + +m=10 + +n=30 + +ret=$m+$n + +echo $ret + +ret=$n/$m + +echo $ret + +declare的作用域,只在函数内,出来后就失效了,如下: + +#!/bin/bash + +foo() + +{ + +declare FOO="bar" + +} + +bar() + +{ + +foo + +echo $FOO + +} + +bar + +②、数据结构 + +1、数组 + +Linux shell中数组的使用 + +数组有两种数据类型: + +A). 一是数值类型; + +B). 二是字符串类型. + +虽然shell本身是弱类型的,但也可以这么区分。 + +数值类型的数组:一对括号表示数组,数组中元素之间使用“空格”来隔开。 + +举个列子: + +arr_number=(1 2 3 4 5); + +字符串类型数组:同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。 + +arr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss'); + +#!/bin/bash + +arr_number=(1 2 3 4 5) + +# ①、获取数组长度 + +# 语法: ${#ARRAY_NAME[@|*]} + +echo 'arr_number length ='${#arr_number[@]} + +echo 'arr_number length ='${#arr_number[*]} + +# ②、根据下标访问数组元素(注意:下标与java语法类似,从0开始) + +# 2nd key's value + +echo "2nd key's value ="${arr_number[1]} + +# ③、分片访问 + +echo ${arr_number[@]:0:6} + +# ④、模式替换 + +echo ${arr_number[@]/3/33} + +# ⑤、数组的遍历 + +for e in ${arr_number[@]} + +do + +        echo $e + +done + +# ⑥、综合案例 + +# 编注:数组默认分割符为空格,如果数组元素中本身包含空格,也会被截断,这里通过改变IFS(系统字段分割# 符默认为空格)为换行,达到分割数组的目的。 + +greet=('hello world' "hi,john") + +OLD_IFS=$IFS + +IFS='\n' + +for e in ${greet[@]} + +do + +        echo $e + +done + +IFS=$OLD_IFS + +》①、批量删除日志: + +for i in in {1..10}; do rm -f hadoop-cmf-hive-HIVEMETASTORE-nn1.testhdp.com.log.out.$i;done + +》②、批量将日志置空: + +for i in in {1..10}; do cat /dev/null > hadoop-cmf-yarn-NODEMANAGER-dn8.hadoop.com.log.out.$i;done + +2、字典dict 或 Map + +1). 声明字典类型: + +declare -A dic + +这里一定要-A来声明,-a只能用来声明数组类型。 + +2). 字典赋初值 + +dic=([key1]="value1" [key2]="value2" [key3]="value3") + +3). 字典动态赋值 + +dic['key']=value + +4). 打印指定key的value + +echo ${dic['key']} + +5). 打印所有key值 + +echo ${!dic[*]} + +6). 打印所有value + +echo ${dic[*]} + +7). 遍历key值 + +for key in $(echo ${!dic[*]}) + +do + +    echo "$key : ${dic[$key]}" + +done + +8). 综合案例 + +#! /bin/sh + +#输入格式为一行一个单词 + +declare -A dict + +dict=([k1]="v1" [k2]="v2") + +echo ${dict["k1"]} + +echo ${!dict[*]} + +echo ${dict[*]} + +for key in ${!dict[*]} + +do + +        echo "$key : ${dict[$key]}" + +done + +set -x + +aa="null" + +bb= + +cc='' + +#    -z 字符串为"null".就是长度为0. + +# + +#    -n 字符串不为"null" + +# + +#     注意: + +# + +#     使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z + +# + +#     或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可 + +# + +#     以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯. + +if [ -n "$cc" ];then + +        echo "aa is not null" + +fi + +set +x + +#定义字典类型变量 + +declare -A dict + +#从标准输入读取 + +while read word + +do + +    #若key为word的变量不存在,则为未定义,即第一次遇到此word,则将此word加入字典并设置其value为1。,否则自增value值 + +    if [ ! -n dict[${word}] ];then + +        dict[${word}]=1 + +    else + +        ((dict[${word}]++)) + +    fi + +done + +#打印统计结果 + +echo -e "word\t\tcount" + +for key in $(echo ${!dict[*]}) + +do + +    echo -e "$key\t\t${dict[$key]}" + +done + +综合案例二: shell的map简单的添加、查找、删除、遍历 + +3、管道输出中执行下一条指令 + +ps -ef | grep 'new-consumer' | awk '{print $2}' |xargs kill -9       #删除kafka consumer进程 + +ps -ef|grep java|grep -v grep|awk '{print $2}'|xargs kill -9          #删除java进程   + +find /opt/flume-custom/ -name *.conf|xargs grep -re "127.0.0.1:9092" #查找到的文件中查找指定字符串 + +find /opt/ -type f -name '*.log' |xargs grep 'db.hostname' + +cat ~/.ssh/id_rsa.pub | ssh my_admin@111.111.111.111 "cat - >> ~/.ssh/authorized_keys" + +kill -9 $(ps -ef|grep "sh\ *start_new.sh\ *main"|grep -v grep|awk '{print $2}') #\ *表任意多空格 + +kill -9 `ps -ef|grep data-integration|awk '{print $2}'` + +ls|while read f;do zip -r ${f}.zip $f;done  #压缩所有ls出来的文件夹 + +ls|grep 'hadoop-cmf-yarn-RESOURCEMANAGER-nn1.hadoop.com.log.out.[0-9]\{1,\}'|while read f;do cat /dev/null > $f;done #将所有RESOURCEMANAGER日志文件内容置为空,文件尾缀为1个以上从0到9的数字,如1、2、9、12均能匹配查找到,在nn1上磁盘(/var/log/{hadoop-hdfs,hadoop-yarn})上日志一般都比较大 + +# 查找10日前创建的文件,并情况其内容 + +find . -type f -name '*oozie-instrumentation.log.*' -atime +10 | while read f;do cat /dev/null > $f;done + +#查看所有用户的crontab任务,其中"-I {}"参数,可以使用-i来等量实现 + +cat /etc/passwd | cut -f 1 -d : |xargs -I {} crontab -l -u {} + +cat /etc/passwd | cut -f 1 -d : |xargs -i crontab -l -u {} + +# 查询当前目录下所有文件(含目录下文件)中包含关键字(sku)的文件路径, 滤重, 并过滤掉路径中含指定字符(000) + +grep -rn 'sku' * | awk -F ':' '{print $1}' | uniq | grep -v 000 + +传送门:Shell基础知识》xargs详解 + +读取文件每一行,并循环做处理: + +①、while read line + +do + +       … + +done < file + +②、cat file  | ${BIZ_LOGICAL} + +综合实例: + +ssh   127.0.0.1 <$line; done + +ls lib/* |while read line;do jar -tf $line|grep LogAnalysis; echo $line;done + +#hdfs文件大小统计排序 + +hdfs dfs -du ${HDFS_PATH} | sort -rn | head -n 10 | awk '{printf("%.2f\t\t%.2f\t\t%s\t\n",$1/1024/1024/1024,"\t"$2/1024/1024/1024,"\t"$3)}' + +#获取所有java程序的进程号 + +ps -ef | while read line ; do if [[ $line =~ "java" ]] ;then echo $line |  awk -F ' ' '{print $2}' ; fi ;done + +//循环所有文件,并添加header + +#!/bin/bash + +ls OrderDetail_sysdate_* |while read file;do + +sed -i "1i\\$(cat header.csv)" $file + +done + +综合案例: + +清理日志文件夹中的日志文件,将其置为黑洞文件内容(即情况该文件)。 + +#!/bin/bash + +#先遍历本文件夹里文件夹 + +dir_list=`ls` + +#对查询到的文件夹执行清空其内文件的操作 + +for dir in $dir_list;do + +    echo $dir + +    ls $dir/* | while read line;do echo $line; cat /dev/null > $line; done + +done + +for i in `seq 1 $(cat /proc/cpuinfo |grep "physical id" |wc -l)`; do dd if=/dev/zero of=/dev/null & done + +pkill -9 dd + +5、break 与 contine区别 + +如下代码所示: + +不带参数 N:    + +break     循环只能退出最内层的循环; + +continue     只能去掉本次循环的剩余代码; + +带参数 N:    + +break N    可以退出N层循环; + +continue N     将会把N层循环剩余代码都去掉,单循环次数不变; + +#!/bin/bash + +for i in a b c d + +do + +    echo -n $i + +    for j in `seq 10` + +    do + +        if test $j -eq 5;then + +            #break + +           # continue + +            #break 2 + +            continue 2 + +        fi + +        echo -n $j + +    done + +    #换行 + +    echo + +done + +########################################## + +### + +### Program result: + +### + +########################################## + +# + +#>>>>>>>>>>>>>> 1. break >>>>>>>>>>>>>>>>> + +# a1234 + +# b1234 + +# c1234 + +# d1234 + +#>>>>>>>>>>>>>> 2. continue >>>>>>>>>>>>>>>>> + +# a1234678910 + +# b1234678910 + +# c1234678910 + +# d1234678910 + +#>>>>>>>>>>>>>> 3. "break 2","break 3" has same effect >>>>>>>>>>>>>>>>> + +# a1234 + +#>>>>>>>>>>>>>> 4. "continue 2" >>>>>>>>>>>>>>>>> + +# a1234 + +# b1234 + +# c1234 + +# d1234 + +6、大文件拆分处理 + +文件拆分: + +split -d -a 8 -l 10000 PayOrderDetail.csv PayOrderDetail_sysdate_.csv + +用法: + +Usage: split [OPTION]... [INPUT [PREFIX]] + +Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default + +size is 1000 lines, and default PREFIX is 'x'.  With no INPUT, or when INPUT + +is -, read standard input. + +Mandatory arguments to long options are mandatory for short options too. + +  -a, --suffix-length=N   generate suffixes of length N (default 2) + +      --additional-suffix=SUFFIX  append an additional SUFFIX to file names + +  -b, --bytes=SIZE        put SIZE bytes per output file + +  -C, --line-bytes=SIZE   put at most SIZE bytes of lines per output file + +  -d, --numeric-suffixes[=FROM]  use numeric suffixes instead of alphabetic; + +                                   FROM changes the start value (default 0) + +  -e, --elide-empty-files  do not generate empty output files with '-n' + +      --filter=COMMAND    write to shell COMMAND; file name is $FILE + +  -l, --lines=NUMBER      put NUMBER lines per output file + +  -n, --number=CHUNKS     generate CHUNKS output files; see explanation below + +  -u, --unbuffered        immediately copy input to output with '-n r/...' + +      --verbose           print a diagnostic just before each + +                            output file is opened + +      --help     display this help and exit + +      --version  output version information and exit + +SIZE is an integer and optional unit (example: 10M is 10*1024*1024).  Units + +are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000). + +CHUNKS may be: + +N       split into N files based on size of input + +K/N     output Kth of N to stdout + +l/N     split into N files without splitting lines + +l/K/N   output Kth of N to stdout without splitting lines + +r/N     like 'l' but use round robin distribution + +r/K/N   likewise but only output Kth of N to stdout + +GNU coreutils online help: <[http://www.gnu.org/software/coreutils/](http://www.gnu.org/software/coreutils/)> + +For complete documentation, run: info coreutils 'split invocation' + +详细案例,详见:split命令_Linux split命令:切割(拆分)文件 + +7、awk + +#批量删除hdfs下ods层下所有数据 + +hdfs dfs -lsr /user/hive/warehouse/ods|awk '{print "hdfs dfs -rm -R" $8}' + +8、实现脚本中切换用户并执行该用户相关的命令操作 + +假如当前用户为root账户,希望切换到其他用户下执行相关的操作,如有以下业务场景: + +想以yarn用户身份,取删除yarn运行相关的早期用处不大的日志。 + +方式①、 + +#!/bin/bash + +su - yarn < /dev/null 2>&1 & + +注意: + +该命令的执行权限是临时的,只在本条语句起作用。即在COMMAND命令行内部,是以$USER身份执行命令;执行结束后,回到初始状态用户,这里为root。 + +案例: + +## 01-Handle logic of clean HDFS NAMENODE & DATANODE & audit logs. + +######################################################## + +su - hdfs -c ' + +        HDFS_PATH=/var/log/hadoop-hdfs; + +        ls $HDFS_PATH | grep "hadoop-cmf-hdfs-NAMENODE-nn1.hadoop.com.log.out.[0-9]\{1,\}$" | while read f;     do `cat /dev/null > $HDFS_PATH/$f`; done   ; + +        ls $HDFS_PATH | grep "hadoop-cmf-hdfs-DATANODE-nn1.hadoop.com.log.out.[0-9]\{1,\}$" | while read f;     do `cat /dev/null > $HDFS_PATH/$f`; done   ; + +        ls $HDFS_PATH | grep "hdfs-audit.log.[0-9]\{1,\}$" | while read f;                                      do `cat /dev/null > $HDFS_PATH/$f`; done + +' + +注意: + +① ls这段语句在命令行下执行没任何问题,提取到“su - hdfs -c”中时,`cat /dev/null > $HDFS_PATH/$f`这段必须要包裹上``符号,才能正常执行。 + +② -c 参数中,可以执行多行命令,但是需要几个条件:A). 所用命令使用''包裹,每一行命令间,使用";"来进行分隔。 + +补充su的用法: + +[root@cdh-nn1 ~]# su --help + +Usage: + + su [options] [-] [USER [arg]...] + +Change the effective user id and group id to that of USER. + +A mere - implies -l.   If USER not given, assume root. + +Options: + + -m, -p, --preserve-environment  do not reset environment variables + + -g, --group              specify the primary group + + -G, --supp-group         specify a supplemental group + + -, -l, --login                  make the shell a login shell + + -c, --command          pass a single command to the shell with -c + + --session-command      pass a single command to the shell with -c + +                                 and do not create a new session + + -f, --fast                      pass -f to the shell (for csh or tcsh) + + -s, --shell              run shell if /etc/shells allows it + + -h, --help     display this help and exit + + -V, --version  output version information and exit + +For more details see su(1). + +su 和 “su - ${USER}”的区别: + +①、su只是切换用户。 + +②、su - 切换用户并切换shell环境。 + +③、su another + +pwd后为/home/current + +④、su - another + +pwd后为/home/another + +9、awk实现查找奇数行、偶数行: + +seq 20 > test.txt + +[root@server1 tmp]# awk 'NR%2 != 0' test.txt + +[root@server1 tmp]# awk 'NR%2 == 0' test.txt + +10、IFS专题 + +IFS, 全称 内部字段分隔符(Internal Field Separator, IFS) , 作用是在Linux中定义一个定界符,默认是空格。 + +如果字符串中的分隔符,默认不是空格,而是逗号(如csv文件), 则可以考虑临时替换IFS为逗号,处理完文本处理任务后, 再将默认的修改回来. + +如果脚本实现, 按","提取表名list: + +batch_upsert_table_process.sh + +#!/bin/bash + +include_tables="activity_info,activity_rule,activity_sku,base_category1,base_category2,base_category3,base_province,base_region,base_trademark,coupon_info,coupon_range,coupon_use,financial_sku_cost,sku_info,spu_info,user_info" + +function get_element_by_split_comma(){ + +    ifs_old=$IFS + +    IFS="," + +    for tbl in $(echo "${include_tables}");do + +        echo 'Now is handle table >>>>>>>>>>>>>>>>>>>>> '$tbl + +        /data/maxwell/bin/maxwell-bootstrap --database gmall --table $tbl --config /data/maxwell/tf_custom_config/gmall_rtdw_test.properties + +    done + +    #Recovery IFS to default + +    IFS=$ifs_old + +} + +get_element_by_split_comma + +③、echo在shell中控制颜色&闪烁显示 + +1、在shell中显示色彩 + +语法格式: + +echo -e "\033[颜色1:颜色2m 要展示的文字 \033[0m" + +参数说明: + +----------------------------------------------------------------------------------------------------------------------- + +-e选项:表示允许反斜杠(对字符)转义。 + +\033[颜色1;颜色2m:称为转义序列,它本身是一个整体,中间不要有空格。 + +\033[:转义序列的开始。其中\033代表Esc符号,也可以使用\E或\e来代替。 + +颜色1和颜色2:表示字体的前景色或背景色,至于颜色1和颜色2哪一个表示前景色,哪一个表示背景色,由其设定的数值来决定,前景色和背景色的数值空间是不同的。 + +m:转义序列的终止标志。 + +\033[0m:表示将颜色恢复回原来的配色。 + + 我们可以用一张原理图来理解: + +----------------------------------------------------------------------------------------------------------------------- + +图示说明: + +颜色码: + +④、数据类型转化 + +1、字符串转化为数字 + +案例1: 将日期中以0开头的数字字符串转换为数字 + +比如今日为2022-03-25, 如果想获取月份, 可以使用 echo $(date +%m) 或 echo `date +%m`, 将获取到字符串"03", 但我们想要去掉开头0的3, 翻遍date的api都没有找到. + +这时候可以考虑使用数学运算将原字符串 与 一个数字0相加, 变相通过数学计算获取到整形的计算结果. + +[hdfs@hadoop test]$ echo $(expr $(date +%m) + 0) + +3 + +[hdfs@hadoop test]$ echo `expr $(date +%m) + 0` + +3 + +[hdfs@hadoop test]$ hive --hivevar year=$(date +%Y) --hivevar month=`expr $(date +%m) + 0` -f /data/program/test_hive.hql + +test_hive.hql中则可以使用上述动态传参的值: + +ALTER TABLE ads.my_partition_table_test DROP IF EXISTS PARTITION(year=${hivevar:year}, month=${hivevar:month}); + +⑤、登录shell 与 非登录shell区别 + +登录shell:使用linux账户登录后执行的shell + +非登录shell:不经登录,直接使用shell,如ssh 远程连接到主机后执行的shell + +注意: + + 如果将环境变量配置信息,配置在/etc/profile中,对于非登录shell,则获取不到。 + +而对于/etc/profile.d/*.sh,则对于2种shell,都可以访问到。 + +二十五、程序开机自启动服务配置 + +Centos系统服务器脚本目录位置:/usr/lib/systemd/ + +其内部有系统(system)和用户(user)2个文件夹,如需要开机不登录即要求能执行的程序,在系统服务(system)里,即/usr/lib/systemd/system; + +而如果需要用户登录之后才可以运行的程序,在用户服务(user)里,即/usr/lib/systemd/user。 + +这里以nginx服务开启自启为例: + +[Unit]    + +Description=Nginx restart on Reboot + +After=network.target    + +[Service]    + +Type=forking    + +User=nginx + +Group=nginx + +ExecStart=/etc/init.d/nginx start    + +ExecReload=/etc/init.d/nginx restart    + +ExecStop=/etc/init.d/nginx  stop    + +PrivateTmp=true    + +[Install]    + +WantedBy=multi-user.target   + +参数说明: + +Description:描述服务 + +After:描述本服务的上游依赖关系,即上游启动完毕后,才可以启动本服务 + +[Service]服务运行参数的设置 + +Type=forking是后台运行的形式 + +User服务启动用户 + +Group服务启动用户组 + +ExecStart为服务的具体运行命令 + +ExecReload为重启命令 + +ExecStop为停止命令 + +PrivateTmp=True表示给服务分配独立的临时空间 + +注意: + +[Service]的启动、重启、停止命令全部要求使用绝对路径 + +[Install]服务安装的相关设置,可设置为多用户 + +一般文件以644权限进行保存,如下: + +[root@nn2 system]# ll frp.service + +-rw-r--r-- 1 root root 266 Oct 29 11:50 frp.service + +设置开机自启动命令:systemctl  enable  nginx.service + +>> 如果查看systemctl启动服务的log信息? + +Service启动之后, 如果想查询其详细日志信息, 可以使用类似tail的命令, 使用journalctl -f 可以来实时追踪日志. + +使用journalctl可以查看使用systemctl启动的service,常用参数有两种, 如下: + +①. 显示多个混合在一起的systemctl 服务日志, 一般刚启动完一个service时查看比较方便 + +journalctl -f + +②. 只查看某一个具体的service服务的日志 + +journalctl -u 服务名 + +如: + +2021-11-10 10:06:37 nn1 systemd: Started Bigdata KafkaManager. + +2021-11-10 10:06:37 nn1 kafka-manager: This application is already running (Or delete /opt/software/kafka-manager-1.3.3.23/RUNNING_PID file). + +2021-11-10 10:06:37 nn1 systemd: bigdata_kafkaManager.service: main process exited, code=exited, status=255/n/a + +2021-11-10 10:06:37 nn1 systemd: Unit bigdata_kafkaManager.service entered failed state. + +2021-11-10 10:06:37 nn1 systemd: bigdata_kafkaManager.service failed. + +2021-11-10 10:06:46 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:06:46 systemctl is-enabled bigdata_kafkaManager.service + +2021-11-10 10:06:52 nn1 systemd: Reloading. + +2021-11-10 10:06:53 nn1 systemd: [/run/systemd/generator.late/cloudera-scm-server.service:13] Failed to add dependency on +cloudera-scm-server-db.service, ignoring: Invalid argument + +2021-11-10 10:06:53 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' + +2021-11-10 10:06:53 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:06:52 systemctl disable bigdata_kafkaManager.service + +2021-11-10 10:07:02 nn1 systemd: Stopped Bigdata KafkaManager. + +2021-11-10 10:07:02 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' + +2021-11-10 10:07:02 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' + +2021-11-10 10:07:02 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:02 systemctl stop bigdata_kafkaManager.service + +③. 通过 "系统日志" 来进行查询 + +tail -100f /var/log/message + +2021-11-10 10:06:37 nn1 systemd: Started Bigdata KafkaManager. + +2021-11-10 10:06:37 nn1 kafka-manager: This application is already running (Or delete /opt/software/kafka-manager-1.3.3.23/RUNNING_PID file). + +2021-11-10 10:06:37 nn1 systemd: bigdata_kafkaManager.service: main process exited, code=exited, status=255/n/a + +2021-11-10 10:06:37 nn1 systemd: Unit bigdata_kafkaManager.service entered failed state. + +2021-11-10 10:06:37 nn1 systemd: bigdata_kafkaManager.service failed. + +2021-11-10 10:06:46 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:06:46 systemctl is-enabled bigdata_kafkaManager.service + +2021-11-10 10:06:52 nn1 systemd: Reloading. + +2021-11-10 10:06:53 nn1 systemd: [/run/systemd/generator.late/cloudera-scm-server.service:13] Failed to add dependency on +cloudera-scm-server-db.service, ignoring: Invalid argument + +2021-11-10 10:06:53 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' + +2021-11-10 10:06:53 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:06:52 systemctl disable bigdata_kafkaManager.service + +2021-11-10 10:07:02 nn1 systemd: Stopped Bigdata KafkaManager. + +2021-11-10 10:07:02 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' + +2021-11-10 10:07:02 nn1 systemd: [/etc/systemd/system/bigdata_kafkaManager.service:15] Unknown lvalue 'StartLimitIntervalSec' in section 'Service' + +2021-11-10 10:07:02 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:02 systemctl stop bigdata_kafkaManager.service + +2021-11-10 10:07:24 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:08 watch free -g + +2021-11-10 10:07:24 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:08 watch free -g + +2021-11-10 10:07:24 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:07:08 watch free -g + +2021-11-10 10:18:20 nn1 bigdata_admin: root [/etc/systemd/system]2021-11-10 10:08:19 tail -100f /var/log/messages + +二十六、持续监控Linux命令的执行情况 + +watch -d -n 1 ls -l + +参数说明: + +①、-n:默认为2s刷新一次,通过-n 参数更新刷新频次; + +②、-d:方便查看输出与上次的不同之处。 \ No newline at end of file diff --git a/docs/Obsidian/dify/作为安卓高级开发工程师,除了项目管理,你完全可以在技术专项、团队效能和个人成长三大领域构建更懂你的专属助手.md b/docs/Obsidian/dify/作为安卓高级开发工程师,除了项目管理,你完全可以在技术专项、团队效能和个人成长三大领域构建更懂你的专属助手.md new file mode 100644 index 0000000..6a27025 --- /dev/null +++ b/docs/Obsidian/dify/作为安卓高级开发工程师,除了项目管理,你完全可以在技术专项、团队效能和个人成长三大领域构建更懂你的专属助手.md @@ -0,0 +1,214 @@ +作为安卓高级开发工程师,除了项目管理,你完全可以在**技术专项、团队效能和个人成长**三大领域构建更懂你的专属助手。这些场景能直接提升你的开发效率和技术影响力。 + +## 🎯 三类高价值技术助手场景 + +| 场景分类 | 核心价值 | 适合阶段 | 实施复杂度 | +|---------|---------|----------|-----------| +| **🔧 技术专项助手** | 解决深度技术问题,保持技术敏锐度 | 高级/专家级工程师 | 中等 | +| **🚀 团队效能助手** | 提升团队整体产出和质量 | Tech Lead/架构师角色 | 较高 | +| **📈 个人成长助手** | 系统性技术演进和影响力构建 | 职业发展期 | 低-中等 | + +## 一、🔧 技术专项助手:你的深度技术伙伴 + +### 1. **架构决策记录与回溯助手** +```yaml +# Dify工作流:架构决策评审 +触发: 用户提及“架构选择”、“技术选型” +流程: + 1. 检索类似决策历史 + 2. 对比方案矩阵自动生成: + - Compose vs XML布局 (性能/维护性/学习曲线) + - Room vs SQLite直接操作 + - Koin vs Hilt依赖注入 + - MVI vs MVVM架构模式 + 3. 输出带权重的推荐建议 + 4. 自动生成ADR(架构决策记录)模板 +``` + +### 2. **性能优化诊断助手** +**知识库配置**: +- 上传Android性能优化最佳实践 +- 加入Systrace、Perfetto解析指南 +- 收集历史性能问题案例 + +**工具集成**: +```kotlin +// 连接CI/CD工具分析性能回归 +助手功能: +1. 监控关键指标趋势: + - 启动时间(冷/热/温启动) + - 帧率稳定性(jank率) + - 内存峰值/泄漏模式 +2. 智能归因: + "启动慢2秒" → 可能是ContentProvider初始化过多 +3. 提供针对性优化建议: + - 懒加载时机建议 + - 异步任务拆分方案 + - 视图层级优化 +``` + +### 3. **Compose迁移评估助手** +```text +用户:我想把商品详情页改成Compose +助手: +📊 迁移评估报告: +• 当前文件:ProductDetailFragment.kt (1200行) +• XML布局:product_detail.xml (5层嵌套) +• 状态管理:ViewModel + LiveData + +✅ 迁移优势: +1. 预览开发效率提升 ~40% +2. 状态管理更直观 +3. 与Material3设计系统更契合 + +⚠️ 风险点: +1. 团队Compose熟悉度中等 +2. 与现有View系统交互复杂 + +📅 建议方案: +• 分三阶段:UI组件 → 状态迁移 → 交互逻辑 +• 预估工作量:8-12人日 +• 推荐测试策略:Snapshot测试 + 交互测试 +``` + +## 二、🚀 团队效能助手:技术领导力延伸 + +### 1. **代码审查智能助手** +**Dify配置要点**: +- 集成GitLab/GitHub API获取MR信息 +- 配置审查规则知识库 +- 建立团队常见问题模式库 + +**审查自动化流程**: +``` +待审查MR → 助手预审 → 生成审查报告 + ↓ +自动检查项: +1. 架构合规性(违反MVVM分层) +2. 性能隐患(主线程耗时操作) +3. 安全风险(硬编码密钥) +4. 代码风格(ktlint规则) +5. 测试覆盖(新增代码无测试) + +输出:分级审查报告(P0必须修复,P1建议优化) +``` + +### 2. **技术债务管理助手** +**债务雷达系统**: +| 债务类型 | 检测方式 | 修复优先级 | 自动化修复建议 | +|---------|---------|-----------|---------------| +| 过时API | Lint扫描 | 高 | 提供替换代码片段 | +| 重复代码 | CPD工具 | 中 | 提取基类/工具函数建议 | +| 巨型类 | 行数统计 | 中 | 拆分建议和职责划分 | +| 脆弱测试 | 测试稳定性分析 | 高 | 重构指南和模式 | + +**助手能力**: +```text +季度技术债务报告: +📉 债务指数:6.2/10 (较上季度+0.8) +🔴 高优先级: + • RxJava遗留代码(3处,影响维护性) + • 深度嵌套回调(主页模块) + • 缺少单元测试(支付模块50%覆盖) + +🟢 改善亮点: + • Compose采用率提升至35% + • 静态分析告警减少22% +``` + +### 3. **新人上手加速助手** +```mermaid +graph TD + A[新人加入] --> B[环境配置指引] + B --> C[代码库导览] + C --> D[第一个任务分配] + D --> E[实时答疑支持] + E --> F[代码审查反馈] + F --> G[成长路径建议] + + style D fill:#e1f5fe + style F fill:#f3e5f5 +``` + +**助手提供的具体帮助**: +1. **环境问题秒解**:“Gradle sync失败” → 检查代理/缓存/版本 +2. **代码历史解读**:“为什么这里用EventBus?” → 展示当时的PR和讨论 +3. **调试伙伴**:“这个崩溃看不懂” → 解释堆栈+可能原因+修复步骤 + +## 三、📈 个人成长助手:职业发展加速器 + +### 1. **技术雷达构建助手** +**个人技术矩阵管理**: +```kotlin +// 自动追踪你的技术栈深度 +技术领域: Android Framework +掌握程度: + - Binder机制: 🔴 理论了解 (需实践) + - View绘制体系: 🟡 项目经验 (可优化) + - 内存管理: 🟢 深度掌握 (可分享) + +学习建议: +• 下季度聚焦: Compose性能优化 (市场趋势+团队需求) +• 输出计划: 写一篇“Window机制解析”技术文章 +• 社区参与: 提交一个Jetpack issue/PR +``` + +### 2. **面试赋能助手** +**两种模式**: +- **提问者模式**:模拟资深面试官,追问系统设计深度 + ``` + 你:我设计一个图片加载库 + 助手:追问: + 1. 三级缓存具体实现和淘汰策略? + 2. 如何避免OOM同时保证命中率? + 3. 在折叠屏上的适配考虑? + 4. 与Coil/Glide的核心差异点? + ``` +- **复盘模式**:分析你的答案,指出盲点和提升方向 + +### 3. **影响力构建助手** +**自动化技术分享运营**: +``` +1. 话题发现: + - 分析团队代码痛点 → “LiveData vs StateFlow实战对比” + - 追踪新技术 → “Android 15新特性适配指南” + +2. 内容辅助: + - 自动生成演示代码框架 + - 整理常见问题Q&A + - 设计互动环节问题 + +3. 效果追踪: + - 分享后问题讨论热度 + - 实践采纳率(多少同事后续使用) + - 转化为文档/规范的部分 +``` + +## 🚀 实施路线建议 + +### 第一阶段(1-2周):立即见效的“个人助手” +从技术专项开始,解决**你每天最耗时的问题**: + +1. **选一个高频痛点**:比如“性能问题排查”或“架构决策记录” +2. **构建最小可行助手**:只解决最核心的3-5个问题场景 +3. **每天使用并迭代**:记录助手帮你节省的时间 + +### 第二阶段(3-4周):扩展为“团队工具” +选择**团队共识的痛点**,比如: +- 代码审查质量参差不齐 → 代码审查助手 +- 新人培养周期长 → 新人上手助手 +- 技术债务无感知 → 债务雷达助手 + +### 第三阶段(持续):成为“技术文化载体” +当助手积累了足够数据和质量,它可以: +- 沉淀团队最佳实践 +- 量化技术演进指标 +- 预测技术风险 + +--- + +作为安卓高级工程师,你最清楚日常工作的“痛点时刻”。**现在你最常在哪类问题上花费不必要的时间?** + +是**技术深度问题**(如性能优化、架构设计),**团队协作问题**(如代码审查、知识传递),还是**个人发展问题**(如技术规划、影响力构建)? + +告诉我你最想优先解决的1-2个具体场景,我可以帮你设计更详细的Dify编排方案,包括具体的工作流配置、知识库结构和提示词设计。 \ No newline at end of file diff --git a/docs/Obsidian/dify/使用dify,可以生成一个专项事务助手吗,比如公司正规化事务助手.md b/docs/Obsidian/dify/使用dify,可以生成一个专项事务助手吗,比如公司正规化事务助手.md new file mode 100644 index 0000000..582a760 --- /dev/null +++ b/docs/Obsidian/dify/使用dify,可以生成一个专项事务助手吗,比如公司正规化事务助手.md @@ -0,0 +1,82 @@ +当然可以!使用Dify可以高效地创建“公司正规化事务助手”。这是一个非常适合Dify发挥的场景,因为它涉及流程化、知识库整合和任务指引。下面我为你梳理一下构建思路和具体步骤。 + +### 一、为什么Dify非常适合? +1. **可视化编排**:无需编码,通过拖拽编排正规化流程。 +2. **知识库整合**:上传《公司法》、公司章程模板、地方政策等,让助手回答有据可依。 +3. **多模型支持**:可接GPT-4、Claude或国产大模型,处理复杂咨询。 +4. **发布灵活**:可嵌入网站、作为独立Web应用或通过API调用。 + +### 二、助手核心功能设计 +| 功能模块 | 具体能力 | 解决的问题 | +| :------------- | :------------------------------- | :-------------- | +| **流程指引** | 分阶段指导(如:核名 → 章程制定 → 银行开户 → 税务登记) | 用户不知从何开始,步骤混乱 | +| **文档生成/审核** | 生成公司章程草案、股东协议模板,审核用户提交的文档 | 节省律师基础成本,降低格式错误 | +| **智能问答** | 解答“注册资本认缴和实缴区别?”、“股权怎么分配合理?” | 即时解答高频、标准问题 | +| **合规检查** | 根据知识库,提示用户注意项(如:经营范围表述规范) | 避免申请被驳回 | +| **资源对接** (可扩展) | 推荐本地代理记账服务、律师事务所链接 | 提供一站式服务体验 | + +### 三、在Dify中的实现步骤 +**1. 创建应用** +- 在Dify控制台选择“**助手应用**”类型,选择“**零代码构建**”模式。 + +**2. 构建知识库** +- 创建名为“公司正规化知识库”的数据库。 +- **上传关键文档**: + - **法律法规**:《公司法》、《公司登记管理条例》等。 + - **模板文件**:公司章程、股东会决议、股权协议等标准模板。 + - **地方政策**:本地市场监管局、税务局的最新办事指南。 + - **常见问题**:整理好的Q&A文档。 +- **优化检索**:为文档设置合适的命中方式(如分段、摘要),并添加元数据标签(如“注册资本”、“税务”、“章程”),提高回答准确率。 + +**3. 编排助手流程(工作流)** +这是核心部分,你可以使用Dify的**工作流**功能创建一个清晰的指引流程: +``` +开始 +├─ 用户输入需求(如:“我想注册一家科技有限公司”) +├─ **意图判断节点**:判断用户处于哪个阶段(咨询、文档生成、流程查询) +│ ├─ 如果是“流程查询” → 触发**流程指引子工作流** +│ ├─ 如果是“文档生成” → 触发**文档生成子工作流** +│ └─ 如果是“一般问答” → 连接**知识库检索**后由LLM回答 +├─ **知识库检索节点**:从上传的文档中查找相关条款和模板 +├─ **大模型LLM节点**:根据检索结果和用户上下文,生成结构化、友好的回答或文档 +└─ **输出节点**:将回答、步骤列表或生成的文档返回给用户 +``` +*你可以在工作流中设置多个**判断条件**和**循环**,来处理复杂的多轮对话和流程分支。* + +**4. 配置提示词** +在“提示词编排”中,给LLM明确的角色设定和规则: +> 你是一名专业的公司法律与行政事务顾问,专注于帮助初创企业完成公司正规化流程。你的回答必须严谨、准确、友好。 +> **规则:** +> 1. 所有关于法律和流程的回答,必须严格基于提供的知识库内容。 +> 2. 对于知识库中没有明确依据的问题,必须声明“此问题建议咨询专业律师或当地市场监管局”。 +> 3. 生成文档时,必须使用知识库中的最新模板,并清晰标出需要用户自行填写的部分。 +> 4. 回答流程问题时分点、分步骤,清晰明了。 + +**5. 测试与优化** +- 在Dify的预览界面,模拟用户提问,测试各功能路径。 +- 根据测试结果,调整知识库文档、提示词和工作流逻辑。 + +**6. 发布与部署** +- **Web应用**:直接发布,获得一个可分享的链接,嵌入公司内部系统或官网。 +- **API**:通过API集成到你的CRM、OA或其他业务系统中。 +- **权限控制**:可以设置不同用户的访问权限。 + +### 四、高级功能与建议 +- **多轮对话与状态记忆**:利用Dify的对话记忆能力,让助手记住用户公司的基本信息(如所在地、公司类型),在后续对话中无需重复询问。 +- **表单集成**:在关键节点(如收集股东信息)可跳出表单让用户填写,结构化收集信息以便生成文档。 +- **人工客服兜底**:在复杂或高风险问题上,设置转接人工客服的入口。 + +### 五、注意事项 +1. **免责声明**:务必在界面醒目位置声明“本助手提供通用性指导,不构成正式法律意见,具体操作请以主管部门要求和专业顾问建议为准”。 +2. **知识库更新**:法律法规会更新,需定期维护知识库,更新模板和政策。 +3. **数据安全**:如果处理用户敏感信息,确保Dify部署环境符合你的安全要求。 + +### 开始行动 +1. 登录Dify,创建一个新应用。 +2. 从“构建知识库”开始,上传你最熟悉的几个文档(比如一份公司章程模板和《公司法》节选)。 +3. 先尝试用“提示词编排”模式,构建一个简单的问答助手。 +4. 熟悉后,再使用更强大的“工作流”模式,搭建完整的流程化助手。 + +**用Dify构建这类专项助手,核心优势在于将分散的知识和流程工具化、产品化,极大提升信息获取和办事的效率。** + +如果你已经有具体的公司正规化流程文档,可以立刻开始尝试。在构建过程中遇到任何具体问题,可以随时提问。 \ No newline at end of file diff --git a/docs/Obsidian/git/Git add . 后如何撤销.md b/docs/Obsidian/git/Git add . 后如何撤销.md new file mode 100644 index 0000000..fef693e --- /dev/null +++ b/docs/Obsidian/git/Git add . 后如何撤销.md @@ -0,0 +1,321 @@ +# Git add . 后如何撤销 + +在Git中撤销git add .操作有以下几种常用方法: + + + +撤销所有暂存文件: + + + +使用git reset命令:git reset会将所有暂存文件移回工作区 + +使用git restore命令(Git 2.23+):git restore --staged .效果相同 + + + +撤销特定文件的暂存: + + + +对单个文件:git reset HEAD <文件名> 或 git restore --staged <文件名> + +对多个文件:可以指定多个文件名或用通配符 + + + +完全撤销修改(慎用): + + + +git checkout -- <文件名>会丢弃工作区修改 + +git reset --hard会丢弃所有未提交的修改 + + + +已commit的撤销: + + + +使用git revert创建反向提交 + +使用git reset --hard 回退到指定提交 + + + +注意事项: + + + +这些操作只会影响暂存区,不会删除文件本身 + +执行前建议先用git status确认文件状态 + +对已push的commit进行撤销需谨慎,可能影响协作 + + + + + +# 如何回退git commit . + +在Git中回退git commit .操作有以下几种常用方法,具体选择取决于是否需要保留修改或是否已推送到远程仓库: + + + +撤销最近一次commit但保留修改: + + + +git reset --soft HEAD~1:撤销commit但保留所有更改在暂存区 + +git reset HEAD~1(默认--mixed模式):撤销commit并将更改移回工作区 + + + +完全撤销commit及修改: + + + +git reset --hard HEAD~1:彻底删除最后一次提交及其所有更改(不可逆操作) + + + +针对已push的commit: + + + +先本地执行git reset回退 + +再使用git push -f强制覆盖远程分支(慎用,会影响协作) + + + +安全撤销方式(保留历史): + + + +git revert HEAD:创建新提交来撤销前一次提交的更改 + +可指定具体commit哈希:git revert + + + +交互式修改历史: + + + +git rebase -i HEAD~n:可编辑最近n次提交记录 + +在交互界面中将目标commit前的"pick"改为"drop"即可删除 + + + +操作建议: + + + +先用git log查看提交历史确认要回退的commit + +未push的commit优先使用git reset + +已push的commit建议使用git revert避免历史冲突 + +重要修改前建议创建备份分支 + + + + + +# 要删除git分支 + + + +在Git中删除分支分为本地分支和远程分支两种情况,以下是具体操作方法: + + + +删除本地分支: + + + +安全删除(已合并的分支):git branch -d + +强制删除(未合并的分支):git branch -D + +删除前需确保不在目标分支上,可通过git checkout 切换分支 + + + +删除远程分支: + + + +现代Git版本:git push --delete (推荐) + +兼容旧版本:git push : + +远程仓库名通常为origin + + + +同步操作: + + + +删除远程分支后,其他机器需执行git fetch --all --prune清除过时的远程跟踪分支 + +可通过git branch -a验证删除结果 + + + +注意事项: + + + +删除分支前建议确认分支内容已合并或备份 + +强制删除(-D)会丢失未合并的修改,需谨慎使用 + +当前所在分支无法被删除 + + + + + +# 如何放弃本分支中未提交的所有修改 + + + +以下是放弃当前分支所有未提交修改的完整方法,根据修改状态分类处理: + + + +一、未暂存的修改(未执行git add) + + + +放弃单个文件修改: + +bash + +Copy Code + +git checkout -- <文件名> + + + +放弃所有文件修改: + +bash + +Copy Code + +git checkout . + + + +此操作会永久丢弃工作区所有未暂存的修改 + + + +二、已暂存未提交的修改(执行过git add) + + + +撤销单个文件暂存(保留工作区修改): + +bash + +Copy Code + +git reset HEAD <文件名> + + + +撤销所有暂存(保留工作区修改): + +bash + +Copy Code + +git reset HEAD + + + +彻底丢弃暂存区和工作区修改: + +bash + +Copy Code + +git reset --hard HEAD + + + +该操作会同步清除暂存区和工作区 + + + +三、包含未跟踪文件的情况 + + + +清除所有未跟踪文件(需配合git reset使用): + +bash + +Copy Code + +git clean -df + + + +-d 同时删除未跟踪目录 + +-f 强制执行 + + + +四、临时保存修改(可恢复) + + + +存储当前修改到堆栈: + +bash + +Copy Code + +git stash + + + +彻底丢弃最近一次存储: + +bash + +Copy Code + +git stash drop + + + +查看所有存储记录: + +bash + +Copy Code + +git stash list + +```Plain + + +注意事项: + +所有--hard和clean操作不可逆,建议先执行git status确认修改内容 +若需保留修改但切换分支,优先使用git stash方案 +已提交的修改需使用git reset --hard 回退到指定版本 +``` \ No newline at end of file diff --git a/docs/Obsidian/git/git常用命令.md b/docs/Obsidian/git/git常用命令.md new file mode 100644 index 0000000..969026e --- /dev/null +++ b/docs/Obsidian/git/git常用命令.md @@ -0,0 +1,230 @@ +我来为你详细介绍 Git 的使用方法和常用命令。 + +## **Git 基础概念** +- **仓库 (Repository)**:存储项目代码和历史记录的地方 +- **工作区 (Working Directory)**:你正在编辑的文件 +- **暂存区 (Staging Area)**:准备提交的文件 +- **本地仓库 (Local Repository)**:本地保存的版本历史 +- **远程仓库 (Remote Repository)**:GitHub/GitLab 等平台的仓库 + +## **Git 工作流程** +``` +工作区 → `git add` → 暂存区 → `git commit` → 本地仓库 → `git push` → 远程仓库 +``` + +## **常用命令分类** + +### **1. 配置相关** +```bash +# 设置用户信息 +git config --global user.name "你的名字" +git config --global user.email "你的邮箱" + +# 查看配置 +git config --list + +# 设置默认编辑器(如 VS Code) +git config --global core.editor "code --wait" +``` + +### **2. 仓库操作** +```bash +# 初始化新仓库 +git init + +# 克隆远程仓库 +git clone <仓库URL> +git clone https://github.com/username/repo.git + +# 查看仓库状态 +git status + +# 查看远程仓库 +git remote -v + +# 添加远程仓库 +git remote add origin <仓库URL> +``` + +### **3. 基础操作** +```bash +# 添加文件到暂存区 +git add 文件名 # 添加特定文件 +git add . # 添加所有修改 +git add *.js # 添加所有js文件 + +# 提交到本地仓库 +git commit -m "提交说明" + +# 添加并提交(两步合并) +git commit -am "提交说明" # 只能提交已跟踪的文件 + +# 查看提交历史 +git log +git log --oneline # 简洁显示 +git log --graph # 图形化显示分支 +git log -p # 显示具体修改内容 +``` + +### **4. 分支管理** +```bash +# 查看分支 +git branch # 查看本地分支 +git branch -a # 查看所有分支(包括远程) +git branch -r # 查看远程分支 + +# 创建分支 +git branch 分支名 # 创建分支 +git checkout -b 分支名 # 创建并切换到该分支 +git switch -c 分支名 # 新版本推荐(Git 2.23+) + +# 切换分支 +git checkout 分支名 +git switch 分支名 # 新版本推荐 + +# 合并分支 +git merge 分支名 # 将指定分支合并到当前分支 + +# 删除分支 +git branch -d 分支名 # 删除已合并的分支 +git branch -D 分支名 # 强制删除分支 +``` + +### **5. 远程操作** +```bash +# 推送代码 +git push origin 分支名 +git push -u origin main # 首次推送并建立关联 + +# 拉取代码 +git pull origin 分支名 # 拉取并合并 +git fetch origin # 只拉取不合并 + +# 同步远程分支 +git fetch --prune # 删除本地不存在的远程分支引用 +``` + +### **6. 撤销操作** +```bash +# 撤销工作区修改 +git checkout -- 文件名 # 丢弃工作区修改 +git restore 文件名 # 新版本推荐 + +# 撤销暂存区文件 +git reset HEAD 文件名 # 从暂存区移除 +git restore --staged 文件名 # 新版本推荐 + +# 修改上次提交 +git commit --amend # 修改提交信息或内容 + +# 回退到指定版本 +git reset --soft HEAD^ # 撤销commit,保留修改到暂存区 +git reset --mixed HEAD^ # 撤销commit,保留修改到工作区(默认) +git reset --hard HEAD^ # 彻底删除commit和修改 +git reset --hard commit_id # 回退到指定commit +``` + +### **7. 暂存修改** +```bash +# 临时保存修改 +git stash # 保存当前修改 +git stash save "说明" # 保存并添加说明 +git stash list # 查看暂存列表 +git stash apply # 恢复最近暂存的修改 +git stash pop # 恢复并删除暂存记录 +git stash drop # 删除暂存记录 +``` + +### **8. 标签管理** +```bash +# 创建标签 +git tag v1.0 # 创建轻量标签 +git tag -a v1.0 -m "版本说明" # 创建附注标签 + +# 查看标签 +git tag # 列出所有标签 +git show v1.0 # 查看标签详情 + +# 推送标签 +git push origin v1.0 # 推送单个标签 +git push origin --tags # 推送所有标签 +``` + +### **9. 比较差异** +```bash +git diff # 比较工作区和暂存区 +git diff --staged # 比较暂存区和最新提交 +git diff HEAD # 比较工作区和最新提交 +git diff 分支1 分支2 # 比较两个分支 +git diff commit1 commit2 # 比较两次提交 +``` + +## **实用工作流程示例** + +### **场景1:日常开发流程** +```bash +# 1. 开始新功能 +git checkout main +git pull origin main +git checkout -b feature/new-feature + +# 2. 开发 +git add . +git commit -m "添加新功能" + +# 3. 推送 +git push origin feature/new-feature + +# 4. 合并到主分支 +git checkout main +git merge feature/new-feature +git push origin main +``` + +### **场景2:处理紧急bug** +```bash +# 1. 暂存当前工作 +git stash + +# 2. 创建修复分支 +git checkout -b hotfix/bug-fix + +# 3. 修复并提交 +# ... 修复代码 ... +git add . +git commit -m "修复紧急bug" + +# 4. 合并修复 +git checkout main +git merge hotfix/bug-fix +git push origin main + +# 5. 恢复之前的工作 +git checkout feature/your-branch +git stash pop +``` + +## **实用技巧** +1. **设置别名**: + ```bash + git config --global alias.co checkout + git config --global alias.br branch + git config --global alias.ci commit + git config --global alias.st status + ``` + +2. **查看帮助**: + ```bash + git help <命令> + git <命令> --help + ``` + +3. **忽略文件**:创建 `.gitignore` 文件 + +## **注意事项** +- 重要操作前先备份或确认 +- 频繁提交小改动,保持提交信息清晰 +- 推送前先拉取最新代码 +- 使用分支进行功能开发 + +这些是 Git 最常用的命令,掌握了这些就能应对大部分日常开发需求。 \ No newline at end of file diff --git a/docs/Obsidian/saars开发/aitsc维护命令.md b/docs/Obsidian/saars开发/aitsc维护命令.md new file mode 100644 index 0000000..d3692f6 --- /dev/null +++ b/docs/Obsidian/saars开发/aitsc维护命令.md @@ -0,0 +1,160 @@ +系统维护常用语: +以行业和职业的维度,继续追加生成更多的提示词模板 +以行业和职业的维度,继续追加生成更多不同的技术方向研发工程师的提示词模板 +以行业和职业的维度,继续追加生成更多不同的ui设计方向设计师的提示词模板 +以行业和职业的维度,继续追加生成更多不同的设计软件系统整体架构方向的架构师的提示词模板 +以行业和职业的维度,继续追加生成python全栈开发的架构师的提示词模板 +以行业和职业的维度,继续追加生成软件产品经理的提示词模板 +以行业和职业的维度,继续追加生成微信小程序开发工程师的提示词模板 +以行业和职业的维度,继续追加生成android开发工程师的提示词模板 +以行业和职业的维度,继续追加生成考公的提示词模板 +按照行业和职业的维度,将生成好的提示词模板进行分类 + +将项目中的所有接口都写出文档,保存保存在 flask_prompt_master/docs/api_documentation.txt 路径下 +更新API文档,包含项目中的所有接口。我会在现有文档的基础上添加其他接口的说明 + + +提示词大师 +智能生成高质量提示词,提升您的工作效率。 +基于先进的大模型技术,快速生成精准提示词。 + + +完成核心功能后我们就开始测试mvp + + +常用命令: +初始化数据库 python -m flask_prompt_master.init_db + +更新数据库 python test_db.py + + +# 激活虚拟环境 +.\myenv\Scripts\activate +.venv\Scripts\activate +# 激活虚拟环境 +source venv/bin/activate +启动项目 +python run_dev.py + + + +linux数据库操作 +mysql -uroot -p +数据库密码:123456 +创建数据表 +数据库名:food_db +CREATE DATABASE `food_db` DEFAULT CHARACTER SET = `utf8mb4`; +删除表 DROP DATABASE IF EXISTS food_db; +查看表 +show databases; +进入数据表 +use food_db; +show tables; +select * from user ; +show create table user; + + +1. 开启mysql service mysqld start +2. 查看mysql是否开启 ps -ef |grep mysql + + +创建数据表 +CREATE TABLE `container_orchestration_assistant` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '助手ID', + `name` varchar(100) NOT NULL DEFAULT '' COMMENT '助手名称', + `description` varchar(255) NOT NULL DEFAULT '' COMMENT '助手描述', + `category` varchar(50) NOT NULL DEFAULT '' COMMENT '分类(架构设计)', + `industry` varchar(50) NOT NULL DEFAULT '' COMMENT '行业(技术研发)', + `profession` varchar(50) NOT NULL DEFAULT '' COMMENT '职业(高级工程师)', + `sub_category` varchar(50) NOT NULL DEFAULT '' COMMENT '子分类(容器编排)', + `system_prompt` text NOT NULL COMMENT '系统提示词(容器化需求转换规则)', + `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:1-有效,0-无效', + `updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后一次更新时间', + `created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_category` (`category`), + KEY `idx_industry` (`industry`), + KEY `idx_profession` (`profession`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Python容器编排助手表'; + + + + +插入一条user数据 +INSERT INTO `user` (`uid`, `nickname`, `mobile`, `email`, `sex`, `avatar`, `login_name`, `login_pwd`, `login_salt`, `status`, `updated_time`, `created_time`) +VALUES + (2, '编程浪子www.54php.cn', '11012345679', 'apanly@163.com', 1, '', '54php.cn', '816440c40b7a9d55ff9eb7b20760862c', 'cF3JfH5FJfQ8B2Ba', 1, '2017-03-15 14:08:48', '2017-03-15 14:08:48'); + + + + + + + +1. 项目结构 +根目录下主要内容如下: +flask_prompt_master/:主应用目录,包含核心业务逻辑 +static/、templates/:静态资源和前端模板 +migrations/:数据库迁移相关 +tests/:测试代码 +scripts/:脚本工具 +config.py:全局配置文件 +run_dev.py:开发环境启动入口 +gunicorn.conf.py:Gunicorn 配置 +start_gunicorn.sh、stop_gunicorn.sh:Gunicorn 启动/停止脚本 +requirements.txt:依赖列表 +各类产品、开发、运维、测试文档 +2. 主要依赖 +Flask 2.x +Flask-SQLAlchemy +Flask-Migrate +Flask-Cors +Gunicorn +其他常用 Flask 扩展 +3. 启动方式 +开发环境:python run_dev.py +生产环境:./start_gunicorn.sh(Gunicorn + Nginx 反向代理) +4. 配置说明 +config.py 负责数据库、API Key、微信小程序等配置 +Gunicorn 监听本地 8001 端口,Nginx 代理 80 端口对外服务 +支持通过环境变量灵活切换配置 +5. 主要功能模块 +用户认证与管理 +提示词管理 +微信小程序集成 +日志与运维 +丰富的产品、测试、运维文档 +6. 典型部署架构 +Gunicorn 只监听本地(127.0.0.1:8001) +Nginx 监听 80 端口,反向代理到 Gunicorn +外部通过域名或 IP 访问 Nginx +若有 SELinux,需允许 Nginx 访问本地端口 +7. 典型问题与解决 +502 Bad Gateway:多为 SELinux 拒绝,需 sudo setsebool -P httpd_can_network_connect 1 +端口冲突:Gunicorn/Nginx 配置端口需唯一 +依赖不兼容:Flask 与 Flask-SQLAlchemy 需版本匹配 + + + + + + +写一个android framework入门教程的设计方案,使用章节形式。 + +写一个android framework高级教程的设计方案,使用章节形式。 + + + + + +代码上库 +TicketNo:3 +Description:历史记录版本 +Team:ruilaizi +Feature or Bugfix:Feature Binary Source:No +PrivateCode(Yes/No):No + + +提交的是Python编译文件(.pyc文件)。通常这些文件不应该被提交到版本控制中。让我先取消暂存这些文件,然后添加一个.gitignore文件来忽略它们: + + \ No newline at end of file diff --git a/docs/Obsidian/saars开发/互联网saar系统是什么,可以解决哪些场景需求的问题.md b/docs/Obsidian/saars开发/互联网saar系统是什么,可以解决哪些场景需求的问题.md new file mode 100644 index 0000000..7c2f866 --- /dev/null +++ b/docs/Obsidian/saars开发/互联网saar系统是什么,可以解决哪些场景需求的问题.md @@ -0,0 +1,50 @@ +SAAS(Software-as-a-Service,软件即服务)是一种通过互联网提供软件应用的模式。简单来说,它就像“直接接入国家电网用电”,你无需购买和维修发电机(软件和服务器),只需通过浏览器登录,按需付费订阅即可获得最新的软件服务。 + +### 🔍 核心价值与对比 +与传统本地部署软件相比,SAAS在多个维度提供了更灵活的方案: + +| 对比维度 | SAAS (软件即服务) | 传统本地部署软件 | +| :--- | :--- | :--- | +| **部署方式** | **云端部署**,通过浏览器访问 | 需在本地服务器或计算机**安装部署** | +| **费用模式** | **订阅制**(按月/年付费),运营支出 | **一次性买断**许可证,资本支出 | +| **维护责任** | **供应商负责**维护、更新、安全及基础设施 | **企业自行负责**维护、更新与硬件管理 | +| **获取速度** | **即开即用**,注册后快速开始 | 采购、安装、调试**周期长** | +| **扩展性** | **弹性扩展**,可随需增减用户或功能 | **扩展困难**,通常需新增硬件和许可证 | +| **访问性** | **随时随地**通过互联网访问 | 通常局限于**公司内部网络** | + +### 💼 主要应用场景 +SAAS已渗透到各行各业,为不同场景提供了解决方案: + +* **企业通用管理**: + * **客户关系管理(CRM)**:集中管理客户信息、销售流程和市场营销活动。代表产品如Salesforce。 + * **企业资源计划(ERP)**:集成财务、采购、库存、生产等核心业务流程。 + * **人力资源管理(HRM)**:覆盖招聘、考勤、薪酬、绩效等模块。 + * **协同办公与沟通**:提升团队协作效率,如Slack、Microsoft Teams、Lark、Google Workspace等。 + +* **特定行业解决方案**: + * **零售电商**:整合线上线下进销存、会员管理和全渠道订单。例如,一些系统能帮助连锁门店将库存周转天数从38天降至22天。 + * **制造业**:进行轻量化的生产工单管理、物料需求计划和成本核算。有工厂借此将订单交付准时率从70%提升至95%。 + * **服务业**:为餐饮、教培、物流等行业提供线上线下一体化的流程管理。 + * **IT运维**:实现基础监控、应用性能管理、日志分析等。 + +* **专业工具与垂直领域**: + * **财务会计**:支持在线记账、发票扫描、一键报税。 + * **垂直SaaS**:针对法律、医疗、建筑等特定行业的深度解决方案正在兴起。 + +### ⚠️ 潜在挑战与考量 +采用SAAS也需注意以下方面: +* **数据安全与隐私**:企业数据存放于云端供应商处,需关注供应商的**安全认证**(如ISO27001)、**数据加密**(全程HTTPS)、数据备份与恢复机制。 +* **供应商锁定**:迁移数据和流程到其他平台可能耗时且昂贵。 +* **集成与定制限制**:与企业内部其他系统的集成可能受限于API,个性化定制能力通常不如本地软件。 +* **长期成本与“SaaS蔓延”**:订阅服务可能随用户数增长而累积,多个SaaS无序扩张(“SaaS蔓延”)会导致成本浪费和管理复杂。 + +### 💡 如何选择与评估SAAS +在决策时,你可以从这几个角度思考: +1. **匹配核心需求**:明确最需要解决的1-2个核心痛点(如库存混乱、远程协作),选择最擅长此功能的SaaS。 +2. **评估供应商**:考察供应商的信誉、历史、安全合规认证(如等保三级)及服务稳定性。 +3. **成本效益分析**:计算3-5年的总拥有成本,而不仅是首年订阅费。 +4. **充分利用试用**:几乎所有主流SaaS都提供**免费试用期**,这是验证产品是否匹配业务流程的最佳方式。 + +总而言之,SAAS的核心价值在于以更低的初始成本、更灵活的方式,帮助企业快速获得先进的数字化能力。对于成长型企业、分支机构众多的公司或需要快速适应市场变化的业务尤其适合。 + +如果你能分享你具体关注的行业或希望解决的业务痛点(例如销售管理、库存控制还是财务核算),我可以为你提供更具针对性的分析。 \ No newline at end of file diff --git a/docs/Obsidian/saars开发/数据库配置.md b/docs/Obsidian/saars开发/数据库配置.md new file mode 100644 index 0000000..74fc0c0 --- /dev/null +++ b/docs/Obsidian/saars开发/数据库配置.md @@ -0,0 +1,3 @@ +# 数据库配置 - 腾讯云数据库 + +DATABASE_URL=mysql+pymysql://root:!Rjb12191@gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com:24936/pro_db?charset=utf8mb4 \ No newline at end of file diff --git a/docs/Obsidian/saars开发/营养师/健康营养师分析数据.md b/docs/Obsidian/saars开发/营养师/健康营养师分析数据.md new file mode 100644 index 0000000..2dbc23d --- /dev/null +++ b/docs/Obsidian/saars开发/营养师/健康营养师分析数据.md @@ -0,0 +1,115 @@ +✅ DeepSeek deepseek-chat 响应结果: + +好的,作为一名专业的增重营养师与健康管理专家,我已仔细分析了您的情况。 + +**基础数据评估**(36岁女性 / 男性,身高160cm,体重40kg) +* **身高**: 160 cm +* **当前体重**: 40 kg +* **体质指数(BMI)**: 40 / (1.6²) = **15.6 kg/m²** + * **评估**: BMI < 18.5 属于体重过轻。您目前的BMI为15.6,属于**严重体重不足**范围。这是一个需要严肃、系统干预的健康问题。 +* **可能的健康风险**:长期严重体重不足可能导致免疫力下降、易疲劳、骨质疏松、女性月经紊乱、肌肉流失、怕冷、组织修复能力差等一系列问题。 + +增重的核心原则是**“热量盈余” + “均衡营养” + “适当运动”**。方案必须在专业医生排除病理原因(如甲状腺功能亢进、消化系统疾病等)后开始执行。 + +--- + +### **科学增重与健康改善计划 (定制版)** + +本计划旨在**通过均衡、充足的营养摄入和安全的力量训练,以健康的方式增加体重,目标是增加肌肉为主、适量体脂为辅,逐步提升至健康体重范围(BMI ≥ 18.5,即体重≥47.5kg)**。 + +#### **第一步:饮食总策略 - “温和地创造热量盈余”** + +1. **每日热量目标**: + * **基础计算**: 您当前维持体重所需热量大约在1500-1600千卡/天。 + * **增重起始目标**: 设定每日总热量摄入为 **2000-2200千卡**,约比维持热量多出 **400-600千卡**的盈余。 + * **初期目标体重**: 每2-4周稳定增加0.5-1公斤是比较理想的健康速度。 + +2. **营养素科学配比原则**: + * **碳水化合物(50%-55%)**: 是提供能量、保证增重的主力,以复合碳水为主。 + * **蛋白质(20%-25%)**: 足量蛋白质是修复和构建肌肉的基石。每日目标为 **1.5-2.0克/公斤体重**,即 **60-80克**。 + * **脂肪(25%-30%)**: 重点摄入健康脂肪,提供高密度热量,促进脂溶性维生素吸收。 + +#### **第二步:具体膳食安排与加餐技巧** + +**上午 7:00-8:00 早餐 (要求高密度、易消化)** +* **目标热量**: 500-600千卡 +* **参考搭配A**: 红薯小米粥1碗 + 鸡蛋2个(或水煮或煎蛋) + 蒸饺/烧卖3-4个 + 核桃3颗 +* **参考搭配B**: 牛奶燕麦粥(250ml牛奶+50g燕麦+一把混合果干) + 牛油果半个 +* **原则**:必须有主食、优质蛋白和少量健康脂肪。 + +**上午 10:30 加餐** +* **目标热量**: 200-300千卡 +* **选择**: 酸奶1杯(约200g) + 一小把坚果(杏仁/腰果) 或 1根香蕉 + 花生酱1勺,或1片全麦面包涂抹奶酪。 + +**中午 12:30 午餐 (重点餐)** +* **目标热量**: 650-750千卡 +* **结构模板**: + * **主食**: 米饭1.5碗(约200-250克熟重)或同等面食。 + * **优质蛋白**: 手掌大小的红肉/禽肉/鱼肉(约150克)或一块手掌大的豆腐。 + * **蔬菜**: 两种不同颜色的蔬菜,共一碗(约250克),用适量油快炒。 + * **汤(可选)**: 可在餐后少量饮用营养较浓的汤(如排骨汤、鸡汤),但不要用餐前喝太多汤水影响进食量。 + +**下午 15:30 加餐 (强推力荐)** +* **目标热量**: 250-350千卡 +* **选择(自制营养密度更高的饮品)**: + * **自制增重奶昔 (例)**: 250ml全脂牛奶 + 1勺乳清蛋白粉(或市售增重粉)+ 1根香蕉 + 1勺花生酱/亚麻籽油,搅拌均匀饮用。这是增加热量和蛋白质摄入非常高效的方式。 + +**晚上 18:30 晚餐** +* **目标热量**: 550-650千卡 +* **结构模板**: 同午餐,但**蛋白质**可选择更易消化的,如鱼肉、鸡胸肉、鸡蛋、豆腐;**主食**可换成杂粮饭或面食;**蔬菜**仍要保证足量。 + +**晚上 21:00 睡前加餐 (可选)** +* **目标热量**: 150-250千卡 +* **选择**: 一杯温热牛奶(或酸奶、豆浆) + 几片苏打饼干。主要提供缓慢释放的蛋白质和能量,帮助夜间身体恢复。 + +**饮食习惯调整要点**: +1. **食量不足者优先**: 如果饭量小,优先保证主食和蛋白质的摄入,再吃蔬菜。遵循“干湿分离”,少喝清汤或饮料占用胃容量。 +2. **使用功能性食物**: 用花生酱、芝麻酱、奶酪、牛油果、橄榄油、坚果碎为常规饭菜、沙拉或汤增加热量而不显著增加体积。 +3. **饮水时机**: 避免在饭前或饭中大量喝水,留出空间给食物。建议在两餐之间饮水充足。 +4. **适口性**: 在不违背健康原则的前提下,尊重您的“**个人偏好**”,将食物做得更美味诱人,适度使用香料和健康调味品。 + +#### **第三步:运动配合方案 - 增加肌肉,而非纯脂肪** + +* **目标**: 肌肉的增长需要“营养+刺激”。力量训练能促使多余的热量更多用于合成肌肉。 +* **频率**: 每周进行2-3次,训练日最好与非训练日交替。 +* **内容建议**(建议从低强度开始,或请教专业教练指导): + * **可选基础动作**: 自重深蹲、跪姿俯卧撑、弹力带划船、臀桥等。从每个动作2组,每组8-12次开始。 + * **循序渐进**: 适应后可考虑在健身房使用固定器械进行胸部推举、高位下拉、坐姿划船、腿举等。 + * **避免**: 长时间、消耗性的有氧运动(如长跑)。 +* **运动营养**: **训练后30-60分钟内,是最佳的“营养窗口期”**。在此刻喝一杯自制增重奶昔或“牛奶+面包+蛋”组合,事半功倍。 + +#### **第四步:监测与实用建议** + +1. **跟踪记录**: + * **食物日志**: 使用App(如薄荷健康)记录3-5天饮食,了解实际热量与营养素是否达标。 + * **体重变化**: **每周固定清晨空腹、排便后测一次体重**并记录,不必每日测量,以免焦虑。 + * **围度测量**: 每月测量一次上臂、胸、腰、臀、大腿围度,有时体重未变但肌肉增加,围度会有积极变化。 + +2. **健康管理建议**: + * **必须就医检查**: 在开始计划前,请务必咨询医生并进行必要体检(如甲功、消化内镜等),明确严重体重不足是否由潜在疾病引起。 + * **循序渐进**: 若初始食量难以达到2000千卡,可从1800千卡开始,用1-2周的时间逐步增加食量和调整食物密度。 + * **保证睡眠**: 身体在睡眠时进行修复和生长。请保证每日7-9小时的高质量睡眠。 + * **管理压力**: 长期压力会影响食欲和营养吸收。可通过冥想、听音乐、散步等方式放松。 + +**健康宣誓:增重是一个与身体重新建立和谐关系的过程。您的目标不是单纯的“胖”,而是更强壮、更有活力、更健康的自己。请用耐心和科学的方法,温和地对待这个过程。祝您成功!** + +> **免责声明**:本计划为通用性营养与健康管理指导。鉴于您体重过轻程度较为严重,强烈建议在专业医生和临床营养师的共同指导下制定并执行具体方案。 + +--- +📝 使用的提示词: +你是一位增重营养营养师和健康管理专家 + +为增重人群制定改善健康营养计划,年龄为36岁,体重为40kg,身高为160cm。 + +背景信息:需要根据个人情况制定科学、可行的营养方案。 + +约束条件: +- 科学营养搭配 +- 考虑个人偏好 +- 提供实用建议 + +输出格式:markdown + + + +⏰ 测试时间:2026/1/8 11:24:07 \ No newline at end of file diff --git a/docs/Obsidian/saars开发/营养师/营养师分析数据.md b/docs/Obsidian/saars开发/营养师/营养师分析数据.md new file mode 100644 index 0000000..93d53b9 --- /dev/null +++ b/docs/Obsidian/saars开发/营养师/营养师分析数据.md @@ -0,0 +1,102 @@ +✅ DeepSeek deepseek-chat 响应结果: + +# 增重营养与健康改善计划 + +## 一、个人健康评估 + +| 项目 | 数值 | 评估 | +|------|------|------| +| 年龄 | 36岁 | 成年期,代谢相对稳定 | +| 身高 | 160 cm | 标准身高范围 | +| 体重 | 40 kg | **体重过轻**(BMI ≈ 15.6,远低于健康范围18.5-24) | +| BMI | 15.6 | 严重体重不足,需系统增重以改善健康 | + +**主要目标:** +在3-6个月内增加体重至45-48kg(BMI ≥ 17.5),改善营养状况,增强体能。 + +--- + +## 二、科学营养搭配原则 + +1. **高能量密度饮食**:增加健康热量摄入,每日目标热量 **2200-2500 kcal**(基础代谢约1200 kcal + 活动消耗 + 增重所需盈余)。 +2. **均衡营养素比例**: + - 碳水化合物:50-55% + - 蛋白质:15-20% + - 脂肪:25-30% +3. **少食多餐**:每日5-6餐,减轻单次进食负担。 +4. **优先天然食物**:避免依赖加工食品,注重营养质量。 + +--- + +## 三、每日膳食计划示例(可根据偏好调整) + +| 时间 | 餐次 | 食物建议 | 营养重点 | +|------|------|----------|----------| +| 7:00 | 早餐 | 燕麦粥(+坚果碎、蜂蜜)、水煮蛋1个、全脂牛奶200ml | 复合碳水、优质蛋白 | +| 10:00 | 加餐 | 香蕉1根、核桃3-4颗、酸奶150g | 便捷能量、健康脂肪 | +| 12:30 | 午餐 | 米饭1.5碗、红烧鸡腿/鱼肉、炒蔬菜(用橄榄油)、豆腐汤 | 高蛋白、均衡搭配 | +| 15:30 | 加餐 | 全麦面包夹花生酱、果汁1杯 | 碳水+脂肪,补充能量 | +| 18:30 | 晚餐 | 米饭1碗、牛肉炒西兰花、蒸蛋、牛油果半颗 | 蛋白质、微量元素 | +| 21:00 | 晚加餐 | 全脂牛奶或豆浆200ml、燕麦饼干2块 | 缓释碳水,助眠 | + +--- + +## 四、个性化调整与偏好考虑 + +- **若食欲不佳**: + 可选用流质或半流质高能量食物,如奶昔(牛奶+香蕉+燕麦+坚果酱)、浓汤、粥类。 +- **若偏好素食**: + 增加豆制品、坚果、种子、全谷物、植物油摄入,必要时补充维生素B12、铁。 +- **若消化较弱**: + 食物烹饪至软烂,避免过多粗纤维,可添加益生菌饮品(如酸奶)。 +- **若时间紧张**: + 提前准备便携加餐(如坚果棒、奶酪、煮鸡蛋)。 + +--- + +## 五、实用执行建议 + +1. **记录饮食**:使用APP记录每日热量与营养素,确保达标。 +2. **渐进增加食量**:每周逐步增加主食或加餐分量,避免肠胃不适。 +3. **选择健康零食**:坚果、干果、奶酪、酸奶等作为常备加餐。 +4. **烹饪用油**:多用橄榄油、菜籽油、花生油,增加热量不增加体积。 +5. **液体热量**:饮用全脂牛奶、豆浆、果汁代替白水或低热量饮料。 +6. **力量训练结合**:每周2-3次轻度力量训练(如哑铃、深蹲),刺激食欲与肌肉增长。 +7. **监测与调整**:每2周称重,根据进度调整热量摄入。 + +--- + +## 六、注意事项 + +- **避免空热量食物**:如糖果、油炸食品,虽增重但不利于健康。 +- **保持水分摄入**:每日饮水1.5-2L,但避免餐前大量饮水影响食欲。 +- **咨询医生**:如长期体重过低,需排除消化吸收问题或甲亢等疾病。 +- **心理支持**:保持积极心态,增重需耐心,可与家人或营养师保持沟通。 + +--- + +## 七、一周食谱灵活模板 + +| 早餐 | 午餐 | 晚餐 | 加餐(选2-3次) | +|------|------|------|----------------| +| 燕麦+牛奶+蛋 | 米饭+肉类+蔬菜 | 米饭/面+豆制品+蔬菜 | 坚果、酸奶、水果、面包涂酱 | +| + +--- +📝 使用的提示词: +你是一位增重营养营养师和健康管理专家 + +为增重人群制定改善健康营养计划,年龄为36岁,体重为40kg,身高为160cm。 + +背景信息:需要根据个人情况制定科学、可行的营养方案。 + +约束条件: +- 科学营养搭配 +- 考虑个人偏好 +- 提供实用建议 + +输出格式:markdown + + + +⏰ 测试时间:2026/1/8 11:11:51 \ No newline at end of file diff --git a/docs/Obsidian/创业/我是一名从事android 应用的开发者,写过多款应用,写过微信小程序,写过h5,也做过3年的framework开发,写过python后台。我想创业,不知道可以具体怎么来做?.md b/docs/Obsidian/创业/我是一名从事android 应用的开发者,写过多款应用,写过微信小程序,写过h5,也做过3年的framework开发,写过python后台。我想创业,不知道可以具体怎么来做?.md new file mode 100644 index 0000000..ee20459 --- /dev/null +++ b/docs/Obsidian/创业/我是一名从事android 应用的开发者,写过多款应用,写过微信小程序,写过h5,也做过3年的framework开发,写过python后台。我想创业,不知道可以具体怎么来做?.md @@ -0,0 +1,56 @@ +你的技术背景(Android、小程序、H5、Framework、Python后台)是你创业的**核心优势**,这表明你具备从产品实现到技术架构的全栈能力,非常适合启动一个技术驱动的创业项目。 + +结合你的背景和当前市场机会,我为你梳理了几个高匹配度且经过验证的方向: + +| 推荐方向 | 市场切入点与模式 | 你的优势匹配度 | +| :--- | :--- | :--- | +| **垂直行业SaaS/小程序工具** | 为**餐饮、零售、教培、本地生活**等行业提供深度数字化解决方案(如:会员管理、生产进度可视化小程序),或面向企业开发**自动化工具**(如:营销、数据爬虫)。 | 极高。能用Python开发后端,小程序/H5/安卓做前端,快速实现MVP。 | +| **企业服务与数字化转型** | 为传统中小型企业(尤其是制造业、服务业)提供**定制化数字化转型服务**,例如定制CRM、ERP模块。 | 极高。3年Framework经验能应对复杂业务系统开发。 | +| **聚焦特定场景的移动应用** | 面向**细分人群或场景**(如:中老年、母婴、特定职业工具)开发应用,或利用你的优势开发**跨平台效率工具**(如:笔记、时间管理)。 | 高。能打造原生安卓的优质体验,结合H5/小程序快速验证。 | + +### 🧭 起步的清晰路线图 +确定了方向后,你可以遵循以下路径将想法落地: + +1. **第一步:找到核心痛点** + 这是最重要的一步。不要从技术出发,而要从市场需求出发。可以通过在小红书、知乎、行业社群观察,或与潜在客户深入交流,找到一个你愿意长期解决、且市场愿意付费的真实问题。 + +2. **第二步:定义最小可行产品** + 围绕找到的核心痛点,设计一个具备最核心功能的MVP。你的目标是用最小成本验证市场,而不是做一个功能完美的产品。比如,一个解决餐厅排号问题的小程序,MVP可能只包含“取号、叫号、通知”三个核心功能。 + +3. **第三步:选择你的商业模式** + 根据你解决的是谁的痛点,选择你的收费对象和模式。常见模式有: + * **SaaS订阅制**:企业按年/月付费。稳定,适合工具类。 + * **项目定制费**:为企业提供定制开发服务。启动快,现金流好。 + * **交易佣金**:作为平台方,从促成的交易中抽成。适合连接供需的本地服务平台。 + +### 💡 关键建议与资源 +创业不仅是技术,更是商业综合能力的考验。你需要特别注意以下三点: + +* **把控风险**: + * **警惕伪需求**:在投入大量开发前,一定要通过各种方式验证需求。 + * **注重合规**:涉及教育、医疗、金融等领域时,务必提前了解相关资质和合规要求。 + * **管理成本**:合理利用云服务、开源组件来控制初期成本,并规划好至少18个月的现金流。 +* **用好你的技术背景**: + * **技术选型要务实**:以解决业务问题为导向,避免过度追求新技术。 + * **利用已有作品**:过往项目是证明你能力的最佳名片,可以用来吸引早期客户。 +* **积极寻求外部支持**:国家人社部每年会举办 **“源来好创业”** 资源对接服务季活动,能为你提供政策、场地、融资、导师等关键资源对接。请密切关注当地人社部门的通知,积极参与。 + +要避免失败,常见的雷区包括:过度追求技术完美而忽略市场验证、对维护和运营成本预估不足,以及过度依赖单一客户。 + +### 🤔 如何做出最终决策 +面对众多选项,如何做出选择?你可以用这个创业战略框架来思考你的初步想法: + +```mermaid +quadrantChart + title 创业战略定位思考 + x-axis “倾向于合作/融入现有体系” --> “倾向于竞争/构建新体系” + y-axis “倾向于控制核心技术/产品” --> “倾向于快速执行/占领市场” + “知识产权战略”: [0.25, 0.8] + “价值链战略”: [0.25, 0.2] + “架构战略”: [0.75, 0.8] + “颠覆战略”: [0.75, 0.2] +``` + +例如,如果你发现一个传统行业有痛点,且现有大公司无意解决,你可以考虑“**颠覆战略**”,利用新技术快速推出产品服务那些被忽视的客户。在真正投入前,花小成本(如设计产品原型、访谈潜在用户)去验证每条路径的核心假设。 + +希望这份梳理能帮你理清思路。如果你对上述某个方向有了初步想法,或者想进一步了解某个商业模式的具体打法,我们可以继续深入探讨。 \ No newline at end of file diff --git a/docs/Obsidian/欢迎.md b/docs/Obsidian/欢迎.md new file mode 100644 index 0000000..034ec91 --- /dev/null +++ b/docs/Obsidian/欢迎.md @@ -0,0 +1,5 @@ +这是你的新*仓库*。 + +写点笔记,[[创建链接]],或者试一试[导入器](https://help.obsidian.md/Plugins/Importer)插件! + +当你准备好了,就将该笔记文件删除,使这个仓库为你所用。 \ No newline at end of file diff --git a/docs/Obsidian/生活/教育/9个国家级免费学习平台.md b/docs/Obsidian/生活/教育/9个国家级免费学习平台.md new file mode 100644 index 0000000..40b2cd0 --- /dev/null +++ b/docs/Obsidian/生活/教育/9个国家级免费学习平台.md @@ -0,0 +1,61 @@ +为有效支持“双减”和疫情期间“停课不停学”工作,近期教育部在原“国家中小学网络云平台”基础上改版升级了“国家中小学智慧教育平台”,并于3月1日正式上线试运行,瞬间刷屏朋友圈,许多老师和家长都大力推荐。 + +应家长们的要求,编编也为大家搜集、整理了一批来源权威,多为国家级、内容全面且完全免费的教育资源平台,家长们可以用手机或者电脑直接规划孩子学习哦~ + +01 国家中小学智慧教育平台 + +﹥网址:https://www.zxx.edu.cn/ + +目前,国家中小学智慧教育平台各类资源全部免费使用。有专题教育、课程教学、课后服务、教师研修、家庭教育、教改实践经验等6个版块,资源数量比原来增加了一倍,为有效服务学生居家学习、服务教师线上教学、服务家长开展家庭教育提供支持。 + +02 国家教育资源公共服务平台 + +﹥网址:https://www.eduyun.cn/ + +国家教育资源公共服务平台由中国教育部主办,全国各地优秀教师定期上传教学资料,包括教学课件、课堂实录,习题素材等,让优质资源和应用惠及每个人,推送区域教育资源平台互联互通。 + +03 学习强国APP + +﹥各大软件商城可搜索下载 + +学习强国APP,资源丰富、内容安全,没有广告弹出,还可以投屏。有课堂同步课,学科精品课,音乐美术课,像少儿编程这些收费网课,在这里都是免费看,还有科学课,围棋课,街舞课、书法课、折纸课等素养课程,简直就是宝藏。 + +04 中小学语文课文示范诵读库 + +﹥网址:http://edu.cnr.cn/eduzt/ywkwsfsd/ + +中小学语文示范诵读库”是教育部、国家语委与中央广播电视总台共同签署开展建设合作的一项公益项目。该音频产品可以通过多媒体教学设备、教学光盘等形式在中小学电子教室使用,由中央广播电台优秀主持人,对中小学生语文课文进行示范朗读,打造有声语文教材。 + +05 中国国家数字图书馆 + +﹥网址:http://www.nlc.cn/ + +国家图书馆联合国内多家公共图书馆推出“数字图书馆移动阅读平台”,为注册读者提供了涵盖了图书、期刊、报纸、论文、古籍、工具书、音视频、数值事实、征集资源等多种类型的数字资源在线服务。为用户免费提供随时随地随身的阅读体验。 + +06 国图公开课 + +﹥网址:http://open.nlc.cn/onlineedu/client/index.htm + +图公开课是国家图书馆借鉴“慕课”的大规模、开放、在线理念,以传承和弘扬先进文化与中华优秀传统文化为核心,依托国家图书馆的馆藏海量资源,设立了专题课程和读书推荐等栏目。 + +07 学堂在线 + +﹥网址:https://www.xuetangx.com + +学堂在线是由清华大学研发出的中文MOOC平台,是教育部在线教育研究中心的研究交流和成果应用平台,面向全球提供在线课程。任何拥有上网条件的学生均可通过该平台在网上学习课程视频。 + +08 中国数字科技馆 + +﹥网址:https://www.cdstm.cn/ + +中国数字科技馆是中国科协、教育部、中科院共建的一个基于互联网传播的国家级公益性科普服务平台。 + +09 全国中小学实验在线平台 + +﹥网址:http://www.syzx-edu.com/ + +全国中小学实验在线平台内容涵盖了全国小初高各科实验说课展示还有部分省份的实验说课比赛,是全国重要的实验说课展示平台。 + +这么好的资源别浪费啦,大家可以根据自己的需求规划学习哦,同时也欢迎转发给更多有需要的家长和小伙伴们~ + +[国家高等教育智慧教育平台 (smartedu.cn)](https://higher.smartedu.cn/) \ No newline at end of file diff --git a/docs/Obsidian/资源网站.md b/docs/Obsidian/资源网站.md new file mode 100644 index 0000000..3d78b28 --- /dev/null +++ b/docs/Obsidian/资源网站.md @@ -0,0 +1,25 @@ +一、帮企商城(https://www.bangqishop.com) +二、Lax 源码驿站(https://www.laxlawfirm.com/) +三、春哥技术博客(https://www.cgtblog.com) +四、春哥技术源码论坛(https://www.chungebbs.com) +五、86 资源网(https://www.86ziyuannet.com) + + + +需要分析参考网站http://www.linspirer.com/的布局 +主要优化点包括: +顶部导航栏样式 +轮播图区域 +全屏宽度 +简洁的文字内容 +半透明背景 +左右切换按钮 +需要修改当前轮播图结构 +服务项目展示方式 +案例展示布局 +底部联系方式 + +网站的顶部参考http://www.linspirer.com/ 有导航栏,左边是公司logo名称 ,右边是首页关于等 + + +参考网站:http://www.daliantech.cn/index.html#firstPage \ No newline at end of file diff --git a/docs/Obsidian/重要笔记.md b/docs/Obsidian/重要笔记.md new file mode 100644 index 0000000..5b7b51f --- /dev/null +++ b/docs/Obsidian/重要笔记.md @@ -0,0 +1,78 @@ +gitlab.md.hihonor.com/w00013566/mdmdemo + + + +1.查看用户 adb shell pm list users +2.adb shell getprop ro.product.model如何使用adb命令查看手机版本号 +3.adb shell getprop ro.soc.model查看手机型号 +4.fastboot界面查询手机型号 fastboot getvar deicemodel +5.fastboot下重启 fastboot reboot +android 获取当前页面的 activity adb shell "dumpsys window | grep mCurrentFocus" + +18792702169 +https://getui.com/notification-push +https://www.jiguang.cn/push?source=bdAd&plan=1&unit=480&keyword=24261&bd_vid=6437844800464191042 + +C:\Users\86181\AppData\Local\Android\Sdk\build-tools\35.0.0 +签名会用到下面这个apksigner.bat文件 +签名: apksigner sign --ks design.jks app-debug.apk +检验签名:apksigner verify -v --print-certs app-debug.apk +apksigner verify -v --print-certs app-release.apk + + +https://www.pgyer.com/zhini-android + + +pmo 开发经理,负责协调交付。 +规划 对接客户需求 +se 需求转化为设计方案 +开发 编码开发 +测试 编写测试用例,回归验证 +cmo 编译版本 + +一 需求背景 +二 功能概述 +三 竞品分析 +四 设计方案 +五 工作量评估 + + + + +pkill -f "cursor-server" + + + +通过网络连接设备(无需USB): +adb tcpip 5555 # 将设备切换至TCP/IP模式,在5555端口监听[citation:8][citation:10] +adb connect 192.168.1.100:5555 # 在电脑上连接设备IP[citation:8][citation:10] +adb connect 192.168.172.236:5555 + + + + + + + +知你的签名信息 +C:\Users\86181\AppData\Local\Android\Sdk\build-tools\35.0.0>apksigner verify -v --print-certs app-release.apk +Verifies +Verified using v1 scheme (JAR signing): false +Verified using v2 scheme (APK Signature Scheme v2): true +Verified using v3 scheme (APK Signature Scheme v3): false +Verified using v3.1 scheme (APK Signature Scheme v3.1): false +Verified using v4 scheme (APK Signature Scheme v4): false +Verified for SourceStamp: false +Number of signers: 1 +Signer #1 certificate DN: C=86, ST=shaanxi, L=xi'an, O=xunpaisoft.com, OU=xunpaisoft, CN=pai xun +Signer #1 certificate SHA-256 digest: 9017939b7cda5c41482a8baaeae587cd9025525ac30b9644293a1e4bc8f6b825 +Signer #1 certificate SHA-1 digest: 89b591ea7a4a9947c13fba0d607ba7d041102cf4 +Signer #1 certificate MD5 digest: 10bc581409188dd39ed38bad24353be7 +Signer #1 key algorithm: RSA +Signer #1 key size (bits): 2048 +Signer #1 public key SHA-256 digest: e458cad386b422c6941e0420b611257cb0426c82e719095c3dbd9d9ffb7a90dc +Signer #1 public key SHA-1 digest: d3c0988b1a336e326683db4a258459031491b46a +Signer #1 public key MD5 digest: 8ef05aa185908c1fc19a4bea27427b24 +C:\Users\86181\AppData\Local\Android\Sdk\build-tools\35.0.0> + + diff --git a/docs/Obsidian/高频命令.md b/docs/Obsidian/高频命令.md new file mode 100644 index 0000000..e1417df --- /dev/null +++ b/docs/Obsidian/高频命令.md @@ -0,0 +1,80 @@ +设置git远程url +git remote set-url origin ssh://rw0067680@101.43.95.130:29418/zhini_im +git remote set-url origin http://101.43.95.130:3001/admin/push_server.git + +git config --global user.name "renjianbo" +git config --global user.email "18691577328@qq.com" + + + +查看特定应用的进程 +adb shell ps | grep com.xunpaisoft.social + +android 获取当前页面的 activity adb shell "dumpsys window | grep mCurrentFocus" + + +# 安装 commit-msg 钩子 +curl -Lo .git/hooks/commit-msg http://gerrit:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 为现有提交添加 Change-Id +git commit --amend --no-edit # 重新提交,钩子会自动添加 + + + +提交代码时的钩子 +curl -o ".git/hooks/commit-msg"http://101.43.95.130:8082/tools/hooks/commit-msgchmod +x ".git/hooks/commit-msg" +git commit --amend --no-edit + + +# 手动执行清理脚本 +/home/renjianbo/gerrit/cleanup_cursor_server.sh + +# 或者直接清理(临时解决) +pkill -f "cursor-server" + + + + + gerrit每日工作流程 + +# 早上 +git fetch origin +git rebase origin/master # 更新本地代码 + +# 开发中 +git add . +git commit -m "..." + +# 推送前 +git pull --rebase origin master # 再次更新 +解决冲突(如果有) +git push origin HEAD:refs/for/master + +# 查看 Gerrit 反馈 +# 根据评审意见修改 + + +oppo测试命令 +cd /home/renjianbo/push/push_server && ./test_push_8080.sh OPPO_CN_95ac9afc103d70bb26441ec0cbb06b97 + +vivo测试命令 +cd /home/renjianbo/push/push_server && ./test_vivo_push.sh v2-CRujhn6Z8OU26yX4_EeUtGmiR6nJ21CXJmoFRMstHinrLqU9vH3u8g4OQQ + +honor +cd /home/renjianbo/push/push_server && ./test_honor_push.sh "BAEAAAAAB.josyaaslFBp0bMCnlEXhdFkDIDWHn_4u9XFSAGjWi_G5W8u7v6rwxjlkTS1aEq_Ms1ICWoq0srsx6esO85nBW5YriDqa6beRLOW7BlX4L1zN6BPj-7KN5k" + + +给荣耀手机发送测试推送消息 +cd /home/renjianbo/push/push_server && ./test_honor_push.sh "BAEAAAAAB.josyQcLfbNclkKb8vstrXGsBef8LKXMghM7x_esrUDxHgeWQV5WqboAH5-PUjEvGZ_36pAT8XJN2ytLf4bxU0EJMyf1Lxya4l5Q_5Q_stZbLg1y-iqVBZA" + + +给vivo手机推送测试消息 +cd /home/renjianbo/push/push_server && ./test_vivo_push.sh v2-CRuinXmf9PM0sT6v_EeUtGmiR6nJ21CXJmoFBt--9R-8OEf0MFBdPCPf0w + + +给oppo手机推送测试消息 +cd /home/renjianbo/push/push_server && ./test_push_8080.sh OPPO_CN_95ac9afc103d70bb26441ec0cbb06b97 + + +honor onNewToken: BAEAAAAAB.josybFY8YYNOK7suCSammWuFIaIUgCdo1d5Ud2NBTUWnyy2a8yUG2WpwNiTZFgBW3sRPO_q-a1bWjwu_ODI6HWHHszoUi1HbhlhMaxjHmOs-zxfg--SECc