Booker

Booker 查看完整档案

广州编辑  |  填写毕业院校oracle cloud  |  python 编辑 live 编辑
编辑

纪念我逝去的猫咪 2016/10/04

个人动态

Booker 赞了回答 · 2017-01-30

解决python的list的append方法的性能问题

Iterating through the multiple calls to append adds to the complexity, making it equivalent to that of extend, and since extend's iteration is implemented in C, it will always be faster if you intend to append successive items from an iterable onto a list

结论:
extend要高效于append。

append vs extend

关注 3 回答 1

Booker 提出了问题 · 2017-01-28

请教CLI使用前需要进行验证,那么机制怎样设置比较合理?

各位好!目前在制作一个CLI的程序,在验证方面的设计由于经验不多,想请教一下关于验证的设置方式如何是比较符合科学的,在说问题前有比较重要的两点必须说明:

  1. CLI必须登录到远程主机才能进一步使用, 这意味着其实是一个POST请求来登录的。

  2. CLI可以结合shell脚本使用,关于这一点也不难,仅仅需要为用户设置一个环境变量,让它能随时调起CLI程序。

问题: 假如我需要支持shell调用CLI,那么我要采取何种验证的方法呢?目前自己可以想到的方法如下:

  1. 每一行命令都需要明文输入帐号密码,后面参数再继续加入真正执行的命令。
    优势:实现十分简单,简单直接。劣势:简直反人类,密码明文编写非常不安全。

  2. 有效时间+文件路径+文件md5校验的一次性验证方式。在cli用引导方式引导用户输入密码后,会把相关信息保存。待用户运行该脚本时,进行验证即可。这个用于一次性的验证。优势:单词验证,即使不同权限用户操作同一机器都没有问题。劣势:还是相当麻烦的。

  3. 生成key验证。把公有key放到远程上,私有key放在本机上。这一点和git是完全一致的,就不再详述。优势:验证方式一经设置永久生效,非常方便。缺点:这一点不适用于公用电脑。

总结:

各个方案各有缺点。由于缺乏相关的经验,很可能看不到潜在的缺陷,也不大清楚目前比较好的做法有什么,在此很想咨询一下有没有更好的方案,非常感谢!

目前想法是三种方法都会提供给用户自行选择。

关注 2 回答 0

Booker 提出了问题 · 2016-12-28

解决[C语言]一个带有可变长度字符串参数的函数在接收长字符串时报错

目标函数,是接受一连串的字符串,可能非常的长,然后把每个字符转化成对应的16进制(字符串格式)
但是如下会报错。但假如我缩短param的字符长度为比如”JJJJJJJJJJ“,就不会报错了。
由于认为char *character为可变长度且用了malloc不理解为何会过长。求教,非常感谢!

char *convert_to_16(char *characters, int n){

    // int c_length = strlen(characters);
    char sub_buffer[3];
    char code[3];
    char buf[3];
    char *buffer = (char*)malloc(sizeof(characters) * 2);
    for(int i=0; i < n; i++){
        strncpy(code, characters+i, 1);
        code[1+i]=0;
        sprintf(sub_buffer, "%x", *code);
        sprintf(buf, "%s", sub_buffer);
        strncat(buffer, buf, 2);
    } 
    return buffer;
}

int main(){
    char param[] = "JjjjjdddddddddJJJJJJJJJJJJJJJJJdddjjj";
    printf("%s\n", param);
    int length = strlen(param);
    printf("%s\n", convert_to_16(param, length));
}




问题已经解决,去掉code[1+i]就无问题了。但是原理和内存方面的控制貌似会有问题,若有见解欢迎赐教,谢谢!

关注 5 回答 3

Booker 回答了问题 · 2016-12-24

解决ubuntu复制文件到其他盘,提示我目标是只读的

文件系统不一致导致失败没试过,用df -T -h看看系统下的文件系统是什么。
比较常用的如redhat7的xfs,经常使用的zfs,网络文件系统nfs,还有ubuntu的ext都没有遇到过这种问题。
我猜的另外一个原因可能是没有权限。

关注 4 回答 4

Booker 关注了问题 · 2016-12-24

解决ubuntu复制文件到其他盘,提示我目标是只读的

RT

关注 4 回答 4

Booker 关注了问题 · 2016-12-21

python的logging无法输出到文件?

logging配置如下:

logging.basicConfig(level=logging.DEBUG,\

format="%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s",\
datefmt="%a, %d %b %Y %H:%M:%S",\
filename="i2_insert_equipments.log",\
filemode="w")

但当在代码中使用logging.info的时候,目录下无日志文件生成。但当在控制台中运行的时候,是可以正常运行的,有知道这种现象如何解决的么? 望告知一下,谢谢。

关注 3 回答 3

Booker 回答了问题 · 2016-12-21

python的logging无法输出到文件?

这种设置太简陋了,只输出stream是配置问题,请参考官方文档。

在logging这里最好不要做任何设置,就是说不要用basicConfig,而要用handler。
通过使用FileHandler去定义文件名,设定级别等等,另外再设定一个StreamHandler去定义输出流。
因为一旦为logging加了设置,一旦handler的设置里没有的,logging就会顶上,假如handler也有设置的,那么handler就会覆盖logging相同的设置,实际应用会造成奇怪的现象,所以best practise是不要在logging层面作任何的设置。除非你想对日志进行全局设置。

建议还是使用yaml配置文件来进行配置

输出文件可以通过以下方式(详情设置请参考文档)
注意TimedRotatingHandler必须从logging.handler里引入
另外logging对多进程没有保护,切割瞬间有可能造成日志丢失

import logging
import logging.handler

fh = logging.FileHandler('insert.log')
fh.setLevel('logging.DEBUG')

sh = logging.StreamHandler()
sh.setLevel('logging.NOTSET')

....


logging.addHandler(sh)
logging.addHandler(fh)

...

logger = logging.getLogger('System.Log')
logger.error('error info')

关注 3 回答 3

Booker 提出了问题 · 2016-11-10

RabbitMQ获取队列消息(messages of queue)时能否从尾部开始获取(consume)?

在用rabbitmq做一个消息队列,把消息不断地发回前台,已经做完,但有些细节比较困扰。

功能目标:

1.后台消息是源源不断产生的,前台则是不断能够看到最新的消息在跳动。

2.消息不能仅仅是在跳动,还必须能翻查最近的历史记录,比如500条,3000条等等。

3.用户可能开多个客户端,消息必须在每个客户端都能出现,而且被消费后consume里不能删除,避免消息过多,所以我限制了queue的长度。此外,不能删除是因为用户可能切换页面,所以切换回来需要重新请求,若consume即删除,消息就没了。这也是不能删除的原因之一。除非前端帮我储存这些消息,然而我不打算让前端做这个事情= =。

4.所以我在想假如能在queue里不断publish messages进入队列的同时,不断读取最新被publish进去的消息(recent messages),那就非常方便了。否则读取的第一条信息是最旧的,那么我要读取完queue长度的消息才能够获取最新的消息。然而,当队列最大程度比较大时(x-max-length),比如10000,那么我要请求10000条消息。

5.目前用的是http获取,python tornado异步。若需要可改用websocket。瓶颈暂未确定是从rabbitmq里读取消息的速度还是网络传输速度。目前请求500条,需要2秒左右的时间。前端的做法是不断定时请求我的数据接口来获取消息。当然,用户的窗口容不下超过200条的信息,但不能让滚动条也变得太短= =。

6.我反复查过rabbitmq的doc和查找过rabbitmq的问答,google社区等都找不到相关的内置方法,不知道rabbitmq本身是否有这个方法?

对此,是否有好的方案推荐,求教,谢谢!

关注 2 回答 0

Booker 赞了回答 · 2016-11-04

popen被阻塞

popen用法错了,它的第一个参数是字符串或者字符串数组,
如popen('cat /tmp/log')或者popen(['cat', '/tmp/log'])。

你的代码里在popen中直接调用hello,直接死循环,并没有开启新的进程。

关注 2 回答 1

Booker 提出了问题 · 2016-11-02

解决一个设计模式的请教

这几天遇到一个BUG引发的联想,起因是一个ORM(peewee)把python内置的logging的配置给覆盖了,正常的东西无法输出,反而是输出大量转化后的原生的SQL语句。而导致这个问题仅仅是引用了一个类(还没初始化,仅仅是引用)。

因此,想请教一下,是否算是一种设计模式,像角色扮演游戏那样,一个角色可以为附近的队友加buffer一样的效果。比如说我在一个脚本里用print输出一些文字到sys.stdout上,然而,只因为我导入了某个类进来,print的含义马上从输出变成发送这些消息到一个邮箱。相当于给print加了buff,建立起一个立场一样。或者说角色扮演的一个角色因为“变身”,而原来的技能都变了样。那样就可以实现“组件化”一般了,而之前我常用对象继承封装次数一多耦合度和BUG都会急剧增加。

正常情况

# 输出字符串
print 'design pattern'

增加buffer

from somewhere import mail_buffer
print 'design pattern'
#某人收到一封邮件,里面写着'design pattern'

我查找到一些现成设计模式的说明,然而我也是新手,看不出大概是对应哪一种设计模式,不知道对设计模式熟悉的人看完上面是否有点思路?谢谢!

关注 2 回答 1

认证与成就

  • 获得 19 次点赞
  • 获得 73 枚徽章 获得 1 枚金徽章, 获得 24 枚银徽章, 获得 48 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2014-12-05
个人主页被 1k 人浏览