JouyPub

JouyPub 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织 www.jouypub.com 编辑
编辑

聊聊区块链、大数据、应用开发

个人动态

JouyPub 发布了文章 · 2020-01-10

Mac修改ntp地址同步时间

背景:
有个本地模拟时间的插件,需要严格的时间检测,这样的话就需要保证本地和网络时间严格一致!

1、检测本地时间和网络时间相差多少
访问https://time.is/zh/,就可以看到本地时间和网络时间的差值,该网站是精确的官方原子钟时间,时间准确度较高。

2、检查本地的ntp更新

> ntpq -p

# 正常是这样显示的,如果配置了一个地址就只会显示一行
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*203.107.6.88    10.137.55.181    2 u  222  256  367   18.018  -53.573 376.501
+114.118.7.161   123.139.33.3     2 u  490  256  376   31.113  -626.99 325.271
+120.25.115.20   10.137.53.7      2 u  205  256  377   36.917  -53.016 430.399

字段解释:

  • remote – 用于同步的远程节点或服务器。“LOCAL”表示本机 (当没有远程服务器可用时会出现)
  • refid – 远程的服务器进行同步的更高一级服务器
  • st – 远程节点或服务器的 Stratum(级别,NTP 时间同步是分层的)
  • t – 类型 (u: unicast(单播) 或 manycast(选播) 客户端, b: broadcast(广播) 或 multicast(多播) 客户端, l: 本地时钟, s: 对称节点(用于备份), A: 选播服务器, B: 广播服务器, M: 多播服务器, 参见“Automatic Server Discovery“)
  • when – 最后一次同步到现在的时间 (默认单位为秒, “h”表示小时,“d”表示天)
  • poll – 同步的频率:rfc5905建议在 NTPv4 中这个值的范围在 4 (16秒) 至 17 (36小时) 之间(即2的指数次秒),然而观察发现这个值的实际大小在一个小的多的范围内 :64 (26 )秒 至 1024 (210 )秒
  • reach – 一个8位的左移移位寄存器值,用来测试能否和服务器连接,每成功连接一次它的值就会增加,以 8 进制显示
  • delay – 从本地到远程节点或服务器通信的往返时间(毫秒)
  • offset – 主机与远程节点或服务器时间源的时间偏移量,offset 越接近于0,主机和 NTP 服务器的时间越接近(以方均根表示,单位为毫秒)
  • jitter – 与远程节点同步的时间源的平均偏差(多个时间样本中的 offset 的偏差,单位是毫秒),这个数值的绝对值越小,主机的时间就越精确

remote字段中字符的解释,包含 " ","x","-","#","+","*","o":

" " – 无状态,表示: 没有远程通信的主机"LOCAL" 即本机 或(未被使用的)高层级服务器 或 远程主机使用的这台机器作为同步服务器
“x” – 已不再使用
“-” – 已不再使用
“#” – 良好的远程节点或服务器但是未被使用 (不在按同步距离排序的前六个节点中,作为备用节点使用)
“+” – 良好的且优先使用的远程节点或服务器(包含在组合算法中)
“*” – 当前作为优先主同步对象的远程节点或服务器
“o” – PPS 节点 (当优先节点是有效时)。实际的系统同步是源于秒脉冲信号(pulse-per-second,PPS),可能通过PPS 时钟驱动或者通过内核接口。

更多字段的解释请参考:https://linux.cn/article-4664...

3、配置多个ntp地址
由于Mac的时间设置页面上是不能修改地址的,需要在对应的配置文件中修改。Mac中有两个配置ntp地址的文件,/etc/ntp.conf/private/etc/ntp.conf,两个文件会自动同步,修改其中一个即可。

编辑sudo vim /etc/ntp.conf,删除原有内容,将下面的几行复制进去,保存,退出,重启电脑。这是几个已知质量较好的ntp地址,别的地址都不是很可靠,顺带也把apple的ntp地址加上吧

server ntp.aliyun.com
server ntp.ntsc.ac.cn
server ntp1.aliyun.com
server time.asia.apple.com

4、再次检查时间
电脑重启后,再次访问https://time.is/zh/,查看时间差值是否在正常范围内

5、手动更新时间
如果某天突然发现电脑时间快了或者慢了,我们仍然可以用上面的ntp地址来手动更新。如果执行一次时间仍有较大差值,可以多执行几次

> sudo ntpdate -u ntp.aliyun.com

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548

查看原文

赞 1 收藏 1 评论 0

JouyPub 发布了文章 · 2019-10-16

Python使用selenium + headless chrome获取网页内容

使用python写爬虫时,优选selenium,由于PhantomJS因内部原因已经停止更新,最新版的selenium已经使用headless chrome替换掉了PhantomJS,所以建议将selenium更新到最新版,使用selenium + headless chrome

准备工作:
安装chrome、chrome driver、selenium

一、安装chrome
配置yum下载源,在目录/etc/yum.repos.d/下新建文件google-chrome.repo

> cd /ect/yum.repos.d/
> vim google-chrome.repo

编辑google-chrome.repo,内容如下,保存退出

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

安装google chrome浏览器:

> yum -y install google-chrome-stable

PS: Google官方源可能在中国无法使用,导致安装失败或者在国内无法更新,可以添加以下参数来安装:

> yum -y install google-chrome-stable --nogpgcheck

这样,google chrome即可安装成功。

二、安装chrome driver
查看上述安装的chrome版本,根据版本选择对应的chrome driver下载,下载之后放到/usr/local/bin目录

三、安装selenium

> pip install selenium

上述准备工作完成后,就可以开始写代码了

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options


options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('lang=zh_CN.UTF-8')

# 在linux上需要添加一下两个参数
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

browser = Chrome(chrome_options=options)
browser.set_page_load_timeout(30)
browser.set_script_timeout(30)
browser.get(url)

# 获取返回内容
print browser.page_source

# 查找元素
print browser.find_element_by_tag_name('pre').text

备注:如果访问一些详情页有cookie验证,可以先访问主页,然后再访问详情页,webdriver会自动携带cookie

博客地址:http://www.jouypub.com

查看原文

赞 0 收藏 0 评论 0

JouyPub 发布了文章 · 2019-09-29

hexo title中有特殊字符报错

问题:
在使用hexo写文章时,如果文章的title中包含双引号"abc"、$符号时会编译出错,文章无法渲染。
由于这里的写法是yml语法,"、$这些都是特殊符号,执行hexo -s时到编译title这里就会出现错误

---
title: Shell中$i $() ${}的区别
---

解决办法
这里我们需要对特殊符号进行转义,用对应的THML字符实体进行替换,例如$对应$,如此等等。
转移之后的标题就变成了

---
title: Shell中\$i \$() \${}的区别
---

附录:各种常用特殊字符对应的HTML字符实体

! ! — 惊叹号 Exclamation mark
" " " — 双引号 Quotation mark
# # — 数字标志 Number sign
$ $ — 美元标志 Dollar sign
% % — 百分号 Percent sign
& & & — 与符号(&) Ampersand
' ' — 单引号 Apostrophe
( ( — 小括号左边部分 Left parenthesis
) ) — 小括号右边部分 Right parenthesis
* * — 星号 Asterisk
+ + — 加号 Plus sign
< &#60; &lt; 小于号 Less than
= &#61; — 等于符号 Equals sign
- &#45; &minus; — 减号
> &#62; &gt; — 大于号 Greater than
? &#63; — 问号 Question mark
@ &#64; — Commercial at
[ &#91; — 中括号左边部分 Left square bracket
\ &#92; — 反斜杠 Reverse solidus (backslash)
] &#93; — 中括号右边部分 Right square bracket
{ &#123; — 大括号左边部分 Left curly brace
| &#124; — 竖线Vertical bar
} &#125; — 大括号右边部分 Right curly brace
空格 &nbsp;

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548

查看原文

赞 0 收藏 0 评论 0

JouyPub 发布了文章 · 2019-09-10

Shell中$i $() ${}的区别

shell中奇葩写法不仅仅是(.)、{.}、((.))等等写法,还有各种奇怪的写法和细节需要注意,一个不留神就发现结果和预期不一样

首先我们演示一个基本的

a = "b"
echo $a

结果是什么都没打印,正确写法是=两边没有空格a="b"

认识到shell中的奇葩写法后,需要对各种写法有个基本的认识

  1. 不加括号,正常的取值方式,但是在引号中不好使。
  2. 单引号。原样输出,但仍然会解析&dollar;{var}
  3. 双引号。会解析&dollar;{var} 、&dollar;var和命令&dollar;(expr)
  4. &dollar;{}。取值操作
  5. 反引号`。当作命令执行
  6. &dollar;()。括号中的内容当做命令执行

然后我们再来看下这些写法的使用情况

i=i

# 正常的取值,1
echo $i

# 原样输出,$i
echo '$i'

# 正常取值,1
echo "$i"

# 正常取值,1
echo ${i}

# 当做命令执行
echo `date -d "1 days ago" +"%Y-%m-%d"`

# 当做命令执行
echo $(date -d "1 days ago" +"%Y-%m-%d")

再来一个同时有单引号和双引号的,这里就不能用&dollar;ds了,只能用&dollar;{ds}

echo "insert overwrite table table_name partition (ds='${ds}') select distinct name from table_name_pre where ds='${ds}';"



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548查看原文

赞 0 收藏 0 评论 0

JouyPub 发布了文章 · 2019-08-20

Shell生成连续的数字

使用场景:

  1. 需要生成连续的日期 date -d "${i} days ago" +"%Y-%m-%d
  2. 生成连续的目录

方法一

#!/bin/bash

for i in {1..10};do
  echo ${i}
done

方法二

#!/bin/bash

for((i=1;i<=10;i++));do
  echo ${i}
done

方法三

#!/bin/bash

for i in $(seq 1 10);do
  echo ${i}
done



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548查看原文

赞 0 收藏 0 评论 0

JouyPub 发布了文章 · 2019-08-13

Python定时任务随机时间执行

背景:
有一个爬虫服务,需要定时从公开网站上拉取一些数据,为了避免被识别为爬虫(防爬虫的识别需要根据很多特征,时间仅仅是其中一个维度),需要在指定的时间内,随机生成一个时间爬取

脚本是python写的,直接上代码...

import logging
import traceback
from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

def spider_schedule():
    # spider_schedule是job_id
    scheduler.remove_job('spider_schedule')

    try:
        print 'spider start... ', datetime.now().strftime('%Y-%m-%d %X')
        #--------自己的业务代码-------
        pass
        #---------------------------
        print 'spider end... ', datetime.now().strftime('%Y-%m-%d %X')
    except Exception as e:
        print traceback.format_exc(e)
    finally:
        interval_minutes = random.randint(60, 120)  # 1-120分钟随机选一个时间
        interval_seconds = random.randint(1, 60)  # 1~60秒随机选一个时间
        scheduler.add_job(spider_schedule, 'interval', minutes=interval_minutes, seconds=interval_seconds, id='spider_schedule')


if __name__ == '__main__':
    scheduler.add_job(spider_schedule, 'interval', seconds=10, id='spider_schedule')
    scheduler.start()



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548查看原文

赞 0 收藏 0 评论 0

JouyPub 发布了文章 · 2019-07-30

spring boot添加启动参数

背景:
业务中需要使用一个外部服务,考虑到外部服务可能会存在不稳定的情况,尽管设置了超时,但是在高并发的情况,大量的超时还是会对服务造成影响,同时该服务对核心业务流程没有太大影响,所以在spring boot配置中添加一个参数,当外部服务长时间不可用时手动禁用

配置文件application.properties

switch = on

代码中的配置开关

@Value("${switch}")
private String switch;

在启动服务时只需要指定参数的值即可,这里有两种方式(两种不同的方式,参数的位置是不一样的
1、方法一

> java -jar -Dspring.profiles.active=prod -Dswitch=on service-api-1.0.jar

2、方法二

> java -jar -Dspring.profiles.active=prod service-api-1.0.jar --switch=on



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548查看原文

赞 0 收藏 0 评论 0

JouyPub 发布了文章 · 2019-07-24

Nginx配置中的if判断

当rewrite的重写规则满足不了需求时,比如需要判断当文件不存在时、当路径包含xx时等条件,则需要用到if

if语法

if (表达式) {
    ...
}

表达式语法:

  1. 当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
  2. 直接比较变量和内容时,使用=或!=
  3. -f和!-f用来判断是否存在文件
  4. -d和!-d用来判断是否存在目录
  5. -e和!-e用来判断是否存在文件或目录
  6. -x和!-x用来判断文件是否可执行

为了配置if的条件判断,这里需要用到nginx中内置的全局变量

$args               这个变量等于请求行中的参数,同$query_string
$content_length     请求头中的Content-length字段。
$content_type       请求头中的Content-Type字段。
$document_root      当前请求在root指令中指定的值。
$host               请求主机头字段,否则为服务器名称。
$http_user_agent    客户端agent信息
$http_cookie        客户端cookie信息
$limit_rate         这个变量可以限制连接速率。
$request_method     客户端请求的动作,通常为GET或POST。
$remote_addr        客户端的IP地址。
$remote_port        客户端的端口。
$remote_user        已经经过Auth Basic Module验证的用户名。
$request_filename   当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme             HTTP方法(如http,https)。
$server_protocol    请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr        服务器地址,在完成一次系统调用后可以确定这个值。
$server_name        服务器名称。
$server_port        请求到达服务器的端口号。
$request_uri        包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri                不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri       与$uri相同。

举例说明

1、如果文件不存在则返回400

if (!-f $request_filename) {
    return 400;
}

2、如果host不是jouypub.com,则301到jouypub.com中

if ( $host != 'jouypub.com' ){
    rewrite ^/(.*)$ https://jouypub.com/$1 permanent;
}

3、如果请求类型不是POST则返回405

if ($request_method = POST) {
    return 405;
}

4、如果参数中有a=1则301到指定域名

if ($args ~ a=1) {
    rewrite ^ http://example.com/ permanent;
}

5、在某种场景下可结合location规则来使用,如:

# 访问 /test.html 时
location = /test.html {
    # 设置默认值为xiaowu
    set $name xiaowu;
    # 如果参数中有 name=xx 则使用该值
    if ($args ~* name=(\w+?)(&|$)) {
        set $name $1;
    }
    # 301
    rewrite ^ /$name.html permanent;
}

上面表示:
/test.html => /xiaowu.html
/test.html?name=ok => /ok.html?name=ok



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548查看原文

赞 0 收藏 0 评论 0

JouyPub 发布了文章 · 2019-07-09

Nginx rewrite配置规则

rewrite语法

server {
    rewrite {规则} {定向路径} {重写类型} ;
}

1、规则:可以是字符串或者正则来表示想匹配的目标url
2、定向路径:表示匹配到规则后要定向的路径,如果规则里有正则,则可以使用$index来表示正则里的捕获分组
3、重写类型:

  • last :相当于Apache里德(L)标记,表示完成rewrite,浏览器地址栏URL地址不变
  • break;本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏URL地址不变
  • redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址
  • permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

举例说明

server {
    rewrite /last.html /index.html last;
    # 访问 /last.html 的时候,页面内容重写到 /index.html 中

    rewrite /break.html /index.html break;
    # 访问 /break.html 的时候,页面内容重写到 /index.html 中,并停止后续的匹配

    rewrite /redirect.html /index.html redirect;
    # 访问 /redirect.html 的时候,页面直接302定向到 /index.html中

    rewrite /permanent.html /index.html permanent;
    # 访问 /permanent.html 的时候,页面直接301定向到 /index.html中

    rewrite ^/html/(.+?).html$ /post/$1.html permanent;
    # 把 /html/*.html => /post/*.html ,301定向

    rewrite ^/search\/([^\/]+?)(\/|$) /search.html?keyword=$1 permanent;
    # 把 /search/key => /search.html?keyword=key
}

last和break的区别:

  1. 因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了(return 只能返回除301、302之外的code)。
  2. last一般写在server和if中,而break一般使用在location中
  3. last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
  4. break和last都能组织继续执行后面的rewrite指令
  5. 在location里一旦返回break则直接生效并停止后续的匹配location
server {
    location / {
        rewrite /last/ /q.html last;
        rewrite /break/ /q.html break;
    }
    location = /q.html {
        return 400;
    }
}

访问/last/时重写到/q.html,然后使用新的uri再匹配,正好匹配到locatoin = /q.html然后返回了400;
访问/break时重写到/q.html,由于返回了break,则直接停止了;



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548查看原文

赞 0 收藏 0 评论 0

JouyPub 发布了文章 · 2019-07-02

Nginx location匹配规则

以下列配置为例

server {
    listen       80;
    server_name  jouypub.com;

    location ^~ /. {
        return 404;
    }
    location ^~ /api {
        proxy_pass http://localhost:8000;
    }
    location / {
        root /services/apps/front/;
    }
}

location语法规则: location [=|~|~*|^~] /uri/ { … }

= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可
~ 表示区分大小写的正则匹配
~* 表示不区分大小写的正则匹配
!~!~* 分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。

如果匹配规则以^开头,就是匹配以指定字符串开头的路径,如果没有就是匹配url中的内容是否包含指定字符串
如果匹配规则以$结尾,就是匹配以指定字符串结尾的路径

多个location配置的情况下匹配顺序为(当有匹配成功时候,停止匹配,按当前匹配规则处理请求):

  1. 优先匹配 =
  2. 其次匹配 ^~
  3. 按照文件中的匹配顺序执行
  4. 最后匹配 /

举例

1、必选规则

location / {
    root /services/apps/front/;
}

2、匹配静态资源

location ^~ /static/ {
    root /services/apps/front/static;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

3、防盗链

location ~* \.(gif|jpg|swf)$ {
    valid_referers none blocked jouypub.com files.jouypub.com;
    if ($invalid_referer) {
        rewrite ^/ http://$host/logo.png;
    }
}

jouypub.com、files.jouypub.com是运行出现的白名单

4、根据文件类型设置过期时间

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
    if (-f $request_filename) {
        expires 1h;
        break;
    }
}

5、禁止访问某个目录

location ~* \.(txt|doc)${
    root /services/apps/front/doc;
    deny all;
}

location中的/结尾和非/结尾

location ^~ /api {
    proxy_pass http://localhost:8000;
}
location ^~ /api {
    proxy_pass http://localhost:8000/;
}

访问路径http://www.jouypub.com/api/a.html
规则1会被转发到:http://localhost:8000/api/a.html
规则2会被转发到:http://localhost:8000/a.html



欢迎订阅「K叔区块链」 - 专注于区块链技术学习

博客地址:http://www.jouypub.com
简书主页:https://www.jianshu.com/u/756c9c8ae984
segmentfault主页:https://segmentfault.com/blog/jouypub
腾讯云主页:https://cloud.tencent.com/developer/column/72548查看原文

赞 3 收藏 3 评论 0

认证与成就

  • 获得 147 次点赞
  • 获得 2 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 2 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2018-08-04
个人主页被 1.9k 人浏览