Mac更新快捷键(复制Ctrl C、粘贴Ctrl V、剪切Ctrl X)

一直都是双屏工作,用Synergy来共用键鼠。大部分快捷键还能区分开使用,就是复制粘贴老是弄混,很久了都不行,懒人能不改就不改呗。查了好多资料,发现最佳的办法就是在现有快捷键的基础上增加win下的习惯,比如拷贝和粘贴,但是老外的Copy和Past不适用,浏览到苹果的帮助文档发现黑色字后豁然开朗,原来中文osx下快捷键的命名也会变成中文,哎还是中文惹的祸。mac下的快捷键比较有意思,它是跟菜单里的命名挂钩的,这种方式比win下注册表啥的人性化很多很多,至少没有门槛。下面截图就是目前我修改的几个快捷键,这里注意下:拷贝和复制其实是一个意思,但是系统默认使用的是拷贝而像chrom等很多用的是复制,所以都要加上。

%e5%b1%8f%e5%b9%95%e5%bf%ab%e7%85%a7-2016-11-25-%e4%b8%8b%e5%8d%883-22-01

docker配置wordpress总结

php-fpm官方镜像已经非常简洁了,这时候需要修改一点点配置比如上传文件的大小,可以写在php.ini中如下

[code]upload_max_filesize = 64M post_max_size = 64M max_execution_time = 300[code]

然后在Dockerfile中COPY到目录/usr/local/etc/php/就会覆盖当前的系统配置。

然后一些系统扩展也是必须的,下面添加在Dockerfile中

[code]RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-configure gd –with-png-dir=/usr –with-jpeg-dir=/usr \ && docker-php-ext-install gd mysqli opcache[code]

最后,最重要的是插件的安装和安全更新,这里我使用了ssh,每次自己输入pwd还安全一些,这个插件叫SSH SFTP Updater Support  

友情提醒不熟悉docker的朋友,docker下的app目录必须与主机一致,否则会路径错误。

Pygame的渲染,当无显示器(headless)时的设置

pygame真是好用的东西,速度不慢,虽然我并没有像它名字里那样用在game上,但是一些小的图片化渲染它也一点不显得大,而且兼容问题解决的好好的,目前为止所有需求都用的它,而没有去动opengl,真是太好了。它默认支持无显示器的,只要别去调用display就行,其实大部分需求用surface都可以解决,真的需要设置SDL_VIDEODRIVER为dummy即可。

本来pygame用的挺好的,最近一个软件在server上跑时需要video driver,这时配置了Xvfb作为虚拟的外设,结果导致pygame生成的图全部变黑了,单独设置了SDL_VIDEODRIVER为Dummy也不行,推测肯定是pygame检测到了xvfb的设置才会这样,没有时间去研究server上多屏幕虚拟的问题,把SDL_VIDEODRIVER改为xvfb问题解决。

Dockerfile ADD和COPY的区别

COPY的作用跟预想的差不多,就是拷贝到目标中,而ADD比较魔法一点,支持URL这类的获取,并且它能更好的支持docker的cache,当我修改了数处copy为add后build速度就嗖嗖的了。

今天碰到一个特殊的地方,pip安装一个本地的包,当这个包是add进来的时会失败而copy没有这个问题。

Python 性能优化指导(加速器和一些小技巧)

  1. 使用测量工具,量化性能才能改进性能,常用的timeit和memory_profiler,此外还有profile、cProfile、hotshot等,memory_profiler用了psutil,所以不能跟踪cpython的扩展;
  2. 用C来解决费时的处理,c是效率的代名词,也是python用来解决效率问题的主要途径,甚至有时候我都觉得python是c的完美搭档。常用的是Cython,直接把py代码c化然后又能像使用py包一样使用,其次是ctypes,效率最最高的存在,最后还有CPython和cffi都是屌屌的存在;
  3. 优化算法,所有语言通病,算法的提升我觉得是在所有提升之上的,但也是最难的,好在现在大部分常用的算法都已经封包,除非自己给自己挖坑,所以弄懂标准库里的数据结构和常用api是如何实现的很重要;
  4. 2里的实现有人做了更高效的包用以替换python中常见的一些实现,如果瓶颈在stringio、pickle、profile这类上的可以考虑替换为c的版本;
  5. 数据结构尽量使用元组tuple,特别是数据量大的时候,实在不行list也可以,尽量不要用class,如果一定要用可以加slot,效率再不够就只能结合2来加速了;
  6. 延迟加载,import不是一定要写在一页的开始,哪里都可以,越碎片越能把包的加载延迟甚至不被加载;
  7. 用multiprocessing来实现多线程,可以跳出GIL的限制;
  8. python处理循环很烂,解释性语言就这样,跟其它编译型语言比就是蜗牛,所以减少循环次数和嵌套次数能显著提升性能,当然了使用pypy就没有这个问题了;
  9. 使用加速器,很喜欢psyco的使用方式,如果用2.7-的版本那么不失为一个懒人的选择,现在已经不再维护,创始人去了pypy,pypy是用Python实现的python,底层转为平台依赖的c、.net、java的中间语言,方式非常聪明,大爱,但是缺点是库的支持还不完善,我的项目基本都能支持,解决几个小问题即可,如果性能瓶颈在循环和内存上可以试试,最大的好处是不需要更改一句代码和做另外的设置,没有任何侵入。

Update-20161101: 1.更新第一条,objgraph更好用,兼容py3,重点是速度快,除了查看top对象列表外还可以生成对象图谱来分析oom,用了cython也可以分析,配合memory_profiler很完美; 2.吐槽一下pympler ,输出非常漂亮,可惜就是慢,如果数据量不大分析倒是挺好用的。 3.使用”del a”语法,如果这个代码是被使用在Cython中,因为它可以立即释放这部分内存;

参考资料: Python 代码性能优化技巧:https://www.ibm.com/developerworks/cn/linux/l-cn-python-optim/ Python性能优化技巧:http://kuanghy.github.io/2016/09/26/python-optimize

Python中使用自定义类class作为海量数据结构时内存占用巨大的问题

最近碰到处理一个二十多兆的文件时内存蹭蹭的吃掉四百多兆,吓死宝宝了。

无奈毕竟接触python时间有限,还没有完整的看过python的一些基础知识,我想一个合格的pythoner应该不会碰到这个问题。当然像我这样的操作党碰到的问题映像也更深一点。最郁闷的是网上讨论这个的很有限,google的结果也是三天才找到相应的说明,我想这里很重要的一点是海量数据在存储和很低层的操作时并不会使用python,嵌入一个c片段即可。好吧这招我还不会,而且在用的库要改也是件痛苦的事,为了让项目尽早上线有个折中的方案顶上即可。在无尽的排查后发现,原来python这个东东为了让大家写的爽,在性能上事丢的不要不要的,一般的系统还看不出问题,一但不是它原声的一些对象问题就来了,原来python在实现很多功能时并不像c那样极致,而是丢失性能换来魔法般的灵活性,而这个恶魔就是字典,自定义类的属性它居然使用字典来实现的。当然python设计时假设class的使用场景并没有特定于像c的struct那么高效,好在留了一手,可以像如下添加__slots__来缩减class,使得其占用内存更紧凑接近于list,对了list比tuple要差一点,毕竟它功能更多一点,不过我觉得与其省下list这点还不如换c更实在。添加__slots__后的代码如下:

1
2
3
4
5
6
class Date:
__slots__ = ['year', 'month', 'day']
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day

Celery在Flask的初始化中的问题

Flask的初始化有好多种,像工厂、单例都是不错的,我使用的是声明+init的方式,比如celery会是这样:

base.py中:celery = Celery()

__init__.py中在create__app()方法中会将base中的组件逐个init初始化。

大部分flask的组件都支持这种初始化的方式,因为python是解释型语言所以在使用不支持这种的组件如celery会有问题,比如像上面那样初始化后celery无法正确设置broker哪怕重新用celery.update_config(xxx)也没有用,其他参数似乎可以生效的。后来找到了celery-flask-helper,发现可以解决这个问题,不过在我的py35中无法使用它pypi的包,最后是copy代码直接引用到我的app中才可以。

关闭/开启 ubuntu 自动更新提示

发现vps登陆后只有apt update后才知道有多少包需要更新不是很傻么,本地的ubuntu在登录时就有很好的提示,并且还能告知系统负载情况,很有用,这里就想开起来。首先这个提示的名字叫Motd。

在ssh的配置文件/etc/ssh/sshd_config中修改PrintMotd为yes或者no来开启或者关闭。

blueImp/jQuery file upload 的正确用法(限制上传大小和文件类型)

这个插件太出名了,几乎能完成所有能想象的到的效果,包括进度条、拖拽、甚至现在已经完美支持图片视频等的处理,三个字形容就是屌爆了。最近在做上传这一部分,发现网上对于上传文件大小的限制和类型检测等的方法都不妥当,包括老外写的。blueimp提供了完整的解决方案,验证当然是有的,所以对于一个普通的上传组件来说需要下面三个组件:

[code] [/code]

大部分文章都没有包含process和validate这两个组件,前者负责处理上传过程中各个事件的管理,validate则是对验证的支持,如果不包含这两个组件,那么只能像下面这样来做一些验证:

[code]add: function (e, data) { var uploadErrors = [];

var acceptFileTypes = /\/(pdf|xml)$/i; if(data.originalFiles[0][‘type’].length && !acceptFileTypes.test(data.originalFiles[0][‘type’])) { uploadErrors.push(‘Tipo de Archivo no Aceptado’); }

console.log(data.originalFiles[0][‘size’]) ; if (data.originalFiles[0][‘size’] > 5000000) { uploadErrors.push(‘Tamaño de Archivo demasiado Grande’); } if(uploadErrors.length > 0) { alert(uploadErrors.join(“\n”)); } else { data.context = $(‘

‘).text(‘Subiendo…’).appendTo(document.body); data.submit(); }

}[/code]

那么用官方的方式可以如下

[code]

acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i, maxFileSize: 99 * 1024 * 1024, minFileSize: 5, maxNumberOfFiles: 50, messages: { maxFileSize: 'File exceeds maximum allowed size of 99MB', acceptFileTypes: 'File type not allowed' },processfail: function (e, data) { var currentFile = data.files[data.index]; if (data.files.error && currentFile.error) { // there was an error, do something about it console.log(currentFile.error); } }
[/code]

明显简洁很多。

用U盘制作MacOS安装盘

首先先吐槽一下mac 的os,什么都好,就是崩溃起来让人无所适从。好在跟win一样提供了急救和安全模式,还有给力的在线安装,之前有两次修不好用在线安装都搞定了,这次怎么都搞不定在线安装,一会是美国服务器莫名其妙断掉,用fan qiang解决掉,然后账户说地区有问题,好吧我承认一开始是美国账户,然后搞定账户地区问题后,最后加载系统安装信息又报错,最后无解,win下制作的u盘启动盘也不行,无解下只好去天才吧。十分钟就还原了,这里不得不提在有time machine备份下这么做堪称完美,但是如果没有备份,那就只能一边画圈圈去了,虽说是天才吧人家解决不了的问题也肯定是重装来一刀切的。如果TM的备份,但是实在nas上的,那么也不要指望靠恢复来修复,因为压根发现不了网络中的nas,所以最最最保险的重装办法就是在系统没崩溃时做一个u盘系统,然后小心翼翼的束之高阁,以备不时之需。另外这个u盘最好是自己电脑做,好像新旧mac之间还可能会识别不了。

回归正题,网上安装方式一大堆,不外乎叫你下载他们的dmg,这里要慎重说一下,mac的系统不安全,一点也不,而苹果官方从来不给提供dmg,所以这些所谓教程里的dmg都是人家打包好的,就跟盗版的win的iso一样,谁知道这个镜像里安插了多少后门。(赠送一句名言:如果杀毒软件有用的话,就没有黑客了)这里强烈推荐,哦,不,是一定一定要用苹果官方的方法来做u盘,方法巨简单,就是下面一句命令就搞定了,如果不知道哪里输入的话请先了解一下控制台(也叫终端,英文terminal or console)。再开始前现在app store里搜索sierra,点击安装,等下载好后会有一个安装提示出现,这时忽略它直接开始下面命令。(这个包大概占用5G,u盘确定安装好后有两个方法,找到包把它删掉,或者点击继续安装,重启后会自动删除安装包)

  1. 输入(注意后面“MyVolume”这个单词,需要替换为u盘的名字,插上后再finder里能看得到):

    [code]sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia –volume /Volumes/MyVolume –applicationpath /Applications/Install\ macOS\ Sierra.app[/code]

  2. 会要求输入密码,敲入密码是没有***这种符号出来的,感觉输入错误backspace就可以了,回车继续。

  3. 会问巴拉巴拉是yes还是no,当然yes了,不过只需要敲入“y”这一个字母即可回车继续。

  4. 显示“done”说明完工。

  5. 开机按住“option”查看u盘是不是成功了。

You need to set client_id and slot_id to show this AD unit. Please set it in _config.yml.