使用RF做了一个快速训练模板,方便日后使用。
1 |
|
使用XGBoost做了一个快速训练模板,方便日后使用。
1 |
|
使用反编译工具,反编译字节码为操作码。
test.bytecode文件为合约部署到以太坊上的创建交易的inputdata字段的值。(需要去除0x
)
1 |
|
在此之前需要将成功编译为json文件,即执行truffle compile
ContractName为合约名。
1 |
|
使用神经网络训练数据之前,对数据进行标准化。且由于数据集正负样本不平衡,需要对训练集过采样以训练数据。
1 |
|
一种方法是随机过采样,另一种方法是使用SMOTE方法
1 |
|
解决pip安装慢的问题。
方案:更换下载源
国内的一些站点:
注意:地址中可能有的是https协议
1 |
|
1 |
|
修改为:
1 |
|
1 |
|
解决tomcat出现乱码的问题。
找到apache-tomcat-9.0.31\conf\
的logging.properties文件。
1 |
|
将UTF-8
,改为GBK
即可。
如果没有这行配置,则加上。
Go的安装和配置。
将三个变量设置在系统变量中即可
1 |
|
配置环境变量:
1 |
|
添加以下内容:
1 |
|
测试是否安装成功:
1 |
|
python文件操作。
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
学习了一下scrapy爬虫的部署,记录一下过程。
1 |
|
1 |
|
1 |
|
将bind_address改为0.0.0.0
1 |
|
在这之前需要开启服务器的6800
端口。如果是自己买的服务器,不光要检查防火墙端口是否开放,还需登录购买服务器的官网,检查安全组是否开放6800端口。
在本地浏览器输入http://服务器ip地址:6800
,如下图所示,则表示启动成功
==注意==:安装scrapy-client,win10系统如果直接用pip安装可能会发生不能识别scrapy-deploy
命令的错误。所以建议直接通过下载github源码安装。
源码地址,下载后解压,在文件夹下执行如下命令:
1 |
|
若已经用pip安装了的,先卸载Scrapyd-client
1 |
|
下载地址,win10_64位下载如下版本。
添加环境变量
CURL_HOME:为解压后的文件夹根目录
Path中添加两个地址
测试是否安装成功,在powershell中会出错,推荐用cmd。
1 |
|
1 |
|
在项目根目录下启用cmd
,执行如下命令。一定要在CMD
中运行命令,powershell中会出错
1 |
|
1 |
|
服务器端会出现两个文件夹,表示上传完成
1 |
|
3个0,表示没用等待和运行以及完成的爬虫任务。
{% image https://i.loli.net/2020/11/16/AiNOaBM8lxG5e7F.png 'image-20201116162152531' '' %}1 |
|
注意:spider后面跟的是文件名,不是文件夹名。
1 |
|
一直在用typora-theme-flora这款主题,碰巧看到原主题github上有人发了issue求黑色主题,下手改了一个。改完发现原主题有bug,也一并解决了。
主题下载地址:https://github.com/HeXueZhi/typora-theme-FloraDark
如果可以的话请帮忙给个star,谢谢
声明:本主题是在typora-theme-flora主题基础上做的修改,在此感谢原作者wnanbei。
由来:一直在用flora这款主题,碰巧看到原主题github上有人发了issue求黑色主题,下手改了一个。改完发现原主题有bug,也一并解决了。所以本主题可以放心使用。
相比原主题的变动:
flora文件夹
、flora-hans.css
以及flora-dark.css
复制到typora的主题文件夹下。在LeetCode上看到大神总结的01背包问题。
1 |
|
1 |
|
1 |
|
背包问题具备的特征:
给定一个target,target可以是数字也可以是字符串,再给定一个数组nums,nums中装的可能是数字,也可能是字符串,问:能否使用nums中的元素做各种排列组合得到target。
背包问题技巧:
1 |
|
1 |
|
1 |
|
想把自己刷题过程中一些,使用经典方法、思想的题记录下来。
1 |
|
1 |
|
1 |
|
自定义排序规则:
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
官方不推荐使用Stack类,推荐使用Deque
。
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
双端队列,控制每一端元素的进出,可以实现栈或者队列。
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
位运算后,需要重新赋值
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
折腾了一下自己的linux的shell,更换为oh-my-zsh,并更换主题,安装提示插件。
最终效果:
1 |
|
1 |
|
1 |
|
公司人员报告了获取任务列表为500的bug,但是我们测试数据却能正常返回。玄学?NO!NO!NO!
公司人员报告了一个bug,获取我们用户任务列表的接口数据时会出现500的异常。但是经过我们自己测试没有发现问题。
几天后,公司人员又发来了截图,表示获取任务列表又出现了500异常。并且测试过后发现只有userid
是6的才会出现500异常,其他userid
不会出现,并且userid
为6的用户调用这个接口,时而能够正常返回数据,时而又出现500bug。
经过查看项目log发现程序运行过程中出现了空指针异常。并且定位到相关的代码行。
1 |
|
(不要问为什么任务的变量名是user
,我也不知道。。。)小伙伴写这段代码时是通过获取到任务的finishTime
,再拿finishTime
减去createTime
。
初步猜想可能是新创建的任务没有finish,导致获取到的finishTime
为null
。因此引发空指针异常。
而当用户的任务完成时,finishTime
被填上,再获取任务列表时,又可以正常获取到数据。
又因为公司那边测试一直用的是同一个用户id(6),所以每次创建任务之后获取任务列表,显示是500.其他用户id并没有运行任务,所以表象是只有userid
为6的用户才会发生异常。
进一步查看log,佐证了自己的猜想。
log显示在查询用户列表之前,用户新创建了一个任务。
虽问题不是什么大问题,代码也不是自己写的,但有两点须引以为戒。
user
,让我在定位bug的时候,理解代码出现了偏差。所以变量命名规范,有助于对代码快速的理解,从而能够更快的定位bug。以docker方式启动tomcat+nginx。
新建tomcat文件夹,可以放入自己的应用。
1 |
|
拉取镜像,并建立开启容器(注意这里并不用开启8080端口映射):
1 |
|
查看容器ip:
1 |
|
假设这里查到的是172.17.0.3
首先服务器防火墙开启80端口:
1 |
|
新建nginx文件夹,并新建nginx.conf
1 |
|
填入nginx.conf
的内容,注意http->server->location->proxy_pass。修改为上一步查到的ip
。
注意:这里不能填入宿主机的ip。(因为tomcat默认并不是以host模式开启,而是以桥接模式开启)
1 |
|
拉取镜像,并建立开启容器:
1 |
|
将之前写的配置文件复制到容器中,并重启容器:
1 |
|
访问http://服务器ip/app
以docker方式启动以太坊私链,并部署Dapp。
首先查看主机防火墙是否开启,如果已开启,需要开放8545
端口,用于外界通过rpc方式访问私链。
查看防火墙状态:
1 |
|
开放方法:
1 |
|
在workspace下,新建/code/chain/mychain
文件夹,创建genesis.json
。
chainId:以太坊的链的id,可以自己随便取值,但是需要注意搭建私链时,这个值不能与以太坊主网或者是测试网的chainId相同。以太坊chainId查询
genesis.json:
1 |
|
1 |
|
1 |
|
参数说明:
-i
:打开STDIN,用于控制台交互,常与-t一起使用-t
:分配tty设备,支持终端登陆,默认为false,常与-i一起使用--network=host
:将容器的网络模式设置为host模式,即用宿主机的ip和端口进行外部通信-p 8545:8545
:将宿主机的8545端口映射到dockers容器的8545端口上--rm
:指定容器停止后自动删除容器(不支持以docker run -d启动的容器 )-v
:给容器挂载存储卷,挂载到容器的某个目录,这里讲本地的/workspace挂载到了容器的/workspace目录,用来在容器和宿主机之间共享文件--entrypoint
:覆盖image的入口点,ubuntu环境下docker默认入口点其实是/bin/bash,修改默认入口点是为了不让节点自动运行,稍后会对节点进行自定义配置使其成为私有链节点此后启动容器就可以,直接通过
1 |
|
经过上面的命令,此时命令行提示符已经转变。进入之前创建的/workspace/code/chain/mychain
文件夹下,初始化链json
1 |
|
启动私链,networkid
和rpcaddr
的设置方法同开发者模式。查看输出日志output.log
同上。
1 |
|
注意:搭建私链后一定要进行以下测试,看是否能够正常发起交易。
]]>以太坊每笔交易中都有InputData,本项目主要是识别合约交易中的InputData。
交易hash:0xb1c0abd217193ffe64f97caedad8fa6f0f9c0265967d2ab9fb782280c928fb47
需要将交易中的数据解码为上图中的数据。
to
地址和inputdata
。to
地址传入erherScan的api获得合约的abi。项目地址:https://github.com/HeXueZhi/DecodeInputData
整体通过webpack框架。
应用的包:package.json
文件中的dependencies
在infura注册一个key,替换代码中的key。(Infura提供免费的以太坊节点RPC API服务)
1 |
|
在etherscan注册apikey,替换代码中的。
如果不想注册删掉代码中的&apikey=填入etherscan的个人key
也可以,不过etherscan会添加每秒限制访问5次的限制。
1 |
|
在文件夹下执行:
1 |
|
在文件夹下执行:
1 |
|
访问http://localhost:8080
即可。
帮助老师撰写以太坊课程的实验指导书,因此需要设计一个基于以太坊私链的溯源Dapp项目。
项目源码:https://github.com/HeXueZhi/FoodTransportation
实验环境:
前面的文章有写如何搭建私链。
Dapp整体基于truffle,前端采用webpack打包。
合约编写以及编译采用remix(需要较好的网络环境),推荐使用老版本界面。remix入门
合约代码:
1 |
|
这一步需要完成合约的编译和测试。
win10系统中,安装node、truffle、ganache-cli。
执行truffle version
查看版本。
尤其需要注意solidity和web3的版本。版本不同语法支持也不同,所以安装时,尽量选择于上图中相差不多的版本。
新建Dapp/FoodTransportation文件夹
文件夹下执行:
1 |
|
此命令会下载truffle提供的官方示例,下载时间可能会有点长,耐心等待。下载完成后的提示以及目录结构如下图所示。
此示例项目的运行启动:留个坑。
修改truffle-config.js
为:
1 |
|
本文件夹下的powershell中执行:
1 |
|
删除contracts文件夹中的ConvertLib.sol
和MetaCoin.sol
文件,创建FoodTransportation.sol
合约文件,复制刚才编写的合约代码。
修改migrations文件夹中的2_deploy_contracts.js
文件。
注意:这里直接删除这个文件也无妨,因为本项目使用web3来部署合约,不需要使用truffle migrate
命令帮助部署合约。
1 |
|
powershell中执行truffle compile
命令。truffle中自带的solc-js会对合约进行编译。在Dapp文件夹下会出现build文件夹,存放编译形成的json文件。
在Dapp的app文件夹下粘贴写好的html文件,src目录下粘贴需要的js文件和css文件。
修改webpack-config.js
1 |
|
在app目录下执行:
1 |
|
进入http://localhost:8080
查看界面。注意:现在如果没有启动私链,页面由于没有获取到账户,会发出警告,启动私链,连接metamask刷新即可。
安装ganache-cli
1 |
|
执行ganache-cli
在谷歌浏览器中安装metamask插件,安装好后,先在metamask右上角选择localhost:8545网络,然后选择助记词恢复钱包账户。
然后在Dapp/app
执行npm run dev
,打开浏览器的http://localhost:8080/
按F12,查看console界面。
测试项目。
开启私链,如无账户,先创建账户personal.newAccount()
,输入密码。
开始挖矿。miner.start(1)
查看账户余额eth.getBalance(eth.accounts[0])
,为了保证能够发起合约部署等交易,需要一些ETH。
设置虚拟机防火墙,打开8545端口。CentOS设置防火墙
metamask连接CentOS的私链。需要新创建rpc网络。
http://192.168.2.151:8545
,ip填虚拟机ip就可以。genesis.json
中的chainid即可。切换至刚创建的网络,并导入账户。通过虚拟机私链文件夹下的keystore文件夹下的json文件导入到metamask即可。
导入账户之后刷新http://localhost:8080
,再点击metamask,就能够连接刚刚导入的账户了。
测试项目。
测试完成后执行miner.stop()
停止挖矿。
近期面试了几个后端岗位,记录一下面试得出的经验。
大体来说就是会照着简历上写的项目来进行提问。
首先,就是项目的总体框架,涉及到的技术栈。会对涉及到的知识进行提问。
其次,在项目中的具体工作,就是你负责了哪一部分。项目中遇到的困难,以及如何解决的。
最后,面试官问这些一个是测试你的技术掌握的深度,再一个就是看看你对技术的热情程度。所以需要在这个过程中体现出来自己对技术的热枕。
首先,要弄清楚面试官的需求。以及一些题目的要求。所以第一步是一定不要马上写代码!!!拿到题目要问清楚面试官的具体要求,然后把自己的具体思路讲述给面试官。思路得到面试官肯定后,再写代码。
其次,在写代码的过程中,一定要注意程序的鲁棒性。特别要考虑一些空值和边界值的情况
最后,面试官出的题目可能是连环题,在你写完代码之后,会问你写的程序的时间复杂度和空间复杂度。然后再问你优化方案。
首先一个明确你在项目中的工作,然后是技术难点和解决方案,也有可能是技术亮点。
这类问题回答过程中一定要体现自己对于技术的热情。
第一种就是单纯问你的基础知识,这方面理解的基础上记忆就好了。
第二种就比较复杂。面试官会结合具体的实际业务场景来对基础知识进行提问。这一块要求对知识的掌握程度更加深刻。
]]>找了学长内推了字节跳动懂车帝的后端岗位,这也是作者本人的第一次面试,有纪念意义,所以记录一下过程。
懂车帝后端主要用Go和python语言,因此相对来说就会少问一些java方面的知识。
面试的平台是在牛客网上,上来先做了一个简短的自我介绍,然后就直接开始问问题了。
首先,需要说明这是一个经典的问题,需要用蓄水池抽样算法。但是本人当时并不知道这个算法。因此想出了两个方案,但是面试官都说不对,因此最后在面试官的提示下需要回去看看蓄水池算法。
错误方法1:先获取链表的长度,然后取链表长度的随机数,再取相应随机数位置的数。
面试官说不能获取链表的长度。
错误方法2:先生成一个随机数,然后取随机数位置上的链表上的数。会出现两种情况,一种是数到相应的位置上有数,直接取。第二种情况,向后遍历链表直到链表尾,发现随机数大于链表长度,这时候用随机数对链表长度取余数。取余数位置上的数。
面试官说还是需要获取到链表的长度。WTF?向后遍历到链表的尾部的同时就能够记录到链表的长度的啊。
正确答案:蓄水池取水算法
前提:给定一个数据流,数据流长度N很大,且N直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出m个不重复的数据。(这里面试官没有说出来只能够遍历一次链表)
。本题面试官提出的是取一个数据,因此把m设置为1即可。
算法思路大致如下:
算法随机性的证明:
第i个数据最后能够留在蓄水池中的概率=第i个数据进入过蓄水池的概率*第i个数据不被替换的概率(第i+1到第N次处理数据都不会被替换)。
i<=m
时,数据直接放进蓄水池,所以第i个数据进入过蓄水池的概率=1。i>m
时,在[1,i]内选取随机数d,如果d<=m
,则使用第i个数据替换蓄水池中第d个数据,因此第i个数据进入蓄水池的概率=m/i。i<=m
时,程序从接收到第m+1
个数据时开始执行替换操作,第m+1
次处理会替换池中数据的为m/(m+1)
,会替换掉第i
个数据的概率为1/m
,则第m+1
次处理替换掉第i
个数据的概率为(m/(m+1))*(1/m)=1/(m+1)
,不被替换的概率为1-1/(m+1)=m/(m+1)
。依次,第m+2
次处理不替换掉第i个数据概率为(m+1)/(m+2)
…第N
次处理不替换掉第i个数据的概率为(N-1)/N
。所以,之后第i
个数据不被替换的概率=m/(m+1)*(m+1)/(m+2)*...*(N-1)/N=m/N
。(这里如果m==1,表示只取一个数据,因此概率为1/N)i>m
时,程序从接收到第i+1
个数据时开始有可能替换第i个数据。则参考上述第3点,之后第i个数据不被替换的概率=i/N。i<=m
时,第i个接收到的数据最后留在蓄水池中的概率=1*m/N=m/N
。结合第2点和第4点可知,当i>m
时,第i个接收到的数据留在蓄水池中的概率=m/i*i/N=m/N
。综上可知,每个数据最后被选中留在蓄水池中的概率为m/N。这个算法建立在统计学基础上,很巧妙地获得了"m/N"
这个概率。
0、1、1、2、3、5……
1 |
|
时间复杂度O(n)
空间复杂度O(n)
优化采用自底向下的动态规划算法。
1 |
|
这种算法需要空间空间复杂度为O(n),可以再优化为常数级别。
1 |
|
说起来惭愧,这是《剑指offer》上的原题,面试之前作者并没有读过,当时又非常紧张,没有写出来这道题。面完试感觉这道题是easy的。
内核态主要涉及到一些特权指令的操作。发生系统调用时会从用户态转移到内核态。
系统调用:
慢开始:指数增长就是将拥塞窗口cwnd设置为1,没经过一个RTT,cwnd加倍,指数增长。知道到达满开始门限阈值采用拥塞避免算法。
拥塞避免:线性zeng’zhang每经过一个RTT就增加一个MSS大小。知道出现第一次超时(网络拥塞),就将慢开始门限设置为此时拥塞窗口值的一半。然后把cwnd重置为1。执行慢开始算法。
快重传:当发送方接收到3个冗余ACK时,就认为确认的报文后面的报文段丢失了。并立即对缺失的报文段重传。
快恢复:就是发生冗余ACK时间时候,将慢开始门限设置为当前的一半,然后将cwnd设置慢开始门限值,开始拥塞避免算法。
第一次握手:客户机向服务器发送连接请求报文。
第二次握手:服务器的TCP收到连接请求报文之后,同意链接,向客户机发回确认,为TCP连接分配TCP缓存和变量。
第三次握手:客户机收到确认报文,向服务器发送确认报文为连接分配缓存和变量。
为什么不是两次?
防止客户端失效的连接请求报文段突然又传到服务器
例如以下情况如果使用两次握手:
如果采用三次握手的话:
这是作者本人的第一次面试,面试的时候很紧张。面试官出了编程题马上就上手去写,没有思考的过程,也没有去问具体的一些要求。导致越写越慌,到最后连斐波那契数列这样的基础题,也没有写出来。基础知识也很不牢靠,一些简单的问题,也没有答上来。
在面试后在网上找了一些《剑指offer》的资料,发现前几章很有帮助,其中比较重要的一点就是,拿到面试题先思考,不理解需求的问,想清楚了之后再具体的写代码。
一些面试题答案的参考文献:
https://www.jianshu.com/p/7a9ea6ece2af
]]>