2020年5月

swift for 循环逆序写法

swift for 循环正序写法很简单:

for i in 0..< num {
    // do something
}

但如果我们简单的将for 循环的正序写法倒过来则会出现错误:

for i in num..>0 {
    // do somethink
}

以上写法会报下面的错误:

Can't form Range with upperBound < lowerBound

解决以上问题,我们可以这样写:

for i in (0..<num).reversed() {
    // do something
}

当然,如果你不满足上面的写法,也可以尝试下面的:

for i in stride(from: 3, through: 0, by: -1) {  
     print(i)  
}
Swift 的 stride 函数返回一个任意可变步长 类型值的序列。可变步长类型是可以设置偏移量的一维标量。
他有两个变种,
  • from,to,最后一个值将会严格小(大)于to的值
stride(from:3, to:0, by:-1) 表示3,2,1
  • from,through,最后一个值将会小(大)于等于through的值
stride(from:3, through:0, by:-1) 表示3,2,1,0

That's All.

Link: Can't form Range with upperBound < lowerBound

php 中php-fpm 的重启、终止操作命令

常用命令

  • 重启 Nginx

    service nginx restart
  • 重启 php-fpm

    service php-fpm restart
  • 查看php-fpm进程数

    ps aux | grep -c php-fpm
  • 查看php运行内存

    /usr/bin/php  -i | grep mem
  • 查看php编译参数

    /usr/bin/php  -i | grep Configure
  • 重启php-fpm

    /etc/init.d/php-fpm restart

查找配置

首先要找到php-fpm.conf配置文件,查看pid的配置路径(不是安装路径),然后把下面对应的地方改掉才能正常执行。

ps aux | grep php-fpm  
root     11799  0.0  0.0 103248   880 pts/0    S+   13:51   0:00 grep --color php-fpm
root     11973  0.0  0.0 417748   964 ?        Ss   Jun01   0:20 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)

cat /etc/php-fpm.conf

看到

pid = /var/run/php-fpm/php-fpm.pid

php-fpm配置测试

/usr/local/php/sbin/php-fpm -t
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf -t

php-fpm 启动:

/usr/local/php/sbin/php-fpm
/usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf

php-fpm 关闭:

kill -INT `cat /var/run/php-fpm/php-fpm.pid`

php-fpm 重启:

kill -USR2 `cat /var/run/php-fpm/php-fpm.pid`

查看php-fpm进程数:

ps aux | grep -c php-fpm

Link: php 中php-fpm 的重启、终止操作命令

Nginx Access Log日志统计分析常用命令

IP相关统计

统计IP访问量

awk '{print $1}' access.log | sort -n | uniq | wc -l

查看某一时间段的IP访问量(4-5点)

grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l

查看访问最频繁的前100个IP

awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100

查看访问100次以上的IP

awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn

查询某个IP的详细访问情况,按访问频率排序

grep '104.217.108.66' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100

页面访问统计

查看访问最频的页面(TOP100)

awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100

查看访问最频的页面([排除php页面】(TOP100)

grep -v ".php"  access.log | awk '{print $7}' | sort |uniq -c | sort -rn | head -n 100

查看页面访问次数超过100次的页面

cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

查看最近1000条记录,访问量最高的页面

tail -1000 access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less

每秒请求量统计

统计每秒的请求数,top100的时间点(精确到秒)

awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100

每分钟请求量统计

统计每分钟的请求数,top100的时间点(精确到分钟)

awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

每小时请求量统计

统计每小时的请求数,top100的时间点(精确到小时)

awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100

性能分析

在nginx log中最后一个字段加入$request_time

列出传输时间超过 3 秒的页面,显示前20条

cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条

cat access.log|awk '($NF > 1 &&  $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

蜘蛛抓取统计

统计蜘蛛抓取次数

grep 'Baiduspider' access.log |wc -l

统计蜘蛛抓取404的次数

grep 'Baiduspider' access.log |grep '404' | wc -l

TCP连接统计

查看当前TCP连接数

netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l

用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr

Link: Nginx Access Log日志统计分析常用命令

Linux 下如何退出 tmux 和重新进入 tmux

tmux是一个优秀的终端复用软件

进入 tmux

tmux

退出(detach)当前tmux

ctrl+d

重新进入tmux

tmux attach -t <target-session>

如:当前有很多session,那么选择哪一个呢?

  1. 使用命令tmux ls来获取target-session
tmux ls
1: 1 windows (created Tue Jan 17 09:28:05 2019) [207x86]
13: 1 windows (created Tue Jan 17 17:49:10 2019) [207x86]
16: 1 windows (created Thu Jan 17 10:41:44 2019) [207x86]
19: 5 windows (created Tue Jan 17 10:53:06 2019) [207x86]
  1. 进入target-session为13的窗口
tmux attach -t 13

更多使用方式,参考百度百科

Link: linux下如何退出tmux和重新进入tmux

Ubuntu安装 GoAccess 分析 Nginx 日志

对于一个网站而言,网站日志能够反映很多问题,诸如用户访问情况,页面浏览情况,页面命中情况等,可以给我们继续优化网站提供很好的分析支持。

GoAccess 是一个性能优良的网站访问日志开源工具,通过它,我们能以可视化的方式来分析网站日志信息。

下面是在 Ubuntu 上安装 GoAccess 来分析 access.log 文件的一点分享。

安装 GoAccess

  • 使用以下命令安装 GoAccess:

    sudo apt install goaccess
  • 查看 GoAccess 是否安装成功
goaccess -V

GoAccess - 1.2.
For more details visit: http://goaccess.io
Copyright (C) 2009-2016 by Gerardo Orellana

看到上面的输出信息,说明我们已经安装好了 GoAccess

配置 NginxGoAccess 日志格式

  • 配置 Nginx 日志格式

打开 /etc/nginx/nginx.conf 配置文件,在日志文件下添加如下配置信息:

##
# Logging Settings
##

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';

保存 Nginx 配置信息并重启 Nginx

  • 配置 GoAccess 日志格式

打开 GoAccess 配置文件: /etc/goaccess.conf,添加以下配置:

time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^ %^ [%d:%t %^] "%r" %s %b "%R" "%u" %^

保存配置文件

分析 access.log 文件并输出为 html 文件

使用以下命令,开始分析 access.log 文件,并输出为 html 文件进行可视化分析:

goaccess access_blog.xsir.com.log -o /home/html/logs/report.html --time-format='%H:%M:%S' --date-format='%d/%b/%y' --log-format=COMBINED --real-time-html
access_blog.xsir.com.log 是需要分析的日志文件,因为我在log文件夹下,所以没有带目录
/home/html/logs/report.html 是输出 html 文件路径
--real-time-html 是实时输出

配置目录查看输出的 html 文件

打开 Nginx 配置文件,在站点配置文件下,添加以下配置信息:

location /report.html {
    alias /home/html/test/report.html;
}

现在我们可以通过访问网站 blog.xsir.com/report.html 查看网站的实时日志

后台运行 GoAccess

我们可以借助 tmux 来使 GoAccess 后台运行:

使用以下命令安装 tmux:

apt install tmux

安装好后,输入以下命令,进入 tmux:

tmux

goaccess access_blog.xsir.com.log -o /home/html/logs/report.html --time-format='%H:%M:%S' --date-format='%d/%b/%y' --log-format=COMBINED --real-time-html

一切正常的话 GoAccess 应该开始分析日志文件了,然后显示 “WebSocket server ready to accept new client connections”。
现在按下你 Tmux 的 PREFIX 键(默认是 Ctrl+B),再按 d 从 Tmux 中脱离出来,这样即使 ssh 断开连接了也能保持后台运行。

想查错也可以用以下命令查看刚才编辑的命令:

tmux attach

更多 GoAccess 使用技巧,参考官网手册。https://goaccess.io/

That's All.

Ubuntu查看端口使用情况

Ubuntu 查看指定端口使用情况,可以使用以下命令:

lsof -i:8080

当然,也可以使用下面的命令进行查看:

netstat -ap | grep 8080
PS: 我更喜欢使用上面一种方式,因为他更加好记 ^_^

如果要关闭使用这个端口的程序,使用kill + 对应的pid,如下:

kill -9 PID号
PS: kill就是给某个进程id发送了一个信号。默认发送的信号是SIGTERM,而kill -9发送的信号是SIGKILL,即exit。exit信号不会被系统阻塞,所以kill -9能顺利杀掉进程。
以下命令也是常用的,顺道记下:
// 查看已经连接的服务端口(ESTABLISHED)
netstat -a

// 查看所有的服务端口(LISTEN,ESTABLISHED)
netstat -ap

通过Xcode查看真机中应用程序的数据文件

有时候开发调试时,需要查看真机中应用的文件,比如sqlite之类的,可按以下步骤进行:

环境:Xcode Version 7.2.1,iPad2。

1)点击Xcode的Window菜单项,选择Devices选项。

2)点击左边设备一览中的iPad2,右边「Installed Apps」会显示出iPad上的所有第三方应用。

3)选中要查看的应用。

4)点击下面的设置按钮,选择「Download Container…」按钮,把应用数据下载到Mac上,生成一个.xcappdata文件。

5)在.xcappdata文件上点击右键,选择Show package contents 查看包内容,就可以看到真机应用程序的数据文件了。

Link: 【Xcode使用技巧】通过Xcode查看真机中应用程序的数据文件