查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

韩国恺的博客

hanguokai.com

 
 
 
 
 
 

自制一个编程语言主题的音乐幻灯片

2013-4-27 13:43:41 阅读1053 评论1 272013/04 Apr27

我为5月5号 编程语言主题活动 做了一个音乐幻灯片,包括 Go、Erlang、Dart 以及很多计算机名人。你认识其中的所有人和他所代表的编程语言吗?(背景歌曲为:Return To Innocence,译为:返璞归真)

这次还有个关于版权问题的教训。因为背景音乐是有版权限制的,所以在上传 Youtube 之后,Youtube 会自动检测到内容并给你发一个 Email 说:“您的视频可能包含由EMI所有或需要其授予许可的内容,但仍可以在 YouTube 上播放!在某些情况下,系统可能会禁止该视频,或者在它旁边显示广告。”

事实上,Youtube 上除了自己别人是无法看到的。虽然音乐是从国内正规网站上下载的,但这不意味着你可以在任何地方使用。所以,我把 Youtube 上的版本删除了。只保留一个国内的版本。

作者  | 2013-4-27 13:43:41 | 阅读(1053) |评论(1) | 阅读全文>>

Dart 中的 const 与 final

2013-3-19 3:56:36 阅读2539 评论2 192013/03 Mar19

起初,我也对 const 和 final 的区别感到迷惑,并且在日常的快速开发中这两个修饰符用的不多。因此我查了一些解释,在这里做个整理记录。

概念上说,final 表示不可变,只能赋值一次,初次赋值之后就不能再赋其它值了,是只读变量。而 const 表示常量,更准确地说是编译时常量,因此 const 也是只读的、不可变的。const 和 final 都可以表示不可变,但又有细微的差异。

变量声明

var 或者类型可以声明变量,而 const 和 final 也可以用于声明变量。声明 var 的地方可以用 const 或 final 代替。声明类型的地方可以与 const 或 final 组合使用。例如下面这些声明都是可以的:

var a = 1;

const a = 1;

final a = 1;

int a = 1;

const int a = 1;

final int a = 1;

这里 const 和 final 没有区别,因为变量 a 被立即赋值为一个数字常量。

区别一:final 要求变量只能初始化一次,并不要求赋的值一定是编译时常量,可以是常量也可以不是。而 const 要求在声明时初始化,并且赋值必需为编译时常量。

区别二:final 是惰性初始化,即在运行时第一次使用前才初始化。而 const 是在编译时就确定值了。

编译时常量指的是:字面量(如数字、bool、字符串、List的字面量形式)、其它常量

作者  | 2013-3-19 3:56:36 | 阅读(2539) |评论(2) | 阅读全文>>

Chrome 中的 JavaScript 断点设置和调试技巧

2013-3-14 16:06:32 阅读189886 评论7 142013/03 Mar14

你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容。嗯~,用这两种土办法确实解决了很多小型 JavaScript 脚本的调试问题。不过放着 Chrome 中功能越发强大的开发者工具不用实在太可惜了。本文主要介绍其中的 JavaScript 断点设置和调试功能,也就是其中的 Sources Panel(以前叫 Scripts)。如果你精通 Eclipse 中的各种 Java 调试技巧,那么这里的概念都是类似。写作本文时使用的 Chrome 版本为 25.0.1364.172。

基本环境

Sources Panel 的左边是内容源,包括页面中的各种资源。其中,又分 Sources 和 Content scripts。Sources 就是页面本身包含的各种资源,它是按照页面中出现的域来组织的,这是我们要关注的。异步加载的 js 文件,在加载后也会出现在这里的。Content scripts 是 Chrome 的一种扩展程序,它是按照扩展的ID来组织的,这类扩展实际也是嵌入在页面中的资源,它们也可以读写DOM。编写、调试这类扩展的开发者才要关心它们,如果你的浏览器没安装任何扩展,那么 Content scripts 就看不到任何东西。

Sources Panel 的中间主区域用于展示左边资源文件的内容。

Sources Panel 的右边是调试功能区,最上面的一排按钮分别是暂停/继续、单步执行、单步跳入、单步跳出、禁用/启用所有断点。下面是各种具体的功能区。稍后介绍。

作者  | 2013-3-14 16:06:32 | 阅读(189886) |评论(7) | 阅读全文>>

Dart 性能测试

2013-3-1 20:46:56 阅读2316 评论0 12013/03 Mar1

我们通常需要对代码或核心算法做性能测试。性能测试的概念非常简单:执行要测试的代码,测量其执行时间(一般是多次测试的平均值)。性能测试真正的难点是避开各种干扰因素,而这些干扰因素可能非常复杂。除了自身代码,还可能涉及硬件、底层系统、语言、库的实现等各个方面。Dart 中的性能测试和其它语言并没有什么不同,只不过需要注意几点。

1. 热身

Dart 语言的一个目标是快速启动,为此 Dart VM 并不会立刻优化要执行的代码。执行时间太短、次数太少的代码无法触发 VM 的优化器,这样的结果并不能反映真实的性能数据。所以,在正式开始记录执行时间之前要预先执行足够多的次数和时间,然后再开始测试性能。

除了热身,测试本身也要执行足够的时间和次数才能获得准确的数据,尤其是单次执行时间很短的测试。

2. 关闭检查模式和调试模式

Dart 有两种执行模式:检查模式(checked)和生产模式(production)。检查模式会在运行时插入大量类型检查,自然会影响性能。命令行模式下 dart 默认就是生产模式。但在 Dart Editor 中默认是在检查模式下运行,首先保证程序在检查模式下执行没问题,然后在性能测试时在程序的启动配置中取消 VM 的 “Run in checked mode”选项。

此外,debug 模式也会对性能有影响。在 Dart Editor 的选项配置中,Run and Debug 中的 break on exceptions 设为 none 。

基本性能测试代码

作者  | 2013-3-1 20:46:56 | 阅读(2316) |评论(0) | 阅读全文>>

Dart 与 JavaScript 互操作

2013-2-25 18:56:52 阅读2525 评论0 252013/02 Feb25

Dart 语言为 Web 开发提供了强大的支持,特别适合 Web App。一般情况下,开发者只使用 Dart 即可完成所有的工作,但有时可能还需要与现存的 JavaScript 交互。为了解决这方面问题,Dart 提供了一个名为 js 的库,利用它我们就可以实现 Dart 与 JavaScript 简单的互操作。作为良好实践,应该避免 Dart 与 JavaScript 的紧耦合,尽可能减少不必要的交互并保持二者之间明确的交互界限。

安装 js 库

在 pubspec.yaml 文件添加 js :

dependencies:

js: any

然后执行 pub install 。

在使用的地方导入 js :

import 'package:js/js.dart' as js;

介绍

Js 库允许你在 Dart 程序中访问或调用 JavaScript 的对象、字段和函数,把 Dart 的对象和函数传递给 JavaScript 函数,以及在 JavaScript 中调用 Dart 的函数。js 库本身也是一个 Dart 程序,所以提供的功能既可以在支持 Dart 的浏览器上执行,也可以编译为 JavaScript 在不支持 Dart 的浏览器上执行。

在 Dart 程序中,Js 库使

作者  | 2013-2-25 18:56:52 | 阅读(2525) |评论(0) | 阅读全文>>

Dart 中的 Tree shaking

2013-2-21 13:32:41 阅读1220 评论0 212013/02 Feb21

Web 开发需要 Tree shaking

Web开发者总是希望引用的 js 文件越小越好,这样页面能加载更快。尤其是作为选用第三方库的一个重要参考,因为要用的话就必须完整引用它。但问题的实质是传统 Web 开发中缺少一种自动化的方式来排除未使用的代码。比如,我们只用到了一个库的一小部分功能,却不得不完整引用它。Web开发者真正需要的是一种类似连接器的工具,自动将不需要的代码排除。

Dart 的 tree shaking 技术正是这种工具,不用担心只使用一小部分功能而引用了一个较大的库,因为 dart2js 把没有用到的代码自动排除了。

Dart 语言之所以能够使用 tree shaking 排除不需要的代码,是因为 Dart 程序的结构在编译之后就不再改变了。Dart 不支持在运行时动态改变程序的结构,以及像 eval() 这样极端动态的功能。另外,Dart 代码本身有良好的结构:classes, libraries, packages, type annotations, metadata 等。这样 Dart 可以更加确定程序的结构,更具侵略性的判断出哪些部分可能不会被使用。

JavaScript 一般使用 Google Closure Compiler 或 

作者  | 2013-2-21 13:32:41 | 阅读(1220) |评论(0) | 阅读全文>>

Dart 中的 snapshot

2013-2-20 13:53:31 阅读1354 评论0 202013/02 Feb20

snapshot 及其主要用途

snapshot 是 Dart 程序的二进制序列化形式,和对象在 isolate 中的内存形式接近。

snapshot 的主要目的是提高 dart 程序的启动速度。

和读取源代码相比,snapshot 无需解析源代码,而是直接还原到程序开始执行前的初始状态。

dart 核心库、dart2js 等都会使用 snapshot 提高程序的启动速度。

snapshot 比从源代码加载要快得多,比正常的 JavaScript 启动速度快 10 倍。

而 JavaScript 很难做到这点,因为 JavaScript 的源码会有副作用,不能被实现为 snapshot 。

不管是桌面 Web、移动 Web 还是 server 端程序,快速的启动都是很有用的。

snapshot 特别适合较大型的 Web App ,比如 Gmail 在启动的时候需要预先读取 1MB 的 JavaScript 源代码,但如果是读取缓存在浏览器中的 Dart snapshot ,那么启动时间只需完整读取源代码启动时间的 1/10 。

当前 Dart 团队正在尝试减小 snapshot 的大小,因为这会直接影响到启动速度。

snapshot 除了提高启动速度外,还用于 isolate 之间的对象(消息)传递。

snapshot 的两种执行环境:

对于 Web App,什么都不用做,浏览器会自动使用 snapshot。因为支持

作者  | 2013-2-20 13:53:31 | 阅读(1354) |评论(0) | 阅读全文>>

树莓派(Raspberry Pi)使用篇

2013-1-22 18:19:00 阅读35428 评论3 222013/01 Jan22

前一篇上手树莓派之后,让我们开始做一些简单实用的功能吧。所有这些和使用 Linux 是一样的。

网络配置

插入网线并启动机器,默认是 DHCP 分配的 IP,ifconfig 或者在路由器上查一下主机名是 raspberrypi 就能知道 IP 。不过为了以后远程连接方便,还是配置为静态 IP 比较好。可以在路由器上利用 mac 地址配置静态 IP 分配。也可以在 Pi 上做网络设置,和 Debian Linux 网络配置一样,编辑 /etc/network/interfaces 文件,修改后重启网络。

挂载U盘

外接U盘或移动硬盘时,默认不会自动挂载,所以需要用 mount 命令挂载。通常我们在 /mnt 或 /media 目录下新建一个目录作为挂载点。比如:

sudo mkdir /mnt/1GB_USB_flash

sudo mount -o uid=pi,gid=pi /dev/sda1 /mnt/1GB_USB_flash

//用完之后卸载

sudo umount /mnt/1GB_USB_flash

sda1 是取决于你的实际情况,a表示第一个硬盘,1表示第一个分区。

FAT 格式U盘 mount 本身就

作者  | 2013-1-22 18:19:00 | 阅读(35428) |评论(3) | 阅读全文>>

Mac OS 上设置 JAVA_HOME

2013-1-11 22:26:13 阅读47848 评论4 112013/01 Jan11

由于需要,前几天在 OS X 上安装了 Oracle 的 Java 7。安装之后,发现由于我原来设置的 JAVA_HOME 为 /Library/Java/Home ,导致我使用的还是原来苹果提供的 Java 6 而不是刚安装的 Java 7。

网上查了一下,发现网上普遍存在一种不太好的硬编码方式,比如以下这些:

JAVA_HOME=/Library/Java/Home

JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home

JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Home

//上面的几个目录其实是等价的链接关系,都指向的是苹果提供的 Java 6

/System/Library/Frameworks/JavaVM.framework/Versions/ 下有多个不同版本的目录,但它们链接的都是 CurrentJDK 目录。总之,这些Java都是苹果提供的Java,Oracle 或 OpenJDK 提供的 Java 不在此目录中。

因为不同的 Java 版本和不同的 Java 实现可能安装在了不同的目录下,所以使用硬编码的目录会有如下缺点:

安装或升级新的 Java 后需要重新设置 JAVA_HOME(尤其是带版本号的目录)无法适应不同的 Java 实现(Apple和Oracle的)

作者  | 2013-1-11 22:26:13 | 阅读(47848) |评论(4) | 阅读全文>>

Dart 语言入门(七)——包管理工具 Pub

2012-12-31 23:31:35 阅读3327 评论1 312012/12 Dec31

更新日期:2012年12月31日

包(package)管理系统非常多,主要目的都是解决版本管理和依赖关系的问题,如 Ruby有RubyGems、Bundler、Node.js有npm、Java有Maven、Linux有apt-get 等等。Dart 也有自己的包管理工具 Pub,已包含在SDK 中(Pub是酒馆、客栈的意思,Dart是飞镖的意思,而飞镖是酒馆中常见的一种游戏)。

Pub 主要受 bundler 模型的启发,使用一个 yaml 格式的 pubspec 描述文件。Pub 中的包就是一个目录,可以包含各种东西,如代码、资源、测试、文档等。库(library)和应用(application)都是包。库是用来被重用的代码,包含了需要被别人导入的代码。而应用只是使用其它包实现自己功能。

急速使用入门:

1. 在项目根目录新建一个名为 pubspec.yaml 的文件,需要包含如下内容项:

a) name 项表示你的应用名或库名。

b) dependencies 项下面添加需要依赖的包,基本格式为 name: version 。

2. 在根目录下运行 pub install 命令安装依赖,修改配置文件或需要更新时运行 pub update 命令。

3. 在需要使用的 dart 文件中,使用 import 导入包,格式为:import 'package:xxx'; 。

下面是一个简单的 pubspec.yaml 示例文件:

作者  | 2012-12-31 23:31:35 | 阅读(3327) |评论(1) | 阅读全文>>

Dart 语言入门(六)——异步与并发编程

2012-11-26 16:58:07 阅读2842 评论0 262012/11 Nov26

更新日期:2012年11月26日

一、异步编程 Future

有时候我们需要让一个调用异步执行,比如一个比较耗时的操作,好继续后面的处理,而不是一直等待处理完成。异步执行就是调用本身立即返回,并在稍后的某个时候执行完成时再获得返回结果。在 Dart 中,这是通过 Future<T> 对象实现的。我们可以通过 then() 方法注册一个回调函数在成功执行完成时调用,并获得返回值。如果执行失败,则会抛出异常。另外也可以通过 handleException() 注册遇到异常时执行的回调函数,如果这个回调函数返回 true ,那么 Future 认为异常已被很好地处理了就不再抛出异常,否则还是会抛出异常。但一般不必注册 handleException,因为异常会正常抛出给外面的代码。onComplete 注册的回调函数不管成功还是失败都会执行。

当 Future 完成时,依次执行以下动作:

如果成功完成,那么执行 then 方法中注册的回调函数如果执行失败,那么依次执行 handleException 方法中注册的回调函数,直到其中一个返回 true执行 onComplete 方法中注册的回调函数如果执行失败,并且 then 方法中至少注册了一个回调函数,并且没有一个 handleException 方法中注册的回调函数返回 true,那么就抛出异常。

使用 Completer 对象可以创建一个 Future,并在之后为 Future 提供一个返回值。

作者  | 2012-11-26 16:58:07 | 阅读(2842) |评论(0) | 阅读全文>>

Dart 语言入门(五)——库的使用

2012-11-25 11:54:13 阅读2285 评论0 252012/11 Nov25

更新日期:2012年12月27日

在 Dart 中有库(library)的概念,你可以导入一个库使用它提供的功能,也可以自己定义一个可重用的库。尽管这是很多 server 端语言都支持的概念,但在 JavaScript 尚不支持。如果你用 Dart 编写 Web 应用就可以利用这点,帮你更好地组合代码。一个库可以由一个或多个文件组成。

任何 Dart 应用程序都是一个库,即使没有使用 library 声明。import 用于导入一个库,library 用于定义一个库,part 用于将其他文件包含到当前库的定义中。

私有概念在 Dart 中,以下划线开头的成员是私有的。注意,Dart 中的私有单元是库,而不是类。私有是指在库的外部不可见,而在库的内部是完全可见的。比如,你在类中定义了一个私有方法,实际上在类所在的库中是完全可见的。

1. import 语句

import 语句可以导入一个库,然后你就可以使用该库中定义的所有成员了。例如,下面是导入 dart:html 库的 import 语句:

import 'dart:html'; // 导入 Dart 标准库

在 import 关键字后面通过一个字符串形式的 URI 来指定要导入的库。Dart 的标准库使用 dart: 前缀的格式,如 dart:html、dart:io 等。你也可以导入一个绝对或相对路径的 dart 文件,如:

import 'lib/unittest.dart'; // 导入文件

作者  | 2012-11-25 11:54:13 | 阅读(2285) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 
 
 

北京市 海淀区

 发消息  写留言

 
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018

注册 登录  
 加关注