swift 使用 @available 或 #available

if #available(iOS 14, *) {
  print("This code only runs on iOS 14 and up")
} else {
  print("This code only runs on iOS 13 and lower")
}

在 guard 语句中使用 available 属性:

guard #available(iOS 14, *) else {
  print("Returning if iOS 13 or lower")
  return
}

@available和#available之间的区别

@available: 用于标记类或方法的可用性

#available: 用于仅针对特定平台或版本执行一段代码

@available(iOS 15, *)
class App {}
@available(iOS 15, *)
func app() {}

if #available(iOS 15, *) {
  
}

Swift 自定义UITableView左滑删除样式

@available(iOS 11, *)
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
  let deleteRowAction = UIContextualAction.init(style: UIContextualAction.Style.destructive, title: "DELETE") {(action: UIContextualAction , sourceView: UIView, completionHandle: (Bool) -> Void) in
    my_log("delete click")
  }

  deleteRowAction.image = UIImage(named: "delete")
  deleteRowAction.backgroundColor = UIColor(hexString: "FE9B02")
  let config = UISwipeActionsConfiguration.init(actions: [deleteRowAction])
  return config
}

各个平台的内置宏定义

Windows

  • WIN32、_WIN32、WIN32、WIN64、_WIN64、WIN64

Android

  • ANDROID、__ANDROID__

Linux

  • __linux__

iOS/Mac

  • __APPLE__、TARGET_OS_IPHONE、TARGET_IPHONE_SIMULATOR、TARGET_OS_MAC

代码判断

#if defined(WIN32) || defined(_WIN32) || defined(_WIN32_) || defined(WIN64) || defined(_WIN64) || defined(_WIN64_)
#define OS_WINDOWS       1
#elif defined(ANDROID) || defined(__ANDROID__)
#define OS_ANDROID       1
#elif defined(__linux__)
#define OS_LINUX	         1
#elif defined(__APPLE__) || defined(TARGET_OS_IPHONE) || defined(TARGET_IPHONE_SIMULATOR) || defined(TARGET_OS_MAC)
#define OS_IOS           1
#else
#define OS_UNKNOWN 1
#endif

桌面软件数据存放路径

windows下程序数据存放目录

C:\Users\用户名\AppData \Roaming, 通过环境变量%AppData%可以访问,这里用来存放当前登录用户所产生的数据, 对其他的用户不可见。如果你在公司网络,加入了域,这个文件夹会通过网路同步, 让你的数据在不同的计算机上漫游。该目录常被滥用。

C:\Users\用户名\AppData \Local, 通过环境变量%LocalAppData%可以访问, 这个目录和上面的基本- -样,不过仅限本地,加入了域也不会同步。 -般情况下,如果不加入域,Roaming和Local并没有什么区别, 但是需要网络同步的时候,尽量把不必要的数据留在本地。 个人使用的软件可以装在C:\Users\用户名\AppData\Local/\Programs下面。

C:\ProgramData, 和AppData的区别在于,这里存放的数据是公用的, 如果你希望软件的数据在所有的用户之间保持一致, 那么程序生成的数据应当存放在这里。

macOS App程序数据存放目录

/Users/用户名/Library/Application Support

linux创建新用户

创建用户

useradd -d /home/test -m test

useradd:创建新用户

  • -d 指定目录文件夹
  • -m 新账号名
  • -c comment 指定一段注释性描述
  • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
  • -g 用户组 指定用户所属的用户组
  • -G 用户组,用户组 指定用户所属的附加组
  • -s Shell文件 指定用户的登录Shell
  • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号

设置密码

passwd test

会提示你输入两次密码

删除账号

userdel test

服务器运维监控命令汇总

who命令

输出信息包括 用户名,终端类型,登录日期,访问IP -H 打印列标题 -b 查看上次启动时间

who [-H|-b]
who [-H|-b] /var/log/wtmp

查看命令历史

  • 每个用户都有一份命令历史记录
  • 查看$HOME/.bash_history
  • 或者在终端输入: history

last命令

  • 查看用户登录历史
  • 命令会读取 /var/log/wtmp文件;
  • /var/log/btmp可以显示远程登陆信息。
  • last默认打印所有用户的登陆信息。
  • 如果想打印某个用户的登陆信息,可以使用
  • last 用户名

选项:

  • (1)-x:显示系统开关机以及执行等级信息
  • (2)-a:将登陆ip显示在最后一行
  • (3)-f :读取特定文件,可以选择 -f /var/log/btmp文件
  • (4)-d:将IP地址转换为主机名
  • (5)-n:设置列出名单的显示列数
  • (6)-t:查看指定时间的用户登录历史

lastlog命令

查看所有用户最近一次登录历史

命令将读取/var/log/lastlog文件;用户排列顺序按照/etc/passwd中的顺序

选项:

  • (1) -u:查看某个用户的最后一次登陆历史
  • (2) -t:查看最近几天之内的用户登录历史
  • (3) -b:查看指定天数之前的用户登录历史

ac命令

根据/var/log/wtmp文件中的登陆和退出时间报告用户连接的时间(小时),默认输出报告总时间

  • (1)-p:显示每个用户的连接时间
  • (2)-d:显示每天的连接时间
  • (3)-y:显示年份,和-d配合使用

Supervisor管理GO程序

安装

apt-get install supervisor

使用说明

supervisor配置文件:/etc/supervisor/supervisord.conf 子进程配置文件路径:/etc/supervisor/conf.d/

常用命令说明

# 查看所有进程的状态
supervisorctl status
# 停止iot
supervisorctl stop iot
# 启动iot
supervisorctl start iot
# 重启iot
supervisorctl restart iot
# 配置文件修改后使用该命令加载新的配置
supervisorctl update
# 重新启动配置中的所有程序
supervisorctl reload

配置GO进程

[program:iot]
# 脚本目录
directory=/opt/iot
# 脚本执行命令
command=/opt/iot/main
# 日志输出
stdout_logfile=/opt/iot/supervisor/main.log
# supervisor启动的时候是否随着同时启动,默认True
autostart=true
autorestart=true
startsecs=5
priority=1
stopasgroup=true
killasgroup=true

常见问题

  1. unix:///var/run/supervisor.sock no such file

问题描述:安装好supervisor没有开启服务直接使用supervisorctl报的错

解决办法:supervisord -c /etc/supervisord.conf

  1. command中指定的进程已经起来,但supervisor还不断重启

问题描述:command中启动方式为后台启动,导致识别不到pid,然后不断重启,这里使用的是elasticsearch,command指定的是$path/bin/elasticsearch -d

解决办法:supervisor无法检测后台启动进程的pid,而supervisor本身就是后台启动守护进程,因此不用担心这个

  1. 启动了多个supervisord服务,导致无法正常关闭服务

问题描述:在运行supervisord -c /etc/supervisord.conf之前,直接运行过supervisord -c /etc/supervisord.d/xx.conf导致有些进程被多个superviord管理,无法正常关闭进程。

解决办法:使用ps -fe | grep supervisord查看所有启动过的supervisord服务,kill相关的进程。