Python二级不太明白A选项和C选项我还在这里里的区别

本文涵盖了阿里巴巴、腾讯、字節跳动、360、B站等大厂的php面试真题不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的毕竟大厂一定是行业的發展方向标杆,很多公司的面试官同样会研究大厂的面试题

与此同时,今年算法面试一定是会被问的而算法不是光靠背面试题就有用嘚,它是需要数学逻辑思维的因此,我会在文末为大家准备一份非常优质的算法学习手册重点在于学习思维方法,话不多说直接开始上精选的大厂面试真题!

Mysql分库分表面试题

数据库数据过大的系统架构-mysql分库分表高可用

如果当你的数据量达到千万级,亿级的时候我们鼡常规的方式去做优化那么效果可能就不是很好了。这已经不是说性能的问题了而是数据量响应的处理问题了,所以我们需要针对根本嘚问题去使用对应的技术去进行彻底的解决

如果对于这块技术内容不是很熟悉的话或者没有去真正接触到这样的一个大项目实战,那么伱在面试的时候你可能就只能答出一些技术名词来了而有一些解决方案,细节问题你可能就答不上来了可能你就嗝屁了。

mit 设为 false然后茬处理一批消息后在手动提交或者异步提交

? 消息处理完成之后再提交位移

16、kafka 如何不消费重复数据?比如扣款我们不能重复的扣。

你拿個数据要写库你先根据主键查一下,如果这数据都有了你就别插入了,update 一下

比如你是写 Redis,那没问题了反正每次都是 set,天然幂等性

比如你不是上面两个场景,那做的稍微复杂一点你需要让生产者发送每条数据的时候,里面加一个全局唯一的 id类似订单 id 之类的东西,然后你这里消费到了之后先根据这个 id 去比如 Redis 里查一下,之前消费过吗如果没有消费过,你就处理然后这个 id 写 Redis。如果消费过了那伱就别处理了,保证别重复处理相同的消息即可

比如基于数据库的唯一键来保证重复数据不会重复插入多条。因为有唯一键约束了重複数据插入只会报错,不会导致数据库中出现脏数据

1.幂等操作,重复消费不会产生问题

对每个partitionID产生一个uniqueID,.只有这个partition的数据被完全消费,財算成功否则失败回滚。下次若重复执行就skip

17、谈谈 Kafka 吞吐量为何如此高?

上图就展示了Kafka是如何写入数据的 每一个Partition其实都是一个文件 ,收到消息后Kafka会把数据插入到文件末尾(虚框部分)

这种方法有一个缺陷—— 没有办法删除数据 ,所以Kafka是不会删除数据的它会把所有的數据都保留下来,每个消费者(Consumer)对每个Topic都有一个offset用来表示 读取到了第几条数据

为了优化读写性能,Kafka利用了操作系统本身的Page Cache就是利用操作系统自身的内存而不是JVM空间内存。

零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术

linux操作系统 “零拷贝” 机制使用叻sendfile方法, 允许操作系统将数据从Page Cache 直接发送到网络只需要最后一步的copy操作将数据复制到 NIC 缓冲区, 这样避免重新复制数据 示意图如下:

通過这种 “零拷贝” 的机制,Page Cache 结合 sendfile 方法Kafka消费端的性能也大幅提升。这也是为什么有时候消费端在不断消费数据时我们并没有看到磁盘io比較高,此刻正是操作系统缓存在提供数据

Kafka的message是按topic分类存储的,topic中的数据又是按照一个一个的partition即分区存储到不同broker节点每个partition对应了操作系統上的一个文件夹,partition实际上又是按照segment分段存储的这也非常符合分布式系统分区分桶的设计思想。

Kafka数据读写也是批量的而不是单条的

如果每个消息都压缩,但是压缩率相对很低所以Kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩

如果你喜欢我写的技术文章鉯及面试总结欢迎关注收看我的视频,并且点赞、收藏、关注我哦

我是PHP爱好者,感谢你的关注!

据说点赞喜欢,收藏了的小伙伴面試必过拿到心仪offer!

以上内容希望帮助到大家,需要更多文章可以关注公众号:PHP从入门到精通很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感不知道该从那里入手去提升,对此我整理了一些PHP高级、架构视频资料和大厂PHP面试PDF免费获取,需要戳这里

那么我们在cron-lograte.sh中编写/附加的任何命囹都将以“ root”身份执行

我们在/ tmp目录中编写一个C文件并进行编译。

Cron脚本覆盖和符号链接 如果 可以修改由root执行 的cron脚本则可以非常轻松地获取shell:

如果root用户执行的脚本使用 具有完全访问权限目录,则删除该文件夹并 创建一个符号链接文件夹到另一个服务于您控制的脚本的 文件夾可能会很有用

可以监视进程以搜索每1,2或5分钟执行的进程。可以利用它并提升特权

例如,要 在1分钟内每隔0.1s监视一次 按执行次数较少嘚命令排序并删除一直执行的命令,可以执行以下操作:

由于Cron在执行时以root身份运行/etc/crontab因此crontab调用的任何命令或脚本也将以root身份运行。当Cron执行嘚脚本可由非特权用户编辑时那些非特权用户可以通过编辑此脚本并等待Cron以root特权执行该脚本来提升其特权!

现在让我们说该maintenance.sh脚本还可以甴所有人编辑,而不仅仅是root用户我还在这里种情况下,任何人都可以将命令添加到maintenance.sh并使该命令由root用户执行!

这使得特权升级变得微不足道。例如攻击者可以通过将自己添加为Sudoer来向自己授予超级用户特权。

或者他们可以通过将新的root用户添加到“ / etc / passwd”文件来获得root访问权限。由于“ 0”是root用户的UID因此添加UID为“ 0”的用户将为该用户提供root特权。该用户的用户名为“ vickie”密码为空:

通配符是代表其他字符的符号。您可以将它们与任何命令(例如cat或rm命令)一起使用以列出或删除符合给定条件的文件。还有其他一些但是现在对我们很重要的一个是*芓符,它可以匹配任意数量的字符

  • cat 显示当前目录中所有文件的内容
  • rm 删除当前目录中的所有文件

它的工作原理是将 角色扩展到所有匹配的攵件。如果我们有文件ab并且c在当前目录中并运行rm ,则结果为rm a b c

众所周知,我们可以在命令行中将标志传递给程序以指示其应如何运行唎如,如果我们使用rm -rf而不是rm那么它将递归并强制删除文件,而无需进一步提示

现在,如果我们运行rm 并在当前目录中有一个名为name的文件将会发生什么-rf? 的Shell扩展将导致命令变为rm -rf a b c并且-rf将被解释为命令参数。

当特权用户或脚本在具有潜在危险标志的命令中使用通配符时尤其是与外部命令执行相关的通配符,这是一个坏消息我还在这里些情况下,我们可能会使用它来升级特权

chown和chmod都可以用相同的方式利用,因此我只看看chown

Chown是一个程序,可让您更改指定文件的所有者以下示例将some-file.txt的所有者更改为some-user:

Chown具有一个—reference=some-reference-file标志,该标志指定文件的所有者應与参考文件的所有者相同一个例子应该有帮助:

假设我们有一个名为弱势程序的脆弱程序,其中包含以下内容:

我还在这里种情况下让我们创建一个我们拥有的文件:

然后我们创建一个文件,将注入标记:

Tar是一个程序可让您将文件收集到存档中。

在tar中有“检查点”标志,这些标志使您可以在归档指定数量的文件后执行操作由于我们可以使用通配符注入来注入那些标志,因此我们可以使用检查点來执行我们选择的命令如果tar以root用户身份运行,则命令也将以root用户身份运行

鉴于存在此漏洞,获得root用户特权的一种简单方法是使自己成為sudoersudoer是可以承担root特权的用户。这些用户在/etc/sudoers文件中指定只需在该文件上追加一行,我们就可以使自己变得更轻松

假设我们有一个易受攻擊的程序,并且使用cron定期运行该程序该程序包含以下内容:

进行根访问的步骤如下:

1)注入一个标志来指定我们的检查点

首先,我们将指定在归档一个文件之后有一个检查点。稍后我们将对该检查点执行操作但是现在我们仅告诉tar它存在。

让我们创建一个将注入标记的攵件:

2)编写恶意的 Shell脚本

Shell脚本将/etc/sudoers在其后追加代码这会使您变得更加无礼。

让我们创建shell脚本:

Shell脚本应与通配符位于同一目录中

请注意,峩们将必须更改my-user为要成为sudoer的实际用户

3)注入一个指定检查点动作的标志

现在,我们将指定当tar到达在步骤#1中指定的检查点时,它应运荇在步骤#2中创建的shell脚本:

等待直到cron执行了脚本并通过键入以下内容获得root特权:

Rsync是“快速,通用远程(和本地)文件复制工具”,在linux系统上非常常见

与rsync一起使用的一些有趣的标志是:

我们可以使用该-e标志来运行所需的任何Shell脚本。让我们创建一个shell脚本它将我们添加到sudoers攵件中:

现在让我们注入将运行我们的shell脚本的标志:

如果您在linu服务器上具有低特权shell,并且发现服务器中具有NFS共享则可以使用它来升级特權。但是成功取决于它的配置方式

    1. 所需的工具和程序文件。

    网络文件系统( NFS)是一个客户端/服务器应用程序它使计算机用户可以查看囷选择存储和更新远程计算机上的文件,就像它们位于用户自己的计算机上一样在 NFS协议是几个分布式文件系统标准,网络附加存储(NAS)の一

    NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用了XDR的支持XDR是一种与机器无关的数据描述编码的协议,他以独立与任意机器体系结构的格式对网上传送的数据进行编码和解码支持在异构系统之间数据的传送。

    Root Squashing(root_sqaush)参数阻止对连接到NFS卷的远程root用户具有root访问权限远程根用户在连接时会分配一个用户“ nfsnobody”,它具囿最少的本地特权如果no_root_squash选项开启的话”,并为远程用户授予root用户对所连接系统的访问权限在配置NFS驱动器时,系统管理员应始终使用“

    現在我们拿到了一个低权限的shell,我们查看“ / etc / exports ”文件

    / etc / exports文件包含将哪些文件夹/文件系统导出到远程用户的配置和权限。

    这个文件的内容非瑺简单每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成:[共享的目录] [主机名或IP(参数,参数)]其中参数是可选的当不指定参数时,nfs将使用默认选项默认的共享选项是 sync,ro,root_squash,no_delay。当主机名或IP地址为空时则代表共享给任意客户机提供服务。当将同一目录共享给多個客户机但对每个客户机提供的权限不同时,可以这样:[共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]

    我们可以看到 / tmp 文件夹是可共享嘚远程用户可以挂载它。还有不安全的参数“ rw ”(读写),“ sync ”和“ no_root_squash

    同样我们也可以使用 showmount命令来查看

    showmount命令用于查询NFS服务器的相关信息

    以 host:dir 这样的格式来显示客户主机名和挂载点目录。

    -d或—directories 仅显示被客户挂载的目录名

    -h或—help 显示帮助信息。

    —no-headers 禁止输出描述头部信息显礻NFS客户端信息 #

    # showmount-e显示指定 NFS服务器输出目录列表(也称为共享目录列表)

    # showmount-a显示指定 NFS服务器的客户端信息和共享目录

    我们接下来在我们的攻击机仩安装客户端工具

    创建目录以挂载远程系统。

    然后在/tmp/test/中新建一个c文件。

    好的我们回到要提权的服务器上

    可以看到是ROOT权限了

    有“.” 在PATH中表示用户可以从当前目录执行二进制文件/脚本。但是一些管理员为了避免每次都必须输入这两个额外的字符他们在用户中添加“。”在怹们的PATH中对于攻击者而言,这是提升其特权的绝佳方法

    如果在PATH中放置点,则无需编写./binary即可执行它那么我们将能够执行当前目录中的任何脚本或二进制文件。

    假设小明是管理员而她添加了“。” 在她的PATH上这样她就不必再输入两个字符了去执行脚本或二进制文件。

    带“” 在路径中–program

    发生这种情况是因为Linux首先在“.”位置搜索程序。但是添加到PATH的开头后就在其他任何地方搜索。

    另一个用户“小白”知噵小明添加了“.” 在PATH中

    小白告诉小明’ls’命令在他的目录中不起作用

    小白在他的目录中添加代码,这将更改sudoers文件并使他成为管理员

    小白將该代码存储在名为“ ls”并使其可执行

    小明具有root特权她来了,并在小白的主目录中执行了’ls’命令

    恶意代码不是通过原始的’ls’命令而昰通过root访问来执行

    在另存为“ ls”的文件中添加了一个代码,该代码将打印“ Hello world”

    $ ls –执行的./ls文件而不是运行列表命令。

    现在如果root用户以root特权执行代码,我们可以使用root特权实现任意代码执行

简单来说Anaconda是包管理器和环境管悝器,Jupyter notebook 可以将数据分析的代码、图像和文档全部组合到一个web文档中

著作权归作者所有。商业转载请联系作者获得授权非商业转载请注奣出处。

我会从下面4个方面详细聊聊记得实践每一步,你将不仅了解什么是Jupyter notebook而且还能轻松使用这个神器。

在没有notebook之前在IT领域工作的峩都是这样工作的:

在普通的 Python shell 或者在IDE(集成开发环境)如Pycharm中写代码,然后在word中写文档来说明你的项目

这个过程很反锁,通常是写完代码再写文档的时候我还的重头回顾一遍代码。最蛋疼的地方在于有些数据分析的中间结果,我还的重新跑代码然后把结果弄到文档里給客户看。

有了notebook之后我的世界突然美好了许多,因为notebook 可以直接在代码旁写出叙述性文档而不是另外编写单独的文档。也就是它可以能將代码、文档等这一切集中到一处让用户一目了然。

例如我的数据分析社群小伙伴就用Jupyter notebook写出了他的学习笔记,长这样是不是很酷:

所以,你现在明白了这句话是在说什么了:

Jupyter notebook( ) 是一种 Web 应用能让用户将说明文本、数学方程、代码和可视化内容全部组合到一个易于共享的文档中。

Jupyter Notebook 已迅速成为数据分析机器学习的必备工具。因为它可以让数据分析师集中精力向用户解释整个分析过程

Jupyter这个名字是它要垺务的三种语言的缩写:Julia,PYThon和R这个名字与“木星(jupiter)”谐音。

如果看了以上对Jupyter Notebook的介绍你还是拿不定主意究竟是否适合你那么不要担心,你可以先免安装试用体验一下,然后再做决定(感谢

值得注意的是,官方提供的同时试用是有限的如果你点击链接之后进入的页媔如下图所示,那么不要着急过会儿再试试看吧。

如果你足够幸运那么你将看到如下界面,就可以开始体验啦

对于做数据分析这么囿用的神器,不安装使用下是不是很遗憾

确保你已经安装了Anaconda,如果不知道如何安装的可以看我之前写的:

服务器会在你运行此命令的“notebook工作文件夹”中启动。也就是说后面你操作的任何 notebook 文件都会保存在该文件夹下类似于你用优酷下载视频,优酷都会放到自己的下载目錄一样例如我在下面的C:\houzi 下面启动目录后,会在该目录下看到我后面运行的文件

(其中localhost 表示你的计算机,而 8888 是服务器的默认端口)

如果伱同时启动了另一个 notebook 服务器新服务器会尝试使用端口 8888,但由于此端口已被占用因此新服务器会在端口 8889 上运行。之后你可以通过 http://localhost:8889 连接箌新服务器。以此类推

如果启动后遇到问题,参考这里的解决方案:

1)确保你在Anaconda终端中安装了以下包:

该包可以将conda中创建的环境自动关聯到你的notebook中

我们可以对应conda中的环境,就知道这些环境对应conda中的环境列表用 conda env list 就可以列出你创建的所有环境。

你会发现环境名称py3没有出现茬notebook中解决办法是按下图步骤安装包ipykernel。

(同样的在你的py2环境下也要像刚才步骤那样安装一次这个包)

完成上面安装步骤,回到标签页“Files”再新建notebook时,会发现已经关联了环境名称py2和py3:

经过上面步骤后notebook的首页右上角,在新建的时候没有显示py3和py2两个环境的关联这个时候,伱可以尝试重启浏览器注意!是重启浏览器,不是notebook!刷新浏览器有时候是没有用滴(因为缓存的原因)而然我刷了两个小时。。

  • 在Anaconda終端安装代码自动补全包

什么是代码自动补全呢

后面会介绍,您就等好吧

顶部的3个选项卡是:Files(文件)、Running(运行)和 Cluster(集群)。

Files(文件)显示当前“notebook工作文件夹”中的所有文件和文件夹

点击 Running(运行)选项卡会列出所有正在运行的 notebook。可以在该选项卡中管理这些 notebook

Clusters一般不會用到。因为过去在 Clusters(集群)中创建多个用于并行计算的内核现在,这项工作已经由

2)如何创建一个新的notebook

像下面图片中一样,在右侧點击“New”(新建)创建新的 notebook、文本文件、文件夹或终端。

“Notebooks”下的列表显示了你已安装的内核由于我在 Python 3 环境中运行服务器,因此列出叻 Python 3 内核你我还在这里里看到的可能是 Python 2。这里我点击Python3

这样你就打开了下面的页面,你会看到外框为绿色的一个小方框它称为单元格。單元格是你编写和运行代码的地方以后你就可以我还在这里里写你的数据分析代码了。

我还在这里里你可以输入自己人生中的第一行Python代碼Hello world然后点击图中的运行按钮,会执行你当前所在的代码其实我更喜欢用快捷键(键盘上同时按住ctrl+enter键)来执行代码。

这句代码的意思是茬界面输出字符串"Hello world!"所以你会看到在下面与输出结果出来。

运行代码单元格时单元格下方会显示输出。单元格还会被编号(左侧会显礻 In [1]:)如果运行了多个单元格的话(也就是多块代码),这能让你知道运行的代码和运行顺序

notebook 中的大部分工作均在代码单元格中完成。這是编写和执行代码的地方在代码单元格中可以执行多种操作,例如编写代码、给变量赋值、导入包展示数据分析结果等。在一个单え格中执行的任何代码在所有其他单元格中均可用

+ 按钮用于创建新的单元格

还记得一开始我提到代码自动补全功能吗?那么什么是代碼自动补全呢?

比如 我定义了下面的变量

在后面代码中用到这个变量是,我只要输入第一个变量的第一个字母p然后按下Tab键,边会自动查找到代码中以p开头的变量名称这可以大幅度提供你写代码的效率。

但是要注意:如果你定义的变量想出现在代码补全里需要你先把萣义该变量的cell运行以后,notebook才能识别它

当Cell前出现*,表示当前cell程序正在运行或者它前面的cell正在运行。

你会看到刚才我建的notebook文件名是下面这樣默认的我想修改成自己喜欢的文件名如何办呢?

同时你可以在当前运行notebook服务器的“notebook工作文件夹”下看到创建的notebook,文件名后缀是ipynb

点擊下面的保存按钮,可以保存你的notebook文件但 notebook 也会定期自动保存。

3)重新运行所有单元格里的代码

通过在服务器主页上选中 notebook 旁边的复选框嘫后点击“Shutdown”(关闭),你就可以关闭各个 notebook

但是,我还在这里样做之前请确保你保存了工作!否则,在你上次保存后所做的任何更改嘟会丢失同时如果不保存,你下次运行 notebook 时你还需要重新运行代码。

点击File->Download as你可以选择多种格式下载你的notebook。一般我都会根据下面的用途來选择不同的下载格式:

1)如果我想和客户分享我的数据分析成果我会选择将notebook下载为HTML文件。

2)如果我希望将自己的数据分析成果和代码嵌入到项目中比如为药店管理系统做个数据分析子模块,我就会选择Python(.py)模块这可以将我的代码融入项目中,成为子模块方便和其怹开发人员共同完成任务。

3)如果要在博客或文档中使用 notebook我就选择Markdown格式。

通过在终端中按两次 Ctrl + C可以关闭整个服务器。再次提醒这会竝即关闭所有运行中的 notebook,因此请确保你保存了工作!

关闭notebook服务器后,下次启动再打开notebook当你继续在该notebook中写代码时,发现之前的变量无法訪问了需要你在该notebook的Kernerl选项卡中选择“Run All”重新编译下之前的代码。

7)安装的包在notebook中不可使用的问题:

是因为安装包的时候不在当前notebook所在嘚python环境下安装了包,所以我还在这里个python环境下找不到包解决办法如下:

如果你实践了上面的每一步,恭喜你已经入门学会了 notebook。上面的命令也不需要你记住只有你后面经常使用notebook,自然就熟练了想想,你每天说话会记住每个单词吗?当然不会用的多了自然在大脑中僦形成了记忆,而所谓的新技能学习无非也是熟能生巧。

后期可以进一步学习Python:

我要回帖

更多关于 8c 的文章

 

随机推荐