Django community: RSS
This page, updated regularly, aggregates Django links from the Django community.
-
Django 1.6 alpha 1 released
new version of Django 1.6 alpha 1 release notes -
Virtualenv+Django+uWSGI+Nginx部署方式备忘录
Nginx0.86后的版本内置了uWSGI模块,用它部署Django应用性能不错,而且很省内存,所以一年前尝试Virtualenv+Django+uWSGI+Nginx这种组合方式去部署2goO网站,因为那时第一次看到uWSGI的测试结果,很兴奋,什么材料都没有看,直接下载包安装上在服务器上折腾了,过程中竟然遇到了很大的挫折,相比个人感觉fastCGI难了不少,一时不了解里面的机制,所以就放下了,终于到了2012年的年底,趁着春节,有点时间,啃了一夜,终于搞定了。以下作为笔记以备忘。Virtualenv可以建立一个独立的Python虚拟环境,使Python环境不受另一个环境的干扰。我喜欢这种方式去部署Django应用,因为每个Djanog应用所引用到的第三方库是不完全相同的,隔开后,让环境免遭污染。Django 1.3以后完全支持wsgi协议,新建的项目myproject文件夹里就有一个wsgi.py文件,我没有修改里面的东西,直接在虚拟环境里安装uWSGI,使用它和wsgi.py文件桥接即可。安装步骤:在虚拟环境里安装uWSGI: pip install uwsgiVirtualenv的安装和建立环境参考之前写的:《Django环境搭建常用的工具及做法》 http://2goo.info/blog/panjj/Django/2011/06/05/521完整步骤如下:#先安装pip工具apt-get install python-pip #再安装virtualenv包pip install -U virtualenv#直接到/home/www-data/目录下建立一个twogoo的虚拟环境cd /home/www-data/virtualenv --no-site-packages --distribute twogoo #进入建立好的twogoo环境 安装项目所需的python库,比如uWSGI PIL psycopg2 Django South等等cd twogoo source bin/activate#在虚拟环境twogoo里安装uWSGIpip install uwsgi#安装其他库pip install Django==1.4.5pip install South...这时候,/home/www-data/twogoo/ 这个文件夹就是我建立的虚拟环境了,twogoo里面的结构如下:twogoo..lib..local..include..myproject #我建立的项目....myproject......wsgi.py......settings.py......urls.py...... .......static....media....templates....manage.py安装uwsgi后,需要简单的配置启动参数,这次使用ini文件配置,当然可以使用其他的文件格式,参考官方文档吧。我在twogoo文件夹里建立一个配置文件 twogoo_uwsgi.ini,twogoo_uwsgi.sockcd /home/www-data/twogoo/ touch twogoo_uwsgi.initouch twogoo_uwsgi.sock这时twogoo里面的结构如下:twogoo..lib..local..include..myproject #我建立的项目....myproject......wsgi.py......settings.py......urls.py...... .......static....media....templates....manage.py..twogoo_uwsgi.ini #刚才建立的配置文件..twogoo_uwsgi.sock #配置文件用到的sock文件twogoo_uwsgi.ini 文件里的内容如下:[uwsgi]vhost = false #注意多个项目的时候不能true哦,否则多个项目都共用这个配置参数了,这个折腾我半宿plugins = python#socket = 127.0.0.1:9000 #这个注释掉了,我采用sock的方式,当然你可以使用端口的方式,nginx配置的时候修改一下即可socket = /home/www-data/twogoo/twogoo_uwsgi.sock #配置文件用到的sock文件master = trueenable-threads = trueworkers = 6 #进程数wsgi-file = /home/www-data/twogoo/myproject/myproject/wsgi.py #这是项目wsgi.py文件的路径virtualenv = /home/www-data/twogoo/ #twogoo虚拟环境的路径chdir = /home/www-data/twogoo/myproject #twogoo项目的路径配置文件已经好了,在twogoo_uwsgi.ini(/home/www-data/twogoo/)同级目录下可以启动uwsgi了:nohup uwsgi --ini twogoo_uwsgi.ini&好,ctrl+c tail -f -n 1000 nohup.ou 可以看到uwsgi是否启动成功了。剩下就是配置nginx,让nginx代理uwsgi进程:我那时是通过apt-get安装nginx的,默认路径在/etc/nginx/下,配置步骤:新建twogoo.conf文件,并配置参数touch /etc/nginx/sites-enabled/twogoo.confnano /etc/nginx/sites-enabled/twogoo.conf配置参数如下:server { listen 80; server_name 2goo.info www.2goo.info; access_log /home/www/twogoo/logs/access.log; error_log /home/www/twogoo/logs/error.log; root /home/www/twogoo/myproject; index index.html index.htm; charset utf-8; location ~ ^/static/ { root /home/www/twogoo/myproject/; expires 24h; access_log off; } location ~ ^/media/ { root /home/www/twogoo/myproject/; expires 24h; access_log off; } location / { uwsgi_pass unix:/home/www/twogoo/twogoo_uwsgi.sock; # uwsgi_pass 127.0.0.1:9000; include /etc/nginx/uwsgi_params; proxy_http_version 1.1; } }配置完成了,重启nginx:/etc/init.d/nginx restart(完) -
A Social Hub for Django Developers
Djanguru is a Social Hub for Python and Django Developers - a place to meet the experts. -
Navigation dynamique avec Backbone.js sur une carte OpenStreetMap
Il y a quelques jours semaines, nous avons vu comment créer une page spécifique dans Mezzanine pour afficher une carte grâce à OpenStreetMap. Nous allons poursuivre l’exercice et en faire une application un peu plus puissante. Notre but : permettre à un administrateur de rentrer lui-même différents « lieux » ou points intéressants, pour qu’ils puissent s’afficher sur la carte. Chaque point est cliquable, et dispose de sa propre url. Pour pousser un peu le raffinement, nous utiliserons Backbone.js pour que la navigation soit dynamique, et éviter la nécessité de recharger toute la page à chaque fois. Des p’tits points… des p’tits points… encore des p’tits points ! Nous allons créer une application Django qui contiendra le code spécifique à la gestion de notre carte. Commençons par le modèle : # models.py from django.utils.translation import ugettext_lazy as _ from django.db import models from mezzanine.core.fields import RichTextField class PointOfInterest(models.Model): name = models.CharField(_('name'), max_length=50) description = RichTextField(_('Description'), null=True, blank=True) lat = models.FloatField(_('Latitude')) lng = models.FloatField(_('Longitude')) slug = models.SlugField(_('Slug')) class Meta: verbose_name = _('Point of interest') verbose_name_plural = _('Points of interest') def __unicode__(self): return self.name Rien de trés compliqué jusque là ; chaque « lieu » dispose d’un titre, … -
Navigation dynamique avec Backbone.js sur une carte OpenStreetMap
Il y a quelques semaines, nous avons vu comment créer une page spécifique dans Mezzanine pour afficher une carte grâce à OpenStreetMap. Nous allons poursuivre l'exercice et en faire une application un peu plus puissante. Notre but : permettre à un administrateur de rentrer lui-même différents « lieux » ou points intéressants, pour qu'ils puissent s'afficher sur la carte. Chaque point est cliquable, et dispose de sa propre url. Pour pousser un peu le raffinement, nous utiliserons Backbone.js pour que la navigation soit dynamique, et éviter la nécessité de recharger toute la page à chaque fois. Des p'tits points… des p'tits points… encore des p'tits points ! Nous allons créer une application Django qui contiendra le code spécifique à la gestion de notre carte. Commençons par le modèle : # models.py from django.utils.translation import ugettext_lazy as _ from django.db import models from mezzanine.core.fields import RichTextField class PointOfInterest(models.Model): name = models.CharField(_('name'), max_length=50) description = RichTextField(_('Description'), null=True, blank=True) lat = models.FloatField(_('Latitude')) lng = models.FloatField(_('Longitude')) slug = models.SlugField(_('Slug')) class Meta: verbose_name = _('Point of interest') verbose_name_plural = _('Points of interest') def __unicode__(self): return self.name Rien de trés compliqué jusque là ; chaque « lieu » dispose d'un titre, d'une description, et de coordonnées géographiques. L'activation du module d'admin est … -
最近的感悟
现在已经进入移动互联网时代,传统的框架新技术的引进也许也已经达到了顶峰,比如Django,Ruby on Rails...这些框架是否适应这个时代了呢?我也常想过这个问题,也尝试使用Django做一些后端服务的处理,发现也不是很难用,只能说可用,但不是最佳的方案。后端服务的开发,可能更偏向于轻量级的东西,不限于约定性的东西,它要求的灵活性和性能要高些,我觉得哪怕使用java的servlet+jdbc,都比用Django更适合。我不知道一个码农从事了某方面的领域一段时间后,是不是就受到该领域的技术所蒙蔽?嗯,我最近正是搞java方面的工作,是android的后端开发。为什么说servlet+jdbc更适合做移动互联网的后端开发框架呢?因为移动互联网的后端服务,高性能的密集计算之类的东东需要在服务器上处理,而不便交给终端,再者数据形态变动性也很大,随时有修改的可能,比如表结构,表关联的变动等等,而ORM处理上就显得有点吃力了。SQL语句可能来得更直接点。当然这个时代传统的框架,也不是一无是处,他们依然保持快速开发的优势,特别对web层面的开发,使用他们,那是爽歪歪...而处理后端的服务,多数集中在json的输出,数据层和逻辑层的处理,他们照样能干,而且开发效率上依然很快。等产品发展壮大了,他们性能或灵活性跟不上,再换也是可行的。 -
Djangojobs.Net
Free python django job posting opportunity. Post a django job for free. A job post for 30 days on DjangoJobs.Net ... -
Django Cheatsheet updated for 1.5 version
django 1.5 updated cheatsheet provided by revsys -
Django for Web Prototyping
Or how to use the benefits of Django template system during the PSD to HTML phase -
Get some eye balls rolli’n(g)…..via…..bloggi’n – (An Infographic)
Yes you can get some eye balls rolli’ng via bloggi’ng as companies who create, optimize and promote their blogs get 55% more traffic and 70% more leads than those who don’t. As many say, content is king, but it’s what you do with it after that will make all the difference.Even if you have loyal followers, generating traffic to your blog will require some work on a consistent basis. To create visibility for your content, you’ll have to promote it after you click on the publish button. Infographic X’plained Distribution Channels After publishing your blog articles, you should systematically distribute your content through several channels. The exact channel(s) which you should use will depend on your target market. Knowing exactly who you’re trying to reach and where they are on the web will make the process much more efficient. Social Media The most obvious social media platforms to distribute your content are the big social media sites, but don’t restrict yourself to these if your market hangs out somewhere else on the web. Facebook has more than a billion monthly active users (source: Facebook.com) Twitter has over 200 million monthly active users (source: Wikipedia.com) Google+ has more than 135 million … -
django-homeautomation
Django project to help control and integrate home automation deployments -
Learn Python The Hardway Tutorials
Well structured free python course for all python django lovers -
Mezzanine et OpenStreetMap sont dans un bateau
Je l'ai déjà écrit plus tôt : Mezzanine est un chouette projet. Toujours dans l'optique de jouer avec ce bel outil, je me suis assigné la tâche d'afficher une joli carte quelque part. Comme ça, juste parce que. Voyons comment faire. Parlons cartographie À peu près tout ce que je sais sur la cartographie (c'est à dire le strict minimum, je l'avoue), je l'ai appris durant les rencontres Django 2012, lors de l'excellente introduction à ce noble art par Mathieu Leplatre. De quoi avons nous besoin pour afficher une carte interactive, sans toutefois passer par l'hégémonique Gogole ? Simple : des données cartographiques ; des tiles, rendu de ces données sous forme d'images ; un serveur de tiles ; une librairie de rendu côté client ; Si l'on souhaitait un rendu particulier, ou l'affichage de données spécifiques (issues d'un projet Open-data, peut-être ?), on pourrait créer nos propres tuiles grâce à TileMill, outil fort bien conçu qui permet de styler et d'exporter des cartes grâce à une syntaxe proche du CSS. Mais nous ne pousserons pas la perversion jusque là, et nous contenterons de tuiles existantes. Les données cartographiques seront donc gracieusement fournies par OpenStreeMap, base de données cartographiques disponibles sous une licence libre. Pour l'exemple, … -
Django braces utility mixins for class based views
Reusable generic mixins for django this project is your best friend if you are using django class based views in ... -
Migrate your user profile data to Django 1.5 custom user model
One of the major feature of Django 1.5 is the new custom user model. This article is a step by ... -
Retrieve PUT request params
A short code to retrieve PUT requests params at a Django view. -
Mezzanine, le CMS Django qu'il vous faut
Bien que Django constitue un outil de travail de fort bonne facture, je tombe de plus en plus souvent sur des projets avec des besoins de CMS. Or, je veux bien être pragmatique, mais ça me fait un peu mal quand je me retrouve à conseiller à un client l'installation d'un Wordpress ou d'un Drupal, même si c'est l'outil le plus approprié sur le moment. J'ai fini par fouiner pour voir s'il n'existait pas de bons CMS en Python. Les principaux proposés par la communauté sont Django-cms, FeinCMS et Mezzanine. Résolu à tester les trois, j'entrepris de les installer rapidement pour jouer un peu avec. Las, la documentation des deux premiers semble lacunaires, car dés les premières commandes, je fut confronté à des erreurs non référencées, et après plus d'une demi-heure passée sur Stackoverflow, je laissais tomber pour ne pas perdre trop de temps. Finalement, j'ai fini par installer Mezzanine, sur recommandation de @n1k0, et il a bien voulu fonctionner docilement sans mettre ma patience à l'épreuve (Mezzanine, pas @n1k0). C'est donc ce projet que j'ai testé plus en profondeur. Installation et premières impressions L'installation se fait en quelques commandes directement listées sur la page d'accueil du projet. Mezzanine initialise … -
Pycon 2013 Slides
Slides from PyCon 2013 ! -
Pyladies
Are you an experienced female Python developer? Or are you new and need help getting into Python development? here is ... -
Python模块学习--random 随机数生成
Python中的random模块用于生成随机数。下面介绍一下random模块中最常用的几个函数。random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0random.uniformrandom.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a <b, 则 b <= n <= a。print random.uniform(10, 20) print random.uniform(20, 10) #---- 结果(不同机器上的结果不一样) #18.7356606526 #12.5798298022 random.randintrandom.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= bprint random.randint(12, 20) #生成的随机数n: 12 <= n <= 20 print random.randint(20, 20) #结果永远是20 #print random.randint(20, 10) #该语句是错误的。下限必须小于上限。 random.randrangerandom.randrange的函数原型为:random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中 获取一个随机数。如:random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效。random.choicerandom.choice从序列中获取一个随机元素。其函数原型为:random.choice(sequence)。参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。有关sequence可以查看python手册数据模型这一章,也可以参考:http://www.17xie.com/read-37422.html 。下面是使用choice的一些例子:print random.choice("学习Python") print random.choice(["JGood", "is", "a", "handsome", "boy"]) print random.choice(("Tuple", "List", "Dict")) random.shufflerandom.shuffle的函数原型为:random.shuffle(x[, random]),用于将一个列表中的元素打乱。如:p = ["Python", "is", "powerful", "simple", "and so on..."] random.shuffle(p) print p #---- 结果(不同机器上的结果可能不一样。) #['powerful', 'simple', 'is', 'Python', 'and so on...'] random.samplerandom.sample的函数原型为:random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列。list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] slice = random.sample(list, 5) #从list中随机获取5个元素,作为一个片断返回 print slice print list #原有序列并没有改变。 上面这些方法是random模块中最常用的,在Python手册中,还介绍其他的方法。感兴趣的朋友可以通过查询Python手册了解更详细的信息。 -
Django静态文件的配置
一直在寻找产品部署环境和开发环境时,Django静态文件配置的差异化。比如说网站的css js和一些非程序相关的文件,我暂时看成是静态文件。我们怎么正确配置,才能让Django网站解析到静态文件呢?简明来说,要注意两个文件:settings.py url.py。首先在settings文件中,引用os模块:import os然后我们定义一个常量,项目的根目录地址:PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))再者就是给MEDIA_ROOT赋值为:MEDIA_ROOT= os.path.join(PROJECT_PATH,'static')(注意,我们的静态文件在根目录下的static文件里,如果文件夹名不一样,join的参数改成 自己起用的名字)settings.py 配置完了,urls.py呢?如下配置:from django.conf import settingsurl(r'^static/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT },name="media"),^static/(?P<path>.*)$的static,可以随自己喜欢的名字,建议参考Django最佳实践做法。也许urls配置很重要,稍微不小心,url经常解析不到真正的静态文件。之前喜欢使用media,比如^media/(?P<path>.*)$,结果老解析不到静态文件,还瞎捣鼓MEDIA_ROOT,终究还是没有解析成功,后来把media改成static,一下子成功了。注意不一定是static,只要不是media,应该就可以了。很奇怪,不知道是不是Django其他地方用到media了,比如Django的Admin。最后就是如何在templates里使用静态文件了:<script type="javascript/text" src="/static/js/config.js"></script><link rel="stylesheet" type="text/css" href="/static/css/contents.css"/><img src="/static/images/logo.ipg" alt=""/>使用的时候注意 路径的开头需要加上/ 这样的配置,在开发环境中式能正常解析的,在产品部署环境中,只需修改settings文件的MEDIA_URL ADMIN_MEDIA_PREFIX把他们改成实际的域名MEDIA_URL='http://www.XXX.com/static/'ADMIN_MEDIA_PREFIX='http://www.XXX.com/static/admin/'ADMIN_MEDIA_PREFIX后面的admn,可能有点差异,我们是把Django的admin静态文件拷贝到static文件夹里,名叫admin,(结构:static/admin/)。补充:根据实际的实践中,发现ADMIN_MEDIA_PREFIX如果指定了后缀media或者static,比如:ADMIN_MEDIA_PREFIX='http://www.XXX.com/media/'或者ADMIN_MEDIA_PREFIX='http://www.XXX.com/static/';urls.py应该另起一个后缀,比如:url(r'^site_media/(?P<path>.*)$','django.views.static.serve',{'document_root':settings.MEDIA_ROOT },name="site_media"),我们指定了site_media作为后缀,而没有采用media和static,是避免和后台的静态路径冲突而我们应用的静态文件无法得到正常解析。(完) -
在Heroku建立一个App遇到问题解决办法
heroku建立app的时候,首先需要git和ssh,sudo apt-get install git-core sudo apt-get install ssh 执行了两条ubuntu命令后,算是顺利完成安装了。gem install heroku 安装heroku之后,要建立一个app;heroku create,帐号认证,竟然出现错误:No ssh public key found in /home/***(计算机名)/.ssh/id_[rd]sa.pub. You may want to specify the full path to the keyfile.帐号没有错,刚刚在heroku上激活的,而且我也已经生成了ssh key ,输入ssh-keygen -t rsa 后,认认真真输入key和pass..最后出来的数字码和随机图,都没有什么异常。但到了建立app的时候,死活进不去,出来总是:No ssh public key found in /home/***(计算机名)/.ssh/id_[rd]sa.pub. You may want to specify the full path to the keyfile.正在纳闷的时候,重新生成ssh key;不经意没有输入key和pass,ssh-keygen -t rsa 一路回车,同样也生成了shh 数字码和随机图,建立app的时候意外的成功了!玄乎.... -
比较Perl、PHP、Python、Java和Ruby
!预览语言的发展趋势一定是动静结合、刚柔并济Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯或许优雅正是来自对细节和规范的重视(RoR)与Ruby结合之后,便如一只猱身而上灵猫,立刻衬托出Java和.NET大象般的身影?提问Perl、Python、Ruby和PHP各自有何特点?为什么动态语言多作为轻量级的解决方案?LAMP为什么受欢迎?Ruby on Rails为什么会流行?编程语言的发展趋势是什么?:讲解“剩下四种动态语言,我们将之归为后台脚本语言。”冒号说着画了张图表——引号听得仔细:“我记得您开始是把这些语言划分为C族静态语言、非C族静态语言和动态语言三类的。”冒号解释:“那是按语法来划分的,偏重理论;现在是按应用来划分,偏重实践。”句号旋即联想到:“这种分法貌似三层架构——前台语言对应表现层;平台语言和后台脚本语言对应业务逻辑层;系统语言对应数据层。”“的确有几分神似,但千万不可混淆。”冒号提醒道,“三层架构(three-layer architecture)是模块设计上的逻辑划分[1];而这里是按语言应用范围进行的物理划分——与用户交互的是前台语言,与机器交互的是系统语言,介于其中的为前台提供服务同时又需要底层系统服务的是后台语言。”逗号询问:“后台语言又细分成平台语言与后台脚本语言?”“这是基于程序(program)与脚本(script)、静态与动态而分的。”冒号进行说明,“其实Perl,PHP,Python和Ruby都有自己的虚拟机(virtual machine),从这种意义上说它们也可作为平台语言。但在实际应用中,它们没有Java平台和.NET平台那种整合凝聚力和核心作用,通常作为轻量级的解决方案。”问号想探个究竟:“这是由于它们都是动态语言的缘故吗?”冒号回答:“理论上动态语言同样能承担大型应用,但实践上它们多作为粘合语言或用于中小型应用。用句时髦的话来形容,暂时还是主流的配角或非主流的主角。毕竟在运行效率、类型安全、可用资源、开发工具、技术支持等方面,它们与Java、C#相比尚有一定差距。另外它们同属‘草根’语言,虽有开源社区的大力支持,在影响力上与后者未可同日而语。”叹号揣测:“说不定在不久的将来,动态语言也会成为主流的主角。”“世易时移,殊难逆料。但有一点可以肯定,语言的发展趋势一定是动静结合、刚柔并济。”冒号断言,“一方面以Java和C#为代表的静态语言中嫁接了动态语言的枝条;另一方面以Java和.NET为代表的平台与动态语言的交壤地带也在逐步扩大。比如JRuby允许Ruby与Java之间互相调用,类似的还有Jython、IronRuby、IronPython等等。此外值得一提的是,动态语言最活跃的舞台当数LAMP,L-A-M-P。”引号接茬:“L是Linux,A是Apache,M是MySQL,P是PHP。这四大组件形成了一个完整的开源网络开发平台。”冒号补充道:“P也可指Perl、Python,甚至Ruby。”逗号调侃:“可惜Ruby的‘R’比‘P’多了一根尾巴。”“有人为了自圆其说,干脆让P表示‘Programming language’,这下所有语言都囊括其中了。老外就喜欢玩这种首字母缩略(acronym)的文字游戏,尤其LAMP正好还有‘灯’的含义,寓意开源世界的一盏明灯,他们一定更得意了。”冒号语带调笑,“前面我们曾提及,网络应用是生长动态语言最肥沃的土壤,而LAMP就是这块土壤上搭建的平台。作为网络平台,LAMP以其开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等特色而与Java平台和.NET平台鼎足三分,尤其受中小企业的欢迎。LAMP中Linux是操作系统,Apache是Web服务器,MySQL是数据库系统,而我们当下最关心的是‘P族语言’:PHP、Perl、Python还有Ruby。”问号建议:“作为动态语言,它们的共性上节课已经谈了不少,能说说它们的个性吗?”“它们的个性极为鲜明:Perl凝练晦涩,Python优雅明晰,Ruby精巧灵动,PHP简明单纯。先看老大哥Perl,它博采众家之长,综合了C语言的结构、sed的正则表达式、AWK的关联数组(associative array)、Lisp的表(list)和Unix Shell的命令,此外还有借鉴了一种语言,你们知道是哪种吗?”冒号忽然卖了个关子。逗号猜想:“应该是某种OOP语言吧。”“Perl中确有不少C++的影子,但它的对象模型在5.0以后才引入,典型的半路出家,远不如前面的特征那么自然。与其说是一种自然而然的发展,不如说是在OOP潮流裹挟下的一种身不由己的迎合。真正深入骨髓的借鉴是自然语言。”冒号给出了答案,“我们提过,Perl的发明者Larry Wall是一名语言学家,他认为程序语言应该与自然语言一样,简洁自然、易读易写、表达多样、不拘一格。Perl还有不少的格言或哲学,使得编程语言一改严谨刻板的面孔,散发出浓郁的人文气息。”叹号幽了一默:“我见过Perl的代码,人文气息没闻出来,但我怀疑有乙醚气息——看一会就觉得晕晕乎乎的。”众人大笑。“有人仅用一行Perl代码就实现了RSA算法,你看了那还不得当场晕倒啊?”冒号打趣道,“Perl的各种魔符好似一把把锋利的剪刀,做起文本裁剪之类的工作来游刃有余。这是它最大的长处,当初Perl就是Wall用来做Unix系统管理的,以后在CGI上的广泛应用也得益于此。这也赋予Perl极强的粘合力,因而有‘internet上的胶带(duct tape)[2]’的说法。它又号称瑞士军刀,精练而复杂,实用而强大。但Perl过于灵活自由,缺乏规范,影响了程序的可读性、一致性、整洁性和可维护性。不熟悉该语言的固然如读天书,熟悉语言而不熟悉问题的也颇费思量。相比之下Python被认为是Perl有力的挑战者,不仅在于它天然的OO设计和丰富的类库,更重要的是它对程序员友好度大大超过Perl。Python也有一系列的被称为禅(Zen)的哲学,不少与Perl是针锋相对的。比如:Perl认为做一件事可以有多种方法,而Python认为一件事应该最好只有一种方法;Perl追求语言的表现力,Python追求简单优雅;Perl喜欢隐性暗示,Python强调显性明示;Perl强调紧凑,Python强调松散; Perl的语法和语义丰富,Python的语法和语义简单而类库丰富。或许Python最让人不习惯的是它对空白符敏感性。”引号感到惊奇:“对空白符敏感?这个倒真怪异。”冒号见惯不怪:“虽然有点违反习惯,但非常符合Python一贯的规范简洁的风格——一方面从语法上保证了良好的编码风格;另一方面,每个代码块不再需要起始的大括号或begin/end之类的,减少了的代码行数。顺便插一句,另外一种优雅的语言Haskell同样对空白符敏感,或许优雅正是来自对细节和规范的重视吧。此外许多人抱怨Python中的自引用self太多,殊不知这也是它倡导显式表达的一种体现。总的看来,Python主要的问题还是在性能效率上不尽如人意。”叹号好奇地问:“Ruby怎么样?据说它将取代Java。”“不要轻言‘取代’二字。”冒号规诫道,“Java没有取代C++,也不会被Ruby取代,至多只是一种再分配。不过Ruby的确是门很可爱的语言,兼具Perl的表现力和Python的可读性。Ruby背后最具特色的理念是:关注程序员使用语言时的感受超过语言本身的功能。通俗地说,兵器的称手比锋利更重要;文雅地说,应给予程序员更多的人文关怀。就拿代码块(block)和迭代器(iterator)来说,虽然均非Ruby首创,但其语法最为赏心悦目。类似的例子比比皆是。Ruby的元编程能力特别强,也是它高度灵活的一种体现,但并不是所有人都喜欢这种风格。Ruby的主要弱点有两个:一个与Python类似,在性能上还有待提高;另一个是它的线程由用户空间(user space)而不是内核空间(kernel space)来管理[3],不能充分利用多核或多CPU。真正让Ruby变得炙手可热的是web应用框架 Ruby on Rails(RoR)的成功,它们还催生了Java平台上的Groovy语言和Groovy on Grails框架。RoR奉行的CoC(Convention over Configuration)和DRY(Don't repeat yourself )原则以及MVC架构看似了无新意,但与Ruby结合之后,便如一只猱身而上灵猫,立刻衬托出Java和.NET大象般的身影。”逗号有些怀疑:“框架竟然捧红了语言,框架真有这么重要吗?”“如果web应用中动态页面较少或业务逻辑不复杂,框架的价值并不大。以前CGI编程就是往Perl之类的代码中嵌入HTML代码,如同Java中的Servlet;PHP则单纯地在HTML代码中插入PHP代码,如同早期的JSP。没有MVC,也不管什么三层架构,更没有ORM。但是——”冒号拖了个转折音,“一旦业务逻辑变得复杂,开发人员增多,手工作坊式编程开始捉襟见肘,引入框架这个流水生产线来提高生产力便是大势所趋。”句号不解:“我想Perl、Python和PHP一定也有不少框架,Java中的框架更是泛滥成灾,何以独独RoR脱颖而出?”冒号作出分析:“正值web2.0和敏捷开发(agile development)的概念流行之际,RoR将AJAX与Ruby组合在一起成为绝佳的回应。以前各种web应用框架是不少,但在RoR之前轻量级套餐式解决方案并不多。Perl中的Catalyst、Python中的Pylon还有PHP中的CakePHP等应是效仿之作。因此RoR出现的时机可说是不早不晚,正当其时。此外,Perl和PHP由于过于流行,反而有不少的历史包袱,人们习惯了将表示逻辑和业务逻辑编织在一起。至于Java企业解决方案,框架太多,搭配组合更多,增加了选择的难度。即使采用最常见的轻量级SSH(Struts+Spring+Hibernate)组合,维护起来也比RoR繁杂得多。”叹号愈发担忧:“听这意思,Java还是危险啊!”“言之过早。”冒号不以为然,“首先RoR还有待进一步检验,目前无论是应用广度还是深度上尚无法与Java相提并论;其次Java在性能、安全等方面还是有不少优势,而这些对于大型和关键性的应用来说尤为重要。即使在中小型web应用中,RoR较之PHP还远为不及。”问号接下话题:“PHP为何如此流行?”“因为它简单、专一。”冒号答得很干脆,“与Python和Ruby一开始就定位通用语言不同,PHP是专为网络而生的。同早期的Perl相似,PHP起初主要起文本过滤器的作用,只不过Perl多处理文件流(file stream),而PHP多处理套接字流(socket stream)。PHP的语法简单,且为网络应用度身定造,受到网络开发人员的追捧当在情理之中。它虽很实用很流行,但并不完美。比如:变量名大小写敏感而函数名大小写不敏感;函数命名规则不一致;不支持namespace和unicode[4];与Perl一样,它的对象模型不是先天的,直到PHP 5才真正完善;对线程支持不足;相比Perl、Python和Ruby,它的功能稍显单薄等等。”引号突然想起:“我记得您在第一堂课提到PHP还能用于桌面应用。”“不仅PHP,Perl、Python还有Ruby,都能作为前台语言来开发命令行或图形界面的应用。同样地,VB、Delphi和JavaScript也能作为后台语言。现代的程序语言既有自己的专长,又向通用化和全能化发展,以争取更多的生存空间。试想一下,现代的程序员又何尝不是如此呢?”言及于此,冒号收住话题,“语言简评告一段落,还有不少既有趣又有用的语言,在此就不一一评说了。我们看到,每种编程语言都有其独特的惯例用法和哲学理念,它们与编程范式一道形成了语言的编程风格。体悟愈深者编程语感愈强,思维与语言愈交融无碍,渐从必然王国走向自由王国。”逗号满怀憧憬:“那是不是一种人剑合一的境界?”“或许人器合一更准确吧,程序员可不能只会一种兵器哟。”冒号故意抠他的字眼,“现在请大家每人写一句对本节课的感言。”众人沉思片刻,齐齐挥笔而就——叹号——没有最好的语言,只有最合适的语言。逗号——没有糟糕的语言,只有糟糕的程序员。问号——没有一种语言是万能的,只会一种语言是万万不能的。引号——废除对语言的宗教信仰,建立对语言的哲学思维。句号——编程就是在人脑和电脑之间寻找最佳平衡点的过程。冒号读罢大悦,顺手一掌拍出五记马屁:“精彩之极!可谓字字珠玑、句句联璧啊。兹决定,给诸位的奖赏是——立时下课!”众人欣然领赏而去。插语[1] 有两种三层架构,一种是three-layer architecture,一种是three-tier architecture。它们经常换用,但其实是有分别的:前者仅仅在逻辑进行划分,而后者在物理上也进行了划分——不同层次的模块运行在不同的主机上。[2] 不少地方译作‘输送带’、‘传送带’,因为duct有‘输送管’、‘导管’之意,于是想当然地认为这表明Perl在internet上起着输送作用。殊不知‘duct type’专指一种万能的粘性极强的胶带,用以比喻Perl的粘合力。[3] 这类线程被称为绿色线程(green thread),也称伪线程。据称Ruby2.0将支持原生线程(native thread)。[4] PHP将在5.3.0支持namespace,将在6.0支持unicode。总结比起Java平台和.NET平台,动态语言轻便灵活、开发效率高,但整合凝聚力还不够,在运行效率、类型安全、可用资源、开发工具、技术支持以及影响力等方面也有一定差距,故通常作为轻量级的解决方案。LAMP是由Linux、Apache、MySQL和包括PHP、Perl、Python或Ruby在内的脚本语言组成的网络开发平台,具有开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等优点。Perl精练、复杂、强大、灵活、自由、隐晦、表现力强,但规范性、可读性、一致性、整洁性和可维护性较差。Python优雅规范、简洁明晰、易学易用、类库丰富,但效率稍差,有些人不喜欢它对空白符敏感的特性。Ruby语法精巧、高度灵活,兼具Perl的表现力和Python的可读性,尤其注重程序员的感受,但其性能和线程模型尚有待改进。PHP简单、专一、实用、流行,在但相比其他三种语言,在语法和功能上稍有欠缺。RoR是一种轻量级套餐式的web应用解决方案,是友好的设计(MVC架构和CoC、DRY原则)加上好的语言(Ruby)在好的时机(web2.0和敏捷开发风行之际)打造出的好的框架。静态语言与动态语言从语言特征到运行环境都在逐渐融合。程序员应该与程序语言一样,既要有自己的专长,又要向通用化和全能化发展。编程语言惯例用法、哲学理念和编程范式形成了语言的编程风格。 -
Ubuntu下安装MySQL
Linux新手,常常为现在源码 编译 安装感到迷茫,今天在Ubuntu官方上找到简易安装MySQL的方法,以便以后配置开发环境做备忘录.以下是通过Ubuntu的终端通过远程源来安装MySQL。之前最好更改系统的源为中国源,1 更改到中国源系统的顶端菜单 系统--更新管理器--(底下左边)设置(输入管理员root密码)--Ubuntu软件--下载自 <选择> 其他站点--中国的 mirrors.163.com(根据你使用的带宽来选择吧)2 安装MySQL要安装 MySQL,可以在终端提示符后运行下列命令:sudo apt-get install mysql-server mysql-client #中途会让你输入一次root用户密码sudo apt-get install php5-mysql #安装php5-mysql 是将php和mysql连接起来一旦安装完成,MySQL 服务器应该自动启动。sudo start mysql #手动的话这样启动sudo stop mysql #手动停止当你修改了配置文件後,你需要重启 mysqld 才能使这些修改生效。要想检查 mysqld 进程是否已经开启,可以使用下面的命令:pgrep mysqld如果进程开启,这个命令将会返回该进程的 id。3 文件结构MySQL配置文件:/etc/mysql/my.cnf ,其中指定了数据文件存放路径datadir = /var/lib/mysql如果你创建了一个名为 test 的数据库,那么这个数据库的数据会存放到 /var/lib/mysql/test 目录下。4 进入MySQLmysql -uroot -p (输入mysql的root密码)baoyalv@ubuntu:~$ mysql -u root -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 37Server version: 5.1.41-3ubuntu12.3 (Ubuntu)Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 修改 MySQL 的管理员密码:sudo mysqladmin -u root password newpassword5 简单的操作显示数据库:mysql> show databases;+--------------------+| Database |+--------------------+| information_schema || mysql |+--------------------+2 rows in set (0.00 sec)6 phpmyadmin管理用随便一个支持PHP的web服务器(如Apache、Nginx、Lighttpd),下载phpmyadmin,装之。sudo apt-get install phpmyadmin #注意这是安装到/usr/share/phpmyadmin -
Windows上安装Nginx注意事项
本来想在windows7上安装Nginx,然后部署Django的,过程中遇到了一些小问题,所以都记录下来!供以后查阅!几个细节的东西,有必要写清楚!官网上下载地址:http://nginx.org/en/download.html就那最新的版本做实验吧。我下了 windows原生版本 0.8.53,整个文件就是一个zip压缩文件。下载到C盘的根目录下,解压缩。出来的文件夹是nginx-0.8.53,顺便改成了nginx,方便使用(其实改不改都没有关系,改了,是因为重启nginx的时候,少打点字母罢了)。然后冲动的进入文件夹,双击启动文件nginx.exe,弹出了一个doc窗口,就在眨眼的功夫里,消失了,没有看清提示什么内容;不管三七二十一,我在浏览器了,打开127.0.0.1,提示 无法显示页面。我们没有安装IIS7,如果是无法显示页面,说明nginx启动失败了。但是到底是什么原因让nginx无法启动呢?我想个办法,放doc的提示显示出来,结果提示是:[emerg]:bind() to 0.0.0.0:80 failed <10013: An attempt was made to access a socket in a way forbidden by its access permissions>看提示信息,是因为windows 的80 端口被占用了,所以又想办法把80端口释放了,最终还是没有释放成功,windows把80端口保留给最底层的进程用了,释放80端口行不通,又想别的招。然后安装了IIS7,这时80端口自然就分配给IIS7了。IIS安装成功,然后把停止IIS7的运行,自然80端口就被闲置了。果真如上所说,80端口真的被释放了。然后双击nginx.exe来启动nginx,这回没有提示信息了,打开浏览器 127.0.0.1:80;呵呵,nginx终于正常运行。为什么要nginx运行在80端口上呢?因为本人想让nginx作为代理服务和前端服务。域名指向到服务器的ip的时候,直接就找到nginx。所以周折了一番。在配置django环境的时候,有遇到了问题。我明明修改了nginx.conf的参数了,在重新启动的时候,都是无效的,很是郁闷,所以django环境配置无法配置成功了。仔细检查了配置文件的语法错误,发现了一些错误,修改过来了,仍然无效,干脆恢复原来的配置文件,还是老样子,这么一来就奇怪了。压根重启是无效的。官方的文档很清楚:nginx -s stop quick exitnginx -s quit graceful quitnginx -s reload changing configuration, starting a new worker, quitting an old worker gracefullynginx -s reopen reopening log files就这么几行命令,执行后,一切都正常,就是没有效果。最后想到办法,打开windows的任务管理器,把nginx的几个进程都关闭了,启动nginx,终于看到想要的效果了。nginx对windows的支持还不算很好,有些东西还是很折腾。