欢迎来到我的小小世界

Change is a million times less painful than regret

0%

题目描述

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 **[1, 2, …, n]**,你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

 
示例 1:
输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
示例 2:
输入:n = 1, bad = 1
输出:1
提示:
1 <= bad <= n <= 231 - 1

初始想法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int left,mid,right;
left=1;
right=n;
mid=left+(right-left)/2;
while(right>left){
if(isBadVersion(mid)){
if(!isBadVersion(mid+1)){
return mid+1;
}
else
left=mid+1;
}
else{
if(isBadVersion(mid-1)){
return mid;
}
else
right=mid-1;
}
}
return mid;
}
}

使用的是二分查找的方法,开始的想法是用传统的二分进行解决,但是提示超时,后面又改进一次,当mid本身为false且左侧为true时,则不需要再进行一次标识挪动,直接输出mid即可,反之同理,但是按照题目要求要尽量减少API的使用次数,但是如果按照我这种方法和之前调用API的次数不差多少,所以不出意外的出现了意外,又超时了。

改进

之前出现了一个错误,就是把mid的计算放到了while()之外,导致mid值不变,会调用数组长度的一半次数的API,导致超时,改进后将mid的计算放进循环内就好了。如下:

阅读全文 »

Git的工作就是创建和保存你项目的快找及修改后的的快照进行对比。
  Git常用的命令有六个git clone、git push、git add 、git commit、git checkout、git pull

  各个命令之间的逻辑如下图

说明

  • workspace:工作空间
  • staging are :暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库
    一般的操作
    1
    2
    3
    git init  
    git add .
    git conmmit
  • git init - 初始化仓库。
  • git add . - 添加文件到暂存区。
  • git commit - 将暂存区内容添加到仓库中。

    创建仓库命令(自建||下载)

    命令说明
    git init初始化仓库(自己创建目录并作为仓库使用)
    git clone拷贝一份远程仓库,下载一个现有的项目

提交与修改

下面是有关创建和提交项目的的快照命令。





































命令说明
git add添加文件到仓库
git status查看仓库当前的状态,显示有变更的文件
git diff比较文件的不同,也就是比较暂存区和工作区的差异
git add添加文件到仓库
git commit提交缓存区文件到本地仓库
git reset回退版本
git rm删除工作区文件(慎用)
git mv移动或重命名工作区文件(与linux中的操作一直)

提交日志

命令说明
git log查看历史提交记录
git blame <file>一列表的形式查看指定文件的历史修改记录

远程操作

命令说明
git remote远程仓库操作
git fetch从远程获取代码库
git pull从远程仓库拉取(下载)代码并合并
git push上传远程代码并合并
阅读全文 »

  北邮开学第一天,突然发现自己首先要解决的不是怎样与舍友相处,怎样规划好自己未来三年的人生,首先要解决的是自己的心态问题,宿舍里两个土著,一个是二战的,一个还是百度实习的大佬,从交流中可以看出差别之大,其余的都是双一流学校的学生。看看自己的水平,感觉自己真的不是个啊,不过也没办法,既来之则安之。可能成长就是去面对那些自己不敢面对的东西吧,这3年没有了任何东西的加持,干干自己能走多远吧,希望将自己最脆弱的一面暴露出来并击碎吧!!!peace out~

阅读全文 »

Go Hello World 实例

Go 语言的基础组成有以下几个部分:

  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句 & 表达式
  • 注释 接下来让我们来看下简单的代码,该代码输出了”Hello World!”:
    1
    2
    3
    4
    5
    6
    package main
    import "fmt"
    func main() {
    /* 这是我的第一个简单的程序 */
    fmt.Println("Hello, World!")
    }
  1. 第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。

  2. 下一行 import “fmt” 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。

  3. 下一行 func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。

  4. 下一行 // 是注释,在程序执行时将被忽略。单行注释是最常见的注释形式,你可以在任何地方使用以 // 开头的单行注释。多行注释也叫块注释,均已以 /* 开头,并以 */ 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。

  5. 下一行 fmt.Println(…) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。 使用 fmt.Print(“hello, world\n”) 可以得到相同的结果。 Print 和 Println 这两个函数也支持使用变量,如:fmt.Println(arr)。如果没有特别指定,它们会以默认的打印格式将变量 arr 输出到控制台。

  6. 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。

    执行 Go 程序

    让我们来看下如何编写 Go 代码并执行它。步骤如下:

  7. 打开编辑器如Sublime2,将以上代码添加到编辑器中。

  8. 将以上代码保存为 hello.go

  9. 打开命令行,并进入程序文件保存的目录中。

  10. 输入命令 go run hello.go 并按回车执行代码。

  11. 如果操作正确你将在屏幕上看到 “Hello World!” 字样的输出。

    1
    2
    $ go run hello.go
    Hello, World!

    注意

    需要注意的是{不能单独放在一行,所以以下代码在运行时会产生错误:

1
2
3
4
5
6
7
8
package main

import "fmt"

func main()
{ // 错误,{ 不能在单独的行上
fmt.Println("Hello, World!")
}

PS

关于包,根据本地测试得出以下几点:

  • 文件名与包名没有直接关系,不一定要将文件名与包名定成同一个。
  • 文件夹名与包名没有直接关系,并非需要一致。
  • 同一个文件夹下的文件只能有一个包名,否则编译报错。
    文件结构:
1
2
3
4
5
6
Test
--helloworld.go

myMath
--myMath1.go
--myMath2.go

测试代码:

阅读全文 »

主动信息收集的原理

主动信息收集的特点
  • 直接与目标系统交互通信
  • 无法避免留下访问的痕迹
  • 使用受控的第三方电脑进行探测,使用代理或已经被控制的及其,做好被封杀的准备
  • 扫描发送不同的探,根据返回结果判断目标状态
    发现目标主机的过程
  • 识别存货主机,发现潜在被攻击目标
  • 输出一个IP地址列表比如IP地址段IP地址范围
  • 使用二三四层进行探测发现
    OSI七层模型和TCP/IP五层模型
  • 应用层 常见协议:HTTP,HTTPS,FTP,SMTP,POP3
  • 表示层 处理两个同心系统中交换信息的表示方式
  • 会话层 两个节点建立端链接
  • 传输层 建立主机端口到端口的链接 。四层交换机,四层路由器,协议:TCP,UDP
  • 网络成 通过IP寻址来建立两个节点之间的连接 。路由器,三层交换机。协议:IP,ICMP,RIP,IGMP
  • 数据链路层 使用MAC地址访问,进行差错检测 。网桥,网卡。协议 :ARP,CSMA/CD
  • 物理层 物理媒介,各种电气属性 。中继器,集线器,双绞线
    基于OSI模型进行扫描的优缺点
  • 1.二层扫描的优缺点
    优点:扫描速度快、可靠
    缺点:不可路由
  • 2.三层扫描的优缺点
    优点:可路由,速度较快
    缺点:速度比二层慢,经常被边界防火墙过滤
  • 3.四层扫描优缺点
    优点:可路由且结果可靠,不太可能被防火墙过滤,可以发现所有端口都被过滤的主机
    缺点: 基于状态过滤的防火墙可能过滤扫描 ,全端口扫描速度慢

    基于ping命令的探测(IGMP)

    ping
    ping 192.168.1.1 -c 5 控制发送包的数量
    traceroute baidu.com 查看经过的网络设备 对路由进行跟踪

    ping的延伸

    ARPING
  • ARP协议:计算机通过ARP将IP地址转换成MAC地址。
  • ARP工作原理:
  • 使用arping命令查看局域网中的IP是否冲突(防止冒充网关)得学习写脚本啊,不会脚本寸步难行
    使用Netdiscover进行被动方式探测局域中存活的机器
    Netdiscover是一个主动/被动的ARP侦查工具,可以在网络上扫描IP地址,检查在线主机或搜索为他们发送到的ARP请求。
  • 主动模式:
    容易被发现,容易被封杀。eg:netdiscover -i eth0 -r 192.168.38.0/24 此命令就是使用主动方式进行探测,-i代表选择发送的网卡,-r表示选定探测的网段范围。
  • 被动模式:
    不发送任何数据,采用嗅探的方法进行探测。eg:netdiscover -p -p参数表示passive模式,不发送任何数据包
    使用hping3进行探测
    使用hping3 -h 进行帮助查看。
  • 是一个明航下使用TCP/IP数据包组装/分析工具,通常web服务器会用来做压力测试使用,也可以进行DOS攻击的实验。同样,Hping每次只能扫描你个目标。
  • 使用HPING进行压力测试
    测试网站:http://www.xueshenit.com/
    使用命令: hping3 -c 1000 -d 120 -S -w 64 -p 80 –flood –rand-source xueshenit.com

-c: 指定发送的包的数量 -d: 指定包的大小(字节)-S: 发送SYN包 -w:指定TCP窗口大小 -p:扫描端口 –flood: 洪水式攻击 –rand-source:随机IP,伪造IP地址(局域网内伪造,出网还是固定IP)

使用FPING查看局域网中运行的机器

+ping的嘉庆版,可以ping一定范围的IP段 eg: fping -g 192.168.1.0/24 -c 1 >fping.txt

阅读全文 »

  对于任何一个网站来说,优化页面的访问速度是必须的,从体验来讲,没人能忍耐加载页面十秒以上或长时间处于空白或加载状态。优化访问速度的方法有很多,今天只介绍傻瓜式的插件安装方法:

安装插件

  在站点目录下Git bash一下,使用如下命令安装hexo-neat插件:

1
npm install hexo-neat --save

主配置_config.yml文末添加:(其中exclude板块是特别添加,针对你的静态资源进行筛选)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# hexo-neat
# md博文压缩
neat_enable: true
# 压缩html(ejs,swig等也属于html格式片段)
neat_html:
enable: true
exclude:
# 压缩css
neat_css:
enable: true
exclude:
- '*.min.css'
- '**/*.min.css'
- 'jquery.fancybox.min.css'
- '**/live2d-widget/waifu.css'
# 压缩js
neat_js:
enable: true
mangle: true #打印日志
output:
compress:
exclude: #排除文件
- '*.min.js'
- '**/*.min.js'
- 'jquery.fancybox.min.js'
- '**/live2d-widget/*.js'
- '**/live2d-widget/*.min.js'

运行(因为mangle: true #打印日志,我们能看到运行流程)

【INFO neat the html:xxxx.md】先压缩md文件的换行和空白
【INFO neat the html: xxxx.ejs】压缩ejs配置文件(这里也有很多换行和空格),这是html片段格式文件。
现在是neat工作最重要的部分之一:压缩js和css。
阅读全文 »

  为了更好的表达人生情感,每个人的博客都会有个指定,Next 7.0的博客置顶操作如下:

安装插件

  在根目录Blog打开Git Bash,执行下面的命令:

1
2
npm uninstall hexo-generator-index --save  
npm install hexo-generator-index-pin-top --save

设置指定标志

  打开blog/themes/hexo-theme-next/layout/_macro目录下的post.swig文件,定位到<div class="post-meta">标签下,插入如下代码:

1
2
3
4
5
6
7
{% if post.top %}
<script type="text/html" style='display:block'>
<i class="fa fa-thumb-tack"></i>
<font color="RED">置顶</font>
<span class="post-meta-divider">|</span>
</script>
{% endif %}

在文章中添加top

  然后在需要置顶的文章的Front-matter中加上top: true即可,如下:

1
2
3
4
5
6
7
8
9
10
title: 时也,运也,命也
abbrlink: 931683055
tags:
- 感悟
categories:
- 感悟
author: 吕蒙正
top: true
date: 2021-08-24 12:18:00
---
阅读全文 »

在配置PHPStudy中部分人会出现MySQL无法开启的情况,一般来说是与本地的MySQL服务冲突了,所以解决方案就是关掉本地的MySQL服务。

流程

此电脑->管理->服务,之后会出现以下界面

选择其中的MySQL80(有的人可能是MySQLa或者其他,大家记得看一下),然后右键属性->停止

在这里建议大家设置为手动开启,避免每次重启后还要进行调整,右键属性->启动类型->手动

设置完之后重启一下PHPStudy试一下MySQL是否可以正常打开

阅读全文 »

工欲善其事必先利其器,言简意赅,一共就两步:第一步,修改kali下高版本JDK(多环境共存);第二步,安装破解版注册机。

因为github上破解类的文章会被河蟹,所以就放在这里吧。

一、修改kali下高版本JDK

(1)准备工作

    1)kali系统

    2)JDK:这里推荐1.8版本的JDK,如果你懒得这,可以[点这里](https://pan.baidu.com/s/1J0iYcZnXwdK6XR-MaCG9-g)下载(失效的话直接评论区要就行),提取码:ejos。

(2)安装并调整JDK

    1)首先创建文件夹package(可以自定义创建位置和名称)

mkdir package

    2)将之前下载好的1.8版本的JDK压缩包放到package文件夹中,然后进行解压缩

tar -zxvf jdk-8u161-linux-x64.tar.gz 


    ![](https://img-blog.csdnimg.cn/20210709115705908.png)![](https://img-blog.csdnimg.cn/20210709115715789.png)

     到这一步一般没啥问题

3)配置环境变量

阅读全文 »