Shawn's Blog

一个伪程序员的伪技术博客

git stash save/apply/pop

在用git的时候经常会有需要临时切分支等操作,但是如果当前工作区进行了修改就不能直接切分支。这时候呢就得把当前的代码暂存起来,可以这么操作:

1
2
git add .
git stash

这样就吧上次commit到现在的修改都暂存起来了,可以使用git stash show来查看暂存区。我以前就是这样的,每次由两个或是两个以上的stash之后就蒙圈了,不知道那个stash做了哪些改变。虽然git stash show可以看到每个stash修改了哪些文件,但是还是不能准确的定位到自己需要的stash。

后来发现git stash后面还能继续接参数,这里得感谢git plugin for oh-my-zsh。当临时保存一些修改的时候可以这样:git stash save "fix:xxxxx",有多个stash的时候也可以用git stash show来看到每个stash的备注,就方便多了。

1
2
3
4
5
git on  new_branch [$?] via simple took 2s
➜ git stash show stash@\{0\}
stash@{0}: On new_branch: feature:xxxxx (38 seconds ago) stash@{3}: On new_branch: create new file named hello.py (4 days ago)
stash@{1}: On new_branch: fix:xxxxx (53 seconds ago) stash@{4}: WIP on master: 75e1918 add a (7 weeks ago)
stash@{2}: On new_branch: create file zzz (4 days ago)
阅读全文 »

0X00 遇到了一个问题

前段时间自己的电脑重装了系统,然后公司内网的Docker hub出了点问题,没办法继续开发。后来经过一波Google找到了一个可以备份与恢复Image的方法,使用docker save / docker load命令。

0X01 备份与导入镜像

首先查看自己的镜像,然后找一个准备备份的镜像,找到他的IMAGE ID,假设选中的是ubuntu的镜像,那就使用dokcer save 0458a4468cbc --output ubuntu.tar就可以把ubuntu.tar文件拷贝到其他电脑上。

1
2
3
4
5
6
7
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
nextcloud latest 9d7d01184cbf 9 days ago 593MB
rabbitmq latest 72cee1616e73 2 weeks ago 127MB
ubuntu latest 0458a4468cbc 2 weeks ago 112MB
redis latest 861cc310cd91 3 weeks ago 107MB
mysql 5.7.17 9546ca122d3a 10 months ago 407MB
mongo 3.4.2 5bc602c0b7fe 10 months ago 360MB

到另外一台电脑上执行docker load --input ubuntu.tar就可以把这个镜像导入进去。

0X00 enumerate是什么

enumerate()是一个Python自带的函数,用来同时遍历刻碟带对象和索引值.

0X01 enumerate怎么用

如果不在不使用enumerate()的情况下去除一个字符串列表中的字符串中的空格,那么通常会写出下面这种程序.

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
# -*- coding: utf-8 -*-

my_list = [" 搞个大 新闻", "我作 为一 个长者", "比 谁跑 的都快",
"哪 个国家 我没 去过", "比你们不 知道 高到 哪里去了",
"谈 笑风生 ", "当然 支持 啊", "遵循 基本法 的 "]
index = 0
for item in my_list:
my_list[index] = item.replace(' ', '')
index = index + 1

可以看到光是处理空格都用了四行,而且还并不怎么优雅.那么可以使用enumerate()来修改一下这个程序.

1
2
3
4
5
6
7
8
9
#!/usr/bin/env python
# -*- coding: utf-8 -*-

my_list = [" 搞个大 新闻", "我作 为一 个长者", "比 谁跑 的都快",
"哪 个国家 我没 去过", "比你们不 知道 高到 哪里去了",
"谈 笑风生 ", "当然 支持 啊", "遵循 基本法 的 "]

for index, item in enumerate(my_list):
my_list[index] = item.replace(' ', '')

语法大概就是这for 索引, 对象 in enumerate(可迭代对象).用起来不仅干净优雅而且可读性也更强了.

我们在编写Python程序的时候会发现在我们的目录中可能会出现与源代码同名的pyc文件生成,比如有一个源码文件是hello.py那么可能会生成一个hello.pyc文件出来.这个pyc文件是Python的字节码文件,就类似于Java中的hello.class一样.

Python虽然是解释性语言,但还是可以有一个编译的过程,只不过是编译成字节码文件罢了.如果我们的源码带有包含关系,比如源码a.py里面import了源码文件b.py,那么在执行python a.py的时候就会将b.py编译成b.pyc

下次再运行python a.py的时候解释器会检查b.pyb.pyc的修改时间,如果一致就代表源码没有修改过,那么就可以直接调用b.pyc来更快的执行程序,如果时间不同那就证明b.py被修改过,则会重新编译b.py

其中pyc文件的主要作用是用来加快程序执行速度的,虽然编译出来的pyc是二进制文件,不能看到内部的内容,但是还是不要把这种方式作为保护源码的方法.因为这种pyc文件是可以轻易被反编译的,有很多开源库可以轻松的反编译pyc文件,甚至都有web程序来反编译pyc文件,比如这个tool.lu就可以通过上传文件pyc文件的方式反编译.

0X00 使用uwsgi启动Django

首先安装uwsgi,pip install uwsgi就可以装好.然后找到Django生成的wsgi.py文件,这文件通常实在与项目名同名的app目录下的,比如我的项目名为django_test那么这个文件应该就在django_test/wsgi.py.然后执行uwsgi --http 0.0.0.0:8080 --wsgi-file django_test/wssgi.py就可以用uwsgi启动你的Django项目了.
Django自带的python manage.py runserver用于调试还是可以的,不过如果用于生产环境的不论是安全性还是性能都不足以满足生产环境的需要.

0X01 使用supervisor维持服务在线

我们知道由于Linux系统的进程管理机制,导致在bash里启动的程序如果退出bash就会自动被kill掉.所以我们需要一个能让进程一直活下去的方法,其中nohup是我们常用的方法,不过这种方法也只是能让进程活在后台罢了,平时跑个脚本或是其他小程序还可以,如果是部署一个服务的话就不合适了.这里我们选用supervisor来维持服务.

阅读全文 »
0%