利用Anaconda进行python多版本管理

背景:

之前用的python 2.7安装django,后面搭建tensorflow环境用的是anaconda 安装了python 3.6。今天新建django项目,要执行时发现无法导入django。当前执行python时默认执行anaconda python 3.6。

查看环境信息:

$ conda info --envs
# conda environments:
#
tensorflow   /Users/zcy/anaconda3/envs/tensorflow
root            * /Users/zcy/anaconda3

结果显示当前conda环境中存在两个python环境,活动的是root。

通过: source activate tensorflow 激活另外一个环境。

当时在tensorflow这套环境中,使用的python环境是3.6的。现在其实可以新建一个环境,并安装python 2.7的环境。

命令如下:

sudo conda create -n python27 pip python=2.7

source activate python27

sudo pip install django

验证:

$ python

Python 2.7.14 |Anaconda, Inc.| (default, Dec  7 2017, 11:07:58) 

[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> import django

>>>

现在再查看环境信息:

$ conda info --envs

# conda environments:

#

python27                 /Users/zcy/anaconda3/envs/python27

tensorflow               /Users/zcy/anaconda3/envs/tensorflow

root                  *  /Users/zcy/anaconda3

附:关于如何激活与取消激活:

#

# To activate this environment, use:

# > source activate python27

#

# To deactivate an active environment, use:

# > source deactivate

#

关于:pip 安装matplotlib后,import报错的解决方法:

import matplotlib.pyplot as plt

报错:RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.
解决方法:
Create a file ~/.matplotlib/matplotlibrc there and add the following code: backend: TkAgg
参考网址:https://stackoverflow.com/questions/21784641/installation-issue-with-matplotlib-python

 

 

新的环境切换命令:
conda activate python37
conda deactivate

关于 Anaconda 从外网下载速度慢的解决办法:
使用国内的镜像站
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

[个人笔记] Git常用命令

最常用的命令:

日常提交最新变更:
git add deep_learning.txt
git commit -m "comment message"
git push origin HEAD:master
git pull origin

# 查看远程URL地址:
git remote -v

# 查看远程分支:
git branch -r

合并dev分支到master分支:
1.先把本地当前分支切换成master: 
  git checkout master
2.拉取一遍远端仓库最近的代码: 
  git pull 
3.把本地dev分支合并到master分支:
  git merge dev
4.把本地的master分支提交到远端master分支: 
  git push
5.把本地分支切换回dev: 
  git checkout dev

帮助命令:git help command

Git架构图:

 

 

  1. 获取远程代码:
    git clone -b branch 远程仓库的地址

如果是本地新增git库初始化,可用命令:git init

  1. 本地修改代码:
    git add file_name 将写的文件提交到暂存区
    git commit -m “提交备注” 将暂存区的文件提交到本地仓库,
    (切记这只是本地仓库,还未分享出去*)
    git push 提交到远程仓库,这时你的同事就可以看见了
    git status 查看提交状态
    git log 查看提交日志

修改最近一次提交(commit)的注释:
git commit –amend
详细说明

3. 回退代码版本:
有两种思路:
1. 用reset,强回退,会导致别人commit的中间版本的更新记录丢失
2. 用revert, 使用新加一次 commit 的方式,回退之前特定一次提交版本,别人提交的更新记录不会丢失。
实践中,需要回退时,应尽可能使用 revert来操作,避免因个人的失误导致团队其它人的commit丢失。

revert基本用法: git revert -n commit_id
示例网页

reset的用法:
git reset –hard HEAD^
HEAD is a pointer, point to the current version of file
HEAD^ HEAD^^ … HEAD~100
You can change HEAD to point to diff ID to change history version

将文件从暂存区回退到工作区
git reset HEAD filename
回退整个版本:
一个^表示一个版本,可以多个,另外也可以使用:git reset HEAD~n这种形式
git reset HEAD^

3.1 如果回退错了,希望恢复被回退的版本
先通过:git reflog查看哈希值
再使用:git reset 哈希值返回

3.2 git reset 三种模式区别介绍
–hard: 强制回退,放弃之前commit的所有内容
–soft:回退后,之前commit的内容会被放到缓冲区,即 stage 状态,相当于改动的文件已被 git add
(mixed) 无参数时默认 mixed:回退后,之前commit 的内容都变成 unstage 的状态,可以工作目录中看到未提交的内容
介绍文章

4. 分支相关命令:
git branch 查看你当前所在的分支
git branch name 创建分支
git checkout -b branchName 当前所在分支创建新分支
git checkout branchName 切换分支
git merge branchName 合并branchName分支到当前分支
git git cherry-pick (-n) commitId(SHA) 挑拣(多个)一个提交到当前分支

5.临时保存本地修改过的代码,先不放到提交范围里:
git stash list 查看保存的工作进度
git stash 保存工作进度
git stash pop 来恢复保存的工作状态

6.比较代码差异:
git diff 工作空间和暂存区的区别
git diff HEAD 工作空间和版本库的区别
git diff –cached 暂存区和版本库的区别

7.在远程git服务器上新增一个仓库
echo "# lihongyi" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/username/reposname.git
git push -u origin master

8.合并时报错:Pulling is not possible because you have unmerged files
原因:当前分支有一个文件因为有修改,没有被合并,这时checkout或pull都会失败
处理方案:强制冲掉这个文件的修改,返回上一次提交的节点
命令:git reset –hard FETCH_HEAD

9.删除不需要跟进的文件及文件夹
命令:git clean -fd [files or folder]

10.合并其它分支的某次提交到当前分支
git log
git checkout cur_branch
git cherry-pick (commitid)

11.删除分支
删除本地分支: git branch -d [branch name]
删除远程分支: git push origin –delete [branch name]

12.合并其它分支单个文件
如果使用git merge命令,会将整个A分支都合并到B
如果只想合并某一个文件,应该使用git checkout -p(–patch)
git checkout -p A file.txt
如果merge过程中遇到冲突,在手动解决完冲突后,可通过git add 命令告诉git冲突已解决

注:分支A可以是远程的分支,也可以是本地分支,远程分支应该写origin/A,如果只写A则默认是本地分支。

冲突合并思路:
通过git stash命令,把工作区的修改提交到栈区,目的是保存工作区的修改
通过git pull命令,拉取远程分支上的代码并合并到本地分支,目的是消除冲突
通过git stash pop命令,把保存在栈区的修改部分合并到最新的工作空间中

12-1. 让分支树的展示更简洁
git rebase 可以在合并代码后,让整个分支树呈现完美的线性
与之相比, git merge 合并后可能存在分支树的情况
相关介绍说明

Rebase 黄金法则
最后必须要提到一条 rebase 黄金法则:绝不要在公共的分支上使用它。 git rebase 会重写历史,一定只能在你自己的分支上使用它, 否则你的队友们可能会暴打你一顿。

13.列出远端所有分支
git branch -r

14.以 bare 方式在远端上创建库存(创建仓库/初始化库存)
mkdir /home/name/repos/project_name.git
cd /home/name/repos/project_name.git
git init –bare 创建裸仓库
从裸仓库clone下来的本地仓库可以进行正常的push操作,但从一般仓库clone下来的本地仓库不能push。
裸仓库不包含工作区,所以不存在在裸仓库上直接提交变更的情况。
裸仓库一般是作为远程的中心仓库而存在的。

15. 使用stash临时存储不打算提交的内存至栈中
临时保存当前分支修改,先不提交(要在add 之前操作)
git stash save "msg"
以栈的方式存储,先进后出

16. 找出代码提交者
git blame file -L a,b 打印出file中行数在a,b之间的的内容,并会显示每一行代码的提交者信息

17. 获取远程最新信息 并 合并至本地分支
git fetch 获取远端有而本地没有的数据
git merge alias 将服务器上的任何更新(假设有人这时候推送到服务器了)合并到当前分支

18. 删除 Untracked files
git clean -f 会强制删除未add到git中的文件
-d 连目录一起删除
-x 连 ignored files 文件一起删除
-X 只删除 ignored files

19. 各类型merge合并参数

20. git merge时空格处理参数

临时保存功能

背景:当你不想提交当前完成了一半的代码,但是却不得不修改一个紧急Bug,那么使用’git stash’就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用’git stash apply’将以前一半的工作应用回来。 引用自

stash 基本操作

查看当前临时保存的列表
git stash list

将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。
该命令将堆栈中最近保存的内容删除(栈是先进后出)
git stash pop

将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除
git stash apply

从堆栈中移除某个指定的stash
git stash drop + 名称

清除堆栈中的所有 内容
git stash clear

查看堆栈中最新保存的stash和当前目录的差异。
git stash show

 

参考资料:http://blog.csdn.net/txw910/article/details/53998951

利用hook实现自动部署
解决方案参考

Gitflow实践分支设定
最佳实践

主要工作流程:

1. 初始化项目为gitflow, 默认创建master分支, 然后从master拉取第一个develop分支
2. 从develop拉取feature分支进行编码开发(多个开发人员拉取多个feature同时进行并行开发, 互不影响)

3. feature分支完成后, 合并到develop(不推送, feature功能完成还未提测, 推送后会影响其他功能分支的开发)
    合并feature到develop, 可以选择删除当前feature, 也可以不删除 . 但当前feature就不可更改了, 必须从release分支继续编码修改

4. 从develop拉取release分支进行提测, 提测过程中在release分支上修改BUG

5. release分支上线后, 合并release分支到develop/master并推送
     合并之后, 可选删除当前release分支, 若不删除, 则当前release不可修改 . 线上有问题也必须从master拉取hotfix分支进行修改

6. 上线之后若发现线上BUG, 从master拉取hotfix进行BUG修改

7. hotfix通过测试上线后, 合并hotfix分支到develop/master并推送
    合并之后, 可选删除当前hostfix, 若不删除, 则当前hotfix不可修改, 若补丁未修复, 需要从master拉取新的hotfix继续修改

8. 当进行一个feature时, 若develop分支有变动, 如其他开发人员完成功能并上线, 则需要将完成的功能合并到自己分支上
    即合并develop到当前feature分支
9. 当进行一个release分支时, 若develop分支有变动, 如其他开发人员完成功能并上线, 则需要将完成的功能合并到自己分支上
    即合并develop到当前release分支 (!!! 因为当前release分支通过测试后会发布到线上, 如果不合并最新的develop分支, 就会发生丢代码的情况)

git面试常见问题

win10 docker搭建gitlab
gitlab代码评审

keras 深度学习 mnist示例代码

'''
功能:通过深度学习,让机器学会自动识别手写数字。
源数据来源于:mnist官方库中手写数字的训练及测试数据。

附:
keras中文文档:
http://keras-cn.readthedocs.io/en/latest/for_beginners/concepts/

keras英文文档:
https://keras.io/
'''

#!/usr/bin/env python

import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
import numpy as np
import keras
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers import Conv2D, MaxPool2D, Flatten
from keras.optimizers import SGD, Adam
from keras.utils import np_utils
from keras.datasets import mnist

# 定义数据加载函数
def load_data():
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    
    '''
    x_train.shape=[10000,28,28], x_train[0]=(一个二维数组)
    x_test.shape=[(10000, 28, 28)],x_test[0]=(一个二维数组)
    y_train.shape=[(60000,)],y_train[0]=[5]
    y_test.shape=[(10000,)],y_test[0]=[7]
    说明x_train的每一个元素, 都是一个28*28的数组, 下面我们要将数转换成一维向量
    '''

    number = 10000
    x_train = x_train[0:number]
    y_train = y_train[0:number]

    # 将三维数组转换为二维数组
    x_train = x_train.reshape(number, 28*28)
    x_test = x_test.reshape(x_test.shape[0], 28*28)

    # 将向里中每个元素的值从整形转为浮点
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')

    # convert class vectors to binary class matrices
    # 即用one hot encoding方法将输出标签的向量(vector)转化为
    # 只在出现对应标签的那一列为1,其余为0的布尔矩阵, 10个列,有值的一列为1, 其余为0
    # keras.utils.to_categorical(labels, num_classes)
    y_train = np_utils.to_categorical(y_train, 10)
    y_test = np_utils.to_categorical(y_test, 10)

    '''
    x_train = x_train
    x_test = x_test
    '''

    x_train = x_train / 255
    x_test = x_test / 255

    return (x_train, y_train), (x_test, y_test)

'''
x_train.shape => (10000, 784) x_train的形状: 10000个784维的向量
x_train[0] => 第一个向量的值
'''

# 加载训练数据及测试数据
(x_train, y_train), (x_test, y_test) = load_data()
'''
print ('x_train.shape=[%s],x_train[0]=[%s]' %(x_train.shape, x_train[0]))
print ('x_test.shape=[%s],x_test[0]=[%s]'   %(x_test.shape, x_test[0]))
print ('y_train.shape=[%s],y_train[0]=[%s]' %(y_train.shape, y_train[0]))
print ('y_test.shape=[%s],y_test[0]=[%s]'   %(y_test.shape, y_test[0]))
print ('\n\n')
exit()

x_train.shape=[(10000, 784)],x_train[0]=(一个一维数组)
x_test.shape=[(10000, 784)],x_test[0]=(一个一维数组)
y_train.shape=[(10000, 10)],y_train[0]=[[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]]
y_test.shape=[(10000, 10)],y_test[0]=[[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]]
'''

# 定义一个序贯模型(Graph模型的一个特殊情况)
# 序贯模型是多个网络层的线性堆叠,训练时数据在网络层之间顺序执行。
# 序贯模型是相对于Graph模型而言。
# Graph模型支持多输入多输出,层与层之间想怎么边就怎么连,但是编译速度慢。
model = Sequential()

# 定义神经网络输入层
model.add(Dense(input_dim=28*28, units=633, activation='relu'))

# 定义神经网络的隐藏层
model.add(Dense(units=633, activation='relu'))
model.add(Dense(units=633, activation='relu'))

# 定义神经网络输出层
model.add(Dense(units=10, activation='softmax'))

# 指定损失函数:loss, 优化器:optimizer, 性能评估指标列表:metrics
model.compile(loss='categorical_crossentropy',optimizer=SGD(lr=0.1),metrics=['accuracy'])

# 开始训练模型
# model.fit(data, labels, batch_size=, epochs=)
model.fit(x_train, y_train, batch_size=1, epochs=1000)

# 打印训练得到最终的准确度
print('\nGet Train Accuracy')
result_train = model.evaluate(x_train,y_train)
print('Train Accuracy:[%f]\n' %(result_train[1]))

# 打印应用到测试数据得到的准确度
print('Get Test Accuracy')
result_test = model.evaluate(x_test,y_test)
print('Test Accuracy:[%f]' %(result_test[1]))

'''
# 使用训练得到的模型,对新的数据进行预测:
classes = model.predict(x_newdata, batch_size=128)
'''