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

周末随心飞

偶然有一次认真考虑了东航随心飞,虽然在这之前好像知道有这么个产品,但是感觉没什么用,没有去了解。那天之后就认证研究了一下,发现还不错,3666元,从10月31号到6月27号之间的每个周末航班,可以任意兑换,不限次数。春运期间大概一个月不能用。但是我买的时候已经是12月2号,所以浪费了一个月。

还好我买这个的时候发现,上海-洛阳往返的机票,有了东方航空的航班,并且是虹桥机场的。之前都是浦东机场的航班,记得上次我老婆来上海的时候。虽然现在航班不多,每天每个方向只有两班,但是时间还可以。PS:浦东机场实在太远,坐地铁赶过一次,从公司出发,1个多小时还凑合,从嘉定出发简直可怕。

买了随心飞之后,每个周末都飞回家,陪老婆吃顿饭,帮老婆洗洗衣服什么的。可惜随心飞不包机场建设费,每次还是需要100块钱的成本。其它的成本尽量减少,地铁去机场,公交回家。再公交或者老婆开车送我去机场,然后地铁回家。

上次回去,从机场回家的时候,打算去问问D1路什么时候发车,碰到有个大哥开着车问我,新区去不去?我说多少钱,他说不要钱,上来吧,路上聊聊天就行。我一听直接就坐了副驾驶。到龙门大道展览东路路口下来,打电话给老婆骑车来接我,我边走边等老婆。结果看到老婆的时候,喊了一声,看着老婆放慢了车速,但是又加速跑了。。赶紧打电话,但是她骑车的时候听不到,只能等她到了,好在不远,第二次打老婆就接到了,然后马上拐了回来。结果我老婆说我以为你走的话肯定走路边,不会走里面。我说我是走路边啊,但是我不能逆行啊,原来我老婆只顾着看她骑车的那边马路。唉,是我没考虑到啊。

异地期间,不能每天陪伴,每个周末的陪伴,也是非常珍惜。但是还是希望能早点结束异地,陪伴还是那么的重要。

初始化wsl

系统更新

# cat EOF 用法:https://blog.csdn.net/lym152898/article/details/83306993

mv /etc/apt/sources.list /etc/apt/sources.list.bak

sudo su
cat > /etc/apt/sources.list <<EOF
# 中科大 @see https://www.cnblogs.com/leeyazhou/p/12976814.html
deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
EOF

exit

sudo apt update
sudo apt upgrade

编译安装vim

安装zsh

sudo apt install zsh

安装nvm&node

安装vim套件

mkdir Applications && cd Applications

git clone git@git.zhlh6.cn:vim/vim.git  # github加速插件提供的加速地址
git clone git@github.com:ilaipi/k-vim.git
git clone git@github.com:ilaipi/k-tmux.git

# install k-vim

# install k-tmux
clone and install (ln -s)

# install tmux tpm
# 需要先clone下来tpm包管理器才能安装其它插件

身份证号校验

      function validate(code) {
        var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
        var parity = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
        var sum = 0;
        var i = 0;

        if (!/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(code)) {
          return false;
        }

        for (i = 0; i < 17; i = i + 1) {
          sum += code.charAt(i) * factor[i];
        }

        return parity[sum % 11] === code[17].toUpperCase();
      }

按照算法,严格校验身份证。

破解nosqlbooster

参考链接

版本:6.1.4

禁用自动更新

【适用于windows 10】第一次安装后,使用vs code打开`C:\Users\Billy\AppData\Local\Programs\nosqlbooster4mongo\resources\app-update.yml`,修改url,随便改成啥,然后安装完成后执行第二次安装,第二次安装过程中不断保存这个文件,防止安装过程中直接请求更新,只要请求不到新的更新就可以不自动更新。

1,安装工具

npm install asar -g

2,进入软件目录,解压

// Mac OS
// 在 /Applications/NoSQLBooster for MongoDB.app/Contents/Resources

// Win 10
// 打开NoSQLBooster,在任务管理器中找到进程,右键,点击打开文件位置

asar extract app.asar app

3,修改

// vim ./app/shared/lmCore.js

// 这两个变量在一块,搜MAX_TRIAL就出来了
// MAX_TRIAL_DAYS = 150 -> MAX_TRIAL_DAYS=6000
// TRIAL_DAYS = 30 -> TRIAL_DAYS=6000

// Mac
// 继续搜 TRIAL_DAYS
// fs.existsSync(e)?60:TRIAL_DAYS) -> 这里的数字30改成6000
// ("0xb","!K5F")?60:(r=exports[  -> 这里的数字30改成6000

// Win10
// 继续搜 TRIAL_DAYS
// fs[_0x3f02("0x90",")k8m")](w)?60:TRIAL_DAYS) -> 这里的数字60改成6000
// 0x3f02("0xd","^zHg")?60:map[type]:TRIAL_DAYS) -> 这里的数字60改成6000

4,打包

asar pack app app.asar
// wait a minute...

5,重启

使用WebSocket

客户端:微信小程序
服务器:eggjs+egg-socket.io

弄清楚几个概念。

namespace

// client
import io from 'weapp.socket.io';
// 请求服务器的 'chat' namespace
const server = io('ws://localhost:7001/chat', {
  transports: ['websocket'],
});

// server
// 监听 'chat' namespace下的 one-event-name 事件
app.io.of('chat').route('one-event-name', xxx);

path

这个相当于http的请求路径。

// client
const server = io('ws://localhost:7001/chat', {
  path: '/socket', // default: socket.io
  transports: ['websocket'],
});

// server based on eggjs
config.io = {
    init: {
      path: '/socket',
    },
};

// server based on socket.io directly
const Server = require('socket.io');
const io = Server({
    path: '/socket',
    serveClient: false
  });

在服务端需要根据这个path做反向代理,比如:

location /socket {
  proxy_pass socket_server_address; // 支持socket协议的服务
}

使用的时候,约定好namespace,一般应用用一个namespace就可以。多个namespace可以使用同一个socket连接,也可以使用多个:

// @see https://github.com/socketio/socket.io-client/blob/master/docs/API.md
// By default, a single connection is used when connecting to different namespaces (to minimize resources):

const socket = io();
const adminSocket = io('/admin');
// a single connection will be established

// That behaviour can be disabled with the forceNew option:
const socket = io();
const adminSocket = io('/admin', { forceNew: true });
// will create two distinct connections

// Note: reusing the same namespace will also create two connections
const socket = io();
const socket2 = io();
// will also create two distinct connections

备婚日记

2020年,我30岁,老婆28岁。

6月25日,端午节,和老婆一起参加了蒙娜丽莎的端午活动,最终订了一套婚纱照。7月30日,到蒙娜丽莎店里看了一下,当面了解了婚纱照内容、安排,确定10月3日排,外景大概选小浪底水库。

8月16日,和老婆去正大广场逛,特意逛了几家珠宝店,最后终于在周大福选中了一个老婆比较喜欢的钻戒,原价9100,打85折,7735买了下来。24分(1克拉=100分)。买完钻戒发现老婆特别喜欢,每天都要拿出来看看,让我给她带上。老婆还说要带着去上班,带着去郑州参会。

10月3日,原定的拍婚纱照日期,1号左右跟婚纱店的人问,到时候怎么安排,结果他们说给我们忘了,没有安排。我们时间都是安排好的,没有其它时间了,所以要求他们必须安排好。最终还是拍上了,不知道安排的摄影师是不是我们的价位的。拍了4套衣服,去了趟小浪底。拍照的时候,最大的感觉是,平时老婆不愿意,也不会做的动作,摄影师让她做她就做了,真的有了“平等”的感觉。

10月11日,领证啦!~~~领证当天还吵一架。本来领证老婆心情就比较复杂,吵架之后就哭的可伤心了,中午就回丈母娘家坐了坐。下午又去,终于顺利领到属于我们的红本本。持证上岗的感觉是不一样的。不会有老婆说的那种领证之后就变了的感觉,变化的只是,我觉得,像以前,如果一次吵架,隔几天不联系,然后可能就没有然后了。但是有了证,首页也不会几天不联系,不管什么时候,她都是我老婆了。

10月24日,老婆带好友去选照片。最终换了相框,加了照片,多付了3000大洋。共计84张精修,送了几个摆台,什么的,老婆要了好多,感觉很划算。

10月30日。乐队、车队、婚礼策划,全部确定,价格定好,付了定金。建立微信群,让他们可以互相联系。乐队:5000(300),车队:2880(880),婚礼策划:5000(1000)。婚礼策划用的是老婆好友亲戚家的,盛世情缘,他们老板做司仪。车队,3系7辆,260元一台,5系一辆300元,炮车一辆500元,皮卡一辆260元合计10辆车。

10月31日,看精修。

11月11日。趁着双11,在淘宝买了很多结婚用的东西。气球啊,贴纸啊什么的。还买了个梳妆台,打算放在卧室,感觉一下子卧室就不一样了。

计划11月24日发货。实际11月19号就签收了。

12月12日,被子。我妈一直心心念念把被子早点弄好,要用丈母娘家的棉花,跟我说了好几次,我也跟老婆说了几次。最后让我妈跟丈母娘联系,丈母娘说晚点再弄也行,不然家里大堆小堆保存还是问题。我妈一听也是,就说那就晚晚。可没过多久,我妈突然说丈母娘说让她去弄,我说咋回事。原来是老婆和丈母娘打电话的时候,丈母娘说我妈着急弄被子,老婆说人家着急就让人家弄呗。。于是就弄了。

12月25日。老婆买了一对仿真钻戒,婚礼上使用。可惜快递给弄丢了。。过段时间 再买吧。

21年元旦放假回家,原计划最重要的事情是3号老婆去试装,带上伴娘和我。可惜时间关系,加上试装的老板临时说3号上午有事,想改时间。那后面我没空,只能让我老婆找时间带张去了。这次和老婆还有丈母娘去医院看外公,先一起去大张买东西,然后去医院。外公竟然还记得我的名字,觉得好厉害。丈母娘做的饼,好多好多,和上次一样好吃,我拿了好多。去买了一双皮鞋,190的鞋,讲价到150,还是很满意的。

这次元旦,12月31号到家的,晚上和老婆一起去看了电影,到小吃街吃吃吃。以为买的电影票是大北门的,到那边取票的时候试了好多次取不出来,到柜台问了一下说不是这边的。。原来是十字街店。。于是只能再走回十字街,,从十字街走过来,又走回去。还好时间充足。电影《送你一朵小红花》,看起来还挺好看的。

翻了一下20年元旦前的聊天记录,那时候我叫老婆,老婆一开始拒绝,后来还是默许了,哈哈。今年元旦,我们一起看电影跨年,在一起过完了一整年了,时间好快,期待3月18号的婚礼。

约定从5月1号开始,每个月1号存1w,我给老婆8k,老婆出2k,一起存1w。奶粉钱,不乱动。

决定回家

一开始断断续续在找一些机会,尝试用boss直聘、拉钩这两个平台的时候,没找到对应的洛阳节点,以为这两个新兴平台不支持小地方,所以使用51job,很长时间发现这上面并没有什么好的机会。

最近突然想到这两个平台上直接搜洛阳试试看。然后就发现boss直聘上面机会还是有的,于是试着投简历,还真有了反应。

6月29号上午,和一个公司的老板聊了聊,最后决定马上回洛阳,把最近聊的几个都去面试一下。

第一家,一个小公司,处于组建团队阶段,跟老板聊了一会儿,然后他之前谈的架构师到了,又聊了一会儿,这架构师53岁了,一副充满敌意的样式,无法合作。后来就来了一些其他候选人,老板让我帮忙面试。。面了几个,老婆要下班了,我就说有事要先走了。本来打算后面跟他们老板再微信聊聊,但是看他们老板并没有这个意思,所以就算了。

然后就联系了中浩德的hr,想提前面试,约定周三的时候过去。一路聊了几个人,都还不错。但是因为我对自己定位并非专攻代码,并且5年左右写的都是node,java并没有那么深了,最终定的java的能力是中级,综合能力加分项,所以他们最终讨论的结果是以P5的A1来给薪水,只有8180+650,太低了。但是我确实想回来,想了很久最后还是答应了。

然后老婆就不开心了,不说话,不理我。我本来也比较纠结,比较忐忑,不知道决定是否正确。老婆再这样,我心里真的很痛苦。第二天早上起来,吃完早餐,老婆起床后直接打开电脑要干活。我实在受不了了,一时冲动,就把老婆的书丢到一边,把老婆的电脑合上,想让老婆跟我说话,然而也不知道怎么说。我太凶了,老婆委屈的哭了,第一次见老婆哭的这么厉害,当时心疼死了,但是没有办法,我自己也特别难过。

一直到晚上,老婆都不理我。我实在受不了,就下楼到车上坐了很久。后来还是上楼了,老婆还是不理我。后来来抱老婆,老婆终于说话了,老婆说了两句话。

“我就是比较焦虑。”

“我当然也想让你回来,可是我…”

我分析了一下,简单算,目前总欠款37万。6月工资2w,公积金3w,加油站的15w,我爸借出去的2万,这些钱,然后还欠15万,就不太多了。按每年收入7w,大概两年能还完。一年的收入用来结婚,压力不大。装修的话,到时候靠装修贷款。虽然比较难,但是只要工作稳定,总体还是好的。

感觉如果现在不抓住机会回来,2年后,或者3年后,到该要孩子的时候,压力更大了,恐怕到时候就没有勇气,放弃上海的工作,回洛阳来找工作了。为了以后能不和老婆异地,现在只能度过困难时光了。希望现在的选择是对的。

事情到最后还是有了转机,最终又选择留在上海了。瓴豆合并到曙瑞,到曙瑞拿23k税前。半年内可能工作量都不会太大。但是如果没有工作量,所谓的绩效考核就很难了,不确定接下来会如何。新版本app按时上线可能是比较好的绩效了。