0%

2019年12月26日 下午1:39

linux sudo 命令和配置文件/etc/sudoers介绍 | chenall’s Blog

格式:

<user list> <host list> = <operator list> <tag list> <command list>

  • user list 用户/组,或者已经设置的用户的别名列表, 用户名直接 username,用户组加上%,比如%admin,
  • host list 主机名或别名列表
  • operator list runas用户,即可以以哪个用户、组的权限来执行
  • command list 可以执行的命令或列表
  • tag list 这个经常用到的是 NOPASSWD: ,添加这个参数之后可以不用输入密码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## root 用户可以在任意主机上以任意用户、组的权限执行任意命令,说明root用户具有最高级的权限。
root ALL=(ALL:ALL) ALL

## admin组的用户都拥有最高级权限。
%admin ALL=(ALL) ALL

## sudo 组用户和root用户权限一样
%sudo ALL=(ALL:ALL) ALL

## test 用户可以不用输入密码运行 **/sbin/reboot** 命令
## tag list 如果是 NOPASSWD: 则运行时不需要输入密码例子:
test ALL=(ALL) NOPASSWD: /sbin/reboot

## operator list 和 tag list 都是可选的,比如下面的:
test ALL=/sbin/reboot

## 查看当前用户的sudo权限
sudo -l

2019年12月25日 上午11:00

  1. 在conda中pip install安装包,默认安装在命令行当前隔离环境中
  2. 可以使用pip show 包名来验证这个说法

    从上面的安装路径来看
  • pip要安装成opencv-python=3.4.3.18需要的前提条件是python3.5,因为在pip会根据python的版本来限定可以使用的包的版本!
    • 这也是最常遇到的问题
  • 安装路径安装在anaconda的tensor环境中,并不是系统环境中,这一点让conda和pip的混用非常方便!

2019年12月24日 下午11:48

真正的I/O操作之原理:缓冲区(buffer)与缓存(cache)
真正的I/O操作之应用:在程序中,内存中开辟的一片缓冲区域
附录:

  1. 在学习的过程中,让我想起另一个问题:既然我们再敲键盘的时候,很多时候并没有真正的发生io过程, 那么显示器上是如何显示我们实时敲击的字符的
  2. 对于这个问题,我没有找到好的材料,但是间接找到了《ORANGE’S:一个操作系统的实现》 《ORANGE’S:一个操作系统的实现》

2019年12月24日 下午10:51

c语言版本:

内存缓冲区解析 - lovejobs - 博客园
缓冲区顾名思义即为:内存中开辟的一片缓冲区域

  1. 按类型分为:全缓冲,行缓冲,不带缓冲
  2. 可以通过标准库函数setvbuf(_Inout_ FILE * _File, _Inout_updates_opt_z_(_Size) char * _Buf, _In_ int _Mode, _In_ size_t _Size);来设置缓冲区的类型

c++版本

C++ buffer缓冲区的秘密 - 学会走路 - 博客园

  1. 下列情况会引发缓冲区的刷新:

    • 缓冲区满时
    • 执行flush语句
      • cout<<flush; //将显存的内容立即输出到显示器上进行显示
    • 执行endl语句
      • endl控制符的作用是将光标移动到输出设备中下一行开头处,并且清空缓冲区。
    • 关闭文件
    • 注:可见,缓冲区满或关闭文件时都会刷新缓冲区,::进行真正的I/O操作::
  2. 文件操作演示全缓冲

    • 编写这段小代码的目的是验证Windows7下全缓冲的大小是4096个字节,并验证::缓冲区满后会刷新缓冲区,执行真正的I/O操作::。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      #include <fstream>  
      using namespace std;
      int main()
      {
      //创建文件test.txt并打开
      ofstream outfile("test.txt");
      //向test.txt文件中写入4096个字符’a’
      for(int n=0;n<4096;n++)
      {
      outfile<<'a';
      }
      outfile<<'b';
      //暂停,按任意键继续
      system("PAUSE");
      //继续向test.txt文件中写入字符’b’,也就是说,第4097个字符是’b’
      outfile<<'c';
      //暂停,按任意键继续
      system("PAUSE");
      outfile('d');
      return 0;
      }
  3. 键盘操作演示行缓冲

    • 当程序调用getchar()函数时,程序就等着用户按键, 用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中) 。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。
    • 不知道您明白了没有,再通俗一点讲,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符,直到缓冲区中的字符读完后,才等待用户按键。
    • ::核心:在执行真正的io操作以前,是有一个隐藏的缓冲区的::

2019年12月24日 下午10:46
缓冲区(buffer)与缓存(cache) - 哦摩西罗伊 - 博客园

  1. Buffer的核心作用是用来缓冲,缓和冲击。
    • 比如你每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用个buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了,日子过得爽了。极大缓和了冲击。
  2. Cache的核心作用是加快取用的速度。
    • 比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。
  3. ::简单来说就是buffer偏重于写,而cache偏重于读。::

Ps:有时候大家要好好理解这些专有名词字面上的意思,对理解这些概念有好处,::缓冲:缓解冲击,缓存:临时存储::

2019年12月23日 下午11:22

新的点:

基础知识的总结、对比:

原理:

随机采样方法整理与讲解(Acceptance-Rejection、MCMC、Gibbs Sampling等)

2019年12月23日 下午11:17

  1. 要学好c语言,需要你对操作系统和计算机组成有比较深刻的理解,尤其是内存相关的内容。

基础知识:

二维数组与高级指针 - clover_toeic - 博客园
C数组&结构体&联合体快速初始化 - clover_toeic - 博客园
C语言预处理命令详解 - clover_toeic - 博客园

核心知识:

C语言字节对齐问题详解 - clover_toeic - 博客园
Linux虚拟地址空间布局 - clover_toeic - 博客园
缓冲区溢出详解 - clover_toeic - 博客园
C语言变量的存储布局 - clover_toeic - 博客园
C语言头文件组织与包含原则 - clover_toeic - 博客园
C语言预处理命令详解 - clover_toeic - 博客园
已释放的栈内存 - clover_toeic - 博客园
C语言函数调用栈(一) - clover_toeic - 博客园
C语言函数调用栈(二) - clover_toeic - 博客园
C语言函数调用栈(三) - clover_toeic - 博客园

#b计算机基础/e_语言/python/语法
2019年12月23日 下午8:58

python修改linux日志(logtamper.py) - 轻轻的烟雾 - 博客园
使用方法,总结在另一篇文章中: logtamper使用

在logtemper的源码中,我们会看到:

1
2
3
4
5
LAST_STRUCT = ‘I32s256s'
LAST_STRUCT_SIZE = struct.calcsize(LAST_STRUCT)

XTMP_STRUCT = ‘hi32s4s32s256shhiii4i20x’
XTMP_STRUCT_SIZE = struct.calcsize(XTMP_STRUCT)
  1. 我这里就来解释struct是什么?
    1. python中struct 模块用于python数据结构与C结构之间的相互转换
    2. 那么我们就需要学习一下c语言中的struct
      1. C语言字节对齐问题详解 - clover_toeic - 博客园这篇文章讲解的十分全面
  2. 以及‘I32s256s’ ‘hi32s4s32s256shhiii4i20x’定义的是什么?
    1. 他们是:自定义的格式化字节的规则
    2. 这里有一个对应表:struct 模块详解
    3. I32s256s:对应的结构体是:
      • I => (unsigned int) =>4 =>timestamp
      • 32s => char[] => 32*1 => ttyname
      • 256s => char[] => 256*1 => hostname
    4. hi32s4s32s256shhiii4i20x对应的结构体:
      1. h => short => 2
      2. i => int => 4
      3. 32s => char[] => 32*1
      4. 4s => char[] => 4*1
      5. 32s => char[] => 32*1 => username
      6. 256s => char[] => 256*1 => hostname
      7. h => short => 2
      8. h => short => 2
      9. i => int => 4 =
      10. i => int => 4 =
      11. i => int => 4 =
      12. 4i => int => 4 * 4 =
      13. 20x => pad byte => 0 => no value
      14. 注:代码只使用了5,6对应的username和hostname

#b计算机基础/e_语言/python/语法
2019年12月23日 下午8:58

python修改linux日志(logtamper.py) - 轻轻的烟雾 - 博客园
使用方法,总结在另一篇文章中: logtamper使用

在logtemper的源码中,我们会看到:

1
2
3
4
5
LAST_STRUCT = ‘I32s256s'
LAST_STRUCT_SIZE = struct.calcsize(LAST_STRUCT)

XTMP_STRUCT = ‘hi32s4s32s256shhiii4i20x’
XTMP_STRUCT_SIZE = struct.calcsize(XTMP_STRUCT)
  1. 我这里就来解释struct是什么?
    1. python中struct 模块用于python数据结构与C结构之间的相互转换
    2. 那么我们就需要学习一下c语言中的struct
      1. C语言字节对齐问题详解 - clover_toeic - 博客园这篇文章讲解的十分全面
  2. 以及‘I32s256s’ ‘hi32s4s32s256shhiii4i20x’定义的是什么?
    1. 他们是:自定义的格式化字节的规则
    2. 这里有一个对应表:struct 模块详解
    3. I32s256s:对应的结构体是:
      • I => (unsigned int) =>4 =>timestamp
      • 32s => char[] => 32*1 => ttyname
      • 256s => char[] => 256*1 => hostname
    4. hi32s4s32s256shhiii4i20x对应的结构体:
      1. h => short => 2
      2. i => int => 4
      3. 32s => char[] => 32*1
      4. 4s => char[] => 4*1
      5. 32s => char[] => 32*1 => username
      6. 256s => char[] => 256*1 => hostname
      7. h => short => 2
      8. h => short => 2
      9. i => int => 4 =
      10. i => int => 4 =
      11. i => int => 4 =
      12. 4i => int => 4 * 4 =
      13. 20x => pad byte => 0 => no value
      14. 注:代码只使用了5,6对应的username和hostname