憨憨呆呆的IT之旅

我见,我思,我行

需要在新电脑安装node.js环境,记录步骤如下。

下载安装NodeJs

node.js版本更新较频繁,上一次安装我用的还是10.x, 现在已经17.x了。
由于之前遇到过安装太高版本的node.js后装不上node-sass的问题,这次特意先查询了一下网上资料,发现16.x系列有对应的成功案例,所以选了16系列。
先从官网下载了node.js16系列目前最新版本V16.20.2msi安装包,双击安装包一路next安装即可。
安装完后,打开新的cmd窗口,运行node -vnpm -v命令检查一下是否成功。我得到的命令行反馈版本号分别是v16.20.28.19.4

配置npm缓存目录到非系统盘

血泪教训,之前没在意npm缓存目录,所有包文件都默认装到的C盘,导致后来我C盘空间极度紧张。而且npm的包大部分都是一堆小文件,删起来特别费时间。这次特意解决这个问题。

1
2
npm config set prefix "D:\Tools\AppData\nodejs\node_global"
npm config set cache "D:\Tools\AppData\nodejs\node_cache"

然后配置系统环境变量,在用户变量Path中增加路径:D:\Tools\AppData\nodejs\node_global,在系统变量中新增NODE_PATH指向D:\Tools\AppData\nodejs\node_global\node_modules。这里主要是为了解决之后npm install -g xxx找不到命令的问题。

配置npm镜像加速

受够了外网蜗牛般的速度,果断换成国内镜像:

1
2
npm config set registry https://registry.npm.taobao.org

关闭strict-ssl模式

解决报错Warning: Setting the NODE_TLS_REJECT_UNAUTHORIZED environment variable to '0' makes TLS connections and HTTPS requests insecure by disabling certificate verification.

1
npm config set strict-ssl false

安装node-sass

首先设置国内镜像地址:

1
npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass/

然后执行:

1
2
npm install node-sass@6.0.1 -g
npm install sass-loader@10.2.0 -g

可选安装 hexo、vue等

1
2
npm install hexo-cli -g
npm install -g @vue/cli

完毕!

安装Node环境

安装方式分两种: 一种是nvm安装多版本, 一种是使用二进制文件安装. 这里采用nvm方式安装.
步骤如下:

首先, 使用git拉取nvm代码:

1
git clone https://github.com/cnpm/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`

然后, 激活nvm:

1
2
echo ". ~/.nvm/nvm.sh" >> /etc/profile
source /etc/profile

激活后即可ls出所支持的node版本:

1
nvm list-remote

选择一个版本号执行安装, 安装命令如下:

1
nvm install v14.20.0

检查已安装版本:

1
nvm ls

切换到目标版本:

1
nvm use v14.20.0

查看当前node版本:

1
node -v

退出后找不到 node 及 npm 命令问题

退出云服务器再次登录后, 执行node -v, 会报错: node: command not found.
这时, 需要先nvm use v14.20.0一下, 然后查找一下node可执行文件路径:

1
whereis node

比如我的路径是: /root/.nvm/versions/node/v14.20.0/bin/node,
这里可以建立一个指向node可执行文件路径的软链接:

1
ln -s /root/.nvm/versions/node/v14.20.0/bin/node /usr/local/bin/node

这样就可以在重新登录后继续使用node命令了.

nvm命令也需要按上述步骤处理一下.

小尾巴

显然, 这种处理方式不完美, 每次切换到不同node版本后, 需要重新建一遍软链接, 指向当前node版本.

简单三步实现ssh免密登录

假设我们有两台Linux服务器A(172.22.170.149), B(172.22.170.148), 现在要配置A免密登录B. 操作步骤如下:

先人工登录一次

1
ssh root@172.22.170.148

第一次登录时, 会提示是否把对方机器加入当前机器的已知host列表里(类似白名单).

1
2
3
The authenticity of host '172.22.170.148 (172.22.170.148)' can't be established.
ECDSA key fingerprint is SHA256:78SJbYxxxxxxxxxxxxxxxxxxxxxxxxwvB2F3up7VI.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

输入yes继续.

1
2
Warning: Permanently added '172.22.170.148' (ECDSA) to the list of known hosts.
root@172.22.170.148's password: 这里输入密码

按提示输入密码即可成功登录服务器B. 出现类似以下提示即表示登录成功(这里是阿里云的ECS服务器).

1
2
3
4
Welcome to Alibaba Cloud Elastic Compute Service !

Last login: Fri Jul 15 09:40:47 2022 from 101.206.167.221
[root@iZ8vb0nljx0sx0od8wvle6Z ~]#

然后输入exit退出服务器B, 返回服务器A.

1
exit

在A服务器生成密钥对

1
ssh-keygen

出现交互选择信息时, 一路回车即可.

传输A服务的公钥到B服务器

1
ssh-copy-id 172.22.170.148

这里要再输入一次密码. 才能把公钥传过去.

然后A服务器就可以ssh免密登录B服务器了.

验证一下

使用如下命令验证免密登录是否成功:

1
ssh root@172.22.170.148

快来动手试试吧!

SQL基础面试题整理

表结构

  • 学生表
    Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别
  • 课程表
    Course(c_id,c_name,t_id) – –课程编号, 课程名称, 教师编号
  • 教师表
    Teacher(t_id,t_name) –教师编号,教师姓名
  • 成绩表
    Score(s_id,c_id,s_score) –学生编号,课程编号,分数

例题

  1. 查询平均成绩大于60分的学生的学号和平均成绩
  2. 查询所有学生的学号、姓名、选课数、总成绩
  3. 查询没学过“张三”老师课的学生的学号、姓名
1
2
3
4
select s_id, s_name from student where s_id not in (
select s_id from score a, course b, teacher c
where a.c_id = b.c_id and b.t_id = c.t_id and c.t_name = '张三'
)

​ 4. 其他问题 https://zhuanlan.zhihu.com/p/43289968

1
SELECT b.book_main_id, b.name, b.author, b.last_update_time, b.last_update_content from (select author, max(last_update_time) as last_update_time from book_main where author in ('$authors_str') group by author) as a, book_main as b where a.author=b.author and a.last_update_time=b.last_update_time";

命令行导出MySQL数据库表数据示例

  • 导出所有数据库所有表:

    1
    mysqldump -uroot -ppassword --all-databases > ./all_dbs_data.sql
  • 导出db1, db2数据库:

    1
    mysqldump -uroot -ppassword --databases db1 db2 > ./db1_db2_data.sql
  • 导出db1数据库的t1,t2表:

    1
    mysqldump -uroot -ppassword --databases db1 --tables t1 t2 > ./db1_t1_t2_data.sql
  • 导出db1数据库的t1表中id=1的数据:

    1
    mysqldump -uroot -ppassword --databases db1 --tables t1 --where='id=1' > ./t1_w1.sql
  • 只导出表结构, 不含数据:

    1
    mysqldump -uroot -ppassword --no-data --databases db1 --tables t1 > ./t1_structure.sql
  • 导出远程MySQL服务器的数据:

    1
    mysqldump -hhost -Pport -uroot -ppassword --databases db1 > ./remote_db1_data.sql
  • host1服务器导出db1.tb1表数据,然后导入到host2服务器的db2.tb1表(会自动建表):

    1
    mysqldump -hhost1 -Pport1 -uroot1 -ppassword1 --databases db1 --tables t1 | mysql -hhost2 -Pport2 -uroot2 -ppassword2 db2

接到一个需求,有一个输入框,用来显示用户的身份证号。要求显示时只显示身份证号的前4位和后4位,中间用星号代替。支持用户修改身份证号。

实现思路如下:

  1. 写两个input输入框,姑且称为input1和input2,input1用来保存正确的身份证号、表单验证、提交都读取input1的值。input2用来显示星号处理过的身份证号,并处理用户按键编辑。
  2. 给input2绑定3个事件,keyup、focusin、focusout。focusin时从input1读取正确身份证号填充给input2,keyup时将用户修改后的身份证号写回到input1,focusout时触发input1的表单验证。

具体代码如下:
首先,上index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<form id="dataForm">
<ul>
<li>
<p class="word">身份证:</p>
<p>
<input type="text" class="int-text valid" id="p_legalCertNum" name="plegalCertNum" value="" aria-invalid="false" />
<input type="text" style="height: 0.5px;width: 0;padding: 0;margin: 0;" id="legalCertNum" name="legalCertNum" value="511102199010162531" />
</p>
<label id="legalCertNumError" style="display: none;">
<span class="ash" id="legalCertNumText"></span>
</label>
</li>
</ul>
</form>

Javascript代码如下:

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
<script src="js/jquery.min.js"></script>
<script src="js/jquery.validate.min.js"></script>
<script>
$(function(){
var formValidator=$("#dataForm").validate({
rules: {
legalCertNum:{
required:false,
regexp: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
digits:false
}
},
messages: {
legalCertNum:{
regexp: '身份证号格式错误'
}
}
});
var $realInput = $('#legalCertNum'), $showInput = $('#p_legalCertNum'), _that = this;
// init value on page load
$showInput.val(this._maskIdCard($realInput.val()));
// register events
$showInput.bind('keyup', function(){
$realInput.val($showInput.val());
});
$showInput.bind('focusin', function(){
$(this).val($('#legalCertNum').val());
});
$showInput.bind('focusout', function(){
formValidator.element($realInput[0]);
$(this).val(_that._maskIdCard($realInput.val()));
});
})
</script>

node多版本管理工具 nvm

  • nvm list
  • nvm current
  • nvm install stable
  • nvm install 9.2.0
  • nvm use 9.2.0

包管理工具 npm

  • npm list -g –depth 0
  • npm install webpack -g
  • npm install # 安装依赖
  • npm run init # 项目初始化
  • npm run dev # 运行测试环境
  • npm run build # 生产环境打包

今天安装一个来自github的脚本,需要从raw.githubusercontent.com下载安装,但是一直提示拒绝连接。
一般这种情况就是域名查询过程中被墙了。
解决思路很简单,找到这个域名的香港ip,直接在host文件中配置一下,绕过域名查询就可以了。

香港ip可以从这里获取: https://site.ip138.com/raw.githubusercontent.com/

使用git很久了,以前都是直接用git-flow来管理git工作流,对标签tag的管理都由git-flow脚本封装好,自动完成了。这次因为项目特殊,需要每日手动打标签tag,特地记录一下。

git标签分类

git的标签分两种:轻量标签(lightweight) 和 附注标签(annotated)。轻量标签义如其名,仅仅是对某个commit的一个引用。附注标签则是存储于git数据库中的一个完整对象,包含了打标签者的名字、email、日期时间、以及标签信息,并且可以GPG签名验证。
一般我们建议创建附注标签。

列举标签
1
git tag
查看标签
1
git show v20201002-1
创建标签

创建附注标签:

1
git tag -a v20201002-1 -m "new feature: dropbox support"

创建轻量标签:

1
git tag v20201002-1w
删除标签

从本地仓库删除:

1
git tag -d v20201002-1

从远程仓库删除:

1
git push origin --delete v20201002-1

提示:Tomcat依赖Java运行环境,没装java的先安装java

  1. Tomcat官网下载所需版本。因为是Mac系统,我们选择*.tar.gz后缀或.zip*后缀的。

  2. 下载完成后Finder进入下载文件夹(默认为~/Downloads),双击所下载的tar.gz压缩文件,Mac会自动解压并创建同名目录,比如,我的是apache-tomcat-8.5.58

  3. 解压缩之后,其实就算安装完毕了。可直接运行bin/startup.sh启动tomcat。我比较追求完美,把tomcat移动到了专门安装软件的/usr/local目录下,具体操作见后续步骤。

  4. 移动tomcat至/usr/local目录

    1
    sudo mv ~/Downloads/apache-tomcat-8.5.58 /usr/local/
  5. 创建软连接

    1
    sudo ln -s /usr/local/apache-tomcat-8.5.58 /Library/Tomcat
  6. 测试启动、关闭脚本
    终端直接输入启动脚本并执行,如下:

    1
    /Library/Tomcat/bin/startup.sh

    关闭脚本跟启动脚本在同一个目录下,名字为shutdown.sh

  7. 验证安装。
    打开 http://localhost:8080/,看到Tomcat页面则说明安装成功。

0%