听过了API咱们来看看SPI是什么

引语平时API倒是听得很多?SPI又是啥.别急我们来先看看面向接口编程的调用关系,来了解一下,API和SPI的相似和不同之处。 SPI理解先来一段官话的介绍:SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.(听了一脸懵逼)好的,我们结合图片来理解一下。    简单的来说分为调用方,接口,服务方.接口就是协议,契约,可以调用方定义,也可以由服务方定义,也就是接口是可以位于调用方的包或者服务方的包.1.接口的定义和实现都在服务方的时候,仅暴露出接口给调用方使用的时候,我们称为API;2.接口的定义在调用方的时候(实现在服务方),我们给它也取个名字--SPI。应该还比较好理解吧? SPI的使用场景SPI在框架中其实有很多广泛的应用,这里列举几个例子:1.Mysql驱动的选择driverManager根据配置来确定要使用的驱动; 2.dubbo框架中的扩展机制(dubbo官网链接) 使用实例看完上面的简介和SPI在框架中的应用,想必对SPI在读者的大脑中已经产生了一个雏形,talk is cheap!show me the code.说了这么多,我们具体写一个简单的例子来看看效果,验证一下SPI. 1.首先定义一个接口,忍者服务接口 public interface NinjaService { void performTask();}2.接下来写两个实现类,ForbearanceServiceImpl(上忍),ShinobuServiceImpl(下忍) public class ForbearanceServiceImpl implements NinjaService { @Override public void performTask() { System.out.println("上忍在执行A级任务"); }}public class ShinobuServiceImpl implements NinjaService { @Override public void performTask() { System.out.println("下忍在执行D级任务"); }}3.接下来我们在main/resources/下创建META-INF/services目录,并且在services目录下创建一个com.scott.java.task.spi.NinjaService(忍者服务类的全限定名)的文件. 4.创建一个Client场景类来调用看看结果很完美的调用了两个实现类的performTask()方法. 5.最后贴一下目录结构附上一波代码例子的地址,在spi里面,git链接; SPI源码简单分析1.先看下核心类ServiceLoader的定义和属性 // 继承了Iterable类 遍历的时候使用public final class ServiceLoader<S> implements Iterable<S>{ // 这就是为啥需要在META-INF/services/目录下创建服务类的文件 private static final String PREFIX = "META-INF/services/"; // 被加载的服务 private final Class<S> service; // 类加载器 private final ClassLoader loader; // 访问控制类 private final AccessControlContext acc; // 实现类的缓存 根据初始化的顺序 也就是在/services/文件中的定义顺序来定义的加载顺序 private LinkedHashMap<String,S> providers = new LinkedHashMap<>(); // 懒加载iterator private LazyIterator lookupIterator;2.然后从client开始,然后依次debug进去 ...

June 16, 2019 · 4 min · jiezi

git笔记整理

June 16, 2019 · 0 min · jiezi

git学习笔记

一、git基本操作git init 初始化工程git clone url 克隆工程 add && commit && push && pull && status git add . (git add -A)添加全部修改文件,包括untracked的文件git add -u 添加修改的文件,不包括新建的文件git commit -m '提交信息' 提交已经添加缓存区的文件git commit -a -m '提交信息' 提交修改过的文件(包括未添加到缓存区的)git push -u origin master 加了参数-u后,以后即可直接用git push 代替git push origin mastergit push -f 强制提交(适用于旧版本覆盖新版本)git pull 拉取最新代码git status 查看状态(commit前的状态)git status -s 查看简洁版git diff 查看修改内容 远端 remote git remote -v 查看远端地址git remote set-url origin [url] 修改远端地址git remote -v 查看远端链接git remote rm origin 删除远端链接git remote add origin url 添加远端链接 ...

June 15, 2019 · 2 min · jiezi

git常用命令

$ git init //将目录变成git可管理的仓库$ git add . //将本地仓库中所有变化提交到暂存区$ git commit -m "str" //上传到仓库$ git fetch //查询新远程分支$ git branch -r/-a //查询远程/本地分支$ git remote add origin http://xxx.git //将本地仓库与远程仓库关联$ git remote -v //查询远程仓库链接$ git pull --rebase origin master //取回远程分支的更新,与本地分支合并$ git push origin master //提交代码到远程仓库$ git clone -b dev http://xxx.git //clone指定分支的代码$ git checkout -b dev //新建分支$ git push --set origin dev //本地分支与远程分支关联$ git merge dev //合并当前分支 与dev分支$ git status //查看可更新文件$ git stash save "str" //储藏$ git stash list //查看所有储藏$ git stash drop stash@{num} //删除指定储藏$ git push origin --delete dev //删除远程分支dev$ git branch -d dev //删除本地分支dev

June 14, 2019 · 1 min · jiezi

推荐12个实用的gitbook插件

➢ 安装和使用插件方法在根目录下创建book.json 在该文件中按照指定格式插入以下插件对应的代码。 安装插件有两种方式 : 一种是在book.json写入相应插件和配置后, 使用gitbook install安装插件。 一种是使用npm install pluginName安装,然后写入配置 ➢ hide-element 隐藏元素主要用来隐藏不想看到的元素。 如: 默认的gitbook左侧提示:Published with GitBook 使用方式:在book.json中写入以下内容 { "plugins": [ "hide-element" ], "pluginsConfig": { "hide-element": { "elements": [".gitbook-link"] } }}➢ back-to-top-button 回到顶部当文章篇幅较长时,页面底部会显示按钮,一键点击自动回到顶部。 使用方式: 在book.json中写入以下内容 { "plugins": [ "back-to-top-button" ]}➢ chapter-fold 导航目录折叠gitbook默认目录没有折叠效果。 使用方式:在book.json中写入以下内容 { "plugins": ["chapter-fold"]}➢ code 复制代码在代码域的右上角添加一个复制按钮,点击一键复制代码。 使用方式: 在book.json中写入以下内容 { "plugins" : [ "code" ]}➢ splitter 侧边栏宽度可调节左侧目录和右侧文章可以拖动调节宽度。 使用方式: 在book.json中写入以下内容 ...

June 13, 2019 · 2 min · jiezi

解决GitBash启动慢的问题亲测可用

换电脑之后,git启动总是很慢,网上说的办法基本上都试了,还是不行。 后来找到原因了 用了AMD显卡!!! 解决办法: 我的电脑->右键->管理->设备管理器->找到显示适配器,把AMD显卡禁用(右键)完事就可以顺畅的使用git了!

June 13, 2019 · 1 min · jiezi

lintstaged如何做到只lint-staged

介绍lint-staged针对暂存的git文件运行linters并且不要让 ???? 进入你的代码库!开始去年的时候分享过一个主题——规范化工作流之约定式提交,主要内容是提交代码时对暂存区代码格式的校验和提交信息规范校验。当时就接触到了lint-staged,只知道这个工具能针对暂存区的文件处理,并未深入了解, 那时候就有一些疑问埋在心里,最近得空,特来解疑。 疑问点: git分为暂存区和工作区,如果一个文件同时存在在两个区(某文件git add后又再次修改,如下图test2.js ),此时本地的文件内容实际上是等同未暂存区的,根据介绍lint-staged会lint暂存区的那个版本,那么这是怎么做到的呢? 先猜测: 使用SourceTree提交代码偶尔会比较卡,稍微窥得点儿(未暂存文件消失再重现),因此猜测可能是用了什么方法先清除未暂存文件然后再恢复。 猜测归猜测,还是要验证一下。 结论经过分析,lint-staged在执行检查前会对保存当前文件状态,然后清除掉修改,再执行lint任务,执行完毕再恢复。 重点就是:如何保存?如何恢复? 我总结出lint-staged的流程大致如下 这样就很清晰了,由图可知,上述疑问点为红色流程部分,下面我们来分析一下流程中的具体实现。 分析流程大致分为四部分: Stashing changesRunning lintersUpdating stashRestoring local changes我们来分别看一下每一步做了什么 保留案发现场并清除干扰(Stashing changes...)git write-tree // 得到 indexTreegit add .git write-tree // 得到 workingCopyTreegit read-tree $indexTreegit checkout-index -af // 清除文件修改(未暂存的test2.js被清除)根据以上操作步骤得知,lint-staged通过tree对象来保存暂存区目录和工作区目录,并清除掉工作区修改文件,操作完成后,可以看到,被修改的test2.js已经被清除(如下图)。 执行代码检查任务(Running linters...)按照配置的命令走,比如配置了 "*.js": "eslint" eslint test2.js test.js 更新(Updating stash...)上一步(Running linters)如果有检查到错误,直接跳过走下一步(Restoring local changes) git write-tree // 得到 formattedIndexTree 这里需要特别声明一下, 如果上一步(Running linters)未检测到错误,那么这里得到的formattedIndexTree 会和第一步的indexTree一样,如果检测到错误并将修复后文件添加到暂存区,如配置命令是eslint --fix , git add的话,那么代码被修复过,formattedIndexTree 与indexTree不同 ...

June 13, 2019 · 1 min · jiezi

Hexo博客多端同步问题

Hexo博客多端同步问题搭完博客,发现只有公司电脑上有源文件,如果回家就没发继续更新博客了。也不能拿着U盘到处拷贝。所以就把博客源文件放到github上解决同步问题。 博客源文件同步在博客根目录执行 git init git remote add origin git@github.com:lanpangzhi/lanpangzhi.github.io.git # 添加远程仓库 注意这里要添加你自己的仓库 lanpangzhi 换成你自己的用户名 git checkout -b hexo # 新建hexo分支并切换到hexo分支 git add . # 所有变化提交到暂存区 git commit -m "解决同步问题" # 提交文件 git push origin hexo # 推送hexo分支这就成功了,github上已经有博客的源文件了。 推荐把hexo设置为默认分支。 git submodule 实现第三方主题同步因为之前是直接把第三方主题克隆到博客目录,有什么改动是无法推送到作者Git仓库的,这个时候需要把第三方主题的项目Fork到自己仓库,自己账号下生成一个同名的仓库,并对应一个url,我们应该git clone自己账号下仓库的url。 执行如下操作。 git submodule add git@github.com:lanpangzhi/hexo-theme-next.git themes/next 把自己仓库下面第三方主题添加到Git子模块, 注 : themes/next 这里的目录是因为我用的next主题才会写themes/next 如果你用的不是next请把next替换成你的第三方主题文件夹名字。 博客的根目录会多一个.gitmodules文件,这是一个配置文件,保存了项目 URL 和你拉取到的本地子目录。 这就添加成功了,然后执行如下操作。 git add . # 所有变化提交到暂存区 git commit -m "添加第三方主题Git子模块" # 提交文件 git push origin hexo # 推送hexo分支更换电脑同步博客和第三方主题同步博客电脑上一定要先node和git,执行如下操作。 ...

June 12, 2019 · 1 min · jiezi

如何使用Git-Rebase

我们在日常开发中使用 Git 做分支合并的时候有两种方式:merge 和 rebase。merge 是最常用的,rebase 使用的没有 merge 这么多,那么 rebase 和 merge 有什么区别呢?什么时候使用 rebase?使用 rebase 的时候有什么注意事项呢?接下来我来介绍下这三个问题。 基础首先我们先了解下 merge 和 rebase 的运行机制有什么不同。假设我们有两个分支(master 和 feature)。feature 是基于 master 的 C1 节点建立的分支,然后开发人员分别在两个分支各自开发: merge现在我们想要把 feature 分支开发的内容合并到 master,使用 merge 命令: $ git checkout master$ git merge feature Git 会把 C2 和 C3 的内容合并一下产生一个新的修改 C4,把 C4 提交到 master 分支。那么 master 就有了所有最新的代码(红色是 master 分支线,蓝色是 feature 分支线)。 rebase我们回到还是未合并之前的状态,看看使用 rebase 合并会有什么效果。使用 rebase 有两种用法,先看第一种: $ git checkout master$ git rebase feature ...

June 12, 2019 · 2 min · jiezi

青春科技24小时无限可能THE-Hack-2019-初心不变使命不改

Hackathon  Hackathon(创客马拉松)是 hacker 和 marathon 的结合,是一项从美国高校引入的科技活动。   参赛选手们组成 2-4人 的团队,在 24小时 的限时内,从头脑风暴开始 创意计划一个科技项目 ,针对日常生活中发生的具体问题制定解决方案,然后利用自己的技术能力和比赛提供的硬件设备,完成项目的开发 。最后,每支队伍将以路演的形式,把产品演示给评委,以评选奖项。  THE Hack 2019 “THE”= Technology Harvests EnlightenmentTHE Hack 2019 将于7月13-14日在上海交通大学闵行校区举办。 2018年的参赛者或许记得,我们将选手分为hack.init()新手组和hackShanghai进阶组。 今年,为减小创客之间的距离,THE Hack 2019将融合hack.init()和hackShanghai两大组别,各年龄、各水平的开发者都可以报名参加。 届时,我们将通过设置各具特色的奖项,强调不同角度,从而在允许新手和经验丰富者同台竞技的同时保证比赛的公平性和趣味性,呼吁全体创客共同加入这场创新盛宴。 Why THE Hack?在THE Hack,你将收获: 与跨领域的各大企业沟通交流 从科技到教育,从文创到家居,THE Hack的赞助商们热心于青年的科技能力培养,也对各位创客的创意和能力展现出了十分的兴趣,为THE Hack提供了资金、技术、奖品、媒体等等支持。在THE Hack现场,将有赞助商演讲与摊位,这将是大家近距离了解这些企业的绝佳机会。加入全国性创客社区,对话各年龄段的创客 THE Hack的参赛选手来自全球各地,身份与背景充满着多样性。但相同的是,他们都对科技怀抱着无尽的向往和热情。他们中隐藏着超高水平的大佬、古灵精怪的点子创造者、潜力无限的萌新,都值得你去发掘、结识。 收获丰厚的奖金、奖品、纪念品 在THE Hack 2019,你有可能获得单支队伍五位数的奖金、总价值六位数的奖品、设计感超强的THE Hack专属定制纪念品(贴纸、笔记本、帆布袋...)...... 作为国内的大型科技赛事,我们的评委是来自各大科技企业的工程师、专业STEM教育者和从业者,因此THE Hack在各领域都有一定知名度。 在工作坊中快速学习,锻炼各项综合能力 THE Hack 2019赛前和现场将组织免费的线上线下工作坊,讲师来自赞助商企业或经验选手,分析各领域的开发前景,速成不同方向产品所需的技能,为现场开发做准备。      同时,一场创客马拉松不仅仅考验开发水平,还考验参赛者的demo演讲、合作沟通、时间安排、商业规划等等能力,因此THE Hack也将锻炼和培养的各项综合能力。 这24个小时里,你和朋友同吃同住,在深夜却依然灯火通明的大楼里交替着休息和工作,眼前的3D打印机和你一起忙碌,身边是此起彼伏的敲代码的声音。你转身和隔壁桌的队伍商量硬件能不能一起用,正好聊起了未来生物科技的前景。夜宵和小蛋糕已经吃过了,桌上的产品也逐渐成型。队友醒了,揉揉眼睛开始准备测试,也摇醒了另一个队友,让她开始做demo用的ppt。 报名参赛访问链接 my.thehack.org.cn,填写申请。我们在收到了你的申请后,会进行全方面的审核,最终已邮件回复的形式,邀请300名创客来到现场。 THE Hack的申请与参赛全程免费,现场免费提供正餐、零食和休息空间;非上海的参赛选手我们将依据交通凭证,提供一定数额的路费报销。  申请入口将会于 7月1日 关闭,请准确填写申请中的所有信息,并认真回答每一个问题,让THE Hack团队感受到你的能力与对科技的热情。    创客马拉松本质上确实是一场比赛,队伍之间竞争为数不多的奖项。但我们不想把它称为一场比赛。没有主办方,没有参赛者,我们都是这场科技狂欢中的一员,在几线流光的代码中,把天马行空的想象转化成实实在在的项目。在科技里,我们都有自己的情怀。准备好了吗? ...

June 12, 2019 · 1 min · jiezi

git完整总结

本地库通过命令 git init 把这个目录变成git可以管理的仓库 git 本地工作流程 git的工作流程一般是这样的: 1、在工作目录中添加、修改文件; 2、将需要进行版本管理的文件放入暂存区域; 3、将暂存区域的文件提交到版本库。 文件4种状态 本地库提交首先新建一个文件readme.txt,把文件提交到仓库: git add readme.txtgit commit -m "description"如果有大量文件进行改变,全部进行add,则使用 git add .。如果想add并commit,则使用 git commit -a -m "Changed some files"。git commit 命令的-a选项可将所有被修改或者已删除的且已经被git管理的文档提交到仓库中。千万注意,-a不会造成新文件被提交,只能修改。我们现在可以使用git show命令查看这一提交详细信息。 如果想查看全部提交信息,则使用git log。 git log git log --pretty=oneline 时光机穿梭现在改变readme.txt文件,添加一些内容,使用git status命令看看结果。 git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt 被修改过了,但还没有准备提交的修改。 虽然 Git 告诉我们 readme.txt 被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的 readme.txt,所以,需要用git diff readme.txt这个命令看看。 git diff <file> # 比较当前文件和暂存区文件差异git diff <id1><id1><id2> # 比较两次提交之间的差异git diff <branch1> <branch2> # 在两个分支之间比较git diff --staged # 比较暂存区和版本库差异git diff --cached # 比较暂存区和版本库差异git diff --stat # 仅仅比较统计信息git的撤销操作:reset、checkout和revert这三个命令都可以用于撤销。 ...

June 11, 2019 · 2 min · jiezi

一些实用的-git-小技巧

前些月,写了一个关于 git 的表格,叫Git Cheat Sheet,现分享一些有用的小技巧,更多内容请移步,另有一个非常不错的关于 git 小技巧的项目 git-tips。 是谁动了我的代码谁动了我的代码? 谁的 bug 指到了我的头上? 团队合作时,经常会出现这样的问题。这时候可以使用 git blame <file> 来定位代码的最后一次修改。但是,有一个问题,这并不能看出本行代码以前的修改。比如项目组中某人对全部代码进行了格式化,git blame 就失去了作用。此时,可以与另一个有用的命令 git log -p <file> 结合使用,可以查看文件的更改历史与明细,最终找到这个锅究竟应该由谁来背。 git blame -L 10,12 package.jsongit log -p -L 10,12:package.json快速切换合并分支当你经常工作于 A 与 B 两个分支,需要来回切。这时命令应该是 git checkout A,但这里有一个更简单的命令,git checkout -,表示切到最近的一次分支。如果你需要把 B 分支的内容合并过来,可以使用 git merge -。 题外话,cd - 代表进入最近目录,也相当实用。 git checkout -git merge -统计项目统计项目各个成员 commit 的情况,比如你可以查看你自己的项目的 commit 数以及他人对你项目的贡献数 git shortlog -sngit shortlog -sn --no-merges # 不包含 merge commit快速定位提交如果你的 commit message 比较规范,比如会关联 issuse 或者当前任务或者 bug 的编号,此时根据 commit message 快速定位: git log --grep "Add"。 ...

June 10, 2019 · 1 min · jiezi

Git拉取远程分支到本地

Git拉取远程分支到本地拉取分支首先你得先查看你是否和远端的仓库建立连接。 git remote -v如果没有的话那就自行添加一下 git remote add origin xxxx(你远程分支的git仓库地址)如果每天要提交代码 ,可以绕过上面这一步,直接切换分支 git checkout -b Q3 origin/Q3这个时候操作失败提示如下: fatal: 'origin/Q3' is not a commit and a branch 'Q3' cannot be created from it代表你本地没有Q3这个远程分支。 可以执行 git branch -r 来检查本地是否有Q3远程分支。拉取远程分支到本地并切换分支。 git fetch origin Q3git checkout -b Q3 origin/Q3拉取远程分支到本地 git pull origin Q3我的博客和github,喜欢就去点点星吧,谢谢。https://github.com/lanpangzhi http://blog.langpz.com 参考https://curder.gitbooks.io/blog/git/remote_repository_pull.html

June 10, 2019 · 1 min · jiezi

Git常用命令小结

Git版本库原理Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库 创建版本库:#创建文件$ mkdir myapp#进入文件$ cd myapp#初始化代码仓库$ git init#把需要提交的所有修改放到暂存区(Stage)$ git add file#提交所有文件#$ git add . #提交所有.js格式文件#$ git add *.js#强制添加#$ git add -f file#提交代码$ git commit -m "commit info"查看#查看历史记录,git log命令显示从最近到最远的提交日志$ git log#查看分支合并图$ git log --graph#Git提供了一个命令git reflog用来记录你的每一次命令:$ git reflog#git status命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。git status不显示已经commit到项目历史中去的信息。$ git status#当暂存区中没有文件时,git diff比较的是,工作区中的文件与上次提交到版本库中的文件。#当暂存区中有文件时,git diff则比较的是,当前工作区中的文件与暂存区中的文$ git diff#比较工作区中的文件与版本库中文件的差异。HEAD指向的是版本库中的当前版本,而file指的是当前工作区中的文件。$ git diff HEAD -- file版本回退:#Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当回退版本较早时可以写成HEAD~100。#版本回退$ git reset --hard HEAD^#取消回退,commitId为你想要回到的未来版本号$ git re**set** --hard commitId撤销修改命令git checkout ——file 把文件在工作区的修改全部撤销,这里有两种情况: * 一种是file修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;* 一种是file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。#文件在工作区的修改全部撤销$ git checkout --file删除文件命令git rm用于从版本库删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。 ...

June 10, 2019 · 1 min · jiezi

聊聊-git-中-detached-HEADamendrebase-和-reset

聊聊 git 中 detached HEAD、amend、rebase 和 reset ⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅分离头导致 commit 丢失分离头是指 checkout 历史版本后,做了修改并提交 commit,这时切回别的分支,之前提交的 commit 就会被抛弃。如果想要保留需要手动创建一个新的分支。 查看提交记录 git log --oneline可以看到有两个提交记录 7c53c63 (HEAD -> master) 创建文件c034a61 init这时 checkout 到历史版本 Note: checking out 'c034a61'.You are in 'detached HEAD' state. You can look around, make experimentalchanges and commit them, and you can discard any commits you make in thisstate without impacting any branches by performing another checkout.If you want to create a new branch to retain commits you create, you maydo so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name>HEAD is now at c034a61 init现在就出现了分离头,在这个时候修改文件内容 ...

June 10, 2019 · 3 min · jiezi

Python基础练习100题-71-80

刷题继续昨天和大家分享了61-70题,今天继续来刷71~80题 Question 71:Please write a program to output a random number, which is divisible by 5 and 7, between 10 and 150 inclusive using random module and list comprehension.解法一import randomprint (random.choice([i for i in range(10,151) if i%5==0 and i%7==0]))解法二import randomresp = [i for i in range(10,151) if i % 35 == 0 ]print(random.choice(resp))Question 72:Please write a program to generate a list with 5 random numbers between 100 and 200 inclusive.解法一import randomresp = random.sample(range(100,201),5)print(resp)Question 73:Please write a program to randomly generate a list with 5 even numbers between 100 and 200 inclusive.解法一import randomnumbers = random.sample(range(100,201,2),5)print(numbers)解法二import randomprint (random.sample([i for i in range(100,201) if i%2==0], 5))Question 74:Please write a program to randomly generate a list with 5 numbers, which are divisible by 5 and 7 , between 1 and 1000 inclusive.解法一import randomlst = [i for i in range(1,1001) if i%35 == 0]resp = random.sample(lst,5)print(resp)Question 75:Please write a program to randomly print a integer number between 7 and 15 inclusive.解法一import randomnumber= random.choice([x for x in range(7,16)])print(number)解法二import randomprint(random.randrange(7,16))Question 76:Please write a program to compress and decompress the string "hello world!hello world!hello world!hello world!".解法一import zlibs = 'hello world!hello world!hello world!hello world!'.encode()t = zlib.compress(s)print(t)print(zlib.decompress(t))Question 77:Please write a program to print the running time of execution of "1+1" for 100 times.解法一from timeit import Timert = Timer("for i in range(100):1+1")t.timeit()解法二import timebefore = time.time()for i in range(100): x = 1 + 1after = time.time()execution_time = after - beforeprint(execution_time)Question 78:Please write a program to shuffle and print the list [3,6,7,8].解法一import random lst = [3,6,7,8] random.shuffle(lst) print(lst) 解法二import randomlst = [3,6,7,8]seed = 7random.Random(seed).shuffle(lst)print(lst)Question 79:Please write a program to generate all sentences where subject is in ["I", "You"] and verb is in ["Play", "Love"] and the object is in ["Hockey","Football"].解法一subjects=["I", "You"]verbs=["Play", "Love"]objects=["Hockey","Football"]res = [[i, j, k] for i in subjects for j in verbs for k in objects] for x in res: print(" ".join(x))Out: I Play Hockey I Play Football I Love Hockey I Love Football You Play Hockey You Play Football You Love Hockey You Love Football解法二subjects=["I", "You"]verbs=["Play", "Love"]objects=["Hockey","Football"]for sub in subjects: for verb in verbs: for obj in objects: print("{} {} {}".format(sub,verb,obj))Out: I Play Hockey I Play Football I Love Hockey I Love Football You Play Hockey You Play Football You Love Hockey You Love Football解法三import itertools subjects=["I", "You"]verbs=["Play", "Love"]objects=["Hockey","Football"]all_list = [subjects,verbs,objects]res = list(itertools.product(*all_list)) for x in res: print(" ".join(x))Out: I Play Hockey I Play Football I Love Hockey I Love Football You Play Hockey You Play Football You Love Hockey You Love FootballQuestion 80:Please write a program to print the list after removing even numbers in [5,6,77,45,22,12,24].解法一def isEven(n): return n%2!=0li = [5,6,77,45,22,12,24]lst = list(filter(isEven,li))print(lst)解法二li = [5,6,77,45,22,12,24] lst = list(filter(lambda n:n%2!=0,li)) print(lst)源代码下载这十道题的代码在我的github上,如果大家想看一下每道题的输出结果,可以点击以下链接下载: ...

June 9, 2019 · 3 min · jiezi

git配置文件

查看配置git config -l查看当前的所有配置git config --global -l查看全局配置git config --local -l查看项目配置 修改配置通过配置文件git config --global -e修改全局git配置git config --local -e修改项目git配置 通过命令行git config --local user.name "xiaoming"给项目配置设置user.name属性git config --local --unset user.name删除项目配置的user.name属性

June 9, 2019 · 1 min · jiezi

git命令

git cherry-pick [commit号]把一个commit复制一份到当前分支。 git reflogHEAD曾经指向过的commit的历史。 git push origin :[分支号]删除远端仓库的某个分支 git --amend --author='zhangsan'修改commit的author git rebase -i [commit号]通过修改commit列表rebase

June 9, 2019 · 1 min · jiezi

git入门教程

1、git安装几乎所有的平台都可以安装,安装教程。在Linux下安装git输入git,查看系统是否存在git,若没有安装,它会提示你如何做。 $ git The program 'git' is currently not installed. You can install it by typing: sudo apt-get install git如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./config,make,sudo make install这几个命令安装就好了。 在windows下安装git直接官网下载安装 2、配置git config --global user.name "Your Name" git config --global user.email "email@example.com"注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。 题外话:我第一次安装的时候忘记user.name和user.email了,它也是命令的一部分。 3、创建版本库版本库:官方说法:这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。 其实简单说就是管理代码的仓库,你所有的操作都在里面。 步骤:(windows)首先选择好你要将代码放在哪里。切换分支 一般公司中的许多人在开发同一个项目,需要在master分支下切一个dev子分支,每个人也可以切换自己的一个子分支,在开发完成后,在merge到主分支。 git branch #查看当前分支git checkout -b dev #创建并切换子分支,dev可换成自己的分支名字git checkout dev #切换分支git branch dev #创建分支git branch -d dev #删除分支git merge 分支名 #合并某分支到当前分支 注意:Linux服务器下,在本地建好分支后,将要本地分支推送到远程服务上,使得远程也存在该分支:git pull origin 本地分支:远程分支git remote add origin git@server-name:path/repo-name.git #将本地分支和远程相关联mkdir+目录名 #新建版本库touch+文件名 #新建文件(新建文件有两种方式:1、touch+文件名,直接新建一个文件2、vi+文件名,新建一个文件并进入编辑状态(如果文件已存在,则直接进入编辑状态))cd+目录名 #进入目录pwd #显示当前所在目录的路径git init #初始化仓库(把这个目录变成Git可以管理的仓库)提示:(1)如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。(2)git init后目录里面会多一个.git 文件,没事千万不要手动修改里面的东西!!!!(3)千万不要使用Windows自带的记事本编辑任何文本文件。 ...

June 7, 2019 · 1 min · jiezi

推荐几个flutter教程小册git原理小册前端面试宝典

June 5, 2019 · 0 min · jiezi

git常用命令

1、恢复已经删除的分支 git reflog // 查看所有分支的所有操作记录,找到分支对应的HEAD编号 git branch <branch_name> HEAD@{4} // 找回分支2、创建和删除本地和远程tag 创建本地tag: git tag [tag名] 创建远程分支:git push origin master [tag名]删除本地tag: git tag -d [tag名] 删除远程tag: git push orgin :refs/tags/[tag名]

June 3, 2019 · 1 min · jiezi

Git-自救指南

Git 虽然因其分布式管理方式,不完全依赖网络,良好的分支策略,容易部署等优点,已经成为最受欢迎的源代码管理方式。但是一分耕耘一分收获,如果想更好地掌握 git,需要付出大量的学习成本。即使在各种 GUI 的加持下,也不得不说 git 真的很难,在 V2EX 上也常有如何正确使用 git 的讨论,同时在 Stackoverflow 上超过 10w+ 的 git 相关问题也证明了 git 的复杂性。再加上 git 的官方文档也一直存在着 “先有鸡还是先有蛋” 的问题,虽然文档非常全面,但如果你不知道你遇到的问题叫什么,那么根本就无从查起。 作为国内领先的研发管理解决方案供应商,CODING 一直致力于在国内普及 git 的使用,为软件研发提供更高效率。本文节选自 Katie Sylor-Miller 在日常工作中所遇到过的让他很头疼的 git 相关问题,并整理了相应的应对措施,在这里分享给正在学习如何使用 git 的同学们。当然这些应对措施并不是唯一的,可能你会有其他更好的应对方法,这也恰恰是 git 这套版本控制系统强大的地方。 原文标题:《Oh shit,git!》原文地址:https://ohshitgit.com/我刚刚好像搞错了一个很重要的东西,但是 git 有个神奇的时间机器能帮我复原! reflog 是一个非常实用的命令,你可以使用这个命令去找回无意间删除的代码,或者去掉一些刚刚添加的却把仓库里的代码弄坏的内容。同时也可以拯救一下失败的 merge,或者仅仅是为了回退到之前的版本。 我 commit 完才想起来还有一处小地方要修改! 当我 commit 完然后跑测试的时候,经常突然发现忘了在等于号前面加空格。虽然可以把修改过的代码再重新 commit 一下,然后 rebase -i 将两次揉在一起,不过上面的方法会比较快。 我要改一下上一个 commit message! 当你们组对 commit message 有格式要求时,或者当你忘了中英文间要加空格,这个命令能救你狗命。 我不小心把本应在新分支上的内容 commit 到 master 了! ...

June 3, 2019 · 1 min · jiezi

写给算法工程师的-git-flow-操作指北

前言,最近接触到底用不用提交 .idea/https://zhuanlan.zhihu.com/p/... git flow 流程展示pycharm 格式化代码使用 git blame 看看谁修改了你的代码使用 git merge 合并代码gitigonre 使用常用的 git 命令什么时候与使用 git merge 什么时候使用 git rebase最好希望好代码与你同在

June 3, 2019 · 1 min · jiezi

Halo-v10-正式版发布一款惊艳的动态博客系统

前言Halo 从去年 5 月开源以来,广受小伙伴们的喜爱,在此非常感谢使用 Halo 发表博客的小伙伴们。今年,在 @JohnNiang 的帮助下,我们几乎完全重写了 Halo,然后 1.0 正式版就发布了。在此,非常感谢 @JohnNiang 的加入以及他做出的贡献。再到后面,我们公开了 admin api 之后,@雨季不再来 使用了 Flutter 为 Halo 开发了管理端的 APP。相信以后越来越多人加入之后,Halo 会变得更好。希望大家会喜欢。 主要特性拥有使用 Vue 开发的后台管理,体验升级,但是并不需要独立部署,启动 Halo 即可。拥有 Restful 风格的 Content api,你可以用于开发单页面主题,微信小程序等。拥有 Restful 风格的 Admin api,你可以用于开发桌面管理客户端,管理 App(已有) 等。拥有使用 Flutter 开发的管理端 App,支持 Android 和 iOS,随时随地发表你的想法!感谢@雨季不再来。拥有独立的评论插件,使用 Vue 开发,只需在页面引入构建好的 JS 文件即可,完美地和主题相结合。支持多主题。另外,还支持在线下载主题以及更新主题。支持在线修改主题文件内容,无需在本地修改然后上传。十分友好的主题开发体验,支持自定义配置。(主题开发文档正在开发中)。功能强大的附件管理,同时支持本地上传,又拍云/七牛云/阿里云等云存储,另外,还支持 SM.MS 图床(非常感谢 SM.MS,请大家善用该服务哦)。自带友情链接管理,图库管理(给爱摄影的小伙伴们)。支持自定义页面。支持 Markdown 文档导入,顺带解析 FrontMatter。支持日志功能,类似于 QQ 空间的说说,亦或者微博。同时支持微信发布日志(后续计划)。还有…相关链接Halo 开源地址:https://github.com/halo-dev/haloWeb 管理端:https://github.com/halo-dev/h...管理端 APP:https://github.com/halo-dev/h...独立评论插件:https://github.com/halo-dev/h...主题仓库:https://halo.run/theme交流论坛:https://bbs.halo.run有喜欢的同学可以点个 star 哦。有任何问题可以去 Github issues 或者 https://bbs.halo.run 。预览图 ...

June 2, 2019 · 1 min · jiezi

阿里云centos7的git配置

最近想试一下git的自动部署,总是手动部署项目的话太麻烦了。于是开始在服务器添加git相关配置,但是搞了一晚上都没搞好,休息一天之后刚刚终于弄完了。其实一点都不难,只是之前搜的网上的教程都太杂了,东一点西一点的心态都差点调炸了。为了之后不犯同样的错误,现在记一下配置过程以备不时之需。 一、安装git和配置1.在centos中git的下载命令 yum install git2.配置git 1 git config --global user.name "Your Name"2 git config --global user.email "email@example.com"3.创建本地仓库 mkdir gittest//创建自己的git仓库cd gittestgit init4.加入暂存区并提交到本地仓库 git add .touch reademegit add readme配置远程仓此时我们需要给服务器上的git配置远程仓库 1.生成ssh密钥 ssh-keygen -t rsa -C "your_email@youremail.com//使用自己的git账号申请输入该命令之后一般不需要修改什么,直接啪啪啪三下键盘就行了。之后你会在你的/root/.ssh/文件下发现多出了几个文件。其中包含1个公钥id_rsa.pub和一个私钥id_rsa。2.添加密钥现在去github官网,在setting中添加你的公钥3.创建项目添加了密钥之后,新建一个项目。这里我是用前面设置的gittest这个名字。到此所有配置基本上就完成了,你在上一步创建项目之后会提示一堆命名,复制 git remote add origin .....这句话,在服务器中进入gittest这个文件下,输入这句话。最后git commit -m 'first commit',git push -u origin master 就大功告成了

June 2, 2019 · 1 min · jiezi

git命令操作逻辑

git merge分支合并有两种方式: fast-forward,假设从master分支创建一条新的分支develop,在develop分支上进行了一些修改,但是在此期间master分支没有进行任何修改,那么在将develop分支合并到master分支的时候,只是简单的将master分支的指针右移。如下所示 创建新的commit,如果被合入代码的分支和合入分支都进行了修改,则此时需要创建一个新的commit,此时这个commit的祖先有两个,即被合入分支之前的最后一个commit和合入分支之前的最后一个commit。如下所示 进行合并操作时,从一个分支合并过来,这个分支的提交记录也将合并到当前分支。在上图中不能看出来但经过试验证明,执行git log操作时,合入的分支的commit会按时间顺序插入当前分支。git revert使用git revert来进行回退时,方式为创建一个新的commit。

May 31, 2019 · 1 min · jiezi

Git常见问题分析

当前分支落后于远端分支hint: Updates were rejected because the tip of your current branch is behindhint: its remote counterpart. Integrate the remote changes (e.g.hint: 'git pull ...') before pushing again.hint: See the 'Note about fast-forwards' in 'git push --help' for details.当执行git push将本地代码向远端推送的时候出现了上面的提示。这个提示的大意是本地代码落后于远端的代码。导致出现这个提示的原因可能是: 可能远端有其他同事在你的commit之前提交了代码;你可能在自己的本地分支进行了回退操作,导致自己的分支落后于远端。

May 31, 2019 · 1 min · jiezi

长期更新git版本控制那些不得不说的事

最近工作中在git方面遇到了一些问题,决定记录下来希望能够帮助那些不怎么熟悉git指令的人在实际当中少走弯路少踩坑。本文中出现的网上没有明确解决方案及不容易找到解答方案的相关流程与问题会用大篇幅黑体表示。 1 .首先,安装git,这个网上一抓一大把,在这里我给出几个网址 菜鸟教程:https://www.runoob.com/git/git-install-setup.html 廖雪峰:https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496安装好的git怎么打开,windows常用的是右键项目名称,git bash here 2 . 在使用gitHub及gitLab时,如果需要下载相关项目,常用指令为 git init git clone hTTP/SSH(项目提供的地址)3 . 切换分支 git branch (查看本地分支) git branch -r(查看远程分支) git checkout -b agrochemical origin/agrochemical(切换分支,agrochemical为你想要切换的版本号,例如2.1.9)4 .提交代码到gitlab 首先你需要git add .他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区, 包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。 注意这里是可以git add单个文件的,使用git add 修改过的单个文件路径。例如 git add src/Components/a.js 然后你需要git commit -m "fix bug" (fix bug为你的说明,你也可以写成git commit -m "我是注释" 这句代码代表你对更改的描述。这一步git会找出你更改了哪些地方。 接着你需要git pull,这里有的人会忽略这个步骤,直接进行git push,你需要知道这两句代码各自的作用。 git pull 用于从另一个存储库或本地分支获取并集成(整合) git push 用于将本地版本库的分支推送到远程服务器上对应的分支。 服务器。git pull是什么作用,就是将gitlab上近期修改过的地方同步到你的电脑上。比如说公司同事中午改了个bug,你使用pull命令拉去远程项目,将同事修改的部分同步到你的本地。最大限度的保持公司内部项目进度的一致,避免出现一个人改过bug,被另一个人的修改覆盖成原来的样子。 ...

May 30, 2019 · 1 min · jiezi

git常用命令分享

1.简写git config --global alias.st 'status' // git stgit config --global alias.cm 'commit' // git cm -m 'msg'git config --global alias.unstage 'reset HEAD' // git unstage fimeNamegit config --global alias.last 'log -1' // git last// 查看历史提交,推荐git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" // git lg2.存储暂时存储// !只能存储已经被track的文件git stash取出最近存储git stash pop3.合并commitgit rebase -i 要合并的两个分支的上一个分支号squash 表示这个 commit 会被合并到前一个commit4.merge另一个分支上指定的文件git checkout --patch 要merge的分支 filePath5.将一个分支指定的commits合并到另一个分支git cherry-pick 62ecb36.回退版本git reset --hard HEAD^ // 回退到上个版本git reset --hard HEAD~n // 回退到n次提交之前git reset --hard commit_id // 退到/进到指定commit版本7.切换并跟踪远程新分支git checkout --track origin/branch_namegit checkout -b localBranch origin/originBranch8.标签操作git tag tagNamegit tag -a tagName -m 'tagMsg'// 将本地标签推到远程git push origin --tags/tagName// 删除本地标签git tag -d tagName// 删除远程标签git push origin :refs/tags/标签名9.如何将已经track的文件加入.gitignoregit rm -r --cached .git add .git commit -m 'update .gitignore'如果还是不行的话在先将想要取消追踪的文件移到项目目录外,并提交,然后提交后再将刚刚移出的文件再移入项目中即可如果是对所有文件都取消跟踪的话,就是 ...

May 30, 2019 · 1 min · jiezi

Tshare校园资源分享平台网站开发四之功能模块设计

上一篇博客地址:Tshare校园资源分享平台(网站开发三之数据库连接) 功能设计虽然我们能访问web站点,能连接数据库了,但是并不意味着我们马上就要开始写代码,我们得先分析一下我们的网站都需要实现哪些功能,这样我们才能针对如何实现这些功能进行编码。 宣传页由于网站的主要目的是校园内部提供服务,所以不是每一个人都能享受网站的服务,所以制作一个宣传首页用于吸引用户,也在此首页中实现用户的注册、登录功能。 资料分享平台当用户注册完之后登录网站,应该能够互相分享自己手中的资源(主要指学习资源,试卷、课件等等)。所以要提供文件的上传、搜索、预览、下载功能。 后续扩展功能闲置交易、表白墙、失物招领等等。 详细设计用户的注册用户注册必须使用校内教育邮箱进行注册,所以我们需要给邮箱发送一个验证码,只有邮箱验证吗验证成功才能进行注册。所以需要有发送邮件的功能 用户的登录用户登录只需要验证用户名和密码。为了让用户有良好的体验,可以设置7天内自动登陆,所以在用户登录的时候将用户名和密码进行加密后写入浏览器cookie。所以需要有加密功能和cookie设置读取功能。 文件上传通过收集身边的同学的学习资料信息,设计文件上传时需要填写的表单信息。同时只能上传单个文件,如果要上传文件夹需要压缩为zip后才能上传。而上传的zip压缩包在服务器端需要解压缩成一个文件夹保存。所以需要提供zip压缩包解压缩功能。 文件搜索通过关键字搜索文件,搜索时采用模糊搜索,可以对整个关键字进行模糊搜索,还可以将关键字进行中文分词后再依次模糊搜索。所以需要提供中文分词的功能。 文件预览我们决定将最终的预览文件定为png图片,也就是说所有可以预览的文件类型我们都以png格式显示。对于word类型的文件,需要先转为pdf,然后选取pdf前10页进行拆分,然后将拆分得到的pdf转为png,最后将所有的png进行合并为一张长图。所以需要提供有word转pdf的功能、pdf拆分的功能、pdf转png的功能以及png合并功能。 文件下载如果下载的是文件夹,需要将文件夹压缩为zip再下载。所以需要提供有zip压缩功能 总结以上所有的功能都是从后端的角度分析的(毕竟我在小组中负责的是后端控制),那么根据正常的流程图,我们可以开始编写代码了。应该先实现宣传页中的注册登录功能,在实现资料分享的上传、搜索、预览和下载功能。由于我们的工程已经结束了,而且我也不可能一行代码一行代码的写在博客中,所以我会按板块来写后面的博客。

May 28, 2019 · 1 min · jiezi

Tshare校园资源共享平台网站开发二之主机浏览器访问虚拟机apache

上一篇博客地址:Tshare校园资源分享平台(网站开发一之环境搭建) 回顾上一篇博客我们已经在一个虚拟机上搭建好了apache+mysql+php的环境,并且在虚拟机的浏览器中成功的访问到了web站点中的index.php。 新内容本篇博客将会讲解如何在主机的浏览器中访问到虚拟机的apache服务,毕竟虚拟机流畅性不如主机,而且主机是Windows系统或mac os系统,可以方便地下载安装自己喜欢地浏览器(这里建议使用Chrome浏览器)。 让虚拟机和主机能够互ping前面说过,我选择的是VMware虚拟机,在VMware上实现虚拟机和主机通讯并不需要繁琐的步骤。 1.将虚拟机的网络连接模式设置为NAT模式(网络地址转换) 2.点击编辑,选择虚拟网络编辑器,点击右下角的更改设置,然后修改子网ip和子网掩码 3.将多余的网络移除,只剩下VMnet8 4.选择NAT模式(与虚拟机共享主机IP),在点击NAT设置,设置网管IP为192.168.10.2 5.将两个钩选中,然后点击DHCP设置 6.设置动态IP范围 7.打开网络适配器中的VMnet8属性 8.设置其ip地址和子网掩码 9.重启虚拟机,打开终端输入ifconfig查看虚拟机ip地址,并尝试在主机的命令行下ping这个ip 主机通过虚拟机ip访问虚拟机的apache服务centos系统的防火墙会禁止外网访问某些端口,除非让防火墙开放端口。当然seLinux也是一个让人非常头疼的东西,很多时候即使防火墙开发端口,仍然不能访问,原因就是selinux在搞鬼。所以首先我们就把selinux关闭了。 vim /etc/selinux/config#将SELINUX=enforcing改为SELINUX=disable#保存退出,重启虚拟机,开启apache服务,在主机浏览器中访问虚拟机ip 访问成功!(如果访问失败,可能是防火墙没有开启80端口,可以百度如何让防火墙开放端口的指令) 主机上连接mysql如果你的主机上下载mysql的图形操作界面(navicat for mysql),还可以在主机上远程连接虚拟机的mysql(当然前提是虚拟机开启了mysql服务) 此时连接会报错,告诉我们192.168.10.1这个ip地址无法远程连接到虚拟机数据库,需要对虚拟机数据库做一些更改 #登录mysql/var/mysql/bin/mysql -uroot -ppassword:此处输入密码mysql> use mysql;mysql> update user set host = '%' where user ='root';mysql> flush privileges;#重启mysql服务再次远程连接,即可连接到虚拟机的数据库。当然我这里直接使用了root用户登录,你可以创建一个新用户 总结虚拟机和主机能够通讯是关键,然后是绕过防火墙,就能达到我们的目的了。下一篇博客地址:Tshare校园资源分享平台(网站开发三之数据库连接)

May 28, 2019 · 1 min · jiezi

Tshare校园资源分享平台网站开发三之数据库连接

上一篇博客:Tshare校园资源分享平台(网站开发二之主机浏览器访问虚拟机apache) 新内容环境搭建、web站点访问和数据库连接是本次开发的三个最基础的前提,这篇博客之后我们将开始真正的开发之旅 php连接数据库在虚拟机上安装sublime text 3下载地址:http://www.sublimetext.com/3#复制到/mnt目录下,直接解压缩tar -jxvf sublime_text_3.tar.bz2#配置桌面快捷方式#1. 将解压缩后目录中的sublime_text.desktop复制到/usr/share/applications下#2. 修改/usr/share/applications/sublime_text.desktop#3. 将快捷方式复制到桌面,双击即可打开sublime编辑器cp /mnt/sublime_text_3/sublime_text.desktop /usr/share/applicationsvim /usr/share/applications/sublime_text.desktop#将Exec修改为/mnt/sublime_text_3/sublime_text#将icom修改为/mnt/sublime_text_3/Icon/48x48/sublime-text.png#保存退出 主机连接上虚拟机的数据库,并创建一个新的测试数据库test 编写Db.php连接数据库,编写test.php操作数据库Db.php<?php/** * 专门用来操作数据库的类,继承mysqli类 */class Db extends mysqli{ public function __construct() { $host = "192.168.10.31"; // 数据库的主机名称,此处也就是我们虚拟机的ip地址 $user = "root"; // 数据库用户名,我们使用root用户连接 $password = "fuhao520999"; // root用户的密码,在安装mysql时我们修改过 $dbname = "test"; // 连接的目标数据库名,为我们刚才创建的test数据库 parent::__construct($host, $user, $password, $dbname); }}?>test.php<?phpinclude_once("Db.php");$db = new Db();var_dump($db);?>主机浏览器访问 此时我们成功的在php中连接上数据库了。有一个我没想到的是,竟然不需要我配置mysqli的扩展,可能是之前编译安装php的时候已经把mysqli扩展安装了。 总结本次博客内容虽然不多,但是却很重要,如果有的朋友遇到了缺少mysqli扩展的错误,可以参考以下链接:http://www.jquerycn.cn/blog/p...当然我们不需要重新下载php的源代码,因为之前我们已经下载过了,直接到指定的目录找到扩展文件,编译安装即可。

May 28, 2019 · 1 min · jiezi

关于-Git-的-20-个面试题

翻译:疯狂的技术宅原文:https://www.edureka.co/blog/i... 本文首发微信公众号:前端先锋欢迎关注,每天都给你推送新鲜的前端技术文章 我在工作中很喜欢 Git 。 Git 在许多开发团队中扮演着重要的角色。 关于 Git 面试的第一个问题必须是: Q1. Git和SVN有什么区别?GitSVN1. Git是一个分布式的版本控制工具1. SVN 是集中版本控制工具2.它属于第3代版本控制工具2.它属于第2代版本控制工具3.客户端可以在其本地系统上克隆整个存储库3.版本历史记录存储在服务器端存储库中4.即使离线也可以提交4.只允许在线提交5.Push/pull 操作更快5.Push/pull 操作较慢6.工程可以用 commit 自动共享6.没有任何东西自动共享Q2. 什么是Git?我建议你先通过了解 git 的架构再来回答这个问题,如下图所示,试着解释一下这个图: Git 是分布式版本控制系统(DVCS)。它可以跟踪文件的更改,并允许你恢复到任何特定版本的更改。与 SVN 等其他版本控制系统(VCS)相比,其分布式架构具有许多优势,一个主要优点是它不依赖于中央服务器来存储项目文件的所有版本。每个开发人员都可以“克隆”我在图中用“Local repository”标注的存储库的副本,并且在他的硬盘驱动器上具有项目的完整历史记录,因此当服务器中断时,你需要的所有恢复数据都在你队友的本地 Git 存储库中。还有一个中央云存储库,开发人员可以向其提交更改,并与其他团队成员进行共享,如图所示,所有协作者都在提交更改“远程存储库”。 下一组 Git 面试问题将测试你使用 Git 的体验: Q3. 在 Git 中提交的命令是什么?答案非常简单。用于写入提交的命令是 git commit -a。 现在解释一下 -a 标志, 通过在命令行上加 -a 指示 git 提交已修改的所有被跟踪文件的新内容。还要提一下,如果你是第一次需要提交新文件,可以在在 git commit -a 之前先 git add <file>。 Q4. 什么是 Git 中的“裸存储库”?你应该说明 “工作目录” 和 “裸存储库” 之间的区别。 Git 中的 “裸” 存储库只包含版本控制信息而没有工作文件(没有工作树),并且它不包含特殊的 .git 子目录。相反,它直接在主目录本身包含 .git 子目录中的所有内容,其中工作目录包括: ...

May 28, 2019 · 3 min · jiezi

golang内置包管理工具go-mod简明教程

go modgo buildin package manager. go mod是go语言内置的包管理工具,集成在go tool中,安装好go就可以使用。 要求: go version >= 1.11 官方文档: https://tip.golang.org/cmd/go... 环境变量# 通过环境变量GOPROXY设置代理export GOPROXY=https://goproxy.io# go mod功能开关,默认是auto,在gopath中不启用# 可设置为on强制启用export GO111MODULE=on初始化 go mod initinit报错outside gopath no import comments # 方法一 手动创建go.mod文件, 写入module xxxecho 'module xxx' > go.mod# 方法二 main包加入import声明package main // import "xxx"go mod download下载依赖 go mod tidy同步依赖包,添加需要的,移除多余的 go mod vendor将依赖包放入vendor go get 下载/升级依赖go mod不再下载源码进$GOPATH/src go mod的下载目录在$GOPATH/pkg/mod,并且是文件权限是只读的-r--r--r-- # tag必须以v开头 v1.2.3格式go get -u xxx.com/pkg@2.1.0vendor 模式go mod是不推荐使用vendor目录的,而是直接使用source或cache中的包。 ...

May 28, 2019 · 1 min · jiezi

git-merge-squash-git-rebase-i-git-cherrypick

git merge --squashgit merge --squash {srcBranch} 常用于将feat分支合并至dev时压缩繁杂的提交日志,让合并变得清晰明了。 将 srcBranch上的超前于当前分支的 commits 合并至当前分支,且当前分支不进行commit,合并或解决冲突成功后,允许我们手动做一次 commit log,这样srcBranch的多个 commits 合并至当前分支时只产生一个commit 了。 git checkout devecho 1111 >> foo.txtgit add foo.txtgit commit -m "foo.txt 1111"git checkout -b feat_1echo 2222 >> foo.txt && git commit -am "foo.txt 2222"echo 3333 >> foo.txt && git commit -am "foo.txt 3333"echo 4444 >> foo.txt && git commit -am "foo.txt 4444"git loggit checkout dev# 如果我们直接 git merge feat_1 的话 那 feat_1 的所有提交都会记录至 dev# 但我们想简洁的表征一下git merge --squash feat_1# 手动编写 log 提交git commit -m 'foo.txt 2222foo.txt 3333foo.txt 4444'# 或者使 diff logs 为模板提交git commit -v# 进入 vim 模式 编辑合并的 log:wq# 可以看到 feat_1 的 3 log 合并到 dev 上后只有 1 loggit log--squash 的作用为只合并源分支的内容到当前分支的stage区,将commit交由我们来决定,这样便可以整合其他分支的提交日志。 ...

May 28, 2019 · 4 min · jiezi

git

安装git三个工作区域概念以及文件状态三个工作区域概念:工作目录(Working Directory)、暂存区(Staging Area)、git仓库(.git Direactory Repository);文件状态:划分一:未修改 已修改 已暂存 已提交划分二:未跟踪 已跟踪 注:已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 建立git仓库两种场景:1)在现有目录中初始化仓库把已有的项目纳入git管理$cd 项目代码所在的文件夹$git init新建的项目直接用git管理$cd 某个文件夹$git init ‘your_project_name’ // 会在当前目录下创建your_project_name文件夹(含有.git)注:通过git init 初始化的项目,工作目录中的所有文件都属于未跟踪的文件,可通过git add 将其变成已跟踪文件2)从服务器克隆一个git仓库$git clone <url> [your_project_name]注:初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。 配置信息添加配置$git config [--local | --global | --system] user.name 'Your name'$git config [--local | --global | --system] user.email 'Your email' 查看配置$git config --list [--local | --global | --system]$git config [[--local | --global | --system] user.name 区别local:区域为本仓库global: 当前用户的所有仓库system: 本系统的所有用户

May 27, 2019 · 1 min · jiezi

搭建Git服务器编写自动部署脚本

搭建Git服务器、编写自动部署脚本 今天试了下在linux服务器上搭建Git服务器,并且编写一个简单的自动部署脚本。 主要参考 廖雪峰-GIT教程-搭建Git服务器 现在开始吧! 创建一个git用户,用来运行git服务 adduser git创建证书登录 收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。 初始化Git仓库 先选定一个目录作为Git仓库,假定是/home/git/sample.git,在/home/git目录下输入命令: git init --bare sample.gitGit就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git chown -R git:git sample.git禁用git用户shell登录 通过编辑/etc/passwd文件完成,找到你的git用户的一行,例如: git:x:1001:1001:,,,:/home/git:/bin/bash把/bin/bash改为/usr/bin/git-shell,例如: git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。 克隆远程仓库 git clone git@server:sample.gitserver是你的服务器域名或ip地址 如果git仓库和web目录在同一台服务器主机上: git clone /home/git/sample.git如果不是在git用户的家目录中创建的,比如/srv/gits/sample.git: git clone git@server:/srv/gits/sample.git如果clone成功,那么你的git服务器就搭建成功了。 接下来: 自动同步钩子脚本 因为我是web目录和git是同一台服务器 编辑 /home/git/sample.git/hooks/post-receive, post-receive就是在git服务器收到代码推送后(push完成之后)执行的脚本。 #!/bin/shwhile read oldrev newrev refnamedo branch=$(git rev-parse --symbolic --abbrev-ref $refname) if [ "master" == "$branch" ]; then # Do something echo "post-receive in branch master" >> /tmp/git-sample.log unset GIT_DIR wwwPath=/var/www/html/sample cd $wwwPath && /usr/bin/git pull origin master exit 0 fidone从脚本内容可以看出,我们在判断当前push的分支是master时执行git pull origin master操作。 ...

May 27, 2019 · 1 min · jiezi

Tshare校园分享平台网站开发一之环境搭建

       这学期开了一门称为软件工程的课,老师给我们布置了一个大作业。我们一个小组共有四个人,决定做一个校园资料分享平台。现在工作快要结束了,我决定将整个项目移植到Linux上,从创建虚拟机->环境搭建->php扩展等等,将这个过程写成连载的博客,供自己以后查阅,也让新手们少走一些弯路。环境搭建 第一步,下载一个linux镜像,我选择了centos7的镜像,这个在百度里面一搜就能搜到下载地址,一般选择DVD镜像;第二步,在VMware workstation上创建一个Linux的虚拟机。之所以选择VMware而不选择virtual box,是因为我通过血和泪的实践,觉得VMware更好用(ps:当初我用virtual box安centos7后花了好几天调分辨率都没有成功,centos7只支持4:3的分辨率,让我这个19201080的显示器看起来很难受,当然这个问题是可以解决的,不过用VMware就方便多了,其自带的tools会让我们的虚拟机能够使用19201080的分辨率)。由于虚拟机创建过程不是本次开发的重点,所以不会的朋友可以百度如何在VMware上安装Centos7。第三步,在虚拟机创建好之后,我们需要检测网络的连接:主机与虚拟机之间可以互ping,而且虚拟机可以访问外网,因为我们需要安装运行环境,如何让虚拟机连接到网络以及如何让主机与虚拟机之间可以互ping,百度以下你就知道了。第四步,我们选择使用Apache+php+mysql进行开发,但是我们租了一台服务器,所以开发的时候使用服务器上的数据库,不需要在本地下载mysql。所以我们只需要安装apache和php即可,可以使用yum源直接安装,安装教程百度即可。最后,当所有的环境都建好之后,我们需要知道如下几个文件: /etc/php.ini:这个文件是php的配置文件,php的扩展配置都在这个文件中进行配置; /usr/lib64/php/modules:这是php扩展文件的保存路径,这个路径可以使用phpinfo()看到,并不是每个人都在这个目录下; /etc/httpd/conf/httpd.conf:这是apache的配置文件; /var/log/httpd/error_log:这是apache的错误日志。环境测试 测试apache。首先开启apache服务(终端输入service httpd start)。centos虚拟机中自带一个Firefox可以使用这个浏览器,但是不建议,我在虚拟机中用这个浏览器感觉很难受。建议使用主机上的浏览器来访问虚拟机中的apache服务,这要求主机和虚拟机之间能够互通(能互ping),还要求linux虚拟机的防火墙开启80端口。如果这两样都满足了,还不能在主机的浏览器上访问虚拟机的apache,那么很有可能是SELinux这个东西在捣乱,反正虚拟机上也没有什么东西需要保护,可以直接把SELinux关闭。然后进行访问,在主机浏览器中输入虚拟机的ip地址,将会看到apache的测试页面。测试php。apache默认配置的web站点在/var/www/html目录下,在这个目录中编写一个测试代码index.php,写上几行测试代码,然后在主机浏览器中访问index.php,看能不能输出正确的结果。配置php基础环境 此处的配置环境并不是下载php也不是下载php扩展,而是修改httpd.conf来完成php的一些基础配置。首先我们需要将php代码和html代码都作为php代码进行解析,也就是说能在html文件中解析php代码,这个需要在<ifmodule mine_module>中加入两行代码: AddType application/x-httpd-php .html .htm .php AddType application/x-httpd-php-source .phps测试在html文件中编写php代码能否被解析。总结 由于有一些知识并不是本项目的重点,所以我一直在说“自己百度”,其实有些东西有些挫折很多人都遇到过并且都记录了下载,只要自己勤于查找,就会发现自己犯的错误,能够借助前人已经为铺好的路来解决。这一篇博客主要讲的是如何搭建环境,别看我只用了短短几句话描述,实际上如果对这些过程不熟练可能会花费你几天时间才能完成。下一篇博客开始引入已经写好的代码,配置所需要的php扩展,不会将每一句代码都拿出来解释,实际上这些东西只要会编程就都能写出来,不一样的是从Windows平台来到linux平台后,应该怎么解决一些问题。

May 26, 2019 · 1 min · jiezi

用中文说说-git-stash

当你使用 git 正在开发一个功能的时候,如果你突然需要到另一个分支去开发却不想放弃当前的改动的时候,你可以使用 git stash命令git stash list列出所有储藏 git stash show [<stash>:Number]显示某一个(默认最近一个)储藏详情 git stash drop [-q|--quiet][<stash>]删除某一个(默认最近一个)储藏 git stash ( pop | apply ) [--index][-q|--quiet] [<stash>]恢复储藏并删除 (pop) / 不删除 (apply) 恢复的储藏 git stash branch <branchname> [<stash>]从储藏创建分支 git stash [push [-p|--patch]-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [-m|--message <message>] [--] [<pathspec>…]]储藏,但默认不会储藏未跟踪的文件和被忽略的文件 git stash clear删除所有储藏 git stash create [<message>]创建一个悬空提交 (dangling commit),不会将 ref 存储在任何地方,使用 git stash store 保存它 git stash store [-m|--message <message>][-q|--quiet] <commit>存储上一个命令中创建的悬空提交 ...

May 24, 2019 · 1 min · jiezi

错误记录git-ssh-推送失败的一次记录

0. 问题的来源在完成了项目的开发之后,在把项目推送到 gitlab 仓库时,出现了以下错误提示: GitLab: You are not allowed to push code to this project.fatal: Could not read from remote repository.Please make sure you have the correct access rightsand the repository exists. 1. 问题追踪过程1.1 查看项目角色第一步,因为这个项目不是自己日常维护的,就去查看下自己的角色。 看下是不是重新分配了权限。 结果发现自己是:master 角色 1.2 想着是 sourceTree 工具的配置问题命令行模式下使用 git push 推送,结果是:同样的报错信息 那么就证明确实是自己角色不对了,可明明自己是 master。 1.3 确认自己的推送用户我本身用的是 ssh + id_rsa 提交的网上搜索到一个命令 # 查看推送的用户 ssh -T git@git.workec.com发现 : 显示的是另外一个同事A(吴大神)的名字发现 : 显示的是另外一个同事A(吴大神)的名字发现 : 显示的是另外一个同事A(吴大神)的名字 ...

May 23, 2019 · 1 min · jiezi

git撤销与合并操作

前奏很多时候,发现自己真的不曾学会过git,特别是本地多个分支在同时开发,合并master产生各种冲突,commit了不必要的信息,commit了错误的修改等等情况下,总感觉很害怕操作git,细思而知,git很强大,自己却不曾认识到它的强大之处。直观的理解git,下面是一张很好的图(图片来源网络,不知源处): git的撤销git reset - git reset --soft: 将分支回退到指定提交,工作区维持现状不变,暂存区会在现有基础上增加该commit之后的提交。- git reset --mixed: (默认操作)将分支回退到指定提交,暂存区也被同步为该指定提交,工作区保持不变。- git reset --hard: 将分支回退到指定分支,暂存区和工作区都会被同步为该指定的提交。git reset后的三个参数回退程度是依次递进。soft最轻微,它不会重置当前工作区和暂存区,只会将回退版本后续的提交加到暂存区。mixed会改变暂存区,使它和回退版本同步。hard则会重置工作区和暂存区,使它和回退版本一致。 /* git reset --soft target*/working index HEAD target working index HEAD-------------------------------------------------------------A B C C A B CA B C A A B+C A/* git reset --mixed target*/working index HEAD target working index HEAD-------------------------------------------------------------A B C C A C CA B C A A A A/* git reset --hard target*/working index HEAD target working index HEAD-------------------------------------------------------------A B C C C C CA B C A A A Agit checkout ...

May 23, 2019 · 1 min · jiezi

git-配置多个SSHKey

git 配置多个SSH-Key项目托管的仓库多了,使用的账号多了,自然用到的key就不同了,比如gitlab,gitee, github, 公司的code仓库等,所以管理好key很重要。1、生成一个gitlab用的SSH-Key$ ssh-keygen -t rsa -C "1_email@company.com” -f ~/.ssh/gitlab-rsa2、生成一个github用的SSH-Key$ ssh-keygen -t rsa -C "2_email@github.com” -f ~/.ssh/github-rsa此时,.ssh目录(一般在C:\Users\Administrator\.ssh目录下) 下应该有4个文件:gitlab-rsa和gitlab-rsa.pub,github-rsa和github-rsa.pub,分别将他们的公钥文件(gitlab-rsa.pub,github-rsa.pub)内容配置到对应的code仓库上 具体配置SSH秘钥的位置在github/gitlab网站的 个人信息 ----> 设置/settings ----> SSH公钥/SSH public key 中设置。 3、添加私钥$ ssh-add ~/.ssh/gitlab-rsa $ ssh-add ~/.ssh/github-rsa如果执行ssh-add时提示”Could not open a connection to your authentication agent”,可以现执行命令: $ ssh-agent bash# 然后再运行ssh-add命令。## 下面可省略.# 可以通过 ssh-add -l 来确私钥列表$ ssh-add -l# 可以通过 ssh-add -D 来清空私钥列表$ ssh-add -D4、修改配置文件# 若.ssh目录下无config文件,那么创建touch config# config文件中添加以下内容# gitee 码云Host gitee.com ## Host 这个指明的是HOST地址,也就是项目的HostName,如:git@gitee.com:ghostgithub/xUtils.git gitee.com就是其对应的Host(访问的项目的地址)HostName gitee.com ## HostName 就是访问的地址,如:https://gitee.com/ 就是其HostName(IP地址,访问的码云的网页上的url地址) (https://建议不要加上)PreferredAuthentications publickey ## 指明配置的是公钥IdentityFile ~/.ssh/gitee-rsa ## 指定弓腰的位置及文件# gitlabHost gitlab.comHostName gitlab.com PreferredAuthentications publickeyIdentityFile ~/.ssh/id_rsa# githubHost github.comHostName github.comPreferredAuthentications publickeyIdentityFile ~/.ssh/github_rsa5、测试$ ssh -T git@github.com输出 ...

May 23, 2019 · 1 min · jiezi

代码版本管理不同版本相同代码的解决方案猜想

大家再开发app时,不同版本的后台代码是如何管理的?(欢迎回复告知,让小弟我学习一下) 下面说我遇到的一个问题,当app要发布2个版本时,后台代码无需修改(可能只是修改了前端显示),这是如果复制一份代码放到git中会造成空间浪费 我想到了一个方法,采用了创建代码库的软连接实现(未实践过): win7创建软连接的方法如下: mklink /D app_version2 app_version1mklink /J app_version3 app_version1 上面两个命令都可以创建到app_version1的软链接,但参数(/D和/J)的不同创建目录软链接的类型也不同,通过dir命令查看得到结果如下: 2011/05/17 14:05 <DIR> app_version12011/05/24 13:07 <JUNCTION> app_version2 [D:tempapp_version2]2011/05/24 13:07 <SYMLINKD> app_version3 [app_version1] 在本地编写代码时,2种是一样的,但是我们可以发现app_version1是DIR类型(这个是我们创建的实际目录),app_version2是JUNCTION类型,而app_version3是SYMLINKD类型。(关于2中类型之间的区别,大家可以搜索一下看看,有合适的解释,请大家告诉我,谢啦) 在提交git的时候2中类型存在区别:JUNCTION类型只会看到一个文件夹的目录SYMLINKD看到的是文件夹下的文件列表 提交之后的结果有待验证,不同操作系统之间的通用性也有待验证

May 23, 2019 · 1 min · jiezi

GitFlow

GitFlowGitFlow工作流定义了一个围绕项目发布的严格模型,它为不同的分支分配了明确的角色,并定义分支之间何时以及如何进行交互。 分支说明 1.master分支:存储正式发布的产品,master分支上的产品要求随时处于可部署状态。master分支只能通过与其他分支合并来更新内容,禁止直接在master分支进行修改。 2.develop分支:汇总开发者完成的工作成果,develop分支上的产品可以是缺失功能模块的半成品,但是已有的功能模块不能是半成品。develop分支只能通过与其他分支合并来更新内容,禁止直接在develop分支进行修改。 3.feature分支:当要开发新功能或者试验新功能时,从develop分支创建一个新的feature分支,并在feature分支上进行开发。开发完成后,需要将该feature分支合并到develop分支,最后删除该feature分支。 4.release分支:当develop分支上的项目准备发布时,从develop分支上创建一个新的release分支,新建的release分支只能进行质量测试、bug修复、文档生成等面向发布的任务,不能再添加功能。这一系列发布任务完成后,需要将release分支合并到master分支上,并根据版本号为master分支添加tag,然后将release分支创建以来的修改合并回develop分支,最后删除release分支。 5.hotfix分支:当master分支中的产品出现需要立即修复的bug时,从master分支上创建一个新的hotfix分支,并在hotfix分支上进行bug修复。修复完成后,需要将hotfix分支合并到master分支和develop分支,并为master分支添加新的版本号tag,最后删除hotfix分支。 分支命名规范 1.master分支:master分支只有一个,名称即为master。 2.develop分支:develop分支只有一个,名称即为develop。 3.feature分支:feature_<版本号>_<功能名>。 4.release分支:release_<版本号>。 5.hotfix分支:hotfix_<版本号>_<问题简述>。 Git仓库 一、添加SSH key 在github创建一个账号: 添加SSH key(因为本地的git库与github仓库之间的传输是通过ssh 传输的) 二、添加远程仓库 首先在github上创建一个新的项目: 1、用命令行的方式提交到远程方式 git add . 添加到暂存区 git commit -m '提交的描述' git push -u origin master 推送到master 2、用Source Tree提交 还是添加一个远程仓库: 步骤如下: ①.打开Source Tree: ②.点击克隆/新建 ③.弹出一个框选择创建新仓库 ⑥.选择目标路径(其实是本地路径) ⑦.点击创建 例:在项目里建一个txt,里面写点内容,关闭后在屏幕上的txt右键,点添加,添加成功点左上角的提交,然后在下方填写提交的信息,最后点提交。 到这一步本地仓库已经提交成功 怎么将本地仓库关连到远程仓库呢? 首先点击到master分支 右键点击创建拉取请求 (因为是新仓库没有任何设置,将会弹出一个框,点击设置) 会出现一个远程仓库,点击添加 里面填写远端名称,URL和用户名 (url是远程仓库地址) 然后点击两次确定 点击远程会看到有一个origin,说明已经关连成功了 在master右键点击推送到origin(就是上一步新建的远程仓库) 点击推送 添加成功后,会显示master ...

May 22, 2019 · 1 min · jiezi

git攻略建立本地分支和远程分支并使二者关联

git branch // 查看本地分支git branch -a // 查看所有分支git branch -r // 查看远程分支git branch -vv // 查看本地分支与远程分支关联关系git checkout A // 切换本地分支(A:分支名,下同)git checkout -b // 创建本地分支并切换 (= git branch A + git checkout ) git push origin A:A // 推送本地分支到远程git branch --set-upstream electric origin/electric // 本地分支关联远程分支git push origin -d A // 删除远程分支 (用本地分支名,前面不加origin)git branch -d A // 删除本地分支快用你的项目练习一下吧! (在项目.git -> config文件里,用代码同样可以实现上述操作:)

May 21, 2019 · 1 min · jiezi

同步Github-fork

前言选择拥抱开源,无疑参与 github的开源项目是最好的选择,先从同步 fork 仓库开始做起! 一、确认本地 fork 仓库版本是否落后于原仓库1. 查看 github fork 仓库后的 commit数量及提交日志 本地 clone 自己仓库 后的 commit log 日志,与 gihub 上一致 2. 查看原仓库的相关信息,比较 比较后得知:本地 fork仓库的版本落后于原始仓库下一步计划,准备开始同步! 二、 同步1. 查看本地仓库设置的远端仓库,是否有连接上游原始远端仓库如果未连接上游仓库,添加远程仓库的变量地址 $ git remote -vorigin https://github.com/xiaoyueyue165/taro.git (fetch)origin https://github.com/xiaoyueyue165/taro.git (push)添加上游仓库$ git remote add upsteream https://github.com/NervJS/taro.git 再次查看远程仓库指向地址列表,确认添加$ git remote -vorigin https://github.com/xiaoyueyue165/taro.git (fetch)origin https://github.com/xiaoyueyue165/taro.git (push)upsteream https://github.com/NervJS/taro.git (fetch)upsteream https://github.com/NervJS/taro.git (push)2. fetch,取回原仓库的更新$ git fetch upsteream默认情况下,git fetch 取回所有分支(branch)的更新3. 将 fetch 后的更新内容合并至主分支所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如upsteream主机的master,就要用 upsteream/master 读取。 $ git merge upsteream/master此时会发现本地 master 分支的 commit 日志已经与原仓库的日志保持一致 ...

May 19, 2019 · 1 min · jiezi

Java-设计模式综合运用门面模版方法责任链策略工厂方法

在上一篇文章Java设计模式综合运用(门面+模版方法+责任链+策略)中,笔者写了一篇门面模式、模版方法、责任链跟策略模式的综合运用的事例文章,但是后来笔者发现,在实现策略模式的实现上,发现了一个弊端:那就是如果在后续业务发展中,需要再次增加一个业务策略的时候,则需要再次继承AbstractValidatorHandler类(详情请参见上篇文章),这样就会造成一定的类膨胀。今天我利用注解的方式改造成动态策略模式,这样就只需要关注自己的业务类即可,无需再实现一个类似的Handler类。本文也同步发布至简书,地址:https://www.jianshu.com/p/b86...1. 项目背景1.1 项目简介在公司的一个业务系统中,有这样的一个需求,就是根据不同的业务流程,可以根据不同的组合主键策略进行动态的数据业务查询操作。在本文中,我假设有这样两种业务,客户信息查询和订单信息查询,对应以下枚举类: /** * 业务流程枚举 * @author landyl * @create 11:18 AM 05/07/2018 */public enum WorkflowEnum { ORDER(2), CUSTOMER(3), ; ....}每种业务类型都有自己的组合主键查询规则,并且有自己的查询优先级,比如客户信息查询有以下策略: customerIdrequestIdbirthDate+firstName以上仅是假设性操作,实际业务规则比这复杂的多 1.2 流程梳理主要业务流程,可以参照以下简单的业务流程图。 1.2.1 查询抽象模型 1.2.2 组合主键查询策略 1.2.3 组合主键查询责任链 2. Java注解简介注解的语法比较简单,除了@符号的使用之外,它基本与Java固有语法一致。 2.1 元注解JDK1.5提供了4种标准元注解,专门负责新注解的创建。 注解说明@Target表示该注解可以用于什么地方,可能的ElementType参数有:<br/>CONSTRUCTOR:构造器的声明<br/>FIELD:域声明(包括enum实例)<br/>LOCAL_VARIABLE:局部变量声明<br/>METHOD:方法声明<br/>ACKAGE:包声明<br/>PARAMETER:参数声明<br/>TYPE:类、接口(包括注解类型)或enum声明@Retention表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:<br/>SOURCE:注解将被编译器丢弃<br/>CLASS:注解在class文件中可用,但会被VM丢弃<br/>RUNTIME:JVM将在运行期间保留注解,因此可以通过反射机制读取注解的信息。@Document将注解包含在Javadoc中@Inherited允许子类继承父类中的注解2.2 自定义注解定义一个注解的方式相当简单,如下代码所示: @Target({ElementType.METHOD,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documented//使用@interface关键字定义注解public @interface Description { /* * 注解方法的定义(其实在注解中也可以看做成员变量)有如下的规定: * 1.不能有参数和抛出异常 * 2.方法返回类型只能为八种基本数据类型和字符串,枚举和注解以及这些类型构成的数组 * 3.可以包含默认值,通过default实现 * 4.如果只有一个方法(成员变量),最好命名为value */ String value(); int count() default 1; //默认值为1}注解的可用的类型包括以下几种:所有基本类型、String、Class、enum、Annotation、以上类型的数组形式。元素不能有不确定的值,即要么有默认值,要么在使用注解的时候提供元素的值。而且元素不能使用null作为默认值。注解在只有一个元素且该元素的名称是value的情况下,在使用注解的时候可以省略“value=”,直接写需要的值即可。 2.3 使用注解如上所示的注解使用如下: /** * @author landyl * @create 2018-01-12:39 PM *///在类上使用定义的Description注解@Description(value="class annotation",count=2)public class Person { private String name; private int age; //在方法上使用定义的Description注解 @Description(value="method annotation",count=3) public String speak() { return "speaking..."; }}使用注解最主要的部分在于对注解的处理,那么就会涉及到注解处理器。从原理上讲,注解处理器就是通过反射机制获取被检查方法上的注解信息,然后根据注解元素的值进行特定的处理。 ...

May 18, 2019 · 2 min · jiezi

Java设计模式综合运用门面模版方法责任链策略

引言:很久没有更新了,主要是工作忙。最近,工作中一个子系统升级,把之前不易扩展的缺点给改进了一下,主要是运用了几个设计模式进行稍微改造了一下。本文也同步发布至简书,地址: https://www.jianshu.com/p/962...1.项目背景在公司的一个实际项目中,需要做一个第三方公司(以下简称GMG)的系统集成工作,把该公司的一些订单数据集成到自己公司平台下,各个订单具有一些共性,但是也有其特有的特征。 经过设计,目前我把订单分为POLICY和BOB类型(暂且这么说吧,反正就是一种订单类型,大家参照着看就OK)。 在订单数据集成到公司平台前,需要对订单数据进行一些必要的业务逻辑校验操作,并且每个订单都有自己的校验逻辑(包含公共的校验逻辑)。 本节介绍的便是整个订单集成系统中的校验逻辑在综合利用设计模式的基础上进行架构设计。 2.校验逻辑本校验逻辑主要分为四个部分: 校验文件名称(RequestValidator.validateFileInfo)校验文件内容中的概要部分(RequestValidator.validateSummary)校验文件内容中的列名称(RequestValidator.validateHeaders)校验文件内容中的明细(RequestValidator.validateDetails)其实上面的RequestValidator的实现逻辑最后都是委托给RequestValidationFacade这个门面类进行相应的校验操作。 3.实现细节3.1 domain介绍主要分为RequestFile和RequestDetail两个domain,RequestFile接收泛型的类型(即RequestFile), 使得其子类能够自动识别相应的RequestDetail的子类。RequestFile为抽象类,定义了以下抽象方法,由子类实现: //由子类实现具体的获取文件明细内容public abstract List<T> getRequestDetails();//由子类实现具体的获取workflow的值public abstract WorkflowEnum getProcessWorkFlow();//由子类实现文件列字段名列表public abstract String[] getDetailHeaders();RequestDetail及其子类就是workflow对应文件的明细内容。 3.2 WorkflowEnum枚举策略本例中如下规定: workflow为WorkflowEnum.POLICY对应文件名为:csync_policy_yyyyMMdd_HHmmss_count.txtworkflow为WorkflowEnum.BOB对应文件名为:csync_bob_integration_yyyyMMdd_HHmmss_count.txt以上校验逻辑在AbstractRequestValidation类相应的子类中实现(validateFileName方法),其实这个枚举贯穿整个校验组件,它就是一个针对每个业务流程定义的一个枚举策略。 3.3 涉及到的设计模式实现思路3.3.1 门面模式在客户端调用程序中,采用门面模式进行统一的入口(门面模式讲究的是脱离具体的业务逻辑代码)。门面模式封装的结果就是避免高层模块深入子系统内部,同时提供系统的高内聚、低耦合的特性。 此案例中,门面类为RequestValidationFacade,然后各个门面方法的参数均为抽象类RequestFile,通过RequestFile->getProcessWorkFlow()决定调用AbstractRequestValidation中的哪个子类。 AbstractRequestValidation类构造方法中定义了如下逻辑: requestValidationHandlerMap.put(this.accessWorkflow(),this.accessBeanName());把子类中Spring自动注入的实体bean缓存到requestValidationHandlerMap中,key即为WorkflowEnum枚举值,value为spring bean name, 然后在门面类中可以通过对应的枚举值取得BeanName,进而得到AbstractRequestValidation相应的子类对象,进行相应的校验操作。 注:这边动态调用到AbstractRequestValidation相应的子类对象,其实也是隐藏着【策略模式】的影子。 类图如下: 3.3.2 模版方法模式在具体的校验逻辑中,用到核心设计模式便是模版方法模式,AbstractRequestValidation抽象类中定义了以下抽象方法: /** * validate the file details * @param errMsg * @param requestFile * @return */ protected abstract StringBuilder validateFileDetails(StringBuilder errMsg,RequestFile requestFile); /** * validate the file name * @param fileName * @return */ protected abstract String validateFileName(String fileName); /** * return the current CSYNC_UPDATE_WORKFLOW.UPDATE_WORKFLOW_ID * @return */ protected abstract WorkflowEnum accessWorkflow(); /** * return the current file name's format ,such as: csync_policy_yyyyMMdd_HHmmss_count.txt * @return */ protected abstract String accessFileNameFormat(); /** * return the subclass's spring bean name * @return */ protected abstract String accessBeanName();以上抽象方法就类似我们常说的钩子函数,由子类实现即可。类图如下图所示: ...

May 18, 2019 · 2 min · jiezi

Java设计模式综合运用动态代理Spring-AOP

本文也同步发布至简书,地址:https://www.jianshu.com/p/f70...AOP设计模式通常运用在日志,校验等业务场景,本文将简单介绍基于Spring的AOP代理模式的运用。 1. 代理模式1.1 概念代理(Proxy)是一种提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法。 1.2 静态代理静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。 1.3 动态代理1.3.1 JDK代理JDK动态代理有以下特点:1.代理对象,不需要实现接口2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)3.动态代理也叫做:JDK代理,接口代理 1.3.2 CGLib代理Cglib代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。 JDK的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口,如果想代理没有实现接口的类,就可以使用Cglib实现。Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和synaop,为他们提供方法的interception(拦截)。Cglib包的底层是通过使用一个小而块的字节码处理框架ASM来转换字节码并生成新的类。不鼓励直接使用ASM,因为它要求你必须对JVM内部结构包括class文件的格式和指令集都很熟悉。2. Spring AOP2.1 Spring AOP原理AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。本文以Spring AOP的实现进行分析和介绍。 Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。 Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。 如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。 注意:以上片段引用自文章Spring AOP的实现原理,如有冒犯,请联系笔者删除之,谢谢!Spring AOP判断是JDK代理还是CGLib代理的源码如下(来自org.springframework.aop.framework.DefaultAopProxyFactory): @Overridepublic AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) { Class<?> targetClass = config.getTargetClass(); if (targetClass == null) { throw new AopConfigException("TargetSource cannot determine target class: " + "Either an interface or a target is required for proxy creation."); } if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } return new ObjenesisCglibAopProxy(config); } else { return new JdkDynamicAopProxy(config); }}由代码发现,如果配置proxyTargetClass = true了并且目标类非接口的情况,则会使用CGLib代理,否则使用JDK代理。 ...

May 18, 2019 · 3 min · jiezi

Git常用命令

git init git init 该命令创建一个.git目录,这个目录包含必要的文件。但是此时还没有跟踪文件,需要通过git add添加跟踪文件. git status git status 查看哪些修改的文件已经暂存了,哪些修改的文件没有暂存,哪些文件没有被追踪,如下所示: $ git statusOn branch masterYour branch is up to date with 'origin/master'. Changes to be committed:(use "git reset HEAD <file>..." to unstage) modified: src/main/java/Solution.javaChanges not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working >directory) modified: src/main/java/Main.javaUntracked files:(use "git add <file>..." to include in what will be committed) ...

May 15, 2019 · 1 min · jiezi

Git-使用入门

未完待续... 一、基本概念二、常用命令常用命令速查表(英文)常用命令速查表(中文)三、场景应用四、参考资料

May 14, 2019 · 1 min · jiezi

Git中使用gitignore忽略文件的推送

.gitignore是Git工具的配置文件,用于屏蔽某些文件上传到线上。 1、创建.gitignore项目路径下添加.gitignore文件 touch .gitignore 2、编辑.gitignore文件,建立下面的规则 3、创建个test文件, git status 测试是否忽略 git status已经忽略test文件 配置无效几种情况命令格式错误在配置语句的前后面添加空格、Tab、注释等,会导致当前行的配置语句失效配置语句对已经add、commit的文件无效(.gitignore只能忽略原来没有被追踪的文件,如已被纳入了版本管理中,则修改.gitignore是无效的。)第三种情况解决办法:删除本地缓存 git rm -r --cached .git add .git commit -m 'update .gitignore'

May 14, 2019 · 1 min · jiezi

github-入门教程之-github-访问速度太慢怎么办

github 是全世界最流行的开源项目托管平台,其代表的开源文化从根本上改变了软件开发的方式. 基本上所有的需求都能从 github 上或多或少找到现成的实现方案,再也不用重头开始造轮子而是自定义轮子! 然而,有时候国内访问 https://github.com/ 速度太慢,如何加速访问 github.com 网站就成了刚需. 由于 github.com 网站位于美国旧金山,所以初始访问 github.com 时网络寻址会比较耗费时间,这也是网站打开速度慢的其中一个原因. 国外在线检测网站: https://www.ipaddress.com/最初用户从浏览器中输入 github.com 网址时,浏览器并不知道这个域名对应的真实 ip 地址,先问问自己电脑认识不认识这个域名的门牌号,如果本机不认识会接着往上问,当地运行商也不认识这个域名的话,继续问上级,直到问道 github.com 的门牌号是 192.30.253.113 为止! 如此繁琐的问路过程被称之为 DNS 寻址,如果问路的时间都占用很久,那么访问网站的速度自然会很慢. 所以,如果我们直接告诉浏览器目的地,那么浏览器也就不会一步一步去费劲问路了,这在一定程度上也就优化了访问网站的速度. $ ping github.com -c 3PING github.com (192.30.253.113): 56 data bytes64 bytes from 192.30.253.113: icmp_seq=0 ttl=41 time=405.924 ms64 bytes from 192.30.253.113: icmp_seq=1 ttl=41 time=346.654 ms64 bytes from 192.30.253.113: icmp_seq=2 ttl=41 time=345.485 ms--- github.com ping statistics ---3 packets transmitted, 3 packets received, 0.0% packet lossround-trip min/avg/max/stddev = 345.485/366.021/405.924/28.220 msping github.com -c 3 查看 github.com 网站的门牌号正常来说,网站的主域名下会存在多个子域名,由这些域名组合在一起提供完整的服务. ...

May 12, 2019 · 2 min · jiezi

使用-git-篡改历史

使用 git 篡改历史 ⭐️ 更多前端技术和知识点,搜索订阅号 JS 菌 订阅有时候我们需要修改 git 历史提交的文件内容,如果只是在前一个 commit,那么只需要修改文件并执行 --amend 即可: 如修改上一次提交的文件: // do somethinggit add .git commit --amend --no-edit另外,可能还需要修改以往历史提交的文件,那么就需要使用到 rebase: git log 查看一下以往的提交纪录: commit 084dbd48be6fff86b0d3de23220cff8cabddd9c6 (HEAD -> master)Author: oli <oli@olideMacBook-Pro.local>Date: Thu May 9 23:20:09 2019 +0800 echart how to usecommit 3358a5fd3078d7fb6794d8c2d468054db300a46fAuthor: oli <oli@olideMacBook-Pro.local>Date: Wed May 1 11:26:12 2019 +0800 edit Readme.mdcommit c0b7ac77431ceb270b5f0aa0f97b13a79afca4b9Author: oli <oli@olideMacBook-Pro.local>Date: Wed May 1 02:25:40 2019 +0800 init假设我们需要修改第二条纪录中的项目的文件,那么之行命令: git rebase 3358a5fd3078d7fb6794d8c2d468054db300a46f^ --interactive ...

May 12, 2019 · 1 min · jiezi

Git合并提交

在日常开发中,我们的Git提交原则经常是小功能多次提交,但是有时需要在完成功能之后将多个连续的提交合并成一个,或者进行分支合并时,只保留一个提交,以保证分支简介,这时就需要进行squash操作,两种分别称为 Rebase Squash 和 Merge Squash。这篇tip主要记录如何处理这两种操作以及之间的区别, <!--more--> Rebase Squash用来将多个连续的提交合并为一个,以下面的提交记录为例,master是主分支,分支 featureY 提交了一系列的修改: $ git lg* 392dc11 - (HEAD -> featureY) Y5 (5 minutes ago) <qiwihui>* 740e7d2 - Y4 (5 minutes ago) <qiwihui>* b54cd87 - Y3 (5 minutes ago) <qiwihui>* fb3a5cf - Y2 (6 minutes ago) <qiwihui>* 61b5ff9 - Y1 (6 minutes ago) <qiwihui>* 220e45c - (master) feature X (7 minutes ago) <qiwihui>其中,lg 是如下命令: [alias] lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --这里我们需要合并 featureY 功能分支上的 Y1 到 Y5 这五个提交为一个。git提供了如下命令: ...

May 9, 2019 · 2 min · jiezi

你必须知道的Git命令

这篇笔记是为了学习Git知识而收集总结的,主要是看受一篇帖子《你可能不知道的15条Git命令》的影响,才想记录这篇笔记的,如有雷同,纯属巧合。 Git 是一个分布式版本控制软件, 最初目的是为更好地管理Linux内核开发而设计。来源:维基百科 - Git Git是一个软件,它允许你通过提交对一个系统(或一组)文件的历史进行注释。这些提交便是在给定时间点对系统做出的差异“快照”。 官网下载速度慢,可使用这个链接下载 或者Github下载地址, 需要其他版本请提issue联系我。 1. Git 配置--system #系统级别--global #用户全局--local #单独一个项目git config --global user.name "xxxx" #用户名git config --global user.email "xxxx@xxx.com" #邮箱git config --list # 列举所有配置连接远程仓库github 创建SSH Key ssh-keygen -t rsa -C <youremail@example.com>登陆GitHub,打开Account settings -> SSH Keys -> Add SSH Key,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容测试是否连接 ssh git@github.com几个概念: 工作区(Working Directory): 你在电脑里能看到的目录。 暂存区(stage / index): 保存了下次将提交的文件列表信息, 一般存放在 .git目录下 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。 版本库(Repository): 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。 远程仓库(Remote) 阮一峰老师对Git工作区、暂存区、版本库、远程仓库的解释 Runoob对Git工作区、暂存区、版本库、远程仓库的解释 忽略文件配置:添加.gitignore文件 文件 .gitignore 的格式规范如下: ...

May 9, 2019 · 4 min · jiezi

leetCode第一题

leetCode第一题普通解决思路将数组变量两次,相加判断是否等于传过来的值,如果等于,返回下标自己写的代码,如果有错误请指出,谢谢 package com.leetcode.firstquestion.one;import java.util.Arrays;/** * @program: test * @description: 两数之和 给定一个整数数组 nums 和一个目标值 target, * 请你在该数组中找出和为目标值的那 * 两个 整数,并返回他们的数组下标。 * @author: Mr.Yang * @create: 2019-05-08 09:20 **/public class Solution { public int[] twoSum(int[] nums, int target) { int[] ints = new int[2]; int indexOne=0; int indexTwo=0; boolean flag=false; for(int x=0;x<nums.length;x++){ for(int y=x+1;y<nums.length;y++){ if((nums[x]+nums[y])==target){ indexOne=x; indexTwo=y; flag=true; break; } } if(flag){ break; } } ints[0]=indexOne; ints[1]=indexTwo; return ints; } public static void main(String[] args) { int[] ints = {1, 2, 3, 4, 5, 6, 7, 8, 9}; Solution solution = new Solution(); int[] ints1 = solution.twoSum(ints, 9); System.out.println(Arrays.toString(ints1)); }}网上流传思路,使用HashMap来处理将数组的遍历值当作key(为了存取好处理,所以将数组的遍历值当作key),索引当作value来存储。 ...

May 9, 2019 · 1 min · jiezi

复联4的这波操作其实是在灭-bug

前方涉及剧透,请谨慎阅读!!!前方涉及剧透,请谨慎阅读!!!前方涉及剧透,请谨慎阅读!!!↓↓↓Q1:您是否看了《复联4》?A、已看 B、马上准备去电影院刷↓↓↓如果您选 B请点击文章左上方的 “☓”建议您可以看完《复联4》再阅读此文!!!↓↓↓如说您选 A,请继续阅读哟~!↓其实,复仇者联盟就像一支一起开发的项目的团队,在开发过程中 bug 层出不穷,但是由于他们的协作还算顺畅,大家都有商有量的,尽心尽力的,所以项目稳步前进,整个世界一派祥和。 有一天,美国队长看到灭霸提交的代码特别多、改动特别大,而且还和自己本地冲突了。经过仔细的代码审查,发现灭霸在疯狂改架构,就把灭霸找进了会议室。 美队:“你现在是什么情况?” 霸霸:“现在的项目已经很庞大了,服务器资源非常有限,老板不买新机器,如果一直这么开发下去,迟早会出现网PO事故。如果能面向对象、提取重复代码,业务拆分,将算法彻底优化,把现有的代码量减少50%,对团队而言,项目利大于弊。” 美队:“当前的代码已经稳定运行了很多年,我们的主要目的是让它稳定,同时不断的优化。你这样改,会出现更多 bug ,破坏现有的稳定。” 霸霸:“。。。 。。。(>﹏<)” 这次,二人的谈话进行的很不愉快,但是灭霸依然认为自己的方案可行。因为灭霸的内心很清楚,我们的资源是有限的,一旦无限繁衍,就会濒临崩溃,因此他要为信仰而战。 于是,灭霸用最短时间组建了团队并强行 996 加班数月,闺女都可以不要,最终获得6位股东(6枚宇宙宝石)的授权,迅速实现了代码量减少50%的目标。 与此同时,地球经历了大规模随机裁员,包括星爵项目组、蜘蛛侠、猩红女巫、奇异博士都被狠心割舍。灭霸认为现在项目运行的身轻如燕,整个世界都是最轻量化的呈现。 在灭霸眼里人命如草芥,他以为丢失的生命就如同丢失的代码一样可以回滚或者重构,他也以为抹去的生命只要通过这剩下的50%来繁衍出新的生命就足够。 灭霸在修改代码的过程中,忽略了一个非常重要的变量:人的情感。 地球上有一半的人类已失去至亲至爱,这种愤怒和悲伤夹杂在一起的情感促成了宇宙中一股宏大的力量。因此,复仇者联盟的成员们并没有放弃,而是一直在尝试各种可能改变现状。 对雷神来说,父母亲都死了,弟弟也被灭霸掐死,自己的家被姐姐毁了,族人也死了一半,最后虽然怒杀了灭霸,但是也什么都无法挽回了,于是开始消极怠工,天天打游戏喝饮料,颓丧变成肥宅雷。 有一天,一个叫蚁人的小码农,找到美队,他说:“咱们的代码是基于 git 存储的,既然大家对现在的状态都不满意,我们可以选择回滚呀!“美队带着对被裁成员的愧疚,组织现有团队,兵分3路,以时间为单位,回到了每个分支特定的版本上。 但在回溯的过程中,星云出现了 bug,致使回退后的那个灭霸追溯到了未来星云的灭爹计划,绑架了未来的星云,全盘监控美队的新改动路径。 此时,其他几路人正在有的放矢的夺回6位大股东的授权,从总部拿到了现网服务器账号。 代码成功回退,很多之前失业的小组成员被返聘,曾经的复联项目组因此更加精进。殊不知,一场旷世大战即将展开。 灭霸在冲突过程中始终没能冲破完整的仓库备份,建立新的分支,于2019年04月24日死于钢铁侠的一键冲突合并。 Gitee:“灭霸的举动严重破坏了项目代码的规范化运作,极易导致代码混乱,触发代码安全问题,强烈建议使用码云企业版防范于未然。” 美队:“你分析的好像有些道理,但是我们要再怎么才能相信你呢?” Gitee:“第一,灭霸无法轻易改动生产代码。码云企业版中,对仓库敏感操作有二次验证,并且有完整的操作记录,代码安全可控且有迹可寻。” 美队:“有点意思!” Gitee:“第二,就算灭霸改了代码也能在云端快速恢复。码云企业版的企业仓库镜像完整备份,不仅推送的代码可以回滚,哪怕删代码库也能镜像恢复。” 美队:“嗯~有些道理!” Gitee:“第三,仓库版本冲突的情况下,灭霸为了省事,直接不负责任的打了响指(-f),悲剧就发生了。码云的禁止强推功能,能对强推行为直接报告错误,帮你解决冲突。” 美队:“确实不错!” Gitee:“第四,日常该有的开发流程,像需求管理、迭代规划,任务分配、编码,代码审查,质量分析,部署测试,缺陷管理一个都不能少,这是为了避免像灭霸这波操作引发的安全事故,确保项目稳健发展及世界和平。” 美队:“你说的很对,我和我的团队会马上使用码云企业版的!” Gitee:“《复联4》是一个艰辛的版本回退过程,码云企业版是您完美的时光机!” 码云Gitee 仅以此文向漫威谱写的十年经典致敬 —灵感来自网友段子— 码云企业版 - 码云 Gitee.com 企业级软件协作开发管理平台有 序规划和管理软件研发全流程初创企业限时特惠,999 即可购买码云标准版 ...

May 8, 2019 · 1 min · jiezi

git常用操作用例

1.建立本地仓库并且与远端分支相关联A. git init:本地仓库初始化。//本质上生成了一个.git文件B. 在远端仓库建立好项目new-project,并且复制远端仓库的地址Git_UrlC. git remote add origin Git_Url//把远端分支和本地分支相互关联D. git add .//把需要上传的文件从工作空间传到stage缓存区中E. git commit -m "XXX"//给本次提交添加说明F. git push -u origin master注:第一次提交是远端仓库需要说明分支因此需要使用git push -u origin master,后面提交直接git push。 2.clone远端分支项目A.git clone Git_Url //clone远端完整项目git branch 显示本地当前分支。git branch -a 显示本地以及远端分支。新clone的仓库是只有本地的master分支以及远端的所有分支,如果需要在本地开发远端仓库的某个分支需要把本地分支和远端分支再做一次映射。B.git checkout -b 本地分支名 origin/远程分支名 //将远程git仓库里的指定分支拉取到本地(本地不存在并且远端已经有的分支)。C.git push --set-upstream origin 分支名 //推送本地分支到远程仓库注:如果当前需求为把远端的一个项目迁移到另外一个项目中,此时我们git clone后在该文件目录中显示一个.git文件,这个文件中包含该项目所有的tags,branches,commit message等关联信息,这时再往新的远端分支推送项目时候并不需要所谓的本地仓库初始化等操作(git init),因为本身clone下来的项目就是一个仓库。因此操作过程应该为:(1)git clone //clone项目(2)git remote add origin Git_Url//把远端分支和本地分支相互关联 (3) git push -u origin master //提交代码,并不需要git add、git commit 等操作,同时带.git的项目自动导入所关联的所有tags,branches,commit message等关联信息。 3.一次完整的提交过程A.git add 文件名//把文件从本地工作空间提交到本地缓存stage,可以提交多次不会产生commit_idB.git commit -m "XXX" //把当前stage缓存区中的所有内容一次性提交到本地分支,会生成新的commit_id。也就是所谓的多次add一次commit。C.git push //把本地分支上的所有commit推到于此分支对应的远端分支 master->origin/master如果在git pull/push/clone中会遇到需要输入username、password的我们为了方便重复输入会采用两种方式进行身份校验。一、sshd本地工作空间公钥二、在git pull http://$username:password@XXXX.gitC.git status //查看本地工作区与本地分支的差异,简言之就是查看工作区域的状态,有哪些文件变更了。当本地工作空间和本地缓存stage都没有更新或者所有的跟新已经push到远端分支显示"nothing to commit working directory clean"D.git diff //查看本地工作区与本地分支的差异,具体文件的变更。 ...

May 8, 2019 · 2 min · jiezi

跳坑指南在vps上部署hexo博客的那些事

说在前面本地使用macOS,vps系统为debian 8;虽说是跳坑指南,但是这篇文章本意也仅仅自用,总结一下自己遇到的问题和解决方法,仅供参考,如有其他问题请百度(google) 整体思路:本地调试完的hexo项目文件通过git推送给vps,然后直接部署在vps上使用域名来访问,这样一个属于自己的blog就可以完成了 本地环境GitGit是一个免费的开源分布式版本控制系统,旨在快速,高效地处理从小型到大型项目的所有事务。这原是广泛用在代码的版本控制,在hexo建站里面的主要作用是推送渲染好的静态网页文件到部署的仓库。 下载Git与安装因为本来我就有,所以这里就不多介绍;网上其他大佬也有很多教程 node.js下载Node.js与安装同上,本地环境也有; HexoHexo是一个快速、简洁且高效的静态博客框架。安装简单,虽然网上教程一大堆,建议参考官方文档。重要!官方文档有中文 ????。 官方文档https://hexo.io/zh-cn/ 安装hexo首先确保本地安装好git和node.js,在终端中输入npm install -g hexo-cli 创建hexo项目(建站)hexo init <folder> // 初始化项目文件夹;<folder>为自定义hexo项目名称cd <folder> // 打开项目文件夹npm install // 安装依赖完成上述步骤,查看自己的项目文件夹内,目录应为: .├── node_modules //依赖包├── scaffolds // 模版├── source // 文章资源| ├── _drafts //草稿| └── _posts //发布文章├── themes //主题| └── landscape //默认主题├── package.json // npm配置文件(可以不用管它)└── _config.yml //hexo配置文件配置hexo既然生成了博客了,那自然需要自己来配置一下自己的博客的信息,打开_config.yml文件进行配置;具体配置参考官方文档:https://hexo.io/zh-cn/docs/co... 下载主题主题我挑了很久,最后选择综合症的我只有选了好多人推荐的next主题next官方文档:https://github.com/theme-next... 下载根据文档给的方式使用git clonegit clone https://github.com/theme-next/hexo-theme-next themes/next 试了几次,我一直报错 'RPC failed; curl 18 transfer closed with outstanding read data remaining' ...

May 8, 2019 · 2 min · jiezi

反思搭建博客时出现的emacs问题

第一个问题本地执行bundle exec jekyll serve命令时,本地启了一个服务器,只要在浏览器上访问localhost:4000就可以显示,博客文章。之后使用git命令,更新到个人github仓库后。使用username.github.io访问发现,跟本地localhost:4000内容不一致。 诶怎么会这样?想了许久,直到我无意间在github展示博客的仓库上的设置里,去选择了博客主题。选择了也更改了仓库内容。但我本地没有同步更新,所以使用git pull 拉取github仓库上的内容,融合过程进入了编辑器模式。我并不想更改东西,只想快点退出编辑模式。 我一开始自己认为进入的vi编辑器,当时认知是这样,根本没有怀疑过自己的想法从何而来。按ESC,以为是命令模式,然后输入wq!回车,发现根本没用,自己大脑就好像凭着感觉随意输入,看看碰碰运气。试了一会,但想起计算机科学家吴军老师送给我们读者的一段话,”注意你的态度,因为它决定你的想法....“,好吧,既然遇到了点麻烦,就正面解决它才是最节约时间的。 冷静一会,事情的出现总有原因吧。出现这结果前提条件是什么?总有依赖的环境吧,不然怎么会出现。我就耐心阅读编辑器的英文如果截图上的Debugger什么的。不知道怎么输入,发现了这是调式模式,我就谷歌,搜索”Mac vi 调式模式“关键词,发现没有我要的答案。就在想,我自己再进入一个vi编辑器,vi index.html诶,发现按下ESC,输入wq!回车是可以退出的。我就猜测也许这不是vi编辑器。运气很好,果然不是vi编辑器,感谢终端的标题。 原来答案早在终端的标题上了,我进入的emacs编辑器,终于问题锁定了,就去谷歌,看看使用什么命令可以退出emacs编辑器。 问题终于解决,我回过想想,我是怎么解决的?起码一开始态度是正确的,这段时间不干别的事就思考如何怎么解决出现无法退出编辑器的问题。这个过程一开始没有想到就搜索一些vi、deugger mode、mac这些关键词,都没有结果,当时根本的方向在哪里都不知道,只知道要退出这个编辑模式。直到锁定了emacs编辑器,才知道,要往这个方向去解决。 当时有一种说不出感觉,一定有因果关系,就觉得事情发生了总有原因,大方向是什么?不能凭感觉搜索什么就什么吧。就感觉我自己被很细节的事情困住了,完全不知道身在何方,我内心想说,我得知道我身在何方吧。隐约想起吴军老师的话,技术的依赖条件,你说屏幕上显示这东西,肯定依赖什么才会出现的。当时想到是vi编辑器,进入了编辑模式,那么我就去查vi的使用手册,也在终端输入了vi --help。解决这个问题真的有偶然性,要不是无意间看到两个截图上的标题,我还没有幡然醒悟。 第二个问题当时自己username.github.io早就已经写了index.html,然后通过jekyll new blog再复制进usename.github.io仓库上,其实一开始,我就应该直接jekyll new username.github.io,然后推送到个人仓库上的。 发现自己并不太能描述问题,描述问题能力差。描述问题有待提高。 总结自己解决问题的思维方式完全没有形成好的依据理论。此刻想起得到专栏,解决问题的四个步骤。第一个明确和理解问题、第二个是拆分和定位问题、第三个提出解决方案、第四个总结问题。 当平时的行为产生跟以往完全不同的结果时,想想这个问题跟之前的环境不一样。我一直以为这个是vi编辑器,按照以往的命令怎么也退不出,还会抱怨怎么回事。解决问题思维方式没有形成自己的一套。

May 7, 2019 · 1 min · jiezi

git-clone的两种方式以及浅谈加密一

一. 引言今天使用git clone的时候由于没有配置ssh 但是使用了ssh的clone命令,出了点问题。仔细研究了一下,还是挺有意思点,希望通过阅读下面的内容能给大家带来一些收获。 二. git clone的两种方式.git clone分为两种方式,一种是通过ssh,还有一种是通过http(s)。 1. ssh 在clone的时候可以选择SSH,首先在命令行输入 ssh-keygen -t rsa -b 40996 -C “邮箱” ,一路点击确定,在本地生成.ssh文件,里面有id_rsa(私钥) id_rsa.pub(公钥),将公钥上传到github上就可以直接免密与github进行文件传输了 // 在本地存在.ssh文件后// 终端输入 $ cd ~/.ssh/ $ cat id_rsa.pub $ ssh-rsa xxxxxxxxxxxxxxxxxxx yourAccount// 复制上面出现的内容在gitlab(github)-->个人账户-->setting-->ssh 将刚复制的公钥粘贴 此时就完成了ssh设置,再clone就是免密的啦。 `这里要提心一下,这时候clone的格式一定是 3.git clone git@xxxxxxxxxx` 2. HTTPHTTP的方式比较简单,就是 git clone 给定的url,然后输入自己在gitlab(github)上相应的账号就行了。 3. ssh与HTTP方式的比较想要比较他们之间的优缺点,首先要搞清楚为什么会这么设计。我个人认为,项目一般分为两类,一类是团队(个人)的项目,一类是开源的项目。团队(个人)项目,具有私有性。同时拉或者推为了方便都应该不需要验证。这就需要保证数据在传输中的私有与可靠。所以使用ssh这种RSA加密的方式。开源项目,具备公有特性。一方面如果每个参与者的数据的拉取都进行加密解密的话,代价将会非常大。另外一个方面,对于众多提交者,代码应该由管理者去审核是否merge,同时代码也没有必要所以没有必要保持传输过场中的私有可靠。所以可以采用HTTP明文传输或者HTTPS也可以。 三. 加密上面介绍了git clone 的两种方式,探讨了一下引入这两种方式的原因,同时引入了加密这个该概念。 在密码学中,加密(英语:Encryption)是将明文信息改变为难以读取的密文内容,使之不可读的过程。只有拥有解密方法的对象,经由解密过程,才能将密文还原为正常可读的内容。具体在前端中你至少要明白下面几个概念:公钥、私钥、RSA、数字证书、https与http的关系、TLS与SSL我将在本篇文章和下篇文章为大家一一道来 1. 对称加密对称加密很简单,就是明文经过密钥转化成密文,倘若我知道密钥和密文,我也可以推出明文,典型的像是摩尔斯码。所以在谍战片中,我们经常看到特务找密码本,就是因为有了密码本就可以破译密文了。 2. 非对称加密(RSA)在对称加密中,由于是直接传递的密钥,密钥容易被人窃取导致信息泄漏, 人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。这种加密方式就叫做非堆成加密。1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。 在RSA加密算法中,公钥用于对数据进行加密,私钥用于对数据进行解密 在RSA签名算法中,私钥用于对数据进行签名,公钥用于对签名进行验证。3. sshssh也是一种典型的非对称加密的方式,本机产生id_rsa(私钥) id_rsa.pub(公钥),将公钥上传到github上。pull的时候公钥用于对数据进行加密,私钥用于对数据进行解密,push的时候私钥用于对数据进行签名,公钥用于对签名进行验证。 4. 拓展这里再介绍一个部署项目的方法,比如我们开发项目,把项目托管到gitlab上,然后当我们上线的时候将本地文件上传到服务器上。说实话这一步还是比较麻烦的。我们能不能让gitlab和我们线上服务器通过ssh连接,当gitlab代码更新到最新版本的时候,线上我只需要运行git pull 就自动完成文件的拉取和更新了。 ...

May 7, 2019 · 1 min · jiezi

gitnore文件修改生效方法

当修改gitnore文件后,常常出现文件不生效的情况,是因为之前的修改已经提交到暂存区上了。解决方法 git add . //防止已有修改还没到暂存区的情况git rm -r --cached . //清除暂存区记录git add . //提交修改记录到暂存区中执行到第三步即能使gitnore文件生效,后续操作会按照gitnore规则执行

May 5, 2019 · 1 min · jiezi

git-入门教程之-git-bash-竟然不支持-tree-命令

开门见山git bash 是 Windows 用户安装 git 时默认安装的命令行工具,不仅界面漂亮功能也不错,大多数情况下可以替代 Windows 原生的 cmd 命令行. 然而,git bash 命令行不是万金油,并不能完全替代 cmd ,详情请参考 mintty 官网的相关说明. mintty is not a full replacement for the Windows Console windowgit bash 命令行默认使用 mintty 作为终端模拟器,而 mintty 官宣表示自己不能完全替代 cmd,也就是说 git bash 可能不具备某些 cmd 命令. 举个简单的例子,如果想要查看当前目录的文件结构,最好是以目录树的形式展现,聪明的你获取已经猜到了tree 命令. git bash 命令行中输入 tree 命令发现并无此命令. snowdreams1006@home MINGW64 /g/sublime/test$ treebash: tree: command not found为了验证,确实没有 tree 命令,我们直接打开 git bash 支持的命令文件目录,查看到底有没有 tree.exe 文件. ...

May 5, 2019 · 21 min · jiezi

解决Git-Pullpush每次都需要输入密码问题

如果我们 git clone 的下载代码的时候是连接的https://而不是git@git (ssh)的形式,当我们操作 git pull/push 到远程的时候,总是提示我们输入账号和密码才能操作成功,频繁的输入账号和密码会很麻烦。 1. 本地保存帐号密码git bash 进入你的项目目录,输入:git config --global credential.helper store 然后你会在你本地生成一个文本,上边记录你的账号和密码。当然这些你可以不用关心。然后你使用上述的命令配置好之后,再操作一次 git pull,然后它会提示你输入账号密码,这一次之后就不需要再次输入密码了。 2. 使用 SSH 连接Git Bash 进入 ssh 目录cd ~/.ssh生成 SSH key (文件名:id_rsa, id_rsa.pub) ssh-keygen -t rsa -C "xxxxxx@yy.com" #建议填写自己真实有效的邮箱地址文本编辑器打开公钥 id_rsa.pub 复制内容,添加到 Github setting。测试ssh -T git@github.comYou've successfully authenticated, but GitHub does not provide shell access.说明配置成功 本文作者: Shellming本文链接: https://shellming.com/2019/05/05/git-ssh-pwd/版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!

May 5, 2019 · 1 min · jiezi

git远程从入门到放弃

git pull下来用git branch -r查看远程分支才有数据解决方案:指定当前工作目录工作分支,跟远程的仓库,分支之间的链接关系。比如我们设置master对应远程仓库的master分支git branch --set-upstream master origin/master git branch查看本地分支,git branch -r 查看远程分支具体原因: 出现这种情况主要是由于远程仓库太多,且分支较多。在默认情况下,git push时一般会上传到origin下的master分支上,然而当repository和branch过多,而又没有设置关联时,git就会产生疑问,因为它无法判断你的push目标。用如下命令进行本地分支和远程分支进行关联 git push --set-upstream origin master这样在我们每次想push或者pull的时候,只需要 输入git push 或者git pull即可。在此之前,我们必须要指定想要push或者pull的远程分支。git push origin mastergit pull origin master.不然报错 git pull时遇到fatal: refusing to merge unrelated histories我们在初见一个git仓库需要将之提交到远程仓库时,使用git pull origin master 命令操作时,会遇到这样的错误:fatal: refusing to merge unrelated histories 这是因为远程仓库已经存在代码记录了,并且那部分代码没有和本地仓库进行关联,我们可以使用如下操作允许pull未关联的远程仓库旧代码: git pull origin api-dev --allow-unrelated-histories这样就可以把远程该分支的代码下载到本地了git branch -vv 可查看本地分支和远程分支的对应关系 根本原因在于本地分支 github 是从远程分支develop拉取的,在执行git push命令时,不知道应该与远程哪个分支进行同步,就会出现上面那个错误提示了两种解决方法 git push github-origin HEAD:develop这种是将当前分支推送到github-origin仓库的develop分支或者git push github-origin HEAD这种是将当前分支推送到远程的同名分支,没有就会创建git rebase变基设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支,你可以在任意时间使用 -u 或 --set-upstream-to 选项运行 git branch 来显式地设置。 ...

May 5, 2019 · 1 min · jiezi

git远程易错点

git pull下来用git branch -r查看远程分支才有数据解决方案:指定当前工作目录工作分支,跟远程的仓库,分支之间的链接关系。比如我们设置master对应远程仓库的master分支git branch --set-upstream master origin/master git branch查看本地分支,git branch -r 查看远程分支具体原因: 出现这种情况主要是由于远程仓库太多,且分支较多。在默认情况下,git push时一般会上传到origin下的master分支上,然而当repository和branch过多,而又没有设置关联时,git就会产生疑问,因为它无法判断你的push目标。用如下命令进行本地分支和远程分支进行关联 git push --set-upstream origin master这样在我们每次想push或者pull的时候,只需要 输入git push 或者git pull即可。在此之前,我们必须要指定想要push或者pull的远程分支。git push origin mastergit pull origin master.不然报错 git pull时遇到fatal: refusing to merge unrelated histories我们在初见一个git仓库需要将之提交到远程仓库时,使用git pull origin master 命令操作时,会遇到这样的错误:fatal: refusing to merge unrelated histories 这是因为远程仓库已经存在代码记录了,并且那部分代码没有和本地仓库进行关联,我们可以使用如下操作允许pull未关联的远程仓库旧代码: git pull origin api-dev --allow-unrelated-histories这样就可以把远程该分支的代码下载到本地了git branch -vv 可查看本地分支和远程分支的对应关系 根本原因在于本地分支 github 是从远程分支develop拉取的,在执行git push命令时,不知道应该与远程哪个分支进行同步,就会出现上面那个错误提示了两种解决方法 git push github-origin HEAD:develop这种是将当前分支推送到github-origin仓库的develop分支或者git push github-origin HEAD这种是将当前分支推送到远程的同名分支,没有就会创建git rebase变基设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支,你可以在任意时间使用 -u 或 --set-upstream-to 选项运行 git branch 来显式地设置。 ...

May 5, 2019 · 1 min · jiezi

用-Travis-CI-自动部署-Github-Pages

原文链接:用 Travis CI 自动部署 Github Pages 前言Github Pages 不能运行动态程序,只能输出一些静态内容。因此 Github Pages 非常适合用于前端项目的展示。可用于存放项目介绍、项目文档或者个人博客。本文介绍了怎么用 Travis CI 自动化部署 Github Pages。 关于 CI持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。目前 github 开源项目用的较多的 CI 主要是 Circle CI 和 Travis CI,两者都是利用容器技术来适配不同项目环境。 (图一 CIrcle CI,图二 Travis CI) 步骤1. 安装 Github App在 Github Market Place 安装 Travis CI。安装时选择你想要的项目权限。<img src="https://s2.ax1x.com/2019/05/0...; width="50%" alt="ENCylT.png" title="ENCylT.png" /> 2. 配置 Github Token配置 Github Token 用于 Travis CI 对你项目的访问权限,配置完了之后 不要刷新页面,先点一下 Token 后面的复制按钮,因为你只能看见这个 Token 一次,刷新了它就没了 不得不赞一下 Github 的安全性 :+1: ...

May 4, 2019 · 2 min · jiezi

commit-your-changes-or-stash-them-before-you-can-merge

今天用git pull来更新代码,遇到了下面的问题: error: Your local changes to the following files would be overwritten by merge: .gitignorePlease, commit your changes or stash them before you can merge.Aborting1. stash通常遇到这个问题,你可以直接commit你的修改; 但我这次不想这样。 看看git stash是如何做的。 git stashgit pullgit stash pop接下来diff一下此文件看看自动合并的情况,并作出相应修改。 git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。 git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。 git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。 git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。 2. 放弃本地修改,直接覆盖之git reset --hardgit pull

May 3, 2019 · 1 min · jiezi

git-push-RPC-failed-result22-HTTP-code-411

git push时出现的错误:RPC failed; result=22, HTTP code = 411    fatal: The remote end hung up unexpectedly error: RPC failed; result=22, HTTP code = 411fatal: The remote end hung up unexpectedlyEverything up-to-date查了一下就是由于原因:默认 Git 设置 http post 的缓存为 1MB,上述代码将其设置为 500MB~ 这样的话首先改一下Git的传输字节限制~ $ git config http.postBuffer 524288000

May 2, 2019 · 1 min · jiezi

Git工作流规范-Beta

Git工作流规范 Beta前言正确的 Git workflow 规范,可以适当的减少杂乱提交,形成清晰美观的提交记录树。并方便对于每次新功能的Code Review。 分支说明master: 正式版本分支,禁止直接Merge 和 push ,必须在gitee上采用pull request的方式更新(直接操作master很恐怖)test: 测试分支dev: 开发分支个人分支/feature分支: 此为个人独有分支,可以只存在本地,也可以上传远端。禁止在个人分支上协作开发。如若上传远端,记得有空清除废弃分支(git branch -D xxx 删除本地分支,git push --delete origin/xxx 删除远端分支)工作流说明dev新功能开发: 从最新的dev分支 checkout -b 一个feature分支 或 合并进 个人分支进行开发,可以随时并且多次地commit。commit内容可以随意,但一定要自己知道干了啥开发完成,checkout切到dev分支,pull -rebase 一下远程的代码,在最新代码下merge一下自己新开发的功能分支解决冲突,最后push到dev如果上线新版本,在gitee 上 pull request更新master分支(严禁直接操作master分支)备注: 如果希望你的commit太杂乱,希望归结到一条清爽无比 git rebase -i HEAD~x 来合并commit 提交记录。(x表示之前的多少次提交,具体可以百度,暂时不对commit对要求)几个注意事项:多人协作分支(master、test、develop),禁止使用rebase(除非你已经是Git大师级别的人物),禁止git push --force。 (反正目前只允许在个人分支中使用rebase)每开发完一个功能,建议合并到develop,你个人分支与develop脱节越久,rebase时产生冲突的几率和影响范围就越大。如果你对git rebase 不熟悉,建议先只在个人分支使用rebase来精简提交记录。 合并develop时产生的merge commit 暂时可以被接受。各种环节中,一旦出现merge commit,不用再像之前那样填写完整的commit message了,建议使用默认的message即可。(否则会有相同语义的message,影响美观)。关于merge和rebase的区别,可以阅读http://blog.csdn.net/hudashi/... 。 建议自己学会使用搜索引擎进行学习。建议自己弄个项目,把各种场景模拟一下,先玩一玩试试。具备一定程度以上的好奇心,比如rebase -i 中其他几种command的作用。

May 1, 2019 · 1 min · jiezi

前端开发中遇到的一些问题持续更新

页面两个div之间有一个小margin,样式怎么改都去不掉解决:html中div换行了,把两个div放到同一行可以解决,还有一种好办法就是使用flex。 app上点击有背景解决:全局添加样式-webkit-tap-highlight-color: rgba(255, 255, 255, 0); 手机端input边框阴影解决:添加-webkit-appearance: none; chrome模拟器里点击元素错位解决:我把百分比改成fit to window 好了,也可以来回切换几次机型。 git push 报错RPC failed; curl 55 SSLWrite() returned error -9805解决:一次性提交代码太多导致,使用git log找到最近一次commit的代码,git reset {id}回退到commit前的状态,再分批次提交。 代码丢失,git log找不到解决:git reset --hard xxx的记录,使用git reflog。 sudo nginx -s reload启动nginx报错:nginx: [error] open() "/usr/local/var/run/nginx.pid" failed (2: No such file or directory) 解决:sudo nginx -c /usr/local/etc/nginx/nginx.conf => sudo nginx -s reload input中type为number时maxlength失效解决:input type="tel" 微信授权callback有多个参数,出现丢失的情况。解决:因为授权接口中&的多个参数会变成整个接口地址的参数,所以需要对&进行加密,使用var callbackurl = encodeURIComponent(window.location.href)进行加密 滚动不顺畅解决:添加样式 -webkit-overflow-scrolling: touch;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;事件冒泡解决: stopPropagation,cancelBubble(ie) 移入移出多次触发解决: mouseleave 对子元素不生效,不会冒泡 ...

April 29, 2019 · 2 min · jiezi

一个-Git-分支协作模式的进化故事

本文囊括2076字 Git 作为一个强大的分布式版本控制系统,对比 SVN、CVS 等版本控制系统,其架构和设计在研发管理和协作上有着极大的优势。在个人开发的代码管理和团队协作过程中,合理使用分支能在极大程度上提升管理效率。这篇文章根据张三、李四、赵六开发成长历程改编,解读了在企业开发过程中进行协作开发的分支模型。 从不用版本管理 到 使用 Git分支管理的故事,也就是从这个时候开始的。。。 某公司只有一个程序员,一开始并没有版本管理的概念。项目开发只有一个人在参与,所以也没用版本管理工具。 后来,老板又招了两个程序员,老板说:“研发管理要规范!”,经过一番调研,选用了 Git,三个人开始使用 Git 进行开发上的协作。 一开始,三个人都是通过一个仓库,在 master 分支上进行协作。每天上班第一件事就是先把最新的代码从服务器上拉到本地的 master 分支,下班前再把代码给推到服务器上的 master 分支,项目就这样展开了协作。 3人通过本地仓库 master 分支向远程仓库 master 分支提交代码 解决频繁的代码提交冲突 协作了几天,团队发现提交代码 master 时候,经常产生代码冲突,要么张三和李四的代码冲突,要么李四跟赵六的代码冲突。这时总要有人把代码拉下来解决冲突。才能保证后续开发工作顺利进行。同时,由于缺少代码审查。部分质量较差的代码和无关内容也时不时被提交上去。 团队在解决冲突和代码重构的问题上花费了不少精力。。。 为了解决单一分支频繁更新容易发生冲突的问题,三人开始研究使用分支的方式进行协作。通过在本地 master 检出新分支,修改后将新分支推送到远程仓库,再通过 拉取合并请求(Pull Request)在远程仓库上合并分支到 master 分支。最后再把代码从远程 master 拉取到本地 master 进行更新。在这个基础上,团队也开始展开相互的 代码审查(Code Review)工作。本地 master 分支检出新分支开发推送到远端仓库后,通过 Pull Request 合并到 master,然后拉回本地 master。 初步解决代码迭代版本问题 经过一番折腾,几个人的协作总算能比较稳定地进行。在后续数周内,团队开发工作顺利展开,项目也得以落地,进入快速迭代阶段。为了解决迭代的版本问题,团队使用分支对每次版本发布检出一个分支进行保留。通过远程仓库 master 分支在版本发布时,检出一个以版本号命名的分支,作为特定版本管理。 团队增长带来的困扰 两个月后,公司迎来了业务的快速增长。技术团队从原来三个人快速增长到十来个人。原来的成员开始带着新人做业务,随着团队的增长,原有的协作方式再次遇到各种各样的问题。经过短短一周的磨合,三人无比疲惫地坐到一起,对过去一周遇到的问题进行了复盘: 随着协作人数增多,远程仓库分支数量快速增长,查找起来很麻烦,经常出现分支重名问题。分支命名混乱,提交新功能的分支和修复Bug的分支经常混淆在一块。版本迭代的速度太快,产生了一大堆的 Realease 分支,又带来了一堆的管理问题。还没来得及合并或独立维护的分支,时间久了容易出现管理遗漏和维护混乱。虽然有 Code Review,但程序的 Bug 数和 Crash 频率明显随团队规模而增长,生产事故发生率和回滚率提高。还有人把手头未完成开发的分支扔到远程仓库进行托管。经过讨论三个人都意识到了问题所在,但无奈三人对于多人协作开发经验不多,讨论无果后,决定各自调研,再对比讨论。两天后,三个人带着方案展开了探讨。✗ℨ ...

April 29, 2019 · 1 min · jiezi

window上小而美的软件推荐度按排名

Notepad++ 更好用更强大的笔记本QTranslate 本地翻译神器7-zip 解压缩软件Wox 程序/文件/快捷 神器 1!Everthing 搜索本地文件神器Clover 像浏览器一样打开文件夹Ditto 记录每次复制内容,黏贴时可选择,复制黏贴神器Listary 程序/文件/快捷 神器 2!火萤酱 程序/文件/快捷 神器 3!Q-Dir 多窗口资源管理器SPlayer 干净的射手播放器TrafficMonitor CPU 网络监控控件ScreenToGif.exe gif录屏软件gifcam.exe gif录屏软件geek.exe 更好用的卸载软件360极速浏览器 本的化的ChromeCmder window上更好用的shellcurl 配合cmder使用,代替postman设置全局快捷后,效率起飞!

April 27, 2019 · 1 min · jiezi

版本控制系统Git笔记

git介绍Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,它最初是由Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件并且它采用了分布式版本库的方式,不必服务器端软件支持。 git官网git的官网:https://git-scm.com/ git的功能Git作为一个版本控制工具,它具备的功能如下: 协同修改:多人可以并行不悖地修改服务器端的同一文件;数据备份:可以保存文件或者目录的当前状态,也可以保存每一个提交过的历史状态;版本管理:Git 采取了文件系统快照的方式,在保存每一个版本的文件信息的时候做到不保存重复数据,以节约存储空间,提高运行效率。权限控制:对开发团队的人员进行权限控制,对团队开发者贡献的代码进行审核;历史记录:可以查看修改人员、修改时间、修改内容、日志信息,可以将本地文件恢复到某一个历史状态;分支管理:允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。git的优势 大部分操作都在本地完成,不需要联网;完整性保证;尽可能添加数据而不是删除或修改数据;分支操作非常快捷流畅;与Linux命令完全兼容。git的安装Linux系统安装1. 环境说明:使用的是Centos7系统,防火墙为关闭状态。 [root@moli_linux1 ~]$ rpm -qa centos-releasecentos-release-7-5.1804.el7.centos.2.x86_64[root@moli_linux1 ~]$ uname -aLinux moli_linux1 3.10.0-862.6.3.el7.x86_64 #1 SMP Tue Jun 26 16:32:21 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux[root@moli_linux1 ~]$ getenforceDisabled[root@moli_linux1 ~]$ systemctl status firewalld.service● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1)2. yum安装gitCentOS系统中自带了git包,可直接使用yum命令进行安装 [root@moli_linux1 ~]$ rpm -qa gitgit-1.8.3.1-20.el7.x86_64 # 自带的git版本为1.8.3[root@moli_linux1 ~]$ yum install -y git # 进行安装3. 编译安装如果觉得自带的git版本过低,需要安装较新版本的git软件,可以使用编译安装的方法。首先,去github上下载源码包,地址:https://github.com/git/git/re... ...

April 25, 2019 · 2 min · jiezi

gitbash自定义编辑器在命令行打开编辑以及命令行打开当前目录

写代码的过程中,偶尔会遇到在git-bash里头提交时最后一次检查代码的修改记录万一想改动每次都是alt+tab或者win+tab(原谅我是个win狗~)切换到编辑器修改了再切换回来进行提交so~一、命令行打开默认编辑器进行选中文件编辑 首先要自定义命令,在桌面上新建一个文件,文件名就是你想敲的执行命令(比如我,想用notpad打开),文件里头写入: #!/bin/sh"D:Notpad++\notpad++.exe" $1 &注:查了一下,最后的 & 符号表示在后台打开 注意下图我放置的位置 好,下面试试效果: 恩,nice!下次只需要敲这个命令,修改了之后保存叉掉文件就行了 二、打开当前目录的文件夹这个没什么说的,没错,就是这么简单 start .

April 25, 2019 · 1 min · jiezi

git 那些骚操作

git push到远端以后去修改 commit messagegit commit --amend进入vim 编辑模式修改commit messagegit push -f origin HEAD: your branch vim编辑器教程

April 22, 2019 · 1 min · jiezi

Git 入门详解

Gitgit核心概念及入门详解什么是gitgit是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。应注意的是,这与GNU Interactive Tools(一个类似Norton Commander界面的文件管理器)有所不同。git最初的开发动力来自于BitKeeper和Monotone。git最初只是作为一个可以被其他前端(比如Cogito或Stgit)包装的后端而开发的,但后来git内核已经成熟到可以独立地用作版本控制。很多著名的软件都使用git进行版本控制,其中包括Linux内核、X.Org服务器和OLPC内核等项目的开发流程。 版本控制系统Git 是目前世界上最优秀的分布式版本控制系统。版本控制系统是能够随着时间的推进记录一系列文件的变化以便于你以后想要的退回到某个版本的系统。版本控制系统分为三大类:本地版本控制系统,集中式版本控制系统和分布式版本控制系统 本地版本控制(Local Version Control Systems)是将文件的各个版本以一定的数据格式存储在本地的磁盘(有的VCS 是保存文件的变化补丁,即在文件内容变化时计算出差量保存起来),这种方式在一定程度上解决了手动复制粘贴的问题,但无法解决多人协作的问题。 集中式版本控制(Centralized Version Control Systems)相比本地版本控制没有什么本质的变化,只是多了个一个中央服务器,各个版本的数据库存储在中央服务器,管理员可以控制开发人员的权限,而开发人员也可以从中央服务器拉取数据。集中式版本控制虽然解决了团队协作问题,但缺点也很明显:所有数据存储在中央服务器,服务器一旦宕机或者磁盘损坏,会造成不可估量的损失。 分布式版本控制( Distributed Version Control System)与前两者均不同。首先,在分布式版本控制系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,系统保存的的不是文件变化的差量,而是文件的快照,即把文件的整体复制下来保存,而不关心具体的变化内容。其次,最重要的是分布式版本控制系统是分布式的,当你从中央服务器拷贝下来代码时,你拷贝的是一个完整的版本库,包括历史纪录,提交记录等,这样即使某一台机器宕机也能找到文件的完整备份。 Git 工作区、暂存区、版本库之间的关系工作区(WorkingDirectory) 工作目录是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘 上供你使用或修改。 暂存区(StagingArea) 暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索 引’',不过一般说法还是叫暂存区域。 版本库(Repository) Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆 仓库时,拷贝的就是这里的数据。 Git 工作流程1.在工作目录中修改文件。 2.暂存文件,将文件的快照放入暂存区域。 3.提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。 如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状 态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。 在Git 基础一章,你会进一步了解 这些状态的细节,并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。 Git 常用命令详解1.Git文件操作$ git help [command] # 显示command的help$ git show [$id] # 显示某次提交的内容 $ git checkout [file] # 抛弃工作区修改$ git checkout . # 抛弃工作区修改$ git add [file] # 将工作文件修改提交到本地暂存区$ git add . # 将所有修改过的工作文件提交暂存区$ git reset [file] # 从暂存区恢复到工作文件$ git reset -- . # 从暂存区恢复到工作文件$ git reset --mixed HEAD~1 # 修改版本库,修改暂存区,保留工作区$ git reset --soft HEAD~2 # 修改版本库,保留暂存区,保留工作区$ git reset --hard HEAD~3 # 修改版本库,修改暂存区,修改工作区$ git commit --amend # 修改最后一次提交记录$ git revert [$id] # 恢复某次提交的状态,恢复动作本身也创建次提交对象$ git revert HEAD # 恢复最后一次提交的状态$ git status # 查看当前工作区状态 $ git config --list # 看所有用户$ git ls-files # 查看已经被提交的文件$ git commit -a # 提交当前repos的所有的改变$ git commit -v # 参数-v可以查看看commit的差异$ git commit -m "message" # 提交到本地并添加提交信息$ git commit -am "init" # 添加并提交 $ git log 的常用选项 -p 按补丁格式显示每个更新之间的差异。 --stat 显示每次更新的文件修改统计信息。 --shortstat 只显示 --stat 中最后的行数修改添加移除统计。 --name-only 仅在提交信息后显示已修改的文件清单。 --name-status 显示新增、修改、删除的文件清单。 --abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。 --relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。 --graph 显示 ASCII 图形表示的分支合并历史。 --pretty 使用其他格式显示历史提交$ git rm --cached [file] # 从暂存区中删除文件$ git rm -f [file] # 强行移除版本控制的文件$ git rm -r --cached [file] # 递归删除-r,是文件夹的时候有用$ git diff [file] # 比较当前文件和暂存区文件差异$ git diff [$id] [$id] # 比较两次提交之间的差异$ git diff [branch1]..[branch2] # 在两个分支之间比较$ git diff --staged # 比较暂存区和版本库差异$ git diff --cached # 比较暂存区和工作区差异$ git diff --stat # 仅仅比较统计信息$ git stash # 暂存当前正在进行的工作$ git stash push # 将暂存给push到一个临时空间中$ git stash list # 查看所有缓存的代码$ git stash clear # 清空缓存区内容$ git stash drop # 移除某个贮藏$ git stash save # 指定message$ git stash show # 查看指定stash的diff$ git stash apply stash@{1} # 取出指定的缓存代码$ git stash pop # 将文件从临时空间pop下来$ git fetch origin dev:dev # 获取最新版本到本地不会自动merge$ git pull origin master:master # 获取最新版本到本地会自动mergeGit分支操作相关命令$ git branch # 查看分支$ git branch [dev] [master] # 在master创建dev分支$ git branch -v # 查看各个分支最后提交信息$ git branch -r # 查看远程分支信息$ git branch -a # 查看所有分支信息$ git branch -m [aaa] [bbb] # 将aaa 重命名为bbb$ git branch [name] # 从当前分支创建分支$ git branch -d [branch] # 删除某个分支$ git branch -D [branch] # 强制删除某个分支$ git branch --set-upstream-to origin/test master # 本地分支和远程分支关联$ git branch --set-upstream-to=origin/master help #$ git branch --merged # 查看已经被合并到当前分支的分支$ git branch --no-merged # 查看尚未被合并到当前分支的分支$ git commit [$id] -b [new_branch] # 从历史提交记录创建分支$ git commit [$id] # 从历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除$ git checkout [name] # 切换分支$ git checkout --track origin/dev # 切换到远程dev分支$ git checkout -b [name] # 从当前分支新建并切换到name$ git checkout -b [new_br] [br] # 基于branch创建新的new_branch$ git merge origin/dev # 将分支dev与当前分支进行合并$ git merge [branch] # 将branch分支合并到当前分支$ git merge origin/master --no-ff # 不要Fast-Foward合并,这样可以生成merge提交$ git rebase master [branch] # 将master rebase到branch,相当于: git clone [branch] && git rebase master && git clone master && git merge [branch]Git远程分支管理$ git pull # 抓取远程仓库所有分支更新并合并到本地$ git pull --no-ff # 抓取远程仓库所有分支更新并合并到本地,不要快进合并$ git fetch origin # 抓取远程仓库更新$ git merge origin/master # 将远程主分支合并到本地当前分支$ git clone --track origin/branch # 跟踪某个远程分支创建相应的本地分支$ git clone -b [l_b] origin/[r_b] # 基于远程分支创建本地分支,功能同上$ git push # push所有分支$ git push origin master # 将本地指定分支推到远程主分支$ git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)$ git clone [git@xxx.git] # 克隆远程仓库$ git remote -v # 查看远程服务器地址和仓库名称$ git remote show [name] # 查看远程服务器仓库状态$ git remote add [name] [url] # 添加远程仓库地址$ git remote rm [repository] # 删除远程仓库$ git remote set-url --push [name] [newUrl]# 修改远程仓库$ git pull [rName] [lName] # 拉取远程分支$ git push [rName] [lName] # 推送远程分支$ git push origin [lname]:[rname] # 本地分支push到远程$ git push origin -d [name] # 删除远程分支-d也可以用--delete$ git remote set-head origin master # 设置远程仓库的HEAD指向master分支$ git branch --set-upstream master origin/masterGit版本回退操作相关命令HEAD :当前版本HEAD^ :上一个版本$ git log # 查看commit的信息$ git log --pretty=oneline # 单行展示历史记录$ git log --oneline # 单行简单展示$ git reflog # 查看命令历史记录 $ git checkout . # 撤销所有本地改动代码$ git checkout [file] # 撤销所有本地改动代码$ git reset HEAD . # 撤销所有add文件 $ git reset HEAD [file] # 撤销单个add文件$ git reset --soft HEAD # 只回退commit的信息,保留修改代码$ git reset --hard HEAD^ # 彻底回退到上次commit版本,不保留修改代码$ git revert # 以前commit的id$ git reset --hard [branch] # 本地代码回退到与git远程仓库保持一致--hard 参数会抛弃当前工作区的修改--soft 参数的话会回退到之前的版本,但是保留当前工作区的修改,可以重新提交Git标签操作相关命令$ git tag # 查看标签$ git tag [name] # 创建版本$ git tag -d [name] # 删除版本$ git tag -r # 查看远程版本$ git push origin [name] # 创建远程版本(本地版本push到远程)$ git push origin :refs/tags/[name] # 删除远程版本$ git pull origin --tags # 合并远程仓库的tag到本地$ git push origin --tags # 上传本地tag到远程仓库$ git tag -a [name] -m [message] # 创建带注释的tagGit子模块(submodule)相关操作命令$ git submodule add [url] [path] # 添加子模块$ git submodule init # 初始化子模块,只在首次检出仓库时运行一次就行$ git submodule update # 更新子模块 每次更新或切换分支后都需要运行一下删除子模块:分4步1) $ git rm --cached [path]2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉3) 编辑“ .git/config”文件,将子模块的相关配置节点删除掉4) 手动删除子模块残留的目录Git补丁管理git diff ] ../sync.patch # 生成补丁git apply ../sync.patch # 打补丁git apply --check ../sync.patch #测试补丁能否成功Git忽略一些文件、文件夹不提交在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如 ...

April 21, 2019 · 4 min · jiezi

git从入门到放弃

到你想进行版本控制的文件所在的目录下(该目录即是工作区)查看状态 git status初始化 git init添加到暂存区 git add提交到版本库 git commit -m “注释"为什么Git添加文件需要两步呢?一步add,一步commit。嘿嘿,因为commit命令可以一次提交多个文件,所以你可以多次使用add命令呢。(相当于在某地集合然后大家一起去网吧开黑,当然你也可以自个去)然而我们在工作区的文本中添加一行内容想知道做了哪些修改的话可以使用命令 git diff(仅对已追踪的文件好使)再次修改文件再次添加版本回滚多添加提交几次用git log命令可以查看最近几次提交的版本。如果你发现内容太多,可以用这个命令查看 git log –pretty=oneline -n(n表示显示几条记录)在Git中我们用HEAD表示当前版本,也就是我们最新提交的,上一个版本就应该这么表示”HEAD^“,再上一个版本就这样表示”HEAD^^“,当然如果有几十个版本或者1000个版本,我们还要写1000个^,这是不可能的,所以哟。我们写成这样HEAD~1000回退到上一版本git reset –hard HEAD^(慎用,了解详情)想回到某个版本 git reset –hard 版本号(这个会改变工作区,暂存区的数据,慎用,了解详情)我们在工作区新建一个文本b.txt,再git status查看状态,提示因为工作区新建的b.txt没有被add到暂存区,git提示我们有一个untracked(未被追踪)的文件。(可以用git add <file>命令添加到暂存区)在工作区修改已经git add 过的readme.txt文本,查看状态提示:changes not staged for commit :意思是readme.txt已经被修改了但还未添加到暂存区Git会告诉你有你个文件被修改,你有两个选择,一个用 git add 提交到暂存区,另一个是用git checkout可以丢弃工作区的修改。命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销(discard changes(放弃修改)),这里有两种情况:一种是readme.txt自修改后还没有被放到暂存区,现在撤销修改就回到和版本库一模一样的状态;另一种是readme.txt已经添加到暂存区后,又作了修改,现在撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit或git add时的状态。当我们把修改的readme.txt和新建的b.txt添加到暂存区的时候use “git reset HEAD <file>…” to unstage 意思是git reset HEAD <file> 可以把暂存区中的修改撤消掉,就是你git add <file> 后就后悔了,发现你其实不想添加文件到暂存区,就可以用这个命令,原理是让当前分支对应的内容,覆盖掉暂存区的内容,这样就相当于我们没有提交大概意思是除了存在未跟踪的文件外,未添加任何提交 ,说明暂存区是空的,告诉我们可以用git add <file> 跟踪文件這意味著你有一個乾淨的工作目錄——換句話說,已追蹤的檔案沒有被修改; Git 也沒有看到任何未追蹤檔案,否則它們會在這裡被列出來;b.txt同時被列在已預存「及」未預存。 這怎麼可能? 原來 Git 在你執行 git add 命令時,的確將當時的檔案內容預存起來; 如果你現在提交,最後一次執行 git add 命令時,那個當下的 b.txt 的版本會被提交,而不是在提交時你在工作目錄所看到的檔案版本被提交; 如果你在 git add 後修改檔案,你必需再次執行 git add 預存最新版的檔案:簡潔的狀態輸出雖然 git status 輸出內容相當全面,但也相當囉嗦; Git 另外提供一個簡潔輸出的選項,因此你可以以一種較精簡的方式來檢視你的修改; 如果你執行 git status -s 或 git status –short,你可以從該命令得到一個相當簡單的輸出內容:$ git status -s M READMEMM RakefileA lib/git.rbM lib/simplegit.rb?? LICENSE.txt未追蹤的新檔案在開頭被標示為 ??、被加入預存區的新檔案被標為 A、已修改檔案則是 M 等等。 標記有二個欄位——左邊欄位用來指示「預存區」狀態,右邊欄位則是「工作目錄」狀態。 所以在這個範例中,在工作目錄中的檔案 README 是已修改的,但尚未被預存;而 lib/simplegit.rb 檔案則是已修改且已預存的; Rakefile 則是曾經修改過也預存過,但之後又再次修改,所以總共有二次修改,一個有預存一個沒有。git diff 会对比【工作目录】和【暂存区】间的内容,,然后将【工作目录】已修改但未存入【暂存区】的内容展示出来git diff –staged会对比【暂存区】和版本库中最新的一个版本,即最后一次commit上去的内容,把【暂存区】和【版本库】的差异展示出来,如果一样,无返回(–staged和–cached是一回事)对比的是已追踪的文件git commit -a -m “注释” Git 在提交前自動預存所有已追蹤的檔案,讓你略過 git add 步驟(前提是文件已被追踪)在提交之前,你並不需要執行 git add 來預存 b.txt 檔案; 那是因為 -a 選項會納入所有已變更的檔案; 很方便,但請小心,有時候它會納入你並不想要的變更。如果将【工作目录】即电脑本地的文件删除(rm <file>),git status会显示:有变更但未添加到【暂存区】,暂存区有而工作目录没有如果接下来执行 git rm,【暂存区】会记录该档案的移除动作另一個有用的技巧是保留工作目錄的檔案,但將它從預存區中移除; 換句話說,你或許想保留在磁碟機上的檔案但不希望 Git 再繼續追蹤它; 當你忘記將某些檔案加到 .gitignore 中而且不小心預存它的時候會特別用有,像是不小心預存了一個大的日誌檔案或者一堆 .a 已編譯檔案。 加上 –cached 選項可做到這件事:git rm –cachedgit rm –cached 只删除暂存区的文件,rm 只删除工作目录的文件,git rm 工作目录和暂存区的文件都删除git mv b.txt bb.txt 可给文件更名git add -A 和 git add . 的区别git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add –update的缩写)git add -A :是上面两个功能的合集(git add –all的缩写)参考参考二参考三参考四 ...

April 20, 2019 · 1 min · jiezi

如何在Github中删除已有仓库或文件

因为在学习github使用的时候新建了几个仓库,现在想要删除这些无用的仓库,却不知道在哪删除,搜索之后整理出来以供需要的人参考。删除整个远程仓库进入到需要删除的仓库界面,找到settings点击进入Denger Zone,如下图所示:点击“Delete this repository”后出现弹框,里面输入你要删除的仓库的名字后点击底下的红色字体。目的是避免误删删除Github中的某个文件或文件夹在Github上我们只能删除仓库,并不能删除文件或者文件夹,所以需要单独删除文件或者文件夹只能用命令来解决。1.本地仓库的文件和远程仓库的文件同时删除先打开本地仓库的文件夹,选择要删除的文件或者文件夹点击删除,注意git仓库不要删除。然后在执行下面的命令行即可。刷新页面后在看下远程仓库的文件或者文件夹就已经被删除了。2.只删除远程仓库,不删除本地仓库进入到git bash窗口,执行以下命令:$ git pull origin master # 将远程仓库里面的项目拉下来$ dir # 查看有哪些文件夹$ git rm -r –cached target # 删除你要删除的文件名称,这里是删除target文件夹(cached不会把本地的flashview文件夹删除)$ git commit -m ‘删除了target’ # 提交,添加操作说明git push -u origin master #重新提交(若需要对其他分支进行操作,则把master换为对应分支,如:git push -u origin dev)

April 19, 2019 · 1 min · jiezi

Git的常见用法大全

转载:https://blog.csdn.net/xukai01…

April 19, 2019 · 1 min · jiezi

将代码同时上传到到github和码云

之前都是用github存储代码,后来接触到码云之后感觉也挺好用的。但是忽然发现上传代码的时候混掉了,想往github上上传结果传到码云上了,不知道怎么切换。终究还是git技能不过关。网上查询之后整理下,以免忘掉。因为git本身是分布式版本控制系统,可以同步到另外一个远程库,当然也可以同步到另外两个远程库,所以一个本地库可以既关联GitHub,又关联码云!使用多个远程库时,要注意git给远程库起的默认名称是origin,如果有多个远程库,我们需要用不同的名称来标识不同的远程库。仍然以learngit本地库为例,先删除已关联的名为origin的远程库:git remote rm origin然后,先关联GitHub的远程库:git remote add github git@github.com:xxx/LearnGit.git注意,远程库的名称叫github,不叫origin了。接着,再关联码云的远程库:git remote add gitee git@gitee.com:xxx/LearnGit.git同样注意,远程库的名称叫gitee,不叫origin。现在,我们用git remote -v查看远程库信息,可以看到两个远程库:gitee git@gitee.com:xxx/LearnGit.git (fetch)gitee git@gitee.com:xxx/LearnGit.git (push)github git@github.com:xxx/LearnGit.git (fetch)github git@github.com:xxx/LearnGit.git (push)如果要推送到GitHub,使用命令:git push github master如果要推送到码云,使用命令:git push gitee master这样一来,本地库就可以同时与多个远程库互相同步原文:https://blog.csdn.net/xukai01…

April 19, 2019 · 1 min · jiezi

git pull 本地冲突

用git pull来更新代码的时候,遇到了下面的问题:error: Your local changes to the following files would be overwritten by merge: xxx/xxx/xxx.php Please, commit your changes or stash them before you can merge. Aborting…解决办法:git stash //暂存当前正在进行的工作git pull git stash pop //合并暂存的代码

April 18, 2019 · 1 min · jiezi

git pull/push时每次都要输入用户名和密码的解决方法

在提交项目代码或者拉代码的时候,如果每次git都要输入用户名密码,解决方案:(我用的是gitlab)执行git config –global credential.helper store命令然后git pull产生输入用户名和密码,这时输入,然后下次再git push /pull 的时候就不用密码了。检验方式:C:Users你的电脑名; 这个文件夹(如下)下面是否能找到.git-credentials文件,如果文件的内容是有关你的gitlab的设置,格式为:http://{用户名}:{密码}@{git 网址}转载自https://www.cnblogs.com/sheti…,做了一点自己情况的修改

April 17, 2019 · 1 min · jiezi

从头开始搭建网站(五)- 使用 git 自动部署

导语终于到了最后的步骤,使用 git 同步并且自动部署代码。添加用户添加 git 用户禁止 git 用户使用 shell 登录。编辑 /etc/passwd,将 git❌1001:1001::/home/git:/bin/bash 修改为 git❌1001:1001::/home/git:/usr/bin/git-shell参考之前的文章,设置免密添加进用户组 sudo usermod -aG docker git建立裸仓库建立一个目录 library,用作仓库在 library 中初始化一个裸仓库 sudo git init –bare you_project_name.git设置所有者为 git 用户 sudo chown -R git:docker library设置权限为同组可写入 sudo chmod -R g+w library项目目录链接 git同样设置权限为同组可写入并设置所有者sudo chmod -R g+w you_project_pathsudo chown -R user:docker you_project_path在代码目录中,初始化 git,git init添加所有文件,git add .提交 git commit -m ‘init’将代码与远端仓库建立连接,git remote add origin /library/you_project_name.gitpush 代码,git push origin master设置分支跟踪 git branch –set-upstream-to=origin/master master本地同步代码本地直接 clone git clone git@you_server:/library/you_project_name.git本地也是 laradock,同样的流程,进入 workspace 容器中安装项目composer installcp .env.example .envphp artisan key:generate配置 nginx 域名和本地 hosts,然后重启 nginx docker-compose restart nginx然后就是正常的 git 操作设置 git hook最后一步,设置 hook,自动部署。在服务器 /library/you_project_name.git/hooks 目录下编辑 post-update 如下#! /bin/shunset GIT_DIRDIR_ONE=you_project_path/ #你的项目目录cd $DIR_ONEgit pull origin master设置所有者 sudo chown git:docker post-update设置权限 sudo chmod +x post-update结语终于完成了。过程不算顺利,但总是比之前好多了。剩下的就是写代码了。 ...

April 16, 2019 · 1 min · jiezi

git常用命令

文件初始化及拉取// 初始化空文件夹作为git项目文件夹git init// 从远程仓库clone项目到本地仓库git clone git@git.oschina.net:ifengye/test.git代码同步及提交// 从远程仓库同步到本地git pull origin master// 把本地文件添加到添加到暂存区git add .// 将暂存区的代码提交到本地仓库,说明为‘init’git commit -m ‘init’// 将本地仓库的代码推送到远程仓库git push origin master仓库分支查看分支// 查看本地仓库分支git branch// 查看远程仓库分支git branch -r// 查看所有仓库分支git branch -a// 查看各个分支最后一个提交信息git branch -v// 查看哪些分支已经合并入当前分支git branch –merged // 可以查看本地分支对应的远程分支git branch -vv 创建分支// 创建本地仓库分支git branch branchName重命名分支// 给分支重命名git branch -m oldName newName操作分支// 将分支切换到mastergit checkout master// 如果分支存在则只切换分支,若不存在则创建并切换到master分支git checkout -b master// 合并本地某分支到当前分支git merge <name>// 将远程分支test_remote拉取下来到本地test分支git checkout -b test origin/test_remote // 将远程分支test拉取下来到本地test分支git checkout test 合并分支//有缓存区//无缓存区删除分支//删除本地test分支git branch -d test// 删除远程test分支git push origin –delete test // 删除远程test分支git push origin :test ...

April 15, 2019 · 1 min · jiezi

OSX 批量CRLF 转 LF

安装dos2unix;http://macappstore.org/dos2unix/http://www.gnss.help/2017/07/…代码块find ./src -name “*.js” | xargs dos2unix

April 15, 2019 · 1 min · jiezi

工作、开源两不误:Git多账号管理

由于 Git 所具有的巨大优越性,越来越多的公司以及个人开始由 Svn 转向 Git 。一般来讲,每位员工都会被分配给一个公司内部的邮箱。比如一个 996 公司的员工 “张三”,获得的可能就是一个 “zhangsan@996icu.com” 的邮箱。比较规范的公司,就会要求我们使用自己的名字和公司所分配给自己的这个邮箱来配置 Git(姓名和邮箱可以不用引号括起来):git config –global user.name “张三"git config –global user.email “zhangsan@996icu.com"但是这种配置是全局的,如果我们之前刚好有在 GitHub 上维护项目,那这样势必就会将之前所做的 Git 账户配置给覆盖了。那怎么解决呢?我们总不能来回覆盖,来回添加密钥吧。我们能不能同时配置多个 Git 账户呢?当然能。这里以 Mac 为例,如果我们之前配置过全局的用户名和邮箱,那么在用户目录下的.gitconfig文件中(如/Users/zhangsan/.gitconfig),会有类似如下的配置:[user] name = 张三 email = zhangsan@gmail.com当然,我们也可以直接使用命令来查看:git config –global user.namegit config –global user.email如果设置了这两个全局属性,就会输出对应的值。若任何输出的话,则表示未设置。如果设置过,我们就需要将用户名和邮箱这两个全局变量进行重置。使用如下命令:git config –global –unset user.name git config –global –unset user.email 我们知道,一般 Git 服务器为了安全,都会要求我们添加一个安全的 SSH 密钥。但是默认情况下,生成的密钥的文件名都是一样的。因而,不同的用户,必须设置不同文件名的密钥文件,否则会发生覆盖。所以,接下来千万别觉得太熟悉不过了,就一路回车,千万要悠着点手速。以 “张三” 为例,首先,我们需要根据公司邮箱来生成密钥对:ssh-keygen -t rsa -C “zhangsan@996icu.com"回车后会出现下面这句话:Generating public/private rsa key pair.Enter file in which to save the key (/Users/zhangsan/.ssh/id_rsa):这时候可千万别一路回车,注意看提示,这里要我们输入要保存的私钥的路径和文件名,为了以后易找,我们就仍然放在该路径下,只不过更改个跟平台相关的文件名,输入:Users/zhangsan/.ssh/996icu_id_rsa接着就可以一路回车了,默认密码为空即可。生成完密钥之后,我们还需要使用ssh-add命令是把专用密钥添加到ssh-agent的高速缓存中。该命令位置在/usr/bin/ssh-add,用法如下:ssh-add -K ~/.ssh/996icu_id_rsa之后我们需要将生成的密钥对中的公钥里的内容用文本编辑器打开,复制下来,添加到对应的平台上面,比如公司的 GitLab 或者 GitHub 等。Mac 下面可以直接使用如下命令来把公钥复制到剪切板:pbcopy < ~/.ssh/996icu_id_rsa.pub同样地,我们使用 “zhangsan@gmail.com” 这个邮箱,来生成供 GitHub 使用的账户的私钥github_id_rsa和公钥github_id_rsa.pub,并把公钥添加到 GitHub 平台上。接下来我们还需要修改 Git 的本地配置,来将远程的服务器地址和本地的私钥文件进行关联。这样通过比较私钥和之前填在该平台上的公钥,就能进行权限验证。在Users/用户名/.ssh/目录下面新建一个名为config的配置文件,添加如下内容:# github email addressHost githubHostName github.com User gitPreferredAuthentications publickeyIdentityFile ~/.ssh/github_id_rsa# gitlab email address# 公司内网地址HostName 192.168.6.106 User gitPreferredAuthentications publickeyIdentityFile /.ssh/996icu_id_rsa这里就将远程地址和本地的私钥文件对应了起来。配置文件中的 HostName 是远程仓库的访问地址,这里可以是 IP,也可以是域名。Host 是用来拉取的仓库的别名,配不配置都行。如果 HostName 没配置的话,那就必须把 Host 配置为仓库 IP 地址或者域名,而非别名。配置了这些之后,我们就能够成功的从远程拉取仓库了,拉取之后,cd到仓库目录下,配置该仓库使用的用户名和邮箱:git config –local user.name 张三git config –local user.email zhangsan@996icu.com当然,你也可以直接不用 –local参数注意,这里的账户可以和我们开始时生成秘钥的邮箱不同。那个邮箱其实配置的是我们电脑针对某个 IP 的 “全局” 账户(注意,不是global参数指定的那个全局),这里配置的是某个仓库下的 “局部” 用户,当然,你把这个仓库再 copy 一份的话,就可以设置个其他的用户名和邮箱了,毕竟是局部的嘛,相当于多个用户在同一台电脑上进行工作。还有,如果你未指用户名和邮箱的话,Git 会自动使用电脑登录的用户名,比如“zhangsan”,邮箱默认就是 “zhangsan@zhangsan.local”,这当然不是我们想要的,所以最好配置下吧。到这里,还没完。如果你使用的是 IDEA,比如 AS,还需要设置 SSH 使用本地(native)的客户端,而非 AS 内嵌(build in)的 SSH 客户端 :在AS 3.5 Canary 10 版本上,发现没有这个选项,应该是默认使用了本地的 SSH 客户端。到这里仍然没有完,对于 Mac,可能会遇到升级系统或者重启系统之后,SSH私钥失效的问题,这时候我们可以通过在/.ssh/config文件中添加如下内容来解决:Host * AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/github_id_rsa IdentityFile ~/.ssh/996icu_id_rsa如果还不生效,那就可以通过自己编写 shell 脚本(这里我使用的是 zsh,所以配置的是#! /bin/zsh,若使用的是系统自带的终端,可以修改为#! /bin/bash):vim .ssh/ssh_add_private_keys.sh#! /bin/zsh# 添加 github 公钥ssh-add ~/.ssh/github_id_rsa# 添加 公司 gitlab 公钥ssh-add ~/.ssh/996icu_id_rsa// 赋予sh文件可运行权限chmod +x .ssh/ssh_add_private_keys.sh然后把它添加到开机启动项中:系统偏好设置>用户与群组>登录项。当然,我们也可以创建一个Automator任务,并将其添加到系统开机启动项中。然后创建一个 App 应用程序:添加 shell 脚本代码:然后按Command+S保存,文件名另存为ssh_add_private_keys.app:然后把刚才添加的这个APP添加到开机启动项中:当然,上面这两种添加方式本质上都是一样的,只不过一个是创建的.sh的 shell 脚本文件,而一个是运行 shell 脚本的 App 文件形式。欢迎关注公众号来获取其他最新消息,有趣的灵魂在等你。 ...

April 14, 2019 · 1 min · jiezi

git merge 与 git rebase的区别

前言其实这个问题困扰我有一段时间,相信也有人和我一样有这个困扰,网上已有很多这种解释了,但是要么就是无图,要么就是解释的很乱,没太看懂,经过自己对git的使用,加上向同事请教,算是理解了这个问题,所以写下来分享一下,我尽量详细说明merge与rebase的区别假设我们有如下图一所示仓库,该仓库有master和develop两个分支,且develop是在(3.added merge.txt file)commit处从master拉出来的分支。 merge假设现在HEAD在(6.added hello.txt file)处,也就是在master分支最近的一次提交处,此时执行git merge develop, 结果如下图所示。 工作原理就是:git 会自动根据两个分支的共同祖先即 (3.added merge.txt file)这个 commit 和两个分支的最新提交即 (6.added hello.txt file) 和 (5.added test.txt file) 进行一个三方合并,然后将合并中修改的内容生成一个新的 commit,即图二的(7.Merge branch ‘develop’)。 这是merge的效果,简单来说就合并两个分支并生成一个新的提交。rebase那rebase是这么工作的呢? 假设初始状态也是图一所显示的。两个分支一个master,一个develop,此时HEAD在(6.added hello.txt file)处,现在执行git rebase develop,结果如下图三所示。 可以看见develop分支分出来分叉不见了,下面来解释一下它的工作原理: 在执行git rebase develop之前,HEAD在(6.added hello.txt file)处,当执行rebase操作时,git 会从两个分支的共同祖先 (3.added merge.txt file)开始提取 当前分支(此时是master分支)上的修改,即 (6.added hello.txt file)这个commit,再将 master 分支指向 目标分支的最新提交(此时是develop分支)即(5.added test.txt file) 处,然后将刚刚提取的修改应用到这个最新提交后面。如果提取的修改有多个,那git将依次应用到最新的提交后面,如下两图所示,图四为初始状态,图五为执行rebase后的状态。 简单来说,git rebase提取操作有点像git cherry-pick一样,执行rebase后依次将当前的提交cherry-pick到目标分支上,然后将在原始分支上的已提取的commit删除。merge OR rebase那什么时候用merge,什么时候用rebase呢? 再举个例子: 初始状态如下图六所示: 和之前一样的是,develop分支也是在 (3.added merge.txt file)处从master分支拉取develop分支。不一样的是两个分支各个commit的时间不同,之前develop分支的4和5commit在master分支3之后6之前,现在是develop分支的4提交早于master分支的5提交,develop分支的6提交晚于master的5提交早于master的7提交。 在上图情况下,在master分支的7commit处,执行git merge develop,结果如下图七所示: 执行git rebase develop,结果如下图八所示: 可以看出merge结果能够体现出时间线,但是rebase会打乱时间线。而rebase看起来简洁,但是merge看起来不太简洁。最终结果是都把代码合起来了,所以具体怎么使用这两个命令看项目需要。还有一点说明的是,在项目中经常使用git pull来拉取代码,git pull相当于是git fetch + git merge,如果此时运行git pull -r,也就是git pull –rebase,相当于git fetch + git rebase最后推荐一些git可视化工具,我用的是gitkraken,这些工具功能基本一样,看个人喜欢好使用 ...

April 14, 2019 · 1 min · jiezi

在不同的 git 分支中统一 pom.xml 的版本号

在 Maven 项目和 git 配合使用时,有时候不同的分支会需要用不同的版本。举个例子:首先分支 A 中使用 <version>1.0-A-SNAPSHOT</version>,然后在其基础上创建分支 B,在分支 B 中修改了 pom.xml,使用 <version>1.0-B-SNAPSHOT</version>。之后当需要从 B 合并到 A 时,就会发现 pom.xml 的修改也合并过来了,使得 A 分支变成了 <version>1.0-B-SNAPSHOT</version>。这当然令人不爽。下面介绍一个 Maven 插件,允许你将当前分支作为变量放入 <version> 元素。只要在 pom 的 <build> -> <plugins> 中加入以下插件:<plugin> <groupId>pl.project13.maven</groupId> <artifactId>git-commit-id-plugin</artifactId> <version>2.2.6</version> <executions> <execution> <id>get-the-git-infos</id> <goals> <goal>revision</goal> </goals> <phase>initialize</phase> </execution> <execution> <id>validate-the-git-infos</id> <goals> <goal>validateRevision</goal> </goals> <phase>package</phase> </execution> </executions></plugin>插件的最新版本在这里查看。之后不论你在哪个分支,都可以统一用下面的版本号了:<version>${git.branch}</version>

April 13, 2019 · 1 min · jiezi

视频当道的时代,这些珍藏的优质 Python 播客值得推荐

我国互联网的发展道路与欧美不同,在内容的形式上,我们似乎实现了跨越式的发展——早早进入了移动互联网时代,直播和短视频等形式的内容成为了潮流,而文字形式的博客(blog)与声音形式的播客(podcast)则(逐渐)成为了小众。智能手机极大地改变了我们的上网习惯。诚然,仍有一些受众广泛的聚合类的平台,例如微信公众号、CSDN、掘金、极客时间、喜马拉雅、荔枝FM,为我们提供丰富的博客与播客,但是,不依赖平台的个人博客与个人播客,则鲜有人知。依我的使用习惯,我很喜欢听音频节目,也即是播客。中文的播客听了不少,但是,免费的 Python 播客是极其稀少。直到发现了 Full Stack Python 网站上的一篇文章,它汇总介绍了一些非常棒的 Python 播客,大部分节目仍在持续更新中。我特翻译出来,分享给大家。英文节目对大多数人来说,可能门槛较高,但是英文是程序员的必修功课 ,聆听英文节目,正好可以一边学技术,一边练习英语,一举两得。英文 | Best Python Podcasts[0]译者 | 豌豆花下猫Python 社区里有很多免费或低成本的学习资源,对新手与有经验的开发者来说,是一大福音。这些优秀的资源就包括很多定期更新的 Python 播客节目。本文介绍了一些活跃的、与 Python 或软件工程相关的、高质量的播客。Python 相关的播客这些播客的运营者都是 Python 开发者,他们关注的都是我们领域内很重要的话题。每个播客系列都有很长的历史列表,有的节目录于几年前,因此我们有很丰富的材料可以聆听与学习。Talk Python to Me[1] 专注于 Python 开发者和组织,每期节目会邀请不同的嘉宾来谈论 ta 的工作Podcast.init[2] 提供有关 Python 的故事,以及“与那些让它变得更棒的人们的访谈”Python Bytes[3] 是来自“Talk Python to Me”和“Test and Code Podcast”创作者的新播客Test and Code Podcast[4] 侧重于测试与相关主题,如模拟(mock)和代码度量Philip Guo 教授有一个名为 PG Podcast[5] 的视频播客,基本是关于 Python 主题的Import This[6] 是 Kenneth Reitz 和 Alex Gaynor 间歇更新的播客,对有影响力的 Python 社区成员进行深度的采访最喜欢的播客节目以下是我从各大播客中收集的最喜欢的一些节目,听听这些内容,你可以感受到其余播客节目的风格。SQLAlchemy and data access in Python[7] 让我理解了对象关系映射库 SQLAlchemy 的知识及其演变过程。这期节目采访了 SQLAlchemy 的作者,主持人 Michael Kennedy 根据他对 SQLAlchemy 的深入研究和使用经验提出了很多问题。Python past, present, and future with Guido van Rossum[8] 涵盖了 Python 的历史、Guido 创造并持续三十年来发展这门语言的动机。有趣的事实:当播客主持人迈克尔·肯尼迪向我征询话题时,我贡献了一个问题,即 Python 的开源是否是促使它成功的原因?Deploying Python Web Applications[9] 剧透预警:这是我在 Talk Python to Me 上的一期节目,介绍了 Python Web 应用程序部署的工作原理。Python Bytes 栏目在第 39 集中广泛地讨论了 object-relational mappers (ORMs)[10] ,其中不少讨论是基于 Full Stack Python 上的文章。谢谢大家对我们提出的反馈与建议。Python at Netflix[11] 出自 Talk Python to Me ,通过一个非常棒的视角,介绍了 Python 是怎么运用于这家最大的网络流媒体公司,以及如何适应它们的多语言组织。另一个很棒的 Talk Python to Me 节目, Python in Finance[12],介绍了 Python 在金融行业中的广泛用途:股票交易、定量分析和数据分析。如果你想知道像对冲基金这样的不透明的私营企业是如何利用 Python 赚取(大量)钱财的,一定要听听这个。通用软件开发的播客这些播客主要探讨的是软件开发相关的主题,但经常也会涉及 Python 的内容。聆听和学习这些播客,你将会成为更加优秀的软件开发者。Software Engineering Daily[13] 令人难以置信的是每天邀请不同的开发者嘉宾,谈论话题非常广泛,与开发相关。All things Git[14] 教人如何使用、构建及将 Git 用于工作,每两周一更。CodeNewbie[15] 采访新入行的开发者,谈论为什么他们要从事编程工作,以及他们的工作内容。该栏目也会采访一些经验丰富的、打造了知名项目的开发者。Developer on Fire[16] 采访程序员、架构师和测试人员,讲述他们成功、失败和卓越的故事。Command_line Heroes[17] 涵盖操作系统级的主题以及 DevOps。Embedded.fm[18] 涵盖嵌入式系统和硬件黑客攻击。The Changelog[19] 周更播客,关于常规软件开发的问题。Full Stack Radio[20] 虽与 Full Stack Python 无关,但值得关注!Exponent[21] 不是一个软件开发的播客,但它以深入的方式揭示了企业的战略和技术,使我能够更好地理解企业在构建和发布软件时所做出的决策。我听了每一集(以 1.5 倍速),非常推荐每周花 45 到 60 分钟,听 Ben Thompson 和 James Allworth 深入讨论一个主题。Test Talks[22] 每周考察一个软件测试的主题,通常会特邀一位钻研该领域的嘉宾。The Cloudcast[23] 聚焦于云计算和 DevOps 的相关主题。数据科学与数据分析的播客Python 不仅是数据科学社区的核心编程语言,而且几乎在每个使用数据分析的组织中都发挥着重要作用。 以下播客广泛地涵盖数据科学,并经常涉及到 Python 生态系统中的特定的工具。DataFramed[24] 是一个数据科学播客,内容涵盖 Python 标准库,以及数据分析者感兴趣的其它内容。Data Skeptic[25] 涵盖数据科学、统计、机器学习、人工智能,以及“科学怀疑论”(scientific skepticism)等内容。Data stories[26] 是一个关于数据可视化的播客。Partially Derivative[27] 是一个关于机器学习、人工智能和数据行业的播客,在 2017 年底已停播,节目列表包含了大量的内容。References[0] Best Python Podcasts: https://www.fullstackpython.c…[1] Talk Python to Me: https://talkpython.fm/[2] Podcast.init: http://podcastinit.com/[3] Python Bytes: https://pythonbytes.fm/[4] Test and Code Podcast: http://pythontesting.net/test…[5] PG Podcast: http://pgbovine.net/PG-Podcas…[6] Import This: https://www.kennethreitz.org/…[7] SQLAlchemy and data access in Python: https://talkpython.fm/episode…[8] Python past, present, and future with Guido van Rossum: https://talkpython.fm/episode…[9] Deploying Python Web Applications: https://talkpython.fm/episode…[10] object-relational mappers (ORMs): https://www.fullstackpython.c…[11] Python at Netflix: https://talkpython.fm/episode…[12] Python in Finance: https://talkpython.fm/episode…[13] Software Engineering Daily: https://softwareengineeringda…[14] All things Git: https://www.allthingsgit.com/[15] CodeNewbie: https://www.codenewbie.org/po…[16] Developer on Fire: http://developeronfire.com/[17] Command_line Heroes: https://www.redhat.com/en/com…[18] Embedded.fm: http://embedded.fm/[19] The Changelog: https://changelog.com/[20] Full Stack Radio: http://www.fullstackradio.com/[21] Exponent: http://exponent.fm/[22] Test Talks: https://joecolantonio.com/tes…[23] The Cloudcast: http://www.thecloudcast.net/[24] DataFramed: https://www.datacamp.com/comm…[25] Data Skeptic: https://www.dataskeptic.com/[26] Data stories: http://datastori.es/[27] Partially Derivative: http://partiallyderivative.com/公众号【Python猫】, 专注Python技术、数据科学和深度学习,力图创造一个有趣又有用的学习分享平台。本号连载优质的系列文章,有喵星哲学猫系列、Python进阶系列、好书推荐系列、优质英文推荐与翻译等等,欢迎关注哦。PS:后台回复“爱学习”,免费获得一份学习大礼包。 ...

April 12, 2019 · 2 min · jiezi

Git 常用命令归类

1、新建代码库 在当前目录新建一个Git代码库 git init 新建一个目录,将其初始化为Git代码库 git init [project-name] 下载一个项目和它的整个代码历史 git clone [url]2、配置 显示当前的Git配置 git config –list 编辑Git配置文件 git config -e [–global] 设置提交代码时的用户信息 git config [–global] user.name “[name]” git config [–global] user.email “[email address]” 3、分支列出当前分支git branch列出所有远程分支git branch -r列出所有本地分支和远程分支git branch -a新建一个分支,但依然停留在当前分支git branch [branch-name]切换到指定分支,并更新工作区 git checkout [branch-name] 合并指定分支到当前分支 git merge [branch] 选择一个commit,合并进当前分支 git cherry-pick [commit]删除分支git branch -d [branch-name] 删除远程分支git push origin –delete [branch-name]git branch -dr [remote/branch]4、代码提交提交暂存区到仓库区git commit -m [message] 备注信息 提交工作区自上次commit之后的变化,直接到仓库区git commit -a在分支上提交新的版本git commit -a -m ‘dev1’ 提交时显示所有diff信息git commit -v创建忽略文件 不需要服务器端提交的内容可以写到忽略文件里touch .gitignore 比较的是暂存区和工作区的差异git diff回滚版本回滚最近的一个版本 git log重置暂存区的指定文件,与上一次commit保持一致,但工作区不变git reset [file]添加当前目录的所有文件到暂存区git add 添加指定目录到暂存区,包括子目录git add <dir>添加指定文件到暂存区git add <file1>5、标签 列出所有tag git tag 新建一个tag在当前commit git tag [tag] 新建一个tag在指定commit git tag [tag] [commit] 删除本地tag git tag -d [tag] 删除远程tag git push origin :refs/tags/[tagName] 查看tag信息 git show [tag] 提交指定tag git push [remote] [tag] 提交所有tag git push [remote] –tags 新建一个分支,指向某个tag git checkout -b [branch] [tag]其他SSH Key生成SSH Key:ssh-keygen –t rsa –C “你的邮箱@xx.com"生成Key时弹出选项,回车选择默认即可。Key保存位置:/root/.ssh登陆GitHub,创建new SSH key,其内容为/root/.ssh/id_rsa.pub中文本结尾楼主找到一张Git常用命令速查表供参考(盗图哈哈) ...

April 12, 2019 · 1 min · jiezi

清楚 GIT 中无效的 Remote Branch Ref

在开发新功能或修复 bug 时, 会从 master 上新建 branch 来处理, 当完成后会将这个 branch 推送到 origin 中, 如:git push origin <branch name>:<branch name>. origin 审核代码没有问题后就会 合并分支并删除, 但 本地 在 git pull 删除本地分支后, 仍能通过 git branch -a 看到这个 branch 的 origin ref.日积月累之下本地就会有很多这样无用的 branch ref, 很是让人厌烦, 遂在此记录清理的方法. GIT REMOTE 使用 git remote prune origin 就可以清除无用的 branch ref, 如果在命令后面加上 –dry-run 则可以看到哪些 branch 将被清除, 不会做清除动作.在检查无误后就可以执行 git remote prune origin 清除了. ...

April 11, 2019 · 1 min · jiezi

在github上,如何添加ssh keys(ssh公钥)

注:下面操作在linux和windows中都适用1. 打开git bash2. 输入 ssh-keygen -t rsa -C ‘your_email@example.com’(注:your_email@example.com是你的邮箱) 之后会跳出不少信息,全部按enter就可以)3. 找到你的id_rsa.pub文件,打开复制里面的全部内容id_rsa.pub文件的存储位置,上面会有提示,像我的id_rsa.pub文件的路径在/home/jixn/.ssh/id_rsa.pub4. 进入github中,打开个人设置,点击SSH and GPG keys选项5. 点击新增公钥,将之前复制的内容全部粘贴到公钥内容里,公钥名称会自己生成,也可以自己修改,点击添加6. 再次进入git bash,进行命令行测试,首次建立链接会要求信任主机。输入命令 ssh -T git@github.com提示成功则表示已经正确的完成了添加 shh keys的全部操作!!!

April 10, 2019 · 1 min · jiezi

github 代理设置 https/git 速度直接从14k/s 飙升 5m+/s

参考链接: https://gist.github.com/fearb…很多时候我们在使用 github 的时候会出现下载很慢的情况。如果你有代理,可以直接设置代理,来获取更快下载和上传资源的速度。给 git 设置 SOCKS5 代理:使用 https 的时候,就是使用 https 协议复制仓库的时候如: https://github.com/KyleBing/T...git config –global http.proxy ‘socks5://127.0.0.1:1080’git config –global https.proxy ‘socks5://127.0.0.1:1080’也可以直接修改用户主目录下的 .gitconfig 文件[http] proxy = socks5://127.0.0.1:1080[https] proxy = socks5://127.0.0.1:1080在使用 git 开头的路径时,也就是在使用 ssh 通道时如: git@github.com:KyleBing/TouchbarBBT.git打开用户主目录下的 .ssh/config 文件,添加以下内容ProxyCommand nc -x localhost:1080 %h %p效果,速度是真快之前的速度:之后的速度:言外terminal 中设置临时代理直接执行export ALL_PROXY=socks5://127.0.0.1:1080或者在用户主目录下的 .bash_profile 添加别名,这样以后在使用的时候就可以直接输入 proxy了alias proxy=“export ALL_PROXY=socks5://127.0.0.1:1080”

April 10, 2019 · 1 min · jiezi

小白文 初识git-版本分支管理及远程仓库提交

为什么使用git有一个项目a,已经完成了基本的功能,测试下来是稳定的,接下来想增加新的功能,并用对其完善,但这个过程中可能会出现bug,甚至影响到全局这个时候,我们就希望保存一个稳定版本的文件,另外复制一份文件进行改进,这样即便遇到问题也可以回到稳定的状态,并可以进行对比来进行dbug在学习版本控制工具前,方法是复制文件夹,然后在新的文件夹中进行修改,但是明显这样会造成多余的文件夹,管理极为混乱所以就需要我们的版本分支管理工具git登场了安装从官网下载对应的exe进行安装即可只要这边改成第一个,保证安全性,其他就一路next就可以了配置$ git config –global user.name “name” //填名字$ git config –global user.email 123@163.com //邮箱初次提交在项目文件夹中右键菜单,Git Bash here或者在其他地方Git Bash here之后,命令行里输入cd 路径名转到项目文件夹中$ git init //初始化仓库下一步就要把文件全部提交到仓库的暂存区$ git add . //可以把.改成要提交的文件名来单独提交不过在这之前,先要确定哪些文件不要提交通过IDE(不能直接在文件夹右键新建)(我用的vscode,在命令行输入$ Code .gitignore)新建一个.gitignore文件,在里面写要忽略的文件//忽略规则• bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件• /bin: 忽略根目录下的bin文件• /.c: 忽略 cat.c,不忽略 build/cat.c• debug/.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj• /foo: 忽略/foo, a/foo, a/b/foo等• a//b: 忽略a/b, a/x/b, a/x/y/b等• !/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件• .log: 忽略所有 .log 文件• config.php: 忽略当前路径的 config.php 文件然后要把暂存区的文件里提交到正式的仓库里$ git commit -m ‘这里可以加提交的注释’如果.gitignore文件没有在提交前建立,或者不小心提交了不想要提交的文件,那可以通过下面的命令行进行取消$ git reset 文件名 取消暂存区的文件 $ git rm -r –cached 文件名 移除正式仓库里的文件,加上–cached就不会把本地的文件删除提交之后,或者未提交时,都可以通过这句来查看仓库目前的状态是否有未跟踪的文件,或者暂存区里有尚为正式提交的文件,都会有所显示$ git status如果工作目录显示是干净的,也就完成了我们的初次提交On branch masternothing to commit, working directory clean在提交中,可能会遇到这样的问题warning: LF will be replaced by CRLFwindows中的换行符为 CRLF, 而在linux下的换行符为LF所以在执行add . 时出现提示解决方法:$ git config –global core.autocrlf false //禁用自动转换查看提交历史$ git log$ git log -a //更详细将稳定版提交到github在github的个人主页中,新建立一个仓库复制仓库页面的url在Git Bash中执行$ git clone url 这样就会在Git Bash所打开的地方,建立出一个新的文件夹,里面会有网上仓库的内容(如果在建立的时候有勾选Readme说明文件的话,就可以看到它)然后把稳定版里的所有文件复制到这个新文件中进行之前初次提交的操作$ git add .$ git commit -m ‘’$ git commit -a -m ’’ //把上面两句简写到一起然后进行仓库的远程提交$ git push输入账号密码后,即把文件提交到了github上的仓库中分支与合并回到我们最初问题上来在保存了稳定版本到仓库后我们可以创建一个分支$ git branch fen //创建分支$ git checkout fen //切换到新的这个分支上$ git checkout -b fen //也可以两句合写然后就可以对其中的文件进行修改可以随时切换回主线,git会把文件都还原成稳定版的状态$ git checkout master文件修改修改了文件内容之后如果尚未提交暂存,想查看对比仓库里的文件的修改之处 :$ git diff如果已经提交到暂存,想查看对比仓库里的文件的修改之处 :$ git diff –staged如果此时又对文件内容做了修改再使用下面这句$ git diff 显示的就是文件和暂存区内文件的对比(不是仓库了)查看文件的具体状态$ git status -sM //已经提交到暂存的修改文件 M //尚为提交到暂存的修改文件MM //已经提交到暂存,并在暂存后继续修改的文件A //新提交到暂存的文件?? //尚为跟踪的文件分支合并查看分支情况$ git branch fen master在修改完这个分支之后,测试为稳定,希望将其合并到主线上,进行版本更新$ git checkout master //切换回主线$ git merge fen //把支线合并过来$ git merge -d fen //删除此分支至此,就完成了一次工作流程目前用到的都只是个人的版本管理,没有涉及多人协作更具体的学习还是要参照官方文档 https://git-scm.com/book/zh/v… ...

April 10, 2019 · 1 min · jiezi

在GitHub上新建仓库并与本地Git项目绑定最简单步骤

!!!实际操作经验,实测有效!!!1、github上新建一个项目成功后,有提示两个步骤: git remote add origin git@github.com:username/projectname.git (username、projectname换成你自己的)git push -u origin master接下来的步骤完全是照这两步来的不过如果本地没有.git文件夹,在执行‘git push -u origin master’前:自己先git init,git -A(自己定好.gitignore文件先),git commit。最后皆大欢喜。

April 9, 2019 · 1 min · jiezi

Centos7.6安装Java8

本博客 猫叔的博客,转载请申明出处本系列教程为HMStrange项目附带。历史文章如何在VMware12安装Centos7.6最新版下载https://www.oracle.com/techne…这个是我下载的jdk版本,项目选用Java8,Centos的安装是在上一篇文章的内容实操1、进入自己的目录,我在home里面以自己的名字新建了一个文件夹cd /home/myself2、你可以下载或者通过xftp进行上传,然后解压jdktar -zxvf jdk-8u202-linux-x64.tar.gz –no-same-owner3、设置环境变量vi /etc/bashrc添加如下代码(注意:JAVA_HOME路径根据环境自行修改)export JAVA_HOME=/home/myself/jdk1.8.0_201export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar使其生效source /etc/bashrc4、查看是否安装成功java -version公众号:Java猫说学习交流群:728698035现架构设计(码农)兼创业技术顾问,不羁平庸,热爱开源,杂谈程序人生与不定期干货。

April 9, 2019 · 1 min · jiezi

git使用

统观全局gitHub共享代码,一种是把本地仓库推送到远程仓库,一种是克隆远程仓库的项目。把本地的仓库推送到远程仓库 ssh-keygen.exe -t rsa -C “1468017149@qq.com” 生成密钥.ssh 文件中 中是密钥// 每台电脑只能有一个密钥,不同的电脑添加密钥才能与gitGub仓库链接window系统 .ssh文件存放的位置本地的仓库推送到远程仓库指令克隆远程仓库git clone 地址git指令本地的项目和本地git仓库的创建在项目中,先在本地文件夹初始化git初始化git init把工作区的内容提交到仓库,本地仓库和本地工作区操作添加文件git add . // 添加所有的文件git commit -m “这里是描述” // 提交到仓库git add // 添加所有的文件git commit -m “这里是描述” // 提交到仓库查看修改的内容git status // 查看文件修改git diff <file> // 查看文件修改的详细内容当前操作放弃修改git checkout —<file> 丢弃 修改了但没有add 的文件内容如果已经执行git add ,则需要先把文件撤回到工作区 先执行git reset HEAD <file> 命令再执行 git checkout —<file> 回退到指定的版本git log // 查看提交的所有版本 git reflog // 查看提交的所有版本 git reset –hard <版本号>git log –pretty=oneline –abbrev-commit // 打印提交纪录分支的操作git branch test1 // 创建分支git checkout test1 // 切换分支git checkout - b test2 // 创建并切换git branch // 查看本地分支git branch -r // 查看远程分支git branch -a // 查看所有分支git push origin –delete photoShare // 删除远程分支git branch -d test1 // 删除一个分支,在主分支下删除其它分支git merge test1 // 把分支合并到主分支 git merge –no-ff branch // 能看到合并纪录// 先合并分支,然后删除分支git merge –no-ff branch // 能看到合并纪录解决buggit stash // 创建一个环境,保存当前的分支的代码git pop // 恢复当前环境, 没有恢复到当前环境是无法看到git stash 时的内容的git stash list // 查看创建的环境// 创建一个分支解决错误多人协作git remote -v // 查看远程仓库的xinxigit push origin branch-name // 推送分支git pullgit checkout -b branch-name origin/branch-name //在本地创建和远程分支对应的分支,名字相同git branch –set-upstream branch-name origin/branch-name //建立本地分支和远程分支的关联创建标签 git tag为指定的某次提交创建一个标签,可以为本地仓库某个分支添加标签,也可以为远程仓库主分支添加标签。git log –pretty=oneline –abbrev-commit // 打印提交纪录git tag <tagName>// 创建一个标签git tag -a <tagName> -m “这里是描述” id // 为指定的某一次提交创建标签git show <tagName>// 查看标记git tag // 查看所有标记git tag -d <tagName> // 删除本地仓库某个标签git push origin <tagName> //推送某个标签到远程仓库git push origin –tags // 把所有的标签推送到远程仓库最后要注意删除分支的时候 -d小写 指的是要删除的分支,如果没有合并过是不能删除的, -D 大写是强制删除创建是 b ...

April 8, 2019 · 1 min · jiezi

Git 常用命令

配置用户git config –global user.name “姓名"git config –global user.email “邮箱"克隆仓库git clone <url>新建分支基于mastergit checkout -b new-branch-name -t master或git checkout -b new-branch-name origin/master拉取远程分支,创建切换到本地分支git checkout -b 本地分支 origin/远程分支 (采用此种方法建立的本地分支会和远程分支建立映射关系)建立两个分支的映射(将当前分支映射到远程的指定分支,注意切换到当前分支)git branch -u origin/远程分支切换分支git checkout branch-name查看本地状态git status查看本地修改内容git diff比较本地文件和远程文件的区别git diff origin/master 文件路径在本地提交代码某一文件git commit -m ‘提交信息’ filename.txt在本地提交所有文件git commit -m ‘提交信息’ -a更新分支到githubgit push origin new-branch-name删除本地已被合并的分支git fetch -p origin读取远程仓库修改git fetch远程更新后将改动纳入本地分支git rebase remote-branch删除远程分支git branch -r -d origin/branch-name或git push origin :branch-name拉取最新代码:git pull <remote> <branch>或git pull –rebase <remote> <branch>强制更新单个文件:1) git fetch2) git checkout origin/master – path/to/file放弃本地修改,强制更新1) git fetch –all2) git reset –hard origin/masterfetch使用:git fetch origin master:temp (采用此种方法建立的本地分支不会和远程分支建立映射关系)比较本地的仓库和远程参考的区别$ git diff temp合并temp分支到master分支$ git merge temp如果不想要temp分支了,可以删除此分支$ git branch -d temp ...

April 8, 2019 · 1 min · jiezi