三国备忘录

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
何进/此小儿之见也
董卓
	蔡邕
孙坚/为玉玺发誓赌咒
	祖茂
	孙策
		于吉
		许贡
吕布
	陈宫
	高顺/夏侯惇
	张辽
徐州城
	陈珪
	陈登
		车冑
刘安
刘备/孔北海乃复知天下有刘备邪?
曹老板
	于禁
	庞德
袁绍
	许攸/官渡/乌巢
	田丰
韩馥/疑袁绍追杀自已到张邈处而自杀
公孙瓒
	公孙越
司马懿
	张春华/杀婢女

expect scp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
auto_scp()
{
	local filepath=$1
	expect -c "
		set timeout 10
 
		spawn scp scp://someone@192.168.12.3:1234//home/someone/$filepath .
 
		expect \"password:\" 
		send \"toodangerous\r\"
 
		interact
	"
}

refer to:
https://blog.csdn.net/f_zyj/article/details/93475830
https://zhuanlan.zhihu.com/p/25164676

strdupa in Windows

my_alloca.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef _MY_ALLOCA_H_
#define _MY_ALLOCA_H_
 
#include <malloc.h>
 
__declspec(thread) extern size_t strdupa_len;
__declspec(thread) extern char* strdupa_p;
#define strdupa(_str) \
( \
	strdupa_len = strlen(_str), \
	strdupa_p = (char*)_alloca(strdupa_len + 1), \
	memcpy(strdupa_p, _str, strdupa_len + 1), \
	strdupa_p \
)
 
#endif

my_alloca.c

1
2
3
#include "my_alloca.h"
__declspec(thread) size_t strdupa_len;
__declspec(thread) char* strdupa_p;

example.c

1
2
3
4
5
6
#include "my_alloca.h"
 
int main()
{
	char* p = strdupa("hi");
}

Select Windows SDK version when building using cmake

Read cmake online doc carefully, https://cmake.org/cmake/help/latest/variable/CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION.html

So when we build project which has CMakeLists.txt, we can select Windows SDK version in this way:

  1. In explorer, navigate to like C:\Program Files (x86)\Windows Kits\10\Include.
  2. For cmake always finds the newest version to build our project, we can just rename all sdk versions which is newer than we want. e.g. if we want 10.0.19041.0 to build our project, but 10.0.22581.0 is newer, we rename 10.0.22581.0 to 10.0.0.22581.0, the rule is among tokens split by period signs, the third token number is the key word that cmake sorts them to get the largest as newest.
  3. Start cmake to configure the project, it will find the right sdk version.
  4. After cmake is done in configuration, rename 10.0.0.22581.0 back to 10.0.22581.0.

Open sourced games

https://github.com/FreezingMoon/AncientBeast
https://github.com/CleverRaven/Cataclysm-DDA
https://gitee.com/GITLZ/PlantsVsZombies
https://github.com/jynew/jynew
https://github.com/BKcore/HexGL
https://github.com/freeciv/freeciv-web
https://github.com/wesnoth/wesnoth
https://github.com/opentomb/OpenTomb
https://github.com/Unvanquished/Unvanquished
https://github.com/amiruqdah/mario-party
https://github.com/stuntrally/stuntrally
https://github.com/lo-th/3d.city
https://github.com/Casmo/tower-defense
https://github.com/softvar/save-the-forest
Unity Gigaya
https://github.com/wuhaoyu1990/KingdomRush

refer to:
https://www.toutiao.com/article/7052673030098534951/

LD_LIBRARY_PATH in makefile

At a glance,

1
2
3
dbg:
	set LD_LIBRARY_PATH=/path/to/so
	echo ${LD_LIBRARY_PATH}

Why does the 'echo' command output nothing?

For the dollar sign is not only a key letter in bash, it's also in makefile. And each command line in Makefile shares no environmental variables. So right way is

1
2
3
dbg:
	set LD_LIBRARY_PATH=/path/to/so ; \
	echo $${LD_LIBRARY_PATH}

However, if tst01 needs to load libtst02.so from /path/to/so/,

1
2
dbg:
	set LD_LIBRARY_PATH=/path/to/so ; ./tst01

why does tst01 still report it can't find libtst02.so?

For the 'set' command only lets LD_LIBRARY_PATH variable visible in the bash process where the 'set' is invoked, no spreading in child processes. So final correct script is

1
2
dbg:
	export LD_LIBRARY_PATH=/path/to/so ; ./tst01

logc needs rewritting

For the thing is changing, loge will not call logi by itself, we need invoke !logexts.logi explicitly in advance.

The up to date procedure is

  1. LogManifest.lgm is in wrong place, so

    1
    2
    
    cd C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\winext
    copy LogManifest.lgm ..
  2. Start WinDbg, click main menu, File, Open Executable...
  3. In command bar of WinDbg, input

    1
    2
    3
    4
    
    !logexts.logi
    g
    !logir
    g

We will find a folder named ApiLogs lying on the Windows desktop. After the debuggee process exits, by using logviewer.exe we can open files in it, with .lgx suffix.

Automatically distill headers from other project

catch_inc.sh

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
#!/bin/bash
 
dir_cur=`pwd`
dir_inc=original_inc
dir_src=/path/to/other/project
 
withly()
{
	[ -e $2 ] && $*
}
 
withoutly()
{
	[ -e $2 ] || $*
}
 
withly rm inc.makefile1
withly rm Makefile
 
if [ x$1 == xclean ] ; then
	withly rm inc.makefile
	withly rm ${dir_inc} -Rf
	exit 0
fi
 
withoutly mkdir ${dir_inc}
withoutly touch inc.makefile
 
while [ 1 ] ; do
	cat inc.makefile | sort | uniq > inc.makefile1
	cp inc.makefile1 inc.makefile
	cat inc.makefile | sed ':t;N;s/\n//;b t' | sed 's/\//\\\//g' | sed 's/\ /\\\ /g' > inc.makefile1
	sed "s/@original_includes@/`cat inc.makefile1`/g" Makefile.pat > Makefile
	lost_header=`make 2>&1 | grep "#include" | awk '{if ($2 == "|" && $3 == "#include") print $4}' | awk -F\" '{print $2}'`
	if [ x${lost_header} == x ] ; then
		break
	fi
	found_header=`cd ${dir_src}; find . -name ${lost_header} | head -n 1`
	echo ${found_header}
	found_header=${found_header##./}
	( cd ${dir_src}; cp --path ${found_header} ${dir_cur}/${dir_inc}/ )
	found_header=`dirname ${found_header}`
	echo "-I${dir_inc}/${found_header} " | cat >> inc.makefile
done

For an example, pattern file Makefile.pat is as

1
2
3
4
...
CFLAGS=-g -Iinclude @original_includes@
LDFLAGS=-pthread -lm
...

from which the catch_inc.sh script can generate Makefile like

1
2
3
4
...
CFLAGS=-g -Iinclude -Ioriginal_inc/subdir/in/other/project/inc1 -Ioriginal_inc/subdir/in/other/project/common/inc2
LDFLAGS=-pthread -lm
...

refer to:
https://www.cnblogs.com/liqiu/p/4506508.html

Hardware memo

1
2
3
4
5
6
7
8
PWM	Pulse Width Modulation
SPI	Serial Peripheral Interface			MISO MOSI SCLK CS
UART	Universal Asynchronous Receiver/Transmitter	Rx Tx GND
USB	Universal Serial Bus				VBUS D- D+ GND
AMBA	Advanced Microcontroller Bus Architecture	AHB ASB APB
MIPI	Mobile Industry Processor Interface
LVDS	Low Voltage Differential Signaling
CFA	Color Filter Arrays

HiSi

1
2
3
4
5
6
7
8
9
NNIE	DPU
IVE	ISP
VI	Video Input
VO	Video Output
VPSS	Video Processing Sub System
AVS	Video Splicing
MMZ	Media Memory Zone
VB	Video Buffer
NR	Noise Reduction

refer to:
https://www.cnblogs.com/qinghaowusu/p/13610568.html

h264 memo

AVC		Advanced Video Coding, alias h264

SODB	String Of Data Bits
RBSP	Raw Byte Sequence Payload
		RBSP = SODB + (RBSP Trailing Bits for alignment)

EBSP	Encapsulated Byte Sequence Payload
		EBSP = RBSP inserted 0x03 to avoid being treated as startcode of a NALU
		Raw data
			... 0xXX, 0x00, 0x00, 0xXX, ...
		Encoded data
			... 0xXX, 0x00, 0x00, 0x03, 0xXX, ...
NALUHeader
		forbidden_zero_bit, 1bit
		nal_ref_idc, 2bits
		nal_unit_type, 5bits, equals NALUHeader & 0x1F

NALU	Network Abstraction Layer Unit
		NALU = NALUHeader + EBSP
		startcode
			0x00, 0x00, 0x01		Following NALU is a slice in one picture frame
			0x00, 0x00, 0x00, 0x01	Following NALU is a picture frame, SPS, PPS, etc
AU		Access Units
			A complete picture frame containing several NALUs

SPS		Sequence Parameter Set				nal_unit_type == 7
			From an SPS, we can get width and height of the picture

PPS		Picture Parameter Set					nal_unit_type == 8
IDR		Instantaneous Decoding Refresh			nal_unit_type == 5
SEI		Supplemental Enhancement Information	nal_unit_type == 6
			1 byte payloadType + 1 byte payloadSize
			payloadType
				0x00: buffering_period
				0x01: pic_timing
				0x02: pan_scan_rect
				0x03: filler_payload
				0x04: user_data_registered_itu_t_t35
				0x05: user_data_unregistered
					16 bytes: uuid_iso_iec_11578
					payloadSize - 16: user_data_payload_byte
				0x06: recovery_point
			rbsp trailing bits
AnnexB
		use startcode
AVCC
		use NALU length, reuse EBSP
RTP
		in AVCC, not AnnexB?

refer to:
https://www.cnblogs.com/ssyfj/p/14624498.html
https://blog.csdn.net/y601500359/article/details/80943990