这个Python资源在GitHub上标星超8000,现在被翻译成了中文

未分类

最近,GitHub上一个关于Python的工程完工了。

一个名为“暮晨”的贡献者,把一个非常有趣的Python项目,翻译成了中文版。

这个项目是《What the f*ck Python!》,专门介绍 Python 里面那些奇奇怪怪的语言坑。

未分类

关于项目

项目的主体构成部分就是示例,一共分为5个部分,分别是:

Strain your brain!/大脑运动!

未分类

Appearances are deceptive!/外表是靠不住的!

未分类

Watch out for the landmines!/小心地雷!

未分类

The Hidden treasures!/隐藏的宝藏!

未分类

Miscellaneous/杂项

未分类

以上,总计51个示例。

每一个示例的结构都是一样的,以“Mutating the immutable!/强人所难”为例:

首先,会给出代码:

some_tuple = ("A", "tuple", "with", "values")
another_tuple = ([1, 2], [3, 4], [5, 6])

然后,给出Output( Python version):

>>> some_tuple[2] = "change this"
TypeError: 'tuple' object does not support item assignment
>>> another_tuple[2].append(1000) # 这里不出现错误
>>> another_tuple
([1, 2], [3, 4], [5, 6, 1000])
>>> another_tuple[2] += [99, 999]
TypeError: 'tuple' object does not support item assignment
>>> another_tuple
([1, 2], [3, 4], [5, 6, 1000, 99, 999])

然后,对意外输出的结果进行简短的描述,在这个示例中,就是:

我还以为元组是不可变的呢…

接下来,就会对示例进行说明,简要叙述发生了什么以及为什么会发生。如有必要, 也会举例说明。

在这个示例中是这样的:

  • 引用 https://docs.python.org/2/reference/datamodel.html
不可变序列 不可变序列的对象一旦创建就不能再改变。(如果对象包含对其他对象的引用,则这些其他对象可能是可变的并且可能会被修改; 但是,由不可变对象直接引用的对象集合不能更改。)
  • += 操作符在原地修改了列表. 元素赋值操作并不工作, 但是当异常抛出时, 元素已经在原地被修改了。

有些地方,贡献者还会给出译注,比如整个示例中就是:

对于不可变对象, 这里指tuple, +=并不是原子操作, 而是extend和=两个动作, 这里=操作虽然会抛出异常, 但 extend 操作已经修改成功了。

其他还有50个示例,等你来看~

怎么使用?

当然,要学习一下怎么使用这个资源。项目贡献者在用法部分表示,最好依次阅读下面的示例。

然后,在阅读每一个示例的时候,这样做:

仔细阅读设置例子最开始的代码。阅读输出结果。确认结果是否如你所料。确认你是否知道这背后的原理。如果不知道, 深呼吸然后阅读说明 (如果你还是看不明白, 别沉默!可以提问题)。如果知道, 给自己点奖励, 然后去看下一个示例。

此外,还可以在命令行阅读 WTFpython,有 pypi 包 和 npm 包(支持代码高亮),不过都是英文版的。

关于作者

这个项目的原作者,是一个名为Satwik Kansal的印度小哥。

未分类

GitHub上的介绍称,在深度学习和去中心化应用方面是一个“老司机”。

目前,英文版资源,标星已经8.3k了。

未分类

传送门

中文版:

https://github.com/leisurelicht/wtfpython-cn

英文原版:

https://github.com/satwikkansal/wtfpython

— 完 —

利用代理解决Git命令链接GitHub过慢的问题

最近刚刚把博客转换成了Hexo,在安装的过程中频繁出错,安装缓慢。然后想到,家里的电信网络是没办法直接链接GitHub的,故参考网上的方法,给Git Bash设置了代理。果然,有了小火箭的加速,git clone速度飞快!

Git设置代理的方法

设置为HTTP协议的代理

$ git config --global http.proxy http://proxy.mysite.com:8080
$ git config --global https.proxy http://proxy.mysite.com:8080

第一个是设置Git在采用HTTP连接时的代理地址,第二个是设置Git在采用HTTPS连接时的代理地址。

设置为SOCKS5协议的代理

$ git config --global http.proxy 'socks5://127.0.0.1:1080' 
$ git config --global https.proxy 'socks5://127.0.0.1:1080'

第一个是设置Git在采用HTTP连接时的代理地址,第二个是设置Git在采用HTTPS连接时的代理地址。采用小飞机的就可以采用这个方法。

Git取消代理的方法

$ git config --global --unset http.proxy
$ git config --global --unset https.proxy

解决github网站 git push或者git clone代码速度太慢的方法

有时在工作中往github上提交代码或者clone别人的代码,总是特别慢!小一点的项目源代码还好,大的项目就要急死人了,差一点的速度经常是个位数,真的很耽误事!有个修改hosts的方法大家可以试试,我这边亲测有效,别的我不敢保证,大家可以试试!

1.打开hosts文件

sudo vim /etc/hosts

2.在该文件末尾空一行填入

151.101.72.249 github.global.ssl.fastly.net

大家可以先试试看,有效果的话最好!

git与github远程连接代码库使用笔记

一、安装与账号添加

1. git安装

目前windows版本的git有几种实现,但我们选择msysgit发行版,这是目前做得兼容性最好的。下载地址:http://code.google.com/p/msysgit/downloads/list

2. 生成SSH密钥

ssh-keygen -C '[email protected]' -t rsa

相关内容会存放在:C:Usersuser.ssh之中,有id_rsa,id_rsa.pub

3. 在github中验证

来到自己的github账户:
点击右上角的Edit your profile—> Account Settings—>SSH Public keys —> new ssh key
然后输入id_rsa.pub之中:

未分类

在git bash中执行以下命令完成:

ssh -T [email protected]

4. git本地构建github库

先在自己的github中创建一个Repository,然后在本地git中加入自己的信息:

git config --global user.name "maz"
git config --global user.email "[email protected]"

.

二、git的使用

譬如你的项目为:m/project

1. 添加文件

$ mkdir ~/project //创建一个项目hello-world
$ cd ~/project //打开这个项目
$ git init    //初始化 
$ touch README
$ git add README   //更新README文件
$ git commit -m 'first commit' //提交更新,并注释信息“first commit” !!! 修改code的关键
$ git remote add origin [email protected]:mattzheng/tensorflow.git //连接远程github项目  
$ git push -u origin master   //将本地项目更新到github项目上去 ,更新+修改

add README 是把文件上传到一个临时空间中,然后git commit才确认更新。
确认更新之后,需要git push 才能更新github上的内容。
其中:master 是原始的分支,可以直接创建,origin 是别名
其中:git commit -m ‘first commit’ 更新并注释

2. 分支的使用

创建分支

最开始只有一条分支:master

# 第一种方法:
git checkout -b dev 创建一个新的分支:dev + 并来到新的分支  
# 第二种方法:
git branch dev  # 创建
git checkout dev #来到dev分支
git checkout master # 来自master分支

查看分支

# 查看分支
git branch
git add readme.txt
git commit -m "注释:提交到dev分支"
git push -u origin dev

合并分支

要现在原来的分支中提交:

git push -u origin dev

然后再回到主分支master,然后merge起来:

git merge dev

删除分支

git branch -d dev

3. 回滚与状态查询

git status  # 已加载(staged)和未加载(unstaged)文件的状态、提交等,你可以询问git的状态

4. 取得远程代码库的一份本地拷贝

如果你还没有一份远程代码库的本地版本(例如,如果你在另一台机器上开始工作,这台机器上还没有用过这个项目),你首先需要拷贝(clone)它。去到你的代码库想要拷贝到的文件夹下,并发送:

git clone https://[email protected]/your_username/name_of_remote_repository.git

5. git删除文件

参考:https://www.jianshu.com/p/c3ff8f0da85e

删除本地文件,但是未添加到暂存区;
删除本地文件,并且把删除操作添加到了暂存区;
把暂存区的操作提交到了本地git库;
把本地git库的删除记录推送到了远程服务器github。

删除缓存区一个文件:

git rm test.txt

删除缓存区一个文件夹:

git rm test -r -f

同步删除操作到远程分支:

git commit -m "delete raindow"  

延伸一:git push origin master 报错:

$ git push origin master
To github.com:xiaoyangLee/LearnJava.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to '[email protected]:xiaoyangLee/LearnJava.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

原因是远程仓库中的文件和我们本地的仓库有差异,例如你的远程仓库有个文件Readme.md,但是本地仓库却没有,就可能会出现这种情况。

之所以出现这种情况,原因多种多样,例如你直接使用了github上传文件,或者像我一样,这次使用了另外一个系统推送了文件,导致了此问题的出现。解决办法显然有,把本地仓库删了再git clone一个,但是这种方法显然不可取….

解决办法:使用git pull 合并分支

git pull --rebase origin master

Jenkins+Github+Docker实现自动化构建运行Jar

介绍

  • docker:简单的说,如果你用docker构建一个rabbitMQ集群之类的,将其打包成一个镜像.或者你直接拉取别人配置好的镜像,可以直接在 本机0配置的运行一个安装有mq集群容器(类似虚拟机).

  • Jenkins:可以从git或github等代码源,自动拉取代码,进行你想要的测试/构建操作,或shell脚本等.

  • 简单介绍下我要实现的效果:

  1. 在docker容器中运行jenkins.

  2. jenkins自动监听我的Github项目,当我提交新的代码时,

  3. jenkins自动拉取该代码到本地,使用maven打包后,关闭上个版本的该项目,然后使用java jar命令运行最新的jar(spring boot).

Docker安装及基本操作

  • Docker (CE)小企业或个人,此处是CE
  • Docker (EE)企业级
  • 安装及启动
CentOS
前置环境安装
    yum install -y yum-utils 
      device-mapper-persistent-data 
      lvm2

设置稳定的存储库
    yum-config-manager 
        --add-repo 
        https://download.docker.com/linux/centos/docker-ce.repo
    非必须 开启edge和test存储库库等  这样可以禁用yum-config-manager--disable docker-ce-edge
    yum-config-manager --enable docker-ce-edge 
    yum-config-manager --enable docker-ce-test

安装
    yum install docker-ce

启动docker(配置文件 /etc/sysconfig/docker)
    systemctl start docker

开机启动等
    systemctl enable docker
    systemctl disable docker
    chkconfig docker on

测试(这个命令下载一个helloword镜像并在容器中运行。容器运行时,会打印一条信息消息。)
    docker run hello-world

卸载
    yum remove docker-ce
    rm -rf /var/lib/docker # 删除镜像容器等
  • 常用命令(使用容器或镜像id时,无需全部id,只需前几个字符即可,也可使用 容器镜像名:版本号 操作)
重要:xx表示不同的命令如,pull、run等。可以查看该命令的帮助,所有参数
docker xx --help

查看本机的镜像,可通过该方法查看到镜像id等信息.
docker images 

获取镜像 name:镜像名  [:tag]:版本,默认为最新的(也就是会自己加上一个参数:latest)
docker pull [options] name[:tag]

删除镜像,需要删除其下所有容器
docker rmi <镜像id>

运行镜像,构建出一个容器. -d表示后台运行. 
docker run -d image 
-p 8080:80  进行端口映射,将nginx的80端口映射到主机的8080端口上,也就是别人访问8080,可以访问到自己的80

查看目前正在运行的容器
docker ps

查看所有容器
docker ps -a

停止容器
docker stop <容器id>

删除容器
docker rm <容器id>

启动一个运行(run)过的容器
docker start <容器id>

在运行的容器中执行命令 
docker exec [options] container command [arg...]
例如:   
docker exec -it <容器id> bash
可以进入一个容器,和虚拟机中一样。也就是容器内部

挂载目录:将宿主机的文件共享给容器
docker run -d --name=test -v /opt/test:/usr/databases docker-test 
test是容器的名字,需唯一;
-v表示创建一个数据卷并挂载到容器里,
示例表示把宿主机的/opt/test目录挂载到容器的/usr/databases目录下;
docker-test是镜像的名字

查看容器当前信息,可在该命令的 Mounts信息中,找到挂载目录信息
docker inspect <容器id>



制作镜像
以下就是 打包镜像tomcat和jpress.war
在某个目录创建文件 Dockerfile 编辑输入如下内容:
    # (继承自哪个镜像)注意,注释不能添加在和命令同行,会报错
    from images(镜像名)   
    # (维护人员信息)
    MAINTAINER ZX [email protected]  
    # (同一目录下要打包成镜像的文件,拷贝到tomcat的运行目录下)
    COPY jpress.war  /usr/local/tomcat/webapps  

此外,有更多命令
RUN : 执行容器中操作系统的命令(例如是CentOS,可以执行 cp mv 等等.)  
EXPOSE : 指定该容器暴露的端口,可以通过多个EXPOSE暴露多个端口
ENV : 设置环境变量 例如 ENV JAVA_HOME /var/java
ADD : 将本地文件拷贝到容器中.例如 /var/xxx.tar.gz  /var 
CMD : 容器启动时执行的命令,最多一条. 
其他命令自行搜索.

然后在目录下使用  
即可创建镜像,注意, . 是当前目录的意思
docker build .   
下面这句 -t是创建镜像并命名, :laster是版本号 ,因为上面的镜像没有命名
docker build  . -t jpress:latest

运行容器
-d表示后台运行 -p表示设置端口映射, jpress是镜像名
docker run -d -p  8888:8080 jpress

运行mysql镜像
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=xxx  images(镜像名)
  • 使用阿里云的Docker镜像加速器
管理控制台 -> 容器镜像服务 -> 镜像加速器 -> 获取到其分配的加速地址
修改 /etc/docker/daemon.json 文件,增加如下,没有时创建
  {
    "registry-mirrors": ["加速地址"]
  }
  • 可在阿里云免费开通 容器镜像服务,创建仓库,将镜像推送过去

Jenkins 持续集成

  • 前置

    • JDK8
    • Docker
  • 使用docker下载镜像jenkinsci/blueocean,并启动运行Jenkins容器

docker run 
      -u root 
      -d 
      -p 8080:8080 
      -v jenkins-data:/var/jenkins_home 
      -v /var/run/docker.sock:/var/run/docker.sock 
      jenkinsci/blueocean

官方文档中还有一个 --rm . 但是提示 -d 和 --rm 相互冲突
其容器中的/var/jenkins_home 被挂载到了我本地的 /var/lib/docker/volumes/jenkins-data/_data 目录下
  • 进入Jenkins容器执行命令
docker exec -it <容器id> bash
  • 查看容器输出的日志
docker logs <容器id> [-f(滚动的)]
  • 或者自行下载war包运行
java -jar jenkins.war --httpPort=8080
  • 可以创建一个基于Jenkins镜像的整合maven的新镜像(jdk在
    jenkinsci/blueocean中已经有一个oepn_jdk(目前没发现有什么问题))
下载maven 
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.2/binaries/apache-maven-3.5.2-bin.tar.gz

Dockerfile文件内容
     #继承自jenkins镜像
     FROM jenkinsci/blueocean:latest  
     #维护人员信息
     MAINTAINER ZX [email protected]  
     # 拷贝本地的maven解压包到镜像的/usr下
     ADD apache-maven-3.5.2-bin.tar.gz /var
     # 下载并解压jdk和maven,使用RUN表示执行当前系统(CentOS)命令
     RUN cd /var 
     tar -zxvf  apache-maven-3.5.2-bin.tar.gz 
     # 设置环境变量
     ENV MAVEN_HOME /var/apache-maven-3.5.2
     ENV PATH $MAVEN_HOME/bin:$PATH
     # 开放的端口
     EXPOSE 8080 
     EXPOSE 8081
     EXPOSE 8082 
     EXPOSE 8083 
     EXPOSE 8084 
     EXPOSE 8085 

构建镜像     
docker build . -t <仓库/镜像名:tag>
例如
docker build . -t zzzxxx/jenkins-maven-jdk:1.0

运行该镜像,端口映射可自行调整.
docker run 
          -u root 
          -d 
          -p 8080:8080 
          -p 8081:8081 
          -p 8082:8082 
          -p 8083:8083 
          -p 8084:8084 
          -p 8085:8085 
          -v jenkins-data:/var/jenkins_home 
          -v /var/run/docker.sock:/var/run/docker.sock 
          zzzxxx/jenkins-maven-jdk:1.0

bug:在RUN的最后一句contOS命令后多加了个 ,导致后面的ENV没有有效指定.

为防止maven构建过慢,可自行在/var/maven/conf/setting.xml中增加阿里云镜像
        <mirror>
          <id>nexus-aliyun</id>
          <mirrorOf>*</mirrorOf>
          <name>Nexus aliyun</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
  • 启动时会在日志中输出密码,第一次配置时需要用到,也可以根据它的提示,去容器中的该目录找到

  • 启动完成后,访问对应的8080端口,即可.再完成它的一系列简单的配置(安装他推荐的所有插件)

  • 在 系统管理 -> 全局工具配置 中 设置maven和jdk目录等(可按它的选择自动下载maven) 默认集成的jdk等可用echo $JAVA_HOME 输出对应路径

未分类

  • 它的运行后所有数据默认保存的主目录的.jenkins中(例如 /root/.jenkins).可通过在启动前指定 JENKINS_HOME环境变量修改
vim /ect/profile
export JENKINS_HOME=xx
source /etc/profile
  • 安装插件 Maven Integration plugin 和 Github Plugin(默认已经安装)

  • 系统管理–>插件管理–>可选插件->搜索.安装即可 (如果搜不到,可查看已安装插件中是否已经安装.) 如果插件安装失败,可在已安装插件中卸载后,重试. 卸载插件执行后,需要重启jenkins

  • 在docker容器中jenkins的主目录在/var/jenkins_home文件夹中(可用echo $JENKINS_HOME查看).

  • 其中pull下来的项目在./workspace中的对应任务名的文件中

  • jenkins + github配置,实现jenkins能在push到github后,自动pull代码进行打包测试运行

    • github个人页面 -> setting -> developer setting -> personal access tokens -> Generate new token

未分类

未分类

未分类

该token就是OAuth2协议中的access_token.第三方应用(jenkinds)可通过该令牌获取你允许它进行的一些权限.
选择创建令牌.并勾选 repo 和 admin:repo_hook权限.并自行保存好生成的token.
这两个权限主要就是访问你的仓库,并设置你的仓库的监听器(钩子,可以理解为监听器.监听你的push等)

  • 在github上选择你要部署的项目 -> setting -> webHooks -> add webHooks

未分类

未分类

这个钩子,可以配置你要监听的事件.当该事件发生后,会请求你配置的那个url.
此处在Payload URL处填写
http://<你的jenkins的ip>:<端口号>:/github-webhook/
然后使用默认的Just the push event.监听push事件即可.
点击增加

  • jenkins页面: 系统管理->系统设置->GitHub->add Github Server

未分类

未分类

api url中输入 https://api.github.com
然后选择增加 Credentials. 选择类型为Secret text.在secret中输入之前的token即可.
然后测试连接.当返回
Credentials verified for user BrightStarry, rate limit: 4997
表示成功

  • jenkins: 创建一个新的maven项目任务

未分类

未分类

未分类

未分类

未分类

未分类

输入完任务名后,点击确认.
在配置页面,选择github Project.输入你要持续集成的项目的github url

在源码管理处,选择git.输入github项目的git地址.
然后点击 add Credentials,创建一个帐号.需要输入你的github帐号密码.然后在下拉款选择该帐号.
在下方还可选择要监听的分支

在触发器处,选择监听github的刚才配置的github hook.

在Build处指定pom.xml路径(通常就在根目录)和要执行的maven命令.

  • 最后需要在Post Setps中设置执行shell,我尝试很多次,都无法直接使用java -jar命令运行jar.(会将末尾的&省略,无法后台启动).
    • 可以在shell窗口中,增加如下(BUILD_ID=dontKillMe 是防止jenkins杀死我们的后台进程)

未分类

BUILD_ID=dontKillMe
java -jar $JENKINS_HOME/workspace/maven测试/target/zx-test.jar &
  • 或者使用sh脚本执行(这样可以不用手动停止上一个版本的正在运行的jar)
    • 写在jenkins要执行的shell窗口中的脚本 先停止前一个版本的jar.然后再用最新的jar替换掉之前的jar. 然后运行最新的jar
#!/bin/bash 
cd /var
sh stop.sh
cp $JENKINS_HOME/workspace/任务名/target/生成的jar名.jar /var
echo "开始启动"
BUILD_ID=dontKillMe 
java -jar /var/zx-test.jar &
  • stop.sh 停止前一个版本的jar(pid=ps -ef xxx这句的意思是,通过若干过滤找到对应jar的pid记录.$1表示输出后的记录的第一个参数) 在/var中创建该脚本
echo "正在停止之前的jar"
pid=`ps -ef | grep zx-test.jar | grep -v grep | awk '{print $1}'`
if [ -n "$pid" ]
then
echo "kill -9 的pid:" $pid
kill -9 $pid
fi
  • 至此,已经实现,指定github中的某个项目,一旦push上去,jenkins自动pull,执行maven命令构建,并执行shell运行jar.

  • 实现完成后,我才突然发现.如果要让项目自动运行在单独的docker容器中,最好不要让jenkins运行在docker容器中. 直接使用本地的jenkins,打包后,将jar单独封装成一个镜像,或者挂载jar目录到一个容器中.运行该容器即可.