Windows Terminal配色主题更换

在windows terminal发布之后就一直在用,默认的配色有点单调,网上有很多配置好的方案,有些挺好看的。

主要有2个网站可以看配色方案:

https://iterm2colorschemes.com/

https://windowsterminalthemes.dev/

找到想要的配色方案,复制配置,填写到windows terminal的json配置文件的schemes数组中就可以

"schemes": 
    [
        {
            "background": "#000000",
            "black": "#000000",
            "blue": "#000080",
            "brightBlack": "#808080",
            "brightBlue": "#0000FF",
            "brightCyan": "#00FFFF",
            "brightGreen": "#00FF00",
            "brightPurple": "#FF00FF",
            "brightRed": "#FF0000",
            "brightWhite": "#FFFFFF",
            "brightYellow": "#FFFF00",
            "cursorColor": "#FFFFFF",
            "cyan": "#008080",
            "foreground": "#C0C0C0",
            "green": "#008000",
            "name": "Vintage",
            "purple": "#800080",
            "red": "#800000",
            "selectionBackground": "#FFFFFF",
            "white": "#C0C0C0",
            "yellow": "#808000"
        }
 ]
JSON

可以设置默认配色,也可以为不同的控制台设置不同的配色。

使用NVS进行nodejs开发环境管理

现在的前端项目基本都用node、webpack这些工具进行管理了,在前端开发多个开发项目时不同项目可能会依赖不同node版本,在项目之间切换时也要切换node环境,这里介绍一个工具NVS(Node Version Switcher),可以很方便地切换node版本

安装

  • windows

windows可以直接在github发布页上下载msi程序安装

也可以通过 chocolatey 安装:

choco install nvs
cmd

也可以手工安装:

通过cmd安装:

  1. 设置nvs目录,根据需求选一个执行:
set NVS_HOME=%LOCALAPPDATA%\nvs                //为当前用户安装
set NVS_HOME=%ProgramData%\nvs                 //为所有用户安装
cmd
  1. 克隆nvs仓库:
git clone https://github.com/jasongin/nvs "%NVS_HOME%"
cmd
  1. 执行安装脚本:
"%NVS_HOME%\nvs.cmd" install
cmd

通过powershell安装:

  1. 设置nvs目录,根据需求选一个执行:
$env:NVS_HOME="$env:LOCALAPPDATA\nvs"                //为当前用户安装
$env:NVS_HOME="$env:ProgramData\nvs"                 //为所有用户安装
PowerShell
  1. 克隆nvs仓库:
git clone https://github.com/jasongin/nvs "$env:NVS_HOME"
PowerShell
  1. 执行安装脚本:
. "$env:NVS_HOME\nvs.ps1" install
PowerShell
  • mac,linux,wsl

mac和linux执行以下命令即可完成安装:

export NVS_HOME="$HOME/.nvs"
git clone https://github.com/jasongin/nvs "$NVS_HOME"
. "$NVS_HOME/nvs.sh" install
Bash

使用

安装完成后,直接执行nvs命令,会让你选择一个node版本下载,直接使用上、下键选择后回车就可以安装:

$ nvs
.----------------------------.
| Select a node version      |
+----------------------------+
| [a] node/16.4.2            |
|  b) node/16.4.1            |
|  c) node/16.4.0            |
|  d) node/16.3.0            |
|  e) node/16.2.0            |
|  f) node/16.1.0            |
|  g) node/16.0.0            |
|  h) node/15.14.0           |
|  i) node/15.13.0           |
|  j) node/15.12.0           |
|  k) node/15.11.0           |
|  l) node/15.10.0           |
|  m) node/15.9.0            |
|  n) node/15.8.0            |
|  o) node/15.7.0            |
'--\/------------------------'
Type a hotkey or use Down/Up arrows then Enter to choose an item.
Bash

也可以通过nvs add命令安装:

nvs add lts
nvs add latest
nvs add 16.4.0
Bash

通过nvs use命令选择node版本使用,而已可以直接使用nvs命令通过交互选择node版本:

$ nvs use latest
PATH -= ~/.nvs/node/14.17.3/x64/bin
PATH += ~/.nvs/node/16.4.2/x64/bin
$ nvs use lts
PATH -= ~/.nvs/node/16.4.2/x64/bin
PATH += ~/.nvs/node/14.17.3/x64/bin
Bash

通过nvs link命令设置默认node版本:

$ nvs link 16.4.0
~/.nvs/default -> ~/.nvs/node/16.4.0/x64
Bash

也直接执行nvs link把当前版本设置为默认版本,执行nvs unlink取消默认版本设置

其他更多命令可以执行nvs -h查看说明。

总结

管理node版本有很多工具,之前有用过nvm for windows、nvm,但是发现这个nvs是跨平台的,就用上这个了,现在通过docker管理node版本也是一个很好的方案。

ohmyzsh的安装与配置

很久之前在知乎看见很多介绍zsh和ohmyzsh的文章,自己试用了一下也确实很方便好用,在这里记录一下安装和配置的步骤,方便自己下次换机器的时候再安装。

我一般用的服务器都是ubuntu,wsl也是用的ubuntu,所以这篇的命令也使用适用与ubuntu的命令。

zsh和ohmyzsh安装

首先要安装zsh和git(下载ohmyzsh的配置用到git)

sudo apt-get install git zsh -y
Bash

接着执行一条命令就可以安装ohmyzsh了,如果github被墙或者github的dns被污染了,可以换成cdn或者github镜像的地址。

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
Bash

安装完成后会询问是否切换zsh为默认shell,直接确认就可以了。

配置

在~/.zshrc文件中修改配置就可以了

  • 主题

个人习惯把主题换成ys,找到ZSH_THEME的代码,进行修改就可以了

更多官方主题可以在github上预览https://github.com/ohmyzsh/ohmyzsh/wiki/Themes

ZSH_THEME="ys"
INI
  • 插件

ohmyzsh自带了挺多插件,在~/.oh-my-zsh/plugins文件夹中,只需要在~/.zshrc启用就好了

官方的插件列表https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins

常用的插件有

  • git (包含git的一些别名和函数)
  • z (提供z命令,快速在文件夹路径之间跳转)
  • docker (docker命令自动补全)
  • docker-compose (docker-compose别名)
  • cp (提供cpv命令,使用 rsync 实现带进度条的复制)
  • extract (提供extract命令,别名x,一键解压所有压缩包)
  • zsh-autosuggestions (命令补全,需要自行安装)
  • zsh-syntax-highlighting (命令高亮,需要自行安装)

zsh-autosuggestions、zsh-syntax-highlighing需要自行安装,执行命令使用git把插件仓库克隆下来就可以了

git clone https://github.com/zsh-users/zsh-autosuggestions.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
Zsh
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
Zsh

启用插件在~/.zshrc里面找到plugins=()在括号中添加需要的插件就可以了

plugins=(
        git
        z
        docker
        docker-compose
        cp
        extract
        zsh-autosuggestions
        zsh-syntax-highlighting 
)
Zsh
  • 配置生效

配置完成后,保存~/.zshrc,执行命令source ~/.zshrc就可以马上生效了

总结

ohmyzsh本来就配置好了很多人性化的功能,我自己对zsh的自定义也不多,其他更多的配置方法可以参考官方仓库的文档。https://github.com/ohmyzsh/ohmyzsh/wiki

git丢失commit代码恢复

上周代码在本地提交了,然后用git reset –hard到生产的版本,打算对比一下变化然后写变更手册,其实不应该reset的。

reset后发现之前的commit没了,还以为自己没提交,后来同事说可以恢复,就上网找了一下,然后真的成功了,不然写了两个星期的代码就没了。

先执行命令:

git fsck --lost-found
Bash

会列出dangling commit和dangling blob和他们的SHA1 id

使用命令

<span role="button" tabindex="0" data-code="git show
git show <SHA1>
Bash

会列出选择id的内容

然后使用命令

<span role="button" tabindex="0" data-code="git branch <SHA1> #创建新分支 git merge
git branch <SHA1> #创建新分支
git merge <SHA1>  #合并到当前分支
Bash

最后恢复成功了。

2021年的第一篇博客

不知不觉已经2021年了,好久没更新博客了。

在2020这一年发生了很多事,年底的时候结婚了完成一件人生大事。

看见之前把自己车撞凹的博客,又想起2020年初的时候在城门头的环岛被人追尾,修了4千5。

上周睡醒午觉又收到短信,说他刮花了我的车,修车联系他赔偿,人还是很有责任心的,加微信后发现是同事。

然后最近老是觉得上什么网站都不顺,上个GitHub都会打不开,上个docker hub官网都转半天。

之前想把服务器备份一下,然后备份完之后就刚好重装成ubuntu20.04算了,之前是centos7。

重装完之后就重新搞了一下traefik,重新认识一下,加深了理解,配置好了。

搞定这些后又给博客换了个皮肤,换了个壁纸,感觉好看了很多。

又把各个平台的头像换了。

感觉年纪大了,身体越来越多毛病,又腰肌劳损,又腰背肌筋膜炎。

希望21年能身体健康,工作顺利,升职加薪。

Serilog的使用

最近在写自己用的项目模版,使用到一个日志组件serilog,在nuget上看见下载量很高,就试用一下,还挺好用,记录一下。

官网:https://serilog.net/

涉及到的几个包:

Serilog:Serilog核心包

Serilog.AspNetCore:关于AspNetCore的扩展包,可以记录一些请求、路由信息

Serilog.Settings.Configuration:从 Microsoft.Extensions.Configuration 读取配置,包括appsettings.json文件的配置

Serilog.Sinks.Console、Serilog.Sinks.MSSqlServer、Serilog.Sinks.File:带Sinks的就是日志输出的位置,Serilog实现了很多输出形式,我这里用到了控制台、文件和SqlServer数据库

安装、使用:

由于我平时写的是aspnetcore的web项目,这里就记录aspnetcore项目添加Serilog的方法

1、把用到的包装上:

Install-Package Serilog
Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.MSSqlServer
Install-Package Serilog.Sinks.Console
Install-Package Serilog.Sinks.File
PowerShell

2、在程序入口Main初始化Loger:

<span role="button" tabindex="0" data-code="// 默认logger ,默认输出到控制台,避免配置文件出错时logger初始化失败 Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .Enrich.FromLogContext() .WriteTo.Console() .CreateLogger(); try { Log.Information("应用程序启动"); var host = CreateHostBuilder(args).Build(); // 创建可用于解析作用域服务的新 Microsoft.Extensions.DependencyInjection.IServiceScope。 using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { // 通过注入获取配置 var configuration = services.GetRequiredService
// 默认logger
默认输出到控制台避免配置文件出错时logger初始化失败
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .Enrich.FromLogContext()
    .WriteTo.Console()
    .CreateLogger();

try
{
    Log.Information("应用程序启动");
    var host = CreateHostBuilder(args).Build();

    // 创建可用于解析作用域服务的新 Microsoft.Extensions.DependencyInjection.IServiceScope。
    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            // 通过注入获取配置
            var configuration = services.GetRequiredService<IConfiguration>();

            // 从配置读取Logger配置
            Log.Logger = new LoggerConfiguration()
                .ReadFrom.Configuration(configuration)
                .CreateLogger();
        }
        catch (Exception e)
        {
            Log.Error(e,$"读取配置时出错");
            throw;
        }
    }
    host.Run();
}
catch (Exception ex)
{
    Log.Fatal(ex, "应用程序启动失败");
}
finally
{
    Log.CloseAndFlush();
}
C#

3、在CreateHostBuilder引用UseSerilog:

<span role="button" tabindex="0" data-code="Host.CreateDefaultBuilder(args) .UseSerilog() .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
    webBuilder.UseStartup<Startup>();
});
C#

4、在appsettings.json添加配置:

"Serilog": {
  "MinimumLevel": {
    "Default": "Debug",
    "Override": {
      "System": "Information",
      "Microsoft": "Warning",
      "Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore.Database.Command": "Warning"
    }
  },
  "WriteTo": [
    {
      "Name": "Console",
      "Args": {
        "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Literate, Serilog.Sinks.Console",
        "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
      }
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
}

"Serilog": {
  "Using": [ "Serilog.Sinks.MSSqlServer" ],
  "MinimumLevel": {
    "Default": "Debug",
    "Override": {
      "System": "Information",
      "Microsoft": "Warning",
      "Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore.Database.Command": "Warning"
    }
  },
  "WriteTo": [
    {
      "Name": "Console",
      "Args": {
        "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Literate, Serilog.Sinks.Console",
        "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
      }
    },
    {
      "Name": "MSSqlServer",
      "Args": {
        "connectionString": "NamedConnectionString",
        "sinkOptionsSection": {
          "tableName": "Logs",
          "schemaName": "EventLogging",
          "autoCreateSqlTable": true,
          "batchPostingLimit": 1000,
          "period": "0.00:00:30"
        },
        "restrictedToMinimumLevel": "Warning"
      }
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
}

"Serilog": {
  "MinimumLevel": {
    "Default": "Debug",
    "Override": {
      "System": "Information",
      "Microsoft": "Warning",
      "Microsoft.AspNetCore.Hosting.Diagnostics": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "Microsoft.EntityFrameworkCore.Database.Command": "Warning"
    }
  },
  "WriteTo": [
    {
      "Name": "Console",
      "Args": {
        "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Literate, Serilog.Sinks.Console",
        "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} <s:{SourceContext}>{NewLine}{Exception}"
      }
    }
  ],
  "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
},
JSON

5、记日志:

可使用Serilog自带的静态类记日志

Log.Information("Hello, world!");
C#

也可以通过注入方式获取Logger

<span role="button" tabindex="0" data-code="private readonly ILogger<DbInitializer> logger; public DbInitializer(ILogger<DbInitializer> logger) { this.scopeFactory = scopeFactory; this.logger = logger; } public void Initialize() { logger.LogInformation("检查迁移开始"); using(var serviceScope = scopeFactory.CreateScope()) using(var context = serviceScope.ServiceProvider.GetService
private readonly ILogger<DbInitializer> logger;
public DbInitializer(ILogger<DbInitializer> logger)
{
    this.scopeFactory = scopeFactory;
    this.logger = logger;
}

public void Initialize()
{
    logger.LogInformation("检查迁移开始");
    using(var serviceScope = scopeFactory.CreateScope())
    using(var context = serviceScope.ServiceProvider.GetService<MyDbContext>())
    {

        context.Database.Migrate();
    }
    logger.LogInformation("检查迁移结束");
}
C#

2019年末迎接2020年

今年都没怎么写日志,上一篇还是3月写的,现在就2019年末了,距离全面小康的2020年还有14天。

最近把服务器重装了,其实就挂个博客,改成docker的模式,这2天研究traefik暴露docker服务,看英文文档看得头疼。

服务器的swap分区只有100多m,小到mysql挂掉了,后来找到方法可以扩展swap分区,现在应该没问题了。

不过docker真的好方便,现在搭一个应用都不用装这个装那个,直接看看docker镜像怎么配置,一条命令就跑起来了。

感觉今年好像好忙,又好像没做什么。

之前去了珠海长隆海洋王国,真的很好看,特别是企鹅。

双十二买了个洗鼻壶,洗了三次,不是太会用,再用一段时间看看是不是有效果。

玩了好几年omg最近又开始玩dota2的普通匹配了,还是很好玩。

希望2020年能升职加薪,全面小康,加油,奥利给。

2019年初的一些日常

服务器都给了钱搭了个博客好久没动,感觉有点亏,还是上来更新一下博客。

不知不觉2019年就已经到第三个月了,然而感觉工作上没没有什么特别大的进展。

最近招聘好像好多人投简历,然后决定招聘2个人,一个31岁的,一个应届毕业生,希望能早点来帮忙减轻工作。

这2天搞一个ie9的上传控件的兼容问题,真是烦,还好搞定了,真是不想再搞ie的东西。

下周开始估计要去总行上班,到时候分行的工作又要被催催催了。

最近看angular进展不错。

今天dota2更新了新英雄,马尔斯。

上周买了个车载无线充电手机支架,全自动夹臂,高端。

过年前在拼多多买了2个斐讯k2p路由器,1个t1电视盒子,不错,不过有点贵。

最近经常有一种想花钱买东西的冲动,然后买了回来又丢一边了,不过也没想到有什么东西好买的,就每天看看,看完就关掉。

希望2019年顺顺利利,升职加薪,加油

2018年末记一些比较有用又怕忘记的代码吧

2018年剩明天一个工作日了,感觉今年做了很多东西,又感觉没做什么东西,主要指工作上。

很多个系统做着做着因为需求太复杂了,做不下去不想做了,人手不够真的好难自己一个人开发一个复杂的系统,也没啥时间在前端方面深入学习。

做一个计算绩效的系统,开始不知道怎么做,把数据库设计得很复杂,通用性又好差,很多奇怪的指标都实现不了。半年后知道了一个库DynamicExpresso,可以动态执行c#代码返回结果,如果绩效系统能用上这个就能支持好多绩效的指标了,于是就想重构这个系统了,可是最近需求比较急又没时间去重构,只好在旧系统上先改一下。

使用DynamicExpresso具体代码就是这样:

var dict = new Dictionary<string, decimal>();
dict.Add("a", 2.0m);
dict.Add("b", 0.3m);
dict.Add("c", 0.05m);
var formula = "0.2>=dict[\"b\"]?dict[\"a\"]*dict[\"c\"]:33";
var target = new Interpreter();
target=target.SetVariable("dict", dict);
var result = target.Eval<decimal>(formula);
C#

可是执行的时候又报错了:没有为类型“System.Double”和“System.Decimal”定义二进制运算符 GreaterThanOrEqual。

开始没读懂什么意思,百度又百度不到。

后来发现可以添加这段代码把错误提示显示成英文:

if (Debugger.IsAttached)
    CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.GetCultureInfo("en-US");
C#

这样显示的错误就是:The binary operator GreaterThanOrEqual is not defined for the types ‘System.Double’ and ‘System.Decimal’.

英文的错误就比较好搜索到解决方案了,原来是我的表达式中的“0.2>=dict[“b”]”里面的“>= ”左边是Double类型,右边是Decimal类型,执行时没有自动转换类型,所以就报错了改成这样就能执行通过了:

var formula = "0.2m>=dict[\"b\"]?dict[\"a\"]*dict[\"c\"]:33";
C#

就是把0.2定义成Decimal类型,这样就可以使用“>=”进行运算了。

把错误信息用英文显示这句代码真的很有用,怕不记得就写篇日志记一下,以后可能还用得到。

好久没上博客写日志了,也没什么好写的,希望2019年生活越来越好,身体越来越健康。

随便写点什么

最近挺累的,又晚睡,一晚睡就掉头发

前天看见新闻说网易博客关闭,今天收到腾讯的通知域名证书快过期,于是今天去把证书更新了,顺便上来写篇日志吧

网易博客关了还好吧,反正我也不用了

小弟来干了3个月试用期,最后还是要走了,月底走

最近买了个太鼓达人来玩,体感根本就玩不了,不过按键也很好玩

反而塞尔达没有那种让你玩得停不下来的感觉

最近在打ti8,不过都是凌晨开始打,真是没法看,现在老了,周末都想11点睡觉

想起上星期喝了一口过期牛奶真是好难受,还好没有肚子疼

上个季度星期一到星期六每天都有动画片更新看,然后完结之后这个季度只剩下几个可以追了,感觉好空虚

最近也看了不少书,可是没有实践使用的话,感觉很容易忘记

已经想换手机了,主要原因是因为内存老是不够用,所有软件都不想删,隔一段时间就要清理,以前用16g的时候总感觉32g就够用,现在用32g又不够用了,不知道买64g的话会不会还是不够用,现在的软件占空间真大,微信都占了差不多4个g了

早睡早起