0%

centos8使用yum失败,切换镜像源,更改镜像源文件,尝试清除缓存并重新建立

1
2
3
4
5
6
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

sudo yum clean all

sudo yum makecache

Centos8已不维护,只能找

puppeteer报错下载依赖 参考链接:https://www.cnblogs.com/ilizhu/p/14504049.html
报错sandbox:

1
2
#添加启动参数
const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});

有个需求是根据一个表格的所有子表,同步到另个表格(包含子表)的数据,用google sheets里面的扩展程序里的apps 脚本功能,编写脚本。为什么要同步呢?因为原表默认是不可编辑的,打算同步过来后再进行编辑。sourceSpreadsheetId跟targetSpreadsheetId为google sheet 表格地址栏d后面的一串字符。

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
function synchronizeSheetsToAnotherFile() {
const sourceSpreadsheetId = "id1";
const targetSpreadsheetId = "id2"; # 比如:1NOtSSvDwXrca8vqyZW6OqQJwGaCICMVguSz1-i72oqg

const sourceSpreadsheet = SpreadsheetApp.openById(sourceSpreadsheetId);
const targetSpreadsheet = SpreadsheetApp.openById(targetSpreadsheetId);

const sourceSheets = sourceSpreadsheet.getSheets();

sourceSheets.forEach(sheet => {
const sheetName = sheet.getName();
let targetSheet = targetSpreadsheet.getSheetByName(sheetName);

if (!targetSheet) {
targetSheet = targetSpreadsheet.insertSheet(sheetName);
} else {
targetSheet.clear();
}

const range = sheet.getDataRange();
const displayValues = range.getDisplayValues();
const formats = range.getBackgrounds();
const fontWeights = range.getFontWeights();

const targetRange = targetSheet.getRange(1, 1, displayValues.length, displayValues[0].length);
targetRange.setValues(displayValues);
targetRange.setBackgrounds(formats);
targetRange.setFontWeights(fontWeights);


});
}




最近遇到一个问题,如何把已经弄好的react移动端项目打包成apk呢?可以使用capacitor。
首先,可以先将依赖全部添加进去项目里面。

1
2
npm add @capacitor/core @capacitor/cli
npm install @capacitor/android

接着,可以先把自己的app初始化

1
2
npx cap init MyApp com.example.myapp   #MyApp是app名字,com.example.myapp是包名
npx cap add android #这条命令会生成android文件夹

然后把项目进行打包,再通过npx cap copy命令让打包后的产物放进去android目录里面

1
2
npm run build
npx cap copy

紧接着可以通过命令去android平台啦

1
npx cap open android

默认自动打开android studio后,通过File -> Sync Project with Gradle Files, 或者熟悉android studio的人可以通过右上角的按钮去同步。
如果发现Gradle失败,有可能是拉取gradle版本的包失败了,可以找到gradle-wrapper.properties文件,然后把distributionUrl的路径改为distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-all.zip,然后重新点击sync按钮就可以啦。

等sync 成功后,可以自己运行起来看效果,也可以直接用Build -> Generate APP Bundles or APKs,选择 Generate APKs,就能成功打包apk包了。

  • 通过Props和Props回调:用于父子组件的通信,子组件通过props接收父的数据,父组件将回调函数传给子组件,子组件调用这个回调函数,传数据给父组件。
  • 通过Context API:可以共享状态的API,不需要按层级去传递。
  • Redux或Mobx:对于复杂的应用,可以用状态库来实现组件通信。
  • 事件订阅模式:使用EventEmitter或者第三方库来实现跨组件的事件发布订阅。
  • Hooks:React的一些Hooks,比如useState,能实现不同组件的共享逻辑跟状态。

《if-elif条件语句》逐字稿

  同学们,老师刚才留意到班级上的值日表,周一到周五有好多勤劳的小蜜蜂呀。老师想问下周一值日的同学有哪些举下手?诶,老师看见了。那么同学们记住这些周一值日的同学了吗?是的,总共有六位。那如果以三个班为单位,给你一个名字,你能快速给出这名同学是星期几值日吗?你们有什么好办法吗?请你,对了,可以自己用绕口令等方式背下来。还有更好的办法吗?请你,对了,可以利用程序的方式输出出来。那该使用什么语句来表示多个条件呢?今天我们就一起来学习python中的另一种条件语句if-elif-else

  现在请大家同桌两人为一小组,先来分析if-elif-else怎么实现同学名字对应星期几值日的问题,时间是8分钟。开始吧,时间到了,刚才在巡视的过程中,大家都在认真的讨论,那哪个小组代表想来分享你们的成果,你来说,你说想要判断同学是哪天值日的,只要输入他的名字,根据名字找到对应星期几输出就行了。还有补充的吗?第五小组,你们来说,他说可以弄五个数组对应星期一到星期五,把每个人的名字放进去对应的数组里,然后判断输出。你补充的非常关键。请坐。非常好,请坐,大家分析的很正确,说明大家有充分预习本节课的内容。

  接下来我们就综合大家的分析,请同学们自主思考,并画出流程图,时间是5分钟,开始吧,时间到了,请这位同学来展示你的流程图,你说首先输入学生的名字,假如小花在星期一的数组里,那么输出星期一,依次类推。现在请大家尝试写出多分支结构的语句,老师提示一下,条件子句的如果需要用elif来表示。我们请这位同学将他的答案写到黑板上,请同学们来看跟你写的一样吗?哪些地方需要修改?你说将最后一个elif应该写成else,是表达都不满足条件的话,执行else后面的语句。你说要注意缩进和冒号。大家观察的很仔细,希望同学们写的时候一定要认真。请大家利用学到的if-elif语句去编写刚才你们设计的算法。我看到大家都能准确的写出来了,并且都避免了刚才的问题。

  语句我们已经写出来了,那他的执行过程是什么呢?现在请同学们以同桌两人为一小组,进行讨论,一会我们请一名小组代表展示讲解,时间是7分钟,开始吧,我看到有同学在小声的讨论,时间到了,第二小组,请你们讲一讲执行过程,他结合流程图告诉我们,执行过程是依次判断输入的同学姓名符合哪个条件,如符合则输出,若都不符合则输出错误。他用图文的形式讲解,非常的直观。那现在我们就可以就着大屏幕上的流程图,总结出if-elif语句的执行过程是从if行开始依次对条件进行判断,如果正确则执行改条件下面的语句块,然后跳出if语句,如果不正确则对下一个条件进行判断,如果所有条件都不成立,则执行else下面的语句块。

  新知识我们已经学完了,现在请大家编写完整程序,实现上述的执行过程,学有余力的同学,请自己思考生活中有哪些需要对多个条件进行检测的事情,自主进行编写。我们请这些同学来进行展示,他们中有的从数学出发,编写了比较三个数,求最大数问题,还有的是从生活出发,编写了出租车计费的问题。大家编写的语句和格式都很规范。

  这堂课已经接近尾声了,这节课你都有哪些收获呢?大家说学会了if-elif的格式和执行过程,看来这节课的知识同学们都掌握了。其实编程离咱们的生活和学习很近,并且也没有想象中的那么难,老师希望同学们以后都可以像今天一样在课堂上积极思考,表达想法。
  最后布置一个小作业,请同学们对比三种if语句特点,整理成表格。
  这节课就上到这里,同学们再见。

  • Fabric:同步渲染 UI,消除 Bridge 通信瓶颈
  • TurboModules:按需加载原生模块,提升启动速度
  • JSI(JavaScript Interface):直接调用原生代码,替代异步 Bridge, Bridge是异步的、单线程的,会带来额外的开销;而JSI是同步的,更低开销、并发的。

Next版本为7.8.0,找到 /themes/next/_config.yml 文件,搜索 font 关键词,这里注意一定要将 font 里面的 enable 设置为true, 因为默认为false,然后设置 family 为自己想要的,如果family在其他平台找的,就需要修改host。(只是修改了family, 没修改enable就会不生效,所以一定一定要记得)

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
font:
enable: true

# Uri of fonts host, e.g. https://fonts.googleapis.com (Default).
host:

# Font options:
# `external: true` will load this font family from `host` above.
# `family: Times New Roman`. Without any quotes.
# `size: x.x`. Use `em` as unit. Default: 1 (16px)

# Global font settings used for all elements inside <body>.
global:
external: true
family: Noto Serif SC
size:

# Font settings for site title (.site-title).
title:
external: true
family: Noto Serif SC
size:

# Font settings for headlines (<h1> to <h6>).
headings:
external: true
family: Noto Serif SC
size:

# Font settings for posts (.post-body).
posts:
external: true
family: Noto Serif SC

# Font settings for <code> and code blocks.
codes:
external: true
family: Source Code Pro


代码可复制,还是上面同一个文件,找到以下代码段,将copy_button的enable设置为true,启用就可以啦。show_result设置true后,复制完会显示一个勾。style对应的copy_button不同的样式,看个人喜好来~

1
2
3
4
5
6
7
8
9
10
11
12
codeblock:
# Code Highlight theme
# Available values: normal | night | night eighties | night blue | night bright | solarized | solarized dark | galactic
# See: https://github.com/chriskempson/tomorrow-theme
highlight_theme: night eighties
# Add copy button on codeblock
copy_button:
enable: true
# Show text copy result.
show_result: true
# Available values: default | flat | mac
style: mac

前端脱离框架去开发,就是不使用任何前端框架(Vue、React等)的情况下,直接用js、html和css去开发web。这意味更能深入了解前端底层原理和机制,避免依赖框架。

在面对静态且不做过多功能的低项目下,其实脱离框架就已经足够了。框架编写的代码必须要进行编译才能在浏览器中渲染,所以便有了webpack。像Vue的出现就是为了解决一些痛点问题,比如双向数据流、自动响应式更新等,但我们又不得不遵守他们框架内的一些语法,随着vue的升级,我们也要不停学习更新的框架内容。框架本身是有利于开发的,但面对一些简单的问题时,不用框架反而是明智的。根据需求而决定去不去用框架进行下一步的开发。

当开发多个类似的网站,没有打包过的代码放上服务器,能直接在服务器改源代码。而使用框架后打包的源码放在服务器中,要修改却只能本地修改,反而更浪费时间。当熟悉纯js开发后,还能开发一些工具以及框架出来。

当你拿到的广告代码是包含script标签时,则需要通过一定的转换,才能正常渲染到页面上。

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
//当你拿到的广告代码如下:
<script type="text/javascript">
atOptions = {
'key' : '1523b7ddb936e560aadef64a851d500c',
'format' : 'iframe',
'height' : 250,
'width' : 300,
'params' : {}
};
</script>
<script type="text/javascript" src="//www.highperformanceformat.com/1523b7ddb936e560aadef64a851d500c/invoke.js"></script>


//转换后:
const targetDiv = document.getElementById("de_v");
if (!targetDiv) return;

// 创建第一个 script 设置 atOptions
const script1 = document.createElement("script");
script1.type = "text/javascript";
script1.innerHTML = `
atOptions = {
'key' : '1523b7ddb936e560aadef64a851d500c',
'format' : 'iframe',
'height' : 250,
'width' : 300,
'params' : {}
};
`;

// 创建第二个 script 负责加载外部 JS
const script2 = document.createElement("script");
script2.type = "text/javascript";
script2.src = "//www.highperformanceformat.com/1523b7ddb936e560aadef64a851d500c/invoke.js";

// 插入到 #de_v 容器内
targetDiv.appendChild(script1);
targetDiv.appendChild(script2);

如果第三方接口获取到的数据,返回为csv文档时,可以先把csv文档保存到本地某路径,再通过fs的createReadStream读取数据,保存到本地数据库。

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
const processConversations = async (dateObj) => {
const username = '你的帐户名';
const password = '密码';

const year = dateObj.format('YYYY');
const month = dateObj.format('MM');
const day = dateObj.format('DD');
const hour = dateObj.format('HH');
const dateStr = `${year}-${month}-${day}-${hour}`;
const fileName = `路径后半部份`;
const url = `https://api/${fileName}`;
const outputPath = `/tmp/conversations`;
const tableName = 'test';


try {
// 下载 CSV
const response = await axios.get(url, {
responseType: 'stream',
headers: {
Authorization: `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`
}
});

const writer = fs.createWriteStream(outputPath);
response.data.pipe(writer);
await new Promise((resolve, reject) => {
writer.on('finish', resolve);
writer.on('error', reject);
});

console.log(' CSV 文件下载成功:', fileName);



const rows = [];

await new Promise((resolve, reject) => {
fs.createReadStream(outputPath)
.pipe(csv())
.on('data', (row) => {
rows.push([
row['DATE_TIME'] ? dayjs(row['DATE_TIME']).format('YYYY-MM-DD HH:mm:ss') : null,
row['CLID'] || null,
row['CLID_SOURCE'] || null
]);
})
.on('end', resolve)
.on('error', reject);
});

if (rows.length === 0) {
console.warn(`CSV 中没有数据: ${fileName}`);
return;
}

const insertSQL = `
INSERT INTO \`${tableName}\` (
date_time, clid, clid_source
) VALUES ?
`;




await query(insertSQL, [rows]);
console.log(`成功插入 ${rows.length} 条记录: ${fileName}`);
} catch (error) {
console.error(`报错 (${fileName}):`, error.message);
}
};