nginx: [emerg] BIO_new_file(/tmp/recorderApp/speech/cert.pem) failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/tmp/recorderApp/speech/cert.pem','r') error
https://stackoverflow.com/questions/50599808/nginx-installation-error
sudo apt-get --purge remove nginx-* sudo apt-get install nginx
#操作升级opensslsudo -i
apt-get install zlib*
#解压:tar xf openssl-1.1.1k.tar.gz && cd openssl-1.1.1k
#编译安装:./config --prefix=/usr/local/openssl1.1.1k --openssldir=/etc/ssl1.1.1k --shared zlibmake -j4 && make install
cp /usr/local/openssl1.1.1k/bin/* /usr/binln -s /usr/local/openssl1.1.1k/lib/libssl.so.1.1 /usr/libln -s /usr/local/openssl1.1.1k/lib/libcrypto.so.1.1 /usr/libvi /etc/ld.so.conf.d/libc.conf
#修改为/usr/local/lib/usr/lib/usr/local/openssl1.1.1k/lib
#查看是否安装成功ldd /usr/local/openssl1.1.1k/bin/opensslopenssl version
Linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。本文主要介绍Linux declare 命令。 原文地址:Linux declare 命令
安装好Arch Linux或Manjaro Linux系统后默认没办法正常显示emoji,通常会变成方框或者带有unicode码的方块:
这是因为缺失字体以及相关的字体配置导致的。
当然也有一小部分应用没有这个问题(比如Chrome),因为字体是可以在程序里单独设置的,Qt和GTK都有相应的接口,只要设置了正确的字体即可显示emoji。但很多系统程序为了兼容性是没有进行这些设置的,比如文件管理器和终端模拟器。
解决办法:
安装emoji字体 更新字体配置 首先是安装emoji字体,不考虑aur和自己下载安装字体的话一般会安装这个:noto-fonts-emoji。自测应该能正常显示所有常见emoji。
安装命令:
sudo pacman -S noto-fonts-emoji 这时应用程序还是不能正常显示emoji的,需要进行第二步更新字体配置。
字体的配置文件在/etc/fonts目录下,不同系统可能不同,在这个目录下新建local.conf文件,这个文件里是我们的自定义配置,不要去修改font.conf文件。
local.conf里写入下面的内容:
<?xml version=1.0?> <!DOCTYPE fontconfig SYSTEM fonts.dtd> <fontconfig> <alias> <family>sans-serif</family> <prefer> <family>Noto Sans</family> <family>Noto Color Emoji</family> <family>Noto Emoji</family> <family>DejaVu Sans</family> </prefer> </alias> <alias> <family>serif</family> <prefer> <family>Noto Serif</family> <family>Noto Color Emoji</family> <family>Noto Emoji</family> <family>DejaVu Serif</family> </prefer> </alias> <alias> <family>monospace</family> <prefer> <family>Noto Mono</family> <family>Noto Color Emoji</family> <family>Noto Emoji</family> <family>DejaVu Sans Mono</family> </prefer> </alias> </fontconfig> 保存文件后使用命令让新配置生效:
如果系统中既不采取预防死锁的措施,也不采取避免死锁的措施,系统就很可能发生死锁。在这种情况下,系统应当提供两个算法: 1.死锁检测算法:用于检测系统状态,以确定系统中是否发生了死锁 2.死锁解除算法:当认定系统中己经发生了死锁,利用该算法可将系统从死锁状态中解脱出来
为了能对系统是否己发生了死锁进行检测,必须: 1.用某种数据结构来保存资源的请求和分配信息: 2.提供一种算法,利用上述信息来检测系统是否己进入死锁状态。
两种节点两种边: 进程结点:对应一个进程 资源结点:对应一类资源,一类资源可能有多个 进程结点→资源结点:表示进程想申请几个资源(每条边代表一个) 资源节点→进程结点:表示已经为进程分配了几个资源(每条边代表一个)
如果系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时是不会阻塞的,可以顺利地执行下去。如果这个进程执行结束了把资源归还系统,就可能使某些正在等待资源的进程被激活,并顺利地执行下去。相应的,这些被激活的进程执行完了之后又会归还一些资源,这样可能又会激活另外一些阻塞的进程 如果按上述过程分析,最终能消除所有边,就称这个图是可完全简化的。此时一定没有发生死锁(相当于能找到一个安全序列) 如果最终不能消除所有边,那么此时就是发生了死锁。最终还连着边的那些进程就是处于死锁状态的进程。
检测死锁的算法: 1.在资源分配图中,找出既不阻塞又不是孤点的进程。消去它所有的请求边和分配边,使之称为孤立的结点 2.进程所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可能变为非阻塞进程。若能消去途中所有的边,则称该图是可完全简化的。
死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁
一旦检测出死锁的发生,就应该立即解除死锁。 补充:并不是系统中所有的进程都是死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程
解除死锁的主要方法有: 1.资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。 2.撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能己经运行了很长时间,己经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。 3.进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
如何决定“对谁动手” 1.进程优先级 2.己执行多长时间 3.还要多久能完成 4.进程己经使用了多少资源 5.进程是交互式的还是批处理式的
『BUAA-OO-Unit2-Summary』 Homework5 0. 写在前面 由于没有看清DDL,导致本次作业卡点提交未能成功通过。(悲)
作为多线程编程的初学者,我认为本次作业的难点有三:
wait()/notify()的使用; 共享对象类的构造; 调度策略的代码实现; 接下来,我将对本次作业的实现过程进行一个大致的复现,并对以上难点着重展开讲述。
1. 重点关注:同步块/共享对象/线程安全类 关于多线程程序设计,在拿到题面/了解客户需求后,设计架构时要提前想好以下几个问题:
需要设计哪些线程类? 共享对象是谁? 线程与共享对象的关系是什么? 对于第五次作业来说,我们需要以下几个线程类:
InputThread:输入线程类,负责对标准输入的乘客请求进行解析,并将其传递给Dispatcher线程类。 Dispatcher:任务分配器,根据起点将各乘客分配到不同的请求队列中。 Elevator:电梯线程,将乘客运送到相应楼层并输出 运行轨迹 与 乘客信息。 如果分别构造InputThread与Dispatcher两个线程类的话,那么还需要实现一个供二者进行信息交互的共享对象类。但是二者均属于单例模式类,也就是说,自始至终只有两个线程会来访问这个共享对象,并且一个只会写,一个只会读。这样的设计显然十分不合理,因此我将InputThread与Dispatcher合并为一个线程类并命名为Dispatcher,其功能为从标准输入中获得乘客请求并将其分配到对应的队列中(即二者功能合并)。
至于共享对象,就十分明显了:Dispatcher需要将乘客信息写入一个队列,而Elevator类的五个实例(5 elevators)则需要从该队列中选择自己的任务来工作,并在任务完毕后将该任务从队列中删除。因此,共享对象就是各楼座的等候队列,创建共享对象类WaitQueue。WaitQueue的内部结构,我选择了同时维护一个ArrayList<>与一个ArrayList<ArrayList<>>,维护ArrayList<ArrayList<>>的目的是快速返回某楼层的请求信息,而ArrayList<>则起到了保留请求到达先后顺序的作用。采用这样看起来有些复杂的结构实际上有一个好处:明面上提示了设计者需要使用同步块。尤其是对于当时刚刚接触多线程的我来说,其实对共享对象读写的保护意识并没有那么强烈,但是在add与remove WaitQueue中请求时总是要同时对两个数据结构进行操作的这个事实总是在不断地提示着我读写方法的非原子性,共享对象的读写方法必须加synchronized同步块保护才能在线程中放心大胆地任意使用。
关于共享对象类的构造:其实保证共享对象类内方法的安全性有两种方法:第一,开发者保证共享对象是线程安全类,即在构造时保证方法的原子性(不可分割的方法);第二,在调用每一条方法前,用户对该指令操作的对象进行同步保护。只是,应该没有人会智障到采用第二种方式设计产品,或者说,应该没有用户会智障到选择采用第二种方式制作出来的产品吧。 各线程与共享对象的关系?Dispatcher线程对WaitQueue进行写入操作(W),而Elevator既要从WaitQueue中读取数据,还要在任务完成后将数据清除(RW)。
这几个基本的问题思考清楚以后,我们便可以开始动手实现了!
2. 调度策略 关于调度策略,虽然学长与助教强烈推荐了LOOK算法,但我还是倔强地使用了ALS策略。
说实话,其实ALS策略并不是很好写。主要概念只有两个:主任务与捎带任务。实现分四步走,思路如下:
getMainMission(); move(); getNextMovingDir(); outAndIn(); getMainMission() / move() 存在两种情况:
A. 若电梯载客队列为空,则将WaitQueue中到达时间最早的请求作为主请求,朝着其起点方向移动;
B. 若电梯载客队列不为空,则将电梯载客队列的第一个请求作为主请求,朝着其终点方向移动。
P.S. ARRIVE-*信息在move()中打印
getNextMovingDir():
若到达主请求的起点楼层(A1),nextMovingDir即为向主请求终点移动的方向 若未到达主请求的起点楼层(A2),nextMovingDir仍为向主请求起点移动的方向 若未到达主请求终点楼层(B1),nextMovingDir为向主请求终点移动的方向 若到达主请求终点楼层(B2),nextMovingDir为0,损失一次进人机会(该方法的一个小漏洞) outAndIn():
RISC-V技术与展望
RISC-V(发音为“risk-five”)是一个基于精简指令集(RISC)原则的开源指令集架构(ISA)。
与大多数指令集相比,RISC-V指令集可以自由地用于任何目的,允许任何人设计、制造和销售RISC-V芯片和软件。虽然这不是第一个开源指令集,但具有重要意义,因为其设计使其适用于现代计算设备(如仓库规模云计算机、高端移动电话和微小嵌入式系统)。设计者考虑到了这些用途中的性能与功率效率。该指令集还具有众多支持的软件,这解决了新指令集通常的弱点。
该项目2010年始于加州大学伯克利分校,但许多贡献者是该大学以外的志愿者和行业工作者。
RISC-V指令集的设计考虑了小型、快速、低功耗的现实情况来实做,但并没有对特定的微架构做过度的设计。
截至2017年5月,RISC-V已经确立了版本2.22的用户空间的指令集(userspace ISA),而特权指令集(privileged ISA)也处在草案版本1.10。
本文参考文献链接
https://baike.baidu.com/item/RISC-V/22606314?fr=aladdin
https://mp.weixin.qq.com/s/xrwPaxlvKlGmKdeJPKwmmg
特点
完全开源
对指令集使用,RISC-V基金会不收取高额的授权费。开源采用宽松的BSD协议,企业完全自由免费使用,同时也容许企业添加自有指令集拓展而不必开放共享以实现差异化发展。
架构简单
RISC-V架构秉承简单的设计哲学。体现为:
在处理器领域,主流的架构为x86与ARM架构。x86与ARM架构的发展的过程也伴随了现代处理器架构技术的不断发展成熟,但作为商用的架构,为了能够保持架构的向后兼容性,其不得不保留许多过时的定义,导致其指令数目多,指令冗余严重,文档数量庞大,所以要在这些架构上开发新的操作系统或者直接开发应用门槛很高。而RISC-V架构则能完全抛弃包袱,借助计算机体系结构经过多年的发展已经成为比较成熟的技术的优势,从轻上路。RISC-V基础指令集则只有40多条,加上其他的模块化扩展指令总共几十条指令。 RISC-V的规范文档仅有145页,而“特权架构文档”的篇幅也仅为91页。
易于移植*nix
现代操作系统都做了特权级指令和用户级指令的分离,特权指令只能操作系统调用,而用户级指令才能在用户模式调用,保障操作系统的稳定。RISC-V提供了特权级指令和用户级指令,同时提供了详细的RISC-V特权级指令规范和RISC-V用户级指令规范的详细信息,使开发者能非常方便的移植linux和unix系统到RISC-V平台。
模块化设计
RISC-V架构不仅短小精悍,而且其不同的部分还能以模块化的方式组织在一起,从而试图通过一套统一的架构满足各种不同的应用场景。用户能够灵活选择不同的模块组合,来实现自己定制化设备的需要,比如针对于小面积低功耗嵌入式场景,用户可以选择RV32IC组合的指令集,仅使用Machine Mode(机器模式);高性能应用操作系统场景则可以选择譬如RV32IMFDC的指令集,使用Machine Mode(机器模式)与User Mode(用户模式)两种模式。
完整的工具链
对于设计CPU来说,工具链是软件开发人员和cpu交互的窗口,没有工具链,对软件开发人员开发软件要求很高,甚至软件开发者无法让cpu工作起来。在cpu设计中,工具链的开发是一个需要巨大工作量的工作。如果用RISC-V来设计芯片,芯片设计公司不再担心工具链问题,只需专注于芯片设计,RISC-V社区已经提供了完整的工具链,并且RISC-V基金会持续维护该工具链。当前RISC-V的支持已经合并到主要的工具中,比如编译工具链gcc, 仿真工具qemu等
开源实现
BOOM: Christopher Celio的RV64乱序处理器实现。Chisel, BSD Licensed。[GitHub][Doc]
BottleRocket: RV32IMC微处理器。Chisel, Apache Licensed。 [GitHub]
bwitherspoon: RV32微处理器。SystemVerilog, ISC Licensed。[GitHub]
Clarvi: 剑桥大学教学用RISC-V处理器。SystemVerilog, BSD Licensed。[GitHub]
F32: 针对FPGA的RV32微处理器,VHDL,BSD Licensed。[GitHub]
GRVI: Gray Research LLC. 针对FPGA优化的RV32微处理器,commercial licensed。[Web]
Hummingbird E200. 二级流水线,目标替代Cortex-M0/8051, Verilog, Apache 2.0 licensed。[GitHub]
invicta: 一级流水线的RV32微处理器。Verilog,BSD Licensed。[GitHub]
Kamikaze: RV32微处理器。Verilog,MIT Liencensed。[GitHub]
KCP53000: Samuel A.
在数据分析领域,pandas是python数据分析基础工具,SQL是数据库最常用分析语言。二者有相通的地方,也有很大的语法不同,做起数据分析来,谁将更胜一筹呢?
做过业务开发、跟数据库打交道比较多的小伙伴,经常会提到”增删改查“操作,分别对应数据的增加、删除、修改、查询,这4个操作。
下面,我将从查、增、删、改四个维度,依次比对pandas和SQL的实现步骤,比较二者的优劣。
文末含获取Python源码文件方式!
【讲解视频】此文章同步讲解视频: https://www.zhihu.com/zvideo/1463296616861536256 https://www.zhihu.com/zvideo/1468878502435385344
【准备数据】数据分析对象-B站top100排行榜数据 这里,我采用B站top100排行榜的数据,作为数据分析对象。
想学习如何爬取top100排行榜数据的小伙伴,请移步至: https://www.zhihu.com/zvideo/1442441321721663488 爬取下来的数据,存到excel: 数据准备完毕,开始数据分析,pandas和SQL进行逐行比对!
一、查询 1.1 查询前3行 pandas查询前3行:SQL查询前3行:1.2 查询后3行 pandas查询后3行:SQL查询后3行:1.3 查询指定列 pandas方法1(中括号[]):pandas方法2(loc):pandas方法3(iloc): 【马哥小贴士】关于loc和iloc的说明: loc:works on labels in the index.(通过索引名定位) iloc:works on the positions in the index (so it only takes integers).(通过索引值定位)
SQL查询指定列:1.4 按条件查询 pandas单条件查询:SQL单条件查询:pandas多条件查询(并且关系): SQL多条件查询(并且关系AND): pandas多条件查询(或者关系): SQL多条件查询(或者关系OR):二、增加 2.1 增加行 pandas方法1(append):pandas方法2(loc):pandas方法3(concat):SQL增加一行:SQL增加多行:2.2 增加列 pandas方法1(中括号[]):pandas方法2(insert):SQL增加一列:三、删除 3.1 删除行 pandas方法1(drop-行名): pandas方法2(drop-行号):pandas方法3(drop-删除特定条件的行):SQL删除多行:3.2 删除列 pandas方法1(drop):pandas方法2(del):SQL删除一列:四、修改 4.1 pandas方法1(loc): 4.2 pandas方法2(iloc): 4.3 SQL修改一个值 4.4 SQL修改多个值 五、四种连接方法 待分析数据:5.
class Solution: def reverseString(self, s: List[str]) -> None: Do not return anything, modify s in-place instead. i = 0 j = len(s) - 1 while i < j: s[i], s[j] = s[j], s[i] i += 1 j -= 1
事情是这样的
我想截取本机的Ip如10.0.0.128最后的128,编写脚本用
代码
hostname -I 最开始,用cut,分隔符为 [ . ],小黑点,作为分隔符
代码
hostname -I | cut -d. -f4 结果看似很美好,成功取出128
然后
我需要这个128,传送给变量,变量传给sed,以128作为正则表达式关键词,删除以下文本。命令类似于 sed -i /${PAICHU}/d SCANIP.txt,${PAICHU}变量期望是128
然而,当我开始运行这个脚本,总是无法删除指定的128这一行
我就怀疑人生了
为什么明明是128却不能删除?
我开始怀疑是不是sed没有读取到变量,搜索了很多sed正则表达式使用变量的方法,发现该方法没问题。
又尝试自己写另外的脚本删除128,没有问题
这就奇怪了,为什么128删除不了?
于是我开始怀疑,是否是因为变量中多了某种符号,类似于 “128 ”,128后面跟了空格
于是乎,我执行了一下命令
hostname -I | cut -d. -f4 >> dalang.txt 取出128这列,输出到dalang.txt观察
注意看,我在vim用set list命令128后面居然跟了个空格,也就是说我是在匹配 128+一个空格 这个关键字,而我的文本中并没有128+空格,
那么就是说, sed -i /${PAICHU}/d SCANIP.txt,命令将不会匹配到128这行,也就不会删除!!!!!!!!!!!!!!!如此一来会影响我接下来的脚本执行情况
此时才如梦方醒,原来是这样导致的失败,多么微小的错误!!!!!!!!!!!!!
于是我改用了awk来取列 PAICHU=$(hostname -I | awk -F[ .]+ '{print $4}') 分隔符指定为空格或者.