植树节,我在腾讯种下了二百万棵树
开始2021年3月12日,植树节,腾讯发起了极客技术挑战赛,规则很简单,在页面上只有一个种树按钮,点击一下,就种下了一棵树。树种得越多越好,排行榜会根据树的数量排名。
本期的比赛秉承了极客技术挑战赛的一贯传统,它非常简单,几乎不需要写代码,你只需要简单地点击最下方种树按钮就可以了,最终谁种的树最多,谁就是冠军!比赛截止后,种下的树数量越多排名越靠前,如遇数量相同,则按照到达该数量的时间排名。
页面在此:码上种树。
作为程序员,一定会本能的按下F12,打开开发者工具。一是查看点击按钮执行的代码,二是查看提交给服务器的数据包。通过分析找到关键的js代码,
这段代码通过分析含义如下:
通过pull请求获得数据字段a和js文件名c字段
动态加载这个js文件,然后将pull请求返回的结果传递给js执行
将执行完的结果以及pull请求返回的t字段发送给push请求
第一关查看一下这个A274075A.js文件源码,只有一行代码,原来就是延迟2秒将数组的第一个值返回:
1window.A274075A=async function({a}){return n ...
数据结构中的Boss - AVL平衡二叉树
平衡二叉搜索树是由前苏联的数学家 Adelse-Velskil 和 Landis 在 1962 年最先提出的高度平衡的二叉树,根据科学家的英文名所以也被称为 AVL 树。
彻底搞懂KMP算法原理
KMP算法是什么? KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)
从手写数字识别开启人工智能的大门(附源码)
前言在传统程序中,是通过编码定义好规则,为程序提供一个输入,程序通过规则产生输出,如果一个程序只是枚举所有的输入,来产生相应的输出,那可能根本算不上“智能”,因为未知的输入太多,而且也不现实,比如围棋的棋谱就是千变万化的。对于AI(人工智能)技术来说,恰恰相反,是通过已知的输入和输出,来生成规则,程序通过大量样本数据的训练,使之越来越“明白”这个规则,从而能够预测未知输入的结果,这就是所谓的“监督学习”。
图片存储在计算机中就是一堆毫无意义的二进制数据,计算机只会处理数据(所谓处理数据不过是将这些二进制数据转变成电子信号量在计算机电路中疯狂运转),并不知道图片的具体含义,只有人可以看懂图片,所以这就是很多网站采用验证码的方式来区分人和机器的原因。让计算机认识图片就是AI的一个重要领域-机器视觉,基于Tensorflow2.0框架的发布,利用深度学习来实现一个AI已经变得越来越简单。
效果展示
table th{
border-bottom:1px solid #ddd;
text-align:center;
}
table td.success{
backg ...
Kafka快速入门
基本概念AR:分区的所有副本集合,AR=ISR+OSR
ISR:与leader副本一定程度同步的所有副本(包括leader副本)
OSR:与leader副本同步滞后过多的副本集合
HW:高水位,所有副本都同步到的offset,消费者只能拉取HW之前的消息
LEO:Log End Offset,待写入消息的offset,即最后一条消息的offset+1
安装JDK安装123456789101112131415# 解压jdk压缩包至/opttar zxvf jdk-8u181-linux-x64.tar.gz# 配置jdk环境变量vim /etc/profile# 添加如下配置export JAVA_HOME=/opt/jdk1.8.0_181 export JRE_HOME=$JAVA_HOME/jreexport PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib# 使配置生效source /etc/profilejava -version
ZooKeeper安装12345678910111 ...
Redis五种数据类型
String键值对
12345678910> set name codehole OK > get name "codehole"> exists name (integer) 1 > del name (integer) 1 > get name (nil)
批量键值对
12345678910111213> set name1 codehole OK > set name2 holycoder OK > mget name1 name2 name3 # 返回一个列表1) "codehole" 2) "holycoder" 3) (nil) > mset name1 boy name2 girl name3 unknown > mget name1 name2 name3 1) "boy" 2) "girl" 3) "unknown"
过期时间
12345678910111213> set name c ...
Typora激活方法
前言Typora自正式版1.0.0发布后,需要付费获取激活码才能使用,beta版仍可继续免费使用。
以下方法采用非常规方法在1.0.4版本亲测激活成功,特别声明:该方法仅供学习交流,切勿用于任何商业用途。
准备首先需要获得asar的解包和打包工具,工具的使用依赖于以下环境:
python环境
node环境(可选)
源码地址:https://github.com/Mas0nShi/typoraCracker
步骤1.获取工具源代码,进入到工具的根目录。
2.安装工具所需依赖环境:
1pip install -r requirements.txt
该命令需要本机安装有Visual Studio C++ Build Tools,否则安装过程会报错。
3.找到Typora安装目录下的app.asar文件,例如:C:\Program Files\Typora\resources\app.asar。
4.执行工具解包命令:
1python typora.py "C:\Program Files\Typora\resources\app.asar" workstation ...
JUC内置锁
ReentrantReadWriteLock读锁和写锁互斥,相互阻塞写锁和写锁互斥,相互阻塞读锁和读锁不互斥,不阻塞
持有读锁的情况下去获取写锁,会导致获取写锁永久等待(重入时升级不支持)即持有写锁的情况下去获取读锁,不阻塞(重入时降级支持)
示例
12345678910111213141516171819202122232425262728293031323334353637383940414243444546@Slf4j(topic = "c.TestReadWriteLock")public class TestReadWriteLock { public static void main(String[] args) throws InterruptedException { DataContainer dataContainer = new DataContainer(); new Thread(() -> { dataContainer.read(); ...
JUC内置线程池
ThreadPoolExecutorThreadPoolExecutor是最基础的线程池类:
12345678public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
corePoolSize 核心线程数目 (最多保留的线程数)
maximumPoolSize 最大线程数目
keepAliveTime 生存时间 - 针对救急线程
unit 时间单位 - 针对救急线程
workQueue 阻塞队列
threadFactory 线程工厂 - 可以为线程创建时起个好名字
handler 拒绝策略
工作原理
线程池中刚开始没有线程,当一个任务提交给线程池后,线程池会创建一个新线程来执行任务。
当线程数达 ...
基于ubuntu系统的k8s集群安装
主机准备
主机名
操作系统
CPU
内存
硬盘
master1
ubuntu18.04
1*2核
2G
20G
node1
ubuntu18.04
1*2核
2G
20G
node2
ubuntu18.04
1*2核
2G
20G
集群安装运行时安装(docker)切换root账号sudo su -
12345678910111213sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key --keyring /etc/apt/trusted.gpg.d/docker.gpg add -sudo add-apt-repository ...