mysql 220k 数据行时, count() 很慢, 要2s多
问 deepseek “mysql innodb 20万行, 使用 select count(*) from tablea; 耗时2s, 正常吗” 答: mysql innodb 的查询行数是全表扫描, 而 myisam 是直接存储了数量, 可通过加大 innodb_buffer_pool_size 的值来加速, innodb_buffer_pool_size 一般默认为 128M, 现在 改为 4G, 速度变成了 0.2s 查询当前 mysql 的 innodb_buffer_pool_size 值 sql: SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; my.ini(windows) 或 my.cnf(linux) 的 [mysqld] 下 修改 my.ini(my.cnf) 配置文件修改(重启后生效) [mysqld] innodb_buffer_pool_size = 4G 临时修改(重启后失效) SET GLOBAL innodb_buffer_pool_size = 4294967296; # 4G 如果是在 docker compose 中改了配置文件, 需要重新 build image # 在 docker-compose.docker compose 部署 nextjs & mysql
# dock 文件夹为根文件夹 # 其下包涵 mysql 和 next 文件夹, 及 docker-compose.yml 和 .env 文件 # dock/.env ########################################################### ###################### General Setup ###################### ########################################################### ### Paths ################################################# # Choose storage path on your machine. For all storage systems DATA_PATH_HOST=~/.dock/data ### Drivers ################################################ # All volumes driver VOLUMES_DRIVER=local # All Networks driver NETWORKS_DRIVER=bridge ### Docker compose files ################################## # Select which docker-compose files to include. If using docker-sync append `:docker-compose.sync.yml` at the end COMPOSE_FILE=docker-compose.access_token 和 refresh_token 的使用
在 Web 开发中,使用 access_token 和 refresh_token 的双 token 机制是为了在安全性与用户体验之间取得平衡。以下是它们各自的作用以及为什么需要使用双 token: access_token 的作用 访问受保护资源:access_token 是用于直接访问受保护资源的令牌。它通常包含用户的身份信息和权限范围。 短生命周期:access_token 的有效期较短,通常为几分钟到几小时。这样做的目的是减少令牌被泄露后可能造成的损害,因为攻击者只有很短的时间窗口可以利用这个令牌。 refresh_token 的作用 刷新 access_token:当 access_token 过期时,refresh_token 用于获取新的 access_token。它不需要用户重新登录,从而提高了用户体验。 长生命周期:refresh_token 的有效期较长,通常为几天到几周。它通常存储在客户端的安全存储中,如加密的本地存储。 安全存储:由于 refresh_token 的有效期较长,它通常不会频繁地在网络中传输,从而降低了被盗的风险。 为什么要使用双 token 提高安全性:通过将 access_token 和 refresh_token 分开使用,即使 access_token 被泄露,攻击者也无法长时间利用它。而 refresh_token 由于其长生命周期和安全存储,即使被盗,服务器也可以随时将其标记为无效。 优化用户体验:用户不需要频繁重新登录。当 access_token 过期时,系统可以自动使用 refresh_token 获取新的 access_token,用户几乎感觉不到任何中断。 简化 Token 管理:双 token 机制使得 Token 的管理更加灵活,可以根据不同的安全需求设置不同的有效期。 实际 axios 使用时, 使用 axios 的 interceptor 拦截 access_token 失效的请求, 通过 refresh_token 无感刷新 access_token 后, 再重放 之前失败的请求 import axios from 'axios' const instance = axios.dockerfile中CMD和RUN的区别
背景: 在使用 docker-compose 构建镜像时, 对 nextjs service 执行 RUN npm install 报错, 找不到 package.json 文件 原因: volume 中共享的文件夹, 是在容器启动时才开始共享, 在构建时没有共享, 导致 RUN 找不到 package.json, 而 CMD 才是容器运行时执行的命令 在 Dockerfile 中,CMD 和 RUN 是两个不同的指令,它们用于不同的目的和阶段: RUN - 用途:RUN 指令用于在构建 Docker 镜像时执行命令。 - 执行阶段:它在 Docker 镜像的构建过程中运行,生成一个新的镜像层。 - 结果:RUN 命令的结果被永久保存在镜像中,成为镜像的一部分。每次执行 RUN 时,都会创建一个新的镜像层。 - 常见用途: - 安装软件包和依赖项。 - 下载和解压文件。 - 编译源代码。 - 创建目录和文件。 - 配置环境和系统设置。 CMD - 用途:CMD 指令用于指定容器启动时要执行的命令。 - 执行阶段:它在容器启动时运行,而不是在镜像构建时。 - 结果:CMD 命令的结果不会保存在镜像中,因为它是容器运行时的指令。 - 常见用途: - 运行应用的主进程。 - 执行容器的默认命令。 - 可以被 docker run 命令中的命令覆盖。 配置示例 # .gofrp (内网穿透) 的安装和使用
文档地址 使用 gogrp 通过自定义域名访问内网的 Web 服务 1. 安装 分别在 client 和 server 下载便携版的可执行文件, 如 client 是 windows 系统, 则下载后的文件为 frpc.exe, frpc.toml, frps.exe, frps.toml, LICENSE, client 端只需要 frpc.exe 及 frpc.toml 即可 如 server 是 linux 系统, 则下载后的文件只需要 frps 及 frps.toml 2. 配置 # frps.toml 配置 bindPort = 7000 vhostHTTPPort = 8600 # 要设置 vhostHTTPPORT, 最后通过服务端的 ip:vhost端口 进行访问 # frpc.toml 配置 serverAddr = "xx.xx.xx.xx" serverPort = 7000 [[proxies]] name = "test-web" type = "http" localIP = "127.linux 安装、配置 fail2ban 避免服务器恶意登录
详见 github: fail2ban 安装 fail2ban, 以 ubuntu 为例 apt update && apt upgrade apt install fail2ban systemctl start fail2ban systemctl enable fail2ban 配置 fail2ban fail2ban 分为 server 和 client 在 /etc/fail2ban/jail.d 中增加一个自定义 conf, 如 my-jail.conf (从 defaults-debian.conf 复制得到), 添加如下 sshd 配置 # my-jail.conf [DEFAULT] banaction = nftables banaction_allports = nftables[type=allports] backend = systemd [sshd] enabled = true port = 2222 filter = sshd maxretry = 3 bantime = 2592000 # 2592000second = 30day, -1 为永久封禁 重启 fail2ban sudo systemctl restart fail2ban #重启 sudo fail2ban-client status #查看状态 sudo fail2ban-client status sshd #查看sshd的详细状态 查看已禁用的ip fail2ban-client get sshd banned fail2ban-client status sshd # 查看登录尝试记录 lastb # 显示显示失败的登录尝试 last # 与 lastb 类似,但显示的是所有登录尝试,包括成功的登录goaccess export nginx access log to report
使用 goaccess 将 nginx access.log 生成可视化 report.html goaccess github地址 nginx access.log 过滤 # 过滤不统计的日志(如图片、js、css、恶意访问的 login、404 等) cat access.log | grep -vE '(\.css|\.js|\.jpg|\.png|\.gif|\.ico|\.jfif|\.woff|\.woff2|\.eot|\.ttf|\.svg|\.map|bot|Bot|favicon|404|curl|Java|scaninfo|phpMyAdmin|\.env|admin|login|python|http\-client|wp\-|post|POST|\.php|api|ajax|ads\.txt|humans\.txt|well\-known|security\.txt|CONNECT|Head)' > new.log # 只统计 GET 请求 cat new.log | grep 'GET' > new2.log # 只统计 GET 首页的请求 cat new2.log | grep 'GET /' > new3.log goaccess 操作步骤 linux 环境(编译/包管理器)安装 goaccess, 编译安装注意要 --enable-utf8 --enable-geoip=mmdb /etc/goaccess/goaccess.conf 配置 ## 2.1 打开 nginx time-format, date-format, log-format # Apache/NGINX's log formats below. time-format %H:%M:%S # Apache/NGINX's log formats below.Prisma Migrate after Deployment
Prisma Migrate after Deployment 背景: 线上环境部署后,数据库表结构有变更,但未同步到线上数据库中,导致线上环境也需要更新 数据库 & prismaClient。 操作步骤 开发环境 修改 scheme.prisma, 如给 user 添加 age 字段 开发环境 执行 npx prisma migrate dev --name add-age-to-user, 这里要 –name 指定生成的迁移文件(夹)名称, 这里也会同时生成新的 /nodemodules/.prisma/client/* 文件, 不需要再次 npx prisma generate 更新 prismaClient 开发环境 执行 npx prisma migrate deploy 变更数据库表结构 生产环境 pull 到最新的 scheme.prisma 及 migration 文件 生产环境 执行 npx prisma generate 生成新的 /nodemodules/.prisma/client/* 文件 生产环境 执行 npx prisma migrate deploy 同步最新的数据库表结构 (不改变原有数据)Window常用工具软件
Listary, 双击ctrl 文件查找 Everything, 全局文件查找 Wiztree, 全局文件大小查看 WGestures, 鼠标手势 Snipaste, 截图、贴图 FastStone, 截图、录屏Centos磁盘查看
记一次服务器负载过高导致web访问变慢 阿里云监控 在阿里云监控平台发现内存占用 75%以上, cpu在 50%左右, 检查系统负载 uptime, 分别显示一段时间的平均系统负载, 1分钟, 5分钟, 15分钟 检查内存 free -h 检查 cpu 服务器查看 top 都卡, 后查看 pm2, 发现一个实例就占用了 1G+内存, pm2 reload 1 实现重启, 内存占用到 200M ps: ssh界面 如果宽度不够长, pm2 ls 只会显示部分列, 要查看更多(如 uptime 等), 需拉长或全屏终端. 检查磁盘 df -h 查看总占用 cd / && du -ah –max-depth=1 | sort -rh 查看根目录下文件夹占用 进去某个文件夹, du -ah –max-depth=1 | sort -rh 查看文件夹占用 nginx access.log 过大, echo -n '' > access.log 清空文件Fix Failed to Verify Certificate X509
修复 “Failed to Verify Certificate X509” 问题 问题出现背景 linux 环境下在 go 中用一个函数获取 https 证书有效期, 在查询一个由 freessl cname 申请的证书后, 发现报错 Errortls: failed to verify certificate: x509: certificate signed by unknown authority 而在 windows 环境又正常, 遂在 linux 中使用 curl https://xxx.com 得到 curl: (60) Peer's Certificate issuer is not recognized. More details here: http://curl.haxx.se/docs/sslcerts.html package pkg import ( "crypto/tls" "errors" "time" ) func WillExpireIn7Days(hostname string) (bool, time.Time, error) { conn, err := tls.Dial("tcp", hostname+":443", nil) if err !Line Breaks for Strings on Canvas
canvas 绘制文本时, 换行如何解决 背景 微信小程序中使用 canvas 绘制分享海报长文本不能自动换行 题外: Taro 小程序中 canvas 的宽高设置 // poster.jsx export default () => { useLoad(() => { ... const dpr = Taro.getWindowInfo().pixelRatio // canvas对象 通过 createSelectorQuery 获取 canvas.width = renderWidth * dpr canvas.height = renderHeight * dpr ctx.scale(dpr, dpr) ... }) return ( ... <Canvas id='poster' type='2d' style='width:320px;height:400px' /> ... ) } 思路 对于纯中文, 不用考虑单词被分到两行 先将文本按每个 字符 分成数组 按 canvas 的 measureText 方法调整一行的宽度(字体大小不同, 宽度不同), 获取每一行应该出现的文本 分行按高度输出 对于纯英文, 要考虑单词被分到两行Go File Server
使用 go 内置 http 快速开启文件服务器 func main() { // 方式1 // http.ListenAndServe(":8080", http.FileServer(http.Dir("./public"))) // 方式2: 可自动生成对应文件列表页面 fs := http.FileServer(http.Dir("public")) // http.Handle("/public/", http.StripPrefix("/public/", fs)) // http.Handle("/", http.StripPrefix("/public/", fs)) http.Handle("/", fs) http.ListenAndServe(":8080", nil) }Upgrade Nodejs by Yum on Centos
centos7.9 yum 升级 nodejs(14->16) 步骤 首先确定当前 nodejs 是由 yum 安装的 $ yum list installed | grep nodejs # nodejs.x86_64 2:12.22.12-1nodesource @nodesource 删除当前 nodejs 版本 (https://github.com/nodesource/distributions) yum remove nodejs rm -r /etc/yum.repos.d/nodesource*.repo yum clean all 添加 nodejs16 源 $ curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash - 安装 nodejs $ sudo yum install -y nodejs $ node -v $ npm -vSql Count With Condition
多表 left join 后, 使用 count 查询需要使用 distinct, 如果 count 里需要再次添加条件, 使用 distinct if(…) # 不做聚合查询 select company.id as company_id, company.name as company_name, vacancy.id as vacancy_id, vacancy.name as vacancy_name, shop.id as shop_id, shop.shop_name as shop_name, course.id as course_id, course.title as course_name from tb_company company left join tb_position vacancy on vacancy.company_id = company.id left join tb_shop shop on shop.company_id = company.id left join tb_shop_curriculum course on course.shop_id = shop.id where (vacancy.Line Clamp 展开问题
要求: 多行文本时, 显示可展开按钮, 如果小于指定行数则无需显示 通过 line-clamp 设置行数 通过里外 div 的高度来初始化是否需要 “展开” 按钮 <!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> <style> .contentBox { margin: 20px 0; border: 1px solid #666; width: 200px; } input { display: none; } .outer { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 5; } input[name="toggle"]:checked + .outer { -webkit-line-clamp: unset; } input[name="toggle"]:checked + div.outer + label::after { content: '收起'; } label::after { content: '更多'; } label { display: none; background: #aaa; padding: 1px 2px; } </style> </head> <body> <button onclick="setLine('<3')">文本长度 < 3 行</button> <button onclick="setLine('=3')">文本长度 = 3 行</button> <button onclick="setLine('>3')">文本长度 > 3行</button> <div class="contentBox"> <input type="checkbox" id="toggle" name="toggle"> <div class="outer"> <div class="inner"> -webkit-line-clamp CSS 属性可以把块容器中的内容限制为指定的行数。 <br> 它只有在 display 属性设置成 -webkit-box 或者 -webkit-inline-box 并且 box-orient 属性设置成 vertical时才有效果。 <br> 在大部分情况下,也需要设置 overflow 属性为 hidden,否则,里面的内容不会被裁减,并且在内容显示为指定行数后还会显示省略号。 </div> </div> <label for="toggle"></label> </div> <script> function displayLabel() { if (document.Nginx__config Proxy_pass
参考简书: nginx 之 proxy_pass 详解 nginx conf 之 proxy_pass 使用背景 vue3 项目调用后台接口时, 不希望将后端接口地址(host地址) 暴露给普通用户, 并且直接解决浏览器跨域问题, 会使用 nginx 对接口地址作代码, 表面上访问前端 vue 项目的接口地址, 实际上会通过代码转发到真正的后端服务地址 vue3+vite 开发环境在 vite.config.js 配置代理 // vite.config.js export defaut defineConfig({ ... server: { proxy: { '/api': { target: 'http://backend.test/api', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') } } } ... }) nginx conf 生产环境 按要代理的地址最后是否带 ‘/’,及是否有 子目录分为 2 种情况, 每种情况按是否有子目录又可再细分为 2 种情况 有 ‘/’ 表示绝对路径, 不带 location; 没有表示相对路径, 要带上 location 后的路径Apache_bench_in_go__hey
使用 hey 代替 ab 对网站应用做性能测试 (服务器配置) https://github.com/rakyll/hey hey is a tiny program that sends some load to a web application. 二八定律: 80% 的请求(访问)集中在 20% 的时间内 假设一个网站每日 pv (page visit) 300w, 也就是 300w*80% <=> 3600*24*20%, 240w pv 在 17280s 内, 240*10000/17280 = 138 QPS (query per second) 如果单台机器支持的 QPS 在 50, 那么需要 3 台这样的机器才能满足需求 ## hey 执行结果示例 $ hey http://localhost:8080/api/tmp Summary: Total: 0.1239 secs Slowest: 0.0961 secs Fastest: 0.0006 secs Average: 0.Docker Build Development Environment of Tarojs
// 目录结构 |-- project folder | |-- xxx | |-- yyy | |-- zzz | |-- ... | |-- docker-files | | Dockerfile | | docker-compose.yml // Dockerfile # syntax=docker/dockerfile:1 FROM node:16-alpine RUN \ npm config set registry http://registry.npmmirror.com \ && npm install -g @tarojs/cli RUN mkdir -p /var/www WORKDIR /var/www // docker-compose.yml version: '3.7' networks: frontend: driver: bridge services: ### Taro ############################################## taro: container_name: taro restart: always build: context: .vmware-共享文件夹设置
虚拟机关机状态下, vmware中 设置-选项-共享文件夹 添加要共享的文件夹 虚拟机开机, vmware中 虚拟机-安装VMware-Tools 虚拟机中安装 open-vm-tools-desktop (has gui) 或 open-vm-tools (no gui) 虚拟机中执行 /usr/bin/vmhgfs-fuse .host:/ /home/user1/shares -o subtype=vmhgfs-fuse,allow_other 挂载共享文件夹, ubuntu 提示 allow_user 需要其它设置, 则删除 ‘,allow_other’ 即可 open-vm-tools 安装参考官方文档 文件夹挂载 参考文档 参考csdn: vmware 挂载共享文件夹Exercise_go_unit_test_是否回文
编写一个回文检测函数,并为其编写单元测试和基准测试,根据测试的结果逐步对其进行优化。(回文:一个字符串正序和逆序一样,如“Madam,I’mAdam”、“油灯少灯油”等。) 来源:李文周blog tip: 要考虑中文则使用 rune // palindrome/palindrome.go package palindrome func IsPalindrome(s string) bool { // 转成 rune, 应对中文等特殊字符 r := []rune(s) l := len(r) for i := 0; i < l/2; i++ { if r[i] != r[l-1-i] { return false } } return true } // palindrome/palindrome_test.go package palindrome import ( "fmt" "testing" ) func TestIsPalindrome(t *testing.T) { type test struct { text string want bool } arr := []test{ {"", true}, {"a", true}, {"aa", true}, {"ab", false}, {"aba", true}, {"abcba", true}, {"abccba", true}, {"abcdabcd", false}, {"Madam,I’mAdam", false}, {"油灯少灯油", true}, } for _, tc := range arr { t.TCP/IP 模型
TCP/IP 模型分层 DOD: The Department of Defense, 美国国防部模型 OSI: Open Systems Interconnection, 国际标准化组织提供 DOD四层模型 OSI七层模型 备注 应用层 应用层 http,smtp,ftp… 表示层 会话层 传输层 传输层 tcp,udp…,端口 网络层 网络层 ip,arp 网络接口层 数据链路层 帧,mac地址 物理层 0,1 Socket(套接字) Socket是BSD UNIX的进程通信机制,通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。Socket可以理解为TCP/IP网络的API,它定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。电脑上运行的应用程序通常通过”套接字”向网络发出请求或者应答网络请求。 socket 抽象层, 是对 tcp/ip 的封装 TCP… UDP…Goroutine 练习题
题目: 使用 goroutine 和 channel 实现一个计算int64随机数各位数和的程序,例如生成随机数61345,计算其每个位数上的数字之和为19。 开启一个 goroutine 循环生成int64类型的随机数,发送到 jobChan 开启24个 goroutine 从jobChan中取出随机数计算各位数的和,将结果发送到resultChan 主 goroutine 从resultChan取出结果并打印到终端输出 题目来源: 李文周blog package main import ( "fmt" "math/rand" "runtime" "time" ) func main() { numChan := make(chan int, 24) resChan := make(chan int) for i := 0; i < 24; i++ { go func() { for num := range numChan { if check19(num) { resChan <- num break } } }() } FOR: for { select { case res := <-resChan: fmt.Go | for...range 中 value 的地址
nums := []int{1, 2, 3} for i := 0; i < len(nums); i++ { fmt.Printf("%p \n", &nums[i]) } for index, num := range nums { fmt.Printf("%p %p \n", &nums[index], &num) } // 0xc00000c150 // 0xc00000c158 // 0xc00000c160 // 0xc0000180e0 0xc00000c150 // 0xc0000180e0 0xc00000c158 // 0xc0000180e0 0xc00000c160 由上可知, 有 for range 遍历中, value 的地址是固定的, 相当于初始化一个变量, 之后每次遍历会把 value 值赋值给该变量 题目: 请问下面代码的执行结果是什么? 题目来源: liwenzhou-blog go语言基础之结构体 type student struct { name string age int } func main() { m := make(map[string]*student) stus := []student{ {name: "小王子", age: 18}, {name: "娜扎", age: 23}, {name: "大王八", age: 9000}, } for _, stu := range stus { m[stu.Go 中 make 与 new 的区别
背景: 在 go 中, 基本类型的变量, 在使用var定义变量, 但是初始化值时, 系统会默认赋初始值, 如 string => “"(空字符串), int => 0, bool => false, 如果是 struct, 也会按 field 的类型(要求 field 的类型也为基本类型)进行初始化 对于 slice, map, channel 这三种类型, 使用 var 定义类型后, 其值为 nil, 不占内存, 所以需要先分配内存, 不能只定义类型后就直接赋值 // map 初始化 map1 := make(map[string]string) // 推荐 map2 := map[string]string{} fmt.Printf("%#v\n", map1) fmt.Printf("%#v\n", map2) // slice 初始化 slice1 := make([]int, 0) slice1 = append(slice1, 1) var slice2 []int slice2 = append(slice2, 1) slice3 := []int{} // 不推荐 slice3 = append(slice3, 1) fmt.Go Defer Return 题 - 李文周
题1: 阅读下面的代码,写出最后的打印结果 来源: 李文周blog - go语言基础之函数 return res 底层实现: 返回值 = x, 如果函数中已定义返回变量名, 则该返回变量 = x 执行返回 遇到 defer 时 return res 底层实现 返回值 = x. 如果函数中已定义返回变量名, 则该返回变量 = x; 如果函数中未指定返回变量名, 则假定返回变量名为 returnValue, 也就有 returnValue = x 执行 defer 的函数 执行 返回 func f1() int { x := 5 defer func() { x++ }() return x } func f2() (x int) { defer func() { x++ }() return 5 } func f3() (y int) { x := 5 defer func() { x++ }() return x } func f4() (x int) { defer func(x int) { x++ }(x) return 5 } func main() { fmt.Go slice 底层数组题
请写出下面代码的输出结果 ⭐⭐⭐⭐ func main() { type Map map[string][]int m := make(Map) s := []int{1, 2} s = append(s, 3) fmt.Printf("%+v\n", s) m["q1mi"] = s s = append(s[:1], s[2:]...) fmt.Printf("%+v\n", s) fmt.Printf("%+v\n", m["q1mi"]) } 问题简化为 s := []int{1, 2, 3} s2 := s fmt.Println(s, s2) s = append(s[:1], s[2:]...) fmt.Println(s, s2) 点击查看 result: [1 2 3] [1 2 3] [1 3] [1 3 3]Go slice 写出代码的运行结果
请写出下面代码的输出结果 func main() { var a = make([]string, 5, 10) for i := 0; i < 10; i++ { a = append(a, fmt.Sprintf("%v", i)) } fmt.Println(a) } 点击查看 make 后 a 已经初始化为 []string{"","","","",""} 之后再 append, 会添加到后面 []string{"","","","","",“0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,9"}Find the only number in a list
题: 有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字? 来源: 李文周 Go语言基础之运算符 利用 ^ 二进位异或 运算符 func findTheOnlyNumber(nums []int) (res int) { for index, num := range nums { if index == 0 { res = num } else { res = res ^ num } } return }Number of Chinese in a String
题目: 编写代码统计出字符串"hello沙河小王子"中汉字的数量 题目来源: 李文周blog: Go语言基础之基本数据类型 tips: 字符串用 for 遍历, str[i] 的值是 byte(uint8) 类型, 且下标 i 是连续的, 从 0 到 len(str) 字符串用 for range 遍历, index,value 的值是 rune(int32) 类型, 下标不一定是连续的, 碰到中文只会出现中文的首下标, 然后跳到下一个 rune 字符 func getChineseCharNumInAString(str string) (num int) { for i, r := range str { if byte(r) == str[i] { continue } num++ } return num }Linux Crontab Pwd
背景: 使用 crontab -e 添加定时任务后, 发现任务没有如希望的执行, 发现要执行的命令是使用了相对路径引入文件, 推测是文件路径不正常 在 linux 中 root 用户执行命令 crotab -e 添加任务获取当前工作目录 * * * * * pwd >> ~/tmp.txt 2>&1 之后生成一新用户 # root 用户 # -m 生成用户同名 home 目录 useradd -m test passwd test # test 用户 同样新增获取 pwd 输出到其 home 目录的任务 crontab -e 经过执行发现, 在 /root/tmp.txt 文件中 pwd 输出为 /root 在 /home/test/tmp.txt 文件中 pwd 输出为 /home/test “The cron daemon starts a subshell from your HOME directory” 参考文档Jquery Fill Vue Input
想要使用 Jquery 写油猴脚本自动填充网页中的 input 框时, 使用 jquery 操作如下 <form> <input type="text" name="username"> <input type="password" name="password"> </form> $('input:eq(0)').val('myname') // eq 用于特定第几个 input $('input:eq(1)').val('mypassword') 但如果目标网页是由 Vue(React) 编写的, 那么此种方法并不能改变框架内的 v-model 的值, 原因是 Vue 监听的是 input 元素的 input 事件, 而直接使用 jquery(vanilla js) 修改 input 元素的值并不会触发 input 事件, 解决办法是修改值后, 手动触发 input 事件 $('input:eq(0)')[0].dispatchEvent(new Event('input'), {bubbles: true})Jetbrains Word Separator
jetbrains 设置待定… vscode 中 文件-首选项-设置, 搜索 editor.wordSeparators 进行设置Js Data Types
flowchart TD L1([JS 数据类型]) L1-->L21(基本类型 数值类型) L1-->L22(对象类型 引用类型) L21-->L301(字符串) L21-->L302(数字) L21-->L303(布尔) L21-->L304(undefined) L21-->L305(null) L22-->L311(对象) L22-->L312(数组) L22-->L313(函数) flowchart TD L1([JS 数据类型判断方法]) L1-->L21(typeof) L1-->L22(instanceof) L1-->L23("===") L21--可以判断-->L311(字符串 数字 布尔 undefined function) L21--不可以判断-->L312(null Vs Object Object Vs Array) L22-->L321(对象的具体类型) L23-->L33(null, undefined)一台机器内ssh连接两个github账号
问题: 如何在一台机器连接两个github账号 step1 生成两个 id_rsa 文件 一台机器使用 ssh 连接到 github 需要用到本地的 id_rsa.pub 文件, 一般在 /users/.ssh 文件夹内, 如果没有 id_rsa 文件, 则使用如下命令生成, 然后把这个 key 复制到 github 中 ssh-keygen -t ed25519 -C "your_email@example.com" 如果直接把 ssh key 复制到另一个 github 账号, 会提示 key 已被使用, 那么需要另外再生成一个 key, 使用 -f 命令指定生成的文件名 ssh-keygen -t ed25519 -C "your_email@example.com" -f "id_rsa2" step2 配置 github 使用不同的 id_rsa 在 .ssh 文件夹内新建 config 文件 # 该文件用于配置私钥对应的服务器 # Default github user(first@mail.com) Host github.com HostName github.Buffer-String()-和-Buffer-String()
b1 := bytes.Buffer{} // 非指针 b2 := bytes.NewBuffer([]byte{}) // 指针 b3 := &bytes.Buffer{} // 指针, 等同于 b2 b1.WriteString("abc") b2.WriteString("abc") fmt.Println(b1) // {[97 98 99] 0 0} fmt.Println(b1.String()) // abc fmt.Println(b2) // abc 原因: *Buffer 有方法 String(), Buffer 没有 String() 方法. fmt.Println(b1), 就是 fmt 将 b1 按普通结构体进行输出: 分别输出各项 fmt.Println(b1.String()), 调用了 *Buffer 的 String() 方法 fmt.Println(b2), 自动调用 *Buffer 的 String() 方法 参考自 stackoverflowwindows10-解除文件占用
win10 使用 powershell 删除文件夹 rm -r -fo ./dirname, 不能使用 rm -rf ./dirname 参考知乎 Powershell 中的 rm -rf 任务管理器 -> 性能 -> 打开资源监视器 -> cpu -> 关联的句柄 -> 搜索句柄 参考百度经验强制解除文件占用gin-middleware-注意事项
1. gin middleware 如果要中止后面中间件及所有程序的执行, 需要使用 c.Abort() + return 其中 Abort 会中止其后的中间件及页面处理程序, 而不会中止当前中间件函数内的余下程序, 使用 return 来中止当前中间件内后部的程序 func RejectMethodsExceptGet() gin.HandlerFunc { rejectMethods := map[string]struct{}{ "POST": {}, "DELETE": {}, "PUT": {}, "PATCH": {}, } return func(c *gin.Context) { if _, exist := rejectMethods[c.Request.Method]; exist { c.AbortWithStatusJSON(403, gin.H{ "err_msg": "invalid method", }) return } c.Next() } } 2. 中间件 Use 需要写在路由注册之前, 否则将不对之前注册的路由起作用 r := gin.New() r.Use(RejectMethodsExceptGet()) r.GET("/test", func(c *gin.Context) { example := c.MustGet("example").(string) // it would print: "12345" log.go-routine-使用外部变量问题
for i := 0; i < 10; i++ { go func() { fmt.Println(i) } } time.Sleep(time.Second) // 10,10,10,10,... 使用 go vet 检查 // 修改 for i := 0; i < 10; i++ { go func() { i2 := i fmt.Println(i2) } } // 或者(推荐) for i := 0; i < 10; i++ { go func(i int) { fmt.Println(i) }(i) } time.Sleep(time.Second) 参考 https://www.jianshu.com/p/e5f328819d4b查看本机-ip
hostname -I ip addr ifconfig, // 需要已安装 net-tools一道小题--获取本月有多少天
$today = "2018-8-8"; echo date('t',strtotime($today));// t 为本月天数, 28-31之间 // date() 函数可以直接得出, 避免了 复杂的判断 闰年,几月 等使用-gregwar-captcha-生成固定字符的验证码
使用 gregwar/captcha 可以方便地生成验证码图片(直接输出或 base64) $builder = new CaptchaBuilder; $builder->build(); $text = $builder->getPhrase(); // 验证码文本 $pic = $builder->inline();// base64 captcha 现如今在 laravel 本地环境中(非 production), 不想每次生成新的要去图片查验的验证码, 查看文档, 说是 “直接使用 $builder = new CaptchaBuilder('12345')”, 其中的 12345 (phrase) 必须为 string 但是这样再使用 $builder->inline() 会报错, 无法生成验证码图片 经过查看 CaptchaBuilder.php 类文件, 比较两种方式有什么差别() 可以发现, 随机生成验证码我多走了一步 $builder->build(), 而这正是通过 GD 库来绘制图片的步骤. 问题的原因找到了 看完 build() 方法会看到 return $this, 于是可以通过 $builder = $builder->build() 来获取最新的实例, 接下来就可以使用 inline() 方法了 ps: 其实就算没有 return $this (不使用 $builder = $builder->build() 而用 $builder->build() ) 也可以正常返回 base64 图片, 因为图片内容在方法中传回给实例的属性了, 在 inline() 方法中会调到到这些属性什么是BFC---BFC的原理及作用-
原文见: https://www.cnblogs.com/libin-1/p/7098468.html 和 https://www.jianshu.com/p/acf76871d259 ##BFC定义 在一个Web页面的CSS渲染中,块级格式化上下文 (Block Fromatting Context) 是按照块级盒子布局的。W3C对BFC的定义如下: 浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, table-cells, 和 table-captions), 以及overflow值不为“visiable”的块级盒子,都会为他们的内容创建新的BFC(块级格式上下文)。 一个HTML元素要创建BFC,则满足下列的任意一个或多个条件即可: 1、float的值不是none。 2、position的值不是static或者relative。 3、display的值是inline-block、table-cell、flex、table-caption或者inline-flex 4、overflow的值不是visible BFC是一个独立的布局环境,其中的元素布局是不受外界的影响,并且在一个BFC中,块盒与行盒(行盒由一行中所有的内联元素所组成)都会垂直的沿着其父元素的边框排列。 ##BFC的作用 ######1. 清除内部浮动 我们在布局时经常会遇到这个问题:对子元素设置浮动后,父元素会发生高度塌陷,也就是父元素的高度变为0。 解决这个问题,只需要把把父元素变成一个BFC就行了。常用的办法是给父元素设置overflow:hidden。 ######2. 垂直margin合并 在CSS当中,相邻的两个盒子的外边距可以结合成一个单独的外边距。这种合并外边距的方式被称为折叠,并且因而所结合成的外边距称为折叠外边距。 折叠的结果: 两个相邻的外边距都是正数时,折叠结果是它们两者之间较大的值。 两个相邻的外边距都是负数时,折叠结果是两者绝对值的较大值。 两个外边距一正一负时,折叠结果是两者的相加的和。 这个同样可以利用BFC解决。关于原理在前文已经讲过了。 ######3. 创建自适应两栏布局 在很多网站中,我们常看到这样的一种结构,左图片+右文字的两栏结构。如何减少-if---else----甚至-switch-的使用
需求: $str = '1,3,5'; // 变成 'abc,ghi,mno' $arr = [ [ 'id'=>1, 'name'=>'abc' ], [ 'id'=>2, 'name'=>'def' ], [ 'id'=>3, 'name'=>'ghi' ], [ 'id'=>4, 'name'=>'jkl' ], [ 'id'=>5, 'name'=>'mno' ], ]; 使用 if..else 或 switch 方法可以完成 现考虑不使用这两种方式作法: 思路: 把下面的 id 值作为键, name 值作为值, 重新构成一个数组 $arr2, 从 $str 中获取数字 如1, 使用 $arr2[‘1’] 来获取对应的 name php解法: // 1. 把当前 $arr 转成 目标数组 $arr2 $arr2 = []; foreach ($arr as $v) { $arr2[$v['id']] = $v['name']; } $str_to_arr = implode(',', $str);// [1,3,5] $str_to_arr = array_map(function(value){ return $arr2['value']; }) $str2 = join(',', $str_to_arr); JS 解法: js 只支持索引数组, 不支持关联数组, 但是 ES6 的 Map 对象支持任意的键或值 var str = '1,3,5'; var data = [ { id: 1, name: '中国' }, { id: 2, name: '美国' }, { id: 3, name: '日本' }, { id: 4, name: '韩国' }, { id: 5, name: '俄国' } ]; console.帝国cms(v7-5)-在内容模板中使用-truetime-字段
truetime 是真实发布时间, 也就是后台 mysql 执行 insert 的时间; lastdotime 是真实更新时间, 也就是后台 mysql 执行 update 的时间; newstime 是发布时间, 由用户自定义, 在新增信息时, 表单中自行填写; // 在模板中直接使用 $nvainfor 数组进行调用, 比如: <br>navinfor[id]-<?=$navinfor[id]?> <br>navinfor[content]-<?=$navinfor[content]?> <br>navinfor[newstime]-<?=$navinfor[newstime]?> <br>navinfor[truetime]-<?=$navinfor[truetime]?> <br>navinfor[lastdotime]-<?=$navinfor[lastdotime]?> ps: 使用 $navinfor 可以访问当前记录(1条)的全部字段信息, 使用 [!–id–] 方式只能访问到部分信息 见: http://www.phome.net/doc/manual/template/ 原文见: http://www.phome.net/doc/manual/template/html/other.html#q17帝国cms-1条信息如何实现多个内容页--
需要如图: ‘曲线救国’ 路线: 依然是一个内容页模板, 但是 聚集三个页面的内容, 比如分成三个 div, 通过js 默认第一个 div 显示, 另两个不显示, 然后点击哪个 div, 哪个 div 显示, 其它的隐藏不间断空格-none-breaking-space-(-u00a0)
从网上复制的一些文本可能含有特殊字符, 不间断空格(unicode 编码为 \u00a0)就是一种, 效果与 ’ ’ 普通空格类似, 但有不同. 不同: 对英文单词间使用普通空格, 会自动换行; 使用不间断空格连接的单词会被认为是一个单词而直接全部换到下一行, 这在 html 也是同样的效果. 在 php 中使用 普通空格替换 不间断空格的方式 $str = "a a a"; $str = str_replace(chr( 194 ) . chr( 160 ), " ", $str); 参考自stackoverflowweb2-0-和-web1-0
Web1.0 的主要特点在于用户通过浏览器获取信息。 Web2.0 则更注重用户的交互作用,用户既是网站内容的浏览者,也是网站内容的制造者。 所谓网站内容的制造者是说互联网上的每一个用户不再仅仅是互联网的读者,同时也成为互联网的作者;不再仅仅是在互联网上冲浪,同时也成为波浪制造者;在模式上由单纯的“读”向“写”以及“共同建设”发展;由被动地接收互联网信息向主动创造互联网信息发展,从而更加人性化vue-router-push-后页面位置不是在顶部
原文见: https://blog.csdn.net/M_SSY/article/details/82850517 解决办法: 在 router/index.js 中 new router 时, 加入如下代码 scrollBehavior(to, from, savedPosition) { return {x: 0, y: 0 } }vue-nuxt-中-通过路由来实现导航高亮
首先在 mounted() 中判断了路由, 实现高亮, 后来发现刷新才有用, 直接 router.push 过去的链接则不生效 监听路由变化, 执行同样的判断 mounted() { this.initHighlight() }, watch: { "$route"() { this.initHighlight() } }, methods: { // 导航高亮 initHighlight() { if (this.$route.name == 'route1') { this.active_id = -2 } else if (this.$route.name == 'route2) { this.active_id = -1 } else if (this.$route.name == 'route3') { this.active_id = this.$route.params.navid } else { this.active_id = 0 } } } 参考自: segmentfaultvue-cli3-0-项目-全局-styl-样式在-App-vue-引入后变量不生效
错误情况 在 assets 下新建 common.styl 样式, 在 App.vue 的 style 标签引入后. 在没有变量的情况下可以全局使用, 有变量时, 则变量不生效 解决办法 不需要在 App.vue 中引用 在 vue.config.js 中引用 module.exports = { css: { loaderOptions: { stylus: { 'resolve url': true, 'import': [ './src/theme', './src/assets/css/public/common' ] } } } }virtualbox-centos7-7-nat-网络连接-并使用-ssh-连接
virtual 添加 nat 网络 虚拟机配置 nat 网络 centos 系统文件修改 cd /etc/sysconfig/network-scripts/ // 查找 ifcfg-enp... 文件并修改其中的 onboot 为 yes vi ifcfg-en0s3 // 修改后, 重启 network 服务, 并用 ping 或 curl 进行测试 service network restart ping www.baidu.com 虚拟机设置 xshell 连接 ssh -p root@127.0.0.1 2222 或 文件-新建-连接….ubuntu-没有root默认密码--
环境: vmware简易安装 ubuntu 版本 18.04 安装完成后 root 用户没有密码, 但是中途让添加过一个用户, 这个用户即有 sudo 权限 # 使用 `sudo passwd` 设置 root 的密码 # 使用 `su` 切换到 root 用户 How to Find/Change Ubuntu Default Root Passwordtp5-在模板(或php文件中)中获取当前的控制器名
tp5-1-和-laravel-中的-facade-门面
facade 的作用是把 类(动态)方法 当作 静态方法 使用; 简称 静态代理 <?php class Demo { public function index(){ echo 'hello world'; // echo __METHOD__; } } class DemoFacade { public static function __callStatic($name, $arguments) { $demo = new Demo(); $demo->$name(); } } DemoFacade::index();// hello worldtp5-1-的依赖注入,-服务容器,-facade
在一个类中 实例化另外一个类, 就是依赖性强, 耦合度高, 在 tp5.1 中 可使用 依赖注入 来解耦 class A { public function hello(){ echo 'hello'; } } class B { public function sayHello(){ $a = new A(); $a->hello(); } } class C { // 依赖注入的用法 public function sayHello(A $a){ $a->hello(); } } 进一步使用 依赖容器 container 来解耦 容器就是一个装有各种类的对象的仓库, 然后通过 依赖容器 来实现对象的调用 最后还可以使用 facade 封装各个类(对象) 的方法, 形成对外的统一方法, 从而使用者(开发者) 无需关心调用的是哪个类的哪个方法, ( 而统一使用的是 facade 类的方法)tp5-0-中的-volist-中的循环变量-$i
// 输出循环变量: {volist name="list" id="vo" key="k" } {$k}.{$vo.name} {/volist} //如果没有指定key属性的话,默认使用循环变量i,例如: {volist name="list" id="vo" } {$i}.{$vo.name} {/volist} -这里的索引是从 1 开始的, 而不是从 0 开始thinkphp5-0-解决跨域
在 public/index.php 中加入 header("Access-Control-Allow-Origin:*"); header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Methods:GET, POST, OPTIONS, DELETE"); header("Access-Control-Allow-Headers:Request-Timestamp,Access-Token,Refresh-Token,Access-Control-Allow-Origin,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, Accept-Language, Origin, Accept-Encoding"); if(strtolower($_SERVER['REQUEST_METHOD']) === 'options'){ exit; } 貌似 tp5.1 中路由可以设置允许跨域 Route::get('new/:id', 'News/read') ->ext('html') ->allowCrossDomain();test
第一章 人力资源服务业发展与变革 1. 人力资源服务业概念与特性 概念: 人力资源服务业是为劳动者就业和职业发展,为用人单位管理和开发人力资源提供相关服务的专门行业。是现代服务业中商务服务业的重要组成部分 主要载体: 人力资源公共服务和人力资源经营性服务 行业特性: 基础性、引领性、成长性 2. 人力资源服务业态 求职超聘服务 招聘洽谈会 信息网络服务 高级人才寻访 取业指导服务 素质测评服务 培训服务 人力资源管理咨询服务 流动人员人事枯*管理服务 人力资源外包服务 券务派造 3. 人力资源服务业发供四十年 1979-1992 市场萌芽期 1993-2006 生态开展期 2007-2012 业态形成期 两部合并 2013-至今 创新活跃期 4. 人力资源服务业发展的三大标志 2011年,国家统计局《国民经济行业分奏》 (CB/T4754-2011)首次在“商务服务业” 中列出人力资源服务业。 2018年,习近平总书记在十九大报告中提出“着力加快建设实体经济,科技创新、现代金融、人力资源协同发供的产业体系”,并且强调“在中高端消费、创新引领,绿色低碳、共享经济、现代供应德、人力资本服务等领城培育新增长点、形成新动能。”人力资源第一次成为国家重点关注的行业领城。 2019年10月30日,国家发很和改革委员会修订发布了《产业结构调整指导日录》2019年本,废止2011年本。首次将人力资源和人力资源服务业(第46奏)作为鼓砌奏单独到出。 5. 人力资源服务业数据 人社部公布数据,载至2019年底: 全国共有各卖人力资源服务机构3.96万家; 全年行业总营收1.96万亿元; 共帮助2.55亿人次实现就业择业和流动; 为4211万家用人单位提供了服务。 人力资源服务业营业总收: 2019年较2010年增长17倍 6. 人力资源服务地方标谁、评级及诚信经营 2007年企业标谁 2008年此京市人才服务地方标谁 2013年此京市人力资源服务地方标准 2018年京津冀区域协同地方标谁 《人力资绿服务规范》 DB11/T3008-2018 《人力资源服务机构等级划分与评定》 DB11/T3009-2018 7. 北京市促进行业发展的有关政策简介 《关于进一步发挥猎头机构引才融智作用建设专 业化和国际化人力资源市场的若干措施(试行)》 加强猎头机构人才队伍建设。 引导猎头机构为我市政府机关、事业单位,金些和社会组织子各奏用人单位提供精准服务,给予精谁化引才势励。 推选猎夫机构集约化发表。 拓宽猎头机构融资渠道。 推动猎头机构技水和服务创新。 提升猎头机构对外开放水平。 打选猎头机构优质服务品牌。 引导建立错头行业联盟。 加强猎头机构诚信体系建设。 简化行政许可流程。 关于2020年使用猎头机构导访人才及奖励介绍supervisor-unix----tmp-supervisor-sock-no-such-file
[root@iZm5e09hymnzdmgx3964zgZ etc]# cat -n supervisord.conf | grep /tmp -- 22 [unix_http_server] 23 ;file=/tmp/supervisor.sock ; the path to the socket file 24 file=/var/run/supervisor.sock ; the path to the socket file -- 45 [supervisord] 46 ;logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log 47 logfile=/var/log/supervisord.log ; main log file; default $CWD/supervisord.log -- 50 loglevel=info ; log level; default info; others: debug,warn,trace 51 ;pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid 52 pidfile=/var/run/supervisord.pid ; supervisord pidfile; default supervisord.position--fixed-有时候会失效
当父(祖)元素使用了 transform 后, 当前元素的 position 会发生改变, 其参照父元素进行定位, 而非 window 窗口 参见: https://www.jianshu.com/p/4f77fa62e14bphp中-utf-8-还是-utf8--
utf8、utf-8 和 UTF-8 的区别如下: 一、“UTF-8”这是标准写法,在PHP和HTML中设置编码,统一写成“UTF-8”。 举例: PHP中 —— HTML中 —— 二、“utf8”、“utf-8”和“UTF8”只是在window中不区分大小写的写法而已,一般程序能识别,但也有例外。例如简写的“UTF8”或“utf8”在ie浏览器里不识别。 三、数据库命令模式中,必须写成“utf8”,因为MySQL的命令模式中只能识别“utf8”,比如:PHP程序中可以写: 结论:MySQL操作使用“utf8” 【mysql_query(set names utf8)】,其他一律使用“UTF-8”。 原文见: https://blog.csdn.net/ahjxhy2010/article/details/79722997phpstorm-连接-mysql5-7
连接 mysql5.6 没有问题, 但是连接 mysql5.7 就会报 [08S01] Communications link failure The last packet sent successfully to … 需要把 useSSL 改为 false 参考: https://blog.csdn.net/baofeidyz/article/details/54344359phpoffice---phpword-写入文件不可打开
使用 phpword 的模板写入字符串时, 最后生成的文件打开失败. 这可能是因为 写入的文件内容没有 做 htmlspecialchars 处理, 而 docx 的 xml 不允许 &, ‘, “, <, > 字符, 这几样需要进行转义处理.php-重写(override,-覆盖)-和-重载(overload)
重写: 子类继承父类时, 重写了方法 重载: 传统意义上的重载(如java), 指一个类中存在多个同名的方法, 但接收参数不一样, php 不支持这样的写法 php 提供的 overloading(重载), 指的是 动态地创建类属性和方法, 通过 魔术方法 来实现php-图片处理扩展包-intervention-image-在-win-中使用遇到问题
环境: laravel-admin + laragon 使用 intervention/image 时, 报错 : encodeing format(tmp) is not suppoerted 原因: intervention/image 这个包不与 windows 兼容 临时解决办法: 修改 包文件 AbstractEncoder.php 原文见 github laravel-admin issuePHP-三大设计模式--单例&工厂&注册树
<?php // 单例模式(三私一公) class Site{ protected static $_instance; protected function __construct(){ return self::$_instance; } protected function __clone(){ } public static function getSingleton(){ if(! (self::$_instance instanceof self)){ self::$_instance = new self(); } return self::$_instance; } } // 工厂模式 class Factory{ public static function create($className){ return $className::getSingleton(); } } // 注册树模式 class Container{ protected static $object = []; public static function set($alias, $obj){ self::$object[$alias] = $obj; } public static function get($alias){ return self::$object[$alias]; } public static function _unset($alias){ unset(self::$object[$alias]); } Container::set('site', Factory::create('Site'));// 把单一对象实例挂到注册树上 $site = Container::get('site');// 从注册树中获取对象php-类方法的连接调用-$this--where()--select()
这种类方法最后都返回了 $this, 从而能连续调用; 至于中间的方法, 通过类属性将值保存起来, 可供后续方法继续使用notes--基于-Composer-的-PHP-模块化开发
笔记来源 overtrue: 基于 Composer 的 PHP 模块化开发 1. what & why composer 是 php 版本的版本控制工具, 如 js 里的 npm, go 里的 mod. 1.1 composer.json 的组成 基础字段 name, description, keywords, license 依赖 require, require-dev 自动加载: autoload, autoload-dev PSR-4 PSR-0 classmate files 其它 scripts, minimum-stability, bin, repositories, support, config 其中, 若是一个项目, name 表示 project name, 若是一个包, name 表示 package name 在没有 composer 之前, 靠人工复制粘贴代码, 存在代码安全及 repeat yourself 的问题 1.2 版本号的组成 Major.Minor.Patch major: 大的功能变更, 不向后兼容 minor: 新增功能, 向后兼容 patch: 补丁, 向后兼容, 修复 bug 1.mysql中 date_add(date,interval type)
mysql中 date_add(date,interval type) 中, date类型不能为"时间戳"middleware-gin-contrib-cors-在-301-时失效
背景: gin 配置了路由 router.GET("/api/users") , 添加了 cors 中间件, 但是访问 /api/users/ 时, 会返回 301 + cros 错误 原因: gin 默认打开 “RedirectTrailingSlash”, 表示自动添加(或删除) “/” 并作 301 跳转, 这时候还未进入 middleware, 所以 cors 中间件所添加的 header 不会出现在返回头中. 中间件其它现象: c.Header("before-next": "can-be-show") // 会写入到返回头 c.next() c.Header("after-next": "won't be returned") // 不会出现在返回头中 解决办法: 在 gin 路由中同时添加 带 / 和不带 / 的路由, 工作量大, 且 ugly ❌ 使用 nginx 在 go-web 程序外部直接全部带上 cors 头 ✅localStorage-setItem()-存入的是-string
localStorage.setItem('flag', 0) // 存入 int let a= localStorage.getItem('flag') // 取出的是 string '0' console.log(typeof(a)) // stringlinux-ssh-端口更改-及-ip-限制-&-rsa-登录
原文见 cnblog: 修改linux的ssh默认端口号22的方法 rsa 参考 一、修改配置文件 vi /etc/ssh/sshd_config 找到#Port 22 修改为自己要使用的端口号:Port 26000 然后 :x 退出保存 二、重启ssh服务 /etc/init.d./sshd restart 如果还要设置防火墙,配置:vi /etc/sysconfig/iptables 启用26000端口:/etc/init.d/iptables restart 三、如果要显示固定IP才能登陆: 1.修改 /etc/hosts.deny, 加入一行sshd:ALL –#意思是任何ip都不能登陆 2.然后修改:/etc/hosts.allow,在其中进行如下设置:sshd:192.168.0.241:allow –#意思是只允许192.168.0.241登陆 四、rsa 密钥对登录 client 执行以下命令生成密钥对 (~/.ssh) ssh-keygen -t rsa 把 is_rsa.pub 复制到服务器的 ~/.ssh/authorized_keys 文件后面 配置 /etc/ssh/sshd_config RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys service sshd restart 20241220 新增 上述是 centos 更改 ssh 端口, 不适用 ubuntu 2204 以后的版本, ubuntu 最新版本 配置ssh端口如下 参考自 csdn: 【解决】Ubuntu SSH Server 修改默认端口无效laravel5-5+-Package-Auto-Discovery-包自动发现
转载自原文 一切的起源都是来自 composer.json ,在使用 composer 的时候,你可以在 post-autoload-dump 部分指定你想执行的脚本,比如在 Laravel 5.5 的时候,我们可以看到这样的定义: "scripts": { "post-autoload-dump": [ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" ], ... } 对于 postAutoloadDump 是很熟悉了,Laravel 之前的版本基本都有,它的工作是清理一些缓存,删除一些旧的文件。 我们的关注重点是 @php artisan package:discover ,也就是会执行 @php artisan package:discover 这个命令。 这个命令是干嘛的呢?它其实是位于Illuminate\Foundation\Console\PackageDiscoverCommand 中,主要是通过执行Illuminate\Foundation\PackageManifest 的 build() 方法来达到 发现 package 的目的。 而 PackageManifest 早就注册在 Laravel 的 Container 中,那么它可以保证每次在启动 Laravel 的时候都能使用 PackageManifest 的 build() 方法,这个 build() 方法主要的逻辑就是: 找寻 vendor/composer/installed.json 这个文件,这个文件是 composer 自己生成的,记录着每一次的 composer autoload 的 class map。 而此时,Laravel 又将这些内容映射到 extra.laravel-定时任务不执行了--
linux 服务端使用 pm2 开启 php artisan queue:work 守护进程, 突然 队列不工作了. 原因可能是 代码更新后, 没有重启 任务, 所以 pm2 reload 0 即可laravel-migration-`Integrity-constraint-violation-`
原因不是 约束的 key 重复了, 而是数据库中已存在数据, 且该字段重复了laravel-factory()--make()---create()-的区别
相同点: 都是生成模型的实例 不同点: create() 同时执行了 save()方法, 保存到了数据库中; make() 只生成了模型实例laravel-dispatch()-异步任务耗时长--
在控制器中使用 This->dispatch(new Job()) 后, 接口依然耗时长. 原因是 job 类中 __contruct() 方法里操作过多(请求api等), 这一步是同步进行的. 真正 异步 执行的是 Job 类中的 handle() 方法json-Unmarshal-如何获取-null
对于如下 json 和 struct, 会将 gender 解析为 false, 而实际上应为 nil, 则需要 将 struct 中的 bool 类型转为 *bool 类型 { "name": "Jim Green", "age": 15, "gender": null } type Student struct { Name string `json:"name"` Age int `json:"age"` Name bool `json:"gender"` } 因为在 go 中指针不可以进行运算, 只能引用 对于 *bool 类型的变量, 不能直接赋值 如 var gender *bool *gender = true // panic: runtime error: invalid memory address or nil pointer dereference 而应该对非指针类型赋值, 再引用指针 var gender *bool tempGender := true gender = &tempGenderjs-数组-for----in---中的-key-返回的是-string
js 数组 for… in.. 中的 key 返回的是 stringjs-的遍历
id-heroku-com-打不开
搭梯子**后依然打不开 换了几个 dns 也不行 使用 https://www.ultratools.com/tools/ipWhoisLookupResult](https://www.ultratools.com/tools/ipWhoisLookupResult) 添加到 本地 host 文件中即可访问html中的友情链接不被`爱站`和`站长工具`的友链收录-
百度上原因说可能是 服务器开启了硬件防火墙; 自己遇到的是部署在虚拟主机上的项目, 不涉及硬件防火墙; 打开网页源代码, 发现友情链接为空, 原来是通过ajax传递过来的友情链接, 换成非ajax即可被正常收录html-字体大小-font-size-不一至时的垂直对齐问题
Xx, 就如 Xx , 默认是文本底部对齐, 设置父元素的 text-align:middle; 可以令文本完全垂直对齐 原文见: https://blog.csdn.net/qq_30541261/article/details/79754478guzzle-http-post-(json)
$client = new \GuzzleHttp\Client(); $response = $client->post('http://xxx.com/api/login', [ 'json' => [ 'phone' => "152xxxx1234", 'password' => "123456", ] ]); $response = $client->post('http://xxx.com/api/login', [ 'form_params' => [ 'phone' => "152xxxx1234", 'password' => 123456, ] ]); 若使用 json, 则 数组中的值(不论是否数字), 都要用 引号 起来, 而 form_params 则不需要 referencego-通用-http-client-请求头
参考stackoverflow: adding-a-default-http-header-in-go package main import ( "fmt" "net/http" "time" ) const accessToken = "MY_DEMO_TOKEN" type MyRoundTripper struct { r http.RoundTripper } func (mrt MyRoundTripper) RoundTrip(r *http.Request) (*http.Response, error) { r.Header.Add("Authorization", "Bearer: "+accessToken) return mrt.r.RoundTrip(r) } func main() { client := &http.Client{ Timeout: time.Second * 10, Transport: MyRoundTripper{r: http.DefaultTransport}, } fmt.Println(client.Get("http://google.com/")) }git-创建远程分支---从远程分支拉取本地不存在的分支
原文 新建远程分支 git push origin remote_branch_name:local_branch_name // remote_branch_name 是远程分支的名字 // local_branch_name 是本地分支的名字 git branch -a // 查看所有分支(远程+本地) 删除远程分支 git push origin :remote_branch_name // 或 git push origin --delete remote_branch_name 原文 git fetch git checkout -b local_branch_name origin/remote_branch_namegit-clone-出错--RPC-failed
转载自: https://blog.csdn.net/qq_34121797/article/details/79561110 一、问题原因及现象 在网络情况不稳定下克隆项目时,可能会出现如下错误:  出现此问题原因 http缓存不够或者网络不稳定等。 二、解决方案 修改git配置: 1、查看当前配置命令 git config -l 2、httpBuffer加大 git config –global http.postBuffer 524288000 3、压缩配置 git config –global core.compression -1 4、修改配置文件(可选) export GIT_TRACE_PACKET=1 export GIT_TRACE=1 export GIT_CURL_VERBOSE=1 以上配置文件修改,也可以大幅度提升git 克隆速度foreach-中使用-&地址符时,-最后要释放-value
$arr = [1,2,3]; foreach($arr as $key=> &$value){ if ($key){ $value = $value +1; } } unset($value); // 要注意翻译 $value, 否则后面如果还要用到 $value 时, 会指向 $arr 的最后一个元素dingo-api-返回-response--array()--setStatusCode()
phpstorm 对 $this->response->item(***)->setStatusCode(***) 中的 item() 和 setStatusCode() 都有提示, 找了下 Dingo\Api\Routing\Helpers trait类 中的 __call() 方法 public function __call($method, $parameters) { if (method_exists($this->response(), $method) || $method == 'array') { return call_user_func_array([$this->response(), $method], $parameters); } throw new ErrorException('Undefined method '.get_class($this).'::'.$method); } 意为调用 $this->response() 类( Factory类)的 $method (也就是 array() 方法), 并将 $parameters 作为参数 也就是 Factory 类的 array() 方法, 没想到 在 Factory 类中, array() 方法也是通过 __call() 魔术方法调用的… 另: call_user_func_array() 方法: 调用回调函数,并把一个数组参数作为回调函数的参数 如果调用的方法是一个类方法, 那么用 数组将 类名和方法名 组合起来 [$this->response(), $method] 表示回调方法apache添加php模块时cannot-load--dll出错
C:\Users\Administrator>httpd.exe -k start httpd.exe: Syntax error on line 185 of C:/tnwamp/Apache24/conf/httpd.conf: Canno t load C:/tnwamp/php5.6.31/php5apache2_4.dll into server: \xd5\xd2\xb2\xbb\xb5\x bd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3 原因可能是缺失 mvcr100.dll, 可以通过双击打开 php.exe文件查看是否如此, 如果提示缺失 mvcr100.dll, 那么上 https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=30679 下载一个 vcredist_x86.exe 即可( 这是是32位的 )apache_通常每个套接字只允许使用一次_错误
安装了apache2.4.27, 在cmd中启动apache服务( httpd.exe -k start )的时候却提示:通常每个套接字只允许使用一次. 原因可能是系统默认 httpd.exe 服务自动开启, 可以先关闭该服务( httpd.exe -k stop ), 再重新开启; 然后在 计算机-( 右键 ) -管理-服务 中关闭apache服务的自动启动acme-sh-自动申请-ssl-证书
/root/.acme.sh/acme.sh --install-cert --nginx /usr/local/nginx/conf/vhost/my.domain.conf -d my.domain.com \ --key-file /usr/local/nginx/ssl/my.domain.com/key.pem \ --fullchain-file /usr/local/nginx/ssl/my.domain.com/cert.pem \ --reloadcmd "supervisorctl restart nginx" 上面的 –nginx 指定配置文件路径 参考: https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E 1. 生成证书, 检测域名所有权 acme.sh --issue -d www.aaa.com --webroot /www/wwwroot/www.aaa.com #或 acme.sh --issue -d www.aaa.com --nginx /usr/local/nginx/conf/sites-enabled/www.aaa.com.conf # 注意: 在 issue 阶段不要在 conf 中设置 listen 443 及 ssl 相关配置, 否则在没有正确的 cert&key 文件时会有报错 # 应在 issue 执行后, 再在 conf 文件中添加 ssl 相关配置 2. 配置 nginx 文件路径 ssl_certificate /usr/local/nginx/ssl/www.aaa.com/cert.pem; ssl_certificate_key /usr/local/nginx/ssl/www.aaa.com/key.pem; 3.2020-09-16
02-线性表
Chrome 插件使用说明 打开 Google Chrome 浏览器 地址栏输入 “chrome://extensions” 打开扩展程序页面 点击「加载已解压的扩展程序」加载扩展程序 enable 该扩展程序 打开对应网站即可使用$_ENV-&-getenv()
php 中 $_ENV & getenv() 获取的是环境变量, 如 windows 中 高级系统设置中的环境变量 或 linux 中 export 设置 getenv() 或 $_ENV 获取的是(系统)环境变量, 而不是 .env 文件. 在默认variables_order = "GPCS" 时, laravel 中使用 $_ENV 不能获取到(系统)环境变量, 但是可以获取到 .env 中的变量, 是因为 laravel 在初始化时使用 phpdotenv 将 .env 中的值添加到 $_ENV 中了. 另外 laravel 中 getenv() 本来就可以获取到(系统)环境变量, 也可以获取到 .env 文件中的设置的环境变量, 是因为 laravel(phpdotenv) 用 putenv() 设置了请求期间内有效的环境变量. ini_set() 配置可修改范围 参考php手册 laravel 初始化 dotenv 参考文章 Laravel ENV—— 环境变量的加载与源码解析jetbrains-ctrl+wheel-实现-zoom
参考: https://intellij-support.jetbrains.com/hc/en-us/community/posts/207002965-Font-Size-Zoom-In-Webstorm-10go-自定义-struct-转-json
需求: 从 api 获取到 json, 本地 unmarshal 为 struct 后, 以另外的 json tag marhsal 为 json 字符串 type Student struct { Name string `json:"name"` Age int `json:"age"` } strIn := `{ "stu_name": "Jim Green", "age": 14 }` // to json strOut := `{ "name": "Jim Green", "age": 14 }` 使用到的方法 UmarshalJOSN / MarshalJSON 方法一: 通过中间 struct 变量的匿名嵌套 struct embedding (注意防止无限循环使用 alias) package main import ( "encoding/json" "fmt" ) type Student struct { Name string `json:"name"` Age int `json:"age"` } func (s *Student) UnmarshalJSON(data []byte) error { type Alias Student aux := &struct { *Alias StuName string `json:"stu_name"` }{ Alias: (*Alias)(s), } if err := json.linux-三命令(三剑客)之-sed
使用 sed 对文件进行文本替换 (windows 下也可用) // 输出替换后的文本 sed 's/foo/bar/g' input.txt // 在原文件上进行修改 -i sed -i 's/foo/bar/g' input.txt // 要替换的文本中包含特殊字符 如 '/ ', 则使用 +/_或其它字符 作为分隔符 sed 's+http://+https://+g' input.txt 参考自: www.cyberciti.bizvscode-中双击单词选择不被-短横线-分开
// 执行文字相关的导航或操作时将用作文字分隔符的字符 "editor.wordSeparators": "`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?", 参考: segmentfault
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