<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[钚该钚想]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_37632591</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_37632591]]></copyright><item><title><![CDATA[channel 实现互斥锁]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/128617083</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/128617083</guid><author>qq_37632591</author><pubDate>Mon, 09 Jan 2023 16:48:56 +0800</pubDate><description><![CDATA[channel  互斥锁]]></description><category></category></item><item><title><![CDATA[mongo 笔记]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/120886227</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/120886227</guid><author>qq_37632591</author><pubDate>Thu, 21 Oct 2021 14:50:27 +0800</pubDate><description><![CDATA[在以往的关系型数据库(如Mysql)，使用表和列来对数据进行存储，进行数据查询操作。但是这样有一个弊端就是 1. 多表查询会比较复杂。2.对数据类型要求严格，如果需要加字段会稍微麻烦一些。mongo 是以数组或者对象来对数据进行存储，并且还可以嵌套。]]></description><category></category></item><item><title><![CDATA[zsh 好用的配置]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/118027535</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/118027535</guid><author>qq_37632591</author><pubDate>Fri, 18 Jun 2021 16:01:29 +0800</pubDate><description><![CDATA[配置包含主题，显示以及插件


防止 copy 的时候覆盖已存在的文件, 带上 i 选项，文件已存在的时候，会提示，需要确认才能 copy
alias cp="cp -i"


rm命令会直接删除文件，而不是移到废纸篓。所以使用 rm 来代替 trash 命令
trash下载地址：trash
安装方式： npm install --global trash-cli
使用别名来替换： alias rm="trash"


cat某个文件，可以在终端直接输出文件内容，bat 相比 cat 增加了行号和颜色高亮
]]></description><category></category></item><item><title><![CDATA[gin 读取配置文件]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/117230280</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/117230280</guid><author>qq_37632591</author><pubDate>Mon, 24 May 2021 19:26:09 +0800</pubDate><description><![CDATA[需求：对于配置文件不要直接在代码中进行定义和使用，而是单独放到配置文件的目录中，以便区分环境使用不同的配置。

分离前代码：
database, err := sqlx.Open("mysql", "root:XXXX@tcp(127.0.0.1:3306)/test")

修改为读取配置文件

创建文件 config/main.toml

app_name = "awesome web"

# possible values: DEBUG, INFO, WARNING, ERROR, FATAL
log.]]></description><category></category></item><item><title><![CDATA[gin 框架将路由文件单独处理]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/117128390</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/117128390</guid><author>qq_37632591</author><pubDate>Fri, 21 May 2021 17:16:24 +0800</pubDate><description><![CDATA[单独处理路由部分代码

在刚接触gin框架时，我们会直接在main.go 文件中定义接口，一个文件解决一切，不过这种设计是不符合设计原则的，我们需要将路由层，逻辑层，数据库交互层分离开。

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/", func(c *gin.Context) {
        c.Str]]></description><category></category></item><item><title><![CDATA[gin 数据绑定]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/117090337</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/117090337</guid><author>qq_37632591</author><pubDate>Thu, 20 May 2021 19:49:59 +0800</pubDate><description><![CDATA[gin 框架中使用数据绑定

定义请求结构体

//router.go
package router

type Person struct {
	Id int `form:"id"`    //Id 首字母大写，外部才可以访问
	Name string `form:"name"`  //如果接口参数是全小写，则加上form参数
}



在函数中进行数据绑定

// main.go
r.GET("/", func(c *gin.Context) {
	var jsons router.Person

	e]]></description><category></category></item><item><title><![CDATA[go 连接redis]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/115460111</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/115460111</guid><author>qq_37632591</author><pubDate>Tue, 06 Apr 2021 14:38:47 +0800</pubDate><description><![CDATA[package main

import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)

func main() {
	c, err := redis.Dial("tcp", "localhost:6379")
	if err != nil {
		fmt.Println("conn redis failed,", err)
		return
	}
	c.Do("set","gin_demo","test_gin", "ex",10*60)

	fmt.Pri]]></description><category></category></item><item><title><![CDATA[YII2 控制器中不能使用大写的问题]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/115300933</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/115300933</guid><author>qq_37632591</author><pubDate>Mon, 29 Mar 2021 14:47:55 +0800</pubDate><description><![CDATA[需求： 请求的接口为： getServerAddr
问题： 请求的地址只有一个，不符合 控制器名/方法名  的格式。
解决方案， 设置默认方法，    public $defaultAction = "Index";
这样请求 /getServerAddr，实际请求的应该就是/getServerAddr/index
经过测试，报错 404， 检查发现是由于控制器的大小写引起的，只有请求地址为：get-server-addr 才会映射到 getServerAddrController 中，看了一下网上的解决方]]></description><category></category></item><item><title><![CDATA[go包管理代理网址无法访问]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/115114375</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/115114375</guid><author>qq_37632591</author><pubDate>Tue, 23 Mar 2021 13:57:18 +0800</pubDate><description><![CDATA[go get -u github.com/kardianos/govendor  ## 执行命令

go get: module github.com/kardianos/govendor: Get "https://proxy.golang.org/github.com/kardianos/govendor/@v/list": dial tcp 172.217.160.81:443: i/o timeout

网上找了个能用的代理地址：https://goproxy.cn
执行命令：
go env -w ]]></description><category></category></item><item><title><![CDATA[redis 使用setnx实现锁]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/114284330</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/114284330</guid><author>qq_37632591</author><pubDate>Tue, 02 Mar 2021 14:27:27 +0800</pubDate><description><![CDATA[在token失效时，要重新请求服务器生成新的token，如果不使用锁的话，在并发的情况下，会有很多请求同时请求服务器。
这里提供一个使用redis来实现锁的。
redis的setnx ：当键不存在时插入成功，存在时插入失败。插入成功即拿到锁。
查询资料发现这样一段代码：
&lt;?php

$ok = $redis-&gt;set($key, $value, array('nx', 'ex' =&gt; $ttl));

if ($ok) {
    $cache-&gt;update();
    $re]]></description><category></category></item><item><title><![CDATA[mac 安装Yapi]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/114264238</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/114264238</guid><author>qq_37632591</author><pubDate>Mon, 01 Mar 2021 15:53:02 +0800</pubDate><description><![CDATA[手动进行接口测试是一件很麻烦的事情。所以需要有一个高效，易用的管理平台，比如Yapi
首先安装，官网部署链接：
官方部署Yapi地址
在按照教程进行安装后发现有些问题，就是这里面没有node和mongo的安装教程。
自己在安装node 之后，有很多的报错情况。最后发现了一篇宝藏教程：
小伙伴总结的安装教程地址
根据这个教程很快就安装好了，但是在启动的时候还是报错。根据错误是由于node的版本过高。因为我直接下载的就是最新稳定版。这里要降低node的版本。
nvm install 12.14    //这里我]]></description><category></category></item><item><title><![CDATA[ssh通过证书登陆服务器]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/113371332</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/113371332</guid><author>qq_37632591</author><pubDate>Fri, 29 Jan 2021 10:43:12 +0800</pubDate><description><![CDATA[之前服务器配置好之后，都是通过账号密码登陆的。
这种登陆方式可能会被暴力破解。在密码的安全性不高的情况下。

为了安全起见，使用证书登陆。可以刚好的防护服务器。
step1: 本机生成公钥，私钥。
step2: 将公钥复制到服务器。 具体做法百度。
step3: 打开 ~/.ssh/config 文件，添加主机信息。如：
Host server
CheckHostIP no
HostName server.com
User root
Port 22

直接使用ssh登陆：
ssh server


...]]></description><category></category></item><item><title><![CDATA[php 拉取 gz 文件进行解压后保存到自己的服务器]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/113242088</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/113242088</guid><author>qq_37632591</author><pubDate>Wed, 27 Jan 2021 10:24:00 +0800</pubDate><description><![CDATA[需求，将平台生成的文件拉取回来，进行数据分析

通过接口请求，发现返回的是一个 .csv.gz 格式的文件。
所以要对文件进行解压，网上查到的解压代:
function unzip_gz($gz_file)
{
     $buffer_size = 4096; // read 4kb at a time
     $out_file_name = str_replace('.gz', '', $gz_file);
     $file = gzopen($gz_file, 'rb');
     $ou.]]></description><category></category></item><item><title><![CDATA[yii 配置文件根据模式分类]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/112962048</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/112962048</guid><author>qq_37632591</author><pubDate>Thu, 21 Jan 2021 16:13:26 +0800</pubDate><description><![CDATA[在刚下载的yii 框架源码中，配置文件是没有进行分类的。我想在index中定义模式(dev,demo,online)。所以希望根据自己的定义读取相应的配置。
# index.php 修改如下
define('ENVIRONMENT', 'demo');  //这里可以进行我们环境的定义
$config = require(__DIR__ . '/../config/'.ENVIRONMENT.'/web.php');

在config 目录下创建新的目录文件。如下图：

运行后发现报错
Unable to ]]></description><category></category></item><item><title><![CDATA[PHP二维数组取差集]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/109466632</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/109466632</guid><author>qq_37632591</author><pubDate>Tue, 03 Nov 2020 11:58:23 +0800</pubDate><description><![CDATA[二维数组取差集 和 数组下标从0开始

需求：获取可以使用的坐标  // $arr1:所有坐标    $arr2：不能使用的坐标

错误操作: array_diff()
使用 array_diff() 获取差集，返回空数组。这个函数只能用于一维数组，不能用于二维数组。
正确操作
$arr3 = array_filter($arr1, function($v) use ($arr2) { return ! in_array($v, $arr2);});

结果集的数组下标从0开始
上面的方法获取到数组的差集，]]></description><category></category></item><item><title><![CDATA[laravel 之 Unit 单元测试]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/107004056</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/107004056</guid><author>qq_37632591</author><pubDate>Sun, 28 Jun 2020 17:24:31 +0800</pubDate><description><![CDATA[在进行项目开发的时候，经常会对我们的类,函数,http请求等进行测试，看结果是否符合我们的预期。
对于http 请求我们通常会使用postman 来进行测试。
那么如果我们需要测试某一个类，某一个方法，需要怎么办？

可能我们会这样做：在类或者方法调用后对结果进行打印，然后使用postman 去请求对应接口。

这样做有那些坏处呢：

可能会在你的代码中出现很多var_dump() 代码。
在你调用该类/方法 之前有很多步骤是你不需要的。（比如在调用之前对数据库进行了相关操作）。造成脏数据。


由于以上原]]></description><category></category></item><item><title><![CDATA[前端(JS)与后端(PHP) 通过 RSA 实现加解密]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/106781396</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/106781396</guid><author>qq_37632591</author><pubDate>Tue, 16 Jun 2020 10:37:50 +0800</pubDate><description><![CDATA[在项目开发过程中，为了安全起见，通常不能以明文形式传递敏感信息，容易被截获，所以引入RSA。
1. 生成公钥和私钥

在终端（基于 Unix 的操作系统）中输入以下内容。生成私钥

openssl genrsa -out rsa_1024_priv.pem 1024


通过执行以下命令获取公钥

openssl rsa -pubout -in rsa_1024_priv.pem -out rsa_1024_pub.pem


可以使用 cat 命令来查看

cat rsa_1024_priv.pem   ]]></description><category></category></item><item><title><![CDATA[shell 脚本提示权限不够的几种解决方式]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/106643275</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/106643275</guid><author>qq_37632591</author><pubDate>Tue, 09 Jun 2020 15:53:46 +0800</pubDate><description><![CDATA[创建一个 shell 文件。
vim test.sh

#! /bin/bash
echo 'hello world';


执行该脚本文件会报权限不足的错误

[root@root ~]# ./test.sh
-bash: ./test.sh: 权限不够


解决方式
1）添加可执行权限

 chmod +x ./test.sh  #使脚本具有执行权限
 ./test.sh  #执行脚本

2）使用命令 source test.sh 执行
3）使用命令  sh test.sh  执行

...]]></description><category></category></item><item><title><![CDATA[ES 简单操作指令]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/106640524</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/106640524</guid><author>qq_37632591</author><pubDate>Tue, 09 Jun 2020 14:25:41 +0800</pubDate><description><![CDATA[创建数据
PUT ip:9200/index/type/id
{
    "user" : "张三",
    "title" : "工程师",
    "desc" : "数据库管理，软件开发"
}

POST ip:9200/index/type 这样会自动生成id 是一串随机字符串


查看数据
GET ip:9200/index/type/id 查看单条数据
GET ip:9200/index/type/_search 查看所有type数据
可以根据 found 字段来判断查询是否成功。


更..]]></description><category></category></item><item><title><![CDATA[开发中遇到的越权问题]]></title><link>https://blog.youkuaiyun.com/qq_37632591/article/details/106430653</link><guid>https://blog.youkuaiyun.com/qq_37632591/article/details/106430653</guid><author>qq_37632591</author><pubDate>Fri, 29 May 2020 18:14:40 +0800</pubDate><description><![CDATA[越权问题：

描述：在使用 api 请求订单详情接口时，一般我们是传递订单id 来获取该订单的内容。但是会存在一个问题：当用户手动去变更订单id 参数来请求接口数据时，会获取到不属于他的数据，这就产生了越权。

解决办法： 根据订单id 查询到对应的user_id  对当前登录用户的id 和查询到的user_id 进行一致性判断，如果不一致，则返回操作越权。
示例代码:
public function orderAuth($order_id){
    $userInfo = new User();
   ]]></description><category></category></item></channel></rss>