手机上的 AI - 在 Android/iOS 上运行 Caffe 深度学习框架

目前在云端基于各种深度学习框架的 AI 服务已经非常成熟,但最近的一些案例展示了在移动设备上直接运行深度神经网络模型能够带来很大的处理速度优势。比如 Facebook 在官方博客上发布的可在移动设备上进行实时视频风格转换的应用案例 “Delivering real-time AI in the palm of your hand”。其中提到 Caffe2go 框架加上优化后的网络模型,可以在 iPhone6S 上支持 20FPS 的视频风格转换。Google Tensorflow 也提供了 iOS 和 Android 的 example

Caffe 是一个知名的开源深度学习框架,在图像处理上有着非常广泛的应用。Caffe 本身基于 C++ 实现,有着非常简洁的代码结构,所以也有着很好的可移植性。早年也已经有了几个 github 项目实现了 Caffe 到 iOS/Android 平台的移植。但从我的角度来看,这些项目的编译依赖和编译过程都过于复杂,代码也不再更新,而且最终产出的产品包过大。caffe-compact 最接近我的思路,但是在两年前未完工就已经不更新了。

从我个人在 APP 产品上的经验来看,移植深度学习框架到 APP 中,不仅仅是能不能跑,跑不跑得快,还有个很重要的因素是包大小问题。因为一般用深度学习模型只是实现一个产品功能,不是整个产品。一个产品功能如果对 APP 包大小影响太大,很多 APP 产品都无法集成进去。我希望依赖库能尽量地精简,这样打包进 APP 的内容能尽量地少。所以我在春节期间在 github 上启动了一个 Caffe-Mobile 项目,将 Caffe 移植到 Android/iOS 上,并实现了以下目标:

NO_BACKWARD:手机的电量和计算能力都不允许进行模型训练,所以不如干脆移除所有的后向传播依赖代码,这样生成的库会更小,编译也更快。

最小的依赖。原始的 Caffe 依赖很多第三方库:protobuf, cblas, cuda, cudnn, gflags, glog, lmdb, leveldb, boost, opencv 等。但事实上很多依赖都是没必要的:cuda/cudnn 仅支持 GPU, gflags 仅为了支持命令行工具,lmdb/leveldb 是为了在训练时更高效地读写数据,opencv 是为了处理输入图片,很多 boost 库都可以用 c++0x 库来替换。经过精简和修改部分代码,Caffe-Mobile 的第三方库依赖缩减到两个:protobuf 和 cblas。其中在 iOS 平台上,cblas 用 Accelerate Framework 中的 vecLib 实现;在 Android 平台上, cblas 用交叉编译的 OpenBLAS 实现。

相同的代码基,相同的编译方式。两个平台都采取先用 cmake 编译 Caffe 库(.a or .so),然后再用对应平台的 IDE 集成到 app 中。编译脚本使用同一个 CMakeList.txt,无需将库的编译也放到复杂的 IDE 环境中去完成。

可随 Caffe 代码更新。为了保证开发者能追随最新 Caffe 代码更新,我在修改代码时使用了预编译宏进行分支控制。这样进行 diff/patch 时,如果 Caffe 源码改动较大,merge 时开发者可以清楚地看到哪些地方被修改,是如何改的,更方便 merge 最新更新。

除了 Caffe 库外,在 Caffe-Mobile 项目中还提供了 Android/iOS 两个平台上的最简单的 APP 实现示例 CaffeSimple,展示了在手机上使用 Caffe example 里的 MNIST 示例(深度学习领域的 Hello World)训练出来的 LeNet 模型预测一个手写字符 “8” 图片的过程和结果。 Caffe-Mobile 项目的地址在:https://github.com/solrex/caffe-mobile 欢迎体验,感兴趣的同学们也可以帮忙 Star 下 :)

Jabra Freeway车载蓝牙

本人有幸在北京市缩减摇号规模前,半年,摇到了一个小客车指标,购入了一辆 2013 款别克凯越汽车。当然,出于一贯地性(kou)价(men)比考虑,选择了自动挡低配款,也就是 14 寸钢轮毂、无天窗、无 VoiceLink、非真皮座椅、无倒车雷达。通过团友的争取,倒是赠送了倒车雷达——这东西的确有用。

开车总有需要打电话的时候,虽然不愿意冒险手持来接,但每次上车都要塞耳机也挺烦人的,于是穷人就开始羡慕高端的车载蓝牙。一个偶然的机会发现了 Jabra Freeway 这个车载蓝牙,据说美国亚马逊打折,我就拜托一个同学帮忙买了一个。价钱是450块不到,比京东卖的便宜多了。使用了半年,这里整体做个评价,供感兴趣的朋友参考。

Jabra Freeway
充电中的 Jabra Freeway

这个东东用法呢,就是卡在汽车的遮光板上,当作车载蓝牙使用,免去了(忘)戴蓝牙耳机的烦恼。从我的使用过程来看,有几个优点值得夸一下。

一是易用。自动感应开关车门开关机,进入汽车以后蓝牙就会自动连接上;可连接两部蓝牙手机;连接部分手机时,可以在手机上显示 Freeway 的剩余电量;来电自动播报号码或姓名。这样上下车时完全不用理会它的存在,来电后只要点一下最大的通话按钮就能接通,省心。

二是声大。在声音表现上,其实它就是个蓝牙音箱,而且你在外出时也完全可以把它就当成个音箱用。这个音箱的声音能盖过车载音响。如果上高速或者车里开着广播,手机导航的播报声音就会显得很小,有 Freeway 放大音量,完全没有任何问题。音量控制按钮也很清楚,不会按错。

三是耐用。充一次电,差不多能撑两三个月,还是在经常使用导航外放音量的情况下。可以直接连点烟器充电,即使路上没电了也不用担心。

因为车载音响播放的是 U 盘,很方便,完全不需要手机通过 Freeway 再用 FM 发射音乐到车载音响。所以高级功能 RDS 完全没用过,不予评价。

下面说一下缺点,就是傻!在买来的第一天,我就把它刷成了中文系统,因为这样才能准确念出来电的联系人名字。但我发现这是 Freeway 中文版的唯一好处。Freeway 本来可以靠语音命令来调出“接听、重拨、回拨、电量、配对”等功能,但无论我尝试多少次,中文版的 Freeway 只能识别“配对”和“我能说什么”这两个命令,而且会把所有其它命令都识别成这两个其中之一。所以,在我这里,中文版的 Freeway 语音控制系统几乎是不可用状态。

总体来说,在关键的功能上,Jabra Freeway 没有让我失望,要知道好一点的蓝牙音箱或者蓝牙耳机也得两三百,Freeway 总比那些强多了。要是 Jabra 认真地做一下 Freeway 的中文版固件,把语音识别率做高一些,就完美了。

更新:13 年 9 月 Jabra 更新了一下固件,语音命令识别比原来好多了!

TCP Fast Open by Google 浅析

Google 将在今年 12 月的 ACM CoNEXT 会议上发表他们在改善 Web 应用响应时延方面的一个工作,通过修改 TCP 协议利用三次握手时进行数据交换的“TCP Fast Open”。虽然 paper 是两天前才释出,但相关的 RFC 草案则早在 2011 年 3 月份就提交到了 IETF,并且在两周前进行了一次 UPDATE,这里是 DIFF

对于 TCP Fast Open 方案的内容,淘宝的一个朋友已经根据 RFC 草案进行了解读。我就不再赘述,感兴趣的朋友可以去看 paper 或者 RFC。我这里只是想讨论一下这个东西的应用前景。

由于对背景并没有做深入了解,我相信已经有很多人尝试去做过类似的工作,但我想类似的工作应该没有得到过大规模的应用。对于已经成型很久很久的 TCP 协议,让人很难有修改它的欲望,因为改那么底层的东西意味着很多很多的麻烦。

但是是否愿意付出代价,有一个前提是有没有足够的好处。TFO 给出的好处是:在 RTT (Round Trip Time) 比较低时,客户端页面加载时间优化大约在 4%~5%;RTT 越长,好处越大,平均大约在 25%。

Google TCP Fast Open Evaluation
Google TCP Fast Open Evaluation

除了页面加载变快改善了用户体验之外,TFO 给服务器端也带来了一些好处。由于每个请求都节省了一个 RTT,相应地也减少了服务器端的 CPU 消耗。paper 中给出的数据是每秒事务数由 2876.4 上升到 3548.7。

虽然 paper 中大部分时间在强调 TFO 对 web 页面加载的显著加速作用,但我认为即使 TFO 能成为互联网标准,它目前的状态离成为标准还有很长一段距离,因而在短期内它是无法影响到主流互联网世界的。但这并不意味着它没有机会,依小弟的愚见,目前它的推广应用可能有两个方向:

1. 移动互联网。移动互联网的 RTT 目前远大于传统互联网(常理推测,需数据支撑),因而一个 RTT 节省的效果无法被忽视;另外移动互联网终端操作系统多样化,不像桌面终端系统那么单一。 Google 自己就掌握着其中一个很重要的 android,百度也计划推出自己的“易平台”。这些互联网公司有动力去改善移动用户访问自身网站的用户体验。

2. 互联网企业数据中心。虽然数据中心内部访问时延很低,但对于典型的请求/响应的服务而言,减少一次 RTT 带来的好处还是有吸引力的,最起码能减少计算能力浪费和增加吞吐吧。再加上很多企业内部使用的都是定制的开源操作系统和定制的网络库,升级的代价并不是那么高。如果我是企业基础设施的负责人,我想我会很慎重地考虑这个方案的。

无线Wi-Fi路由器的信道选择

早上起来看到一个朋友抱怨 Kindle 无法连接无线路由器,我有感而发,写了下面这篇微博

很多人从来没有注意过路由器的 wifi 频道,以为只要笔记本电脑能连上,无线路由就没问题。但有个问题是很多移动设备不能支持全频道,其中即有功耗考虑,也有销售目标国家考虑。因此有条件时最好检测一下信噪比,选择一个最适合自己的频道,而不是让路由器启动时自己去选择。

但接着又有朋友说:“求普及...”。参考 Avinash Kaushik 在他的网站统计博客“Occam's Razor”成立 5 周年时的感慨(这篇文章很值得一读,very inspiring),我想即使我不是专家,分享一下自己知道的这点儿事也不错。

切入正题,现在很多家庭都有了自己的无线 Wi-Fi 路由器,也有了各种接入互联网的移动设备:笔记本、上网本、手机、平板电脑、电纸书、MID(已没落)。很多移动设备联网时都会出现诡异问题,这篇文章仅仅关注其中一种诡异问题:错误的信道(Channel,也译为频道、频段)配置导致无法联网或者信号较差。

精确的技术知识我就不解释了,感兴趣的同学可以去读 Wikipedia Wi-Fi 或者 IEEE 802.11 等词条。下面主要说明为什么需要配置无线信道以及如何选择无线信道。

为什么需要配置无线信道?

相信大家都使用过收音机。使用收音机时,都有一个选台的问题,无论你是用旋钮、按键或者触摸,你总要选定某个台,才能收听该台的节目。无线路由也一样。你家里的无线路由器会广播一个 SSID (就是你看到的无线连接名),点击该连接,就会使你的电脑调制到该连接所在信道进行通信。

但是使用收音机时,可能会有这样的问题:1. 有些台根本收不到,比如你的收音机不是全波段的;2. 有些台杂音太大听不清,比如某些唢呐电台。同理到你的无线环境上,问题 1 转化为“笔记本电脑(全波段收音机)能连接无线路由器,但平板电脑(非全波段收音机)却无法连接”;问题 2 转化为“能连接到无线路由器,但干扰太多,达不到最大的网速(这个网速指 Wi-Fi 连接速度,与 ADSL 网速无关)”。

如果没有手动配置过,无线路由器会自动选择一个默认或者随机的信道进行广播和连接建立。在设备没有联网问题和周围没有别人使用时,这是 OK 的。

但如果你周围的人家都有无线设备,且大家用的都是同一款运营商赠送的无线路由器(或无线猫)时,那么极有可能所有人都选择了同一个信道进行通信。这就会造成很大的信号干扰,这一般影响不到网速——除非你家用的 ADSL 大于 4M,但会造成家里两台设备之间数据传输速度极慢,例如用豌豆荚往手机上无线发送视频文件时。

如果不巧的是你家无线路由器会随机选择信道,那么它极有可能选择到一个你设备不支持的信道。我就曾经遇到过爱国者某型号 MID 只支持信道 1-9 但无线路由器自己选择了信道 11 的情况,那是死活也连不上啊!移动设备出于降低功耗或其它考虑,不支持某些信道是很正常的;再加上不同国家对无线信道管制情况不同(参见 List of WLAN Channels),其它国家的水货设备到了国内可能也会水土不服。

幸运的是,你不能控制广播电台的波段,却可以控制自家无线路由器的无线信道。修改无线信道的方法请参考各路由器厂商的帮助文档,或者在网上寻求帮助。不过在修改之前,你还面临着,我该改到哪个信道呢?

如何选择无线信道?

首先,要选择自己通信设备都支持的信道。不过在此之前,首先确认所有设备都支持同一协议,比如你移动终端不支持 IEEE 802.11n,你非得在路由器上用 802.11n 协议,这就是找不自在了。这些知识要参考设备的手册,或者自己尝试。在 Linux 系统中,可以用 iwlist channel 列出移动终端支持的所有信道,比如 Kindle 支持的信道就是(看到这里我基本可以肯定那哥们 Kindle 问题不是因为信道了,除非他用的是日本产路由器):

[root@kindle root]# iwlist channel
lo        no frequency information.

wlan0     13 channels in total; available frequencies :
          Channel 01 : 2.412 GHz
          Channel 02 : 2.417 GHz
          Channel 03 : 2.422 GHz
          Channel 04 : 2.427 GHz
          Channel 05 : 2.432 GHz
          Channel 06 : 2.437 GHz
          Channel 07 : 2.442 GHz
          Channel 08 : 2.447 GHz
          Channel 09 : 2.452 GHz
          Channel 10 : 2.457 GHz
          Channel 11 : 2.462 GHz
          Channel 12 : 2.467 GHz
          Channel 13 : 2.472 GHz
          Current Frequency:2.412 GHz (Channel 1)

其次,在干扰不能容忍情况下,再去选择干扰较少的信道。这个可以通过扫描周围信号强度比较高的 SSID 都在使用哪些信道,通过和信道列表图谱比较,选择可能干扰较小的信道进行尝试。RSSI 和 SNR 测试需要专门的知识和工具(例如 Linux 下的 iwconfig),对普通人来说可能比较费力。

[root@kindle root]# iwconfig      
lo        no wireless extensions.

wlan0     AR6000 802.11g  ESSID:"mosaic" 
          Mode:Managed  Frequency:2.412 GHz  Access Point: 00:23:EB:B7:E6:94  
          Bit Rate=54 Mb/s   Tx-Power=16 dBm   Sensitivity=0/3 
          Retry:on  
          Encryption key:off
          Power Management:off
          Link Quality:49/94  Signal level:-46 dBm  Noise level:-96 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

最后总结一下,随着移动终端的发展,越来越多的移动终端支持更全的信道,但总有那么个别的终端厂商比较变态。因此本文谈到内容仅仅是作为一个提醒,在解决无线连接问题时作一个参考。

播客和其它

每隔一段时间,我都会到 Google Analytics 里面检查我博客的引入链接,主要关注那些个人网站,经常会发现一些有趣的人和事。今天逛到的博客提到了 Linux 下的 podcast 客户端,我忽然感了兴趣,然后就开始找一些有趣的 podcast 资源。

就客户端来讲,尝试了几个,发现 Windows 下的 podcast 客户端中,iTunes 还是最好的一个。当然,我的标准中有一条“支持代理服务器”,就刷掉了很多软件。而中文的稳定更新的 podcast 更没有多少,现在听的几个主要来自我爱 Podcast阅微堂的两篇文章。

让我比较不习惯的一个,是锵锵三人行的 podcast。这个 podcast 是由毛豆工作室 制作的,他们为 podcast 设置了下载密码。只有捐款了的会员,才能有固定的下载密码;未捐款用户则只能使用10分钟左右变更一次的guest密码下载。更绝的是,guest 密码的获取方式非常奇特,你必须准确点击到在一个 Google 图片广告上迅速移动的链接,才能看到图片形式的密码;稍有不慎,就只是点开了 Google 的广告,而得不到密码。

虽然我认为费力制作并租用服务器发布 podcast,收费提供也无可厚非,但是使用如此之戏弄用户的把戏提供 guest 密码让我无法认同。破解这种把戏其实也很简单,找出图片的链接,然后请求图片时在 header 中加上到原页面的 referer,就可以直接 GET 到图片了。当然,为了方便,可以将提取图片的 php 脚本扔到自己的服务器上,用浏览器刷新就可以直接得到密码了。

关于 podcast,我还有一个想法:有没有人将安装系统或者使用软件的教程做成 podcast?我想这样做应该很有趣,比如我们要安装 Ubuntu,只需要挂着个 mp3,按照里面声音一步一步走:“哦,现在把光驱打开,把光盘放进去,按 F12 进入启动选择界面,……”。

除了捣鼓 podcast 之外,我前几天还把 WordPress 升级到了 2.9.2。之前 2.7.1 用习惯了,尝试升级了几次都出问题,于是就一直停在了 2.7 版本。这次升级主要是考虑到安全问题,毕竟软件的时间越久越容易被人发现漏洞。升级仍然出现了一些小问题,主要的原因是 WP 运行时占用的内存超过了默认的 32M,在 wp-config.php 中加大内存就没事了。

在博客侧栏增加了来自阿里妈妈的广告,原因无它,只是为了尝试一下阿里妈妈的用户体验,钱估计是赚不到的。

上周五睡觉时,小腿脚踝上方不知不觉地被暖手宝烫出了一个滴溜溜圆的蚕豆状水泡。不能穿高帮的鞋子,只好两只脚穿不同的鞋。目前已经到医院上了三次药,在好转中。

宿舍原来空调风机功率太小,一直不暖和,2月下旬回来给敲掉了。期间下了两三场雪,供暖都快结束了,今天才装上新风机。只要开机就一股暖气片漆的味道,于是干脆放那不开它了,冷点儿也比吸化学毒气强。

我的 Facebook 帐号十几天前被关闭了,我发了封信申诉,一直没消息。昨天早上照常地清空了一下垃圾箱,在删除那一瞬间看见了 Facebook 的回信,真郁闷。不过虽然没看到回复,Facebook 是可以登录了,这是好事儿。

又薅移动的羊毛了,充 300 送 140 的公交卡。正好有张非学生卡,毕业了总是要用的,干脆充上得了。上个月是 50M 的流量,结果只用了不到 30M,这个月关了 5块 30M 的套餐,结果发现 20M 貌似又有点儿不够用了。

在 Twitter 上无意中发现一对可爱的恋人,经常连载一些类似博客的有趣的事,于是 fo 了,刚才发现那男孩儿把我 block 了,大概是不想被人关注吧。天晓得我怎么找到的这种 follower 和 following 都是 1 的用户。另外,看别人在 Twitter 上谈情说爱和吵架都是顶好玩的事情!

三星手机 Java 开发-Hello World 篇

摘要:

这篇文章主要介绍了在 Windows 平台上使用 NetBeans 和 Samsung SDK 构建三星手机 Java 开发环境,建立和调试简单 Java 程序的过程。

目录:

1. 工具
2. 安装和配置开发环境
3. Hello World 程序
4. 在三星模拟器(Samsung Emulator)上调试
5. 结论
6. 参考文献

1. 工具

Windows XP: SamsungSDK 不支持 Windows Vista.

JDK version: 1.6.0_03: 这个版本不重要,自己去下载好了。

NetBeans IDE 6.01(Mobility) Chinese Edition:
http://zh-cn.netbeans.org/download/6.0/ml/netbeans-6.0.1-ml-mobility-windows.exe

Samsung Java SDK 1.0.2
http://developer.samsungmobile.com/Developer/resources/SamsungSDK/SamsungSDK_1.0.2.zip
这个版本的 SamsungSDK 支持的三星手机型号为:
D900 (D600, D820, T809)
E200 (E380, E390, E500, E780, E830, P200, T509)
E250
E590
E740
E790 (E490, E530, E570, E620, E720, E880)
E900 (D800, D830, D840, P900)
F500 (F500, P300, X820, Z370)
J600
L760 (Z140, Z150, Z170, Z230, Z240, Z240E, Z300, Z310, Z360, Z500, ZM60, ZX10, ZX20, ZV40, ZV60)
P310
U100
U600 (U300)
U700 (P910, P920, P940, Z400, Z540, Z560, Z720, ZV50)

2. 安装和配置开发环境

我不知道 JDK 是否必须安装的,因为我电脑里老早就安装上了,但是做 JAVA 开发嘛,JDK 总是需要的,所以建议首先安装 JDK。

安装完 JDK 之后,安装 SUN 公司的 JAVA 集成开发环境 NetBeans。为什么是 NetBeans 而不是 Eclipse?因为 SamsungSDK 官方支持 NetBeans。

当 NetBeans 安装完成后,接着安装 SamsungSDK。需要注意的一点是,由于 SamsungSDK 1.0.2 支持的 NetBeans 版本是 5.5,所以在安装过程中要选择是否安装 NetBeans 插件时,请选择否,因为我们使用的 NetBeans 版本是 6.01。

既然无法自动安装 NetBeans 插件,就需要我们在 NetBeans 中手动添加插件了。具体步骤如下:

一,从 NetBeans 菜单中选择“工具->Java平台”,进入 Java 平台管理器;(我们的 NetBeans 是中文版 *_*,请英文版用户自行理解。)
二,点击“添加平台”按钮,进入“选择平台类型”步骤,选择“Java ME MIDP 平台仿真器”,进入下一步;
三,在“选择要在其中搜索平台的目录”对话框中,选择 SamsungSDK 的安装目录,比如我的是 D:\Program\SamsungSDK,点击确定;
四,这时在“平台文件夹”对话框中会出现三个要检测的平台,将三个平台都勾选上,进入下一步;
五,在“已检测到的平台”对话框中,将三个平台都勾选上,选择“完成”,这样我们的开发环境就配置完成了。

3. Hello World 程序

下面介绍在 Samsung Java 开发环境下如何建立并在模拟器上运行一个 Hello World 项目:

一,“文件->新建项目”,在对话框中项目“类别”选择“Mobility”,然后在右侧“项目”中选择“MIDP 应用程序”,点击下一步;
二,将项目名字更改为“HelloWorld”,项目位置可以自行修改,比如我的就是 D:\J2ME,下面两个“设置为主项目”和“创建 Hello MIDlet”保留为默认值,进入下一步;
三,在“选择缺省平台”对话框中,“仿真器平台”选项选择为“SamsungSDK 1.0”,在设备下拉条中,选择目标平台,比如我的手机是 E908,和 E900 是一类,我就选择“SGH-E900”,其它选项保持不变,进入下一步;
四,在更多配置中用户可以自定义更多配置,刚开始使用可以保持不变,点击完成。

这样我们就建立了一个 Samsung Java 的 Hello World 项目,可以查看它的源代码。由于我们在配置时选择了“创建 Hello MIDlet”选项,此时的源程序已经包含了打印一个“Hello World”的功能,我们只需要在菜单中选择“生成->生成主项目”,即可生成 Hello World 项目。

生成项目后,在项目文件夹里可以找到 dist 目录,比如我的就是 D:\J2ME\HelloWorld\dist,这个目录里面包含了可以在 SGH-E908 上安装并运行的 JAVA 程序:HelloWorld.jar 和 HelloWorld.jad。看着很眼熟吧,对,这和普通的 JAVA 游戏形式是一样的,我们可以把这两个文件下载到手机里并安装它。(不同版本安装方法不一样)

SGH-E908 的安装方法是:先将 jar 和 jad 文件下载到手机的 other files 文件夹中,在待机状态下输入 *#9998*5282#,然后选 3,输入密码 235282,选择 jad 文件安装即可。

安装完程序后,我们可以在自己的 Java world 中找到它,运行后,屏幕上会打印出来一行字符:HelloHello, World! 这样,我们的第一个 Samsung Java 程序就成功了。

4. 在三星模拟器(Samsung Emulator)上调试

当然,我们写嵌入式程序不可能一次成功,总会有需要找 BUG 的时候,那么如何进行调试呢?仍然以我们 Hello World 程序为例:

一,先在程序中设置断点,在要设置断点的行前点击边框即可,比如我在 startApp() 函数中的 initialize (); 一行前设置了一个断点;
二,选择“运行->调试主项目”,就可以开始我们的调试了,耐心等待一会儿,会发现弹出了一个 E908 模拟器的窗口,窗口中写着:Select on to launch,因为只有唯一的一个 HelloMIDlet,所以我们直接选择右下角的 Launch,直接点 Launch 是没用的哦,你要点模拟器的手机键盘,作用和按下手机上某个键是一样的。
三,点下 Launch 之后,激活窗口会重新返回到 NetBeans 中, initialize (); 行前有一个右箭头,指代程序已经运行到断点,我们点“运行->继续”,程序就会继续运行,在模拟器中打印出:HelloHello, World!,并在左下显示 Exit 标志,表示程序运行结束。

如果在第三步产生问题,可能是由于在前面介绍中,我们先“生成主项目”造成的调试信息缺失导致的,可修改设置,更直观的方法是重新建立新项目并跳过生成主项目那一步,使用“运行->运行主项目”或者“运行->调试主项目”来生成主项目文件。

5. 结论

三星手机提供的开发环境在一定程度上还是比较易于使用的,这篇文件对三星手机开发环境的建立做了一个简要的介绍,提供了中文入门导引,降低了中文世界初学者学习的难度。

6. 参考文献

[1] Samsung SDK 1.0.0 Documentation

solrex.cn 的新子域名

由于对某些服务感到新鲜,所以为我的域名添加了几个子域名:

1. http://m.solrex.cnhttp://wap.solrex.cn

我的手机版博客,使用 WireNode 提供的服务,上面两个域名均重定向到 http://solrex.wirenode.mobi,我用自己的手机访问测试正常。

2. http://feed.solrex.cnhttp://feeds.solrex.cn/solrex

将博客 FeedSkyFeedBurner 烧录绑定到了自己的域名,不影响原有的 feed 地址。

其中 http://feed.solrex.cnFeedSky 提供的域名绑定服务,http://feeds.solrex.cn/solrexFeedBurner 提供的 MyBrand 服务,这两个域名均为直接 CNAME 绑定。所以,FeedBurner 那个在国内仍然无法正常访问,不过可以通过阅读器订阅。