自行搭建 IM Wechat 聊天平台 mattermost 入门配置安装教程

实在无法忍受国内 IM 软件的臃肿,简简单单的聊天搞一堆东西。安装包堪比一个系统。

今天说的这款 IM 支持全平台。WEB 安卓 苹果 PC 都有客户端。名字叫 ”mattermost“。
其实我也试用过其他 IM 。感觉这个比较符合自己的使用习惯。废话不多说,步骤如下:

1,准备一台 Ubuntu 20.04 的实体机或者虚拟机。如果外网使用,最好有公网IP。内网使用不用在乎这些。如果怕被取证,可以使用全盘加密,虚拟机也可以全盘加密。

2,命令行步骤如下:

curl -sL -o- https://deb.packages.mattermost.com/pubkey.gpg | gpg --dearmor | sudo apt-key add
sudo apt-get update
sudo apt install mattermost -y
sudo install -C -m 600 -o mattermost -g mattermost /opt/mattermost/config/config.defaults.json /opt/mattermost/config/config.json
sudo vi /opt/mattermost/config/config.json



# 这里修改配置文件,但现在还无需配置,因为你还没装数据库,我们用推荐的 postgresql 数据库

sudo apt install postgresql postgresql-contrib
sudo su - postgres -c "createuser jacker"
sudo su - postgres -c "createdb mattermostdb"
sudo -u postgres psql
ALTER USER jack90 WITH PASSWORD 'edcJacker90';
grant all privileges on database mattermostdb to jacker;
\q



# 配置好数据库就可以启动数据库了
sudo systemctl start postgresql
# 接下来再修改 mattermost 的配置文件,主要修改这几处。
定位文件 /opt/mattermost/config/config.json 确认文件内容 DriverName 这一行是 “postgres”
DataSource 这一行是,根据上面数据应该是如下:
“postgres://jacker:edcJacker90@localhost/mattermostdb?sslmode=disable&connect_timeout=10″
“SiteURL” 这一行是
“http://90.life:8065” #如果你没做 nginx 等代理转发,或者其他映射就需要这么设置。如果做了,请转换相应端口。如果加了证书就改为 https。域名请自行替换。这个设置跟你等会在 APP 上写的服务器 url 应该是一致的才对。否则会有错误。
至此所有配置完成。可以使用了。当然配置文件还有许多项目可自行研究。
sudo systemctl start mattermost 启动

这个默认配置只适合小环境使用,如果流量很多,官方推荐使用 nginx 作为前置代理处理流量。此平台一个服务器免费是 200 个名额。其实我就当个跨平台剪切板使用。

更多细节大家可以参考下面连接:
https://docs.mattermost.com/install/install-ubuntu.html


自行构建 chromium 教程,还是自己编译的浏览器好

看了官方文档,一路走来不得不说坑很多。以下所有命令均在 cmd 命令提示符下运行。

首先做好准备工作:
1,新版 chromium 需要 Visual Studio 2022 勾选如下(划红线的必选):


2,准备好大约 200G 的空间用于存放源码和编译。电脑内存最好 32G 起步。


3,安装配置 git 工具。
git config –global user.name “My Name” #设置你的名字
git config –global user.email “[email protected]” #设置你的邮箱
git config –global core.autocrlf false
git config –global core.filemode false
git config –global branch.autosetuprebase always
git config –global core.longpaths true # 解除 Windows 限制,配置 git 以允许长路径支持


4,下载 depot_tools 。解压到一个目录,比如 d:\depot_tools。并配置系统环境 PATH。
Windows 打开命令提示符 cmd ,输入 control sysdm.cpl,在 PATH 系统变量中添加 d:\depot_tools 这个目录,如果你的不一样,请自行改变。
Linux 直接 export PATH=”$PATH:/path/to/depot_tools”。这个临时变量,重启需要再次添加。也可以 git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 拉取源码。

5,更新 depot_tools。
gclient sync

6,创建源码目录,在转到新创建的目录。
mkdir chromium && cd chromium

6,下载 chromium 源码。如果没有科学上网的可能下载不了。我这里给个百度网盘吧!
fetch chromium 或者 fetch chromium –no-history (这个可以节省时间)这个是拉取最新分支。如果要要旧版请参照这个 git clone –depth 100 -b 103.0.5060.66 https://chromium.googlesource.com/chromium/src.git src
如果不小心断掉了链接,可以用 gclient sync 来继续下载。

7,构建编译文件,设置编译参数。
Windows
cd src && gn gen out\Default (测试版)
gn args out\Release (正式版)需要输入编译参数如下
target_os=”win”
target_cpu=”x64″
is_component_build=false
is_debug=false
is_official_build=true


Android
gn gen –args=’target_os=”android” target_cpu=”arm64″ out/Default


如果需要构建调试版本添加改变以下参数

is_debug = true
is_component_build = true
symbol_level = 2

8, 构建可执行文件。

autoninja -C out\Default chrome (测试版)
out\Release chrome (正式版)

一些错误解决方案,如下:

A,No downloadable toolchain found. In order to use your locally installed version of Visual Studio to build Chrome please set DEPOT_TOOLS_WIN_TOOLCHAIN=0.

这个错误是环境变量的错误,也就是没找工具。我这里是这么解决的:
1,将 d:\depot_tools 这个环境变量放置在最前头。添加系统环境变量 DEPOT_TOOLS_WIN_TOOLCHAIN=0 。
2,卸载本身安装 Python,然后再执行 gclient sync (设置环境变量后,请重新打开命令提示符)。此时它会重新构建工具链。

B,构建速度慢

1,关闭 Windows Defender。12 13 14代intel看下大小核心调度。
2,设置 set NINJA_SUMMARIZE_BUILD = 1 && autoninja -C out\Default base,让其显示构建过程。或者执行 python depot_tools\post_build_ninja_summary.py -C out\Default
3,更多详细,参见原文

C,UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x92 in position 125: illegal multibyte sequence 出现这个编码错误不用管,也可以编译成功的。源码某些用的是 Python2,所以会有这个错误。要修正你需要找到源文件,但是跳出这个错误并没有带出源文件。

D,如果遇到 git 源码不一致问题。
gclient sync -D –force –reset
使用上述命令强行覆盖

分享自己折腾X79平台黑苹果的EFI文件

首先是自己的 :
系统:10.15.7
主板:火神x79 – s288
无线网卡 :白苹果的拆机网卡 Bcm94360cs2
cpu :e5 2696v2
ram : 32G * 4 =128G
储存:sata固态

火神X79-s288-EFI.zip:
https://url64.ctfile.com/f/22136564-957219525-d89569?p=9280 (访问密码: 9280)

搜集的如下:
E5 2660v2+X79+AX200-EFI.rar:
https://url64.ctfile.com/f/22136564-957217980-a66d57?p=9280 (访问密码: 9280)
BASE-EFI-INTEL-HEDT-2NDGEN-X79-SANDY-BRIDGE-E-0.7.1.zip: https://url64.ctfile.com/f/22136564-957217914-f6a263?p=9280 (访问密码: 9280)
X79-E5-2696-v2-R9-Nano-Clover-EFI-master.zip:
https://url64.ctfile.com/f/22136564-957217869-0cc30c?p=9280 (访问密码: 9280)

自己的基本没啥问题,就是不能点重启,否则第二次启动有几率会进不去系统,再次关机就能进去了。搜集的有支持 macOS 12 可是我的配置进不去,还请大家自行尝试。黑苹果真的没啥太多的教程,全靠领悟。

论如今社会的一些看法

这个标题格局大了,哈哈哈。其实就是自己的一点小想法。

1,整个社会都在人人自危。都不想承担责任,都在甩过来甩过去。当大家都在自保,秉承着“大事化小,小事化了。做不如不做。好像这样也挺好。” 那就是集体的倒退。

2,部分顶流都在享受这几年经济带来的繁荣,却无心解决底层的生存问题。只是到了如今,信息发达了。那些旮旯角落的事情也让不知真相的人知道了真相。社会的主体矛盾自古以来就是利益的分配问题。那你想做一样的事情,却是不同结果。谁也静不下心继续工作。人就会变得浮躁,社会就会变得不稳定。

3,无知的人很多,有些无知的人还掌握了大部分权利。这个是我真的感到万分震惊的。我记得自己看过一部电影叫 “蠢蛋进化论”。里面看到的各种事情,现在的社会都有影子。我觉得这样的事情肯定是有一个无知的人站到了最高层,权力的习惯一般都是从上至下传递的。如今很多政策的一刀切就很能说明问题。下层的人民无知的也挺多,因为群众的眼睛是雪亮的这句话,不是任何场合都适用。所以很容易被带节奏。目前的情况就是底层无知的人对抗上层无知的人,上层无知的人利用高科技去阻挡他们。

4,政府公信力的下降,导致蝴蝶效应的放大。政府如此积极的阻断信息传播,就是为了避免蝴蝶效应。因为信息的传播越快,蝴蝶效应就越明显。但凡有一个站出来把事情处理好的人,去解决问题。事情也不会引起裂变。可是为什么没有,参考第一条。从此看来,其实这届政府已经到了后期。

5,民众不爱国了,准确点是不爱党了。借用网上的一句话 “我爱国,可谁爱我啊!”,颇有点 “不负如来不负卿” 感慨。从小教育我们要爱党,以入党为荣。可是真的需要党来帮助我的时候,换来的是漫长的等待,无尽的嘲讽,没有结果的结果。这个我深有体会,自己也遭遇过类似的事情。

6,抑郁的人群持续增加。我身边都有好几个了。这个病症真的太可怕了。它击碎了人对生活的向往,对未来的希望。我觉得如今的社会环境是导致这个病持续增长的主要原因。大家都在忙于工作,却忽略了身边人的感受与陪伴。导致精神世界分崩离析。

总结:
其实上述现象,全球都存在。貌似人类像来了大姨妈一样,在各个方面发展都放缓了。都在沉浸在互联网的自娱自乐之中。我觉得我们人类该向太空发展,哪怕拟定一个假想敌人也好啊。这样就会有动力去发展科技了。

因为人类自古以来总是当危机自身时,才会迸发前进的动力。

利用Python实现全局水印

此脚本支持获取当前用户名,在 AD 域里面使用很方便。自备字体文件。

import tkinter as tk
import win32api
import win32con
import pywintypes
import os
from screeninfo import get_monitors
from PIL import Image, ImageDraw, ImageFont,ImageTk

font_family = "msyh.ttf"  # Replace with your actual font filename
font_size = 36
def generate_watermark(text, width, height, color='#d5d5d5', opacity=0, lines=10, angle=0):

    spacing = 100
    # 创建一个 Image 对象,用于绘制水印
    img = Image.new('RGBA', (width, height), (255, 255, 255, 0))
    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype(font_family, font_size)

    # 将文本拆分成多行
    text_lines = text.split('\n') if text else lines

    # 计算每个水印的宽度和高度
    bbox = draw.textbbox((0, 0), text_lines[0], font=font)
    text_width, text_height = bbox[2] - bbox[0] + spacing, bbox[3] - bbox[1] + spacing

    # 计算每行可以容纳的水印数量
    watermarks_per_row = width // (text_width + spacing)
    total_rows = (height - 50) // (text_height + spacing)
    # 设置初始位置
    x = 50
    y = 30

    for row in range(0,total_rows):
        x = 50 # 每行重新从左侧开始
        y = 50 + row * (text_height + spacing)

        for col in range(0,watermarks_per_row):

            rotated_text = Image.new('RGBA', (text_width, text_height), (255, 255, 255, 0))
            rotated_draw = ImageDraw.Draw(rotated_text)
            rotated_draw.text((0, 0), text_lines[row % len(text_lines)], font=font, fill=color)
            rotated_text = rotated_text.rotate(angle, expand=True)
            # 将旋转后的文本粘贴到主图像上
            img.paste(rotated_text, (x, y), rotated_text)
            x += text_width + spacing

    tk_img = ImageTk.PhotoImage(img)

    # 创建一个 Label 并显示图片
    label = tk.Label(image=tk_img,bg="white")
    label.image = tk_img  # 保持引用,防止垃圾回收
    label.pack()
def get_total_screen_size():
    monitors = get_monitors()
    width = sum(monitor.width for monitor in monitors)
    height = max(monitor.height for monitor in monitors)
    return width, height

def create_watermark_window(text, **kwargs):

    root = tk.Tk()
    # 获取屏幕分辨率
    screen_width, screen_height = get_total_screen_size()
    def generate_watermark_with_size():
        generate_watermark(text, screen_width, screen_height, **kwargs)

    # 使用 after 方法延迟执行生成水印函数
    root.after(100, generate_watermark_with_size)
    root.overrideredirect(True)
    root.lift()
    root.attributes('-alpha', 0.6)  # 设置透明度
    root.wm_attributes('-topmost', True)
    root.wm_attributes('-disabled', True)
    root.wm_attributes('-transparentcolor',"white")
    hWindow = pywintypes.HANDLE(int(root.frame(), 16))
    exStyle = win32con.WS_EX_COMPOSITED | win32con.WS_EX_LAYERED | win32con.WS_EX_NOACTIVATE | win32con.WS_EX_TOPMOST | win32con.WS_EX_TRANSPARENT
    win32api.SetWindowLong(hWindow, win32con.GWL_EXSTYLE, exStyle)
    root.mainloop()

# 使用示例
if __name__ == '__main__':
    # 获取当前用户名
    username = os.getlogin()
    # 组合文本
    mytext = f"Allianz\n{username}"  # 使用 f-string 格式化字符串
    angle = 45  # 旋转角度
    create_watermark_window(mytext, angle=angle, lines=10)