System has not been booted with systemd as init system

windows 11中的Ubuntu里使用systemctl时遇到了这样的错误:

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

Ubuntu里,systemctl常常用于启用一个服务,但在WSL中常使用的应是:

sudo service <servicename> start

这个问题的主要原因是WSL不使用Systemd,如何它使用呢?在/etc/下加个配置文件wsl.conf,如果已经存在,编辑这个文件。

阅读全文

elasticsearch nested搜索

  • 在mapping中定义nested字段

定义一个学生信息的字段:

'properties' => [
    'student' => [
        'type' => 'nested',
        'properties' => [
            'id' => [
                'type' => 'integer'
            ],
            'name' => [
                'type' => 'text',
                // 下面两个可选
                'analyzer' => 'ik_smart',
                'search_analyzer' => 'ik_max_word'
            ],
            'gender' => [
                'type' => 'keyword'
            ]
        ]
    ]
]

nested也是可以嵌套的,比如再加上成绩:

'properties' => [
    'student' => [
        'type' => 'nested',
        'properties' => [
            'id' => [
                'type' => 'integer'
            ],
            'name' => [
                'type' => 'text',
                // 下面两个可选
                'analyzer' => 'ik_smart',
                'search_analyzer' => 'ik_max_word'
            ],
            'gender' => [
                'type' => 'keyword'
            ],
            'grade' => [
                'type' => 'nested',
                'properties' => [
                    'english' => [
                        'type' => 'float'
                    ],
                    'math' => [
                        'type' => 'float'
                    ]
                ]
            ]
        ]
    ]
]

阅读全文

php检查请求是否为https

检查请求是否为https,一般可以通过$_SEVER变量中HTTPS和端口是否是443判断:

function isHttps(){
    return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
        || $_SERVER['SERVER_PORT'] == 443;
}

前面工作中遇到微信分享失败(没有缩略图的样式),检查原因是签名失败。通过日志发现签名计算的url地址是http开头的,并非https,但我访问的地址是https。将$_SERVER加入日志中查看,

发现$_SERVER中没有HTTPS变量,SERVER_PORT也是80端口,但看到了另外两个值为https的变量:HTTP_X_FORWARDED_PROTOHTTP_X_CLIENT_PROTO。在搜索引擎中检索HTTP_X_FORWARDED_PROTO, 可以在MDN中看到X_FORWARDED_PROTO的解释:

阅读全文

elasticsearch同时搜索多个字段

在使用es做全文检索时,可以使用match来查询某个字段,如要查询标题中含有elasticsearch相关的内容:

$client->search(
    [
        'index' => 'test',
        'body' => [
            'query' => [
                'bool' => [
                    'must' => [
                        [
                            'match' => [
                                'title' => [
                                    'query' => 'elasticsearch'
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
);

现在需要检索标题、副标题、内容都含有elasticsearch相关的内容就可以使用multi_match:

$client->search(
    [
        'index' => 'test',
        'body' => [
            'query' => [
                'bool' => [
                    'must' => [
                        [
                            'multi_match' => [
                                'query' => 'elasticsearch',
                                'fields' => [
                                    'title',
                                    'subtitle',
                                    'content'
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
);

css中5种居中方式

如上图,没有给任何位置设置.

// css
<style>
    .big {
        width: 400px;
        height: 300px;
        background-color: #1edcff;
    }

    .small {
        width: 70px;
        height: 70px;
        background-color: #3ca217;
    }
</style>

// html
<div class="big">
    <div class="small"></div>
</div>

要是小的div在大div里居中,有5种方式.

  1. flex
.big {
    width: 400px;
    height: 300px;
    background-color: #1edcff;

    display: flex;
    align-items: center;
    justify-content: center;
}
  1. grid
.big {
    width: 400px;
    height: 300px;
    background-color: #1edcff;

    display: grid;
    place-content: center;
}

阅读全文

CSS minmax()

  • 认识minmax

看看MDN上对minmax的定义:

The minmax() CSS function defines a size range greater than or equal to min and less than or equal to max. It is used with CSS Grids

可以得出3点:

  1. minmaxCSS中的一个函数
  2. 定义了一个范围:大于等于最小值并且小于等于最大值
  3. 在CSS的grid中使用

现在来使用它:

<style>
    .box {
        display: grid;
        grid-template-columns: minmax(200px, 500px) 1fr 1fr;
        grid-gap: 10px;
    }

    .box div {
        height: 78px;
        background-color: #c2c;
    }
</style>
<div class="box">
    <div>A</div>
    <div>B</div>
    <div>C</div>
    <div>D</div>
    <div>E</div>
    <div>F</div>
    <div>G</div>
    <div>H</div>
    <div>I</div>
</div>

在页面中可以看到:

阅读全文

SimpleAjaxUploader上传后赋值失败问题

项目中有这样一段关于上传图片的代码:

<label class="label required">频道icon:</label>
            <div class="form-item mb-0">
                <input class="form-control" readonly name="img" value="{{data['img']}}"/>
                <button type="button" class="btn btn-primary" id="uploadImage">上传</button>
            </div>
            <div class="form-text help-block">图片的最佳尺寸:100*100,其他尺寸会影响页面效果,格式png,jpg,gif。大小不超过2M</div>
            <div class="form-item mb-4">
                <div class="col-4">
                    <img src="{{data['img']|default(default_image)}}" id="imgPreview" class="img-responsive"/>
                </div>
            </div>

上传插件使用的是Simple Ajax Uploader,在上传完成后对input和img赋值:

onComplete: function(filename, res, uploadBtn) {
                if(res.error_code != 0){
                    // error msg
                }else{
                    $('input[name=img]').val(res.thumb[0].url);
                    $('#imgPreview').prop('src', res.thumb[0].url);
                }
            },

这时候,问题出现了,input框赋值成功,但是img的src值没有改变,控制台也没有任何错误信息.将两行赋值代码交换顺序:

$('#imgPreview').prop('src', res.thumb[0].url);
$('input[name=img]').val(res.thumb[0].url);

img的src正常复制,input正常复制.这就非常奇怪了.

阅读全文

leetcode:Valid Parentheses

  • 问题

Given a string s containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[‘ and ‘]’, determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.
  • 解决
class Solution {

    /**
     * @param String $s
     * @return Boolean
     */
    function isValid($s) {
        if(strlen($s) % 2) {
            return false;
        }

        while(true){
            $c = $s[0];
            $s = substr($s, 1);
            $i = $this->match($c, $s);
            if($i === false){
                return false;
            }

            $s = substr($s, 0, $i) . substr($s, $i + 1);
            if(empty($s)){
                break;
            }
        }

        return true;
    }

    function match($c, $s)
    {
        $map = [
            '(' => ')',
            '{' => '}',
            '[' => ']'
        ];

        if($s[0] === $map[$c]) {
            return 0;
        }

        $offset = 0;
        for($i = 0, $len = strlen($s); $i < $len; $i++) {
            if(in_array($s[$i], ['(', '{', '['], true)) {
                $offset += 2;
            }

            if($s[$i] === $map[$c] && $offset === $i) {
                return $offset;
            }
        }

        return false;
    }
}

主要找到对应位置,然后比较对应位置是否正确并不断将正确的从字符串中移除.运行效率很低,500ms~900ms之间.
看社区排名前面的解决方法(python,java,c++)都是通过栈来解决–先进后出.修改如下:

阅读全文

直播问题记录

  • 体验版IM账号达到100个,需要删除账号小直播服务器数据库中账号和项目数据库中表中对应的记录

  • 直播回顾生成

    1. 云直播中直播回顾创建一个hls模板
    2. 代码中开播会调用该模板设置录制任务
    3. 推流结束后,录制文件会存在云点播,录制回调中根据推流的类型(电台直播,视频直播等)调用不同的云点播任务流对录制文件转码为mp3和mp4
    4. 云点播回调根据file_id更新对应直播回顾,回顾生成完成
    5. 需注意直播录制回调时间根据直播录制模板中设置的续录等待时长而定,如设置600秒的续录等待时间,则断流10分钟后才会产生录制回调,中间有新推流,最终录制会合并为一个文件
  • im回调中cmd值与表示:

表示意义
1 文本消息
2 进入直播间
3 退出直播间
4 点赞
5 弹幕
6 连麦
10 打赏
11 红包
12 抢红包成功
13 发抽奖
14 图片消息
  • IM回调返回ErrorCode值说明:

    1. 0表示下发消息,所有用户可看到消息
    2. 1表示禁言,所有用户看不到消息
    3. 2表示静默丢弃,所有用户看不到消息
    4. 10100~`10200`之间,用户自定义错误信息,所有用户看不到消息
  • 如果IM回调返回非0值,但是前端所有用户能正常收到消息,可能接口有报错,使用postman请求接口查看

  • 创建直播间失败,日志显示:

Array
(
    [ActionStatus] => FAIL
    [ErrorCode] => 10036
    [ErrorInfo] => Fail to create AVchatroom. You've reached AVchatroom amount limit. Please upgrade your package on the console
)

体验版IM的AVChatroom数量上限是10个

  • FM直播间hls录制回顾不生成

FM为纯音频流,要录制生成hls文件,需在腾讯云开启音视频探测服务,该服务默认是关闭的,可提工单开启