Pyramid project paster command line tools script template

Wednesday, October 26, 2011

1, new a commands script file commands.py

from paste.script.command import Command
import os.path
from pyramid.threadlocal import manager as threadlocal_manager
from paste.deploy import loadapp


class PyramidCommand(Command):

    group_name = "lxneng"
    min_args = 1
    max_args = 1
    parser = Command.standard_parser()

    def setupPyramid(self):
        app = loadapp('config:%s' % self.args[0], relative_to=os.path.abspath('.'))
        registry = app.registry
        try:
            threadlocal_manager.push({'registry':registry})
        finally:
            threadlocal_manager.pop()


class DemoCommand(PyramidCommand):
    summary = "demo script"
    usage = "paster --plugin=lxneng demo_script development.ini"
    parser = PyramidCommand.standard_parser()

    def command(self):
        from lxneng.models.post import Tag
        tag = Tag.find_by_name('Python')
        print tag.name

2, add command to setup.py

entry_points="""\
  [paste.app_factory]
  main = lxneng:main

  [paste.paster_command]
  demo_script = lxneng.commands:DemoCommand
  """,

3, build

python setup.py develop

4, run

paster --plugin=lxneng demo_script development.ini

note:
lxneng is my project name

Objective-C 扩展名

Tuesday, October 25, 2011

  • .h 头文件, 头文件包含类, 类型, 函数和常数的声明.
  • .m 源代码文件, 这是典型的源代码文件扩展名, 可以包含Objective-C和C代码.
  • .mm 源代码文件, 带有这种扩展名的源代码文件, 除了可以包含Objective-C和C代码以外还可以包含C++代码. 仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才使用这种扩展名.

Setup ipython to work in a virtualenv

Monday, August 29, 2011

add this script to \~/.ipython/ipython_virtualenv.py

#Call this inside ~/.ipython/ipy_user_conf.py main()

import sys
import subprocess
from os import environ

if 'VIRTUAL_ENV' in environ:
    #This is kludgy but it works; grab the right sys.path from the virtualenv python install:
    path = subprocess.Popen(['python', '-c','import sys;print(repr(sys.path))'],
                            stdout=subprocess.PIPE).communicate()[0]
    sys.path = eval(path)
    del path

del sys, subprocess, environ

from https://gist.github.com/817737

using gettext convert .mo to .po, and .po to .mo

Monday, August 29, 2011

install gettext

on Mac OSX via Homebrew

brew install gettext

on Ubuntu via apt-get

apt-get install gettext

mo to po ###

msgunfmt xxx.mo -o xxx.po

po to mo

msgfmt xxx.po -o xxx.mo

Manage (Add, Edit, & Delete) cookies in jQuery

Monday, June 27, 2011

原文
http://www.akchauhan.com/manage-add-edit-delete-cookies-in-jquery/
Setting and deleting cookies with jQuery is really easy (especially in
comparison to regular JavaScript) but this feature is not included in
the jQuery core. For this we need a plug-in. This post shows how to set
and get the value of cookies with jQuery.

First download the jQuery cookie plugin for here:
http://plugins.jquery.com/project/Cookie

Set a cookie

Setting a cookie with jQuery is as simple as this, here
we are creating a cookie called “example” with a value “demo”:

$.cookie("example", "demo");

This is a session cookie and will be destroy when user close his/her
browser. To make the same cookie for suppose 7 days. We can do it like
this:

$.cookie("example", "demo", { expires: 7 });

The above example will create the cookie at the root level. If you
wanted to make it apply only to e.g. “/admin” and make it for 7 days you
can do it like this:

$.cookie("example", "demo", { path: '/admin', expires: 7 });

Get the cookie’s value

Getting the cookie’s value is also very easy
in jQuery. The following would alert the value of “example” cookie:

alert( $.cookie("example") );

Delete the cookie

And finally, to delete a cookie set its value to
null.
Note:Setting it to e.g. an empty string doesn’t remove it;
it just clears the value.

$.cookie("example", null);

设计者的品味

Sunday, June 12, 2011

  • 好设计是简单的设计
  • 好设计是永远不过时的设计
  • 好设计是解决主要问题的设计
  • 好设计是启发性的设计
  • 好设计通常是有点趣味性的设计
  • 好设计是艰苦的设计
  • 好设计是看似很容易的设计
  • 好设计是对称的设计
  • 好设计是模仿大自然的设计
  • 好设计是一种再设计
  • 好设计是能够复制的设计
  • 好设计常常是奇特的设计
  • 好设计是成批出现的
  • 好设计常常是大胆的设计

——摘自《黑客与画家》第九章-设计者的品味

UUID in SQLAlchemy

Friday, June 10, 2011

Add a Custom Types

types:

# model/uuid.py
from __future__ import absolute_import
import uuid
from sqlalchemy.types import TypeDecorator, CHAR
from sqlalchemy.dialects.postgresql import UUID


class GUID(TypeDecorator):
    """Platform-independent GUID type.

    Uses Postgresql's UUID type, otherwise uses
    CHAR(32), storing as stringified hex values.

    """
    impl = CHAR

    def load_dialect_impl(self, dialect):
        if dialect.name == 'postgresql':
            return dialect.type_descriptor(UUID())
        else:
            return dialect.type_descriptor(CHAR(32))

    def process_bind_param(self, value, dialect):
        if value is None:
            return value
        elif dialect.name == 'postgresql':
            return str(value)
        else:
            if not isinstance(value, uuid.UUID):
                return "%.32x" % uuid.UUID(value)
            else:
                # hexstring
                return "%.32x" % value

    def process_result_value(self, value, dialect):
        if value is None:
            return value
        else:
            return uuid.UUID(value)

example

mode:

# model/user.py
from you.app.model.uuid import GUID
from you.app.model import meta

class User(meta.BaseObject):

    __tablename__ = "user"

    uuid = schema.Column(GUID(), default=uuid.uuid4, nullable=False, unique=True)

meta:

# model/meta.py
from sqlalchemy import schema
from sqlalchemy.ext.declarative import declarative_base

__all__ = ["Session", "metadata", "BaseObject" ]

Session = None

metadata = schema.MetaData()
BaseObject = declarative_base(metadata=metadata)

reference: Backend-agnostic GUID
Type

ajax get server side time string, pyramid example

Friday, June 10, 2011

ajax get server side time string, pyramid example

#route
config.add_route("servertime", "/servertime")

#server side
@view_config(route_name="servertime", renderer='string')
def serverTime(request):
    return datetime.now()

#client
var timeStr = $.ajax({url: "/servertime", async: false}).responseText;

UUID primary keys in Rails 3

Friday, June 10, 2011

Gemfile

# Gemfile
…
gem 'uuidtools'
…

migrations
# 1. :id => false
# 2. :uuid
#

class CreateSites < ActiveRecord::Migration
  def self.up
    create_table(:sites, :id => false) do |t|
      t.string :uuid, :limit => 36, :primary => true
      t.timestamps
    end
  end

  def self.down
    drop_table :sites
  end
end

model

# app/models/site.rb
class Site < ActiveRecord::Base
  include Extensions::UUID
end

extensions

# app/models/extensions/uuid.rb
#
module Extensions
  module UUID
    extend ActiveSupport::Concern

    included do
      set_primary_key 'uuid'
      before_create :generate_uuid

      def generate_uuid
        self.id = UUIDTools::UUID.random_create.to_s
      end
    end
  end
end

SQLAlchemy's not in

Friday, June 10, 2011

from sqlalchemy import not_ 
session.query(Region).filter(not_(Region.id.in_( (1,2,3) )))

div>img 底部对齐

Friday, June 10, 2011

外层div的位置设置成绝对的, img 设置成块级元素,位置设置成相对的,bottom设置成0

html code

<div class="bodyShape">
    <div class="barbara">
        <img src="${tools.static_url('media/images/figure-analysis-barbara-82x135.png')}" />
    </div>
</div>

css code

.bodyShape{height:150px; width:200px;border-right: 2px solid #ccc;}
.bodyShape .barbara{position:relative;height:100%;}
.bodyShape .barbara img{bottom:0;display:block;position:absolute;}

Shorthand for the jQuery ready event

Saturday, June 4, 2011

The explicit and verbose way:

$(document).ready(function (){
    // do something here ...
});

The shorthand:

$(function (){
    // do something here ...
});

让Nginx支持mp4格式的视频播放,搭建一个mp4流媒体服务器

Saturday, April 16, 2011

在vps上下载了一些mp4格式的视频,点击是直接下载,不能直接在线播放,
所以google了一下有个nginx_mod_h264_streaming的模块。

下载

wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
tar -zxvf nginx_mod_h264_streaming-2.2.7.tar.gz

编译安装

./configure --sbin-path=/usr/local/sbin --with-http_ssl_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre=/usr/local/src/pcre-8.10 --add-module=/usr/local/lib/ruby/gems/1.8/gems/passenger-3.0.2/ext/nginx/ --add-module=/usr/local/src/nginx_mod_h264_streaming-2.2.7

make
make install

出错了

....
In file included from /usr/local/src/nginx_mod_h264_streaming-2.2.7/src/ngx_http_h264_streaming_module.c:2:
/usr/local/src/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c: In function ‘ngx_streaming_handler’
:
/usr/local/src/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c:158: error: ‘ngx_http_request_t’ has
 no member named ‘zero_in_uri’
make[1]: *** [objs/addon/src/ngx_http_h264_streaming_module.o] Error 1
make[1]: Leaving directory `/usr/local/src/nginx-0.8.54'
make: *** [build] Error 2

解决错误:

因为在新版本的nginx中废弃了zero_in_uri这个flag,稍微修改一下nginx_mod_h264_streaming的源代码

vim /usr/local/src/nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c

把158到161行注释掉

157   /* TODO: Win32 */
158   //if (r->zero_in_uri)
159   //{
160   //  return NGX_DECLINED;
161   //}

然后再make就正常了,make install 完成安装
配置nginx使之支持mp4
在nginx配置文件中加入

location ~ \.mp4$ {
                mp4;
        }

重启nginx

/etc/init.d/nginx restart

效果来了

image

reference

[Linux]优秀的 Unix 管理员应具有的9大品质(转)

Thursday, April 14, 2011

英文原文:http://www.infoworld.com/t/unix/nine-traits-the-veteran-unix-admin-276

优秀的Unix管理员应该具有的品质之一:我们不使用sudo

就像“caps
lock”对于极客来说只是一个可有可无的控制键一样,sudo也只是胆小者的拐杖。如果我们需要对root做一些事情,我们需要su到root,这个sudo废话毫无意义。

实际上,对于那些强制所有用户都要使用sudo的类Unix的操作系统来说,我们要做的第一件事情就是sudo su
-,然后改变根口令,以便于以后我们可以更加方便地su
-。使用sudo就像在带有充气减震器的水槽中打保龄球——的确很安全,但是你也别想一展身手了。

优秀的Unix管理员应该具有的品质之二:我们使用vi,而不是emacs,更不可能是pico或nano

虽然我们知道,对于许多Unix管理员来说,emacs更贴心一些,但是,实际上它只是Microsoft
Word的Unix翻版而已。vi(和vim)才是那些真正的Unix极客们手中的利器,他们需要在完成任务的同时,不被那些emacs自带的毫无用处的
东西把事情搞糟。Emacs居然内置了一款俄罗斯方块游戏,简直是岂有此理!

虽然我只能万般无奈地承认vim中那些花哨的功能(例如:代码折叠和语法高亮)可能只是一时失误,但是,在一天的工作即将结束之际,真正的Unix
工作可以和vi的模型编辑概念很好地融合在一起却是不争的事实。除此之外,它那苗条的身材和通用的可移植性可以让它成为一个真正的编辑器。感谢Bill!
感谢Bram!(编辑注:Bill Joy是vim编辑器的开发者,后来Bram Moolenaar对其进行了改进)。

优秀的Unix管理员应该具有的品质之三:我们把正则表达式当成我们的利器

对于正则表达式的排斥,甚至是漠视似乎都是“邪恶”的键盘造成的恶果。但是,对于我们来说,它是如诗般优雅的。它的强大表现在,任何其他的著名工具
都无法和pcre (Perl Compatible Regular
Expressions)的复杂性相匹敌。如果你需要在100000行文件中替换掉每一行的第三个字符(除了那些后面是数字4的字符之外),那么正则表达
式不只是完成这个任务的一个工具而已——它还是完成这个任务的唯一工具。那些可怜的人时常会在他们的email中接收到一些字符串片段和一些声泪俱下的请
求(寻求一个解析这些字符串的正则表达式),一般还会承诺请你喝一杯(但是从来没有兑现过)。

优秀的Unix管理员应该具有的品质之四:我们天生就比较懒惰

当遇到一个看起来需要很多手工的,重复性的工作才能解决的问题的时候,我们这些守旧派的Unix代表一定会选择编写一些代码来搞定它的。这通常会比
手工操作更加节省时间,虽然有时候事实也并非如此。无论如何,我们宁愿把时间花费在可以以后被引用或者使用的工作上面,也不愿意简单地修复眼前这个问题。
通常,当几年以后我们遇到了类似的问题,然后可以从我们的起始目录(home
directory)中的一个文件yank几百行Perl代码,在短短的几分钟之内解决掉了这个问题,然后回过头去分析那些可以提高工作效率的其他代码的
时候,我们就可以获得回报了。或者,我们也可以去玩一下愤怒的小鸟。

优秀的Unix管理员应该具有的品质之五:我们更喜欢优雅的解决方案

如果有好几种方法可以修复一个问题或者实现一个目标,那么我们会选择花费更多的时间来开发一个既可以解决当前的问题又能防止将来发生类似的问题的解
决方案,而不是简单地贴上一块邦迪牌创可贴。这是因为我们讨厌再次遇到那些在我们的印象中已经解决过的问题。我们认为,如果我们可以提前多考虑几步,防止
将来发生类似的问题,那么在将来,我们可以节省更多的精力。通常我们都是对的。

优秀的Unix管理员应该具有的品质之六:我们一般对事不对人

enlightenment有足够的把握可以让你的Unix基础知识达到一定的水平。这意味着我们从不认为一个问题会一直存到我们发现它为止。告诉
一个优秀的Unix管理员,一个文件“vanished”了,他只会轻蔑地嘲笑你。证明给她看,这真的发生了,他就会不知疲倦地研究这个问题了,直到可以
找到一个合理的原因和解决方案为止。许多人都认为这是傲慢和自负的表现。的确是——但是我们有这个资本。

优秀的Unix管理员应该具有的品质之七:我们研究问题的时候,比医生的检查还要细致

当处理一个大问题的时候,我们在“尸检”上花费的时间要比我们解决这个问题所花费的时间多得多。如果不是工作压力太大,让我们无暇分身去研究这个问
题,那么我们一定会搞清楚这个问题的确切原因的。在一个强悍的Unix管理员的工作中,不存在不可思议的现象。每一种情况必须要有逻辑起点,而且可以按照
合适的路径来追本溯源。简而言之,每一件事情都有原因,在找到这个原因以前,我们绝不放弃!

对于我们来说,通过HUPping一个进程,或者改变一个文件或777目录的权限来“止血”是一件很容易的事情,但是这连成功的一般都算不上。为什么这个进程必须要重启?这并不是必须的,我们需要知道为什么。

优秀的Unix管理员应该具有的品质之八:关于Windows,我们知道的也很多(过去我们只是装作不知道而已)

虽然在我们自己的机器上,我们可能并不运行Windows,而且,对于Windows服务器,我们似乎也不屑一顾,但是在诊断和修复Windows
问题方面,我们却是行家里手。这是因为,当它们的“鲜血”流到我们的“版图”上的时候,我们必须要处理这些问题。但是,我们不喜欢承认这个事实,因为大多
数情况下Windows都没有Unix那样深厚的逻辑基础,这让我们很困扰。参见上面的品质五和品质六。

优秀的Unix管理员应该具有的品质之九:几乎从来都不选择重启

Unix设备不需要重启。如果并非绝对没有其他选择,我们会花费数个小时在系统运行的状态下修复这个问题,而不是重启。我们的想法是除了内核或硬件
改动,其他情况下都没有理由去重启,重启只是修复这个问题的临时办法而已。如果这个问题发生了一次,并且通过重启被“修复”了,那么它还会再次发生的。我
们宁愿修复这个问题,而不是简单地拔掉电源,等着它再次发生。

从“谎言”的角度来看,这些品质中的某些品质看起来会有点另类或者难以理解,那是因为他们本来就是如此的。其他人只能看到棘手和困难的时候,我们却看到启示,学习,经验,更重要的是,我们看到了逻辑。

Nginx加密认证目录或者网站

Tuesday, April 12, 2011

在apahe下面可以对网站或者目录/文件做密码认证, 当然nginx也能做。 在nginx中, 密码必须是crypt加密的,
可以使用apache的htpasswd来生成密码 (没有就装一个mini-httpd)。 命令: htpasswd -b -c passwordfile username password 例:htpasswd -b -c lxneng.com.pass lxneng 123456

1, 基于整个网站的配置

server {
        listen       80;
        server_name  dl.lxneng.com;
        root /var/www/lxneng.com/downloads;
        auth_basic "Please input your username and password!";
        auth_basic_user_file /etc/nginx/auth/lxneng.com.pass;
       }

2, 基于目录的配置

server {
        listen       80;
        server_name  lxneng.com *.lxneng.com;
        root /var/www/lxneng.com;
        location ~ ^/downloads/.* {
                auth_basic "Please input your username and password!";
                auth_basic_user_file /etc/nginx/auth/lxneng.com.pass;
                }
       }

这里 location \~ \^/downloads/.* 保护该目录下的所有文件,只要认证一次就可以访问该目录下的所有文件。 效果:
image

© 2009-2013 lxneng.com. All rights reserved. Powered by Pyramid

go to Top