WebStorm 配置 TypeScript

WebStorm 可以开发 TypeScript,同时支持自动编译为 JavaScript 文件,具体操作如下:

1. 前往 Node.js 官网下载安装 Node.js

2. 下载安装新版本的 WebStorm

3. 使用 node 的 npm 命令安装 TypeScript 编译器

npm install typescript -g

安装好,在命令行可以查看编译器的版本:

tsc --version

4. 打开 WebStorm,新建一个空白项目

5. 在 WebStorm 中右击项目名,选择 new -> tsconfig.json File,创建 tsconfig.json 文件

6. 打开 WebStorm,为 TypeScript 文件更改编译设置,File -> Settings -> File Watchers -> TypeScript,这里我们需要选择 TypeScript,但是 File Watchers 下默认是不存在的。需要点击右侧“ + ”号,选择 <custom>

7. 在弹出的 New File Watcher 中,填写 Name,在 Wached Files 中的 File type 选择 TypeScriptWatcher Settings 中填写如下内容:

Program(程序):tsc 的路径

Arguments(参数):--sourcemap --target "ES6"

Output paths to refresh(要刷新的输出路径):$FileNameWithoutExtension$.js:$FileNameWithoutExtension$.js.map

Working directory(工作目录):$FileDir$

8. 同时,需要设置 TypeScript 自动编译,在 Setting -> Language & Frameworks 中的 TypeScript 勾选 Compiler 中的 Recomplie on changes

9. 之后修改 TypeScript 文件时,WebStorm 就会自动编译

CSS 中的长度单位

CSS 中的长度有很多种,有很多没接触过,这次就来记录一次各单位的介绍。

px

1px 表示屏幕上一个像素的大小,该长度是绝对的。这是最传统的长度表示方法,用 px 表示长度的好处就是准确而直接。但是由于现在屏幕的尺寸越来越多,各种尺寸差别很大,使用 px 表示长度很难获得统一的视觉效果,在排版上也经常需要去肉眼估,一些宽度需要手动不断调整。

em

em 这个单位稍微有点绕,1em 的大小等于当前元素上 font-size 的大小。该长度是相对的。在 body 上默认的 font-size 是 16px,而子元素默认继承父元素的 font-size。也就是说在整个页面都没有规定 font-size 时,全局 1em = 16px。

有时为简化 font-size 的换算,需要在 css 中的 body 选择器中声明 font-size = 62.5%,此时 1em = 16px * 62.5% = 10px,这样 12px = 1.2em,10px = 1em,也就是说换算时只需将原有 px 数值除以 10,然后换上 em 作为单位即可。

这里需要注意的是当你在不同的地方设定了不同的 font-size 的话 1em 的值也会变得不同,尤其是 font-size 属性会从父元素继承,当你用 em 来设置 font-size 的值时,还需考虑父元素 font-size 的大小。

以下这种情况在 html 上 font-size 为 10px,div 内 font-size 首先从父元素继承 10px 然后再 1.2 = 12px,于是在 div 内的当前元素的其他地方如设置宽度高度时 1em = 12px,同理在 p 里面 font-size 为 12p * 1.2 = 14.4px,于是在 div 内的当前元素的其他地方设置长度时1em = 14.4px。

由于 em 这个单位跟字体是挂钩的,所以当我们在文字排版方面用 em 就会比较方便,比如:菜单、表格等。当我们知道一列表格最长显示 4 个字,那么我们就可以把宽度设置为 4em。此外只要改变字体的大小就能很轻易的调整所有元素的大小。

rem

理解了 em 之后,rem 就简单多了,rem 表示相当于根元素的 em 值,它避免像上面例子那样字体大小逐层复合的连锁反应导致长度计算的复杂性。确定了 body 的 font-size 值之后,rem 可以当做绝对长度一样使用。在不规定 body 的 font-size 的默认情况,1rem = 16px。目前除 IE 8 及更早版本外,所有浏览器均已支持 rem。

%

% 也是一个相对长度单位,100% 等于父元素的宽度或高度(不包括 padding )。对于当前元素的宽度、左右 100% 等于父元素的宽度,而对于高度、上下 100% 等于父元素的高度。

vm / vh

vw / vh 是一种视窗单位,也是相对单位。它相对的不是父节点或者页面的根节点。而是由视窗(Viewport)大小来决定的,1vw 等于视窗宽度的 1%,而 1vh 等于视窗高度的 1%。

视窗(Viewport)是你的浏览器实际显示内容的区域,换句话说是你的不包括工具栏和按钮的网页浏览器。

vw / vh 优势在于能够直接获取高度,而用 % 在没有设置 body 高度的情况下,是无法正确获得可视区域的高度的,所以这是挺不错的优势。

vmin / vmax

vmin 表示当前 vw 和 vh 中较小的一个值 vmax 表示当前 vw 和 vh 中较大的一个值。

做移动页面开发时,如果使用 vw / wh 设置字体大小(比如 5vw ),在竖屏和横屏状态下显示的字体大小是不一样的。

由于 vmin 和 vmax 是当前较小的 vw 和 vh 和当前较大的 vw 和 vh。这里就可以用到 vmin 和 vmax。使得文字大小在横竖屏下保持一致。

vw / vh,vmin / vmax:IE 9+ 局部支持,Google Chrome / Firefox / Safari / Opera 支持,iOS Safari 8+ 支持,Android Browser 4.4+ 支持,Google Chrome for android 39 支持。

其他

单位描述
in英寸
cm厘米
mm毫米
ex一个 ex 是一个字体的 x-height(x-height 通常是字体尺寸的一半)。
pt磅(1pt 等于 1/72 英寸)
pc12 点活字(1 pc 等于 12 点)


他们都是绝对长度单位有以下关系:

1 in = 2.54 cm = 25.4 mm = 101.6 q = 72 pt = 6 pc = 96 px

如何获取访问端 IP 地址的方法

如果使用 nginx 作为 web 代理服务器,则将添加 proxy_set_header X-Real-IP $remote_addr; 到站点的位置块。例如:

server {
    listen 443 ssl http2;
    server_name server_name; 

    client_max_body_size 1024m;

    location / {
        proxy_redirect off;
        proxy_set_header HOST $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass IP address;
    }
}

并且,如果采用 Express 作为后端开发框架,可以使用 req.headers["x-real-ip"] || req.connection.remoteAddress 获取 IP 地址。

此方法仅限简单使用,具体使用完善获取访问端 IP 地址可使用第三方中间件,如:express-iprequest-ip 等。

使用 Python 进行简单的人脸识别

通过使用 Python 进行简单的人脸识别非常简单,使用到了 OpenCV 库内的 haarcascade_frontalface_default.xml ,haarcascade 包含经过训练的用于检测对象的特定类型的分类器,例如:人脸,人眼,倾斜的人脸,鼻子,口嘴,微笑,上半身,下半身等。

代码

import cv2
import os


def load_img(path, name, mun=30, add_with=0):
    if not os.path.exists(path):
        os.mkdir(path)
    # 获取人脸识别模型
    classfier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml文件路径')
    # 创建一个窗口
    cv2.namedWindow('Face')
    # 使用内置摄像头
    cap = cv2.VideoCapture(0)
    # 使用视频进行识别
    # cap = cv2.VideoCapture('视频路径')
    # 根据摄像头设置IP及rtsp端口
    # url='rtsp://admin:admin@192.168.0.104:8554/live'
    # cap = cv2.VideoCapture(url)
    i = 0  # 计数
    if cap.isOpened():
        while i < mun:
            ok, frame = cap.read()  # 读取一帧图片
            if not ok:
                continue

            faces = classfier.detectMultiScale(frame, 1.3, 5, minSize=(32, 32))

            if len(faces) > 0:
                for face in faces:
                    x, y, w, h = face

                    img = frame[y - add_with:y + h + add_with, x - add_with:x + w + add_with]
                    # 显示人脸框
                    cv2.rectangle(frame, (x - add_with, y - add_with), (x + w + add_with, y + h + add_with),
                                  (0, 255, 0), 2)
                    save_path = path + '/' + name + '_' + str(i) + '.jpg'
                    print(save_path)
                    img2 = cv2.resize(img, (112, 112))
                    cv2.imwrite(save_path, img2)
                    i += 1

            cv2.imshow('face', frame)
            c = cv2.waitKey(10)
            if c & 0xFF == ord('q'):
                break

        cap.release()
        cv2.destroyAllWindows()


if __name__ == '__main__':
    # 第一个参数为保存图片的路径
    # 第二个参数为保存图片名字的开头
    # 第三个参数为图片的数量
    # 第四个参数可以调节图片的大小
    load_img('保存图片文件夹路径', 'lq', 500, 0)

Git 删除历史记录,清理仓库

当 commit 次数很多的时候,项目仓库会慢慢积攒很多无用的提交历史,这些历史记录会在项目 clone 的时候导致速度很慢。如果没有软件,一些 clone 过程体验会很不好,甚至频繁出错,所以删除提交历史可以作为一种清理仓库的手段。

Git 代码

git checkout --orphan latest_branch
git add -A
git commit -am "init commit"
git branch -D master
git branch -m master
git push -f origin master

以下是各条语句的解析

git checkout --orphan latest_branch
# 创建新分支 "latest_branch" 并转到该分支
# git checkout 命令为在当前分支上创建新分支(并转到该分支)
# git checkout --orphan 命令为从空白处创建新分支(并转到该分支)

git add -A
# 添加所有文件(当前最新状态)到暂存区

git commit -am "commit message"
# 将暂存区提交到新纪录(latest_branch分支)
# "commit message"为新纪录的名称

git branch -D master
# 删除主分支

git branch -m master
# 将 latest_branch(当前) 分支重命名为 master(主分支)

git push -f origin master
# 同步本地状态到服务器

# 此时,完成的效果为:
#   将master分支所有记录删除,并新建一个 "commit message" 记录,记录中内容为当前项目最新状态
#   此时远程服务器内所有垃圾都被清空
#   如果使用了 Github Desktop 等软件,本地垃圾可能未被清空,可删除项目并重新 clone