开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
Computer Science

说下 RESTful API 使用的几个方法

在最近的面试中,有问到说是说一下 RESTful API 的几个方法。 这次面试问的问题还是比较多的,但是很多问题都是开放性问题,说心里话很长时间没有遇到这样比较好的沟通式面试了。 不少公司,以上来就做题目,这个让人很反感。 不过现在做题目的过程中,很多公司也都强调,我们不需要有完整的方案,不能运行也没有关系,主要是看思路吧。 小结 这个问题是完全的开放式问题,如果你的公司不完全按照 RESTful 的设计来的话,可能大概率会用到 POST, 和 GET。 因为上面的这个 2 个方法是最常用的。 我的回答是:这个和项目有关,有些项目在设计的时候为了不对方法进行过多约束,会全部要求使用 POST,哪怕是请求资源也是要求 POST 的。 那么如果使用 POST 我们如何进行删除,这个通常会在请求的 JSON 数据块中添加一个 Action 的字段,在这个字段我们告诉后端程序这次调用我们是干什么用了。 后续问题 PUT 在聊了上面的问题后,又问了一个后续的问题,PUT 和 PATCH 的区别是什么呀? 这个还真有点把我给问到了。 我们很多项目真正用到 PUT 和 PATH 的情况不多,大部分情况都是 POST 给代劳了。 既然问到了,那么就有必要脑补下相关 RESTful API 用的几个方法了。 RESTful 的 5 个方法 在 RESTful 中,我们定义了 5 个方法。 GET:读取(Read) POST:新建(Create) PUT:更新(Update) PATCH:更新(Update),通常是部分更新 DELETE:删除(Delete) 对获取资源,我们通常是 Get,就好像和网页进行交互的时候,我们访问一个网站,其实对应的很多时候都是 GET 请求,把我们需要的资源请求过来。 POST 通常用于和服务器进行交互,包括数据的添加,查询,修改等等,其实都可以用 POST 来完成的。 DELETE 方法,这个方法用于从服务器上删除数据用的。很多人以为从服务器上删除数据后,服务器会把数据真实进行删除。在一般的数据量不是非常大的应用系统中,我们的设计大部分是打上一个删除标记,数据不显示,但是数据还是真实存在的。 因此删除的方法是可以用 POST 来解决的,DELETE,在 API 的设计中就没有 POST 和 GET 常见了。 PUT 方法:PUT 方法就是更新了。这个地方应该定义为全对象更新,比如说用户对象,我们有很多属性,如果你使用 PUT 对象的话,就会把用户对象中的所有属性全部更新掉。 PATCH 方法:这个是 PUT 更新方法的进阶版本。假设你还是要更新一个用户数据,这个时候你不需要把所有的用户数据全部上传上来。比如说只更新用户的地址这一条记录,你可以直接只在方法中上传用户地址信息,服务器就只更新地址。 PUT 方法的实体无结构的,它直接把实体部分的数据替换到服务器的资源上。 而 PATCH 提供的实体则需要根据程序或其它协议的定义,解析后在服务器上执行,以此来修改服务器上的数据。也就是说,PATCH请求是会执行某个程序的,如果重复提交,程序可能执行多次,对服务器上的资源就可能造成额外的影响,这就可以解释它为什么是不幂等的了。 假设我们有一个UserInfo,里面有userId, userName, userGender等10个字段。可你的编辑功能因为需求,在某个特别的页面里只能修改userName,这时候的更新怎么做? 人们通常(为徒省事)把一个包含了修改后userName的完整userInfo对象传给后端,做完整更新。但仔细想想,这种做法感觉有点二,而且真心浪费带宽,从现在的技术角度来说,带宽的问题通常考虑得不是非常多了。 更主要的是安全相关吧,本来你只需要更新一个用户名的,结果用 PUT 把整个用户对象的数上传上去了,等于在网络上传递了一些没有用的信息,这可能会存在一定的泄露风险。 于是patch诞生,只传一个userName到指定资源去,表示该请求是一个局部更新,后端仅更新接收到的字段。 而put虽然也是更新资源,但要求前端提供的一定是一个完整的资源对象,理论上说,如果你用了put,但却没有提供完整的UserInfo,那么缺了的那些字段应该被清空。 实际情况 在实际上,我们更新很多时候也会使用 POST 方法。 例如上面说的只更新地址信息,实际上服务器的操作还是根据你上传的用户 ID 到数据库中查询用户信息,然后返回用户对象。 下一步就是对你上传的数据进行校验,对提交的更新字段进行更新,对没有提交的更新字段进行忽略。 所以 PUT 和 PATCH 是可以通过 POST 方法来实现的,而且很多情况我们也会用 POST 方法来实现。   https://www.isharkfly.com/t/restful-api/14995

2023年09月21日 0Comments 589Browse 0Like Read more
Computer Science

Java 8 和 11 开始提供的新特性面试

说下 Lambda function Lambda 是 JDK 8 以后的版本才提供的功能。 在 JDK 8 之前是没有的。 Java Lambda表达式 的一个重要用法是简化某些匿名内部类 (Anonymous Classes )的写法。实际上Lambda表达式并不仅仅是匿名内部类的语法糖,JVM内部是通过invokedynamic 指令来实现Lambda表达式的。 上面的解释是不是属于完全没有看明白的那种呀。 这样理解吧,对我们一般使用的方法来说,我们需要输入的变量,然后对输入的变量进行操作。 现在我们在输入的变量部分写成一个函数,让函数作为输入的参数来让方法进行计算。 如下面的代码,我们对 HashMap 进行遍历。 employeeSalary.forEach((employee, salary) -> { System.out.println(employee + " => " + salary); }); 至于实现来说,就相对复杂点,对目前使用的概念来说,能知道上面的内容就大致差不多了。     Optional 类 如果你写过一些 Java 代码的话,你应该知道 Java 中最常见的就是空指针异常错误。 这个错误的原因就是你对一个为空的对象进行操作了。 比如说,你有一个 List,但是这个 List 是空对象,如果你要向这个 List 中添加元素或者删除元素的话,你铁定会遇到空对象的异常。 Optional 类是一个可以为 NULL 的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。 这个问题在我们网站上已经有了很多的讨论了,如希望了解更多,请参考:Java 8 开始新增的 Optional 类 针对面试的回答,Optional 主要是尝试解决 Java 中遇到的过多的空对象异常问题。 在 Spring 的 JPA 的查询中,我们也会大量的使用 Optional 来进行返回。     上面的 JPA 查询就是使用的是 Optional。   https://www.isharkfly.com/t/java-8-11/14996

2023年09月21日 0Comments 684Browse 0Like Read more
Computer Science

Java 消息策略的实现 - Kafak 是怎么设计的

这个也是开放讨论题,主要讨论下 Kafka 在消息中是如何进行实现的。     总结 这个题目的开发性太强了。 Kafka 可以用的地方非常多,我经历过的项目有 Kafka 用在消息处理策略上的。这个主要是 IoT 项目,因为这个项目需要对温度传感器采集获得数据。 当我们有多个数据采集点的时候,通常是在每分钟发送几条数据的样子。 哪怕是这种使用场景,我觉得从系统架构的考虑来说还是过于臃肿了,因为 Kafka 的运行需要 ZooKeeper,一套 ZooKeeper 的运行至少是需要 3 台服务器。 正常的生产环境部署,我们可能要部署到 5 太服务器上。 对于一个每秒钟消息都不到 1 条的消息服务器来说,实在是太重了。 其实这种使用场景,我们可以用一些轻量的消息服务器,比如说 ActiveMQ,我就觉得非常好。 可以简单到使用一个 Docker 容器就可以完成了,但消息处理能力也还是强大的。 对于 Kafka 这种野兽级的消息处理服务器,实在是用不上。 缓存 我们还经历过一个项目,Kafka 被用作缓存了。 每次项目启动的时候,都需要从 Kafka 上获得缓存数据,然后系统才能运行。 这个也是非常痛苦的,有时候因为缓存机制的使用不确定,导致部分时候的数据缓存上没有。 然后在调试的过程中就非常的痛苦。 面试回答 根据上面的情况,对这开放性的问题,通常只需要说说你对问题的了解情况就好了。 一般来说还是不会要求你做到具体的实现的,只要你对消息服务器有一些相关的知识,上面的 2 个使用案例还是比较经典的。 其实消息服务器还有很多可以使用的场景,比如说数据解耦,对爬虫数据的数据解耦等等,都是可以用的。 很多公司还会做一个消息服务器,比如说对订阅用户的消息回复,手机消息推送等等,都需要我们的消息服务器去处理。 所以这个问题为设计型问题,只需要对相关问题有所了解即可。   https://www.isharkfly.com/t/java-kafak/14999

2023年09月21日 0Comments 831Browse 0Like Read more
Computer Science

算法讨论题 —— Java实现两数之和

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。即:每个index上的数字只能用一次。 示例 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 解答 这个题目的原题是在:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 网站上能找到。 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 示例 2: 输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3: 输入:nums = [3,3], target = 6 输出:[0,1] 提示: 2 <= nums.length <= 104 -109 <= nums[i] <= 109 -109 <= target <= 109 只会存在一个有效答案 进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗? 完整的题目要求如上。 应该对所有人第一次想到的就是使用 2 个 For 循环吧。 for (int i = 0; i < nums.length; i++) { for (int j = i + 1; j < nums.length; j++) { if (nums[j] == target - nums[i]) { log.debug("{}", new int[]{i, j}); } } } 然后从 2 个 for 循环中获得下标列表,最后 break 循环就可以了。 进阶问题 如何让我们只使用 1 个 for 循环的情况下解决这个问题。 这个时候我们就需要使用 HashMap 了。 首先,我们把数据放入到 HashMap 中。 然后取第一个元素,当取得第一个元素后,再用和减去第一个元素,这个得到的值为另外一个元素。 然后拿着这个元素到 HasMap 中去找,如果找到了就返回,如果没找到就继续去获得下一个元素。 然后再拿和去减去获得的第二个元素后再到 Map 中去找。 Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { map.put(nums[i], i); } for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement) && map.get(complement) != i) { log.debug("{}", new int[]{i, map.get(complement)}); } } 用一个 Map 解决 还有一个更高的效率,就是在循环一次,然后用 Map 解决。 在上面的解决方案中,我们在对 HashMap 遍历了 2 次,第一次是构建 Map,第二次是从 Map 中查找。 能不能我们在构建的时候就完成操作。 答案是肯定的。 于是,我们就有了下面的代码: Map<Integer, Integer> map2 = new HashMap<>(); for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; if (map.containsKey(complement)) { log.debug("{}", new int[]{map2.get(complement), i});…

2023年09月21日 0Comments 758Browse 0Like Read more
Computer Science

传统的经典问题 Java 的 Interface 是干什么的

传统的经典问题 Java 的 Interface 是干什么 解答 上面的这个问题应该还是比较好回答的吧。 只要你做过 Java ,通常 Interface 的问题多多少少会遇到,而且可能会遇到一大堆。 在JAVA编程语言中是一个抽象类型(Abstract Type),它被用来要求类(Class)必须实现指定的方法,使不同类的对象可以利用相同的界面进行沟通 。 简单来说,接口就是用来实现的。 因为前一段时间我们研究了下接口,请参考文章:说完 Java 的 Abstract 后再来说说接口 (interface ) 中的内容。 同时,在面试的时候,我还举例了一个 HttpClient 和 OkHttp 的用接口实现的问题。 举个实际使用的例子,我们现在有一个这样的需求,发送一个 HTTP 请求,获得用户的数据。 当我们希望对这个进行实现的时候,我们可以使用 apache 的 httpclient 这个包来完成 http 的调用,我们也可以使用 OKHttp 这个包来实现 http 的调用。 为了定义大家都使用的方法,我们就在这 2 个调用之前,定义了一个接口来要求我们的 2 个子类分别使用不同的包来实现完成调用返回结果。 别忘了,JPA 中的 Repository 也是定义成接口了喔。 通常,您的存储库接口将会扩展Repository , CrudRepository 或PagingAndSortingRepository     这样看来,这个接口是不是有点意思呀。   https://www.isharkfly.com/t/java-interface/14997

2023年09月21日 0Comments 598Browse 0Like Read more
Computer Science

Eclipse 安装 Lombok

小辣椒 Lombok 在 IDEA 中是可以自动启用进行安装的。 但在 Eclipse 中就发麻烦点了,需要手动下载包,然后进行安装。 找到需要的包 使用 Lombok 版本比较高的包就好了。     上面我们可以自己下载 1.18.28 的版本到 Eclipse 的安装目录中。     通过命令行运行     直接运行 java -jar lombok.jar 就可以看到上面的目录了。 然后选择继续安装就行。 然后重启你的 Eclipse, 重新编译项目。 项目中提示的 Log 错误问题就不解决了。 直接运行我们的项目,我们能看到项目中的运行结果。     还是有点麻烦的 Lombok 安装。   https://www.isharkfly.com/t/eclipse-lombok/14993

2023年09月21日 0Comments 621Browse 0Like Read more
Computer Science

Python 通过 stomp 发送消息到 ActiveMQ 的代码

只需要下面简单的几行代码,我们就可以把我们本地数据发送到 ActiveMQ 上面去。 def send_mq(data): hosts = [(AMQHOST, AMQPORT)] conn = stomp.Connection(host_and_ports=hosts, auto_content_length=False) conn.connect(username=AMQUSER, passcode=AMQPASS, wait=True) conn.send(body=json.dumps(data), destination=TOPICNAME) conn.disconnect() 上面需要根据你自己的服务器配置情况配置参数。 为什么使用消息不使用 API 调用 在跨平台数据交换的时候,我们其实有很多可以实现的方法。 我们可以构建一个 API 服务器,让不同的客户端调用不同的端口来实现数据交换。 我们也可以使用消息服务器,让不同的工具获得自己的数据后发送约定好的数据格式到消息服务器上,然后让我们后台部署的数据服务器来从消息服务器上获得数据并且进行处理。 使用消息服务器的好处是显而易见的,当有多个客户端的时候,我们可以通过消息服务器来作为缓存。 非常重要的一个作用就是解耦。 用户的数据只负责获得数据,比如说我们常用的例子,我们会使用不同的工具来做爬虫程序。 当爬虫获得数据后,爬虫程序将会把已经获得数据组装成消息,然后发送到消息服务器上。 相比较我们让爬虫程序直接调用接口,这样的耦合度更低。 爬虫程序不需要了解接口是怎么定义的,只需要发送我们约定好的数据格式就行。     同时假设我们有多个爬虫程序的话,多个程序的 API 调用将会对后端的 API 程序造成负载,而且爬虫程序的启动时间是不一样的,有可能短期有大量的数据涌入,这样我们可以通过消息服务器让程序自动运行,当没有消息的时候,后端程序属于空闲,可以消费积压的消息。 当大量消息涌入的时候,因为消息服务器的消峰功能,不会让后端的数据处理程序出现问题,保持更好的吞吐量。   https://www.isharkfly.com/t/python-stomp-activemq/14990

2023年09月20日 0Comments 577Browse 0Like Read more
Computer Science

Selenium python 代码运行的时候提示 no attribute 'find_element_by_xpath'

我们有下面的一行代码,运行测时候提示没有特定的属性。 Name = 'kuch bhi' last = test.find_element_by_xpath('//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input') last.send_keys(Name) 问题和解决 根据官方的修改记录, * Deprecated find_element_by_* and find_elements_by_* are now removed (#10712) 这个方法在 4.3 的版本后已经被删除了。 官方链接:https://github.com/SeleniumHQ/selenium/blob/a4995e2c096239b42c373f26498a6c9bb4f2b3e7/py/CHANGES     针对 xpath 的查找,官方简化为使用了 find_elementfind_element 这个方法。 如果是希望返回的是一个数组或者列表的话,我们将会使用下面的方法: rowContent = chrome.find_elements(By.XPATH, '/html/body/div[3]/div/div/div/div[4]/div/table/tbody/tr') 唯一不同的就是方法后面多了一个 s,有 s 的是返回数组或者列表。 https://www.isharkfly.com/t/selenium-python-no-attribute-find-element-by-xpath/14989

2023年09月20日 0Comments 656Browse 0Like Read more
Computer Science

Python 和 Selenium 的浏览器爬虫

Selenium 是一款强大的基于浏览器的开源自动化测试工具,最初由 Jason Huggins 于 2004 年在 ThoughtWorks 发起,它提供了一套简单易用的 API,模拟浏览器的各种操作,方便各种 Web 应用的自动化测试。 它的取名很有意思,因为当时最流行的一款自动化测试工具叫做 QTP,是由 Mercury 公司开发的商业应用。Mercury 是化学元素汞,而 Selenium 是化学元素硒,汞有剧毒,而硒可以解汞毒,它对汞有拮抗作用。 Selenium 的核心组件叫做 Selenium-RC(Remote Control),简单来说它是一个代理服务器,浏览器启动时通过将它设置为代理,它可以修改请求响应报文并向其中注入 Javascript,通过注入的 JS 可以模拟浏览器操作,从而实现自动化测试。 但是注入 JS 的方法存在很多限制,譬如无法模拟键盘和鼠标事件,处理不了对话框,不能绕过 JavaScript 沙箱等等。 就在这个时候,于 2006 年左右,Google 的工程师 Simon Stewart 发起了 WebDriver 项目,WebDriver 通过调用浏览器提供的原生自动化 API 来驱动浏览器,解决了 Selenium 的很多疑难杂症。不过 WebDriver 也有它不足的地方,它不能支持所有的浏览器,需要针对不同的浏览器来开发不同的 WebDriver,因为不同的浏览器提供的 API 也不尽相同,好在经过不断的发展,各种主流浏览器都已经有相应的 WebDriver 了。最终 Selenium 和 WebDriver 合并在一起,这就是 Selenium 2.0,有的地方也直接把它称作 WebDriver。 Selenium 目前最新的版本已经是 3.9 了,WebDriver 仍然是 Selenium 的核心。 为什么 Selenium 成了爬虫工具 Selenium 的初衷是打造一款优秀的自动化测试工具,但是慢慢的人们就发现,Selenium 的自动化用来做爬虫正合适。我们知道,传统的爬虫通过直接模拟 HTTP 请求来爬取站点信息,由于这种方式和浏览器访问差异比较明显,很多站点都采取了一些反爬的手段,而 Selenium 是通过模拟浏览器来爬取信息,其行为和用户几乎一样,反爬策略也很难区分出请求到底是来自 Selenium 还是真实用户。而且通过 Selenium 来做爬虫,不用去分析每个请求的具体参数,比起传统的爬虫开发起来更容易。 Selenium 爬虫唯一的不足是慢,如果你对爬虫的速度没有要求,那使用 Selenium 是个非常不错的选择。Selenium 提供了多种语言的支持(Java、.NET、Python、Ruby 等),不论你是用哪种语言开发爬虫,Selenium 都适合你。 这是因为 Selenium 启动都需要调用浏览器的核心来启动一个浏览器。 同时,当浏览器访问网站的时候,如果数据没有载入完全,Selenium 是不会对数据进行分析的,有些网站的载入很慢,这样就导致 Selenium 的处理很慢。 这个不是因为 Selenium 程序慢,而是等待数据载入的时间太长。 启动浏览器 使用下面 3 句话就可以模拟启动一个浏览器,并且通过浏览器访问一个网站后,对网站来进行分析。 from selenium.webdriver import Chrome chrome = Chrome(service=Service(r"C:\Users\yhu\Downloads\chromedriver-win64\chromedriver-win64\chromedriver.exe")) chrome.get('https://www.isharkfly.com/') // Get Element rowContent = chrome.find_elements(By.XPATH, '/html/body/div[3]/div/div/div/div[4]/div/table/tbody/tr') 如实例没有启动的话,获得元素的代码就没有办法执行。 其实慢就是慢在这里。   https://www.isharkfly.com/t/python-selenium/14988

2023年09月20日 0Comments 494Browse 0Like Read more
Computer Science

Python 网络爬取的时候使用那种框架

尽管现代的网站多采取前后端分离的方式进行开发了,但是对直接 API 的调用我们通常会有 token 的限制和可以调用频率的限制。     因此,在一些特定的网站上,我们可能还是需要使用网络爬虫的方式获得已经返回的 JSON 数据结构,甚至是处理已经完成界面展示的数据了。 Selenium 与BeautifulSoup和Scrapy相比,Selenium是一个不同的工具。 Selenium 并不是为网络爬取而生的。它实际上是为网络测试而开发的。Selenium被用于网络应用程序的自动化测试。 它使网络浏览器自动化,你可以用它来代表你在浏览器环境中进行操作。然而,它后来也被纳入了网络爬取的范畴。Selenium可以发送网络请求,还带有一个分析器。通过Selenium,你可以从HTML文档中提取数据,就像你使用Javascript DOM API那样。 Selenium的主要优势在于它能加载Javascript,并能帮助你访问JavaScript背后的数据,而不一定要自己经历发送额外请求的痛苦。这使得Selenium不仅对自己有用,而且对其他工具也有用。 使用Scrapy或BeautifulSoup 的网络爬虫如果需要只有在加载Javascript文件时才能获得的数据,就会使用Selenium。 Selenium 会启动一个浏览器,同时在这个浏览器中进行操作的模拟。 同时 Selenium 还具有 HTML 的 DOM 分析能力,通过选择器,你可以选择需要的数据。 Scrapy Scrapy是一个网络抓取框架,它配备了大量的工具,使网络抓取和爬取变得简单。它在设计上是多线程的,并建立在Twisted之上。Twisted是一个异步网络框架,遵循对服务器的非阻塞I/O调用。因为它是多线程和非阻塞的,所以它在性能方面实际上是最好的,实际上是3个工具中最快的。Scrapy比这三个工具的一个优势是,它带有发送请求和解析响应的模块。 Scrapy 是开发复杂的网络抓取和爬虫工具,因为你可以创建大量的工作者,而且每个工作者都能毫不费力地工作。它的建立是为了消耗更少的内存,并将CPU资源的使用降到最低。事实上,一些基准测试表明,Scrapy在抓取方面比其他工具快20倍。它是可移植的,而且其功能可以扩展。 与Scrapy相关的主要问题是,它不是一个以初学者为中心的工具。 Scrapy 的文档比较难读,学习曲线也比较陡峭,我不认为这个工具比较适合初学者来使用。 Scrapy的一个主要缺点是它不能渲染 JavaScript;你必须发送 Ajax 请求来获取隐藏在JavaScript事件后面的数据。 这种情况对当前前后端分离的技术来说,还是有点麻烦的,我们必须要比较清楚的分析 AJAX 的数据请求。 BeautifulSoup 对应 Java 世界来说,Java 会有一个 JSoup。 一个针对 HTML 的 Dom 文件分析器和选择器,BeautifulSoup 在Python 中做了同样的工作。 通过让你对 HTML 界面中的内容进行分析和处理以便于能够从中获取数据。 比如说,如果界面中有表格,在表格中有数据,我们需要获取的就是表格中的数据的话,就可以使用 DOM 分析工具来进行分析。 总结 因最近我们在对爬虫的使用进行研究,对上面 3 个框架都有了一些探讨。 个人觉得比较简单的还是 Selenium,同时 Selenium 也足够强大,能够满足我们对一些小网站的爬虫分析。   https://www.isharkfly.com/t/python/14987

2023年09月20日 0Comments 472Browse 0Like Read more
1…7475767778…309
Archives
  • July 2026
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,385)
    • Confluence (663)
    • Gradle (12)
  • U.S. (557)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1