Normal view

There are new articles available, click to refresh the page.
Before yesterdayTricks & Tech

Shadowsocks 服务器搭建

13 September 2019 at 11:52

基本上算作官网文档的补充,官网很多东西散落在各个角落,不太好找,本文稍微归纳了一下。

技术发展日新月异,随着时间的流逝文中的一些东西可能会过时,请注意更新时间。

最后修改:2019–08–08。

目前 shadowsocks 中还在不断更新的只有 shadowsocks-libev,本文主要介绍这个。

首先你要有台用于搭建 ss 的服务器。另外本教程适合用户个人使用,如果想建站,请自行查阅其他资料。

shadowsocks-libev

ubuntu 的安装很简单,一条命令即可,不过貌似对 Ubuntu 版本有要求
sudo apt install shadowsocks-libev
安装的可能不是最新版,最新版请手动编译

Centos 7安装

按官网说明安装软件,建议采用手动方法,原因一是能保证用的是最新版,二是出了问题容易上网搜索解决。
Installation

不过官网上写得有些混乱,如果看不懂的话直接无脑进行如下操作即可:

yum install epel-release -y
yum install gcc gettext autoconf libtool automake make pcre-devel asciidoc xmlto c-ares-devel libev-devel libsodium-devel mbedtls-devel -y

git clone https://github.com/shadowsocks/shadowsocks-libev.git
cd shadowsocks-libev
git submodule update --init --recursive

./autogen.sh && ./configure && make
sudo make install

接下来需要将配置文件拷贝到常用路径
添加配置文件:

cp ./rpm/SOURCES/etc/init.d/shadowsocks-libev /etc/init.d/shadowsocks-libev
cp ./debian/config.json /etc/shadowsocks-libev/config.json
chmod +x /etc/init.d/shadowsocks-libev

单用户配置

编辑配置文件

vim /etc/shadowsocks-libev/config.json

修改里面的配置,这里给个 demo,具体每个参数什么意思在官网了解吧:

{
"server":["[::0]","0.0.0.0"],
"server_port":8388,
"local_port":1080,
"password":"barfoo!",
"timeout":60,
"method":"chacha20-ietf-poly1305"
}

该配置同时支持 Ipv6 和 Ipv4,并采用 ss3.0 支持的 AEAD 加密方式。
接下来我们要修改 /etc/init.d/shadowsocks-libev,由于历史原因这里面有点问题。
把文件中的DAEMON=/usr/bin/ss-server改成DAEMON=/usr/local/bin/ss-server
修改完成后修改文件权限

chmod 755 /etc/init.d/shadowsocks-libev

启动 shadowsocks-libev

/etc/init.d/shadowsocks-libev start

多用户配置

多用户配置有多种方法,官方推荐通过给每个用户一个配置文件,启动多个ss-server实现。
还有种方法如下,通过启动ss-manager实现
多用户配置文件与单用户不同,我们配置文件目录创建一个ss_manager.json

{
"server": ["[::0]","0.0.0.0"],
"local_port": 1080, # 本地端口,自行设定
"timeout": 600, # 超时毫秒数
"method": "chacha20-ietf-poly1305",
"port_password": {
"8388": "barfoo1", # 端口号与密码
"8389": "barfoo2"
}
}

设置开机启动

单用户很简单

chkconfig --add shadowsocks 
service shadowsocks start

若是针对多用户情况,需要手写开机启动脚本,方法如下:
应在/usr/lib/systemd/system下新建一个.service文件,例如ssmanager.service

[Unit]
Description=shadowsocks manager # 服务的描述
After=network.target # 该服务跟在哪个服务后启动

[Service]
Type=forking # 启动时的进程行为,forking是以fork形式从父进程创建子进程,子进程创建后父进程退出
ExecStart=/usr/local/bin/ss-manager --manager-address /var/run/shadowsocks-manager.sock -c /etc/shadowsocks/ss_manager.json # 启动服务时执行的命令
PrivateTmp=true # 使用私有临时文件目录

[Install]
WantedBy=multi-user.target # 附挂在multi-user.target下

所有配置文件与脚本都设置完毕,使用systemctl开启服务。

# 更改.service文件后,都要重载守护进程更新systemctl
systemctl daemon-reload
# 启动服务
systemctl start ssmanager.service
# 查看服务状态,若为绿色active(running)则说明服务成功启动
systemctl status ssmanager.service
# 设置服务开机自启动
systemctl enable ssmanager.service
# 还可使用systemctl restart ssmanager.service重启服务,使用systemctl stop ssmanager.service停止服务

开启防火墙白名单

很多人按照教程的配置完后,发现并不能使用,原因是端口被防火墙关闭了。
输入如下代码开启防火墙端口白名单:

vim /etc/firewalld/zones/public.xml

在文件中适当位置添加下面代码:

<port protocol="tcp" port="[server port]"/>
<port protocol="udp" port="[server port]"/>

[server port] 填你的端口号。

重启防火墙

firewall-cmd --complete-reload

客户端

在这里面找适合自己版本的吧
GitHub

开启多进程

shadowsocks-libev 一个进程只能开启一个端口,因此我们要开启多个进程,对应每个进程使用一份相应的配置文件,从而达到多用户使用的目的
配置完多份配置文件后w在 /etc/init.d/shadowsocks 相应位置添加如下代码,一下代码仅供参考,读者可根据实际需求修改,这些代码的意思都很简单。

# 配置文件位置
CONF1=/etc/shadowsocks-libev/config1.json

# 检测配置文件是否存在
if [ ! -f $CONF1 ] ; then
echo "The configuration file1 cannot be found!"
exit 0
fi

# 定位到 pid 文件
PID1=/var/run/$NAME/pid1

# 开启进程
daemon $DAEMON -c $CONF1 -f $PID1

# 杀死进程
killproc -p ${PID1}

# 移除 pid 文件
rm -f ${PID1}

在原来的脚本里有跟上面代码极其相似的地方(数字1没有),把上面的6段代码插入到原来脚本中对应相似的代码后面即可。

Python 与 C++ 数据传输

13 September 2019 at 11:31

因毕设需要,需从 python 将图像数据传给 C++,接收 C++ 处理好后的图像。

新建 C++ 文件接收从 Python传来的数据

#include <opencv2/opencv.hpp>

cv::BackgroundSubtractorMOG2 mog(100, 16, false);

extern "C" void getfg(int rows, int cols, unsigned char* imgData,
unsigned char *fgD) {
cv::Mat img(rows, cols, CV_8UC3, (void *) imgData);
cv::Mat fg(rows, cols, CV_8UC1, fgD);
mog(img, fg);
}

extern "C" void getbg(int rows, int cols, unsigned char *bgD) {
cv::Mat bg = cv::Mat(rows, cols, CV_8UC3, bgD);
mog.getBackgroundImage(bg);
}

所有与 python 交互的 API 必须在 extern "C"中,如果交互 API 过多,上述代码也可以写成如下形式

#include <opencv2/opencv.hpp>

cv::BackgroundSubtractorMOG2 mog(100, 16, false);

extern "C"{
void getfg(int rows, int cols, unsigned char* imgData,
unsigned char *fgD) {
cv::Mat img(rows, cols, CV_8UC3, (void *) imgData);
cv::Mat fg(rows, cols, CV_8UC1, fgD);
mog(img, fg);
}

void getbg(int rows, int cols, unsigned char *bgD) {
cv::Mat bg = cv::Mat(rows, cols, CV_8UC3, bgD);
mog.getBackgroundImage(bg);
}
}

图像数据通过 unsigned char *data 传输进来,通过Mat image(h,w,CV_8UC3,data)转换成C++ OpenCV可识别数据,如果是灰度图,则是CV_8UC1,数据通过指针链接,在C++中是直接修改存在内存中的数据,无需传回。
之后将 C++ 编译成动态链接库,CmakeLists设置如下

add_library(prj SHARED
main.cpp
main.h libmain.cpp)

target_link_libraries(prj ${OpenCV_LIBS})

与C++交互的文件设置如下

import ctypes
# 链接动态库
libmog = ctypes.cdll.LoadLibrary('path/to/libmain.so')

def getfg(img):
(rows, cols) = (img.shape[0], img.shape[1])
res = np.zeros(dtype=np.uint8, shape=(rows, cols))
libmain.getfg(img.shape[0], img.shape[1],
img.ctypes.data_as(ctypes.c_char_p),
res.ctypes.data_as(ctypes.c_char_p)
return res


def getbg(img):
(rows, cols) = (img.shape[0], img.shape[1])
res = np.zeros(dtype=np.uint8, shape=(rows, cols, 3))
libmain.getbg(rows, cols, res.ctypes.data_as(ctypes.c_char_p))
return res

对于需要指针传输的数据,需要用ctypes.data_as(ctypes.c_char_p)将其转换成C++可读取的数据形式

参考文章
stackoverflow

可以下载 macOS 各历史版本固件安装包的工具:Mist

By: fengooge
24 August 2023 at 14:32
&nbsp;有时候需要下载特定版本的 macOS 系统固件安装包,如果自己在应用商店下载,则只能够下载少数几个自己下载过的版本,非常不方便。这里推荐一个工具:Mist。Mist 是一款开源免费的工具软件。项目地址:https://github.com/ninxsoft/Mist安装后刷新,就可以看到 macOS 系统的版本列表。下载列表分两种类型:固件(Firmwares)、安装助手(Installers),可以根据自己的需要选择。另外,再补充一个可以下载 iOS 、macOS 系统固件的网站:IPSW:https://ipsw.me/

全平台的文件传输工具-LocalSend

By: fengooge
28 January 2023 at 09:03
LocalSend 是一个跨平台的文件传输工具,它目前支持 Android(安卓)、iOS、Windows、macOS、Linux 等平台, 也就是主流的操作系统它都已经支持,最关键的是,它还是一个开源项目,应用代码是公开的,我们不用担心隐私方面的问题。如果对作者提供的应用仍然存在安全担忧,可以下载 GitHub 源码,自己编译安装。LocalSend 官网:https://localsend.org/GitHub 项目地址:https://github.com/localsend/localsendLocalSend 使用非常简单,在需要传递文件的设备上安装后,让设备处于同一局域网(local Wi-Fi)下,就可以互相识别。LocalSend 设备的互相识别需要网络,但是传输文件却不需要真正接入 internet,换句话说,只需要本地网络就可以完成文件传输。例如你在某个场合需要临时

如何保持 Telegram 的后台推送?

By: fengooge
13 September 2022 at 08:50
&nbsp;Telegram 是非常流行的即时聊天工具(IM),有非常优秀的使用体验,在聊天体验上全面碾压诸如微信(WeChat)之类的,列举几条如下:1、真正的全平台支持手机端(iOS、Android)自不必说,桌面端不仅支持 Windows、macOS,还包括少见的 Linux 平台,而且网页版也存在多个版本同时维护——据说是为了让团队内部竞争,以此提供更优秀的使用体验。2、永远不用担心聊天记录丢失不仅支持全平台同步,而且用户所有的聊天记录(个人聊天、群聊等)都会保存在云端,随时需要随时查看,不占用本地存储空间。不仅云端存储空间没有限制,而且还是免费的!3、支持丰富的表情符号(贴纸)平台内就已经包含丰富的表情符号,用户还可以自己导入外部的表情符号,丰富自己的表情库。4、极为流畅稳定的使用体验Telegram 群组支持海量用户(没有考据上限是多少)同时聊天,万人群很常见。很多大群的聊天

使用FFmpeg进行简单的视频编辑

By: fengooge
21 August 2022 at 23:36
FFmpeg 是强大的视频编辑开源命令行工具,由于它过于强大,因此包装后的很多窗口工具都没有它好用,因此学习使用命令行工具还是很必要的。 FFmpeg 官网地址:https://www.ffmpeg.org/下面介绍几个使用 FFmpeg 的高频视频编辑功能。安装 FFmpeg macOS 命令行安装 FFmpegbrew install ffmpegFFmpeg 常用视频编辑功能 FFmpeg 使用参数:ffmpeg {1} {2} -i {3} {4} {5}上述参数说明: {1}:全局参数 {2}:输入文件参数 {3}:输入文件 {4}:输出文件参数 {5}:输出文件 常见参数:c:指定编码器&nbsp;-c copy:直接复制,不经过重新编码(这样比较快)&nbsp;-c:v:指定视频编码器&nbsp;-c:a:指定音频编码器&nbsp;-i:指定输入文件&nbsp;-an:去除

如何使用Photoshop扩展图片并制作指定分辨率的壁纸

By: fengooge
26 June 2022 at 16:00
&nbsp;如何抠图并制作壁纸请查看:如何使用Photoshop快速抠图并设置背景色制作壁纸例如,原始图片的分辨率大小是:800*1200,我们需要制作一张 1080*1200 大小的壁纸,我们需要扩展垂直方向的大小,比较好的方法是使用 Photoshop 的智能填充功能完成。如下图所示,我们需要将原始图片的上下部分进行扩展,以达到需要的分辨率。方法及步骤如下:1、新建一个目标分辨率大小的画布;2、复制一次新建的空白图层,并将原始图片拖入图层中(如上图所示);3、选中空白图层,使用选择工具-矩形选择,选择需要进行填充的区域(如下图所示);4、依次选择【编辑】-【内容识别填充】,会出现一个涂抹工具,我们选择需要进行填充的“素材源”(为了得到平滑过渡的效果,我们一般在填充区域的边缘选择“素材”,在素材源的区域进行涂抹操作),Photoshop 会自动使用选择的“素材”完成选中区域的填充,并出

如何使用Photoshop快速抠图并设置背景色制作壁纸

By: fengooge
14 May 2022 at 15:18
如何扩展图片制作壁纸请查看:如何使用Photoshop扩展图片并制作指定分辨率的壁纸有时候我们需要对设置成壁纸的图片进行简单地处理,例如删除背景,把背景色替换成自己喜欢的颜色。下面举例说明如何使用 Photoshop 完成这些操作。原始图片如下,背景是繁杂的室内环境,我们需要把背景删除掉。在 Photoshop 2020 及之后的版本中增加了一个一键快速删除(去除)背景的功能,操作方法如下:1)打开需要处理的图片;2)按快捷组合键 command + J / Alt + J(分别对应 macOS 和 Windows 系统的快捷键)新建一个图层;3)删除背景选中新建的图层,打开如下图所示的界面,选择「删除背景」,这样就一键删除了背景,非常方便。注意:只有在新建的图层上才会显示该快速操作。执行该快捷操作之后的效果如下图所示:4)填充颜色我们再次新建一个图层,并使用吸管工具吸取图片中人物的口红

值得推荐的工具网站一览

By: fengooge
11 October 2021 at 22:24
有以下网站提供了非常易用的工具,这里整理下来分享给大家。 1、图片处理 ◇ 图片压缩 TinyPNG 高品质的图片压缩网站,经过压缩之后文件大小可以显著减小,并且肉眼几乎看不出变化。 Squoosh同样优秀的图片压缩网站,压缩后的效果非常高——缩减空间多且图片几乎看不出质量损失。PhotoFun又一个图片在线压缩的备选站点。 2、媒体下载 ◇ 影视资源下载BTDigg 基本上不是太冷门的资源都可以在这里找到 bt 种子文件或磁力链接地址。 YYeTs人人影视(已关停) 比较好的双语视频网站,包含人人影视自己翻译的和别的字幕组的资源,安装它们的客户端可以直接下载。 诸神字幕组 小众字幕组,以日语资源为主。 天天美剧(已关停) 以美剧资源为主。 ◇ YouTube 视频文件下载 Clip Converter 没有版权音乐作为背景音,或者没有提交版权限制的 YouTube

macOS系统下如何修改文件的创建时间

By: fengooge
8 July 2021 at 10:35
有时候我们需要修改文件的时间属性,例如图片的创建时间或者修改时间,在 macOS 系统下,不使用第三方工具,在系统自带的「终端」工具中,使用简单的指令就可以完成。下面以修改图片的时间属性为例。1、修改单个图片的时间属性方法步骤如下:1)打开 macOS 系统的「终端」工具;2)输入如下指令:touch -mt YYYYMMDDhhmm 文件路径tips1:上面的「文件路径」可以通过将文件拖到「终端」窗口中自动生成,免去手动输入的麻烦;tips2:YYYYMMDDhhmm 为对应的年-月-日-时-分;回车之后,再通过 command + i 快捷键就可以看到图片的时间属性已经是上面指定的了。2、批量修改图片的时间属性方法步骤和上面相同,只是路径有些许变化。指令如下:touch -mt YYYYMMDDhhmm&nbsp;文件路径/*「终端」窗口中拖入文件夹之后,在自动生成的文件路径后面添加

如何使用MediaCoder进行无损视频转码编辑

By: fengooge
12 March 2021 at 10:37
我们要用到的视频转换(转码)常用工具:MediaCoder官方网站地址:https://www.mediacoderhq.com/1、视频格式快速转换(以 .flv 转 .mp4)在很多时候我们下载到的是 .flv 视频格式的文件,但是这种格式在使用时非常不方便,例如不能够在常见的视频编辑软件中进行剪辑,因此需要将 .flv 格式的文件转换为 .mp4,下面就介绍一个工具,可以做到无损转换。所谓视频文件的无损转换,就是将原视频文件的音频流、视频流都提取出来,打包(封装)成另一种视频格式的文件。例如我们这里就是将原来以 FLV 容器打包的视频文件,重新打包成 MP4 格式,因为视频流、音频流都是提取复制,因此不存在质量损失。使用方法及步骤这里以 FLV 转 MP4 为例。1、将 .flv 格式的视频文件拖到上面显示的编辑界面中;2、分别在【视频】、【音频】两个选项卡中选择【复制视频流】、【

❌
❌