迁移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架构了。

骷髅峡谷拆机

前言

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

先拆上盖

上盖

再拆下盖

上盖

拆上盖内部螺丝

上盖内部

拆下盖内部螺丝

下盖内部

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

内部

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

电路板

完工

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

K2P B1版本刷梅林固件

前言

由于K2拿回家里用了,于是又撸了一台K2P放在办公室用,也是为了它的千兆有线网口,毕竟办公室是千兆网,通过K2P访问共享存储会方便快速很多。

早上下的单,第二天中午才到,一到手还是熟悉的开箱,长相颜值确实比K2高了很多,网上很多图片我也就不放了,银色版本,全身金属质感,炫酷。

简介

到手第一件事依旧是刷机,毕竟原生固件有众所周知的问题,但是一看我这版本是B1,哎毕竟非洲人。

K2P出了两个不同版本(或者严谨的说是三个,但是A2和A1只是在电容和屏蔽罩上有差别,CPU都是一样的,就不细分了),分别是A1和B1。其中A1采用的MTK MT7621A的处理器,而B1采用的是博通BCM47189,性能上面的差别网上众说纷纭,但是我试用下来反正千兆能跑满,也就不纠结那么多了。毕竟不花钱又能要求啥呢。

如果你是A1版本,那么恭喜你,网上有很多傻瓜方案都可以搞定,非常简单方便,大致流程无非是刷入Breed->刷入固件->开心使用吧。甚至Bootloader都有很多种,除了Breed还有其他可选。固件更是有非常多的选择,这里推荐荒野无灯的padavan,毕竟我K2也用的padavan还不错,当然如果喜欢LEDE之类的爱折腾的玩家也可以刷入LEDE等其他固件。

而我这B1版本就比较惨了(连官方都没出适配B1的固件),因为博通方案的缘故,Breed是没希望了,看了下至少还有一个梅林固件可用,并且CFE的一个小漏洞也让我们能开启telnet进行一些命令行操作,勉强够用了,期待以后有更多大神推出更多固件和BL。

刷机(仅限B1)

准备(开Telnet)

  1. 首先要进入官方的CFE恢复界面,开启一下telnet功能来备份官方固件(毕竟万一梅林不好用或者哪天用到了官方固件)。方法还是老套路,长按reset开机,10s后可以用192.168.2.1进入CFE界面。(这里吐槽一下斐讯的路由器默认IP居然是192.168.2.X段的)

  2. http://pan.baidu.com/s/1boIHBXH下载修改版的固件。

  3. 在计算机上启动tftp服务器,将固件解压后放入tftp服务器根目录,然后在CFE网页输入

    http://192.168.2.1/do.htm?cmd=flash+-noheader+你电脑IP:固件名

固件名默认是k2p_bcm_v10d.bin+flash0.trx,而电脑IP我设置的192.168.2.2

  1. 等个几分钟就刷好了。可以ping 192.168.2.1来看,刷的时候是不通的,刷完又通了。然后重启。

备份官方固件

  1. telnet进去路由器

  2. cat /dev/mtd0 /dev/mtd1 /dev/mtd3 /dev/mtd4 /dev/mtd5 /dev/mtd6 /dev/mtd7 > /tmp/all.bin

  3. mount --bind /tmp/all.bin /www/web-static/fonts/icofont.eot

  4. http://192.168.2.1/web-static/fonts/icofont.eot下载固件
    下载后将icofont.eot改名为all.bin,并确认固件大小为16777216字节

刷机

  1. http://pan.baidu.com/s/1boIHBXH 下载固件
  2. 同样在tftp服务器根目录下放上固件。使用
    http://192.168.2.1/do.htm?cmd=flash+-noheader+你电脑IP:固件名 刷入
    (这里固件名是K2P_Merlin_V10d.trx+flash0.trx)
  3. ping一下看刷完了用http://192.168.2.1/do.htm?cmd=nvram+erase清除下内存,然后重启。
  4. 享受梅林固件

恢复MAC地址

因为梅林和官方的内存结构不一样,所以mac地址没了,需要手动设置一下。刷完以后在web的“系统管理”-“系统设置”页面打开telnet或ssh,telnet或ssh登录名和密码是你的web登录名及密码。

ssh上去使用

设置WAN口地址
nvram set wan0_hwaddr=路由器MAC地址
设置LAN口地址
nvram set lan_hwaddr=路由器MAC地址 
nvram set et0macaddr=路由器MAC地址 
设置2.4G地址
nvram set w1_hwaddr=路由器MAC地址
nvram set wl0_hwaddr=路由器MAC地址
nvram set 0:macaddr=路由器MAC地址
设置5G地址
nvram set wl1_hwaddr=路由器MAC地址+1
nvram set sb/1/macaddr=路由器MAC地址+1
保存上述设置
nvram commit

即可

后记

刷完以后用了一段时间,表示一切正常,需要的功能(你懂得)都有,还可以开双WAN,千兆也可以跑满,不错的说。

根据自己的基因数据分析喝酒脸红的原因

经过一个多月的等待,自己的基因数据昨天终于出来了。昨天先看了一些基本的分析报告,今天把原始数据导入了数据库,整整60万个SNP位点,现在就来拿原始数据看一下我的性状表现。

酒精在体内的代谢是一个相对比较简单的过程。首先是乙醇通过乙醇诱导肝细胞色素酶和乙醇脱氢酶变为乙醛,乙醛再通过乙醛脱氢酶变成乙酸,最后分解为水和二氧化碳。

其中乙醛是中毒的罪魁祸首,对各脏器伤害极大,而乙酸是醋的主要成分,对人体几乎无害。

这样就可以看出,和酒精代谢主要相关的酶有乙醇诱导肝细胞色素酶、乙醇脱氢酶(ADH)和乙醛脱氢酶(ALDH),其中相应的控制基因有CYP2E1、ADH1B、ADH1C、ALDH2。

查找SNPedia资料得知

关于ADH

A SNP in rs1229984 encodes a form of the alcohol dehydrogenase ADH1B gene that significantly reduces the clearance rate of alcohol from the liver. This SNP is also known as Arg48His, with the (G) allele corresponding to the Arg and the (A) to the His.
Known in the literature as ADH22 or sometimes ADH1B2, the allele with increased activity (meaning more rapid oxidation of ethanol to acetaldehyde) is His48, encoded by rs1229984(A). Individuals with one or especially two ADH2*2 alleles, ie genotypes rs1229984(A;G) or rs1229984(A;A) are more likely to find drinking unpleasant and have a somewhat reduced risk for alcoholism.
A study of over 3,800 cases of “upper aerodigestive” cancers (mouth/throat, voice box, and esophageal cancers) concluded that the rs1229984(A) allele (in dbSNP orientation) has a protective effect. Carriers of this allele had a 0.56x (decreased; p=10-10) risk of having one of these cancer types.

说明ADH1B基因的rs1229984(SNP)(G>A)会导致个体间乙醇代谢为乙醛的速度存在差异,携带rs1229984(A)基因的人群会加速乙醇至乙醛的转化。如果为(A;A)则转化速率更快。同时rs1229984(A)对上消化道癌症(食管癌、吼癌等)有保护作用,可以降低得这些癌症的风险。

关于ALDH

rs671 is a classic SNP, well known in a sense through the phenomena known as the “alcohol flush”, also known as the “Asian Flush” or “Asian blush”, in which certain individuals, often of Asian descent, have their face, neck and sometimes shoulders turn red after drinking alcohol.
The rs671(A) allele of the ALDH2 gene is the culprit, in that it encodes a form of the aldehyde dehydrogenase 2 protein that is defective at metabolizing alcohol. This allele is known as the ALDH*2 form, and individuals possessing either one or two copies of it show alcohol-related sensitivity responses including facial flushing, and severe hangovers (and hence they are usually not regular drinkers). Perhaps not surprisingly they appear to suffer less from alcoholism and alcohol-related liver disease.

说明ALDH2基因的rs671(SNP)(G>A)会导致个体乙醛代谢为乙酸的速度存在差异,携带rs671(A)基因的人转换乙醛为乙酸的速度要慢,导致体内乙醛水平的积聚。

查看我自己的基因数据

rs1229984为AA
rs671为AG

综上分析可知,我的基因型为ADH效率高,能迅速将乙醇转化成乙醛,但乙醛代谢为乙酸速度较慢,会导致体内乙醛水平积累,表现为喝酒脸红,全身红,容易表现出恶心呕吐症状,是乙醛积累的结果。