应该给文心一言以及中国IT技术更多的鼓励

近日,百度开了“文心一言”的发布会,这是一款基于自然语言处理技术的语言模型,与其他知名的语言模型产品如OpenAI的GPT系列以及百度自己的ERNIE等相似。但是,与这些产品相比,文心一言受到了很多批评和质疑。在此,我们应该给这个新兴的产品更多的鼓励,让它有机会展示其潜力。

首先,我们需要认识到,人工智能技术是一个复杂和不断发展的领域。一款新的语言模型需要不断地进行迭代和改进才能达到更好的表现。因此,我们不能期望一款新产品能够立刻和已有的产品媲美,需要给予它更多的时间和空间来成长和发展。

其次,我们应该注意到我们和美丽国IT技术之间的差距。虽然我们在人工智能领域的进步十分迅速,但与美丽国的科技巨头相比还有一定的差距。这主要是由于美丽国的科技公司拥有更为先进和成熟的研发和创新体系,以及更为完善的技术生态。因此,我们的科技企业需要更多地进行技术积累和创新投入,以便在全球市场上更好地竞争。

最后,我们需要认识到,IT技术不仅仅是一种商业竞争,更是全球社会的共同进步。作为全球最大的人口国家和第二大经济体,我们在科技创新方面发挥着越来越重要的作用。因此,我们需要给予我们的科技企业更多的支持和鼓励[……]

继续阅读

一个月备考软考中级软件设计师经验分享

场景

做IT的都有这样的思维:抛开场景聊方案,那就是耍流氓

报考软考的大多有2种场景,一是真心向上,想学习,顺便考个证书证明下自己,另外一种目的就是考证,为了各种补贴、职称、积分等,我就是属于后者,我考的是021地区2022年下半年的考试,上午题50分,下午题56分。

因为在021地区软考可以很方便的增加积分,并且软考是以考代评(也就是考上了,就拥有了中级职称的评比资格,只需要单位的聘书就是中级职称了)

以上并未认证过!

目标

我考的是中级软件设计师,因为我本身就是做了10年左右的Java后端开发,多少有些基础,另外如果想要高级职称的话,对中级职称的资格取得的时间是有要求的。

所以我的目标就是尽量让自己通过两门45分。

过程

了解软考

这次我是从8月份了解到软考并且决定参加考试,在开始的时候看了B站上几个视频,讲了软考的范围,时间,以及题型。看看跟自己是否对口再决定是否考试。

看视频

我看的是很久之前希赛王勇老师的视频,老师讲的很好,但是我认为不太适合我这种速通玩家,反而适合那种时间充裕,并且想学知识的同学。

老师每一章讲的都比较仔细,特别是算法那块,但是未必讲的越细,考题分数比例[……]

继续阅读

记一次错误集成Seata分布式事务组件的经历

先说结论,这是一个非常愚蠢的问题,一个错误的开始,怎么也不可能有正确的结果。

最近在研究SpringCloud,于是学习了一下Ruoyi Cloud版本,本来一切都很顺利,直到在集成Seata分布式任务的时候,使用 @GlobalTransactional 连用 @Transactional的时候,出现了问题,始终会报一个错误:

Could not register branch into global session xid = xxx status = Rollbacking while expecting Begin

org.springframework.transaction.TransactionSystemException: JDBC commit failed; nested exception is java.sql.SQLException: io.seata.core.exception.RmTransactionException: 
Response[ TransactionException[Could not register branch into[......]

继续阅读

二代逸动XT车机免ROOT安装第三方软件教程(全网唯一)

不要折腾

18年的二代逸动XT,到手4年多,最近闲来无事想折腾一下它的车机,很早就知道这个车机能装第三方软件,但是一直都没尝试,所以……

如果说世间一切问题的起源都来自于 闲得蛋疼 + 吃饱了撑的 ,一点也没错,所以,不要折腾。

搜了一圈关键字,一篇都没有对标写二代逸动XT的,大部分都是2018+的逸动(二代逸动)以及长安其他车型,但是教程中,不是版本不匹配,就是步骤缺失,或者是步骤无效,所以这篇或许是全网唯一的逸动XT的车机教程,而且是保姆级的,而且几乎所有的教程都需要ROOT,而ROOT是有风险的,能不搞就别搞了,我用的还是ADB的方法。

我的车型 2018二代逸动XT 自动风潮版 ,理论上当年的逸动平台都是相同的车机,因为同年的逸动在内饰和系统上,都是非常相似,甚至是一个版本的(车机 NOT 行车电脑)。

一些问题

先说问题,先加深印象,在操作失败之后,再回过头看看

  1. 如果直接安装APP,U盘安装、adb安装、PC版的xx助手安装都会失败,底层应该是限制了,会提示xxx.ap is not auth,install failed!
  2. 高德地图升级失败,尝试过网上放出来的,3.2.8、3.2.9、4.3版本均已闪退告终,试了几次就放弃了
  3. 我这里 adb reboot 或者再adb shell里执行reboot now,都不会让车机重启,必须熄火10分钟左右才会彻底关机,没有找到好办法,带来的问题就是每次做测试都需要等很久
  4. 由于车机性能不高,安装这些软件其实并没有带来多少快感,且行且珍惜,还是那句话,不要折腾
  5. 不恢复出厂设置,只放到/system/app下等待重启安装,我只尝试过一次,当时qq音乐安装上了,猜测是com.tencent.xxxx这样的包是白名单,但是后来没有尝试,可以考虑将别的apk修改包名来达到这个效果,需要测试

准备工作:

  • 一根双公头的USB线
  • 一个充满电的笔记本电脑
  • 驱动管理软件 [下载地址在文末]
  • 下载好 adb 工具,和你想要的软件(apk)
  • 自己的手机

步骤

  1. 先把车机连上蓝牙,因为只有连上蓝牙才能在inCall里呼出拨号界面,输入 *#518200#* ,车机就会进入安卓原生界面。

  2. 在根菜单 安全 下,打开 允许安装未知来源的软件,返回

  3. 在根菜单 开发者选项下,打开 USB 调试,返回

  4. 在根菜单 主屏幕 中选择启动器为默认启动器

  5. 把连上蓝牙的手机拨一个错误的号码,为的是在车机上呼出拨号键盘(如果你有其他办法可以忽略)

  6. 输入 *#518121#*,此时会提示 操作成功,类似这样的提示

    在很多教程里,都会让下面在输入一个 *#518101#* 用于打开 ADB,而我这边测试下面是没反应的。而有另一个打开 ADB 的地方

  7. 把电脑用USB线连接车子左边那个USB口

    其实到这一步,幸运的可能已经能听到电脑提示接入新的硬件设备的声音了,但是我本身在折腾过程中,不是这么操作的。因为可能已经打开过 ADB 了

  8. 按住方向盘音乐界面,然后左下角回到主页,打开一个叫工程模式的APP,在左侧菜单 功能测试里打开系统ADB,并且关掉 小灯,然后左侧菜单拉到最下面 自动化测试,会看到一个叫 连接 ADB的按钮,点它!

    • 因为在第4步已经修改过启动器了,所以在音乐那边按主页按钮会回到安卓原生首页
    • 并且如果不关闭小灯,在自动化测试会因为背景光的问题,看不到连接ADB
    • 此时无论如何,电脑也应该识别到了新硬件了
    • tip:在拨号界面输入 #201301# 也可以进入工程模式

[……]

继续阅读

解析 HMDB 代谢物(Metabolite) 数据库并做本地化查询服务

背景介绍

本项目用于本地化查询、导出 HMDB 中的代谢物的信息。原始数据来自于:https://hmdb.ca/downloads (版本5.0,Data Set of All Metabolites),原始文件非常大,大约在 6G,先使用 Python 将原始代谢物的数据导入到 Mongo DB 中,然后再在Java项目中提供查询和导出。

解析代码

先要解决的一个问题就是如何读取一份超级大的XML文件,一次性读取到内存里显然不适合,虽然这次文件不大,只有6G,在生信分析的服务器动辄512G的内存前面来说就是弟弟,但必定开发还是在本地,而且保不齐后面文件还是会有更新

Python解析XML的库很多,用了 xml.etree.ElementTree 来处理,使用 iterparse 方法来迭代每一个标签,当遇到你需要处理的标签的时候,就来处理,并且使用了一个生成器(这里完全为了体验一下Python语法,也可以不用)

#!/usr/bin/python3

import xml.etree.ElementTree as ET
import psutil
import os
import xmltodict, json
from MongoDBUtil import MongoDBUtil

#这是原始xml里的namespace
namespace = '{http://www.hmdb.ca}';
def hmdbParse(filename, groupTag):
    '''
        增量解析 filename ,并且按groupTag作为一组,其实这里就是 metabolite 了
        使用了生成器,并且使用
    '''
    ET.register_namespace("xmlns","http://www.hmdb.ca")
    #迭代文件,增量
    doc = ET.iterparse(filename, ('start', 'end'))
    # Skip the root element
    next(doc)

    #循环读取解析器得到的结果
    for event, elem in doc:
        if event == 'end':
            #一旦是结束标签,并且是你想要的标签,就return出去
            if namespace+groupTag == elem.tag:
                yield elem
                #这里是把上一次的标签清空掉,这样就不会占用太多内存
                elem.clear()

if __name__ == "__main__":
    #xml文件地址,和需要解析的标签
    data = hmdbParse('hmdb_l30000.xml', 'metabolite')

    mongoUtil = MongoDBUtil(ip="127.0.0.1", db_name="bio_db", port="27017")
    insertBatch = []
    idx = 0
    for meta in data:
        #使用自带方法转换成xml字符串的字节流
        xmlstr_byte = ET.tostring(meta, encoding='utf8', method='xml')
        #转换成UTF8的xml字符
        xmlstr = str( xmlstr_byte,encoding = "utf8" ).replace("xmlns:","");
        #转成字典
        xmldict = xmltodict.parse(xmlstr) 
        accessionId = meta.findtext(namespace+"accession")

        #批量插入
        insertBatch.append(xmldict)
        idx+=1
        if(idx % 500 == 0):
            #500条插入一次
            mongoUtil.insert_many(collect_name="hmdb2210", documents=insertBatch)
            #插入后清理一下    
            insertBatch.clear()
            print("insert 500 data, clear")

    #如果循环执行完了,insertbatch中还有小于500的,那就执行完,因为我也不知道
    #怎么判断生成器是不是执行到了最后一个行
    if(len(insertBatch) < 500):
        mongoUtil.insert_many(collect_name="hmdb2210", documents=insertBatch)

    print('all data done.')

[……]

继续阅读

使用 leetdown 强制降级iPad mini2的一些问题

既然能看到这篇文章,说明leetdown的用法和场景就不用多说了,网上的教程很多,搜索关键字 leetdown、A7、iPad mini2 降级 就会有很多结果。

我手上有2台mini,都准备降级一下,但是经历了很多次失败,我也看到网上说的很多原因,大概整理了一下,先说结论,我是在M1的Mac Mini下成功的。

  • 网上成功率比较高的是 2.0.1a 版本
  • 如果持续的失败,尝试用爱思助手重新刷好系统,再次尝试(我就是这样成功的)
  • 不要使用usb扩展坞之类的,直接插电脑
  • 使用官方数据线,C口线在n次失败的过程中使用过,但最后成功是A口
  • 保持足够电量,至少20% (怀疑这是我失败多次的原因)
  • 关掉代理(网上看到的,感觉没有理论支撑,死马当活马医了)

下面看图说一下我的过程。准备软件 https://github.com/rA9stuff/LeetDown 和数据线,以及你准备复活的设备。

用爱思助手下载好10.3.3 的固件

插上线,信任电脑

此时leetdown会提示没有进入DFU模式,爱思助手也没显示

按住Home和关机键,大概5秒左右会黑屏,然后松开关键键(Home持续按),[……]

继续阅读

使用PaddleRec构建电影推荐系统

最近在学习智能推荐这块的内容,以前从来没有接触过,而且对数学、算法这类的知识是有所欠缺的,所以学习起来可能会费力些,所以就基于百度AI平台做一些demo

我理解的智能推荐

一共3个部分,分别是 用户信息、项目(Item)信息、用户和内容关联信息,拿常见的电影喜好预测来说,用户信息是网站用户,项目信息是电影,而内容关联信息是用户给电影的打分,通过把大量的用户特征+项目特征,和真实评分放到一起,可以通过一些模型来学习这些用户的喜好,其实就是把某一类用户的特征总结出来,发现他们喜欢什么类型的电影。

为什么选择PaddleRec

在算法和机器学习领域,我属于小白,而通过体验了一些关于机器学习的附带产品后,感觉百度AI还是非常不错的,例如它的图像处理等,而且主要是Ai Studio有一键部署的坏境和免费的GPU训练,并且也有很多前辈写好的代码和说明。

下面就把在AI Studio平台学习的过程分享出来,我在百度平台开源的项目地址在 https://aistudio.baidu.com/aistudio/projectdetail/4508155

项目概述

本项目的代码是基于 告别电影荒,手把手[……]

继续阅读

Java 利用 Thumbnailator 合成图片实例

一直以来 Thumbnailator 都是图片压缩、制作缩略图的利器,也是一直在更新,最近一次的更新也是在2022年的1月初。(https://github.com/coobird/thumbnailator

最近项目中遇到一个分享的功能,需要后台合成一张图片,图片除了本身的模板之外,还有一个用户头像、文字、二维码、和一些其他信息,就像下面这张图。

file

本身项目中也是用到了 Thumbnailator,后来就想着减少引入包,看看它有没有合成的功能。一顿Google猛如虎,没有明确的找到图片合成,但是留意到一个关键字,就是“水印”,一般的水印都是带透明度的,要是我把水印的透明度设置成 0%,不就好了,开干!~

最终代码如下:


//GroupBuyInfo 这是我获取信息的自定义的Bean
    public static BufferedImage makePoster(GroupBuyInfo gbi){
        //待返回的 BufferedImage对象,如果你想返回其他的也很方便
        BufferedImage poster = null;[......]

继续阅读

记一次Spring里在事务和同步锁中犯的错误

先简单描述一下状况,有订单相关业务,一共有2个service类,一个操作订单简称order(Service),一个操作库存的,简称inventory(Service),在order中有A方法,是在数据库中新增订单数据的,在inventory中,有B方法,是扣除库存用的,在方法A中,会调用B,这2个service的class都加了 @Transactional 注解,情况大概是这样。

class orderService{
    public void A(){
        //保存订单信息
        saveOrder();

        //扣除库存
        B(); 

        //其他业务代码
    }
}

在B方法,扣除库存当中,会先查询该商品的库存(大概意思,实际业务中会比较多的校验),然后做对应得库存扣减,但是呢,这个B方法,是个通用(公共)方法,在仓储模块中,也会调用到这个方法,所以我非(zi)常(zuo)得(cong)意(ming)的在 B 方法上加了 synchronized 关键字,企图给这个方法加个同步锁,好在并发的时候不要扣错库[……]

继续阅读

使用MyBatisPlus的自定义SQL方法时遇到的一些问题

在MyBatisPlus的使用过程中,之前很多时候都是使用queryWrapper(条件构造器)的构造方法传入实体对象,来实现条件的构造,例如

contentCategoryService.list(new QueryWrapper<ContentCategory>(contentCategory))

这个方法里是这么写的,原先我以为构造这里会去利用entity构造一个MP的条件对象,直到我用了自定义sql的方法。

public QueryWrapper(T entity) {
    super.setEntity(entity);
    super.initNeed();
}

MP 是支持自定义sql的,官方文档用法如下:
file

看demo的理解就是MP会帮助你拼接wrapper中构造的条件,利用 ew.customSqlSegment 注入到sql中去,但是在实际使用中发现,只有调用条件构造方法(例如 eq like ne 等方法)才能顺利的拼接到SQL中去,这个着实让不少人踩了坑(并没有诋毁和不尊重开源团队的意思),因为这个文档也是在2020年才补上去的 &#x1F6[……]

继续阅读