给PGSQL添加只读用户

-- 1. 创建新用户readonly
CREATE ROLE readonly LOGIN PASSWORD 'passwd';

-- 2. 授予readonly用户对mydb1数据库的只读权限
-- 首先授予连接权限
GRANT CONNECT ON DATABASE mydb1 TO readonly;

-- 进入需要授权的数据库(PGADMIN等软件需要提前进入管理数据库)
\c mydb1

-- 然后为mydb1数据库中的所有表授予SELECT权限
-- 这里的假设是所有表都在public模式下,如果不是,需要指定正确的模式
GRANT USAGE ON SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

-- 如果需要包括未来创建的表,使用以下命令
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

mxlinux(debian) 禁用 apparmor

可能需要先安装 apparmor

sudo apt install apparmor

查看状态

sudo aa-status

配置目录

/etc/apparmor.d

禁用配置

sudo aa-teardown
sudo aa-status

禁用服务

sudo systemctl disable --now apparmor

rocky linux 9.3 安装 docker

sudo dnf check-update
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker
sudo systemctl status docker

非 root 账号添加权限

sudo usermod -aG docker $(whoami)

使用 docker-compose 启动

docker compose up -d

OpenJDK 下载

  • https://jdk.java.net/archive/
  • https://adoptium.net/zh-CN/temurin/releases/
  • https://www.openlogic.com/openjdk-downloads
  • https://www.microsoft.com/openjdk

小米电视USB调试

打开开发者选项

1、设置 > 关于 > 产品型号:快速按确定6次,直到出现提示

2、设置 > 账号与安全 > ADB调试:允许

连接调试

1、连接方法

adb connect <IP>
adb devices
List of devices attached
192.168.31.223:5555     device

首次连接,电视会出现授权提示。如果没有出现,设备可能未授权。

多个设备时,需要使用 -s 参数指定设备,如 adb -s 192.168.31.223:5555 shell …

2、devices 列表显示未授权,类似如下:

List of devices attached
192.168.31.223:5555     unauthorized

尝试以下方法

  • server重启
adb kill-server
adb start-server
  • 重新插拔USB
  • 再次连接,注意观察电视弹框

其他操作

安装软件包

adb install ./x.apk

卸载软件包

adb uninstall <package.name>

传文件

adb push ./x.mp4 /mnt/sdcard/Download

输入文字

adb shell input text "http://www.baidu.com"

应用包列表

// 查看当前连接设备或者虚拟机的所有包
adb shell pm list packages
// 只输出禁用的包
adb shell pm list packages -d
// 只输出启用的包
adb shell pm list packages -e
// 只输出系统的包
adb shell pm list packages -s
// 只输出包和安装信息(安装来源)
adb shell pm list packages -i
// 只输出包和未安装包信息(安装来源)
adb shell pm list packages -u
// 输出包和包相关联的文件
adb shell pm list packages -f
// 输出所有第三方包
adb shell pm list packages -3
// 按照要求搜索包
adb shell pm list packages -[option] "sina"

laravel-websockets使用教程

后端

1、安装扩展

composer require beyondcode/laravel-websockets

发布迁移

php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"
php artisan migrate

发布配置

php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"

配置 .env

PUSHER_APP_ID=
PUSHER_APP_KEY=your-pusher-key
PUSHER_APP_SECRET=
PUSHER_HOST=127.0.0.1
PUSHER_PORT=6001
PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1

2、确保 config/app.php 文件,providers 配置中没有注释依赖项。如果有不能解释的报错,可以确认一下。

3、创建事件

php artisan make:event DemoEvent

修改类 App\Events\DemoEvent ,注意添加实现 ShouldBroadcast

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class DemoEvent implements ShouldBroadcast # 添加实现类
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public string $message;

    // 使用成员变量,前端 listen 事件名为 `DemoEvent`
    // public $broadcastAs = 'DemoEvent';

    public function __construct()
    {
        $this->message = 'Hello friend';
    }

    // 使用成员方法,前端 listen 事件名为 `.DemoEvent`
    public function broadcastAs() {
        return 'DemoEvent';
    }

    public function broadcastOn()
    {
        // PrivateChannel 需要登录,改为 Channel
        // channel 名称本文改为 public
        return new Channel('public');
    }
}

如果不指定 broadcastAs,默认事件名为类名,即: App\Events\DemoEvent

4、运行服务

php81 artisan websockets:serve

5、调用/下发事件

# 以下都行
DemoEvent::dispatch();
broadcast(new DemoEvent())->toOthers();
broadcast(new DemoEvent());
event(new DemoEvent());

6、DASHBOARD

访问 /laravel-websockets 可以打开 dashboard 和调试,地址可以在 config/websockets.php 中配置

前端

1、以 vue 为例,安装扩展

npm i -D laravel-echo pusher-js

2、添加 laravel-echo.js 文件

import Echo from "laravel-echo";
import Pusher from "pusher-js";
window.Pusher = Pusher;

window.Echo = new Echo({
  broadcaster: "pusher",
  key: "your-pusher-key",
  wsHost: window.location.hostname,
  wsPort: 6001,
  forceTLS: false,
  disableStats: true,
  cluster: "mt1",
});

main.js 中引入

import "./laravel-echo";

3、在合适的位置订阅消息

window.Echo.channel("public").listen(".DemoEvent", (e) => {
  console.log(e.message);
});

此处 DemoEvent 为事件名,在后端可以通过 broadcastAs 来指定:

  1. 如果没有指定,默认为类名: App\\Events\\DemoEvent
  2. 如果使用成员变量:DemoEvent
  3. 如果使用成员方法:.DemoEvent
继续阅读

删除git中的大文件历史

列出所有仓库中的对象(包括SHA值、大小、路径等),并按照大小降序排列,列出TOP 10:

git rev-list --all | xargs -rL1 git ls-tree -r --long | sort -uk3 | sort -rnk4 | head -10

根据最大文件的路径,修改此文件的commit历史:

git filter-branch -f --tree-filter "rm -f <filepath>" -- --all

强制提交到远程分支:

git push -f

sublime-merge 中文化的方法

菜单中选择 Preferences > Browse Packages… ,在弹出的文件夹中,克隆 git 仓库:

git clone https://github.com/sublime-china/sublime-merge-chinese.git Default

重启软件即可。

ubuntu 20.04+使用netplan设置静态IP

编辑文件 /etc/netplan/00-installer-config.yaml ,修改为以下格式:

network:
  ethernets:
    ens33:   # 配置的网卡的名称
      optional: true # 可选接口,找不到时不会报错
      addresses: [192.168.253.133/24]
      dhcp4: false   # 关闭dhcp4
      gateway4: 192.168.253.2
      nameservers:
        addresses: [192.168.253.2,114.114.114.114]
  version: 2

PVE系统升级的方法

默认情况下,PVE只升级debian的系统,不会升级PVE管理,要同一起升级,需要添加 No-Subscription 库,具体步骤如下。

  1. 添加 No-Subscription 库

在左侧菜单中,选择一个节点,然后在管理菜单中单击“更新”下的“软件源”(Repositories),点击“添加”按钮,选择“No-Subscription”。

  1. 升级

在管理菜单中点击“更新”,点击“刷新”,完成后点击“升级”即可。

  1. 完成升级

升级完成后,可能需要重启服务器。