假如访问一个HTTP接口,本来是POST的去到哪里变GET了,可以认为是redirect导致的,因为redirect都只能是GET,比如301
情况就是在HTTP访问,但是后台只希望HTTPS,就会发生301redirect
2021-01-1920:51:14
1.文件名带上pid
2.使用第三方管道链接吧rotatelogs
2021-01-0418:13:20:
头条中的thrift都是copy一份的,不知道为什么要深copy
#FAQs:#Q:为什么这里的base.thrift与service_rpc/idl/base.thrift不一致?#A:service_rpc/idl/base.thrift生成的C++代码是无法编译通过的。#TrafficEnv使用相同的字段类型和字段名,C++中有名字冲突;Client字段在fbthrift中是保留字。##Q:使用这里的base.thrift与service_rpc/idl/base.thrift是否兼容?#A:使用BinaryProtocol传输是完全兼容的,而你也不应该使用其他的Protocol。##Q:golang代码可以依赖这里的base.thrift吗?#A:可以,golang生成的代码大小写是依据golang的语法,而不是idl的定义。#但是基于kite和data/idl在路径约定方面的差异,可能你会碰到一些困难。##Q:python代码可以依赖这里的base.thrift吗?#A:可以。如果依赖了data/idl生成的python代码,后续要迁移到pie框架时需要注意字段名字的改变。#由于python不是编译执行的,这样的错误可能会发生在运行时。##Q:我的idl既要在C++中使用,又要在python/golang中使用,怎么办?#A:既提交到data/idl,又提交到service_rpc/idl。在两个库中,依赖各自的base.thrift。##Q:为什么要维护两份idl,不能统一吗?#A:如果你尝试过然后失败了,请把下面的计数器+1。#4ViewCode
2020-12-2818:34:09:
1.在cronjob命令中,&>/tmp/log是没用的,因为cronjob用的是/bin/sh这个shell,而这个命令是用在/bin/bash
2.在一些shell运行的后台命令中,我们应该重定向stdin(注意是stdin,不是stdout和stderr),因为怕这个进程开启一些子进程,然后这些子进程需要从terminal输入,这样就一直hang住了,所以需要加上
3.python的print是有buffer的,可以用python-u处理Forcethestdoutandstderrstreamstobeunbuffered.Thisoptionhasnoeffectonthestdinstream.
2020-08-0320:25:23:
IO多路服用,就是用来检测IO是否可操作的一种机制。
1.端口只有65535个,怎么维持百万的链接.fd可以有很多个(源ip,目的ip,源端口,目的端口,协议)
2.reactor/proactor
3.网络模型
1.epoll+多线程.(a&b)
a.read主线程,其他放去thread
b.每一个fd可读,直接放去thread
2.epollaccept+1:n网络模型.accept+8*thread。强CPU处理
3.epolln*accept+m*thread.强接入能力
4.所有的sockFD
1.listenfd->accept
2.clientfd->recv/send
2020-7-2320:41:15:
协程就是一个轻微的调度单位,他希望有异步的效率,和同步的写法。
客户端的同步异步:
1.同步:一个请求,一个相应。
2.异步:一个请求,两个请求。一个相应,两个相应。
服务器的同步与异步:
1.同步:经过epoll_wait知道哪些fd可读后,单线程处理。
2.异步:经过epoll_wait知道哪些fd可读后,多线程处理。这种方法麻烦,比如fd1正在处理,epoll又告诉了其他线程,fd1又有数据了,这样就多个线程共用一个fd的现象了.
同步的流程改成异步(提高效率):
1.commit
1.1:创建好fd(就是socket)
1.2:准备数据
1.3:send
1.4:加入去epoll监听(epoll_ctl),准备callback
2.callback:需要另外一个线程支持,相当于回调接口
2.1:epoll_wait()
3.create_context()
4.destroy_context()
异步的会了,协程的写法是,放去epoll监听后,不要马上结束了,想同步得到数据,这样写起来舒服
所以需要:
1.yiled
2.resume
怎么实现
1.setJump/longJump
2.uContext
3.自己实现,汇编操作
线程怎么调度,以X86为例子,有15个寄存器,一个running的线程,save好所有寄存器,然后其他线程的,load去现在的cpu
yeild到epoll_wait中
resume到一个协程
AIO异步IO和IO异步操作的区别
1.他们没可比性,AIO不是一个操作。IO异步操作就是服务器的异步操作。
2.AIO,内核提供的一种,在内核态里面,假如IO有数据了,(io_setup)回调用户态的东西。
3.思考题:为什么有了AIO,服务器编程还是不用呢?因为它是内核态阻塞的
2020-07-1711:20:14:
nginx顶在前面意味着对于后端python来说是低并发高频率的请求
2.并发连接数:某个时刻服务器最大并发
3.并发用户数:注意,一个用户可能很多个连接
top,htop命令中的
1.VIRT:虚拟内存大小
2.RES:常驻内存大小
3.SHR:共享内存大小
阻塞IO:发起一个recvfrom,内核会挂起直到有数据得到。
非阻塞IO:发起一个recvfrom,如果没有数据就会返回EWOULDBLOCK状态码,应用要一直读。
IO复用模型:如果用第一种,N个请求需要N的线程一直询问。浪费太多线程了,然后这种用select(一个线程去询问),有数据后callback原来的线程(或者有数据后再起一个线程去跑)(起可以是用线程池的,不需要真的起)。
信号驱动IO模型:select还是在应用层轮询,现在这个交给内核做。内核返回可读了给应用线程。
异步IO:这个内核有数据,直接复制好数据,然后通知应用线程。
同步和异步永远都是一个宏观的概念,阻塞非阻塞是微观的,就是细节化是不是应该一直等待
1.同步阻塞,就是requests
2.同步非阻塞,就是request一个task,然后一直轮询这个task
3.异步没有阻塞
4.异步非阻塞,就是有结果,他们再来一个callback
为什么多线程访问同一个变量需要加锁?
因为有高速缓存这个东西,内存相对于cpu来说太慢了,所以cpu会把值读入cpu的高速缓存,然后来操作,最后再覆盖原来那个值。所以就会出现冲突。
解决方法1:
cpu总线锁,锁住cpu去那块内存拿值。但是上面的方式会有一个问题,由于在锁住总线期间,其他CPU无法访问内存,导致效率低下。
解决方法2:
内存一致性协议,比如我写下去了,然后就标志一个位置说明他是写过了,以后别人读或者写都要重新load之类的。
我们需要保证的是:
有序性:
有指令重排序风险
线程1:
isTrue=True
线程2:
whileisTrue:
do。。。
这样是不安全的,可能有先while,后赋值的风险。
需要用lock来保证。
可见性:
用volatile修饰的东西,马上会写进去主存,就是没有了高速缓存这个概念了。
原子性:
2020-04-2918:34:41:
ddif=/dev/urandomof=1GB.binbs=4Giflag=fullblock
2020-04-2514:26:29:
py
decode和encode不同:
>>>b=b"\347\262\244AB223\350\257\225">>>b.decode("utf-8")'粤AB223试'>>>b.decode("utf-8").encode("utf-8")b'\xe7\xb2\xa4AB223\xe8\xaf\x95'
2020-04-1423:30:41:
在netstat-apn|grep-i3000如果出现下面情况,其实是只有247那个是本机的,下面那个是其他container的,只是通过某个东西链接起来了。
tcp000.0.0.0:30000.0.0.0:*LISTEN247/nctcp000.0.0.0:30000.0.0.0:*LISTEN-
2020-04-1411:23:55:
1.dockerrun--rmbusyboxnslookuparchive.ubuntu.com100.100.2.136
2.在本机中:nslookuparchive.ubuntu.com是可以的。
2020-04-1322:54:02:
HTTP要做到安全,两条路:
1、加密通讯隧道本身
这种就是SSL
1.1:相当于是有身份证
2、加密通讯信息:
2.1:这个做法是防止不了篡改的。
2.1.1:无法确定请求的目标主机,是否真的是那台,不然就可能是肉鸡。
2.1.2:无法确定返回请求的是否真实的客户端,这样就可能是假的客户端。(配合肉鸡,使得服务器也发现不了。
总结就是无法确认通信的双方。
2020-04-0420:10:18:
比如设计一个汽车:
汽车--》车身(就是车的framework)--》底盘(bottom)--》轮胎(wheel)
如果这样设计,car=newCar()
如果我需要改变轮胎大小呢?就需要car=newCar(wheel_size=20),然后不断传递下去。。。就会经历很多层。这个做法叫做下层控制上层。
怎么处理呢?
1.其实是newCar的时候,需要传入更多的参数,就是用DI的思想。
size=40wheel=newWheel(40)bottom=newBottom(wheel)framework=newFramework(bottom)car=newCar(framework)这样更改大小,就需要更改wheel类而已。
2.当然还可以用getter、setter
IOCcontainer:就是把上面new的过程,用xml写好,后面写文件直接生成。这样后面的人写代码的时候,不需要知道这个service具体是怎么创建的,只需要知道他的config就ok了。
2020-03-3100:54:25:
1、gomodinitgithub.com/vinsia/fly
2、using./script/setup.sh
2020-03-3016:11:51:
1、std::unique_ptr解决的问题就是防止两个地方指向同一个内存,然后主动析构就GG了,如果不析构,内存又一直在。std::unique_ptr禁止使用=符号,每次移动都要用std::move,然后原来那个就失败了。
2、std::shared_ptr就是用引用计数然后释放内存。
3、
拷贝构造函数
Person(constPerson&p)=delete;
2020-03-2912:03:57:
2020-03-2801:58:41:
如果某个网站有些按钮登陆不上,比如google登陆账号登陆不上,按next没反应。
可以试试关掉vpn,改变dns。
2020-03-0817:39:53:
ulimit-a
1.系统设置的最大fd数量会影响并发数。
4.确认长连接:
2020-02-2623:01:16:
1.选项-c用来告诉编译器编译源代码但不要执行链接,输出结果为对象文件。输出为:xx.o
2.g++--std=c++11main.cpp-omain得到的就是main一个可执行文件,如果不加-o,得到的就是a.out这个可执行文件。
3.所谓静态编译,就是将xx.a和目标文件一起连接打入到可执行文件中。使用ar工具,可以编译出静态库。
静态编译的弊端:
1.文件大。银盘要的大
2.全量更新。
2020-02-2617:51:30:
查看一个函数是否协程:
importinspect
ifinspect.isgeneratorfunction(func):
2020-02-1311:55:26:
59.43是CN2路线
2020-02-1221:34:01:
DHCP(动态主机配置协议):
2020-02-1216:50:35:
2020-2-922:57:41:
1、HTTP的TCP的连接什么时候会断开?HTTP1.0默认对开,服务器可以设置connection:keep-alive,初始化连接+ssl开销消失了,证明是同一个TCP连接。HTTP1.1默认开启,除非header中明确connection:close.
2、一个TCP连接可以对应多少个HTTP请求?多个。
3、单个TCP连接可以同时发送多少个请求呢?HTTP1.1中只能一个。一个request一个response,虽然有piplining试图解决(发送多个,不等待返回,服务器按顺序返回),但是浏览器关闭的。因为有很多问题:
3.1、proxy不能正确处理。
3.2、正确的流水线实现是复杂的。
但是HTTP2.0提供了multiplexing,可以做到。
5、浏览器对同一个host建立的TCP连接,有没有限制。chrome限制6个。
6、返回的HTML里面的图片是怎么下载的,什么协议,什么顺序,建立了多少连接。
2020-02-0519:05:59:
1、单例模式,globalstate。
2、太多静态方法。Thiscannotbeoverwritten.
4、doingworkintheconstructorisbad,因为他不能重写
2020-01-2113:36:42:
访问网站时:
2020-01-1814:20:29:
1、timeout
2、retry
3、exception
4、logging.
5、modulecommunication
2020-01-1621:20:23:
1、statelessor原子。尽量不要改class的静态成员。
2、操作数据库onebyone。如果需要一次更改很多个东西的,考虑抽成一张表。
3、操作exception的时候慎重。
2020-01-0411:37:38:
2、
2020-01-0214:59:21:
1>/proc/1/fd/12>&1
可以解释为stdout输出去了/proc/1/fd/1文件,stderr紧随其后给了stdout
但是:2>&11>/proc/1/fd/1是不行的。
因为1>/proc/1/fd/1是把标准输出搞去文件哪里了。`2>&1`相当于复制了标准输出的行为,但是这个时候标准输出还是在终端,没有拷贝到。先改(\)后复制(\\)。而不是,先复制(/),后改(/\)
tricket方法:
1、&>/proc/1/fd/1,就是把stdout和stderr都搞去哪里了,就不用管顺序。
2、2>&11>&/proc/1/fd/1,其实也是,为什么不加&呢。这样也不用官顺序。
2019-12-3120:24:38:
2、过程:
HTTPS=HTTP+认证+加密+完整性保护。
公开秘钥:就是一个公钥,一个私钥的。
共享秘钥:就是一个token
3、HTTPS其实和SSH差一步,就是SSH给过来的公开秘钥,我怎么证明他是真的是他呢?不然又会有中间人劫持了,这一步就是认证,公开秘钥是解决了通信加密问题。怎么认证呢,用证书。
步骤就是:(首先对于域名做的证书,应该是全球唯一的
1、我自签一个证书给这个域名。
2、chrome是会调用系统的证书的,我安装这个软件的时候,安装这个证书。
这样访问global:zhihu.com-->my:zhihu.com,chrome还是不会报错。
这叫劫持根证书。
客户端就没必要SSLL:
1、每个客户端就用不同证书的,麻烦+不是人人都会。
2、如果我拿到这个证书,那就无敌了。(图解HTTPP159)
2019-12-2511:19:26:
1.使用adduser,不要用useradd
3.添加用户去sudo组。usermod-aGsudovimi
2.更改密码
2.1在当前用户下使用passwd更改密码,需要输入原来密码。
2.2在当前用户下使用sudopasswdvimi更改密码,不需要输入原来密码。
2.3在root用户下使用passwdvimi更改密码,直接输入新密码。
2019-12-2415:25:34:
linux希望多进程,进程间通信。
1、很多工具需要用多进程,比较编译,但是windows对于多进程支持十分不好。
UbuntuLinux:耗时0.8秒
Windows7:耗时79.8秒
2、服务器,某些服务器框架依靠大量创建进程来干活,甚至是对每个用户请求就创建一个进程。
3、现在的多核心,如果多线程,线程之间的数据共享。资源必须从一个核心搬去另一个,这里消耗了。
2019-12-2210:57:10:
操作系统为什么要有用户态和内核态:
答案是为了安全,计算机就五个基本组成模块,输入设备、输出设备,计算器,控制器,存取器。
其中只有存取器是有状态而言,其他都是直接读取存取器拿值然后工作的,所以能改变存取器就是可以改变计算机的运行状态。这个东西不能随便让人改。
进入内核态的条件:
1、系统调用。
2、中断。
3、异常。
2019-12-2202:07:14:
1.1、省了进入内核态,但是进入内核态一般是200ns,线程的上下文切换是3-5us,所以上下文切换还是大头。对于无栈,就没有上下文切换,对于有栈,还是有协程的上下文切换的。
1.2、golang的协程上下文切换,仅需120ns,比进入内核态还低。详情见上面连接。是普通线程切换的1/30,因为协程需要的栈才2KB,但是线程需要的会去到10MB,why?
2、把异步的逻辑同步化。
协程:
无栈:(async,await)
这种是完全是用户态调度,需要一协全协,对于老代码,根本上就是重构。但是无须存储上下文,所以不需要栈,减少消耗。(yield出去的时候相当于在哪里变成调用其他函数)
有栈:(golang)
比线程开销少(TODO:WHY)。
有栈协成还分为用户调度,还是语言上就有了调度器(golang)
1、如果语言上有了调度器,用起来就和线程差不多。这样就是异步的操作了,怎么写成同步化呢?用channel通信就可以。
2、如果没,用起来就和async,await一样。还是要自己yeild,这是何苦呢,就是省了进入内核态?
很多服务都是:
1、高并发。
2、重IO,mysql和redis,或者network
3、低计算。
4、需要延迟低。每个用户处理耗时越短越好,经常是ms级别的
没有协程之前,就用异步非阻塞+callback来实现高并发。但是这种对于开发人员非常不友好。
2019-12-0310:47:45:
RLock只是说单个线程可以重复拿锁,其他和lock没其他不同
2019-12-0220:06:36:
是所有logs都是放去stderr的。
dockerlogs-f默认输出到标准错误,然后用管道+grep是不行的,因为管道默认是拿程序的标准输出作为自己的标准输入。
可以这样,dockerlogs-fvc-server2>&1|grep-i-E'insert'
2019-11-2917:21:34:
定时器实现方案:
2、用py的timer,每个都开一个线程,怎么控制关闭和线程池呢。
3、schedule配合BoundedSemaphore
2019-11-2816:31:02:
如果要上传一些数据给别人的服务,那么我们要怎么设计。
3、最差的设计,设置一个新的服务,在原有的数据服务中,有更新就post过去新的服务。因为本来的服务不应该知道有其他服务的存在。又不是新的微服务。这样设计耦合太大了。
but第一和第二的设计写起来没第三种方便。实时性应该也没那么好,也耗cpu?其实web服务怎么知道请求来了呢,中断?
其实第一第二种也不是实时性没那么好,是微服务设置错了,应该做成推送的形式,而不是轮训。比如comet延迟回答(但是需要占用一个handler,websocket不用?)
2019-11-2521:42:41:
2019-11-2221:49:18:
1、互斥
2、可重入(同一个线程可以多次得到这个锁),这个用+1,-1
3、锁超时
4、高效,高可用。
5、支持阻塞,非阻塞
6、支持公平、非公平。
2019-11-2100:18:22:
步骤是:
slam:
1.客户端访问server,server重定向去idp。
2.客户端去新页面填写用户密码,按一下会去idp得到token,然后其实在新页面会带着一个token访问server。这个时候server又叫你redirect回去一开始的页面。
bug1,app端不能够这样做,因为app离开程序,去了自带流浪器里面,
虽然POST的url可以拉起应用,但是手机应用无法解析POST的内容,我们也就无法读取SAMLToken
这个时候只能写一个inapp的页面嵌套了。
sso:
1.客户端访问server,server重定向去idp
2.客户端去新页面填写密码,得到code,然后redirect回去client。因为是code,所以可以redirect。
3.客户端再去server根据code拿token,server会给他assess_token和refresh_token.
4.后面客户端就可以搞事情了。
因为是code,解决了app的问题。就是redirect的时候,那个url的schema可以自己定义,手机可以解析到那段url。
3.1、认证:验证你是否是合法用户。
2019-11-1322:04:57:
1、mysql如果一次锁多行,并不是原子的。所以如果有两个事物一起进入锁多行,就会GG。所以在design的时候不能不能让后台updatelist。要设计好,让粒度改成单个。粒度只能是单个。delete和like不知道,反正selectlistforupdate有bug。
2、user_tag设计,要设计去另外一个表,然后user表存这个表的id:如果直接存在user表,有问题,
2.1怎么判重,要先把所有user_tag选出来,还要锁表,不然的话请求1过来判断不存在,请求2也判断不存在,然后在同一个用户add了两个相同的tagname了。
2.2如果新开一个表,就直接判,不用加锁。。不过要在tag_name加上UniqueKey
3、mysql什么时候用forupdate:
3.1好像如果是直接updateUsersetname='vimi'whereid=input_id这种,select出来无须forupdate吧,而且他根本不需要select啊。
2019-11-1218:01:25:
前端get请求传数组:
1、a=1,2,3这种后台难处理。前端容易。
2、a=1&a=2&a=3,据说后台天然能适应。(这个还是有点看语言)
3、protobuf,最好拉。
2019-11-0915:51:46:
mysql改了时区,需要重新连接。也就是要重启server.
所以,假如mysql有时区。
这是因为,mysql拿的结果本来就是CST,然后给这个timestamp前端,前端又转了一次。所以+8.
2、mysql改了时区,重新链接,新写进去的还是utc,用了datetime.datetime.utcfromtimestamp(),然后再根据mysql里面的时区,再转了一下。相当于UTC再减去了8
这个和mysqldump出来的数据不同,mysqldump出来的数据是不带时区的,再restorage也是不带时区的,因为在dump出来的文件里面已经提前设置好了time_zone是00:00的。
mysqldump可以设置不用UTC,默认都是用UTC的。--skip-tz-utc
3、time_update有点问题,用了server_default,func.now(),用的应该是中国时区。
4、mysqldump有点厉害,没改时区前的数据,他会正确根据以前的时区转回去UTC,改了的那些,他也会根据改了的时区,转回去UTC。注意time_update,搞不懂。又没事了
2019-11-0409:49:19:
mockinfrontend
asyncgetVehicleUsage(){constsleep=(second)=>newPromise((resolve,reject)=>{setTimeout(()=>{resolve(newVehicleUsages());},second);});constresponse=awaitsleep(2000);returnawaitresponse;}
2019-11-0301:06:11:
过程:
1、服务器证明自己是可靠的。其实这个是建立链接的时候,服务器要给一个公开秘钥我们,但是怎么证明这个公开秘钥是对的呢,就是怎么证明这个公开秘钥就是那个服务器的,就需要证书认证。同理客户端给服务器的。图解HTTPP156
1.1服务器告诉客户端我是xxx(比如s1是我的师傅)
1.2客户端找到s1并且确认,就认为服务器可靠。
1.3如果s1说不认识,那么就去找s1的师傅s2,一直找到root,只要有一个能证明服务器是正确的,就可以信任。
这些s1和s1的师傅s2是什么呢,就是权威机构的公开秘钥,怎么找到呢,一般植入浏览器,为什么要植入呢,因为如果你通过网路传输,又陷入死循环,就是我怎么证明他是权威的呢。没有被黑客入侵呢。p156
2、信任后,得到
2019-10-2723:54:14:
同步、异步:说的是后台方面的,异步相当于带提醒功能的水壶,同步不带。
阻塞、非阻塞:说的是客户端方面的,选择等待水开,还是水开提醒你(就算是同步的后台,也可以用非租塞,定时去看就行了)
Java三种IO模型:
BIO:同步阻塞IO
NIO:同步非阻塞IO
AIO:异步非阻塞IO
2019-10-2213:22:48:【TODO】
时区,都是应用层面上的东西,后台mysql肯定要存一个无时区的东西,backend应用也不应该有时区这个概念,应该相信app给你的肯定是UTC,就按UTC存。不然的话,前端给你一个timestamp,后台一转成date对象(date对象方便用)就GG了,因为转的时候又会根据你的时区+-8,前端应该清楚考虑时区问题。
2019-10-2123:14:26:
1、bridge模式,普通的一种模式。在docker0中分配一个子网给container,vethpair,一端放去container里面,一端放去主机中,实现通信。docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables-tnat-vnL查看。
2、host模式,直接和eth0共用网段。不生成多余的网卡。
3、container模式,容器bjoin去容器a,他们两个通过lo网卡通信,也是生成一个vethpair。
4、none模式,什么都没有的模式。container里面没有网卡、ip、路由等信息,需要自己配置,适合用来做离线任务。
5、
2019-10-1516:28:55:
改东西需要先加proto,等两边合完了,再做需求。不然的话有个问题:
1、先不考虑用很旧很旧的binary的问题。
2、可能用了release,然后后台上了,还是用了旧的release,就会解析不成功。因为这个时候binary已经定死了的。
思考:
1、兼容?如果别人用旧的binary中,proto不对,也可以兼容。这样的话是可以的。【现在是因为text_format没有设置ignore_unknown_field.
2、fail了他,这个应该比较好,提示用户应该怎么改。
2019-10-1211:10:02:
关于前端验证,见下文。
思考:如果一个应用依赖的服务突然不行了,debug方法:
1、ping那个服务,看看是否能ping通。
1.1如果没有显示ip,证明本地的dns服务都不行了,是本地的问题。这个时候,不能断定应用出bug,因为可能应用像浏览器一样cache了,所以可能应用正常的。
1.2如果有ip,但是ping不通,那是服务的问题,但是还是不能证明本地没问题,因为可能应用cache了一个旧的ip,一直访问他,
1.3如果能ping通,就是本地应用问题了。可能cache了ip
2019-10-0915:13:30:
protobuf定义的时候不要使用复数,因为转去其他语言的时候是不确定的,有可能是xxxList的(比如js),那就回usersList.
2019-10-0913:49:43:
一开始从db找出所有active的东西,返回第一个active的并且更改为assign,那肯定不希望锁全部啊。所以第一次select不会锁。
希望的是for一次,然后重新select,这个时候forupdate,看看那个东西是不是还是active,如果还是active的,就是他了,更改他。
但是这个是有bug的,因为在第三种模式,可重复读下,再次select,其实结果是一样的。需要先commit上一个事务。在python里面就是Database.refresh(xxx,with_for_update=True)
错了,即使在第三种模式下,select*forupdate还是会读到最新的。
2019-10-0913:48:034:
curl-I只是读取头部
2019-10-0819:00:56:
mainService{LoginService;InitService;MessageService;}主service中有很多sub-service的问题,问题是如果每个sub-service都是自己管自己,这样他们就不能和其他service通信。和调用。解决方法:
1、使用context,在主service上有一个全局的context
2、sub-service应该是有inputoutput并且stateless,【比较推荐】
3、context的话有个问题,就是怎么和mainServiceTwo通信,这个时候需要用接口。
2019-10-0818:30:25:
找出文件行数>=300的find.-iname"*"|xargswc-l*.py|awk'$1>=300{print$1,$2,NR}'|grep-vwc
2019-09-3015:58:44:
2019-09-2922:06:57:
其实就是语言层面上支持了kfaka做的东西。
不要随便定义type,iferr==typeA,这样会麻烦会造成循环引用。。应用判断他是什么属性,而不是判断他是否什么。。。iferr.isTypeA()
2019-09-2911:18:15:
是这样的null是一个valueundefined的意思是没有value
js主要是要处理后端数据后端数据里面的null在前端就是一个value为了和自己的没有value做区分所以发明了这个东西
bug:
比如后端要求你给我post,{a:any,b:any}我就给你返回{a:value,b:value},{a:any}我就给你返回{a:value}
2019-09-2909:29:42:
2019-09-2616:13:23:
坑:需要默认显示用户已经输入的东西,就需要有inputValue={previous}等,然后这样的话,每个change都要render一次,不然用户的那个对象还是哪里,前端就一直显示不变。
2019-08-2614:04:28:
同源定义:需要协议+域名+端口号相同
跨域都是流浪器帮忙的限制,后台需要加上,好像还需要加上vary:Origin.
Access-order-allow:*好像已经被禁止了,说这样太多了。
流浪器上确实需要限制跨域请求。原因有二:
1、从DOM角度说,用了iframe去调用了其他网站的页面,如果没限制,就可以控制它的DOM,然后用户输入密码的时候,就可以get到了。Document.getElementById之类的。
2、从cookies角度说,流浪器会自动帮我们发送cookies的,那么访问A网站后有了cookies,再访问B网站,难道发送A网站的cookies过去?B网站随便做一层转去A网站,就相当于你访问了A网站.
注意,所有的这些东西,都是流浪器搞得,直接用curl是没问题的。
2019-08-2217:36:58:
newDate(1568822212221)WedSep18201923:56:52GMT+0800(ChinaStandardTime){}ms:13位。
2019-08-1723:47:39:
在proto里面的字段
发送有,解析没有的都是可以的,是可以理解的,因为是根据名字的id来判断的。不要随便改id。
要验证的话,不能单单反序列化出来可以了就行,需要序列化,看看能不能。
optaional:1、发送有,解析没有:可以的。2、发送没,解析有:可以的,只是没有哪一列的值。required:1、发送有,解析没有:可以的,就是没有了那个required哪行。2、发送没,解析有:不行,required的不必须有。
2019-08-1415:01:47:
不能依赖前端做URL校验吧,需求是在前端就判断这个东西在不在本地的storageserver上面,因为apiserver只有一个,所以如果把这个url放去apiserver上面验证,就不知道是广州还是北京的请求,从而无法校验。
所以思路就是在前端判断嘛,因为前端的dnsserver解析到的肯定是本地的路径。但是有如下三个问题:
1、前端流浪器dns缓存?比如我北京的人,来了广州出差,以前访问的网站会不会已经被流浪器缓存着了,所以这个时候检验就失败了。(广州的用了北京的校验)
(上面那个是不会的,1、关闭流浪器,cache就消失。2、同事一去到广州连接上网咯,路由表就会被更新,dns服务器配置也会被更新)
2、linux里面的dns服务器被改了,这个时候同理。(这个是有可能的)
3、其他服务的dns被改了,去了其他地方下载(虽然这个东西有点少出现)
2019-08-1000:27:58:
写alembic的时候不能使用orm,因为这样和model层就强绑定了,或者你不要全部列都select出来,不然以后别人加多一列(应该是你这个orm用了一些列,但是这些列被delete了,特别是那些xxx_old那些临时咧),这个alembic直接跑不了。
2019-08-0412:44:24:(系统会主动告诉你的)
2019-08-0214:44:02:
2019-08-0213:48:40:
写东西需要兼容,比如proto的cache,如果proto格式改了怎么办?trycatch,不符合也不能蹦。
2019-07-2922:34:54:
HTTP一个从1.0---2.0的过程其实是越来越二进制化了,HTTP2.0的头部都是用bitstring
2019-07-2922:32:35:
有时候dockerfile里面创建文件夹不能带有'%'或者其他字符,或者不能使用`source~/.zshrc`,那是因为dockerfile里面默认使用'/bin/sh',可以使用RUN["/bin/bash","-c","mkdir-paaa/ttt/222%aaa"]来代替
但是还是创建不了带有%的,然后试过创建一个假的,然后mv成带有%的,还是不行。。。结果是把它改成用ln软链接过去改名,就ok了。
2019-07-2619:57:10:
sharelock:锁行的,保证读正确select...forshare
exclusivelock:锁行的,保证写和删正确。TODO(新增怎么保证?新增算不存在的行,怎么锁)select...forupdate.
②、记录锁,RecordLocks:这个是用来锁索引的,官方说防止别人更改了那一个值(selectwhereid=xxxx),才出现的。注意的是:假如那个东西不存在索引,官方有一个默认索引给他。让他锁着。
③、gaplocks,就是一个范围锁,别人用了selectbetween10..20,不让别人插入。如果有uniqueindex,就不用gaplocks
④、Next-KeyLocks,recordlock+gaplock,把数据库的东西连成一段一段来锁。
⑤、InsertIntentionLocks,插入意向锁,用来两个事务同时插入,但是只要主键不冲突就可以插入的。
⑥、AUTO-INCLocks,这个是一个表锁,所以这样插入数据会使得表锁了。
2019-07-2520:16:17:
创建子进程要为他创建一个特别的pgid,这样就可以删除这个子进程的时候,把所有他可能生成出来的进程也杀掉,就不会有孤儿进程了。
2019-07-2417:50:01:
如果新加功能,参数不搞默认值,就很容易有坑了。。xxxcannotbenull.
2019-07-2319:50:10:
>selecttrip_idfromdetailwheretask_type='UPLOAD'andhost='data-uploader-letianyungu-001'limit1;这样不行的?因为用了单引号,以后和cpp统一,能用双引号的就用双引号
2019-07-1516:27:28:不要使用email作为判断用户的标识,因为这样在设计URL的时候很麻烦。因为restful是这样设计,但是url上不能有@,(虽然有也是可以但是不推荐),所以这样就gg了。
1、proxychains
sudoapt-getinstallproxychains
sudovim/etc/proxychains.conf
docker的COPY./app/tmp/然后去到里面是/tmp/....里面都是app下面的内容
linux的cp./app/tmp/去到里面就是/tmp/app
前端的
letvalueofarr,只能用在arr,不能用object,然后取出的是arr元素的值。不是idx
setTimeout后来发现setTimeout的第一个参数必须是需要编译的代码或者是一个函数方法,而如果直接传入一行可执行代码,那么抱歉,这里会立即执行,没有延迟效果。
4、数据库表如果用了user_id的,另外一个blog表不要用user_id,因为要很多都是根据username,userid不外放,每次查来查去,直接用username
5、js中的print()是打印的意思。
6、mysql中的mysqldump,会把原来的sql文件中有
`comment`textNOTNULLDEFAULT'',他导出来,后面的DEFAULT就会不见了的。
8、js中的每一个文件可以有一个exportdefaultxxx=()=>{},导入可以直接importxxxfrom'yyy.js'
其他的只能用exportconstxxx=()=>{},只能用这个箭头函数,导入需要import{xxx}from'yyy.js'
const和default不冲突
9、主动关闭的时候,自己出现Time_wait,会自己消失
所以过程是这样:
客户端发起关闭tcp
服务器发送关闭tcp
10、js生成随机数用这个window.crypto.getrandomvalues
11、写前端的定时器的话,要记得如果有其他界面铺在上面了,是不是考虑取消一下定时器。或者不做事情
12、materialui如果不能scroll,可以试试fullwidth后,也可以试试display:grid
13、mysql中表、字段都可以有字符集,而且target这些默认变量名就不能做字段名,不然desc不了这个table,还有mysql-client的时候也需要设置字符集去读取。--default-character-set=utf8
14、showCREATETABLEUser
15、Python3中使用mysql-db,
①、pip3install--upgradesteuptools
②、sudoapt-getinstalllibmysqlclient-dev
③、pip3installmysqlclient
16、又一次,mysql用不了中文的话,其实是链接的时候那个url没写charset=utf8
17、mysql终端输入不了中文的话,其实是那个环境变量没设置好,locale-LANG=C.UTF-8
18、python可以用[].extend()来添加一个list
19、js中,如果有定时任务,每次去fetch一下请求的,记得记得带上responseid
function()
requestSeq+=1
constseq=requestSeq;
//api....doing....
if(responseSeq>seq)return;
responseSeq=seq;
20、暴露一个redis的connection,还要想到如果没连接上,那怎么办。可以考虑用get_set函数
21、
22、sqlalchemy,事物级别:可重复读
session中,add了的,没commit,进程结束后没写入数据库
session中,同一个事物,add后,可以query出来
session中,可以query出来localhost链接insert的东西
session中,一定是commit才能结束一个事物,但是close的话,对象的方法都会用不了的。
1、想要删除联想的路径,可以移动到那个东西,然后shift+delete.
2、chrome://extensions/shortcuts这里可以更改chromeextensions的快捷键。
24、zshrc中的东西,如果你写路径是这样的file_path='~/aaa/vimi',然后拼接路径new_path=${file_path}/new_path,这样cd${new_path}是不行的,正确应该file_path=~/aaaa/vimi,不加引号。
tcp000.0.0.0:30000.0.0.0:*LISTEN247/nctcp000.0.0.0:30000.0.0.0:*LISTEN-但是上面的方式会有一个问题,由于在锁住总线期间,其他CPU无法访问内存,导致效率低下。