Esper 发布的文章

起因是高二的时候,看到有100+ RMB的SBC,还能运行Android。
当时父亲还是比较支持我去体验一下新东西的,于是便央求着父亲给我买了一块。
彼时的Pine A64有三个版本,分别是内存512MB,1GB,2GB的。存储空间全部靠外插卡,系统也从此处启动。
当时省钱观念还是比较强的,在考虑用途的同时选择了折中的1GB版。
然后拿它打了半年的废狗,当时用的三棒手机连cpu都没写是哪家的
然而在后来才发现java是个内存怪兽,早知道就直接上2GB的了。
然而,现在2GB的变成了Long Term Supply版,结构也重新被设计过,内存从DDR3L换成了LPDDR3,即低功耗版。
也就是说,现在的2GB的Pine A64已经不能使用以前的镜像了。
不过问题不大,现在看来玩玩GPIO,Python,以及搭建个小服务器什么的,性能还是绰绰有余的。
然后当时为了省钱,做了另一件事情——没有买配套的Wifi+Bluetooth模块。
其结果就是,每当要上网的时候,就要找个有网线的地方(捂脸)。
其实当时手头还是有usb的wifi模块的——万能的RTL88188EU
当时也试过在台式机上给这块网卡编译驱动,不过当时什么都不懂,看着教程一路makemake install就完事了。
后来才发现在半闭源的Android上编译驱动是件难事,而当时也几乎不懂Linux。

1.jpg

到了大学之后,有了更多的时间来研究这个东西,也学习了更多Linux和硬件相关的知识。
在全球巡回演唱会级别的咕咕之后,终于把这个问题解决。步骤如下:

其之一 获取内核源码

首先uname -a一下,从里面找出内核版本kernel version。我的是3.10.104

2.jpg

再到对应的内核仓库repository去看一下,找到对应的发行版本release
仓库地址:https://github.com/longsleep/linux-pine64
点releases去查看所有的发行版本。找到对应的源码source code包如下:

3.jpg

其中第四组数字为内核的修补号,对内核功能没有什么影响。这里选择最新的3.10.104-2-pine64版本。
下载后,使用对应的命令解压,应有如下的目录结构:

4.jpg

其之二 编译内核

在此采用~/Desktop/linux-pine64-3.10.104-2-pine64作为临时目录。

为稳妥起见其实是看不懂参数,获取当前内核的配置文件,作为接下来的配置文件。

cd ~/Desktop/linux-pine64-3.10.104-2-pine64
make mrproper  # clean all previously generated file
cp /proc/config.gz .
gunzip config
mv config .config

就在源码的根目录下直接完成了配置。

然后就直接是make编译生成内核。由于本人在编译gcc时深受-j,即多线程multithreading参数的折磨,再加上没贴散热片怕CPU烧掉,这里采用单线程编译。(当然有兴趣的可以试试-j(自动设置为最大可用线程数)或者-jX(指定为X线程编译))

放了一晚上(也不知道多久),编译完成。

其之三 安装内核头文件kernel_headers

这个编译镜像的人是真的让人服气,tmd一块开发板,你还把头文件排除在外,搞个红红的软链接soft link放在镜像里。
结果,凡是想要编译和内核相关模块的全都搞不了,况且这东西还不知道apt上的general版能不能适配。
好在内核的开发者为我们提供了继续开发的希望,将其中一些工序写成了脚本提供出来,其中恰好有我们需要的。
https://github.com/longsleep/build-pine64-image/blob/master/kernel/install_kernel_headers.sh
没错就是上面这个。
我是直接把脚本的部分内容复制出来执行(为了学习理解),有用的部分从27行开始到最后都是。
理论上把28行删掉,就能够直接将脚本在Pine A64上运行,但是我没有测试。(本机编译不需要跨平台)
其实感觉差不多就是直接运行脚本了。。
我的配置如下:

LINUX_ARCH=arm64
CROSS_COMPILE=
DEST=
TARGET=$DEST/usr/src/linux-pine64-3.10.104-2-pine64

完成一系列命令后,kernel_headers安装完成。
文件目录应当如下:

5.jpg

再在/lib/modules/<kernel-version>下配置好相关的文件链接:

sudo rm -f build
sudo ln -s /usr/src/linux-pine64-3.10.104-2-pine64 $(pwd)/build

这样系统就能正常调用了。

由于系统自身的架构声明为aarch64,实际使用的却是arm64的配置文件,推荐进行以下操作:

sudo ln -s /usr/src/linux-pine64-3.10.104-2-pine64/arch/arm64 \
/usr/src/linux-pine64-3.10.104-2-pine64/arch/aarch64

就可以让某些应用程序编译时获得正确的配置文件。(下文即是其中之一)

其之四 编译网卡驱动

这一部分是写起来最快乐的,因为步骤和一般x86 PC上的没有任何区别。
make allsudo make install,完事!

然后sudo modprobe 8188eu即可加载驱动。

附注:

  1. 请务必确保在安装好的头文件目录下有一个Module.symvers文件,该文件用于链接符号和对应的操作码。 若是缺少的话,加载驱动会失败,且在dmesg中会看到如下信息: 6.jpg 其中8188eu模块报出的是没有Module.symvers文件时的错误,下面的R8188EU是操作正确下发出的信息。 Module.symvers由内核编译时动态生成,这也是前面为什么要编译内核的原因。

  2. 如果有已经配置好的内核源码的话,可以通过使用make modules_prepare进行编译驱动模块的辅助程序配置。 该命令可以解决的问题诸如scripts/basic/fixdep not found一类的问题。

啊,写到下午一点,差不多写完了,肚子早饿了,吃饭去。

在写项目的时候,先写了个爬虫,用了官方的json库,写完运行,没问题。 之后打算把爬虫的信息处理之后用REST写成api,然后就选择了Springboot。 把项目内的源代码原封不动地复制过去,然后,报错了???

之后还是在神奇的stackoverflow上找到了原因:在spring-boot-starter-test组件里,调用了非官方的android-json库。 https://stackoverflow.com/questions/52980064/maven-spring-boot-found-multiple-occurrences-of-org-json-jsonobject-on-the-cl

而这两者之间的差距在于,我所使用的官方库在解析错误时报出的是非检查性异常RuntimeException,也就是不影响代码语法的错误,运行时碰到就直接输出报错信息,停止这一过程了。而android-json库报出的是检查性异常Exception,用户必须在编写代码时就考虑该问题的解决,即try-catch

解决方案在上文链接里也有提到,在pom.xml里把该组建排除依赖即可。在eclipse里可通过图形界面简单操作。

最后再来小声bb一段:怎么又是咕果家的东西……

真的是只有商业公司才上心吗,firefox又给自己搞事情……

不想用chrome啊……

创建一个与数据库创建者有相同权限的用户,可以设置自己默认的schema。

CREATE USER Esper
  WITHOUT LOGIN
  WITH DEFAULT_SCHEMA = MySchema;
go

GRANT CONNECT TO Esper;

ALTER ROLE db_owner ADD MEMBER Esper;

之后使用时在前面加一句

EXECUTE AS USER = 'Esper';
go

就可以让当前的批处理都以MySchema作为默认schema执行了。

来自网易云音乐用户Loshad的歌单《合格的中国风音乐》简介

相对地有《把都节音阶当中国特色的音乐》,《除了五声音阶以外旋律配器都一塌糊涂的音乐》,《以为东方音乐充满不和谐音的音乐》,《对中音史一窍不通的伪古乐》,《仿古风然而并不有趣的音乐》。 当然,也相对于中国风模仿的对象——真正的中国音乐,包括古代雅乐,民间音乐及近现代的民族主义风格音乐。

都节音阶/都节调式,日本的民俗调式,五声音阶3 4 6 7 1。 中音史=中国音乐史?

  1. ssh-keygen创建多组公钥-密钥对
  2. ~/.ssh下建立config文件,格式如下:
Host host-alias
    HostName your.host.name
    IdentityFile /path/to/privkey
    PreferredAuthentications publickey
    User username

其中Host为该配置文件的“主机名”,即配置git远程仓库时用到的主机名,用于区分不同配置,不应重复
HostName为该配置文件的实际主机名,可重复
IdentityFile放私钥路径,可用相对地址
PreferredAuthentications为连接时的验证方式
User即为用户名(暂时不清楚这个有啥用,就先填用户名吧)

记得把私钥和这个config的权限改成600,为安全起见

参考: https://www.cnblogs.com/popfisher/p/5731232.html