1. var obj=/ /; 创建正则对象;若为var obj=/ /; 即赋值被注释掉,及运行被结束;

  2. 只能输入零和非零开头的数字,正确的正则表达式是,^(0|[1-9][0-9]*)$

  3. 有关this的

this的行为有时候会显得极其诡异,让人感到困惑,但只需要记住 this的值要等到代码真正执行时才能确定

同时this的值具体有以下几种情况:

  1. new 调用时指的是被构造的对象

  2. call、apply调用,指向我们指定的对象

  3. 对象调用,如执行obj.b(),this指向obj

  4. 默认的,指向全局变量window(相当于执行window.fun())

📅 2019-06-05

v-model 介绍

首先明确一点,v-model仅仅是语法糖。


<input type="text" v-model="something">

等价于


  <input

                type="text"

                v-bind:value="something"

                v-on:input="something = $event.target.value">

它将一个较复杂的input双向数据绑定简化了他的书写方式。

微信小程序绑定input

最开始我是使用微信推荐的写法


<input bindtap="input" />

然后在js里面解析event,然后再setData

uni-app下v-model的写法

本文采用uni-app自定义组件模式

wxml


...

<form @submit="formSubmit" @reset="formReset" :model="formItem" class="tm-every-center padding bg-white">

					<view class="section flex align-center">

						<view class="section__title">姓名:</view>

						<input name="name" placeholder="请填写您的姓名" class="bg-gray" v-model="formItem.name" />

					</view>

					<view class="section flex align-center">

						<view class="section__title">手机:</view>

						<input name="name" placeholder="请填写您的姓名" class="bg-gray" v-model="formItem.phone" />

					</view>

					<view class="section flex align-center">

						<view class="section__title">赛点:</view>

						<input name="name" placeholder="请填写您的姓名" class="bg-gray" v-model="formItem.competition" />

					</view>

					<view class="btn-area margin-top"><button formType="submit" class="cu-btn">提交</button></view>

				</form>

				...

然后在data里面设置

📅 2019-05-27

正则删除关键字所在行

查找:


^.*大师兄.*$

替换为:(空)

如果不留空行:

查找:


^.*大师兄.*\r?\n

替换为:(空)

正则删除HTML标签

Ctrl + H 正则匹配 <[^>]+> 替换为空

正则替换换行

Ctrl + H 正则匹配 \n 替换为你想要的

📅 2019-04-24

最终效果如下

2019-04-02T02:54:35.png

2019-04-02T02:57:55.png

代码如下


const baseURL = 'http://wxlc.wezoz.com/' // your base url

async function request(api, method, header, params) {

	console.group(api)

	console.log('%c' + method + ' REQUEST:', "color:green")

	console.log({

		'api': api,

		'header': header,

		'params': params

	})

	return await new Promise((resolve, reject) => {

		uni.request({

			url: baseURL + api,

			method: method,

			header: header,

			data: params,

			success: (result) => {

				console.log('%c' + method + ' SUCCESS RETURN DATA:', "color:green")

				console.log(result)

				console.groupEnd(api)

				resolve(result.data);

			},

			fail: (e) => {

				reject(e);

			}

		})

	})

}

async function post(api, params, success) {

	const POST_METHOD = 'POST'

	const POST_HEADER = {

		'content-type': 'application/x-www-form-urlencoded',

		'token': wx.getStorageSync('token')

	}

	return await request(api, POST_METHOD, POST_HEADER, params)

}

async function get(api, params, success) {

	const GET_METHOD = 'GET'

	const GET_HEADER = {

		'content-type': 'application/x-www-form-urlencoded',

		'token': wx.getStorageSync('token')

	}

	return await request(api, GET_METHOD, GET_HEADER, params)

}

module.exports = {

	POST: post,

	GET: get

}

所用到的一些consloe骚操作

console内使用CSS样式

consloe里面使用%c进行css样式格式化输出实例

📅 2019-04-02
win10添加Ubuntu子系统右键打开项

大致思路

  1. 注册表新建目录右键项

  2. 填写WSL命令行

如果你觉得添加起来过于麻烦,你可以双击执行下列注册表文件

wsl.reg

一些简介

注册表百科

注册表(Registry,繁体中文版Windows操作系统称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。早在Windows 3.0推出OLE技术的时候,注册表就已经出现。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。但是,从Microsoft Windows 95操作系统开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统中继续沿用至今。

打开方式

  1. Win + R键入regedit

操作流程

  1. 目录导航输入HKEY_CLASSES_ROOT\Directory\shell

  2. 新建项ubuntu

  3. 选择ubuntu项,新建字符串值:名称为默认,值为WSL

如图:2019-03-25T02:28:02.png

  1. 在ubuntu项内添加command项

  2. 字符串名称为默认,值为wsl.exe --cd "%V"

如图:2019-03-25T02:30:30.png

截至目前,存在的问题

就是只有在选择一个目录时才会出现这个东西,右键空白处啥都不会发生

解决方法

HKEY_CLASSES_ROOT\Directory\Background\shell也同样操作一波

效果预览

我去,我不知道怎么截右键这个状态。

📅 2019-03-29
win10下使用wsl配置Clion toolchain

前言

为什么要使用wsl来配置呢?因为我个人感觉这个比较方便,不用安装一堆包。直接敲命令就好。

准备工作

安装好Clion后,打开toolchain是这样的。

2019-03-28T01:51:00.png

前提是先装好wsl

选择wsl toolchain

会出现下面这个情况

2019-03-28T01:52:22.png

这是因为wsl没有配置ssh服务

配置wsl的ssh


sudo vi /etc/ssh/sshd_config

把密码认证的no改为yes


PasswordAuthentication yes

restart ssh


sudo service ssh restart 

如果出现以下提示

2019-03-28T02:15:33.png

则需要生成key


sudo dpkg-reconfigure openssh-server

查看ssh运行状态


service ssh status

configure remote credentials

2019-03-28T02:00:48.png

2019-03-28T02:16:37.png

配置编译环境

在wsl里面执行


sudo apt-get install build-essential gcc g++ cmake gdb

2019-03-28T05:16:09.png

📅 2019-03-28

所有的路口标号用int road[8]表示,

bool status[8][8]表示道路可否通行。

T字路口


T路口.png

对于T字路口,将道路分为(左,右,下)三个流量出入口,存在的状态有:

0. 全红(特殊状态应对突发事故)


     for (int i = 0; i < 8; i++) {

        for (int j = 0; j < 8; j++) {

            status[i][j] = false;

        }

    }

×|0|1|2|3|4|5

:–: | :–: | :–: | :–: | :–: | :–: |

0|×|×|×|×|×|×

1|×|×|×|×|×|×

2|×|×|×|×|×|×

3|×|×|×|×|×|×

4|×|×|×|×|×|×

5|×|×|×|×|×|×

正常状态下考虑红灯可右转,同向变道不受交通灯控制,即永远可通行


status[2][1] = status[4][3] = true;

status[0][1] = status[2][3] = status[4][5] = true;

×|0|1|2|3|4|5

:–: | :–: | :–: | :–: | :–: | :–: |

0||@||||

1||||||

2||@||@||

3||||||

4||||@||@

5||||||

同时需要限制逆行,即永远不可通行


// 出口不能自转和变道

status[0][0] = status[0][2]  = status[0][4]  = false;

status[4][4] = status[4][0]  = status[4][2]  = false;

status[2][2] = status[2][0]  = status[2][4]  = false;

// 出口不能进去

status[1][0] =status[1][4]  = status[1][2] = status[1][3]   = status[1][4] = status[1][5] = false;

status[3][0] =status[3][5]  = status[3][2] = status[3][3]   = status[3][4] = status[3][5] = false;

status[5][0] =status[5][6]  = status[5][2] = status[5][3]   = status[5][4] = status[5][5] = false;

×|0|1|2|3|4|5

📅 2019-03-22

目前,我采用的是迪杰斯特拉算法计算所有点的最短路径(感觉弗洛伊德算法会更好些?)。迪杰斯特拉算法算的是单源(V_begin)到所有点的最短距离,也就是说需要遍历一次所有的点。

遍历V_begin


for (int V_begin = 0; V_begin < G->m_CrossRoad_v.size(); V_begin++) {

}

下面是迪杰斯特拉算法的流程

1. 声明dist数组


vector<double> Determined_dist(G->m_CrossRoad_v.size(), 0.0);

2. 初始化顶点集


void calcShortestPath(Graph *G) {

    int currentPointSite,nextPointSite;

    ofstream PointPathFile(DIR_RES"PointPath.txt"),RoadPathFile(DIR_RES"RoadPath.txt");

    //对点进行的一级遍历

    for (int V_begin = 0; V_begin < G->m_CrossRoad_v.size(); V_begin++) {

        // =================== 迪杰斯特拉算法开始 ===============================

        vector<bool> S(G->m_CrossRoad_v.size(), false); //判断是否选中

        vector<double> dist(G->m_CrossRoad_v.size(), DBL_MAX/2);// dist

        vector<double> compare_dist(G->m_CrossRoad_v.size(), DBL_MAX/2);// 辅助dist用来取最短距离点

        vector<int> path(G->m_CrossRoad_v.size(),-2); // path

        S[V_begin] = true;

        path[V_begin] = -1;

        for(auto crossroad : G->m_CrossRoad_v[V_begin].JunctionRoad){

            nextPointSite = G->m_Road_v[crossroad.outRoadID].m_CrossRoadToSite;

            dist[nextPointSite] = G->m_Road_v[crossroad.outRoadID].m_dLength;

            compare_dist[nextPointSite] = dist[nextPointSite];

        }

        auto min = min_element(compare_dist.begin(), compare_dist.end());

        int min_element_index = distance(compare_dist.begin(), min);

        compare_dist[min_element_index] = DBL_MAX/2;

        // 循环size-1次

        for(int i = 0; i < G->m_CrossRoad_v.size()-1; i++){

            for(auto crossroad : G->m_CrossRoad_v[min_element_index].JunctionRoad){

                currentPointSite = min_element_index;

                nextPointSite = G->m_Road_v[crossroad.outRoadID].m_CrossRoadToSite;

                if(S[nextPointSite]){

                    continue;

                }

                if(dist[nextPointSite] > dist[currentPointSite] + G->m_Road_v[crossroad.outRoadID].m_dLength) {

                    dist[nextPointSite] = dist[currentPointSite] + G->m_Road_v[crossroad.outRoadID].m_dLength;

                    compare_dist[nextPointSite] = dist[nextPointSite];

                    path[nextPointSite] = currentPointSite;

                }

            }

            min = min_element(compare_dist.begin(), compare_dist.end());

            min_element_index = distance(compare_dist.begin(), min);

            S[min_element_index] = true;

            compare_dist[min_element_index] = DBL_MAX/2;

        }

        for(int i = 0;i<path.size();i++){

            int j = i;

            bool flag = false;

            while( path[j] >= 0) {

                flag = true;

                PointPathFile << path[j] << " ";

                for(auto node:G->m_CrossRoad_v[j].JunctionRoad){

                    if(G->m_Road_v[node.outRoadID].m_CrossRoadToSite == path[j]){

                        RoadPathFile << node.outRoadID << " ";

                    }

                }

                j = path[j];

            }

            if(flag){RoadPathFile << endl;PointPathFile << endl ;}

        }

    }

}
📅 2019-03-21

引言

我在很久之前就想研究这个项目,然后再进行些自定义的修改了。就以本文作为笔记开始吧。

项目目录树


.

├── Action.php

├── Plugin.php

├── Users.php

├── res //一些图片资源

│   ├── cvbg.jpeg

│   ├── cvborder.jpeg

│   ├── resend.png

│   └── test.bin

├── sql // 创建了两个数据库

│   ├── wetypecho.sql

│   └── wetypecholike.sql

└── tree.txt

查看数据库结构

wetypecho.sql


CREATE TABLE `typecho_wetypecho` (

  `id`                int(10) unsigned NOT NULL auto_increment,

  `openid`            varchar(255)     default ''  ,

  `createtime`        int(10)          default 0   ,

  `lastlogin`         int(10)          default 0   ,

  `nickname`          varchar(255)     default ''  ,

  `avatarUrl`         varchar(255)      default ''  ,

  `city`              varchar(255)      default ''  ,

  `country`           varchar(255)      default ''  ,

  `gender`            varchar(255)      default ''  ,

  `province`          varchar(255)     default ''  ,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

看内容可以推测,这是微信用户数据表。

📅 2019-03-14

js类似于printf那样的格式化字符串

安装包


npm install sprintf-js

调用包


var sprintf = require('sprintf-js').sprintf,

操作实例:时间前补零操作


for (let i = 46; i >= 0; i--) {

        console.log(sprintf('%2d:%02d', i / 2, (i % 2 ? 0 : 30)))

      }
📅 2019-03-13