123
 123

Tip: 看不到本站引用 Flickr 的图片? 下载 Firefox Access Flickr 插件 | AD: 订阅 DBA notes --

2008-07-11 Fri

22:55 InfoQ: 产品负责人成功之道 (11267 Bytes) » Fenng's shared items in Google Reader

Scrum中,产品负责人这个角色具有很大的影响力,但要想运用得当,可没那么轻而易举:如能成功应用,就可以在客户/产品管理和开发者之间建立起全新而融洽的关系,企业也将因此而受益,甚至有可能增加竞争优势。不过天下没有免费的午餐:为了发挥其作用,组织要经常要做出有针对性的调整。这篇文章揭示了成功发挥产品负责人角色作用的奥秘。阅读之后,读者就可以明白:成功的产品负责人需要具备哪些素质。

强力胶

在Scrum中,产品负责人扮演着重要的角色。它根本不是为老职位设置的新名称,而是重新定义了业务和开发/IT之间的关系。需求的处理方式也在改变,不必再像过去那样,在项目一开始就必须完整描述,冻结之后再转交给开发团队。将管理项目的责任单独指派给项目经理,整个过程中没有客户代表的参与,这种项目管理的方式也变了。取而代之的是,产品负责人通过沟通了解客户的需求,指导产品的发布,并根据眼前的实际情况,不断在团队和项目干系人之间协调。可以这样说,产品负责人扮演了粘合剂的角色,他需要帮助最终客户、产品管理负责人、开发人员和项目干系人达成一致,确保大家都在朝着同一个方向前进。

这个角色通常是由客户或者产品经理承担的,所以业务层面也要开始了解Scrum,并做一些必要的变化与之相适应。虽然实际操作上有不少难度,但产生的结果物超所值。不仅能在业务人员和开发/IT人员之间建立起更融洽的关系,而且能给企业增加竞争优势:用户需求得到顺畅沟通;有专人负责版本目标的定义和发布;决策流程得以提速;误会和工作方向不一致的情况也得以避免。

工作描述

产品负责人的详细职责包括三个主要领域:客户需求,项目成功和团队合作。

在Scrum中,产品负责人要与客户沟通需求并理解这些需求。不妨将产品负责人想象成企业家:他们从业务价值的角度来制定软件产品的未来发展规划,并与别人沟通自己的想法。产品负责人要填写产品 backlog,并根据实际情况随时修改这些内容:可能要增加新需求,修改已有需求,这通常都是实时性的,而且这些修改都要在下一次sprint 计划会议之前完成。另外,产品负责人要对产品backlog上的条目排定优先级,确保团队总是在处理最重要的需求。

保证项目成功是产品负责人的第二个职责。这包括满足项目目标以及财务目标,如投资回报率(ROI)。产品负责人决定功能、发布时间,从使客户满意度最高和获得最高ROI的角度出发安排预算。产品负责人还要创建并更新发布计划及发布报告。

最后一条也很重要:产品负责人要与整个团队进行沟通协作,在整个过程中与利益相关者保持一致。产品负责人要和团队一起确认详细的需求。在产生疑问的时候,产品负责人解释需求,并根据当初就“完成”标准达成的共识对工作结果进行评估。最后,产品负责人要针对sprint计划会议做准备工作。在会前需要逐步分解需求,让会议可以顺利进行。

担当产品负责人的角色应该是全职工作,特别是涉及到需要大量创新或者很复杂的项目。根据项目的特性和规模,这项工作可以由最终客户、产品经理、市场人员或者客户来担任。

常见陷阱

老实说:产品负责人这个角色可不是那么好做的。这些年来,我见过许多产品负责人所犯的常见错误。下面这些是我想告诉大家的。

有些组织认为仅由一个人来担任这个职位很困难。为解决这个问题,他们会让多个人分担产品负责人的角色,例如产品经理负责用户需求,ScrumMaster负责项目成功和团队协作。我把这个问题称作“虚拟产品负责人综合症”。一旦陷入其中,公司将失去产品负责人所带来的很多好处,而且还丧失了本可以因此变得更好的机会。多人执行产品负责人的职责,只适用于多个团队参与同一个项目的状况。在这种情况下,我愿意与一组产品负责人工作,而且其中有一位负责整个项目(有时此人被称为产品总负责人)。

让IT人员或者程序员担任产品负责人,这是另外一个常见的陷阱。这意味着产品管理人员或者最终客户不愿意进行改变,不想担当起产品负责人的职责。“IT 产品负责人” 仅仅是技术和业务的中间人。这个角色将不再具备原本的影响力,也没有人来理解和沟通客户需求。业务人员和开发/IT人员不再为了合作而进行必要的改变,关系无法得到改善。跟以前一样,业务人员将需求交给开发部门之后就不再过问。(话虽这么说,也有特殊情况:如果是涉及多个团队的项目,其中有一个组件开发团队,那么让架构师充当这个团队的产品负责人,盯着他们的工作,这还是挺不错的。)

最后的问题是“蹦极产品负责人”(当然,这个名字来自Dilbert漫画):一个几乎没什么作用的产品负责人,只参加sprint计划会议和复查会议。这类型的产品负责人很难主动控制和指导项目。许多没有答案的问题只能通过ScrumMaster简单的猜想或推测来回答。另外一些产品负责人还会妨碍项目取得进展。无论是什么原因,工作过度还是有其他更重要的工作——不能正常发挥作用的产品负责人会对产品发布起负面作用。

成功公式

如何能够避免上述陷阱,并成功发挥产品负责人的作用?我发现了三个关键因素:

  1. 产品负责人必须得到授权
  2. 担当该角色的那个人必须有足够的时间完成工作
  3. 产品负责人必须称职

过去的经验证明,这几个因素非常关键。我发现:一个被授权的、能够全心投入的、称职的产品负责人,和Scrum项目的健康和成功之间,有着密不可分的关系。

“授权” 的意思是指:产品负责人有权力做决定,能为决定所产生的结果负责。这要求产品负责人能够快速做出相关决定,不需每次都要得到管理层的批准。我常常遇到这样一些公司,他们低估产品负责人的重要性,因此而使得产品负责人得不到足够的授权。如果产品负责人被任命领导重要的项目,那么高层管理人员应该为其提供直接支持。另外,产品负责人应该积极参与到发布目标的设定中,这样他就会完全负起达成目标的责任。

“缺乏参与” 最后将影响到项目的产出效率。必要的准备工作无法完成,决策延迟。正如前面提到过的,“蹦极产品负责人”只参加sprint计划会议和复查会议,因此很难迅速、全面地解决项目中出现的问题。他们无法与团队形成持续的协作,导致自己控制和指导项目的能力被削弱。

“称职”包括两个意思:完全了解客户的需求,具备敏捷和Scrum的实用知识。第二点包括能够实行相关的实践,例如准确填写和修改产品的backlog,或以用户故事的形式描述需求。在Scrum里,产品负责人需要接受适当的培训,这样他们才能很好地完成工作,就像ScrumMaster一样。一般说来,将 “Scrum认证产品负责人™”课程和上岗培训/指导结合起来,会产生最好的效果。

为了让产品负责人顺利发挥作用,你可以试试下面的方法:保证管理层都了解这个角色的重要性,并小心选择产品负责人的人选。此外,还可以让这个人投入尽量多的时间以胜任该职位,并远离其它工作的干扰。最后,要从长远发展的角度出发:培养产品负责人——要注意培养现有的员工,让他们准备好担任产品负责人的角色。这要求建立起内部的培训和指导能力。

陈年旧闻

产品负责人能够为组织带来很好的作用,当想做好却不容易。要培养员工成为好的产品负责人同样面临不少困难。有意思的是,丰田、本田以及其他一些精益企业,在很长时间内成功实施了产品负责人的机制。事实上,这种机制在丰田已经实施了差不多一个世纪。丰田公司的产品负责人被称作“首席工程师”,只有为人称道的资深工程师才能担任这个职位。首席工程师承担了产品负责人职责中的一大部分,同时还要承担首席架构师在开发项目中的工作。虽然首席工程师的工作要比 Scrum中产品负责人更有难度,丰田仍然成功实施了这个角色,并让它成为了强大的精益系统中的基石。丰田的例子说明,如果企业愿意作出必要的改变,产品负责人能够增强企业的竞争优势。

总结

毫无疑问:要发挥产品负责人角色的作用非常困难,但是适当的应用是成功Scrum的必要因素。削弱这个角色的权力也许可以让其更容易发挥作用,可是带来的好处也因此而减少了,所以要抵抗改造这个角色的诱惑。相反,要利用发现的问题和障碍,使之驱动组织进行必要的调整,这将对整个企业起到改善作用。企业可以利用这个角色来增强竞争优势。做出必要的改变是很艰难的工作,也需要花费一些时间。不幸的是,我没有发现Scrum有什么神奇的魔力可以让变化轻而易举地发生。如果我找到了,一定会让你们知道。我保证。

参考资料

James M. Morgan, Jeffrey K. Liker. The Toyota Product Development System: Integrating People, Process and Technology. Productivity Press. 2006

Roman Pichler. Scrum - Agiles Projektmanagement erfolgreich einsetzen. dpunkt. 2007

Ken Schwaber. Agile Project Management with Scrum. Microsoft Press. 2004

Allen C. Ward. Lean Product and Process Development. Lean Enterprise Institute. 2007

个人介绍

Roman Pichler,管理顾问,精益思想和Scrum专家。《Scrum - Agiles Projektmanagement richtig einsetzen》(dpunkt 2007)的作者。Roman曾与产品负责人一起工作多年。他提供针对产品负责人的训练和指导,包括Scrum认证产品负责人的课程。想了解更多信息,请看www.romanpichler.com

查看英文原文:Creating Product Owner Success

22:42 一只熟睡的咪 (1997 Bytes) » Oracle Life

©作者:eygle 发布在 eygle.com

墨墨回到北京,我的工作就变成了跟班,整天爬在他后边照看他。还要一天几次带他到楼下去散步。
这是一个专职爸爸的日常工作了。

难得北京这个周末看见了蓝天,看见了明媚的阳光,窗外知了声声,告诉我们北京的夏天终于来到了。
夏日的午后,最好是有一个摇椅,在阳光边上的阴凉里,美美的看会书,困了,就蜷缩的睡上一觉。
多了美好的时光!

现在有一只咪就这样睡着了,盖小咪:

相关文章|Related Articles

评论数量(0)|Add Comments

本文网址:

21:01 SQLLOADER导入列中的空格 (614 Bytes) » yangtingkun
前两天一个朋友问我这个问题,如何将文件中的空格作为列的值利用SQLLOADER加载到数据库中。首先建立一张测试用表:SQL> CREATE TABLE T_LOAD_SPACE (ID NUMBER, NAME VARCHAR2(30), AGE NUMBER);表已创建。为了简单,将数据放到控制文件中,控制文件和数据内容如下:LOAD DATAINFILE * TRUNCATE INTO TABLE T_LOAD_SPACE(ID CHAR TERMINATED BY ',', Name CHAR TERMINATED BY ',',AGE CHAR TERMINATED BY WHITESPACE)BEGINDATA1,A,152, B,253,C ,354, D ,455, ,55可以看到,记录1的NAME列不包含空格,记录2的NAME列包含空格前缀,记录3的N...
19:00 “_serial_direct_read “ (1382 Bytes) » Brotherxiao's Home

早上爬起来改造一个索引,表数据不太大,70G左右。发现扫描速度很慢,20分钟还没有完成,并且持续产生db file sequential read 等待。

128 14219 4178346 db file scattered read 235/30988/8 0 0
3833 9207 5575144 SQL*Net message to client 1650815232/1/0 -1 1122932962
3711 7340 4456772 db file sequential read 770/131609/1 0 3326192486
1820 41191 3387804 db file sequential read 186/140569/1 -1 3326192486
412 7801 2470376 PX Deq: Execute Reply 200/40/0 0 0
3647 59903 3936612 PX Deq: Execution Msg 268566527/40/0 0 3326192486
3063 10997 839952 PX Deq: Execution Msg 268566527/731/0 0 3326192486

full table scan在oltp环境还是会产生较多不良影响

1) age out cache

2) 产生较多一致性块(如果cache中存在)

3)增加latch活动。

可考虑采用direct path read,alter session set “_serial_direct_read “=true;

需要注意的时oracle会首先触发chekpoint,写入对象的脏数据块,然后才执行direct path read直接读取到pga.

这个方法在批处理任务时更为有效。

13:31 JBoss Drools meets Hibernate (27951 Bytes) » Red Hat Magazine

Jaroslaw is a JBoss QA Engineer based in Poland, and recently published an introduction to Drools that he kindly shared with us. This second piece covers Drools (or JBoss Rules), the open source business rules engine… in this case combining it with Hibernate.

This article is presented here in its entirety (with a trackback). The original can be found on Jaroslaw’s site. This article is also available in German and Polish.

Justification:

Drools evaluates facts which are present in the working memory. But could it also reason over data stored in a relational database? This feature would extend Drools’ range of applicability and since this is an often asked question in the mailing list, it’s worth to know the answer which sounds: “of course Drools can!”

Abstract:

Hibernate, one of the most favorite ORM tools, allows to handle data stored in a relational database. This article will describe how one can access a Hibernate session from inside the rule engine. I will use PostgreSQL as a data source. Besides that I will create two classes, Game and Player, having a many-to-many relationship.

  1. Creating a new Drools project
  2. Class files
  3. Hibernate
  4. Drools
  5. How does it work?
  6. Results
  7. Summary

Creating a new Drools project

You still don’t have installed the Drools 4.0.7 Eclipse Workbench? Just have a look at this article: “Rules fall from your eyes”.

Menu File -> New -> Project -> Drools - > Rule Project -> Next. Provide the project’s name, drools-hibernate-demo, and click on Next, to uncheck the example files

fig2-1_step1

Class files

Create a package “eu.kijanowski.drools.hibernate” in the src/main/java directory. We will use two class files, Player.java and Game.java. They have a many-tom-many relationship, since one player can own many games and one game can be owned by many players ;)

Class Game.java

package eu.kijanowski.drools.hibernate;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Game implements Serializable {
	private static final long serialVersionUID = 1L;
	private Long id = null;
	private String name;
	private double price;
	private int levels;
	private Set<Player> players = new HashSet<Player>();

	public Game() {
	}

	public Game(String name, double price, int levels) {
		this.name = name;
		this.price = price;
		this.levels = levels;
	}

	public Long getId() {
		return id;
	}

	@SuppressWarnings("unused")
	private void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public int getLevels() {
		return levels;
	}

	public void setLevels(int levels) {
		this.levels = levels;
	}

	public Set<Player> getPlayers() {
		return players;
	}

	public void setPlayers(Set<Player> players) {
		this.players = players;
	}

	public String toString() {
		return name + " with " + levels + " levels for " + price;
	}
}

Class Player.java

package eu.kijanowski.drools.hibernate;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

public class Player implements Serializable {
	private static final long serialVersionUID = 1L;
	private Long id;
	private String name;
	private int age;
	private Set<Game> games = new HashSet<Game>();

	public Player() {
	}

	public Player(String name, int age, HashSet<Game> games) {
		this.name = name;
		this.age = age;
		this.games = games;
	}

	public Long getId() {
		return id;
	}

	@SuppressWarnings("unused")
	private void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Set<Game> getGames() {
		return games;
	}

	public void setGames(Set<Game> games) {
		this.games = games;
	}

	public String toString() {
		return name;
	}
}	

Hibernate

Without going into details, download the binaries, Hibernate Core 3.2.6 and extract the archive.

In our project create a directory called lib and copy over following files:

  • hibernate-3.2.6.GA/lib/antlr-2.7.6.jar
  • hibernate-3.2.6.GA/lib/asm.jar
  • hibernate-3.2.6.GA/lib/cglib-2.1.3.jar
  • hibernate-3.2.6.GA/lib/commons-collections-2.1.1.jar
  • hibernate-3.2.6.GA/lib/commons-logging-1.0.4.jar
  • hibernate-3.2.6.GA/lib/dom4j-1.6.1.jar
  • hibernate-3.2.6.GA/hibernate3.jar
  • hibernate-3.2.6.GA/lib/jta.jar

Now we have to add these libraries to the “build path”: from the menu choose Project -> Properties -> Java Build Path -> Libraries and then Add External JARs and navigate to the project’s lib directory. Mark all files and click OK.

fig2-2_libs

It’s time to configure Hibernate. In the src/main/java directory create a file called hibernate.cfg.xml:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 <hibernate-configuration>

     <session-factory>
         <property name="connection.driver_class">org.postgresql.Driver</property>
         <property name="connection.url">jdbc:postgresql://localhost/droolsdb</property>
         <property name="connection.username">droolsuser</property>

         <property name="connection.password"></property>
         <property name="connection.pool_size">1</property>
         <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
         <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>

         <property name="current_session_context_class">thread</property>
         <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
         <property name="show_sql">true</property>
         <property name="hbm2ddl.auto">create</property>

         <mapping resource="eu/kijanowski/drools/hibernate/model.hbm.xml"/>
     </session-factory>
 </hibernate-configuration>
 

As you see, we’re going to use the org.postgresql.Driver class, hence we need to add another library to our project. From the PostgreSQL home page we can download the required driver. I’m using 8.2-508 JDBC 3. Don’t forget to add it to the Java Build Path, like we did with the hibernate library.

It’s time to download and start PostgreSQL and create a user and schema.

/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data>logfile 2>&1 &
/usr/local/pgsql/bin/createuser -h 127.0.0.1 -p 5432 -U postgres -s -d -R droolsuser
/usr/local/pgsql/bin/createdb -h 127.0.0.1 -p 5432 -U postgres -O droolsuser droolsdb

The last step is mapping - this is connecting the world of Java objects with the world of relations (tabels). Create model.hbm.xml in the eu.kijanowski.drools.hibernate package:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="eu.kijanowski.drools.hibernate">
	<class name="Player" table="PLAYERS">
		<id name="id" column="PLAYER_ID" type="java.lang.Long">

			<generator class="sequence">
				<param name="sequence">player_id_seq</param>
			</generator>
		</id>
		<property name="name" column="NAME" length="10" not-null="true"
			type="java.lang.String" />

		<property name="age" column="AGE" not-null="true"
			type="java.lang.Integer" />

		<set name="games" table="PLAYERS_GAMES" cascade="persist, delete, merge, save-update">
			<key column="PLAYER_ID" />
			<many-to-many column="GAME_ID" class="Game" />
		</set>

	</class>

	<class name="Game" table="GAMES">
		<id name="id" column="GAME_ID" type="java.lang.Long">
			<generator class="sequence">
				<param name="sequence">game_id_seq</param>
			</generator>

		</id>
		<property name="name" column="NAME" length="10" not-null="true"
			type="java.lang.String" />
		<property name="price" column="PRICE" not-null="true"
			type="java.lang.Double" />
		<property name="levels" column="LEVELS" not-null="true"
			type="java.lang.Integer" />
		<set name="players" table="PLAYERS_GAMES">
			<key column="GAME_ID" />

			<many-to-many column="PLAYER_ID" class="Player"/>
		</set>

	</class>
</hibernate-mapping>

Drools

We’re almost there. We olny have to create the rule file and a testing class which will start our example. But how are we going to use Hibernate in our application? Well, in our testing class we will create a Hibernate session and provide it to the rule engine’s working memory as a constant global value. This allows us to access the database from inside the rule file. Next we will create a query and access the result’s objects using the keyword “from”. Let’s do this:

Class DroolsHibernateTest.java

package eu.kijanowski.drools.hibernate;

import java.io.InputStreamReader;
import java.io.Reader;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.PackageBuilder;
import org.drools.rule.Package;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class DroolsHibernateTest {

	private final static SessionFactory factory;
	static {
		Configuration cfg = new Configuration().configure();
		factory = cfg.buildSessionFactory();
	}

	public static final void main(String[] args) {
		try {

			Game g1 = new Game("BF2", 39.99, 5);
			Game g2 = new Game("AoE3", 129.99, 45);
			Game g3 = new Game("BF3", 139.99, 15);

			HashSet<Game> games1 = new HashSet<Game>();
			games1.add(g1);
			games1.add(g2);
			games1.add(g3);
			HashSet<Game> games2 = new HashSet<Game>();
			games2.add(g1);
			games2.add(g3);

			Player p1 = new Player("jarek", 26, games1);
			Player p2 = new Player("ewelina", 25, games2);

			System.out.println(p1.getGames());
			System.out.println(p2.getGames());

			/* open a Hibernate session and persist data */
			Session session = factory.openSession();
			Transaction tx = session.beginTransaction();
			session.save(p1);
			session.save(p2);
			tx.commit();
			session.close();

			/* Let's verify the persisted data */
			session = factory.openSession();
			tx = session.beginTransaction();

			List<Player> players = session.createCriteria(Player.class).list();
			System.out.println(players.size() + " player(s) found:");
			for (Iterator<Player> iter = players.iterator(); iter.hasNext();) {
				Player player = (Player) iter.next();
				System.out.println(player.getName() + " has following games: "
						+ player.getGames());
			}
			tx.commit();
			session.close();

			// load up the rulebase
			RuleBase ruleBase = readRule();
			WorkingMemory workingMemory = ruleBase.newStatefulSession();

			/* pass a hibernate session to the working memory as a global */
			session = factory.openSession();
			workingMemory.setGlobal("hibernateSession", session);

			workingMemory.fireAllRules();
			session.close();

		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	private static RuleBase readRule() throws Exception {
		// read in the source
		Reader source = new InputStreamReader(DroolsHibernateTest.class
				.getResourceAsStream("/Demo.drl"));

		PackageBuilder builder = new PackageBuilder();

		// this will parse and compile in one step
		builder.addPackageFromDrl(source);

		// get the compiled package (which is serializable)
		Package pkg = builder.getPackage();

		// add the package to a rulebase (deploy the rule package).
		RuleBase ruleBase = RuleBaseFactory.newRuleBase();
		ruleBase.addPackage(pkg);
		return ruleBase;
	}

}

The rule file can be created using the drools plug-in. Just click on the src/main/rules directory and from the menu File -> New -> Other… click Drools -> Rule Resource:

fig2-3_demodrl

Demo.drl

package eu.kijanowski.drools.hibernate

global org.hibernate.Session hibernateSession;

rule "hibernate_from"
	when
		game:Game() from hibernateSession.createQuery("select games from Player p where p.age >= :age").setProperties( {"age" : 18 }).list()
	then
		System.out.println("The game "+game.getName() +"is owned by "+game.getPlayers());
end

How does it work?

Let’s have a look at the global keyword in the rule file. This allows us to provide the rule engine with constants and variables from outside. Potential usecases are:

  • return results back to the application
  • access services, like Hibernate, JMS, file writers, email senders, etc.

What’s worth to know is that you should never change a global, when you use it in the condition part (LHS) of a rule. Moreover globals are not designed to share any data between rules, this can be done via facts living in the working memory.

The condition element from allows to access data from other sources than the working memory. These can be Collectins, Maps and results coming from called methods. In our scenario we’ve created a query and received a list of games.

Results

After running our example (Run as -> Java Application) the console will show:

Jun 14, 2008 8:58:11 AM org.hibernate.cfg.Environment <clinit>

INFO: Hibernate 3.2.6
Jun 14, 2008 8:58:11 AM org.hibernate.cfg.Environment <clinit>
INFO: hibernate.properties not found
Jun 14, 2008 8:58:11 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: Bytecode provider name : cglib
Jun 14, 2008 8:58:11 AM org.hibernate.cfg.Environment <clinit>
INFO: using JDK 1.4 java.sql.Timestamp handling
Jun 14, 2008 8:58:11 AM org.hibernate.cfg.Configuration configure
INFO: configuring from resource: /hibernate.cfg.xml
Jun 14, 2008 8:58:11 AM org.hibernate.cfg.Configuration getConfigurationInputStream
INFO: Configuration resource: /hibernate.cfg.xml
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.Configuration addResource
INFO: Reading mappings from resource : eu/kijanowski/drools/hibernate/model.hbm.xml
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: eu.kijanowski.drools.hibernate.Player -> PLAYERS
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.HbmBinder bindCollection
INFO: Mapping collection: eu.kijanowski.drools.hibernate.Player.games -> PLAYERS_GAMES
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.HbmBinder bindRootPersistentClassCommonValues
INFO: Mapping class: eu.kijanowski.drools.hibernate.Game -> GAMES
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.HbmBinder bindCollection
INFO: Mapping collection: eu.kijanowski.drools.hibernate.Game.players -> PLAYERS_GAMES
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.Configuration doConfigure
INFO: Configured SessionFactory: null
Jun 14, 2008 8:58:12 AM org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: Using Hibernate built-in connection pool (not for production use!)
Jun 14, 2008 8:58:12 AM org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: Hibernate connection pool size: 1
Jun 14, 2008 8:58:12 AM org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: autocommit mode: false
Jun 14, 2008 8:58:12 AM org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: using driver: org.postgresql.Driver at URL: jdbc:postgresql://localhost/droolsdb
Jun 14, 2008 8:58:12 AM org.hibernate.connection.DriverManagerConnectionProvider configure
INFO: connection properties: {user=droolsuser, password=****}
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: RDBMS: PostgreSQL, version: 8.2.5
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: JDBC driver: PostgreSQL Native Driver, version: PostgreSQL 8.2 JDBC3 with SSL (build 508)
Jun 14, 2008 8:58:12 AM org.hibernate.dialect.Dialect <init>

INFO: Using dialect: org.hibernate.dialect.PostgreSQLDialect
Jun 14, 2008 8:58:12 AM org.hibernate.transaction.TransactionFactoryFactory buildTransactionFactory
INFO: Transaction strategy: org.hibernate.transaction.JDBCTransactionFactory
Jun 14, 2008 8:58:12 AM org.hibernate.transaction.TransactionManagerLookupFactory getTransactionManagerLookup
INFO: No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Automatic flush during beforeCompletion(): disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Automatic session close at end of transaction: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: JDBC batch size: 15
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: JDBC batch updates for versioned data: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Scrollable result sets: enabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: JDBC3 getGeneratedKeys(): disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Connection release mode: auto
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Default batch fetch size: 1
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Generate SQL with comments: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Order SQL updates by primary key: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Order SQL inserts for batching: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory createQueryTranslatorFactory
INFO: Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
Jun 14, 2008 8:58:12 AM org.hibernate.hql.ast.ASTQueryTranslatorFactory <init>
INFO: Using ASTQueryTranslatorFactory
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Query language substitutions: {}
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: JPA-QL strict compliance: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Second-level cache: enabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Query cache: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory createCacheProvider
INFO: Cache provider: org.hibernate.cache.NoCacheProvider
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Optimize cache for minimal puts: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Structured second-level cache entries: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Echoing all SQL to stdout
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Statistics: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Deleted entity synthetic identifier rollback: disabled
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Default entity-mode: pojo
Jun 14, 2008 8:58:12 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Named query checking : enabled
Jun 14, 2008 8:58:12 AM org.hibernate.impl.SessionFactoryImpl <init>
INFO: building session factory
Jun 14, 2008 8:58:12 AM org.hibernate.impl.SessionFactoryObjectFactory addInstance
INFO: Not binding factory to JNDI, no JNDI name configured
Jun 14, 2008 8:58:12 AM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: Running hbm2ddl schema export
Jun 14, 2008 8:58:12 AM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: exporting generated schema to database
Jun 14, 2008 8:58:13 AM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: schema export complete
[BF3 with 15 levels for 139.99, BF2 with 5 levels for 39.99, AoE3 with 45 levels for 129.99]
[BF3 with 15 levels for 139.99, BF2 with 5 levels for 39.99]
Hibernate: select nextval ('player_id_seq')
Hibernate: select nextval ('game_id_seq')
Hibernate: select nextval ('game_id_seq')
Hibernate: select nextval ('game_id_seq')
Hibernate: select nextval ('player_id_seq')
Hibernate: insert into PLAYERS (NAME, AGE, PLAYER_ID) values (?, ?, ?)
Hibernate: insert into GAMES (NAME, PRICE, LEVELS, GAME_ID) values (?, ?, ?, ?)
Hibernate: insert into GAMES (NAME, PRICE, LEVELS, GAME_ID) values (?, ?, ?, ?)
Hibernate: insert into GAMES (NAME, PRICE, LEVELS, GAME_ID) values (?, ?, ?, ?)
Hibernate: insert into PLAYERS (NAME, AGE, PLAYER_ID) values (?, ?, ?)
Hibernate: insert into PLAYERS_GAMES (PLAYER_ID, GAME_ID) values (?, ?)
Hibernate: insert into PLAYERS_GAMES (PLAYER_ID, GAME_ID) values (?, ?)
Hibernate: insert into PLAYERS_GAMES (PLAYER_ID, GAME_ID) values (?, ?)
Hibernate: insert into PLAYERS_GAMES (PLAYER_ID, GAME_ID) values (?, ?)
Hibernate: insert into PLAYERS_GAMES (PLAYER_ID, GAME_ID) values (?, ?)
Hibernate: select this_.PLAYER_ID as PLAYER1_0_0_, this_.NAME as NAME0_0_, this_.AGE as AGE0_0_ from PLAYERS this_
2 player(s) found:
Hibernate: select games0_.PLAYER_ID as PLAYER1_1_, games0_.GAME_ID as GAME2_1_, game1_.GAME_ID as GAME1_2_0_, game1_.NAME as NAME2_0_, game1_.PRICE as PRICE2_0_, game1_.LEVELS as LEVELS2_0_ from PLAYERS_GAMES games0_ left outer join GAMES game1_ on games0_.GAME_ID=game1_.GAME_ID where games0_.PLAYER_ID=?
jarek has following games: [AoE3 with 45 levels for 129.99, BF3 with 15 levels for 139.99, BF2 with 5 levels for 39.99]
Hibernate: select games0_.PLAYER_ID as PLAYER1_1_, games0_.GAME_ID as GAME2_1_, game1_.GAME_ID as GAME1_2_0_, game1_.NAME as NAME2_0_, game1_.PRICE as PRICE2_0_, game1_.LEVELS as LEVELS2_0_ from PLAYERS_GAMES games0_ left outer join GAMES game1_ on games0_.GAME_ID=game1_.GAME_ID where games0_.PLAYER_ID=?
ewelina has following games: [BF3 with 15 levels for 139.99, BF2 with 5 levels for 39.99]
Hibernate: select game2_.GAME_ID as GAME1_2_, game2_.NAME as NAME2_, game2_.PRICE as PRICE2_, game2_.LEVELS as LEVELS2_ from PLAYERS player0_ inner join PLAYERS_GAMES games1_ on player0_.PLAYER_ID=games1_.PLAYER_ID inner join GAMES game2_ on games1_.GAME_ID=game2_.GAME_ID where player0_.AGE>=?
Hibernate: select players0_.GAME_ID as GAME2_1_, players0_.PLAYER_ID as PLAYER1_1_, player1_.PLAYER_ID as PLAYER1_0_0_, player1_.NAME as NAME0_0_, player1_.AGE as AGE0_0_ from PLAYERS_GAMES players0_ left outer join PLAYERS player1_ on players0_.PLAYER_ID=player1_.PLAYER_ID where players0_.GAME_ID=?
The game BF2is owned by [jarek, ewelina]
Hibernate: select players0_.GAME_ID as GAME2_1_, players0_.PLAYER_ID as PLAYER1_1_, player1_.PLAYER_ID as PLAYER1_0_0_, player1_.NAME as NAME0_0_, player1_.AGE as AGE0_0_ from PLAYERS_GAMES players0_ left outer join PLAYERS player1_ on players0_.PLAYER_ID=player1_.PLAYER_ID where players0_.GAME_ID=?
The game BF3is owned by [jarek, ewelina]
Hibernate: select players0_.GAME_ID as GAME2_1_, players0_.PLAYER_ID as PLAYER1_1_, player1_.PLAYER_ID as PLAYER1_0_0_, player1_.NAME as NAME0_0_, player1_.AGE as AGE0_0_ from PLAYERS_GAMES players0_ left outer join PLAYERS player1_ on players0_.PLAYER_ID=player1_.PLAYER_ID where players0_.GAME_ID=?
The game AoE3is owned by [jarek]
The game BF2is owned by [jarek, ewelina]
The game BF3is owned by [jarek, ewelina]

Summary

This article shows how you can easily integrate Hibernate with the Drools rule engine. This allows you to reason over data, which does not only live in the working memory, but also in an external database.

All images and content copyright © 2008 Jaroslaw Kianowski. All rights reserved. Used with permission.

Related articles

10:05 Oracle Critical Patch Update July 2008 Pre-Release Analysis (4624 Bytes) » Oracle Security Blog
Here is a brief analysis of the pre-release announcement for the upcoming July 2008 Oracle Critical Patch Update (CPU) -
  • Overall, 45 security vulnerabilities are fixed in this CPU, which is an average number well within the range of previous CPUs (Apr-08=41, Jan-08=26, Oct-07=51, Jul-07=45, Apr-07=36, Jan-07=51, Oct-06=101, Jul-06=62, Apr-06=34, Jan-06=80).
  • This is the first CPU that includes fixes for BEA WebLogic, Hyperion BI, and TimesTen Database.
  • The product and vulnerability mix appears to be similar to previous CPUs.  All CPU supported Oracle Database, Oracle Application Server, and Oracle E-Business Suite versions are included.  The list of supported versions is getting very short and should be carefully reviewed to determine if version upgrades are required prior to applying the CPU security patches -
        • Database = 9.2.0.8, 10.1.0.5, 10.2.0.3, 10.2.0.4, and 11.1.0.6 for major platforms
        • Application Server = 9.0.4.3, 10.1.2, and 10.1.3
        • E-Business Suite = 11.5.10.2, and 12.0.x
  • The major CPU version support changes for July 2008 are -
      • Database version 10.2.0.4 is included in the list of affected versions
      • Oracle E-Business Suite 11i versions 11.5.9, 11.5.10.0, and 11.5.10.1 are no longer supported for CPUs

Oracle Database
  • There are 11 database vulnerabilities and none are remotely exploitable without authentication, which is consistent with previous CPUs.  Usually, the vast majority of database vulnerabilities require authentication.  However, a portion of these vulnerabilities can be exploited using only PUBLIC privileges accessible by all database accounts.
  • The vulnerabilities of most interest are in the Core RDBMS and Authentication components, but the Database Scheduler vulnerability could be interesting.
  • At least one of the database security vulnerabilities has a CVSS 2.0 metric of 6.5, which for database vulnerabilities should be considered high risk.  This typically means anyone with a valid database session is able to compromise the entire database, but is unable to achieve root operating system access.

Oracle Application Server
  • There are 9 new Oracle Application Server vulnerabilities, all of which are remotely exploitable without authentication.  In previous CPUs, the majority of Oracle Application Server vulnerabilities have tended to be remotely exploitable without authentication.  The vulnerabilities are in Hyperion BI Plus, Oracle HTTP Server, Oracle Internet Directory, and Oracle Portal.
  • The Oracle HTTP Server vulnerabilities may be related to recent Apache HTTP Server and OpenSSL fixes.
  • The Oracle Portal vulnerability may be related to CVE-2008-2138, which is an access restriction bypass issue in the WebDav component of Oracle Portal.

Oracle E-Business Suite 11i and R12
  • There are 6 new Oracle E-Business Suite 11i and R12 vulnerabilities and none are remotely exploitable without authentication.  However, since iStore allows for customer self-registration, most likely these vulnerabilities can be readily exploited by an unprivileged user.
  • For the Oracle E-Business Suite 11i, only 11.5.10.2 is now supported for CPUs and requires ATG_PF.H RUP 5 or RUP 6 be installed.

Planning Impact
  • As with all previous CPUs, this quarter's security patches should be deemed critical and you should adhere to the established procedures and timing used for previous CPUs.
09:03 Log Buffer #105, a Carnival of the Vanities for DBAs (9063 Bytes) » Pythian Group Blog » Log Buffer

This week, database blogs seemed to talk about conforming to stereotypes as well as breaking them.

Fulfilling the stereotype of Microsoft software being unsecure, Microsoft released a very important SQL Server update that Aaron Bertrand notes patches “four elevation of privilege vulnerabilities.” That’s right, not one, not two, but four!!! At least there is a patch now……go forth and patch! Usually it is MySQL that throws ambiguous warnings or errors which are not an accurate representation of the actual error, but Bertrand also notes that there is A Little Management Studio Oops.

Contrary to stereotype, Microsoft is giving away content with NO DRM! Kalen Delaney asks, Did You Know the History of SQL Server? and shares a link to a chapter from a book on SQL Server 2000 in the Inside SQL Server series.

The PSS SQL Escalation Services team has fought many times about SQL Server I/O Bottleneck, I don’t have one, YES YOU DO! The team gives some reminders about how to interpet averages properly.

Allen White asks about Tools for the Reluctant DBA — that is, a programmer or administrator so good at databases that they were promoted to DBA, but may not actually want the job. Check out the comments and add your own.

Tibor Karaszi shares his stored procedure to find physical index details. Now you can use one stored procedure does what a stored procedure plus 3-4 tables ordinarily does.

But wait! There are some more updates!

(more…)

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Slashdot
  • Google
  • del.icio.us
  • Facebook
  • bodytext
  • Technorati
  • TwitThis
  • Reddit
  • Spurl
  • De.lirio.us
  • Furl
  • blogmarks
  • Ma.gnolia
  • E-mail this story to a friend!
07:37 用C取得Linux负荷值? (3208 Bytes) » AnySQL.net

作者:AnySQL, 订阅AnySQL, Oracle数据库恢复及服务, Sybase恢复, 磁盘及RAID恢复

    oramon程序可以记录Oracle数据库的很多运行特征, 但还是需要记录一些OS级别的值, 最想要的是Load Average的三个值了, 另外还有CPU的利用率了. 在Solaris下可以用kstat库来取得这些值, 在AIX下可以用perfstat库的函数, 来搞定这些值. 但是在Linux上, 虽然说它是开源的, 但却没有搞定这几个值如何用C程序取出来的.

    用了最土的方法, 现在用的Linux基本上都是Kernel 2.4以上的了, 取得Load Average的话, 就直接访问"/proc/loadavg"算了.

float getloadavg1m()
{
  FILE *fp=NULL;
  char tmpbuf[128];

  if ((fp=fopen("/proc/loadavg","r"))!=NULL)
  {
      fscanf(fp,"%s",tempbuf);
      fclose(fp);
      return atof(tempbuf);
  }
  return 0f;
}

    这种打开文件的方法, 绝对算是很土, 但是运行还是很稳定, 每隔十秒钟打开一次应当问题不大. 只是取CPU的利用率, 就搞不定了, 谁能介绍更好的方法?

相关文章 | Related Artiles

我要留言(当前1)

07:02 Interview with Kristopher B. Jones - PepperjamNETWORK (15762 Bytes) » Fenng's shared items in Google Reader

kris.jpgEarlier in the week I posted that PepperJam Network was giving all new publishers who signed up with their network a signup bonus of $10. Today I’ve managed to get a quick interview with Pepperjam Network’s CEO and President Kristopher B. Jones to ask him about the network, why he started it and what tips he could give us as publishers for using it in a way that earns us the most money.

By the way - the $10 Signup Bonus runs through until the end of the month but to get it you need to sign up through this link - Pepperjam Network

Could you start by explaining to ProBlogger readers what the Pepperjam Network actually is?

The easiest way to describe Pepperjam Network is that we help affiliates and bloggers monetize Web traffic (aka, make money) by partnering with well-known advertisers on a pay-for-performance basis. The affiliate or blogger promotes the advertiser through links (banners, text links, pepperjamADS Widget, etc.) provided through Pepperjam Network - when a referral is made, the affiliate or blogger gets paid either a percentage of the sale or a flat fee on a lead. Affiliate marketing is really easy to get started with and we are finding that some of our top performers are bloggers just like your readers!

There are quite a few other affiliate marketing networks around - why did you start another one? What differentiates you from the rest? Why should bloggers consider joining pepperjamNETWORK?

I can’t disagree with you - there sure are a lot of affiliate networks out there!

However, most of the other affiliate networks either run off of the same technology platform (Direct Track, for instance) and / or are small operations with minimal reach and little to no access to top tier publishers and advertisers.

Unlike many of the “start-up” affiliate networks, Pepperjam is no stranger to affiliate marketing. I started out as an affiliate marketer myself in 1999 (see below). By 2002 I became (so I’m told) one of the most successful affiliate marketers in the business and had already started working as a consultant on the advertiser side of the business.

Before we launched our affiliate network in January of this year we had already established our company as one of the industry leaders in search maketing, affiliate marketing, and online media planning & managment - we already had a client roster that included some of the leading brands across all areas of business and we brought over 8 years of experience to the table!

In short, the above makes us different! But here’s how we executed….

Pepperjam Network is a “next generation” affiliate marketing network. It took us about two years to build and we incorporated the input of over 100 top advertisers and affiliates. In addition to being a network built with Web 2.0 technologies like AJAX, which dramatically improved user experience (aka, usability), Pepperjam Network addresses the two most prominent shortcomings of other networks, namely (1) poor communication tools, and (2) lack of affiliate transparency. Among other tools, Pepperjam Network empowers affiliates and advertisers to communicate more effectively through an internal, real-time chat solution called Pepperjam Chat - with PJ Chat affiliates and advertisers can negotiate private offers, discuss promotional strategies, request coupon codes, and talk about anything they want to improve the relationship. On the side of improving affiliate transparency, Pepperjam Network “ranks” all affiliates on a 5 point scale based on their willingness to disclose promotional methods, Web site(s) used for purposes of affiliate marketing, and accurate, verifiable contact information. In short, the more “transparent” the affiliate is within the network the more likelihood they will get approved to a program, qualify for higher payouts, and be eligible for special incentives.

The goal with Pepperjam Network was to provide a next generation solution that both advertisers and affiliates could build long-term profitable relationships.

From what we are being told by our advertisers and affiliates we have advanced the affiliate marketing industry further in a shorter period of time than anyone before us. :)

One of the concepts that you talk a lot about in your promotion is ‘affiliate transparency’. What is it and why is it so important to you as a network?

l talk about this a bit above. For purposes of Pepperjam Network, “Affiliate Transparency” is a relative measure of any given affiliate’s willingness to disclose and share important information to PJN advertisers. For instance, we ask affiliates upon signing-up for PJN to disclose basic promotional methods (i.e. search, direct linking, loyalty, software, etc.), all Web site(s) used for purposes of promoting PJN advertisers, and to provide accurate, verifiable contact information. Based on this transparency data, along with an analysis of marketing potential, the affiliate is given a score from 0 to 5. While the affiliate may start out with a low transparency score…the good news is that the score is dynamic. This means that if the affiliate really wants to be transparent with the advertiser than they can log back in to their PJN account and become more transparent!

Transparency scores can have a significant effect on how affiliates are viewed by Pepperjam Network advertisers. On the one hand, some PJN advertisers (not all) see low affiliate transparency scores as representing a higher level of “risk” or overall lower level of potential. On the other hand, if an affiliate has a transparency score of 3, 4, or 5 they may automatically qualify for special commission payouts and incentives from select PJN advertisers. In addition, some PJN advertisers automatically approve affiliates with a high transparency rating - this means that an affiliate stands a considerable advantage to other affiliates if they have a high transparency rating. Another benefit of a high transparency rating is that the affiliate is more likely to have access to higher commission payouts.

At the same time, just because an affiliate has a 1 or 2 transparency rating doesn’t mean they can’t get accepted to Pepperjam Network affiliate programs or can’t get higher payouts - however, it does mean that they become a more transparent affiliate.

BTW - let me address a concern that some of your readers may automatically (and rightfully!!!) have regarding “transparency.” “Being transparent” on PJN does not mean that we will disclose confidential or proprietary affiliate information to advertisers. In fact, Pepperjan Network is absolutely committed to maintaining the confidentiality of important affiliate information and data - we will never share that data (i.e., SSN, reerring URL’s, etc.) with advertisers without legal intervention. However, we strongly believe that it is very important to provide enough basic, verifiable information to advertisers so that they are in the best possible position to build an open, honest relationship with the affiliate and pay the absolute highest commissions!

Many ProBlogger readers are new to affiliate marketing or have had limited success with it - what tips would you give them to lift their performance?

The key is to find something that works, replicate it, and scale it. This is the formula I used back in 1999 when I started out as an affiliate and in my prime (I’m now an old man at 32 years old) I was making enough money to do just about anything I wanted. Instead of buying a big house (my current house is modest) or a $200K car (disclosure - I do drive a Cadilac Escalade in the winter and a BMW Z4 in the summer :)) I took all the money I generated as an affiliate and helped build the fastest growing full-service internet marketing agency and affiliate network in the United States. So the moral of the story is that my simple formula works!

Again, here is my three step process to affiliate marketing riches. (1) Find something that works. (2) Replicate it. (3) Scale it.

For instance, I shared this formula last year during the A4U Expo to an audience of about 400 attendees and I even gave a specific example of how it can potentially work, which I will now share with your readers.

I said…while I never personally tried it, that bidding on high traffic typos on pay-per-click engines was something that I knew would work, was easily replicated, and highly scalable. Typos are common misspellings of words that people might use when looking for a specific product or service. Anyway, the idea was that an affiliate could easily and most likely make money by bidding on a typo such as cheeze or Pollo Shirt and sending the traffic through a landing page with an affiliate offer or directly to an advertiser selling cheeses (i.e., igourmet.com) or Polo Shirts (i.e. bluefly.com). I also argued that since there are literally thousands upon thousands of affiliate programs across multiple networks my “typo” affiliate marketing strategy was both easily replicated (think about it…offfice supplies, Nick sneakers, Blueflie, etc.) and easily scalable (Amazon, eBay, Pepperjam Network, Tradedoubler, Linkshare, Google Affiliate Network, etc.).

A few months later I spoke at a conference and asked if anyone in the audience if they had ever heard me speak before and learned enough to make a lot of money. The good news is that a few dozen people raised their hand, including the TYPO GUY!!! The “typo guy” heard me speak at A4U Expo, took my advice, and said he was poised to make 6 figures in 2008 based on that strategy. True story.

The simple formula works, but it is worth spending as much time at step one (1) as necessary since it is the most difficult, challenging, and critical step in the process!

What are pepperjamADS?

pepperjamADS is an affiliate marketing widget that an affiliate can use to serve customized contextual ads from one or multiple Pepperjam Network advertisers at the same time. The ad units come in various shapes and sizes. The affiliate can mix and mash ads from any of their merchant partners. For instance, the affiliate can create a fashion widget by selecting various ads from multiple fashion merchants. Likewise, the affiliate can create a specific widget with ads from any one merchant.

We find that pepperjamADS converts almost five times as well as normal banner ads and about three times as well as normal text ads. In addition, we find that pepperjamADS works especially well with blogger affiliates since pepperjamADS looks a lot like Google AdSense units, which are very easily integrated into existing content / posts. Also, since you can choose the ads you want within the widget, and can change the look and feel (i.e. color, size) to fit the theme of your site, pepperjamADS are worth testing if you are a blogger.

Click Here for a Video Tutorial of pepperjamADS.

Could you talk us through the blogger incentive program that you’re running this month?

Since we launched Pepperjam Network we have had a very successful publisher referral program that paid out up to $7 flat for any new affiliate referral.

For the month of July we decided to increase the payout to ALL Pepperjam Network Publisher Referral Program affiliates to $7 flat…but that’s not all.

We also decided to give our affiliates the ability to give away $10 for free to help them sign-up new affiliates…but that’s not all.

Finally, we decided to launch the affiliate marketing industry’s first ever Blogger Incentive Program!

There is no doubt about the fact that Bloggers are the lifeblood of the PJN Publisher Referral program and tend to be our biggest supporters and closest friends.

As a result, we created a sort of “Pay Per Post” incentive program where any PJN publisher / blogger receives $10 for each post they make (up to 5 per month) that promotes Pepperjam Network or any Pepperjam Network tool.

The cool thing about the PJN Blogger Incentive Program is that not only can the blogger make $10 for each post, but they can give away $10 to new affiliates, and make an additional $7 for each new affiliate they refer to Pepperjam Network.

BTW - if any of your readers are interested in signing up for the PJN Blogger Incentive Program they first need to be accepted as a Pepperjam Network publisher / affiliate. Then they have to apply to the Pepperam Network Publisher Referral Program, which is found under the “Find Partners” tab once they log-in to their account for the first time. Once approved for the referral progam they should read the rules to participate in the program, which includes sending a topic proposal and blog URL to the PJN Blogger Incentive Program management team for approval, along with a few requirements to reduce spam and maximize quality. While this is an easy way for bloggers to make money we are absolutely committed to making sure the program is of the highest quality!

BTW - for those Problogger readers looking to learn more about Pepperjam Network and to look for blog ideas they can visit the Pepperjam Network blog - www.pepperjamnetwork.com/blog.

Explore the Pepperjam Network for yourself by signing up here

Share This

05:54 这是适合生活的地方 (1923 Bytes) » Chanel [K]

银川,塞北江南,这里的街道很宽敞,这里的车辆不多,这里的天黑很晚,这里的羊肉爽口,这里的人好客,这里是适合生活的地方。

明天去沙坡头,黄河穿越沙漠的地方。

沙坡头旅游区位于宁夏中卫市城区以西16公里腾格里沙漠东南边缘处。这里集大漠、黄河、高山、绿洲为一处,即具西北风光之雄奇,又兼江南景色之秀美。

后天去西夏王陵,千年历史划过岁月长河,黄昏下的西夏王陵应该给人站在吴哥一样的感受吧。

05:17 胡扯SaaS (2494 Bytes) » Fenng's shared items in Google Reader

开篇先写一下全称: Software as a service 同样是很炫的一个名词,跟webservices 有得一拼。这么多年过去了, XML, webservices(微软首创),是否真正的给企业带来利润呢? 是的,在某些领域的确是用到了, 但是,毫无疑问的, XML 在企业的数据交换,标准制定方面, 起到了很重要的作用, 但是,如果你是实际接触到底层的操作的话,其实XML操作还是比较复杂的,相比各类的高级语言实现同样的功能的话, 各位可以试试: 用c 语言来操作 XML 文档。 在此我想提出我的另一个理论: Net As a service

今天看了一篇文章 oracle saas 策略 , 在文章中, Larry Ellison 不看好 saas, 虽然 SAP 大力推崇。 根据我的分析, 如果 BPEL 没有真正的跑起来的话, 是ellison如此想法的原因, 因为接触过一个研究生,谈到毕业的时候, 用BPEL 做了点东西, 那个痛苦啊。。。只有他自己知道, 虽然外面吹得天花乱坠。

真正有实力, 有远景的企业有如下的特点:
1, 信息系统不会追求炫的东西, 用的都是最稳定的产品。 记得以前的公司有个调查问卷的系统,非常非常的简单, 但是真的是非常实用。
2, 有自己很强的研发团队, 对系统的架构,架设能力很强。 太炫的东西往往伴随着太多的bug, 可以问问抢先登录Oracle ERP R12 的兄弟姐妹们。
3,Saas 口号性的东西,胜过实际的东西。 因为往往各个企业的应用环境是很不一样的。 企业最讲究实际了。

另外,这个提法我感觉很不爽, software 更多的是 innovation , 而不是 service。 Net as a service 还差不多。 为什么呢? 我假想了一个场景, 2100 的时候, 早晨, 我醒来, 对我的 robot 说, 我要 纯牛奶, 然后 robot 就帮我提交 command (give me 1 cup of pure milk) 给电脑。 然后 serach 就分析, 然后通知最近的 service 给我送牛奶。这中间,我并不知道牛奶是在哪个地方生产的, 是什么样的人,通过什么样的方式给我的。

因此, net as a service, software as a innovation .

04:54 我博客的最新更动(2008.07.11) (4780 Bytes) » Fenng's shared items in Google Reader

  增加以下几个链接:

  1. 龚钴尔的博客。龚钴尔是“天才少年”之一,最近出了一本趣味航天科普《别闹了,美国宇航局》。这本书我没看过,但看过的人都说好,所以我想值得推荐。

  只不过,对这个书名我想发几句感慨。这个书名很显然是模仿费曼的《别闹了,费曼先生》。费曼的这本书据说在学物理、天文以至学数学、计算机的人群中间很出名。前一阵子,我从个子兄那里搞到了中文译本的电子版,看过之后,觉得写得很没意思。这本书基本不能算作科普,全书几乎都是费曼自吹自擂的小故事,当然我知道有的人就喜欢这种调调。费曼本人明显缺乏人文素养,所以才有了那些嘲讽哲学的段子。在书的最末,费曼还生造了一个“草包族科学”(cargo cult science)的“术语”,试图分析伪科学的特性及其与科学的区别;他的分析不但极其肤浅,根本比不上正经的科学哲学家,而且具有讽刺意味的是,他生造冗余术语这种行为本身就是违反科学共同体规则的。我觉得个人喜欢费曼的这本书无可厚非,但是如果在潜意识中认为这种书的写法才是科普的最好写法,那就有问题了(这话不是针对龚兄的,嘻嘻)。我对于国内现在流行的“贫嘴科普”甚至“贱嘴科普”一向不以为然,因为最著名的一些科普(如理查德·道金斯、E.O.威尔逊、卡尔·萨根、贾雷德·戴思蒙德等人的作品)都不是这种风格。

  2. 科学松鼠会。“天才少年”的大本营,由姬十三主办的一个原创科普写手的作品展示和编、写交流的平台。希望这个网站能健康发展下去,真真正正地为中国科普事业的进步加一把力。

  3. 杏林孤蝉的博客。杏林孤蝉是武汉一家三甲医院的超声医师。他的博文多是超声诊断心得,虽然很专业,却写得深入浅出,颇具趣味。看过他的文章,你就知道了好医生是什么样的,也大致知道了医学研究是怎么进行的。

  4. 嵇少丞的博客。嵇少丞是旅加地质学家,以前鲜为公众所知。汶川地震后,因提出成都平原以后不再安全,石棉附近今年50年很可能会有大震,而名声骤起。我很欣赏他的博客,因为里面不光展现了科学家应有的社会责任意识——这在现在的中国是稀缺品,而且展现了一个典型的科学工作者的气韵风采。

  5. 情书。这是现在剑桥任教的刘瑜(drunkpiano)老师的独立博客。刘瑜老师不仅在政治科学上颇有造诣,写的小说也很精彩,所以她的“政普”文章非常好看。更重要的是,她的理性态度在现在这个非左即右的浅薄网络上,极为难得。

  6. 司马南的BLOG。犹豫再三,我最终还是决定加上司马先生的博客。司马南一向以反伪气功、伪医学出名,但他的博客上的大部分文章却都是站在新左派立场上批判《南方周末》和《南方都市报》的政论、时评文章。前一阵子的“普世价值”之争就是他推波助澜弄大的。很多人对司马南采取这样一种政治立场表示不解,甚至愤怒,因此不屑细看他的文章。实际上,如果放弃情绪,仔细阅读的话,司马南的文章还是有很多嚼头的。

  理性的宽容,是最难达成的美德之一。有的人走向极端,成为“好好先生”,和稀泥者,但更多的人走向另一个极端,党同伐异,一点不能容忍异见。我对某些“自由主义者”极为失望,直至鄙视,就是因为他们缺乏容人的胸襟,缺乏团结他人共举大业的意识。我可以很有信心地说,一个连司马南这样的人都团结不起来的人,如果不是干嚎党,就一定是胡搞瞎搞的“实干家”。

  当然,我还是希望2008年这个“多事之秋”过去之后,司马先生能把过去写的一些批伪气功、伪医学的文章贴上来,那些文章更有意思。

04:51 谨慎对待自我生成内容(egc) (205 Bytes) » Fenng's shared items in Google Reader
Shared by Fenng
造了一个词,所以厚着脸皮推一下
03:03 申音:陈一舟、庞升东、王兴 (7127 Bytes) » Fenng's shared items in Google Reader
昨天终于改完了51的稿子,这是上周四与庞升东和他的两个核心伙伴深聊3小时的结果。突然发现,自己在过去几个月里,已分别见过SNS社区战中最有意思的三个玩家。

在这样一个新兴产业里,三个性格和行事截然不同的人,如何卡位市场,管理成长,拓展模式、使用资本,真是各有各精彩,这样的赛跑,非常值得一看。

早在陈一舟做Chinaren的时候,我就已经认识他。这些年曲曲折折,有他自身性格中善变的原因。从社区最后回到社区,只能说他认清了自己的长与短。

陈的想法很大,兴趣广泛。视野很开阔,对资本市场的好恶非常敏感,但执行力稍弱。另一个缺点是有些好大喜功,喜欢铺摊子。

我一直觉得他如果不创业的话,应该会是一个很好的风险投资家。至少他在买卖公司这块,还是表现出国内企业家少有的精明,颇有巴菲特的眼光(据说他炒美股的成绩很好)。无论是SP,猫扑还是校内,他的出价通常会让原来的创始人难以拒绝,当时让人觉得很贵。但事后一包装,就能卖出几倍的价钱。

这又带出他的另一本事,就是能将半成品打造成真正具有商业价值的成品。虽然,陈自己很少能够从无到有做好一项业务,但能把收购的公司整合成具有战略价值的资产。这是类似思科钱伯斯的本事。

陈有个经典的比喻:说北京的互联网创业家喜欢讲概念,把蓝图规划的无比之大,而且希望事情离钱不要那么近。上海、江浙的创业家很擅长把互联网变成一种赚钱工具,而广东的创业家最能理解用户,特别是非中心城市以外的用户,最会做产品,细节抠得好。

相比我下面要说的两位,陈在管理方面最老到,吃得苦头也最多,濒死过好几回。关键时候,教训肯定比经验值钱。其实,千橡的阵式是最成型的,只要不出大错,他就能成气候。

在上海见过庞升东之后,我相信他有成为下一个史玉柱的潜质。为什么呢?因为他是一个天生的生意人,貌似草根,其实非常精明。很好的商业嗅觉,营销手段一流。他完全土生土长,特别知道如何赚钱,知道如何推销自己。虽然很多人讲他做事手法有点“邪”,但在中国,“有争议的才能赚钱呀”

按照华兴资本包凡的话说, 庞的情商非常高。他知道自己要什么,也知道别人想要从他这得到什么。这个别人,包括他的投资人,也包括他的团队。他会让这些人都感到很舒服很满足。

为什么选择巨人,其实是马云先找他的。马云对他的社区也最有需求。但阿里巴巴、百度、腾讯势不两立,如果选择跟马云合作,势必公开与另两家为敌。而巨人,在互联网业看来,是个游戏公司。选择它,既能与之互补,又不用担心被大象吃掉。更不怕得罪人。

两家争51。但庞在这件事的处理上,表现出高度的社交智慧。他不漫天要价,他请史玉柱去跟马云沟通,两个人都在《赢在中国》当评委,最后史老大劝退马老大。

庞的团队非常厉害,因为多元化。有高中毕业的草根创业者,有海归,有台湾同胞,还有几个政府背景的。大部分年纪比庞大,除了主管产品的是“80后”。

很多人在某一方面都超过庞,但庞却能把他们统在一起,这有点像刘备。而且,庞在做人方面很大气,舍得花钱,舍得给股票。他也知道放权,知道如何四两拨千斤。真是一个地道的浙商。

庞的学习能力很可怕。深南鹏、史玉柱都是他的老师。我们吃饭那天晚上,9点半的时候,他的手机铃声自动响了,庞说这是他自个设的,提醒他结束工作,开始读书。

但我相信,庞是有野心的,他的目标是QQ。在一个订餐的电话中,他清楚地告诉对方服务生,他姓庞,庞大的庞。

对于庞,最大的不确定性在于,他的对手是马化腾。一个如同石佛李昌镐般几乎从不犯错的人,庞的任何自大,轻敌,甚至着急,都可能会死得很惨。但庞要想活下来,又必须烧钱,必须快跑。

最后是王兴。他是三人中最年轻也是最纯粹的一个。也是我最欣赏的一个创业者。因为这种类型的技术创业者,在国内是比较稀有的。按陈一舟的话说,他是那种硅谷神童,“脑袋很大,眼睛发亮”。他是真懂技术,而且自己就是最活跃的用户。他的身上还有些学生气,看起来比较单纯。

也许是留学过美国的缘故,他的作派有些美式作风。据说,他和同事中午出去吃饭,也都是AA制的。没有见过王兴的团队,但从海内上感觉,这些团队成员跟他的气质有相似之处。偏精英文化,这也意味着海内在很长一段时间内,会曲高和寡。

但我还是希望,王兴能够坚持这种纯粹,坚持这种精英和开放文化。有趣味,但不要庸俗,没人充大佬,讨论很平等。今天这些人可能只是小众,但他们很可能是潮流趋势的引导者,只要等到恰当时候,抓住一个“The Tipping Point”(引爆点),海内也许能取代天涯、MSN在白领人群中的地位。

校内也好,51也罢,都有一些老板的影子,但更多只是他们的产品而已。但海内,的确有王兴内在的精神气质于其中。说实话,我很希望,海内能够成为一个“社区民主”的试验田。

王兴的缺点是什么呢?我感觉也许是骨子里的傲气和桀骜不驯。这可能会让国内VC业的老江湖不太爽,反而那些国外的投资人可能更愿意接受他。他的事业,不管是海内或者饭否,是需要长期经营的,要投资他的人也得有足够的耐心吧(希望他不要太急着卖公司)。

性格决定命运,运气左右成败。三人之中,论智商,王第一,陈第二,庞第三 ;论财商,陈第一,庞第二,王第三;论情商,庞第一,陈第二,王第三。

至于胆商,三人不分伯仲。(查了一下他们的出身,都是极普通人家。陈在湖北武汉,庞是浙江天台,王是福建龙岩,这三个省份都是中国著名的商贾发达的省份,也许有些影响吧。)

谁能笑到最后,或者都能笑到最后,这是一个问题。商业丛林里,多几个不同的物种,总是件好事。

(PS:还有几个重要的玩家没有见到,戴志康,开心网的创始人)



comment
02:18 南方周末 - Li Lei都这么牛×了,Han Meimei却不喜欢他 1990年代中学英语教科书的集体记忆 (17647 Bytes) » Fenng's shared items in Google Reader

   “那T恤能送我一件吗?”满头银发的刘道义老太太问南方周末记者,她今年70岁,退休10年,退休前是人民教育出版社副总编、外语编辑室资深编辑。

刘道义想要的是佐丹奴新推出的Li Lei&Han Meimei(以下简称LH)T恤。这款全球限量发行2000件的T恤,面向高达过亿的潜在用户——从1990年至2000年,10年间使用人教版英语教材的中学生。刘道义是这套教材的中方主编。

这套教材是中学英语教育强化日常情景对话的产物,LH是教科书中的主角,他们负责好好学习,关心他人,书里还有双胞胎Lily、Lucy,英国小子Jim……在众多教科书中,他们陪伴着80后读了6年中学。

T恤只是LH主题产品中的最新一种,其他产品包括:Han Meimei半卧在地、做性感状的作业本;“亢奋起来”的纸飞机;“三八线”胶带,可以贴在男女课桌之间,也可以贴在父母床中间;“我是狐狸精”、“正确对待男女关系”的贴纸……

LH产品基本以二人的男女关系为中心,他们不是抱着就是亲着——80后回忆、分析当年英语教材,找出了各种LH确有“一腿”的证据,最后大家焦急地成立了“Li Lei都这么牛×了,Han Meimei却不喜欢他”小组,以便考据出LH的更多男女关系。

“其实 Li Lei和 Han Meimei从头到尾就没说几句话,”刘道义听说LH的绯闻后,哈哈大笑,“我们当年都很古板,怕学生谈恋爱。”21年前,刘道义和朗文出版集团有限公司的格兰特先生一起,主持了初中英语新教材的编撰工作。编撰持续了3年,1990年开始在北京崇文区、四川成都等八个县市区试用,1993年成为全国(除上海外)通行英语初中教材。

“Han Meimei 就是那种小干部”

LH及那套为国内首次与国外出版社合作的中学英语教科书,对于这位退休在家的七旬老人和绘图者王惟震而言,有着80后所不理解的意义。

1981年,刚调进人教社一年的刘道义被人民教育出版社派往英国朗文出版集团考察,没呆几天,她就强烈感觉到:“中国的英语教材要提高质量,必须和外国人合作。”

中国当时刚刚开始改革开放,考察可以,合作基本不可能。

6年后,1987年,英国一家出版公司提出,愿意将人民教育出版社编写的汉语教材引入英国,条件是让他们给中国编英语教材。

人教出版社在邓小平的支持下,迎来了引进外国教材的第一个高潮,人教社最终选了朗文集团为合作方,融入以前的课本所没有的日常交际用语,让学生在丰富的情景对话中掌握单词和语法。

中方和英方各派出一个主编、两三个责任编辑。

教材里的故事由英国人格兰特主创,家庭模式是双方一起研究,最后设计了英国的Green家庭、加拿大的Read家庭;美国的King和Smith四个家庭,四个家庭加上中国的LH,故事就开始了。

课本里 Han Meimei和Jim、Li Lei和Jim等不断重复着相同的问候,“How are you?”“Fine,thank you,and you?”

有不少人都怀疑自己患上了“and you”综合征。觉得不这样说,就“简直没办法跟外国人展开交流”。

刘道义告诉记者,Li Lei和Han Meimei是中方编撰组起的名字,不是某位编撰者为了“纪念那个谁”,而纯粹为了便于刚开始学英语的中学生发音:“Li Lei总比Li Ming guang要好发音吧。”

之所以叫Meimei,也因为觉得“中国人也是喜欢起两个字的,把名double一下,就是小名了,这样比较好听”。

刘说,Lily和 Lucy,还有那一不小心就念成“烂玻璃”的Polly等外国名,都是朗文的编撰者格兰特起的,也是故意用最普通、最好念的名字。

比起名字难得多的则是对“形象”的把握。

教材里以图画为主,每篇课文都有至少两三幅图画讲述新单词和新句子,形象全部由中方操刀,今年快70岁的王惟震就是当年的主画人。

“Li Lei形象好,是一个很自立的、很有信心、很坚定、很正派、很有责任心的小男孩”,王惟震连说了五个“很”,新版教材被要求赋予每个人物以性格,所以Li Lei理所当然地是一个小平头的标准形象。王惟震给LinTao戴上眼镜,让Lily和Lucy扎一头漂亮的金发,让Jim脸上长点雀斑,因为歪戴棒球帽,Jim还是当年小男生的模仿对象。王惟震说,这是从国外乐队海报上获得的灵感,那个时代“直接接触国外事物的机会太少”。

王惟震画得很慢,慢得让编辑抓狂。“画的时候就得小心,不能给孩子传授任何不良的东西。”王惟震也有自己的道理。

Han Meimei是王惟震最“小心”的形象:齐耳短发,一脸严肃,校服领口最高一颗扣子从没打开过。“就是那种小干部的形象,比较乖,功课也要好,也有责任心,愿意为大家做事”。后来Han Meimei直接被网友称为“妇女干部”。

王惟震第一次听到时,甚至有些委屈:“1990年代很多学校的女学生还不可以留长发,也不让扎马尾。”

尽管如此,谨慎的王惟震还是决定至少让MissGao出点“格”。“那个时候老师给孩子的第一印象应该是朴实”,但这位女老师,身材高挑,不但穿着裙子,还烫着卷发,颇有女人味,被当年的中学生叫作“迷死高”。

画好后,为保险起见,王惟震专门请示了领导,他没有想到领导只说了一个字:“行!”

新教材编撰从1987年启动,1990年编完初中阶段教材,在地方试用三年后,于1993年推向全国。

江苏无锡南长街实验小学英语老师田勤萍认为这套教材“很好很时髦”,当年的学生最喜欢Lily和Lucy,关系好的女生常常两两配对,宣称:“We are twins.”今天很多80后给自己取的英文名,很多也都是当年教科书的名字:Kate、Jim、Lily、Lucy。

课本用了7年,2000年人教社推出英语教材修订版,原来1000词掌握600词的要求已经过于低了,需要新版本提升难度。Li Lei和Han Meimei退出了90后的视野。“后来改成多套教材并用后,很多人还留恋原来这套。”刘道义说。

女老师Miss Gao,身材高挑,穿裙子,烫卷发,在当时既时尚又有女人味,被当年的中学生称作“迷死高”。 王惟震/图

亢奋起来

“Miss Gao再高一些,头再大一些就更好了。”王惟震眯起眼睛,盯着T恤有点遗憾地说。

T恤的设计者叫蔡凯。1981年生,2005年辞掉大学美术老师的工作,从武汉漂到北京。这款“看在1300美金份上”接下的设计,由于被要求多次修改,图案变得“不够邪恶”,他不厌其烦地在网上劝告粉丝,等他推出自己设计制作的T恤再买。

2006年8月的一个中午,蔡凯坐在工作室发呆,突然问起一个生于1983年的同事,你还记得LH吗?“不就是初中课本上那对男女么?”同事头也没抬,“网上已经在讨论了。”

上网一搜索,蔡凯被“雷”(震惊)到了。许多人正在编排LH的故事,故事中不但他俩“有一腿”,而且还有扑朔迷离的N角恋——Li Lei和英国来的Jim都喜欢Han Meimei,但Han Meimei和Lucy都喜欢Li Lei。

他们拿出了一些最经典的佐证:一次Han Meimei问Li Lei借尺子,身后的Jim“神情复杂”地瞪着Li Lei,目光中“夹杂着妒忌和羡慕”。身旁的Lucy则“委屈地低下了头”,眼眶里已“满是泪花”……而在户外摘苹果那一课里,Han Meimei边在树上摘果果,边和底下的Li Lei“眉来眼去”,害得Jim着急地大喊:“Becareful!”

但到了初一下学期——他们认为——Li Lei开始移情别恋,爱上了Lucy,因为课本上的对话变为以Li Lei和Twins为主角的居多。而Han Meimei也被默默注视自己一个学期之久的Jim所感动,两人幸福得像花儿一样开……

除了LH恋情大猜想之外,当年这套教科书里的所有人物,还包括那只叫Polly的鹦鹉,统统被翻出来八卦了一遍。

被网络打破了班级和城市的地理界限后,当年的中学生们得以分享很多曾经以为自己独有其实却有普遍性的经验。他们兴奋地发现,原来好多人都容易把Polly发音为“玻璃”,一位有才的老兄当年念“I’m Polly”时,总念成“烂玻璃”。1990年代末期就读中学的孩子更有才,把“Come and see my family”唱成“肯德基 my family”,还把Han Meimei翻译成“韩美眉”。他们发现,烫卷发、穿裙子、胸部颇具规模的MissGao曾被他们不约而同地评为“最有女人味的老师”,人称“迷死高”。

“大家像是找到了组织,尽情地晒当年的回忆,与集体记忆相关的主题产品会很有市场。”蔡凯说。

2006年10月,在《城市画报》举办的创意市集上,蔡凯和同事将网络时代造就的课本文化引入商业领域。他不喜欢课本上的LH形象,因此改造了他们。“我以前讨厌的LiIei和Han Meimei都改头换面,重新做人了。”

当印有LH大头像和相拥照的作业本、贴纸往摊上铺开,立马惹来厚厚一圈围观者。这些印刷质量粗糙,标价10块钱一本、50块钱一套、总共200套的作业本,两天之内被抢购一空。几乎每个围上来的年轻人都会眼睛一亮,发出尖叫,“天哪!这不是Li Lei和Han Meimei吗?!”

2007年,已经决定辞职做独立设计师的蔡凯推出了LH第二代产品,还参加了当年的大声展。“我很兴奋,这是我破坏青春期生活方式的一个好机会。我设计了5个产品,每个产品都有我上初中时的回忆、不满和隐忍。”他说。这套包括尺子、三八线、情书、检讨书和贴纸在内的办公室用品,无论从质量还是设计上,远比一年前更时尚,进一步淡化了他们身上的80后青春期印记。

“网络把我们的结集单位无限放大了,一个个创意被网络聚集起来后,像通了电一样强大闪亮起来。”蔡凯说。

许多90后也成了LH的粉丝。一个刚上初一的小男孩,在蔡凯的淘宝铺子里买了一卷三八线,号称要贴在老爸老妈的床的中间。一位上海中学女生,一口气买下所有贴纸,准备把印有“很黄很暴力”的贴纸贴在手机背面。

蔡凯出现在各种时尚休闲类杂志的机会也多了起来。2008年4月,佐丹奴香港总公司开始征集一年一度的“没有陌生人的世界”主题T恤设计,他们邀请蔡凯以LH为形象,设计其中的一款情侣装。带着他业已申请注册商标的LH和80后的青春期集体记忆,蔡凯在时尚经济产业开发上渐走渐宽。

此时,另四个80后的“TheLi Lei&Han Meimei’s”乐队正好成立一周年。2007年8月30日,当他们站在MAO——这个云集国内知名摇滚乐队的舞台上,一脸青涩地唱起“Polly之歌”时,台下见惯大场面的滚迷们发出一片尖叫,“真牛X,这支歌都能被你们翻出来!”

当年那套英语教科书里选刊了很多歌曲,都是朗文出版公司的格兰特创作的,其中就包括“Polly之歌”。 这个“对音乐也不是特别擅长”的英国人的音乐作品并不被刘道义等中方教材编撰者欣赏,“因为不好听”。当初用这些歌曲,只是因为用它们就没有版权问题。而如今,它重出江湖,并且大受欢迎。此外,LH乐队还计划将教科书中的所有曲子重新翻唱。

主唱Icier还给乐队名作了注脚:它是对中学英语的怀念、致敬及反抗。其实,这个毕业于清华大学英语系的25岁女孩和她的三个成员念初中时,在表面上中规中矩,一点也不“反抗”,他们都乖乖地穿着和Han Meimei差不多的校服,或是理着Li Lei一样的小平头;了不起学着Jim的模样,把头上的棒球帽稍微歪到一边;中学毕业后,都顺利考入国内和香港一流名校。“就是因为以前想坏,但没机会坏,坏不起来,现在就补偿一下,坏一点。”Icier说。



《人教英语》同人漫画版里,Miss Gao不是主角,但作者还是不忘表现她娇好的身材(出木太郎/图,请作者见报后与本报联系,以付稿酬)



找到组织

一次偶然的机会,蔡凯在网上认识了杨柳,她就是那篇分析LH之间“有一腿”、流传最广的帖子的作者。在蔡凯看来,这名香港大学新闻系2004级本科生属于超级闷骚型——每次考试都拿第一,每次比赛都拿名次,高考后拿全奖去香港念书,今年再拿全奖,将赴美读Master。可比起其他若干年后才追忆似水年华的同龄人,这个1986年出生的女孩在初中时就开始YY(意淫)两人的关系了,在她的教科书里,Li Lei被她画成了印度人,而坐在 Han Meimei后面的Jim被涂鸦成复仇之神。她老早就“看出”,一直暗恋着Han Meimei的Jim,对总是找她借尺子的Li Lei怀恨在心。

到香港读大学后,杨柳发现这个有着丰富历史沉淀的繁华都市,充满凝固了光阴的记忆,比如一家叫G.O.D的连锁店,专卖怀旧产品——毛时代的痰盂、果盘,1980年代风行全国的大白兔奶糖,最近还推出了一款避孕套,上面印着过去商家最爱打的广告:“居家旅行必备”。产品很贵,买的人不少。

在一次社会学课上,杨柳发现集体回忆其实早已是社会学的一个研究分支。

集 体 记 忆(collective memory)最早是法国社会学家莫里斯·霍布瓦赫(Maurice Halbwachs)提出的,他认为:集体记忆是社会建构出来的观念,它并非某种神秘的群体心灵,而是一群人对于过去的记忆。

不同的社会群体会有完全不同的、专属他们的集体记忆,这个集体记忆对50后来说是“红袖章”,对60后而言是“李铁梅”,对70后,是“阿童木”、“机器猫”。

对于阅历尚浅、成长环境逐渐多元与宽松的中国80后而言,陪伴着他们一同成长的Li Lei和Han Meimei就成了他们缅怀青春的载体。这个载体并无灾难与伦理的沉重负担,由于多少来自于一个压抑和单调的教育气氛,被这代人补偿性的“使坏”冲动颠覆与娱乐过后,才开始认真地怀念。

1990年代后,集体回忆在香港开始广泛应用,2006年11月香港政府清拆被认为有集体回忆的爱丁堡广场码头,甚至引发了香港人反对者的游行、抗议。以致于2007年1月,香港政府提出了将集体回忆作为“是否清拆香港历史建筑”的参考因素之一。

这两年,杨柳先后目睹香港因拆除皇后码头和天星码头,引发了港人集体抗议风潮。这些已丧失了使用价值的殖民时期老建筑,和90后不再认识的LH一样,对于相伴成长的一代人而言,意义非凡。“对于我们这代人来说,每个人的中学时代都不一样,但却共同拥有一个Li Lei和Han Meimei。”

今年6月1日,LH乐队参加了一场连台演出,当天的音乐主题是“让我们荡起双桨”。又一代人的青春将成往事,80后们开始回忆了。一个乐队演唱了一首“回到红白机时代”。那是一种流行于上世纪90年代、如今已被网游淘汰掉了的游戏机。曲子算不得动听,和Polly之歌差不多简单,甚至还有些粗糙。但全场人像是被喷了催化剂,尖叫、扭摆、泪奔,闹得一塌糊涂。

“为什么这些带着破坏力和颠覆性的产品那么有市场?”蔡凯说,“因为我们大家正在今天这个语境中对待那段回忆,正在消费其中的落差。一些变化发生得太快太猛,而一些记忆过了十几年仍然留在那里。”

蔡凯正忙着推出更“邪恶”的新产品,包括T恤、单肩书包,还有情趣内裤——把Li Lei和Han Meimei的大头像分别印在私处,屁股后面印上英文字样:“打我”、“咬我”等等。至少在他这里,LH将不可挽回地长大。他将推出一系列环保主题产品,因为据网友考证,Li Lei和Han Meimei生于1978年,今年已经30岁,步入而立之年了,“该让他们严肃点,承担起社会责任了。”
(风端、莫希对本文亦有贡献)

00:40 老婆,出来看神仙 (3642 Bytes) » Fenng's shared items in Google Reader

视频网站56.com今天重返人间。此前,站方在公告中说“我们就快回到地球啦”。现在,56.com已经正式返回地球,对于56.com之前的关闭,官方解释是:系统维护。

谁都知道,56.com之所以关站是因为没有拿到牌照。在MSN上有人问过我,56.com究竟会怎样?我当时回答说,一切只是个插曲,它迟早会重开的。这不是事后诸葛亮,我有我的理由。在讨论视频网站的牌照之前,不妨倒一下带,让我们回到遥远的唐朝。

唐朝张固写了一本书叫《幽闲鼓吹》,其中卷52记载了这样一个故事:

相国张延赏将判度支。知有一大狱,颇有寃滥,每甚扼腕。及判,使即召狱史严诫之,且曰:“此狱已久,旬日须了。”明旦视事,案上有一小帖子曰:“钱三万贯,乞不问此狱。”公大怒,更促之。明日帖子复来曰:“钱五万贯。”公益怒,命两日须毕。明日复见帖子曰:“钱十万贯。”公曰:“钱至十万,可通神矣。无不可回之事,吾惧及祸,不得不止。”

翻译为现代汉语就是:

中唐时期,京城发生一件大案,牵扯到不少官员。但因为有人暗中活动,所以迟迟不能结案。有一天,宰相张延赏想起此事,非常愤怒,便召见司法官吏,当面下令:“此案已久,限在十天内审结。”第二天上午,张延赏来到自己办公的地方,发现书案上压着一张纸条,上面写着:“钱三万贯,请不要过问此案”。张延赏大怒,当即把纸条撕了,又下令下属督促审理此案。可隔天去办公,见书案上又出现了一张条子,上面写着:“钱五万贯”。张延赏更是气愤,下令限在两日内审结。又过了一日,桌上又有了一张纸条,写着:“钱十万贯”。张延赏摇摇头,叹了口气说:“钱至十万,已经可以通神了,没有不可挽回之事。我怕由此得祸,只能不去管这桩案件了。”

这个故事就是“钱能通神”的掌故。

为什么说56.com歇业只是个小插曲?看看它的资金组成就知道了:截至2008年,56.com获得红杉资本、HPE、SIG等海外风险投资牵头的近3000万美元融资。可以让一个站歇业,可以让一个站烧掉2亿人民币,但是,直接撕掉2亿人民币是不可以的。56.com的背后不是一个人,而是一帮职业资本家,一帮专业商人。投资3000万美金但是搞不定一个牌照,那么风投就是个笑话,即便为了职业荣誉感再花2亿,他们也完全愿意。所以,这2亿人民币会让多少人疯狂,而且倾尽全力挽救?当这些资本家和商人为了2亿人民币和预期中的数百亿人民币行动起来,究竟会发生什么就不难想见了。

从这个事情上可以看出来,究竟什么才是这个社会运转的基本力量,所谓的规则和政策是个什么东西。从更长远的角度上来看,有些事情已经成为新兴产业和新资本家发展的桎梏,他们会寻求自己的利益代言人,并谋求境遇的改善。也就是说,金钱本身要争取发言权,而且不是用现在这种低效的方式。明天会变成什么样子,每个人都可以据此猜想。我相信,以后会越来越多地看到神仙降落地球。

00:39 SQL*Plus的注释问题 (2645 Bytes) » AnySQL.net

作者:AnySQL, 订阅AnySQL, Oracle数据库恢复及服务, Sybase恢复, 磁盘及RAID恢复

    将下面的SQL语句存放到文件中, 或直接贴到SQL*Plus空口中, 会发现后面一个SELECT会被执行两次.

select sysdate from dual;
/* MyDUL */
select sysdate from dual;
/*MyDUL*/

    执行结果如下:

SQL>@cr.sql
SQL>select sysdate from dual;

20080711 14:24:32

SQL>/* MyDUL */
SQL>select sysdate from dual;

20080711 14:24:32

SQL>/*MyDUL*/

20080711 14:24:32

    估计是SQL*Plus工具的问题, 要确保中间有空格隔开, 或用两个减号的注释.

相关文章 | Related Artiles

我要留言(当前0)

2008-07-10 Thu

23:18