用POKER改造的年轻人的第一把GH60

有一个Poker升级版的键盘,因为不支持自定义键位被我强行刷机刷成砖了。拆开看过是nuc123sd4ae0的MCU。

MCU

去网上查了各种资料,试过了各种方法,根据nuvoton官方的文档,ISP模式拉低管脚电位可以进入,试过以后也进不去,强行用Jlink调试SWD也不行。ikbc这块做的太差了,可能这种量产的键盘就是故意让你无法刷固件吧。

调试

既然都这样了,只好换主板。因为想使用60%键盘,又有很强的自定义配列需求,只好做一把GH60来用,关于GH60请自行查阅资料。

在淘宝上买了一块修改版的XD64板子,因为是熟人推荐,看起来也还不错。只需148块钱,支持60-64键的多种轴位排布和几乎兼容90%的外壳,比satan版本的GH60良心多了。

轴还是采用之前的POKER的茶轴,那么第一步就是拆轴了。把轴从之前的POKER主板上拆下来。这可是个艰巨的工作。一个一个引脚用电烙铁加热以后用吸锡器吸走焊锡。然后拔下来。整整搞了4个小时。

拆完以后的样子

等了两天,新主板终于到了。先打开看一下。为了赶潮流买了type-c的接口版本。

正面
背面

新主板到手当然是先上电用镊子挨个测试轴位的触发是否正常。

测试

接下来就是准备焊接轴上去了,来一张全部原材料的图。

原材料

茶轴特写。cherry原厂的轴质量杠杠的。

轴

轴一个一个插到定位板上。

定位板

又经过一个小时的焊接,焊接完成以后的正面和背面。

正面
背面

好久不焊东西,手生,焊点也没有那么完美了。不过没有虚焊,焊接质量还是可以保证的。

然后装上外壳
外壳

装上键帽(有钱了一定买套好看的键帽)

键帽

一套用POKER的原料和GH60的主板混合的手工制作的60%键盘就重生了。按键感觉完美。

最后上一张工作台的照片

桌面

接下来就是刷配列了,其实很简单有空再写。

迁移Jira的数据库到Mysql

前言

买了Jira Software Server自用也有一段时间了,之前安装的时候为了图省事,采用了内置的H2数据库,用了这么久,一直提醒我作为生产环境需要换成Mysql数据库,终于闲下来可以换一下。

开工

按照官方的步骤

1、首先备份数据。这个很简单,在后台就可以备份。

2、然后安装Mysql的JDBC驱动

To copy the MySQL JDBC driver to your application server:

Get the MySQL driver:
If you are installing Jira, download the recommended MySQL driver JDBC Connector/J 5.1 from https://dev.mysql.com/downloads/connector/j/ 
You can download either the .tar.gz or the .zip file by selecting the 'Platform Independent' option. Extract the jar for the driver (e.g. mysql-connector-java-5.x.x-bin.jar) from the archive.

Restart Jira / Jira service.

这里遇到了一个问题,Mysql官方下载地址 https://dev.mysql.com/downloads/connector/j/ 进去以后下载到的是Connector/J 8.0.11,而这个版本是不能在JIRA使用的,会报错。
这里一定要点Looking for previous GA versions下载老版本,我用的是5.1.46终于可以正常使用。
安装完毕后重启JIRA

3、使用官方配置工具迁移

Using the Jira configuration tool — Use this method, if you have an existing Jira instance. Your settings will be saved to the dbconfig.xml file in your Jira home directory.

这个工具默认是在/opt/atlassian/jira/里的,但是当我打开运行的时候产生了报错,说我JAVA版本不对,可是我明明JIRA都可以运行,怎么到了你这里连个工具都运行不了了呢。
查了一下资料原来是openJDK是不认的,必须是官方OracleJDK才行,因为这两个JDK的version输出不一样,要么改tools代码,要么换个JDK。我选择换JDK,毕竟OpenJDK后面还不知道有啥坑,还是用Oracle官方的吧。

使用工具一步步配置好数据库连接以后,启动Jira,遇到了无限500报错。看logs文件夹里的日志,应该是数据库连接成功,但是库名不对。检查了几遍明明是对的,看了一下连接,好像连的是一个不存在的名为PUBLIC的库。又用配置工具配置了几次,依旧不行。
查资料得知配置文件修改的是dbconfig.xml文件。这个文件在/var/atlassian/application-data/jira目录下。赶紧去看了一下。里面有一个莫名其妙的 <schema-name>PUBLIC</schema-name>字段,查遍了官方说明,都没看到有写这个字段。试着把这个字段改成正确的数据库名称,重启Jira,居然可以正常使用了。

4、然后就是进入初始化安装流程,这里选择导入已有数据,然后输入备份数据位置,等待即可。

总结

整个迁移过程说简单也简单,说坑也挺坑的,主要有这么几个点:

1、对Java的SDK对版本和类型(OpenJDK、OracleJDK)有奇怪要求。
2、对Mysql connector版本有奇怪要求,8不行5.1.46可以
3、官方配置工具配置完以后数据库居然不对,需要手动去配置文件里面修改。而这个dbconfig.xml配置文件又找了好久。
4、全都搞完以后日志里有一堆关于mysql连接不是ssl的Warning,害得我又去dbconfig.xml里把连接串url里加了个useSSL=false才正常。

终于可以正常用Jira Software了。这里强烈推荐一下这个管理工具,不管是做团队的项目管理,还是个人的事务管理,都肥肠好用哦。

年轻人的第一个AWS Lambda函数

  • 前言

之前用Go写的VSCO接口失效了,下午又用Python重新写了一个。因为VSCO的锁区,导致在香港的服务器无法获取到需要的json,而美国服务器延迟又略大,又不想专门为这个API开一台服务器用,这时候突然想到了AWS的Lambda函数。

AWS Lambda介绍我就直接复制 https://aws.amazon.com/cn/documentation/lambda/

使用 AWS Lambda,您无需预置或管理服务器即可运行代码。您只需为使用的计算时间付费,在代码未运行期间不产生任何费用。您可以为几乎任何类型的应用程序或后端服务运行代码,而无需任何管理。只需上传您的代码,Lambda会处理运行和扩展高可用性代码所需的一切工作。您可以将您的代码设置为自动从其他 AWS 服务触发,或者直接从任何 Web 或移动应用程序调用。

而从公网调用这个函数,又需要Amazon API Gateway https://aws.amazon.com/cn/documentation/apigateway/

Amazon API Gateway 是一种完全托管型服务,使开发人员可以轻松发布、维护、监控和保护任何规模的 API。创建 API 以从后端服务(比如 Amazon Elastic Compute Cloud (Amazon EC2) 上运行的应用程序、AWS Lambda 上运行的代码或者任何 Web 应用程序)访问数据、业务逻辑或功能。可将 API Gateway 视为云中的一个背板,用于连接 AWS 服务和其他公有或私有网站。它可以提供一致的 RESTful 应用程序编程接口 (API),让移动和 Web 应用程序可以访问 AWS 服务。

这样看下来,我把Lambda函数写好,使用API Gateway来控制访问,整体下来就是一个无服务器应用程序的demo了。

API Gateway 与 AWS Lambda 共同构成 AWS 无服务器基础设施中面向应用程序的部分。对于调用公开 AWS 服务的应用程序,您可以使用 Lambda 与所需的服务交互,并通过 API Gateway 中的 API 方法来使用 Lambda 函数。AWS Lambda 在高可用性计算基础设施上运行代码。它会进行必要的计算资源执行和管理工作。为了支持无服务器应用程序,API Gateway 可以支持与 AWS Lambda 的简化代理集成和 HTTP 终端节点。

  • 实践

为了访问速度,这里我选择AWS的东京区域,首先创建一个Lambda函数,当前支持C#,Go,JAVA,Nodejs,Python几种语言的不同版本,足够日常使用了,这里我选择Python,并且把代码上传到AWS,注意配置好主函数(您函数中的 filename.handler-method 值。例如:“main.handler” 将调用在 main.py 中定义的处理程序方法。)

左边添加一个触发器,这里采用API Gateway,配置好方法请求等参数,这里需要注意的是在API Gateway管理界面需要配置好各种请求和相应阶段以后可以进行测试,并且需要部署API,而部署完以后的API是有Stage的,URL里也需要注意有Stage,否则会报 {"message":"Missing Authentication Token"} 错误。

绑定自定义域名aws-apne-gateway.tms.im,这里需要先在ACM(Amazon Certificate Manager)里导入或者生成域名证书。

这样就完成了一个Lambda函数的部署,整体操作下来还是很简单顺畅的。

  • 总结

一直想体验一下AWS的FaaS架构,今天也是借着这个小需求的机会体验了一把FaaS,感觉是开发者的福音,完全不需要考虑后端服务器的环境,部署等各种问题,只需要关注核心逻辑实现,把函数当成一个简单的黑盒实现即可。
缺点嘛也很明显,只适合不是那么复杂的可以拆分出来的函数逻辑的实现,和微服务架构有点像,如果业务逻辑很重并且非常缠绕,互相依赖太严重,无法通过拆分成小函数来执行的话可能就不太适合FaaS架构了。

nginx模块开发遇到的一个坑

先说总结:ngx_rbtree在不同worker进程相互独立。

然后是过程:

今天因为一个nginx模块开发的时候,不同fd进来使用ngx_find_value在红黑树ngx_rbtree里找不到上一个fd设置的值的情况,调试了一下午。

突然想起来nginx是多进程模式,有一个worker_processes参数。而模块又是worker进程分别调用,同样红黑树也是不同worker进程维护自己的红黑树。

怪不得接入不同worker的fd在红黑树中设置的值相互查不到。

骷髅峡谷拆机

前言

闲着没事拆拆骷髅峡谷看看,没想到出奇的简单。螺丝位置我都用红圈圈出来了。

先拆上盖

上盖

再拆下盖

上盖

拆上盖内部螺丝

上盖内部

拆下盖内部螺丝

下盖内部

把内部推出来,要把接口那地方稍微按一下,内壳部分就能拿出来了。

内部

把电路板拿出来,小心两根天线。

电路板

完工

看上去做工真的不错,顺便清理下风扇的灰尘。装回去声音小多了。