go-判断-https-ssl-证书是否过期
package main import ( "crypto/tls" "fmt" "time" ) func main() { conn, err := tls.Dial("tcp", "blog.umesh.wtf:443", nil) if err != nil { panic("Server doesn't support SSL certificate err: " + err.Error()) } err = conn.VerifyHostname("blog.umesh.wtf") if err != nil { panic("Hostname doesn't match with certificate: " + err.Error()) } expiry := conn.ConnectionState().PeerCertificates[0].NotAfter fmt.Printf("Issuer: %s\nExpiry: %v\n", conn.ConnectionState().PeerCertificates[0].Issuer, expiry.Format(time.RFC850)) } 参考自 freecodecampphp-进程线程
进程与线程的概念: 进程是 一个时间段: CPU 上下文切换之间的程序运行时 线程是进程之中的多个程序段的运行时, 线程共享进程的地址空间 (知乎: 线程和进程的区别是什么?)[https://www.zhihu.com/question/25532384] php-fpm 是进程, 每个请求是单线程的 多个请求是并发(多线程)的Duck-Type-鸭子类型
Duck Typing is a [type system] used in dynamic languages. For example, Python, Perl, Ruby, PHP, Javascript, etc. where the type or the class of an object is less important than the method it defines. Using Duck Typing, we do not check types at all. Instead, we check for the presence of a given method or attribute. reference: geeksforgeeks 按上述来说, 鸭子类型是动态语言的特性, 在动态语言中, 类型并不重要, 重要的是类型(实例)的方法Linux-下-AX210NGW-无线网卡安装驱动
参考: Linux* Support for Intel® Wireless Adapters 参考: https://wireless.wiki.kernel.org/en/users/drivers/iwlwifi 参考: https://www.intel.com/content/www/us/en/support/articles/000005511/wireless.htmlhtml-打印显示页眉页脚及表格一行被分到两页的问题
1. 每页表头问题 参考: The Ultimate Print HTML Template with Header & Footer | by Idan Cohen | Medium 使用 table 中的 thead 会在每页打印其中的内容, 而不需要打印页眉页脚的页面(头2页, 3页等), 继续使用 div static 布局 2. table row 被分到两页的问题 对 tr 使用 break-inside-avoid, break-after-auto 参考: How to Handle Page Breaks when Printing a Large HTML Table删除文件夹中的node_modules子文件夹
package main import ( "fmt" "io" "io/fs" "os" "path" "path/filepath" ) func main() { if len(os.Args) == 1 { panic("Enter a file name") } src := os.Args[1] var pathList []string err := filepath.Walk(src, func(path string, info fs.FileInfo, err error) error { if err != nil { return err } if info.IsDir() && info.Name() == "node_modules" { return filepath.SkipDir } if info.IsDir() { return nil } path = filepath.ToSlash(path) pathList = append(pathList, path) return nil }) if err !centos-部署-go-web
编译后的文件上传至服务器, 有两个事情要做, 一是把 web 应用做成守护进程启动, 二是端口开放 使用纯净 centos7 环境(justhost.ru vps, 非阿里云环境) 1. 防火墙开放端口 1.1 查看防火墙状态 firewall-cmd --state # running 1.2 如果没有开启, 启动防火墙 systemctl start firewalld.service 1.3 开放 8080 端口 firewall-cmd --zone=public --add-port=8080/tcp --permanent # 开放多个端口 firewall-cmd --add-port=8081-8100/tcp --permanent 1.4 重启防火墙 systemctl restart firewall.service 1.5 重载配置 firewall-cmd --reload 1.6 查看端口开启情况 netstat -nltp # 或者使用 firewall-cmd 查看 # 查看所有 firewall-cmd --list-all # 查看指定 firewall-cmd --query-port=8080/tcp 1.7 移除端口 firewall-cmd --remove-port=8080/tcp --permanent 2. supervisord 守护进程 2.不使用-struct-定义-json-字符串
// 方法一: 生写 string jsonStr := ` "name": "Jack", "age": 25 ` // 方法二: map[string]interface{} jsonMap := map[string]interface{}{ "name": "Jack", "age": 66, } jsonByte, _ = json.Marshal(jsonMap) jsonStr = string(jsonByte) 另外 jsonStr 转 io.Reader r := strings.NewReader(jsonStr)匿名函数与闭包
程序语言支持匿名函数时, 可以由匿名函数形成闭包 闭包的作用 在函数外部使用函数内部的变量 函数内部变量的持久化 参考cnblog: 匿名函数,闭包go-结构体实例化
type Block struct { length int height int } // 方式一 var a Block a.length = 1 a.height = 2 // 方式二 b := Block{1, 2} // 方式三 c := &Block{1, 2} // 方式四 d := new(Block) d.length = 1 d.height = 2 fmt.Println(a) fmt.Println(b) fmt.Println(c) fmt.Println(d) 方式一和二 相同, 结果都是 值对象 方式三和四 相同, 结果都是指针 值和指针的不同点在于, 如果需要对 结构体的实例进行修改时, 值需要加上 &, 而 指针不需要 如果一个 struct 内容很多, 占用内存大, 应该使用 指针而不是值来进行函数间的传递. 参考 segmentfault cnblog跨站脚本(XSS)-与-跨站请求伪造(CSRF)
cross-site-scripting (XSS) 动态网站才会存在, 静态站点则不存在这个问题 对 XSS 最佳的防护应该结合以下两种方法 一是验证所有输入数据,进行转义 (escaper) 另一个是对所有输出数据进行适当的处理,以防止任何已成功注入的脚本在浏览器端运行。 cross-site-request-forgery (CSRF) 跟XSS相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是 网站 对 用户网页浏览器 的信任。 攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。 他们能做到的,是欺骗用户浏览器,让其以用户的名义运行操作 csrf 防护: 请求的 referer, 但不能保证 referer 不被篡改 随机生成的 校验token, 随表单页面一起生成, 并一起返回到后端 对于前后端分离的项目, 由于后端使用 token 进行用户身份验证, 所以即使 token 存储在 cookie 中, 也不会被 csrf 攻击. learnku.com使用-echo-写入文件
docker 容器内很可能没有 vi 等编辑工具, 可使用 echo 或 cat 进行写入 # 覆盖写入, 文件不存在则新建后写入 echo "abc" > file.txt # 尾行追加写入, 文件不存在则新建后写入 echo "def" >> file.txt echo $(date) >> file.txt # 覆盖写入 cat << EOF > m.txt > d > e > f > EOF # 追加写入 cat <<EOF >> m.txt > d > e > f > EOFflutter-gradle-问题
更改 google() jcenter 无效后 gradle 下载地址 https://services.gradle.org/distributions/ 参考: 快速解决 GRADLE 项目下载 gradle-*-all.zip 慢的问题vmware-linux-网络配置
centos7.9 vmware 中设置 虚拟机网络连接为 桥接模式 虚拟机(centos) 中 设置 /etc/sysconfig/network-scripts/ifcfg-ens33 中 ONBOOT 为 [root@bogon ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=dhcp DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=7e16f33b-714d-4386-ab0c-58b6ddbc7aa3 DEVICE=ens33 #ONBOOT=no ONBOOT=yeslinux-更新-curl-版本
转自: How to yum update curl 7.29 to 7.61 - CentOS 7.X # rpm -Uvh http://www.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-2-1.rhel7.noarch.rpm # cat /etc/yum.repos.d/city-fan.org.repo # 这里要保证 enabled = 1 [city-fan.org] name=city-fan.org repository for Red Hat Enterprise Linux (and clones) $releasever ($basearch) #baseurl=http://mirror.city-fan.org/ftp/contrib/yum-repo/rhel$releasever/$basearch mirrorlist=http://mirror.city-fan.org/ftp/contrib/yum-repo/mirrorlist-rhel$releasever enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-city-fan.org ... # yum info curl # yum update curl 版本回退 # mkdir ~/temp && cd ~/temp # wget http://mirror.centos.org/centos/7.5.1804/os/x86_64/Packages/curl-7.29.0-46.el7.x86_64.rpm # wget http://mirror.centos.org/centos/7.5.1804/os/x86_64/Packages/libcurl-7.29.0-46.el7.x86_64.rpm # wget http://mirror.centos.org/centos/7.5.1804/os/x86_64/Packages/libcurl-devel-7.29.0-46.el7.x86_64.rpm # rpm -Uvh --oldpackage *.goland-import-包报红
在使用 go mod 后(go 1.11 开始支持, go 1.14 全面推荐), 无需在 GOPATH 的 src 下存在项目目录, 可以随意存放. go 包依赖管理 gopath > go vender > go module, 参考 # 一文搞懂 Go Modules 前世今生及入门使用 GOPATH 则只存放第三方包, 若不设置, 默认为 /[user]/go 目录 goland 配置 GOROOT, GOPATH 及 Go Modules 结果会在 External Libraries 中多出一个 Go Modulesphp-生成文件流,-不生成本地文件
$string = "I tried, honestly! 中文"; $stream = fopen('data://text/plain,' . $string,'r'); //file_put_contents('./a.txt', $stream); //echo stream_get_contents($stream); echo $stream; $string = 'Some bad-ass string'; $stream = fopen('php://memory','r+'); fwrite($stream, $string); rewind($stream); echo stream_get_contents($stream); 参考自: Creating streams from strings in PHPchrome-禁用-6000-端口
今天使用 6000 端口, 发现不能用, 用 8000 没问题 一查, 原来 chrome 禁用了 6000 参考: Chrome,你这坑人的默认非安全端口bilibli-网页视频加速播放
默认最高只能加速到 2 倍, 可使用 js 加速任意倍 document.querySelector('video').playbackRate = 3 参考:https://www.jianshu.com/p/b111e12ee269类的-static-及-self
使用 self:: 或者 CLASS 对当前类的静态引用,指向 定义当前方法所在的类. 使用 static 对当前类的静态引用,指向 使用当前方法所在的类. 参见php.net 后期静态绑定emmet-快速生成代码
想要 结果为 <div>1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> <div>6</div> <div>7</div> <div>8</div> <div>9</div> 操作 : div{$}*9 参考cnblog: VsCode中使用Emmet神器快速编写HTML代码使用-js-改变-css(style)-样式
要改变的是样式表, 如: <style> a.active { color: red; } </style> <script> document.styleSheets[0].add('a.active', 'color: blue !important') <script> 参考cnblog: JS设置CSS样式的几种方式浏览器页面被禁用-F12(dev-tools)
背景: 打开一个网页 havey.com, 使用不了 F12 解决办法1: 使用浏览器设置栏, 打开开发者工具, 设置->更多工具->开发者工具 解决办法2: 在页面还没完全打开时, 快速按下 F12 解决办法3: 命令行启动浏览器, 携带参数, 强制打开所有页面的 devtools chrome.exe –auto-open-devtools-for-tabs –user-data-dir=./ 参考 it-refer.comcsrf-跨站请求伪造
CSRF(Cross-site request forgery)跨站请求伪造, 定义: 攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。 利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。 一个典型的CSRF攻击有着如下的流程: 受害者登录a.com,并保留了登录凭证(Cookie)。 攻击者引诱受害者访问了b.com。 b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。 a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。 a.com以受害者的名义执行了act=xx。 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。 前后端分离时, 不使用 cookie, 则不会有 csrf 危险ubuntu-apt-换源
// 1. /etc/apt/sources.list 文件备份 cp -a /etc/apt/sources.list /etc/apt/sources.list.bak // 2. 修改 sources.list 文件 sudo vim sources.list tips: 阿里源文件: 出现 /etc/apt/sources.list" E212: Can’t open file for writing 解决方案 , 可能是因为用户权限不足, 使用 root 或 sudo vim 试试 参考自: /etc/apt/sources.list" E212: Can’t open file for writinglinux-生成带日期的文件
// date 命令用于输出时间, 反引号用于变量输出 touch `data +%F`.txt.logredhat7-systemd-和-systemctl
systemd 是系统管理守护进程, 其中的 d 表示 daemon systemctl 是命令, 其中的 ctl 表示 control 以下的 xxx 表示服务名称 systemctl start xxx => 启动服务 systemctl restart xxx => 重新启动服务 systemctl stop xxx => 停止服务 systemctl enable xxx => 加入到启动项 systemctl status xxx => 查看状态 shell api: application interface 应用程序接口 硬件 <= 内核 <= api <= 应用程序 shell 是一种应用程序, 壳, 终端(解释器), bash 是 shell 的一种 linux 命令 格式: 命令 参数 对象 ls -a / 参数和对象有时可不需要vscode-jsx-中-html-标签按-tab-不自动生成标签
设置: “emmet.triggerExpansionOnTab”: true 参考思否:vs code设置支持jsx支持emmetnpm-scripts-使用
背景: 项目安装了 browserify –save-dev, 如何在命令行中使用这个命令 这个命令的位置在 node_modules/.bin/ 目录下, 可以在终端使用 node_modules/.bin/browserify --version 也可以在 package.json 中使用 "scripts": { "prebuild": "rm -rf ./js/dist/*", "build": "browserify ./js/src/app.js -o ./js/dist/bundle.js" } 参考自阮一峰博客: npm scripts 使用指南js-数组反转,-不改变原来的数组
array.reverse(), 会改变原来的数组, 并返回该数组 如果要不改变原数组, 需要完全复制一份新的数组 const arr = [1,2,3] // 1. ... const arr2 = [...arr].reverse() // 2. slice() const arr3 = arr.slice().reverse()php-的-session-文件
由于 http 无状态性, 一般 MVC 可以使用session 用于存储用户信息. <?php session_start(); // 开启 session, 将会生成一个 session_id, 通过 http 响应头返回给浏览器, 浏览器存储到本地的 cookie 中, 下次 http 请示会自动携带给服务端; // 同时会在服务端生成一个文件 如 sess_2rh6hq44kjbtagri2r88dj16b1 (后面一串为 session_id), 当前会话(通过 id保持) 的数据, 会保存在该文件中, 如 session('name', 'test') session_unset(); // 注销当前会话下的 session 变量, 但不会删除当前 sess_xxxx... 文件, 而是清空文件里的内容(key: value)redux-的-reducer-函数不能改变原-state
可以使用如下方法来完全复制原来的 state, 再进行操作 对于数组: concat, slice, 或 spread operator 对于对象: Object.assign 或 spread operator 参考 valentinog.comPure-Fuction-纯函数的定义
Pure Function wiki definition: In computer programming a pure function is a that has the following properties: Its return value is the same for the same arguments. Its evaluation has no side effects. 同样参数总是返回相同的结果, 也就是函数内部没有随机生成的数 没有副作用, 指的是不会改变其它的变量的值, 不会有日志记录等 redux 的 reducer 中使用 纯函数, 输入一个 state, 在不改变输入的 state 的情况下, 返回一个 新的 state小程序-tips
一个页面中表单的 input 不能有相同的 name 值, 否则只有一个能输入webstorm-不提示-react-router-dom-中的-hooks(useRouteMatch-)
现象: import { BrowserRouter, Switch, // 不提示 Route, // 不提示 NavLink, useRouteMatch // 不提示 } from 'react-router-dom' 原因: // react-router-dom.js export { MemoryRouter, Prompt, Redirect, Route, Router, StaticRouter, Switch, generatePath, matchPath, useHistory, useLocation, useParams, useRouteMatch, withRouter } from 'react-router'; Switch, Route, useRouteMatch … 这类组件(或函数) 不是真正存在于 react-router-dom.js 文件中, 而是存在于 react-router.js 中导致 WebStorm 没有识别出来. 解决办法: 在 package.json 文件的 dependencies 加入 react-router "react-router": "^5.2.0", // 加入此行 "react-router-dom": "^5.2.0", 参考自 stackoverflow: Why does IntelliJ does not auto import react router hooks?react-router-中-path-和-url-的关系
// jsx let match = useRouteMatch() console.log(match) // isExact: true // params: {topicId: "6"} // path: "/topics/:topicId" // url: "/topics/6" 在动态路由中 其中, path 指的是路由的名称, 路径; url 指的是当前页面真实的地址, 也就是地址栏中显示的 url 在非动态路由中, 二者是一样的react-把一个组件的-props-全部传给子组件
背景: 自定义了一个 MyNavLink, 统一修改了 activeClassName, 其它属性由 MyNavLink 转发到 NavLink // 定义组件 function MyNavLink(props) { return <NavLink activeClassName='my-active' {...props}/> } // 使用 <MyNavLink to='/home' className='link'}>a link</MyNavLink> 关键: 使用 ... 对 props 进行解构一个div内的两个行内块级元素(一个有内容,-一个无内容)不对齐
<style> .inline-block { display: inline-block; width: 100px; height: 100px; background-color: #aaa; /*vertical-align: middle;*/ } </style> ... <div> <div class="inline-block"></div> <div class="inline-block>x</div> </div> 原因: 基线不一致 解决: 给 inline-block 类添加 veritcal-align 参考自csdnjs-疑难问题解决
this 指向问题 setTimeout 解决 参考hacpai: vue 疑难杂症三大定理清空(重置)-input-(tupe=file)-的-fileList
清空 input type=“file” 有两种方式 <input type="file"/> var file = document.getElementById('file'); // 第一种 //虽然file的value值不能设为有内容的字符,但是可以设置为空字符 file.value = '' // 第二种重新初始化file的html file.outerHTML = file.outerHTML 转自: 站内laravel-composer-dump-autoload-失败
报 class xxx not found // 1. 执行 php artisan config:clear // 2. 再不行就执行 php artisan clear-compiled // 3. 再不行就把 vendor/composer/ 文件夹里 autoload_ 开头的文件删除js-完全复制一个-数组,-而非引用复制
// 1. 引用复制, 共用内存 let arr = [1, 2, 3] let brr = arr brr.splice(1, 1) console.log(brr) // [1, 3] console.log(arr) // [1, 3] // 2. 完全复制, 不共享内存 let arr = [1, 2, 3] let brr = [...arr] brr.splice(1, 1) console.log(brr) // [1, 3] console.log(arr) // [1, 2, 3] 在 React 中对 state 数组数据的处理, 不要直接引用赋值, 而要完成复制赋值 因为直接修改 state 数据会对 React 性能调优造成影响01-基本概念
定义 数据结构: 数据之前的关系 算法定义: 解决问题的程序 数据结构分类 物理结构: 数据在存储设备上的存储方式. 又可分为 顺序存储(如 数组, 元素的存储位置是递增相邻的) 和 链式存储(由指针指示下一个数据的存储位置, 位置随机) 逻辑结构: 由代码表示的数据结构. 又可分为 集合, 链式结构, 树状结构(二叉树), 图状结构 算法复杂度: 时间复杂度 + 空间复杂度 时间复杂度, 指算法(程序代码)运行所耗的时长, 用 O() 表示 空间复杂度, 指算法(程序代码)运行所耗的内存 算法的特性 输入输出, 0个或多个输入, 至少1个输出 有穷性, 在有限的步骤内结束, 而不会无限循环(死循环) 确定性, 每一步骤有确定的含义, 不会出现二义性. 相同的输入, 只能输出相同的结果. 可行性, 每一步都是可行的.js-对象的-key-是个变量时,-如果赋值
// react 中 this.setState(key, value){ [key]: value } 参考自 csdn:taro-alias
官方文档: https://taro-docs.jd.com/taro/docs/config-detail 还要引入 path const path = require('path') // 此步骤不能少 const config = { . . . alias: { '@/components': path.resolve(__dirname, '..', 'src/components'), '@/utils': path.resolve(__dirname, '..', 'src/utils'), '@/assets': path.resolve(__dirname, '..', 'src/assets'), '@/static': path.resolve(__dirname, '..', 'src/static') }, . . . }多个-eventListener,-如何取消
参考: JavaScript事件机制 背景: 在 taro3.0.2 中, 小程序端使用 onPullDown(), 会造成 h5 端可以下拉, 但是不正常(顶部出现下拉空白, 不可恢复) 后来发现 tao-tabbar__pannel 的 touchmove 事件造成的 于是要关闭这个事件, 但是 使用 removeEventListener 不管用, 使用 addEventListener 覆盖, 会发现会依次执行, 不会覆盖, 于是就有了参考文章里的方法 e.stopImmediatePropagation() async componentDidMount() { // h5 不支持下拉刷新, 下拉会出现空白, 且不消失 if (process.env.TARO_ENV === 'h5') { const obj = document.getElementsByClassName('taro-tabbar__panel') obj[0].addEventListener('touchmove', function (e) { e.stopImmediatePropagation() e.preventDefault() }) } . . . }react-render(),-组件名
render 方法中只能有一个 顶级父元素 // 正确 render() { <div> <p>1111</p> <p>2222</p> </div> } // 错误 render() { <p>1111</p> <p>2222</p> } 组件类名及 html 标签 的名称必须 首字母大写phpstorm-`safe-write`
settings -> appearance&behavior -> system settings -> safe write 该(默认)设置会导致使用 phpstorm 写 taro 时, 变动文件时报 找不到 .jax___hv_temp___ 文件的错vue-awesome-swiper-响应式
使用 vue-awesome-swiper 版本为 3.1.4 (对应的 swiper 版本为 swiper4) // 先用原生 js + swiper4 写了一个响应式 demo.html, 每次 resize 重新 new 一个 swiper <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/css/swiper.css"> <script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/js/swiper.js"></script> <style> .swiper-container { position: relative; margin: 0 auto; } .swiper-slide { background-color: #eee; text-align: center; } .avatar { width: 120px; border-radius: 50%; /*margin: 0 auto;*/ } p.Git-Commit-Message-Conventions
Git Commit Message Conventions Goals auto-generate CHANGELOG.md specify commit-logs of sepcial types (ignore unimportant commits) Format git commit -m "[header]<type>(<scope>):<subject>[/header] [blankline/] [body]<body>[/body] [blankline/] [footer] <breaking changes> <referencing issues> [/footer] " type feat(feature) fix(bug fix) docs(documentation) style(formatting, missing semi colons,…) refactor test(when adding missing tests) chore(maintain) scope Anything specifying place of commit change. For example $browser, $compile, $rootScope… subject(text) Short description of the change. imperative, present tense: “change” not “changed” nor “changes” don’t capitalize first letter not dot(.composer-version-constraint
Tilde ~2.1, means 2.1.0 <= version < 3.0.0 ~2.1.1, means 2.1.1 <= version < 2.2.0 Caret // - ^2.1, means 2.1.0 <= version < 3.0.0 ^2.1.1, means 2.1.0 <= version < 3.0.0 Wildcard 2.1.*, means 2.1.0 <= version < 2.2.0 reference: composer正则表达式不包含-xx
如: http://www.hao123.com/* 不包含 http://www.hao123.com/abc 中有 abc 的情况 // js const str = 'http://www.hao123.com/abc' const reg = /^htpp:\/\/www\.hao123\.com\/(?!abc).*$/ reg.test(str)查询字段是否含有中文
SELECT col FROM table WHERE length(col)!=char_length(col) 通过查询长度和字符个数是否相等, 相等则不包含中文, 不相等则包含中文 原文见cnblogmouseout-和--mouseleave
在 firefox 和 chrome 中有不同的表现 在 firefox 中 mouseout 和 mouseleave 一样, 在 chrome 中, mouseout 是离开当前元素(不包括子元素)限制-div-或-p-内文本行数
/* css */ .text { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } 注意 不能设置行高 不论设备窗口多大 (pc, mobile), 始终显示指定行数laravel-多对多关联时,-会出现-pivot-字段,-如何删除
$user->roles->makeHidden('pivot'); // 或者在 model 中 protect $hidden = ['pivot'];laravel-wechat-公众号更换url时报-token-验证失败
VerifyCsrfToken 中间件, 排除 微信相关的 路由, 见文档 是否开启了 debugbar, 关闭之, 见github微信开发者工具报-Provisional-headers-are-shown
表现为没有响应结果 原因可能是 ios 设备对 get 请求头长度限制, 更换为 andriod 设备后没问题, 再换回 iphone 突然也好了 可能与设置的 axios.defaults.retry 及 axios.defaults.retryDelay 有关 参考:axios-304-而无法正常拿到数据
服务器报 304 的原理: 客户端第一次向服务端请求资源时, 服务端响应 200 并在响应头中返回一个 ETag 值 客户端再次向服务端请求同一个资源( url 未变), 此时会带上上一次服务端返回的 ETag, 服务器检查其自身内容的 ETag 值是否与其一致,如果一致就会返回 304 状态码,告诉你内容和你保存的一致,没有发生改变过。 解决办法: 在请求头中加入 'Cache-Control': 'no-cache' // axios 封装时, 全局设置 const options = { headers: { 'Cache-Control': 'no-cache' } } const client = axios.create(options) 在请求中添加一个随机的查询字符串, 如 ?query=时间戳 参考:微信开发者工具中-xhr-请求-status-200-但-failed-to-load-response-data
解决办法: 关闭 preserve log 原因: 未知 参考 segmentfault:boostrap4-按屏幕尺寸显示和隐藏
原文见 <!-- sm 及以下隐藏: 全部隐藏, md 及以上显示(block) --> <div class="d-none d-md-block"> hello bootstrap </div>git-删除-untracted-files-(dirs)
git clean -fd # 删除 untracked files git clean -f # 连 untracked 的目录也一起删掉 git clean -fd # 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的) git clean -xfd # 在用上述 git clean 前,建议加上 -n 参数来先看看会删掉哪些文件,防止重要文件被误删 git clean -nxfd git clean -nf git clean -nfd** 转自csdnjs-邮箱正则
let reg = new RegExp("^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$") reg.test('123456@qq.com')element-ui-一系列-then,-catch-事件转成-async-await
// message box async open() { const res = await this.$confirm('此操作将永久删除该文件, 是否继续?', '提示').catch(_ => { console.log('已取消, 结束') }) if (res !== 'confirm') { return } console.log(res, "已确认, 可以next") } 原文参见 csdnnuxt-部署并使用-nginx-作端口转发
代码上传 linux 服务器后, 注意 windows 下开发的 node-sass 包需要重新安装(npm rebuild node-sass), 打包 nuxt 项目 npm run build pm2 启动 nuxt start, 在项目根目录下 pm2 start node_modules/nuxt/bin/nuxt.js -- start 配置 nginx 文件 // 最简配置 server { listen 80; server_name www.nuxt-project.com; location / { proxy_pass http://127.0.0.1:3000; } } 部署时遇到一个问题, nuxt 代码里的 api 请求地址是本地的, 放到服务器也没改, 造成会返 500 部署也可参照 nuxt 官方部署文档element-ui-响应式布局-span-不能为0
<el-col :md="{span:8}" :sm="{span:0}" :xs="{span:0}"> .... </el-col > 会导致样式混乱, 达不到想要的隐藏效果, 可以用 .hidden-sm-and-down 类来实现golang-删除-slice-中的部分元素
golang 对 slice 的操作全在 [:] 中 和 append // 删除切片的第三个元素 sslice := []int{0,1,2,3,4} sslice = append(sslice[:2], sslice[3:]...) Notice sslice[A:B], 包涵 A, 不包括 B; 若 A = B,包涵 A append 第一个参数为 切片, 第二(三,四)个参数为 元素, 若为 切片, 可以使用 … 分解 (析构) 为元素golang-给-struct-赋值-nil
struct ListNode { Val int Next *ListNode } var li *ListNode = nil 原文见csdnnginx-autoindex-off
nginx autoindex off 禁止目录访问go-环境变量设置-proxy
Go version >= 1.13 当你的GO的版本大于1.13的时候 当你安装的GO的语言版本大于1.13的时候,那么就不用这么麻烦了,直接使用go env -w命令就行了 go env -w GOPROXY=https://goproxy.io,direct go env -w GOPRIVATE=*.corp.example.com go env -w GO111MODULE=on 转自掘金nuxt-asyncData-多个接口异步
接口同步, 耗时长 async asyncData({$axios}){ let res1 = await $axios.get('...') let res2 = await $axios.get('...') return { res1: res1, res2: res2 } } 接口异步 async asyncData({$axios}){ let [res1, res2] = await Promise.all([ $axios.get('...'), $axios.get('...') ]} return { res1: res1, res2: res2 }goland-列编辑模式
shift + alt + insert 后按鼠标左键上下拖动即可 在 phpstorm 中使用 alt + 鼠标左键 上下拖动可直接进行列编辑模式, 在 goland 中为 alt + shift + 鼠标左键 另: 可 alt + 鼠标左键 单击选中多个光标进行编辑页面重定向跳转
要求进入某个页面时直接跳转到另一个页面 之前都是在 script 中添加 window.location.href = 目标地址 今天 curl http://baidu.com 后发现一段代码 <html> <meta http-equiv="refresh" content="0;url=http://www.baidu.com/"> </html> 使用 <meta http-equiv="refresh" content="0;url=目标地址"> 也可以直接重定向到另一个网址postman-请求参数类型
查询字符串 路由参数 body 参数 请求头搜索框中输入法弹出时,-按回车直接走了搜索
此时按下回车, 却到了搜索页面 解决办法, 把搜索事件的 按下 enter 事件改为 keydown.native.enterjs-对象深度复制
js 对象复制是地址传递, 而不是值传递, 可以使用如下方法进行``深度复制` deepClone(origin) { let target = {} for (var prop in origin) { if (origin.hasOwnProperty(prop)) { if (typeof (origin[prop]) == 'object' && origin[prop]) { target[prop] = Object.prototype.toString.call(prop) == '[object Array]' ? [] : {} arguments.callee(origin[prop], target[prop]) //递归调用 } else { target[prop] = origin[prop] //原始类型直接复制 } } } return target }windows-中使用命令来登录远程-linux
如果不使用 xshell 类软件, 可以使用 powershell 或 gitbash 等 // 本地虚拟机做了端口转发后 ssh -p 2222 root@127.0.0.1c语言中的-sleep()-函数在-windows-和-linux-下的不同表示
在 windows 中, Sleep() // test.c #include <stdio.h> #include <windows.h> int main(){ Sleep(3000); printf('hello C'); return 0; } 在 linux 中, sleep() // test.c #include <stdio.h> #include <stdlib.h> int main(){ sleep(3000); printf('hello C'); return 0; }nuxt-服务端操作-cookie
cookie-universal-nuxt, 见 npm You can use cookie-universal-nuxt to set, get and remove cookies in both client and server side nuxt appselement-ui-carousel-响应式(自适应)
<template> <div> <!-- banner --> <el-carousel trigger="click" :height="bannerHeight + 'px'"> <el-carousel-item v-for="item in banners" :key="item.id"> <img :src="$store.state.back_url + item.image" alt="banner" ref="bannerHeight" width="100%" @load="imgLoad" > </el-carousel-item> </el-carousel> </div> </template> <script> export default { async asyncData({params, $axios}) { const response = await $axios.get('/phpapi/home-banners') return {banners: response.data.data} }, data() { return { bannerHeight: '', } }, methods: { imgLoad() { this.$nextTick(() => { this.bannerHeight = this.$refs.bannerHeight[0].height }) } }, mounted() { this.imgLoad() window.addEventListener('resize', () => { this.apache-Multiviews-漏洞
腾讯云安全检测提示 xxx.com/icons/index 及 xxx.com/icons/small/index 存在安全漏洞 打开发现是一串 icons 图片, 而在项目文件里并没有这些文件 见: http://www.apache.org/icons/small/ 以下引用自: http://www.511yj.com/apache-colose-icons.html 我们如果使用了apache服务器,当我访问http://xxx.xxx.xxx/icons/时会自动显示这个目录下的所以文件列表,这行造成网站目录信息的泄露对我们的网站安全造成威胁,在 关闭apache自动目录列表功能的三种方法 这篇文章中的三种方法都不能禁止自动目录列表,你如果使用网站安全监测,会提醒你发现目录启用了自动目录列表功能,所以我们必须禁止它,经过测试,按如下步骤可以禁止: 打开目录apache/conf/extra/下的文件httpd-autoindex.conf 找到 Alias /icons/ "/xampp/apache/icons/" <Directory "/xampp/apache/icons"> Options Indexes MultiViews AllowOverride None Require all granted </Directory> <Directory "/xampp/apache/icons"> Options MultiViews AllowOverride None Require all granted </Directory> 我实际上是注释掉了这些配置, 因为用不到这些 icons, 直接达到目的Linux-查看iptables状态-重启
iptables 所在目录 :/etc/sysconfig/iptables service iptables status # 查看iptables状态 service iptables restart # iptables服务重启 service iptables stop # iptables服务禁用 原文链接 csdnelement-ui-响应式
<el-row :gutter="10"> <el-col :xs="{span:24,offset:0}" :sm="{span:16,offset:4}" :md="{span:12,offset:6}"> </el-col> </el-row> 原文微信支付获取支付二维码
未支付时, 可以使用同一个订单号获取二维码 ( 微信支付url ) 信息, 前提是各信息没有改变, 如果 body 等任何一项发生了变化, 那么会报 订单重复. 原文查看路由(接口数)
// web php artisan route:list | wc -l | awk '{print $1 - 4}' // api $ php artisan api:route | wc -l | awk '{print $1 - 4}' 原文见 learnkularavel-队列
windows 中使用 horizon, 原文见 github, learnku composer require laravel/horizon --ignore-platform-reqs php artisan vendor:publish --provider="Laravel\Horizon\HorizonServiceProvider" 在 .env 中将 QUEUE_CONNECTION 改为 reids 后需要在命令行运行 php artisan queue:listen 或 php artisan queue:work 才会开启队列中的任务 因为错误原因一直重复执行某一个队列, 重启 redis 依然如此, 那么需要清空 redis 中的数据 redis-cli #进入脚手架 flushall #清空redis的数据 learnku overtrue 给队列新建 redis 连接运行-npm-config-卡死
之前运行过 npm config set prefix "D:\Program Files(×86)\nodejs\node_global" 之后再运行 npm config ls -a 都不动了. 重装 node 也没有用 解决办法: 删除 users/{$user}/.npmrc 文件 原文地址array_filter-过滤数组中值为空的元素
array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ) : array 通过回调函数返回 true 返回过滤数组中的单元, 组成新数组并最终返回 如果, callable 为空, 则默认过滤数组中等值为 false 的单元(如 null, ‘’, ’ ‘, 0) 等jquery-中-attr()-和-prop()-方法的区别
背景: 使用 jquery 执行 checkbox 的全选与多选时, 第三次点击不能生效 // html <input id="tt" type="checkbox"> <button id="btn">select</button> // js $('#btn').click(function () { if ($(this).text() == 'select') { $("#tt").attr('checked', 'checked') // attr 换成 prop $(this).text('cancel') } else { $("#tt").attr('checked', false) // attr 换成 prop $(this).text('select') } }) 把 其中的 attr 换成 prop 即可 差异 $(’’).attr()返回的是html对象 $(’’).prop()返回的是DOM对象 attr 和 prop 的使用场景: 1.添加属性名称该属性就会生效应该使用prop(); 2.是有true,false两个属性使用prop();(如’checked’,‘selected’,‘disabled’等) 3.其他则使用attr(); 详见原文laravel-关联模型使用-with-调数据时指定字段出错
laravel 关联模型使用 with 调数据时指定字段必须包括 外键的字段 参考: laravel5.1 eloquent with 通过闭包筛选特定 field 得不到结果的问题本机项目放到局域网中使用
第一部分 php环境 环境: laragon 里的 nginx 0 . win10 下自定义本机在局域网内的 ip 地址 网络状态 – 更改连接属性 – ip 设置 – 编辑 首先更改 nginx 里的配置文件, 00-default.conf localhost 加上本机在局域网内的 ip 这样之后重启 nginx, 即在局域网内 ( 电脑或手机均可 ) 访问 192.168.1.18 了, 但是依然不够, 如果有多个虚拟域名希望可以供局域网访问, 那么需要进行第 2 步. 前提: 只能在局域网内的电脑上操作, 手机上不行, 用于接口开发使用也就够了 在另一台电脑上修改 host 文件, 增加一条 域名-ip 映射 关系 192.168.1.18 xxx.test 第二部分 vue 环境 0 . 同第一部分 在 config/index.js 中修改 host 的值为 ‘0.0.0.0’ // host: 'localhost', // can be overwritten by process.laradock-数据库连接
adminer 容器 up 后, 在 127.0.0.1:8080 使用 [ ‘服务器’ => ‘mysql’ ], root + root 默认账户可以登录; 在 navicat 中, 则使用 127.0.0.1 + root + root 即可登录 新的 mysql 数据库可以新建一个测试用户 CREATE USER 'test'@'%' IDENTIFIED BY 'test'; GRANT ALL ON *.* TO 'test'@'%'免费内网穿透工具
ssh -R 80:localhost:[port] serveo.net 之前用的 natapp, 需要 注册获取 authorize_token, 且免费版不稳定, 域名会经常变化(大概半天自动更换). serveo.net 则方便得多, 一行命令即可, 无需注册, 无需 token 在命令行输入如下指令(其中 [port]可自由更改) ssh -R 80:localhost:[port] serveo.net 之后即会给出一个对应地址, 即可在外部访问. 参考: https://alternativeto.net/software/serveo/ https://www.jianshu.com/p/d0b3991a9ce1lodash-的-防抖(debounce)和节流(throttle)
防抖适合于 input 框, 等到最后一次输入才执行需要进行的操作 节流适合于 点击事件, 第一下点击就能生效, 之后指定时间段内的点击不生效 <div id="app"> <input type="text" v-model="tempInput"> <br> <button @click="onClick">点击</button> </div> <script> const vm = new Vue({ el: '#app', data: { tempInput: '' }, methods: { alertFunc() { console.log(this.tempInput) }, onClick() { // this.debouncedClick() this.throttledClick() }, test() { console.log('click' + Date.now()) } }, created() { this.debouncedAlertFunc = _.debounce(this.alertFunc, 5000) // this.debouncedClick = _.debounce(this.test, 5000) this.throttledClick = _.throttle(this.test, 5000) }, watch: { tempInput: function (newVal, oldVal) { this.vue-@input-事件
input 事件 结合了 keyup事件 和 change事件, 会在 keyup 时判断值是否发生变化, 变化了则触发该事件 // html <input v-model="keyword" type="text" id="search" @input="onSearch" autofocus class="input_search" placeholder="问题或选项关键词"> // js onSearch() { ... keyup事件 也可以使用一个旧值在 keyup 的时候来比较值是否变化, 如果没有变化就直接return, 否则给旧值赋上新值, 再进行接下去的业务逻辑 // html <input v-model="keyword" type="text" id="search" @keyup="onSearch" autofocus class="input_search" placeholder="问题或选项关键词"> // js onSearch() { if(this.keyword === this.keyword_old){ return } this.keyword_old = this.keyword ...在列表页中删除一项后,-刷新页面
用vue-router重新路由到当前页面,页面是不进行刷新的 使用 window.reload(),或者router.go(0), 会造成整个页面刷新, 且存在闪动( 抖动 ) 在删除成功后, 重新获取数据, 从而只让列表部分进行刷新npm-install-错误
npm install –registry=https://registry.npm.taobao.org 原文见: https://blog.csdn.net/weixin_42144379/article/details/86064214phpstorm-过滤标签报黄色警告
laravel-policy-返回值类型只能是-boolean(true-或-false)
不能为 int string array 等php-二维数据排序
<?php $arr = [ [ 'aaifdddk' => 3, 'name' => 'test8', ], [ 'aaifdddk' => 5, 'name' => 'test8', ], [ 'aaifdddk' => 2, 'name' => 'test8', ], [ 'aaifdddk' => 4, 'name' => 'test8', ], [ 'aaifdddk' => 1, 'name' => 'test8', ], ]; //usort($arr,function ($a,$b){ // return $a['id'] > $b['id'] ? 1 : -1; //}); array_multisort($arr); var_dump($arr);
Recent Posts
Tags
- apache 4
- axios 1
- benchmark 1
- c 1
- canvas 1
- centos 3
- channel 1
- crontab 1
- css 2
- docker 4
- fail2ban 1
- frp 1
- gin 1
- github 1
- go 26
- goaccess 1
- goroutine 1
- http 1
- https 1
- jetbrains 1
- jquery 1
- js 2
- linux 20
- mermaid 1
- mysql 10
- nginx 3
- node 1
- php 43
- prisma 1
- react 8
- server 1
- ssh 2
- tarojs 1
- tcp/ip 1
- token 1
- ubuntu 1
- ufw 1
- unit-test 1
- vmware 1
- vscode 1
- vue 12
- yum 1
- 域名 3
- 安全 2
- 微信 3
- 算法 3