[heading]问题描述[/heading]
因为Google把http的网站标记为不安全网站的关系,决定把本站点改为SSL的https方式。
安装好证书,修改了站点的Site和URL配置,重启站点后发现前端页面可以正常访问,但是wp-admin页面却一直显示重定向过多的错误,

[highlight dark=”no”]ERR_TOO_MANY_REDIRECTS[/highlight]

[heading]解决方法[/heading]

放狗搜了一番,从清cookies到修改wp-config.php都试过,但是还是不能奏效。就这样拖了两个星期,今天稍微空下来,决定把这个问题彻底解决。

在wp-config.php文件下增加了以下几行。
[highlight dark=”no”]
define('FORCE_SSL_ADMIN',true);
// in some setups HTTP_X_FORWARDED_PROTO might contain
// a comma-separated list e.g. http,https
// so check for https existence
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
$_SERVER['HTTPS']='on';

[/highlight]

重启后,发现站点不再报重定向过多的错了,但是又报OAuth的错(因为俺是用Google的OAuth验证登录)。登上Google的API Manager Console,把站点链接地址指向从http改到https,问题解决。

Python(英语发音:/ˈpaɪθən/), 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。
Python是纯粹的自由软件源代码解释器CPython遵循 GPL(GNU General Public License)协议[1]  。
Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。

设计定位

Python的设计哲学是“优雅”、“明确”、“简单”。因此,Perl语言中“总是有多种方法来做同一件事”的理 念在Python开发者中通常是难以忍受的。Python开发者的哲学是“用一种方法,最好是只有一种方法来做一件事”。在设计Python语言时,如果 面临多种选择,Python开发者一般会拒绝花俏的语法,而选择明确的没有或者很少有歧义的语法。由于这种设计观念的差异,Python源代码通常被认为 比Perl具备更好的可读性,并且能够支撑大规模的软件开发。这些准则被称为Python格言。在Python解释器内运行import this可以获得完整的列表。
Python开发人员尽量避开不成熟或者不重要的优化。一些针对非重要部位的加快运行速度的补丁通常不会被合并到 Python内。所以很多人认为Python很慢。不过,根据二八定律,大多数程序对速度要求不高。在某些对运行速度要求很高的情况,Python设计师 倾向于使用JIT技术,或者用使用C/C++语言改写这部分程序。可用的JIT技术是PyPy
Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具。
虽然Python可能被粗略地分类为“脚本语言”(script language),但实际上一些大规模软件开发计划例如ZopeMnet及BitTorrent,Google也广泛地使用它。Python的支持者较喜欢称它为一种高级动态编程语言,原因是“脚本语言”泛指仅作简单程序设计任务的语言,如shellscript、VBScript等只能处理简单任务的编程语言,并不能与Python相提并论。
Python本身被设计为可扩充的。并非所有的特性和功能都集成到语言核心。Python提供了丰富的API和 工具,以便程序员能够轻松地使用C语言、C++、Cython来编写扩充模块。Python编译器本身也可以被集成到其它需要脚本语言的程序内。因此,很 多人还把Python作为一种“胶水语言”(glue language)使用。使用Python将其他语言编写的程序进行集成和封装。在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。《Python技术手册》的作者马特利(Alex Martelli)说:“这很难讲,不过,2004 年,Python 已在Google 内部使用,Google 召募许多 Python 高手,但在这之前就已决定使用Python,他们的目的是 Python where we can, C++ where we must,在操控硬件的场合使用 C++,在快速开发时候使用 Python。”

基本语法

Python的设计目标之一是让代码具备高度的可阅读性。它设计时尽量使用其它语言经常使用的标点符号和英文单字,让代码看起来整洁美观。它不像其他的静态语言如C、Pascal那样需要重复书写声明语句,也不像它们的语法那样经常有特殊情况和惊喜。

缩进

Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯。并且 Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字。增加缩进表示语句块的开始,而减少缩进则表示 语句块的退出。缩进成为了语法的一部分。例如if语句:
1
2
3
4
if age<21:
    print("你不能买酒。")
    print("不过你能买口香糖。")
print("这句话处於if语句块的外面。")
注:上述例子为python 3.0版本的代码
根据PEP的规定,必须使用4个空格来表示每级缩进(不清楚4个空格的规定如何,在实际编写中可以自 定义空格数,但是要满足每级缩进间空格数相等)。使用Tab字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。支持Tab字符和其它数目的空格 仅仅是为兼容很旧的的Python程序和某些有问题的编辑程序。

控制语句

if语句,当条件成立时运行语句块。经常与else, elif(相当于else if) 配合使用。
for语句,遍历列表、字符串、字典、集合等迭代器,依次处理迭代器中的每个元素。
while语句,当条件为真时,循环运行语句块。
try语句。与except,finally配合使用处理在程序运行中出现的异常情况。
class语句。用于定义类型
def语句。用于定义函数和类型的方法。
pass语句。表示此行为空,不运行任何操作。
assert语句。用于程序调适阶段时测试运行条件是否满足。
with语句。Python2.6以后定义的语法,在一个场景中运行语句块。比如,运行语句块前加密,然后在语句块运行退出后解密。
yield语句。在迭代器函数内使用,用于返回一个元素。自从Python 2.5版本以后。这个语句变成一个运算符。
raise语句。制造一个错误。
import语句。导入一个模块或包。
from import语句。从包导入模块或从模块导入某个对象。
import as语句。将导入的对象赋值给一个变量。
in语句。判断一个对象是否在一个字符串/列表/元组里。

表达式

Python的表达式写法与C/C++类似。只是在某些写法有所差别。
主要的算术运算符与C/C++类似。+, -, *, /, //, **, ~, %分别表示加法或者取正、减法或者取负、乘法、除法、整除、乘方、取补、取模。>>, <<表示右移和左移。&, |, ^表示二进制的AND, OR, XOR运算。>, <, ==, !=, <=, >=用于比较两个表达式的值,分别表示大于、小于、等于、不等于、小于等于、大于等于。在这些运算符里面,~, |, ^, &, <<, >>必须应用于整数。
Python使用and, or, not表示逻辑运算。
is, is not用于比较两个变量是否是同一个对象。in, not in用于判断一个对象是否属于另外一个对象。
Python支持“列表推导式”(list comprehension),比如计算0-9的平方和:
>>> sum(x * x for x in range(10))
285
Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:
>>> add=lambda x, y : x + y
>>> add(3,2)
5
Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x。
Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的 写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处 理。因此,可以同时赋值给多个变量,比如:
>>> x, y=1,2#同时给x,y赋值,最终结果:x=1, y=2
特别地,可以使用以下这种形式来交换两个变量的值:
>>> x, y=y, x #最终结果:y=1, x=2
Python使用'(单引号)和”(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双 引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如\n表示换行符。表达式前加r指示Python不解释字符 串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。
Python支持列表切割(list slices),可以取得完整列表的一部分。支持切割操作的类型有str, bytes, list, tuple等。它的语法是…[left:right]或者…[left:right:stride]。假定nums变量的值是[1, 3, 5, 7, 8, 13, 20],那么下面几个语句为真:
nums[2:5] == [5, 7, 8] 从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。
nums[1:] == [3, 5, 7, 8, 13, 20] 切割到最后一个元素。
nums[:-3] == [1, 3, 5, 7] 从最开始的元素一直切割到倒数第3个元素。
nums[:] == [1, 3, 5, 7, 8, 13, 20] 返回所有元素。改变新的列表不会影响到nums。
nums[1:5:2] == [3, 5] 从下标为1的元素切割到下标为5的元素但不包含下标为5的元素,且步长为2。

函数

Python的函数支持递归、默认参数值、可变参数,但不支持函数重载。为了增强代码的可读性,可以在函数后书写 “文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()打印出 函数的使用帮助。比如:
>>> def randint(a, b):
… “Return random integer in range [a, b], including both end points.”…
>>> help(randint)
Help on function randint in module __main__:
randint(a, b)
Return random integer inrange[a, b], including both end points.

最近突然对于API以及API管理相关的内容感兴趣,于是上18摸的API Management网站下载了一本《APIs For Dummies》的IBM版本做入门的学习。当看到其中的APIs versus services一节,对于API与服务差异的解释,很是清晰,也解开了自己一直以来的疑问。尤其是利用汽车来比喻API与Service的异同,真令人印象深刻。不惜做一回搬运工,把书中的内容做个归纳。

SOA的核心是服务(Service),单纯从技术的角度来看,其实API也是一种服务。但是否API就等于服务呢,这又不尽然。服务与API最大的差别,是它们设计目标的不同。API总是设计用来吸引预期的使用者,当使用者的需求发生改变API也相应改变。与此相反,对于服务的设计,全局的成本和稳定性往往更加重要。使用汽车来比喻的话,API的设计是赛车,注重于外观和使用,而服务的设计是常规的汽车,更着眼与成本和大批量的生产。

APIs and services address different concerns

APIs and services address different concerns

API的产品本质是面向特定的使用者,对于使用者来说,使用API意味着快速、方便与极短的学习曲线。至少从服务提供者的角度来看,这些设计标准是传统的服务与API的根本性差别。

  • 对服务提供者来说,重用包含于API交付的努力中;对于API的使用者,重用是关乎他们软件的交付速度,不管需要为作为软件一部分的API付出多大的代价。
  • 对于服务提供者来说,共享是关乎效率;对于API使用者,共享是是否方便(如果不方便,该API将没人使用)
  • 对于服务提供者来说,封装是更少的改变;对于API使用者,封装是更短的学习曲线(如果接口太复杂,API将没人使用)

有多少SOA项目没有因为服务提供者和服务使用者间因为服务接口由什么组成的冲突而停滞的?一方面,一个移动应用开发者希望API对于她的应用要足够简单;另一方面,后台团队希望大家使用相同的标准化的服务和数据模型。有没有一种既能满足需求,又不会产生高昂费用的强制双方接受的权宜解决方法呢?

API与服务的结合

SOA是屏蔽服务使用者与后端变化的方法。但是谁能为需求不断变化的前端多渠道应用的服务提供者提供保护呢?结合API和服务可使你沉着应对剧变的环境。服务是由服务提供商整理的应用域的基本功能,API是在这些功能(服务)以易于共享形式的重新包装,产品化。所以说API和服务是互补,而不是相互矛盾的,把API和服务结合在一起,将极大地提高企业创新的整体效益。

背景:

AttributeEditer同样也是资产,当给一个Attribute赋予相应的AttributeEditer时,则会将默认的Attribute输入机制替换(即输入风格替换)。

AE(属性编辑器)相关:

presentationobject.dtd 在webcenter sites安装目录下,文件定义了flex attribute资产的几种输入风格,内置9种。

attribute editor asset 持有一个xml,
如果输入格式为check boxes,radio options, pull-down lists等类型的话,xml的代码则是提供相应的选项值。Xml代码中所用到的标签,则都是在presentationobject.dtd中定义的。

样例:

首先我们来看个样例代码,attribute editor asset所持有的xml的样例代码(此处则以下拉列表为例):

Demo1:

<?XML VERSION=”1.0″?>

<!DOCTYPE PRESENTATIONOBJECT SYSTEM “presentationobject.dtd”>

<PRESENTATIONOBJECT NAME=”PulldownTest”>

<PULLDOWN>

<ITEM>Red</ITEM>

<ITEM>Green</ITEM>

<ITEM>Blue</ITEM>

</PULLDOWN>

Demo2:

<?XML VERSION=”1.0″?>

<!DOCTYPE PRESENTATIONOBJECT SYSTEM “presentationobject.dtd”>

<PRESENTATIONOBJECT NAME=”PulldownTest”>

<PULLDOWN>

<QUERYASSETNAME>A Prods</QUERYASSETNAME>

</PULLDOWN>

 

说明:

从上面提供的attribute editor asset所持有xml代码样例中可看出,我们可以在xml文件中直接指定下拉列表所需要的值,或者指定一个QUERYASSETNAME属性(即指定query资产的名称)。

 

Demo1比较简单,只需要把代码copy至任一xml文件中,再去webcenter sites的content server 中创建相应的attribute editor asset,并上传此xml文件,则可以供flex attribute使用。

注:在编辑flex attribute界面中,编辑Attribute Editor属性来选择属性的编辑器

 

在Demo2中我们可看到使用了<QUERYASSETNAME>标签,那么我们则需要提供相应的Query资产。

通常情况下,我们会在项目中遇到许多表单中的下拉列表,而且这些值通常都是固定的,我们通常的做法是将他们放在同一样字典表中来使用。所以,此处我们也使用一张表来存放我们下拉列表中的数据。

 

Demo2:

1、创建table

在Admin视图中,打开左边admin tab,展开Management Tools,双击Sites Database,在右边操作表单中,选择add table

 



 

 

2、创建table 中的row,双击Content,选项Add New Content



 

3、创建query资产

在Contributor视图下创建Query资产


注:查询结果选择Collection,

用于属性编辑器的查询语句应符合如下格式:

select name as value, id as assetid from Product where…

 

4、创建AttributeEditor

首先创建demo2的xml文件

<?XML VERSION=”1.0″?>

<!DOCTYPE PRESENTATIONOBJECT SYSTEM “presentationobject.dtd”>

<PRESENTATIONOBJECT NAME=”PulldownTest”>

<PULLDOWN>

<QUERYASSETNAME>此处填写指定Query资产的Name</QUERYASSETNAME>

</PULLDOWN>

将此xml文件在创建AttributeEditer表单中上传,完成创建。

0 评论/通过:

学习sites一段时间了,发现理论知识严重不足,前些日子恶补developer’s 中之前跳过的章节。
想起之前在网上看到的sites请求序列图,仔细看后又有了新的理解,但还是感觉之前在网上看到请求序列图是手工画的,看起来怪怪的,就用viso重新画了个,分享给大家:
参考链接: Oracle WebCenter (Sites)概述笔记

受不了动辄几百G的虚机,记给自己看,只是在网络上搬运,来源在这里:http://www.virtuatopia.com/index.php/How_to_Convert_a_VMware_Pre-allocated_Virtual_Disk_to_a_Growable_Virtual_Disk

he vmware-vdiskmanager tool

The VMware Disk Management Tool is a command line tool which is installed by default with VMware Server. The executable file is named vmware-vdiskmanager and is located in \Program Files\VMware\VMware Server on Windows hosts, and /usr/bin on Linux systems.
The tool accepts a number of command-line arguments, a full listing of which can be obtained by running vmware-vdiskmanager with no options.
vmware-vdiskmanager

Virtual Disk Types

The type to which a virtual disk is to be converted is specified using the -t flag, together with the target disk type. This is represented by a number as outlined in the following table:
Type Identifier
Description
0
Growable (single .vmdk file)
1 Growable (multiple 2GB files)
2 Pre-allocated (single file)
3
Pre-allocated (multiple 2GB files)
4 Pre-allocated ESX
5 Compressed for streaming

Performing the Virtual Disk Type Conversion

The vmware-vdiskmanager command requires a number of arugments perform a virtual disk type conversion. The syntax for a type conversion is as follows:
vmware-vdiskmanager -r .vmdk -t  .vmdk
where .vmdk is the name of the virtual disk image file to be converted,  is the number from the above table indicating the target virtual disk type, and .vmdk is the name of the new, converted file.
For example, to convert a virtual disk image file called win2008-1_2.vmdk to a growable disk called new.vmdk the following command would need to be executed:
vmware-vdiskmanager -r  win2008-1_2.vmdk -t 0 new.vmdk

Creating disk 'new.vmdk'
Convert: 100% done.
Virtual disk conversion successful.
Once the conversion is completed, the virtual machine will need to be configured to use the converted disk, or the new disk renamed to have the name of the original disk.

Oracle UCM11g把应用服务器绑定在Weblogic上,但是怎么样利用外部LDAP作为安全提供者却语焉不详,官方文档里也只是描述怎么样配置Oracle Directory Manager,我不想用IDM这又臭又大的东西,怎么样配置其它LDAP基本就自己摸索了,鄙视这种不负责任的行为。
   废话少说,在Linux AS5上安装并编写LDIF文件,建立LDAP的基础结构如下:
image
登录Weblogic服务器的管理Console,在Domain Sturcture下选择Security Realms,在列表中选择myrealm,打开安全配置页面。
image
点击Provider,配置新的安全提供者。选择类型为“OpenLDAPAuthenticator”,并起名为OpenLDAP。
image
创建Provider后对Provider Specific进行配置并保存。
image
Host:LDAP服务器
Port:LDAP服务端口
Principal:LDAP服务管理用户名
Credential:LDAP服务管理员密码
User Base DN:LDAP中与用户对应的DN
User Name Attribute: cn
User Object Class: person
Group Base DN:与用户组对应的DN,这个要特别注意,因为UCM中的用户组就是对应与此DN下的Entry。
Use Retrieved User Name as Principal:勾选
Propagate Cause For Login Exception:勾选
配置好后保存,重新启动Weblogic AdminServer,从myrealm的Users and Groups页面可以看到LDAP中的用户。
image
打开UCM,确认LDAP中用户可以登录访问UCM,同时正确映射用户角色与账户。
image
image

客户生产环境的数据库不知什么原因突然挂了,无论怎么调整也不能启动监听器服务,用JDBC访问永远是访问不通,折腾了大半天终于忍无可忍,决定重新创建一个数据库实例,然后再恢复数据。

停下的应用服务,数据库,然后把原来的UCM数据库文件导入,启动UCM,发现UCM服务没法正常启动。从Admin Server查看日志,发现报如下错误:
.Unable to create result set for query ‘select * from CpdLinks where dCpdGuid=’0”. ORA-00942: table or view does not exist
ORA-00942: table or view does not exist

intradoc.common.ServiceException: !csDbUnableToCreateResultSet,select * from CpdLinks where dCpdGuid=’0′!$ORA-00942: table or view does not exist

at intradoc.server.IdcServerManager.init(IdcServerManager.java:148)
at IdcServer.init(IdcServer.java:64)
at IdcServer.main(IdcServer.java:37)
Caused by: intradoc.data.DataException: !csDbUnableToCreateResultSet,select * from CpdLinks where dCpdGuid=’0′!$ORA-00942: table or view does not exist

at intradoc.jdbc.JdbcWorkspace.createResultSetSQL(JdbcWorkspace.java:826)
at folios.FolioInstallFilter.contentFoliosUpgrade(FolioInstallFilter.java:385)
at folios.FolioInstallFilter.doFilter(FolioInstallFilter.java:62)
at intradoc.shared.PluginFilters.filter(PluginFilters.java:92)
at intradoc.server.IdcExtendedLoader.executeFilter(IdcExtendedLoader.java:285)
at intradoc.server.IdcExtendedLoader.extraBeforeCacheLoadInit(IdcExtendedLoader.java:255)
at intradoc.server.IdcSystemLoader.loadCaches(IdcSystemLoader.java:928)
at intradoc.server.IdcServerManager.init(IdcServerManager.java:79)
… 2 more
Caused by: java.sql.SQLException: ORA-00942: table or view does not exist

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:790)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1037)
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:830)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1124)
at oracle.jdbc.driver.OracleStatement.doScrollExecuteCommon(OracleStatement.java:4051)
at oracle.jdbc.driver.OracleStatement.doScrollStmtExecuteQuery(OracleStatement.java:4191)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1279)
at intradoc.jdbc.JdbcWorkspace.createResultSetSQL(JdbcWorkspace.java:802)
… 9 more

从另外一台机器看UCM系统的数据库,又找不到这个表。奇怪了,只好一个个校对,后来突然发现恢复的UCM系统启用了Folio组件,会不会是这个影响呢?在组件管理把Content Folio功能禁用,重新启动UCM服务,果然顺利启动。

解决方法:

   1. Open a connection to the content server’s database schema using SQL Developer, SQL+, etc.
   2. Delete the record in the config table that has a dName value of ContentFolios
    3.Drop all the database tables that start with Cpd if they exist

    CpdArchivedLinks
    CpdBasketLinks
    CpdChangeHistory
    CpdLinks

    4.Reinstall the ContentFolios component on the content server
    5.Restart the content server

装了UCM 11g的虚机,回到公司用Console怎么也起不起来,一直报 的错,尝试在EM用NodeManager去启动,更加惨,除了原来的错外,还报了一大堆类似
java.lang.ClassNotFoundException: oracle.jrf.wls.JRFStartup
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at weblogic.management.deploy.classdeployment.ClassDeploymentManager.invokeClass(ClassDeploymentManager.java:253)
at weblogic.management.deploy.classdeployment.ClassDeploymentManager.access$000(ClassDeploymentManager.java:54)
at weblogic.management.deploy.classdeployment.ClassDeploymentManager$1.run(ClassDeploymentManager.java:205)
Truncated. see log file for complete stacktrace的错误。查了下,发现是要调整nodemanager.properties的设置,使用以下步骤:
Stop All Managed Servers
Stop Node Manager
Update nodemanager.properties
set
StartScriptEnabled=true

Restart Node Manager
Restart managed Servers from WLS Console.
然后重启EM,启动UCM Server实例,竞然神奇的好了,搞不明白是啥原因。