django advanced

本文记述我在使用Django时遇到的两个问题,两次被坑的过程,也是两次进步的过程。

qs[m:n].update()

业务我就不多说了,给queryset(总数可能有十万之多)中的部分(以万记)更新某个字段(或者说分配到某个订单),由于要保证互斥,同时希望序列号连续(对应实体的东西,方便分取)所以使用select_for_update(),当然任何使用锁的地方应该确保尽可能少锁,同时尽快释放。

问题出来了,如此多的数据,如果循环更新,锁的时间将会比较长,可是Django不支持切片后更新。办法:

qs[m:n].update()
1
2
3
qs = Models.objects.filter(...).select_for_update().order_by("id")
rows = qs.filter(id__lt=qs[count:count+1].get().id).update(...)
assert(rows == count) # TODO: remove

qs.distinct().aggregate()

相信熟悉SQL的同学对distinct一定不陌生,加上MySQL后端,就出了这个问题。由于冗余条件的存在,所以qs里面出现了重复数据,这里就不赘述了。(注:当时使用的是Django==1.5.8,django不支持distinct(field)) So:

qs.distinct().aggregate()
1
2
3
qs = Models.objects.filter(...)
qs = Models.objects.filter(pk__in=qs) # distinct
sum_dict = qs.aggregate(...)

没错,就是多操作了一步。解决方法就是这么简单,可是这个重复数据并不总是有,让我头疼了好一阵子,不过还是被我给揪出来了。

总结

第二个问题环境:MySQL数据库后端 + Diango<1.6。当然如今我们都升1.7了,不过我还是记录下。

advanced linux

本文介绍几个Ubuntu进阶的操作。

先晒晒我信攥的电脑

  • CPU:E3-1231 V3 (3.4GHz*8 志强四核八线程)
  • 内存:Kingston 8G (骇客神条 1866MHz)
  • 主板:ASUS B85-PLUS R2.0
  • 显卡:NVIDIA GeForce GT 730

CPU,内存没得说,显卡很一般,Linux用完全足够了,如果想超频主板可用Z97K,我不超频也足够了

显卡驱动

志强CPU不集成GPU,所以需要独立显卡,显卡驱动是避免不了的。更多关于显卡的介绍,推荐

官方闭源驱动

官网按型号下载驱动,然后进入命令行(tty1-6),关闭Xorg,sh装驱动,然后启动Xorg。

1
2
3
sudo service lightdm stop
sudo sh NVIDIA-Linux-x86_64-346.35.run
sudo service lightdm start

包管理器直接装

sudo apt-get install nvidia-331 nvidia-prime nvidia-settings 331是我装时候仓库中最新的。

装完后,不测试下?

工具: glxgears 奇怪,人家都说是评分多少万,为啥我的几乎定在60FPS? 原来是设置里开了,垂直同步,取消后评分正常。

GRUB2 引导

(Ubuntu 14.04下)grub引导选项主要是由/boot/grub/grub.cfg控制的,不过这个文件是自动生成的,我们一般编辑/etc/default/grub,然后通过命令sudo update-grub应用改动。

常用选项

  • 启动顺序 GRUB_DEFAULT 默认是0
  • 延时时间 GRUB_TIMEOUT 就是显示grub菜单的时间(单系统默认不显示,开机按Shift即可。)
  • 想开机进命令行修改 GRUB_CMDLINE_LINUX_DEFAULT="text"
  • 添加内核参数 GRUB_CMDLINE_LINUX="" 添加你想加的参数,如reboot=a

无论修改什么,都别忘了修改后更新grub!

新内核

说到内核,你知道你的内核版本么?还记得命令uname -r吧。

编译内核

我编译过内核,那是因为第一次主板有问题,关机后自动重启,我由于设备教新,所以怀疑驱动等问题。按照wiki我尝试修改了CPU选项和电源选项,不过后来确认是主板问题,跑华硕售后,确认主板有问题,然后换了主板。我不敢大言不惭教大家编译内核,我想说的是新内核源里就有,用新内核不一定需要自己编译。还有我想说的是编译过程比较久,我3.4GHz*8的主频,需要1h这么久。

装新内核

就不教大家装包了,大家都会。不过我想提醒大家的是,装新内核时有几个包需要统一装,不要漏了哪个。

新内核的四个包
1
2
3
4
apt-get install linux-headers-x.xx \
linux-headers-x.xx-generic \
linux-image-x.xx-generic \
linux-image-extra-x.xx-generic

四个包,x.xx是版本号,自行替换。

目前源里版本更新到3.16.0-31了,Linux内核最新版本已经到4.0了,告诉大家个好消息,4.0版本以后,Linux再也不要求大家重启了,厌倦了Windows反复重启的可要牢记哦。

总结

最后再次提醒大家修改grub设置后,不要忘记update-grub哦。

assembled computers

欣赏台式机的性能,所以一直计划这亲自攥台PC,话说我真不懂攥机,权当是分享下“失败”的经验吧。

配单

  • CPU:E3-1231 V3 (3.4GHz*8 志强四核八线程)
  • 内存:Kingston 8G (骇客神条 1866MHz)
  • 主板:ASUS B85-PLUS R2.0
  • 显卡:NVIDIA GeForce GT 730
  • 硬盘:希捷1T,7200转 (机械硬盘)
  • 键鼠:DeLUX竖式鼠标, PERIXX分离式键盘 (有线,人体工学)
  • 电源:航嘉400W

我曾想过,用i5集显(i5性价比较高,所以没选i7),不过最后还是用E3独显了。(E3不集成GPU,所以需要配独显)

问题

我新组的电脑装了Ubuntu,然后无法关机,关机后等3s自动重启。。。

起初,我怀疑是Linux系统问题,内核都编译了(主要修改CPU和电源相关选项,CPU果然给力,一个小时内就可编译完毕),后来用WinPE试,还是关不了,然后用Windows试,装了官方驱动,还是关不掉...

几经折腾,最后断定是主板问题,跑了趟赛格,更换了主板(还好没有超过一个月包换)。 一切正常了。。。

总结

用Linux容易,做Linux不易,且行且珍惜。。。