0%

赋予普通用户 sudo 权限有两种方法:

  1. 通过修改 /etc/sudoers 文件,添加一行即可 “user ALL=(ALL:ALL) ALL”
  2. 将用户添加到 sudo 组中,可以在 /etc/group 中看到 sudo:x:27:usera,userb
1
2
$ sudo usermod -a -G sudo user
$ sudo chsh -s /bin/bash user

详细内容可以查看知乎的这篇文章:linux 忘记 root 密码怎么办?,文章中有较为详细的介绍,这里不罗嗦。

一句话解决问题,如果你有 sudo 权限,那么下面两种均可:

  1. 直接 sudo passwd root 重置密码即可。
  2. 编辑 /etc/shadow 文件,将 root 的加密密码替换成这串密文 $6$LyVpT/aetS$mTDFTG9SzM7iVdP7Kqz6q2lsvgqjA45qXDAEcIUV/eEAaOGreCbd1XMet8itx7z1XM1ZFCb3UUd3toBozQiuZ.,这样的结果是将 root 的密码重置为 apple,然后你就可以登录自行修改了。

这里简单做一个个人向的 Linux 使用配置吧,无论是 Ubuntu 还是 CentOS,都可以使用这个配置来提升使用体验,以及工作效率。

*Photo by Arian Darvishi on Unsplash

Read more »

*Photo by Sai Kiran Anagani on Unsplash

当新建用户时,在自己的 home 目录应该有如下几个文件:.bash_profile .bashrc .bash_logout,有可能有两个,也有可能都没有,这个时候需要自己新建,在 .bash_profile 文件中可以写入以下内容,这样在每次登录都会执行 .bashrc 了,不然你写了一堆 alias 可能登录一看根本没用。

1
2
3
4
5
6
7
# .bash_profile
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi

可以将下面的 alias 写入 .bashrc 也可以写入 .bash_aliases,因为如果 .bashrc 是自动生成的话,它会执行 .bash_aliases,当然嫌麻烦直接堆在 .bashrc 算了

可能会有换行的问题,用 vim 打开,输入 set ff=unix 命令就行了

Read more »

第一次向开源项目提交 pr,还不太熟,于是搜了一下,找到:GitHub 如何向开源项目提交 pr

  • fork 到自己的仓库
  • git clone 到本地
  • 上游建立连接
    • git remote add upstream 开源项目地址
  • 创建开发分支(非必须)
    • git checkout -b dev
  • 修改提交代码
    • git status git
    • add . git commit -m ...
    • git push origin branch
  • 同步代码三部曲
    • git fetch upstream
    • git rebase upstream/master
    • git push origin master
  • 提交pr
    去自己 github 仓库对应 fork 的项目下 new pull request

另外由于每个开源项目都有自己的要求,比如 TheAlgorithms/Python 提交 pr 都会进行各种格式检查,所以先本地 check 一下就可以避免出现格式语法错而得重新 commit 的浪费时间问题,下面是一个维护者提出的步骤:

1
2
3
4
5
black <filename>
isort <filename>
flake8 --ignore=E203,W503 --max-complexity=25 --max-line-length=88 --statistics --count <filename>
mypy --ignore-missing-imports <filename>
pytest --doctest-modules <filename>

算是一个挺常见的错误(对于我来说),印象中是第二次犯这个错了。

看下面这个函数,你觉得有没有什么问题?

1
2
3
4
5
6
7
double count_avg(vector<int>nums) {
int ans = 0;
for (auto num : nums) {
ans += num;
}
return ans / nums.size();
}

看上去没毛病,这个函数就是求平均值嘛,先求和然后除以个数,得到的结果不就是平均值嘛,来几个测试用例看看:

1
2
3
4
5
6
cout << count_avg({2, 2}) << endl;
// 2
cout << count_avg({1, 3}) << endl;
// 2
cout << count_avg({2, 3}) << endl;
// 2!

最后一个例子出现问题了,聪明的你发现了问题所在吗?

因为 ans 是 int 类型,而 size() 返回是一个 vector::size_type 类型,就把它当作 int 类型(一般都用 int size 去接嘛),所以最后结果就是个 int 的类型,对于除不断的就直接取整了,所以需要操作一波,把 ans 或者 size 转换成 double 类型。