囧肉壳 – EP8: 为什么选C?

这是肉壳初二时的一件事,不知道其他省市,天津的同学们应该都做过语文质量检测吧?就是关于那本题的事情……

首先,大家想象一个教室,我坐在靠窗数第二列第二排的位置……大概就是这个样子的

墙 墙 墙 墙 墙 墙 墙 墙 墙 墙

窗 这 一 排 献 给 讲 台 了 门

窗 人 人 人 人 人 人 人 人 墙

窗 人 我 人 人 人 人 人 人 墙

窗 人 人 人 人 人 人 人 人 墙

窗 人 人 人 人 人 人 人 人 墙

窗 人 人 人 人 人 人 人 人 墙

窗 人 人 人 人 人 人 人 人 门

墙 墙 墙 墙 墙 墙 墙 墙 墙 墙

有一次,老师留质量检测的作业,有一篇阅读的选择题,选择一个错误答案,大家都抄答案,所以全班都对了,老师很生气,于是上课的时候,就让门边第一位同学解释,这道题为什么选C……

人们当然都不会,不会就要罚站,老师挨个问,谁都不会,全都站着了,终于问到肉壳了,肉壳当然也是抄的答案,不知道C为什么错,于是就跟老师说“老师,因为我看ABD都是对的,所以C是错的……”

老师楞了一下,“原来你用的排除法啊,坐下吧”。于是我后面开始,同学都纷纷效仿,结果也都可以免于被罚站。到了最后一排,老师纳过闷来了,于是说,“后面的人不许再用排除法了,用排除法的也得站着……”

所以最后一排的人都哭了……

于是我们那排,除了第一个人,都可以安心坐着上课了……就是人们都站在那,有点挡视线了……

囧肉壳 – EP7: 括号

很多人在打游戏或者使用计算机的时候,屏幕上总是会提示这么一句“Press Any Key”或者“请按任意键”之类的话……所以……这个Any Key或者任意键到底在哪?

幸运的是,肉壳从来没有犯过这样的傻,但不代表肉壳没犯过傻……这是肉壳小学时的一件事了,具体几年级已经记不清了,但是可以肯定是,这件事发生在一次语文期末考试上……

阅读题里,有一道题,题目是这样的,“……请将正确的答案填在(        )内……”。肉壳做到这题的时候,一下子愣住了,这个括号里应该填什么?肉壳想了10分钟,实在是想不出答案,于是就在括号里写了“括号”两字……

最后,卷子发下来,老师在这里画了个圈,然后写了一句“这里不用填”……

囧肉壳 – EP6: 同学为啥不在家

突然想起,这是小学时的一件事儿……

在肉壳小学6年级的时候,手机还是个新鲜的物件,BP机才是主流,当然,肉壳那个时候啥都没有,联系同学只能靠家里的固话……所以,给同学打电话的时候,总是有可能是对方家长接电话……

有一天,给班上一个外号秃驴的同学打电话,现在早已忘记这位同学叫啥了,当然,这个外号也不是肉壳给起的,但就是有这么一号人,另外,他也不是秃顶……

肉壳给他打电话,是他奶奶接的电话,我问他在不在家,对方说不在,于是就挂了……

本来也不是件什么好玩的事情,转天上学,肉壳去问秃驴,为啥不在家……秃驴惊讶的说:“原来是你的电话啊?我奶奶以为是个女生,她不想让我跟女生打电话,所以才说我不在……”

话说,肉壳说话声音有那么娘吗?

更换邮箱地址

实在是太懒了,随便一拖,又是一个月没写过东西了……

新的一年开始了,在新的一年,肉壳要做的第一件改变就是更换自己使用多年的gmail地址为me@colinzhang.com……目的就是为了耍帅……

从几天起,所有给原gmail邮箱发邮件的朋友,都会收到一份邮箱更改通知。目前只有简体中文版,未来再添加英文和繁体中文版吧。不过估计会因为懒,拖一段时间……

新年了,祝大家新年快乐……刚看了一下草稿箱,有几篇文章还没有编辑完,近期就写一个Github在Eclipse下的简易使用指南吧……

另外,这段时间,我还申请了一个Github账号,欢迎大家follow……

https://github.com/Rokeer

Java,使用Jung包读取GraphML数据

最近在做一个Project,跟微博啥的有关,肉壳的工作就是给微博用户打分,看谁最重要,基本上就是简单的修改了一下Page Rank算法和HITS算法。不过第一步就是要把搭档给我的数据读出来。因为都是用户关系用网络表示,为了方便处理,前期操作都是把数据写在GraphML格式文件中。GraphML也是一种标记语言,跟HTML,XML什么的差不多,里面都是一些标签。有兴趣的话,大家自己Google一下就可以了……

搭档们用的都是R和Python,里面有包可以直接读GraphML,但是木讷的我不会用R和Python,只能在Java里找相关的包,结果还真找到一个叫Jung的包。这个包功能非常强大,可以对GraphML增删改查,还可以计算网络的PR,HITS什么的,可谓非常强大……不过今天就讲一些简单的,就是如何将GraphML文件中的数据读出来,就是这么简单……

首先,我们看一下GraphML的文件格式,

<graphml xmlns="http://graphml.graphdrawing.org/xmlns"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
  <key id="d0" for="node" attr.name="color" attr.type="string">
    <default>yellow</default>
  </key>
  <key id="d1" for="edge" attr.name="weight" attr.type="double">
	<default>0.0</default>
  </key>
  <graph id="G" edgedefault="directed">
    <node id="n0">
      <data key="d0">green</data>
    </node>
    <node id="n1"/>
    <node id="n2">
      <data key="d0">blue</data>
    </node>
    <node id="n3">
      <data key="d0">red</data>
    </node>
    <node id="n4"/>
    <node id="n5">
      <data key="d0">turquoise</data>
    </node>
    <edge id="e0" source="n0" target="n2">
      <data key="d1">1.0</data>
    </edge>
    <edge id="e1" source="n0" target="n1">
      <data key="d1">1.0</data>
    </edge>
    <edge id="e2" source="n1" target="n3">
      <data key="d1">2.0</data>
    </edge>
    <edge id="e3" source="n3" target="n2"/>
    <edge id="e4" source="n2" target="n4"/>
    <edge id="e5" source="n3" target="n5"/>
    <edge id="e6" source="n5" target="n4">
      <data key="d1">1.1</data>
    </edge>
  </graph>
</graphml>

首先,key标签定义了Vertex和Edge的meta信息,以便以后获取到这些信息后将他们读出来。<graph id=”G” edgedefault=”directed”>定义里这个图是个有向图,不过我代码里用的是个无向图(undirected),大家使用的时候需要注意一下。之后运行一下下面的代码就好了。

GraphMLReader<undirectedgraph, Node, Edge> gmlr = new GraphMLReader<undirectedgraph, Node, Edge>(new VertexFactory(), new EdgeFactory()); //创建一个GrahpML的Reader
final UndirectedGraph graph = new UndirectedSparseMultigraph();

gmlr.load(filename, graph); //读取graph,并将内容写进graph对象

BidiMap vertex_ids = gmlr.getVertexIDs(); //获取Vertex的id
<Map> edge_meta = gmlr.getEdgeMetadata(); //获取Edge的内容

//graph对象此时只有Vertex和边的连接关系,我们需要把Vertex和Edge的附加信息写进去
for (Node n : graph.getVertices()) {
	n.setUserID(vertex_ids.get(n));
	n.setPageRank(0.2);
	n.setAuth(1);
	n.setHub(1);
}
for (Edge e : graph.getEdges()) {
	e.setCapacity(Double.parseDouble(edge_meta.get("d1").transformer.transform(e))); //读取的d2信息是在GraphML文件里定义的
}

经过这么一番简单操作,graph对象就已经包含了各个Vertex和Edge的关系了……就是这么简单……Vertex和Edge对象是自己写的,下面再贴个NodeFactory和EdgeFactory的代码。

class VertexFactory implements Factory {
	private int n = 0;

	public Node create() {
		return (new Node(n++));
	}
}

class EdgeFactory implements Factory {
	private int e = 0;

	public Edge create() {
		return (new Edge(e++));
	}
}

需要注意的时候,无向图读取以后,不知道是不是因为我不会用,每条Edge的from和target读不出来,用有向图就能读出来,好奇怪……不过大家到也不用担心,因为graph有个方法叫getEndpoints,可以获取到特定边的两个顶点,然后再操作就可以了……

另外,最近在研究GitHub,虽然早就注册了,但是一直没用过……现在想想,太狗了……