关于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标准并没有提供这样一种通信方式 ,但是,我们可以通过其他的途径去实现这个效果,这个 效果的应用场景还是比较多的。比如,服务器需要确保消息的准确无误的传输,就需要对传递的消息进行一个回应。这边,我们就是使用 两个消息队列实现这么一个神奇的东西。 主要的原理就是如图: 图片摘自点缀星辰…

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控制台看到输出了。…

蘑菇街之行

说来也巧合,在内推网上投了阿里的内推,然后很机缘巧合的接到了蘑菇街的面试电话。 第一面是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,这正中我下怀。然后我就开始扯了,…

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模型。 此图盗自并发编程网,望见谅。…