Hello World - 收藏
type: channel
link: https://wlwl.host/index.php/category/collection/
description: 一些文章收藏
items: stripe 支付
items: Gin 路由和代理
items: 一键静态WEB服务器
items: comfyui api
items: comfyui 入门
items: git 命令
items: 使用JWT鉴权
items: 经典语录
items: 提升自我
items: ffmpeg 常用命令

stripe 支付
type: item
date: 2024-04-18T13:19:00+00:00
description: stripe一体化全球支付平台，有良好的用户体验和界面设计，支持多种接入方式，且功能比较灵活，也易于集成。注册和API密钥账户注册验证激活访问Stripe网站：https://stripe.com/zh-hk ，并点击登录按钮登录，没有账号的可以先注册一个。填写必要信息：提供您的电子邮件地址、密码等信息以注册账户，并完成身份验证步骤，以确保账户的安全性。集成stripe支付，一开始账户处于开发模式，所有数据都是模拟的，上线时录入商家或公司信息激活账户进入真实模式。API密钥获取登录Stripe控制台：https://dashboard.stripe.com ，使用您的账户信息登录Stripe控制台。进入开发人员界面，单击API密钥选项卡，在下面可以找到公钥和密钥。在开发阶段，使用测试密钥，在生产环境中使用生产密钥，注意保管好密钥。妥善保管这些凭据，并根据需要定期更新它们，以维护支付系统的安全性集成前后端这里使用go语言为后端语言，react为前端语言。一、设置服务器将依赖项添加到您的项目并导入库。go get -u github.com/stripe/stripe-go/v78接下来创建一个结账接口，前端客户请求这个接口时，按客户的要购买的商品来创建一个结账会话，并将这个会话的ClientSecret返回给客户。import ( "log" "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/stripe/stripe-go/v78" "github.com/stripe/stripe-go/v78/checkout/session" ) func init() { // This is your test secret API key. stripe.Key = "sk_test_51P12rrI3yx14f44QTHOPqliw9So8GBpZ6EIPi7v1iDbdlgr5NH0vXIH3zUjQJwxLI7pbAsfSErQOy75sAVr7q4ra00AODgXKD0" } func CreateCheckoutSession(c *gin.Context) { var req struct { Email string `json:"email"` Amount int64 `json:"amount"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{ "msg": "param decode error:" + err.Error(), }) } params := &stripe.CheckoutSessionParams{ LineItems: []*stripe.CheckoutSessionLineItemParams{ { PriceData: &stripe.CheckoutSessionLineItemPriceDataParams{ Currency: stripe.String("usd"), UnitAmount: stripe.Int64(10000 * req.Amount), ProductData: &stripe.CheckoutSessionLineItemPriceDataProductDataParams{ Name: stripe.String("AI Tools"), }, }, Quantity: stripe.Int64(1), }, }, CustomerEmail: stripe.String(req.Email), Metadata: map[string]string{"email": req.Email, "amount": strconv.Itoa(int(req.Amount))}, Mode: stripe.String(string(stripe.CheckoutSessionModePayment)), UIMode: stripe.String("embedded"), ReturnURL: stripe.String("http://localhost:5173/#/payment?session_id={CHECKOUT_SESSION_ID}"), } s, err := session.New(params) if err != nil { log.Printf("session.New: %v", err) } c.JSON(http.StatusOK, gin.H{ "clientSecret": s.ClientSecret, }) }按客户实际…

Gin 路由和代理
type: item
date: 2024-04-16T14:40:00+00:00
description: 路由Gin路由遵循Restful API接口规范，是基于httproute实现的基本路由语法如下，httpMethod为请求类型，relativePath为路径，handlers为该路由响应函数列表（多个中间件加一个执行函数）router.<httpMethod>(relativePath string, handlers ...HandlerFunc)支持GET、POST、PUT、PATCH、DELETE、OPTIONS等请求类型，Any方法匹配所有类型，Match方法匹配指定的多个类型func main() { router := gin.Default() router.GET("/login", loginEndpoint) router.POST("/login", loginEndpoint) router.Any("/login", loginEndpoint) router.MatchMatch([]string{"POST","GET"}, "/login", loginEndpoint) router.Run(":8080") }路径规则如下"/path"，指定路径，只能匹配/path"/:path"，参数路由，可以匹配/a和/b等，不能匹配/a/b"/*path"，任意路由，可以匹配/、/a和/a/b等所有路由路由按指定路径优先进行匹配，参数路由和任意路由在同一级不可共存func main() { router := gin.Default() // 匹配/user/john但不会匹配/user/或者/user router.GET("/user/:name", func(c *gin.Context) { name := c.Param("name") c.String(http.StatusOK, "Hello %s", name) }) // 将匹配/user/john/和/user/john/send // 如果没有其他路由匹配 /user/john，它将重定向到 /user/john/ router.GET("/user/:name/*action", func(c *gin.Context) { name := c.Param("name") action := c.Param("action") message := name + " is " + action c.String(http.StatusOK, message) }) router.Run(":8080") }路由分组func main() { router := gin.Default() // 简单的路由组: v1 v1 := router.Group("/v1") { v1.POST("/login", loginEndpoint) v1.POST("/submit", submitEndpoint) } // 简单的路由组: v2 v2 := router.Group("/v2") { v2.POST("/login", loginEndpoint) v2.POST("/submit", submitEndpoint) } router.Run(":8080") }路由中间件Gin框架是洋葱结构的，可以同时使用多个中间件，按注册顺序执行，中间件中使用c.Next()函数调用下一个中间件或路由响应函数，如果没有使用c.Next()则执行完此中间件将会返回func Logger() gin.HandlerFunc { return func(c *gin.Context) { t := time.Now() // 请求前 c.Next() // 请求后 latency := time.Since(t) log.Print(latency) } } func main() { r := gin.New() r.Use(Logger()) r.GET("/test", func(c *gin.Context) { }) r.Run(":8080") }中间件可以给指定路由用，比如r.GET("/test", Logger, loginEndpoint)代理拼接真实服务器链接，使用http请求资源，再使用DataFromReader方法返回资源const apiAddr = "https://example.com" func Proxy(c *gin.Context) { url, err := url.Parse(apiAddr + c.Request.URL.Path) if err != nil { c.JSON(http.StatusBadRequest, gin.H{ "err": err.Error(), }) }…

一键静态WEB服务器
type: item
date: 2024-04-02T11:05:00+00:00
description: 简化HTTP服务器的配置和管理，使用系统自带的服务，无需安装任何东西，将指定目录作为HTTP服务器的根目录，一键开启静态服务器实现原理Window10和Window11自带PowerShell，使用HttpListener类创建HTTP服务，绑定端口接收请求并返回指定文件。Linux系统自带python，用http.server模块即可创建简易的HTTP服务器。Windows系统实现创建server.ps1文件，并写入如下内容# PowerShell Web Server Param( [parameter(Mandatory=$false)][Int]$port=8080, [parameter(Mandatory=$false)][String]$webPath="www" ) Add-Type -AssemblyName System.Web $scriptPath = $PSScriptRoot $http = [System.Net.HttpListener]::new() $http.Prefixes.Add("http://localhost:$port/") $http.Start() function ConvertTo-Base64($str){ $result = [Convert]::ToBase64String([System.Text.UTF8Encoding]::UTF8.GetBytes($str)) return $result } function ConvertFrom-Base64($str){ $byteArray = [Convert]::FromBase64String($str) return [System.Text.UTF8Encoding]::UTF8.GetString($byteArray) } function Send-WebResponse($context, $content) { if($content.GetType().Name -ne "String"){ $content = ConvertTo-JSON $content } $buffer = [System.Text.Encoding]::UTF8.GetBytes($content) $context.Response.ContentLength64 = $buffer.Length $context.Response.OutputStream.Write($buffer, 0, $buffer.Length) } function Get-PostData{ $reader = new-object System.IO.StreamReader($context.Request.InputStream) $text = $reader.ReadToEnd() # $text = $text.Replace("%3D","=") # $text = ConvertFrom-Base64 $text $text = [System.Web.HttpUtility]::UrlDecode($text) Write-Host "$text" return ConvertFrom-Json $text } if ($http.IsListening) { write-host "HTTP Server Ready! " -f 'black' -b 'gre' write-host "$($http.Prefixes)" -f 'y' } # INFINTE LOOP, Used to listen for requests while ($http.IsListening) { $context = $http.GetContext() $RequestUrl = $context.Request.Url.LocalPath Write-Host "$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) : $($context.Request.Url)" -f 'mag' # Get Request Url if ($context.Request.HttpMethod -eq 'GET') { # Redirect root to index.html if($RequestUrl -eq "/") { $RequestUrl = "/index.html" } if(Test-Path "$scriptPath\$webPath\$RequestUrl"){ $fileStream = [System.IO.File]::OpenRead( "$scriptPa…

comfyui api
type: item
date: 2024-01-09T12:55:00+00:00
description: comfyui-api文档GET /historyGET /history获取所有历史任务数据请求参数名称位置类型必选说明prompt_idquerystring否8b918008-751f-414c-9575-7174e841ceac返回示例200 Response{}返回结果状态码状态码含义说明数据模型200OK成功Inline返回数据结构GET /embeddingsGET /embeddings获取一个列表返回示例200 Response{}返回结果状态码状态码含义说明数据模型200OK成功Inline返回数据结构GET /history/{prompt_id}GET /history/8b918008-751f-414c-9575-7174e841ceac获取历史任务数据(根据任务id获取历史数据)返回示例成功返回结果状态码状态码含义说明数据模型200OK成功Inline返回数据结构GET /extensionsGET /extensions获取扩展节点文件列表返回示例200 Response{}返回结果状态码状态码含义说明数据模型200OK成功Inline返回数据结构POST /upload/imagePOST /upload/image上传图片接口Body 请求参数image: string 请求参数名称位置类型必选说明bodybodyobject否none» imagebodystring(binary)是图片将以二进制格式发送到服务器返回示例成功{ "name": "aaa (7).webp", "subfolder": "", "type": "input" }返回结果状态码状态码含义说明数据模型200OK成功Inline返回数据结构POST /upload/maskPOST /upload/mask上传蒙版图片接口，一般用于局部重绘Body 请求参数image: string type: input subfolder: clipspace original_ref: "{“filename”:”下载.png”,”type”:”input”,”subfolder”:”clipspace”}" 请求参数名称位置类型必选说明bodybodyobject否none» imagebodystring(binary)是图片将以二进制格式发送到服务器» typebodystring否上传图片的目标文件夹» subfolderbodystring否上传图片的目标子文件夹» original_refbodystring是无返回示例成功{ "name": "下载.png", "subfolder": "clipspace", "type": "input" }返回结果状态码状态码含义说明数据模型200OK成功Inline返回数据结构GET /viewGET /view图片的在线预览接口（上传图像，生图图像，蒙蔽图像，均通过该接口预览）请求参数名称位置类型必选说明filenamequerystring是图片名称typequerystring否图片存放位置的文件夹（input为长传图片，output为生成的图片）subfolderquerystring否子文件夹(没有可不填)previewquerystring否预览channelquerystring否无返回示例成功" "返回结果状态码状态码含义说明数据模型200OK成功Inline返回数据结构POST /view_metadata/{folder_name}POST /view_metadata/{folder_name}无请求参数名称位置类型必选说明folder_namepathstring是none返回示例200 Response{}返回结果状态码状态码含义说明数据模型200OK成功Inline返回数据结构GET /system_statsGET /system_stats系统统计信息接口返回示例成功{ "system": { "os": "posix", "python_version": "3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0]", "embedded_python": false }, "devices": [ { "name": "cuda:0 NVIDIA GeForce RTX 2080 Ti : cudaMallocAsync", "type": "cuda", "index": 0, "vram_total": 23266590720, "vram_free": 13600655680, "torch_vram_total": 6811549696, "torch_vram_free": 26…

comfyui 入门
type: item
date: 2023-12-30T09:34:00+00:00
description: 简介基于stable diffusion的功能强大、模块化程度高的AI绘图软件，自带图形界面和接口服务的后端节点/图形/流程图界面用于实验和创建复杂的稳定扩散工作流程，无需编写任何代码完全支持SD1.x、SD2.x、SDXL和SVD异步队列系统许多优化：仅重新执行工作流程中在执行之间发生变化的部分命令行选项：--lowvram使其在显存小于3GB的GPU上运行（在显存较低的GPU上自动启用）即使您没有 GPU，也可以使用：--cpu（慢）从生成的PNG文件加载完整的工作流程（带有种子）将工作流程保存/加载为Json文件启动速度非常快完全离线工作：永远不会下载任何东西安装即使没有显卡也可以使用处理器运行comfyui，但是不推荐这样做（非常慢），最好拥有超过32GB内存和6GB显存英伟达显卡。Window系统推荐使用绘世启动器傻瓜式安装，不用浪费时间折腾各种依赖的安装。安装最新的显卡驱动下载绘世启动器，解压到一个空目录下启动绘世，按照提示操作需要先安装.NET桌面运行环境，点击确认和下载并安装软件后再次启动绘世等待软件自动下载好数据文件后，按提示进入到内核下载按照下图选择下载内核，这里可以选择不安装torch，可以在后面再安装安装完成软件会自动关闭，再次启动软件即可到软件操作界面接下来可安装模型、插件，再一键启动comfyuilinux系统安装python，不支持python3.12版本，推荐3.11版本安装torch，打开pytorch官网，往下翻找到并选择安装命令，如下图所示如果是英伟达显卡并安装最新版本驱动可执行此命令：pip install torch torchvision torchaudio克隆comfyui仓库（先安装git），git clone https://github.com/comfyanonymous/ComfyUI.git切换到comfyui目录：cd ComfyUI，安装comfyui依赖：pip install -r requirements.txt启动comfyui：python main.py使用下载checkpoints大模型文件，比如sd_xl_base_1.0.safetensors可从此网站下载：https://hf-mirror.com/stabilityai/stable-diffusion-xl-base-1.0/tree/main将文件移动到comfyui的models\checkpoints目录中启动comfyui，在浏览器中打开链接：http://127.0.0.1:8188选择默认工作流，点击右侧的load default在load checkpoints节点中选择刚才下载的模型可修改输出图片尺寸和随机数种子等等参数，点击右侧的queue prompt即可生成图片(速度取决于所选模型和电脑配置)建议使用翻墙环境，否则下载插件和模型等等会有各种网络问题，可使用模型镜像站缓解此类问题插件安装（中文插件）安装comfyui管理器插件，可使用绘世的插件安装功能，也可手动克隆ComfyUI-Manager到ComfyUI/custom_nodes目录启动comfyui，在浏览器上右侧可看到manager按钮表示安装成功，点击可使用其各种功能安装中文插件，使用manager插件的install custom nodes功能搜索language从结果列表中选择AIGODLIKE-COMFYUI-TRANSLATION插件安装安装完成后重启，点击右侧switch locale即可切换中文参考链接项目地址：https://github.com/comfyanonymous/ComfyUI工作流示例：https://comfyanonymous.github.io/ComfyUI_examples管理器插件：https://github.com/ltdrdata/ComfyUI-Manager国内镜像站：https://hf-mirror.com国内模型站：https://aigccafe.net

git 命令
type: item
date: 2023-07-31T14:44:00+00:00
description: 安装$ sudo apt install git #两个都安装命令git init # 初始化本地git仓库（创建新仓库） git config --global user.name "xxx" # 配置用户名 git config --global user.email "xxx@xxx.com" # 配置邮件 git config --global color.ui true # git status等命令自动着色 git config --global color.status auto git config --global color.diff auto git config --global color.branch auto git config --global color.interactive auto git config --global --unset http.proxy # remove proxy configuration on git git clone git+ssh://git@192.168.53.168/VT.git # clone远程仓库 git status # 查看当前版本状态（是否修改） git add xyz # 添加xyz文件至index git add . # 增加当前子目录下所有更改过的文件至index git commit -m 'xxx' # 提交 git commit --amend -m 'xxx' # 合并上一次提交（用于反复修改） git commit -am 'xxx' # 将add和commit合为一步 git rm xxx # 删除index中的文件 git rm -r * # 递归删除 git log # 显示提交日志 git log -1 # 显示1行日志 -n为n行 git log -5 git log --stat # 显示提交日志及相关变动文件 git log -p -m git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容 git show dfb02 # 可只用commitid的前几位 git show HEAD # 显示HEAD提交日志 git show HEAD^ # 显示HEAD的上一个版本的提交日志 ^^为上两个版本 ^5为上5个版本 git tag # 显示已存在的tag git tag -a v2.0 -m 'xxx' # 增加v2.0的tag git show v2.0 # 显示v2.0的日志及详细内容 git log v2.0 # 显示v2.0的日志 git diff # 显示所有未添加至index的变更 git diff --cached # 显示所有已添加index但还未commit的变更 git diff HEAD^ # 比较与上一个版本的差异 git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异 git diff origin/master..master # 比较远程分支master上有本地分支master上没有的 git diff origin/master..master --stat # 只显示差异的文件，不显示具体内容 git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义（用于push/pull/fetch） git branch # 显示本地分支 git branch --contains 50089 # 显示包含提交50089的分支 git branch -a # 显示所有分支 git branch -r # 显示所有原创分支 git branch --merged # 显示所有已合并到当前分支的分支 git branch --no-merged # 显示所有未合并到当前分支的分支 git branch -m master master_copy # 本地分支改名 git checkout -b master_copy # 从当前分支创建新分支master_copy并检出 git checkout -b master master_copy # 上面的完整版 git checkout features/performance # 检出已存在的features/performance分支 git checkout --track hotfixes/BJVEP933 # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支 git checkout v2.0 # 检出版本v2.0 git checkout -…

使用JWT鉴权
type: item
date: 2022-08-14T11:14:00+00:00
description: 一、什么是JWTJSON Web Token (JWT)是一个开放标准(RFC 7519)，它定义了一种紧凑的、自包含的方式，用于作为JSON对象在各方之间安全地传输信息。特别适用于分布式站点的单点登录（SSO）场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息，以便于从资源服务器获取资源，也可以增加一些额外的其它业务逻辑所必须的声明信息，该token也可直接被用于认证，也可被加密。二、JWT的数据结构实际的JWT由三部分组成，如下所示eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.ewoJJ2lkJzonMTAnLAoJJ2V4cCc6JzIzMDE1OTc0MzMnCn0=.05dd35b4d20c95430cd1b63406f861de7e4c1476f9dbffa25f30fe08baf8f530中间用点（.）分隔成三个部分。JWT的三个部分依次如下：Header（头部）Payload（负载）Signature（签名）HeaderHeader部分是一个JSON对象，描述JWT的元数据，通常是下面的样子{ "alg": "HS256", "typ": "JWT" }上面代码中，alg属性表示签名的算法（algorithm），默认是HMAC SHA256（写成 HS256）；typ属性表示这个令牌（token）的类型（type），JWT令牌统一写为JWT。将上面的JSON对象使用Base64URL算法（详见后文）转成字符串就成了第一部分Header。PayloadPayload部分也是一个JSON对象，用来存放实际需要传递的数据。JWT规定了7个官方字段，供选用。iss (issuer)：签发人exp (expiration time)：过期时间sub (subject)：主题aud (audience)：受众nbf (Not Before)：生效时间iat (Issued At)：签发时间jti (JWT ID)：编号我们还可以在这个部分自己定义字段，下面就是一个例子{ "sub": "1234567890", "name": "John Doe", "admin": true }这个JSON对象也要使用Base64URL算法转成字符串。SignatureSignature部分是对前两部分的签名，防止数据篡改。首先，需要指定一个密钥（secret）。这个密钥只有服务器才知道，不能泄露给用户。然后，使用Header里面指定的签名算法（默认是HMAC SHA256），按照下面的公式产生签名。HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)Base64URL前面提到，Header和Payload串型化的算法是Base64URL。这个算法跟Base64算法基本类似，但有一些小的不同。JWT作为一个令牌（token），有些场合可能会放到URL（比如api.example.com/?token=xxx）。Base64有三个字符+，/和=，在 URL里面有特殊含义，所以要被替换掉：去除尾部的=、+替换成-，/替换成_ 。这就是Base64URL算法。算出签名以后，把Header、Payload、Signature三个部分拼成一个字符串，每个部分之间用"点"（.）分隔，就可以返回给用户。三、特点JWT默认是不加密，但也是可以加密的。生成原始Token以后，可以用密钥再加密一次。JWT不加密的情况下，不能将秘密数据写入JWT。JWT不仅可以用于认证，也可以用于交换信息。有效使用JWT，可以降低服务器查询数据库的次数。JWT的最大缺点是，由于服务器不保存session状态，因此无法在使用过程中废止某个token，或者更改token的权限。也就是说，一旦JWT签发了，在到期之前就会始终有效，除非服务器部署额外的逻辑。JWT本身包含了认证信息，一旦泄露，任何人都可以获得该令牌的所有权限。为了减少盗用，JWT的有效期应该设置得比较短。对于一些比较重要的权限，使用时应该再次对用户进行认证。为了减少盗用，JWT不应该使用HTTP协议明码传输，要使用HTTPS协议传输。四、使用安装go install "github.com/golang-jwt/jwt/v4"定义claims和serecttype UserClaim struct { UserName string `json:"user_name"` jwt.RegisteredClaims // 注意!这是jwt-go的v4版本新增的，原先是jwt.StandardClaims } var Secret = []byte("abggfdf…

经典语录
type: item
date: 2022-06-19T11:39:00+00:00
description: 长的丑的才叫妖怪，漂亮的叫妖精生前何必久睡，死后自会长眠老子来到这个世上就没打算活着回去天下风云出我辈，一入江湖岁月催，皇图霸业谈笑中，不胜人生一场醉人生有两条路，一条用心走，叫做梦想，一条用脚走，叫做现实总有一天，你会遇到这样一个人，她温柔善良，漂亮大方，她不要你的钱，不要你的车，不要你的房，也不要你你若安好，那还得了假如生活欺骗了你，不要灰心，因为明天也一样钱就是空气，没有它活不下去一生不轻爱，一爱爱一生我谈过最长的恋爱，就是自恋，我爱自己，没有情敌你如果认识从前的我，也许你会原谅现在的我物忌全胜，事忌全美，人忌全盛心小了，所有的小事就大了；心大了，所有的大事都小了人生不过如此，且行且珍惜。自己永远是自己的主角，不要总在别人的戏剧里充当着配角得到的往往比失去的更重要，它是人生的价值与意义失去的东西，其实从来未曾真正地属于你，也不必惋惜即以背影倾天下，何必转身乱芳华

提升自我
type: item
date: 2022-06-12T14:49:00+00:00
description: 定义工作本身并不能带了经济上的安全感，具备良好的思考、学习、创造与适应能力，才能立于不败之地。拥有财富，并不代表经济独立，拥有创造财富的能力才真正可靠。所以，自我提升和完善尤为重要。它包括四个层面，身体（锻炼、营养、压力调节）、精神（实现价值、忠诚学习、冥想）、智力（阅读、想象、规划、写作）、社会/情感（服务、移情、统合综效、内在安全感）。身体层面，是指有效呵护我们的身体—健康饮食，充足的休息以及定期锻炼。它是属于第二象限事物，重要但不紧急，因此很少人能坚持不懈。精神层面，精神为我们指引人生方向，是人的本质、核心和对价值体系的坚持，是生活中非常私人又至观重要的领域。它能够调动人体内具有激励和鼓舞作用的资源，把你同所有人类的永恒真理紧紧联系在一起。如果我们能够用心把握生活的方向和生命的真谛，就如同得到了一把遮风挡雨的打伞，源源不断地使我们活得新的力量。如果能够持之以恒，效果会更加明显。智力层面，它只要靠教育、不断学习新知识，磨练心智，开阔视野。可以通过看书、写作等完成。社会/情感层面。在改变他人上，我们可以选择清晰而真实地反映出他人的形象，肯定她们的积极性和责任心，帮助她们改变行为模式，成为讲原则、懂判断、独立自主、有价值的个体。反映他人的正面形象并不会贬低我们自己，反而会使我们更加强大。我们如果有足够的财富对别人做情感投资，我们越擅长发掘别人的潜力，就越能在配偶、子女、同事或者雇员身上发挥自己的想象力，而不是记忆力。我们不应该给她们贴标签，与她们共处是要从全新的角度大量她们，帮助我们独立和实现自我，并建立起美满、丰富和卓有成效的人际关系。对于我们来说，这四个层面都要去更新，因为只有平衡好更新进度，才能取得最理性的效果，忽视任何一个层面都会对其它层面产生消极的影响。在更新的过程中，我们不要贪多，而是一点一点去攻破它，应用我们学习到的单点突破法，计划实施总结评估，立真把它们平衡。管理自我主要做好三样：时间管理、精力管理、情绪管理时间管理。改变自己从认识自己开始，管理时间也是从认识时间开始。一开始，最好的方法就是记录时间，把每天花费的时间记录下来。就像理财一样，先记录钱花在哪里，才知道哪些钱不该花，或者少花。第一阶段，可以这样简单记录，看看大块时间用在哪里。开会（0.5）吃饭（1.0）写作（2.0）刷抖音（3.0）写代码（4.0）你看，明显是刷抖音时间长，这个可以尽量减少或避免。第二阶段，记录具体时间和具体事件。6:00 ~ 7:00 晨练7:00 ~ 8:00 读书写作8:00 ~ 9:00 去上班9:00 ~ 11:00 工作12:00 ~ 14:00 午休14:00 ~ 16:00 梳理积分商城16:00 ~ 16:30 休息16:30 ~ 19:00 综合分析竞品商场19:30 ~ 整理主要目的，看看哪个时间做了哪些事，具体花费多少时间，后边有大用。第三阶段，清晨安排三件事很多人不喜欢记录，太麻烦，记来记去也没什么改变。任何工具如果使用起来太复杂，就会有90%的人放弃。清晨三件事，非常简单，也是我一直在用的。每天早晨起来，就按照重要程度，把当天最需要干完的三件事完成。我今天最需要做完的三件事：1.工作报告整理，各个项目组进度把控，协调资源。2.跟客户谈具体合作事项。3.公众号文章一篇，知乎问答一篇。工作时间，把前两项搞定，业余时间把最后一项搞定。如果还剩下时间，我就会做一些长期规划的事，明天、后天，以及未来一个月需要准备做的事。做好以上这些，就能极大提升工作效率吗，不能。你一定遇到过这种情况，时间很充足，坐在那里，啥也干不进去。比如，一下午过去了，报告一个字没有写，有时间，没状态。遇到这种情况，不是时间出了问题，而是你的精力出了问题。精力管理。有一本书《精力管理》，讲了精力来源的四个方面：体能、思维、情感、意志。我跟进自己的实践和观察，体能和思维对我影响很大。体能也是精力最基本的来源。我记得上高中那会，早上为了节省饭钱，只吃馒头和方便面。那几天上早自习感觉特别累，总爱打瞌睡。后来，吃了两个星期实在扛不住了，又去食堂吃饭了。那时候感觉特别饿，没精神，没有想过饮食这么重要。刚刚工作那会也是，早上不吃饭，死磕一上午，中午吃得又多犯困。整个人一天的工作状态不是特别好，还好那会年轻，用精神力扛着。现在作息规律，早上跑步、读书，吃早饭。上午一般脑子清楚，一般做一些分析类工作。午餐之后，会溜达一会，消消食，然后午睡。下午脑子不那么灵光，有一些疲倦，会做一些总结和整理工作。晚上吃完饭，也有一个不错的状态，会做一些有创意的工作。一句话，你一定要在状态最好的时候，做最难最复杂的事。注意自己的精神状态，太疲惫了就休息一会，磨刀不误砍柴工。死磕的状态不能持续，要养成固定的习惯。情绪管理。做到以上两点，已经可以称为高手了。能够利用自己的情绪，高效率完…

ffmpeg 常用命令
type: item
date: 2022-05-01T13:56:00+00:00
description: 替换视频中的音频ffmpeg -i input.mp4 -i input.wav -c:v copy -map 0:v:0 -map 1:a:0 output.mp4如果音视频不一样长，则需要在输出文件名之前添加选项-shortest自动剪掉末尾超出的音频或视频视频片段剪辑ffmpeg -ss 00:00:00 -t 00:01:00 -i input.mp4 -c copy output.mp4ffmpeg -ss 00:01:00 -to 00:02:00 -i input.mp4 -c copy output.mp4指定剪切的时间参数最好放到输入文件之前，这样虽然剪切出来的时间不精确但是没有黑屏-ss：指定开始时间-t：指定持续时间-to：指定结束时间-c：使用原视频编码方式截图ffmpeg -i input.mp4 -f image2 -vf fps=fps=1 out%d.pngffmpeg -i input.mp4 -f image2 -vf fps=fps=1/20 out%d.png每隔1秒或20秒截一张图视频图片互转ffmpeg -i input.mp4 out%4d.pngffmpeg -r 30 -i input%4d.png -c:v libx264 -crf 20 -pix_fmt yuv420p -preset slow output.mp4-r：指定视频帧率-pix_fmt：色彩格式，视频一般是yuv420p的，png图片是rgb24的转码ffmpeg -i input.mp4 -c:v libx264 -profile:v high -level 5.1 -crf 20 -preset slower output.mp4ffmpeg -i input.mp4 -c:v libx265 -x265-params level=6.2 -crf 20 -preset slow output.mp4-c:v：指定视频的编码格式-qp：固定量化值（Constant Quantizer）：每一帧都是相同的画质，值为0-51，越小质量越好（0是无损）-crf：恒定速率因子（Constant Rate Factor），在所选的画质上下波动，值为0-51，越小质量越好（0是无损）-preset：调节编码速度和质量的平衡，可选ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo，从快到慢。ffmpeg默认采用crf方式编码视频关键帧无损视频分割ffmpeg -i input.mp4 -f segment -segment_times 00:00:10,00:00:20 -c copy %02d.mp4 ffmpeg -i input.mp4 -f segment -segment_time 00:00:5 -c copy %02d.mp4第一个命令是按照5秒和10秒的时间点进行分割，第二个命令是按照5秒间隔时间进行分割。%02d.mp4表示按照序号（从0开始）以2位宽度输出文件名（结果形如00.mp4，01.mp4，02.mp4）-segment_time：指定分割的间隔时间-segment_times：指定分割的时间点，多个时间点以逗号隔开如果分割时间点不是关键帧，将向后进行搜索到第一个关键帧无损视频合并相同规格的视频片段可以进行合并，先创建list.txt文件，在文件中写入要合并的文件名称，例如：file 00.mp4 file 01.mp4 file 02.mp4再使用以下命令进行无损合并：ffmpeg -f concat -i list.txt -c copy output.mp4记录合并视频列表的文本文件可以是任意名称的（不是list.txt也行）