博文

最近的一些Python心得点

都是一些零散的东西,但是知识就是这么零散的积累起来的。 一、用dict的setdefault来给字典赋默认值,而不是去写if key not in: res = {} for i in music_tag_source: tag = res.setdefault(i.get('music_id'), []) tag.append(i.get(music_tag)) 二、批量生成拥默认值的dict,可以考虑使用defaultdict,这样的dict的任何key都是有自己的默认值的 from collections import defaultdict res = defaultdict(list) for i in music_tag_source: res[i.get('music_id')].append(i.get(music_tag)) 三、给类设置一个__slot__ 属性会导致实例化时不会自动分配 __dict__而只能设置__slot__中声明的属性 ,这样的小技巧可以用在那些写满了__getattr__的类中, class Foo(object): __slots__ = {'a', 'b'} if __name__ == '__main__': bar = Foo() bar.a = 1 try: bar.c = 2 except AttributeError as e: raise Excption('cannot set attrib c') from e 但是这东西有个奇怪的语法问题,就是你这样写是会报告语法错误的 class Foo(object): __slots__ = {'a', 'b'} def __init__(self): self.c = 1 但是你这么写就居然没问题 class Foo(object): __slots__ = {'a', 'b'} def __getattr__(sel...

最近遇到的两个JS的Tips

一个是HTML5规范的data标签,如果你想使用驼峰的话,记住是data-a-b,最后会自动变成aB,如果直接写data-aB是取不出来的,会变成ab的。 这个是写在HTML5规范中的,我想大概是因为XHTML中不不允许HTML标签有大写,所以不允许这样吧,至于驼峰估计是规则制定者的爱好了吧。 另外一个大概是JQuery的特性,如果写入在data属性的数值,取出来的时候是int,而不是str,这个特性其实挺莫名其妙的,因为这并不像html的input type=number中的元素的value属性,这个取出来一定是数值是因为我指定了它的Type是number,但是data明显可以是一个任意类型,总之,如果在jshint指定了一定要使用===进行类型判断比较的话,记得回避这个坑。

修复yum更新途中退出导致的依赖问题

请使用 yum distro-sync full 参见:http://serverfault.com/questions/681486/

Pycharm的奇葩问题之神秘消失的列名提示

之前的Pycharm好好的,结果突然某天就无法正常的在SQL语句中提示Field Name了,取而代之的是给我一大堆的语法错误提示——提示说找不到对应的Field 结果今天仔细注意了一下右下角的Event Log中的Database提示: MySQL - @192.168.0.11          8508online.*          java.sql.SQLException: Table '8508online.fake_comment_type' doesn't exist          ..... 妈蛋,原来是数据库损坏导致Pycharm无法正常的结束Field的侦测流程导致整个SQL提示都不正常了…… 修复一下这几个顺坏的表之后,世界就一切正常了

Javascript对象创建的几种方式

本文是Nicholas的《Javascript高级程序设计》6.2章的读书笔记,仅在加强记忆 工厂模式。即用一个函数来生成类的实例 function creator(name, age, job){ var o = {}; o.name = name; o.age = age; o.job = job; o.getName = function(){ return this.name; }; return o; } var person1 = creator('siglud', 10, 'Engineer'); var person2 = creator('ethlin', 12, 'Doctor'); console.log(person1.getName == person2.getName); 这种方法的很好理解,就是构造一个能返回一个类实例的函数,但是弊端有两个,一是无法用反射知道一个对象的类型,因为这个对象的类型是Object(例子中我用{}来代替);二是getName作为一个函数本来是可以复用的,但是却其实生成了两个,所以在最后的console log中打印出了false 生成器模式。原版翻译为构造函数模式,但是这个“构造函数”明显是和C语言中的构造函数不是一个东西,所以我换个说法,其本质就是把函数本身作为一个类,用new关键字来生成一个新的函数(类)对象,因为JS中函数本身也是一个对象 function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.getName = function(){ return this.name; } } var person3 = new Person('siglud', 10, 'Engineer'); var person4 = new Person('ethlin', 12, 'Doctor'); console.log(pers...

在CentOS 7上用Apache+PHP建立虚拟主机

默认的CentOS就自带了Apache,本篇主要是用系统自带的Apache来完成的 首先先新建一个配置文件 vim /etc/httpd/conf.d/site.conf 内容如下: <VirtualHost *:80> DocumentRoot /home/www ServerName siglud.com.cn     <Directory />         Require all granted         AllowOverride All         DirectoryIndex index.php index.htm     </Directory> </VirtualHost> 然后systemctl restart httpd 打开iptables的端口 iptables -I INPUT -p tcp --dport 80 -j ACCEPT /usr/libexec/iptables/iptables.init save 这个时候去访问大部分都会收到403了,原因在于selinux chcon -Rv --type=httpd_sys_content_t /home/www 如果这个时候报错 那么执行 chcon -R -h system_u:object_r:usr_t /home/www/ 之后再执行它就可以了

适用于安装了Tomato的AC66U的Shadowsocks-libev客户端

一直在找Tomato对应的optware版本的ss,但是网上到处都是针对OpenWRT的预编译版本(比如 这里 ),找遍大街都没找到对应Tomato的,不过好心人还是有的 下载地址是: http://dl.lazyzhu.com/file/Toolchain/ss-libev/1.4.8-5d7dd372fc/mips/shadowsocks-libev-openssl_1.4.8_mipsel_uclibc.zip 通过这次也终于让我知道了,原来AC66U虽然在Tomato的首页显示的是Broadcom BCM5300 chip rev 1,但是其实却是Mipsel的芯片 这个东西解压之后是四个可执行文件,没有对应的安装包 如果自己懒得写启动脚本的话,可以善用 以前的安装包 下载安装之前的包之后,把解压之后的ss-redir拷贝到/opt/bin目录替换源文件就可以了 这下终于可以如愿以偿的使用rc4-md5加密方式了 参考链接: http://www.right.com.cn/forum/thread-138582-1-1.html http://mujj.us/post/510.html