LYNX

Links

Tags

Categories

openCV安装

AS和cmake笔记

android的cpu架构

  • android查看cpu架构(termux)
cat /proc/cpuinfo
  • AArch32ARMv7架构的一种执行状态
  • AArch64ARMv8架构的一种执行状态
  • 64位ARMv8包含上面两种状态

cmake在AS中的使用

不要把mkcmake两种方法混淆

输出控制(message)

(TODO)如果想直接看到打印信息,使用WARNING以上的级别进行打印

  • message(WARNING "fuck")
    • Build->Build Output->CMake warnings查看
    • Build->Build Output->Toggle View查看

Android

Android Studio版本为3.5

OpenCV for Android 3.x:只使用java模块

参考:CSDN,示例:压缩图片

  1. File->New->Import Module->选择opencv文件夹下的sdk/java文件夹,此时Android Studio会自动加载Module name
  2. File->Project Structure->Dependencies->选择app->添加Module Dependency->选择opencv
  3. 将opencv文件夹下的sdk/native/libs下自己手机cpu对应的架构文件夹复制到app/libs
  4. 将opencv模块的build.gradlecomplieSdkVersion,buildToolVersion,minSdkVersion,targetSdkVersion改成和appbuild.gradle一样
  5. appbuild.gradleandroid节点下添加
    sourceSets {
    main {
    jni.srcDirs = []
    jniLibs.srcDirs = ['libs']
    }
    }

然后点击sync now

  1. 在使用opencv前进行初始化
    static {
    if (!OpenCVLoader.initDebug()) {
    ...
    }
    }

常见问题

  1. Caused by: CvException [org.opencv.core.CvException: OpenCV(4.1.1) /build/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp:101: error: (-215:Assertion failed)

MatBitmap互转的时候长宽设置不对

OpenCV for Android 3.x:使用native模块

方法一

  1. CMakeLists.txt编写

CMakeLists.txt中确定两个关键路径

  • /sdk/native/jni/include:头文件位置
  • /sdk/native/libs/${ANDROID_ABI}/libopencv_java3.so:库位置
cmake_minimum_required(VERSION 3.4.1)

#1
set(opencv_version OpenCV4-android-sdk)
set(opencv_lib libopencv_java4.so)

#2
include_directories(/home/lynx/fuck_mount/Android/Proj/${opencv_version}/sdk/native/jni/include)
add_library(fuck SHARED IMPORTED)
set_target_properties(fuck PROPERTIES IMPORTED_LOCATION
/home/lynx/fuck_mount/Android/Proj/${opencv_version}/sdk/native/libs/${ANDROID_ABI}/${opencv_lib})


add_library(保持原样)

find_library(保持原样)

target_link_libraries(
native-lib

#3
fuck

${log-lib})
  1. 修改app的build.gradle

android节点下插入

sourceSets {
main {
jniLibs.srcDirs = ['/home/lynx/fuck_mount/Android/Proj/OpenCV4-android-sdk/sdk/native/libs']
}
}

方法二

参考:CSDN

还没有成功

  1. CMakeLists.txt编写

CMakeLists.txt中确定一个关键路径

  • /sdk/native/jni/include:头文件位置
cmake_minimum_required(VERSION 3.4.1)

#1
set(opencv_version OpenCV4-android-sdk)
set(opencv_lib libopencv_java4.so)

#2
set(OpenCV_STATIC ON)
set(OpenCV_DIR /home/lynx/fuck_mount/Android/Proj/${opencv_version}/sdk/native/jni)
find_package(OpenCV REQUIRED)
if (OpenCV_FOUND)
message(WARNING "opencv libs: ${OpenCV_LIBS}")
else (OpenCV_FOUND)
message(WARNING "opencv not found")
endif(OpenCV_FOUND)

add_library(保持原样)

find_library(保持原样)

target_link_libraries(
native-lib

${log-lib}

#3
${OpenCV_LIBS})

常见问题

  1. java.lang.UnsatisfiedLinkError: dlopen failed: library "libopencv_java3.so" not found

这是由于忘记了上面的第2步.Android Studio默认的jni路径为app/src/main/jniLibs,除了在CMakeLists.txt中导入opencv的库以外还需要二选一

  • 将对应版本opencv的库(libs/下一级的各个${ANDROID_ABI}文件夹)移动到jniLibs
  • build.gradle中修改默认jni路径(见上面第2步)
  1. 各种undefined reference to *

std::ios_base::Init::Init()

未解决

  1. undefined reference to `AndroidBitmap_getInfo'

各类AndroidBitmap的问题

CMakeLists.txt增加

target_link_libraries(
# TODO 解决 AndroidBitmap 报错
jnigraphics)

参考:CSDN,这是一个很小的库,展示一个稳定的,基于C语言的接口,使本机代码安全地访问Java对象的像素缓冲区的位图

OpenCV for Android 4.x:使用native模块

方法一

3.x版本的方法一

常见问题

  1. java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found

stackoverflow

(不确定的解决方法)在app的gradle中修改

externalNativeBuild {
cmake {
cppFlags ""
arguments "-DANDROID_STL=c++_shared"
}
}

不要使用gnustl_sharedgnustl_static,已经过时

  1. java.lang.UnsatisfiedLinkError: dlopen failed: library "libopencv_java4.so" not found

解决方案同3.x版本

OpenCV for Android 4.x:使用java+native模块

参考:CSDN

  1. 加载native模块

  2. File->New->Import Module->选择opencv文件夹下的sdk/java文件夹,自己定义模块的名字

  3. 修改模块的gradle文件

// 将原来的application改成library
apply plugin: 'com.android.library'

android {
// 将版本信息改得和`app`的`build.gradle`一样
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
// 删除applicationId
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
// 不改动
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
  1. (重复)修改app的gradle文件,加载native/lib模块

javacv(使用不完整OpenCV 4.1.0)

不同导入方法,import的class位置可能不同

opencv部分功能的初始化

github原文

Loader.load(opencv_java.class);// 不能直接放在class开头

使用远程导入

appbuild.gradle示例(最外节点)

ext {
versions = [
'javacv': '1.4.4',
'ffmpeg': '4.1',
'opencv': '4.0.1'
]
}

dependencies {
...
implementation(group: 'org.bytedeco', name: 'javacv-platform', version: versions.javacv) {
exclude group: 'org.bytedeco.javacpp-presets'
}
implementation group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: "${versions.ffmpeg}-${versions.javacv}"
implementation group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: "${versions.ffmpeg}-${versions.javacv}", classifier: 'android-arm'
implementation group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: "${versions.ffmpeg}-${versions.javacv}", classifier: 'android-arm64'
implementation group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: "${versions.opencv}-${versions.javacv}"
implementation group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: "${versions.opencv}-${versions.javacv}", classifier: 'android-arm'
implementation group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: "${versions.opencv}-${versions.javacv}", classifier: 'android-arm64'
}

作为lib导入

根据手机具体的cpu架构进行导入

appbuild.gradle

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}

将文件(视具体情况)

  • javacpp.jar
  • javacv.jar
  • openblas.jar
  • openblas-android-arm64.jar
  • opencv.jar
  • opencv-android-arm64.jar
    复制到app/libs/文件夹里

常见错误

  1. cpu架构错误/缺少(需添加-android-arm之类的库)
2019-10-27 16:01:32.439 29256-29322/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.github.crazyorr.ffmpegrecorder, PID: 29256
java.lang.RuntimeException: An error occurred while executing doInBackground()
  1. 没有对opencv初始化
2019-10-27 16:00:43.930 28933-28933/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.javacv, PID: 28933
java.lang.UnsatisfiedLinkError: No implementation found for long org.opencv.core.Mat.n_Mat() (tried Java_org_opencv_core_Mat_n_1Mat and Java_org_opencv_core_Mat_n_1Mat__)
  1. 缺少openblas的相关jar
2019-10-27 15:59:23.158 28618-28618/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.javacv, PID: 28618
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/bytedeco/openblas/presets/openblas;

OpenCV 4.x source code

参考:CSDN

  1. 修改参数

Android Studio的sdk下的ndk:ndk/build/cmake/android.toolchain.cmake(第112行)

elseif(ANDROID_TOOLCHAIN_NAME MATCHES "-[0-9].[0-9]$")
set(ANDROID_TOOLCHAIN clang) # 将gcc改成clang
endif()

opencv 4.x源码:/platforms/android/build_sdk.py(第113行)

self.cmake_vars = dict(
ANDROID_STL="c++_static", # change `gnustl_static` to `c++_static` or `c++_shared`
ANDROID_ABI=self.name,
ANDROID_PLATFORM_ID=platform_id,
)

opencv 4.x源码:/CMakeLists.txt(第426行和429行)(可以根据需要修改)

# OCV_OPTION(BUILD_SHARED_LIBS        "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)" NOT (ANDROID OR APPLE_FRAMEWORK) )
OCV_OPTION(BUILD_SHARED_LIBS "Build shared libraries (.dll/.so) instead of static ones (.lib/.a)" ON ) # 生成动态库
OCV_OPTION(BUILD_opencv_apps "Build utility applications (used for example to train classifiers)" (NOT ANDROID AND NOT WINRT) IF (NOT APPLE_FRAMEWORK) )
OCV_OPTION(BUILD_opencv_js "Build JavaScript bindings by Emscripten" OFF )
OCV_OPTION(BUILD_ANDROID_PROJECTS "Build Android projects providing .apk files" OFF )
# OCV_OPTION(BUILD_ANDROID_PROJECTS "Build Android projects providing .apk files" ON IF ANDROID )
  1. 配置JAVA_HOME

使用Android Studio的JDK位置

export JAVA_HOME=/home/lynx/fuck_mount/AS/jre
  1. 执行platforms/android/build_sdk.py,完成编译
./build_sdk.py --ndk-path {ndk路径} --sdk_path {android sdk路径} {目标位置} {opencv源码位置}
# example
/home/lynx/fuck_mount/opencv_4_1_0/opencv-4.1.0/platforms/android/build_sdk.py --ndk_path /home/lynx/fuck_mount/Android/SDK/ndk/18.1.5063045 --sdk_path /home/lynx/fuck_mount/Android/SDK /home/lynx/fuck_mount/opencv_4_1_0/android_build /home/lynx/fuck_mount/opencv_4_1_0/opencv-4.1.0
  • sdk-path:Android Studio的SDK目录
  • ndk-path:Android Studio的SDK目录下ndk/{ndk版本号文件}

额外说明

不需要额外安装的软件:jdk,ninja-build,ndk.直接使用android studio的即可
不需要安装的软件:ant,ccache

目前还没能成功编译android project

能够混合使用:

  • OpenCV 3.xjava库(配置见上)
  • TODO

常见问题

  1. java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.stitch-sPWgBONIqUrdX9XLB1OY6w==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.stitch-sPWgBONIqUrdX9XLB1OY6w==/lib/arm64, /data/app/com.example.stitch-sPWgBONIqUrdX9XLB1OY6w==/base.apk!/lib/arm64-v8a, /system/lib64, /product/lib64]]] couldn't find "libnative-lib.so"

缺少相应ABI的so库(目前计时在gradle里加入abiFilters也没有用),上述报错是因为没有编译全ABI.ABI配置:opencv-4.x/platforms/android/ndk-18-api-level-21.config.py

Linux

OpenCV source code

目前适用4.x,其余没试过

依赖包

sudo apt install libgtk2.0-dev pkg-config

命令行安装(TODO)

  1. cmake
cd {生成makefile的位置}
cmake {source的位置}
  1. make
cd {生成makefile的位置}
make
  1. make install
make install {安装的位置}

gui安装

参考:CSDN

  1. 安装cmake-gui
sudo apt install cmake-gui
  1. 启动cmake-gui
cd {build二进制文件的目录}
cmake-gui {opencv源代码}
  1. Configure->Unix Makefiles:Use default native compilers->finish

  2. 狂点Configure知道没有红色区域

  3. 赋值

变量名 赋值
CMAKE_BUILD_TYPE Release
CMAKE_INSTALL_PREFIX {自己定的cmake_install路径}
OPENCV_GENERATE_PKGCONFIG 勾选
OPENCV_EXTRA_MODULES_PATH {opencv-contrib}源代码/modules
BUILD_EXAMPLES 勾选
  1. 狂点Configure

  2. Generate,等到Generating done

  3. 在源代码路径make

sudo make -j4 # 具体看有多少cpu
cat /proc/cpuinfo | grep "processor" | wc -l # 查看cpu个数
sudo make install
  1. 配置opencv4.pc(2选1)

    • 修改PKG_CONFIG_PATH:增加{你cmake_install的路径}/lib/(opencv4.pc所在的文件夹路径)
    • (TODO,没试过)复制opencv4.pc/usr/lib/pkgconfig
  2. 配置库路径,(新建)/etc/ld.so.conf.d/opencv.conf

{你cmake_install路径}/lib/ # 自己的lib路径
sudo ldconfig
  1. 编译测试

如果是opencv.pcopencv4改成opencv

pkg-config --modversion opencv4
g++ a.cpp `pkg-config --cflags --libs opencv4` -o test && ./test

常见问题

  1. 在其他项目中用CMake导入OpenCV模块:
    find_package(OpenCV REQUIRED)
    include_directories(${OpenCV_INCLUDE_DIRS})

之后cmake出现By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH ...:

这是由于没有设置环境变量OpenCV_DIR,设置为OpenCV编译后的目录下含有OpenCVConfig.cmake的对应路径

Android开发笔记

Music开发笔记

CSDN:实例
cnblogs:其他几种方式

音乐进度

MediaPlayer

MediaPlayer参数–简书

时长

CSDN:数字格式化

total_time = MainPlayer.player.getDuration();
SimpleDateFormat format = new SimpleDateFormat("mm:ss");

// TODO 更新总时长
tmp = new Date(total_time);
formatTime = format.format(tmp);
MainPlayer.totalTime.setText(formatTime);

进度条

媒体信号

  • 蓝牙

CSDN:配对全过程
CSDN:简易

  • 有线耳机

CSDN

  1. 创建一个继承BroadcastReceiver的类
public class MediaReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {// 重载方法
String action = intent.getAction();
if (action != null) {
MainPlayer.infoLog("action: " + action);// TODO debug
switch (action) {
// 有线耳机状态改变
case Intent.ACTION_HEADSET_PLUG:
int mediaState = intent.getIntExtra("state", 0);// 判断插拔

// 蓝牙连接状态改变
case BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED:// 安卓端主动改变蓝牙状态
int bluetoothState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);// 获取蓝牙状态

// 接收蓝牙/媒体按键信号
case Intent.ACTION_MEDIA_BUTTON:
KeyEvent keyEvent = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);// 获取键码
}
}
}

// receiver注册函数
public void registerReceiver(Context context) {
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
ComponentName name = new ComponentName(context.getPackageName(), MediaReceiver.class.getName());
audioManager.registerMediaButtonEventReceiver(name);
}

public void unregisterReceiver(Context context){
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
ComponentName name = new ComponentName(context.getPackageName(), MediaReceiver.class.getName());
audioManager.unregisterMediaButtonEventReceiver(name);
}
}

注意点:

  • 注册函数的函数名随意,可以在onCreateonResume等函数中调用注册函数
  • BroadcastReceiver子类必须要有无参的构造方法,否则会直接崩溃
  1. 修改AndroidManifest.xml

父节点为application,android:name要和BroadcastReceiver的子类名相同,priority可以不要

<receiver android:name=".MediaReceiver">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.MEDIA_BUTTON"></action>
</intent-filter>
</receiver>
  1. 初始化MediaReceiver
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// 获取蓝牙适配器
receiver = new MediaReceiver(this);// 接收蓝牙信号

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);// 监视蓝牙设备与APP连接的状态
intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
intentFilter.addAction(Intent.ACTION_HEADSET_PLUG);// 监听有线耳机的插拔
intentFilter.addAction(Intent.ACTION_MEDIA_BUTTON);// TODO

registerReceiver(this.receiver, intentFilter);// 注册广播
receiver.registerReceiver(this);// 初始化广播

adb

华为手机配置adb:*#*#2846579#*#*->后台设置->usb端口设置->生产模式

adb devices
adb tcpip 5555
# 拔掉数据线
adb connect 手机ip

若安卓设备显示offline,可能是由于adb版本过低

蓝牙连接管理

无需在AndroidManifest里注册

蓝牙连接

Method createBond = device.getClass().getMethod("createBond");
createBond.setAccessible(true);
result = (Boolean) createBond.invoke(device);
  1. 注意区分已经配对的设备
  2. 特殊的蓝牙设备仍未解决

状态栏部件

显示

  1. 不要使用notify,使用startForeground来启动通知栏
  2. 清除不要使用deleteNotificationChannel,使用stopForeground

通信

  1. 注意不同intent要使用不同的requestCode

  2. 切换到MainActivity,MainActivity要使用singleTask

    Intent intent = new Intent(this, MusicList.class);
    remoteViews.setOnClickPendingIntent(R.id.button_open, PendingIntent.getActivity(this, 6, intent, 0));
  3. 使用空pendingIntent来防止点击通知会消失

桌面部件

Editor开发笔记

获取读写权限

AndroidManifest

<!-- manifest节点下  -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

Activity

String permission = "android.permission.WRITE_EXTERNAL_STORAGE";
int check_result = ActivityCompat.checkSelfPermission(this, permission);// `允许`返回0,`拒绝`返回-1
if (check_result != PackageManager.PERMISSION_GRANTED) {// 没有`写`权限
ActivityCompat.requestPermissions(this, new String[]{permission}, 1);// 获取`写`权限
}

关联文件类型

文本文件

<intent-filter android:scheme="http"
tools:ignore="AppLinkUrlError">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/*"/>
</intent-filter>

修改默认Toast

static public void info(Context context, String log) {
Toast toast = Toast.makeText(context, log, Toast.LENGTH_SHORT);
View view = toast.getView();
view.setBackgroundResource(R.drawable.toast);
TextView textView = view.findViewById(android.R.id.message);
textView.setTextColor(Color.rgb(0xff, 0xff, 0xff));
toast.show();
}

由外部打开文件

Intent intent = getIntent();
String action = intent.getAction();// 判断本activity启动的方式
if (action.equals("android.intent.action.VIEW")) {// 由其他软件打开本软件
}

控制activity数目

<activity android:name=".Editor"
android:launchMode="singleTask">

获取根view

View view = getWindow().getDecorView().findViewById(android.R.id.content);

数据保存

SharedPreferences

SharedPreferences:基于xml的键值对,存储于/data/data/应用程序包/shared_prefs

提示框/窗口

Dialog

参考

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.save_layout);

// 初始化`保存`按钮
yes.setOnClickListener(new View.OnClickListener() {//
});

// 初始化`取消`按钮
cancel.setOnClickListener(new View.OnClickListener() {
});

// 初始化`删除`按钮
no.setOnClickListener(new View.OnClickListener() {
});
}

private void initButton() {
// 初始化按钮
yes = findViewById(R.id.yes_button);
cancel = findViewById(R.id.cancel_button);
no = findViewById(R.id.no_button);
}
myWindow = new MyWindow(MainActivity.this, R.style.save_style);
myWindow.setCanceledOnTouchOutside(false);
myWindow.setOnDismissListener(new DialogInterface.OnDismissListener() {
});
myWindow.show();// TODO 获取点击结果
public class MyWindow extends PopupWindow {
public Button yes;
public Button cancel;
public Button no;
public int result;

public MyWindow(Context context, View view) {
super(context);
this.setContentView(LayoutInflater.from(context).inflate(R.layout.manager_layout, null));
// this.setOutsideTouchable(false);
this.setFocusable(true);// 否则无法进行edittext输入

this.showAsDropDown(view);
this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
this.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
}
}
  • 响应键盘:this.setFocusable(true);,否则无法进行EditText输入

DialogFragment

参考

public class MyWindow extends DialogFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.manager_layout, container);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0x00000000));
return view;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_FRAME, android.R.style.Theme);
}
}
myWindow = new MyWindow();
myWindow.show(getSupportFragmentManager(), "edit");

过期内容

调用系统文件浏览器

1.绑定点击事件

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");// 所有类型文件
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, 1);

2.根据requestCode接收数据

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK) {
if (requestCode == 1) {// `打开`按钮
...
}
}
}
}
  1. Intent.ACTION_GET_CONTENT:用于调用系统程序,比如一个打开一个文件的时候会提示你用哪个软件打开

  2. Intent.setType():设置默认打开格式,如"video/*","audio/amr"

调用相册

Intent intent = new Intent(Intent.ACTION_PICK);//intent  action属性
intent.setType("image/*");
startActivityForResult(intent, 2);

通用框架修改

drawable

添加buttondialog

values

删掉styles,修改colors,添加styles_button(按钮)和styles_tab(工具栏)

manifests

增加权限,删除label,增加android:launchMode="singleTask"

微电子

电路模型和电路定律

电流和电压的参考方向

  • 关联参考方向:电流、电压方向一致
  • 非关联参考方向:电流、电压方向不一致

电功率和能量

在$U,I$为关联参考方向下:

  • $U,I$同号,元件吸收功率
  • $U,I$异号,元件释放功率

电阻元件

线性电阻

电容元件

$dq=Cdv$

电容吸收的功率

电感元件

$d\phi=Ldi$

电压源和电流源

受控电源

控制系数

基尔霍夫定律

  • 支路:组成电路的每一个二端元件称为一条支路
  • 节点:支路的连接点称为节点
  • 回路:由支路构成的闭合路径称为回路

KCL:基尔霍夫电流定律

在集总电路中,任何时刻,对任一节点,所有流出节点的支路电流的代数和恒等于0

KVL:基尔霍夫电压定律

在集总电路中,任何时刻,沿任一回路所有支路电压的代数和恒等于0

电阻电路的等效变换

电路的等效变换

  • 等效电路:对电路的一部分进行简化,用简化的电路替代原电路.代换与被代换部分的电压,电流关系相同.这两部分电路互称等效电路

电阻的串联和并联

桥形连接

当满足条件$R_1R_4=R_2R_3$时,对角线支路中的电流为0,称为电桥处于平衡状态,这一条件也成为电桥的平衡条件

电阻的$Y$形联结和$\Delta$形联结的等效变换

  • $\Delta$形电阻$=\dfrac{Y\text{形电阻两两乘积之和}}{Y\text{形不相邻电阻}}$

$R_{12}=\dfrac{R_1R_2+R_2R_3+R_3R_1}{R_3}$
$R_{23}=\dfrac{R_1R_2+R_2R_3+R_3R_1}{R_1}$
$R_{31}=\dfrac{R_1R_2+R_2R_3+R_3R_1}{R_2}$

  • $Y$形电阻$=\dfrac{\Delta\text{形相邻电阻的乘积}}{\Delta\text{形电阻之和}}$

$R_1=\dfrac{R_{12}R_{31}}{R_{12}+R_{23}+R_{31}}$
$R_2=\dfrac{R_{23}R_{12}}{R_{12}+R_{23}+R_{31}}$
$R_3=\dfrac{R_{31}R_{23}}{R_{12}+R_{23}+R_{31}}$

电压源,电流源的串并联

  • 只有电压相等极性一致的电压源才允许并联,等效电路为其中任一电压源
  • 只有电流相等方向一致的电流源才允许串联,等效电路为其中任一电流源

实际电源的两种模型及其等效变换

  • 电压源转为电流源:$i_s=\dfrac{u_s}{R}$

(含受控源电路的)输入电阻

当一端口无源网络内含有受控源时,可以采用外加电压法外加电流法求得输入电阻之和

电阻电路的一般分析

电路的图

线图(图)

用线段代替电路中的每个元件,线段称为支路,线段的端点称为结点,这样的以线,点组成的几何结构图称为线图或拓扑图,简称,用$G$表示

树,树支,连支

  • 树:包含图$G$的全部结点和部分支路,本身是连通的,不包含回路,用$T$表示
  • 树支:构成树的各支路叫树支
  • 连支:除树支以外的其他支路称为连支

KCL和KVL的独立方程数

  • 对一个节点数为$n$,支路数为$b$的连通图
    • KCL独立方程数为$n-1$个
    • KVL独立方程数等于它的独立回路(连支)数$b-n+1$

支路电流法

  1. 选定各支路电流的参考方向
  2. 对$(n-1)$个独立结点列出KCL方程
  3. 选取$(b-n+1)$个独立回路,指定回路的绕行方向,列出KVL方程

网孔电流法

仅适用于平面电路

回路电流法

  1. 根据给定的电路,通过选择一个树确定一组基本回路,并指定各回路电流的参考方向
  2. 列出回路电流方程
  3. 当电路中优受控源或无伴电流源时,另行处理
  4. 对于平面电路可用网孔电流法

结点电压法

  1. 指定参考结点,其余结点对参考节点之间的电压就是节点电压.通常以参考结点为各节点电压的负极性
  2. 列出节点电压方程
  3. 当电路中有受控源或无伴电压源时需另行处理

电路定理

叠加定理

一个具有唯一解的线性电阻电路,任一处的电压(或电流)是各个独立电源单独作用时在该处产生的电压(或电流)的叠加

齐性定理

线性电路中当所有激励都增大或缩小$N$倍,则电路的相应也将增大或缩小$N$倍

替代定理

戴维宁定理和诺顿定理

戴维宁定理

一个含独立电源,线性电阻和受控源的一端口,对外电路来说,可以用一个电压源与电阻的串联组合来等效.其中电压源的电压等于一端口的开路电压$U_{OC}$,电阻等于一端口的全部独立电源均置0后的输入电阻$R_i$

诺顿定理

一个含独立电源,线性电阻和受控源的二端网络,可以等效为一个电流源和电导的并联组合.电流源的电流等于该网络的短路电流,电导等于该网络全部独立电源置0后的输入电导

动态电路

含有动态元件电容和电感的电路称为动态电路

特点:当动态电路状态发生改变时(换路)需要经历一个变化过程才能达到新的稳定状态.这个变化过程称为电路的过渡过程

过渡过程产生的原因:电路内部含有储能元件$L,C$,电路在换路时能量发生变化,而能量的存储和释放都需要一定的时间来完成

动态电路的方程

含有一个动态元件电容或电感的线性电路,其电路方程为一阶线性常微分方程,称一阶电路
含有两个动态元件的线性电路,其电路方程为二阶线性常微分方程,称二阶电路
结论

  • 描述动态电路的电路方程为微分方程
  • 动态电路方程的阶数通常等于电路中动态元件的个数

动态电路的初始条件

换路定律

换路瞬间,若电容电流保持为有限值,则电容电压(电荷)换路前后保持不变
换路瞬间,若电感电压保持为有限值,则电感电流(磁链)换路前后保持不变

正弦电路

同频率正弦量的相位差

$\phi=\psi_i-\psi_u$

  • $\psi < 0,u$超前$i$ $\phi$角($u$比$i$先到达最大值)

同相,反相

周期性电流,电压的有效值

电压有效值$U=\sqrt{\dfrac{1}{T}\int_0^Tu^2(t)dt}=\dfrac{1}{\sqrt{2}}U_m$

正弦稳态电路的功率

$u(t)=\sqrt{2}U\sin\omega t,i(t)=\sqrt{2}I\sin(\omega t-\phi)$

  • 平均功率:$P=\dfrac{1}{T}\int_0^Tpdt=UIcos\phi$,表示电路实际消耗的功率,亦称为有功功率
  • 无功功率:$Q=UI\sin\phi$,反映网络与外电路交换功率的大小,是由储能元件$L,C$的性质决定的.单位:var(乏)
  • 视在功率(表观功率):$S=UI$,反映含源一端口的做功能力,反映电气设备的容量.单位:$VA$(伏安)

R,L,C元件的有功功率和无功功率

对电阻,$u,i$同相,故$Q=0$,电阻只吸收(消耗)功率,不发出功率

  • $P_R=UI\cos\phi=UI\cos0$
  • $Q_R=UI\sin\phi=UI\sin0$

对电感,$u$领先$i$ 90,故$P_L=0$,即电感不消耗功率.由于$Q_L > 0$,故电感吸收无功功率

  • $P_R=UI\cos\phi=UI\cos90$
  • $Q_R=UI\sin\phi=UI\sin90$

对电容,$i$领先$u$ 90,故$P_C=0$,即电容不消耗功率.由于$Q_C < 0$,故电容发出无功功率

电感,电容的无功补偿作用

当$L$发出功率时,$C$刚好吸收功率,则与外电路交换功率为$p_L+p_C$.因此$L,C$的无功具有互相补偿的作用

有功,无功,视在功率的关系

$S=\sqrt{P^2+Q^2}$

功率因数提高

设备容量$S$(额定)向负载送多少有功要由负载的阻抗角决定:$P=S\cos\phi$

功率因数低带来的问题:

  1. 设备不能充分利用,电流到了额定值,但功率容量还有
  2. 当输出相同的有功功率时,线路上的电流大,线路压降损耗大

解决办法:并联电容,提高功率因数(改进自身设备)

  • $P_R=UI\cos\phi=UI\cos0$
  • $Q_R=UI\sin\phi=UI\sin0$

半导体物理基础

本征半导体,空穴及其导电作用

  • 本征激发:当半导体受热或光照激发时,某些电子从外界获得足够的能量而挣脱共价键的束缚,离开原子成为自由电子,同时在共价键中留下相同数量的空穴

  • 空穴:共价键中的空位

  • 电子空穴对:由热激发而产生的自由电子和空穴对

杂质半导体

P型半导体

  • 参入3价杂质元素(如硼,镓和铟)的半导体

  • 空穴(p)是多数载流子(多子),它主要由掺杂形成;自由电子(n)是少数载流子(少子),由热激发形成

  • 空穴很容易俘获电子,使杂质原子成为负离子.3价杂质因而也称为受主杂质($N_A$)
    $$ N_A + n = p $$

N型半导体

  • 参入5假杂质元素(如)的半导体

  • 自由电子(n)是多数载流子,主要由杂质原子提供;空穴(p)是少数载流子,由热激发形成

  • 提供自由电子的5价杂质原子因带正电荷而成为正离子.因此5价杂质原子也称为施主杂质($N_D$)
    $$ n = p + N_D $$

载流子的漂移与扩散

  • 漂移电流:在电场作用下,载流子(自由电子/空穴)在电场作用下的漂移运动形成的电流

  • 扩散电流:因浓度差,载流子从浓度高处向浓度低处扩散运动,形成的电流

PN结

对于P型半导体和N型半导体的结合面,离子薄层形成的空间电荷区称为PN结

在空间电荷区,由于缺少多子,所以也称耗尽层

PN结的单向导电性

  • 当外加电压使PN结中P区的电位高于N区的电位,称为加正向电压,简称正偏;反之称为加反向电压,简称反偏

  • 反向饱和电流:TODO

  • PN结加正向电压时,呈现低电阻,具有较大的正向扩散电流

  • PN结加反向电压时,呈现高电阻,具有很小的反向漂移电流

  • PN结$V$-$I$特性表达式:$i_D=I_S(e^{v_D/V_r}-1)$

PN结的反向击穿

TODO

PN结的电容效应

  • 扩散电容$C_D$:TODO

  • 势垒电容$C_B$:TODO

二极管

二极管的$V$-$I$特性

二极管的伏安特性曲线可表示:$i_D=I_S(e^{v_D/V_T}-1)$

TODO:硅,锗

二极管的主要参数

  • 最大整流电流$I_F$

  • 反向击穿电压$V_{BR}$和最大反向工作电压$V_RM$

  • 反向电流$I_R$在室温下,最大反向工作电压下的反向电流值.硅二极管的反向电流一般在$nA$级;锗二极管在$\mu A$级

  • 极间电容$C_d=C_B+C_D$

  • 反向恢复时间$T_{RR}$

  • 正向压降$V_F$:在规定的正向电流下,二极管的正向电压降

二极管电路的简化模型分析方法

理想模型

恒压降模型

管压降恒定:

  • 硅管0.7V
  • 锗管0.3V

折线模型

硅管:

  • 门槛电压$V_{th}=0.5V$
  • 导通电流为1$mA$时,管压降为$0.7V$
  • $r_D=200\Omega$

小信号模型

常温下(300K)$r_d=\dfrac{V_T}{I_D}=\dfrac{26(mV)}{I_D}$

TODO

半导体三极管

三极管的结构和符号

  • 集电极,集电区,集电结
  • 基极,基区
  • 发射极,发射区,发射结

放大状态下三极管的工作原理

实现放大的外部条件:发射结正偏,集电结反偏

实现放大的内部条件:发射区杂质浓度远大于基区杂质浓度,且基区很薄

共基极直流放大系数$\bar{\alpha}=\dfrac{\text{传输到集电极的电流}}{\text{发射极注入电流}}=\dfrac{I_{C}-I_{CBO}}{I_{E}}\approx\dfrac{I_C}{I_E}$

共射极直流放大系数$\bar{\beta}=\dfrac{\bar{\alpha}}{1-\bar{\alpha}}$

反向饱和电流/穿透电流$I_{CEO}=(1+\bar{\beta})I_{CBO}$

当$I_C >> I_{CEO}$时,忽略$I_{CEO}$,则$\bar{\beta}\approx\dfrac{I_C}{I_B}$

三极管的三种组态

  • 共发射极接法:CE
  • 共基极接法:CB
  • 共集电极接法:CC

BJT的$I$-$V$特性曲线

输入特性曲线

$$i_B=f(v_{BE})|_{v_{CE}=const}$$

  • 死区
  • 非线性区
  • 近似线性区

输出特性曲线

$$i_C=f(v_{CE})|_{i_B=const}$$

  • 饱和区:$i_C$明显受$v_{CE}$控制的区域,该区域内,一般$v_{CE} < 0.7V$(硅管).此时,发射结正偏,集电结正偏或反偏电压很小
  • 截止区:$i_C$接近0的区域,相当$i_B=0$的曲线的下方.此时,$v_{BE}$小于死区电压
  • 放大区:$i_C$平行于$v_{CE}$轴的区域,曲线基本平行等距.此时,发射结正偏,集电结反偏

BJT的主要参数

  1. 电流放大系数

    • 共发射极直流电流放大系数$\bar{\beta}=\dfrac{I_C-I_{CEO}}{I_B}\approx\dfrac{I_C}{I_B}|_{v_{CE}=const}$

    • 共发射极交流电流放大系数$\beta=\dfrac{\Delta I_C}{\Delta I_B}|_{v_{CE}=const}$

    • 共基极直流电流放大系数$\bar{\alpha}=\dfrac{I_C-I_{CBO}}{I_E}\approx\dfrac{I_C}{I_E}$

    • 共基极交流电流放大系数$\alpha=\dfrac{\Delta I_C}{\Delta I_E}|_{v_{CB}=const}$
      当$I_{CBO}$和$I_{CEO}$很小时,$\bar{\alpha}\approx\alpha,\bar{\beta}\approx\beta$,可以不加区分

  2. 极间反向电流

  3. 极限参数

    • 集电极最大允许电流$I_{CM}$
    • 集电极最大允许功率损耗$P_{CM}=I_CV_{CE}$
    • 反向击穿电压
    • $V_{(BR)CBO}$:发射极开路时的集电结反向击穿电压
    • $V_{(BR)EBO}$:集电极开路时的发射结的反向击穿电压
    • $V_{(BR)CEO}$:基极开路时的集电极和发射极间的击穿电压

温度对BJT参数及特性的影响

温度对BJT参数的影响

温度对BJT特性曲线的影响

三极管放大电路

共射极放大电路的工作原理

静态

动态

BJT放大电路的图解分析法

静态工作点的图解分析

动态工作情况的图解分析

静态工作点对波形失真的影响

放大电路的动态范围

温度对工作点的影响

  1. 温度变化对$I_{CBO}$的影响

$I_{CBO}=I_{CBO(T_0=25^{\circ}C)}\cdot e^{k(T-T_0)}$

温度$T$上升$\to$输出特性曲线上移

  1. 温度变化对输入特性曲线的影响

$V_{BE}=V_{BE(T_0=25^{\circ}C)}-(T-T_0)\times2.2\times10^{-3}V$

温度$T$上升$\to$输入特性曲线左移

  1. 温度变化对$\beta$的影响

温度每升高1$^{\circ}C,\beta$要增加$0.5\%\sim1.0\%$

温度$T$上升$\to$输出特性曲线族间距增大

基极分压式射极偏置电路

TODO

场效应管

场效应管的分类

  1. MOSFET(IGFET)绝缘栅型
    1. 增强型
      • N沟道
      • P沟道
    2. 耗尽型
      • N沟道
      • P沟道
  2. JFET结型(耗尽型)
    1. N沟道
    2. P沟道

耗尽型:场效应管没有加偏置电压时,就有导电沟道存在
增强型:场效应管没有加偏置电压时,没有导电沟道

N沟道增强型MOSFET

结构

  • 源极$s$
  • 栅极$g$
  • 漏极$d$

工作原理

  1. $V_{GS}$对沟道的控制作用
    • 当$V_{GS}\le0$时
      无导电沟道.$d,s$间加电压时,也无电流产生
    • 当$0 < V_{GS} < V_{TN}$时
      产生电场,但未形成导电沟道(反型层),$d,s$间加电压后,没有电流产生
    • 当$V_{GS} > V_{TN}$时
      在电场作用下产生导电沟道,$d,s$间加电压后,将有电流产生.$V_{GS}$越大,导电沟道越厚

$V_{TN}$:N沟道增强型MOSFET开启电压

  1. $V_{DS}$对沟道的控制作用
    当$V_{GS}$一定($V_{GS} > V_{TN}$)时

    • $V_{DS}$增加$\to I_D$增加$\to$沟道电位梯度增加$\to$靠近漏极$d$处的电位升高$\to(d)$电场强度减小$\to(d)$沟道变薄
    • 当$V_{DS}$增加到使$V_{GD}=V_{TN}$时,在紧靠漏极处出现预夹断
    • 预夹断后,$V_{DS}$增加$\to$夹断区延长$\to$沟道电阻增加$\to I_D$基本不变
  2. $V_{DS}$和$V_{GS}$同时作用时
    $V_{DS}$一定,$V_{GS}$变化时,给定一个$V_{GS}$,就有一条不同的$i_D$-$V_{DS}$曲线

$I$-$V$特性曲线

输出特性$i_D=f(V_{DS})|_{V_{GS}=const}$

  1. 截止区
  2. 可变电阻区(非饱和区)
  3. 饱和区(恒流区,放大区)

转移特性$i_D=f(V_{GS})|_{V_{DS}=const}$

N沟道耗尽型MOSFET

P沟道MOSFET

沟道长度调制等几种效应

MOSFET的主要参数

JFET的结构和工作原理

结构

  • 源极$s$
  • 栅极$g$
  • 漏极$d$

工作原理

  1. $V_{GS}$对沟道的控制作用
    当$V_{GS} < 0$时:PN结反偏$\to$耗尽层加厚$\to$沟道变窄
    $V_{GS}$继续减小,沟道继续变窄
    当沟道夹断时,对应的栅源电压$V_{GS}$称为夹断电压$V_P$或$V_{GS(off)}$
    对于N沟道的JFET,$V_P < 0$

  2. $V_{DS}$对沟道的控制作用
    当$V_{GS}=0$时:$V_{DS}$增加$\to g,d$间PN结的反向电压增加,使靠近漏极处的耗尽层加宽,沟道变窄,从上至下呈楔形分布
    当$V_{DS}$增加到使$V_{GD}=V_P$时,在紧靠漏极处出现预夹断.此时$V_{DS}$增加$\to$夹断区延长$\to$沟道电阻增加$\to i_D$基本不变

  3. $V_{GS}$和$V_{DS}$同时作用时
    当$V_P < V_{GS} < 0$时,导电沟道更容易夹断,对于同样的$V_{DS},i_D$的值比$V_{GS}=0$时的值要小
    在预夹断处:$V_{GD}=V_{GS}-V_{DS}=V_P$

JFET的特性曲线及参数

  1. 输出特性

  2. 转移特性

  3. 主要参数

FET和BJT重要特性的比较

放大电路模型

模拟信号和数字信号

放大电路

放大电路的符号及模拟信号放大

放大电路模型

电压放大模型

$A_v=\dfrac{v_o}{v_i}=A_{vo}\dfrac{R_L}{R_o+R_L}$

  1. 负载大小会影响增益的大小
  2. 减小负载的影响
  3. 减小输入回路对信号的衰减影响

电流放大模型

$A_i=\dfrac{i_o}{i_i}=A_{is}\dfrac{R_o}{R_o+R_L}$

  1. 减小负载的影响
  2. 减小对信号源的衰减

互阻放大模型

互导放大模型

隔离放大电路模型

放大电路的主要性能指标

输入电阻

$R_i=\dfrac{v_i}{i_i}$

决定了放大电路从信号源吸取信号幅值的大小

  • 电压放大和互导放大->输入信号为电压-> $R_i$大
  • 电流放大和互阻放大->输入信号为电流-> $R_i$小

输出电阻

$R_o=\dfrac{v_t}{i_t}|_{v_s=0,R_L=\infty}$

决定了放大电路带负载的能力

  • 电压放大和互阻放大->输出信号为电压-> $R_o$小
  • 电流放大和互导放大->输出信号为电流-> $R_o$大

增益

  • 电压增益$A_v=\dfrac{v_o}{v_i}$
  • 电流增益$A_i=\dfrac{i_o}{i_i}$
  • 互阻增益$A_r=\dfrac{v_o}{i_i}$
  • 互导增益$A_g=\dfrac{i_o}{v_i}$

其中$A_v,A_i$常用分贝$(dB)$表示

  • 电压增益$=20\lg|A_v|$
  • 电流增益$=20\lg|A_i|$
  • 功率增益$=10\lg A_p$

频率响应及带宽

在输入正弦信号下,输出随输入信号频率连续变化的稳态相应,称为放大电路的频率响应

电压增益可表示为$\dot{A}_V(j\omega)=\dfrac{\dot{V}_o(j\omega)}{\dot{V}_i(j\omega)}=|\dfrac{\dot{V}_o(j\omega)}{\dot{V}_i(j\omega)}|\angle[\varphi_o(\omega)-\varphi_i(\omega)]$
其中$A_V(\omega)=|\dfrac{\dot{V}_o(j\omega)}{\dot{V}_i(j\omega)}|$称为幅频响应,$\angle\varphi=\phi_o(\omega)-\varphi_i(\omega)$称为相频响应

TODO

非线性失真

mysql笔记

通用

建表

create table if not exists customers(
cid char(4) not null,
cname char(20) not null,
city char(20),
discnt real,
primary key ( cid )
) character set = utf8 -- 支持中文;

修改并查看注释(comment)

alter table customers
change column cid
cid char(4) not null comment '编号',
change column cname
cname char(20) not null comment '姓名',
change column city
city char(20) comment '城市',
change column discnt
discnt real comment '折扣';
show full columns from customers;

insert去重

  • ignore
insert ignore into table (column)
values
...
  • on duplicate key update

TODO

  • replace into

TODO

更新表数据

update table_name set item="shit" where fuck="fuck";

每组前n

参考

计算时间差

SELECT TIMESTAMPDIFF(MONTH,'2009-10-01','2009-09-01');
SELECT TIMESTAMPDIFF(MONTH,'2009-10-01','2009-09-01') as a;

其中MONTH部分可以更改为

  • SECOND
  • MINUTE
  • HOUR
  • DAY
  • MONTH
  • YEAR

其他

添加用户

insert

use mysql
insert into user ( Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, Event_priv, Trigger_priv, Create_tablespace_priv, ssl_type, ssl_cipher, x509_issuer, x509_subject, max_questions, max_updates, max_connections, max_user_connections, plugin, authentication_string, password_expired, password_last_changed, password_lifetime, account_locked )
values
('localhost', 'niabie', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', '', '', '', '', 0, 0, 0, 0, 'mysql_native_password', password(''), 'N', '2019-11-07 15:17:00', null, 'N');
flush privileges;# 更新

用户具有创建数据库等的权限

create

参考

create user lynx;
update user set Host='localhost', authentication_string=password('1111') where User='lynx';
flush privileges;# 更新
grant all on database.table to 'lynx'@'localhost';# 分配database的table权限给用户
show grants for lynx@localhost;# 显示用户权限

用户没有创建数据库的权限

其他

  • 创建数据库并选择
create database homework3;
show databases;
use homework3;
show tables;
  • 查看版本等
select version();
select now();
select user();
  • 查看端口
show variables like 'port';
gcc笔记

参数

the dynamic linking library,如果程序中使用dlopen,dlsym,dlclose,dlerror**加载动态库,需要设置选项-ldl

查看可执行文件以来的动态链接库

ldd a.out

添加库/头文件

CSDN

  • 显示系统信息
uname -r
  • 安装内核头文件
sudo apt install linux-headers-5.0.0-36-generic # 你的版本号
  • 定位头文件
locate slab.h
  • 查找头文件
sudo apt install apt-file
sudo apt-file update
apt-file search ".h"
jni笔记

jnijava间的交互

jni获取/修改jobject成员

参考:CSDN

javac变量转换

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString)
{
const char *nativeString = (*env)->GetStringUTFChars(env, javaString, 0);
(*env)->ReleaseStringUTFChars(env, javaString, nativeString);
}

javaString[]->c

参考:CSDN

public native void sendString(String[] imgPaths);// 函数声明
JNIEXPORT void JNICALL
Java_com_example_stitch_MainActivity_sendString(
JNIEnv *env,
jobject thiz,
jobjectArray imgPaths) {
// 获取String数组长度
jsize str_len = env->GetArrayLength(imgPaths);

for (int i = 0; i < str_len; i ++) {
jstring tmp = (jstring) env->GetObjectArrayElement(imgPaths, i);
const char *img_path = env->GetStringUTFChars(tmp, 0);

LOG("img[%d]: %s", i, img_path);
}
}

javaMat->cMat

public native void findPoint(String imgPath, long result);// 函数声明

... {// 函数调用
findPoint(appPath + "/img0.png", matBGR.getNativeObjAddr());
}
extern "C"
JNIEXPORT void JNICALL
Java_com_example_stitch_MainActivity_findPoint(
JNIEnv *env,
jobject thiz,
jstring imgPath,
jlong result) {
*(Mat *)result = mat.clone();// 一定要用clone()
umat.copyTo(*(Mat *)result);
}

jni的opencvmat与javaBitmap互转

参考:简书

jni新建图片返回到java

TODO

参考
stackoverflow

cmake笔记

变量

命令行参数传递

参考:CSDN

环境变量

ubuntu使用

零散笔记

重启驱动

  • 重启触摸板驱动
sudo modprobe -r psmouse
sudo modprobe psmouse

sudo rmmode psmouse
sudo modprobe psmouse

xinput list
xinput --disable {编号}
xinput --enable {编号}

在文件夹中执行脚本

文件$\to$首选项$\to$行为$\to$可执行文本文件

快捷键

不要出现fn+super的组合

截屏

  • 复制截图到剪切板:ctrl+print
  • 复制窗口截图到剪切板:ctrl+alt+print
  • 复制选区截图到剪切板:shift+ctrl+print
  • 保存截图到图片:print
  • 保存窗口截图到图片:alt+print
  • 保存选区截图到图片:shift+print
  • 录屏:shift+ctrl+alt+r

禁用快捷键

backspace

热点

nm-connection-editor

设置$\to$wifi$\to$打开wifi热点

误删PATH救急

  • Linux通用?
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:$PATH

不要忘记加:PATH

安装字体

sudo mkdir /usr/share/fonts/{name}
sudo cp {font}.ttf /usr/share/fonts/{name}
cd /usr/share/fonts/{name}
sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fv

文件编码


功能性软件

文件管理器

由于ubuntu自带的文件管理器太睿智,推荐以下文件管理器

  • pcmanfm
  • nemo
  • thunar
  • dolphin

修改默认文件管理器

TODO:/etc/gnome/defaults.list(直接修改好像没用)

# what's the current default file manager?
xdg-mime query default inode/directory

# set nautilus as a default file manager
xdg-mime default nautilus.desktop inode/directory # application/x-gnome-saved-search

软件对应/usr/share/applications下的desktop

mathematica

报错

CRITICAL FAILURE: PrintIntroduction() Error
$ProductTitle not defined.

路径不能有空格

一个解决包依赖问题的软件

sudo apt install aptitude
  • (示例)卸载libreoffice
sudo aptitude purge libreoffice6.0

字体编辑

sudo add-apt-repository ppa:fontforge/fontforge
sudo apt-get update
sudo apt-get install fontforge

修改字体名称

  1. 打开字体文件
  2. 基础->字体信息
  3. 文件->生成字体->(可选)选择TrueType(ttf)

图像编辑

sudo apt install gimp
sudo apt install krita
sudo apt install krita-l10n

图像转换

sudo apt install sam2p
sam2p shit.png shit.gif

gif录屏

  • byzanz
sudo apt install byzanz 
byzanz-record --duration=50 --delay=3 --x=1030 --y=100 --height=500 demo1.gif

桌面便签(Indicator Stickynotes)

sudo add-apt-repository ppa:umang/indicator-stickynotes
sudo apt-get update
sudo apt-get install indicator-stickynotes

下载器(TODO)

  • wget:单线程
  • curl:单线程
  • axel:多线程
  • aria2:可以设置线程
  • mwget:多线程版wget
  • Prozilla:多线程,cmd,gui
  • Downloader for X:多线程,gui
  • MyGet:多线程
  • Linuxdown:多线程,cmd
  • Transmission:磁力,gui(不会用)
  • Uget:cURL+aria2

基本没用

屏幕管理

  • arandr
sudo apt install arandr

镜像源

/etc/apt/sources.list

  • ubuntu 19.04
deb http://cn.archive.ubuntu.com/ubuntu/ disco main restricted
deb http://cn.archive.ubuntu.com/ubuntu/ disco-updates main restricted
deb http://cn.archive.ubuntu.com/ubuntu/ disco universe
deb http://cn.archive.ubuntu.com/ubuntu/ disco-updates universe
deb http://cn.archive.ubuntu.com/ubuntu/ disco multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ disco-updates multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ disco-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu disco-security main restricted
deb http://security.ubuntu.com/ubuntu disco-security universe
deb http://security.ubuntu.com/ubuntu disco-security multiverse
  • 中科大
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
  • 清华
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
  • 网易
deb http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ bionic-backports main restricted universe multiverse
  • 阿里
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

apt

系统监视器安装

sudo apt install gnome-system-monitor
Android Studio笔记

安装

官方文档

Linux

  • 运行程序:android-studio/bin/studio.sh

  • 64位机器需要安装32位库

sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 lib32z1 libbz2-1.0:i386
  • 向前/后跳转:alt+shift+left/right

汉化

教程

汉化包

其他(TODO)

windows

配置文件夹位置:C:/Users/lynx/.AndroidStudio3.5

增加虚拟设备:Tools->AVD Manager

android device monitor位置:E:\Android\Sdk\tools\monitor.bat

memory monitor 打开:Run->Profiler

解决网络问题:Configure->Setting->System Setting->HTTP Proxy->Auto-detect proxy settings

布局编辑器打开:打开一个xml文件->底部选择Design

Linux

清除缓存:Build->Clear Project

常见错误

  1. Android resource linking failed

查看app的gradle有没有缺少implementation

数据库

8 关系数据库的规范化理论

8.2.1 函数依赖

  • 完全函数依赖

  • 部分函数依赖

  • 主属性集

  • 非主属性集

属性集闭包的计算

寻找关系模式$R(U,F)$的关键字$K$

8.2.2 与函数依赖有关的范式

  • 第一范式

  • 第二范式

  • 第三范式

  • BCNF

模式分解的方法

8.2.3 多值依赖与第四范式

  • 多值依赖

  • 第四范式

8.3.1 函数依赖理论

  • 最小函数依赖集/最小覆盖

寻找与函数依赖集$F$等价的最小函数依赖集$G$

8.3.2 模式分解的研究

  • 无损连接性:分解后,原关系中的信息不会被丢失

  • 依赖保持性:原有的函数依赖关系在分解后的关系模式上依然存在

  • 无损联接性的充要条件:$\rho={R_1, R_2}:R_1\cap R_2\to(R_1-R_2)$或$R_1\cap R_2\to(R_2-R_1)$

到3NF的分解算法

stitch笔记

代码分析

特征点查找

默认使用orb算法,默认情况下还能够支持akaze算法.在安装了扩展模块后还能选择surfsift算法

computeImageFeatures

特征点匹配

匹配方法的选择

  • homography

默认调用BestOf2NearestMatcher,可选BestOf2NearestRangeMatcher

  • affine

调用AffineBestOf2NearestMatcher.使用该方法进行匹配时会多丢弃一些图片

舍弃认为不属于同一张全景图的图片

leaveBiggestComponent

相机参数评估

estimate::estimate

  • AffineBasedEstimator

  • 默认HomographyBasedEstimator

焦距评估:当评估计算得到多个焦距f时,可取这些f的中位数作为所有相机的焦距

计算最大生成树:以中心节点的图像为基准,计算其他图像与该图像的旋转矩阵

BundleAdjusterBase::estimate

基于以上方法,我们得到了相机的内外参数,但这样得到的参数忽略了多个图像间的约束,而且会产生累计误差.这时,我们就需要用到光束平差法(Bundle Adjustment)来精确化相机参数

  • BundleAdjusterReproj:光束平差法的重映射方法

  • 默认BundleAdjusterRay:光束平差法的射线发散方法

  • BundleAdjusterAffinePartial

细化相机参数

波形矫正

光束平差法会引起波形效应,即拼接的图像会呈现蛇形分布,这是因为真实拍摄相片时不大可能都保持水平而不倾斜的

waveCorrect

图像投影变换

  • PlaneWarper
  • AffineWarper
  • CylindricalWarper:柱面
  • 默认SphericalWarper:球面
  • FisheyeWarper
  • StereographicWarper
  • 还有一堆

曝光补偿

对每幅图像进行曝光补偿,来使所有图像具有相同的曝光程度

ExposureCompensator

寻找接缝线

重叠部分最相似的像素的连线

接缝线有三个限制条件

  1. 如果重叠区域是宽大于高,则接缝是横向走向的,而如果重叠区域是宽小于高,则接缝是纵向走向的.所以要保证接缝线要有一定的长度
  2. 如果是横向的接缝,则不允许有绝对垂直的接缝线,而如果是纵向的接缝,则不允许有绝对水平的接缝线
  3. 三是重叠区域是矩形,接缝线从矩形的一边出发,必须到达与该边平行的另一边结束。

逐点法,动态规划法和图割法

图片融合

羽化

多频段融合

参数说明

matcher:匹配方式?
rangewidth:限制图片匹配的数目?
ba:拼接图像时的cost函数?
warp:投影变换
wave_correct:波形矫正
seam:寻找接缝线的方法
blend:图像融合方式

vscode笔记

插件说明

插件位置

  • Linux:~/.vscode/

部分插件使用

C/C++ IntelliSense

  • Intelli Sense Cache Size(TODO)

软件设置

快捷键

Linux

  • 从定义处跳回:ctrl+alt+-

settings.json

  • Linux:~/.config/Code/User/

快捷键设定(settings.json)

  • 列选快捷键:"editor.multiCursorModifier":"alt"
Makefile笔记

make默认只执行第一条命令

CC       := gcc
CFLAGS := -lpthread -g
TARGETS := shit
INC := $(shell find -L ./ -name "*.h")

a:
gcc a.c ${INC} $(par) ${CFLAGS} -o shit # example: make a run par="-O2"

run:
./shit

clean:
rm ./shit

fuck:
@echo $(par) # example: make fuck par="fuck you"

dump:
objdump ./shit -S > fuck

gdb:
gdb ./shit -tui

cgdb:
cgdb ./shit
  • 头文件
SRCS    := $(shell find ./src/ -maxdepth 1 -name "*.cpp")
INC := -I./include
CFLAGS := -Wall -Werror

run:
g++ $(CFLAGS) $(INC) $(SRCS) -o md_parser
./md_parser
Linux命令笔记

当前目录,只保留file

  • xargs
find /当前目录 -type f ! -name "file"|xargs rm -f
  • find自带命令
find /当前目录 -type f ! -name "file" -exec rm -f {} \

递归删除

.java

find ./ -name "*.java" | xargs rm -rfv

批量修改文件名

rename 's/原内容/改后内容/' *

打包

tar czvf FileName.tar DirName
  • 计算目录大小
du -h --max-depth=1 .
  • 合并文件夹
cp -frp new/* old/

-f强制覆盖,-r递归,-p保持新文件的属性不变

dpkg

  • 查找已装软件?
dpkg -l|grep filename
  • 卸载软件
dpkg -r filename

或?

dpkg -P filename
  • 彻底删除标识为rc的配置信息

rc:软件已卸载,配置文件还在

dpkg -l | grep ^rc | cut -d' ' -f3 | sudo xargs dpkg --purge

目录分析(du)

示例

du -d1 -b -a .
du -d0 -m .

cat

  • 输出固定行数
cat $file | head -n +6
```

[详细](https://blog.csdn.net/NFR413/article/details/78966085)

## curl

- 下载`$file`

```bash
curl -O $pathtofile
  • 命令行中输出表达式的值
echo $[1 == 2]

Linux的算术运算

进程

  • 切换到后台
<ctrl+z>
  • 查看后台进程
jobs
  • 使第N个进程在前台/后台运行
fg %N
bg %N

不加N默认对最后一个进程操作

ctags

  • vim设定源

固定

set tags=$path

先当前目录,后向上找

set tags=tags;
set autochdir

ln链接

  • 文件夹软链接
ln -s $exists $new

wc统计行数

find -maxdepth 10 -type f | xargs wc -l
wc -l `find -name '*.*'`

更改用户/权限

sudo chmod -R 777 *
sudo chown -R user * # sudo chown -R user:usergroup *

parallel并行(TODO)

参考

svg笔记

外部svg

svg引入外部css

TODO

html引入外部svg

  1. embed
  2. img
  3. iframe
  4. object:<object type="image/svg+xml" data="image.svg"></object>
  5. css:background-image
  6. css内联svg(好像没用):参考

文件格式笔记

文件头

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg viewBox="0 0 50 50" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3156"
xmlns:xlink="http://www.w3.org/2010/svg" width="50" height="50">
</svg>
  • 参数说明
    • xmlns
    • viewBox

元素说明

参考:w3cplus

  • def
  • symbol
  • g

内联svg

属性说明

  • 关于描边
    • stroke-dasharray
    • stroke-linecap
    • stroke-linejoin
rss笔记

用javascript生成rss

stackoverflow

html笔记

<canvas>放缩及调整位置

<canvas id = "canvas" width = "300" height = "300" style = "width:200px; height:200px; left:60px"></canvas>

表格固定宽度

<style>
table
th:first-of-type {width: 200px;}
th:nth-of-type(2) {width: 200px;}
</style>

表格自适应宽度

<script>
window.onresize = my_resize;
window.onload = my_resize;
function my_resize(){
var x = window.innerWidth;
sheet = document.getElementById('my_table').sheet;
if (window.innerWidth < 950){
sheet.addRule('table th:first-of-type, table th:nth-of-type(2)',
'width: ' + x/7 + 'px;');
}else{
sheet.addRule('table th:first-of-type, table th:nth-of-type(2)',
'width: ' + x/15 + 'px;');
}
}
</script>

js修改css

document.styleSheets[0].addRule('.box', 'height: 100px');
document.styleSheets[0].insertRule('.box {height: 100px}', 0);

参考
w3plus

元素里面的文字也算子节点

js提取元素

div大小放缩示例

<head>
<script type="text/javascript">
function mouse() {
var direct = 0;
e = window.event;
if (e.wheelDelta) { //判断浏览器IE,谷歌滑轮事件
if (e.wheelDelta > 0) { //当滑轮向上滚动时
change(1);
}
if (e.wheelDelta < 0) { //当滑轮向下滚动时
change(-1);
}
} else if (e.detail) { //Firefox滑轮事件
if (e.detail > 0) { //当滑轮向上滚动时
change(1);
}
if (e.detail < 0) { //当滑轮向下滚动时
change(-1);
}
}
}

function change(num) {
var b1 = document.getElementById('b1');
var bit = b1.width/b1.height;
if (num == 1) {
b1.src = "/i/eg_mouse.jpg";
b1.width += 2*bit;
b1.height += 2;
if (b1.style.left == "") {
b1.style.left = "-" + bit + "px";
b1.style.top = "-1px";
} else {
var temp = (Number(b1.style.left.replace(/px/, "")) - 1*bit).toString() + "px";
// 注意toString加括号
b1.style.left = temp;
var temp = (Number(b1.style.top.replace(/px/, "")) - 1).toString() + "px";
b1.style.top = temp;
}
} else {
b1.src = "/i/eg_mouse2.jpg"
b1.width -= 2*bit;
b1.height -= 2;
if (b1.style.left == "") {
b1.style.left = bit + "px";
b1.style.top = "1px";
} else {
var temp = (Number(b1.style.left.replace(/px/, "")) + 1*bit).toString() + "px";
b1.style.left = temp;
var temp = (Number(b1.style.top.replace(/px/, "")) + 1).toString() + "px";
b1.style.top = temp;
}
}
}
</script>
</head>

<body>
<a href="http://www.w3school.com.cn" onmousewheel="mouse()">
<img alt="Visit W3School!" src="/i/eg_mouse2.jpg" id="b1" style="position: fixed; top: 100px; left: 100px;" width="200px" height="100px" />
<!-- 不要把width写进style -->
</a>
</body>
spring笔记

页面跳转

TODO

参数传递

前端->后端

url参数传递

会伴随页面跳转

  • 前端

访问url:/index?aid=111

  • 后端
@RequestMapping(...)
public String app(@RequestParam(value = "aid", required = false) String aid) {
;
}

form表单参数传递

会伴随页面跳转

  • 前端
<form action="...">
<input name="uid"></input>
</form>
  • 后端
@RequestMapping(...)
public String app(String uid) {
;
}

或者

class User {
String uid;
public void setUid(String uid) {
this.uid = uid;
}
}

@RequestMapping(...)
public String app(User user) {
String uid = user.uid;
}

ajax参数传递

页面不会跳转

  • 前端
$.ajax({ // 获取用户所有app
type: "post",
url: "/action/sign_in",
data: {
"uid": uid,
"password": password
},
success: function (get) {
console.log("signin: " + get);
}
});
  • 后端
@RequestMapping("/action/sign_in")
public String app(HttpServletRequest request) {
String uid = request.getParameter("uid");
}

后端->前端

url参数传递

前提要发生页面跳转

  • 后端
@RequestMapping(...)
public String app() {
return "redirect:/?uid=1";
}
  • 前端
function getRequest() { // 获取url中"?"符后的字串
var url = location.search;
var request = new Object();
if (url.indexOf("?") != -1) {
var str = url.substr(1);
strs = str.split("&");
for (var i = 0; i < strs.length; i ++) {
request[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
}
return request;
} else {
return null;
}
}

model参数传递

  • 后端
@RequestMapping(...)
public String app(Model model) {
model.addAttribute("user_name", curUser);
}
  • 前端
<p th:text="${user_name}">原来的文本</p>

ajax参数传递

  • 后端
@RequestMapping(...)
@ResponseBody// 必须要有
public List<...> app() {
List<...> tmp = new List<...>();
return tmp;
}
  • 前端
$.ajax({
type: "post",
url: "/user/enterprise",
data: {},
success: function(get) {
for (var i = 0; i < get.size(); i ++) {
console.log(get[i]);
}
}
{);

数据库

TODO

ubuntu配置

分盘

  1. 安装失败
  • swap:1024M,主分区
  • /:10G,主分区
  • /boot:128M,主分区
  • /home:剩余,主分区
  1. 安装成功
  • swap:4096M,逻辑分区
  • /:剩余,主分区
  1. 未知
  • swap:4096M,逻辑分区
  • /boot:200M,主分区
  • /:10G,主分区
  • /home:剩余,逻辑分区
  1. 未知
  • /:全部,主分区

安装软件

基本

  • sublime
  • chromium:注意数据备份.config/chromium
    • tamper monkey
    • Adblock Plus
    • SwitchyOmega
    • crxMouse Top Gestures
  • dukto:3系统互传软件
  • hyper:配置文件~/.hyper.js
  • vscode
  • gnome-tweak:如果还在用gnome
    • dash to panel
    • topicons plus
    • user themes
  • 搜狗输入法:CSDN
    • 官网下载deb
    • sudo apt install -f && sudo dpkg -i sougou.deb
    • 设置->区域和语言->键盘输入法系统
  • gparted:磁盘分区

非基本

  • Indicator Stickynotes
  • QQ(见wine)
  • wps

deepin wine软件

  • QQ
  • TIM
  • QQ轻聊版
  • 微信
  • Foxmail
  • 百度网盘
  • 360压缩
  • WinRAR
  • 迅雷极速版

详细,github

软件的文件存放位置

  • QQ:

/home/lynx/.deepinwine/Deepin-QQ/dosdevices/c:/users/lynx/My Documents/Tencent Files/$account/FileRecv

deepin wine字体异常处理

修改注册表(TODO)
  1. 新建(任何位置,文件名随意)zh.reg
    1.1. 字体链接

    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLin]
    "字体名"="字体文件"

    1.2. 字体(强制)替换

    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]
    "字体名"="字体文件"

    1.3 字体(缺失)替换

    [HKEY_CURRENT_USER\Software\\Wine\\Fonts\\Replacements]
    "字体名"="字体文件"
  2. 修改注册表(貌似没用)

deepin-wine regedit zh.reg
补充字体文件
  • 字体文件存放位置:./deepin-wine/软件名/driver_c/windows/fonts/

wps软件

缺少字体的处理方法

下载并解压字体文件夹wps-font-symbols

sudo cp -r wps-font-symbols /usr/share/fonts
# cd /usr/share/fonts
# sudo chmod 755 wps-font-symbols
cd /usr/share/fonts/wps-font-symbols
# sudo chmod 644 *
sudo mkfontdir
sudo mkfontscale
fc-cache

系统设置

笔记本行为设定

  • 合盖不休眠:/etc/systemd/logind.conf
HandleLidSwitch=ignore

CSDN

密钥环

密码和密钥$\to$默认密钥环$\overset{\mbox{右键}}{\to}$更改密码$\to$空白

grub配置

  • 位置

/etc/default/grub

  • 内容修改
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true
  • 生效设置
sudo grub-set-default 2
sudo update-grub

数字任意

时间配置

sudo apt-get install ntpdate
sudo ntpdate time.windows.com
sudo hwclock --localtime --systohc

gnome-shell-entensions

chrome扩展

sudo apt-get install chrome-gnome-shell

chrome浏览器插件

重启gnome-shell

alt+f2$\to$r

extension位置

  • ~/.local/share/gnome-shell/extensions
  • /usr/share/gnome-shell/extensions

解决显示应用程序2个dock

cd /usr/share/gnome-shell/extensions
sudo rm -rf ubuntu-dock@ubuntu.com

解决桌面图标在重启后乱序

安装一个新的桌面图标扩展,关闭gnome-tweaks的桌面图标显示

外观修改

修改登录背景图片

/etc/alternatives/gdm3.css:

#lockDialogGroup {
background: url(file:///usr/share/backgrounds/Aatrox.jpg);
background-position: center;
background-size: cover; }

默认开机动画

sudo update-alternatives --config default.plymouth

修改开机动画

ubuntugeek
更多

  1. 创建新文件夹
sudo mkdir /usr/share/plymouth/themes/myTheme
  1. vi myTheme/myTheme.plymouth
[Plymouth Theme]
Name=MyTheme
Description=随你
ModuleName=script

[script]
ImageDir=/usr/share/plymouth/themes/myTheme
ScriptFile=/usr/share/plymouth/themes/myTheme.script
  1. 复制png(必须)图片到myTheme

  2. vi myTheme/myTheme.script

wallpaper_image = Image("Aatrox_1080.png");
screen_width = Window.GetWidth();
screen_height = Window.GetHeight();
resized_wallpaper_img = wallpaper_image.Scale(screen_width, screen_height);
wallpaper_sprite = Sprite(resized_wallpaper_img);
wallpaper_sprite.SetZ(-100);
  1. 安装主题
sudo update-alternatives --install /usr/share/plymouth/themes/default.plymouth default.plymouth /usr/share/plymouth/themes/myTheme/myTheme.plymouth 100
sudo update-alternatives --config default.plymouth
sudo update-initramfs -u

修改grub主题

  1. /boot/grub/themes文件夹创建
  2. 配置文件/etc/grub.d/00_header:
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.

GRUB_THEME="/boot/grub/themes/Vimix/theme.txt"
GRUB_GFXMODE="1920x1080x32"

可按照尺寸修改背景图片

  1. 更新配置
sudo update-grub

语言和文字

  • 对彩色表情的支持(TODO):

    • fonts-noto-color-emoji
    • fonts-emojione
  • 对特定软件使用特定语言打开(不能已经打开其他窗口)

sh -c "LANGUAGE=en /bin/chromium-browser %U"
  • 修改语言和编码

    • 位置:/etc/default/locale
    • 查看当前语言:locale
  • locale备份

LANG=zh_CN.UTF-8
LANGUAGE=zh_CN:en_US:en
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
sublime笔记

windows

  • 多行增加光标ctrl+alt+up/down

  • 多行同时生成光标ctrl+shift+l

  • 绑定quartus

"E:\Sublime Text 3\sublime_text.exe" %f:%l
  • 上次编辑位置alt+-

  • 括号匹配ctrl+m

插件位置

  • windows:C:/Users/$username/AppData/Roaming/Sublime Text 3/Packages
  • ubuntu:/home/lynx/.config/sublime-text-3/Packages
  • mac:/Users/lynx/Library/Application Support/Sublime Text 3/Packages

无法安装插件

安装package control

  • 直接从github上考到Installed Packages
  • 控制台安装(我觉得不行)

channel_v3.json地址

本地,jsdelivr,raw.github都可以.来源:

package control的设置文件中

{
"channels":
[
"https://raw.githubusercontent.com/fayou147/GitOrder/master/json/channel_v3.json"
]
}

常用插件

  • LateXTools:latex编译
  • SublimeAstyleFormatter:格式化c/java

1 / 5