关于MarkDown插件

因为实习找到了,然后offer也接受了,所以所谓最忙碌的大三下学期就变的有点松懈了。 因为自己之前都是做Java的,然后实习的话需要了解PHP,因为实习的公司正在做SOA的架构 转变,需要将之前使用PHP的代码用Java替换。所以开始学习PHP。 不过,几天感觉下来,使用PHP写网站,确实比Java这种语言简单,就说一个简单的数据库 连接,Java需要导包,JDBC等等,麻烦点的什么JNDI,数据库连接池。。。然后取得数据之后 又是各种类型转换。毕竟是强类型语言,相比之下,PHP就简单很多了。 先说这个插件,毕竟刚学PHP,只写过简单的留言板,所以就只能解压别人的代码,然后观察 抽取可以使用的方法。在这边感谢卡片和emlog的工作人员,插件的编写文档和自动摘要插件给了 很大的指导。 其实代码也比较简单,这是全部的代码了 这边主要的就是添加钩子函数,addAction之后就是Emlog-Core的任务了(不得不说,这个确实是 一个很好的思路),然后按照文档,他会在保存日志的时候,调用我的markdownparser($id)函数。 这边最主要的就是解析Markdown语法了,还好有人已经帮我们做了,这就是Parsedown 感谢开源的力量。 使用上的话,需要注意在编写文档的时候需要点击HTML源码模式,因为直接编写,会出现解析上 的问题。 主要的介绍可以看我在论坛上的帖子:点击这 就这样吧,接下来就可以好好看看PHP了,然后把这个插件做的更好一点。 加油!

使用ActiveMQ完成Request和Reply模式

这几天一直在学习JMS标准,也在看《activemq in action》这本书,当中有几个比较好的例子我这边来分享下。 首先是,ACTIVEMQ的本机环境搭建问题。关于这个,我建议大家阅读这篇文章:Using ActiveMQ > Getting Started 一般介绍如何启动ActiveMQ,都是运行activemq脚本,但是我喜欢用的是activemq-admin这个脚本,原因是,我可以看到监控的 状态。这样就可以做一些简单的判断了,比如当前系统的运行状况,和负载情况。 怎么判断你的ActiveMQ已经可以正常运行了呢,你只需要打开http://localhost:8161,当然这是默认设置的效果,你也可以 进行端口的修改。如果你看到了ActiceMQ的界面,说明MQ已经启动完成。你可以开始编写代码了。 先申明一点,为了代码尽可能的简单,和便于理解,之后的代码只是启动了一个简单的Broker,并没有启动其他的部件。当然,如果 你没有启动ActiveMQ,运行以下的代码也是可以跑的。具体的代码,我方到了Github上,有兴趣的可以自己Download下,然后进行阅读。 这边需要提的几点就是,ActiveMQ当中并没有实现所谓的Request/Reply模型,确切的说,JMS标准并没有提供这样一种通信方式 ,但是,我们可以通过其他的途径去实现这个效果,这个 效果的应用场景还是比较多的。比如,服务器需要确保消息的准确无误的传输,就需要对传递的消息进行一个回应。这边,我们就是使用 两个消息队列实现这么一个神奇的东西。 主要的原理就是如图: 图片摘自点缀星辰 在Client端,也就是消息发送端来说,发送请求的时候注意设定消息的返回通道。这个例子里,我使用了一个临时的队列。代码如下: 然后就是消息接受端了。如何将收到的消息的反馈发送给消息发送方。其实也很简单,就是从哪来回哪去。代码如下: 然后运行程序,就可以了,不过需要注意的是,这边我并没有使用阻塞的方式,而是使用了异步的方式处理请求和回复,所以,在进行 代码编写的时候,需要确定好消息的编号问题,以免出现双方进行交互的时候,都不知道接受的哪个消息的回复。 总体来说,整个的交互过程并不复杂,只是比较繁琐。对于请求/应答的方式来说,这种典型交互的过程就是Client端在设定正常发送请求 的Queue同时也设定一个临时的Queue。同时在要发送的message里头指定要返回消息的destination以及CorelationID,这些就好比是一封 信里面所带的回执。根据这个信息人家才知道怎么给你回信。对于Server端来说则要额外创建一个producer,在处理接收到消息的方法里再 利用producer将消息发回去。这一系列的过程看起来很像http协议里面请求-应答的方式,都是一问一答。 不过,JMS确实有很多值得好好把玩的地方,之前阿里的电话面试中,也提到了很多消息确定的保证上,这一点,JMS做了很多的研究,在前人的 经验上, 我们可以得到更多的提高。 之后会有更多的关于JMS的文章。最近也在看PHP,发现Sublime配置之后,确实是一个写PHP的神器。不知道还有没有更好的方法,求推荐。

Btrace调试Java代码

之前有一个同学提到了一个需求,就是需要在程序跑起来之后查看程序的调用情况,和一些参数变化,当然,如果 没有部署到生产环境中,我们可以用强大的Eclipse使用Debug模式进行单步调试。但是一旦部署到了生产环境中, 我们的强大的调试工具就失去了作用。 于是我们可以参考使用JVisualVM中的Btrace。当然本文章的大部分内容都有参考周志明的深入理解Java虚拟机 接下来的内容就是简单的介绍下Btrace的一个简单的示例。 当然,使用JVisualVM连接JVM的简单步骤我们就简单的跳过了。我们直接上程序例子。 首先是我们的Example代码。 代码很简单,之所以需要在执行之前加入scanner,只是因为我们需要为之后的Btrace嵌入做一个缓冲。然后可以 手动的形式启动我们的代码。 然后我们按下快捷键ctrl+F11,运行程序,然后就可以在JVisualVM中看到我们的程序了。就像这样: 然后右键点击他,然后就是点击Trace Application,然后就可以看到传说中的Btrace代码界面了。就可以看到这个: 需要注意的是,这边遵循的并不是我们常见的Java语法,所以需要注意的地方就是,我们写下的每一行代码都需要仔细的 检查,并且写之前需要读Btrace的文档。 于是乎,我们写下这样一段代码用来在调用到iot.mike.interview.btrace.BtraceExample的justDoIT方法的时候在Btrace的 控制台输出”调用函数”这四个汉字。我们只需要写下这样的一段代码就可以达到我们的效果。 这边出现在方法之上的注解,说明这个方法的调用位置,同时也包含了这个方法调用时的参数。 然后就是方法的内容了。这边没有什么好说的了。 点击控制版面上的start按钮,就可以泡一杯咖啡,然后静静的等待代码的替换。你会看到如下输出: 然后在我们的Eclipse终端输入一句话,激活程序,我们就可以在Btrace控制台看到输出了。 这样,我们就成功的在代码运行时动态的添加了调试代码。当然,如果这个技术仅仅用来调试,确实是有点大才小用的遗憾。说到这边, 有的同学应该也已经知道了,我想说的用途了。就是破解程序,使用Btrace跟踪程序的调用栈,然后精确定位,精确打击。 这边说个简单的例子, 就说我们刚刚的代码,假设有一个函数,是用来验证用户名的,且用户名是从加密的数据库中读取的,就像我 们的userid,于是,我们精确定位之后,我们直接打印出这个userid。 只需要在我们的Btrace代码里添加如下的一行代码: 然后重复上述步骤,分分钟就把用户的信息拿到了,然后通过CGlib,或者是Javassist,基于Javassist的例子可以看我的博客-Jar代码注入,然后进行类的替换,然后进行打包,就是一个破解了的程序。简单易学。 就是这样,Java永远都有好玩的东西等着我们。

蘑菇街之行

说来也巧合,在内推网上投了阿里的内推,然后很机缘巧合的接到了蘑菇街的面试电话。 第一面是IM部门的负责人的面试,所以主要的交流都是在消息机制一块,因为之前写过一个消息机制的框架,可以看我得GitHub-Omniscient(顺风耳)。 然后再阐述了自己对消息中间件的理解,基本都是集中在消息的处理和传递的过程。之后也谈了一些Java的基本问题,也是几次面试下来我被面试的最多的 一个问题,就是Java的内存模型,也就是HotSpot虚拟机的分代垃圾回收机制。聊完之后,就是一个简单的算法题,然后其中还穿插者Java的集合源代码。 比如HashMap的线程问题,和HashTable的区别,然后ConcurrentHashMap和HashTable的联系和区别。等等,总之回答的也就是基于源代码的,感觉还不错。 于是就这样,一面算是过了。后来知道蘑菇街的IM团队是用C++的,而不是Java。这个工程师就是-子烨。 大概一周之后,二面的电话来了。是负责商铺入住的团队leader的电话,叫阿润。也就是我现在的头。主要就是先介绍了一下他们小组的工作情况,然后就是 一些对我的简单了解,比如个人博客的动机,GitHub上的代码等等,然后最关心的问题就是实习的时间问题,后来也知道,他们希望我入职,而不是简单的实习。 问了这些之后就是简单的一些算法,我只记得是一个简单的字符串匹配,我第一个想的是正则表达,然后就是KMP了,但是,感觉也用不到KMP这种高端的算法。 然后,就是讨论了下简单的项目。毕竟是有专利的,感觉就是高大上。然后聊了加入通过面试,会去哪一个部门,他当时就说会去他的部门。然后就是约时间现 场面试了。 当时是周五,所以约面试的电话到周二才打过来。当时正好是清明,所以约到了下周三。于是开始了远征。 到了杭州,本来以为就是两面就可以得结果了,然后没想到会面四次。第一次是阿润和铁塔,二面是技术部的负责人和阿润,然后三面是HR,最后就是传说中的 创始人面试,面试我的是CFO,大饼。当然,我也是后来找资料的,不过确实感觉,蘑菇街的气氛很好。 第一面,阿润接了个电话出去了,然后就是我和铁塔一对一,主要聊的是Java NIO,但是这一块我才刚刚开始看,所以不是很熟悉,然后两个人沉默了一会,就开始 聊开了,我喜欢Netty,他也是,然后就开始扯Netty的源代码,还有Netty的性能,然后还问我除了Netty还有没有其他的NIO框架,我就说了MINA,然后两个人又开始 扯MINA,最后他也扯开了,说自己之前的经历,之前的坑跌的代码。然后也扯了HTML5。最后,愉快的结束了一面。当时感觉就不错。其中我还给他看了我得一些项目的 视频,他也感觉很有兴趣。 第二面就是阿润和技术部的负责人了。一开始就是一个下马威,我说我看过Tomcat的源代码,于是他们就说给他们科普下Tomcat,这正中我下怀。然后我就开始扯了, 从Tomcat的分类,Connector和Container开始,然后就是Host,Engine,Server,Wrapper等等,就是扯淡。然后过了一会,他就问,我得数据结构怎么样,我就说一般般, 然后他问HashMap的实现是怎样的,我就把JDK的HashMap源码说了一遍,然后他就笑了。然后就是一道算法题,但是不是要给一个解法,而是越多越好,于是我重压之下说 了五种,但是他们在结束之后又提出了一种- -。牛人毕竟牛人。可能是我的第五种解法他们觉的很创新,然后对我的印象比较好,然后他们又问了我其他公司的一些状态,我就如实说了,阿里到第二面,甲骨文技术面过了。 然后他们说了句,看来我们要抓紧啊,当时的感觉就是,应该没问题了。 第三面就是HR面,基本也没什么,就是聊聊家常,问问又没有女朋友啊,为什么填的紧急联系人不是爸妈是女友啊什么的。说来面试,怎么爱好特长只写足球和骑车。反正就 是很扯淡的东西。然后就是说等等有四面。当时还不知道,他说是创始人面试。。我当时第一反应是陈琪,然后他说是大饼。。。当时还不知道是什么。。 第四面。传说中的创始人面试,主要就是之前的实习经历的描述,然后当中还给他讲述了逻辑回归算法,Mahout,Hadoop的计算模型,然后还有一些数据挖掘的东西,然后提到 了正在参加的天猫数据挖掘大赛,然后问我,希望去哪些公司,我说BAT,然后问最希望的,我说A,他说,A不好,T才好,但是在深圳,然后又说A的办事效率,半个月了,才让我到 电话二面,说蘑菇街要快很多。然后基本就知道自己应该进了。不过当时他就说,三天会给我结果。 于是,当天下午,我就接到了offer电话,HR还很好玩,先问我觉得怎么样,这想想也应该知道啊,没offer打个什么电话,打电话就是过了啊。。然后就是介绍了一下蘑菇街的 福利待遇。实习生都是一样的,外地学生提供5天酒店补贴。然后就是起花名了。本来自己的英文名是Mike,然后想叫麦客,发现被取了,于是想叫提莫。LOL懂得。 但是觉得女性化,于是就叫颜回的字了—“子渊”。希望自己也想颜回一样,成为高徒,而且不继承他早死的属性。 然后就是等阿里的结果了。希望快点出来。 附传说中的Offer:

Java的Callable和Future接口及Fork/Join模型

目前已经大三下了,马上就要准备实习了,所以也开始好好复习之前的一些内容了,对于Java中的callable和future之前也是有所了解,但是 因为项目的原因,一直都没有好好的系统的学习,所以这段时间,就将其他的事情放在一边,好好的准备面试了。 之前看过了Java中的集合框架,估计最近也要写一篇响应的博客好好复习以下。 那么,现在就开始好好的玩Callable了! 首先看一下Callable的一个最简单的示例,就是他~ 最明显的一点,我们可以发现最简单的一个和Runnable的区别,就是他的call方法(相当于run())是存在返回值的,这一点有什么好处呢。我得感触 的最深的一点就是可以异步的获取线程的值了,因为之前我常做的一件事情就是在某个线程中申请一个static变量,然后进行传值,但是不好的一 点就是线程的可见性,因为Java的内存模型的原因,线程中修改的值最先是在线程内部的内存中写入之后才会写入主内存中,这一点就需要添加volatile 关键字了,然后就是不好看的代码了。所以从这个角度上说这个改变还是很有必要的。 然后,我们可以使用Executor去调用,这边也需要详细说明一下Executor这个东西,因为这并不是Java与生俱来的一个特点,而是一个在Java5时引入 的一个神奇的东西,之前,在我没了解到这个东西之前,我是采用自己编写的线程池,不过也是一个简单的东西,就是使用几个Vector保存建立的线程 为什么使用Vector呢,很简单,当时考虑到并发的问题,就直接使用所有方法为同步的Vector了,所以效率么,呵呵了。 看下面的代码,详细说明了使用Exector调用Callable的过程: 这段代码的注释已经说明一切了。不过,这边出现了一个新的东西,那就是Future,为什么会有这个东西。我们就先看看JDK的注释是什么吧。 不愿意看英文的同学可以自行谷歌。我就说一个地方,就是调用他的get()方法是一个阻塞的。所以可以使用这个做一个生产者消费者模型。 再看看Future这个接口,我们就只看到这四个方法,他们分别是: 所以这个接口的主要作用就是给我们一个显示的线程状态的描述,并且可以显示的操作线程的一些动作,而不是之前的需要编写额外的代码。 说完了这个,我们就可以看看Java7带给我们的一些更加完善的并发机制,这些是我们之前需要编写大量代码才能实现的效果。 首先就是传说的work-stealing模型。 此图盗自并发编程网,望见谅。 这是一个很好玩的事情。简单的说就是,两个人写带码,一个人写完了,然后看到另外一个人的任务还没有做完,于是就帮他做。就是这个效果。 接下来就是一个更加传说化的Fork&Join框架,下面介绍一个演示的小DEMO。这是摘自Oracle官网的示例Counting Occurrences of a Word in Documents: 这个例子的基本模型就是下图所示: 由于代码长度较长,所以这边以链接的形式给出,希望阅读的同学可以点击GitHub-ForkAndJoin.java 运行这个代码之后,你就能很明显的了解到什么是传说中的Fork&Join了,他的思想说到底很像Map/Reduce,都是将很大的一个任务拆分成很小的一块, 最后进行合并。在这个例子中,他就对查找文件和查找文件夹进行了任务的切分,就是说,每次进行相应任务的时候并不是一个串行的过程,而是一个 并发的过程,这个编程模型的优势就在于,进行大规模的任务时,效率极大的提高。 下面是甲骨文官方提供的一个效率图: 我们可以看到在多核系统上的性能的提高。所以,我们应该对我们的业务进行进一步的切分,将其转为Fork&Join的模型,然后进行高效率的开发。 至此,本文结束。 PS:[参考网页] Oracle – Fork and Join: Java Can Excel at Painless Parallel Programming Too! 并发编程网 – work-stealing IBM –…