关于Emlog的代码高亮和Markdown增强插件

PS:如果需要下载,请访问EMLOG的论坛,插件在附件中,如果更新的话,大家可以在EMLOG的官方插件栏目中看到。 最近因为要准备写《Java的异步编程模型》这篇文章,所以要用到大部分的代码段。之前我用来描述代码的方式都是用图片的方式进行表达, 不过考虑到这篇文章的长度,所以最后决定采用代码高亮的文本编辑方式,而不是采用图片了,因为会比较长,所以最后找了几个代码高亮的 插件,不过按照我有点强迫症的情况,网上下的插件就有一个有用的,但是他的代码高亮的效果太差了,就像没有进过任何配置的Eclipse的 代码风格。 所以我就开始编写我自己的代码高亮插件,参考了GodSon的代码高亮插件,发现他采用的是SyntaxHighlighter这个代码高亮类库,所以 我决定也采用这个方式,代码大部分才采用的GodSon的代码,主要改进的方面是代码的配色上,之前的代码比较难看,如下图: 我修改之后就是这么一个效果了: 所以这个插件从技术上说没有什么值得可以说的地方。 之后这个也就是我最喜欢的插件了,也是花费我一个晚上加一个上午的时间的插件。在之前的Markdown Parser插件的基础上,添加了代码的自动上色。 也就是说,以后在编辑以下Markdown时,再也不用担心没有代码上色了!比如我们这样的代码: 他的展现效果就是下面这样的: public class Demo { public static void main(String[] args){ System.out.println(“Hello World”); } } 这是个很好玩的,因为 SyntaxHighlighter 并不支持自动检测代码种类,但是通过阅读 brush.js 这个文件,我们就能很清楚的了解到他的运行原理, 因为这个与本文的中心不相符了,就不再这边说了。以后有机会再写博客来详细说明。 我这边就用了一个投机取巧的办法,就是发现在PHP的代码里,发现他有其他的代码的所有的特性,比如说函数,然后我把其他编程语言的关键字都加到PHP里 然后用他来渲染所有的代码,发现效果还算不错。就先这么办了,等我想到比较好的办法,再继续更新。 如果想看插件的效果,你只要知道,这篇文章就是用这个插件进行编写的,就可以了。 哈哈,享受生活,享受代码。

关于Clash of Clans不下线脚本

Clash Of Clans俗称部落战争,AKA COC。不得不说这是一个非常好玩的游戏,也是我除愤怒的小鸟之后最喜欢玩的一个游戏。 好了,介绍了部落战争的背景,开始描述写这个脚本的原因,起因就是,作为一个七本,我需要抢黑水生王,然后好不容易打到8500+,然后被偷到了8000-,心痛啊。于是开始想怎么才能不下线,一开始的想法很简单,就是隔个几分钟手去摸一下屏幕。太二了。好歹是一个曾今写过3个月安卓的人。 于是,就开始了思考如何去写这个脚本,当然,这个过程中,不断穿插着脑残的手摸屏幕的行为。 正题开始 扯淡的话 写脚本之前,有如下问题需要解决: 使用何种手段模拟手指触碰动作。 间隔时间多少为宜,且不会造成误操作。 手机长时间运行游戏,散热问题如何解决。 如何保证玩家可以随时介入。 PS: 目前只想到这么几个 一开始,我准备的是物理方法,因为我们实验室有电机和轮胎,还有电容触控笔,所有最简单的办法就是在轮胎外围粘上触控笔,然后将手机放在笔下,随着轮胎的转动,笔会不停的触控屏幕,从而不掉线。 然后,上述几个问题得到解决,但是我最终还是没有采用这个办法。原因很简单,触控笔找不到了。当然,作为一个程序猿,这个解决方法太LOW了。 于是,仗着我残存的安卓功底,我想到了monkey还有monkeyrunner,两个神器。因为作为一个写安卓的人,了解这个是必须的,而且本文的目标读者是有一定编程基础的人,所以在运行前环境的搭建就不再啰嗦,同时,以下的操作均基于Ubuntu 12.04 x64版本,对于Windows系统,由于不熟悉,所以希望有人帮忙写一下Windows下的对应脚本。 前期准备 脚本所需的必要环境: Android SDK Bash Shell 然后,就很简单了,我们需要SDK,是为了使用谷歌提供的开发者工具,Shell则是录制脚本。 首先将手机打开调试模式,然后连上电脑,在终端中输入:adb get-state。一般而言,都会出现device字样。如果出现unknown就像爱这样: 就说明出问题了,解决的办法也很简单,依次输入: sudo adb kill-server sudo adb shell sudo adb start-server 即可,效果如下: 注意:由于使用了 sudo 所以最好 cd 到SDK的目录下去,不然找不到 adb 程序 然后就是很简单的事情了,先确定Clash of Clans的包名,这个如果有Eclipse开发工具的话,很容易的事情,点开device那栏,就能看到所有运行的程序的包名。如下图: PS:高亮的那栏即是COC 然后就是使用monkey的时候了。monkey中有一个功能就是能触发随机事件来进行压力测试,这一点我们就可以利用来对程序进行一些测试,但是,这也就可以让我们对一些程序做一些好玩的事情,比如说这个。 按照谷歌的官方文档,通过参数的堆积,我们可以对指定的包发送指定的事件,也就是说,我们可以用如下测试命令: adb shell…

LuCI编译文档

首先介绍以下LuCI项目,LuCI作为“FFLuCI”诞生于2008年3月份,目的是为OpenWrt固件从 Whiterussian 到 Kamikaze实现快速配置接口。Lua是一个小巧的脚本语言,很容易嵌入其它语言。轻量级 LUA语言的官方版本只包括一个精简的核心和最基本的库。这使得LUA体积小、启动速度快,从而适合嵌入在别的程序里。UCI是OpenWrt中为实现所有系统配置的一个统一接口,英文名Unified Configuration Interface,即统一配置接口。LuCI,即是这两个项目的合体,可以实现路由的网页配置界面。 当然,之前都是扯淡的。开始正题。 注意:以下所有操作基于原版Ubuntu12.04 x64系统 官方网站上有一个简单的安装介绍。就是这。 基本上按照他的方法就可以了。首先要保证你有GCC,Make。然后就是最重要的一点,要有Lua,并且必须是5.1版本! 然后就是最简单的SVN checkout。 运行如下命令: svn co http://svn.luci.subsignal.org/luci/branches/luci-0.10 或者用这个命令: svn co http://svn.luci.subsignal.org/luci/trunk 然后运行make runhttpd就好了。 当然,如果出现 make error 是正常的,不用惊慌。我这边遇到了两个问题。 是很常见的缺少curses.h这个头文件。 解决办法也是相当的无脑,安装curses库即可,即运行:sudo apt-get install libncurses5-dev就行了。 最重要的是下面,这个我之前也没有遇到过,就是:undefined reference to “crypt” 后来进过高人指点。就是这篇文章。找到了解决办法。就是修改makefile的依赖顺序。 主要修改有两个文件。 ontrib/uhttpd/uhttpd-src/Makefile 的第73行修改为: $(CC) -o uhttpd $(LDFLAGS) $(OBJ) $(LIB) modules/admin-full/Makefile 的第14行修改为: $(LINK) -o src/$(BWC_BIN) $(BWC_OBJ) $(BWC_LDFLAGS) libs/nixio/Makefile…

TODO-List项目介绍

写在开始 说到这个TODO-List,我对他的需求可以算的上是刚需,之前都是使用的Any.DO,这也是个很好的按卓上的软件,只是可惜电脑上没有对应的软件,或者说没有对应的网页。所以我就自己写了这么一个用来记录我的计划的Web应用。 主要的技术选择有这么几个限制: 由于我需要多平台兼容,最方便的就是使用Web应用。 由于我的租用的虚拟主机只提供PHP环境,所以只能使用PHP作为逻辑处理语言。 同时考虑到不同终端的屏幕分辨率不同,只能采用响应式的布局方式。 本来之前自己擅长的方向是Java服务器端技术,这个可以说的上是没有任何基础。所以代码不是很好,基本上都是现学现卖的。 接下来是项目的具体介绍: 效果图展示: 如果想更加直观的感受,请点击这个网址:http://mikecoder.github.io/ToDoList/ 这是一个简化版本,只提供了界面展示,后台功能没有能实现,主要是GITHUB Pages不支持PHP。 主界面图: 这边就是展示所有任务的地方,按照添加的顺序进行展示。 添加任务区域: 这就是添加任务的界面,需要注意的是,这边是支持HTML语法的。如果想在简述中添加回车,你需要添加的是<br>而不是回车。 平板上的显示效果: 针对不同的手机屏幕,网页会在一行里展示不同的任务数,这个例子中就是两个,而不是之前的四个。 安装步骤: 从GITHUB中clone到本地,执行如下命令: git clone https://github.com/MikeCoder/ToDoList.git 然后进入该目录: cd ToDoList 在MySQL中执行sql文件夹下的init.sql脚本。可以参照以下命令: mysql -uusername -ppassword to login your mysql server. source init.sql(with full path) to init your database. 最后按照你电脑的特定设置,修改config.php中的变量: vi config.php 主要是修改这三项,因为数据库名默认是todolist,如果你需要修改,则也需要在init.sql中进行相应的修改。 这是一个示例配置文件: 将他拷贝到你得网站根目录,然后打开浏览器访问http://localhost/todolist/,你就可以看到我们的ToDoList了。 Ubuntu下默认的网站根目录是:var/www,其他的Linux发行版类推。 Windows的话则需要具体看安装的文档了。 最后,祝愉快。

Java中数字的几个好玩的地方

开始 我们先从一个简单的例子开始: 你们可以大胆的猜测下结果。 相信很多人直接就已经没有了往下看得欲望。因为这道题目很简单,特别是还做了对比的输出。其中的道理也很简单,越界了。因为在给result赋值之前,后面执行的过程都是基于int的计算。所以最后的结果就是: 好了,简单的问题结束了。开始更加有趣的事情了。 传说中的Integer常量池 说到常量池,String的常量池应该是大家都比较熟悉的。毕竟作为公司的面试题目,大家都不会陌生。相信网上说到这个的也不会少,现在我们说的就是Integer的常量池。 也是先从代码开始。先看如下代码: 你们也可以猜猜这个的结果 其实也很好玩,想想看拆包和装包。就知道了。不过这边还是有几个好玩的地方,因为他的答案可能会超出你得理解。 举个例子,所谓的拆包装包只会在进行运算的地方进行。也就是说,在进行==操作的时候,并不是两个int在进行比较,而是两个Integer对象在进行比较。然后就可以按照String的理解进行答题了。 答案就是: 这么说,可能理解起来还是有点困难,但是,如果看到源代码,就能很好的理解了。下面是Integer的valueof()方法,因为在进行使用int值初始化的时候,将会使用到这个函数。 这边有一点说明: IntegerCache.high是127,IntegerCache.low是-128 然后,上面的几个例子就比较简单了,在进行Integer e = 128;的时候,其实是执行的Integer e = Integer.valueof(128);,也就不难理解为什么e和d是不一样的了。 操作符的乐趣 上面的例子说了==在进行包装类的判定的时候的处理方式,那我们是不是可以进行类推,看看>=和<=的行为? 还是一个例子: 看看这次的结果是什么 当然全是无限循环了。很简单,因为>=和<=进行的是值运算,也就是说,即使两边都是包装类,在进行运算的时候都会进行拆包。拆包了,大家就都是基本数据类型,也就没有什么对象的特点,所有的操作都是基于值来的。 传说中的Double,Long读半边 我们都知道,int是4个字节的,long,double是8个字节的。这当然是一个基本了。JVM对int的读写当然是原子操作了,这一点毫无疑问,但是,对long和double呢?我们就不知道了。我们不得不对JVM作出这样的假设,就是,他会先对前4个字节进行操作,然后再处理后4个字节。所以,在某些极端情况下,我们会遇到读出半边的情况,当然,这是极端情况下。一般也不会发生。如果你感到不放心,你大可以将你得long变量用AtomicLong替换。这样就能保证以上的情况绝对不会发生。 还有什么好玩的,之后再继续补充。

JMS阶段性总结

写在开头 从一开始接触JMS到现在已经有一个多月了,看完了《ActiveMQ In Action》还有《Java消息服务》这两本书,也有一点心得。 不过最近的一段时间是期中考试,所以很多的时间耽搁了。所以到现在才开始书写这篇文章。 首先一点,为什么要使用JMS 很多时候,我们的程序并不需要使用JMS,或者说消息机制并不需要使用到这个技术,常常使用方法的相互调用即可实现,但为什么需要使用JMS。其实很大程度上是为了追求水平的扩展。举个例子,如果一个服务,或者是一个业务,需要频繁的调用一段函数,而这个函数会形成阻塞,我们肯定会使用分布式的方法进行横向的扩展。 还有一个重要的原因就是解藕。之前,我们的业务系统都耦合在一个程序中,我们需要进行一定的解藕,重新基于消息进行架构,所以,我们采用了JMS。用来进行业务上的解藕。 简单的说,生产者只负责生产消息,并且将消息务必送达消息中间件,而消息中间件的作用就是进行消息的持久化,并且在客户端连接上来的情况下,保证消息的务必送达。并且对没有及时处理的消息进行提示,然后人工介入进行处理。 不过有一点,如果是为了在纯Java系统之间进行消息传递,则还可以使用RMI的方式。不一定要使用JMS。 还有一点,JMS之所以是一个接口的集合,而不是一个实现方法,我认为,前人一定是注重这样一种设计方式,而不是具体的实现,也就是说,学习JMS,更重要的是这中间的一系列的思想,而不仅仅是几个工具的使用。这也是我看JMS的原因。 之前的想法 在所谓的JMS系统开发中,我们常常会有一个需求,就是消息发送端需要了解客户端是否已经收到消息,来确保接下来的业务逻辑不会出现大的错误, 假设我们没有使用JMS协议,而是我们自己进行编写消息传递的消息协议,用来确保消息的传递。举一个最简单的例子,我们就可以模仿TCP/IP的 三次握手协议,在每次进行消息传递的时候进行握手操作,并且在之后进行一个放手协议。这样,我们的消息发送方就可以了解到目前业务的进展 情况,并且进入下一步的操作当中。 但是,这样还是会带来一个问题,就是当消息发送之后,客户端接受了,然后进行处理,此时, 网络断了,死机了,怎么办?简单的办法,做一个 超时检测,如果在一定时间没有回复,则认为发送失败。于是进行重发。可行。但是又有一个新的问题,如果一个消息有大概三个操作,客户端在 完成一个操作之后,断开连接,然后新的消息传递到,又需要进行第一步操作,发现是已经完成的,然后常见的程序写法会认为任务已经做完,然后 返回,但实际上这个任务是没有完成的。所以为了避免这种情况,我们可以对消息的运行状况进行一个约定,比如完成第一步,就返回MessageID+StepID。 完美,这样消息就能高效的进行处理了。 但是,转念一想,这不就是把业务逻辑绑定到了消息传递中了吗,我们为什么要引入消息传递,很大程度上就是进行解藕,但是看看这个所谓的消息机制完全的就是之前程序的分布式版本,没有一点解藕的迹象。所以这个方法必定是失败的。因为他没有将消息传递的结构性功能发挥出来。 保证消息传送 这可能是JMS最精彩的一点,也是我最关心的地方。在此,我们需要对JMS进行消息传递的过程进行一个梳理。 消息提供者故障 – 消息生产者在生产消息的过程中没有能够将消息发送给消息中间件。 消息消费者故障 – 消息消费者在消费消息的时候并没有返回接受成功,然后崩溃。 消息中间件故障 – 消息中间件直接跪了,消息都没有发送出去。 这上面的情况都是我们在进行消息模型建立的时候经常会遇到,或者说是要进行考虑的问题。 之后将会是JMS协议使用的一些措施。 第一个就是让消息有协议,就是在我们进行系统设计的时候,如何设计我们的确认机制。简单的说,是不是在消费者接受之后立刻返回,抑或是在消费者进行消息消费之后进行返回。这一点上,JMS提供了三种建议。也可以说是一个设置参数,即: AUTO_ACKNOWLEDGE DUPS_OK_ACKNOWLEDGE CLINET_ACKNOWLEDGE 对于第一种,我们可以在下图中得到一个详细的了解,这也是我们最常使用的一个参数,或者说是方法。 将中间的NetWork视为JMS中间件 这个方法将消息的传递分为两个接受独立的行为,即发送给中间件和客户端。这可能是最常用的方式。简单易懂。最重要的就是,”一次而且是仅仅一次”发送。 第二个参数,则给予我们更大的权限,也就是允许重复发送消息。即,如果在实现仅仅一次发送的时候,会产生很大的开销,且,需求可以接受重复的消息,则可以采用这个参数 第三个参数,即是让我们自己定义何时返回ACK,只需要在我们认为需要返回的地方加上message.acknowledge(),即可。这给与了我们充分的自由。 当然,我们还可以使用JMS的事务性特点,这一点,之后会有一篇博文进行介绍。 只要了解了这些思想。即使我们不使用标准的JMS,也可以实现很好的消息框架。比如淘宝的MetaQ和Notify。 New In JMS2.0 异步发送模式 —— 传统的同步模式会导致阻塞,直到收到服务器的应答。与之不同的是,异步模式会直接返回而不会阻塞。一旦收到应答,会调用一个异步回调。新的JMSProducer和遗留版本中对应的MessageProducer都支持异步模式。 延迟消息交付 ——…