南方 发布的文章

一直以来,我都在自己的几台电脑上使用btsync1.4.111做文件的备份和同步,比如几个人同样做一份设计稿,我做前1-10页,B同事做11-20页,C同事做21-30页,我们只需要每人建一个psd文件,然后使用btsync挂机,每个人做的一部分都会自动同步到所有人,这样即是一个版本服务器同时也是个自动文件服务器。这种应用方式在局域网内可用,在地球的不同位置也一样同用,对于非代码类的团队的协同工作是非常好的。

微信图片_20250912105212.png

大约在5年前,btsync1.4.111版本突然连不上服务器了,中途有一阵突然又可以连上但是打洞的成功率比较低,再后来就彻底连不上了。

起初,以为是因为墙的原因,电脑上的一些项目都依然保持着。直到很长一段时间,我意识到可能永远也连不上了,那么是否可以魔法工具来使用呢?

在网上找了很多文章来尝试,最终者是无果的,最近一次尝试是看了下面这篇文章。

 

Resilio Sync 无法连接解决方法

https://foair.me/posts/resilio-sync-connection

通过为btsync设置代理,结果也是不行的,但是为了验证官方服务器是否连上,我使用了Proxifier分析了一下软件启动时年连接过程,软件确实发起了连接,但是回包却是几串报错信息。由于新老版本使用的服务器并不同,意味着像btsync1.4.111这种老版本的官方服务器配置文件已经没存在了。

这就说到我为什么还在用1.4.111这个版本,是因为这个版本有dht功能,这个功能在一次连接后,可以通过已连接的节点获取到其它节点信息,对于p2p来讲这是一个很好的功能。

既然老版本的官方服务器配置文件已不可用,并不代表这个软件已不可用,在非公网的情况下btsync依然是一个好用的工具,下面按两种情况说说:

1.局域网中使用btsync

这里的局域网可以是公司内部的同一wifi和网段的,也可以是有\/pn连接的异地用户,只要电脑之间可正常通信即可。

假设在A电脑的btsync里有一个文件目录,我们在B电脑上使用分享过来的key添加项目,在此项目的偏好设置---预定义主机-指定A的ip和端口,即可连上并实现高速同步。

2.在公网使用btsync

如果你的电脑A有公网ip,直接从路由器把btsync使用的端口映射过去即可,从其它电脑上使用预定义主机指定这个A的公网ip和端口即可。

如果两边都是内网,那么你需要一台VPS,在VPS上运行一个btsync客户端,在VPS上运行一个项目,其它所有节点都使用预定义主机与这台VPS连接。

如果两边都是内网,但是又不想在VPS上面保存文件,仅做数据中转,那就需要使用像frp这样的工具,将VPS上面btsync客户端的ip和端口映射到电脑A,其它节点使用预定义主机指定VPS的ip和端口。

如此,可以将btsync老版本做为一个私有的使用继续使用。

Eloquent是laravel中用来实数据库模型化的工具,使用eloquent生成模型类,与数据表形成映射关系,之后在操作数据库时就不需要手工进行数据的边接和查义语句的编写,只需写php对模型类进行操作即可。

那么在laravel中,当我们在.env中配置好数据库后,laravel是否会自动生成建议映射并生成模型文件呢? 答案是不会的。

了解这个问题,其实就是了解Eloquent的工作过程。

通常情况下,你需要手工使用Artisan命令来生成Model,但这个命令可以非常智能地根据你的数据表结构进行“适配”,而不是完全“自动生成”。

系统不会在你创建数据表迁移后自动为你创建模型。你需要手动执行一个命令来创建模型文件,然后可以手动或利用命令选项来让它与特定的数据表关联。

 

核心概念:为什么不是全自动?

Laravel 遵循 “约定优于配置” 的原则。如果你遵循它的约定,几乎不需要额外配置。

模型命名约定:模型类名的单数、大驼峰形式对应数据表名的复数、蛇形命名。

例如:模型 Flight 会自动对应到数据表 flights。

模型 UserProfile 会自动对应到数据表 user_profiles。

主键约定:默认每张表的主键是 id,且是自增的整数。

时间戳约定:默认期望存在 created_at 和 updated_at 两个时间戳字段。

如果你遵循了这些约定,你只需要生成一个空的模型,它就能自动工作。如果你没有遵循约定,则需要在模型文件中手动指定表名、主键等属性。

如果我们有一个posts表,那么执行php artisan make:model Post即可app/Models/ 目录下生成 Post.php 文件。

 

高级技巧:一站式生成
Laravel 的 Artisan 命令非常强大,可以让你在创建模型的同时顺便创建迁移、控制器等资源,大大提高效率。

最常用的组合命令:

bash
php artisan make:model Post -mcr
-m 或 --migration:同时为模型创建一个迁移文件 (create_posts_table)。

-c 或 --controller:同时创建一个资源控制器 (PostController)。

-r 或 --resource:指示控制器应该是资源控制器(包含 index, create, store, show, edit, update, destroy 等方法)。

执行上面的命令后,你会一次性得到:

模型文件 app/Models/Post.php

迁移文件 database/migrations/xxxx_create_posts_table.php

控制器文件 app/Http/Controllers/PostController.php

然后你只需要去编辑迁移文件来定义表结构,再运行 php artisan migrate 即可。

建立好模型类文件,就可以在控制器或者路由中使用它了。

Migration 的核心作用是在多人协作中,像使用版本控制器(如 Git)管理代码一样来管理你的数据库,从而避免使用sql脚本文件的互传。

它允许你和你的团队在应用中定义、共享和维护数据库结构的变化,确保所有开发人员、测试服务器和生产服务器的数据库结构始终保持一致。

在没有迁移功能之前,团队协作开发时,数据库结构的管理通常非常麻烦:

开发者A 在本地数据库添加了一个新表或新字段。

开发者B 也需要进行同样的修改,他需要手动执行 SQL 语句或从A那里获取SQL脚本。

很容易出错,或者忘记执行某个修改,导致代码运行失败。

部署到生产环境时,DBA 或运维人员需要根据开发的变化,手动整理和执行SQL脚本,过程繁琐且易遗漏。


Migration 完美地解决了这些问题:

1. 版本化与协同工作
每个迁移文件通常代表一次数据库结构的更改(例如:create_users_table, add_votes_to_users_table)。

这些文件被放在项目的 database/migrations/ 目录下,可以纳入版本控制系统(如 Git)。

当其他开发者拉取(pull)你的代码后,只需要运行一条命令 php artisan migrate,Laravel 就会自动执行他们本地尚未运行过的迁移文件,使他们的数据库结构立刻与你的一致。

2. 数据库无关性
迁移让你可以使用 PHP 代码 和 流畅的、富有表现力的语法 来定义数据表结构,而不是原生的 SQL。

Laravel 的 Schema 构建器支持所有主流数据库系统(MySQL, PostgreSQL, SQLite, SQL Server)。

这意味着你写一套迁移代码,可以无缝地在不同的数据库驱动上运行,无需为不同数据库编写不同的 SQL 脚本。

示例:创建一个 flights 表

php
// database/migrations/2024_08_19_000000_create_flights_table.php
public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->id(); // 自增 ID,主键
        $table->string('name');
        $table->string('airline');
        $table->timestamps(); // 自动创建 created_at 和 updated_at 字段
    });
}

这段代码非常易读,并且可以用于创建任何支持的数据库表。

3. 可逆性(回滚)
每个迁移文件都包含两个核心方法:up() 和 down()。

up(): 用于执行新的更改(创建表、添加字段等)。
down(): 用于撤销 up() 方法所做的更改(删除表、移除字段等)。

这让你可以轻松地回退到之前的数据库状态。

常用回滚命令:

php artisan migrate:rollback: 回滚上一次的迁移操作。
php artisan migrate:rollback --step=5: 回滚最近5次迁移操作。
php artisan migrate:reset: 回滚所有已运行的迁移(清空所有表)。

4. 部署与同步
在部署应用到生产环境时,你只需要在服务器上运行 php artisan migrate(通常作为部署脚本的一部分)。

Laravel 会检查 migrations 表(该表由框架自动创建,用于记录已运行的迁移),然后只执行那些还未运行的迁移文件。

这确保了生产环境的数据库结构总是与代码库中定义的最新结构完全同步,极大地简化了部署流程。

5. 保持一致性
迁移强制要求团队使用统一的、定义良好的方式来修改数据库。

它成为了数据库结构变化的“唯一真相源”,所有人都基于这套迁移文件工作,避免了手动修改数据库可能带来的混乱和不一致。

因为官方服务器的服务器连不上,设置 proxy 也连不上,这点很奇怪。

怎样搭建一个中继,可以正常使用?


----------------

How to set up a BTSync relay?

Since the official servers are unreachable and setting up a proxy also fails to connect, this is quite strange.

How can I set up a relay that functions properly?

最近在学习laravel,在执行php artisan make:model xxx命令时,遇到一条报错,如下:

Fatal error: composer detected issues in your platform: Your composer dependencies require a pHp version">= 8.2.8". You are runing5.6.4. in D: phpEnv.....

这是在执行composer时会运行的一个环境检测脚本,当前站点的php版本是8.2,但是还是出现了上面的报错。

于是到cmd中执行php -v,返回版本是8.2。到站点中写了一个phpinfo()返回也是8.2,说明目前的版本是8.2无疑。

既然都没有问题,那问题出在哪里? 网上也没有找到可以将composer修改配置文件的方法,当今之计,那就把phpenv中其它版本删掉看看。

转机就出在这里,当我要删掉php5.6时,弹出一个对话框:卸载"PHP-5.6"失败!此PHP已被设置成默认PHP-CLI版
本! ,这提醒到我,于是在phpenv的设置菜单下,有一个phpcli默认版本的设置:

phpenv中phpcli版本设置

在这里切换到php8.2,重启服务居然还是故障依旧,有点吐血,于是把php5.6卸载掉,composer make:model执行成功。

 

虽然问题已经解决,但引申出一个php多版本共存时phpcli版本设置问题。得闲需再研究一下。

 

网摘:

告别繁琐的 PHP 版本切换! 使用 pv,一键安装、极速切换,轻松管理多版本,让开发PHP版本兼容调试更高效!

https://mp.weixin.qq.com/s/AFv7VtxLXjrVdHpcB1XG8g

 


环境:linux/nginx

在一些使用环境中,早期的https版本由于安全性不够好已经不建议使用,托管商或代码会要求网站停止使用不安全的TLS1.0/TLS1.1协议。

对应于nginx中相关配置指令是ssl_protocols,修改后通过sslscan工具发现始终没生效。查阅nginx的文档,发现有这么一句话If the directive is specified on the [server] level, the value from the default server can be used。

翻译过来就是:如果在server块中使用ssl_protocols了,那么该指定会直接使用默认的值,而并不是当前server块中指定的值。而如果nginx没有默认的server时,将会使用第一个server作为默认的server。因此需要在第一个server或默认的server中,配置ssl_protocols。也可以在http块中指定ssl_protocols。

http {
#...
        # 指定支持的 SSL/TLS 协议版本
        ssl_protocols TLSv1.2 TLSv1.3;
#...

}

再翻译一下,一个linux服务器通常会在nginx中跑多个网站,以lnmp.sh为例,系统在安装时会在总配置文件nginx.conf中建一个默认站点,其它新建的站点每个网站会在vhost目录下生成一个单独的配置文件:

//以lnmp.sh为例,配置文件在/usr/local/nginx/nginx.conf中:

server
    {
        listen 800 default_server reuseport;
        #listen [::]:80 default_server ipv6only=on;
        server_name _;  //默认站点
        index index.html index.htm index.php;
        root  /home/wwwroot/default;
        ssl_protocols TLSv1.2 TLSv1.3;
        ...

    }
include vhost/*.conf; //其它站点

如上配置,如果nginx.conf中指定了ssl_protocols,这个就是默认的配置,如果这个文件中有多段server{},那么后面的会覆盖前面的。如果每个网站都要修改,就需要分别设置vhost中的所有的配置。

做网站的都知道,起初是注册一个域名,然后买一个虚拟空间(vhost),把域名a记录解析到空间,通过ftp把网站程序上传到空间中,一个网站就建成了。

然而ftp并不安全,而且经常几百个网站共用一个ip,一个有问题会连累同服务器几百个网站被搜索引擎K站。

玩着玩着,就变成了玩linux服务器,自己搭环境,这时候上传文件就用ssh比较多。比如前文说到的执行命令用putty,上传文件用sftp工具,比如putty家的bitvise SSH Client,要学的东西也越来越多。

要说方便也方便,但是还是不如本地电脑这样c盘拷贝到d盘这么方便。有没有一种可能,像映射网络磁盘这样,实现网站服务器与本地电脑像c盘拷d盘这样用呢?

有,还真找到这样的工具。

安装WinFsp https://github.com/billziss-gh/winfsp/releases/

安装SSHFS-Win https://github.com/billziss-gh/sshfs-win/releases

安装好后重启电脑,在桌面我的电脑图标上点右键,映射网络驱动器,弹出对话框:

sshfs.jpg

驱动器这里的X,就是映射成功能本地电脑中显示X盘。

文件夹:\\sshfs.r\root@8.8.8.8\    这是一种固定格式ssh.r表示以root权限登录到根目录,root是服务器用户名,@8.8.8.8是你的linux服务器地址,这个映射完成后,是直接以root身份把服务器的根目录\映射到本地X盘。如下图:

未标题-1.jpg

是不是方便很多? ssh有很多骚操作,这是很有意思的一个。

 

扩展:

1.如果服务器的sshd的端口不是默认的22怎么办?

格式:\\sshfs.r\root@8.8.8.8!2222

这里是连接到服务器的sshd使用的2222端口

 

2. 不想映射到服务器根目录,只映射到指定目录怎么办?

格式:\\sshfs.r\root@8.8.8.8!2222\www\wwwroot

这里就是直接映射到网站环境的根目录。

 

3.不想使用root用户怎么办?

格式:\\sshfs.r\test@8.8.8.8!2222\home\test\

这里使用test用户连接服务器,并且指定到test用户家目录(别的目录没权限)

 

4.能使用服务器的域名吗?

格式:\\sshfs.r\test@www.google.com!2222\home\test\

当然没问题,如上格式把www.google.com换成你的域名即可

letsencrypt.jpg

环境:centos7-64 php,使用了lnmp.org一键搭配脚本


使用lnmp ssl add生成ssl证书失败,提示/usr/local/acme.sh/upgrade.sh: No such file or directory。

已知lnmp.org脚本是使用github上的acme.sh进行的生成,根据日志到/usr/local/目录中找不到acme.sh,猜测是根本没有下载到脚本。查看日志,有下面一段:

--2024-09-02 16:58:23--  https://soft.vpser.net/lib/acme.sh/latest.tar.gz
Resolving soft.vpser.net (soft.vpser.net)... failed: Name or service not known.
wget: unable to resolve host address ‘soft.vpser.net’
tar (child): latest.tar.gz: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
/usr/bin/lnmp: line 1186: cd: acme.sh-*: No such file or directory
/usr/bin/lnmp: line 1187: ./acme.sh: No such file or directory
sed: can't read /usr/local/acme.sh/acme.sh: No such file or directory
/usr/bin/lnmp: line 1192: /usr/local/acme.sh/upgrade.sh: No such file or directory
chmod: cannot access '/usr/local/acme.sh/upgrade.sh': No such file or directory
Restarting cron (via systemctl): cron.service.
/usr/bin/lnmp: line 1220: /usr/local/acme.sh/acme.sh.env: No such file or directory
Generate ssl certificate using BuyPass...
/usr/bin/lnmp: line 1339: /usr/local/acme.sh/acme.sh: No such file or directory

注意日志中有关键的一段:Resolving soft.vpser.net (soft.vpser.net)... failed: Name or service not known,由于论坛现在登录不了,也找不到作者,根据这一句进行搜索,果然也有人遇到这个问题,起因是可能是由于域名被墙,导致大面积安装故障,办法是将脚本中的旧地址换成新地址。


打开/usr/bin/lnmp,1180行左右,将其中的https://soft.vpser.net/lib/acme.sh/latest.tar.gz,改为https://soft.lnmp.com/lib/acme.sh/latest.tar.gz。


保存后重新执行lnmp ssl add,问题解决。

参考:https://bbs.lnmp.com/thread-27108-1-1.html

在一个号称AI免费设计logo网站里制作了一个logo,制作了一个还不错,但是到下载的一步要求付费199。

这套路玩的真6,干它!

在chrome浏览器中显示这个logo,这个logo是使用svg实时渲染的,首先看有没有一些图标先将其最大化,然后按f12打开浏览器调试,通过鼠标点击dom一层一层找到logo所在的dom,这个网站是比较鸡贼的,每两三秒刷新一下动画dom变来变去,很难选中。

svg图片下载

找到svg所在dom的父级dom,右键复制-复制元素,好几次复制出来粘贴到记事本都是undefiende,功夫不负有心人,终于在某一次logo显示的时候又复制了一次,粘贴到记事本得到一大片代码。如图:

 

先放到notepad--里面格式化一下,明显的有很多html代码,中间包裹着一对<svg>..........</svg>,把前后的都去掉,然后保存成一个1.svg文件。

svg2.png

 

使用inkscape或coreldraw打开,瞬间得到这个logo,接下来想怎么玩就随意了。

svg3.png