MDX常见问题

1、给measure起别名

WITH MEMBER [Measure].[newName] AS [Measure].[originName]
SELECT  [Measure].[newName] ON COLUMNS, xxx ON ROWS
FROM [myCube]

可达到将originName改为newName的效果。

2、查询原始fact记录

使用DRILLTHROUGH查询。

待续

Docker代替虚拟机

目的:为docker container分配一个与宿主机同网段的静态IP,允许同网段用户ssh访问这个container。

步骤1:启动ubuntu镜像:

docker run -itd --name container1 --net=none ubuntu

步骤2:进入container做一些设置:

docker exec -ti container1 bash
apt-get update && apt-get install openssh-server -y
echo 'root:mypassword'|chpasswd
service ssh restart
vi /etc/ssh/sshd_config //将PermitRootLogin值改yes

步骤3:可以用docker commit将这些工作打成镜像,以后开新container就方便了:

docker stop container1
docker commit container1 ssh_image:1.0
docker start container1
docker exec -tid container1 service ssh start #开启ssh服务

步骤4:安装并使用pipework设置网络(直连宿主机所在子网):

wget https://github.com/jpetazzo/pipework/archive/master.zip
unzip master.zip
pipework eth0 container1 10.1.10.86/24@10.1.10.1

参考资料

在应用里集成Mondrian时的Catalog位置问题

场景:在一个Webapp里集成Mondrian,按官方文档,Catalog位置(即cube文件所在路径)是这个样子的:

Catalog=file:demo/FoodMart.xml

但实际测试发现Mondrian无法找到这个文件,提示信息是“Virtual file is not readable”。如果把相对路径改为绝对路径则是可以的,例如:

Catalog=file:/c:/my/cube/folder/FoodMart.xml

绝对路径的问题是在不同开发部署环境下不太可能相同,所以还是得找其他办法。官方文档里没有写其他例子,按经验试试classpath协议(cube文件放在classpath下):

Catalog=classpath:/my/cube/resource/FoodMart.xml

在windows下居然成功了,其实Mondrian也是调用java.net.URL来获取资源的,所以能解释通。问题是,在linux下同样代码却不行,提示信息是“unknown protocal: classpath ”,两个开发环境都是JDK 1.7,没道理。(这个问题一直没解决)

后来查saiku(基于mondrian的一个开源BI软件)问题,发现还可以用这种写法(链接1链接2):

Catalog=res:/my/cube/resource/FoodMart.xml

试了一下,在windows和linux下都顺利通过。前提依然是cube文件要放在classpath下。这也是目前使用的解决方案。

补充:还有一种方法是直接写http://开头的链接,这需要把cube文件暴露出来,感觉不如res:的干净。

Docker安装和基本操作

安装Docker

环境ubuntu 14.04 LTS。如果已经安装过docker,请先卸载,方法见这个链接

在Linux系统安装docker使用下面的命令:

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

如果上述命令由于网络原因无法成功,可以使用阿里云的镜像(未验证,链接):

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动docker:

sudo service docker start

配置

官方文档,在/etc/docker/daemon.json里(如果没有这个文件可以创建一个)修改dockerd启动配置。但如果在systemd里已经指定的选项,是不能在daemon.json里再次指定的,例如-H选项。

其他配置dockerd的方式:

  • 在centos里,启动dockerd的选项在/etc/sysconfig/docker里修改。
  • 在ubuntu里,启动dockerd的选项在/lib/systemd/system/docker.service里修改。

要连接远程dockerd,在dockerd启动选项里要加上-H tcp://0.0.0.0:2375配置,在客户端docker命令里加上-H tcp://ip:2375选项。

镜像库

官方镜像:https://github.com/docker-library/official-images/tree/master/library

基本操作

在Docker里,容器(container)是镜像(image)的实例,查看所有image和所有container的命令分别为:

# docker images //查看所有image
# docker ps //查看所有container,加-l参数表示最后一个创建的container

Dockerfile相当于image的源代码,下面是一个示例Dockerfile:

FROM my-image
ADD local/my.jar /opt/my.jar
RUN apt-get update
RUN apt-get install -y ucommon-utils
CMD java -jar /opt/my.jar

从Dockerfile创建image的命令如下,其中tag是可选的一般填版本号,缺省值为“latest”

# docker build -t name:tag /path/of/dockerfile

启动一个image(从image创建一个新container并启动),以tomcat为例,-d表示后台运行,-p表示将8080端口映射到宿主机的8888端口,tomcat1是container名字,tomcat是image名字:

# docker run -d -p 8888:8080 --name tomcat1 tomcat

删除一个container,-f表示强制删除即使container在running状态:

# docker rm -f tomcat1

有时会遗留一些orphan的container和image,如果一直积累下去可能会占满硬盘空间。Docker没有提供专门的命令清理它们,可以考虑用下面的命令(参考链接):

# docker rm `docker ps --no-trunc -aq`
# docker images -q --filter "dangling=true" | xargs docker rmi

要查看每个容器占用资源情况(显示容器名):

docker stats $(docker ps --format={{.Names}})

(待续)

参考资料:

Docker从入门到实践

Shell脚本编程中的若干注意事项

几个特殊变量

变量 含义
$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$# 添加到Shell的参数个数
$0 Shell本身的文件名
$1~$n 添加到Shell的各参数值。$1是第1参数、$2是第2参数…。如果大于等于10序号要用花括号包起来,例如${10}

test命令

test命令用于检查文件类型和表达式(check file types and compare values),返回的结果放在“$?”里,结果为0表示true,结果不为0表示false。例如:

$ test "a" = "b"
$ echo $?
1

test命令可以用“[]”简写(注意[]里面要带有空格,否则提示command not found),后面加上&&符号则表示当表达式成立时执行后续操作。例如:

$ [ "a" = "a" ] && echo yes
yes

类似的,后面加上“||”则表示当表达式不成立时执行后续操作。

-z参数用来判断字符串是否为空,例如:

$ [ -z "" ] && echo yes
yes

还有一些类似的其他表达式参数,以及与文件相关的参数,可以man test查看。

参考链接: