Deepin15安装Anaconda

1. Anaconda下载地址 官方下载地址:https://www.anaconda.com/distribution/#linux 清华大学镜像:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ # 选择你想安装的版本下载 2. 安装 $ bash Anaconda3-2021.05-Linux-x86_64.sh # 中间会有一些选择,按照自己的意愿选择即可 关闭并重新打开你的终端来激活conda 3. 使用 更新自己 # 更新conda conda update conda conda update anaconda 更新时出现了ValueError: check_hostname requires server_hostname错误,经查发现是代理的问题,可尝试关闭或开启代理再次尝试 对包的操作 更新包 conda update --all # 更新所有包 安装包 conda install [包名] 对环境的操作 创建环境 conda create --name [环境名字] # 使用默认的Python版本 激活环境 conda activate [环境名字] 退出环境 conda deactivate 查看环境名字 conda env list # conda info -e 删除环境中某个包 conda remove [环境名] [包名] 修改环境名字 conda create -n [新环境名] --clone [旧环境名] # 克隆旧的 conda remove -n [旧环境名] # 删除旧的 删除环境 conda remove -n [环境名] --all 4....

May 19, 2021 · 1 min · 李昌

野生Goroutine带来的问题及对应解决方案

一、野生goroutine的问题 引言: 毋庸置疑,golang原生的goroutine极大降低了程序员使用并发编程的代价,程序员们不需要再去关心如何实现接口、如何继承Thread类等多余的操作,只需要简简单单的go, 就可以开启一个并发的协程。但这种简单的使用方式同时也带来一些问题,这些goroutine不再受我们控制了,它们在运行时可能会发生任何错误或意外,而我们无法得知或去处理这些意外。我们将启动后不再受主进程控制的goroutine称为野生goroutine,本节将介绍野生goroutine存在的一些问题并介绍一些简单的解决方法。 1. goroutine中panic无法恢复 正常的函数中panic的recover import ( "fmt" ) func main(){ defer func(){ if err := recover(); err != nil{ fmt.Println(err) } }() var bar = []int{1} fmt.Println(bar[1]) } reflect: slice index out of range goroutine中panic的恢复 func main(){ defer func(){ if err := recover(); err != nil { // 在这里使用recover(),不能捕获panic fmt.Println("catch you, bad guy") } }() go func(){ fmt.Println("I'm in a goroutine") panic("come to catch me") }() time....

May 19, 2021 · 17 min · 李昌

Linux程序前台后台切换

1. 前后台切换 在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行 $ ./main & 如果程序正在前台运行,可以使用 Ctrl+z 选项把程序暂停,然后用 bg %[number] 命令把这个程序放到后台运行,摁Ctrl+z,然后在最后一行加上bg %number 对于所有运行的程序,我们可以用jobs –l 指令查看 $ jobs -l 也可以用 fg %[number] 指令把一个程序掉到前台 $ fg %1 也可以直接终止后台运行的程序,使用 kill 命令 $ kill %1 2. fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令 & 加在一个命令的最后,可以把这个命令放到后台执行,如 watch -n 10 sh test.sh & #每10s在后台执行一次test.sh脚本 ctrl + z 可以将一个正在前台执行的命令放到后台,并且处于暂停状态。 jobs 查看当前有多少在后台运行的命令 jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。...

May 18, 2021 · 1 min · 李昌

线程池

1. 线程池基础 1.1 野生线程 在我们平常的开发中,经常会有用到多线程的场景,合理利用多线程可有效利用CPU的多核结构,提高程序的执行效率。有这样一种线程:我们利用其完成一些工作,但只是将工作交给这个线程,该线程并不保证完成任务,也不保证正常退出,并且在线程开始运行后我们无法对其进行控制。这种状态可称为:野生线程,意为其已经不受控制,在内存中自由运行。 这种线程可能带来一系列问题: 频繁申请/销毁线程,可能带来巨大的额外消耗 当内存中存在较多的野生线程,会导致过分调度,降低系统性能 不能正常退出的线程会导致内存泄露 系统无法合理管理内部的资源分布,会降低系统的稳定性 …… 鉴于以上野生线程带来的问题,我们需要一种方式将其管理起来,使其从野生的线程变成"家养"的线程。 1.2 什么是线程池 池化:池化是一种将资源统一进行管理,从而最大化收益并最小化风险的思想。 线程池维护若干个线程,在总体上控制线程的数量,具体上控制线程的创建、销毁等生命周期,系统可通过申请线程池中的线程异步的完成某个任务。线程池通过对线程的管理实现对资源的有效利用,避免系统资源浪费或内存泄露等问题。 1.3 使用线程池的好处 线程池中的线程可反复利用,减少了线程创建和销毁的开销 任务无需等待线程创建即可开始运行,提高了系统响应速度 通过设置合理的线程池线程数,可有效避免资源使用不当,资源浪费 对线程运行进行有效的监视与管理 通俗易懂的讲,如果将线程比作完成任务的人,那么线程池就像一个专门管理这些人的部门。当我有任务到来时,直接把任务交给该部门,而不用自己再去找人来完成任务。 2. 线程池的工作机制 2.1 线程池模型 线程池的内部实际上可以看做是生产者消费者模型,二者并不直接关联,通过任务队列进行交互,从而可以有效的缓冲任务,复用线程。 在线程池模型中,扮演生产者角色的是任务管理部分,其接受提交的任务,并判断任务应如何处理: 直接申请线程执行该任务 缓冲到队列中等待线程执行 直接拒绝该任务 线程管理部分是消费者,线程被统一维护在线程池中,当有任务请求到来时,某一线程被分配去执行这个任务,执行完成后继续或许新的任务来执行,最终当线程获取不到任务时,线程就被回收以节省系统资源。 2.2 线程池的状态 线程池一方面维护自身的状态,另一方面管理线程和任务,使二者良好的结合从而执行并行任务。 线程池的状态有5种: 运行状态 状态描述 RUNNING 能接受新提交的任务,并且也能处理阻塞队列中的任务 SHUTDOWN 关闭状态,不再接受新提交的任务,但可以继续处理阻塞队列中已保存的任务 STOP 不能接受新任务,也不处理队列中的任务,会中断正在处理任务的线程 TIDYING 所有的任务都已终止,有效线程数为0 TERMINATED 在terminated()方法执行后进入该状态 其生命周期转换如下图所示: sequenceDiagram RUNNING->>SHUTDOWN:shutdown() RUNNING->>STOP: shutdownNow() SHUTDOWN->>TIDYING:所有任务都已完成,阻塞队列为空,工作线程数为0 STOP->>TIDYING:线程池中工作线程数为0 TIDYING->>TERMINATED: terminated() 2....

May 17, 2021 · 1 min · 李昌

deepin上升级Python

1. 安装高版本的Python 这里要说明,不能删除原来的python2以及python3.5,因为系统是依赖于这两个python版本的,当然你也可以试试,后果自负… 去官网下载最新的Python 我这里下载的是源码,因为没有对应的安装包。(Python3.9) 下载完成后解压到本地 sudo tar -xvf Python-3.9.5.tar.xz -C /opt/python 编译安装 cd /opt/python mv Python-3.9.5 python3.9 sudo ./configure --enable-optimizations # 默认安装到/usr/local/bin, 可用--prefix指定安装目录 make -j8 && sudo make altinstall sudo make clean 验证安装成功 /usr/local/bin/python3.9 Python 3.9.5 (default, May 13 2021, 09:51:10) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> exit() 2. 设置默认Python版本 2.1 用户级修改 vim ~/....

May 13, 2021 · 1 min · 李昌

清理本地分支

在使用git时,有时某分支已在远程服务器删除,但本地不会同步删除,这个分支依然存在。 如下命令可以删除本地版本库上那些失效的远程追踪分支,具体用法是,假如你的远程版本库名是 origin,则使用如下命令先查看哪些分支需要清理: $ git remote prune origin --dry-run 修剪 origin URL:git@yuhu.github.com:yuhu-tech/grampus-contracts.git * [将删除] origin/cq-2021-0227_refactor * [将删除] origin/lichagn-feat-impl-grc20 * [将删除] origin/lichagn-feat-impl-grc20-em20-em721 * [将删除] origin/lichang-feat-add-some-support-for-ANT * [将删除] origin/lichang-feat-impl-20-and-720 * [将删除] origin/lichang-feat-mdy-20 * [将删除] origin/lichang-feat-mdy-20-and-721 * [将删除] origin/litao-dev * [将删除] origin/runjam-v0.0.2 可以看到, 以上分支已经失效,将被删除,执行 $ git remote prune origin 修剪 origin URL:git@yuhu.github.com:yuhu-tech/grampus-contracts.git * [已删除] origin/cq-2021-0227_refactor * [已删除] origin/lichagn-feat-impl-grc20 * [已删除] origin/lichagn-feat-impl-grc20-em20-em721 * [已删除] origin/lichang-feat-add-some-support-for-ANT * [已删除] origin/lichang-feat-impl-20-and-720 * [已删除] origin/lichang-feat-mdy-20 * [已删除] origin/lichang-feat-mdy-20-and-721 * [已删除] origin/litao-dev * [已删除] origin/runjam-v0....

May 10, 2021 · 1 min · 李昌

同质化代币和非同质化代币

1. 什么是同质化代币(FT) 同质化代币是一种能够相互替换,具有统一性,可接近无穷拆分的代币。在同质化代币的交易中,只需要关注代币交接的数量即可,其价值可能会根据交换的时间间隔而改变,但其本质没有发生变化。 举例来说,美元,人民币都是同质化代币,虽然每一张美元或人民币的序号不同,但在面额相同的情况下,不同序号的币对持有者来说没有区别。 2. 什么是非同质化代币(NFT) Non-Fungible Tokens 非同质化代币包含了记录在其智能合约中的识别信息。这些信息使每种代币具有其独特性,因此不能被另一种代币直接取代。它们不能以一换一,因为没有两个 NFT 是相同的。 此外,非同质化代币也不可分割,就像不能送给别人演唱会门票的一部分一样,门票的一部分并不值钱也不能兑换。 非同质化的独特属性使得它通常与特定资产挂钩,可以用来证明数字物品(如游戏皮肤)的所有权,甚至实物资产的所有权,主要应用于游戏和加密收藏品领域。 FT 和 NFT 的一大区别在于使用了不同的合约接口,前者为 ERC-20,后者为 ERC-721。 3. 什么是ERC-20? ERC-20 协议是以太坊区块链较早的、比较流行的代币规格协议。若以太坊平台上两种代币都以 ERC-20 发行,则两者之间可以进行自由置换。ERC20 是标准代币接口,规定了其基本功能 , 方便第三方使用。系统开源使得 ERC20 的标准已经简单到可以 5 分钟发行一个 ERC-20 代币。ERC-20 代币听命于同一组代币合约的命令,也就意味着所有 ERC-20 协议中的代币都可轻松实现转移、请求、批准等功能,但其功能因此也具有局限性。 4. 什么是ERC-721? 相比于 ERC-20,ERC-721 协议功能更多且技术更先进。该协议是以太坊的针对不可置换代币的 NFT 数字资产的第一个标准,应用于 CryptoKitties、Decentraland 等项目。ERC721 标准正是由 CryptoKitties 的 CTO Dieter Shirley 所创建和发布的,Dieter Shirley 是 NFT 的奠基人之一。 虽然 ERC-721 较 ERC-20 用例较少,功能还处于探索之用,但 721 协议下的资产——画作、债券、房子或是汽车——的优势在于能保证所有权的安全性、所有权转移的便捷性以及所有权历史的不可更改性和透明性。另外,ERC721 还可以促进追踪、交易和管理真实资 产的交易和管理等等。随着游戏虚拟资产不断流行起来,5G 和 VR 不断普及,搭载区块链技术,721 协议前景一片光明。

May 6, 2021 · 1 min · 李昌

主机上设置两个git账号

ubuntu环境 0. 拉取github仓库的两种方式 在拉取github仓库时,我们常用 git clone https://github.com/username/repoName.git 的方式,这种方式使用https协议 还可以使用ssh协议,以如下方式拉取仓库 git clone git@github.com:username/repoName.git 以下介绍的设置方法,基于ssh协议。 1. 使用SSH连接到GitHub 使用 SSH 协议可以连接远程服务器和服务并向它们验证。 利用 SSH 密钥可以连接 GitHub,而无需在每次访问时都提供用户名和个人访问令牌。 检查现有SSH秘钥 在生成 SSH 密钥之前,您可以检查是否有任何现有的 SSH 密钥。 $ ls -al ~/.ssh # Lists the files in your .ssh directory, if they exist 如果你的主机上已有SSH公钥,则其可能是如下: id_rsa.pub id_ecdsa.pub id_ed25519.pub 如果你没有现有的公钥和私钥对,或者不想使用现有的秘钥连接到github,则可以生成新的SSH秘钥。 生成新SSH秘钥 输入如下命令: ssh-keygen -t rsa -C "your_email@example.com" 会有如下输出: Generating public/private rsa key pair. Enter file in which to save the key (/home/lc/....

April 25, 2021 · 2 min · 李昌

将两个commit合并为一个

使用git log命令查看git日志文件,假设为如下内容 commit cc7b5fc7bd2ae6f8d88144cd61c8ffad15d44e41 Author: yangchnet <1048887414@qq.com> Date: Sun Apr 25 19:40:03 2021 +0800 4-25 commit fbd7265095b4c8989fba830393eb32ef29cd9ee1 Merge: 3ae3c19 6a25204 Author: yangchnet <1048887414@qq.com> Date: Sun Apr 25 15:04:38 2021 +0800 Merge branch 'master' of https://github.com/yangchnet/Tem commit 6a25204187602449bfe4ca8c862c9677e65fed04 Author: yangchnet <30308940+yangchnet@users.noreply.github.com> Date: Thu Apr 22 21:36:05 2021 +0800 Delete CNAME ... 现在想合并最后两个提交,则进行以下步骤: 复制倒数第三个提交的哈希值,即:6a25204187602449bfe4ca8c862c9677e65fed04 使用如下命令进行合并: git rebase -i 6a25204187602449bfe4ca8c862c9677e65fed04 # 这个哈希值就是你刚才复制的 若有如下提示,请进行第4步,否则直接进行第5步 不能变基:您有未暂存的变更。 请提交或为它们保存进度。 使用git stash暂存修改 $ git stash 保存工作目录和索引状态 WIP on master: cc7b5fc 4-25 HEAD 现在位于 cc7b5fc 4-25 使用git rebase后,会出现如下内容 pick 3ae3c19 增加graphql介绍 pick cc7b5fc 4-25 # 变基 6a25204....

April 25, 2021 · 1 min · 李昌

Graphql基本概念

1. 什么是Graphql GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的runtime。 GraphQL对你的API中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让API更容易地随着时间推移而演进,还能用于构建强大的开发者工具。 一个 GraphQL 服务是通过定义类型和类型上的字段来创建的,然后给每个类型上的每个字段提供解析函数。 简单的说,GraphQL为我们定义数据库提供了更为便捷的方式,你不需要写任何SQL语句,即可完成数据库的创建及迁移等工作。 2. 概览 例如,一个 GraphQL 服务告诉我们当前登录用户是 me,这个用户的名称可能像这样: type Query { me: User } type User { id: ID name: String } 一并的还有每个类型上字段的解析函数: function Query_me(request) { return request.auth.user; } function User_name(user) { return user.getName(); } 一旦一个 GraphQL 服务运行起来(通常在 web 服务的一个 URL 上),它就能接收 GraphQL 查询,并验证和执行。接收到的查询首先会被检查确保它只引用了已定义的类型和字段,然后运行指定的解析函数来生成结果。 例如这个查询: { me { name } } 会产生这样的JSON结果: { "me": { "name": "Luke Skywalker" } } 3. Schema 和类型 GraphQL 服务可以用任何语言编写,但并不依赖于任何特定语言的句法句式(譬如 JavaScript)来与 GraphQL schema 沟通,Graphql定义了自己的简单语言,称之为 “GraphQL schema language”。...

April 22, 2021 · 3 min · 李昌