编程随心记

1、在安装任何软件之前都要先查看本机是否已经安装,以及对应版本。

2、Anaconda在进行 conda update --all 指令时,并不会将所有包都更新到最新版本。
后来通过conda update文件查到,“此命令接受包名称列表,并将它们更新为与环境中所有其他包兼容的最新版本。” 这意味着如果conda update指令在进行某个软件包的更新,此时可能会使其他软件包的稳定性受到威胁,则不会更新这些软件包。因此,conda update -all会优先考虑稳定性而不是最近的构建。而conda update numpy优先考虑numpy更新,不考虑整体稳定性。

3、PATH是路径的意思,PATH环境变量中存放的值,就是一连串的路径。不同的路径之间,用英文的分号(;)分隔开。系统执行用户命令时,若用户未给出绝对路径,则首先在当前目录下寻找相应的可执行文件、批处理文件(另外一种可以执行的文件)等。若找不到,再依次在PATH保存的这些路径中寻找相应的可执行的程序文件。系统就以第一次找到的为准;若搜寻完PATH保存的所有路径都未找到,则会显示不是内部或外部命令,也不是可运行的程序。

4、内部命令和外部命令是DOS(Disk Operating System,微软早期基于命令行的操作系统)时代的概念。内部命令是随每次启动的COMMAND_COM装入并常驻内存,而外部命令是一条单独的可执行文件。粗略地讲,所谓内部命令就是最核心、使用最多的命令。为了提高响应速度,系统一启动,这些命令就被加载到内存,因此可以迅速、直接地执行;而外部命令由于使用相对较少,就不预先加载到内存,当用户使用时,再到硬盘上(C:\windows\system32)找相应的可执行文件,然后加载到内存执行。像dir、cd等都是内部命令,而诸如attrib、format等都是外部命令。尽管DOS的时代早已成为了历史,但某些操作却必须在命令行模式下完成,对专业人士来说更是如此。因此,Windows产品一直保留着命令行模式这个工具。

5、批处理文件(后缀名为.bat,来源于批量的英语单词batch),它是另外一种可以执行的文件。简单地说,批处理文件包含了很多DOS命令。文件执行时,就一条一条地执行这些命令。不一定顺序执行,像通用的程序设计语言一样,它也有自己的流程控制。批处理文件创建很简单:用任何一个文本编辑器(如Windows的记事本)创建一个文本文件,然后把后缀名改为.bat即可。创建好的批处理文件,你也可以用文本编辑器打开,查看它的“源代码”。

6、wkhtmltopdf在代码中已经配置了路径,但程序运行仍然找不到的问题。

  1. 下载wkhtmltopdf安装包,并且安装到电脑上,同时配置环境变量。
  2. 在pycharm中安装wkhtmltopdf库:
pip install wkhtmltopdf
  1. 在代码中指定configuration参数。

7、在Pycharm中首次授权GitHub Copilot步骤:

  1. 要先科学上网。
  2. 依次点击设置>网络与Internet>代理>手动设置代理>设置,记下IP代理地址和端口。
    在这里插入图片描述
  3. 进入Pycharm,依次点击右上角小齿轮>设置>外观与行为>系统设置>HTTP代理,选择手动代理配置>HTTP,填入主机名和端口号,点击确定。
    在这里插入图片描述
  4. 点击右下角驾驶员小图标,Login to Github。或者依次点击左上角四条杠>工具>Github Copilot>Login to Github。
    此为已登录状态
    此为已登录状态
  5. 复制机器码并进入GitHub页面授权。授权成功就可以使用了,使用时无需科学上网。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    8、Git连不上GitHub问题
    一直报错:git@github.com: Permission denied (publickey).
    则在git中输入:
    ssh-agent -s
    ssh-add /d/Git/.ssh/id_rsa
    如果报错:Could not open a connection to your authentication agent.
    就继续输入:
    ssh-agent bash
    ssh-add /d/Git/.ssh/id_rsa
    */d/Git/.ssh/id_rsa是我安装公钥的地址。

9、上传GitHub时,文件名必须是英文。

10、将Python程序打包成exe时,图标图片要转换成ico格式,并与.py文件放在同一个目录下。
如果在运行exe时报错缺少某个库,可以用打包命令“–hidden-import=”,将缺少的库指名打包进去。
-F: 打包成一个exe文件
-w: 不带console输出控制台,window窗体格式
*对于-w要特别说明一点,当程序中存在输出内容时,tkinter库可以在GUI中显示内容,但是当程序运行量非常大时,会卡顿,所以还是去掉-w,老老实实在命令行输出或交互。

例如:

  1. 用管理员身份进入.py文件所在文件夹,
    cd D:\JetBrains\pythonProjects\提取私募基金重要产品要素_PDF版\打包
  2. 输入打包指令,
    pyinstaller -F -w -i spider.ico 提取私募基金重要产品要素_PDF版.py --hidden-import=lxml

11、ArkTS报错记录
1)08-17 20:00:46.108 12904-23244 C03f00/ArkCompiler
E [ArkRuntime Log] TypeError:
@Component ‘@Component ‘StandardDialog’[11]’: Illegal variable value error with decorated variable undefined ‘onConfirm’: failed validation: 'undefined, null, number, boolean, string, or Object but not function, not V3 @observed / @track class, attempt to assign value type: ‘function’, value: ‘undefined’!

ArkTS
1、垂直和水平排列
(1)垂直排列 - 使用 Column 组件:
Column() {
Text(‘第一行’)
Text(‘第二行’)
Text(‘第三行’)
}
.width(‘100%’)
.alignItems(HorizontalAlign.Center) // 控制子项在水平方向上的对齐
.justifyContent(FlexAlign.Start) // 控制子项在垂直方向上的对齐
(2)水平排列 - 使用 Row 组件:
Row() {
Text(‘左边’)
Text(‘中间’)
Text(‘右边’)
}
.width(‘100%’)
.alignItems(VerticalAlign.Center) // 控制子项在垂直方向上的对齐
.justifyContent(FlexAlign.SpaceBetween) // 控制子项在水平方向上的分布
(3)使用Stack组件:
// 只指定堆叠内容靠左对齐,垂直方向默认从底部开始
Stack({ alignContent: Alignment.Bottom }) {
}
// 明确指定堆叠内容从顶部开始,靠左对齐
Stack({ alignContent: Alignment.TopStart }) {
}
// 只指定堆叠内容靠左对齐,垂直方向默认从顶部开始
Stack({ alignContent: Alignment.Start }) {
}

2、拷贝
(1)浅拷贝
使用展开运算符(推荐):
BList = […AList]
使用数组的 slice() 方法:
BList = AList.slice()
使用循环方式:
AList.forEach(item => {
BList.push(item);
});
(2)深拷贝
BList = AList

3、内部组件分布间距
可以使用 justifyContent 属性来实现 Row/Column 中的均匀分布
.justifyContent(FlexAlign.SpaceBetween) // 项目之间保持相等间距,两端贴边
.justifyContent(FlexAlign.SpaceAround) // 项目之间保持相等间距,两端间距是中间间距的一半
.justifyContent(FlexAlign.SpaceEvenly) // 所有间距完全相等,包括两端

4、
一旦你在函数的任何路径中使用了显式 return,就必须确保所有可能的执行路径都有显式返回值。

5、indexOf是对象的引用
/**
* Returns the index of the first occurrence of a value in an array, or -1 if it is not present.
* @param searchElement The value to locate in the array.
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.
*/
indexOf(searchElement: T, fromIndex?: number): number;

// 演示对象引用比较问题
const obj1 = {fundcode: ‘000001’, fundname: ‘某基金’};
const obj2 = {fundcode: ‘000001’, fundname: ‘某基金’};

obj1 === obj2; // false
[obj1].indexOf(obj2); // -1

对于对象,indexOf比较的是引用地址而非内容。
在进行对象的比较时,使用唯一标识符比较,即上面例子中的fundcode等。

6、在 EntryAbility 中可以直接使用 this.context,这是鸿蒙系统的设计。
1)this.context 的本质
它是UIAbility的内置属性:
export default class EntryAbility extends UIAbility {
// 🔥 UIAbility基类中已经定义了context属性
// 无需手动定义,可以直接使用

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 🔥 this.context 是从UIAbility基类继承来的
console.log(‘Context类型:’, typeof this.context)
console.log(‘Context对象:’, this.context)

// 直接使用
tztZFHsSDK.initial(this.context)

}
}

2)Context的类型和来源
查看UIAbility基类定义:
// UIAbility基类的简化定义
export class UIAbility {
// 🔥 系统自动注入的context属性
context: UIAbilityContext

// 生命周期方法
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {}
onDestroy(): void {}
// …其他方法
}
具体的Context类型:
// this.context 的实际类型是 UIAbilityContext
import { common } from ‘@kit.AbilityKit’

export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 🔥 this.context 的类型是 UIAbilityContext
const ctx: common.UIAbilityContext = this.context

console.log('Context信息:')
console.log('- bundleName:', ctx.bundleName)
console.log('- moduleName:', ctx.moduleName)
console.log('- abilityName:', ctx.abilityName)
console.log('- filesDir:', ctx.filesDir)
console.log('- cacheDir:', ctx.cacheDir)

}
}
3)Context的能力和用途
UIAbilityContext提供的功能:
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 🔥 应用信息
console.log(‘应用包名:’, this.context.bundleName)
console.log(‘模块名:’, this.context.moduleName)

// 🔥 文件路径
console.log('文件目录:', this.context.filesDir)
console.log('缓存目录:', this.context.cacheDir)
console.log('临时目录:', this.context.tempDir)

// 🔥 启动其他Ability
// this.context.startAbility(want)

// 🔥 获取资源管理器
const resourceManager = this.context.resourceManager

// 🔥 数据库操作
// this.context.databaseDir

// 🔥 用于SDK初始化
tztZFHsSDK.initial(this.context)

}
}
4)为什么SDK需要Context?
SDK使用Context的目的:

  • 获取应用信息:包名、版本号等

  • 文件存储:缓存统计数据到本地

  • 网络权限:检查网络状态

  • 设备信息:获取设备标识符

  • 生命周期管理:监听应用前后台切换
    // SDK内部可能的使用方式(示例)
    class AppLog {
    init(context: Context, config: InitConfig) {
    // 🔥 获取应用信息
    this.appInfo = {
    bundleName: context.bundleName,
    versionName: context.versionName,
    // …
    }

    // 🔥 设置缓存目录
    this.cacheDir = context.cacheDir + ‘/applog’

    // 🔥 获取设备信息
    this.deviceInfo = this.getDeviceInfo(context)

    // 🔥 监听应用生命周期
    context.on(‘applicationForeground’, this.onForeground)
    context.on(‘applicationBackground’, this.onBackground)
    }
    }
    5)不同场景下的Context获取

  1. 在UIAbility中:
    // ✅ 直接使用this.context
    export default class EntryAbility extends UIAbility {
    onCreate() {
    const ctx = this.context // UIAbilityContext类型
    }
    }
  2. 在Page页面中:
    // ✅ 需要使用getContext()获取
    @Entry
    @Component
    struct Index {
    aboutToAppear() {
    const ctx = getContext(this) as common.UIAbilityContext
    }
    }
  3. 在普通TypeScript类中:
    // ❌ 无法直接获取context
    class MyService {
    init() {
    // 需要从外部传入context
    // const ctx = ??? // 无法获取
    }
    }

// ✅ 通过参数传入
class MyService {
init(context: common.UIAbilityContext) {
// 使用传入的context
}
}
总结
this.context 是鸿蒙系统的设计特性:
🎯 自动注入:UIAbility基类自动提供context属性
🎯 类型明确:类型是UIAbilityContext
🎯 功能丰富:提供应用信息、文件路径、生命周期等能力
🎯 SDK必需:火山引擎SDK需要context来获取应用环境信息
可以在EntryAbility中直接使用this.context的原因——它是系统框架提供的内置能力,不需要手动定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cho1ce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值