Nodejs|npm修改软件源(nrm)


上节我们介绍了nodejs最新版13.12.0的安装.接下来就面临通过npm安装依懒包或者其它工具.而在国内环境直接使用npm官方源的话,十有八九奇慢无比

  • 查看当前源
$ npm config get registry
https://registry.npmjs.org/
  • 临时使用
$ npm --registry https://registry.npm.taobao.org install -g pm2
  • 永久使用
#设置淘宝源
npm config set registry https://registry.npm.taobao.org
#切回官方源
npm config set registry https://registry.npmjs.org/
  • 通过cnpm
# 先按装cnpm,然后以后再安装东西的时候使用cnpm
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
# 安装pm2
$ cnpm install -g pm2
  • nrm软件源管理工具
    nrm NPM registry manager nrm 不仅可以快速切换镜像源,还可以测试自己网络访问不同源的速度
    安装nrm
$ npm install -g nrm 

使用

$ nrm ls
* npm -------- https://registry.npmjs.org/
  yarn ------- https://registry.yarnpkg.com/
  cnpm ------- http://r.cnpmjs.org/
  taobao ----- https://registry.npm.taobao.org/
  nj --------- https://registry.nodejitsu.com/
  npmMirror -- https://skimdb.npmjs.com/registry/
  edunpm ----- http://registry.enpmjs.org/

切换淘宝镜像源

nrm use taobao

测试访问速度

$ nrm test npm
npm ---- 49ms
$ nrm test taobao
taobao - 151ms
$ nrm test yarn
yarn --- 71ms
$ nrm test cnpm     
cnpm --- 207ms

试了一下,发现从我ECS使用taobao源的速度竟然不如官方,跟实际npm安装软件的感觉是一致的
其它比较实用的功能

nrm add xxx 添加私有源
nrm del xxx 删除源
nrm publish 向私有源发布包

就这么多了,更多信息在https://github.com/Pana/nrm

转载请注明: 转自Rainbird的个人博客
   本文链接: Nodejs|npm修改软件源(nrm)

Posted in NodeJS | Tagged , , , , , , , , | Leave a comment

Nodejs | ubuntu16.04手动安装nodejs13.12.0


Nodejs是个很酷的服务端运行js的解释器,js作为当下依旧很流行的语言,诞生了很多优先的工具:像进程守护PM2,桌面应用开发NW.js等.当然依旧有很多基于nodejs+react开发的微服务,而这些东西的运行都需要有Nodejs环境的支持.我们今天要做的就是在ubuntu16.04的系统上安装最新的Nodejs版本13.12.0
似乎第一次提Linux下的软件安装,一般情况我喜欢把手动安装的软件都放在/opt目录下

  • 下载
$ cd /opt
$ wget https://nodejs.org/dist/v13.12.0/node-v13.12.0-linux-x64.tar.xz
--2020-04-05 20:57:27--  https://nodejs.org/dist/v13.12.0/node-v13.12.0-linux-x64.tar.xz
Resolving nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:162e, ...
Connecting to nodejs.org (nodejs.org)|104.20.23.46|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21288012 (20M) [application/x-xz]
Saving to: ‘node-v13.12.0-linux-x64.tar.xz’

node-v13.12.0-linux-x64.tar.xz       100%[===================================================================>]  20.30M  9.01MB/s    in 2.3s    

2020-04-05 20:57:29 (9.01 MB/s) - ‘node-v13.12.0-linux-x64.tar.xz’ saved [21288012/21288012]

一般下载速度都还不错,如果这一步很慢的话或者本身在用的阿里云的ECS,可以试试淘宝源

wget https://npm.taobao.org/mirrors/node/v13.12.0/node-v13.12.0-linux-x64.tar.xz

乖乖,真正的秒下 135MB/s

  • 解压
$ tar Jxf node-v13.12.0-linux-x64.tar.xz
$ ls
node-v13.12.0-linux-x64  node-v13.12.0-linux-x64.tar.xz
  • 配置环境
$ echo 'export PATH=/opt/node-v13.12.0-linux-x64/bin:$PATH' >>/etc/profile
$ echo 'export PATH=/opt/node-v13.12.0-linux-x64/bin:$PATH' >>~/.zshrc
$ export PATH=/opt/node-v13.12.0-linux-x64/bin:$PATH
$ node -v
v13.12.0

接下来,就是安装依懒包和实用工具了,我们后面慢慢道来.

Posted in NodeJS | Tagged , , , , , , , | Leave a comment

Python|图片灰化处理(PIL)

2020年4月4日,是个特殊的日子,我们看到朋友圈很多灰化的图片.今天我们就聊聊图片灰度处理这事儿.
Python可以处理图片的库很多:Matplotlib,OpenCV,TensorFlow,PIL等.我们今天的主角是:PIL(Python Imaging Library).我们的环境是Python3.8.2

  • 安装
pip install Pillow
  • 编码
import os
try:
    from PIL import Image
except ImportError as e:
    print(e)
    print('pip install Pillow')
    os._exit(0)
img_url = '/Users/rainbird/Desktop/a.jpg'
img_out = img_url.replace('.jpg','_gray.jpg')
if not os.path.exists(img_url):
    print(f'file not found: {img_url}')
    os._exit(0)
print(f'''
image  in:{img_url}
image out:{img_out}
'''.strip())
img_org = Image.open(img_url)
img_gray= img_org.convert('L') 
img_gray.save(img_out)
print('done')

代码不长,主要是:
导入库并判断了异常;
指定处理的文件,个人运行的时候要修改一下;
转换完会产生同名_gray的文件
目前只处理了.jpg

  • 运行
image  in:/Users/rainbird/Desktop/a.jpg
image out:/Users/rainbird/Desktop/a_gray.jpg
done
  • 效果

转载请注明: 转自Rainbird的个人博客
   本文链接: Python|图片灰化处理(PIL)

Posted in Mac, Python | Tagged , , , , , , , | Leave a comment

国务院公告:4月4日举行全国性哀悼活动


新华社北京4月3日电为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼,国务院今天发布公告,决定2020年4月4日举行全国性哀悼活动。在此期间,全国和驻外使领馆下半旗志哀,全国停止公共娱乐活动。4月4日10时起,全国人民默哀3分钟,汽车、火车、舰船鸣笛,防空警报鸣响。

Posted in 随笔 | Tagged , , , , , | Leave a comment

Linux | 文本筛选工具:grep的常规用法


grep是在终端下,从文件中筛选文本最常用的工具.估计大多数人停留在cat file|grep xxx或者grep xxx file的阶段.其实这是个超级强大的工具,今天就进行简单的初探.
操作对象:『The Zen Of Python』

$ python -c 'import this' |tee a.txt
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
  • 其它基本用法
-c count出现次数
-n number显示行
-v 排除
-i 忽略大小写

友情提示,以下演示在有颜色的终端下,效果更佳

  • 匹配后输出前后行
后面(After)一行 -A 1
$ grep 'Unless explicitly' -nA 1 a.txt
13:Unless explicitly silenced.
14-In the face of ambiguity, refuse the temptation to guess.

前面(Before)一行 -B 1
grep 'Unless explicitly' -nB 1 a.txt
12-Errors should never pass silently.
13:Unless explicitly silenced.

前后各一行 -1 或 -C 1
$ grep 'Unless explicitly' -n1 a.txt
12-Errors should never pass silently.
13:Unless explicitly silenced.
14-In the face of ambiguity, refuse the temptation to guess.

$ grep 'Unless explicitly' -nC 1 a.txt
12-Errors should never pass silently.
13:Unless explicitly silenced.
14-In the face of ambiguity, refuse the temptation to guess.
  • 匹配后输出前后几个字符
    查找的字符串为Python
    前三个字符
$ grep -o -P '.{0,3}Python' a.txt
of Python

后五个字符

$ grep -o -P 'Python.{0,5}' a.txt
Python, by 

前三后五个字符

$ grep -o -P '.{0,3}Python.{0,5}' a.txt
of Python, by 
  • 文件匹配
排除a.txt里存在的内容
$ grep -vf b.txt a.txt
  • 高亮匹配项
    检查nginx是否包含模块
$ nginx -V 2>&1 | grep -o with-http_stub_status_module
with-http_stub_status_module
Posted in linux, Mac, Python | Tagged , , , , , , , , , | Leave a comment

ELK | elasticsearch手动调度分片


事出有因:出于节约资源的考虑,ES集群虽然由三个节点组成,但是日志的副本数设为了0,也就是只存一份,不冗余(这很危险).取消副本数以后,ES删除了之前副本,但是由于主副本分布不是那么有规律,于是出现了有的节点数据偏多的情况.接连几天都是同一个节点告警磁盘空间不足,而其它节点却很闲,忍无可忍,才了有想手动调度的想法.

  • 查看节点使用情况
GET _cat/allocation?v&s=disk.avail&h=node,disk.avail,disk.total

node       disk.avail disk.total
es2-master      142gb      7.9tb
es1-master    316.3gb      7.9tb
es3-master    821.7gb      7.9tb

你看看,es3那么闲,为嘛非要可es2一个点落数据

  • 查看es上shard分布情况
GET _cat/shards?v&s=ip,store&h=node,shard,index,store

es2-master 8     nginx-2020.03.29      28gb
es2-master 5     nginx-2020.03.29      28gb
es2-master 2     nginx-2020.03.29      28gb
es2-master 2     nginx-2020.03.30    38.3gb
es2-master 7     nginx-2020.03.30    38.4gb
es2-master 4     nginx-2020.03.30    38.4gb

如上,从es2上找到几个shard大户,就拿他们动手了.
以nginx-2020.03.30为例

  • 禁止自动分配
    因为es有自动均衡机制,会将shard尽可能的分布在不同的节点.如果我们不禁用的话,等后面我们手动调走了shard,es还会把同一个index的其它shard再调度回来(这不瞎耽误工夫吗?)
PUT nginx-2020.03.30/_settings
{
  "settings": {
    "index.routing.allocation.enable": "none"
  }
}
  • 调度走起
    调度的index:nginx-2020.03.30
    调度的shard:2,4,7
    是从第二步里找出来的
POST _cluster/reroute
{
  "commands": [
    {
      "move": {
        "index": "nginx-2020.03.30",
        "shard": 2,
        "from_node": "es2-master",
        "to_node": "es3-master"
      }
    }
  ]
}
  • 验证
    再次查看shard分布信息
GET _cat/shards?v&s=ip,store&h=node,shard,index,store

es2-master               2     nginx-2020.03.30    38.3gb
es2-master               7     nginx-2020.03.30    38.4gb
es2-master               4     nginx-2020.03.30    38.4gb
es2-master -> es3-master 2     nginx-2020.03.31    43.3gb
es2-master -> es3-master 3     nginx-2020.03.31    43.5gb
es2-master -> es3-master 0     nginx-2020.03.31    43.5gb

发现原来的shard不变,新增加了调度的shard

或者
看监控图,发面了流量从es2到es3的激增

Posted in linux | Tagged , , , , , | Leave a comment

Python|常用的时间日期操作


之前有提过,写脚本大多是文本操作,有分割,有合并,有格式化.再有一个就是时间日期操作了.

  • 常用的时间模块有两个
import time
import datetime
  • 常用的日期操作就一个
import time
import datetime

print(time.strftime('%Y-%m-%d %H:%M:%S'))
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))

输出:
2020-03-31 21:30:12
2020-03-31 21:30:12
  • 前一天,后一天
import datetime
date_today = datetime.date.today()
print(f'''
昨天:{(date_today + datetime.timedelta(-1)).strftime('%Y-%m-%d')}
今天:{date_today.strftime('%Y-%m-%d')}
明天:{(date_today + datetime.timedelta(1)).strftime('%Y-%m-%d')}
''')
输出:
昨天:2020-03-30
今天:2020-03-31
明天:2020-04-01

f-string语法, 别告诉我没学过
小时的话datetime.timedelta(hours=1)

  • 字符串转日期
import datatime
time_str = '2020-03-31 21:40:05'
time_date= datetime.datetime.strptime(time_str,"%Y-%m-%d %H:%M:%S")

print(f'''
{time_str=}
{time_date=}
timedate='{time_date.strftime('%Y-%m-%d %H:%M:%S')}'
''')

输出:
time_str='2020-03-31 21:40:05'
time_date=datetime.datetime(2020, 3, 31, 21, 40, 5)
timedate='2020-03-31 21:40:05'

不是说常用的是time和datetime吗?怎么后面全是datetime? 哦, time还有一个常用的

  • 暂停运行
#让程序休息2秒
time.sleep(2)

话说这个sleep并发场景慎用哟,至少我司有两次线上事故,就是由这个引起的

Posted in Python | Tagged , , , , | Leave a comment

nginx后端websocket报错400 bad request

  • 现象

WebSocket connection to 'ws://xxx.xxx.xxx/socket/socket.io/?EIO=3&transport=websocket&sid=GR62rU2Ggwa1wt0nAAOt' failed: Error during WebSocket handshake: Unexpected response code: 400

  • 解决
location /socket {
    proxy_pass http://192.168.1.32:7002;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

一般来说400错误,就是上面的问题,如果不是,检查有没有http和https混用的连接

Posted in linux | Tagged , , , , , , , | Leave a comment

Python|f-string让我喜欢Python的原因之一


写脚本,很大一部分工作是在做字符串的处理:分割(split),合并(join),格式化(format).前两部分,各种语言实现,大同小异.而格式化在Python中独树一帜的发明了f-string,它的方便与快捷最终征服了我,成为了Python的支持者.
f-string是Python3.6起才有的功能,这也是为啥写入手Python,直接选择3.7
简单演示:

name='rainbird'
print(f'my name is :{name}.')

输出
my name is :rainbird.

语法:

>>> var='text'
>>> print(f'xxx:{var}')
xxx:text
>>> print(F'xxx:{var}')
xxx:text

以f或F开头后跟一段文本

好吧,演示一段,我儿子幼儿园英语视频的开头:

>>> name='lofty'
>>> age = 5
>>> print(f'''
... Hello, everyone.
... My name is {name}.
... I am {age} years old.
... ''')

Hello, everyone.
My name is lofty.
I am 5 years old.

基本演示完了,还有哪些高级用法呢?

  • 输出{}
>>> print(f'{{花括号}}')
{花括号}
  • 字典使用
>>> user_info={'name':'lofty','age':5}
>>> print(f'''
... Hello, everyone.
... My name is {user_info['name']}.
... I am {user_info['age']} years old.
... ''')

Hello, everyone.
My name is lofty.
I am 5 years old.
  • 固定宽度
number = 5
print(f'''
{number:3} #占三位
{number:03} #占三位不足补0
''')
输出:
  5 #占三位
005 #占三位不足补0
  • 保留小数位
number = 5
print(f'''
{number}
{number:.1f}
''')
输出
5
5.0
  • 对齐
格式 作用
< 左对齐
> 右对齐
^ 居中
number = 5
print(f'''
{number:>3} #右对齐
{number:3} #占三位
{number:03} #占三位不足补0
''')
输出:
  5 #右对齐
  5 #占三位
005 #占三位不足补0
  • 进制转换
格式 作用
b 二进制
o 八进制
d 十进制
x 十六进制(字母小写)
X 十六进制(字母大写)
number = 14
print(f'''
{number:>4b} #二进制
{number:>4o} #八进制
{number:>4d} #十进制
{number:>4x} #十六小写
{number:>4X} #十六大写
''')
输出:
1110 #二进制
  16 #八进制
  14 #十进制
   e #十六小写
   E #十六大写

注意进行了右对齐哟

  • 调试功能
    输出变量名和值(要求Python:3.8)
number = 5
print(f'''
{number=}
''')

输出:
number=5

that's all

Posted in linux, Mac, Python | Tagged , , , , , , , , , | Leave a comment

Python|基于百度API五行代码实现OCR文字高识别率


朋友扔过来一张图片,说在整理试题答案,但是试题是图片,想从网上搜索答案一个一个敲太累了,能不能将图片里的文字提取出来?
我一看这是典型的OCR识别啊,直接祭出神器Tesseract.

tesseract -l chi_sim 4.png stdout
目

二 画 口 “ 口 出

再对比原图一看

哦,不,是不是差的有点儿多?
怎么办呢?tesseract识别不利,肯定是咱玩的不溜,为了识别几张图,再进行一通识别训练是不是有点儿浪费时间?现在都2020年了,各大厂商都提供这种文字识别服务,像我知道的百度都号称50000次/天免费,就它了,开干
第一步 登陆 https://login.bce.baidu.com/

需要百度帐号,是偷是抢,各凭本事吧.
第二步 找到文字识别服务

乖乖,这大厂,就是不一样,产品真多.
第三步 创建一个应用


立即创建
第四步 拿到AppID,API Key,Secret Key

下面是见证五行代码的时刻了
第一步 安装百度Python SDK

pip install baidu-aip

第二步 替换之前拿到 AppID,API Key,Secret Key并修改图片地址

from aip import AipOcr

APP_ID = 'xxx'
API_KEY = 'xxx'
SECRET_KEY = 'xxx'
IMAGE_URL='~/4.png'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
with open(IMAGE_URL, 'rb') as fp:
    res         = client.basicGeneral(fp.read())
    for words_arr in res.get('words_result'):
        print(words_arr['words'].replace('.口','.').replace('.回','.'))

第三步 run

$ python ocr-baidu.py 

4、知觉的特性包括()
A.整体性
B.选择性
C.恒常性
D.间接性
E.理解性
5、注意的功能有()
A.调节功能
B.维持功能
C.抑制功能
D.选择功能
E.启动功能


嗯 对比图片,比较完美, 收工!
that's all

Posted in linux, Python | Tagged , , , , , , , , | Leave a comment