2015年2月28日星期六

Âà±H: ¬K.ÃĦAhigh¤@¦¸¦­-¤W°_§ÉÄ~Äòhigh

gpoxwdnyblsnf

 

 

哈老公吃性藥-後居然這.麼強

 

吃了它我跟`老婆-連續High24小時

 

GAY³Ì·Rªº©Ê.Ãij£¦b-³o¸Ì°Õ

imminent [4-10

³Ì¦h¿W®a-©ÊÃÄ«~³£`¦b9sonba

hsvohqmxsablieixxy

 

 

性藥品`讓我跨年-夜變成傳奇人物

 

9sonba春藥-網挽.救我跟老婆感情

 

©ÊÃÄ«~¤j¤ý'±Ð§A«ç»ò-¨É¨ü¤H¥Í

 

 

Vvk讓你的-小弟弟變.成大弟弟

 

2014今年激爽.極樂bliss-來了

 

frvrybqkkyhrxca

¦³¥Î-ªº©ÊÃįu`ªº¥i¥HÅý¦Ñ¤G¼24¤p®É

 

 

哇-買性藥還送情趣用品.也太好了

 

原來享受性-藥品不用花`這麼多錢

 

txzifobhwy

¿E²nÅý§A¸ò¦Ñ.¤½«ì-´_¼öÅÊ

 

 

保證讓.你每次性愛-都能獲的最大成就感

 

afdeenxczzuffo

©ÊÃÄ«~.Åý-§ÚÅܤjóç¤ý ¯uhigh

jaqjellvzeles

 

 

AV男星的.秘訣原-來都是vivid

Re: ¦Ñ¤½¦Û`±q¦Y©ÊÃÄ-±j¨ì§Ú©È©È

frwwkwdemh

 

 

就是極樂bliss!!!讓我-笑咪咪

 

春藥就`是要不一樣才特.別

 

Fw: «¢'¶R¦hÁÙ°e¬KÃÄ-§ä¤£¨ì¤F

 

 

買了性藥品後-跟.老婆感情變好

 

老婆自從-吃了性藥品`天天要

 

tvkbsdmu

§Ú°¨`¤l³£³Q§Ú·Fªº«s«s¥s'³£¬O¾a¤Ñ°ó

 

 

激爽性藥品讓我-每天爽`得哀哀叫

 

就是極樂bliss!!!讓我-笑咪咪

 

zpfucpdkgqtfjzsntk

2013¤µ¦~9sonba.·¥¼Öbliss-¨Ó¤F

ugdfdspfmxapvolacdn

 

 

好險有9sonba讓我`買性藥品好方便'喔

9sonba¬KÃÄ«~Åý-©p¦¨¬°µR`§Q¤H©d

shaxwoouwjbuzjvqffa

 

 

看啥?老公都要.被搶了-還傻傻的

 

哇-這家性藥品買多還.送贈品ㄝ

 

Fw: ¿E²n¶Ê±¡-ÃÄÅý§Ú¨C¤Ñ²n±o«s«s.¥s

fpjxfpuppswhwzyarnv

 

 

小傑又在笑了-原來是偷偷到'這買壯陽藥

 

激爽感謝支持-性藥品全.面瘋狂贈送

 

AV¨k¬Pªº.¯µ³Z­ì-¨Ó³£¬Ovivid

Where we can knowingly pee on our gypsy.[3

¦~»´®ð²±ªº¿E±¡-ÃÄ«~.Åý¤Ò©d­Ç©]©]high

snrqtwrmezdmpjwbfh

 

 

AV男星持久.的秘密-我們找到了

Åý§A¨É¨ü§ó¦h-ºØ©ÊÃÄ«~³£`¦b9sonba

2015年2月27日星期五

¬KÃÄ.Åý§Ú¸ò§Ú¤kªB-¤Í¤£¥Î¤À¤â°Õ

 

 

嗚終於找-到市價.最便宜的性藥

 

pxukzkckmt

Centos6.5系统搭建tomcat7.0.57通过msm实现session共享

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Centos6.5系统搭建tomcat7.0.57通过msm实现session共享  阅读原文»

Centos6.5系统搭建tomcat7.0.57通过msm实现session共享

一般实现session共享,最常用的一种方法就是通过memcached-session-manager。下边我就说一下,怎么通过memcached-session-manager实现session共享。

  1. 首先建一个放软件的目录,进入此目录。

  [root@node1 ~]# mkdir -p /taokey/tools  [root@node1 ~]# cd /taokey/tools/  

2.把下载好的apache-tomcat-7.0.57.tar.gz和jdk-7u71-linux-x64.gz软件包上传到服务器上。

  [root@node1 tools]# ls  apache-tomcat-7.0.57.tar.gz  jdk-7u71-linux-x64.gz  [root@node1 tools]# tar -zxf apache-tomcat-7.0.57.tar.gz  [root@node1 tools]# tar -zxf jdk-7u71-linux-x64.gz  [root@node1 tools]# ls  apache-tomcat-7.0.57  jdk1.7.0_71  

3.创建/data目录,并且把tomcat改名,把tomcat和jdk移到data目录下。

  [root@node1 tools]# mv apache-tomcat-7.0.57 node1  [root@node1 tools]# mkdir /data  [root@node1 tools]# cp -r jdk1.7.0_71 node1 /data  

4.配置系统的jdk环境变量。

  [root@node1 data]# tail -7 /etc/profile  JAVA_HOME=/data/jdk1.7.0_71  JRE_HOME=/data/jdk1.7.0_71/jre  PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin  CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib  export JAVA_HOME JRE_HOME PATH CLASSPATH  export PATH=$PATH:JAVA_HOME/bin  export JAVA_HOME  [root@node1 data]# source /etc/profile  

5.修改默认的项目路径。

  [root@node1 data]# vim node1/conf/server.xml +125  <Host name="localhost"  appBase="/data/"  #默认的是webapps,我修改成了/data/目录。  

6.给tomcat默认启动和关闭脚本添加执行权限。

  [root@node1 data]# cd node1/bin/  [root@node1 bin]# chmod +x startup.sh  [root@node1 bin]# chmod +x shutdown.sh  
  7.启动tomcat,看下是否成功运行。  [root@node1 bin]# ./startup.sh  Using CATALINA_BASE:   /data/node1  Using CATALINA_HOME:   /data/node1  Using CATALINA_TMPDIR: /data/node1/temp  Using JRE_HOME:        /data/jdk1.7.0_71/jre  Using CLASSPATH:       /data/node1/bin/bootstrap.jar:/data/node1/bin/tomcat-juli.jar  Tomcat started.  [root@node1 bin]# ps -ef | grep java  root      2036     1 83 12:41 pts/1    00:00:04 /data/jdk1.7.0_71/jre/bin/java -Djava.util.logging.config.file=/data/node1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/data/node1/endorsed -classpath /data/node1/bin/bootstrap.jar:/data/node1/bin/tomcat-juli.jar -Dcatalina.base=/data/node1 -Dcatalina.home=/data/node1 -Djava.io.tmpdir=/data/node1/temp org.apache.catalina.startup.Bootstrap start  root      2050  1907  0 12:42 pts/1    00:00:00 grep java  

8.看下tomcat默认监听的端口。

  [root@node1 bin]# netstat -anpt | grep java  tcp        0      0 :::8080                     :::*                        LISTEN      2036/java  tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      2036/java  tcp        0      0 :::8009                     :::*                        LISTEN      2036/java  

9.在项目路径下创建一个测试网页,测试下网页是否可以打开。

  [root@node1 bin]# mkdir /data/ROOT  [root@node1 bin]# touch /data/ROOT/test.html  [root@node1 bin]# echo "hello world" >/data/ROOT/test.html  [root@node1 bin]# cat /data/ROOT/test.html  hello world  [root@node1 ~]# curl -I 192.168.1.15:8080/test.html  HTTP/1.1 200 OK  Server: Apache-Coyote/1.1  Accept-Ranges: bytes  ETag: W/"12-1421038003000"  Last-Modified: Mon, 12 Jan 2015 04:46:43 GMT  Content-Type: text/html  Content-Length: 12  Date: Mon, 12 Jan 2015 04:48:16 GMT  [root@node1 ~]# wget 192.168.1.15:8080/test.html  [root@node1 ~]# cat test.html  hello world  tomcat7.0.57搭建完毕。  

第一个tomcat实例node1已经搭建完毕,tomcat实例node2也按照此步骤搭建即可。tomcat搭建比较简单,这里不再赘述。两个tomcat实例(node1、node2),都搭建好之后,下面结合memcache和msm实现 session共享。

memcahce已经安装好了,详细安装步骤请参加:

10.安装memcahce。

  cd /taokey/tools/  curl -O http://www.monkey.org/~provos/libevent-2.0.13-stable.tar.gz  tar -zxvf libevent-2.0.13-stable.tar.gz  cd libevent-2.0.13-stable  ./configure --prefix=/usr  make && make install  curl -O http://www.danga.com/memcached/dist/memcached-1.4.0.tar.gz  tar -zxvf memcached-1.4.0.tar.gz  cd memcached-1.4.0  ./configure --with-libevent=/usr/  make  make install  /usr/local/bin/memcached -d -m 200 -u root -c 256 -p 11211 -P /tmp/memcache.pid  测试node1和node2连接memcache是否正常。  [root@node1 ~]# telnet 192.168.1.84 11211  Trying 192.168.1.84...  Connected to 192.168.1.84.  Escape character is '^]'.  [root@node2 ~]# telnet 192.168.1.84 11211  Trying 192.168.1.84...  Connected to 192.168.1.84.  Escape character is '^]'.  经过测试,memcache服务是没有问题。  

要想实现session共享,需要上传tomcat7所需要的memcached-session-manager的jar包。

tomcat7实现session共享所需jar包下载地址:

http://down.51cto.com/data/1974783

11.这里列出了包括tomcat自带和实现共享session所需要的所有jar包:

  [root@node1 ~]# cd /data/node1/lib/  [root@node1 lib]# ls  annotations-api.jar         jasper-el.jar                            minlog-1.2.jar                 tomcat-dbcp.jar  catalina-ant.jar            jasper.jar                               msm-kryo-serializer-1.6.5.jar  tomcat-i18n-es.jar  catalina-ha.jar             javolution-5.4.3.1.jar                   reflectasm-0.9.jar             tomcat-i18n-fr.jar  catalina.jar                jsp-api.jar                              servlet-api.jar                tomcat-i18n-ja.jar  catalina-tribes.jar         kryo-1.03.jar                            spymemcached-2.10.2.jar        tomcat-jdbc.jar  couchbase-client-1.2.2.jar  kryo-serializers-0.10.jar                tomcat7-websocket.jar          tomcat-util.jar  ecj-4.4.jar                 memcached-session-manager-1.6.5.jar      tomcat-api.jar                 websocket-api.jar  el-api.jar                  memcached-session-manager-tc7-1.6.5.jar  tomcat-coyote.jar  [root@node1 lib]# du -sh .  8.2M    .  [root@node2 ~]# cd /data/node2/lib/  [root@node2 lib]# ls  annotations-api.jar         jasper-el.jar                            minlog-1.2.jar                 tomcat-dbcp.jar  catalina-ant.jar            jasper.jar                               msm-kryo-serializer-1.6.5.jar  tomcat-i18n-es.jar  catalina-ha.jar             javolution-5.4.3.1.jar                   reflectasm-0.9.jar             tomcat-i18n-fr.jar  catalina.jar                jsp-api.jar                              servlet-api.jar                tomcat-i18n-ja.jar  catalina-tribes.jar         kryo-1.03.jar                            spymemcached-2.10.2.jar        tomcat-jdbc.jar  couchbase-client-1.2.2.jar  kryo-serializers-0.10.jar                tomcat7-websocket.jar          tomcat-util.jar  ecj-4.4.jar                 memcached-session-manager-1.6.5.jar      tomcat-api.jar                 websocket-api.jar  el-api.jar                  memcached-session-manager-tc7-1.6.5.jar  tomcat-coyote.jar  [root@node2 lib]# du -sh .  8.2M    .  

12.修改两个tomcat的配置文件 context.xml。

  修改后的tomcat node1配置文件  [root@node1 ~]# cd /data/node1/conf/  [root@node1 conf]# tail context.xml      <!--      <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />      -->      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"       memcachedNodes="n1:192.168.1.84:11211"       requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"       sessionBackupTimeout="1800000"       transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"      />  </Context>  修改后的tomcat node2配置文件  [root@node2 ~]# cd /data/node2/conf/  [root@node2 conf]# tail context.xml      <!--      <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />      -->      <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"      memcachedNodes="n1:192.168.1.84:11211"      requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"      sessionBackupTimeout="1800000"      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"      />  </Context>  

13.修改之后,创建一个index.jsp测试session共享的文档,重启两个tomcat实例。

重启实例node1。

  [root@node1 ROOT]# cat index.jsp  <html>  <head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  <title>Tomcat+memcached共享session测试</title>  </head>  <bo
国际版本Office365与国内版本office365的功能介绍  阅读原文»

每日博报 精彩不止一点关闭
国际版本Office365与国内版本office365的功能介绍

国际版本Office365与国内版本office365的功能介绍

说到office365相信大家也会同时想到windows azure,两个都是微软推出的云层次的功能服务。当然功能服务对于微软来说都会定义不同版本,比如最常见的操作系统,分为企业、专业、家庭等……对于微软推出的云服务来说也本例外,目前不管是office365还是windows azure,分为国内版本及国际版本,在功能上有一定差别,数据中心的托管中心也有差别,比如国际主要分布在美国,而国内版本分布在中国了,在中国委派给世纪互联做运营管理,当然具体的权限及操作还是在美国微软。在中国主要分布在北京和上海两个大的数据中心,具体就不多说了,今天呢,主要介绍,国际版本office365和国内版本office365的注册、使用及配置。具体见下:

首先通过以下链接地址注册国际版本的office365,是免费的哦,免费使用一个月。

https://portal.office.com/Signup/Signup.aspx?OfferId=467eab54-127b-42d3-b046-3844b860bebf&dl=O365_BUSINESS_PREMIUM&culture=zh-CN&Country=CN&WT.intid1=ODC_ZHCN_FX010048741_XT103040319&WT.intid2=ODC_ZHCN_FX104191196_XT104386605&ali=1#0

填写注册信息

clip_image002

填写用户管理信息及域名

阅读更多内容

管中窥豹,物联网之我见 - 叶帆

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
管中窥豹,物联网之我见 - 叶帆  阅读原文»

早在1999年在美国召开的移动计算和网络国际会议上,就已经提出“物联网”这个概念,所谓的物联网,英文为Internet of Things,就是物物相联的网络。国内也有人称之为泛在网,其内涵更是广泛,寓意无所不在、无所不包、无所不联的网。2005年在信息社会世界峰会(WSIS)上,国际电信联盟发布《ITU互联网报告2005:物联网》(ITU Internet Report 2005: The Internet Of Things),将最初主要以RFID技术为中心构建的物联网(或称之为传感网)的定义和范围,作了更进一步的拓展。报告指出世界上任何物体,各种生活用品(牙刷、纸巾、轮胎和房屋等等)都可以通过互联网进行连接起来,人类对信息的掌控又开辟了一个新的维度。

十年之后的2009年,IBM提出了“智慧地球”的概念,美国基于此,把物联网研究和发展提升到一个国家战略的高度,由此世界跟随美国的脚步,都陆陆续续把物联网看着是互联网(移动互联网)之后,能掀起下一个科技和经济浪潮的新技术,都投入巨大的人力和物力去研究和发展物联网技术。

而我国最早在1999年中科院就启动了传感网的研究,但是直到2009年物联网的发展被提到国家战略层面,温总理去无锡物联网研究院考察之后,才真正得到实质发展,无锡最先在物联网领域发力,所以被称之为中国的物联网之都(感知中国的中心)。随后各地政府以构建“智慧城市”为目标,吹响了进军物联网的号角。

随着近几年的移动互联网的大发展,手机、平板平台成为互联网的最主要的入口,人们的日常生活已经逐渐融入到网络之中。“大数据”、“云计算”、“智能硬件”和“可穿戴设备”等概念更是目不暇接地涌入人们的视野。阿里巴巴、百度、腾讯这些传统的互联网巨头,更是在移动互联网的基础上,纷纷构建自己的物联网平台。移动互联网的新贵小米公司,号称和上百家硬件公司合作,构建物联网生态系统。在智能家居领域,阿里巴巴携手海尔,小米联手美的,360向格力抛出橄榄枝,互联网企业和传统白色家电合作,向物联网的纵深领域发展。在车联网领域,移动、联通牵头,依托强大的宽带网络以及领先的3G和4G网络和众多汽车厂商或集成厂商合作,共同实现“智能交通”、“互联驾驶”等愿景。

以上我们是从历史发展的角度来漫谈物联网的,下面我们从技术的角度简单来谈一下物联网的构成。

从技术架构层面来讲,物联网可以分三大部分:

一是“云”,云上可以存取数据、可以运行程序、也可以提供具体应用服务。以亚马逊、阿里巴巴为首的云服务商,提供的是一种最基础的云服务,相当于提供了一个PC,你可以自行在上面安装程序、运行程序、存取数据等等;以微软、谷歌为首的公司提供的云服务,才能真正体现所谓的“云计算”,比如微软提供了基于云的操作系统Windows Azure,可以最大限度发挥云平台的能力;以苹果、百度为首的公司其实提供的只是一种存储服务,主要就是照片和数据文件云端存储和共享; 而传统以万维网为首的网站服务商,也可以算作一种云服务,一种基于应用的服务,提供网页发布等功能。

二是“端”,随着移动互联网的发展,端的含义有了很大的变化,不在单纯的指传感器了,根据用途,可以分三种,一种是“入口端”,比如手机、平板,是数据查看,设备控制的主要入口;第二种是“数据端”就是直接产生数据的端,比如温湿度传感器、PM2.5传感器、RFID标签采集等等;第三种是“被控制端”,比如电灯、空调、热水器等等;目前赤手可热的智能硬件和可穿戴设备,可以算作一种“复合端”,即可以产生数据,也可以控制一些设备。

传统的传感器厂商是“数据端”的主要生产者,而现在的手机、平板、智能硬件厂商成为“入口端”最主要的生产者,而随着智能家居的发展,一些传统的白色家电领域的巨头摇身一变成为“被控端”最主要的生产者了。

三是“物联网中间件”,目前物联网的概念早就超出了RFID+Zigbee了,当前通用物联网系统框架如下图所示。

当下一般人眼中,所谓的物联网,就是可以方便用手机、平台和可穿戴设备获取“云”数据,也可以通过云(或直接)控制一些智能设备。从上图可以看出,为了更为容易的实现这种互联互控,“物联网中间件”技术必不可少。

比如YeeLink公司的物联网中间平台就提供了数据端(和被控端)到云,及云到入口端的快速连接的技术,这种中间件技术偏重于传感器数据采集和设备控制。APICloud公司提供入口端和云互联的快速开发中间件平台,侧重于移动入口快速开发。腾讯公司提供的“QQ物联”开发平台,更是一种标准的物联网中间件技术,每个“端”都被映射为一个QQ号,通过提供的SDK,让端和云、云和端更为简便的互联。

以上从技术架构层面简单阐述了物联网的相关组成,其实这是站在互联网公司的角度来看物联网的,在我眼中,物联网却是下面这个样子。

我从2001年进入工控行业,主要为冶金行业的一些企业做自动化系统,对一些工业领域产品厂商及相关技术相对熟悉,比如西门子、施耐德、AB、三菱、研华、MOXA和周立功等国内外厂商,比如各种PLC、各种智能采集和控制模块、LonWoeks、Profibus、CAN和工业以太网等各种现场总线技术。我眼中的物联网其实是工控网的一种外延:立足于可靠成熟稳定的设备,及各种现场总线技术所构建的物物相联的网络。

所以说,物联网的大发展,其核心推动力,应该来源于这些传统以工控技术为主的公司。但是诡异的是,在最近几年的工控产品行业会上,却很少看到或听到说物联网概念的,推物联网产品的,发展的重点却是工业机器人和3D打印技术。

说是诡异,其实也不是诡异,现在所谓的物联网通信技术,各种智能硬件,相对于工业现场总线技术和采集、控制设备来讲,是相对皮毛的技术(或者说是早已经成熟,相对基础的技术),只不过由原来要求相对严格的工控应用领域,拓展到民用领域而已。而互联网公司当下为了实现下一步的业务转型,新瓶装旧酒,以云平台、手机和平板为核心,结合一些监控和互联的技术,来包装物联网的概念,并以颠覆传统生产制造行业的面目出现,这确实或多或少蒙蔽了不少人的眼睛。

现在物联网发展的困局不在云、不在手机、平板输入端、也不在网络基础平台,这也是互联网公司最擅长的领域,其实这部分技术在我眼中是完全偏软的技术,因为其基础硬件平台发展到现在,都已经成熟,并且差异化也没有那么大。如果是基于软件技术,那么规模就相对容易做大,基于网络推广和发布,即使出现问题,其付出的代价也是相对小的。真正的难点在于要能以最小的代价,制造出差异化的,能提供二次开发、并且能长期稳定运行的智能硬件。

互联网公司和传统白色家电厂商合作,其实从另一种眼光来看,不是在颠覆什么,对硬件产品来说,添加了一个联网的新功能,对营销角度来说,多了一个宣传的新名词。只是对这些传统白色家电产业发展遇到了天花板之后,又重新有了一次洗牌的机会。

其实真正的物联网绝对不是简单的互联网企业和传统制造商结合而生出的怪胎。目前来看,似乎也不是那些现在变的有些傲慢,反应有些迟钝,对当前一些软硬件新技术有些视而不见的传统工控领域巨头所引领下的工控网的外延。

以我个人的眼光来看,倒是在ARM公司和在其领导一下的一些芯片制造商在扎扎实实地推进物联网技术的发展。硬件层面,推出基于Cortex-M技术架构为核心的物联网芯片;在软件和系统层面推出CMSIS接口标准和mbed OS物联网系统;在云和端通信层面,收购了Sensinode公司,大力发展NanoStack和NanoService产品技术,全方位构建物联网生态。

有了芯片和软件,也并不等于就能很容易构建物联网应用平台。Arduino、树莓派,相对简单的手机APP和没有什么特色的云平台,是构建不了成熟的物联网应用,更不可能成为物联网发展的基础。对于差异化,个性化,智能化的物联网应用平台应用来说,硬件的稳定可靠(工业级产品要求)、功能的可定制化(组态化)和易于开发使用是非常重要的。

回过头来看国内一些互联网企业的物联网化,其实用一句话来概括就是用新的思路和方法,改造或打破旧行业的产业格局而已。仔细来看,似乎并没有真正催生新的物联网基础层面的软硬件技术,不能不说,这是国内物联网行业发展的一种悲哀。

【说明】本文是笔者在程序员期刊上的一篇文章,网站版原文链接

http://www.csdn.net/article/2015-02-21/2824000


本文链接:管中窥豹,物联网之我见,转载请注明。

Oracle Essbase入门系列(一) - Cheney Shue  阅读原文»

1. 开篇序

本文是几年前做Hyperion Planning项目时写的,后来陆陆续续有些补充。本来打算将整个EPM写一系列的教程,但HFM写到1/3就没动力了。不过至少Essbase这部分是完整的。

Essbase主要是作为Planning后端数据库使用。Planning的技术难点在于Essbase,所以搞Planning深入下去就是在搞Essbase;反过来说,熟悉了Essbase,上手Planning就很简单,无非是在Essbase基础上加了Form、Process Management等功能,再学学Driver-based Planning、Rolling Forcasting等知识,就算是Planning专家了。

2. OLAP概念

联机分析处理OLAP通常是以多维的形式对数据进行钻取、汇总、切片、旋转等操作,以满足多层次、多角度数据分析的过程。OLAP包括两部分——提供用户多维操作的前端和支持多维分析的后端数据库。多维数据库,既可以是将数据以星形结构组织的RDBMS,也可以是Essbase这种专门的多维数据库。

Essbase的维度是value-based dimension,即树型结构,维度中的成员按照层次组织,形成父子级关系,其中的每个成员可包含若干个子成员。最底层的成员没有子成员,称作叶成员(Leaf Member)或基成员(Base Member),而最顶级成员是根成员。如下图的帐户维,将家庭收支项按层级关联起来形成树型结构。

维度的层级结构决定了数据沿向上合并(consolidation)和向下分配(allocation)的计算路径,如下图。

上面是单个维度的结构后,然后再来谈论多维的情况。多维数据库,顾名思义是由多个维度组成,各维度成员的组合是数据存储的最小单位,称为单元格(cell)。作为例子,假定一个家庭记账的多维数据库,由如下三个维度组成。为了便于说明,这里的维度仅截取了部分成员。

  • 日期维,成员包括一季度、一月、二月、三月,其中一季度是父成员。
  • 支出帐户维,成员包括日用品、衣物、洗涤,其中日用品是父成员。
  • 家庭成员维,成员包括家庭、张大明、王翠花,其中家庭是父成员。

在这个多维数据库中,日期维有4个成员,支出帐户维有3个成员,家庭成员维有3个成员。那么一共有4 × 3 × 3 = 36中维度成员组合,即有36个单元格,意味着这个数据库仅能存储36个数值。将这个数据库形象的描绘成下图的三维立方体,三个维度是立方体的轴。图中以维度成员将立方体进行分割,形成了36个小块,这些小块就是单元格。如暗色单元格,是由成员组合(一月,日用品,张大明)构成。

在三个维度中,日期维的叶成员有3个,支出维的叶成员有2个,家庭成员维的叶成员有2个。则36个单元格中,有3 × 2 × 2 = 12个是叶成员组合单元格。类似单一维度成员合并方法,非叶单元格可沿维度层次,由叶单元格合并而得。例如维度成员组合(一月,日用品,张大明),由(一月,衣物,张大明)和(一月,洗涤,张大明)两个单元格汇总。

3. Essbase概念

EPM系统按产品可创建不同类型的应用程序,Essbase的应用程序是多维数据库的集合,即每个应用程序下可包含若干个多维数据库,每个数据库有独立的维度模型和数据存储。

Essbase将数据库的维度模型称为大纲(Outline),多维数据库的开发工作很大部分是大纲开发,大纲开发主要是创建维度成员和定义计算方法。

Essbase中以“代(Generation)”和“级(Level)”来标注维度层次,根成员被标注为1代,其下一层被标注为2代,依次向下代数逐渐增大;反过来,叶成员被标注为0级,其上一层被标注为1级,依次向上级数逐渐增大。以下图的维度层次为例,成员名称前的G表示代数,L表示级数。

维度的成员之间存在子代(Children)、后代(Descendants)、同级(Siblings)、父级(Parent)、祖级(Ancestors)共5种关系,说明如下。

系统架构上,Essbase是由多个组件组成。下图将Essbase的组件分成三部分,左边是Essbase Server,它是多维数据库服务,Essbase应用程序会部署到Essbase Server;右边是客户端工具,含OLAP前端应用工具和Essbase开发管理工具;在Essbase Server和客户端工具之间的是中间层服务,负责双方之间的通讯。

此外跟Essbase相关的工具主要有:

  • Hyperion Planning — Planning使用Essbase作为数据库存储和计算数据。
  • Hyperion Profitability and Cost Management — 跟Planning类似,HPCM使用Essbase BSO做分摊计算,使用Essbase ASO做报告。
  • Essbase Analytics Link for Hyperion Financial Management — 可以将HFM数据导到Essbase中做分析。
  • Hyperion Smart View — Oracle BI和EPM的客户端,跟Office整合,能直接连接Essbase数据库。
  • Hyperion Visual Explorer — Tableau的OEM版本,在以前版本中会随Smart View一起安装,同样支持Essbase数据源。
  • Oracle Crystal Ball — 蒙特卡罗模拟工具,新版本跟EPM整合,可以使用Essbase内部的计算代替Excel上的计算公式做模拟。
  • Oracle BIEE — Oracle的BI产品,可使用Essbase作为数据源。
  • Hyperion Essbase Spreadsheet Add-in — Office插件,已被Smart View取代。

本文链接:Oracle Essbase入门系列(一),转载请注明。

阅读更多内容

Fw: ´N¬O-³o®a©ÊÃıM½æ©±Åý§Ú°¨¤l'«s«s¥s

hrccoadadlnymdnkhygo

 

 

媽呀這裡`性藥品這-麼這麼多種可挑選

¶ã-¨S¦³©Ê.ÃÄ«~§Úªº¤H¥Í¬O¶Â¥Õªº

ccjdbmsiwzcugso

 

 

9sonba不是`獨家春藥不上-架

©ÊÃÄ«~§ïµ½§Ú-¸ò¦Ñ¤½·P±¡.¯u¦n

pvpvpgttybbsmt

 

 

催情藥大王'教你怎麼享受人.生

 

9sonba堅持只.上有-用的春藥

 

Fw: ¤Ò©d¦Y¤F©ÊÃÄ24¤p®É-«Ý¦b`§É¤W

 

 

就是極樂bliss!!!讓我-笑咪咪

 

你要.的春藥-都在激爽

 

agbuoetta

¿E²nÅý§A-¶R¬KÃÄ«~¤£¥Î¦b.®`²Û

habqkgydycmwwpg

 

 

只要120秒`馬上感受性藥品.威力

 

原來康康.馬子這麼-死心蹋地是這原因

 

·¥¼Öbliss´N¬O¥L-¶}©l§ïÅÜ.§Aªº¥@¬É

benwxhlvhswey

 

 

國外催情寵-兒RUSH你還`沒試過?

 

相信我們9sonba絕對.可以救-回老公的心

 

¶ã²×©ó.§ä¨ì¥«-»ù³Ì«K©yªº¬KÃÄ

vggghbnmgvhjrhgipmp

 

 

嘿嘿自從買了-催情藥老公`總是笑呵呵

 

你相信嗎?性藥品讓-台人開始性福了

 

Fw: ¤Ò©d¦Y¤F©ÊÃÄ24¤p®É-«Ý¦b`§É¤W

gsaqvewjnfaps

 

 

看啥?男友都-要被搶了還傻傻.的

©ÊÃÄ«~-¦Ahigh¤@¦¸.¦­¤W°_§ÉÄ~Äòhigh

 

 

老公-自從吃了性藥`品天天要

 

pzzgydfkoohdzztui

¨C¤Ñ³£¦b¥´«÷-´N¸Ó¶R©ÊÃÄ«~Åý`§Ú¶Â¥Ö

 

 

激爽讓你-買春藥品不用在.害羞

 

你相信嗎?壯陽藥讓台人開始性`福了

 

znbfyjq

Âà±H: ¦Û±q¨Ï¥Î¤Ñ°ó.§Ú¦³¦p¤Z¶¡­¸¨ì¤Ñ'°ó¨º¯ëªº²n

sxvuadjxsmmuvswau

 

 

好險有9sonba讓我-買催情'藥好方便喔

 

9sonba性藥.品終於讓人夫-笑了

 

2015年2月26日星期四

ÁÙ¤£§Ö¶R¬K-ÃĤp¤T³£¨Ó.·m¦Ñ¤½¤F

bxvqfngkuxlf

 

 

好-險有9sonba讓我買壯陽藥好方.便喔

Fw: §A­nªº©ÊÃÄ«~-³£.¦b9sonba

 

 

春藥讓我跟我-男朋.友不用分手啦

 

zjomyxhxtufq

Fw: ¬KÃÄÅý§Ú¸ò§Ú-¨kªB.¤Í¤£¥Î¤À¤â°Õ

 

 

Vvk讓你的-小弟弟變.成大弟弟

 

老公-自從吃了性藥`品天天要

 

giksxofkopasfgvuymp

¦Û±q-¦Y¤F¤Ñ°ó°¨¤l³£»¡¤£`­n¦A·F§Ú°Õ

 

 

嘿嘿自從買了-催情藥老公`總是笑呵呵

 

這麼怕-小三就買`春藥改變自已

 

gzhdkkoerhrtuukobe

¦Ñ¤½¤£¥i¾a-¾a©ÊÃÄ«~.µ¹§Úhigh

xomjlvzmnfokgzbxs

 

 

買性藥`品不用再躲躲藏藏啦-快來

 

感謝激爽讓我-老婆變這麼.騷

 

9sonba¦³¦n`¦hgay©Ê-ÃÄ£¬

 

 

美'眉吃了興藥品居然-變這款

 

性藥品.讓我們夫妻high到'底

 

utzuyllin

¬K.ÃĤj¤ý-Åý§Ú­Ì.¤Ò©dhigh¨ì©³

 

 

哇這家春'藥店買多還送贈`品ㄝ

 

AV男星持久.的秘密-我們找到了

 

fseeddfbce

¦nÀI¦³9sonbaÅý§Ú`¶R©ÊÃÄ«~¦n¤è«K'³á

rkvdycwskevjhs

 

 

性藥品就.要跟別人不一樣`好嗎

 

害怕小三降.臨嗎?春藥-幫妳

 

©ÊÃÄ«~¤j¤ý'±Ð§A«ç»ò-¨É¨ü¤H¥Í

cvlansifziqddtpgobtb

 

 

哇-買壯陽藥還送情`趣用品也太康了

¶ý§r³o¸Ì¬KÃÄ.³o»ò³o-»ò¦hºØ¥i¬D¿ï

 

 

看啥?老公都要.被搶了-還傻傻的

 

激爽催情王-國讓你.性福

 

zmdzlwhdwhb

2015年2月25日星期三

Re: ©ÊÃÄ`«~§Ö¨Ó¤p-¤T°h´²

bojfgzej

 

 

原來AV男星這-麼強.是靠vividㄛ

 

9sonba感謝支持-性藥品全.面瘋狂贈送

 

JavaScript ES7 中使用 async/await 解决回调函数嵌套问题 - 艾斯昆

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
JavaScript ES7 中使用 async/await 解决回调函数嵌套问题 - 艾斯昆  阅读原文»

原文链接:http://aisk.me/using-async-await-to-avoid-callback-hell/

JavaScript 中最蛋疼的事情莫过于回调函数嵌套问题。以往在浏览器中,因为与服务器通讯是一种比较昂贵的操作,因此比较复杂的业务逻辑往往都放在服务器端,前端 JavaScript 只需要少数几次 AJAX 请求就可拿到全部数据。

但是到了 webapp 风行的时代,前端业务逻辑越来越复杂,往往几个 AJAX 请求之间互有依赖,有些请求依赖前面请求的数据,有些请求需要并行进行。还有在类似 node.js 的后端 JavaScript 环境中,因为需要进行大量 IO 操作,问题更加明显。这个时候使用回调函数来组织代码往往会导致代码难以阅读。

现在比较流行的解决这个问题的方法是使用 Promise,可以将嵌套的回调函数展平。但是写代码和阅读依然有额外的负担。

另外一个方案是使用 ES6 中新增的 generator,因为 generator 的本质是可以将一个函数执行暂停,并保存上下文,再次调用时恢复当时的状态。co 模块是个不错的封装。但是这样略微有些滥用 generator 特性的感觉。

ES7 中有了更加标准的解决方案,新增了 async/await 两个关键词。async 可以声明一个异步函数,此函数需要返回一个 Promise 对象。await 可以等待一个 Promise 对象 resolve,并拿到结果。

比如下面的例子,以往我们无法在 JavaScript 中使用常见的 sleep 函数,只能使用 setTimeout 来注册一个回调函数,在指定的时间之后再执行。有了 async/await 之后,我们就可以这样实现了:

async function sleep(timeout) {
return new Promise((resolve, reject) => {
setTimeout(function() {
resolve();
}, timeout);
});
}

(async function() {
console.log('Do some thing, ' + new Date());
await sleep(3000);
console.log('Do other things, ' + new Date());
})();

执行此段代码,可以在终端中看到结果:

Do some thing, Mon Feb 23 2015 21:52:11 GMT+0800 (CST)
Do other things, Mon Feb 23 2015 21:52:14 GMT+0800 (CST)

另外 async 函数可以正常的返回结果和抛出异常。await 函数调用即可拿到结果,在外面包上 try/catch 就可以捕获异常。下面是一个从豆瓣 API 获取数据的例子:

var fetchDoubanApi = function() {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
var response;
try {
response = JSON.parse(xhr.responseText);
} catch (e) {
reject(e);
}
if (response) {
resolve(response, xhr.status, xhr);
}
} else {
reject(xhr);
}
}
};
xhr.open('GET', 'https://api.douban.com/v2/user/aisk', true);
xhr.setRequestHeader("Content-Type", "text/plain");
xhr.send(data);
});
};

(async function() {
try {
let result = await fetchDoubanApi();
console.log(result);
} catch (e) {
console.log(e);
}
})();

ES7 还在草案阶段,那现在想用这个特性怎么办?可以尝试 google 的一个 JavaScript 预编译器 traceur,可以将高版本的 JavaScript 编译为 ES5 代码,已经实验性的支持了 async/await (需要使用 --experimental 来指定开启)。traceur 可以直接在后端使用,也可以在浏览器中使用。另外如果只在 node.js 环境中使用的话,还有一些 polyfill 模块,比如这个


本文链接:JavaScript ES7 中使用 async/await 解决回调函数嵌套问题,转载请注明。

如何打出Android程序调用stack trace - susue  阅读原文»

找出程序的调用堆栈 trace 可以知道是谁调用了这个接口,也能快速学习程序的调用流程,非常实用。但需要注意的是,不能在正式代码中使用,只能用于调试,这个非常耗资源也会造成 log 泛滥。

下面就介绍如何在 Android Java/C++/C 程序当中打印出程序调用 trace,如果需要在其他环境中使用的话 C++/C 部分需要移植 corkscrew 库。

Java

非常简单,创建一个 Throwable 对象,就可以得到当前的 stack trace。下面例子是打出调用 foobar() 函数的 trace:

1 private void foobar() {
2 Throwable t = new Throwable();
3 Log.d(TAG, "stack trace is ", t);
4 }

C++

也比较简单,使用 utils/Callstack 类即可。头文件位于 frameworks/native/include/utils/CallStack.h,一般无需修改 Android.mk 可直接使用。下面例子是打出调用 Foo::bar() 函数的 trace:

1 #include <utils/CallStack.h>
2
3 void Foo::bar() {
4 // CallStack::CallStack(const char* logtag, int32_t ignoreDepth, int32_t maxDepth)
5 CallStack *t = new CallStack("Trace", 1, 30);
6 delete t;
7 }

C

稍微麻烦一点,需要直接调用 corkscrew/backtrace。其实 C++ 里的 utils/Callstack 也是使用 corkscrew/backtrace,只是进行了封装更易于使用。我们参照 CallStack.cpp 里面代码即可。下面例子是打出调用 foobar() 函数的 trace:

NOTE: C 不能直接调用 C++ 代码,除非在 C++ 类中添加相应的 C wrapper,或者通过 dlsym 动态载入。

1 #include <corkscrew/backtrace.h>
2
3 void dumpStackTrace(const char* logtag, int32_t ignoreDepth, int32_t maxDepth) const {
4 static const int MAX_DEPTH = 31;
5 static const int MAX_BACKTRACE_LINE_LENGTH = 800;
6
7 if (maxDepth > MAX_DEPTH) {
8 maxDepth = MAX_DEPTH;
9 }
10 backtrace_frame_t mStack[MAX_DEPTH];
11 ssize_t count = unwind_backtrace(mStack, ignoreDepth + 1, maxDepth);
12 if (count <= 0) {
13 LOGE("Can not get stack trace");
14 return;
15 }
16
17 backtrace_symbol_t symbols[count];
18
19 get_backtrace_symbols(mStack, count, symbols);
20 for (size_t i = 0; i < count; i++) {
21 char line[MAX_BACKTRACE_LINE_LENGTH];
22 format_backtrace_line(i, &mStack, &symbols,
23 line, MAX_BACKTRACE_LINE_LENGTH);
24 ALOG(LOG_DEBUG, logtag, "%s%s",
25 "",
26 line);
27 }
28 free_backtrace_symbols(symbols, count);
29 }
30
31 void foobar() {
32 dumpStackTrace("Trace", 1, 30);
33 }

头文件位于 system/core/include/corkscrew/backtrace.h,在 Android.mk 中还需要加入:

1 LOCAL_SHARED_LIBRARIES += libcorkscrew


本文链接:如何打出Android程序调用stack trace,转载请注明。

阅读更多内容

运维跟开发一定有仇么?

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
运维跟开发一定有仇么?  阅读原文»

运维跟开发一定有仇么?

作者:田逸(sery@163.com

按:这是一篇命题作文,是应一位同行兄弟的邀请而作此文。他告诉我,目前他跟开发的关系有些僵持,希望能我能发表一些看法。尽管我不一定能给出好的建议,但我觉得这个事情应该具有一定的普遍性,于是就答应写一篇文字,权作抛砖引玉。

总所周知,一个网站或者一个项目要创建和运营,绝不是一个人可以完成的(个人玩玩那种不算)。至少需要产品、设计、程序开发(前端、后台)、测试、系统维护(部署、运营、维护)、平台运营等等若干职位。

在团队的认知中,某些职位的人总喜欢强势认为自己很重要,是处于主导地位的。于是在这些人的意识里,其它职位或人员都是辅助和次要的,是围绕着他的。在这样的环境里,造成人员冲突的几率就大,相互协作的意识就几乎不存在。如果项目最高领导(老板)也有这种认识,那么情况就更佳糟糕。

在大部分不规范的或者不是以技术做驱动的公司里,一个比较典型的情况就是:对于系统运维人员,如果系统长期稳定运行,一些人就会认为,这些人是不是多余的?反之,如果故障频发,一些人有开始抱怨,运维是干啥的啊,怎么老出问题?

造成这些问题的原因可能是多方面的,可能是认识问题,也可能是项目本身的问题(比如交易型网站运维的地位就要比宣传型网站运维的地位高)。对于我们个人来说,我建议找工作的时候,尽量找交易型的,毕竟公司的存在是以系统平台来赚钱,系统停止就意味着损失,因此个人在组织中的地位自然就比那种宣传型的网站高了不少。对于认识方面的问题,情况比较复杂,需要做更多的分析和考虑。

回到我们的主题上来。随便是一个程序员或者测试人员跑过来,就要求干这干那。没有书面文档,也没有一个流程。这样次数多了,运维人员多半就会感觉被支配,不耐烦,疲于应付。第二种情况是:出现故障,先推给运维。这个真的最要命,也最容易起纠纷。想必不少运维同行也有此遭遇。

尽管我很久没专注于技术,写这些文字也有些力不从心,勉为其难抛一些想法,供大伙参考。

主动

搞技术的人,性格内向的比较普遍,不知道是不是因为长时间跟机器打交道的原因。但不能怎样,主动与人沟通依然是很重要的工作。我们得告诉其它人,运维实际上在干很多事情(选机房、做系统架构、技术选型、日常维护、半夜爬起来跑机房、24小时响应此处神略65535字),要说出来,项目列得越详细越好!有些事情在其它人看来(比如开发人员)似乎很简单,不就是上架服务器,安装个系统么?那么我们就要跟他较真:哪个机房带宽质量好?哪个机房服务到位?怎么装系统更快、更符合要求(不要给我们讲一路回车,一根到底、程序数据一锅端)?做了要说,而且要多说,才能让别人了解我们其实下了很多功夫,做了很多工作。我时不时会给其它人强调,你们设计的界面在美观、程序再怎么牛逼,系统崩溃了,仅仅是一堆占据硬盘空间的二进制而已!就算没崩溃,找的机房线路垃圾,能跑的起来才是怪事呢!

中国人是一个人情社会,只有大家时不时一起吃个饭,很多事情就好商量了。你是否准备请或者被请,跟其它部门的人一起出去吃饭呢?

协作

把责任推给别人,原因很简单利益和面子!谁愿意努力付出了,最后却因为发生故障扣钱甚至影响前途呢(很多机构只注重处罚而很少提及奖励)?遇到人品差的,这种情况发生得就很频繁了。

没有人保证系统运行中不发生问题或故障,除非把电源给关闭掉。我经常的措施是:

(1) 收集相关资源的联系方式:机房、供货商、服务提供商(cdn之类的);

(2) 收集相关技术人员的联系方式:技术负责人、程序员、测试等等;

(3) 根据业务,故障报警发相关人员;

(4) 联系接口人员告知故障发生,获取故障现象并简单描述

(5) 要求相关人员协调排查;

(6) 告知自己排查的情况(查了哪些项目、数值是什么状况、修改了什么、数据截图等);

(7) 故障排除,总结经验;

(8) 内部讨论一下,看能否大事化小(小事化了要看具体情况)。如果不是己方的责任,过分强调过错或过失,又会回到相互推卸责任这个老路上来。

流程

没有流程,必定会引起一团糟,比如前边说的,随便是个人就跑过来提要求;流程太繁琐,也不行,会严重影响效率。在这里,不强调怎么做流程,但起码,我们可以相互约定一个接口人,有什么需求,尽量通过接口人。

如果、如果什么都不能改变,尽快闪人吧!

于大兴出租屋

本文出自 "sery" 博客,请务必保留此出处http://sery.blog.51cto.com/10037/1614963

分享至 一键收藏,随时查看,分享好友!
昵称:
登录快速注册
内容:

阅读更多内容

³o»ò©È-¤p¤T´N¶R`¬KÃħïÅܦۤw

 

 

天堂heaven-讓你重回.男性的尊嚴寶座

 

全球最有效最-知名壯陽藥.中第一品牌

 

mrnpcfhtgjzjxqwrxi

Fw: 2013¤µ-¦~9sonba±j¥´¬P.·¥¼Öbliss

jditxijtlvmyxsfhozv

 

 

自從買`了壯陽藥老公非.得1晚7次郎

 

我的天天-天兒春藥嚇嚇.叫

 

Re: ¬K`Ãħ֨Ó-¤p¤T°h´²

 

 

AV男星的.秘訣原-來都是vivid

 

再ㄍ一ㄥ的女人也抵-抗不了性藥.品功效

 

przmzmvqsvuyzyu

©ÊÃÄ«~§ïµ½§Ú-¸ò¦Ñ¤½·P±¡.¯u¦n

 

 

激爽最'新力推壯陽聖-品天堂2愛

 

害怕小三降-臨嗎?性藥`品救妳

 

udhxjlthgguqtmmwxe

VIVID©ÊÃÄ-«~Åý§Aª¾¹D`¬°¤°»òav¨k¬P¦p¦¹²r

pvudhwecmu

 

 

老公最近怪-怪的.讓他重拾性慾吧

¦³¥Î-ªº©ÊÃįu`ªº¥i¥HÅý¦Ñ¤G¼24¤p®É

 

 

買壯陽藥不用.再躲躲藏藏啦-快來

 

gdczdjpyaeurzk

Re: ¥´¯}¥«³õ»ù®æ-Åý§A¨É¨ü³Ì»ù`·G¬KÃÄ

 

 

聖.誕夜全靠激爽性藥品搞-定

 

小陳吃.了heaven他馬子-居然笑成那樣

 

henmvphmczsvdpjph

³o-¦³¦P§Ó¸¯¸¯.³Ì·Rªº©ÊÃÄ£®

 

 

什麼?激爽最-新產品?極-樂bliss

 

感謝激爽搶救我的-婚姻性.藥品之KING

 

fmjlfkzkaudgnjj

2013¤µ-¦~9sonba±j¥´¬P.·¥¼Öbliss

zsqicymdhzcu

 

 

自從買`了壯陽藥老公非.得1晚7次郎

 

天堂heaven讓我.翹4天3夜都-不怕

 

¬K`Ãħ֨Ó-¤p¤T°h´²

 

 

這麼怕小三就買-性.藥品改變自已

 

老婆吃-這藥挑逗到`我一直想要

 

htvusaontochrpykzp

2015年2月24日星期二

¤Wºô¶R`¶Ê±¡ÃĤ£-¦bÅý§ÚÁy¬õ¬õ

 

 

來看一下`這裡春.藥不一樣

 

老婆吃-這藥挑逗到`我一直想要

 

ooifqlqezuy

§ä¨ì¥þ¥x-³Ì§C»ùªº¬K`ÃĺôÆg

 

 

GAY最愛-的春藥都在.這裡啦

 

rjxqxtryujdd

Re: ®`©È¤p¤T­°.Á{¶Ü?¬KÃÄ-À°©p

gqiachpp

 

 

性藥讓我不再擔心一晚.炮三姬

 

老公最近怪-怪的.讓他重拾性慾吧

 

³Ì¦h¿W®a-©ÊÃÄ«~³£`¦b9sonba

 

 

9sonba有好`多gay性-藥ㄛ

 

今年全-靠9sonba性藥.品搞定

 

baqrzqbylugaw

·¥¼Öbliss´N¬O¥L-¶}©l§ïÅÜ.§Aªº¥@¬É

oymkiidkv

 

 

性冷.感嗎-讓妳馬上變蕩婦

 

手上-太多妹.性藥品讓你的妹都浪浪叫

 

Âà±H: ³o¦³¦P§Ó.¸¯¸¯-³Ì·Rªº¬KÃÄ£®

 

 

這有GAY葛葛-最愛的.性藥ㄝ

 

哈.性藥品讓你-每夜變身7次郎

 

tnamiltgvl

³o¦³GAY¸¯¸¯-³Ì·Rªº.©ÊÃÄ£®

 

 

我馬子都被我幹-的哀哀叫都是靠`極樂

 

性.藥品情-趣用品給你最high體驗

 

nwfrboqo

Âà±H: ·PÁÂ9sonba·m±Ï§Úªº-±B«Ã©Ê.ÃÄ«~¤§KING

uedthzsydynzdehmyjry

 

 

小傑又在笑了-原來是偷偷到'這買壯陽藥

 

感謝9sonba讓我-老婆變這麼.騷

 

Re: ©ÊÃÄ«~`Åý§Ú¸ó¦~-©]Åܦ¨¶Ç©_¤Hª«

hyrqcwygxmx

 

 

馬子在床上都在裝`怎麼讓她變蕩婦呢?

 

激爽性藥品-讓妳成`為犀利人妻

 

Re: AV¨k¬P¬°¤°-»ò³o`»ò¦³­á°k

 

 

看啥?老公都要.被搶了-還傻傻的

 

9sonba感謝支持-性藥品全.面瘋狂贈送

 

dvjzardtcokzmtoujdf

ÁÂÁ¿E²nÅý-§Ú°¨¤lÅܳo»ò.®ö

grdwfonfee

 

 

買催情藥不用再`躲躲藏藏啦-快來

¥þ¥x³Ì±j-©ÊÃÄ«~`ºô³£¦b9sonba

 

 

性藥品大王'教你怎麼-享受人生

 

ksmawneszpdcrzfmy

Âà±H: ¶Ê±¡ÃĤj¤ý'±Ð§A«ç»ò¨É¨ü¤H.¥Í

gicyrhwalwxg

 

 

老婆自從-吃了性藥品`天天要

Re: ¦Ñ¤½`¦Y¤F©Ê-ÃÄ«~¤@µo¤£¥i¦¬¬B°Õ

mqzdvoz

 

 

老婆吃-這藥挑逗到`我一直想要

 

9sonba©ÊÃĺô`®¾±Ï-§Ú¸ò¦Ñ¤½·P±¡

vmuljdymhbrdsbbhymeb

 

 

我的.天天天兒性藥品嚇'嚇叫

 

看啥?男友都-要被搶了還傻傻.的

 

9sonbaÅý§A¶R-©ÊÃÄ.«~¤£¥Î¦b®`²Û

jbehuzoyudlhy

 

 

小陳吃.了heaven他馬子-居然笑成那樣

 

哈男友吃-性藥後.居然這麼強

 

2015年2月23日星期一

Re: 9sonbaÅý§A.¸ò¦Ñ¤½-«ì´_¼öÅÊ

 

 

小傑又在笑了-原來是偷偷到'這買壯陽藥

 

9sonba有-好多同志.春藥ㄛ

 

gwjfvvhoooqofmrxng

³o»ò©È-¤p¤T´N¶R`¬KÃħïÅܦۤw

 

 

嗚-沒有性.藥品我的人生是黑白的

 

uewdjulqxpzl

关于overfit的随笔 - 扰民

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
关于overfit的随笔 - 扰民  阅读原文»

看到@ 爱可可-爱生活转发的文章。稍微看了下,在这里记录下。

overfit是机器学习的一个重要概念。在狭义上可以定义为模型过于复杂,导致模型的generalization不够好。我认为应采用一个广义的定义凡是generalization不行的,都可以定义为overfit。从我的定义出发的话,可以认为这个文章围绕overfit展开,从三个方面讨论了这个新手老鸟都会犯的错误。

第一部分概述了overfit,这一部分可看作从建模的复杂度来讨论overfit,你的模型越复杂越容易overfit。其中overfit是memorizing而不是learning的比喻很贴切。我们需要通过something学到规律而不是仅仅简单的记住someting。我补充下,overfit可以通过bayes的prior来引入regulatization,从而提高generalization。

第二部分从数据的角度来讨论overfit,你用来训练的数据也会带来overfit。这部分可分成两个小节:首先,bias的训练数据当然会bias你的预测,generalization不够好,overfit随之产生。其次,leakage的训练数据,会引入测试数据的规律到模型中,等于您白测了,cross-validating的hyper-param作废了,不能generalization,于是overfit又来了。的确很多论文都没注意这一点,微软就闹过这种笑话。


本文链接:关于overfit的随笔,转载请注明。

给公司部门设计的SOA架构 - 蘑菇先生  阅读原文»

新来老大年前开会说:各位同学,公司业务越来越重,未来几年要成倍增长......,我们要梳理出一套新架构,才能更好的支持N万用户.....,以后升职加薪当上....打败.....
想想还有点小激动呢,于是过年时楼主趁等待相亲妹纸无聊的时候,反思了目前系统现状,构思设计新架构如下。

阅读目录:

  1. 现有系统
  2. 新架构
    2.1 逻辑架构图
    2.2 解释说明
  3. 系统实施
    3.1 SOA管理中心
    3.2 发布服务
    3.3 订阅服务
    3.4 采蘑菇示例
  4. 设计目标
    4.1 尽可能少的侵入
    4.2 服务自治&&水平扩展
    4.3 系统升级降级
  5. 常见问题
    5.1 ClientApi VS ServiceApi
    5.2 聚合服务
    5.3 服务分级
  6. 总结心得

现有系统

鄙司业务比较重,系统也有些年头,各研发团队、系统都比较稳定了。所以不差也不太好,总之也能满足现有需求。但近2年O2O,移动互联网等大行其道,老大们也都心动了,开始磨刀霍霍了。而现有系统应对复杂的变化,在一些地方颇显不足:

  • 接口没有统一管理
  • 很多组件无法复用/重复造轮子
  • 模块间职责不清,耦合过深
  • 联调排查问题比较慢
  • 开发前规划不足,形成堆积
  • 缺乏API规范/文档较少

新架构

逻辑架构图:

查看大图

解释说明:

  • A开头:是系统级别,可以独立部署。即可寄宿在IIS/WindowsService等上面。
  • B开头:是模块级别,不可独立部署。相对独立的功能模块,而又不大,所以依附其他系统或者和多个模块组成一个子系统。模块级别在项目中可以分多层,可根据分数升级成子系统(见系统升级降级)。
  • C开头:是组件级别,不可独立部署。大多数是公共性组件,一般是单独类库存在,以DLL提供使用。一些开源组件也归到这里,例:Aufofac,FluentData。 需要自搭Nuget服务器,进行统一版本管理。
  • 字母后面的数字:是代表服务的级别,见服务分级。
  • 系统通信: 各系统之间尽量走内网Wcf/Tcp,对外合作单位及各移动端走WebApi/Http。
  • 传输格式: Protobuffer、Json。
  • 数据交换: 优先通过数据服务接口,其次SSIS、Job。
  • 基础平台: 缓存Redis,队列RabbitMq等。依赖抽象,框架可替换。
  • DB 层: 每个子系统拥有自己的子DB,原则上不能跨库读其他的。
  • 高可用 : 子系统自行做负载,服务变更通知使用zookeeper。
  • 单向2级:只能订阅服务,不能发布服务,2级只能订阅2级服务。
  • 定点:某个客户端只能订阅某个服务端提供的服务。

系统实施

SOA管理中心

这是新架构的核心部分,主要功能如下:

  • 提供发布/订阅/ServiceAdapter组件
  • 提供Web管理界面
  • 对服务访问的各种配置
  • 在高峰期对服务限流/报警
  • 服务访问授权、描述

发布服务

各系统通过Web管理页面进行服务配置发布。
也可以通过管理中心提供的组件,进行配置发布:

protected void Application_Start()
{
ServicePublisher.Pushlish(
new ServiceConfig()
{
ServiceName
= "获取预订单详情",
Qps
= 1000,
Level
= 1,
Key
= "xxxx-yyyy",
Source
= SubscribeSource.All,
ServiceAddress
= "/Order/GetDetail",
//其他
});
}
[ServiceFilter]
void GetDetail()
{
}

订阅访问服务

各系统通过管理中心提供的组件,去获取订阅的服务,然后通过适配器去访问接口,服务变更在心跳里面做:

protected void Application_Start()
{
//获取服务列表
var serviceList = ServiceManager.GetServiceList();
GlobalService.ServiceList
=serviceList;
}
void Heartbeat()
{
var serviceList = ServiceManager.GetServiceList();
GlobalService.ServiceList
=serviceList;
}
ServiceAdapter.Access(GlobalService.ServiceList[
0]);

采蘑菇示例

设计目标

尽可能少的侵入

这点是非常重要的,如果不能很好的重用已有的系统或侵入性太强,势必会导致:

  • 新架构周期过长,长期维护二套结构。这种情况下,成本太高,不好推行下去或者还未推行就被砍了。
  • 开发人员的抵抗,每个猿类内心都有桀骜的脾气、造轮子的天赋、重组世界的梦想...。如果太复杂、约束太强,天知道你们这群猿类会干出什么事情!

基于这种考虑,才采用服务分布式而不是服务集中式。

  • 每个系统在需要时,去订阅服务,然后拉取服务地址/MyNeedServcie.list。
  • 然后通过ServiceAdapter访问服务,ServiceAdapter中会做权限等一些校验。
  • 在服务上增加ServiceFilter,Fileter会做权限校验及服务被调用的信息采集。
  • 然后在管理中心添加服务,文档描述。

好处是:A系统与B系统是直接交互的,服务调用不走中转路由,性能也好。而组件的作用仅是辅助性的约束。

服务自治&&水平扩展

由于侵入性较小,所以各个系统之间的服务变更,维护完全由各自研发团队维护。
本系统之间通讯不走服务,直接内部调用。调用通过ServiceAdapter组件访问,ServiceAdapter包含对进程内、WCF、WebApi等访问的封装,这样便于以后替换成其他服务。 各服务在扩展上不受管理中心节制,自行做负载、增加服务器即可。

系统升级降级

当有个新需要过来时,会根据产品是否需要独立部署,和现有系统耦合性等因素,来评估是模块级还是系统级。
对于旧模块,根据重要程度、访问量等评估出分数。达标的由模块抽离出子系统,单独管理。
同样对于旧系统,不达标的进行降级处理,缩小成模块整合到其他系统里面。

这块其实很重要,如果不对项目做好评估的话,往往会导致一个系统越来越沉重。最后的结果就是维护越来越麻烦,经常出问题。最后逼不得已就推到重来,这个成本就较大些,当然成本的事情老大会考虑更多些。处于这种情况下猿类们会一边吐槽着之前的同类渣渣,一边跃跃欲试准备大展身手,让你们瞧瞧什么叫DDD、TDD、设计模式......。

前提是在需求开发时,按模块进行分小层而不是整个大层,这样方便协作开发和抽取成子系统。

常见问题

ClientApi VS ServiceApi

ClientApi这个在前期用的比较多的办法。优点很明显:简单快捷,从Nuget上安装引用即可。这样后期会问题越来越多。
就拿缓存Redis来说,多个系统都使用客户端直接访问Redis服务器。如果有个系统连接数忘记关闭,就会影响整个大系统,原因就是Client权限过大,客户端是可以对redis服务器直接进行操控。这种情况下redis服务器本身是暴露在外的,哪怕客户端封装的再好也不行,只要研究下通信协议规范,就可以自己写个客户端连(参见:c#实现r

阅读更多内容

Re: ¶R§§¶§ÃĤ£¥Î.¦A¸ú¸úÂÃÂðÕ-§Ö¨Ó

wxdyanrpwqgmvpzi

 

 

這.有GAY葛葛最愛-的春藥ㄝ

 

性藥品.讓我-跟我女朋友不用分手啦

 

©ÊÃÄ«~§ïµ½§Ú-¸ò¦Ñ¤½·P±¡.¯u¦n

ndpkmffeibzxkgpji

 

 

買催情藥不用再`躲躲藏藏啦-快來

 

9sonba讓你.跟老公-恢復熱戀

 

¿E²n¦³-¦n¦h¦P§Ó.¬KÃÄ£¬

ixyshzgagrpfq

 

 

生人就是要.買性藥品-才過癮阿

 

看啥?老公都要.被搶了-還傻傻的

 

¤£·|§a.¥þ²yºÆ-¨g¶Ê±¡©Ê«~RUSH¨S¬Ý¹L?

wbzmsku

 

 

上網買性'藥品不在讓我臉-紅紅

 

如何讓老`公回信轉-意看妳來吧

 

Re: ¦Ñ¤½´£-¤£°_©Ê½ì`«ç»ò¿ì?§Ö¨Ó

sdijfcdxcux

 

 

性藥品-再high一次.早上起床繼續high

 

嗚老公怪-怪的莫`非小三作怪

 

¬Û«H§Ú­Ì¬KÃĵ´-¹ï¥i¥H±Ï¦^`¦Ñ¤½ªº¤ß

 

 

這麼怕-小三就買`春藥改變自已

 

tunkuvr

¦Ñ±C¦b§É¤W'©ñ¤£¶}-Åý§Ú­ÌÀ°§U§A

neyslkpycjaqrovipbe

 

 

感謝9sonba搶救我的婚姻.性藥品之-神

 

就是-它讓我們感.情回到熱戀期

 

Re: ¦nÀI¦³¿E²nÅý§Ú`¶R©ÊÃÄ«~¦n¤è«K'³á

 

 

激爽催情-藥讓我每天爽得哀哀.叫

 

夫妻吃了性藥24小時-待在`床上

 

wnqxrliujvy

§A­n.ªº¬KÃÄ-³£¦b9sonba

pfllippebgenjdghoe

 

 

如何-讓老.公一夜小蟲變大鵰

¨Ó¬Ý¤@¤U`³o¸Ì©Ê.ÃĤ£¤@¼Ë

dajzsfwkhkakttk

 

 

讓你享受更多-種性藥品都`在激爽

 

我的.天天天兒性藥品嚇'嚇叫

 

2015年2月22日星期日

Re: ­ì¨Ó§¯Ã~¤§.«e©ÊÃÄ«~³£-¶R¶Q¤F

khjjkmg

 

 

春藥催情性藥品.壯陽-藥品金蒼蠅

 

極樂bliss讓你進入.傳說中-的極樂境界

 

用Swift语言做App开发之单元测试 - Justin X

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
用Swift语言做App开发之单元测试 - Justin X  阅读原文»

作为一个有质量保障的应用程序,当然少不了单元测试;Swift开发的App也亦如此,此文将以一个简单的实例来介绍Swift中的单元测试。

这里我们使用XCode模版自带的XCTest框架,此框架包含了一个名为XCTestCase的类,所有的测试类都应该继承自它;按照约定俗成所有的测试方法名都应以test开头,并不能包含任何参数,只有这样,这些测试方法才能在运行测试时被自动执行;在每个测试方法里面,我们可以通过调用XCTAssert*函数去断言一个操作成功与否,如判等函数XCTAssertEqual、大于函数XCTAssertGreaterThan等;

话不多说,请先使用XCode创建一个iOS的Single View Application项目,并选择Swift作为开发语言。

大家可以看到创建完成后的目录结构应该是如此(这里我的项目名为TestDemo):

默认的模版会创建两个文件夹,一个和项目名同名(这里是TestDemo),用于放置App的主程序;另外一个则是“项目名+Tests”(这里是TestDemoTests),用于放置测试代码;

这里要注意的是,你要测试的类需要在Test中使用到,所以你在创建类文件时需要在Targets中同时选择TestDemo和TestDemoTests;

如我在主应用程序中添加一个名为Url的类:

创建完成后,录入代码:

1 class Url {
2 let baseUrl: String
3
4 init(baseUrl: String) {
5 self.baseUrl = baseUrl
6 }
7
8 func getActualPathFrom(resourcePath: String, segments: [String:String]) -> String {
9 var actualPath = resourcePath
10 for (key,value) in segments {
11 var segmentPlaceHolder = "{\(key)}"
12 actualPath = actualPath.stringByReplacingOccurrencesOfString(segmentPlaceHolder, withString: value, options: .LiteralSearch, range: nil)
13 }
14 return baseUrl + actualPath
15 }
16 }

然后在TestDemoTests文件夹下创建UrlTests文件,此时由于该类只需要在测试中才能用到,所以只需要在Targets选择TestDemoTests就可以了:

创建完成后,导入XCTest框架,并使该类继承自XCTestCase,然后录入测试代码:

import XCTest

class UrlTests: XCTestCase {
var urlInstance = Url(baseUrl: "http://localhost:8080/api/")

func testShouldGetCorrectPathWhenNoSegmentProvided() {
let resourcePath
= "customers"

let result
= urlInstance.getActualPathFrom(resourcePath, segments: [String:String]())

XCTAssertEqual(result,
"http://localhost:8080/api/customers", "Can not get corrent path when no segments provided")
}

func testGetCorrectPathGivenOneSegment() {
let resourcePath
= "customer/{id}"

let result
= urlInstance.getActualPathFrom(resourcePath, segments: ["id": "10"]);

XCTAssertEqual(result,
"http://localhost:8080/api/customer/10", "Can not get corrent path when only one segment provided")
}
}

最后Command+U执行测试


本文链接:用Swift语言做App开发之单元测试,转载请注明。

Java外观模式(Facade模式) - Coda  阅读原文»

外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面。

Facade一个典型应用就是数据库JDBC的应用,如下例对数据库的操作:

public class DBCompare {
 Connection conn
= null;
 PreparedStatement prep
= null;
 ResultSet rset
= null;
 
try {
  Class.forName(
"<driver>" ).newInstance();
  conn
= DriverManager.getConnection( "<database>" );
    
  String sql
= "SELECT * FROM <table> WHERE <column name> = ?";
  prep
= conn.prepareStatement( sql );
  prep.setString(
1, "<column value>" );
  rset
= prep.executeQuery();
  
if( rset.next() ) {
    System.out.println( rset.getString(
"<column name" ) );
  }
 }
catch( SException e ) {
  e.printStackTrace();
 }
finally {
  rset.close();
  prep.close();
  conn.close();
 }
}

上例是Jsp中最通常的对数据库操作办法。

在应用中,经常需要对数据库操作,每次都写上述一段代码肯定比较麻烦,需要将其中不变的部分提炼出来,做成一个接口,这就引入了facade外观对象。如果以后我们更换Class.forName中的<driver>也非常方便,比如从Mysql数据库换到Oracle数据库,只要更换facade接口中的driver就可以。

我们做成了一个Facade接口,使用该接口,上例中的程序就可以更改如下:

public class DBCompare {
 String sql
= "SELECT * FROM <table> WHERE <column name> = ?";  
 
try {
  Mysql msql
=new mysql(sql);
  prep.setString(
1, "<column value>" );
  rset
= prep.executeQuery();
  
if( rset.next() ) {
   System.out.println( rset.getString(
"<column name" ) );
  }
 }
catch( SException e ) {
  e.printStackTrace();
 }
finally {
  mysql.close();
  mysql
=null;
 }
}

可见非常简单,所有程序对数据库访问都是使用改接口,降低系统的复杂性,增加了灵活性。

如果我们要使用连接池,也只要针对facade接口修改就可以。

Java 外观模式

由上图可以看出,facade实际上是个理顺系统间关系,降低系统间耦合度的一个常用的办法,也许你已经不知不觉在使用,尽管不知道它就是facade。


本文链接:Java外观模式(Facade模式),转载请注明。

阅读更多内容

Fw: 9sonbaÅý§A.¸ò¦Ñ¤½-«ì´_¼öÅÊ

 

 

9sonba有好`多gay性-藥ㄛ

 

生人就是要.買性藥品-才過癮阿

 

kcmtiqjqfnwlujmqakks

Fw: ªü®Q«Â©ÊÃÄ©~.µM¶R¶V¦h-°e¶V¦h

ecdzvcgh

 

 

激爽有好`多gay性-藥ㄛ

 

原來康康.馬子這麼-死心蹋地是這原因

 

Âà±H: ¦A£|¤@£¶ªº¤k¤H¤]©è-§Ü¤£¤F©ÊÃÄ.«~¥\®Ä

bfgtzfqdutpwpy

 

 

馬子在床上'放不開-讓我們幫助你

 

Âà±H: AV¨k¬P¬°¤°-»ò³o`»ò¦³­á°k

nzbhnrgese

 

 

再ㄍ一ㄥ的女人也抵-抗不了性藥.品功效

 

我馬子都被我幹-的哀哀叫都是靠`極樂

 

¬Û«H§Ú­Ì¬KÃĵ´-¹ï¥i¥H±Ï¦^`¦Ñ¤½ªº¤ß

 

 

如何-讓老.公一夜小蟲變大鵰

 

rzvwisnnlpyisnc

¥u`­n120¬í°¨¤W·P¨ü¬KÃÄ.«Â¤O

 

 

激爽性藥品-讓妳成`為犀利人妻

 

osehyjmm

¦Ñ¤½¦Y³o-ÃÄ«á©~µM©Ê.¼¤¤j¶}

dyixjpkhk

 

 

老婆在床上'放不開-讓我們幫助你

 

原來老婆要吃了-催情藥才會這麼浪

 

¼K¼K.¦Û±q¶R¤F©ÊÃÄ`¦Ñ¤½Á`¬O¤@§À¬¡Às

bsrqogaowgdggkf

 

 

老公吃了性藥品-變好.強喔

 

超強力催情解決性-冷淡.想要瘋狂做愛

 

9sonba¶Ê±¡-ÃÄÅý§Ú¨C¤Ñ²n±o«s«s.¥s

 

 

小傑又在笑了-原來是偷偷到'這買壯陽藥

 

近百-種春藥都.在9sonba

 

hrxwkzykpdqpwk

2015年2月20日星期五

Hybird框架UI重构之路:二、事出有因 - 海角在眼前

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Hybird框架UI重构之路:二、事出有因 - 海角在眼前  阅读原文»

上篇回顾:Hybird框架UI重构之路:一、师其长技以自强

一切的重构都是有原因的,或许为了更快速度、更好体验、更快捷开发等,于是就有了自己的开发目标,简单看看未重构前UI("中国移动式"风格)。

上一篇文章说明调查了这么多类似框架,对比了他们的特点,而比对自身UI,也是存在可优化的地方,于是有了下面几点目标(仅仅UI框架方面,不涉及原生部分)。

(1)规范开发

1.SVN版本控制。之前的UI框架部分是没有进行svn版本控制的,于是会导致个问题——有些文件在多次修改后,连当初的开发者都不知道是不是最新的,存在争议。而加上svn,使得代码更加规范,有利于版本发布(打tag)。

2.职责确认。框架不是一个完成的,需多人协同,所以确立代码模块职责归属很重要,属于谁的就谁改。

(2)依赖库升级

1.zepto

最新版1.2.5的fixed了挺多问题,更换之后效果会好很多。

在这里不得不说一个zepto的库的问题,就是触摸模块(zepto的基础库是没有这个模块的,要自己额外加)。

zepto使用touchstart、touchmove、touchend模拟出tap、longTap等事件,目的为解决click事件的300ms延时,但有个很大的问题是tap事件会“穿透”,“穿透”又会导致一系列问题。我认为最好的办法是使用一个fastclick的库,用回click事件(但是重构的框架不能更换,原因是这个框架已经是第二个版本了,开发者对tap事件使用已成习惯,变革带来的代价太大了)。

PS:穿透:当两个层重叠在一起时,使用Zepto的tap事件时,点击上面的一层时会触发下面一层的事件。

2.iscroll

原本是想升级到iscroll5,但iscroll5的用法改动太大,没有延续性,并且尝试多次效果不佳,于是次依赖库就不升级了,还是iscroll4。

3.cordova

cordova的版本不是由我决定的,是由原生开发人员决定的。

4.require

这个作为模块文件加载的利器,是单页模式的好工具。

功能:

1.加载js文件

2.提供加载完回调

3.不重复加载

(3)单页模式

在上一篇文章说过了单页模式的优缺点,决定增加单页模式。可能会有人说,现在的业务逻辑和功能那么复杂,用单页模式将不负重堪(因为所有东西都在一个页面上,处于内存的对象将越来越多)。

可是我想说的是,现在功能都是碎片化的(大应用),都可以分为多个组合模块的,每个模块都不会多大,每个模块为一个单页,将单页和多页进行混用,这样模块间互不相干,混合模式有不错的效果!特别如果是轻应用(远程页面,仅web页面),单页有个非常好效果。

而我也用手机测试过,一个单页应用,每次切换会产生大概1MB无法回收的内存,根据现在手机硬件条件(动不动几G的内存),这个消耗我觉得还是可以容忍的。

(4)控件优化

1.删除旧UI中,难用、易错的控件。

PS:不删掉,就会有人用,一用就会有问题反馈,到头又要运维。

2.优化、增加好用的控件

  1. popup (from jingle框架)
  2. 侧边栏组件
  3. Tab组件
  4. 滑动列表

(5)bug修复

PS:什么框架都无法避免的东西。

总结

这一篇文章也是说明重构的一些目标。当然在最初的开发不一定能将所有开发需求都弄清,不过大目标却必须明确,既然目标有了,那么下一篇讲述开发的一些事。

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址:http://www.cnblogs.com/lovesong/p/4296781.html


本文链接:Hybird框架UI重构之路:二、事出有因,转载请注明。

Java适配器模式(Adapter模式) - Coda  阅读原文»

适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份。

为何使用适配器模式

我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办?

使用Adapter,在这两种接口之间创建一个混合接口(混血儿)。

如何使用适配器模式

实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式:组合(composition)和继承(inheritance),

假设我们要打桩,有两种类:方形桩 圆形桩。

public class SquarePeg{
 
public void insert(String str){
  System.out.println(
"SquarePeg insert():"+str);
 }
}

public class RoundPeg{
 
public void insertIntohole(String msg){
  System.out.println(
"RoundPeg insertIntoHole():"+msg);
}
}

现在有一个应用,需要既打方形桩,又打圆形桩。那么我们需要将这两个没有关系的类综合应用,假设RoundPeg我们没有源代码,或源代码我们不想修改,那么我们使用Adapter来实现这个应用:

public class PegAdapter extends SquarePeg{
 
private RoundPeg roundPeg;
 
public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)
 
public void insert(String str){ roundPeg.insertIntoHole(str);}
}

在上面代码中,RoundPeg属于Adaptee,是被适配者。PegAdapter是Adapter,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配。实际上这是将组合方法(composition)和继承(inheritance)方法综合运用。

PegAdapter首先继承SquarePeg,然后使用new的组合生成对象方式,生成RoundPeg的对象roundPeg,再重载父类insert()方法。从这里,你也了解使用new生成对象和使用extends继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码。

如果你有些Java使用的经验,已经发现,这种模式经常使用。

进一步使用

上面的PegAdapter是继承了SquarePeg,如果我们需要两边继承,即继承SquarePeg 又继承RoundPeg,因为Java中不允许多继承,但是我们可以实现(implements)两个接口(interface):

public interface IRoundPeg{
 
public void insertIntoHole(String msg);
}
public interface ISquarePeg{
 
public void insert(String str);
}


下面是新的RoundPeg 和SquarePeg, 除了实现接口这一区别,和上面的没什么区别。

public class SquarePeg implements ISquarePeg{
 
public void insert(String str){
  System.out.println(
"SquarePeg insert():"+str);
 }
}

public class RoundPeg implements IRoundPeg{
 
public void insertIntohole(String msg){
  System.out.println(
"RoundPeg insertIntoHole():"+msg);
 }
}

下面是新的PegAdapter,叫做two-way adapter:

public class PegAdapter implements IRoundPeg,ISquarePeg{
 
private RoundPeg roundPeg;
 
private SquarePeg squarePeg;

 
// 构造方法
 public PegAdapter(RoundPeg peg){this.roundPeg=peg;}
 
// 构造方法
 public PegAdapter(SquarePeg peg)(this.squarePeg=peg;)

 
public void insert(String str){ roundPeg.insertIntoHole(str);}
}

还有一种叫Pluggable Adapters,可以动态的获取几个adapters中一个。使用Reflection技术,可以动态的发现类中的Public方法。


本文链接:Java适配器模式(Adapter模式),转载请注明。

阅读更多内容