Other articles


  1. Go 扔掉template method

    Published: 周四 14 五月 2015
    By jjx

    In misc.

    在支持继承的语言中, template method 是代码重用的一种常见方式, 此方法的通用模式是

    • 定义一个接口 如BaseService
    • 创建一个类实现该接口, 完成程序的主要骨架, 将变动的方法抽象出来, 让子类继承实现

    在go中, 这种方式行不通

    package main
    
    
    type BaseService interface{
       Invoke(request map[string]interface{})
    }
    
    
    type DefaultBaseService struct {
    
    }
    
    func (self *DefaultBaseService) Invoke(request map[string] interface{}){
    
        self.ReadId()
    }
    
    func (self *DefaultBaseService) ReadId() {
    
        println("DefaultBaseService");
    }
    
    
    type UserService struct {
       DefaultBaseService
    }
    
    func (self *UserService) ReadId …
    read more

    There are comments.

  2. 尝试在ubuntu/os x上使用c#

    Published: 周六 09 五月 2015
    By jjx

    In misc.

    最近微软的举动还是挺让人心动的, 但 https://github.com/dotnet/coreclr 中的dnx 部分, 除了使用mono的运行时, 使用coreclr 在os x/ubuntu 上都没有能跑起来.

    最近的一个问题是cpython 的pyopenxl , 导出excel 的write_only优化, 存在着以下问题

    • datavalidate list 在write_only=True时无效
    • save_virtual_workbook 在write_only=True下无效

    但是不启用write_only, 26000多条记录导出在有datevalidate 的情况下跑出20多秒, 无法接受

    使用pypy 则会降低到7到5秒, 但目前pypy访问db的性能还是比cpython慢一倍, 无法在正式环境中接受使用它

    所以, 有一个想法是想使用mono, 初步的测试是

    • netmq
    • aspose cells
    • json.net
    • dapper
    • npgsql

    python 通过 pyzmq 向 .net …

    read more

    There are comments.

  3. jython27 beta 3

    Published: 周五 09 五月 2014
    By jjx

    In jython.

    最近 jython 发布了 2.7 beta2 , 这里想说的是即将到来的beta3.

    Jim Baker 在jython-dev上的邮件说明 beta3 主要是合并socket-reboot分支的, 这个 分支主要 是Design of a reworked implementation of socket, ssl, and select modules for Jython, using Netty 4.

    并且这个版本 easy_install/pip将能重新工作在jython 2.7中

    但我的尝试是运行ez_setup.py时的这个 错误

    open(os.devnull, 'wb')
    

    引发 IOError, google以下, 好象有人报告这个错误, 不过同我这里还不一样 http://bugs.jython …

    read more

    There are comments.

  4. jvm 互操作笔记

    Published: 周五 09 五月 2014
    By jjx

    In misc.

    当前, 使用java很多时候不可避免, 比方说以下场景

    1. excel 导出需要更多的控制 ,xlwt/xlrd 无法实现类似data validation using dropdown list之类的特性, 有个包支持但格式限制在2007
    2. taobao 消息通知, 目前只提供java/c# sdk
    3. 大数据

    交互的手段很多

    1. 在python内部使用jpype/pyjnius 这样 的桥接工具调用
    2. 通过 jython, 然后在用消息队列或是pyro这样的支持jython/ironpython/python这样的包交互或者进程交互
    3. 直接java/groovy写, 然后通过消息队列或者进程交互

    目前, 尝试的工具有

    • pyjnius 调用 poi
    • jython + jzmq
    • java + jzmq

    都是可以运作的, 不过前两个选项都存在一些缺点

    pyjnius 问题

    1. 由于python是多进程部署, 由于java的内存占用, 这不是一个好主意, 会导致内存浪费的比较严重!
    2. 包本身问题 …
    read more

    There are comments.

  5. django admin 联动

    Published: 周日 22 九月 2013
    By jjx

    In misc.

    在 django-admin 中实现联动,比方说 省/市下拉列表的联动有些麻烦,但还是可行的,下面说明一下大概的过程, 数据源的不同也会影响一些处理代码,请自行修改。下面的代码其实是在讲country/state的联动,但原理一致。

    定义数据源

    简单起见, 我们在settings.py定义一个LOCATION 变量

    LOCATION = {"浙江": ["杭州", "宁波"], "湖北": ["武汉", "xxx"]}
    

    models.py 中的model 定义

    这里没有为state定义choices 是因为state的选项是根据country的值变化的

    from django.conf import settings
    from django.db import models
    from django.utils.translation import ugettext as _
    
    COUNTRY …
    read more

    There are comments.

  6. 简历管理

    Published: 周一 15 七月 2013
    By jjx

    In misc.

    这是一个定制的小应用文档. 该使用使用cefpython和bootmetro构建, 使用了comtypes/pil/sqlalchemy等包。

    安装

    1. 安装visual c++ 2008和2010 运行时
    2. 解压resume.rar 到任一磁盘目录(注意, 路径应该不能包含中文), 双击目录中的client.exe

    注意事项

    1. 导入的简历文件格式必须同提交给开发者的保持一致, 但也可以通过client.json的中的MAPPING配置项, 重新配置内容和单位格位置的映射。
    2. 在导入时,根据所属单位自动确定所在公司(部门), 如果所属单位没有找到对应的记录,则会显示在未分类。
    3. 当前,使用comtypes 调用excel, excel 必须安装在目标机器

    帮助

    1. 如果是第一次使用, 会让你输入公司和下级部门(这里部门也可以当子公司概念使用). 后期,可以通过部门维护来维护公司和部门数据. (简称有两个用途,1 是在填写excel简历时,填写者可能写公司缩写, 二是系统在显示时使用简称避免界面上可能的换行)
    quick_start
    1. 进入主界面. 这个界面完成主要的功能
    • 按公司和部门, 搜索, 选择特定的项目(选择列按钮)显示简历 …
    read more

    There are comments.

  7. cefpython 当前的两个问题

    Published: 周三 10 七月 2013
    By jjx

    In misc.

    最近, 使用cefpython 写 yarder.co 的客户端, 使用的是 cefpython和 bootmetro. 主要发现这两个问题, 写下来供大家选择cefpython 时参考.

    首先是 当js调用python时, python的异常不会传播到javascript. 这个问题参考 Throw JS / Python exceptions according to execution context

    所以,当前你的处理方式应该是在python内部处理异常,并返回一个是否成功的状态给js!

    def my_method(self):
    
            try:
    
                    #你的代码
    
                    return {"success": True, "result": xxxx }
            except Exception as ex:
                    # log excpeiton
                    return {"success": False, "error": ex.message}
    
    var …
    read more

    There are comments.

  8. 我的框架观点

    Published: 周日 30 六月 2013
    By jjx

    In misc.

    我对创建能二次开发的软件一直很迷恋,最早影响我的是ms office,特别是excel.

    • excel堪称完美的对象模型
    • 内建的vba 开发环境和excel对象模型的完美交互.

    很多年前, c3 的模型就借鉴了excel的对象模型构建.

    在后来, ms 的axapta 再一次给我很大的影响. axapta 内嵌的application object tree更为完美, 语言级别的orm, 核心保密, 外围开源的模式, 完美的分布式c/s结构,方便的更新方式对我影响很大, 我花了一年左右时间创建了一个叫marsx的项目.

    1. 使用delphi 开发
    2. 内嵌了paxcompiler语言,允许使用paxcompiler中的pascal语言进行开发
    3. 创建了application object tree, 可以ctrl+d启动开发环境
    4. 代码编译后放在服务器端数据库, 用户登录时检查更新动态下载代码达到更新效果
    5. 创建了activex 控件, 解决发布的问题
    6. 借助remobjects dataabstract , 实现分布式数据访问.

    marsx 在某些方面是成功的,他达到了我的一些目的: 达成软件即开发环境是可能的, 在开发时也有很好的效率, 特别是ui的定制上, 几乎是客户要什么现场就可以完成. 但主要的问题在paxcompiler …

    read more

    There are comments.

  9. clojure 学习笔记

    Published: 周六 29 六月 2013
    By jjx

    In misc.

    学习lisp 可以防止老年痴呆! 所以,我会慢慢的, 不断的反复的看clojure, 即使用不上:).

    lisp的基础思想是简单的,但lisp语言是复杂的!

    clojure可能是jvm中实现最好的动态语言了, groovy已经沦为java的小弟, 它很少有自己的库(gradle这样的工具不算), jython的更新迟缓, jruby一般就是兼容使用ruby的库,很少有原生为jruby开发的库. 而clojure的库,则是发挥了clojure的特点, 比方说korma 就是一个很吸引人的东西.

    lisp基本点

    1. 当对一个列表求值时, 第一个是函数, 其他是参数, 用`阻止对列表求值
    2. lisp 没有ast这样的过程. 代码就是ast

    我所讨厌的东西

    太多了, clojure中充满了各种符号的滥用和一件事情多种做法! 我讨厌一种事情有多种做法,很多时候,它意味着总有一些方法不是最佳的,你总是需要做选择,我讨厌做选择!

    各种符号的滥用解很大程度上是需要改善lisp的括号使用, 符号使用列表:

    # 的使用。 #{1 2 3 } 表示set, #"\W+" 表示正则, #(> (count %) 2) 表示匿名函数, #_宏表示忽略下一个clojure形式.
    * repl …
    read more

    There are comments.

  10. 敏捷中的结对和tdd

    Published: 周三 19 六月 2013
    By jjx

    In misc.

    今天我转了两篇文章, 都是抨击敏捷开发的, 都深合我意. 所以不得不多说几句.

    先说结对, 我绝对是属于内向类型的, 当然喜欢安静的解决问题, 同作者一样,我更倾向通过代码评估来交流. 另外,两个大男人坐了一起结对,令人感觉好不自然,太基了!

    如果同美女结对,我会取消我的上一句话

    至于第二篇, 可能有些人就以为作者又在摆酷了, 但我想是因为作者没有说的更深入, 他的意思被误解了.

    tdd, 与其说是一种测试方法, 我更倾向于认定他是一种开发方式, 这种方式, 融合在你的编码过程中. 在dbanotes上我的评论就是: 如果一件事情最初需要三个过程, 则tdd的测试代码会忠实的反映这三个过程. 但后期, 有人可以用更简捷的一个过程实现, 或是二个过程实现,或是更改了其中一个过程的返回方式(当然,这样也会影响下一个结果的接收方式), 但最终结果还是正确的. 性能也好了,代码也更好了. 但是, 如果他不修改最初的tdd测试代码(很大可能不是他写的),则测试不会通过.

    当tdd测试代码几倍于实际的代码时, 这就是作者抱怨的问题. 也是一种阻碍生产力的体现.

    我同作者的看法一样, 测试代码更应该关心结果而不是关心过程, 这才是测试的所在!

    read more

    There are comments.

  11. 整理google docs上的资料, 记录一些有意思的东西

    Published: 周日 16 六月 2013
    By jjx

    In misc.

    google docs 上有很多好几年前杂乱无章的东西, 打算陆续看一下,该删的都删了

    一些有意思的想法

    框架设计其实是一个哲学概念,每个成功的框架总是有一套自己的处世哲学,然后在以后一以贯之,比方说大家熟悉的spring,就是以ioc,接口编程贯彻始末.

    不在烦恼架构问题, 对我而言,这就是生产力

    面向对象设计的问题在于使用者必须了解整个对象的体系结构,面向对象设计往往通过template method 达到代码重用,但由于设计改变,开发者不得不引入更多的中间方法。随着对象体系的复杂度增大,整个结构会越来越难以维护。由于更改结构对下层使用者的影响不可估计,也导致改变代码是困难的。

    所以在使用template method时,不要让继承大于3级以上, 一般都是Base/Abstract/具体的类。 多使用策略模式,利用接口和委托减少复杂度。

    看到n年(2007)前写的公司经营设想, 不由的脸红, 不过里面有很多点都是对的, 如

    • 对于每个要我们做软件的企业,我们将争取他们为以后的后续服务提供费用
    • saas 将是未来软件主要存在的形式,是我们今后的努力方向

    错误是没有放弃桌面软件, 没有将精力集中到web, 沉迷于实现axpata类似分布式桌面应用框架, .然已经用python, 但还没有发现python其实是最爱. 还是在定制 …

    read more

    There are comments.

  12. extjs 4 NodeInterface destroy

    Published: 周日 16 六月 2013
    By jjx

    In misc.

    extjs 4 有一些可说是sb的设计, 比方说model的save和destroy服务端报错时不返回responseText, 或许它是一切都在success中处理, 所有访问都是http 200, 错误你自己传递给客户端。 显然这是不现实的。

    当然,这个可以通过覆盖 Ext.data.proxy.Server.setException来hack

    Ext.data.proxy.Server.override({
      setException: function(operation, response){
          operation.setException({
              status: response.status,
              statusText: response.statusText,
              responseText: response.responseText //<--Added this line!
          });
      }
    });
    

    这里要说的是tree的node的destroy, 无论服务端是否出错, 它一定会把节点给删掉, 不合理啊。 extjs论坛有人发贴 NodeInterface destroy with callback?,无人理睬。

    当然 …

    read more

    There are comments.

  13. ok, 这是我第一篇 pelican blog

    Published: 周三 12 六月 2013
    By jjx

    In misc.

    自定义菜单

    通过以下三个选项自定义菜单

    DISPLAY_PAGES_ON_MENU = False
    DISPLAY_CATEGORIES_ON_MENU = False
    MENUITEMS = (('未分类', 'category/misc.html'), ('关于我们', 'about-us.html'), )
    

    建议你建两个同级目录,比方说就是jiangjianxiao.github.com和blog, blog用来存放pelican建立的站点, jiangjianxiao.github.com 就是pelican的原始内容

    修改 pelicanconf.py, 增加:

    OUTPUT_PATH = '../jiangjianxao.github.com'
    

    pelican-plugins 建议用submodule的方法获取

    git submodule add git://github.com/getpelican/pelican-plugins.git

    然后在其他机器就是git submodule init/git submodule update了

    我的publish.sh …

    read more

    There are comments.

  14. 给用 Python 的 web 开发者的 Sublime Text 2 小贴士

    Published: 周日 16 九月 2012
    By jjx

    In misc.

    原文:http://opensourcehacker.com/2012/05/11/sublime-text-2-tips-for-python-and-web-developers/

    译者: TheLover_Z

    Sublime Text 2 是一个很强大的编辑器,最近开始获得了很高的人气 - 这不是没有理由的。它是商业软件。Sublime Text 2 有很多支持 Python 的插件。虽然核心部分保持封闭但围绕着这个编辑器还是形成了 活跃的插件生态系统 。

    提示:你可以免费使用 Sublime 。它只是会提示你“请购买”而已。

    这是我使用 Sublime 这么久以来发现的小技巧。我是站在在 OS X 视角来写的,但在 Linux 和 Windows 平台这些技巧应该也适用。

    我以前是 Eclipse 的死党。虽然 Sublime 并没有像 Eclipse …

    read more

    There are comments.

  15. ubuntu 中设置 PYTHONPATH

    Published: 周五 10 八月 2012
    By jjx

    In misc.

    一开始 是通过设置环境变量来进行的,可以编辑/etc/profile或是用户目录下的.profile

    增加

    export PYTHONPAHT=/home/jjx/works/earrow:/home/jjx/works/c92

    然后 用source /etc/profile或source .profile生效

    但在sudo下无效,如 sudo python

    import earrow 还是错误 ,所以 改用 pth的方式 最为简单

    先查看python site-packages位置

    import sys
    print sys.path
    

    然后

    cd /usr/local/lib/python2.7/dist-packages sudo gedit …
    read more

    There are comments.

  16. extjs 备注

    Published: 周日 17 六月 2012
    By jjx

    In misc.

    设置form所有字段只读

    Ext.form.Panel.override({
    
      setReadOnlyForAll: function(readOnly) {
        Ext.suspendLayouts();
        this.getForm().getFields().each(function(field) {
          field.setReadOnly(readOnly);
        });
        Ext.resumeLayouts();
      }
    });
    

    通过override 设置缺省值

    血的教训, 如果你要将所有窗体都设置frame为true, 不要每个form都去设置, 而是使用

    Ext.form.Panel.override({
            bodyPadding: 10,
            frame: false // or true
    
    });
    

    extjs 4.2 海皇星主题,frame 将是很粗的一根, 而且当form被嵌入到其他容器时,除了这个很粗的框, 背景没有同容器一样, 所以在该主题中frame应该设置为false

    1. Store datachanged 对update没有效果 …
    read more

    There are comments.

  17. windows 下nginx和tornado 配置

    Published: 周四 07 六月 2012
    By jjx

    In misc.

    在windows下,nginx和tornado 都可以以残废形容.两者均只能使用select,很多功能都在windows下无法正常运行. 但对于并发用户不高的需求而言,还是可以一试的.

    结合nginx和tornado 还是有好处的, 主要是减轻tornado的负担,典型的如让nginx处理静态文件,让nginx处理gzip.由于tornado是单线程的,让nginx进行负载平衡也很有必要.

    修改 nginx/conf目录下的nginx.conf ,替换为

    说明

    1. worker_process 配置为1, 是因为windows下只支持一个工作进程
    2. worker_connections 1024就行,因为select有限制
    #user  nobody;
    
    worker_processes  1;
    #daemon off;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    pid        logs/nginx.pid …
    read more

    There are comments.

Page 1 / 2 »

links

social