介绍


随着智能手机的普及,越来越多Web应用都会将链接生成一个二维码,亦或者是如微信的二维码支付。

生成二维码并且使用有两种方式:第一种是固定重复的链接,这将会是被多次使用,那可以将这二维码图片保存到某个地方; 第二种是一次性使用(二维码支付),在需要的时候再去生成对应的二维码图片就可以。

以下代码均用Ruby来实现,使用 rqrcode_png Gem

一次性使用二维码图片


在 Rails Controller 中

qr = RQRCode::QRCode.new('http://mouseshi.com', size: 4, level: :h )

qrcode_str = Base64.encode64(qr.to_img.resize(300, 300).to_s)

在 Rails View 中

image_tag("data:image/png;base64,#{@qrcode_str}")

重复性使用二维码图片


require 'rqrcode_png'
qr = RQRCode::QRCode.new('http://mouseshi.com', size: 4, level: :h )
png = qr.to_img
png.resize(240, 240).save("mouseshi_website.png") # 保存到目录

上面代码可以做部分更改,使用 Ruby Tempfile Class 来实现保存图片

require 'rqrcode_png'

begin
  qrcode_img = Tempfile.new('qrcode')
  qr = RQRCode::QRCode.new('http://mouseshi.com', size: 4, level: :h )
  png = qr.to_img
  qrcode_img.write(png)
  # 在这里可以实现保存你要的图片,对象 qrcode_img
ensure
  qrcode_img.close!
end

JavaScript 与 ECMAScript


通常 JavaScript 和 ECMAScript 被人们用来表达相同的含义,但 JavaScript 的含义却要比 ECMA-262 中规定的要多很多。

完整 JavaScript 实现应该由以下三个不同部分组成:

  • 核心 (ECMAScript)
  • 文档对象模型 (DOM)
  • 浏览器对象模型 (BOM)

ECMAScript


由 ECMA-262 定义的 ECMAScript 与 Web 浏览器没有依赖的关系。实际上,它并不包含输入与输出的定义。

ECMA-262 定义的只是这门语言的基础,并且在此基础上可以构建更完善的脚本语言。我们常见的 Web 浏览器只是 ECMAScript 实现的宿主环境之一。宿主环境不仅仅提供提供基本的 ECMAScript 实现,同时也提供了扩展的方式,以便于语言在与环境之间的对接交互。而这些扩展 - 如DOM,则利用 ECMAScript 的核心类型与语法提供更多更具体的功能,来实现针对环境的操作。

ECMAScript 的标准规定了 JavaScript 以下组成部分:

  • 语法
  • 类型
  • 语句
  • 关键字
  • 保留字
  • 操作符
  • 对象

所以,ECMAScript 就是对实现以上标准规定的各个方面内容的语言描述。例如 JavsScript 实现了 ECMAScript,同样 Adobe ActionScript 也实现了 ECMAScript。

起源


REST (Representational State Transfer) 表现层状态转换,是Roy Fielding在2000年的论文中提出。

定义


RESTFUL 在我读大学时期起,就经常接触到的一个软件架构风格,也是较为多人讨论的一个话题。 至于它具体的基本定义,可以看看维基百科上面 REST要注意的是REST是一套设计的风格,而非标准

资源 RESOURCE


RESOURCE表示网络上面的资源,在网络上面提供各种各样的资源,而这些资源我们可以通过直观的URI看出。例如URI是http://mouseshi.com,在浏览器输入它就可以直接来到我的Blog首页,而后,客户端在从菜单进入所有Posts分类的页面,此时URI为http://mouseshi.com/posts,一个URI代表一种资源,客户端需要获取不同资源,通过不同的URI来获取,这就是资源(RESOURCE)。

表现层 REPRESENTATION


上面提到资源,是一种信息的实体,它具有不同的外在表现形式(比如:TXT,JSON,XML,YAML等)。

把资源外在表现形式呈现出来的形式,就是表现层(REPRESENTATION)。

状态转换 STATE TRANSFER


在客户端与浏览器交互过程中,会涉及到数据一些操作,客户端通过Http协议,这里面有对资源不同操作方式,例如:GET、POST、PUT、DELETE,它们分别对应获取资源、创建新资源、更新资源、删除资源。

REST 优点


  • 让原本无状态的Http通过可以通过请求处理不同操作
  • 浏览器即为客户端,简化软件需求
  • 无需其他资源发现机制
  • 在软件技术演进中的长期的兼容性更好

容器(container)与编解码器(codec)

容器与编解码器是HTML5 audio与video两个比较重要的概念。

不论音频文件还是视频文件,其实从本质上面来说,都是一个容器文件,例如压缩文件Zip。

从右边图我们可以看得出,视频容器包含了音频轨道视频轨道和其他一些元数据

视频播放的时候,音频轨道和视频轨道是绑定在一起的,元数据部分包含了该视频的封面、标题、 子标题、字母等相关信息。

主流的视频容器支持如下视频格式

  • Audio Video Interleave(.avi)
  • Flash Video(.flv)
  • MPEG 4(.mp4)
  • Matroska(.mkv)
  • Ogg(.ogv)

音频和视频编解码器

音频和视频的编码/解码器是一组算法,用来对一段特定音频或视频流进行解码和编码, 以便音频和视频可以正常得播放。

对于原始的媒体文件来说,体积是非常大,假如不对其编码,那么构成一段视频和音频的数据将会 非常庞大,以至于在网络上面传播已经播放都需要等待很长时间。

音频编解码器

  • AAC
  • MPEG-3
  • Ogg Vorbis

视频编解码器

  • H.264
  • VP8
  • Ogg Theora

Audio 和 Video 的优缺点

在页面中播放视频比较典型方式是使用Flash、QuickTime或者Window Media插件,向HTML中嵌入视频,但是相对于这种方法,使用HTML5的媒体标签会有以下两点好处:

  • 作为浏览器原生支持的功能,audio与video无线安装。虽然有一些插件安装率很高,但是在控制比较严格 的公司往往会屏蔽掉这些插件,或者是当插件被禁用后,也会出现无法播放的情况。

  • 媒体元素向Web页面提供了通用集成可脚本化控制的API。对于开发人员来说,这个无疑是最大优点。

当然除了优点,也有些功能是HTML5规范中不支持的,例如:

  • 流式音频与视频。因为目前的HTML5规范中还没有比特率的切换标准,所以对于视频的支持只限于 加载全部媒体文件。

    也存在第三方自己实现了整套包括音视频的采集、编解码、网络传输、显示等功能。例如Google 的WebRTC(Real-Time Communications), 用它可以实现流式视频的播放。

  • HTML5的媒体资源受到HTTP跨源(cross-origin)资源共享的限制。

  • 全屏视频无法通过脚本控制。从安全性考虑,让脚本控制全屏操作的确不大合适。

  • 对audio和video的访问未完全加入规范。

  • 缺少通用编解码器支持。这点算是目前来说最大的缺点,只能随着时间推移,最后会有一套通用的编解码器。

Audio 和 Video 的API

在使用audio和video之前,当然是需要先检查下浏览器是否支持。通过下图,可以看出, Internet Explorer 9+, Firefox, Opera, Chrome, and Safari 都支持video

video-support</a>
注意:Internet Explorer 8 和之前版本不支持video

检查浏览器是否支持audio或者video也可以使用比较简单脚本,通过动态创建一个video, 然后判断特定函数是否存在:

var hasVideo = !!(document.createElement("video").canPlayType());

上面这段代码通过动态创建一个video元素,然后检查canPlayType()方法是否存在, 接下 “!!” 将判断转为Boolean值,最后就可以通过hasVideo true or false来判断。

当浏览器不支持video和audio元素时候,可以在代码里面加入备选内容,这样备选提示内容就会在 不支持的浏览器中显示:

<video scr="video.ogg" controls>
您的浏览器不支持HTML5 video
</video>

如果是要为不支持HTML5 video的浏览器提供其他方式来显示视频, 可以使用同样方式,将代码插入元素里面就可以:

<video scr="video.ogg" controls>
  <object data="video.swf">
    <param name="movie" value="video.swf">
  </object>
</video>

Rails 对 Excel文件导入时间格式处理

  • 问题

在用Ruby对Excel文档导入功能开发的时候,遇到过这样一个问题,导入数据创建的记录里面所有时间字段不是为了nil就是都是错误的时间。

只有在Mac使用Office Excel把时间重新编辑,然后保存一下后,才有正确时间数据保存下来,后来通过Log才发现,在windows Excel下面保存的时间都是Float类型,翻了下资料后才知道,Excel保存时间就是通过Float类型的,然后根据时间从1899,12,30 再加上这个Float天数算出来最终时间。

可以用这样公式计算出真正时间:

  DateTime.new(1899,12,30) + excel_float_val.days
  • 例子

    • 使用 Roo Gem 来对Excel等文档进行读取

    • Excel导入实例代码

  def import_csv
    name = params[:file].original_filename                    #赋值上传文件名
    directory = "public/files"                                #赋值临时上传文件路径
    path = File.join(directory, name)      
    File.open(path, "wb") { |f| f.write(params[:file].read) } #打开文件
    xls = Roo::Excel.new(path)                                #生成Roo对象
    all_dates_arry = []
    xls.each_with_index do |line, index|                      #假定line[1]为日期行
      #先判断是否为Float,为Float类型,利用上面公式计算日期,否则直接返回
      date = line[1].is_a?(Float)? (DateTime.new(1899,12,30) + line[1].days) : line[1]
      all_dates_arry << date
    end
    all_dates_arry
  end