从Gogs迁移项目至GitLab

我以前使用的代码托管系统是Gogs,近期我切换到了更知名的代码托管系统GitLab。因此,我需要将原来托管在Gogs实例上的项目迁移到GitLab实例。

GitLab中提供了一些迁移工具,其支持的平台如下图:

其中,Gitea是Gogs的一个分支版本,我试着通过Gitea选项从Gogs导入项目,虽然GitLab能够正常列出Gogs上的项目列表,但是在导入时则会引发500错误。

经阅读文档得知,Gogs和GitLab均提供了操作代码仓库的API。因此,我可以编写一个Python脚本来迁移项目。

从Docker容器中访问宿主机网络

在使用Docker部署应用时,Docker推荐的方式是将应用及其所依赖的服务(MySQL,Redis等)均使用Docker部署,并通过link或自定义网络相连接。但是,当应用所依赖的服务被安装在宿主机上时,我们需要让容器中的应用能够访问到部署在宿主机上的服务。本文将介绍实现这一目的的几种方案,并分析其优缺点。

首先我们需要了解一些关于Docker网络的基础知识。

Docker网络

Docker提供了5种网络类型,这里介绍其中常见的两种:bridge及host

Bridge

Bridge是Docker默认使用的网络类型。如图,网络中的所有容器可以通过IP互相访问。Bridge网络通过网络接口docker0 与主机桥接,可以在主机上通过ifconfig docker0查看到该网络接口的信息。

Host

Host模式下,容器的网络接口不与宿主机网络隔离。在容器中监听相应端口的应用能够直接被从宿主机访问。host网络仅支持Linux。

Matomo通过SMTP发送邮件时报错’mail from address must be same as authorization user’的分析与解决方案

我之前一直使用Google Analytics来统计网站访问量。近期,我切换到了Matomo(原名Piwik),一个开源的网站统计系统。

Matomo提供了一个“电子邮件报表”功能,可以定期生成一份统计报表,定时或手动发送到管理员的邮箱中。

问题

我将Matomo设置为通过SMTP发送邮件。Matomo提供的SMTP设置项目如下:

Laravel实现微信小程序支付

准备工作

微信小程序支付流程

首先我们需要大致了解微信小程序的支付的流程,主要分为如下几个步骤。这里以一次下单购买商品的场景为例。

  1. 用户在小程序中选购商品,点击提交订单。
  2. 小程序请求业务服务器,传入订单相关信息。
  3. 业务服务器将订单信息写入数据库,然后请求微信支付统一下单API,传入将订单相关数据和小程序相关id及签名。
  4. 微信支付统一下单API返回下单结果,支付订单号,签名等。业务服务器将这些信息返回给小程序。
  5. 小程序拉起微信支付,用户输入密码支付。
  6. 小程序获得支付结果,请求业务服务器更新订单数据。
  7. (可选)微信支付服务器访问业务服务器的回调URL,更新支付结果。

阅读文档

在开始开发前,请首先认真阅读微信支付官方文档EasyWechat文档的微信支付部分。

Laravel Eloquent ORM 关系查询

在信息系统中有很多一对多的关系,常见的一个例子是一个订单(order)中包含多种商品(product)。我们通常会使用一个order表来存储订单,同时使用一个product表来存储商品,并在product表中加入order_id外键来将产品关联到订单中。

在以前开发项目时,我一直使用先查询order,再通过order_id查询product,并遍历查询到的order对象,将product插入order中的做法。但是这样做非常不优雅,并且会严重影响性能。同时,由于数据库中没有外键约束,一旦业务代码中出现bug,则会影响数据的一致性。

在这次的项目开发中,我使用Laravel的Eloquent ORM来实现外键的关系查询。

一些概念

我们首先来复习一些数据库系统导论中的一些概念

主键(Primary Key)

主关键字(Primary Key)是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。主键通常名为id,并且为自增。

外键(Foreign Key)

外键(Foreign Key)的作用是建立两个表之间的关联。下面这张图可以直观地展示外键的作用。

外键

连接(Join)

连接(Join)将两张表中能关联起来的数据连接后返回。关于连接的更多内容请参考这篇文章:图解 SQL 里的各种 JOIN — 码志

Laravel的Eloquent ORM中并没有实现Join,如果需要在Laravel中使用Join则需要在Query Builder中完成。请注意不要将本文所述内容和join混淆,Eloquent中的with方法的实现是通过模型中定义的关系另外进行一次查询,并没有使用join。

Drone持续集成

Drone是一个用Go语言开发的基于容器运行的持续集成软件。

请注意,目前Drone1.0.0rc已经发布,但是本文所有内容均基于Drone0.8.0。

安装

Drone可以通过Docker安装,请参考https://0-8-0.docs.drone.io/installation/

运行时需要通过环境变量设置与Drone集成的版本控制系统。drone支持的版本控制系统包括GitHub,Gogs,GitLab等。我使用的是Gogs。

你可以修改后使用下面的compose文件。

version: '2'
services:
  drone-server-gogs:
    image: drone/drone:0.8
    ports:
      - 8020:8000
      - 9000
    volumes:
      - ./drone-gogs-data/:/var/lib/drone/
    restart: always
    environment:
      - DRONE_OPEN=false
      - DRONE_HOST=https://drone-ci.example.com
      - DRONE_ADMIN=admin
      - DRONE_GOGS=true
      - DRONE_GOGS_URL=https://git.example.com/
      - DRONE_SECRET=secret
drone-agent-gogs:
    image: drone/agent:0.8
    command: agent
    restart: always
    links:
      - drone-server-gogs
    depends_on:
      - drone-server-gogs
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - DRONE_SERVER=drone-server-gogs:9000
      - DRONE_SECRET=secret

macOS设备上Continuity/Handoff失效及iMessage激活失败的解决方案

前段时间我由于误操作搞坏了我的MacBook上的macOS系统,我重装系统后发现所有Continuity功能都无法使用了。

首先澄清一个概念,Continuity(连续互通)和Handoff(接力)经常被人们混淆。实际上Continuity是多个功能的组合,其中包括Handoff,智能热点,全局剪贴板,AppleWatch解锁等。具体请查看Apple官方支持网页。

使用“连续互通”连接 Mac、iPhone、iPad、iPod touch 和 Apple Watch – Apple 支持

问题

这个问题最明显的表现在于所有Continuity功能均无法使用。除此之外,iMessage和FaceTime均无法激活,登录时会提示“激活时出错,请再试一次。”

在同一Mac上更换其他AppleID也是一样的结果,然而该AppleID在iPhone和iPad上的上述功能均正常。

未来有你2018初音未来中国演唱会小记

继2016年的Miku Expo之后,今年Miku终于又来到了北京。即使经过朋友提醒这次的场地是平地,最低档票可能只能听个响,我还是购买了13号的夜场。虽然购票过程中出现了一些小插曲,最后得到的座位还算不错。

今年北京场的位置在五棵松篮球馆的M空间,企划展在M空间南侧的Hi-Park。我本以为到早了,实际上1点半左右就有不少人在企划展排队了。

WordPress被插入wp_cfg_popuplink恶意代码的分析与解决方案

今天@Lyphix告诉我在打开我的博客首页时,有一定几率会跳转到http://tiny.cc/roiplg这个网页。

排查

经过几次试验之后,我也遇到几次跳转到上述网页的情况,但是并不能稳定复现。查看首页的源代码,我发现了如下的代码:


这段代码在网页中插入了一段JavaScript,控制网页跳转。

分析

我首先考虑到劫持的可能性。但是我的博客开启了全站https,并且在挂上全局代理之后情况依旧。因此劫持的可能性被排除。

其次的可能性是某个插件存在漏洞而被在数据库插入了恶意代码。比如我使用了的Insert Header and Footer插件。我将WordPress数据库转储为SQL文件,但是并没有在其中搜索到相关关键字。

那么这段恶意代码只可能来自于php代码中。我全局搜索了博客根目录,发现相关的代码位于wp-contents/plugins/index/

Analysis of Excessive Data Consumption and App Crashing on iOS Devices

点击这里前往中文版/Click here for Chinese version

This is the third knotty issue happened on my Apple devices.

By the end of June this year, my iPhone running iOS11.4 ran nearly 10G of mobile data during a single day. The log of Shadowrocket(An Network Extension app) revealed that my iPhone kept downloading unknown data from gateway.icloud.com at the rate of about 200kb/s. I tried switching the iCloud account, but the problem appeared again after a short period of time. I was busy dealing with the exams at that time, so I simply Rejected gateway.icloud.com in Shadowrocket. No negative influence on daily use.

After some searching, I found some people claimed they have encountered a similar problems (22nd floor): https://www.v2ex.com/t/459452 . However, his solution of logging out of iCloud on macOS devices did not work for me.

But the trouble didn’t end. Since then, a large number of apps crashes while launching on my iPhone and iPad at a frequency of 2-3 times a week. When the problem occurs, most applications will hang at the Splash Screen and crash after about 10 seconds. Applications that crashed including TIM, Notability and all of the Google apps. WeChat and Apple’s own apps are unaffected. During this time, the phone went hot, and will stuck when entering the iCloud settings. My iPhone runs iOS 11.4 and 12 Public Beta, and iPad running 11.4 and 12 Developer Beta.

Symptoms

By summarizing my observation and information collected from Internet, I sum up the symptoms of this problem as follows:

Running iOS 11.4 or lower

  • There are extremely high data consumption in “Documents and Sync” section
  • Device continuously downloads unknown data from gateway.icloud.com

Running iOS 12 or higher

  • Most 3rd party apps will crash after hanging at splash screen for about 10 seconds.
  • Device went hot with higher power consumption
  • Device stuck when accessing iCloud related functions and password auto fill.

Attempts

I tried rebooting, force rebooting, reinstalling affected apps, upgrading iOS(to iOS 12 beta), logging out and logging back in to iCloud, didn’t work. The iPhone will recover from the problem after a while without taking any actions.