前尘往事

当年大学教授刚好在讲授《MATLAB》这门课,正好之前数学建模竞赛经常用到。基本的内容也就熟悉,后面刘教授一时高兴,拿了一篇在生物数学之类的著名期刊发表的全英的论文,叫我们练练手。读懂论文,再利用MATLAB添加相应的示意图。

玩着玩着,也挺有趣。一群同学在老旧的机房编译,调试代码。教授巡堂讲解,据说最后我画出的图,与题目论述的问题比较接近。哇咔咔。开心。

贼高兴,当时围脖写下感想:

传说中的 混沌现象“分岔图”,真心觉得 算法的优化很重要,不然多强悍的CPU都扛不住,话说i3 的CPU也算了15分钟,算法优化是尽量 可以打包输出再统一处理,别一步步都调用循环。

改变参数 绘制出来的图

再来

都画在一起

其实,无忧无虑,单纯读读paper。写写abstract。科研也挺好玩的 虽然现在忙成狗

Typecho博客系统中的Sakura主题默认支持图片自动上传,但imgur默认访问有问题,故此设置一下完美支持imgur

原理分析

  • 利用Cloudflare的worker搭建imgur反代
  • 修改主题下相关文件
  • 后台进行主题设置 添加反代地址

搭建反代

0. 进入 Cloudflare 的 worker 界面,创建一个新的,删掉默认代码,用以下代码部署

addEventListener("fetch", event => {
  let url = new URL(event.request.url);
  url.protocol = 'https:'
  <mark>url.hostname = "i.imgur.com";</mark>
  let request = new Request(url, event.request);
  event.respondWith(fetch(request));
})

将得到 https://foo.boo.workers.dev 的访问域名,到此将实现原本需要 https://i.imgur.com/Ch0lmFc.jpg 访问的变为只需要 https://foo.boo.workers.dev/Ch0lmFc.jpg 即可。

1. 某些网络环境,workers.dev 域名支持不好,故此要绑定自定义个性化域名
在 worker 界面中的 Custom Domains,添加自定义域。你的 CF 账号下的任何一个域名都可以设置个二级子域名或三级,到此实现了 利用 https://yourdomain.name/Ch0lmFc.jpg

修改主题相关文件

文件路径 wp-contents/themes/sakura/inc/classes/Images.php 也可以在 wp 后台直接定位找到
对于 imgur 上传代码段进行小改动即可,上传逻辑和方法不变,只需要在最后生成的链接替换成我们搭建的反代域名链接
在这个上传接口代码块里面,找到上传成功后处理的代码,进行修改。

/**
 * Imgur upload interface
 */
public function Imgur_API($image) {
    $upload_url = akina_option('imgur_upload_image_proxy');
    $args = array(
        'headers' => array(
            'Authorization' => 'Client-ID ' . $this->imgur_client_id,
        ),
        'body' => array(
            'image' => base64_encode($image),
        ),
    );

    $response = wp_remote_post($upload_url, $args);
    $reply = json_decode($response["body"]);

    if ($reply->success && $reply->status == 200) {
        $status = 200;
        $success = true;
        $message = "success";
        $link = $reply->data->link;
        $newlink = parse_url($link,PHP_URL_PATH);
        $proxy = akina_option('cmt_image_proxy') . $newlink;
    } else {
        $status = $reply->status;
        $success = false;
        $message = $reply->data->error;
        $link = 'https://view.moezx.cc/images/2019/10/28/default_d_h_large.gif';
        $proxy = akina_option('cmt_image_proxy') . $link;
    }
    $output = array(
        'status' => $status,
        'success' => $success,
        'message' => $message,
        'link' => $link,
        'proxy' => $proxy,
    );
    return $output;
}

利用 php 内置函数 parse_url 进行处理
简单复习一下,官方函数说明
**parse_url**(string $url, int $component = -1): int|string|array|null|false

本函数解析 URL 并返回关联数组,包含在 URL 中出现的各种组成部分。数组的元素值不会 URL 解码。本函数不是用来验证给定 URL 的有效性的,只是将其分解为下面列出的部分。也会接受不完整或无效的 URL,parse_url() 会尝试尽量正确解析。

如以下代码

<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';
var_dump(parse_url($url));
var_dump(parse_url($url, PHP_URL_SCHEME));
var_dump(parse_url($url, PHP_URL_USER));
var_dump(parse_url($url, PHP_URL_PASS));
var_dump(parse_url($url, PHP_URL_HOST));
var_dump(parse_url($url, PHP_URL_PORT));
var_dump(parse_url($url, PHP_URL_PATH));
var_dump(parse_url($url, PHP_URL_QUERY));
var_dump(parse_url($url, PHP_URL_FRAGMENT));
?>

将输出

array(8) {
["scheme"]=>
string(4) "http"
  ["host"]=>
  string(8) "hostname"
  ["port"]=>
  int(9090)
  ["user"]=>
  string(8) "username"
  ["pass"]=>
  string(8) "password"
  ["path"]=>
  string(5) "/path"
  ["query"]=>
  string(9) "arg=value"
  ["fragment"]=>
  string(6) "anchor"
}
string(4) "http"
string(8) "username"
string(8) "password"
string(8) "hostname"
int(9090)
string(5) "/path"
string(9) "arg=value"
string(6) "anchor"

复习完拉。
这里只需要把上传成功的 url 中的 /path 提取出来,再与自定义反代域名拼接即可
处理过程:
$newlink = parse_url($link,PHP_URL_PATH);
$proxy = akina_option('cmt_image_proxy') . $newlink;
最后结果:

if ($reply->success && $reply->status == 200) {
    $status = 200;
    $success = true;
    $message = "success";
    $link = $reply->data->link;
    $newlink = parse_url($link,PHP_URL_PATH);
    $proxy = akina_option('cmt_image_proxy') . $newlink;

如图:

填入主题设置中的反代地址

把自定义反代域名完整 url 填入,刷新即可

参考链接:

blog