about 3 months ago - No comments
需求 NSTextField 作为一个常用的输入控件,有些在使用时需要去限制其中可以输入文本的长度,而 NSTextField 本身并没有提供这个功能,这就需要我们自己去想办法来实现了。 方法 在网上找了一下,发现可以通过继承 NSFormatter 实现一个子类来实现这个功能,参考了一下找到的代码[1],再将主要的 isPartialStringValid 方法根据自己的需要改了一下。 – (BOOL)isPartialStringValid:(NSString **)partialStringPtr proposedSelectedRange:(NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString **)error { int size = [*partialStringPtr length]; if ( size > maxLength ) { if (origSelRange.location == [origString length]) { // 如果修改的位置在原来字符串的最后,则不做修改,只是拒绝内容修改 } else { // 如果修改的位置在原来字符串的中间,就根据剩余的可用的长度把新增加的字符串进行截取 int preLen = origSelRange.location + (maxLength – [origString More >
about 3 months ago - 22 comments
在上一个版本发布之后,过了两个月的时间,终于又有一个可以发布的版本了。 使用菜单中的“检查更新”既可完成更新,或者前往 Google Code 下载。 这次的更新如下: [FIX] 修正在 Snow Leopard 中无法在 Dock 上显示未读消息数目的bug [FIX] 修正在网页中点击旺旺图标无法打开聊天窗口的bug [FIX] 修正无法使用“指定发送”和“添加好友”功能的bug [FIX] 修正表情选择框在一些情况下引起程序崩溃的bug [FIX] 修正在聊天窗口中无法指定发送功能无法使用的bug [FIX] 修正一些菜单无法在所有窗口中使用的bug [NEW] 现在可以使用 Ctrl+N 同时运行多个 iWangWang 来实现同时登录多个淘宝帐号 [NEW] 现在如果聊天时消息发送失败,可以重新输入验证码 [NEW] 登录后会恢复上一次退出时主窗口的位置 [NEW] 表情选择框现在可以用 ESC 键关闭 [NOTE] 有bug可以在 http://code.google.com/p/iwangwang/issues/entry 提出 这次主要修正了 iWangWang 在 Snow Leopard 下的兼容性,之前的开发环境是 Leopard,没能在 Snow Leopard 中好好测试。 如果有问题请邮件至 ohdarling88 at gmail More >
about 5 months ago - 13 comments
鉴于支付宝已经发布供 Safari 使用的安全登录控件,并且 Safari 可以自动调用关联程序来打开自定义协议,所有 Safari 下的点击旺旺图标打开 iWangWang 进行聊天比较容易实现,使用一个用户脚本就行。 要实现在 Safari 中点击旺旺图标进行聊天,步骤如下: 安装 SIMBL 下载地址:http://www.culater.net/software/SIMBL/SIMBL.php SIMBL 可以理解为一个扩展加载器,因为 Safari 本身并不支持扩展机制,所有 SIMBL 使用了一种 Hack 的方式来方便加载第三方扩展。 安装 GreaseKit 下载地址:http://8-p.info/greasekit/ GreaseKit 是一个类似于 GreaseMonkey 的扩展,可以通过它在 Safari 运行用户脚本。 如果你的系统是 Mac OS X Leopard,那么可能会出现安装 GreaseKit 失败的情况,这时可以试试一位网友重新编译的 GreaseKit,下载地址,关于这个问题的讨论可以看这里。 最后,安装 iWangWang 聊天用户脚本 安装地址:http://iwangwang.googlecode.com/hg/wwprotocol.user.js 如果已经正确安装了 GreaseKit,那么在访问这个地址时,浏览器会询问是否安装“WangWang Protocol Handler”,选择“是”即可。 如果你已经将 iWangWang 放到了应用程序目录,那么在点击旺旺图标聊天时,会自动打开 iWangWang,如果 iWangWang 没有放到应用程序目录,那么你可能需要先运行 iWangWang More >
about 5 months ago - 57 comments
iWangWang 是一个在 Mac OS X 下使用的 Web 旺旺的客户端,使用 Mac 用户在淘宝购物时也可以方便地与卖家沟通,不需要每次打开 Web 旺旺,以及弥补 Web 旺旺不支持联系人列表及聊天记录的缺陷,并且目前只支持淘宝网帐号登录。 iWangWang 使用 REALbasic 编写,因为是基于 Web 旺旺的,所以 Web 旺旺不支持的功能 iWangWang 也没有实现,包括但不限于旺旺群、自定义表情、文件传送,并且和某一个联系人第一次聊天时,需要输入验证码。 注意: 这纯粹是我个人出于兴趣而制作的一个程序,与公司无关。 因为使用非公开接口,协议通过黑盒分析所得,因此有可能会由于 Web 旺旺修改通信协议而导致程序无法使用。 由于缺乏艺术细胞,因此程序界面仿照 MacQQ,如果觉得有内容侵犯了您的权利,请及时联系我修改,谢谢 :) 因为淘宝帐号涉及到金钱,所以如果不放心请不要使用这个程序 :) 如果有任何问题或建议,请联系 ohdarling88 # gmail dot com,或者点击菜单“文件》填写使用反馈”来填写反馈内容。 14:40 Update 更新下载链接,修正了接收带有自定义表情的消息时会导致程序崩溃的bug,如果已经下载,可以直接点击菜单“iWangWang > 检查更新” 下载地址:http://iwangwang.googlecode.com/files/iWangWang-v0.1.2.zip
about 10 months ago - No comments
在之前,我使用 ShellExecute 这个 API 来执行命令(《REALbasic 中使用 ShellExecute 执行命令》),然后通过这个方法来停止某个服务,但是今天想加服务运行状态检测,这样就可以在服务没有运行的情况下不再询问用户是否需要停止某个服务。 为了省事,我一开始决定同样使用 cmd 去执行一个命令,将服务状态输出到一个临时文件中,再通过读取这个临时文件,查找特征字符串来判断服务是否运行: // 伪代码 ShellExecute("cmd.exe /c sc query service_name > tmpfile") dim serviceStatus as string serviceStatus = TextInputStream.Open(tmpfile).ReadAll() if instr(serviceStatus, "STOPPED") < 1 then // 提示用户是否停止服务 end if 但是这样做不太靠谱,因为 sc 这个命令执行是要时间的,而 ShellExecute 是异步的,这就导致了在调用 ShellExecute 执行完 sc query 之后,临时文件 tmpfile 里并不是马上就有服务状态的内容了。 为了防止这个情况,我再加了一个临时文件内容的检测,如果为空的话,sleep 100ms,再继续读取,如果超过 10 次仍没有内容,直接当作服务正在运行来对待。 // 伪代码 More >
about 10 months ago - 1 comment
为了随时更新到 Chromium 的最新 nightly build,又不想每次去 Chromium 的网站下,还有解压,移动,麻烦……为了省事,直接用 REALbasic 写了一个 Chromium Updater,专门用来更新 Chromium。目前只支持 Mac :) 详细说明 下载(使用右键下载):ChromiumUpdater (3.5M)
about 10 months ago - No comments
今天在使用 AutoDiscovery 发送数据时,发生了错误码为 40 的错误,直接在 UDPSocket 的属性列表里找了一下,没有找到对应的错误码。 在网上搜了一下,找到这篇帖子,里面提到在发送大量数据时,UDPSocket 就会报错误,并且这个错误没有在文档中提到,因此这应该是一个系统级别的错误。 MonkeybreadSoftware 提到了 unix 的错误码定义: #define EMSGSIZE 40 /* Message too long */ 联想到在程序中是在今天开始有问题的,而且今天添加了一大堆数据,看来的确是同于 UDP 消息过大造成的错误 40。 在网上找了找,使用 UDP 发送消息时,报文的大小最好不要超过 MTU,否则会就容易丢包。我在测试时是使用的 127.0.0.1,包大小为 12.5K,照理说应该是直接走 loopback 而不需要走路由的,就算超过 MTU 也应该能发送,不清楚是不是因为 OS 内部实现机制的问题。 为了彻底解决这个问题,最后还是采用了 TCP 来传递大量数据,只使用 UDP 来传递一些控制信息。
about 10 months ago - No comments
在 REALbasic 中,如果需要执行 cmd 命令,可以直接使用 Shell 类,但是这样的话,编译成 Windows 程序时会额外需要一个 Shell.dll 的动态链接库,这对于我这样的 1exe 爱好者是不能忍受的。但是对于 Mac OS X 和 Linux 的生成目标来说,是不存在这个问题的,因为 Mac OS X 的应用程序本身就是一个文件夹,而 Linux 的目标不会生成额外的链接库。因此,需要针对 Windows 进行特殊处理。于是在网上搜索解决方案,找到了 VB 中执行程序的几种方法: 1. 使用 CreateProcess 通过 CreateProcess 以及使用管道,可以执行外部程序并获取输出,但是这个方法过于烦琐,并且我也不需要外部进程执行完毕后的输出结果,因此不采用。 2. 使用 Shell 方法 VB 里有一个 Shell 方法,但是在 RB 中并没有,所以此路不通。 3. 使用 ShellExecute 这个方法同样是一个系统 API,可以直接通过 RB 的 declare 声明并调用它,在测试之后,使用 declare 来使用系统 API 不会生成额外的 dll,正是我需要的。 首先在 RB 的某个模块中添加一个方法 ShellExecute,用来封装对系统 API 的请求: function ShellExecute(hWnd as Integer, lpOperation as String, _ lpFile as String, lpParameters as String, lpDirectory as String, nShowCmd as Integer) 注意,在 RB 中添加方法时,参数列表中的 _ 需要去掉,这里是为了排版的需要而加上的。 这个 API 是定义在 shell32.dll 中的,在 ShellExecute 方法中先需要声明: soft declare function ShellExecuteA Lib ”shell32.dll” _ (ByVal hWnd As Integer, ByVal lpOperation As CString, _ ByVal lpFile As CString, ByVal lpParameters As CString, _ ByVal lpDirectory As CString, ByVal nShowCmd As Integer) As Integer soft declare function ShellExecuteW Lib ”shell32.dll” _ (ByVal hWnd As Integer, ByVal lpOperation As CString, _ ByVal lpFile As CString, ByVal lpParameters As CString, _ ByVal lpDirectory As CString, ByVal nShowCmd As Integer) As Integer 然后来调用这个 API: dim ret as Integer Try ret = ShellExecuteW(hWnd, ConvertEncoding(lpOperation, Encodings.UTF16), _ ConvertEncoding(lpFile, Encodings.UTF16), _ ConvertEncoding(lpParameters, Encodings.UTF16), _ ConvertEncoding(lpDirectory, Encodings.UTF16), nShowCmd) Catch ret = ShellExecuteA(hWnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd) End return ret 把 More >
about 11 months ago - No comments
在公司里为了让笔记本和台式机共享文档,决定用内部的 Samba 做中转,但是在 Finder 中直接使用“连接到服务器”时,会出现“输入的文本似乎不是可识别的 URL 格式”错误,但是我输入的地址明明是 smb:// 开头的。 用这个错误信息在网上找了找,没有找到任何解决文案,遂放弃。 今天决定再尝试一下,换了个关键字,直接用“iDeneb samba”作为关键字来搜索,慢慢发掘之后还真找到了有用的信息:http://www.hackint0sh.org/f179/81233.htm 按照文中说明,到 /System/Library/Filesystems 目录下,把 afpfs.fs 删除,并重新创建到 /System/Library/Filesystems/AppleShare/afpfs.kext 的软链接,但是操作完之后还是会提示“输入的文本似乎不是可识别的 URL 格式”。 再找了找,找到了这篇:http://www.insanelymac.com/forum/i … opic=92989&st=580,似乎说是系统安装完成时 afpfs.fs 到 /System/Library/Filesystems/AppleShare/afpfs.kext 的软链接少了开头的斜杠,也就是说它的软链接地址是 System/Library/Filesystems/AppleShare/afpfs.kext。 好吧,我在之前操作的时候为了省事,直接进入 Filesystems 目录用相对路径来创建软链接的,看了文章之后,老老实实的用全路径再次创建软链接,Command+K,双击,成功连上 Samba 服务器:) 完整的操作步骤也只有两步: sudo rm /System/Library/Filesystems/afpfs.fs sudo ln -s /System/Library/Filesystems/AppleShare/afpfs.kext /System/Library/Filesystems/afpfs.fs 注意:一定不能省略了路径最开始的斜杠(/)或者使用相对路径。 所以,如果你也是用黑苹果的,也碰到了这个问题,不妨试试这个解决方法吧。
about 1 year ago - No comments
上周去把 EPC 的内存升级到了 2G,直接发现开机进不了 OSX 了。 在两天没有电脑用之后,下定决心重装系统。重装之后,能进系统,但是重新启动之后键盘和触摸板就不能用了,电池状态指示挂了,郁闷。 在网上找了找,发现可能是 dsdt 的问题。由于内存大小变了,dsdt 中的信息不正确,继而导致 ACPI 失效,然后就整个玩完了。 一个老外找到了解决方法,通过修改 dsdt.aml 文件中的内存大小信息,就可以正确进入系统了。直接下载他提供的压缩包中的 dsdt.aml,开机直接四国了…… 好吧,这个老外蛮厚道的,给出了手动处理的方法: For the 1GB: … Name (SMBS, 0×0400) OperationRegion (BIOS, SystemMemory, 0x3F7AE064, 0xFF) Field (BIOS, ByteAcc, NoLock, Preserve) { … For the 2GB: … Name (SMBS, 0×0400) OperationRegion (BIOS, SystemMemory, 0x7F7AE064, 0xFF) Field (BIOS, ByteAcc, NoLock, Preserve) { 手动修改步骤 1. 首先要下载一个 dsdt.aml 反编译的工具:ACPICA - Windows Binary Tools 2. 解压后有一个 iasl.exe,把它拷贝到 dsdt.aml 所在的目录或者把 dsdt.aml 拷贝到 iasl 的目录都行,然后在命令行中运行:iasl -d dsdt.aml 3. 按照上面的说明,使用文本编辑器打开 dsdt.aml.dsl,根据你的内存大小修改 SystemMemory 后面的数值,1G 就用 0x3F7AE064,2G 就用 0x7F7AE064。 4. 再到命令行中,运行 iasl dsdt.aml.dsl,它会生成一个 dsdt.aml.aml,把它拷贝到 OSX 所在分区的根目录,覆盖原来的 dsdt.aml 即可。或者也可以把原来的文件备份一下,方便出错的还原。 参考资料 eee 1000H(E) – DSDT files and the memory problem
about 6 months ago
话说在Cocoa里,注册自定义URL Scheme是相当简单的。
about 6 months ago
是的,所以用 REALbaisc 就杯具了,找了 Cocoa 注册协议的代码,然后找到相应的 C API,然后再用 REALbasic 定义……