小编Sea*_*ods的帖子

组合路线背后的"大创意"是什么?

我是Clojure的新手,并且一直在使用Compojure编写基本的Web应用程序.不过,我正在用Compojure的defroutes语法碰壁,我认为我需要理解它背后的"如何"和"为什么".

看起来像Ring样式的应用程序以HTTP请求映射开始,然后只是通过一系列中间件函数传递请求,直到它被转换为响应映射,然后将其发送回浏览器.对于开发人员来说,这种风格似乎太"低级",因此需要像Compojure这样的工具.我可以看到在其他软件生态系统中需要更多的抽象,尤其是Python的WSGI.

问题是我不了解Compojure的方法.我们采用以下defroutesS表达式:

(defroutes main-routes
  (GET "/"  [] (workbench))
  (POST "/save" {form-params :form-params} (str form-params))
  (GET "/test" [& more] (str "<pre>" more "</pre>"))
  (GET ["/:filename" :filename #".*"] [filename]
    (response/file-response filename {:root "./static"}))
  (ANY "*"  [] "<h1>Page not found.</h1>"))
Run Code Online (Sandbox Code Playgroud)

我知道理解所有这些的关键在于一些宏观伏都教,但我还没有完全理解宏(还).我已经盯着defroutes源头很长一段时间了,但就是不明白!这里发生了什么?理解"大创意"可能会帮助我回答这些具体问题:

  1. 如何从路由功能(例如workbench功能)中访问Ring环境?例如,假设我想访问HTTP_ACCEPT标头或请求/中间件的其他部分?
  2. 什么是解构({form-params :form-params})?在解构时我可以使用哪些关键字?

我真的很喜欢Clojure,但我很难过!

clojure compojure

107
推荐指数
2
解决办法
2万
查看次数

您是否能够为ORDER BY子句使用自定义Postgres比较函数?

在Python中,我可以编写一个排序比较函数,它返回集合中的项目{-1, 0, 1}并将其传递给排序函数,如下所示:

sorted(["some","data","with","a","nonconventional","sort"], custom_function)
Run Code Online (Sandbox Code Playgroud)

此代码将根据我在函数中定义的归类顺序对序列进行排序.

我可以在Postgres中做相同的操作吗?

例如

SELECT widget FROM items ORDER BY custom_function(widget)
Run Code Online (Sandbox Code Playgroud)

编辑:欢迎使用示例和/或指向文档的指针.

sorting postgresql

18
推荐指数
2
解决办法
4807
查看次数

优雅地处理"MySQL已经消失"

我正在用Python编写一个小型数据库适配器,主要是为了好玩.我试图让代码优雅地从MySQL连接"消失",即wait_timeout超出的情况中恢复.我已经准备好了wait_timeout,10所以我可以尝试一下.

这是我的代码:

def select(self, query, params=[]):
        try:
            self.cursor = self.cxn.cursor()
            self.cursor.execute(query, params)
        except MySQLdb.OperationalError, e:
            if e[0] == 2006:
                print "We caught the exception properly!"
                print self.cxn
                self.cxn.close()
                self.cxn = self.db._get_cxn()
                self.cursor = self.cxn.cursor()
                self.cursor.execute(query, params)
                print self.cxn

        return self.cursor.fetchall()
Run Code Online (Sandbox Code Playgroud)

接下来我等待十秒钟并尝试提出请求.这就是CherryPy的样子:

[31/Dec/2009:20:47:29] ENGINE Bus STARTING
[31/Dec/2009:20:47:29] ENGINE Starting database pool...
[31/Dec/2009:20:47:29] ENGINE POOL Connecting to MySQL...
[31/Dec/2009:20:47:29] ENGINE POOL Connecting to MySQL...
[31/Dec/2009:20:47:29] ENGINE POOL Connecting to MySQL...
[31/Dec/2009:20:47:29] ENGINE POOL Connecting to MySQL... …
Run Code Online (Sandbox Code Playgroud)

python mysql

17
推荐指数
1
解决办法
8185
查看次数

malloc()崩溃,说损坏的双链表

编辑完整源代码在这里:

http://code.seanwoods.com/reynard.fossil.cgi/artifact/0cc9cbfbe021c2ba86dcb4d0cf6ada52f0a80063

在这里拨打电话:

http://code.seanwoods.com/reynard.fossil.cgi/artifact/891405e62c95349aaf461dfb8ba82259f77fac9b

我有一个相对简单的内存分配失败.虽然它确实在几个地方分配内存,但应用程序并不是特别复杂.它是C,而不是C++.我很肯定这是一个分配内存的问题,而不是释放内存.

这是代码:

printf(":2 %d %d\n", initial_len, initial_len * sizeof(char));
o->data = (char*) malloc(initial_len * sizeof(char));
printf(":3 \n");
Run Code Online (Sandbox Code Playgroud)

执行后,我得到:

:1
:2 1024 1024
*** glibc detected *** ./menv: corrupted double-linked list: 0x0000000001d14400 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x76d76)[0x7f680cfc4d76]
/lib/x86_64-linux-gnu/libc.so.6(+0x771ed)[0x7f680cfc51ed]
/lib/x86_64-linux-gnu/libc.so.6(+0x794d4)[0x7f680cfc74d4]
/lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x70)[0x7f680cfc9b90]
./menv[0x403971]
./menv[0x40391d]
./menv[0x4030ec]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xfd)[0x7f680cf6cead]
./menv[0x401369]
======= Memory map: ========
00400000-00405000 r-xp 00000000 08:03 2621441                            /home/swoods/code/reynard/modules/stdlib/menv
00605000-00606000 rw-p 00005000 08:03 2621441                            /home/swoods/code/reynard/modules/stdlib/menv
00606000-00706000 rw-p 00000000 00:00 0 
01cfd000-01d3d000 rw-p 00000000 00:00 0                                  [heap] …
Run Code Online (Sandbox Code Playgroud)

c malloc

10
推荐指数
2
解决办法
2万
查看次数

支持宏的语言如何跟踪调试的源代码?

这是一个关于宏的理论问题(我认为).我知道宏可以获取源代码并生成目标代码而无需对其进行评估,从而使程序员能够创建更多功能的语法结构.如果我必须对这两个宏系统进行分类,我会说有"C风格"宏和"Lisp风格"宏.

调试宏似乎有点棘手,因为在运行时,实际运行的代码与源代码不同.

调试器如何根据预处理的源代码跟踪程序的执行情况?是否有一个特殊的"调试模式"必须设置为捕获有关宏的额外数据?

在C中,我可以理解你为调试设置了一个编译时开关,但是解释语言(如某些形式的Lisp)会怎么做呢?

为不尝试这一点而道歉,但是lisp工具链需要的时间比我花费的时间要多.

c lisp macros language-implementation

9
推荐指数
1
解决办法
608
查看次数

我应该对仅存在于{class,method}中的变量使用线程本地存储吗?

我正在用Python的Queue.Queue类实现一个相对简单的线程池.我有一个包含Queue实例的生成器类以及一些便捷方法,以及一个子类的使用者类threading.Thread.我基于整数为我想要在池中的每个线程("工作线程",我认为它们被调用)实例化该对象.

每个工作线程flag, data取消队列,使用自己的数据库连接对其进行处理,并将行的GUID放在列表中,以便生产者类知道作业何时完成.

虽然我知道其他模块实现了我编码的功能,但我编码的原因是为了更好地理解Python线程的工作原理.这让我想到了我的问题.

如果我将任何东西存储在函数的命名空间或类的__dict__对象中,它是否是线程安全的?

class Consumer(threading.Thread):
    def __init__(self, producer, db_filename):
        self.producer = producer
        self.conn = sqlite3.connect(db_filename)  # Is this var thread safe?
    def run(self):
        flag, data = self.producer.queue.get()

        while flag != 'stop':
            # Do stuff with data; Is `data` thread safe?
Run Code Online (Sandbox Code Playgroud)

我认为两者都是线程安全的,这是我的理由:

  • 每次实例化一个类时,__dict__都会创建一个新类.在上面概述的场景中,我认为任何其他对象都不会引用此对象.(现在,如果我使用join()功能,情况可能会变得更复杂,但我不是......)
  • 每次调用函数时,它都会创建自己的名称空间,该空间在函数的生命周期中存在.我没有做任何变量global,所以我不明白任何其他对象如何引用函数变量.

这篇文章在某种程度上解决了我的问题,但对我来说仍然有点抽象.

在此先感谢您为我清理这个问题.

python concurrency multithreading namespaces

4
推荐指数
1
解决办法
1615
查看次数