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…
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