邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

redis发布订阅-监听过期key
<?php
// 修改redis.conf notify-keyspace-events "Ex"

#  当事件发生时, Redis 可以通知 Pub/Sub 客户端。
#  可以在下表中选择 Redis 要通知的事件类型。事件类型由单个字符来标识:
# K     Keyspace 事件,以 _keyspace@<db>_ 的前缀方式发布
# E     Keyevent 事件,以 _keysevent@<db>_ 的前缀方式发布
# g     通用事件(不指定类型),像 DEL, EXPIRE, RENAME, …
# $     String 命令
# s     Set 命令
# h     Hash 命令
# z     有序集合命令
# x     过期事件(每次 key 过期时生成)
# e     清除事件(当 key 在内存被清除时生成)
# A     g$lshzxe 的别称,因此 ”AKE” 意味着所有的事件
# notify-keyspace-events 带一个由 0 到多个字符组成的字符串参数。空字符串意思是通知被禁用。
#  例子:启用 list 和通用事件:
# notify-keyspace-events Elg
#  默认所用的通知被禁用,因为用户通常不需要改特性,并且该特性会有性能损耗。
#  注意如果你不指定至少 K 或 E 之一,不会发送任何事件。
# notify-keyspace-events AKE

//redis时间到期销毁执行
function run_task($redis, $pattern, $chan, $key)
{
    //
    // echo "Pattern: $pattern\n";
    // echo "Channel: $chan\n";
    // echo "Msg: $key\n";

    $data = json_decode(base64_decode($key), true);
    $domain = 'http://tool.he4966.cn';
    if ($data) {

        switch ($data['type']) {
            case '1':
                //写需要执行的接口  自行修改
                //todo
                echo 1;
                break;
            case '2':
                # code...
                break;
            default:
                # code...
                break;
        }
    }
    var_dump($data);


}


$redis = new \Redis();
//连接本地的 Redis 服务  可以更改自己的
$redis->connect("127.0.0.1", 6379);

$redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
echo "任务消息开始监听.." . PHP_EOL;
$redis->psubscribe(array('__keyevent@0__:expired'), 'run_task');

windows下apache支持php-nts版本

帮同学的windows服务装个禅道,登录进去才发现只有apache,没有php,也没有mysql

装完php和mysql,发现访问php文件直接展示没有解析,于是就开始配置apache解析php的模块

好多年windows+apache这种组合了,搞了半天才解决

LoadModule fcgid_module modules/mod_fcgid.so

<IfModule fcgid_module>
        FcgidInitialEnv PHPRC "F:/Web/PHPServer/Bin/PHP"
        FcgidInitialEnv PHP_FCGI_MAX_REQUESTS      1000
        FcgidMaxRequestsPerProcess       1000
        FcgidMaxProcesses             15
        FcgidIOTimeout             120
        FcgidIdleTimeout                120
        AddType application/x-httpd-php .php
        <Files ~ "\.php$>"
          AddHandler fcgid-script .php
          FcgidWrapper "F:/Web/PHPServer/Bin/PHP/php-cgi.exe" .php
        </Files>
</IfModule>

<Directory "F:/Web/www">
        AllowOverride All
        Options -Indexes +ExecCGI
</Directory>


Mac 升级系统后 ssh 报错

报错如下:

Unable to negotiate with 10.10.10.100 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss


解决办法:

cd ~/.ssh

vim config

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa                                


golang 数组删除元素
package main

import "fmt"

func main(){


	a := []int{0,1,2,3,4,5,6,7,8,9}

	//a = a[1:]//删除开头的第一个元素 unset 0
	//a = a[3:] //删除开头的前3个元素 unset 0 1 2

	//a = append(a[:0],a[1:]...) //删除开头的第一个元素,不移动数据指针,将后面的数据向开头移动
	//a = append(a[:0],a[3:]...) //删除开头的前3个元素,不移动数据指针,将后面的数据向开头移动

	//使用copy
	//a = a[:copy(a,a[1:])] //删除开头第一个元素
	//a = a[:copy(a,a[3:])] //删除开头前3个元素

	//从中间位置删除
	//a = append(a[:3],a[4:]...)//删除索引为3的数据 unset[3]
	//a = append(a[:3],a[5:]...)//删除索引大于等于3且小于5的数据 unset[3 4]

	//从尾部删除
	//a = a[:len(a)-1] //删除最后一个元素 9
	//a = a[:len(a)-3] //删除最后的3个元素 9 8 7


	fmt.Println(a)


}
[golang]map的value赋值和遍历赋值

1、=========map的value赋值=========


package main

import "fmt"

type Student struct {
	Name string
}

var list map[string] Student

//map的Value赋值
func main()  {

	list = make(map[string] Student)

	student := Student{"action"}

	list["student"] = student
	//list["student"].Name = "xd" //错误 cannot assign to struct field list["student"].Name in map

	tempStudent := list["student"]
	tempStudent.Name = "xd"
	list["student"] = tempStudent

	fmt.Println(list["student"])


}



2、=========map的遍历赋值=========


package main

import "fmt"

type People struct {
	Name string
	Age int
}


//map的遍历赋值
func main()  {
	//定义map
	list := make(map[string] *People)

	//定义student数组
	peoples := []People{
		{Name: "zhou", Age: 24},
		{Name: "li", Age: 23},
		{Name: "xing", Age: 22},
	}

	//遍历结构体数组,依次赋值给map
	for i:=0;i<len(peoples);i++{
		list[peoples[i].Name] = &peoples[i]
	}

	//打印map
	for k,v := range list{
		fmt.Println(k,"=>",v.Name)
	}

}



抢红包之二倍均值法
/**
 * 二倍均值法
 *
 * @param $nums  //分配人数
 * @param $money //分配金额
 * @return array
 */
function assignRedBag($nums,$money){

    $result = [];//分配结果

    $surplusMoney = $money;//剩余金额

    for ($i=0;$i<$nums;$i++){
        //最后一次分配,直接返回剩余金额
        if($i+1 == $nums){
            $result[] = $surplusMoney;
            break;
        }

        //每次分配的最大值,剩余金额 / 剩余分配人数 * 2倍
        $max = intval($surplusMoney / ($nums - $i) * 2);
        //随机分配
        $nowMoney = mt_rand(1,$max);
        //存入分配结果
        $result[] = $nowMoney;
        //计算剩余money
        $surplusMoney = $surplusMoney - $nowMoney;

    }

    return $result;
}

echo '<pre>';
print_r(assignRedBag1(10,100));
Mac下使用clion调试php源码

=====第一大步安装php=====

1、安装libiconv依赖

brew install libiconv

2、安装php
wget https://www.php.net/distributions/php-7.4.22.tar.gz
tar -zxvf php-7.4.22.tar.gz
cd php-7.4.23
./configure --prefix=/Users/action/soft/php7 --with-config-file-path=/Users/action/soft/php7/etc --with-iconv =/usr/local/opt/libiconv --enable-debug   
make
make install

ps:: 安装路径自己指定就好,iconv的路径写安装路径

如果再编译过程中报错且和iconv相关,查看文章末尾pkg-config相关内容,否则直接忽略


=====第二大步使用clion=====

1.==导入项目==

New CMake Project from  Sources  -> import as a new CMake project 

2.==编辑CMakeLists.txt==

内容如下 (根据自己的路径来)

set(PHP_SOURCE /Users/action/code/source_code/php-7.4.22)
include_directories(${PHP_SOURCE}/ext/bcmath)
include_directories(${PHP_SOURCE}/ext/bcmath/libbcmath/src)

......

include_directories(${PHP_SOURCE}/Zend)
include_directories(${PHP_SOURCE})
add_custom_target(makefile COMMAND make && make install WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})

这个时候 软件左上角会出现如下标识

image2021-9-2_11-52-11.png

3、==点击 Edit Configurations,配置如下:(配置文件路径根据自己的需要来)==

image2021-9-2_11-56-24.png

4、==然后在cli模式文件下 打个断点 sapi/cli/php_cli.c==

image2021-9-2_11-53-58.png

5、==点击右上角的debug按钮就可以进行操作了==

image2021-9-2_11-54-55.png



===================分割线=======================


====pkg-config相关====

==查看==
pkg-config --list-all

==brew安装的东西都可以直接出现在pkg-config列表里面==
export PKG_CONFIG_PATH=$(find /usr/local/Cellar -name 'pkgconfig' -type d | grep lib/pkgconfig | tr '\n' ':' | sed s/.$//)

==安装pkg-config==
wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.28.tar.gz (下载就复制链接去手动下载)
tar -xf pkg-config-0.28.tar.gz
cd pkg-config-0.28
./configure --with-internal-glib
make
sudo make install


====php生命周期====

http://xingdong365.com/program/345.html

算法面试题

仅供参考:

用过哪些机器学习算法


1.说一下xgboost的原理

2.GBDT的原理以及常用的调参的参数

3.一个数组,找出第k大的数

4.快排的思想是什么,排序算法哪些时间复杂度比较低

5.特征选择方法都有用过哪些,特征重要性

6.除了k-means,还可以用什么聚类方法,或者你还熟悉什么聚类方法

7.朴素贝叶斯原理

8.TF-IDF原理

9.你都知道哪些分类算法

10.LDA的原理是什么?

11.你用过Python 那么你Python都用过哪些机器学习的库?

12.逻辑回归的思想和过程,损失函数是什么,如何训练得到最优参数

13.如何判断模型有没有过拟合

14.user-cf、item-cf公式,原理区别

15.有监督和无监督算法都有哪些,大概讲讲
有监督:linear model、logisit model、决策树、随机森林、朴素贝叶斯、KNN、SVM
无监督:kmeans、PCA

16.lr与线性回归的区别

https://blog.csdn.net/qq_38328378/article/details/81349922
线性回归与逻辑回归是机器学习中比较基础又很常用的内容。线性回归主要用来解决连续值预测的问题,逻辑回归用来解决分类的问题,输出的属于某个类别的概率,工业界经常会用逻辑回归来做排序。


手写代码:
topk
手撸代码,不用库函数求一个数的立方根,要求误差小于0.01
手写代码实现lr的训练与预测
如何判断单链表中是否有环?

LR、SVM(推导及原理)、树模型(xgboost推导及原理)、集成学习(原理和区别)


最新微语