debian ubuntu ca

“debian ubuntu ca” https://www.jianshu.com/p/abcee3270e9a mkdir /usr/share/ca-certificates/extra cp /tmp/$1.crt /usr/share/ca-certificates/extra/$1.crt update-ca-certificates 直白的说,运行这个工具,它最终会更新 /etc/ssl/certs/ca-certificates.crt 文件。这下你应该明白了,有了这个文件,不管是 Curl 还是 openssl 在发送 HTTPS 请求的时候,都可以校验 HTTPS 网站的真实身份了。 具体执行步骤如下: 读取 /etc/ca-certificates.conf 文件,包含的内容就是所有 /usr/share/ca-certificates/mozilla/ 目录下的证书文件名。 将 /etc/ca-certificates.conf 文件对应的所有证书合并到 /etc/ssl/certs/ca-certificates.crt 文件中。 作者: 虞大胆的叽叽喳喳 链接: https://www.jianshu.com/p/abcee3270e9a 来源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020-07-08 · 1 min · 39 words · -

golang 生成二维码

“golang 生成二维码” import "github.com/skip2/go-qrcode" func main() { qrcode.WriteFile("http://www.wiloon.com/",qrcode.Medium,256,"./blog_qrcode.png") }

2020-07-08 · 1 min · 9 words · w1100n

network namespace

network namespace network namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。这篇文章介绍 network namespace 的基本概念和用法,network namespace 是 linux 内核提供的功能,这篇文章借助 ip 命令来完成各种操作。ip 命令来自于 iproute2 安装包,一般系统会默认安装,如果没有的话,请读者自行安装。 NOTE: ip 命令因为需要修改系统的网络配置,默认需要 sudo 权限。这篇文章使用 root 用户执行,请不要在生产环境或者重要的系统中用 root 直接执行,以防产生错误。 ip 命令管理的功能很多, 和 network namespace 有关的操作都是在子命令 ip netns 下进行的,可以通过 ip netns help` 查看所有操作的帮助信息。 默认情况下,使用 ip netns 是没有网络 namespace 的,所以 ip netns ls 命令看不到任何输出。 创建 network namespace 也非常简单,直接使用 ip netns add 后面跟着要创建的 namespace 名称。如果相同名字的 namespace 已经存在,命令会报 Cannot create namespace 的错误。 ip netns add net1 ip netns ls ip netns 命令创建的 network namespace 会出现在 /var/run/netns/ 目录下,如果需要管理其他不是 ip netns 创建的 network namespace,只要在这个目录下创建一个指向对应 network namespace 文件的链接就行。 ...

2020-07-07 · 1 min · 165 words · -

自动装箱 拆箱

自动装箱 拆箱 Java作为面向对象语言,有人认为所看到的都是对象,事实上,在Java SE 5之前,基本类型默认并不是采用对象存在的如果您想要把基本类型作为对象来处理,就必须自行转换,不过,在Java SE 5之后,为基本数据类型提供了自动装箱和拆箱功能,使得将基本类型转换为对象变得极其便捷。 在这里来捋一捋java的基本数据类型,不理不要紧,一理才发现俺也掌握的不是那么明确,在这里俺也再次学习下 总计有八个,分别是 byte字节型 (一个字节) ,char字符型 (两个字节) ,short短整型 (两个字节) ,int整型 (四个字节) , long长整型 (八个字节) ,float浮点型 (四个字节) ,double 双精度浮点型 (八个字节) ,boolean型 (一个字节) 在javase5之前,如果想要把基本数据类型作为对象来操作,就需要采用对应的对象,来把它们打包才行 现在虽然不用这样了,但其中也有一些要注意的地方,俺揪出来晒晒。 先说说类和对象,建立个概念吧先 类-可以认为是对象的设计图 对象-是按照设计图实现了的具体工具 先这么简单理解吧,如果真要扯开了说,那可是软件工程里面的一门专业课,我们有个概念就好 之所以要将基本类型数据打包成为对象,原因很简单,是因为对象可以携带更多的数据。 手动、自动装箱拆箱示例 Long,Integer,Double,Float,Boolean等等的类就是所谓的wrapper类,就跟wrapper这个单词所代表的意思一样,就是提供一个"包装,加壳",把基本数据类型放在里面,来看代码,体会下先 public class WrapperDemo{ public staticvoid main(String[] args){ int data1=21; int data2=24; //打包成为对象 Integer data1Wrapper = new Integer(data1); Integer data2Wrapper = new Integer(data2); //原始数据直接除以3 System.out.println(data1/3); //将数据打包,转换为double型,除以3 System.out.println(data1Wrapper.doubleValue()/3); //比较 System.out.println(data1Wrapper.compareTo(data2Wrapper)); } } 图1-1 WrapperDemo的运行结果 通过上面的代码和运行结果,看到了将基本数据类型打包成为对象带来的好处了吧,别着急,这还只是javase5之前的做法,在javase5之后就已经支持自动装箱和拆箱了,在这,就不再单独写代码出来了,只写几个能说明问题的语句就可以了,相信很容易理解的。 javase5之前,手动打包 Integer data1 = new Integer(10); ...

2020-06-30 · 1 min · 201 words · -

novnc

novnc https://github.com/novnc/noVNC https://novnc.com/info.html podman run \ -e REMOTE_HOST=192.168.50.114 \ -e REMOTE_PORT=5900 \ -p 8082:8081 \ -d \ --name novnc-dell \ dougw/novnc nginx config server { listen 80; server_name vnc.wiloon.com; location / { proxy_pass http://192.168.50.114:8082; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 1d; proxy_send_timeout 1d; proxy_read_timeout 1d; } }

2020-06-28 · 1 min · 53 words · -

chrome basic

“chrome basic” # dns lookup chrome://net-internals/#dns 不使用页面缓存进行刷新 Shift+F5 清除dns缓存 chrome://net-internals/#dns chrome://flags chrome 导出 netlogs chrome://net-export/ 分析 netlogs https://netlog-viewer.appspot.com/ Chrome 清除某个特定网站下的缓存 https://www.cnblogs.com/Chesky/p/chrome_disabling_cache.html 打开开发者工具 (F12), 选择 Network——Disable cache 即可。需要清除某网站缓存时 F12 打开开发者工具就会自动清除这个网站的缓存,而不必清除所有网站的缓存了。 huge CPU usage of gnome-keyring-daemon when starting Google Chrome google-chrome –password-store:basic How to prevent the huge CPU usage of gnome-keyring-daemon when starting Google Chrome https://www.andreafortuna.org/technology/linux/how-to-prevent-the-huge-cpu-usage-of-gnome-keyring-daemon-when-starting-google-chrome/embed/#?secret=NSkQcrRM22 chrome 参数 修改默认用户目录, todo merge chrome.exe --user-data-dir=D:\chrome --no-default-browser-check extensions Language Reactor, youture 中英文字幕 /etc/hosts https://stackoverflow.com/questions/42636711/google-chrome-ignoring-hosts-file

2020-06-27 · 1 min · 69 words · -

dns config

“dns config” 主机记录 www : 将域名解析为www.example.com,填写www; @ : 将域名解析为example.com (不带www) ,填写@或者不填写; mail : 将域名解析为mail.example.com,通常用于解析邮箱服务器; *: 泛解析,所有子域名均被解析到统一地址 (除单独设置的子域名解析) ; 解析线路 为加速访问域名,可设置与用户相同的网络类型,但用户的网络类型多种多样,所以解析线路设置为默认,这样DNS服务商一般会智能使用解析线路,当判断访问者来源为联通用户,就将域名解析到联通的服务器IP上;当判断访问者来源为电信用户,就将域名解析到到电信的服务器IP上。 作者: 大猫黄 链接: https://www.jianshu.com/p/d1840c71a57c 来源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020-06-26 · 1 min · 27 words · -

nginx config, tls

“nginx config, tls” ssl_certificate: 服务器的 SSL 证书文件的路径。该证书用于证明服务器的身份,并与客户端建立安全连接。通常,这个文件包含服务器的公钥信息。 ssl_certificate_key: 服务器证书匹配的私钥文件路径。私钥用于解密客户端传来的信息,因此必须保密并妥善保护。 ssl_trusted_certificate: 一个或多个被信任的证书颁发机构(CA)的证书文件路径。它用于验证客户端证书的真实性,尤其在启用客户端证书验证时。在大多数情况下,使用 Let’s Encrypt 证书时不需要单独指定这个文件,因为 fullchain.pem 已经包含了必要的中间证书链,通常足以满足大多数应用的验证需求。 TLS, nginx config include cat > /etc/nginx/tls.conf << EOF ssl_certificate /etc/letsencrypt/fullchain.pem; ssl_certificate_key /etc/letsencrypt/privkey.pem; ssl_protocols TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; EOF vim /etc/nginx/conf.d/default.conf # server config server { listen 443 ssl; server_name foo.wiloon.com; include /etc/nginx/tls.conf; location / { # ... } } stream pacman -Sy nginx-mainline-mod-stream 代理远程桌面 3389 的 tcp 连接 stream { upstream mstsc { server 1.2.3.4:3389; } server { listen 1082; proxy_pass mstsc; } } tls server { #ssl参数 listen 443 ssl; # 多域名配置 server_name foo.wiloon.com bar.wiloon.com; #证书文件 ssl_certificate example.com.crt; #私钥文件 ssl_certificate_key example.com.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; #... } 静态网站 server { listen 80; server_name localhost; #charset koi8-r; access_log /var/log/nginx/host.access.log main; error_log /var/log/nginx/error.log error; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } https://aotu.io/notes/2016/08/16/nginx-https/index.html ...

2020-06-26 · 1 min · 213 words · -

AMD, CMD

“AMD, CMD” https://juejin.im/post/5a422b036fb9a045211ef789 在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可;如今CPU、浏览器性能得到了极大的提升,很多页面逻辑迁移到了客户端 (表单验证等) , 随着web2.0时代的到来,Ajax技术得到广泛应用,jQuery等前端库层出不穷,前端代码日益膨胀 这时候JavaScript作为嵌入式的脚本语言的定位动摇了,JavaScript却没有为组织代码提供任何明显帮助,甚至没有类的概念, 更不用说模块 (module) 了,JavaScript极其简单的代码组织规范不足以驾驭如此庞大规模的代码 模块 既然JavaScript不能handle如此大规模的代码,我们可以借鉴一下其它语言是怎么处理大规模程序设计的,在Java中有一个重要带概念——package,逻辑上相关的代码组织到同一个包内,包内是一个相对独立的王国,不用担心命名冲突什么的,那么外部如果使用呢?直接import对应的package即可 import java.util.ArrayList; 遗憾的是JavaScript在设计时定位原因,没有提供类似的功能,开发者需要模拟出类似的功能,来隔离、组织复杂的JavaScript代码,我们称为模块化。 一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。模块开发需要遵循一定的规范,各行其是就都乱套了 规范形成的过程是痛苦的,前端的先驱在刀耕火种、茹毛饮血的阶段开始,发展到现在初具规模,简单了解一下这段不凡的历程 函数封装 我们在讲函数的时候提到,函数一个功能就是实现特定逻辑的一组语句打包,而且JavaScript的作用域就是基于函数的,所以把函数作为模块化的第一步是很自然的事情,在一个文件里面编写几个相关函数就是最开始的模块了 function fn1(){ statement } function fn2(){ statement }1234567复制代码 这样在需要的以后夹在函数所在文件,调用函数就可以了 这种做法的缺点很明显: 污染了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间没什么关系。 对象 为了解决上面问题,对象的写法应运而生,可以把所有的模块成员封装在一个对象中 var myModule = { var1: 1, var2: 2, fn1: function(){ }, fn2: function(){ } }12345678910111213复制代码 这样我们在希望调用模块的时候引用对应文件,然后 myModule.fn2(); 这样避免了变量污染,只要保证模块名唯一即可,同时同一模块内的成员也有了关系 看似不错的解决方案,但是也有缺陷,外部可以随意修改内部成员 myModel.var1 = 100; 这样就会产生意外的安全问题 立即执行函数 可以通过立即执行函数,来达到隐藏细节的目的 var myModule = (function(){ var var1 = 1; var var2 = 2; function fn1(){ } function fn2(){ } return { fn1: fn1, fn2: fn2 }; })();1234567891011121314151617复制代码 这样在模块外部无法修改我们没有暴露出来的变量、函数 ...

2020-06-23 · 2 min · 256 words · -

OKR

“OKR” OKR (Objectives and Key Results) https://www.infoq.cn/profile/1218094/publish https://www.infoq.cn/article/Vl2uK8owDjj1pJG6ZrDD https://www.infoq.cn/article/Z3LA3We5qKcfsqTUrHSG 蝴蝶效应: 一只南美洲亚马逊河流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,可以在两周以后引起美国得克萨斯州的一场龙卷风。蝴蝶效应意味着世界处于混沌状态,事务之间的联系错综复杂,不可掌控。 典型的就是"一个香港人在台湾杀了自己的女友,导致在中国看不了 NBA 比赛"。 黑天鹅: 在发现澳大利亚之前,欧洲人认为所有天鹅都是白色的,还常用"黑天鹅"来指不可能存在的事物。但欧洲人这个信念却随着第一只黑天鹅的出现而崩溃。因为,黑天鹅的存在代表不可预测的重大稀有事件,意料之外却又改变一切。黑天鹅意味着极小概率事件带来的大影响。 典型的就是"非典 SARS"、“新冠状病毒"这样的极小概率的跨界病毒感染和传播带来的巨大影响。 灰犀牛: 灰犀牛体型笨重、反应迟缓,你能看见它在远处,却毫不在意,一旦它向你狂奔而来,定会让你猝不及防,直接被扑倒在地。它并不神秘,却更危险。灰犀牛意味这经常被提示却没有得到充分重视的大概率风险事件。 日常的学习和工作中,我们经常会看到: 想要的太多,从而使得精力和资源比较分散 分不清楚优先级 / 价值,总是被低优先级 / 价值的事情干扰 被紧急的事情占用了太多时间,重要的事情没时间做 《管理 3.0》 (Jurgen Appelo) 中"激励员工"是其六大支柱之一,Jurgen 把内在动力总结为 10 个因素,我们称为"冠军蛙"CHAMP-FROGS: Curiosity (好奇) : 思考的需要 Honor (荣誉) : 受团队尊重的需要 Acceptance (认可) : 被认同的需要 Mastery (能力) : 感到胜任的需要 Power (权力) : 有影响的需要 Freedom (自由) : 感受到独立的需要 Relatedness (关系) : 朋友的需要 Order (有序) : 稳定环境的需要 Goal (目的) : 意义的需要 Status (地位) : 社会地位的需要

2020-06-06 · 1 min · 76 words · -

letsencrypt, certbot, certbot-auto, acme.sh

“letsencrypt, certbot, certbot-auto, acme.sh” certbot, certbot-auto, acme.sh certbot: recommended by the official website. certbot-auto: no longer supported. acme.sh: 第三方的 acme 协议实现. install certbot almalinux pip sudo dnf install python3 augeas-libs sudo dnf remove certbot python3 -m venv /opt/certbot/ /opt/certbot/bin/pip install --upgrade pip /opt/certbot/bin/pip install certbot certbot-nginx ln -s /opt/certbot/bin/certbot /usr/bin/certbot archlinux pacman -S certbot ubuntu # 不推荐用这种方式安装, 版本太旧 sudo apt install certbot # 如果以前安装过, 先卸载掉再安装 snap 版本 sudo apt-get remove certbot sudo apt update # for ubuntu snap is pre-installed sudo apt install snapd sudo snap install core sudo snap refresh core sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/bin/certbot snap set certbot trust-plugin-with-root=ok # 如果在使用 google dns, 需要安装这个包 snap install certbot-dns-google certonly # certonly: do not install, 不安装到 nginx, 因为 nginx 在 docker 里, 所以这里用 certonly # -m: provide email # --agree-tos: tos yes # --eff-email: share email yes # --keep-until-expiring: keep cert yes certbot certonly --standalone -m wiloon.wy@gmail.com --agree-tos --eff-email --keep-until-expiring \ -d wiloon.com -d bitwarden.wiloon.com certbot certonly --standalone -m wiloon.wy@gmail.com --agree-tos --eff-email --keep-until-expiring -d wangyue.dev # list all certificates issued by certbot certbot certificates # select and delete certificates certbot delete # for google dns certbot certonly --dns-google --dns-google-credentials /root/cellular-deck-280204-6455aa19691d.json -d wiloon.com -d *.wiloon.com commands # 查看证书, 查看已经安装的证书 certbot certificates centos dnf update dnf remove certbot dnf install epel-release dnf install snapd systemctl enable --now snapd.socket snap install core snap refresh core ln -s /var/lib/snapd/snap /snap snap install --classic certbot ln -s /snap/bin/certbot /usr/bin/certbot snap set certbot trust-plugin-with-root=ok snap install certbot-dns-google Couldn’t download https://raw.githubusercontent.com/certbot/certbot/v0.39.0/letsencrypt-auto-source/letsencrypt-auto. [urlopen error [Errno 110] Connection timed out](urlopen error [Errno 110] Connection timed out) ...

2020-06-04 · 3 min · 542 words · -

渐进式框架

“渐进式框架” https://www.zhihu.com/question/51907207 渐进式框架的大概意思就是你可以只用我的一部分,而不是用了我这一点就必须用我的所有部分。 渐进式代表的含义是: 主张最少。 Angular,它两个版本都是强主张的,如果你用它,必须接受以下东西: - 必须使用它的模块机制 - 必须使用它的依赖注入 - 必须使用它的特殊形式定义组件 (这一点每个视图框架都有,难以避免) React,它也有一定程度的主张,它的主张主要是函数式编程的理念,比如说,你需要知道什么是副作用,什么是纯函数,如何隔离副作用。它的侵入性看似没有Angular那么强,主要因为它是软性侵入。 vue是渐进的,没有强主张,你可以在原有大系统的上面,把一两个组件改用它实现,当jQuery用;也可以整个用它全家桶开发,当Angular用;还可以用它的视图,搭配你自己设计的整个下层用。你可以在底层数据逻辑的地方用OO和设计模式的那套理念,也可以函数式,都可以,它只是个轻量视图而已,只做了自己该做的事,没有做不该做的事,仅此而已。 渐进式的含义,我的理解是: 没有多做职责之外的事。 作者: 徐飞 链接: https://www.zhihu.com/question/51907207/answer/136559185 来源: 知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020-06-02 · 1 min · 24 words · -

DKMS

“DKMS” DKMS 我们都知道,如果要使用没有集成到内核之中的Linux驱动程序需要手动编译。当然,这并不是一件什么难事,即使是对于没有编程经验的Linux使用者,只要稍微有点hacker的意识,努力看看代码包里的Readme或者INSTALL文件,按部就班的执行几条命令还是很容易办到的。但这里还有一个问题,Linux模块和内核是有依赖关系的,如果遇到因为发行版更新造成的内核版本的变动,之前编译的模块是无法继续使用的,我们只能手动再编译一遍。这样重复的操作有些繁琐且是反生产力的,而对于没有内核编程经验的使用者来说可能会造成一些困扰,使用者搞不清楚为什么更新系统之后,原来用的好好的驱动程序突然就不能用了。这里,就是Dell创建的DKMS项目的意义所在。DKMS全称是Dynamic Kernel Module Support,它可以帮我们维护内核外的这些驱动程序,在内核版本变动之后可以自动重新生成新的模块。 https://www.cnblogs.com/wwang/archive/2011/06/21/2085571.html https://www.cnblogs.com/wwang/archive/2011/06/21/2085571.html

2020-05-30 · 1 min · 8 words · -

vue-router的两种模式

“vue-router的两种模式” 为什么要有 hash 和 history 对于 Vue 这类渐进式前端开发框架,为了构建 **SPA (单页面应用) **,需要引入前端路由系统,这也就是 Vue-Router 存在的意义。前端路由的核心,就在于 —— 改变视图的同时不会向后端发出请求。 为了达到这一目的,浏览器当前提供了以下两种支持: hash —— 即地址栏 URL 中的 # 符号 (此 hash 不是密码学里的散列运算) 。 比如这个 URL: http://www.abc.com/#/hello,hash 的值为 #/hello。它的特点在于: hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面。 history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。 (需要特定浏览器支持) 这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求。 因此可以说,hash 模式和 history 模式都属于浏览器自身的特性,Vue-Router 只是利用了这两个特性 (通过调用浏览器提供的接口) 来实现前端路由。 使用场景 一般场景下,hash 和 history 都可以,除非你更在意颜值,# 符号夹杂在 URL 里看起来确实有些不太美丽。 ...

2020-05-24 · 1 min · 189 words · -

敏捷开发,瀑布开发

“敏捷开发,瀑布开发” 敏捷开发 客人到餐馆来点菜 (新项目) 不确定客户想吃什么的时候,通常选好餐厅后会先看看餐厅的菜单 (客户往往提不出具体的需求) 根据图文菜单,客人点了是个菜 (根据原型和设计稿,基本确定了需求) 后厨开始准备 (项目启动) 配菜、炒菜,先上了两盘,让客人尝了尝味道 (先提供可用实例给客户用) 客人说还不错,后厨继续准备后面的菜,陆续上菜 (不断迭代,不断测试) 上菜过程中,客人突然发现有个菜的味道太淡了,让后厨加了点盐又端上来了 (敏捷的好处,可以不断测试和需求变更) 又上了两盘,不够辣,又拿到后厨加了辣 (敏捷的坏处,需求没有提前明确,反复迭代,增加了工作量) 到最后两盘时,客人要求换两个菜,还好没炒 (迭代的好处,随时接受需求变更) 客人吃完,很满意 (基本满足了全部的要求) (在举个例子) 打个比方,客户说他想要造一座金字塔,你作为"咨询师",认为这座金字塔要造10年,肯定不能指望一次设计好就一口气做完,于是问客户这个金字塔是要干什么?客户说要当坟墓,于是,你提出先做一个小坟墓的功能,能装木乃伊那种。客户同意了,你哐哧哐哧做了一个月,制造了一个小型地下墓室,演示给客户看,客户看了,一拍大腿,说看到这个墓室才想明白,其实他要的不是金字塔,要的是一个有排场的墓地,这样简陋埋在地下的墓室不够牛逼,于是你和客户达成第二阶段设计,做一个带兵马俑方阵来让这个墓地显得有排场,客户同意了,于是你又哐哧哐哧做了一个月,做了一个小型兵马俑方阵。客户看了兵马俑方阵,又一拍大腿,说这个方阵还真牛逼,但是能不能增加一些现代元素,把古代兵马俑换成现代装甲兵团,你于是又…… (如此,周而复始,每个阶段只完成客户一个需要,当然,我上面只是一个荒诞的例子,但是你应该能够get到敏捷的含义。) 瀑布模型开发 客人到餐馆来点菜 (新项目) 不确定客户想吃什么的时候,通常选好餐厅后会先看看餐厅的菜单 (客户往往提不出具体的需求) 根据图文菜单,客人点了十个菜 (根据原型和设计稿,基本确定了需求) 后厨开始准备 (项目启动) 根据客人的下单配菜,炒菜 (基本上不会主动去了解完整需求) 半个小时了,菜还没上桌,客人饿极了 (项目启动后很长一段时间客户什么都看不到) 再过了二十分钟,十个菜都一起上来了 (项目最终一次交付) 客人说,有几个菜挺好的,但是有个菜味道淡了,有两个不够辣,还有两盘重复了想换掉 (我是买单的,我- 要变需求) 这时候大堂经理来了,说,“味道淡了可以加盐,不辣可以加辣,但是换菜不行,已经炒好的那两盘菜也是要算成本的” (瀑布的坏处,需求变更比较麻烦) 于是,后厨只给客户加了盐,加了辣 客人吃完,不是很满意,下次不来了 (没有满足需求) 总结 但总的来说,在现在管理项目过程中,并没有严格的按照完全的敏捷或者完全的瀑布模式,都是各自掺杂了其他的方式。在实际项目过程中,过于强调模式并没有意义,重要的是能不能预防问题的发生,在问题发生之后能不能用最小的成本解决,模式更多起一个参考作用 最后借用民国时候的一句话: 少研究一些主义,多关注一些实际问题 (net) 作者: zhaur 链接: https://www.jianshu.com/p/ca5f242cf2bb 来源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020-05-23 · 1 min · 60 words · -

JWT, session

“JWT, session” github.com/golang-jwt/jwt 背景知识: Authentication和Authorization的区别 Authentication: 用户认证,指的是验证用户的身份,例如你希望以小A的身份登录,那么应用程序需要通过用户名和密码确认你真的是小A。 Authorization: 授权,指的是确认你的身份之后提供给你权限,例如用户小A可以修改数据,而用户小B只能阅读数据。 由于http协议是无状态的,每一次请求都无状态。当一个用户通过用户名和密码登录了之后,他的下一个请求不会携带任何状态,应用程序无法知道他的身份,那就必须重新认证。因此我们希望用户登录成功之后的每一次http请求,都能够保存他的登录状态。 目前主流的用户认证方法有基于token和基于session两种方式。 JWT和session ID也会暴露于未经防范的重放攻击 将JWT发布到特定的IP地址并使用浏览器指纹。 Local Storage 无状态 JWT (Stateless JWT) : 包含 Session 数据的 JWT Token。Session 数据将被直接编码进 Token 内。 有状态 JWT (Stateful JWT) : 包含 Session 引用或其 ID 的 JWT Token。Session 数据存储在服务端。 Session token (又称 Session cookie) : 标准的、可被签名的 Session ID,例如各类 Web 框架 (译者注: 包括 Laravel) 内已经使用了很久的 Session 机制。Session 数据同样存储在服务端。 ———————————————— 原文作者: Wi1dcard 转自链接: https://learnku.com/articles/22616 版权声明: 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。 https://juejin.im/post/5a437441f265da43294e54c3 聊一聊JWT与session 前言 认证和授权,其实吧简单来说就是:认证就是让服务器知道你是谁,授权就是服务器让你知道你什么能干,什么不能干,认证授权俩种方式: Session-Cookie与JWT,下面我们就针对这两种方案就行阐述。 ...

2020-05-23 · 3 min · 529 words · -

企业微信api

“企业微信api” REDIRECT_URL中的域名,需要先配置至应用的"可信域名"

2020-05-23 · 1 min · 2 words · -

chrome 禁用http到https的自动转换

“chrome 禁用http到https的自动转换” Go to chrome://net-internals/#hsts. Enter 3rdrevolution.com under Delete domain security policies and press the Delete button. Now go to chrome://settings/clearBrowserData, tick the box Cached images and files and press click the button Clear data. https://superuser.com/questions/565409/how-to-stop-an-automatic-redirect-from-http-to-https-in-chrome

2020-05-23 · 1 min · 36 words · -

Vue 跨域

Vue 跨域 缘起 最近实验课上需要重构以前写过的一个项目 (垃圾堆) ,需要添加发生邮件提醒的功能,记得以前写过一个PHP版的实现,所以想把PHP写的功能整理成一个服务,然后在前端调用。但是这个项目是JavaWeb,也就是说我需要面对跨域的问题。不过本篇文章,讲的并不是如何解决这样的跨域问题,而是我在找如何解决这个问题的路上遇到的坑。 其实,在前端工程化大行其道的现在,前后端已经分离开来,前端为了提高工作流效率往往自己开一个小型的服务器,就比如webpack.devServer。这样在前端调用后端接口的时候必然会面临跨域的问题, 如题,Vue-cli 3.x + axios 跨域方案 就是解决这里的跨域问题。这里的跨域是基于webpack的devServer的代理功能 (proxy) 来实现开发环境中的跨域,也就是说本篇所讨论的并不能解决生产环境下的跨域问题,因为webpack.devServer是DevDependencies,一旦打包上线,这个proxy代理就会失效。但是这并不妨碍我们开发中使用跨域来提高开发效率和体验。 开始填坑 其实这个问题解决起来很简单,网上也是很多教程,为了文章完整性,我这里也做一个尽量完备的展示,介绍如何配置Vue-cli 3.x来实现跨域 。 vue.config.js中devServer.proxy 的配置解析 Vue-cli3.x比Vue-cli2.x构建的项目要简化很多,根目录下只有./src和./public文件夹,所以网上很多教程说config目录下的vue.config.js是说的vue-cli 2.x版本。那么对于Vue-cli 3.x版本,构建也很简单,直接在根目录里建一个vue.config.js配置文件就可以了,我们直接看devServer.proxy里的代码: 我这里devServer的地址是: localhost:8080/,需要代理的地址是: localhost/index/phpinfo.php (我自己写的一个测试跨域用的php,返回一个’ok') 下面是根据上面的地址需要配置的proxy对象 module.exports = { devServer: { proxy: { '/api': { target: 'http://192.168.80.2:38081', ws: true, changeOrigin: true, pathRewrite: { '^/api': '' } } } } } # main.ts axios.defaults.baseURL = '/api' 大部分教程到这里就停止了,但是我在这里做一个扩展,为了让读者理解这里的配置是如何起作用的 (以下内容整理自http-proxy-middleware的npm描述里,http-proxy-middleware是一个npm模块,是proxy的底层原理实现) 。 foo://example.com:8042/over/there?name=ferret#nose _/ ______________/_________/ _________/ __/ | | | | | scheme authority path query fragment 复制代码 以我上面的配置为例,'/index'这个key在http-proxy-middleware中被称为context——用来决定哪些请求需要被target对应的主机地址 (这里是http://localhost/index) 代理,它可以是 字符串,含有通配符的字符串,或是一个数组,分别对应于path matching(路径匹配)wildcard path matching(通配符路径匹配)multiple path matching(多路径匹配),而这里的path指的就是上图所标识的path段。 ...

2020-05-22 · 1 min · 191 words · -

内联样式

“内联样式” CSS 样式代码插入的形式来看基本可以分为以下3种: 内联式、嵌入式和外部式三种。 内联式css样式表就是把css代码直接写在现有的HTML标签中,如下面代码: 这里文字是红色。 注意要写在元素的开始标签里,下面这种写法是错误的: 这里文字是红色。 并且css样式代码要写在style=““双引号中,如果有多条css样式代码设置可以写在一起,中间用分号隔开。如下代码: 这里文字是红色。 作者: LvyCode 链接: https://www.jianshu.com/p/16b40c7a479a 来源: 简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2020-05-21 · 1 min · 17 words · -