VSCode调试Angular和Karma测试项目

关于VSCode调试Angular Testing的项目,可以通过以下的步骤。

  • 通过Getting started with Angular创建一个初步的Angular项目
  • 修改src/karma.conf.js
    1
    2
    3
    4
    5
    6
    7
    browsers: ['ChromeDebugging'], //启用Chrome Debugger instance
    customLaunchers:{
    ChromeDebugging:{
    base:'Chrome',
    flags:['--remote-debugging-port=9221']
    }
    },
  • 添加新的配置到launch.json
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
    "name": "Debug tests",
    "type": "pwa-chrome",
    "request": "attach",
    "address": "localhost",
    "port": 9221,
    "pathMapping": {
    "/_karma_webpack_/": "${workspaceRoot}/"
    }
    }
  • 在VSCode的Terminal Windows 输入命令ng test, 如果想测试特定的文件可以,使用命令+文件名,如ng test --include '**/project.component.spec.ts'
  • 选择 Debug tests 作为调试选项
  • 在需要调试的地方添加断点
  • 选择需要调试的方法执行

Angular Testing

FAQ

引用

发布

Excel科学计数转化

Excel中,默认的数据类型是常规,并且在一个单元格中只能显示11位的数字。
如果我们输入类似信用卡号、身份证号等大于11位的长数字,就不能正常被显示,并且一旦被Excel自动格式化为...E+..就无法转化为最原始的数值。

解决方案


Excel中直接输入长数字

  • 将单元格格式设置为文本
    • 右键目标单元格或区域

右键目标单元格或区域

- 点击`设置单元格格式`
- 在"数字"选项卡上,选择"文本",然后单击"确定"

设置单元格格式

- 然后输入多位数

输入多位数

  • 使用单引号
    • 输入多位数时,请先在单元格中键入单引号 (‘),然后键入多位数
      使用单引号

从其他区域复制内容到Excel

  • 复制之前,设置单元格的格式为文本
  • 右键目标单元格或区域
  • 点击设置单元格格式
  • 在”数字”选项卡上,选择”文本”,然后单击”确定”
  • 再进行复制

从其他软件导出数据到Excel文件

  • 从其他软件导出数据到txt文件
  • 单击要将数据放入文本文件的单元格
  • 在”数据”选项卡上的”获取外部数据”组中,单击”从文本”
  • 在”导入数据”对话框中,找到并双击要导入的文本文件,然后单击”导入”
  • 选择多位数列,设置列属性为文本

导入TXT设置列格式

VSCode手册

快捷键

命令 快捷键 备注
回退 Alt+LeftArrow
前进 Alt+RigthArrow
显示命令面板 Ctrl+Shift+P, F1
触发建议 Ctrl+Space
格式化文件 Shift+Alt+F
格式选中内容 Ctrl+K Ctrl+F
重命名符号 F2
显示快捷键 Ctrl+K Ctrl+S

正则表达式笔记

正则表达式的功能

  • 验证字符串的有效性
  • 替换符合正则表达式的特定文本
  • 从字符串中提取符合条件的字符串

正则表达式实例

  • 获取特殊符号内的字符串,测试字符串为 '[FAMILY]'='AA'
    • 包含特殊符号的正则表达式\[.*?\],结果为[FAMILY]
    • 不包含特殊符号的正则表达式(?<=\[).+?(?=\]),结果为FAMILY

正则表达式语法符号

  • 普通字符

    • a-z、A-Z、0-9、空格等
    • 任何非特殊字符的字符
    • 各种字节字符
  • 特殊字符(元字符)

    • 基本元字符

      元字符 描述
      . 句号匹配任意单个字符除了换行符。
      [ ] 字符种类。匹配方括号内的任意字符。
      [^ ] 否定的字符种类。匹配除了方括号里的任意字符
      * 匹配>=0个重复的在*号之前的字符。
      + 匹配>=1个重复的+号前的字符。
      ? 标记?之前的字符为可选. 表示前面的字符0个或1一个
      {n,m} 匹配num个大括号之前的字符或字符集 (n <= num <= m).
      (xyz) 字符集,匹配与 xyz 完全相等的字符串.
      | 或运算符,匹配符号前或后的字符.
      \ 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ |
      ^ 从开始行开始匹配.
      $ 从末端开始匹配.
    • 简写字符集

      简写 描述
      . 除换行符外的所有字符
      \w 匹配所有字母数字,等同于 [a-zA-Z0-9_]
      \W 匹配所有非字母数字,即符号,等同于: [^\w]
      \d 匹配数字: [0-9]
      \D 匹配非数字: [^\d]
      \s 匹配所有空格字符,等同于: [\t\n\f\r\p{Z}]
      \S 匹配所有非空格字符: [^\s]
      \f 匹配一个换页符
      \n 匹配一个换行符
      \r 匹配一个回车符
      \t 匹配一个制表符
      \v 匹配一个垂直制表符
      \p 匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符

引用

常用Regex表达式

  • 从字符串中提取文件名和扩展名 [^\/]+\.\w+$
  • 从字符串中提取文件名 [^\/]+(?=\.[^.]+$)
  • 从字符串中扩展名 \.([^.]+)$
  • 匹配电话号码:^1[3-9]\d{9}$
  • 匹配邮箱地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  • 匹配身份证号码:^\d{17}[\d|X]|\d{15}$
  • 匹配URL地址:^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$
  • 匹配日期:^\d{4}-\d{1,2}-\d{1,2}$
  • 匹配IP地址:^((25[0-5]|2[0-4]\d|[0-1]?\d?\d)\.){3}(25[0-5]|2[0-4]\d|[0-1]?\d?\d)$
  • 匹配邮政编码:^[1-9]\d{5}$
  • 匹配中文字符:[\u4e00-\u9fa5]
  • 匹配手机号中间四位为星号:^1[3-9]\d{4}\*{4}\d{3}$

===

发布

Excel合并拆分公式

看过我直播Excel实战在线答疑的朋友应该知道,对于知友的问题,我一般都会提供Excel VBAExcel公式两种解决方案,在一次针对于将日期字符串转化为特地维度的日期时,通过Excel 公式先获取每一个维度的时间,最后再将公式进行组装的时候,替换引用公式一直因为替换错误导致公式错误,最终不得不使用Excel VBA自定义函数来实现。

在那次”失败”的直播演示后,我在思考,在Excel使用公式的时候,我们通过每一个细分的公式来帮助我们梳理需求,最后再拼接公式是一个最正常不过且十分适用的功能,如果因为最后组装公式的时候一直报错,那是很影响效率和心情的。

所以实现了一个自定义的函数来帮助我们自动组装公式,具体的实现逻辑是通过遍历公式的每一层单元格引用,将引用的单元格替换从而得到最终的公式

示例函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
'知乎@米可爱分享
'https://www.zhihu.com/people/chi-ke-ai-chang-da-de-ai-xian-nu-88
'将Excel单元格的公式合并
Function LoopFormulaFun(rng As Range)
Debug.Print (LoopFormula(rng.FormulaLocal))
LoopFormulaFun = LoopFormula(rng.FormulaLocal)
End Function
Function LoopFormula(formula As String)
Dim Replace_Str As String
Dim regexObject As RegExp
Dim result As String
Dim tempRange As Range
Dim tempRangeFormula As String
Set regexObject = New RegExp
With regexObject
.Pattern = "\$?[A-Z]+\$?\d+"
.Global = True
End With
result = formula
For Each v In Split(formula, ",")
If InStr(v, ":") = 0 Then
Set matches = regexObject.Execute(v)
For Each Match In matches
Debug.Print Match.Value 'Result: Helo Hello Hellllo
Set tempRange = Range(Match.Value)
If tempRange.Text <> tempRange.FormulaLocal Then
tempRangeFormula = tempRange.FormulaLocal
If Left(tempRange.FormulaLocal, 1) = "=" Then
tempRangeFormula = Right(tempRange.FormulaLocal, Len(tempRange.FormulaLocal) - 1)
End If
midFormula = LoopFormula(tempRangeFormula)
result = Replace(result, Match.Value, midFormula)
End If
Next Match
End If
Next

LoopFormula = result
End Function

FAQ

  • Dim regexObject As RegExp User-defined type not defined
    添加引用Microsoft VBScript Regular Expressions x.x

Excel开启或关闭单元格之间移动的模糊慢动作特效

Office 2013及更高的版本提供了在输入文本、切换菜单和单元格之间移动鼠标时显示的动画,来平滑移动。

如果你喜欢鼠标在单元格之间移动时的慢动作特效即平滑移动,有点类似鼠标慢慢从A单元格移动到B单元的慢动作回放,那可以选择启用Excel的提供动画反馈

如果你希望鼠标在单元格之间移动时没有平滑移动,是即点即到的,可以选择关闭提供动画反馈.

Excel界面配置

打开Excel->文件->选项->轻松访问->提供动画反馈

修改注册表

  • WIN+R组合键启动RUN对话框,然后输入regedit并回车。它将打开注册表编辑器并转到以下键:

    1
    2
    3
    4
    5
    6
    7
    8
    对于 Office 2013:
    HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Common

    对于 Office 2016:
    HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common

    对于 Office 2019:
    HKEY_CURRENT_USER\Software\Microsoft\Office\17.0\Common
  • 右键单击Common key并选择New -> Key选项。它将创建一个新键,将其名称设置为Graphics,如果Graphics已存在,可以跳过

  • 现在在右侧窗格中,创建一个新的DWORD DisableAnimations并将其值设置为1,如下面的屏幕截图所示

Graphics Registry

4.关闭注册表编辑器并打开任何Office应用程序。更改是即时的,您将不再在Office中看到任何动画和效果。

5.如果要恢复默认动画,请将DisableAnimations 的值更改为0或干脆删除DWORD

#! https://zhuanlan.zhihu.com/p/385673433

Excel阿拉伯数字与罗马数字转换

Excel阿拉伯数字与罗马数字转换

  • 将阿拉伯数字转换为罗马数字作为文本 ROMAN
  • 将罗马数字转换为阿拉伯数字 ARABIC

Excel根据罗马数字对包含罗马数字的文字排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Function GetRomanNum(strInput As String) As String
Dim rMatch As Object
Dim s As String
Dim arrayMatches()
Dim i As Long

With New RegExp
.Global = True
.MultiLine = True
.IgnoreCase = True
.Pattern = "M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})"
If .Test(strInput) Then
For Each rMatch In .Execute(strInput)
ReDim Preserve arrayMatches(i)
arrayMatches(i) = rMatch.Value
i = i + 1
Next
End If
End With
GetRomanNum = Join(arrayMatches, " ")
End Function

Function Test() As Dictionary
Dim dict As Object
Dim key As Variant
Set dict = CreateObject("Scripting.Dictionary")
For Each Rng In Range("d1:d3")
'Debug.Print Rng.Text
'Debug.Print WorksheetFunction.Arabic(GetRomanNum(Rng.Text))
dict.Add Rng.Text, WorksheetFunction.Arabic(GetRomanNum(Rng.Text))
Next Rng
SortDictionary dict
With dict
For Each key In .Keys
'Debug.Print key, .Item(key)
Next
End With
Set Test = dict
End Function

Sub Max()
Dim dict As Dictionary
Set dict = Test()
Debug.Print "result"
Debug.Print dict.Keys(0)
End Sub

Sub SortDictionary(dict As Object)
Dim i As Long
Dim key As Variant

With CreateObject("System.Collections.SortedList")
For Each key In dict
.Add key, dict(key)
Next
dict.RemoveAll
For i = 0 To .Keys.Count - 1
dict.Add .getkey(i), .Item(.getkey(i))
Next
End With
End Sub

Excel破解VBA项目的密码保护

Excel破解VBA项目的密码保护

原理

VBE的密码保护是提供了一个密码窗口,用于输入保护密码,校验输入的密码是否正确
想要破解密码,即通过修改电脑内存中返回校验密码的结果为1即可

  • VBE 将调用一个系统函数来创建密码对话框。
  • 如果用户输入正确的密码并单击”确定”,则此函数返回 1。
  • 如果用户输入错误的密码或单击”取消”,则此函数返回 0。
  • 对话框关闭后,VBE检查系统函数的返回值
  • 如果该值为 1,则 VBE 将”认为”密码正确,因此将打开锁定的 VBA 项目。
  • 我们可以通过实现将用于显示密码对话框的原始函数的内存与用户定义的函数交换,使该函数在被调用时将始终返回 1。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
Option Explicit

Private Const PAGE_EXECUTE_READWRITE = &H40

Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Long, Source As Long, ByVal Length As Long)

Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _
ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long

Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long

Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
ByVal lpProcName As String) As Long

Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _
ByVal pTemplateName As Long, ByVal hWndParent As Long, _
ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer

Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As Long
Dim Flag As Boolean

Private Function GetPtr(ByVal Value As Long) As Long
GetPtr = Value
End Function

Public Sub RecoverBytes()
If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub

Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As Long
Dim OriginProtect As Long

Hook = False

pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")


If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then

MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
If TmpBytes(0) <> &H68 Then

MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6

p = GetPtr(AddressOf MyDialogBoxParam)

HookBytes(0) = &H68
MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
HookBytes(5) = &HC3

MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
Flag = True
Hook = True
End If
End If
End Function

Private Function MyDialogBoxParam(ByVal hInstance As Long, _
ByVal pTemplateName As Long, ByVal hWndParent As Long, _
ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
If pTemplateName = 4070 Then
MyDialogBoxParam = 1
Else
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
hWndParent, lpDialogFunc, dwInitParam)
Hook
End If
End Function

示例

1
2
3
4
5
Sub Unprotected()
If Hook Then
MsgBox "VBA Project 解码成功!", vbInformation, "*****"
End If
End Sub

引用