我的mondrian最佳实践

  • 使用saiku框架(内置mondrian的一个Cube UI框架), 其提供的手动清除缓存功能,及非常方便的拖拽功能,能极大提升重载schema调试cube的节奏
  • 使用infobright(一种mysql的列式数据库存储引擎)作数据仓库,它的查询效率比普通mysql提升好几倍,使得大表join大表变为可行,特别是在使用了VirtualCube时,只有这样,设计的cube才拿得出手给人用。
  • 使用VirtualCube进行多个Fact Table的关联,这种做法需要适当增加冗余维度,一般除了要设置"常规维度",还得增加"事实维度"。两种维度的层级设置,字段名设置要保持一致,特别是大小写,稍有差异,某子cube的相关指标就可能为空。
  • 配置“事实维度”时,最好给< Join >标签内的表设置alias属性,因为在使用“事实维度”时,mondrian可能会搞错表名,某表自己join自己,结果就是报“aggregation too large”异常。
  • 多去看看mysql的slow query log,里面有mondrian实际执行的sql语句,只有深圳理解了mondrian是如何把mdx查询转成等价sql语句来执行的,才能更好地编写cube schema,实现更复杂的统计。

to be continue......

sudo port install subversion-javahlbindings +no_bdb +universal失败

sudo port install subversion-javahlbindings +no_bdb +universal

最后关头出错

Error: Failed to configure subversion-javahlbindings, consult /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_devel_subversion-javahlbindings/subversion-javahlbindings/work/subversion-1.8.5/config.log

Error: org.macports.configure for port subversion-javahlbindings returned: configure failure: command execution failed

通过google搜到一遍贴子:http://trac.macports.org/ticket/41378

确认是JAVA_HOME环境环境变量丢失的问题,需要修改文件

/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_tarballs_ports_devel_subversion-javahlbindings/subversion-javahlbindings/work/subversion-1.8.4/configure

在里面加上这行:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home/

然后重新sudo port install subversion-javahlbindings +no_bdb +universal就好了

django使用My97DatePicker的最简单方法

  1. 在app的widgets.py内创建新DateInput,继承自默认DateInput,在init方法里增加My97DatePicker要加的两个参数

    from django.forms.widgets import DateInput
    class My97DateInput(DateInput):
       def __init__(self,attrs={}):
          super(My97DateInput,self).__init__(attrs)
          self.attrs['onclick']='WdatePicker()'
          self.attrs['class']='Wdate'
    
  2. 在app的forms.py内修改系统DateField绑定的widget

    import widgets
    import django
    django.forms.fields.DateField.widget=widgets.My97DateInput
    
  3. 在模板html里记得包含My97DatePicker的js文件即可

阿里云服务器安装gcc编译器

售后支持 › 为何linux里没有c编译器? 问题编号:187300 关闭问题

  • gcc,cc等等编译器都没有,叫我如何安装软件? 2013-02-25 00:55:43
  • 您好,云服务器提供纯净操作系统,如果您想使用gcc,需要安装下。在安装gcc的过程中需要安装kernel-headers包,而我们的系统为了防止用户在使用yum的时候误升级了linux系统内核,所以在/etc/yum.conf配置文件中有有一句:exclude=kernel* 此时只要将此句加注释即可。完成后使用yum -y install gcc即可将gcc安装成功。安装后请重新注释此句。请您了解。谢谢。 2013-02-25 00:57:44
  • 注释了
-bash-3.2# yum -y install gcc
Setting up Install Process
No package gcc available.
Nothing to do

坑爹啊!2013-02-25 01:00:56

  • 您好,这是因为yum源内容太老了导致的,您更新下yum源就行了。更新yum源可以参考下http://help.aliyun.com/manual?spm=0.0.0.0.M43iIk&helpId=1662。谢谢。
  • OK了,谢谢!2013-02-25 01:15:59

python中文数字转阿拉伯数字

我用了递归,所以代码比别人的精简,别人的我用过一些,发现有bug,然后就自己写了一个,目前还没发现有问题,欢迎大家一起来测测哈! 基本思路其实很简单,就是递归处理好每个大进位(从高到低) 的左边部分跟右边部分就OK了 比如 ( (七)十(一) )万( (零八)百() )

common_used_numerals={u'零':0,u'一':1,u'二':2,u'三':3,u'四':4,u'五':5,u'六':6,u'七':7,u'八':8,u'九':9,u'十':10,u'百':100,u'千':1000,u'万':10000,u'亿':100000000}

def cn2digits(uchars_cn):
    s=uchars_cn
    if not s :
        return 0
    for i in [u'亿',u'万',u'千',u'百',u'十']:
        if i in s:
            ps=s.split(i)
            lp=cn2digits(ps[0])
            if lp==0:
                lp=1
            rp=cn2digits(ps[1])
            #print i,s,lp,rp
            return lp*common_used_numerals.get(i, 0)+rp
    return common_used_numerals.get(s[-1], 0)

测试

cn2digits(u"九千七百五十八亿六百零一万零四百二十三")
975806010423

高效调试shell脚本的技巧

其实蛮简单的,一切支持单步执行的解释语言程序,用单步执行的单元测试方法是最好调试的:

  • 尽量多写函数
  • 每个函数写好后,立刻可以贴进解释器进行声明,构造简单测试数据,运行,看结果。
  • 结果不正确的话,改改再贴进去测试。如此反复
  • 结果正确的话,可以继续写下一个函数
  • 所有函数写完后,再写个main函数把所有函数串连起来就好,基本上没多少错了。
  • 如果某个函数在测试的过程要跑比较久,等待的时间可以构思与编写下一个函数,节约时间。

函数划分可参考一下我前面的帖子里的截图:用editplus编写好看的shell脚本

用editplus编写好看的shell脚本

下载bash.acp和bash.stx文件,这两个文件是分别实现语法高亮和语法自动完成用的。

http://pan.baidu.com/share/link?shareid=92073&uk=1729651712

保存至ediplus安装目录

在editplus配置里仿以下配置:

用editplus编写好看的shell脚本

函数模板正则表达式:

function[ \t]+[0-9a-zA-Z_]+[ \t]*\([ \t]*\)

配置完后确定保存,脚本就可以有漂亮的语法着色,

按Ctrl + F11,就可以调出函数列表窗口,快速定位shell函数了

用editplus编写好看的shell脚本

我的shell脚本文件模板及一些常用函数

#!/bin/sh
#
#Author: DenisHuang
#Date:
#Description:
#Usage:
#
#下面这行比较重要,主要是保证放在crontab里跑时,还能认出各个命令的路径,不然就得写死绝对路径
source /etc/profile
#下面这行当脚本里有用join相关的操作时很重要,某些编码格式会令sort的排序规则不一致,从而导致join出现数据丢失问题
export LC_ALL=C
#
#初始化参数
#最常见的参数就是每日定期运行的脚本所要用到的日期参数,不传值的话默认为昨天
#
function init()
{
  theDay="$1"
  if [ "$theDay" = "" ]
  then
    theDay=`date +%Y%m%d -d "1 days ago "`
  fi
  theDay2=`date +%Y-%m-%d -d "$theDay"`
}


#
#执行sql语句
#支持传参或管道方式
#
function executeSql()
{
  sql="$1"

  if [ "$sql" = "" ]
  then
    cat | mysql -uroot  -N  --local-infile
  else
    echo "$sql" | mysql -uroot  -N --local-infile
  fi
}
#
#产生分表序号
#在对分表进行批量sql操作时特别有用。
#
function range()
{
  echo "" | awk '{
    for(i=0;i<100;i++){
      printf("d\n",i);
    }
  }'
}
function range3()
{
  echo "" | awk '{
    for(i=0;i<1000;i++){
      printf("d\n",i);
    }
  }'
}
#
#url格式化编码
#在wget要post数据时,就可能要用到这个
#
function  urlencode() {
    od -An -tx1 | awk '{gsub(" ","%"); printf("%s",$0);}'
}
#
#下载html文档,源代码存在$html变量里,支持session保持,仿IE UA,透传Referer
#使用本函数就可以模拟登录动作等等,仿真度极高
#
function getHtml(){
  url="$1"
  wget "$url" -O a.tmp  -q --keep-session-cookies --save-cookies "cookie.tmp" --load-cookies "cookie.tmp" --retry-connrefused --tries=16 --user-agent="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)" --referer="$referer"
  html=`cat a.tmp | sed 's/\r//g' `
  referer="$url"
}
#
#等待指定的时间,如果本身作业时间超过了需等待时间,就不等待,直接进入下一步。
#在用死循环写的放后台进程跑的定时执行任务需求中,很有用。
#
function waitFor()
{
  targetTime=`date +%s -d "$thisTime $sleepInterval"`
  nowTime=`date +%s`
  sleepTime=`expr $targetTime - $nowTime`
  if [ $sleepTime -gt 0 ]
  then
    echo "等待$sleepTime..."
    sleep $sleepTime
    echo "继续下一步."
  fi
  thisTime=`date +"%Y-%m-%d %H:%M:%S"`
}
#
#保存断点,断点文件的格式为:文件名 断点 最后更新日期
#最后更新日期的作用是为了不保留过期的断点,以使得断点文件尽可能的小。
#
function saveBreakPoint()
{
  fname="$1"
  bpoint="$2"
  bptxt=`cat breakpoint.txt | awk '{
    if($1!=fname && $3>=yesterday){
      print $0
    }
  }END{
    print fname,bpoint,today
  }' fname="$fname" bpoint="$bpoint" today="$today" yesterday="$yesterday"`
  echo "$bptxt" > breakpoint.txt
}
#
#读指定文件的断点
#
function readBreakPoint()
{
  fname="$1"
  cat breakpoint.txt | awk '$1==fname{print $2}' fname="$fname"
}
#主函数
function main()
{
  init "$1"
}
main "$1"

django给特定字段指定使用CKEditor

比如给django默认的网页编辑模块flatpages添加CKEditor功能:

from django.contrib.flatpages import forms as fps_forms
from ckeditor.widgets import CKEditorWidget
fps_forms.FlatpageForm.Meta.widgets.update({"content":CKEditorWidget})

请举一反三,触类旁通。

讯飞语音识别python接口

自己做的,文件共享放在百度网盘: http://pan.baidu.com/s/1qWoFeJa

文件列表:

总计 1.2M
-rwxr-xr-x 1 root root   98 06-16 14:37 build.sh
-rw-r--r-- 1 root root   58 06-16 10:28 __init__.py
-rw-r--r-- 1 root root  180 06-16 10:28 __init__.pyc
-rw-r--r-- 1 root root 1.1M 06-16 14:37 libmsc.so
drwxr-xr-- 3 root root 4.0K 06-16 10:27 msc
-rw-r--r-- 1 root root 4.3K 06-16 14:37 _XunFei.cpp
-rwxr-xr-x 1 root root  708 06-16 14:37 XunFei.py
-rw-r--r-- 1 root root 1.4K 06-16 14:37 XunFei.pyc
-rwxr-xr-x 1 root root  11K 06-17 09:52 _XunFei.so

其中 build.sh为编译脚本,会把_XunFei.cpp编译成_XunFei.so, 然后XunFei.py再对_XuFei.so进行了一些简便接口封装。 libmsc.so为讯飞的linux64接口库. 自己build时处理好include路径lib路径那些就好,这里不细说。

使用方法:

from xunfei import XunFei
import os
a=XunFei("123456abc")
a.login()
s=a.iat("/root/speech/xunfei_linux64/bin/wav/iflytek02.wav",rate="8000",ent="sms8k")
print s
a.logout()