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文件。

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 was not successful 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 applications 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.

Attempts

I tried rebooting, force rebooting, reinstalling affected apps, upgrading iOS, logging out and logging back in to iCloud, didn’t work. A temporary solution is turning the iCloud Drive switch off and on, which has a chance to temporarily fix the problem. However, entering the iCloud settings at this time has a high probability of being stuck, so you need to try several times. The iPhone will recover from the problem after a while even if not doing anything.

iOS异常流量消耗及大范围应用闪退问题的分析

Click here for English version/点击这里前往英文版

这是我遇见的第三个Apple设备上的疑难杂症。

大概是今年的6月底,我的iPhone(运行iOS11.4)一夜之间跑掉了将近10个G流量。经检查Shadowrocket日志发现,iPhone在以约200kb/s的速度持续从 gateway.icloud.com下载不明数据。(根据其他受害者反映,如果没有安装Surge一类的软件,这些不明流量会在流量统计中显示为“文稿与同步”)我原来的iCloud使用的是日区账号,换成国区账号之后好了一段时间(一天多一点)之后,问题再次出现。由于我当时正被考试周搞得焦头烂额,将 gateway.icloud.comReject掉之后就没有再管他,也不影响日常使用。

之后查找相关资料发现,也有网友遇到类似问题(22楼):https://www.v2ex.com/t/459452。但是他提出的登出macOS设备上的iCloud的方案,我试了之后并没有成功。

但是事情并没有结束,从那之后没多久,我的iPhone和iPad都出现了时不时发生应用大面积闪退的问题,频率基本维持在一周2-3次。当问题发生时,点开大多数应用都会卡在Splash Screen大约10秒后闪退。会闪退的应用包括但不限于知乎,TIM,Notability及所有Google应用。微信和苹果自带应用基本不受影响。此时手机会发热,并且进入iCloud界面时大概率会卡死。出现问题时我的iPhone运行的iOS版本为11.4,后来升级至iOS 12 Public Beta后问题依然存在。

尝试

我尝试了重启,强行重启,重新安装出现问题的应用,升级iOS及登出并重新登录iCloud,均没有效果。临时的处理方法是关闭并打开iCloud Drive开关,有一定几率暂时修复这个问题。但是此时进入iCloud界面有大概率会卡死,所以需要多试几次才行。(事后证实这个问题与iCloud Drive无关,可能只是巧合)如果不进行任何处理,一段时间以后也会自行恢复。

分析

由于这个问题十分隐蔽,导致每个人的描述都不太一样,因而很难在网上搜索到。我整理了所有出现类似问题的贴子合集:
https://www.v2ex.com/t/460089
https://www.v2ex.com/t/471491
https://cn0xroot.com/2018/07/17/2018-07-16/
https://www.v2ex.com/t/459452
https://discussionschinese.apple.com/thread/140132632
https://www.reddit.com/r/jailbreak/comments/8sf4u3/help_this_block_of_text_is_being_spammed_in_my/
https://forums.developer.apple.com/thread/105722
https://forums.macrumors.com/threads/excessive-data-consumption-for-documents-sync-and-constantly-high-cpu-load-on-iphone-and-ipad.2127349/

这个问题出现的时间很随机,我目前还没有找到其触发条件,难以手动复现。我初步定位问题与iCloud有关。至于此前曾经出现过的iCloud持续下载数据问题,我猜测两者之间也有关联。

检查Console发现,在应用启动并闪退时,会出现 Provision violated for watchdog scene-create信息。经搜索得知,这个报错是由于应用启动时间过长而被系统强行杀死。

Oracle数据库安装与配置

这次的大数据小学期需要用到Oracle数据库。我在安装Oracle数据库的过程中费了很多周折,在此记录一下安装过程和配置上遇到的问题。

安装

Oracle数据库是重量级的企业级软件,安装相对麻烦。如果要在Linux上安装,Oracle官方仅提供了rpm安装包,并且需要图形界面。debian系发行版并不被官方支持,不建议使用。我选用的操作系统是Windows Server 2008。除此之外,使用Docker镜像或AWS云服务也是不错的方案。

我选用的Oracle Database版本是11g。11g版本分为Express Edition(XE),和Enterprise Edition(EE)。EE版拥有更多的功能(包括很实用的Enterprise Manager)。Oracle数据库虽然是商业软件,但是针对非商业使用是免费的,并且Oracle的收费策略是针对服务收费,而并非软件本身。
下载:http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html
安装过程并不复杂,按照安装向导的提示操作即可。具体安装过程请参考:http://holowczak.com/installing-oracle-11g-release-2-windows-7-32-bit/本文不再赘述。
安装过程中其中一个步骤是选择Oracle数据库使用的编码。如果语言设置为简体中文,则默认的编码是GBK。为了避免出现乱码,请尽量选择UTF8编码。

使用Flex和Bison制作编译器

这学期的编译原理课上,我们以C-Minus,一个C语言子集,作为源语言,实现词法分析、语法分析、三地址代码生成等功能的编译器(或解析器)。
代码见GitHub:https://github.com/nyanim/compiler

Flex与词法分析

进行词法分析之前首先对字符表进行定义。根据CMinus的语法定义,需要进行识别的字符集主要包括如下部分:
关键字:
if,else,while,int,void,return
运算符:
+,-,*,/
比较运算符:
<,<=,>,>=,==,!=,,
标识符:
ID
数字:
NUM

一个flex词法分析文件和bison一样分为声明,定义,规则4个部分。
其中,定义部分用来通过正则表达式定义单词,如数字可定义为 {digit}+

使用systemd

systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序,现在已成为大多数发行版的标准配置。

历史上,Linux 的启动一直采用init用于管理进程和服务。这种方法有两个缺点:一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程;二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。因此Systemd应运而生,Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),为系统的启动和管理提供一套完整的解决方案。

根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。

创建配置文件

/etc/systemd/system创建一个以 .service结尾的文件。

例如 servicename.service

一次惨痛的GRE考试

经过两个月的(精心)准备,终于在今天上午迎来了我的第一场GRE考试。

考场在北大理教的计算中心。进场之后是例行的存包,签保密协议等等。等9点过的时候统一安检,入场,拍照片。

我分到的考位是一个靠墙的角落,感觉相当不错,不会有人进进出出。北大的机房很老旧,但是设备还可以。屏幕是16:9的宽屏,在考试时字体会被拉的很宽。键盘虽然不如北工商,但也还说得过去。等所有人都检录完成之后,整个考场几乎可以同时开始考试,这样也就无所谓先进或后进考场,当然也不会在读阅读的时候旁边突然钻出来一个人开始describe the city you live in。