python中 if __name__ == ‘__main__’: 的作用

在很多Python代码中,在代码的最下方会看到 

if __name__ == ‘__main__’:

 对于这段代码,以前只知道是这么用的,也没有深究具体的作用。

在理解这个语句的作用前,需要知道的是,一般的Python文件后缀为.py,其可以拿来执行,也可以用来作为模块使用import导入。当Python解析器读取一个源文件时它会执行所有的代码。在执行代码前会定义一些特殊的变量。如果解析器运行的模块(源文件)作为主程序,它将会把__name__变量设置成”__main__”。如果只是引入其他的模块,__name__变量将会设置成模块的名字,模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。

在代码下方添加 

if __name__ == ‘__main__’:

  的主要原因是有时你需要你写的模块既可以直接的执行,还可以被当做模块导入到其他模块中去.通过检查是不是主函数,可以让你的代码只在它作为主程序运行时执行,而当其他人调用你的模块中的函数的时候不必执行。来看下案例:

我们先创建一个这样的文件:

# Filename: using_name.py print __name__

执行后的输出内容是:

D:\>python using_name.py __main__ D:\>python Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit ( Intel)] on win32 Type “help”, “copyright”, “credits” or “license” for more information. >>> import using_name using_name

我们再来修改文件内容如下:

[…]

Linux学习笔记:文件的颜色

在使用ls 命令时,可以发现不同类型的文件,颜色不同,具体每种颜色代表哪类文件?今天就一起来学习下。

默认情况下,在命令行中输入

dircolors

 即可了解到具体的配置信息:

[root@localhost ~]# dircolors LS_COLORS=’rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:’; export LS_COLORS

配置信息中(rs、di、ln等)对应的是不同的不同类型的文件,常见的内容为:

di Directory fi File ln Symbolic Link pi Fifo file so Socket file bd Block (buffered) special file cd Character (unbuffered) special file or Symbolic Link pointing to a non-existent file (orphan) mi Non-existent file pointed to by a symbolic link (visible when […]

自恋的娃

发信人: smilemm (smilemm), 信区: Joke标 题: 自恋的娃发信站: 水木社区 (Mon Aug 29 09:14:29 2016), 站内

在姥姥家呆了一个暑假,开学了,哭着喊着要姥姥,想天天和姥姥在一起。我说你这么淘气天天去折腾姥姥,时间久了姥姥就烦你了。再喜欢的东西天天见也会烦。你那么爱看小马宝莉天天看不是也不爱看了吗。大圆想了一下说,“可我还是喜欢天天照镜子。”—

※ 来源:·水木社区 http://www.newsmth.net·[FROM: 123.127.171.*]

Linux学习笔记:文件的权限

Linux 是一个多用户、多任务的系统,常常有多人同时使用一台机工作,为了保护每个人的隐私权,“文件所有者”的角色就显得相当重要了。当Linux用户登录系统之后,就会携带一个用户身份(User ID,UID)和一个用户组身份(Group ID,GID),相当于自己的名片。当需要访问文件或程序时,刷一下名片就能知道是否能读、写、执行了。。

在根目录下输入

ls -l

 可看到如下信息:

[root@localhost /]# ls -l total 32 lrwxrwxrwx. 1 root root 7 Aug 18 21:27 bin -> usr/bin dr-xr-xr-x. 4 root root 4096 Aug 26 06:10 boot drwxr-xr-x. 20 root root 3160 Aug 27 23:44 dev drwxr-xr-x. 74 root root 8192 Aug 28 00:39 etc drwxr-xr-x. 3 root […]

漫谈 JavaScript 方言与派系

JavaScript 近几年的表现十分优秀, 语言还是那个语言, 可给人的感觉已经有了很大不同. 前端摩尔定律里, 每18个月前端的难度就上升一倍, 现在看来似乎也不是没有道理.

按照前端摩尔定律, 自我接触 JavaScript 以来, 前端的难度已是一开始的16倍. 从 jQuery 一统天下, 到 Vanilla JS 的崛起; 从第二次浏览器大战初出茅庐便震惊世界的 Chrome, 到现在坐拥浏览器份额宝座的Chrome; 从在浏览器里都没人愿意多看一眼的编程语言, 到现在哪都能用的万能胶水语言, JavaScript 经历了太多太多, 而它的传说似乎才刚刚开始.

这篇文章我将谈谈自己对 JavaScript 各种方言的感想以及对于现在前端生态圈割裂为几个派系的态度, 文章比较长, 但内容不算特别深入, 权当抛砖引玉.

语言分化

原本的 JavaScript 太过于落后, 它得用火箭发射的速度才能赶上那些比它优秀的语言. 现如今, JavaScript 拥有着全世界最强的生态环境和海量的开发人员, 而且和那些老旧的语言不同, JavaScript 的更新速度越来越快, 方言和转译工具也越来越多. 作为使用 JavaScript 作为主力语言的开发者, 我在感到欣慰的同时, 又十分恐惧——变化太快了.

这些年, 且不说各种编程范式和架构模式上的变化, 光是 JavaScript 的语法就发生了很多变化. […]

Linux学习笔记:用户及用户组

Linux用户只有两个等级:root及非root。Linux中还有一部分用户,如:apache、mysql、nobody、ftp等,这些也都是非root用户,即普通用户。Linux的权限实际是上不同用户所能访问的文件的不同产生的假象。而这些假象的造成,还要涉及到另外一个概念:用户组

一个用户至少要属于一个用户组 一个用户可以属于多个用户组

用户组存在的原因主要还是方便分配权限。而用户本身和权限的差别不是很大,各个用户之间主要的不同是:

是否拥有密码 home目录(普通用户可以有一个以自己用户名命名的home目录,存放的地址是/home/username,root用户的home目录是:/root) shell

像nobody这样用来执行Nginx的工作进程的用户,一般不分配密码和shell,甚至连home目录都没有。

为什么不分配密码?如果设置了密码,程序无法自动使用。由于不会有人使用这个用户登录系统,所以就没有必要分配shell。(备注:其实严格上说是有分配shell,只是分配的shell是/sbin/nologin这个特殊的shell,没有任何其他功能,主要功能是防止你登陆。)

所有用户都可以通过查看/etc/passwd查看。以下为我的系统中的用户信息:

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:997:995:User for polkitd:/:/sbin/nologin tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin qw:x:1000:1000:qw:/home/qw:/bin/bash

文件的每一行代表着一个用户,每一行由冒号“:”分割成7个字段,其结构如下:

[…]

字符级机器翻译

最近利用神经网络的机器翻译很火,我认为NMT(Neural machine translation)能有所发展的原因有以下几点:

数据丰富,WMT15算是与ImageNet同样量级的数据,是训练大型神经网络所必须的。 Bahdanau提出的Attention关系将机器翻译的性能推进一大步。 很明显能产生经济效益,市场巨大。 存在很多问题,即研究前景。毕竟相对CNN给图像识别带来的巨大提升,NMT的提升并不是很明显。

我针对的是其中的一个问题:规避大词典。原来都是先把一个数据集中所有单词找出来,把最常用的一些(如90%)做成一个大词典,显然这是冗余的,words和word完全没必要区分。动不动就是50K的单词表,非常耗内存,在像Czech这类语言上更加不行。关键是冗余不优雅。很多研究者都注意到这个问题:

subword,我觉得还是不够自然。 Hybrid Word-Character Models,相当于把未知的词训练成RNN小单元,据说华为很早就申请专利了。我表示,不能有word。 Junyoung Chung提出的不需要显式分隔的模型。提出bi-scale的RNN,我觉得很有意思,但我有个疑问,这跟base的RNN有什么区别?论文中也显示,确实差不多。我不知道为什么性能那么好。由于没有训练时间、训练所用内存等更多信息我无法作出判断。 还有Wang Ling提出的,但是完全不是NMT,需要借助IBM model来对齐和分层训练,而且效果不好。

综上,利用RNN编码一个单词是比较合理自然的想法。可以说人人都能想到,关键是给出高效可行的实现。我实现了个高效纯字符级的机器翻译——Deep Character-Level Neural Machine Translation(DCNMT)。但是有个缺点,需要知道分隔符,也就是空格。不要太苛刻了,对于人来说,阅读“itisalsomoredifficultforhumantoreadwithoutthedelimiter”这种也是不方便的。而且对于中文日文这种没有分隔符的语言,没有必要使用大词典,直接上字符级,因为句子短啊,不存在训练难的问题。所以先将就着用吧。总得来说,DCNMT有几个优点:

所需训练循环周期比词级的少,在EN-FR上,只要遍历4次数据就差不多了,而词级大概要5次,这很容易get。但是因为更新速度慢一点,导致所花时间差不多。 内存用的不多。但还是很多,因为theano为了计算快,RNN的中间结果是缓存的,导致有5个RNN的DCNMT用了很多内存(跟词级的差不多)。但这容易解决,见chen的paper还有deepmind的一篇。 能翻译错拼的单词,在论文中我只给出了几个例子,后续给出定量分析。我觉得这是一个diǎo点。

详见论文(An Efficient Character-Level Neural Machine Translation),我也不玩虚的,代码和训好的模型都在github上,反正我也没有毕业问题,管他能不能发呢。

总的架构看图:

我也很佩服自己,怎么能写出这么复杂结构的代码,写完之后改了3个bug(我太tm diǎo了)。多亏了巨人Bahdanau等写的好框架Blocks和examples。我的偶像啊!很高兴,他也star了我的实现。仔细看,有5个RNN子模型,其实跟bi-scale思想类似,先把组成词的字符用RNN编码后,只向上传最后的编码(相当与词级模型的embedding),而不是原来的全部(字符的embedding),因此能节约Encoder和Decoder的内存,也容易训练。 整个流程应该很清楚吧,不清楚可以看论文。。。

训练模型

被爱可可老师发到微博之后,关注的人一下子多了点,有点诚惶诚恐。我觉得很多哥们会在训练的时候遇到问题。如有哥们遇到数据集问题,有哥们遇到版本问题(TypeError: __init__() got an unexpected keyword argument ‘children’)。这是我写这篇博客的原因,我希望能实现更好的实用的模型。几个注意点:

必须先手动下载对应的数据啊,就在wmt15上,还可能要对validation set和test set做一些处理。可以先选数据量小如en-fi的测试测试,一测就是1周。然后就方便了运行Github仓库中的train.sh就行了。 务必保持库的更新啊,Blocks更新还算快的,API随时改。我会尽量与最新保持兼容,而不兼顾老版本。 如果还有问题,请在评论中提问。 测试模型

我训练了几个模型,由于机器和时间受限,没来得及训练其他模型,详见论文和github。我希望有人能帮忙训练更深的模型。我不知道这个模型的上限是多少。

如果对机器翻译不敢兴趣,也可以从中学点什么。这个代码中,用了GRU,stacked GRU,stacked Bidirectional […]

HTTPS 升级指南

上一篇文章我介绍了 HTTP/2 协议 ,它只有在 HTTPS 环境才会生效。

为了升级到 HTTP/2 协议,必须先启用 HTTPS。如果你不了解 HTTPS 协议(学名 TLS 协议),可以参考我以前的文章。

《HTTPS 协议概述》 《图解 HTTPS 协议》 《HTTPS 协议的七个误解》 《HTTPS 协议的延迟有多大?》

本文介绍如何将一个 HTTP 网站升级到 HTTPS 。

一、获取证书

升级到 HTTPS 协议的第一步,就是要获得一张证书。

证书是一个二进制文件,里面包含经过认证的网站公钥和一些元数据,要从经销商购买。

GoGetSSL SSLs.com SSLmate.com

证书有很多类型,首先分为三种认证级别。

域名认证(Domain Validation):最低级别认证,可以确认申请人拥有这个域名。对于这种证书,浏览器会在地址栏显示一把锁。 公司认证(Company Validation):确认域名所有人是哪一家公司,证书里面会包含公司信息。 扩展认证(Extended Validation):最高级别的认证,浏览器地址栏会显示公司名。

还分为三种覆盖范围。

单域名证书:只能用于单一域名,foo.com的证书不能用于www.foo.com 通配符证书:可以用于某个域名及其所有一级子域名,比如*.foo.com的证书可以用于foo.com,也可以用于www.foo.com 多域名证书:可以用于多个域名,比如foo.com和bar.com

认证级别越高、覆盖范围越广的证书,价格越贵。

还有一个免费证书的选择。为了推广HTTPS协议,电子前哨基金会EFF成立了 Let’s Encrypt,提供免费证书(教程和工具)。

拿到证书以后,可以用 SSL […]

IMO2016 趣题:Geoff 的青蛙

2016 年 IMO 的第 6 题(也就是第二天比赛的第 3 题)非常有趣,这恐怕算得上是近十年来 IMO 的所有题目中最有趣的题目之一。平面上有 n ≥ 2 条线段,每两条线段都有一个交点,并且任意三条线段都不交于同一点。 Geoff 打算在每条线段的其中一个端点处放置一只青蛙,并让每只青蛙都朝向它所在线段的另一个端点。然后, Geoff 将会拍 n – 1 次手。每次拍手时,每只青蛙都立即向前跳到它所在线段的下一个交点处(青蛙们在跳跃过程中始终不会改变方向)。 Geoff 希望巧妙地安排初始时放置青蛙的方法,使得在整个过程中,任意两只青蛙都不会同时到达某个相同的交点。这个题目有两个小问。

证明:当 n 为奇数时, Geoff 一定有办法实现他的要求。 证明:当 n 为偶数时, Geoff 永远无法实现他的要求。

 

 

 

 

 

 

 

 

 

下图是 n = 5 时的其中一种可能的线段布局,以及其中一种满足要求的青蛙放法。你可以试一试, n = 5 时的其他放法就不见得满足要求了,而 n 为偶数时的任何一种放法都是不满足要求的。

[…]

Linux学习笔记:Linux的桌面环境

在了解桌面环境之前,必须要知道的是Linux本身没有图形界面,本身只是一个基于命令行的操作系统。具体实现是通过如下的机制进行实现的:

左边是Linux系统的架构,右边是Windows系统的架构,可以看到Linux比Windows中间多了一层,这就导致Linux在图形界面的性能要比Windows慢。但是苹果公司的 MAC OS (Unix系统)却是个例外,因为苹果公司在X Server与X Client之间所采用的协议是二进制,而其他Linux系统均是采用的纯文本。

在Linux系统中,可以在命令行系统中输入

startx

 ,X并不表示具体的软件,指的是协议。x.org则是实现x协议的服务器,相当于实现实现了HTTP协议的Apache、Nginx等,而各种X client 好比是不同的交互界面。主流的交互界面有:GNOME、KDE、XFCE和LXDE。各种不同桌面环境的区别:

GNOME 目前较流行的桌面环境了,主流的Linux发行版,如Ubuntu、CentOS等都以GNOME为默认桌面,GNOME 3的界面也非常的绚丽,操作手感有点类似与MAC OS X。 KDE 与GOME类似,但是界面等操作手感更像Windows,KDE的衰败是从KDE 3 升级到KDE 4的时候,中间出现了很多的不稳定版本,导致一些忠实粉丝转头到了其他阵营。 XFCE 相比GNOME和XKDE更加轻量,是Unix模块化、重用代码理念的践行者。其中包含各种功能的组件,各个组件划分成不同的包,用户可以自由选取需要的安装使用。 LXDE 比起其他桌面环境,LXDE占用更少的CPU、内存,是为上网本、移动设备、旧机器特别设计的轻量桌面环境。

了解了各个桌面系统的不同,其中又涉及到一个新的概念点,QT与GTK+,其中KDE是基于QT开发的,而GNOME、XFCE、LXDE均是基于GTK+进行开发的,两者有什么区别?

GTK+ GTK+使用C语言开发,用C写面向对象所比较复杂艰涩,而且充满大量宏,使用和除错都不是很容易。虽然在思想上比较先进,但是使用起来麻烦。 QT Qt是一个跨平台的C++图形应用程序框架,Qt是诺基亚的一个产品。 相比GTK+,Qt的最大优势面向对象,Qt的良好封装机制使得 Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。

GTK+和QT相当于Windows上的MFC。另外还有一个概念是Xlib。Xlib实际上是对底层X协议的封装,可通过该函数库进行一般的图形输出。由于Xlib的接口太原始而且复杂,因此一般的图形程序选择其他高级一些的图形库作为基础。所以才有了GTK、QT 等。Xlib、QT、GTK直接关系如下图:

QT是直接使用xlib库的,GTK不能直接使用xlib,而是使用更低层的函数库GDK和Glib。这种结构使得Gtk可以更方便地移植到其它系统上,或使用与XWindows系统无关的图形库。

其他参考资料:

https://wiki.archlinux.org/index.php/Desktop_environment_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) https://zh.wikipedia.org/zh/GNOME https://zh.wikipedia.org/wiki/KDE https://zh.wikipedia.org/wiki/Xfce https://zh.wikipedia.org/wiki/LXDE https://zh.wikipedia.org/wiki/Qt https://zh.wikipedia.org/zh/GTK%2B

Related posts:

微格式:让网页更加语义化 在Windows上安装配置Redis及Python使用 微信官方UI库:WeUI […]

Category

Archives