Wsl2中访问win10的localhost

转:https://devdojo.com/mvnarendrareddy/access-windows-localhost-from-wsl2

grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'

执行上面代码,得到一个ip,这个ip代替127.0.0.1或locahost即可。

可能需要在 设置 – 更新和安全 – 打开安全中心,防火墙和网络中心,在这边把防火墙关掉。

iOS报错Provisioning profile “XX” doesn’t include signing certificate “xx developer”

转载自:https://www.jianshu.com/p/e7bfacc36950

最新版xcode12,可能有bug。已经安装好了证书,下载了对应的Provisioning Profile,但是一直报这个错。

原因分析

首先保证Provisioning Profile的证书是正确的,并且和错误描述中的证书并不匹配,这时候肯定是xcode对Provisioning Profile的识别是错误的,如果能明确设置为正确的证书就好了。

解决方案

打开 Build Settings -> Signing 块,修改Code Signing Identity 这里,把证书选择为匹配的即可。

使用NPS

GitHub仓库

部署架构

公网服务器A,负载均衡B,内网服务器C

在A上安装nps的服务端,并通过B访问nps服务。

服务端

appname = nps
#Boot mode(dev|pro)
runmode = dev

#HTTP(S) proxy port, no startup if empty
http_proxy_ip=0.0.0.0
http_proxy_port=
https_proxy_port=
https_just_proxy=true
#default https certificate setting
https_default_cert_file=conf/server.pem
https_default_key_file=conf/server.key

##bridge
bridge_type=tcp
bridge_port=${YOUR_BRIDGE_PORT}
bridge_ip=0.0.0.0

# Public password, which clients can use to connect to the server
# After the connection, the server will be able to open relevant ports and parse related domain names according to its own configuration file.
public_vkey=${YOUR_PUBLIC_VKEY}

#Traffic data persistence interval(minute)
#Ignorance means no persistence
#flow_store_interval=1

# log level LevelEmergency->0  LevelAlert->1 LevelCritical->2 LevelError->3 LevelWarning->4 LevelNotice->5 LevelInformational->6 LevelDebug->7
log_level=7
#log_path=nps.log

#Whether to restrict IP access, true or false or ignore
#ip_limit=true

#p2p
#p2p_ip=127.0.0.1
#p2p_port=6000

#web
web_host=
web_username=npsadmin
web_password=${YOUR_ADMIN_PASSWORD}
web_port = ${YOUR_WEB_PORT}
web_ip=0.0.0.0
web_base_url=
web_open_ssl=false
web_cert_file=conf/server.pem
web_key_file=conf/server.key
# if web under proxy use sub path. like http://host/nps need this.
#web_base_url=/nps

#Web API unauthenticated IP address(the len of auth_crypt_key must be 16)
#Remove comments if needed
#auth_key=test
auth_crypt_key =${YOUR_AUTH_CRYPT_KEY}

#allow_ports=9001-9009,10001,11000-12000

#Web management multi-user login
allow_user_login=false
allow_user_register=false
allow_user_change_username=false


#extension
allow_flow_limit=false
allow_rate_limit=false
allow_tunnel_num_limit=false
allow_local_proxy=false
allow_connection_num_limit=false
allow_multi_ip=false
system_info_display=false

#cache
http_cache=false
http_cache_length=100

#get origin ip
http_add_origin_header=false

#pprof debug options
#pprof_ip=0.0.0.0
#pprof_port=9999

#client disconnect timeout
disconnect_timeout=60

YOUR_BRIDGE_PORT 是nps服务的端口,可以通过负载均衡B创建监听转发tcp到此端口。

YOUR_WEB_PORT 是nps后台的端口,可以通过负载均衡B的https监听创建转发策略转发域名到此端口。

使用SSH

连接nps后台,创建客户端和通道。创建通道时的端口【通道端口】,是A服务器上的某个开放端口,表示通过此端口和对应的客户端建立连接。

客户端

./npc -server=ip:port -vkey=vkey -type=tcp

# 安装为系统服务
./npc install -server=ip:port -vkey=vkey -type=tcp
service npc start/stop

ip是A的ip,则端口是YOUR_BRIDGE_PORT。ip是B的ip,则端口是负载均衡B的监听端口。

客户端启动后,在其它任意电脑上使用:

ssh user@ip -P 【通道端口】

通过此命令连接到C。

在C上,可以通过B来转发A的ssh,加速C访问A。(C是可以直接访问A的,但是A的带宽可能不足,通过B来转发能加快速度)。这要求C能访问B的转发端口。

Ubuntu 非root远程登录

服务器使用Ubuntu,做点简单处理,使用非root用户。

ssh远程登录

首先保证能通过root连接,可用root用户执行以下命令:

chown root:root -R /root/.ssh/
chmod 700 /root/.ssh/
chmod 600 /root/.ssh/authorized_keys

chown me:me -R /home/lingdou/.ssh/
chmod 700 /home/me/.ssh/
chmod 600 /home/me/.ssh/authorized_keys

其中 me 是要登录的用户名,需要提前创建好。

将用户加入sudo

gpasswd -a me sudo
echo "me ALL=(ALL) NOPASSWD: ALL" | (EDITOR="tee -a" visudo)

禁用密码和root登录

修改 /etc/ssh/sshd_config

PermitRootLogin no
PasswordAuthentication no

重启服务:service sshd restart

mysql 5.7 Disable ONLY_FULL_GROUP_BY

参考链接

修改 /etc/mysql/mysql.conf.d/mysqld.cnf文件,添加:

[mysqld]
sql-mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

注:低版本的(可能小于5.7.18)添加的是:

[mysqld]
sql_mode = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

sql-mode 和 sql_mode的区别。

不确定的都试一下。

这个配置是mysql docker容器的配置文件,如果是host直接安装的,需要改自己的配置文件。另外,[mysqld]是已经存在的,就只加下面的就可以了。

改完记得重启容器。

清空quartz数据库

表顺序如下:

delete from qrtz_CRON_TRIGGERS where 1=1;
delete from qrtz_SIMPLE_TRIGGERS where 1=1;
delete from qrtz_TRIGGERS where 1=1;
delete from qrtz_JOB_DETAILS where 1=1;
delete from qrtz_FIRED_TRIGGERS where 1=1;
delete from qrtz_LOCKS where 1=1;
delete from qrtz_SCHEDULER_STATE where 1=1;

delete from qrtz_BLOB_TRIGGERS where 1=1;
delete from qrtz_CALENDARS where 1=1;
delete from qrtz_PAUSED_TRIGGER_GRPS where 1=1;
delete from qrtz_SIMPROP_TRIGGERS where 1=1;

或者:

SET FOREIGN_KEY_CHECKS=0;
DELETE FROM `qrtz_locks` where 1=1;
DELETE FROM `qrtz_paused_trigger_grps` where 1=1;
DELETE FROM `qrtz_scheduler_state` where 1=1;
DELETE FROM `qrtz_calendars` where 1=1;
DELETE FROM `qrtz_job_details` where 1=1;
DELETE FROM `qrtz_triggers` where 1=1;
DELETE FROM `qrtz_blob_triggers` where 1=1;
DELETE FROM `qrtz_cron_triggers` where 1=1;
DELETE FROM `qrtz_simple_triggers` where 1=1;
DELETE FROM `qrtz_simprop_triggers` where 1=1;
DELETE FROM `qrtz_fired_triggers` where 1=1;
SET FOREIGN_KEY_CHECKS=0;

tmux plugins tpm启动时报错解决

使用的时zsh,配合oh-my-zsh,在wsl2 Ubuntu20 环境,使用Windows Terminal作为终端。

每次启动电脑后,打开终端,执行tmux后会报错:

~/.tmux/plugins/tpm/tpm' returned 1

网上找的解决方案是需要执行:

cd .tmux/plugins/tpm
sh -x tpm

试了在zsh启动时自动执行这个命令,但是没用,暂时只能每次手动执行。。

Ubuntu修改hostname

什么是hostname?

打开终端,使用bash,每行开始都是 用户名@xxxx,@后面的就是hostname。

当你有多台服务器,每台服务器作用不一样,并且需要同时登录多台服务器的时候,通过hostname来区分服务器,还是非常有必要的。

修改

使用hostnamectl命令:

# 直接回车 可查看当前的hostname
hostnamectl

# 设置,执行后会修改/etc/hostname文件
hostnamectl set-hostname new-hostname

# 然后手动修改/etc/hosts文件
# 替换其中的原hostname为新的hostname

# 修改后,不需要重启服务器,退出ssh连接,重新连接即可

参考

点击打开参考链接

Nestjs 使用node-config&dotenv

封装config库,在项目其它app内使用。配合docker部署,效果更好。

// libs/config/src/config.module.ts
import { resolve } from 'path';
import { Module } from '@nestjs/common';
import { IConfig } from 'config';
import * as dotenv from 'dotenv';

const path = resolve(__dirname, '..', '..', '..');

dotenv.config();
// config目录放在 apps libs 同级,config内的文件,和config库的配置完全一致
process.env['NODE_CONFIG_DIR'] = resolve(path, 'config');
/* eslint @typescript-eslint/no-var-requires: "off" */
const config = require('config');

config.env.current = process.env.NODE_ENV || 'development';
config.env.app = process.env.NODE_APP_INSTANCE;
config.env.isProduction = process.env.NODE_ENV === 'production';
config.env.isProd =
  process.env.NODE_APP_INSTANCE === 'production' &&
  process.env.NODE_ENV === 'production';
// 这个是挂载一个config目录下的文件路径,方便使用
config.env.wsdl = resolve(path, 'config', 'SMS.wsdl');

const provider = {

  // 这个地方可以写常量,方便其它地方使用
  provide: 'NODE_CONFIG',
  useValue: config,
};

@Module({
  providers: [provider],
  exports: [provider],
})
export class ConfigModule {}

export type IConfig = IConfig;
// libs/config/src/index.ts
export * from './config.module';
// 这个是创建config lib 的时候自动生成的,其它的自动生成的文件都可以删除,这个留着就可以了
{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "declaration": true,
    "outDir": "../../dist/libs/config"
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist", "test", "**/*spec.ts"]
}

注意,使用docker部署时,需要把config目录复制到容器内,因为config目录不会被build到dist中。

Nestjs入门

依赖注入几种方式。

封装为库

以pulsar的使用为例。特点:需要注入配置,创建client单例。

实现方式:在module中定义static register方法,返回DynamicModule。

  static register(options: any): DynamicModule {
    return {
      // 封装的模块的名字,即当前模块的名字
      module: PulsarModule,
      imports: options.imports || [],
      providers: [
        {
          // 可以在其它模块使用此字符串注入
          provide: 'PULSAR_CLIENT_URL',
          useFactory: options.useFactory,
          inject: options.inject,
        },
      ],
    };
  }

然后在对应service中提供client的方法:

import { Injectable, Inject } from '@nestjs/common';

import {
  Client,
  Consumer,
  Producer,
  ProducerOpts,
  SubscribeOpts,
} from 'pulsar-client';

@Injectable()
export class PulsarService {
  pulsar: Client;
  constructor(@Inject('PULSAR_CLIENT_URL') private url) {
    this.pulsar = new Client({ serviceUrl: url });
  }

  async buildConsumer(options: SubscribeOpts): Promise<Consumer> {
    return this.pulsar.subscribe(options);
  }

  async buildProducer(options: ProducerOpts): Promise<Producer> {
    return this.pulsar.createProducer(options);
  }

  async closeArr(arr: Consumer[] | Producer[]) {
    if (!arr || !arr.length) return;
    for (const ele of arr) ele.close();
  }

  async close(consumers?: Consumer[], producers?: Producer[]) {
    this.closeArr(consumers);
    this.closeArr(producers);
    if (this.pulsar) {
      this.pulsar.close();
    }
  }
}

关于pulsar,一个消息中间件,已经封装为一个npm库,欢迎使用,star。https://www.npmjs.com/package/nestjs-pulsar