静静的小窝

记录自己的感受与收获

本文所指AI,仅包括ChatGPT(GPT3.5),Copilot以及文心一言。其他模型没有进行尝试。

用AI写代码在过去的一年中可能已经很常见了,不过我则是几乎没有使用过。这一周为了迁移代码从Python到C++,可是和AI斗法废了一番功夫。

先介绍一下背景吧,毕设涉及到了汽车的图像识别,考虑各种情况最后选择了intel的神经计算棒加速,自然也就用了OpenVINO。因为我负责的是项目其他部分,所以并没有在意这个部分,直到我们的Python版本测试效果不错,需要合入C++版本的时候,“噩梦”才开始了。

因为之前在RoboMaster时有干过Python转C++的活,干的也是Opencv的东西。所以一开始听说转换有问题的时候,觉得我应该能搞定,就跟着一起搞,觉得opencv的api在cpp和python上基本一样,一行行照抄改不就是了。然后就发现遇到了问题,有这样一行代码:image = image.transpose((2, 0, 1))用于对opencv读到的图片进行维度转换以符合模型的输入要求,然而当我去查opencv的api时,发现opencv的transpose并不长这样,只有一个输入和输出。搜索后发现,这里是用了numpy的函数进行了转换。可是cpp没有numpy啊,为了一个这个功能再搞eigen?好像也不合适。此时cpp的代码已经写好了可以编译运行,只是模型结果和python的不一样,识别不出车子来。于是去看cpp代码是怎么写的,发现是cvtColor,emm?于是队友就开始问了AI,给出的方案是手动三重循环转换,copy进代码跑,发现还是不行。于是反复循环问ai,copy进代码,发现不行。我也试了copilot的翻译代码功能到cpp,结果照样不行。反复尝试换模型(FP32,FP16),修改遍历顺序,修改不同的api,都不行。

我于是尝试搞到自己电脑上跑。原来的编译是直接g++跑,但是换了环境之后自然是跑不了了,再加上其他部分代码都是cmake编译的,便尝试搞成cmake,弄了好久搞定了,在编译时会提示使用了2024要被废弃(如废)的框架。于是我想到不如用新框架也许能更好写,便问了队友初始的python代码是从哪个文档里面学来的,得知也是AI生成的。

我想着AI只能出旧框架,那我要不上网搜索有没有新框架。于是花了可能就一分钟就找到了知乎上的文章,然后照着抄,抄的时候看到文章里面的转换,感觉和我们的代码一样,可能还是不行的时候,突然反应过来不一样的地方:之前的尝试,都只是在改模型部分的类型在各种变化,但是Mat读的时候,一直是at成float读的,但是我们的图片读进来是int啊,到原来代码里面一改,模型输出正确了。

关键的修改

唉,与其去搞AI问答,不如当初就直接搜索引擎搜索,早解决了。看起来C++开发暂时还是不会被AI取代的,需要的各类信息比Python一类的代码多得多。

静评旨在抛砖引玉。

https://linux.cn/article-16094-1.html

很多人常常把浏览器和操作系统放在一起讨论,不论这是否是一个工程难度和代码量的级别,浏览器在当代的地位已是越来越重要的,不管是出现了基于浏览器而打造的操作系统(Chrome OS)还是基于electron开发的跨平台应用的不断上涨还是套壳网页的手机应用程序。但是,尽管操作系统有一个占领市场大量份额的微软,仍旧有包括GNU/Linux,FreeBSD,MacOS等的众多选择,而且市场份额基本稳定,而浏览器方向上则是另外一个光景,谷歌携带着它的开源浏览器,已几乎是所向披靡,连微软都在多年的挣扎后放弃,投入怀抱。Firefox等其他内核的浏览器份额不断下滑,仅有苹果的Safari靠着“垄断”保持自己的成绩,当然,随着苹果被迫在手机上开放侧载,允许用户使用其他内核可能也会发生,那时苹果还能占有今天的份额吗?

商业上的成绩外,谷歌也几乎干掉了可能的中国挑战者,不同于其他各式的产品的“国产化”基本不选择易被控制的技术路线,浏览器方面,几乎所有人都是在谷歌的开源框架上制作(360,QQ一类)。而尽管谷歌在中国的服务甚少,乃至有收缩,chrome(国内一般称谷歌浏览器)在包括党政等地方仍旧被推荐使用,甚至有时是唯一推荐浏览器。显然,谷歌并未引起一定的中国政府的安全担忧,想比起不断强调国产的操作系统等。

谷歌的成功,毫无疑问是包括开源等的政策下的成功,但是我们不免会问,在一统江湖后,谷歌会成为前辈那样的“恶龙”吗?应当注意到,谷歌近些来在chromium上提出了许多争议性的目标,也被曝光利用其他方式劣化其他浏览器体验。同时,谷歌也是其主要的竞争对手,Firefox的主要开发者,Mozilla重要的资金来源(用于在Firefox上让google为默认搜索引擎)。所谓“卡脖子”,不过如此。

如果谷歌真的成功地控制了浏览器,我们能期待的,除了那个早已被删去的“No evil”,还能剩下什么吗?

本静评对象为此篇文章,对于其真实性完整性等无法保证,如有错误漏洞,请大家指出。

静评原为我发布在学校内部平台的内容,现同步到这里。
原文地址 https://shuiyuan.sjtu.edu.cn/t/topic/187269

静评旨在抛砖引玉。

https://mp.weixin.qq.com/s/_nS7aQUcgs5shiCgcSGm_A

静静发现,这个样例中的人普遍被想变“美”但是在社会规约下难以变“美”而困扰,末尾的做整容手术与看心理医生这一已是不太被认可的行为做比较,进一步凸显出来了这些人的矛盾处境。

静静觉得,她们的境遇有多个因素。一个是外界他人的“精致”与自身的不“精致”带来的冲突与压力,让这些人看到其他人的“精致”而感到一定的自卑,同时这也是传统“万般皆下品,惟有读书高”式微,外貌愈加被看重后的自我认同的冲突的结果。

静静想,在评价方式撕裂的当下,如何良好地认识自己可能越来越重要,正如文末提到的心理医生一样,多元化的问题不断出现。

静静还想,和那些更早“精致”的人比,文章中的主人公们是晚的,但也有人还没开始,那是换一条赛道还是和那些已经进场的玩家比赛,先追赶再超越呢?文章中的这种撕裂的苦恼,是否也是中国在发展中遇到的复杂方向选择的一个缩影呢?

静静也想,人作为一种自以为高级的物种,是否有能力超脱出此时的“精致”定义呢?是否有可能,我们有着更复杂混合的“精致”呢?

源友们,你们怎么看呢?

本静评对象为此篇文章,对于其真实性完整性等无法保证,如有错误漏洞,请大家指出。

静评原为我发布在学校内部平台的内容,现同步到这里。
原文地址 https://shuiyuan.sjtu.edu.cn/t/topic/186912

静评旨在抛砖引玉。

https://mp.weixin.qq.com/s/cFvtC6ErQgNa_XF6xrUunQ

静静发现,这里面提到了两个场所的“按摩椅”问题,一个是在火车候车区域出现大量按摩椅,一个是在电影院出现按摩椅。

静静觉得,这两个场景可能存在着不同。对于候车,这只是铁路部门给予的便利服务,购买的票是从甲地到乙地的车票,这是否可以解释为包括了乘车前在候车区域有座位的服务呢?对于电影院,票上已经明确了座位,那么理应提供相应的位子,并保证相应的卫生等。当然,按摩椅也是座位,提供按摩椅算是提供座位吗?

静静想,这个问题的关键矛盾在于服务的提供方不认为提供普通座椅是包括在售出票中的,而购买者则认为是在的。在这方面,法律上可能需要进一步的进行责任的划分,对相关合同的权责关系进行细致的明确。

源友们,你们怎么看呢?

本静评对象为此篇文章,对于其真实性完整性等无法保证,如有错误漏洞,请大家指出。

静评原为我发布在学校内部平台的内容,现同步到这里。
原文地址 https://shuiyuan.sjtu.edu.cn/t/topic/186810

静评旨在抛砖引玉。

https://mp.weixin.qq.com/s/9xwsdhsNNM9VEq6WVgvMbA

比较明确的是,限制性措施还没有实行,相关行业企业仍有运作空间。

想必不少源友会想到“教培”事件的影响,进行比较,

静静发现,存在2点不同,一个是时间上,一个几乎是立刻,一个则还有数月。一个是受影响的企业,一个立刻表明了支持,一个则表示了一定的反对。

静静觉得,这两种各有利弊,一种是快刀斩乱麻式地处理,避免了长时间博弈的消耗以及部分企业“钻空子”的行为。一种这是温水煮青蛙式地处理,避免了快速变化带来的市场波动。

静静想,看不见的手需要受约束越来越成为共识,但是如何管,如何放,如何平稳过度,仍是一个需要讨论的话题。

源友们,你们怎么看呢?

本静评对象为此篇文章,对于其真实性完整性等无法保证,如有错误漏洞,请大家指出。

这学期上了一门关于数据处理的课程,需要使用hadoop,版本为3.2.2(一个在hadoop官网下载链接里面都没有的的旧版本。
但是在我们组的电脑上(manjaro + WSL + VM ware + Virtual box 各种东西齐了)根据官方的教程没有能够成功开启多机的集群(不过启动了单机的伪集群),经过一些分析和上网的查询,发现是自带的bash脚本存在问题,导致启动失败,使用完脚本之后,jps显示并没有启动任务。

换用hdfsyarn 直接启动可以避免这个问题。

在namenode上,使用以下命令:

1
2
3
4
5
6
7
8
9
# 第一行是前台运行,第二行是后台启动,第三行是停止后台的任务。
hdfs namenode
hdfs --daemon start namenode
hdfs --daemon stop namenode

# 第一行是前台运行,第二行是后台启动,第三行是停止后台的任务。
yarn resourcemanager
yarn --daemon start resourcemanager
yarn --daemon stop resourcemanager

在datanode上,使用以下命令:

1
2
3
4
5
6
7
8
9
# 第一行是前台运行,第二行是后台启动,第三行是停止后台的任务。
hdfs datanode
hdfs --daemon start datanode
hdfs --daemon stop datanode

# 第一行是前台运行,第二行是后台启动,第三行是停止后台的任务。
yarn nodemanager
yarn --daemon start nodemanager
yarn --daemon stop nodemanager

个人感觉可以先多开终端前台运行,方便及时看到出现的各种问题:

  1. format格式化出现问题,解决方法:重新format(根据网上的资料,好像要使用Y,而不能是y,必须大写)。这种情况可能在多次失败重启之后发生。
  2. 提示hdfs的文件夹访问失败,解决方法:删除对应的文件夹,然后重新启动。这种情况可能在多次失败重启之后发生。

注意使用虚拟机时,注意对应的IP,端口,hostname的对应关系,如果出现了提示链接失败,无法连接服务器的日志,有可能就是这些地方有问题导致无法访问,当然也可能是对吗服务器的node炸了。可以使用lsof -i 去确认网络连接情况,确认是否端口在listen,对面机器是否有成功连接过。当然,还有可能是防火墙之类的阻断了连接。

这是之前出的一道题,稍微进行了一些小修改。
题目链接:https://codeforces.com/contest/894/problem/A

  1. 最简单的方法就是搜索遍历所有的可能的排列情况,即枚举结果字符串的每一位在原字符串中的位置,故复杂度为$O(n^3)$,如果需要的匹配的字符串更长,那么复杂度更高。

  2. 随后可以发现目标字符串要完全符合要求,意即只要有一位不符合就一定不被计算,故可剪枝,只有当前面的字符串都符合要求的时候才继续遍历,常数可以进行优化为原来的$\frac{1}{26}$,但复杂度仍旧不变。

  3. 从前面的剪枝可以发现并不一定要遍历每种可能才可以,可以保存中间量直接相加即动态规划

可以一维存储原字符串的下标,一维存目标字符串的下标,表示到目前为止符合的字符串数量,随后从前往后相加得最后得数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
for (int j = 0; j < 105; j++)
{
for (int i = 1; i < 5; i++)
{
dp[i][j] = 0;
}
dp[0][j]=1;
}
for (int j = 0; j < st.length(); j++)
{
for (int i = 0; i < 3; i++)
{
if (st[j] == base[i])
{
dp[i + 1][j + 1] = dp[i][j] + dp[i+1][j];
}
else
{
dp[i + 1][j + 1] = dp[i + 1][j];
}
}

最后输出dp[3][st.length()]作为答案。

可以注意到过程当中一直是dp[i]dp[i+1],说明实际并不需要这一维度,可以删去这一维度到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for (int i = 1; i < 5; i++)
{
dp[i] = 0;
}
dp[0] = 1;
for (int j = 0; j < st.length(); j++)
{
for (int i = 0; i < 3; i++)
{
if (st[j] == base[i])
{
dp[i + 1] = dp[i] + dp[i + 1];
}
else
{
dp[i + 1] = dp[i + 1];
}
}
}

同时注意到else实际上什么都没有做,可以直接删去。