折腾了好几天,试过官方的 edX Developer StackedX Ubuntu 12.04 installation 两种方法没成功之后,终于按照 Quick Start to working with the edX Platform 这篇文章搞定,缺点就是不是最新的 edX 环境。

按照官方文档,在安装时主要会卡在两个地方(主要还是网络问题):

  • 安装 MongoDB(这个地方时间长点还可以执行下去,大概 10 几个小时)

  • 安装 ORA(花了一天一夜也没执行下去)

最后这两种方法都放弃,使用了直接下载 box 的方式。就是 box 文件下载需要点时间,我家里 20M 光纤用了 4 个小时左右。

Read more »

edX 概览

edX 平台主要采用 Python 语言实现,还包括了个别的 Ruby 和 Node.js。部分服务使用到了 Java ,数据库使用了 MySQL 和 MongoDB,所有这些代码都是在 AGPL 协议下开源的。

XBlock 是 edX 的下一代组件架构。对机器学习评分感兴趣可以看 Ease 和 Discern 。部署和配置工具方面可以看 Configuration。各主要组件的详细介绍可以看下边。

Read more »

在 JDK7 环境,在 android deploy 时会出现一个 INSTALL_PARSE_FAILED_NO_CERTIFICATES 的错误。如果使用 Maven 打包,需要在 maven-jarsigner-plugin 中增加以下参数

<arguments>
    <argument>-sigalg</argument>
    <argument>MD5withRSA</argument>
    <argument>-digestalg</argument>
    <argument>SHA1</argument>
</arguments>

What is the difference between the Java 1.6 and 1.7 jarsigner

http://stackoverflow.com/questions/8739564/what-is-the-difference-between-the-java-1-6-and-1-7-jarsigner/    

升级到 Mavericks 之后,需要自行安装 JDK 环境。如果你安装了 JDK7,那么在安装之后,在命令行中运行 javac、java 命令没有问题,但是 Eclipse 和 IDEA 都无法启动,系统要求安装 JDK6。

Read more »

找到配置文件:

${solr/home}/collection1/conf/solrconfig.xml

增加以下配置:

<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
      <lst name="defaults">
    	    <str name="config">data-config.xml</str>
      </lst>
</requestHandler>
Read more »

接上一篇的 MultiCache ,这篇主要讲一下 AssignCache 的使用。继续解决上一个场景中没有解决的问题。

根据某几个 role ID 查询所有的 User。查询关联两个以上的 Model,在更新其中一个时,需要让相关的缓存失效

Method:

@Override
@ReadThroughAssignCache(assignedKey = "user/getUsersByRoleIds", namespace = "user", expiration = 60)
public List<User> getUsersByRoleIds(@ParameterValueKeyProvider final List<Long> ids) {
    return (List<User>) sqlMapClientTemplate.queryForList("getUsersByRoleIds", ids);
}

SQL:

<select id="getUsersByRoleIds" parameterClass="list" resultClass="user">
    SELECT u.id, u.name, r.id as "role.id", r.name as "role.name"
    FROM user u, user_role ur, role r
    WHERE u.id = ur.userid and r.id = ur.roleid and ur.roleid in
    (<iterate conjunction=",">
        #ids[]#
    </iterate>) order by r.id
</select>
Read more »

因为公司有的项目还运行在 MyBatis2 上边,并且 SSM 暂时还不可以直接使用在 MyBatis3 上边(可以通过 Spring Cache 或者直接使用 mybatis-memcached 来实现,但后一种方式不适合那种需要对 Cache 进行精细控制的场景)。所以这里主要写一下 SSM3 Annotation 的使用。完整的Spring3 + Memcached + MyBatis2 代码在 ssm3-mybatis2-memcached

1. SSM Annotation

SingleCache 类

操作单个 POJO 的 Cache 数据,由 ParameterValueKeyProvider 和 CacheKeyMethod 来标识组装 key。

Java Code:

@ReadThroughSingleCache(namespace = "user", expiration = 600)
public User getUser(@ParameterValueKeyProvider Long id)

Memcache Log:

get user:1
set user:1
Read more »

上一篇讲了 SingleCache ,这篇主要讲一下 MultiCache 的使用。在此之前,要先理解一下 Namespace 和 Key 两个参数。在 Memcached,读写数据都是根据 namespace 和 key 来进行的。

Namespace 和 Key

这里首先要理解 SSM 中的 namespace 这个参数。其实这个参数主要是和你的方法返回结果相关。在这篇和上一篇联系起来看,可以使用同一个 namespace。这里可以把 MultiCache 看成 SingleCache 的批量操作。因为无论是 SingleCache 还是 MultiCache ,最终的 Cache 操作其实就是

  • get user:id

    {“v”:{“me.batizhao.model.User”:{“id”:1000,”name”:”Messi”}}}

  • set user:id

    {“v”:{“me.batizhao.model.User”:{“id”:1000,”name”:”Messi”}}}

如果不理解 namespace 和 ParameterValueKeyProvider,会带来的问题是

  • 缓存命中率(大大影响缓存使用效率)
  • 内容空间(占用更多的内存)
  • 需要更多的清除操作(程序复杂度增加)
Read more »

上一篇大概讲了一下 SSM anotation。这章详细看一下 SingleCache 的使用。

首先是接下来的几个内容都会用到的两个 POJO

Role Model:

public class Role implements Serializable {

    private static final long serialVersionUID = -4708064835003250669L;

    private Long id;

    private String name;

    @CacheKeyMethod
    public String cacheKey() {
        return id.toString();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public boolean equals(Object obj) {
        return EqualsBuilder.reflectionEquals(
                this, obj);
    }

    public int hashCode() {
        return HashCodeBuilder
                .reflectionHashCode(this);
    }

    public String toString() {
        return ToStringBuilder.reflectionToString(
                this, ToStringStyle.MULTI_LINE_STYLE);
    }
}
Read more »
0%