MySql学习

表复制 # 不跨数据库 insert into subscriber_copy(id, username) select id, username from subscriber # 跨数据库 需要在表名前加上数据库名 insert into wdd.test(id, username) select id, username from opensips.subscriber 调整表结构 增加字段 ALTER TABLE test ADD `username` char(64) not null default '' 随机选择一个数据 SELECT name FROM table_name order by rand() limit 1

2019-07-16 21:15:53 · 1 min · Eddie Wang

无题 再读唐诗宋词

【少年】慈母手中线,游子身上衣【毕业】浔阳江头夜送客,枫叶荻花秋瑟瑟【实习】千呼万唤始出来,犹抱琵琶半遮面【工作加班】衣带渐宽终不悔,为伊消得人憔悴【同学结婚】昔别君未婚,儿女忽成行【表白】欲得周郎顾,时时误拂弦【恋爱】在天愿作比翼鸟,在地愿为连理枝【分手】别有幽愁暗恨生,此时无声胜有声【春节回家】近乡情更怯,不敢问来人【车站遇友】马上相逢无纸笔,凭君传语报平安【外婆去世】洛阳亲友如相问,一片冰心在玉壶【节后会沪】两岸猿声啼不住,动车已过万重山【情人节】天阶夜色凉如水,坐看牵牛织女星【重游南京】浮云一别后,流水十年间【秦淮灯会】云想衣裳花想容,春风拂槛露华浓

2019-07-15 21:20:08 · 1 min · Eddie Wang

从千与千寻谈编程风格

汤婆婆给千寻签订了契约,之后千寻的名字被抹去了,每个人都叫千寻小千,甚至千寻自己,也忘记了自己原来的名字。 但是只有白先生告诫千寻,一定要记住自己的名字,否则再也无法回到原来的世界。而白先生自己,就是那个已经无法回到原来世界的人。 最重要的是记住自己的名字 名字要有意义 不要使用缩写,缩写会让你忘记自己的原来的名字 没有工作的人,会变成妖怪的 没有用的变量,会变成垃圾 别吃得太胖,会被杀掉的 别占用太多内存,会被操作系统给杀掉的

2019-07-15 21:06:47 · 1 min · Eddie Wang

如何维护老代码?

Photo by Blair Fraser on Unsplash 从头开发一个软件只是小儿科,改进一个程序才显真本事。《若为自由故 自由软件之父理查德·斯托曼传》 每个人都有从零开发软件的处女情结,但是事实上我们大多数时候都在维护别人的代码。 所以,别人写的代码如何糟糕,你再抱怨也是无意义的。 从内心中问自己,你究竟是在抱怨别人,还是不敢面对自己脆弱的内心。 老代码的意义 廉颇老矣,尚能饭否。 老代码的有很多缺点,如难以维护,逻辑混乱。但是老代码有唯一的好处,就是老代码经过生产环境的洗礼。这至少能证明老代码能够稳定运行,不出问题。 东西,如果不出问题,就不要动它。 老代码可能存在哪些问题 老代码的问题,就是我们重构的点。首先我们要明确,老代码中有哪些问题。 模块性不强,重复代码太多 逻辑混乱,业务逻辑和框架逻辑混杂 注释混乱:特别要小心,很多老代码中的注释都可能不知道祖传多少代了。如果你要按着注释去理解,很可能南辕北辙,走火入魔。按照代码的执行去理解业务逻辑,而不是按照注释。 配置性的硬代码和业务逻辑混杂,这个是需要在后期抽离的 如果你无法理解,请勿重构 带着respect, 也带着质疑,阅读并理解老代码。取其精华,去其糟粕。如果你还不理解老代码,就别急着重构它,让子弹飞一会。 等自己能够理解老代码时,再去重构。我相信在理解基础上重构,会更快,也更安全。 不要大段改写,要见缝插针 不要在老代码中直接写自己的代码,应该使用函数。 在老代码中改动一行,调用自己写的函数。 几乎每种语言中都有函数这种组织代码的形式,通过见缝插针调用函数的方式。能够尽量减少老代码的改动,如果出现问题,也比较容易调试。

2019-07-15 20:10:13 · 1 min · Eddie Wang

1秒搭建静态文件服务器

基于python # 基于python2 python -m SimpleHTTPServer 8088 # 基于python3 python -m http.server 8088 基于Node.js https://github.com/zeit/serve https://github.com/http-party/http-server

2019-07-12 21:24:12 · 1 min · Eddie Wang

python request 库学习

上传文件 import requests headers = { "ssid":"1234" } files = {'file': open('yourfile.tar.gz', 'rb')} url="http://localhost:1345/fileUpload/" r = requests.post(url, files=files, headers=headers) print(r.status_code)

2019-07-12 11:21:23 · 1 min · Eddie Wang

编码规则

变量不要使用缩写,要见名知意。现代化的IDE都提供自动补全功能,即使是VIM, 也可以用ctrl+n, ctrl+p, ctrl+y, ctrl+e去自动补全。 变量名缩写真是灾难。

2019-07-09 09:49:33 · 1 min · Eddie Wang

Docker相关问题及解决方案

使用HTTP仓库 默认docker不允许使用HTTP的仓库,只允许HTTPS的仓库。如果你用http的仓库,可能会报如下的错误。 Get https://registry:5000/v1/_ping: http: server gave HTTP response to HTTPS client 解决方案是:配置insecure-registries使docker使用我们的http仓库。 在 /etc/docker/daemon.json 文件中添加 { "insecure-registries" : ["registry:5000", "harbor:5000"] } 重启docker service docker restart # 执行命令 docker info | grep insecure 应该可以看到不安全仓库 存储问题 有些docker的存储策略并未指定,在运行容器时,可能会报如下错误 /usr/bin/docker-current: Error response from daemon: error creating overlay mount to 解决方案: vim /etc/sysconfig/docker-storage DOCKER_STORAGE_OPTIONS="-s overlay" systemctl daemon-reload service docker restart

2019-07-08 11:59:59 · 1 min · Eddie Wang

Graphviz教程 你学废了吗?

语雀官方的Graphviz感觉太复杂,我还是写一个简单一点的吧。 两个圆一条线 注意 graph是用来标记无向图,里面只能用–,不能用->,否则无法显然出图片 digraph用来标记有向图,里面只用用-> 不能用–, 否则无法显然出图片 graph easy { a -- b; } 连线加个备注 graph easy{ a--b [label="你真漂亮"] } 你真漂亮,要大点,红色显眼点 graph easy{ a--b [label="你真漂亮", fontcolor=red, fontsize=34] } 两个圆,一个带有箭头的线 注意,这里用的digraph, 用来表示有向图 digraph easy { a -> b; } 如何画虚线呢? digraph easy { a -> b [style=dashed]; } 椭圆太单调了,有没有其他形状? shape box 矩形 polygon ellipse circle 圆形 point egg 蛋形 triangle 三角形 plaintext 使用文字 diamond 钻石型 trapezium 梯形 parallelogram 斜的长方形 house hexagon octagon doublecircle doubleoctagon tripleoctagon invtriangle invtrapezium invhouse Mdiamond Msquare Mcircle none record Mrecord ...

2019-06-27 08:59:47 · 4 min · Eddie Wang

如何学习网络协议?

如何学习网络协议? 大学时,学到网络协议的7层模型时,老师教了大家一个顺口溜:物数网传会表应。并说这是重点,年年必考,5分的题目摆在这里,你们爱背不背。 考试的时候,果然遇到这个问题,搜索枯肠,只能想到这7个字的第一个字,因为这5分,差点挂科。 后来工作面试,面试官也是很喜欢七层模型,三次握手之类的问题,但是遇到这些问题时,总是觉得很心虚。 1. 协议分层 四层网络协议模型中,应用层以下一般都是交给操作系统来处理。应用层对于四层模型来说,仅仅是冰山一角。海面下巨复杂的三层协议,都被操作系统给隐藏起来了,一般我们在页面上发起一个ajax请求,看见了network面板多了一个http请求,至于底层是如何实现的,我们并不关心。 应⽤层负责处理特定的应⽤程序细节。 运输层运输层主要为两台主机上的应⽤程序提供端到端的通信。 网络层处理理分组在⽹网络中的活动,例例如分组的选路 链路层处理理与电缆(或其他任何传输媒介)的物理理接⼝口细节 下面重点讲一下运输层和网络层 1.1. 运输层的两兄弟 运输层有两个比较重要的协议。tcp和udp。 大哥tcp是比较严谨认真、温柔体贴、慢热内向的协议,发出去的消息,总是一个一个认真检查,等待对方回复和确认,如果一段时间内,对方没有回复确认消息,还会再次发送消息,如果对方回复说你发的太快了,tcp还会体贴的把发送消息的速度降低。 弟弟udp则比较可爱呆萌、调皮好动、不负责任的协议。哥哥tcp所具有的特点,弟弟udp一个也没有。但是有的人说不清哪里好 但就是谁都替代不了,udp没有tcp那些复杂的校验和重传等复杂的步骤,所以它发送消息非常快,而且并不保证对方一定收到。如果对方收不到消息,那么udp就会呆萌的看着你,笑着对你说:我已经尽力了。一般语音而视频数据都是用udp协议传输的,因为音频或者视频卡了一下并不影响整体的质量,而对实时性的要求会更高。 1.2. 运输层和网络层的区别 运输层关注的是端到端层面,及End1到End2,忽略中间的任何点。 网络层关注两点之间的层面,即hop1如何到hop2,hop2如何到hop3 网络层并不保证消息可靠性,可靠性上层的传输层负责。TCP采用超时重传,分组确认的机制,保证消息不会丢失。 从下图tcp, udp, ip协议中,可以发现 传输层的tcp和udp都是有源端口和目的端口,但是没有ip字段 源ip和目的ip只在ip数据报中 理解各个协议,关键在于理解报文的各个字段的含义 1.3. ip和端口号的真正含义 上个章节讲到运输层和网络层的区别,其中端口号被封装在运输层,ip被封装到网络成, 那么端口号和ip地址到底有什么区别呢? ip用来用来标记主机的位置 端口号用来标记该数据应该被目标主机上的哪个应用程序去处理 1.4. 数据在协议栈的流动 封装与分用 当发送消息时,数据在向下传递时,经过不同层次的协议处理,打上各种头部信息 当接受消息时,数据在向上传递,通过不同的头部信息字段,才知道要交给上层的那个模块来处理。比如一个ip包,如果没有头部信息,那么这个消息究竟是交给tcp协议来处理,还是udp来处理,就不得而知了 2. 深入阅读,好书推荐 《http权威指南》 有人说这本书太厚,偷偷告诉你,其实这本书并厚,因为这本书的后面的30%部分都是附录,这本书的精华是前50%的部分 《图解http》、《图解tcp/ip》这两本图解的书,知识点讲的都是比较通俗易懂的,适合入门 《tcp/ip 详解 卷1》这本书,让你知其然,更知其所以然 《tcp/ip 基础》、《tcp/ip 路由技术》这两本书,会让你从不同角度思考协议 《精通wireshark》、《wireshark网络分析实战》如果你看了很多书,却从来没有试过网络抓包,那你只是懂纸上谈兵罢了。你永远无法理解tcp三次握手的怦然心动,与四次分手的刻骨铭心。

2019-01-18 21:32:08 · 1 min · Eddie Wang