骷髅峡谷(nuc6i7kyk)安装黑苹果(macOS Mojave 10.14.3)

一、前言

其实很久以前就给骷髅峡谷装过10.13版本的黑苹果+WIN10双系统,并且成功更新到Mojave。后来因为用的少又格式化掉了。去年用了一年的MacBook Pro以后,已经熟悉了苹果系统,并且基本工作都在macOS下完成了,遂又萌生了把骷髅峡谷装成苹果系统的想法。

黑苹果背后的基础知识我就不过多介绍了,可以在国内外各种论坛上了解,既然这次要搞,就要做到极致,目标是安装最新版的macOS系统,并且把能驱动的所有硬件都正常驱动起来,尽量完美使用骷髅峡谷的所有功能和最高效率。

二、准备

准备工作,需要的东西只是一个8G以上的U盘而已,USB3.0的为佳,因为速度会快很多。

安装黑苹果的步骤大同小异,因为这次是全盘格式化全新安装,所以我直接选择原版安装盘,使用原版安装包的磁盘管理来格式化全盘。

截止到写这篇文章为止,最新版的macOS是Mojave版本10.14.3 (18D109),使用手头的MacBook Pro直接在应用商店搜索Mojave就可以下载安装包。

下载完成后,这里因为图省事,直接使用了UniBeast来制作安装盘。这是全球最大的黑苹果论坛tonymacx86上的人开发的一款快速制作安装盘的工具,其实原理大同小异,不管MBR还是GPT分区表,首先把U盘格式化为两个区,其中EFI分区可以用FAT32或者其他格式,然后把安装包放在另一个区,并且做好引导记录,把Clover安装到EFI分区里,并且放好最小依赖的一些kext和config,安装盘就制作好了。

三、设置

这里稍微说一下我的配置,骷髅峡谷CPU是i7 6770HQ,内存我装的16G单条,SSD是SanDisk的256G非NVME接口。外接一台苹果的Apple LED Cinema Display,通过DP接口连接。

通过各方面查资料,得知我的配置没有什么和macOS不兼容的,需要调节的只是骷髅峡谷本身的一些硬件的开关。遂安心。

接下来进行一些基本BIOS设置,来把不兼容的地方修改掉。

  • Power->Secondary Power Settings, “Wake on LAN from S4/S5”, 设置成 “Stay Off”
  • Devices->Video, “IGD Minimum Memory” 设置为 64mb
  • Devices->Video, “IGD Aperture Size” 设置为 256mb
  • Boot->Secure Boot, “Secure Boot” 设置为 disabled
  • Security->Security Features, “Execute Disable Bit” 设置为 enabled.
  • Security->Security Features, “VT-d” 设置为 disabled

这里说一下骷髅峡谷的无线网卡芯片是苹果系统不支持的,所以目前没有办法驱动,可以关掉。但是蓝牙是可用的。

四、安装

插入安装U盘,开机,按F12选择从U盘启动,选择安装macOS,进入安装界面。选择磁盘工具,把整个硬盘格式化为APFS格式(Mojave只支持装在APFS分区格式上),回去选择安装,一路下一步,安装完毕自动重启。

至此系统安装完毕。

这时候安装完的macOS只是在硬盘上,因为骷髅峡谷不是苹果电脑,没法直接启动苹果系统,所以需要第三方启动器来进行引导。这时候我们就要请出Clover,关于这个启动器的资料可以上网查找,反正很强就是了。

介于刚才我们的U盘安装盘上已经装了这玩意,所以还是可以通过插入U盘来选择U盘启动,这时候Clover里多了一些选择,其中有一个preboot还是啥的可以引导进入硬盘里的苹果系统。继续执行安装过程。包括选择时区,设置用户名密码之类的,直到正式安装完毕

五、启动

再次重启,从U盘启动。我们终于看到了Boot from macOS选项。标志着macOS已经安装完毕到硬盘了。但是这只是神坑的刚刚开始。

这时候选择Boot from macOS,基本是进不去的。通过-v来看输出的log,有各种问题,需要对症下药,这里给出一个基本完美的解决方案,大致不会出现什么问题。

把U盘插到另一个电脑上,挂载EFI分区,做一下修改。

把调整完毕以后的clover启动盘插上,开机,U盘启动,选择Boot from macOS(最好还是-v看看log)。不出意外的话应该可以进入系统了。如果还是不行,需要看看-v输出的log,解决对应的error,有问题也可以和我交流。

最后需要把U盘里调好的可以启动macOS的Clover安装到硬盘的EFI分区,步骤和安装U盘Clover的差不多,如果你是UniBeast做的U盘,那你需要下载一个 https://github.com/RehabMan/Clover 的release并且安装。然后复制U盘Clover的相应文件到EFI分区即可了。

做完这步以后拔掉U盘重启,应该也可以使用硬盘的Clover引导进入macOS了。

六、调优

这时候应该可以正常启动进入macOS了,其实到这里,已经可以正常使用了。大部分硬件已经正常工作,可能性能不是最好或者部分硬件罢工罢了。如果不想折腾,或者只是体验,到这里就可以了。

如果要继续折腾可以继续看下去,但是调优这玩意是无止境的,每一个硬件都能折腾好几天,这里选择采用国外大神已经调节好的一些参数,加上部分需要自己调节的。

首先安装依赖,进入终端输入

xcode-select --install

安装完毕以后开始clone大神的git并使用

mkdir ~/Projects
cd ~/Projects
git clone https://github.com/RehabMan/Intel-NUC-DSDT-Patch nuc.git
cd ~/Projects/nuc.git
./download.sh
./install_downloads.sh
make
make install_nuc6sc

这样会自动编译DSDT/SSDT并且复制到EFI分区。

针对nuc的电源管理,执行

sudo pmset -a hibernatemode 0
sudo rm /var/vm/sleepimage
sudo mkdir /var/vm/sleepimage

最后使用文件夹里的config.plist

cp config_nuc6_sc.plist /Volumes/EFI/EFI/Clover/config.plist

这样调优就基本完成了,后续我又碰到了声音方面的问题和USB3.0不识别和掉速的问题。需要自己通过maciASL和各种kext注入的方法来解决。比较麻烦,后续如果有时间再写。

七、参考

https://www.tonymacx86.com/threads/guide-intel-skylake-nuc6-and-skull-canyon-using-clover-uefi-nuc6i5syk-nuc6i7kyk-etc.261708/

https://www.tonymacx86.com/threads/guide-booting-the-os-x-installer-on-laptops-with-clover.148093/

https://www.tonymacx86.com/resources/categories/tonymacx86-downloads.3/

用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在红黑树中设置的值相互查不到。