在 Tomato 固件上设置 Time Machine 服务器

05月 20, 2011

网上看到的都是 ddwrt 的设置方法,而 ddwrt 和 tomato 还是有些区别的,因此在这里记录一下供参考(简单说明,需要有点 linux 的基础知识才能看明白)。我用的是 Linksys E3000,其他路由器应该差不多可能下的包不太一样。如果有遇到问题欢迎在评论中告知。

要做的事情简单说如下:

  1. 打开 tomato 中的 jffs
  2. 适用 gparted 准备外置硬盘(分区为 swap、ext3、hfs+)
  3. 具体步骤参考 这个网页的说明,记得装上 sd-idle-2.6,建议装在 /jffs 下,sd-idle 是用来设置硬盘在空闲时停转的,我设置成 10 分钟空闲即停转。

  4. 下载并安装 hfs+ 文件系统支持
  5. 下载这里的包并解压缩,将其中的 hfsplus.ko scp 到 /jffs 下面(112k),好像 hfsplus.ko 仅和 TomatoUSB 固件兼容,@petefang 的 Tomato RAF 不兼容,这种情况可以用 NTFS 分区替代从而跳过这部分,因为我们使用的是 AFP 共享,应该没有太大影响。
    我设置的启动 Init脚本为:

    #!/bin/sh
    # wait and insert kernel module hfsplus.ko
    sleep 2
    insmod /jffs/hfsplus.ko
    # Need to wait for file system, USB, automounter to come online first so wait for some period.
    sleep 10

    # Start sd-idle to auto stop USB HDD if not used after 10min
    if [ -e /var/notice/sd-idle ]; then
    echo "[sd-idle] already started; not starting."
    else
    /jffs/bin/sd-idle-2.6 -i 600
    touch /var/notice/sd-idle
    fi

    # Initialize script in /opt/etc/init.d
    for f in /opt/etc/init.d/S* ; do
    [ -x $f ] && $f start
    done

  6. 设置关闭 Shutdown 脚本

  7. for f in /opt/etc/init.d/K* ; do
    [ -x $f ] && $f stop
    done

    # cleanup
    killall afpd
    killall avahi-daemon
    killall dbus-daemon
    rm -rf /opt/var/run/*

    # Unmount Opt from flash drive
    umount /mnt/sda3
    umount /swap
    umount /opt
    sleep 5
    led usb off

  8. 此时确认 /opt 已经挂载,安装 optware
  9. 在终端里面执行如下命令(逐行拷贝执行):

    wget http://tomatousb.org/local--files/tut:optware-installation/optware-install.sh -O - | tr -d '\r' > /tmp/optware-install.sh

    chmod +x /tmp/optware-install.sh

    sh /tmp/optware-install.sh

    ipkg update

    至此,optware 应该已经装到了 /opt 下

  10. 这里下载 dbus_1.2.16-2_mipsel.ipk.zip,并 scp 到 ~ 下手动安装
  11. 用 ipkg-opt 安装这些包:avahi、coreutils、libgcrypt
  12. 这里下载更新的包,并 scp 到 ~ 下手动安装:netatalk、libdb
  13. 在 /opt/etc/init.d/ 下建立一个 S15prepare 脚本并 chmod +x S15prepare
  14. 这个脚本是用来创建 avahi 运行时需要的用户的

    if grep -q ^netdev: /etc/group; then
    # echo There already is an netdev group on the system.
    true
    else
    addgroup -g 1 netdev
    fi

    if grep -q ^avahi: /etc/group; then
    # echo There already is an avahi group on the system.
    ADDUSER_OPT="-G avahi"
    else
    addgroup -g 2 avahi
    fi

    if grep -q ^avahi: /etc/passwd; then
    # echo There already is an avahi user on the system.
    true
    else
    echo -n "No avahi user found, creating it... "
    # adduser -h /var/run/avahi -g "avahi daemon" -s /bin/false -D -H $ADDUSER_OPT avahi > /dev/null 2>&1
    echo "avahi:x:2:2:avahi daemon:/opt/sbin/avahi-daemon:/bin/false" >> /tmp/etc/passwd

    echo done
    fi
    set -e

  15. 根据这个网页另一个网页的说明配置 avahi,用 /opt/etc/init.d/S20dbus 和 /opt/etc/init.d/S21avahi-daemon 来启动 dbus 和 avahi
  16. /opt/etc/avahi/services/timecapsule_afpd.service 的内容参考这个网页

  17. 根据这个网页的说明配置 afpd ,我使用的是匿名的选项,谁知道怎么配置用户名密码登录的请告诉我
  18. 我的 afpd 相关配置如下:
    /opt/etc/netatalk/AppleVolumes.default :

    /mnt/sda3 "Time Machine" volsizelimit:4000000 cnidscheme:tdb options:usedots,tm,upriv

    /opt/etc/netatalk/netatalk.conf :
    仅更改 ATALKD_RUN=yes为

    ATALKD_RUN=no

    /opt/etc/netatalk/afpd.conf

    - -tcp -noddp -uamlist uams_guest.so -savepassword -advertise_ssh

  19. 建立一个 /opt/etc/init.d/S30afpd 来启动 afpd ,注意给脚本使用 chmod +x S30afpd

  20. #!/bin/sh
    EXE=afpd
    BIN=/opt/sbin/$EXE
    OPTIONS=""
    RUN_D=/var/run/$EXE
    case $1 in
    start)
    mkdir -p $RUN_D
    $BIN $OPTIONS
    ;;
    stop)
    killall $BIN
    ;;
    reload)
    if [ -f $RUN_D/pid ]; then
    $BIN -r;
    else
    mkdir -p $RUN_D;
    $BIN $OPTIONS;
    fi
    ;;
    restart)
    if [ -f $RUN_D/pid ]; then
    killall $BIN
    fi
    mkdir -p $RUN_D
    $BIN $OPTIONS
    ;;
    *)
    echo "usage: $0 (start|stop|reload|restart)"
    exit 1
    esac
    exit $?

  21. 将 S20dbus、S21avahi-daemon、S30afpd 复制一份为 K20dbus、K21avahi-daemon、K30afpd,供关闭脚本调用
  22. 重启路由器,等待一会儿,应该可以在 Mac 的 Finder 里面看到出来个 Time Capsule 了,点击后应该能挂载上 /mnt/sda3 的 hfs+ 卷,这时打开系统偏好设置的 Time Machine,看能否指派这个网络卷,如果不能则在 Mac 的终端执行:

    defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

    后再看,能指派网络卷后,等待 Time Machine 初始化并开始备份,之后应该可以在 Mac 的终端中关闭

    defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 0

  23. 设置 USB Support 中的 Run after mounting 和 Run before unmounting 脚本
  24. Run after mounting

    led usb on

    Run before unmounting

    killall afpd
    killall avahi-daemon
    killall dbus-daemon
    rm -rf /opt/var/run/*
    # Unmount Opt from flash drive
    umount /swap
    umount /opt
    sleep 3
    led usb off

至此应该大功告成,建议第一次的 Time Machine 备份使用千兆网连接。

后记:avahi 提示我需要 nss-mdns 的支持,因为没有找到直接能用的包,我就没有管它。如果有谁能有办法让 nss-mdns 在 Tomato 上跑起来,请告诉我。

在 DD-WRT 上配置自动路由的 OpenVPN

03月 30, 2011

DDWRT-big/mega 等多个版本都支持 OpenVPN Client,因此可以使用这个更加可靠的方式来使用 VPN 连接,避免 PPTP 和 L2TP 可能的不稳定。经过一天摸索,找到了解决方案来进行根据域名自动路由。

参考资料:http://code.google.com/p/autoddvpn/

所使用的版本是 SVN revision 16403M NEWD-2 K2.6 Eko 。

首先配置 DDWRT 可以自动成功连接上 OpenVPN,确保连接参数正常。之后打开 jffs2 的支持。

根据 autoddvpn 的介绍 http://code.google.com/p/autoddvpn/wiki/OpenVPNJFFS ,下载其上的对应脚本放置在 /jffs/openvpn 下面,之后和上面资料不一样的是,我通过路由器的 WebUI 修改 OpenVPN 的参数的方式来添加这两个脚本。在 OpenVPN中的 Services – VPN 中的 Additional Config 中加上这些:

up “iptables -I POSTROUTING -t nat -o tun1 -j MASQUERADE; /jffs/openvpn/vpnup.sh openvpn”
down “iptables -D POSTROUTING -t nat -o tun1 -j MASQUERADE; /jffs/openvpn/vpndown.sh openvpn”

单引号会被 WebUI 过滤掉导致脚本失效因此我换用了双引号,同时 Linksys E3000 的 VPN 通道是 tun1 ,而不是之前文档描述的 tun0。

然后 reboot,搞定。不需要太复杂的终端配置,大部分都能在 WebUI 下面搞定了。

苹果为什么要做 Push Notification而不是真正的“后台运行”?

04月 16, 2009

iPhone 是一个革命性的移动互联网终端,其 Multitouch 多点触控操作是在鼠标之后的又一革新。但是,在 iPhone 上迟迟不见后台运行程序的支持。虽然,从技术的角度来说,iPhone OS 在系统架构上和 Mac OS X 如出一辙,同样也支持后台程序(比如 Apple 的电话程序等,都是可以在后台运行的),但是 Apple 是从政策上不允许第三方应用程序在后台运行。其理由是技术上的“第三方程序在后台运行会消耗大量的电能,影响设备的待机时间”。但是我们依然可以看到,主流的掌上设备操作系统无一例外的支持第三方程序的后台进程,也不见得这些设备的电能受到如此大的影响。可见这个技术问题,也许只是一个托辞,那么,Apple 为什么要做 Push Notification 呢?

从我的理解来看,Apple 在 iPhone 上市初始阶段,仅允许第三方程序使用 Web App 的方式运行在 iPhone / iPod touch 的 Safari 浏览器中,并为 Safari 浏览器(确切的说是 Webkit 引擎)新增了很多特性来支持这些仅为 iPhone 开发的 Web App。并且,有一些有意思的增强可以在 Apple-Specific Meta Tag Keys 这个页面中找到。其中使用 “apple-mobile-web-app-capable” 这个 meta-tag,可以让 Web App 在 Safari 中以全屏的方式运行,这,难道不就是一个 WebOS 上应用程序的样子?

从这里再联想到 Push Notification,Push Notification 是要求开发者自己有一个 Web 服务器的,并且可以使用 Push Notification 服务来给 Apple 的服务器发送通知消息,之后这个消息会被用推送的方式转发到 iPhone/iPod touch 设备上。可以想见,这个方式,是可以同时让本机的程序,和 Web App 都可以采用的通告方式。反而,让 Web App 这样一个基于 RESTful 的 HTTP 协议下的产物在后台运行,是不现实的。

结论很简单,这一切都是为了让 iPhone/iPod touch 这个 Apple 下一代的掌上明珠,可以持续站在 Web OS 时代的最高峰。iPhone 是一个革命性的移动互联网终端。

联通的预存话费换手机方案

03月 27, 2009

OK,下面看一下联通的预存话费优惠方案。由此可见,iPhone 在国内正式上市后,大概可能的价格范围。

这里是联通当前的预存话费优惠购机方案

签约时间都是在12个月,预存12个月,每个月258/358,可以优惠1008/1608 元人民币。

iPhone 3G 在香港的售价是 8G HKD 4680 元(预存+购机费),这是包括了购机补贴的价格。而裸机是 HKD 5400,苹果产品在两地的价格差距百分比(汇率HKD:CNY 按照 0.89:1 计算,大陆的价格是香港价格的 120% 左右。而如果仅考虑近期上市的新品 shuffle/Mac mini/iMac/Mac Pro,这个比例缩小到了 114%。 因此可以看出如果iPhone 在大陆上市,很有可能的价格(裸机)是 5400 HKD * 0.89 * 114%= 5478 元左右。这个是裸机的价格方案

采取一年合约的方式,预存话费 3100 元,每个月最低消费 258 元,补贴 1008 元,则需要使用: 3100+5478-1008=7570 元。 !!!
预存话费 4300,每个月最低消费 358 元,补贴 1608 元,则需要使用 4300+5478-1608=8170 元。!!!

这里的政策是全国政策,并且还是 2G 的方案,但是在各地都有很大的灵活空间。这样来看,除非联通在终端补贴上作出很大让步,否则是不能很好打击水货市场的。

后台多任务确实不是一个必要的东西…

03月 18, 2009

iPhone 3.0 中的这个 Push Notification,有点像很多年前提出的瘦客户端的感觉。

瘦客户端,就是处理都不在本地,本地就搞定输入输出的东西,通过网络的方式,用服务器来搞定信息处理。

如果网络状况OK,并且不需要太复杂的应用的情况下,瘦客户端模式是有很大优势的,而后台运行程序,则不那么必要了。

首先,后台运行的程序,和前台的交互方式,基本只有 notification 这么个交互。比如有新的 IM 来了,提示用户有新的 IM,点一下打开阅读。后台运行只是让设备可以随时获知最新的 IM,然后即时通知用户。而 Push Notification 就是把后台运行的程序放在了云端,而已。有了这个,就根本不需要本地登录了。发送一个登录信息到服务器,说我要登录了,然后服务器处理登录,push 消息过来就是。典型的就是 meebo 这样的程序。

其次,Push Notification 应该是 Apple 提供的一个整合的服务,这样有多个程序需要发送通知,就只要一个连接就可以完成,极大节约了客户端资源和网络开销。

在 iPhone 这样一个处理资源受到非常大限制的终端上,用户需要的体验是快速的打开/切换。因此,尽量把处理的操作移到云端,解放客户端资源,这是发展的趋势。相比现在 App Store 里面很多简单的小应用都需要花费好几秒的时间来打开,运行,这不是一个好事情。本地应该是作为一个缓存的概念存在的,速度对于体验来说非常重要。

关于 iPhone OS,Apple Branded NetBook

03月 17, 2009

在一天后,就知道关于 iPhone OS 3.0 的详细情况了,在这之前,说说自己的一些猜测和想法。

首先是,Apple 要维护好一个 OS X for iPhone,再维护一个 OS X for Mac,已经是比较吃力的事情,如果还要添加一个 OS X for NetBook,应该是一个噩梦。所以,就算 Apple 要推出这样的产品,那也应该是采用现有的操作系统而非创建一个单独的版本。

其次,由于分辨率对于掌上设备比较重要,而 iPhone 上的程序都是在一个固定的分辨率下开发的。如果多一个分辨率更高的设备,则对开发者来说,会是一个噩梦。除非,分辨率无关的 iPhone 开发?这个应该不是个太大的问题,用可缩放的矢量来代替位图好了,但是这对于设备的性能又提出了更高的要求。

再来考虑 iPhone 在 Apple 产品线中的定位。可以知道的是 iPhone 刚出来的时候,是没有第三方程序的,并且其架构上一开始设计出来就是不允许第三方程序运行,这个从权限设置/内存管理等方面就可以看出,Apple 的 SDK,是仓促推出应付越狱社区的。2.0 的 SDK,也是 Apple 将自己用来开发软件的工具,加上了一些对安全性的考虑,糅合了 iTunes 的分发渠道,仓促推出的,很简单,甚至简陋。那 iPhone 是个什么角色呢?移动互联网终端。这个词听起来怎么那么耳熟?嗯,其实 iPhone 就是个 NetBook,就已经可以完成大部分 NetBook 所做的事情。

Apple 在 WWDC 上推出 SproutCore session,为的就是给开发者开发 Web Apps 提供方便的框架,这个框架和自己的 Cocoa/Objective-C 是一脉相承的。这样,再联系 iPhone 上最初只允许使用 Web App,就可以看出 Apple 是希望控制终端战略,提供内容产生和分发,这也是 Apple 一贯的商业模式。

这样,Apple 还需要推出一个介于 MacBook 系列和 iPhone 系列中间的一个全新系列的产品么?如果需要,也是这两个系列的一个延伸,还必须防止因为新产品的引入而挤压现有产品线的空间。这是个很让人头痛的问题。普遍认为 MacBook 价格相对较高,那么,一个低价的产品,可以方便访问互联网服务,轻便小巧,比 MacBook 屏幕小,这样的产品在操纵感上应该比 MacBook 差很多,应该不能算是 Mac 系列的。而这个产品价格应该要比目前的 iPhone / touch 稍高,屏幕稍大,使用同样的触控界面。这样的话,谁还需要 iPhone/iPod touch?仅仅因为价格便宜么?价格绝对不是 Apple 用来区分其产品线的依据。所谓专业级/消费级产品线才是 Apple 的划分方式。现在的 iPhone/iPod touch,就会被当作廉价版的 Apple NetBook,各方面均没有特色,只是小一些,便宜一些,这也不是 Apple 的产品区分方式。虽然在移动领域,大小确实很重要,但是将 NetBook 用来代替掌上设备,略显大,用来代替电脑,又太不实际。确实是一个尴尬的产品。

只好拭目以待了。

恢复 Safari 4 的 Inline Progres Indicator

02月 25, 2009
Safari 4 的新 Tab 很不错,可是加载进度指示条消失了,这个不好。虽然可以通过这个命令来恢复成老界面:

$ defaults write com.apple.Safari DebugSafari4TabBarIsOnTop -bool NO
但是毕竟还是蛮喜欢新的 Tab 位置的。那么可以在终端中使用如下命令(注意开始的$是提示符):

$ defaults write com.apple.Safari DebugSafari4IncludeToolbarRedesign -bool NO
$ defaults write com.apple.Safari DebugSafari4LoadProgressStyle -bool NO

这样就保留了 Safari 4 中 Tab 在顶部的设置,同时保留了原来的工具栏。

GarageBand 09 的 Basic Lesson 直接下载地址

02月 5, 2009

Guitar 的 Basic Lesson,02-09

http://downloads.apple.com/pub/lessons/basic/2Z695-0014_Guitar%20Lesson%202_Chords%20-%20G,%20C.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0015_Guitar%20Lesson%203_Chords%20-%20A,%20D.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0016_Guitar%20Lesson%204_Minor%20Chords.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0017_Guitar%20Lesson%205_Single%20Note%20Melodies.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0018_Guitar%20Lesson%206_Power%20Chords.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0019_Guitar%20Lesson%207_Major%20Barre%20Chords.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0020_Guitar%20Lesson%208_Minor%20Barre%20Chords.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0021_Guitar%20Lesson%209_Blues%20Lead.pkg

Piano 的 Basic Lesson,02-09

http://downloads.apple.com/pub/lessons/basic/2Z695-0006_Piano%20Lesson%202_Right%20Hand.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0007_Piano%20Lesson%203_Left%20Hand.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0008_Piano%20Lesson%204_Rhythm.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0009_Piano%20Lesson%205_Sharps%20and%20Flats.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0010_Piano%20Lesson%206_Rhythmic%20Accents.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0011_Piano%20Lesson%207_Major%20and%20Minor%20Chords.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0012_Piano%20Lesson%208_Scales.pkg
http://downloads.apple.com/pub/lessons/basic/2Z695-0013_Piano%20Lesson%209_Playing%20the%20Blues.pkg

MacBook / MacBook Pro 新触控板的操作方式全面解析

12月 31, 2008

新款 MacBook / MacBook Pro 的触控板和以前有了很大的变化,但是操作方式却差不多,仔细归纳了一下,没有兴趣的看总结就好。

总结一下,新款主要是取消了之前的触控板按钮,代之以整个可按压的触控板表面。这个大“触控板按钮”,按压的压力是从上到下逐渐减小的。这样让用户将点按的操作放在触控板底部区域来进行;
触控板应该可以根据接触面积来区分是使用了拇指还是其他手指,可以尝试使用拇指和食指来“双指滚动”,会发现如果拇指接触区域较大的话,是无法触发滚动的;
当拇指放在触控板上,另外一根手指移动时,会处理成鼠标移动,这个很好的兼容了之前的操作方式,同时根据初始放置的位置来对手指进行定位,即将拇指直接放在触控板上半部分,用食指无法移动鼠标,但是将拇指先放在触控板底部区域,再将拇指和食指同时移动到上半部分,则可以正常使用食指移动鼠标(这个真的很微妙);
因为要兼容之前的带按钮的操作方式,因此,所有的多指操作都需要有兼容使用拇指的选项,但是,这个兼容并没有在触控板的使用视频中得到体现,所以会让很多人以为新款需要使用食指来按按钮,改变了用户习惯,而实际上并没有改变之前的操作习惯;
正因为兼容使用拇指,因此实际上双指的滚动、缩放、旋转,都可以在放上了拇指的情况下完成,估计是对拇指进行了单独判定,和接触区域的大小、位置相关;
旋转操作和缩放操作是很有意思的一对,都是两个手指的X,Y反向变化,但是还要判断运动的路径。因此在操作缩放和旋转的时候,注意手指运动的路径是相对(在一直线为缩放),还是平行(就是旋转了);
四指切换程序,仅是简单调出切换器而已,并无法直接使用四指来切换程序,还需要移动鼠标指针,或者使用双指滚动来选择,不如可以直接使用四指在各个程序中循环来的顺畅;

下面是详细的操作方式描述

直接使用单指的操作方式:

移动鼠标指针:

在一根手指接触到触控板的情况下移动手指;
单击:

可以按下触控板上任何位置触发,需要注意的是越往上方,点按会越费力,这是一个机械按钮;
单指辅助点按:

按下触控板右下或左下的区域即可;
双指滚动:

使用两根手指接触触控板,并向同一个方向运动;
旋转:

一根手指不动,另一根手指围绕前一根手指旋转也可以;注意前一根手指的接触面积不能过大(比如使用拇指);两根手指的X,Y坐标反向变化,同时两根手指的运动方向是平行的;
放大缩小:

两根手指的X,Y坐标反向变化,同时两根手指呈直线状分开即可实现缩放;
辅助点按:

相对距离较近的双指同时按压触控板,两指之间的距离大概是触控板长宽的一半以内;
三指推送:

使用三根手指中的两根或三根向左右方滑动;需要滑动一段距离才可生效;
四指推送:

四根手指向同一个方向运动;


和前代产品“有触控板按钮,没有打开’轻拍来点按’”的情况相兼容的操作方式:

移动鼠标指针:

在一根手指(通常是拇指)接触到触控板底部区域的情况下,用另一根手指在前一根的“上方”移动;若在指针移动过程中,拇指位置发生变化,不影响指针移动,不会触发双指滚动操作;
单击:

在一根手指(通常是拇指)接触到触控板底部区域,使用另一根手指移动鼠标指针时,按下任意一根手指(通常是拇指)。这里同时按下两指,并不会触发双指辅助点按的操作;
单指辅助点按:

在移动鼠标指针时,拇指或者任意一指按下右下或左下的区域即可;
双指滚动:

通过第三根手指和第二根同时向同一个方向运动来滚动;
旋转:

拇指放在触控板底部区域上,另外两根手指的X,Y坐标反向变化,同时两根手指的运动方向是平行的;一根手指不动,另一根手指围绕前一根手指旋转也可以;
放大缩小:

拇指放在触控板底部区域上,两根手指的X,Y坐标反向变化,同时两根手指呈直线状分开即可实现缩放;
辅助点按:

或者,在一根手指(通常是拇指)接触到触控板,使用另一根手指移动鼠标指针时,在相对第二根手指距离较近的位置放上第三根手指,并用拇指(其实哪根手指无所谓)按压触控板,两指之间的距离大概是触控板长宽的一半以内;
三指推送:

使用拇指外三根手指完成操作;这三根手指同时接触时,仅移动其中两根也可;
四指推送:

使用除拇指外其他四根手指完成操作;

打开了“轻拍来点按”功能是,大体和直接使用单指的方式类似,但是增加了拖移和拖移锁定功能,和之前用法基本类似,但是也可以在大拇指接触到触控板底部区域时使用轻拍;

Apple 放出触控板固件更新程序

11月 18, 2008
今日更新系统,发现苹果已经放出了触控板固件更新程序,用于解决触控板偶尔无法响应点击的问题。

打算更新后看看情况。


加关注

Get every new post delivered to your Inbox.