Category: Programming

  • django开发小记

    最近尝试用django开发一个叫做vmm的虚拟机管理网站。以下是我在第一次使用django开发较完整网站时学到的东西。 TIME_ZONE 首先是发现django在显示datetime时与预期不太一样,比如下午2点时页面上直接输出datetime显示为早上6点。多多少少决定和时区设置有关系。从Dash看了django的时区配置,发现在网站的settings中有TIMEZONE这一选项,默认是UTC。据文档上上默认是加拿大的时区……所以把TIMEZONE改成上海就行了。

  • jenkins小试

    在看了某公司的质量管理之后,决定自己尝试下jenkins的持续集成功能。 参考资料是《Jenkins: The Definition Guide》,这本书第一章提到了持续集成的七个阶段,很有借鉴意义。 以下jenkins的安装配置和使用参照第二章。个人使用jenkins的版本为1.55,如有和书本或者和我操作不一致的请参照你的版本。 个人使用的测试工程是 https://github.com/xnnyygn/attic ,书本中提到的game of life下载太慢而且构建不成功,就换了个自己的工程。

  • nagios和zabbix安装笔记

    nagios和zabbix都是用于监控的软件。前者我在《网站运维:保持数据实时的秘技》这本书中看到,后者是在之前杭州的某个分享会议上听小米的运维(他们的博客)了解到的。以下是我在vagrant+virtualbox的虚拟机上的安装测试。

  • 使用puppet配置本网站

    以下只是一个示例,描述LNMP使用puppet配置的大致方案,里面的用户名和密码不是真实数据。 LNMP主要包含nginx,mysql,php和网站(site,这里是blog)模块。文件结构如下: ├── manifests │   └── site.pp └── modules ├── blog │   ├── files │   │   └── wp-config.php │   ├── manifests │   │   └── init.pp │   └── templates │   └── nginx.conf.erb ├── mysql │   ├── files │   └── manifests │   └── init.pp ├── nginx │   ├── files │   └── manifests │   └── init.pp └── php…

  • 自制vagrant box的优化

    前一篇讲到自制vagrant box,本篇来讲一些优化的方法。 启动速度 box的速度受原来的虚拟机启动的影响。 我在安装debian的虚拟机完之后发现grub默认有5秒的选择时间,这可以通过修改/etc/default/grub种的GRUB_TIMEOUT为0来取消,注意修改完之后执行update-grub应用变更。 第二是启动时的MTA,据说这个邮件相关的东西会进行DNS查询所以速度比较慢。一般情况下不需要邮件,所以可以安装rcconf取消exim的服务,这样速度就快很多了。 SSH连接速度 我的box在没有优化时连接会卡在 debug1: SSH2_MSG_SERVICE_ACCEPT received 上(通过ssh -v 查看调试信息)。因为之后的Authentications that can continue 没有GSSAPI什么的,应该和GSSAPI无关。后来查到服务器端sshd(/etc/ssh/sshd_config)可能需要配置UseDNS=no,实际配置并重启服务后确实解决问题了。 顺便说一句,macosx连接ssh时可能会碰到locale的问题。这个问题很可能不是由服务器端引起的,注意本地的/etc/ssh_config,把SendEnv LANG LC_* 注释掉基本就可以了。 常用程序 因为是自制的,为了方便,自己复制了一份vim的配置,安装了默认没有的curl、tree等等。 至此,自制的vagrant box应该比原先的要好用一些,特别是启动和连接速度上。

  • 自制vagrant base box

    最近在学习puppet,自然而然地想到使用vagrant配置一些虚拟机练手。默认的vagrant的box大多都是带puppet,但是很神奇的是没有/etc/puppet这个目录,估计不是使用类似apt-get的方式安装的。解决方法之一是使用人家未安装puppet的base box,比如这里有一个列表。个人比较习惯ubuntu/debian的环境,所以试着找了几个相关的base box,但是不是很满意。另外还有一个解决方法,就是自己做base box。 虽然vagrant的文档上说不是很推荐自制base box,因为比较耗时间。但是如果你对系统管理比较熟悉的话,亲手做一下也不是特别麻烦。我参考这篇文章自己尝试做了一个基于debian-7.3.0-i386,通过aptitude安装了puppet的base box。 首先虚拟机自身的配置,内存设定不要太大,动态分配的空间不要太小,还有大部分时候音频和USB是没有用的。 理论上vagrant的base box和普通的虚拟机映射文件区别不大,只是安装系统的时候有几个地方需要注意: root password: vagrant 附加的用户名和密码 vagrant, vagrant hostname: vagrant 只安装必须的软件,大部分时候桌面环境是不需要的 安装完之后,需要增加一个admin组,把vagrant用户加入admin组,并且修改/etc/sudoers文件允许admin组用户执行sudo时不输入密码。 默认debian是没有sudo的,需要用aptitude安装,安装完之后才有/etc/sudoers这个文件。 最后aptitude安装puppet,清理一些东西之后就可以用vagrant做base box了。 做完之后加入vagrant的box列表,自己尝试启动一个,如果vagrant up成功就说明可以了。

  • [python]路由表脚本生成程序

    老实说这是老东西了,自己之前用scala写过,用ruby写过,这次是用python第二次实现,github上这种生成脚本也挺多的,自己全当是练手。 这个脚本其实就是把apnic提供的数据过滤出指定数据并解析然后生成路由表更新脚本的程序。用途相信各位也清楚,以下是自己重复造轮子的过程: 程序的主逻辑是读取apnic数据,用正则表达式过滤和解析,用解析出来的数据生成路由表修改脚本和恢复脚本。 首先是读取apnic数据。个人的方式是查找当前目录,然后脚本所在目录,如果再没有自动下载文件到脚本所在目录并返回。这里没有read on fly,即边下载边读,也没有比对并确保最新的逻辑。之后可以考虑加上。

  • NxN矩阵顺时针旋转90度

    是一个面试题,我想了好久,果然好久不做类似算法题的话会思维迟钝。题目还有一个条件是每个点用4 bytes存储,实际上是每个点是int类型的暗示,这个矩阵就是int[][]的结构。 我是先考虑点的旋转规律的,用了一点三角函数和计算机图形学的坐标变换,实际上归纳法也是可以的,只是我没找出规律。之后是实际编码,比想象中要麻烦一些,和参考答案也是有点不同的。 首先说下变化规律,计算机坐标系下(x, y)点顺时针旋转90度后结果是(y, n – x),通过多次数据归纳也可以做,以下是图形学上的证明: ——————–> | (x, y) | | | (y, n – x) | v

  • python linux administrator学习小结

    看《Python Linux Administrator》这本书时,我并不是按照从头到尾的方式读的,而是看了一遍目录,选择性地读了部分章节。以下是我选择的章节: GUI 有GUI肯定更直观一些,特别是在一些报表展示上。书中提到主要是三种方式,基于pygtk/wxPython的桌面程序,基于cursers的CLI方式和基于django的web方式。个人觉得web方式综合下面比较好一些,而且django并不比想象中要难。我也把django作为定期学习的一个候选。 network unix/linux下网络相关命令很多,python也有很多针对网络的库。书中介绍了从底层socket,到上层httplib/ftplib/paramiko(sftp),urllib/urllib2,xmlprclib/Pyro和强大的twisted。针对不同协议场景用不同的库,前提是你要了解足够多的网络库。 operaton system 通用的有platform,可以用来判断操作系统。接下来都是一些指定系统下的库,比如mac的dscl/asr,windows的zenoss,还有libvert, libvirt, cobbler, virt-factory, func等。这块和系统相关,个人认为要根据实际环境选择性的学习。 package manager 较多篇幅介绍了easy_install。同时提到了buildout, virtualenv, epm。个人对virutalenv有点兴趣,因为可以多版本python共存。 demo 一些使用python管理系统的实例。和之前介绍内容可能有交集。个人感兴趣的是python查询dns,还有python管理ldap等。 data 主要是操作文件。比如常用的os模块,还有glob,shutil,filecmp。用于产生摘要的hashlib等。更多的在python标准库文档中。

  • python标准库学习笔记3

    以下内容来自这里的学习。 类型判断 理论上动态语言不建议判断类型,不过python还是有提供判断的方法。 import types type(1) == types.IntType isinstance(1, int) 第一种是使用types模块,第二种是使用内建的isinstance方法。 decimal 因为Java有BigInteger和BigDecimal,所以不会陌生。 import decimal decimal.getcontext().prec = 7 # set precision to 7, default is 28 decimal.Decimal(1) # create from int decimal.Decimal(‘3.14’) # create from string decimal.Decimal(1) / decimal.Decimal(7) 默认decimal精度为28,可以通过getcontext()修改配置。带小数的建议使用字符串创建,否则你用decimal.Decimal(3.14)试试看。 分数 就是那种几分之几的分数。 import fractions fractions.Fraction(16, -10) # – 8/5 fractions.Fraction(decimal.Decimal(‘1.1’)) # 11/10 fractions.gcd(60, 56) #…