Zexin Li

Please keep honest, open, patient, happy and visionary.

NVIDIA Jetson的是arm64架构具有GPU的开发组件。相应地,很多系统库/深度学习库不能够容易地被找到。为了一劳永逸解决此类依赖问题,NVIDIA官方提供了刷机(flash)工具包(Jetpack)。本文主要介绍Jetpack刷机的技术细节。

此外JetsonHacks提供了官方刷机教学视频,如果看本文还是不清楚一些细节,可以看视频一步步跟着学: Jetpack 4.2安装 Jetpack 3.0安装

老版本的刷机教程也可以参考Jetson TX2 完整刷机教程

准备工作

  1. 一台带有Intel或AMDx86架构的Ubuntu操作系统的电脑作为host主机 (Jetpack 4.x推荐系统为Ubuntu 18.04)。

  2. 物理空间:需要至少40G以上的物理空间。Jetpack和Jetpack下载的安装包需要的空间十分庞大。

  3. 下载Jetpack安装包:申请Nvidia developer账号,在NVIDIA官方网站根据开发板的型号登录后下载。建议下载当前最新版本Jetpack 4.6。

  4. 只需要确保host主机能够上网(开发板没有网络也能刷机)

  5. 准备一根Micro-USB的数据线(一般手机充电线即可)(备注: AGX Xavier/AGX Orin只需要TypeC-USB数据线),一根HDMI线,一个屏幕。

安装Jetpack

  1. 断开开发板电源,断开开发板网线,数据线连接开发板和host主机。双击运行Jetpack安装包,然后命令行输入

    1
    sdkmanager # 此处不能使用root

    Nvidia developer账号登录后,进入step 1: 勾选host和target,选择需要刷机的设备类型(如果数据线连接正常,也会自动检测出设备)。

  2. 进入step 2: 创建2个新文件夹,用于存放下载库文件和target镜像文件。

  3. 点击继续进入step 3: 进入下载阶段,完成后自动进入install OS阶段。

  4. Jetpack会自动提示,是否自动刷机(auto flash)/手动刷机(manual flash)。建议选择手动刷机(manual flash),然后开启强制恢复模式,以TX2为例:

    (a) 保证开发板初始处于断电状态,确保Micro USB线正常连接

    (b) 接通开发板电源,按下power开机,然后迅速按住recovery键不松开,按一下reset键,过2秒松开recovery键

    (c) 此时应该有2个绿灯亮起

  5. 验证是否处于强制恢复状态,在host命令行输入

    1
    lsusb # 如果有Nvidia Corp设备检测到说明正确进入了强制恢复状态,否则重复第4步
  6. 给开发板连上HDMI线+屏幕,等待开发板的ubuntu系统初始化(配置账号密码)。

  7. Jetpack会提示要求选择连接方式+输入账号密码。此时选择使用USB连接,不要修改默认的ip地址,输入开发板的ubuntu系统的账号密码。

  8. 冗长的等待,等待所有库全部安装完成,进入step 4: 点击exit退出sdkmanger。

进一步配置

给开发板连接网线并查看ip。

1
ifconfig | grep eth0 -a1

随后可以ssh进行连接和进一步配置。

可能的问题

  1. 网络下载太慢
    更换能过墙+带宽足够的环境。

  2. Jetpack报奇怪的错(例如dependencies error)
    更换纯净的ubuntu 18.04 host,多数是系统问题。不要想着fix这些error,有这时间不如重装/换靠谱的host。

  3. 有2个CPU核心不工作(性能问题)
    将/boot/extlinux/exltinux.conf 文件里的isolcpus=1-2修改为isolcpus=,参考解决方案

总述

今天被问了一个问题:如何把复杂的调用树可视化?

首先,这个问题可以被归结为:如何实现有向图的可视化。

当然,答案有很多种。可选的简单地解决方案可能是基于echarts的在线的生成工具 [1],或是Ant V [2]此类专用于画图的框架。本文主要介绍使用python中的networkx宏包作图。

环境配置

python 2.7.17: 依赖库为matplotlib, networkx

1
2
pip install matplotlib
pip install networkx

代码

1
2
3
4
5
6
7
8
import matplotlib.pyplot as plt
import networkx as nx

G=nx.DiGraph()
list=[(1,2),(1,3),(2,4),("source","end")]
G.add_edges_from(list)
nx.draw(G,with_labels=True)
plt.show()

具体的nerworkx用法参见已有博客 [3]或者networkx官方文档 [4],此处不再赘述。

值得一提的是,虽然python编码相对方便,但是画图的速度远不及基于JavaScript的各种框架。nx.draw(G,with_labels=True)这一行的执行速度非常慢,即使图中只有不超过10个节点也花了近半分钟进行生成。如果需要实时性高的生成,建议使用前文中的[1][2]或类似框架。

效果图

Reference

[1] 利用echarts实现有向图可视化,
http://bookshadow.com/weblog/2016/11/22/echarts-directed-graph-visualization/
[2] AntV, https://antv.vision/en
[3] networkx, https://www.cnblogs.com/ljhdo/p/10662902.html
[4] networkx tutorial,
https://networkx.github.io/documentation/stable/tutorial.html

场景描述

因实验需要,收集了一些Maven project在Ubuntu 16.04 LTS上进行mvn test/mvn compile等操作。有时会发生BUILD FAILURES。本文描述几个详细的案例及解决方案,供以后遇到类似情况参考。

HikariCP

project地址:https://github.com/brettwooldridge/HikariCP.git
表现:某个test异常卡顿(OSGI这个test),出现HTTPS 501问题,然后该test fail导致BUILD FAILURES。
分析:查找发现HTTPS 501的原因是默认没有使用https的central源,在2020年1月后强制使用https,否则就会报501错误。在更换maven源之后仍然没有解决这个问题。
解决方案:在pom.xml的surefire configuration里配置exclude该test,问题解决(基本不影响执行时间)。

log4j

project地址:https://github.com/apache/log4j.git
表现:使用python脚本os.system(“mvn test >> output.txt”)
分析:log4j可能在测试中使用了某些输入输出流,与脚本中的流冲突导致fail。
解决方案:尝试手动mvn test,问题解决。

java-apns

project地址:https://github.com/notnoop/java-apns.git
表现:integration test中的FeedbackTest出现大量Exception,然后build流程卡顿不动。具体见https://github.com/notnoop/java-apns/issues/370。
分析:尝试用类似于HikariCP的解决方案exclude FeedbackTest,然而其它integration test也出现error。把整个integration test都exclude后,剩余BUILD时间只有15秒左右,执行时间变化很大。
解决方案:目前未解决。TODO

OpenTripPlanner

project地址:https://github.com/opentripplanner/OpenTripPlanner.git
表现:使用alimaven源出现大量Could not resolve artifact,在compile阶段开始前即BUILD FAILURES。
分析:查找发现此类问题大概率是由网络问题导致。在把alimaven源还原成central源后,download速率变慢很多,但仍未解决could not resolve artifact。
解决方案:更改pom.xml的配置,原有pom中配置的源是硬编码的已经失效。更改一些依赖的版本号。

阿里云云效maven的站点查询 https://maven.aliyun.com/mvn/view

  1. 打开${maven_home}/conf/settings.xml
  2. 中添加以下内容。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <mirror>     
    <id>aliyun-public</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun public</name>
    <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
    <mirror>
    <id>aliyun-central</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun central</name>
    <url>https://maven.aliyun.com/repository/central</url>
    </mirror>
    <mirror>
    <id>aliyun-spring</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun spring</name>
    <url>https://maven.aliyun.com/repository/spring</url>
    </mirror>
    <mirror>
    <id>aliyun-spring-plugin</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun spring-plugin</name>
    <url>https://maven.aliyun.com/repository/spring-plugin</url>
    </mirror>
    <mirror>
    <id>aliyun-apache-snapshots</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun apache-snapshots</name>
    <url>https://maven.aliyun.com/repository/apache-snapshots</url>
    </mirror>
    <mirror>
    <id>aliyun-google</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun google</name>
    <url>https://maven.aliyun.com/repository/google</url>
    </mirror>
    <mirror>
    <id>aliyun-gradle-plugin</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun gradle-plugin</name>
    <url>https://maven.aliyun.com/repository/gradle-plugin</url>
    </mirror>
    <mirror>
    <id>aliyun-jcenter</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun jcenter</name>
    <url>https://maven.aliyun.com/repository/jcenter</url>
    </mirror>
    <mirror>
    <id>aliyun-releases</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun releases</name>
    <url>https://maven.aliyun.com/repository/releases</url>
    </mirror>
    <mirror>
    <id>aliyun-snapshots</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun snapshots</name>
    <url>https://maven.aliyun.com/repository/snapshots</url>
    </mirror>
    <mirror>
    <id>aliyun-grails-core</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun grails-core</name>
    <url>https://maven.aliyun.com/repository/grails-core</url>
    </mirror>
    <mirror>
    <id>aliyun-mapr-public</id>
    <mirrorOf>*</mirrorOf>
    <name>aliyun mapr-public</name>
    <url>https://maven.aliyun.com/repository/mapr-public</url>
    </mirror>

转载https://segmentfault.com/a/1190000018147680

Response Letter是什么

在投稿期刊论文时,需要进行一至多轮的review。在收到review结果后,论文作者需要整理该结果中的问题,并对其逐一进行解答。本文简要概述response letter写作中的注意事项。

基本框架

Synopsis

介绍response letter的结构。

Our first submission

简要解释初稿的大致内容和贡献。

Our second submission

简要解释第二次投稿(如果有)在第一稿上的改动;如果有第三次投稿就再增加Our third submission。

Our revised submission

简要解释最后一次改动后修改的内容。

Answer to Comment: Editor

对编辑的review意见的回复。

Answer to Comment: Reviewer X

对reviewer X意见的回复;需要对每个reviewer的意见分别逐一回复。

References

Response letter中的引用。

写作核心思想

  1. Reviewer问什么,就回答什么。不要回答无关内容。

  2. 回答逻辑上要合理:先回答一般性内容,再回答细节内容。

写作细节问题

  1. 每个comment的回答第一句要写上:”Thank you for the comment.”

  2. 如果需要在回答中引用reviewer的原话,需要斜体+引号。

  3. 专有名词设置成macro,保持格式/语法一致(例如统一斜体)。

  4. 文中新定义的名词如果需要使用缩写,在定义时即可说明,然后统一使用缩写。不应在定义前提及新定义名词。

  5. 双引号要正确使用:latex中是``和’’,而不是“”。

Latex模板

https://www.overleaf.com/2454561743cmwzvycpggpv

总述

maven作为热门的build system经常被各种Java project采用。有时我们会遇到需要编写自定义maven插件的需求。

以IDEA为例:首先选择从maven创建一个project,如果勾选create from achetype就会生成模板程序代码(这里以maven-achetype-mojo为例)。项目名称规范是${NAME}-maven-plugin,然后需要选择maven home directory,随后自动生成模板程序代码。

对maven源的配置

值得一提的是,初次使用maven会自动下载大量依赖文件,就算有梯子,也可能非常慢。这时就需要在创建project之前先对${maven_path}/conf/settings.xml进行设置更换国内源。

1
2
3
4
5
6
7
8
9
10
// 对源的配置:增加localRepository,配置mirror url
<localRepository>${YOUR_MAVEN_REPO_PATH}</localRepository>
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

正式开始写maven project的代码

对模板程序pom.xml的修改

可以看出来maven模板程序的pom.xml配置已经非常老了(比如这个maven-plugin-api还是2.0),这里参考KIWI的一篇博客一通乱改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>${YOUR_GROUP_ID}</groupId>
<artifactId>${NAME}-maven-plugin</artifactId>
<packaging>maven-plugin</packaging>
<version>1.0-SNAPSHOT</version>
<name>${NAME}-mavne-plugin Maven Mojo</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5.2</version>
</plugin>
</plugins>
</build>
</project>

Mojo类的规则简要介绍

Mojo类必须继承AbstractMojo 并实现他的 execute 方法,而 execute 方法其实就是这个插件的入口类。简单介绍注解@Mojo(name = $NAME),用于定义插件相关信息,以便于在pom.xml里通过$NAME的形式显示指定。@Execute()注解则能指定Mojo的执行时机,绑定phase或lifecycle等。

部署

写完了代码,需要mvn clean install(把该插件打包并部署至本地仓库),其他本地maven项目就可以通过pom.xml使用该插件。想要他人也可以使用,需要使用mvn deploy命令。

1
2
3
4
5
6
7
8
9
<build>
<plugins>
<plugin>
<groupId>${YOUR_GROUP_ID}</groupId>
<artifactId>${NAME}-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
</plugins>
</build>

增加依赖后,可以直接命令行mvn ${NAME}:${GOAL} [args]的方式调用;也绑定至lifecycle,通过mvn test等命令调用(也可以IDEA右上角maven集成插件手动点击)。

总述

在学习c++的时候会遇到一个问题:什么时候使用struct,什么时候使用class?

C的struct

1
2
3
4
5
6
struct tag { 
member1;
member2;
member3;
...
} variable;

tag 是结构体标签。
member 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。
variable 结构变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。
一般情况下,上述三个变量至少要出现2个。

struct不能给内部变量初始化。
值得一提的是,在C中struct是用来封装数据的(member可以包含一个或多个基本数据类型,也可以包含其它结构体),但是其中不能够有成员函数。

想要C语言中的struct中包含成员函数,只能通过函数指针去替代成员函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

void test(int input) {
printf("%d",input);
}
typedef struct _tag {
void (*func)(int);
} Tag;

int main(void)
{
Tag tag;
tag.func = &test;
tag.func(0);
return 0;
}

C++的struct

C++的struct和class的关联

回到正题,c++中继承了在c语言中的用法,但是又做了改进:可以包含成员函数。从可实现功能上来看,struct和class基本上没有什么区别了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

typedef struct _tag {
void func(int input) {
printf("%d",input);
};
} Tag;

int main(void)
{
Tag tag;
tag.func(0);
return 0;
}

// 令人疑惑的是,在mac环境下居然这段代码用gcc编译也通过了,还能正常运行。
// 应当在ubuntu环境下是不能编译通过的。

C++的struct和class的区别

默认修饰符:struct是public,class是private。以下的代码从逻辑上是等价的:

1
2
3
4
5
6
7
8
9
10
11
class A {
int A_a;
public:
int A_b;
};

struct B {
int B_b;
private:
int B_a;
};

默认继承方式是:struct是public继承,class是private继承。建议在继承时需要显示地指明修饰符。

1
2
3
4
5
6
7
8
9
10
11
12
class A {
int A_a;
public:
int A_b;
};

struct B : public A {
// 建议在继承时需要显示地指明修饰符
int B_b;
private:
int B_a;
};

总述

很多人会在Mac下使用Office Word进行写作,有时会有文献引用的需求(比如毕业论文)。通过Office Word自带的工具进行引用费时费力,一旦插入文献可能需要大量修改。今天为大家介绍一种在Mac下使用Jabref+Mendeley+Office Word进行便捷的文献引用的方式。

!!!注意:常见搜索引擎会推荐BibTex4word这个插件,很不幸,这个插件不支持Mac环境 (官网明确写了it does not work on Mac),所以不用再试了

环境配置

环境:macOS Mojave, Microsoft Word for Mac 16.35
工具:Jabref(去这里下载Mac dmg), Mendeley Desktop(链接)

操作步骤

第一步

在Jabref里创建新的文献记录(可以直接使用BibTex source),保存选择生成.bib文件

第二步

在Mendeley Desktop里创建一个账号,选择导入刚刚的.bib文件(建议新建一个文件夹导入,不然可能会弄乱列表)。

第三步

在Microsoft Word中选择Insert->Get Add-Ins->搜索Mendeley,装上之后在References工具栏会出现Mendeley Cite。登录刚刚创建的Mendeley账号,即可进行引用。

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

On windows, add “npx” prefix.

Create a new post

1
2
3
4
$ hexo new "My New Post"
$ # Or
$ hexo new draft "New draft"
$ hexo publish "New draft"

Run server

1
2
3
$ hexo server
$ # Or
$ hexo server --draft

Generate static files

1
$ hexo generate

Deploy to remote sites

1
$ hexo deploy # This will only deploy generated files to remote sites! Nedd to backup source by yourself!