CoffeeScript 像写诗一样写程序

昨天在编译ABPlayerHTML5的时候无意间发现了CoffeeScript这语言,以前虽然有过听说,但是都不屑的无视掉了这门语言。昨天在我看到这门语言的时候深深的被它吸引了,这种触动就和我第一次接触jQuery的时候一样,这给开发者的体验简直能用“感动”这个词来描述。

CoffeeScript是一种脚本语言没错,但是它还是需要编译的。它拥有一个javascript写的编译器用来把CoffeeScript编译到JavaScript。你可以在你的浏览器里面进行CoffeeScript的编译,但是更常见的做法是通过node.js来编译你的CoffeeScript。在node.js安装你的CoffeeScript是非常简单的一件事情:CoffeeScript已经可以直接通过npm获得你只需要下面一条指令就能获得最新稳定版的CoffeeScript

sudo npm install -g coffee-script

CoffeeScript里面你不需要特别的定义变量,一切变量的作用域都会自动的在最小的范围内。不像JavaScript,一切不声明var的变量都是全局变量。CoffeeScript会自动的声明变量。
# 赋值:
number   = 42
opposite = true

# 条件:
number = -42 if opposite

# 函数:
square = (x) -> x * x

# 数组:
list = [1, 2, 3, 4, 5]

# 对象:
math =
  root:   Math.sqrt
  square: square
  cube:   (x) -> x * square x

# Splats:
race = (winner, runners...) ->
  print winner, runners

# 存在性:
alert "I knew it!" if elvis?

# 数组 推导(comprehensions):
cubes = (math.cube num for num in list)

上面的这一段CoffeeScript编译之后就会变成下面的代码

var cubes, list, math, num, number, opposite, race, square,
  __slice = [].slice;

number = 42;

opposite = true;

if (opposite) {
  number = -42;
}

square = function(x) {
  return x * x;
};

list = [1, 2, 3, 4, 5];

math = {
  root: Math.sqrt,
  square: square,
  cube: function(x) {
    return x * square(x);
  }
};

race = function() {
  var runners, winner;
  winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
  return print(winner, runners);
};

if (typeof elvis !== "undefined" && elvis !== null) {
  alert("I knew it!");
}

cubes = (function() {
  var _i, _len, _results;
  _results = [];
  for (_i = 0, _len = list.length; _i < _len; _i++) {
    num = list[_i];
    _results.push(math.cube(num));
  }
  return _results;
})();

CoffeeScript吸引人的特性除了这一点还有好多,比如CoffeeScript提供了类以及继承

class Animal
  constructor: (@name) ->

  move: (meters) ->
    alert @name + " moved #{meters}m."

class Snake extends Animal
  move: ->
    alert "Slithering..."
    super 5

class Horse extends Animal
  move: ->
    alert "Galloping..."
    super 45

sam = new Snake "Sammy the Python"
tom = new Horse "Tommy the Palomino"

sam.move()
tom.move()

编译之后的代码如下

var Animal, Horse, Snake, sam, tom,
  __hasProp = {}.hasOwnProperty,
  __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

Animal = (function() {
  function Animal(name) {
    this.name = name;
  }

  Animal.prototype.move = function(meters) {
    return alert(this.name + (" moved " + meters + "m."));
  };

  return Animal;

})();

Snake = (function(_super) {
  __extends(Snake, _super);

  function Snake() {
    return Snake.__super__.constructor.apply(this, arguments);
  }

  Snake.prototype.move = function() {
    alert("Slithering...");
    return Snake.__super__.move.call(this, 5);
  };

  return Snake;

})(Animal);

Horse = (function(_super) {
  __extends(Horse, _super);

  function Horse() {
    return Horse.__super__.constructor.apply(this, arguments);
  }

  Horse.prototype.move = function() {
    alert("Galloping...");
    return Horse.__super__.move.call(this, 45);
  };

  return Horse;

})(Animal);

sam = new Snake("Sammy the Python");

tom = new Horse("Tommy the Palomino");

sam.move();

tom.move();

CoffeeScript的函数绑定功能也是非常的方便

Account = (customer, cart) ->
  @customer = customer
  @cart = cart

  $('.shopping_cart').bind 'click', (event) =>
    @customer.purchase @cart

编译之后的代码是这样的

var Account;

Account = function(customer, cart) {
  this.customer = customer;
  this.cart = cart;
  return $('.shopping_cart').bind('click', (function(_this) {
    return function(event) {
      return _this.customer.purchase(_this.cart);
    };
  })(this));
};

更多的资料可以参考 http://coffee-script.org/

ABPlayer的正确编译姿势

jabbany 大牛的ABPlayer在ACG技术宅中听过的比例应该很高,这是一个基于flex的弹幕播放器,支持高级弹幕以及新浪以及土豆的解析。但是由于项目由于很久没有更新了(作者去弄它的HTML5版了),所以现在好多小伙伴表示在flex 4.6下面编译不过去,我就来说说正确的编译姿势


 

flex 4.6之后添加了自带的JSON支持,所以项目里面的JSON库就会和SDK自带的JSON库发生冲突。解决方法也很简单:移除掉org.kanoha.util.CommentListParser里面的JSON的import,然后更换Json的构造方法为 JSON.parse(text);

解决方案已经pull到ABPlayer项目里面。不过mini-player分支没有修改,只修改了master分支

硕鼠移动端解析api

其实刚开始让我破解的时候我是拒绝的……因为你不能让我破解我就破解,至少你应该让我试一下……我不想你说我破解的时候加了很多特效,说我破解有多厉害,视频能直接可以解析,还不需要验证码等等……出来之后同学一定会骂我,根本没有这么厉害的黑客,证明上面那个是假的……后来我知道他们破解是有计划有可能的,那么试了一下以后,觉得还不错……我自己现在还每天都用这个api,还介绍给你一起用,来来来,大家一起来破解。


好了,不闹了。本身是不想去破解的。无奈看到硕鼠的奋斗网络公司说不和个人开发者合作那么没办法,只能顺手破解掉了。好东西光自己用是不可以的。要大家一起分享。

破解过程很简单,一个抓包外加一个反编译。硕鼠的移动端还没有混淆(不知道是不是故意没有混淆方便我们调用)。总之就是很简单的过程吧。

下面是接口
http://m.flvcd.com/parse.php?url=你需要的url

但是这个接口的结果是加密过的。加密方式是循环异或加密。密钥长度256。密钥通过反编译获得,随手写了一个c程序转换密钥。

3f79d43656bc720f6c5e4df1592eaf048e45a8b1e65b32eddb261bb00720c07fd71bcfa7032a341d567a06dd92ffc72934f3b70a30315c7543482d795dc165a6496ce3a5072e925500514353714309c7749ae60f5cf2a55a38b41201395fff5343ac3475a35674c6789046a885d3860a2627f6c48e5d1f19018887bed84abb5365aa6b79fa6d326fdf3e1bc1df013451536dc57a0bc7b5223a26b58d3ed2078ec4ec37049592c267eb2838c292a5c035bb7ba942bd395b4a520d0e6db394e4b267abdbd1dfdf619966a0b28c39375b1450beaeb3b227c1130cfe5de041e75968cd9a4cbcaaa67927ad8a9a6e71fde934b9f0eb489daa88f0027248ce3849c875

解析出的结果是xml

 

 

ubuntu下android开发环境搭建

前一段时间系统出了一些问题,于是现在在折腾系统。这里我就介绍一下如何在ubuntu中搭建Android开发以及真机调试环境。

我这里的操作系统是ubuntu 14.10 64位中文桌面版。如果你的操作系统是其他的linux发行版,环境配置的操作可能差不多。如果你在中国大陆,请保证自己有能力访问完整的google网络。

第一步:你应该去android官网下载最新的android studio。Google已经为你做了很多的准备。这里主要需要的是Android SDK。我推荐你使用Idea。不过我这里准备了Idea以及Eclipse。

第二步:准备你的Java环境。由于我比较懒,所以我就直接sudo apt-get install eclipse。所有(应该是绝大多数)的必要的包已经都被获取回来了。eclipse里面安装ADB插件也是必须的、

第三步:配置你的Android SDK。通过你的IDE直接启动Android SDK Manager。下载你需要的版本的Android的Build-tools、Document、SDK Platform、Samples、Google API、Source(为了精简,我是没有下载image。反正我是真机调试)。当然了,公共的SDK Tools以及Platform-tools也是必要的。

在这一步完成的时候理论上你已经可以开发Android应用了。但是由于这里的是Ubuntu 14.10,一个依赖项已经在被移除了,所以还必须手动获得这个依赖项。否则你会无法编译R.java。下面是获取方法:

sudo apt-get install libc6:i386
sudo -i
cd /etc/apt/sources.list.d
echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse" >ia32-libs-raring.list
apt-get update
apt-get install ia32-libs
rm /etc/apt/sources.list.d/ia32-libs-raring.list
apt-get update
exit
sudo apt-get install gcc-multilib

以上方法来自http://stackoverflow.com/questions/8008169/how-to-resolve-error-executing-aapt-in-android-eclipse 。


现在你应该完成了Android开发环境的搭建了。你需要的是搭建调试环境。

如果你要通过USB调试连接你的Android设备,请看这里:

对于Linux操作系统你没必要安装驱动就能够通过USB连接你的Android设备。但是很不辛的是你需要自己配置你的设备。

第一步:通过lsusb命令找到你的Android设备的id

第二步:编辑你的udev规则。

首先你应该在root权限下在/etc/udev/rules.d/创建你的规则。为了简单这里使用gedit了。当然如果你使用vi编辑器也是可以的。

sudo gedit /etc/udev/rules.d/51-android.rules

在gedit里面输入

SUBSYSTEM==”usb”, ATTR{idVendor}==”0bb4″, MODE=”0666″

注意,这里0bb4就是你的lsusb获得的设备id。我这里0bb4代表了HTC设备(实际上我是台电的平板……)

然后给你创建的文件设置权限:

sudo chmod a+rx /etc/udev/rules.d/51-android.rules

权限设置完事重新引导你的系统就好。当然了,还是有不重新引导的方式,但是我这里还是一个懒字。

重新启动系统之后直接进入终端,sudo adb devices 命令应该可以看到你的设备了。

进入你的IDE你就可以开始你的开发了。但是如果你很不幸的发现你的设备无法在IDE里面被识别(就像我)你就应该考虑通过网络调试你的程序。


这里介绍一下如何通过网络调试你的Android设备。请注意这样是有风险的。因为包括GSM网络都能进行调试。黑客可能会轻易的攻击进入你的设备。(这只是Google给的警告啦,哪来的那么多黑客,尤其是在中国……)

第一步:在你的Android设备上开启网络调试。如果你的设备并没有直接提供这个选项请执行下面的命令:

setprop service.adb.tcp.port 5555
stop adbd
start adbd

请注意这里的端口号最好换成其他自定义的端口号。否则还是有比较高的风险的。

第二步:设置你的ubuntu上的adb。你需要执行类似下面的命令来连接你的设备:

sudo adb connect 192.168.0.107:5555

执行完事之后你应该就可以成功连接你的Android设备进行调试了。至此你的Android开发环境已经完全在Ubuntu上面搭建完成。

 

visual studio 2015上手初体验

微软发布visual studio 2015预览版已经一段时间了,由于微软声称的能够利用c#开发Android以及iOS应用很吸引人,于是我就下载了一个预览版回来玩玩,看看效果如何。

由于VS2015还是VS,所以避免不了的继承了一个很大的特点,就是——大。安装本体需要15G的空闲磁盘空间,如果要开发移动设备的应用的话还需要额外的5G空间。只安装了这些还不够,在创建应用的时候还会需要安装几百兆的东西。

VS2015比起前几代有一个改进就是启动速度变快了。(虽然消耗的资源还是那么多

E}UO513{DPGK49H~R5OE9LO

 

全部安装完成,启动之后能够看到这样的界面(图片比较小,点击图片放大)。看上去还是能够创建一些基本的Android应用的。但是你错了,你一定想不到雄心壮志的微软脑子里面有什么样的洞:在VS里面通过C#创建Android应用需要Xamarin商业许可证 ,如果你不愿意出那可怜的美刀的话,对不起,你不能在VS里面通过C#创建Android应用。

为什么说微软脑子有洞呢:因为VS里面Xamarin插件只是Xamarin的一个外壳,而Xamarin Studio可以使用一般免费许可证直接用C#创建应用。

Xamarin Studio

 

不管怎样讲,微软的C#开发其他平台应用这里做的非常让人感到失望。至于传说中的能够跨平台的.net也是没有能够体会到的(应该讲还是没有开发出来。新版的.net也没有什么和旧版的明显的不同

 

总而言之,微软的vs2015用起来非常让人失望

 

 

 

asm.js简介

虽然俺asm.js出来好久了,但是国内的网络上对于asm.js的介绍还是非常少。这里我简单的介绍一下asm.js

众所周知,相当多的应用程序是通过c语言或者c++语言编写的、运行在本机的,然而未来的应用很可能是javascript编写的、运行在浏览器的程序。如何在最小成本下把本地的应用程序移植到网页端就是研究的一个问题——这也就是asm.js出现的目的。

asm.js并不是一个js库,就像是node.js并不是一个js库一样。asm.js更像是一个编程的标准,用来赋予javascript一些原本并不具有的c++等语言的特性。javascript是一门弱类型语言,它的变量并不用特意声明类型就可以使用。asm.js就规定了一些巧妙的方案来解决它。

基于asm.js的应用程序的通常的构架是这样的:

  1. C或者C++代码
  2. Clang:c语言本身的运行库
  3. Emscripten :一个用来把C语言编译成JS和字节码的软件
  4. LLVM:一种字节码
  5. Asm.js
  6. 本地代码

经过测试这样的应用速度差不多是本地应用的0.5倍,损失并不是很大。但是对于节约开发成本来讲是很重要的。

 

本次就写这些吧,下回写一写有关环境配置的

在不支持php_mail的空间上通过wordpress发送邮件

线性代数考试完事了。不管死的多么惨烈,总之先写上前一段时间配置服务器遇到的问题。


由于本人是屌丝一只,没有大量金钱来投入在这个博客上,所以本人就选择了一个便宜的空间作为我的博客。可是这个空间无法执行php_mail。由于本人想要加上评论订阅等功能,所以需要让wordpress发送邮件。研究了一段时间终于找到了来问题的解决方案。

wordpress其实也可以在smtp协议发送邮件,但是你需要一个插件。我这里选择的是“WP Mail Bank”。当然了,你可以根据你的需求来安装你需要的插件。安装完插件之后进入插件设置。为了发送邮件你必须有一个smtp服务器。这个smtp服务器可以是国内外任意的主流邮箱。这些邮箱基本都支持SMTP服务。这里以QQ邮箱为例

  • From Email这里填写你的QQ邮箱(如果写别的可能会有安全性警告)
  • Mailer Type : 选择SMTP
  • SMTP Host : 填写:smtp.qq.com
  • SMTP Port:填写465
  • Encryption:选择Use SSL Encryption
  • Authentication:选择:Use SMTP Authentication
  • SMTP Username:你的QQ邮箱
  • SMTP Password:你的邮箱密码

其他的选项随便填写。这样设置完成之后wordpress就能够发送邮件了

 

.net开源,迟到的微软真的能赢得市场么

本来在google+打发时间的时候突然看到了一条震惊的新闻:在大约16小时之前,也就是赛塔罗刚刚在彗星上种上“韭菜”的时候,微软的.net基金会宣布.net core开源,并且未来将会在三种操作系统提供.net运行环境的支持。微软未来还会提供vs2013的社区版。.net的开源是遵守Apache 2或者MIT协议

微软的原始文章在这里 我就不翻译了。.net的项目主页在这里:https://github.com/Microsoft/dotnet

.net的开源以及支持多种平台意味着600多万的.net开发人员将会可以脱离windows操作系统进行开发。这可能将会挽救c#语言下滑的趋势但是绝大多数网友表示微软开源的.net太晚了,市场早就被java等抢占干净了,绝大多数java程序员不可能因为可以在linux上运行.net而转行去写.net。

在公众视野里面,微软一直是一个高高在上的土财主的形象:一点代码都不愿意公开。其实微软已经公开了相当多的代码,只不过是公布的代码并不能给大多数程序员带来实际的好处而已。微软公开了几乎完整的NT内核(但是仅限在校学生使用),而对于不搞驱动开发的开发者来说这个开源完全没有任何意义。微软公开了WinJS,但是由于来的太晚了,几乎没有开发者愿意转行去搞WinJS的开发。这一次微软第一次的公开了这么有影响力的项目,.net开发者必然是相当兴奋的,毕竟他们不用去使用其他的工具就能开发其他环境的程序了。

但是不得不说的是这次的开源对于Java阵营必然是很大的冲击,尤其是GUI程序的开发上。Java开发者一直很头疼的一件事情就是如何才能创建出一个漂亮的GUI(Minecraft启动器就是活生生的例子)。微软的.net在创建一个漂亮的GUI方面对于Java有着天生的压倒性的优势。

然而不幸的是微软来的太晚了,Java阵营已经抢占了太多的市场了。已经有太多东西基于Java字节码了。微软现在已经完成了在c#开发android或者ios应用。微软或许能够在移动市场抢占一定市场

至于PC市场c#可能会由于容易创建GUI应用程序而吸引一部分开发者,不过现在微软能够把.net在其他平台做成什么样子还不知道。目前还是需要谨慎观望。但是在PC市场上c#会有抬头的趋势是肯定的。

minecraft mod教程:实体3 召唤一个实体

一直在偷懒,从未被超越……教程该更新还是需要更新的


我们已经学会了如何注册一个实体了,我们今天来学习一下如何在世界中召唤一个你自己自定义的实体。

在学习召唤实体之前,我们必须复习(预习)一下有关Minecraft的世界的内容。现在的minecraft中主要有两种世界,一种是远程世界,另一种是本地的世界。minecraft的构架以前不是这样的,在以前单人游戏和多人游戏的代码是不一样的,后来显然mojang的开发者认识到他们当时的构架是多么的愚蠢于是他们统一了代码的实现:不管是单人游戏还是多人游戏都是有服务端和客户端,如果是单人游戏的话就启动一个本地的服务器来完成。显然这样的的特性给开发者们带来了不少的方便。

由于minecraft现在的构架,我们在开发mod的时候必须要区分世界到底是远程的还是本地的。由于minecraft的世界的同步机制,本地世界的数据会在特定时刻和远程的服务器的世界同步,所以,一切的关键的代码必须要在服务端实现。在客户端实现的许多东西都不会有效果。具体的参考一下szszss的minecraft mod开发教程。

所以,我们想要召唤一个实体的话我们需要在世界的远端实现。为了方便起见我们就需要类似下面的代码

if(!world.isRemote)
{
Entity entity = new Entity(world, x, y, z, player);
world.spawnEntityInWorld(entity);
}

通过上面的代码你就可以比较轻松地生成一个实体。有关实体的更多内容还是以后更新好了(坚持每次只写一点,慢慢更新精品教程吧

minecraft mod教程:实体2-自定义一个基本的实体

上一节我们已经了解了一些有关minecraft实体的基本的知识。这一节我们就把学到的知识来使用一下,让我们创建一个没用的实体吧。(这节内容这么少的原因就不要说明了吧,没错,就是我在偷懒wwww


这一节我们不会涉及复杂的服务器和客户端同步的问题,那种问题想要解释起来实在是太过于复杂。所以我们就先注册一个我们的实体并且让它可以被指令召唤出来就好。

实体的原型是net.minecraft.entity.Entiry你只需要传递一个Entity类本身到EntityRegistry.registerModEntity就可以了。注册Entity并不是一件像注册方块一样的事情。在Minecraft里面,一个方块或者物品的实例代表的是一类物品或者方块。而一个实体的实例就是一个实体。如果你不注册实体,你将会无法再服务器和客户端之间传递实体信息。

下面是组册实体的函数原型:

public static void registerModEntity(Class<? extends Entity> entityClass, String entityName, int id, Object mod, int trackingRange, int updateFrequency, boolean sendsVelocityUpdates)

  • entityClass:实体的类
  • entityName:实体的名称
  • id:一个mod指定的id。(这个是随便指定的)
  • mod:你的mod的主mod的对象。一般来讲,如果你在mod类里面注册的话,你只需要传递一个this指针
  • trackingRange:一个被加载的距离。如果实体的距离超过了这个值,mod将不会收到实体的活动的消息。
  • updateFrequency:更新频率,单位是tick。可以参考上面那个参数。
  • sendsVelocityUpdates:是否发送同步数据

通过这个函数你可以轻松地注册一个实体。其实还有其他的注册方法可以直接包含刷怪蛋一起注册。但是,由于它有引发id冲突的可能性,现在就不介绍了。


 

先写这么多吧。感觉以后每回些少点,但是精一点比较好呢