免费且支持 218 种格式的全能格式转换工具,这款神器你值得收藏

在线工具拥有无需下载、即点即用的优势,所以我们常会借助在线工具进行临时的格式转换工作。但大部分的格式转换工具仅支持少量格式,像支持图片转换的工具,就未必支持视频或文档的转换。如果你正在寻找一个支持齐全的文件格式的转换工具,不想每次再去寻找单独类型的转换工具,那么不妨试试今天推荐的 CloudConvert。

CloudConvert 最引以为豪的就是它支持 218 种文件格式的转换。无论是压缩文件、音视频文件还是文档、网页,CloudConvert 都能帮你完成转换。你可以在 这里 查看 CloudConvert 完整的格式支持列表。

免费且支持 218 种格式的全能格式转换工具,这款神器你值得收藏

支持的文件类别

Continue reading “免费且支持 218 种格式的全能格式转换工具,这款神器你值得收藏”

为自己的WordPress博客创建一个Favicon

favicon是favorites icon的简称。当用户需要将某个网站或网页加为书签时,该网站/网页显示的图标就被叫做favicon。Web浏览器在URL地址栏、各种表格等地方利用不同的网站图标(favicon)来标识不同网站。

favicon是一个16×16像素的图片,通常被保存为favicon.ico存储在服务器的根目录下。用户可以在允许访问根目录的web服务器上为WordPress博客使用favicon。

设计一个Favicon

利用能够将图片保存为.ico类型的图片程序(如The GIMP),可以快速创建favicon图标。也可以通过一些在线服务免费创建favicon。

所选图片应画质清晰且符合博客形象或内容,博客图标虽小,却肩负着重大使命。

为favicon准备图片:

1. 剪裁/添加图片周边区域,使图片成为一个方形

2. 将图片调整成16×16像素大小

3. 将图片保存为favicon.ico

favicon.co.uk等网站上创建favicon图标时,请根据网站的操作说明进行操作。然后将favicon.ico图片下载到本地计算机。

在WordPress博客上安装Favicon图标

如果当前主题的主文件夹中已经有一个favicon.ico文件,请先用FTP客户端删除该文件。

1. 用FTP客户端将新favicon.ico文件上传到当前主题的主文件夹

2. 将favicon.ico文件的复本上传到博客主目录下(如http://example.com/favicon.ico)。本操作使favicon图标显示在该博客订阅者的订阅器中。

要使自己的favicon图标在旧式浏览器中也能正常显示,还需要编辑页面页头信息。

1. 进入WordPress管理面板

2. 点击外观菜单

3. 选择外观菜单下的编辑选项

4. 点击头部或header.ph文件以编辑该文件

5. 查找以 <link rel=”shortcut icon” 开始、以 /favicon.ico” />结尾的代码行。在<head>HTML标签下添加以下代码:

<link rel="shortcut icon" href="<?php bloginfo('template_directory'); ?>/favicon.ico" />

6. 保存所做更改。

清除WordPress缓存以及浏览器缓存,重启浏览器以显示新图标。

[http://www.wordpress.la/codex-%E4%B8%BA%E8%87%AA%E5%B7%B1%E7%9A%84WordPress%E5%8D%9A%E5%AE%A2%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAFavicon.html]

PS, 推荐两个在线图片格式转换器:

http://tu.poptool.net/zh.aspx

http://converticon.com/

[图]敢偷用我的Wi-Fi? 看我怎么治你

我的邻居正在盗用我的WiFi,唔,对此我可以直接选择加密口令,或者…作为一名极客我也可以耍耍他。那么,我就从划分网络开始吧。我把网络划分成两部分,受信任部分和非受信任部分。受信任部分组成一个子网,而非受信任的部分组成另一个不同的子网。我通过DHCP服务器来辨识MAC地址,以此得到相关的地址信息。下面就是我的/etc/dhcpd.conf配置文件。

划分网络

dhcpd

Iptables太好玩了!

嗯,接下来我用iptables工具来对流量做些手脚。我是这么干的:

/sbin/iptables –A PREROUTING –s 192.168.0.0/255.255.255.0 –p tcp –j DNAT –to-destination 64.111.96.38

噢,突然所有东西都变成小猫咪了!对于那些缺乏经验的新手,现在他们所有的流量都会重定向到http://www.kittenwar.com/去,小猫咪可爱吗?

还不够,我想玩的更爽一些。我继续设定iptables规则,让所有流量转发到我的一台运行有squid代理程序的本地计算机上,端口设为80。

/sbin/iptables –A PREROUTING –s 192.168.0.0/255.255.255.0 –p tcp –m tcp –dport 80 –j DNAT –to-destination 192.168.0.1

这台本地机器上运行有squid,其中带有一个小的重定向功能,可以自动下载图片,然后通过mogrify(一个图片修改程序)将图片弄成上下颠倒,再输出到本地的Web服务器上。

下面就是我的重定向脚本代码,这是个小的perl程序:

perl_script

好了,大功告成!现在浏览网页时会变成下面这样:

shot1

再来一张,:D

shot3

如果你修改一下上面的代码,将-flip替换为-blur 4,那么你的图片就会有模糊效果。

shot5

这些人不会以为他们的电脑坏了吧?:D

对此,我甚至做了一副漫画,很酷吧?

1337_part_1

之后我收到了一封邮件,噢,是kittenwar网站的人发给我的,他是这么说的:

Hi Pete,

抱歉没跟你打招呼就给你发了这封邮件,但是,我想告诉你的是,对于你把图片弄的上下颠倒以此来捉弄那些偷用WiFi的人,这个点子真是太赞了。

我 常常会收到措辞语气极为愤怒的邮件,这些人说我的网站kittenwar在玩弄一些邪恶的病毒,阻止他们正常浏览网页,他们控告我不要再搞这些黑暗的法术 了。对这些人我只会有礼貌的回复到:对此我真的很不好意思,但这种情况只会发生在您盗用别人的WiFi连接时才会出现。过去几年里这种事情发生了数十次, 但是你知道吗?当我指出他们盗用WiFi的事实之后,就再也没有收到回复了。

文/极客范

[http://www.cnbeta.com/articles/240016.htm]

真新鲜!用浏览器查看787航班3D飞行状态

美国波音公司(Boing)的787型客机曾因年初曝出的锂电池过热自燃隐患而在名誉上蒙受损失,虽然目前这一故障已经在波音及合作伙伴的努力下顺利解决,但仍有很多旅客对这型飞机的安全性抱有疑问。

近日,为了挽回787客机在人们心中的良好印象,波音公司特意推出了网页版的航班追踪服务。通过这项体验服务,人们便可以全面了解全球任何一架787客机的当前状态,包括飞机隶属的航空公司名称、所执行的航班号、起飞及降落机场名称等。

同时,如果用户希望获得更加丰富的体验,那么也可以通过为浏览器安装Google Earth插件来以3D画面的形式进行查看,插件提供了360度机舱外视角、乘客视角和Google Earth地图视角,同时还有拟真的引擎、座舱声效。

如果你是一名航空爱好者或是此时此刻正有亲友乘坐改型飞机出行的话,那么就可以前往这个网址进行围观:http://flighttracker.newairplane.com/

真新鲜!用浏览器查看787航班3D飞行状态

服务首页列出了目前正在执行飞行任务的787航班信息

真新鲜!用浏览器查看787航班3D飞行状态

通过安装Google Earth浏览器插件来查看3D飞行状态

真新鲜!用浏览器查看787航班3D飞行状态

787航班飞行数据初始化

真新鲜!用浏览器查看787航班3D飞行状态

使用舱外360度视角查看正在飞行中的一架埃塞俄比亚航空公司的787航班

真新鲜!用浏览器查看787航班3D飞行状态

座舱视角

真新鲜!用浏览器查看787航班3D飞行状态

Google Earth地图视角

真新鲜!用浏览器查看787航班3D飞行状态

全球正在执行飞行任务的787航班

真新鲜!用浏览器查看787航班3D飞行状态

鼠标点击后会出现该航班的预览信息

真新鲜!用浏览器查看787航班3D飞行状态

位于太平洋上空靠近日本附近的一架美联航787客机,它的前面还有一架日本航空的787航班。

真新鲜!用浏览器查看787航班3D飞行状态

处于美联航航班前方的日本航空787客机

 

[http://www.cnbeta.com/articles/243016.htm]

关于 reCAPTCHA 验证码

验证码大家每天都会见到,可是你会想到当你每次不耐烦的输入一个单词的时候都为人类做出了一点贡献吗?验证码(CAPTCHA)或者叫做全自动区分计算机和人类的图灵测试(Completely Automated Public Turing test to tell Computers and Humans Apart),使我们上网的人每天都可以见到的,而它的作用除了防止垃圾注册或者评论以外还有别的吗?来自Google的reCAPTCHA(上图)告诉 我们,你其实还可以为人类做贡献。

 

国外很多下载站用到下面这种验证码,它其实是 Google 提供的 reCAPTCHA 服务(link),可以免费申请和使用。
关于 reCAPTCHA 验证码

Jimmy Liye 同学翻译了 Google reCAPTCHA 的部分说明(原文:放了这只验证码吧):

题外话:现在OCR的阅读效率实在是不高,下面这张图就可以说明问题。

关于 reCAPTCHA 验证码

它的情景是这样的,有一天,某台机器扫描了一本书,想把它转成电子版:
关于 reCAPTCHA 验证码

处理出来是这样子的:

The Hreckinridge’ and Lane Democrats, having taken courage at the recent eastern advises, are [xxxxxxxxxx] energetically for the campaign: Several prominent Democrats who at first favoredDonoLea, are coming out. for the other aide, apparently under the [xxxxxxxx] of Federal [xxxxxxxxx]. An address to the National Democracy of ,1ifornia, urging the party to supportHaeeslipslDas, has recently been published, which manifestlybss strengthened that aide of the [xxxxxxxxx]: It is signed by 65 Democrats, many of whom occupy respectab e and prominent positions in the party, 22 of them are Federal office-holders,[xxxxx] more are recipients of Federal patronage, and the others represent a mass of politicians giving the document [xxxx][xxxxxx] mTheDcu8las Democrats are also active The Irish and German vote will mostly go with ths# branch of the party, but it is[xxxxxxxxx] to [xxxxxxxx] [xxxxx] [xxxx] [xx] the stronger. Thus far 17 IT newspapers have declared for DonGres, 13 for Base$- IaaIDGS and 9 remain non-committal, with even chances of going either way. Under these circumstances the Republicans entertain not unjustifiable hopes that the Democratic divisions may be so equal,- ly balanced as to give the State [xx] LIaCOLV.Same very [xxxxxxx] Bell and Everett meetings have been held in different parts of the State, bat thus far that party does not exhibit much rank sad ale air en.

这个是原书质量比较差的:
关于 reCAPTCHA 验证码

看到这个,电脑就傻眼了,吐出来一堆这种东西:

‘ letz-1- rrk fit: 1′ . on its to Vc ,rt, cann into tlm yc H_ tcr,la, .n. ‘l l; , arc ti:( h of thc 1″,ats that to ltc rc: ,;. , I; ., l: rel!;n. tani., , ./olio, IJuteilu, . 1!’i./_ ;lr”n. Iiam! Jr.r. F’l,nr_.Z.._%i;;, ,, : rt-Irn: am/ tf.rri.:, t?m steamer as a tr nW r. Uu ,tin;t, c ac?1 1″,at firm/ a t;nn, accor.liu; to .t rn. ‘Cl.w r. wu ru lm:nui MistinW /y in u;th, -. ink ;:,k as to “what w ax 1111, :111(I vle:iR a of ;: (,am( into, mnr r-, tm if tlm wo r( uu.i n:’ of t?u : la?:Iv. \ ‘c : ol in thc , ucr:atic , , Tlau :; will h:aw tu-li.r \. ’1′Im yap?tts Il ,,n an,/ I, ,rr:l. r, (,t tf,is r:ity, start witli it, with lu:rtic: ol \ 1- e:l.k.

看得懂吗?反正我是看不懂。验证码的出现,就是为了改变这种情况的。这张图可以很好的解释它的工作原理:
关于 reCAPTCHA 验证码

1、我们首先扫描了一本有一大堆单词的书
2、我们找出不能被电脑识别的单词,这些单词有可能是不同的字体。当然了,损坏程度也与书籍年代以及扫描质量有关。
3、为了让这些验证码更安全,我们会让它更扭曲并且在上面加入横线。
4、一个验证码是有两个这样的单词组成的。

有了它的帮助,第二张图片上面的文字就会变得清楚多了(不过还是有一点小错误):

The New-York State yacht Squadron, on its annual cruise to Newport came into the harbor yesterday afternoon. The following are the names of the boats that came to anchor here: Jessie, gera loliv erelun Annie, Mannering, Julia, Bonita, Magic wut, Rambler, floumblie, Henrietta, Sea-Drift and Maria, with the steamer America as a tender. On anchoring each boat fired a gun, according to custom. The reports were heard distinctly in the city, causing considerable inquiry as to “what was up,” and quite a number of sanguine individuals came into our office to inquire if the guns were not annunciatory signals of the successful laying of the Atlantic Cable. We invariably replied in the negative. The squadron will leave to-day for Newport. The yachts Washington and buub r of this city, start with it, with parties of New Haven people.

有的人可能要问了,既然机器都看不明白那他怎么判断你输对了还是错了呢?我一开始也有这样的问题,Google是这样解释的:
两个验证码里面有一个是正确的,被人审核过的,而另一个是不正确的,机器读不出来的。当你把那个正确的输对以后我们就会默认另外一个也是对的,这样,你每输入一次验证码,就为人类的知识宝库里增加了一个单词。

了解和申请 reCAPTCHA :www.google.com/recaptcha

[http://www.cnbeta.com/articles/226498.htm]

识图查字体,再也不用担心找不到好看的字体了

经常看见别人海报上的字体超漂亮,自己也想拿来用用,却又不知道该字体的名字。问别人吧,别人也不一定知道。。。

急民众之所急,有位高手开发了一个在线工具,可以识别图片上的字体!

求字体网操作手法
1.上传图片(文件大小不超过1兆,格式仅限于jpg、png和bmp)
求字体网
2.图片被扫描后,输入最清晰的几个字(至少输入一个字),最后点击搜索字体
求字体网
3.字体出来了,效果很不错吧,以后求字体,再也不用求人了
求字体网

求字体网还可以识别中、英、日韩、俄、书法等多种类字体,还可以实时预览和下载字体

相关网址
官方网站:求字体网 | 来自猫头帮常任理事会

CodeGuard-网站免费备份服务

为了防止无良空间商突然跑路或数据莫名丢失,站长们虽然会时常自己备份,但时间长了,总会偷懒,比如我。。。

所以CodeGuard这个网站提供的备份服务不错。

虽然也有其它一些公司提供网站数据备份与灾难恢复服务,不过CodeGuard可能有些不同,因为他们采用的是差异备份方式。也就是说,CodeGuard并非简单地将网站所有的源码和数据库完全拷贝,而是先对两个版本进行比较,然后将版本间的差异存储起来。

这种方式可以最大限度地减少备份所需要空间,同时也能让站长很容易获悉网站代码和数据库中的所有变化。目前他们已经将后端基础设施升级到亚马逊 EC2和S3。

重点是他们把服务器搬到亚马逊了,这个不错哦~

ps:现在CodeGuard支持wordpress,Mysql,cPanel,Magento,Drupal,Joomla了~

CodeGuard

免费版的也有1GB的备份空间了

[http://maolihui.com/codeguard.html]

剑走偏锋的 Native Client

不知不觉,Google已经正式推出其Native Client (NaCl)过去约7个月之久。而目前国内似乎还没有多少关于NaCl的资料,所以在这里面向Web开发者做一下简单的介绍,希望能够起到一个抛砖引玉的效果。

本文的所有代码均来自于https://developers.google.com/native-client/devguide/tutorial,如果您对其中的任何技术细节存在疑问,请以原文为准。

何谓NaCl

NaCl是一项能让C/C++代码运行在浏览器当中的技术。这是一个最通俗的说法,但不够精确。严格来说,NaCl技术在理论上能够实现任何编译型语言都在其之上运行。

但是目前由于技术上的原因,NaCl还做不到任何语言任何平台的编译型语言支持。

因为NaCl所憧憬的实际是LLVM技术,LLVM技术的要点即在于能将编译型语言转化为一个统一的中间语言,NaCl通过对这个中间语言的执行,即可达成任何编译型语言的运行。换句话说,NaCl实际上希望搭建一个虚拟机。

不过LLVM现在还不够成熟,NaCl不得不先使用GNU的编译套件,使用LLVM技术的版本被称为了PNaCl,目前还没有正式推出。同时也因为这个原因,ARM架构没能正式支持。

为什么NaCl

在开发层面上,NaCl希望解决一个问题:JavaScript的低效率。当然,从经营策略上来说,Google可能还希望籍此将桌面领域的成熟软件快速移植到其Chrome OS当中,不过这不是我们讨论的重点。

JavaScript毕竟是一门解释型语言,只有当浏览器执行到代码的时刻才能够看到代码,因此在执行优化上力度非常小。

但是Web应用发展至今,效率已经必须拿到桌面上考虑,如果你还想在浏览器里面看到更多优质的游戏的话。

有关限制

  • 缺乏能够切合的IDE
  • 不支持硬件异常
  • 不支持创建子进程
  • 不支持原生TCP/UDP操作(但已提供了websocket支持)
  • 不支持同步I/O
  • 不支持内存剩余查询
  • 内联汇编代码必须通过NaCl验证
  • NaCl的Pepper API必须通过主线程使用

如何使用

上面那些对于行动主义来说其实都是P,真正需要聚焦的还是如何使用。

NaCl的典型项目由三个部分组成:

  • 网页(*.html)。这里所指的网页是一个泛指,它包括JS代码、CSS样式表已经HTML代码。
  • NaCl模块(*.c;*.cc)。这是C/C++代码的文件。
  • 清单(*.nmf)。这份清单类似于Chrome Extension的清单,主要用于指明在不同架构的机器上调用什么模块。

在真正开始之前,我们还需要安装一个NaCl的SDK。这个SDK当中主要包含了NaCl的模块编译工具链。大家可以从这里下载:https://developers.google.com/native-client/sdk/download

安装之前,确保一下机器上有一个可用的Python 2.7,并加入到环境变量当中。

而SDK的安装则相当简单,只需要使用naclsdk update命令即可。

下面,创建一个名为hello_tutorial的目录,我们来搭建一个简单的demo。

 

网页
<!DOCTYPE html>
<html>
<head>
  <title>hello_tutorial</title>

  <script type="text/javascript">
    hello_tutorialModule = null;  // 模块的全局对象
    statusText = 'NO-STATUS';

    // 更新状态
    function moduleDidLoad() {
      hello_tutorialModule = document.getElementById('hello_tutorial');
      updateStatus('SUCCESS');
	  // 向模块发送消息
	  hello_tutorialModule.postMessage('hello');
    }

    // 消息句柄函数。句柄在NaCl模块发送相应消息时自动唤起。
	// 在C中是PPB_Messaging.PostMessage(),C++中则是pp::Instance.PostMessage()
	// 在这个demo当中,我们收到消息之后弹窗示意

    function handleMessage(message_event) {
      alert(message_event.data);
    }

    // 页面载入时很可能NaCl模块还没有载入,因此我们将状态写为正在读取;
	// 而如果模块已经载入,则什么都不做。
    function pageDidLoad() {
      if (hello_tutorialModule == null) {
        updateStatus('LOADING...');
      } else {
		// 事实上,NaCl模块的载入成功事件是不可能在页面载入成功事件之前就发生的,
		// 因此我们这里简单的认为页面载入之后所更新显示的消息仍旧是当前消息,而不是'SUCCESS'。
        updateStatus();
      }
    }

	// 设置状态。如果存在id为'statusField'的元素,那么将其设置为参数携带的状态
    function updateStatus(opt_message) {
      if (opt_message)
        statusText = opt_message;
      var statusField = document.getElementById('status_field');
      if (statusField) {
        statusField.innerHTML = statusText;
      }
    }
  </script>
</head>
<body onload="pageDidLoad()">

<h1>Native Client Module hello_tutorial</h1>
<p>
  <!-- 读取.nexe文件。通过.nmf,浏览器将结合目前所处的CPU架构来读取不同的模块文件。
  于此同时,<embed>元素之外的<div>还绑定着两个事件监听('load'以及'message'),
  之所以绑定在div上,而不是embed之上,是为了确保模块在载入之前就可以将监听的绑定彻底完成,
  同时也确保了开发者可以在模块内部的初始化阶段调用API发送消息。
  -->
  <div id="listener">
    <script type="text/javascript">
      var listener = document.getElementById('listener');
      listener.addEventListener('load', moduleDidLoad, true);
      listener.addEventListener('message', handleMessage, true);
    </script>

    <embed name="nacl_module"
       id="hello_tutorial"
       width=0 height=0
       src="hello_tutorial.nmf"
       type="application/x-nacl" />
  </div>
</p>

<h2>Status</h2>
<div id="status_field">NO-STATUS</div>
</body>
</html>
NaCl模块
/// @file hello_tutorial.cc
/// 载入NaCl模块时,浏览器首先将搜索CreateModule()方法,CreateModule()会返回一个对象实例,
/// 之后浏览器会调用该实例的CreateInstance()方法,这时浏览器每遇到一次相应的<embed>就会调用一次。
///
/// 浏览器通过Javascript的postMessage()函数与NaCl通信。
/// 当调用postMessage()时,浏览器会转而调用pp::Instance的HandleMessage()方法。
/// 而如果模块需要与外界主动通信,则是使用pp::Instance的postMessage()方法。
/// 注意,这两个postMessage()都是异步的,因此两者在调用之后迅速返回。

#include <cstdio>
#include <string>
#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/var.h"

namespace {
// 这个字符串用来判断消息是否是我们期望的内容
const char* const kHelloString = "hello";
// 这个字符串用来向浏览器返回内容
const char* const kReplyString = "hello from NaCl";
} // namespace

/// 每一个NaCl模块都将有一个相应的pp::Instance子类实例对应,
/// 为了与浏览器进行通信,你必须重载 HandleMessage()方法以及PostMessage()方法
class hello_tutorialInstance : public pp::Instance {
 public:

  explicit hello_tutorialInstance(PP_Instance instance) : pp::Instance(instance)
  {}
  virtual ~hello_tutorialInstance() {}

  /// HandleMessage() 负责接收浏览器中postMessage()发送的消息内容
  /// 其中的参数几乎可以表示任何东西,但通常都是JSON字符串,比如这样:
  ///   var json_message = JSON.stringify({ "myMethod" : "3.14159" });
  ///   nacl_module.postMessage(json_message);
  virtual void HandleMessage(const pp::Var& var_message) {
    // 这里是处理消息的代码了
	if (!var_message.is_string())
		return;
	std::string message = var_message.AsString();
	pp::Var var_reply;
	if (message == kHelloString) {
		var_reply = pp::Var(kReplyString);
		PostMessage(var_reply);
	}
  }
};

class hello_tutorialModule : public pp::Module {
 public:
  hello_tutorialModule() : pp::Module() {}
  virtual ~hello_tutorialModule() {}

  virtual pp::Instance* CreateInstance(PP_Instance instance) {
    return new hello_tutorialInstance(instance);
  }
};

namespace pp {
Module* CreateModule() {
  return new hello_tutorialModule();
}
}  // namespace pp
Makefile

Makefile是C\C++编译指令的存放文件,这份文件将指引编译器、链接器如何工作。因为我们现在所处情况特殊,所以Makefile需要自己编写。

# Copyright (c) 2012 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

#
# GNU Make based build file.  For details on GNU Make see:
# http://www.gnu.org/software/make/manual/make.html
#

#
# Project information
#
# 这里的变量将指出每个项目的编译信息,如项目名、编译标志等等。
# 通常每个项目都将有所不同。这里只是作为一个demo,因此只有一些最简单的信息。
# 注意,编辑这里的内容需要你对编译器有足够的了解
#
PROJECT:=hello_tutorial
LDFLAGS:=-lppapi_cpp -lppapi
CXX_SOURCES:=$(PROJECT).cc

#
# 设置pepper目录
#
THIS_MAKEFILE:=$(abspath $(lastword $(MAKEFILE_LIST)))
NACL_SDK_ROOT?=$(abspath $(dir $(THIS_MAKEFILE))../..)

# Project Build flags
WARNINGS:=-Wno-long-long -Wall -Wswitch-enum -pedantic -Werror
CXXFLAGS:=-pthread -std=gnu++98 $(WARNINGS)

#
# 设置工具路径
#
#
OSNAME:=$(shell python $(NACL_SDK_ROOT)/tools/getos.py)
TC_PATH:=$(abspath $(NACL_SDK_ROOT)/toolchain/$(OSNAME)_x86_newlib)
CXX:=$(TC_PATH)/bin/i686-nacl-g++

#
# Cygwin专用设置
#
CYGWIN ?= nodosfilewarning
export CYGWIN

# Declare the ALL target first, to make the 'all' target the default build
all: $(PROJECT)_x86_32.nexe $(PROJECT)_x86_64.nexe

# 32位文件生成规则
x86_32_OBJS:=$(patsubst %.cc,%_32.o,$(CXX_SOURCES))
$(x86_32_OBJS) : %_32.o : %.cc $(THIS_MAKE)
        $(CXX) -o [email protected] -c $< -m32 -O0 -g $(CXXFLAGS)

$(PROJECT)_x86_32.nexe : $(x86_32_OBJS)
        $(CXX) -o [email protected] $^ -m32 -O0 -g $(CXXFLAGS) $(LDFLAGS)

# 64位文件生成规则
x86_64_OBJS:=$(patsubst %.cc,%_64.o,$(CXX_SOURCES))
$(x86_64_OBJS) : %_64.o : %.cc $(THIS_MAKE)
        $(CXX) -o [email protected] -c $< -m64 -O0 -g $(CXXFLAGS)

$(PROJECT)_x86_64.nexe : $(x86_64_OBJS)
        $(CXX) -o [email protected] $^ -m64 -O0 -g $(CXXFLAGS) $(LDFLAGS)

# Define a phony rule so it always runs, to build nexe and start up server.
.PHONY: RUN
RUN: all
  python ../httpd.py
清单文件

清单中指出了不同架构所使用的模块。

{
  "program": {
    "x86-64": {"url": "hello_tutorial_x86_64.nexe"},
    "x86-32": {"url": "hello_tutorial_x86_32.nexe"}
  }
}

所有这些文件齐全之后,只需要make即可完成自动编译。

如何运行

在编译之后,双击html页面打开其实并不会载入模块运行,这是由于浏览器的访问域规则不允许直接在用户的本地读取文件。因此,我们需要让本机成为一个服务器,以远程服务器的身份来读取模块最终传送给浏览器。

这很容易,SDK当中已经包含了提供http服务的python脚本:

cd pepper_18/examples #注意,pepper的版本号应该依据你现有的情况来定
python httpd.py

这样,http://localhost:5103就成为了我们的服务器地址。注意,http服务的根目录的位置位于examples目录。

现在,我们在浏览器的chrome://flagschrome://plugins页面中打开NaCl的几个相关选项,就可以成功运行了。

[http://www.guao.hk/posts/cutting-edge-native-client.html]

HTML5打造桌面应用

最新版的HTML,即HTML5,已经在软件和信息产业界产生了巨大的影响。当我们说:“HTML5”,我们指的其实是HTML / CSS / JavaScript的“综合体”。在Mozilla,我们经常提及“Web Run-Time”或WebRT。Mozilla应用的探讨(包括Web Runtime)都被被记录在这里

怀疑论者喜欢说:“HTML5还没有准备好”。就在这个星期,我看到的一篇文章,宣称HTML5要“准备就绪”还要再过10年。我想问:“准备什 么?”,当然目前还有许多API仍在发展,但大多情况下,HTML5就是现在进行时。基本上发展到目前,已经准备在不久的将来提供给一般人使用。

最近Mozilla的Web Apps的安装体验已经引入到火狐每晚版通道。(阅读更多关于Firefox版本发布通道的信息

此功能可以让我们把HTML5应用安置在Windows或Mac本地上(Linux和Android在未来也能得到支持),获得像桌面应用类似的体验。

Mozilla用伟大的方式来做到这一点,Mozilla市场可以简洁的列出你的应用。市场将很快就会向公众开放,开发人员可以提交他们的应用提交到市场这个生态系统上。想要提交​​应用,你仅需要申请一个BrowserID

一个HTML5应用,需要包括Mozilla Web Runtime运行环境和一个manifest文件。

该manifest文件其实是一个简单的JSON文件,声明了App的某些数据。
这里是一个App的manifest文件示例。你可以在这里阅读更多有关Mozilla App manifest信息
{ “version”: “1.0”, “name”: “KO Round Timer”, “description”: “A Workout Timer for Fighting Athletes!”, “icons”: { “128”: “/images/icon-128.png” }, “developer”: { “name”: “Joe Stagner”, “url”: “http://koscience.com” }, “installs_allowed_from”: [ “http://timer.koscience.com”, “https://marketplace.mozilla.org” ], “default_locale”: “en” } JSON不需要CRLFs格式化。上面JSON的格式只是为简化显示,以便阅读。

注意:第12行以上指定了App的安装信息。

Mozilla Web Runtime包括一个应用程序对象(winbow.navigator.mozApps)——mozApps的对象(目前在Windows和Mac平台上的每夜版Firefox中实现),有一个方法来安装应用程序。我们来看看,在一分钟内使用该API写出代码。

如果你想让你的应用通过Mozilla市场安装,你不需要写任何安装代码。当你在市场提交应用时,市场会为你的应用创建一个列表页面,该页面包括会一个安装按钮。

Mozilla Marketplace App Listing Page

安装按钮被点击时会调用生成的代码,告诉安装的应用如何运行。然后在运行时获取应用的manifest,除此之外,还会检查,看看请求安装应用的域名是否被允许。

正如你在manifest清单文件上看到的,第14行指定了App可以被从“https://marketplace.mozilla.org”上安装。

但是,您可能需要让用户从其他域名安装应用,例如自己的网站。

你可以看到第13行代码,在我们的manifest样本文件上列出了“http://timer.koscience.com”作为一个有效的指定“安装”的位置。我可以指定尽可能多的域名,因为有我喜欢的通配符支持App授权安装功能。

如果我们想从我们自己的网站上安装的应用程序,但是,我们需要实现自己的安装逻辑。

我们可以创建一个页面,类似Mozilla市场上的应用列表页面,或者可以让​​安装程序“自我”包含功能代码,可以在安装程序本身含有逻辑来实现。

例如,Workout Timer这个应用,如下所示。

K.O. Timer Screen Shot

请注意排在计时器的底部的导航按钮。

右边最后一个是:“安装”。

如果应用运行在支持mozApps的环境中,那么应该就会出现“安装”按钮。由于此应用(K.O. Timer)是一个HTML5应用程序,它可以运行在任何兼容HTML5的浏览器。如果它运行在浏览器/支持mozApps的runtime上,就会出现“安装”按钮。

如果应用程序已安装,我们就不让它出现安装按钮。

这里是一个JavaScript方法来测试运行和安装状态。

如果是运行时,当前应用没有安装,那么就显示安装按钮。

当应用程序尚未安装,在某些情况下,你可能会选择不要显示“安装”按钮,只需设置在启动安装程序时直接启动即可。

(此代码使用jQuery)
function TestAppInstalled() { if ((!navigator.mozApps) || (!navigator.mozApps.getSelf)) { /*———————————————————–+ || Test to see if the Mozilla Apps Web Runtime is supported || HACK: Testing for either mozApps OR mozApps.getSelf is a || hack. || This is needed because some pre-beta versions of Firefox || have the object present but nit fully implemented. || TODO: Update when Firefox Desktop & Mobile are complete. ————————————————————*/ return; }   var MyAppSelf = navigator.mozApps.getSelf(); MyAppSelf.onsuccess = function() { if (! this.result) { // Application is not “installed” $(‘#InstallButton’).show(); } else { // This “MozApp” is already installed. } return; } MyAppSelf.onerror = function() { alert(‘Error checking installation status: ‘ + this.error.message); return; } }
当用户点击安装按钮,下面的代码就会被执行。
$(‘#InstallButton’).click(function() { var installation = navigator.mozApps.install( “http://timer.koscience.com/kotimer.webapp”); installation.onsuccess = function() { $(‘#InstallButton’).hide(); alert(“K.O. Timer has been successfully installed…..”); } installation.onerror = function() { alert(“APP: The installation FAILED : ” + this.error.name); } });
因此,当用户使用支持mozApps浏览器(目前只有每夜版火狐支持)浏览到K.O. Timer应用(timer.koscience.com)并点击列“安装”按钮,mozApps runtime就开始安装。

KOTimer at Install Click

KOTimer at Install Click Closeup

用户点击安装“按钮”后,就会出现在上图中的对话框→安装→完成,用户就会在本地有一个App。

在Windows中,你会得到一个桌面快捷方式。

Native Shortcut for HTML5 App

以及“开始”菜单项。

HTML5 app in the Windows Start Menu

当然现在用户也可以在Mozilla 我的App收藏集打开应用。

Mozilla MyApps Collection

重要的是要记住,这些启动器已经在用户的系统上被创建,但应用程序本身仍存于云端。开发人员可以利用AppCacheLocalStorageIndexedDB这些HTML5特性,选择给应用添加“离线”功能。

提供HTML5应用,再加上强大的HTML5应用发布机制,这将是Mozilla市场未来开放时,能够提供给人们本地运行的能力,创造伟大的技术标准为基础性应用开发人员的机会。

英文原文:http://hacks.mozilla.org/……html5-and-the-mozilla-web-runtime/
原文作者:Joe Stagner
中文编译:蚊仔部屋

 

[http://www.cnbeta.com/articles/188158.htm]