Golang / DevOps 工程师

Harbor GC 流程分析

Harbor GC 流程分析

最近我们构建环境的 Harbor GC 经常出故障,借排查问题的机会,梳理了 Harbor GC 的流程,这个文档是基于官方的 2.2.3 源码分析的,GC 大概分为这两部分: * API 创建任务,并通知 job service,这部分是在 core 组件中完成的。 * job service 处理任务,并给 core 组件同步任务状态,这部分是在 job service 组件中完成的。 两个组件通过 HTTP 请求的方式交互。 Core 处理 API 请求 至此,创建任务的部分已结束。 Job Service 处理任务 Job Service 处理任务的逻辑又可以再细分为几个步骤: * 初始化
6 min read
iTerm2 调教记录

iTerm2 调教记录

自动登录 公司内的开发环境是需要通过堡垒机来登录的,之前每次登录都要手动输入两次 ssh 命令,非常麻烦,经过研究可以用如下方式实现自动登录 * 创建一个 Profile,在图中的位置填入登录堡垒机的 ssh命令。 * 给这个 Profile 增加一个 Trigger,当前一条登录命令执行成功后,这里可以通过识别堡垒机输出的字符,自动执行下一步 ssh 命令。 * 经过上面两步 ssh 命令的自动输入,最终实现自动登录到开发环境。 快捷键选择不同的 Profile 经过上一步的操作之后,创建了多个 Profile,想要通过快捷键在不同的 Profile 之间切换,仍然需要鼠标操作,这里借助了 macOS 上的 AppleScipt 来实现快捷键切换 Profile 的功能,所做配置如下: * 把 iTerm2 设置为开机启动,修改 iTerm 配置 Preferences->General->Startup,
2 min read
NGINX 微服务 Unit + PHP 初探
Nginx

NGINX 微服务 Unit + PHP 初探

简介 NGINX Unit 是一个动态的网络应用服务器,它的设计初衷是为了运行多种编程语言。如有需要,通过 API 可以动态配置已有应用的参数。 核心功能 * 可使用 RESTful JSON API 动态配置服务器 * 可同时运行多语言及多版本的应用 * 动态语言的进程管理功能(开发中) * TLS 支持(开发中) * TCP, HTTP, HTTPS, HTTP/2 路由和代理(开发中) 支持的语言 * Python * PHP * Go * JavaScript / Node.js(开发中) * Java(开发中) * Ruby(开发中) 使用包管理器安装 目前只支持 CentOS 7.0 和 Ubuntu 16.04。 CentOS
5 min read
Docker 镜像源的修改方式
Docker

Docker 镜像源的修改方式

中国大陆的用户由于某种不可描述的原因,导致从 Docker Hub pull 镜像时,速度慢得难以忍受,我曾经试过 pull 一个 Blender 镜像,一上午都没成功,所以比较靠谱的方法还是修改镜像源的地址,有以下几种方式 (以 USTC 为例): * 直接设置 --registry-mirror 参数,仅对当前的命令有效docker run hello-world --registry-mirror=https://docker.mirrors.ustc.edu.cn * 修改 /etc/default/docker,加入 DOCKER_OPTS="镜像地址",可以有多个DOCKER_OPTS="--registry-mirror=https://docker.mirrors.ustc.edu.cn" * 支持 systemctl
1 min read
Redis 的 Getshell 问题分析
Redis

Redis 的 Getshell 问题分析

排查错误 最近测试环境一直没问题的 API 突然报错了,错误信息如下: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error. 从该信息可以看出是 Redis 服务端持久化保存快照时出错,因此 API 项目作为客户端就收到了这个消息,搜索后得到如下解决方法: $ redis-cli redis 127.
3 min read
Gitlab Webhook 的一次问题排查
Gitlab

Gitlab Webhook 的一次问题排查

公司的项目中使用了 Gitlab 来管理代码,在使用 Webhook 自动部署时,我发现前端项目经常会在一个莫名其妙的时间触发 build,通过 commit 记录却发现在这个时间并没有任何人提交代码,而由同一个 Webhook 管理的其他后端项目却没有这个问题。 首先对照了 Gitlab 的官方文档 [http://docs.gitlab.com/ce/web_hooks/web_hooks.html] ,其中描述了 event 的几种类型及数据格式,在我们的测试环境下,需要保证 Feature 提交和 Bug 修复的及时性,因此我只使用了 Push events 来触发 build,但需要注意的是新建分支和 Merge request 仍然会触发 Push event,通过两个参数可以排除不需要 build 的
3 min read
关于 Laravel 验证规则中的 exists 和 unique

关于 Laravel 验证规则中的 exists 和 unique

Laravel 提供了强大的表单验证规则,我在项目中 exists 和 unique 用得比较频繁,参照官方文档写下此文,以便记录下这两个规则的详细用法,以下基于 Laravel 5.4 提供了使用字符串和 Illuminate\Validation\Rule 两种方式生成规则的方法。 exists:table,column 验证字段的值是否存在于数据库指定表的指定列中,如果不存在将会抛出异常,这里是关于 exists 规则的 详细说明。 基本用法 验证 users 表中是否存在 email 等于指定的 email 值的记录 * 'email' => 'exists:users' * Rule::exists('users') 自定义列名 验证 users 表的 email_address * 'email' => 'exists:users,
2 min read
MSYS 2 折腾手记

MSYS 2 折腾手记

由于工作中在 Windows 下使用 Git,我接触到了 MinGW,但 MinGW 有一些不便之处,在尝试解决这些问题时,我找到了另一个更方便的环境 MSYS2,关于两者之间的对比,可以看一下 这篇文章 [http://zengrong.net/post/1557.htm]。 安装过程在 官网 [https://msys2.github.io/] 有详细说明,这里记录的是我自己的 MSYS2 配置。 窗口最大化及进入指定目录 -------------------------------------------------------------------------------- MSYS2 默认的终端为 Mintty,启动的命令位于安装目录下的 start_shell.cmd 中(如果找不到这个文件,需要参考官网安装说明更新一下): :startmintty start "%CONTITLE%" "%WD%mintty" -i /msys2.
3 min read
关于 git submodule

关于 git submodule

最近在汉化 Ghost [https://github.com/tryGhost/ghost] 项目,其中的主题 Casper [https://github.com/TryGhost/Casper] 是一个单独的项目,这时就要用到 git submodule 了,这里以 Ghost 为例,记录我在使用 git submodule 时遇到的问题。 修改 submodule 指向 -------------------------------------------------------------------------------- 我在 fork 完 Ghost 之后,发现其中的 Casper 项目指向的是原始的 repo,而我需要的是指向我自己的 Casper,这里需要修改主项目下的 gitmodules 文件,打开后发现其中内容如下: [submodule "content/themes/casper"
2 min read
启用 Let's Encrypt 证书

启用 Let's Encrypt 证书

Let's Encrypt [https://letsencrypt.org/] 由 ISRG(Internet Security Research Group,互联网安全研究小组)提供了免费、自动化、开放的证书签发服务,虽然证书只有 90 天有效期,但可以通过定时脚本更新,这里参照 imququ [https://imququ.com/post/letsencrypt-certificate.html] 的文章记录了在 CentOS 7 X64 上使用 acme-tiny [https://github.com/diafygi/acme-tiny] 申请、配置以及定时更新证书的方法。 安装 openssl -------------------------------------------------------------------------------- yum install openssl-devel 创建帐号私钥 -----------------------------------------------------------------------
4 min read
NGINX 配置陷阱和常见错误

NGINX 配置陷阱和常见错误

关于本指南 这是一篇来自 NGINX 官方 WIKI 的指南,由 Github 的 renyidong 翻译。 无论新老用户,都有可能掉进陷阱。 下面我们列出了常见的问题,并解释如何解决他们。 在 Freenode IRC 的 #nginx 频道,我们经常看到这些问题。 最常见的问题是有人从其他指南拷贝配置片段。 不能说所有的指南都是错的,但绝大部分是有问题的。 即使是 Linode library,也有部分极其劣质的信息,NGINX 社区成员正在努力去尝试更正。 本站文档由了解各种 NGINX 用户的社区成员创建并审核。 本文的纂写仅仅是鉴于社区成员所遇到的、大量的、常见的、反复出现的问题。 未列出我的问题 在这里,也许你找不到任何和你的问题直接相关的内容。 这是因为,我们并不是因为你遇到的具体问题而让你来这里。 不要仅仅瞥了一眼就断言我们无缘无故带你到此。 我们让你来这里,是因为你犯了某个这里提到的错误。 对于大量的用户遇到的大量的问题,社区成员不想去支持错误的配置。 请先改正你的配置,再请求帮助。
11 min read
重装 Shadowsocks 记录

重装 Shadowsocks 记录

我之前使用的是 Linode 的主机,但最近由于某些原因访问缓慢加丢包,因此换了新的主机,仍然使用的是 CentOS 7 x64,Shadowsocks 是必装的,我这里选择的是 Shadowsocks-libev [https://github.com/shadowsocks/shadowsocks-libev](版本号 2.3.3),和 Python 版本略有不同,在安装和配置过程中参考了其他作者的文章,在此表示感谢。 记录如下: 1.下载源码并编译安装 $ wget https://github.com/shadowsocks/shadowsocks-libev/archive/v2.3.3.zip $ unzip v2.3.3.zip $ cd shadowsocks-libev-2.3.3
2 min read
CentOS 7 安装 Ghost 记录

CentOS 7 安装 Ghost 记录

由于众所周知的原因,我在 Linode 买了主机,用 Shadowsocks 搭了梯子,而之前阿里云的服务器差不多到期,正好全面迁移到 Linode,把整个迁移过程记录如下,免得下次搬家迷路。 安装 MySQL 由于 CentOS 7 的 yum 源中没有 mysql-sever,需要手动添加 # cd /usr/local # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm # rpm -ivh mysql-community-release-el7-5.noarch.rpm 添加完成后,查看一下 # ls -1 /etc/yum.repos.d/mysql-community* 会得到如下两个源: /etc/
3 min read
State 切换时组件的创建销毁策略
Flex

State 切换时组件的创建销毁策略

好久没有写Flex了,今天突然用到了State,隐约记得有两个属性可以控制State切换时组件的创建销毁策略,现记录如下,以防再次失忆。 itemCreationPolicy 属性指定组件的创建策略,该属性值有2个字符串值: * deferred(默认值)首次切换到某状态时,属于该状态的组件会被创建实例。 * immediate 组件在应用启动时创建,但如果组件不属于当前状态,其 creationComplete 事件不会发生,只有首次切换到该组件所属的状态,调用到渲染绘制时,才会发生该事件。 itemDestructionPolicy 组件的销毁策略,该属性值有2个字符串值: * never(默认值)组件一旦创建就不会被自动销毁 * auto 当离开该组件所属的状态时,组件将被自动销毁。
1 min read
使用条件编译控制 swf 的嵌入资源
Flash Builder

使用条件编译控制 swf 的嵌入资源

这是我在一个 Flex 交流群中碰到的问题,某个项目需要针对不同的发行版本使用不同的资源文件,如果把两个版本的资源文件都嵌入,会增大swf的体积,但又不能分为两个项目,应该没人想维护两份相同的代码吧,比较靠谱的方法是使用条件编译参数,具体做法如下: * 在编译参数中添加如下配置: -define=CONFIG::dev,false * 在项目中这样使用: CONFIG::dev { [Embed(source="1.png")] private var background:Class; } CONFIG::dev { [Embed(source="2.png")] private var background:Class; } 要嵌入不同的资源只需在编译参数中修改 dev 的值就可以了。 > 注意事项:该方法只适用于 mxmlc 编译器,而使用 Flash Builder 4.7 创建的 ActionScript
1 min read
DataGrid 导出 CSV
Flex

DataGrid 导出 CSV

DataGrid 使用第三方库 CSVLib 导出CSV,遇到如下两个问题: * ActionScript 默认的文本编码为 UTF-8,而 CSV 不支持这种编码,导致中文表头在 Excel 中显示为乱码,而用记事本打开正常。解决方法:CSV 导出时用 ByteArray 转码,代码如下: var byte:ByteArray = new ByteArray(); byte.writeMultiByte(result,"gb2312"); * 之前的导出实现是基于 DataGrid 的数据源的,与 DataGrid 所展示的内容并不是完全相同,尤其是当 DataGrid 中的某一列指定了 labelFunction 时,必须在保存之前执行 labelFunction 把该列的数据转为可视的表格 ,这种情况下,很难写出一个通用的功能。直到最近想起 DataGrid 的 GridColumn
1 min read
彻底删除 Flash Builder 的默认工作空间
Flash Builder

彻底删除 Flash Builder 的默认工作空间

使用 Flash Builder 时,第一次启动都在用户目录下生成默认工作空间,例如: C:\Users\Airycanon\Adobe Flash Builder 4.5,4.5 之前的版本,只需切换到自定义的工作空间,删除默认即可,而 4.5 及之后的版本会自动重建该目录,并且工作空间的历史记录及配置文件也存放到该目录中,对于我这种有洁癖的人来说,必须要找到解决办法。 此处以 4.5 为例,4.5 之后的其他版本改为相应的版本号即可,找到 \Adobe Flash Builder 4.5\configuration\config.ini(\Adobe Flash Builder 4.5\eclipse\configuration\config.
1 min read
Air 应用重新启动的方法

Air 应用重新启动的方法

代码如下: var mgr:ProductManager = new ProductManager("airappinstaller"); mgr.launch("-launch " + NativeApplication.nativeApplication.applicationID + " " + NativeApplication.nativeApplication.publisherID); NativeApplication.nativeApplication.exit(); 注意事项: ProductManager 代码提示是打不出来的,应该是在源码里用 [ExcludeClass] 元标签做了屏蔽,手动导入包即可: import adobe.utils.ProductManager; 在配置文件 xxx-app.xml 里把这行设置为 true。 true 只有导出发行版之后的本机安装程序才有效,也就是在 windows 上发行版的安装包扩展名是 exe。
1 min read
TextFlow 文本中插入图片或其他组件
Flex

TextFlow 文本中插入图片或其他组件

TextFlow 是 Flex 富文本框架 TextLayout Framework的核心类,使用它可以实现富文本及图文混排,甚至可以插入自定义的Flex组件,具体用法如下: * 插入图片 textFlow.interactionManager = new EditManager(); //bitmap为具体的图片,插入后生成一个InlineGraphicElement。 EditManager(textFlow.interactionManager).insertInlineGraphic(bitmap,bitmap.width,bitmap.height); textFlow.flowComposer.updateAllContainers(); * 插入自定义组件 var container:SpriteVisualElement = new SpriteVisualElement(); //component为组件的一个实例,最好是放在Group中。 container.addChild(component); var graphic:In
1 min read
Android 平台中 Air 应用的调用

Android 平台中 Air 应用的调用

我们的 Air Mobile 项目要作为一个单独的模块被其他应用调用,查阅了一下 Adobe 官方帮助文档,其中提到可以使用自定义 URI 方案从网页或本机 Android 应用程序启动 AIR 应用程序。自定义 URI 支持依赖于 Android 清单中指定的方法滤镜,因此在其他平台上不能使用此技术。若要使用自定义 URI,请将方法滤镜添加到应用程序描述符的区块内。必须指定以下示例中的两个 intent-filter 元素,其中 customURI 可以指定为自定义字符串。 2 min read
基于 Text Layout Framework 的文本组件的滚动条问题
Flex

基于 Text Layout Framework 的文本组件的滚动条问题

RichEditable、TextArea 等基于 Text Layout Framework 的文本组件在使用 TextFlow 导入富文本时有如下问题:当有时由于有图片或大字体导入,导致文本流合成需要一定时间,此时如果设置滚动条位置到最下方,当文本流合成完毕,由于又增加了内容,导致滚动条的位置又上移了。 之前的做法是加一个延时,但此方法有矛盾之处:既不能把延时设得太大,因为这样导入文本时的体验不好,又不能设得太小,因为无法保证在延时的时间段内图片或字体加载完成。 偶然发现了一个纯 AS 写的滚动条,其中用了用缓动类 TweenLite 来实现滚动条的滑动效果,顿时想到可以尝试一下用来解决上文提到的滚动条问题,经过试验,效果显著,于是上面问题归结为一句代码,以 TextArea 为例: TweenLite.to(textArea.scroller.verticalScrollBar,1,{value:int.MAX_VALUE});
1 min read
TextLayout Framework 匹配超链接

TextLayout Framework 匹配超链接

TextLayout Framework 中的文字通常是放在 SpanElement 中,因此写了一个查找 SpanElement 中的链接并替换为 LinkElement 的函数,由于不擅长正则表达式,借鉴了他人的代码,难免功能有所欠缺,有待完善。 private function checkLink(element:ParagraphElement):ParagraphElement { for(var i:int = 0;i < element.numChildren;i++) { var child:FlowElement = element.getChildAt(i); if(child is SpanElement) { var regExp:RegExp = /(http(s)?:\/\/(?:(?:\d+\.\d+\.\d+\.\d+)|(?:(?:[\w-]+\.)+(?:[a-z,
1 min read