文章13
标签6
分类2

微博图床进入noreferer防盗链时代

微博图床长期以来都是中国大陆访问线路质量高、图片质量高的存在。

2022年12月29日左右,微博图床图片出现了大规模403的情况。事实上,微博图床早已有防盗链手段,但极易通过html noreferer标签进行规避。

所谓防-盗链,是指通过请求Header中的Referer地址判断访问来源,仅让白名单域名访问资源的一种手段,可以降低流量成本。通常的,网站不会对noreferer防盗链开启防盗链,所以新浪和盗链用户暂且相安无事,而本次对noreferer开启防盗链,才致使出现大规模403。

很不幸,本站的图片API和部分内容都使用了微博图床,因此,一场紧急“救图”行动开始了。

临时措施

如果很不幸没有备份存在图床里的图片,我们可以选择修改referer的方式临时下载。

curl --referer可以伪装来路,从而解决403错误无法下载图片的问题,但这样未免太不方便;

Chrome浏览器安装 Header Editor ( https://chrome.google.com/webstore/detail/eningockdidmgiojffjmkdblpjocbhgh),参考下图添加修改请求头的规则,匹配规则与使用域名相符即可。

待下载图片后重新上传至其他处,替换网页上的链接即可。

掩耳盗铃

经测试,tva1.sinaimg.cn等微博图床域名已开启noreferer防盗链无疑,但tvax1.sinaimg.cn等域名似乎仍可以通过noreferer访问,如果不想将图片迁移,可以将图床域名进行替换(内容不会改变)

有二次压缩——
加前缀:https://i0.wp.com/tvax4.sinaimg.cn/large/ (第三方反向代理,风险自负)
加前缀:
https://image.baidu.com/search/down?url=http://tvax4.sinaimg.cn/large/
(百度搜索,风险自负)

个人非常不推荐这样做

如果你想稳定地提供图片,还是使用其他公共图床/对象储存吧。

一点感慨

从良心云年末促销力度明显削减,到微博图床防盗链,大家的裤腰带似乎勒得越来越紧了。

希望疫情早日过去,经济早日恢复。

Intel DevCloud海量CPU核数内存试用与rootless玩法

Intel DevCloud

官方说法:在一个由最新的英特尔®硬件和软件组成的集群上免费学习、制作原型、测试和运行您的工作负载。

网上的教程大多是对devcloud的线上IDE进行试用,比如wzfou认为英特尔Intel DevCloud是一个限制10小时80H256G的WebIDE。

在经过研究后发现oneAPI具有更多的玩法

警告⚠:Intel DevCloud是一个学习平台,请严格遵守ToS,使用proot和挖矿行为(甚至内网穿透)会导致账号被封禁!

传统玩法

注册账号:https://www.intel.com/content/www/us/en/forms/idz/simple-registration.html?tgt=https%3A%2F%2Fwww.intel.com%2Fcontent%2Fwww%2Fus%2Fen%2Fforms%2Fidz%2Fdevcloud-enrollment%2Fedge-request.html

官网:https://software.intel.com/content/www/us/en/develop/tools/devcloud/edge/overview.html

服务器:https://software.intel.com/content/www/us/en/develop/tools/devcloud/edge/build.html 

注册部分可以参考 英特尔Intel DevCloud免费云服务器和AppOnFly免费试用Windows Server服务器 - 挖站否-挖掘建站的乐趣 (wzfou.com),这里不再赘述。

至此,你获得了一台平平无奇的“小鸡”

重头戏

10小时的单次运行限制和Jupyter环境未免不够极客,我们能否让它更加极客呢?

答案是可以,而且就写在oneAPI的文档里(不知道为什么网上几乎没有相关的介绍,可能rootless和时限减少了滥用)。

首先我们要透过ssh与Intel login-2堡垒机建立连接,在https://devcloud.intel.com/oneapi/documentation/connect-with-ssh-linux-macos/ 页面里,下载包含账号私钥信息的setup-devcloud-access-xxxxxx.txt,然后执行网页上给出的命令,不出意外的话,就可以与login-2的终端进行交互了。

这个堡垒机只有10H16G,完全不符合我们的性能需求,我们要通过qsub来提交任务请求,获得集群中的高性能机器供我们使用。

在login-2终端中输入pbsnodes,我们可以获取到所有的节点状态。这样呈现的数据可能比较乱,我们可以使用pbsnodes | sort | grep properties | uniq,仅展示关键数据properties.

properties呈现了各种关键参数“core/xeon”、“Tiger Lake/Coffee Lake/Comet Lake/Skylake/Ice Lake”、内存大小、GPU等,我们提交任务请求时需要通过它指定机型。

我使用 qsub -I -l nodes=1:ramgb:ppn=2,walltime=24:00:00,cput=100:00:00 -d . 进行演示,其中ramgb可以替换成其他参数,这样我们就得到了100小时CPU时间,24小时单次运行时间的128H256G的节点。除了没有root权限,与其他机器无异。

rootless玩法

Intel DevCloud自带完整的运行库和编译链,而且我们拥有不俗的性能,理论上借助编译安装我们可以运行绝大多数user mode软件。

但是如果不借助包管理软件,这依然是一件头大的事情,而且我们可能要维护不同的工具链和glibc...这里,笔者尝试使用homebrew进行包管理,安装代码如下:

#!/bin/bash
set -ex

export HOMEBREW_PREFIX=~/homebrew
# export HOMEBREW_NO_ANALYTICS=1
mkdir -p "${HOMEBREW_PREFIX}"
curl -fsSLk https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C "${HOMEBREW_PREFIX}"

ls -laR "${HOMEBREW_PREFIX}"

export PATH="${HOMEBREW_PREFIX}/bin:${PATH}"
type -a brew

type -a openssl || :
openssl version -a || :

type -a curl || :
curl -V || :

# Fails to lock a .git/config file.
##brew analytics off

# No "brew update" until installing the proper openssl and a curl that uses it.
# brew update

# brew remove openssl || :
brew install openssl
brew link --force openssl

# brew remove curl || :
brew install --with-openssl curl
brew link --force curl || :
curl -V

ls -la "${HOMEBREW_PREFIX}/opt"
ls -la "${HOMEBREW_PREFIX}/bin"
ls -laLR "${HOMEBREW_PREFIX}/opt/curl/"

除此以外,我们还要在.bash_profile中加入

export HOMEBREW_PREFIX=~/homebrew
export PATH="${HOMEBREW_PREFIX}/bin:${PATH}"

以确保下次可以直接使用homebrew,brew install 即可安装(当然是存在很多坑的,自己解决啦)

其他问题

  1. Intel DevCloud 网络带宽配置相当低,网络需求比较大的应用可以不用试了
  2. brew install screen 应该是基本操作,你可以自定义lock的路径到userhome来持久化screen子进程;
  3. 有了homebrew,为什么不试试 Modern Unix 呢?
  4. 请按需使用DevCloud,把资源留给需要的人

骁龙845吃上Windows on ARM后

背景资料

何为骁龙845(Snapdragon 845/850, Refer Wikipedia):

2017年5月5日,高通官网公布新处理器的命名方案SDM845,为首个采用ARMv8.2指令集的Cortex-A75和A55修改后的Kryo 385 Gold / Silver 核心的CPU的骁龙800系列的系统单片机,CPU部分特别新增了三级缓存,搭配的存储器也多了系统缓存。Geekbench4跑分的部分,单核部分约2500分,多核部分为8500分。

2018年6月,高通于台北国际电脑展览会发表骁龙850,为设计给Windows系统的笔记本电脑处理器,规格大致上为845的高频版本。比起之前采用高通骁龙835处理器的Windows系统笔记本电脑有不少的性能提升。骁龙850相较于手机的骁龙845运算速度再快上30%,且使用时间将高达25小时,人工智能性能同时也成长三倍,最高支持网络将达到1.2 Gbps,将为准5G连网速度。骁龙850移动平台可以让用户体验更轻薄、携带便利的无散热风扇设计。同时骁龙850芯片可支持设备内置的AI体验,而用户能体验到相机、语音、电池续航力等方面的提升。高通本次携手微软Windows 10打造的骁龙850芯片,也可支持微软人工智能语音助理Cortana。

何为 Windows on ARM Refer Wikipedia

2016年12月7日,微软在中国深圳的Windows硬件工程大会上宣布与移动技术公司高通开展合作。微软宣布其在ARM架构设备上使用虚拟机运行Win32应用程序的计划。进行展示的特里·迈尔森在演讲中提到,这一项目将提高基于骁龙处理器的Windows移动设备的生产力,使其能直接运行大多数既有的Windows应用程序,同时这些设备的无线连接、能源消耗方面相比搭载英特尔硬件的设备更优。

2017年12月,微软与高通正式发布了Windows 10 on ARM以及搭载Snapdragon 835处理器"Always Connected PC"系列的电脑产品。

2018年5月,微软发布了Windows 10 on ARM的操作系统对程序集的支持情况以及目前存在问题的帮助:

2020年,受到苹果电脑M1处理器Mac Mini影响开发仿64位版本已经可以运行64位的程序。

1.硬件驱动仅支持针对ARM64平台编写的驱动程序。
2.针对虚拟机运行的Win32应用程序仅支持仿32位版本,2020年受到苹果电脑M1处理器影响开发仿64位版本已经可以运行64位的程序。
3.使用OpenGL1.1之后的游戏或程序,以及部分使用DRM/反作弊系统的游戏或程序不能运行。
4.输入法、系统辅助软件、以及云存储应用程序可能不能正常工作。
5.不支持针对移动设备开发的APP。(如Windows Phone/Windows Mobile应用)
6.不支持Hyper-V虚拟机。

可行性研究

由上述背景资料可知,骁龙850规格大致上为845的高频版本,且市面上早已有骁龙850的量产机。因此,驱动和ACPI问题我们可以照葫芦画瓢来解决。另外,由于其他SoC没有这种得天独厚的条件(仍有部分7系SoC有类似条件),运行Windows的可行性并不大,但仍可以尝试运行mainline kernel。

事实上,项目 Renegade Project 就致力于完善UEFI和WOA的驱动适配。该post也着重讲这个有趣的项目。
目前该项目主要适配了机型:

OnePlus 6 (enchilada)
OnePlus 6T (fajita)
Xiaomi MIX 3 (perseus)
Xiaomi PocoPhone F1 (beryllium)
Meizu 16th (m1882)
Meizu 16th Plus (m1892)
Smartisan R1 (trident)
BlackShark One (skr-a0)
OPPO Find X (pafm00)
Xiaomi MIX 2S (polaris)
LG G7 (judyln)
Samsung Galaxy S9+ (star2qltechn)
Xiaomi MI 7 (dipper-old)
Xiaomi MI 8 (dipper)
Nubia X (nx616j)
Nokia9 PureView (olympic)
ASUS ZenFone 5Z (draco)
Vivo NEX Dual Display (pd1821)


成果展示

我是在设备Oneplus 6T上运行WOA的,目前一加系与小米系支持相对完善,均支持GPU和蜂窝数据流量的使用,且Synaptics机型触控已进行适配。

首先我针对散热系统进行了改良,选用了主流的半导体制冷片方案,顺便还能作为支架一用。oneplus6T

我的其他工作:驱动签名(时间戳不受信任,合并注册表方可使用):https://github.com/xqymain/WOA-Drivers-signed

进入系统:LoadingTaskmgr

一切就绪后,进行了 DiskMark、Geekbench 和 Cinebench R20的测试,其中Cinebench运行在x86模拟环境下,结果如下:DiskMarkCinbenchR20

此外,日常的使用场景也基本能满足:
WebPageMusicPhotoshopPowerpoint

使用指南

大部分主流软件对WOA的支持不佳。下面列举一些原生支持ARM64的软件:7-zip、Bandizip、Putty、VS Code、MS Office(64位预览版支持较好)、Firefox、VLC。更详细的清单参见这个表格(已废弃)。

关于指令集的支持部分,Windows 11(22000.120)下可以模拟至SSE3。AVX指令集已实测无法调用,其他指令集并没有一一测试。日常使用并没有很大问题。AVXTEST

关于运行和开发环境,目前已测试Native WSL1、Python3.x、Go1.7、OpenJDK16、17和转译 VS2022rc、转译VC++2005-2019运行库,支持情况良好。

PHP8挖坑记

最后更新于2021-01-03

灵感来源

本站从Vultr(CHOOPA-Tokyo)迁移到阿里云(深圳)后,重新部署了Linux+Nginx+Mysql+PHP+Apache版本,优化了套件的安全性。恰逢PHP8发布Beta版本,且加入了JIT(Just In Time),遂尝试性进行更新。

P.S. PHP8.0正式版发布后已跟进。

在PHP8正式发布后,本文会更新基准测试 etc.


什么是JIT

在计算机技术中,即时编译(英语:just-in-time compilation,缩写为JIT;又译及时编译、实时编译),也称为动态翻译或运行时编译,是一种执行计算机代码的方法,这种方法涉及在程序执行过程中(在运行期)而不是在执行之前进行编译。通常,这包括源代码或更常见的字节码到机器码的转换,然后直接执行。实现JIT编译器的系统通常会不断地分析正在执行的代码,并确定代码的某些部分,在这些部分中,编译或重新编译所获得的加速将超过编译该代码的开销。

JIT编译是两种传统的机器代码翻译方法——提前编译(英语:ahead-of-time compilation)(AOT)和解释——的结合,它结合了两者的优点和缺点。大致来说,JIT编译将编译代码的速度与解释的灵活性、解释器的开销以及额外的编译开销(而不仅仅是解释)结合起来。JIT编译是动态编译的一种形式,允许自适应优化(英语:adaptive optimization),比如动态重编译和特定于微架构的加速——因此,在理论上,JIT编译能够比静态编译产生更快的执行速度。解释和JIT编译特别适合于动态编程语言,因为运行时系统可以处理后期绑定(英语:Late binding)的数据类型并实施安全保证。

PHP8中JIT的支持是Opcache的一部分,近年来PHP在核心数据结构HashTableZend VM中某些操作码与Opcache的Optimizer组件下了不少功夫。JIT的加入可能意味着其他方法优化已经到达极限了

转自:Wikipedia


安装方法

下载php-8.0.0.tar.gz - php.net代码(截止发文最新的Release版本)。
代码如下(依赖请自行解决)

wget https://www.php.net/distributions/php-8.0.0.tar.gz
tar zxvf https://www.php.net/distributions/php-8.0.0.tar.gz && cd php-8.0.0
./buildconf
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/etc/php.d --with-fpm-user=www --with-fpm-group=www --enable-fpm --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir=/usr/local/libiconv --with-freetype --with-jpeg --with-zlib --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-exif --enable-sysvsem --enable-inline-optimization --with-curl=/usr/local/curl --enable-mbregex --enable-mbstring --with-password-argon2 --with-sodium=/usr/local --enable-gd --with-openssl=/usr/local/openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-ftp --enable-intl --with-xsl --with-gettext --with-zip=/usr/local --enable-soap --disable-debug --enable-opcache --enable-calendar
make && make install

cp php.ini-production /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
service php-fpm start
systemctl enable php-fpm

Opcache使用配置

cd /usr/local/php/etc/php.d
vim 02-opcache.ini

写入以下内容:

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=192
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=100000
opcache.max_wasted_percentage=5
opcache.use_cwd=1
opcache.validate_timestamps=1
opcache.revalidate_freq=60
;opcache.save_comments=0
opcache.fast_shutdown=1
opcache.consistency_checks=0
;opcache.optimization_level=0
opcache.jit_buffer_size=128m
opcache.jit=1205

后重启php-fpm

service php-fpm restart

常见问题

  1. PHP7.4与PHP8共存未解决(指定的--with-config-file-scan-dir不生效)(是否解决未知)
  2. configure: error: iconv does not support errno
    解决方案相当玄学,1.16报错可以尝试1.14版本:
    wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
    ./configure --prefix=/usr/local/libiconv
    make && make install
  3. 目前和PHP7最常见的兼容性问题就是PHP8.0报错500,因为PHP8禁用@运算符强制屏蔽致命性错误,请修改相关代码。目前测试Typecho支持良好,OneIndexR Core问题已修复。

基准测试

基准测试可以参考Phoronix的

介绍OneIndexR——低成本全球CSDS服务

CSDS: Cloud Storage Distribute Service

鸣谢原作者

二次开发并使用的背景API,作者:小歪
二次开发并使用的nexmoes模板,作者:dl233,遵循Apache 2.0 License;
二次开发并使用的OneIndex Bottle Edition,作者:SomeBottle
二次开发并使用的OneIndex,作者:Donwa(现已删库);
使用wangziyingwenAutoApiS项目进行续期;
使用字节跳动西瓜播放器
使用Mozillapdf.js

二次开发和使用均已直接或间接获得授权。


最初想法

由于PanDownload事件,找一个安全且容量大的网盘似乎成了每个人的刚需,恰好想起来自己封存已久的Microsoft A1套餐——But I want more.
在万能的搜索引擎上得知Microsoft E5套餐的开发者版本,遂申请。(截止2022年2月已延期成功6次)

最初,列目录软件我使用了OneList(也是个不错的项目,基于Java),发现下载速度并不尽人意,二次开发也没有头绪,于是目光转向了OneIndex这个老牌的项目。

在国内高速访问,CDN 是必需的功能。事实上此功能的修改在onedrive.php内可以通过一句话实现。


应用场景

  1. 冷储存(储存稳定,容量大,上传下载速度也可以接受)
  2. 文件同步(2020年初Onedrive实现了差异同步,经vc加密的磁盘文件也可以快速同步)
  3. 图床(事实上,本站早期的图床就使用了OneIndexR)
  4. 文件分享和在线播放
  5. 仓鼠症的治疗方案

……


使用技巧

Onedrive客户端同步任意目录(或文件)——
原理:MKLINK创建目录(或文件)符号链接

CMD语法:MKLINK [[/D] | [/H] | [/J]] Link Target
说明:
/D 创建目录符号链接而不是文件符号链接(默认为文件符号链接)
/H 创建硬链接而不是符号链接
/J 创建目录连接点
Link 指定新的符号链接名称
Target 指定新链接引用的路径(绝对路径或者相对路径均可)

RaiDrive挂载Onedrive——
原理:通过Microsoft Graph API进行文件上下传操作
官网:https://www.raidrive.com/download


发展方向

优化缓存机制√、优化在线播放√、实现CDN加速上传、加快图床速度×、实现用量分析×、实现多用户盘×烂尾……