月度归档: 2019 年 12 月

  • 阿里云智能视觉AI开放平台

    阿里云推出了智能视觉AI开放平台,对于云服务商提供的这一块应用蛮感兴趣的。

    因为如果遇到了类似图片识别等需求,虽然有很多开源库,也有很多教程快速入门,但是实际上手很清楚,这种东西自己半吊子的搞识别率低,出了问题也不会改进。

    阿里云推出的智能视觉AI开放平台目前在公测环节,价格未知,目前提供三个方面的功能

    • 车型识别
    • 动植物识别
    • 商品识别

    直接进入https://visionai.console.aliyun.com/overview申请开通对应服务即可,目前只要实名即可开通

    首先看下车型识别,随便从网上下载了几张

    byte[] fileContent = FileUtils.readFileToByteArray(new File("k3-1.jpg"));
            String encodedString = Base64.getEncoder().encodeToString(fileContent);
    
    
            DefaultProfile profile = DefaultProfile
                    .getProfile("cn-beijing", "lxjVzJS3", "AqUFTsWDjqkPKC");
            IAcsClient client = new DefaultAcsClient(profile);
            RecognizeVehicleRequest request = new RecognizeVehicleRequest();
            request.setImageContent(encodedString);
    
            try {
                RecognizeVehicleResponse 
  • 手动升级wordpress

    手动升级wordpress

    最近访问wordpess官网都是429,导致无法在线升级。

    手动升级的步骤也不是很复杂,首先下载最新的中文版本,地址https://cn.wordpress.org/latest-zh_CN.zip。这个地址要么用迅雷,或者用国外的IP下载。

    现在以后解压删除wp-content目录,然后把本机wordpress中的wp-admin和wp-includes删除,最后复制下载的目录内容到服务器的wordpress目录。

    最后访问后台,可能会提示要数据库升级,点击确认即可。…

  • 从Nginx迁移到Caddy

    之前博客使用的是Nginx,证书是从let’s encrypt申请的。Nginx配置是比较多,但是从各种参考参考,还是能够配置的。唯一的问题是let’s encrypt证书需要定时更新,更新以后需要Nginx重新加载一下,操作上始终有些繁琐。

    Caddy是一个综合解决方案,结合了防火墙、代理、证书等功能,最重要的是使用方便,配置简单。

    从Nginx迁移只需要几分钟,我之前使用的docker-compose管理,所以配置如下

    Caddy相关配置

    caddy:
      image: abiosoft/caddy:1.0.3
      restart: always
      container_name: caddy
      external_links:
      - blog
      environment:
        - CADDYPATH=/etc/caddycerts
      ports:
      - 80:80
      - 443:443
      volumes:
      - /alidata/data/caddy/Caddyfile:/etc/Caddyfile
      - /alidata/data/caddy/certs:/etc/caddycerts

    而最关键Caddy配置文件只有几行,主要就是代理一下,顺便强制跳转http到https

    huangyunkun.com {
        redir https://www.huangyunkun.com{uri}
    }
    
    www.huangyunkun.com {
      redir {
        if 
  • 开源软件文档管理与发布

    文档对于软件来说是非常重要的一部分,特别是对于开源软件来说,在接触源代码之前,一般会先接触文档。

    文档可以给新的使用者一个清晰的快速上手说明,也可以给已有使用者提供更多细节上的信息,帮助使用者更好的使用各种特性。

    我认为一个合格的文档应该满足以下几个要求:

    • 易于编写,由一种标准格式驱动,比如asciidoc或者markdown也可以
    • 支持文档版本化
    • 支持文档搜索
    • 对于多语言翻译友好
    • 支持多种格式用于离线浏览(比如pdf或者epub格式)

    常用的做法有以下几种:

    • 使用专用的网站/文档构建工具
    • 选定一种文本格式,并使用相应工具链处理
    • 文档直接附加在分发物中

    使用专用的网站/文档构建工具

    这是一种相对省心的方案,一般可以直接构建完整的网站,并附带对于文档的支持。

    比如react-native使用的docusaurus,这是一个全套解决方法。对于文档本身使用markdown书写,对于多语言翻译使用的是crowdin工具,搜索支持来源于algolia。对于不同语言还有版本的支持都是基于目录的。而多版本切换入口在页面顶部的logo旁。

    以react-native为例,版本切换在https://facebook.github.io/react-native/versions中,而不同版本路径如下:

    https://facebook.github.io/react-native/docs/getting-started

    https://facebook.github.io/react-native/docs/0.60/getting-started

    类似的工具还有docsite、vuepress、docsify等,但是对比与docusaurus多多少少有一些功能缺失。

    选定一种文本格式,并使用相应工具链处理

    上面一种其实是网站+文档解决方案,如果只是需要文档,那么方案可以更纯粹一些。

    可以参考spring-boot的方案,在spring-boot的项目中有一个spring-boot-docs文档,其中有adoc为后缀的文件。这些文件都是asciidoc格式的,通过asciidoc的maven插件生成对应的html、pdf、epub格式的文档,并上传到对应目录,而文档版本引导页面是自己独立编写。

    这种操作的优势在于文档输出格式多,且网站样式自由度高,理论上只需要加上不同版本的链接即可。

    文档直接附加在分发物中

    对于功能比较直接的,可以直接将文档附加在分发物中,比如放在readme中,或者作为软件的一部分,比如命令行工具的help指令。这种一般针对于功能直接的小型软件。

    Dubbo文档的管理

    Dubbo目前的文档基于docsite建设,语法使用markdown语法,支持多语言(目录模式)。唯一的缺少的主要是两个

    • 文档版本化
    • pdf、epub等格式导出

    版本化

    文档版本化可以考虑简单思路就是仿造docsite用docusaurus一样的方式支持版本化。

    目前Dubbo文档源文件目录如下:

    而支持版本化的目录结构如下:

    VersionTagURL
    1.0.01.0.0