linux 基础(2) 文件权限及其修改

文件的权限属性

在 linux 中,每个文件都有唯一的“所属者”(user)和“所属群组”(group)。owner 和 group 都对文件有特殊的权限

输入ls -l,就可以详细查看每个文件的权限属性。

image

我们可以看到,用户名和群组名可以是相同的。一个群组可以只包含一个用户,也可以包含多个用户。

rwx 权限

ls -l的第一行一定是一个长度为10的字符串:drwxr-xr-x

  • 其中第1位表明文件的类型,常见如-表示一般文件,d表示目录,l表示链接;

  • 第 2-4 位表示所属者的权限,形如rwx,r 代表可读,w 代表可写,x 代表可执行。
    可读代表可以打开文件查看内容,可写代表可以修改文件内容,可执行则代表这个文件可不可以装载到内存中执行。在 linux 中,文件能否装载执行不取决于后缀名,而取决于有无 x 权限,即使让给一个文本文件加上 x 权限后,你也能用命令执行它(虽然执行结果肯定是失败)。

  • 第 5-7 为表示所属群组的权限,也就是这个文件所属群组里的人(除了 user)对他的权限。r-x表示可读可执行,但不可写。

  • 第 8-10 为其他人(others)的权限,也就是除了 user 和 group 中用户以外的其他人。

而这些权限都不受 root 限制,root 就是万能的神,可以随意操作任何文件。

更改文件的权限属性

更改文件权限的命令有chgrp, chown 和 chmod。这三个命令往往需要 root 来执行。

chgrp

chgrp 即“change group”,可以修改文件的群组:

chgrp root a.cpp # 修改a.cpp的群组为 root
chgrp -R mygroup myfolder # 修改myfolder和其中所有文件的群组

chown

chown 改变文件的所属者。同时 chown 也可以改变文件的群组,兼任的 chgrp 的功能。

chown root a.cpp # 修改a.cpp的群组为 root
chown myuser:mygroup a.cpp # 修改a.cpp所属者为myuser,群组为mygroup
chown :mygroup a.cpp # 只修改a.cpp群组为mygroup

chmod

chmod 修改文件的权限(即那个长度10的字符串),有两种使用方式。

常用的用法是将每一个rwx的r记为4、w记为2,x记为1,这样rwx就是一个0-7之间的数字,用三个数字就组成了文件的权限。比如 5 代表 r-x,7 代表 rwx,而 0 代表 ---。

chmod 777 a.cpp # a.cpp对 owner group others的权限都是rwx
chmod 755 a.cpp # a.cpp对 owner 的权限是rwx,对 group 和 others 的权限是r-x

除此之外,也可以直接用 rwx 字符串来修改权限,u 代表 user,g 代表 group,o 代表 others,a 则代表全部。加号,减号与等号都可以赋值。

chmod u=rwx,go=rx a.cpp # u修改为rwx g和o修改为r-x
chmod a+x a.cpp # 所有权限全部加上x,r和w权限不变
chmod a-w a.cpp # 所有权限全部去掉w

目录的 rwx 权限

之前提到的 rwx 权限都是针对文件了,那对于目录来说,rwx的意义会有哪些不同呢?在 linux 里,我们不要只目录理解成“文件夹”,而把目录也当成一种特殊的文件,这个文件的内容就是目录下的文件信息,这样就好理解了。

对于目录来说,r 代表你能否读取目录下的文件列表(即是否可以用 ls 列出里面的文件);w 代表是否可以更改目录下的文件列表(也就是在目录下新建,删除,移动和更名),x 则代表能否进入这个目录。

目录的权限非常重要!如果我的主目录下有一个 root 所属的文件夹:

drwxr--r-- 2 root root 4096  1月 16 12:45 root/

“我”对于这个目录是 others,因此只有 r 权限。但我不能cd root,也不能打开 root 下的文件,因为没有 x 权限。所以无权操作目录,只有 r 没有 x的目录就像一个不能运行的二进制文件。r 权限没有起到实质作用。

另一方面,假设如果我的主目录下有一个 root 所属的文件:

drwx------ 2 root root 4096  1月 16 12:45 rootfile

“我”对于这个目录是 others,因此只有没有权限。但我对~目录有完整的rwx权限,所以虽然我不能打开,也不能修改文件,我却可以直接删掉他!文件能否打开修改取决于自己的权限,但能否被移动删除等则取决于目录的权限。

rws 和 rwt 特殊权限

我们查看/tmp/usr/bin/passwd的权限,就会发现原来还有rwsrwt权限

drwxrwxrwt 3 root root 4096  1月 16 15:42 /tmp
-rwsr-xr-x 1 root root 59976  3月 14  2022 /usr/bin/passwd

SUID 权限

位于所有者权限的 x 替换为 s 就叫做SUID权限,这个权限具有以下的性质:执行程序的人需要有 x 权限才能执行(那是废话),但在执行途中将获得 owner 的权限。

这个权限有什么意义呢?就以/usr/bin/passwd作为例子,他是用来修改密码的,而密码信息保存在/etc/shadow里面,而 shadow 储存着用户信息这样机密的内容,他的权限是"-rw-r-----",也就是说我连打开都不行。可用户修改密码也并不需要 root 权限。这就是因为 passwd 命令是 rws,当我执行他时,我就暂时获得了 root 的权限,可以修改密码。

另一个例子就是 sudo 命令,用 ls 查看 sudo ,它的权限是"rwsr-xr-x",任何用户都可以执行他,在执行他的期间就暂时获得了 root 权限。sudo 这个命令本身就是理解 SUID 的最佳方式

SGID 权限

位于所属群组权限的 x 替换为 s 就叫做 SGID 权限,与 SUID 相似,执行程序的人可以获得群组的支持。

SGID 也可以用于目录,当进入一个 SGID 的目录,在该目录下新建的所有文件都会以目录的群组作为群组。

SBIT 权限

SBIT 权限则仅用于目录。others 权限为rwt表示 SBIT 权限,在 SBIT 的权限的文件夹里,所有人都可以创建文件,但创建的文件只有自己才能删除,其他用户无法删除。/tmp就是 SBIT 应用的典型,所有人都可以创建文件,但只能删除自己的文件,而不能删除其他用户创建的。

这三个权限怎么设置呢?记 SUID, SGID, SBIT 分别为 421,又可以得到一个 0-7 的数字,把这个数字加在原来的3位数字前,变成4位就可以了。或者通过字符串设置也可以。

chmod 4755 a.out # rwxr-xr-x
chmod u+s a.out # SBIT

umask 默认属性

当我们新创建一个文件,他的 user 和 group 默认都是你自己,那默认的 rwx 权限是什么呢?这就取决于用户的 umask。

输入umask,可以得到一个4位字符串:

$ umask
0022
$ touch f1
$ mkdir f2
$ ls-d f1 f2
-rw-r--r-- 1 ofnoname ofnoname    0  1月 16 17:14 f1
drwxr-xr-x 2 ofnoname ofnoname 4096  1月 16 17:14 f2

0022 表示的的是“被拿掉的权限”,022自然表示“user 不拿权限,而 group 和 other 默认被去掉 w 权限”。目录文件默认是777,因此结果是 rwxr-xr-x,而普通文件默认是666(没有 x),因此结果是rwxr-xr-x。

*文件目录的隐藏权限

(摘自《鸟哥的linux私房菜 基础篇》)

rwx 权限是所有 linux 都拥有的基础权限。除此之外,rwx在很多时候还不够满足需求,特定的文件系统还支持很多其他有用的属性。

chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设置一定,且仅有后面接的参数
A :当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改,
可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S :一般文件是非同步写入磁盘的(原理请参考[前一章sync](../Text/index.html#sync)的说明),如果加上 S 这个属性时,
当你进行任何文件的修改,该更动会“同步”写入磁盘中。
a :当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性
c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,
但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
d :当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份
i :这个 i 可就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!”
对于系统安全性有相当大的助益!只有 root 能设置此属性
s :当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,
所以如果误删了,完全无法救回来了喔!
u :与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,
可以使用来救援该文件喔!

注意这些属性并非在任何系统上都有支持。lsattr可以列出这些隐藏属性。

本文转载于网络 如有侵权请联系删除

相关文章

  • SecureCRT mac激活版(终端SSH工具)9.2.3

    SecurecrtMac是Macos系统上一款强大易用且专业的终端SSH工具,支持SSH(SSH1和SSH2)以及Telnet和rlogin协议。SecureCRT用于连接运行包括Windows、UNIX和VMS在内的远程系统的理想工具。SecurecrtMac功能特色标签组现在在所有平台上的标签组允许您在同一个SecureCRT窗口中比较两个会话和组相关会话的输出,以便您可以在更短的时间内获得更多的功能。您可以通过标签组织会话并轻松切换。或者您可以在一个选项卡中工作,同时监视另一个选项卡中的命令的输出,然后在命令完成后返回单个选项卡组。仿真从广泛的终端仿真中选择,包括TN3270,VT100,VT102,VT220,ANSI,SCOANSI,Wyse50/60,Xterm和Linux控制台-全部采用配色方案,大部分采用ANSI颜色支持。XS后台管理系统-Mac软件管理六角形视图以十六进制视图显示会话输出,有助于调试串行通信。命令窗口“命令”窗口可以让您在发送到远程系统之前撰写文本。使用命令历史记录,您可以查看,编辑和发送先前的命令。“立即发送字符”模式允许您在“命令”窗口中键入控制字

  • 大数据开源项目,一站式全自动化全生命周期运维管家 ChengYing(承影)要走向何方?

    原文链接:三分钟走进袋鼠云一站式全自动化全生命周期运维管家ChengYing(承影)视频回放:点击这里ChengYing开源项目地址:github丨gitee2022年5月30日,袋鼠云对外开源了一站式全自动化运维管家ChengYing(承影),为了帮助社区同学更好的使用ChengYing,自开源之后我们就紧锣密鼓的筹备直播相关事宜,从6月开始,我们将每月为大家组织一次直播,和大家分享ChengYing的相关内容,欢迎大家持续关注。一、ChengYing简介ChengYing(承影)——承袭于袋鼠云开源项目名剑家族的概念,取自十大名剑之承影剑。ChengYing(承影)作为一站式全自动化全生命周期运维管家,提供大数据产品的一站式部署、运维、监控服务,其可实现产品部署、产品升级、版本回滚、扩缩节点、日志诊断、集群监控、实时告警等功能,致力于最大化节省运维成本,降低线上故障率与运维难度,为客户提供安全稳定的产品部署与监控。ChengYing脱胎于袋鼠云数栈自主研发的一站式运维管家EasyManager,从开放式统一监控、到定义标准化部署能力,而后引入Prometheus/Grafana/自

  • 【黄啊码】深入浅出Scrapy爬虫项目

    scrapy框架结构项目结构Scrapy原理图各个组件的介绍数据的流动scrapy框架结构思考scrapy为什么是框架而不是库?scrapy是如何工作的?项目结构在开始爬取之前,必须创建一个新的Scrapy项目。进入您打算存储代码的目录中,运行下列命令:注意:创建项目时,会在当前目录下新建爬虫项目的目录。这些文件分别是:scrapy.cfg:项目的配置文件quotes/:该项目的python模块。之后您将在此加入代码quotes/items.py:项目中的item文件quotes/middlewares.py:爬虫中间件、下载中间件(处理请求体与响应体)quotes/pipelines.py:项目中的pipelines文件quotes/settings.py:项目的设置文件quotes/spiders/:放置spider代码的目录Scrapy原理图各个组件的介绍1.Engine。引擎,处理整个系统的数据流处理、触发事务,是整个框架的核心。2.ltem。项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该ltem对象。3.Scheduler。调度器,接受引擎发过来的请求并将其加入队列

  • CentOS 7 配置Python3环境教程

    前言本文将介绍CentOS7下配置Python3环境教程配置流程检查Python版本python复制CentOS7自带Python2.7安装依赖包yum-ygroupinstall"Developmenttools"复制yum-yinstallzlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgdbm-develdb4-devellibpcap-develxz-devel复制下载Python3wgethttps://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz复制安装Python3mkdir/usr/local/python3 tar-xvJfPython-3.7.2.tar.xz cdPython-3.7.2 ./configure--prefix=/usr/local/python3 make&&makeinstall复制创建软链接ln-s/usr/local/python3/b

  • 从linux5.9看网络层的设计

    前言:很久没有看内核的代码了,假期开始看一下,之前看了一下0.11和1.2.13的代码,虽然大致了解了一些原理,但是毕竟比较旧了,再者很多功能还没有实现,比如epoll,所以这次选取的是5.9的版本,再也不怕过时了,当然,现在内核的代码量级非常大,不可能看得完也不可能都看,只是选取自己感兴趣的一些点看一下。看内核代码,总的来说是非常有趣的,不仅是因为知其然知其所以然,而且看到朴素的c语言,还有世界级大佬写代码的思路、思想,甚至注释,都是非常有意思的事情。今天分析的内容是从socket函数开始,看看linux网络层的设计。下面我们看一下我们平时写网络编程代码时的用法。#include<sys/socket.h>intfd=socket(...);bind(fd,...);lisnten(fd);复制我们看到网络编程中的一系列函数都是来自sys/socket.h这个头文件。这个是glibc提供的,glibc通过系统调用的方式使用操作系统提供的API。网络层API的调用在网络层设计中,内核并没有给每一个网络函数都提供一个系统调用,而是提供了一个统一的入口socketcall,也就

  • Redis删除数据后,为什么内存占用率还是很高?

    在使用Redis时,我们经常会遇到这样一个问题:明明做了数据删除,数据量已经不大了,为什么使用top命令查看时,还会发现Redis占用了很多内存呢?实际上,这是因为,当数据删除后,Redis释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录着给Redis分配了大量内存。但是,这往往会伴随一个潜在的风险点:Redis释放的内存空间可能并不是连续的,那么,这些不连续的内存空间很有可能处于一种闲置的状态。这就会导致一个问题:虽然有空闲空间,Redis却无法用来保存数据,不仅会减少Redis能够实际保存的数据量,还会降低Redis运行机器的成本回报率。Redis内存碎片是如何形成的?Redis内存碎片的形成可以由两方面引起内因是操作系统的内存分配机制外因是Redis的负载特征内因:内存分配器的分配策略内存分配器的分配策略就决定了操作系统无法做到“按需分配”。这是因为,内存分配器一般是按固定大小来分配内存,而不是完全按照应用程序申请的内存空间大小给程序分配。Redis可以使用libc、jemalloc、tcmalloc多种内存分配器来分配内存,默认使用jemal

  • Linux下RPM打包制作过程

    开始前的准备安装rpmbuild软件包yum-yinstallrpm-build生成相关目录要生成rpm相关目录,可以手动创建,也可以通过rpmbuild命令创建。如:[root@yangdata]#rpmbuildzabbix_agentd_ops.spec error:File/root/rpmbuild/SOURCES/zabbix-3.0.3.tar.gz:Nosuchfileordirectory 有报错,无需理会,可以看到rpmbuild目录已经创建完成 [root@yang~]#treerpmbuild/ rpmbuild/ ├──BUILD ├──BUILDROOT ├──RPMS ├──SOURCES ├──SPECS └──SRPMS复制编写SPEC文件SPEC关键字Name:软件包的名称,后面可使用%{name}的方式引用Summary:软件包的内容概要Version:软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用Release:发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用Group:软件分组

  • 自然语言处理中的预训练模型(下)

    4PTM拓展4.1引入知识的PTMPTM通常是基于大规模文本语料训练通用的语言表示,而缺乏领域特定的知识。通过外部知识库引入领域知识被证明可以提升模型结果。这些外部知识包括:语言知识、语义知识、常识知识、事实知识和其他领域特定的知识等。一方面,外部知识可以在预训练阶段进行引入。早期的一些研究专注于联合学习知识图谱嵌入和词嵌入,而从BERT开始,研究者们提出了一些专为引入外部知识而设计的预训练任务,例如:「LIBERT」通过一个附加的语言约束任务引入了「语言知识」;「SentiLR」通过对每个单词添加情感极性,将MLM拓展为Label-AwareMLM,在多种情感分类任务上达到SOTA(「语言知识」);「SenseBERT」在预训练时不仅预测被遮罩的词语,还预测其在WordNet中的supersenses(对词语的一种分类,属于「语义知识」);「ERINE」将在知识图谱中预训练的图谱嵌入结合到对应的实体上,来增强文本表示(「事实知识」);类似地,「KnowBERT」将BERT与一个实体连接模型联合训练,以端到端的方式集成实体表示(「事实知识」);「KEPLER」则联合优化知识嵌入和语言模

  • 再读Golang中的异常处理 顶

    一起重温Golang中的异常处理啊? 1.Golang语言中没有其他语言中的try...catch...语句来捕获异常和异常恢复2.在Golang中我们通常会使用panic关键字来抛出异常,在defer中使用recover来捕获异常进行具体逻辑处理3.Golang中我们通常会在函数或方法中返回error结构对象来判断是否有异常出现注意事项1.利用recover和panic指令,defer必须放在panic之前定义(panic会终止其后要执行的代码).2.recover只有在defer调用的函数中才有效,否则recover无法捕获到panic.3.recover处理异常后,业务逻辑会跑到defer之后的处理片段中4.多个defer会形成defer栈5.panic会等到整个goroutine退出才会报告错误常规使用panic以及recover参数类型为空接口(可存储任何类型对象)interface{}/* funcpanic(vinterface{}) funcrecover()interface{} 执行顺序:panic()->带recover的defer 输出结果: ohmygo

  • CCIE知识点总结——组播

    版权声明:本文为博主原创文章,转载请注明出处。https://blog.csdn.net/gongxifacai_believe/article/details/803169581、组播概述(1)组播解决了网络中用户数量不确定的问题,一份信息,多个接收者,相同的组播数据流在每一条链路上最多仅有一份。示意图如下。 (2)组播的优势与劣势 优势:减轻服务器和CPU负荷,减少了链路带宽资源的占用,减轻了网络设备的负载。 劣势:组播是基于UDP的。尽力投递:报文丢失是不可避免的。因此组播应用程序不能依赖组播网络进行可靠性保证,必须针对组播网络的这个特点进行特别设计。“可靠组播”目前仍然处于研究阶段。没有拥塞避免机制:缺少TCP窗口机制和慢启动机制,组播可能会出现拥塞。如果可能的话,组播应用程序应该尝试检测并避免拥塞。报文重复:某些组播协议的特殊机制(如Assert机制和SPT切换机制)可能会造成偶尔的数据包的重复。组播应用程序应该容忍这种现象。报文失序:同样组播协议有的时候会造成报文到达的次序错乱,组播应用程序必须自己采用某种手段进行纠正(比如缓冲池机制等)。(3)实施组播的三个基本条件 硬

  • 搭建持续集成环境(一)

    开题说明软件开发的过程是一个从简单到复杂的过程。我们在开发的时候,会首先写出具有核心的功能的原型,满足基本的需求。但是这个原型使用非常的麻烦,有无数的配置,数据的格式也需要严格的规定,稍微一个不合法的输入输出就有可能导致程序的崩溃。接下来,在这个基本的原型上,我们逐渐进行完善,逐渐提高了程序的鲁棒性,用户体验逐渐的提高。新的需求出现了,于是又添加新的功能来满足新的需求。在这样一个逐渐搭建(迭代)起来的过程中,我们要进行不间断的测试来保证修改没有破坏代码的已有功能,也要防止引入新的bug.如果是团队开发,要保持代码风格的一致。如果多个人同时开发,又要防止代码修改的地方出现冲突。一个版本的代码开发完成了,测试也没有问题了,同时部署到几百台服务器上,完成新功能的上线。这样一个流程,如果手动来完成是相当痛苦的。于是,就需要持续集成来帮助我们完成这些琐碎的工作。开发者开发好了程序,本地测试没有问题了。使用Git提交到代码仓库,然后触发一系列的检查流程,如果出问题就给提交者发邮件提示问题,如果一切正常就开始代码审核(codereview),审核完成,合并代码。合并完成以后,会自动做好部署前面的集成

  • Scope AR将为Holoens提供远程视频会话技术支持

    12月13日,ScopeAR为微软的Holoens头显推出了一套AR视频解决方案RemoteAR。这家旧金山的公司带来的企业级AR解决方案,能够实现跨平台在线视频通话。用于微软HoloLens的远程AR将为现场技术人员带来技术支持,使他们能够以更快的速度和更准确的方式执行任务。RemoteAR允许专家与技术人员进行视频通话,然后专家在屏幕上对技术人员需要操作的地方进行标记,例如转动螺丝刀。技术人员也可以通过AR视频场景找到专家标记的位置。RemoteAR已经被用于洛克希德·马丁、西门子和伊顿等企业的实时远程协作。正式发布后,RemoteAR现在已经开始为微软HoloLens提供带有3D注释的远程支持。借助空间跟踪,现场技术人员可以使用微软HoloLens以简单明了的通信方式与远程的专家沟通,并且快速高效的接受协助和执行任务,因为他们不再需要一边握住移动设备,一边试图谈话。“RemoteAR是从零开始设计的,它允许用户随意选择他们的设备,无论是智能手机、平板电脑,还是现在的微软HoloLens,都可以满足企业随时随地让专家对工人进行指导的需求。”ScopeAR首席执行官兼创始人Scott

  • (cljs/run-at (JSVM. :all) "一次说白DataType、Record和Protocol")

    前言 在项目中我们一般会为实际问题域定义领域数据模型,譬如开发VDOM时自然而言就会定义个VNode数据类型,用于打包存储、操作相关数据。clj/cljs不单内置了List、Vector、Set和Map等数据结构,还提供deftype和defrecord让我们可以自定义数据结构,以满足实际开发需求。定义数据结构从DataType和Record开始 提及数据结构很自然就想起C语言中的struct,结构中只有字段并没有定义任何方法,而这也是deftype和defrecord最基础的玩法。 示例(deftypeVNode1[tagprops]) (defrecordVNode2[tagprops]) (defvnode1 (VNode1."DIV"{:textContent"Helloworld!"})) ;;或(->VNode1"DIV"{:textContent"Helloworld!"}) (defvnode2 (VNode2."DIV"{:textContent"H

  • Codeforces Round #828 (Div. 3)

    E2.DivisibleNumbers(hardversion) 用pollardrho跑出\(ab\)的质因数分解,然后dfs枚举\(ab\)的所有因子对\(x,y\),如果存在\(k_1,k_2\)使得\(a<k_1x\lec\)且\(b<k_2y\led\),那么\(k_1x\)和\(k_2y\)就是一个可行解。 复杂度的话差不多就是\(O({(ab)}^{0.25}+d(ab))\),\(d(x)\)表示\(x\)的因数个数。根据某张广为流传的图片,也可以看A066150-OEIS,对于\(x\le{10}^{18}\),\(d(x)\)最大差不多在\(10^{5}\)这个级别。 AC代码 //Problem:E2.DivisibleNumbers(hardversion) //Contest:Codeforces-CodeforcesRound#828(Div.3) //URL:https://codeforces.com/contest/1744/problem/E2 //MemoryLimit:256MB //TimeLimit:4000ms // //Po

  • 我给VSCode报了个bug,微软工程师竟然凌晨回复了...

    更多编程干货微信搜「程序员柠檬」,本文已收录于Github:https://github.com/imcoderlemon/CodeClass 内含原创干货文章,千本计算机电子书,谷歌、阿里大神开源LeetCode题解,各类编程资源。 本文首发个人微信公众号,欢迎围观点击阅读原文 最近遇到一个有意思的bug,是关于VSCode编辑器插件的,最近赶项目时间非常紧,说实话在这时平常用的顺手的IDE出问题非常影响心情。这就像是你开在高速路上,吃着火锅唱着歌,突然轮胎爆了,你说气不气人。 不过在找bug和推动修复bug的过程有点意思,通过一系列尝试最终定位和复现了bug,并且给这个项目的微软官方仓库提了issue,最终在最新版本得到了修复,把这个有趣的过程分享给大家。 也给大家演示一下如何通过提issue的方式参与到开源项目中,当然,参与开源项目的方式有多种,你可以给项目贡献源码,甚至作为大使帮助推广项目,找到项目的bug进而提issue也是一种参与方式,总之先参与进来,才能发现开源的乐趣! 诡异的报错 上周,又是一个在公司的夜晚,好像和平常没啥区别,柠檬哥在加班ing,飞快的敲打着自己

  • web播放amr格式音频/微信语音amr播放器/JS播放amr

    首先来认识下AMR: AMR是一种文件格式,存储AMR语音编码文件.很多手机允许用户存储短时间的AMR格式录音。但是AMR也是一种语音格式,并未针对其他声音进行优化。普通文件扩展名是.amr。 因amr为音频文件格式,所以能够打开amr文件的软件有很多,电脑上很多软件都可以直接打开,但在web网页HTML5是不能直接打开的,很多网友说用ffmpeg转成MP3再audio标签来播放,这是可行的,但总感觉转后音质比不上原音高,所以作者还是拼命去找解决方法直接在网页上播放amr格式音频。呵呵——还是被找到了,就是利用JS解码然后再播放,感觉amr-js开发者,参考官网:https://www.npmjs.com/package/amr-js 现在我们开始说说怎么播放amr语音吧。 一、本人的web环境是IIS,IIS默认是不支持amr格式的,所以首先我得先加MIME类型,方法: 1.打开Internet信息服务(IIS) 2.进入IIS管理界面,选择要设置的网站 3.在站点对应的主页下面iis,双击mime类型 4.打开mime类型界面,点击右上角的“添加” 5.输入文件扩展名:.amr,M

  • 了解thinkphp(三)

    三、tp的核心配置是 ThinkPHP/Conf/convertion.php, config.php是我们当前自己项目的配置文件,我们可以通过修改该文件达到配置变量的目录,这个文件在系统运行过程中会覆盖convertion.php的配置变量 convertion.php里面主要内容:应用设定,Cookie设置,默认设定,数据库设置,数据缓存设置,错误设置,日志设置,SESSION设置,模板引擎设置,布局设置,URL设置,系统变量名称设置 四、MVC C:控制器Controller,MVC的核心   如果自己要建一个Login控制器:  在\Shop\Home\Controller文件夹下新建一个控制器文件LoginController.class.php      2.打开该文件,在里面造控制器Login类        3.如果要自定义操作方法,在控制器Login类里面加一个函数Login():      这样我们就完成了控制器和操作方法的建立,如果要访问我们刚才的Login控制器下的Login方法:          4.控制器中如果要

  • 说话技巧三步曲--摘自《所谓高情商 就是会说话》之七个突破口

    从上篇文章 说话技巧三步曲--摘自《所谓高情商就是会说话》  中大家发现了吧,一个最关键的步骤就是第二部,怎么揣摩对方的心理,并且找到突破口。 佐佐木圭一给我们总结了七个突破点 1.突破口一:投其所好 说白了就是:包装商品,自己认为好的东西,不是真的好,对方觉得好才是好,找到对方的喜好点 比如:客户觉得这个衣服是别人挑剩的,你可以说:这个是卖的最好的,只剩最后一件了。 在比如:飞机供餐,大家都选择牛肉,而鱼剩下很多,这个时候不能说,只剩下鱼了,客户会觉得损失了自己的选择。可以把鱼的有点说出来:机内提供以优质香草,富含矿物质的天然岩盐和粗制黑胡椒嫩煎而成的白身鱼,以及普通牛肉。这样大家会主动选择鱼。   2.突破口二:儆其所恶 与1相反,找出用户厌恶点,来达到某个目的。 如果我们在展场里面贴上:“请勿触摸展品”,大家肯定因为好奇心而去触摸。如果我们说:“涂有药品,请勿触摸”,因为药品对身体有害,是人们的厌恶点,所以可以把对方和自己的利益绑定到一起,达到自己的目的。     3.突破口三:选择的自由 给对方推荐东西,要给对方选择

  • Eclipse下面的Maven管理的SSH框架整合(Struts,Spring,Hibernate)

    搭建的环境:eclispe下面的mavenweb项目 Struts:  2.5.10 Spring:  4.3.8 Hibernate: 5.1.7.Final MySQL: 5.1.30 先来详细的讲解一下SSH框架的整合,在这里是将struts2.0的Action的创建工作由Spring进行统一管理,主要是利用了Spring 控制反转和依赖注入的功能。   而将hibernate.cfg.xml整合Spring的配置文件中。而且利用Spring的面向切向功能对Hibernate事务进行统一管理。给实体类添加注解,表明了与表之间的映射关系,将Hibernate中的SessionFactory配置到了Spring的配置文件下面。就是注入连接池。  项目的结构:     Pom.xml文件: 1<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSc

  • 错误处理

    笔记,无代码。   由于每次报错都会经过application_error事件。 所以在Global.asax.cs下的application_error方法下写报错的方法。 一般会吧错误信息写入日志文件,由于会涉及到多线程,所以会吧错误信息发送到队列中,然后直接跳转到指定页面。 在线程池中执行,每次去队列中拿到一个参数,写入到日志中。 由于涉及到可能有不同的写入地方,也许是本地磁盘,也许是数据库,也许是别的地方。 所以可以采用观察者模式,用事件和委托,每一个方式写一个方法注册到委托中,然后直接在发生错误的时候执行委托就好了。 Therearetwowaysofconstructingasoftwaredesign.Oneistomakeitsosimplethatthereareobviouslynodeficiencies;theotheristomakeitsocomplicatedthattherearenoobviousdeficiencies.

  • 运行代码问题

    1.出现cannotimportname‘tf2‘是因为keras与tensorflow版本不一   2.如果出现网速过慢,无法下载的问题  使用:pip--default-timeout=100install库名称-ihttp://pypi.douban.com/simple/--trusted-hostpypi.douban.com 此外,镜像网站:清华:https://pypi.tuna.tsinghua.edu.cn/simple阿里云:http://mirrors.aliyun.com/pypi/simple/中国科技大学https://pypi.mirrors.ustc.edu.cn/simple/华中科技大学:http://pypi.hustunique.com/山东理工大学:http://pypi.sdutlinux.org/豆瓣:http://pypi.douban.com/simple/ 3.pip安装tensorflow报错:couldnotfindaversionthatsatisfiestherequirementgrpcio>=1.

相关推荐

推荐阅读