mac中的top命令

On 八月 27, 2011, in mac os, by pensz

我相信很多开发人员选择mac除了它有很酷的界面外,它还是unix系统,在系统内置了很多unix的程序。

top就是很常用的一个程序,使用top的原因有以下:

  1. 虽然mac中有活动监视器,但top命令来的快
  2. gui程序不一定任何时刻都能正常运行,我亲身经历过强制退出没有效果,但可以在命令行 kill -9 <pid>(当然qq视频那个现象就无语了,直接将整个屏幕占满,任何操作都无效,只能眼睁睁的看着鼠标可以移动,但干不了任何事情)

之前一直依着linux的习惯在top运行时按M(按使用内存排序)、P(按CPU占用率排序)以及h(帮助),但在mac下却没有效果。我想可能mac下的top不支持这些吧,每次用完就不管了,也懒的google和man,今天忽然想到了在top运行时按?键,结果真出现了帮助菜单。

o<key>         Set primary sort key to <key>: [+-]{command|cpu|pid|prt|reg|rprvt|rshrd|rsize|th|time|uid|username|vprvt|vsize}.

按CPU排序是ocpu,按内存排序是ovsize。

人是懒惰的,是有惯性的。

 

别了,摩托罗拉

On 八月 16, 2011, in 技术记录, 自言自语, by pensz

惊闻摩托罗拉移动被google收购,虽是情理之中,但事实真的发生后还是让我吃了一惊。

摩托罗拉是无线电话的鼻祖,早在二战时期,美国大兵就使用moto的无线通讯设备,moto的大哥大,bp机更是一个时代的标志。

在数字通讯到来的时候,moto的行动迟缓,结果败给了诺基亚等新兴的通讯公司(当然,诺基亚的行动迟缓又使他目前在智能机市场处于劣势)。

moto还制造、生产芯片,mac当年的芯片就是摩托罗拉的,因为摩托罗拉当时cpu的性能是超过intel的,但他也没有抓住这一次机会,如果当年在芯片上面能够奋力一搏,也不会有今天的intel和AMD的存在了,我们用的电脑也许更快,更省电。

 

历史没有如果,时光永远不会倒流。同类的电话发明者美国电话电报公司陨落了,如今轮到无线通讯的摩托罗拉败走麦城。

如此看来,还真是很佩服ibm这样的公司,能够跟随历史的潮流,百年仍然昌盛。

 

推荐阅读《浪潮之巅》,可以帮自己了解很多过去科技界的辉煌和衰落的过程,从中提高自己的判断力。

附:浪潮之巅在线阅读

第一章 帝国的余辉(AT&T)

  1. 百年帝国
  2. 几度繁荣
  3. 利令智昏
  4. 外来冲击

第二章 蓝色巨人(IBM)

  1. 赶上机械革命的最后一次浪潮
  2. 领导电子技术革命的浪潮
  3. 错过全球信息化的大潮
  4. 他也是做(芯)片的
  5. 保守的创新者
  6. 内部的优胜劣汰

第三章 “水果”公司的复兴(乔布斯和苹果公司)

  1. 传奇小子
  2. 迷失方向
  3. 再创辉煌
  4. 大难不死

第四章 计算机工业的生态链

  1. 摩尔定理(Moore’s Law)
  2. 安迪-比尔定理(Andy and Bill’s Law)
  3. 反摩尔定理 (Reverse Moore’s Law)

第五章 奔腾的芯(英特尔——Intel)

  1. 时势造英雄
  2. 英特尔摩托罗拉之战
  3. 指令集之争
  4. 英特尔和 AMD 的关系
  5. 天步艰难

第六章 互联网的金门大桥(思科)

  1. 好风凭借力
  2. 好风凭借力(续)
  3. 持续发展的绝招
  4. 竞争者

第七章 硅谷的见证人(惠普公司)

  1. 昔日硅谷之星
  2. 争议的生死抉择
  3. 最有争议的CEO
  4. 亚洲制造的冲击
  5. 峰回路转

第八章 没落的贵族(摩托罗拉)

  1. 二战的品牌
  2. 黄金时代
  3. 基因决定定理
  4. 铱星计划
  5. 全线溃败
  6. 回天乏力

第九章 硅谷的另一面

  1. 成王败寇
  2. 嗜血的地方
  3. 机会均等
  4. 硅含量不断降低
  5. 亘古而常青

第十章 短暂的春秋——与机会失之交臂的公司

  1. 昔日的辉煌(Sun Microsystems)
  2. 错失良机(Sun Microsystems)
  3. 历史的回放(Sun Microsystems)
  4. 局域网的微软(Novell)
  5. 网景公司(Netscape)
  6. Real Networks

第十一章 幕后的英雄——风险投资(Venture Capital)

  1. 风投的起源
  2. 风投的结构
  3. 风投的过程
  4. 投资的决策和公司的估价
  5. 风投的角色
  6. 著名的风投公司

第十二章 信息产业的规律性

  1. 70-20-10律
  2. 诺威格定理
  3. 基因决定定理

第十三章 高科技公司的摇篮 — 斯坦福大学

  1. 充满传奇的大学
  2. 硅谷的支柱
  3. 纽曼+洪堡的教育模式
  4. 创业的孵化器

第十四章 科技公司的吹鼓手:投资银行

  1. 前言 有幸见证历史
  2. 华尔街和美国的金融体系
  3. 著名的投资公司
  4. 科技公司的上市过程
  5. 成也萧何、败也萧何
  6. 华尔街与微软、雅虎和 Google 的三国演义

第十五章 成功的转基因

  1. 从木工厂到手机之王(诺基亚 Nokia)
  2. 道琼斯的常青树(3M)
  3. 世界最大的联合体(GE)
  4. 百年扩张,从有线电到无线电
  5. 从实体经济到金融
  6. 领袖的重要性

浪潮之巅第十六章

  1. 印钞机——最佳的商业模式(一)
  2. 印钞机——最佳的商业模式(二)
  3. 印钞机——最佳的商业模式(三)
  4. 印钞机——最佳的商业模式(四)

 

 

Tagged with:  

java中HashMap和HashTable的比较

On 八月 12, 2011, in 技术记录, by pensz

1 HashMap 和 HashTable 都是通过链接法解决碰撞

通过链接法解决碰撞,点击放大图片

链接解决碰撞,摘自算法导论第二版135页


2 HashMap 的hash函数更加牛一些,另外支持null的key(这其实是一个支不支持的问题)

3 javadoc中写道:除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。从具体代码来看,HashMap代码的方法前面没有加synchronized,而HashTable的方法前面加了synchronized;另外,HashTable不支持null是“全面”的,key 和 value都不能为null

4 HashMap计算key对应的bucket(桶)所使用取模算法中,HashMap是二进制的 & (table.length – 1),而HashTable 是 % table.length,显然HashMap更加牛些

5 HashMap的查找,插入性能更加好,因为它中间会对key的hashCode再做一次hash,使其尽量均匀分布,而HashTable基本依赖于key的hashCode()

选择的原则:尽量使用HashMap,如果有同步方面的需求,自己可以在外面做控制。

Tagged with:  

悲惨的mac输入法更新经历

On 八月 7, 2011, in mac os, by pensz

江湖盛传,最近mac输入法风生水起,各家已经做的非常nb了。

我本不想再折腾这些软件了,实在没有意思;再说了,当年google出的mac输入法beta版害死一大堆人的情景历历在目(注销后登录无法输入密码),但考虑目前使用的sunpinyin和FIT在词汇量方面太少,经常影响打字的速度,故想试试新的输入法;怎么说也有两大公司推出了mac下的输入法,也都推出了正式版,应该比较稳定可靠吧。

一开始就卸载了FIT,因为我用它不是很爽。再比较一下两大输入法公司的产品:qq mac输入法和搜狗mac输入法

通过网站对比发现,qq的应该更加好点,说明详细,更新频繁,应该有保证;而搜狗的mac输入法更新不是很及时,另外说明文档没有qq那边多。这么想想,应该qq的输入法比较有保证,下载下来安装。

安装一切顺利,只是最后安装uninstaller时失败,我想想不是什么大事,就在自定义安装时,去掉了uninstaller。安装后,切换到qq拼音,系统巨卡无比,我想,初始化可能会慢点,结果后面还是巨卡,输入法设置没有出现,无法正常输入。打开活动监视器看,发现ReportCrash飘过,也就是说程序出现异常了。难道需要重启?重启了看看,结果现象依旧。我无语了,准备卸掉,结果卸载程序无法运行(应该是只能10.6以上的版本运行,从程序的异常log中也发现了一句 unknown required load command 0×80000022 ),最后只好通过命令行卸载了。

那接着只能看看搜狗的怎么样了,下载下来,兴冲冲的安装,结果提示我该输入法只支持10.6以上的系统。我还能说什么呢?唯有放弃。

虽然是两家大公司,但好像都没有打算支持10.5 leopard系统的意思,在网站上面也没有看到说明仅支持10.6以上的系统,不得不说这是个很大的遗憾。

对了,还有sunpinyin可以更新看看,抱着一丝希望,更新至2.0.3版本,结果还是挂了,现象和qq拼音一样。

sunpinyin crash

 

正如你上面看到的那样,配置面板一直无法载入;而活动监视器里面也有ReportCrash的进程。虽然网站上写的支持10.5/6,但我的确无法使用,有可能是我安装不对,也有可能没在10.5(leopard) 上面好好测试过。

再找找QIM看看了,QIM之前是mac下最好的输入法,最近听说免费了。找了很久,有新闻,有链接,但无法下载,我很无奈和绝望。

难道只能安装FIT了吗?对于这个输入法,我今天一开始就卸了它,为什么?因为我对它很有成见,之前不好好做核心功能,反而在状态栏上面多增加一个图标,被大家狠狠一顿批;还做什么截屏功能,要知道,截屏是mac自带的功能(最简单的是按 shift+cmd+4);另外给我的感觉是反应较慢,耗内存较多。

但现在是没有选择了,只好硬着头皮去下载FIT了,最后通过下载FIT,奇迹般的找到了一个网站,可以下载QIM。这个网站(http://mac.brothersoft.com/)很赞,有很多mac下的软件,而且可以直接wget下(为什么直接wget下,你懂的),如果你是10.5的系统,可以用这个链接下载(http://macfiles.brothersoft.com/business/word_processing/QIM_Sogou_2_0_0_Leopard.dmg.zip)。

最后,终于用上了QIM,QIM的确不错,安装后不需要设置就能很方便的使用了,词汇量大,反应速度也很快;这篇blog就是用QIM写的。

结论是:如果你是mac os 10.5的系统,我建议你使用QIM,其次是FIT2.2.1(2.3.0后无法使用,情况和sunpinyin一样,无法载入配置面板),再者是sunpinyin 2.0.2 (更新到2.0.3后无法使用了,不知道是个人特例还是普遍情况)。

非常感谢这么多个人开发了这么好的免费的软件供大家使用。

Tagged with:  

update使用group_contact

On 八月 3, 2011, in 技术记录, by pensz

以下讨论针对mysql。

想要达到的目的:

UPDATE users AS u
LEFT JOIN orders AS o ON o.user_id = u.user_id
SET u.orders = GROUP_CONCAT(DISTINCT o.order_id)

上面的sql无法运行,即使加上GROUP BY也是不行的

UPDATE users AS u
LEFT JOIN orders AS o ON o.user_id = u.user_id
SET u.orders = GROUP_CONCAT(DISTINCT o.order_id)
GROUP BY u.user_id

一种的不用临时表的解决方法为:
UPDATE users AS u
SET u.orders = (
SELECT GROUP_CONCAT(DISTINCT o.order_id)
FROM orders o
WHERE o.user_id = u.user_id
)

Tagged with:  

在windows下编译webkit

On 八月 3, 2011, in 技术记录, by pensz

这是半年前在windows上编译、调试webkit的一些记录,可能比较乱。

windows下的webkit apple port编译的经验总结

  1. 主要参考webkit官网,在不清楚文档中每一步的作用前,老老实实的按照文档做
  2. 安装cygwin的时候要选择install from local directory, 否则会缺失包
  3. 在WebKitLibraries/win/tools/vsprops目录下面手动建立一个.svn文件夹(可以通过命令行建立)
  4. BuildLog是很好的参考资料,一旦出错,参考该log是比较容易找出问题的
  5. build-webkit 和 通过 vs编译事实上是一样的,因为build-webkit调用的是就是vs的命令行
  6. 另外dumprendertree 还是必须将vs编译的选项 treat warning as error改成 no,否则无法编译通过
  7. 在编译时还遇到一个问题,就是cl.exe报fatal错误,查了相关资料,后来没做任何处理,重新编译就可以了
debug调试
用safari作为debug总是会出错,以下为错误信息:
Unhandled exception at 0×78145215 (msvcr80.dll) in Safari.exe: 0xC0000005: Access violation reading location 0x091bfffc.
memcpy(data, characters, length * sizeof(UChar));
+ dst 0x091c0034 “” unsigned char *
+ src 0x089e9b10 “,甓” unsigned char *
count 68945734 unsigned long
memcpy(data, characters, length * sizeof(UChar));
+ data 0x091c0034 “” wchar_t *
+ characters 0x089e9b10 “Ҷ” const wchar_t *
length 34472867 unsigned int
+ string {m_ptr=0x091c0020 } WTF::PassRefPtr<WTF::StringImpl>
后来使用winLancher作为debug的工具,还是不错的。
或者使用minibrowser作为debug的工具,需要主要的是,minibrowser要attach到webkit2的进程上面
运行这个需要apple的相关dll,这些dll的位置在 C:\Program Files\Common Files\Apple\Apple Application Support
注意,不要把webkit javascriptcore相关文件复制过去。
下面是点击一个按钮到提交form对应的堆栈信息:
WebKit.dll!WebCore::HTMLFormElement::prepareSubmit(WebCore::Event * event=0x03417dc0)  Line 265 C++
WebKit.dll!WebCore::HTMLInputElement::defaultEventHandler(WebCore::Event * evt=0x03417dc0)  Line 2207 + 0×13 bytes C++
WebKit.dll!WebCore::Node::dispatchGenericEvent(WTF::PassRefPtr<WebCore::Event> prpEvent={…})  Line 2747 + 0x1b bytes C++
WebKit.dll!WebCore::Node::dispatchEvent(WTF::PassRefPtr<WebCore::Event> prpEvent={…})  Line 2631 + 0×12 bytes C++
WebKit.dll!WebCore::Node::dispatchUIEvent(const WTF::AtomicString & eventType={…}, int detail=1, WTF::PassRefPtr<WebCore::Event> underlyingEvent={…})  Line 2799 + 0×22 bytes C++
WebKit.dll!WebCore::Node::defaultEventHandler(WebCore::Event * event=0x03ec3548)  Line 3021 + 0×23 bytes C++
WebKit.dll!WebCore::HTMLFormControlElementWithState::defaultEventHandler(WebCore::Event * event=0x03ec3548)  Line 472 C++
WebKit.dll!WebCore::HTMLInputElement::defaultEventHandler(WebCore::Event * evt=0x03ec3548)  Line 2442 C++
WebKit.dll!WebCore::Node::dispatchGenericEvent(WTF::PassRefPtr<WebCore::Event> prpEvent={…})  Line 2747 + 0x1b bytes C++
WebKit.dll!WebCore::Node::dispatchEvent(WTF::PassRefPtr<WebCore::Event> prpEvent={…})  Line 2631 + 0×12 bytes C++
WebKit.dll!WebCore::Node::dispatchMouseEvent(const WTF::AtomicString & eventType={…}, int button=0, int detail=1, int pageX=435, int pageY=73, int screenX=531, int screenY=178, bool ctrlKey=false, bool altKey=false, bool shiftKey=false, bool metaKey=false, bool isSimulated=false, WebCore::Node * relatedTargetArg=0×00000000, WTF::PassRefPtr<WebCore::Event> underlyingEvent={…})  Line 2924 C++
WebKit.dll!WebCore::Node::dispatchMouseEvent(const WebCore::PlatformMouseEvent & event={…}, const WTF::AtomicString & eventType={…}, int detail=1, WebCore::Node * relatedTarget=0×00000000)  Line 2833 C++
WebKit.dll!WebCore::EventHandler::dispatchMouseEvent(const WTF::AtomicString & eventType={…}, WebCore::Node * targetNode=0x03ee9b48, bool __formal=true, int clickCount=1, const WebCore::PlatformMouseEvent & mouseEvent={…}, bool setUnder=true)  Line 1845 + 0×23 bytes C++
WebKit.dll!WebCore::EventHandler::handleMouseReleaseEvent(const WebCore::PlatformMouseEvent & mouseEvent={…})  Line 1573 + 0x2f bytes C++
WebKit.dll!WebView::handleMouseEvent(unsigned int message=514, unsigned int wParam=0, long lParam=4784563)  Line 1402 C++
WebKit.dll!WebView::WebViewWndProc(HWND__ * hWnd=0x000d02da, unsigned int message=514, unsigned int wParam=0, long lParam=4784563)  Line 2052 + 0×14 bytes C++
user32.dll!77d18734()
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]
user32.dll!77d18816()
user32.dll!77d189cd()
user32.dll!77d191f1()
user32.dll!77d18a10()
WinLauncher_debug.exe!wWinMain(HINSTANCE__ * hInstance=0×00400000, HINSTANCE__ * hPrevInstance=0×00000000, wchar_t * lpCmdLine=0x00020b14, int nCmdShow=1)  Line 241 + 0×10 bytes C++
WinLauncher_debug.exe!__tmainCRTStartup()  Line 589 + 0x1c bytes C
kernel32.dll!7c817077()
更加详细的堆栈信息
WebKit.dll!WebCore::FrameLoader::submitForm(WTF::PassRefPtr<WebCore::FormSubmission> submission={…})  Line 367 C++
WebKit.dll!WebCore::HTMLFormElement::submit(WebCore::Event * event=0x03417dc0, bool activateSubmitButton=true, bool lockHistory=false, WebCore::FormSubmissionTrigger formSubmissionTrigger=NotSubmittedByJavaScript)  Line 312 C++
WebKit.dll!WebCore::HTMLFormElement::prepareSubmit(WebCore::Event * event=0x03417dc0)  Line 268 C++
WebKit.dll!WebCore::HTMLInputElement::defaultEventHandler(WebCore::Event * evt=0x03417dc0)  Line 2207 + 0×13 bytes C++
WebKit.dll!WebCore::Node::dispatchGenericEvent(WTF::PassRefPtr<WebCore::Event> prpEvent={…})  Line 2747 + 0x1b bytes C++
WebKit.dll!WebCore::Node::dispatchEvent(WTF::PassRefPtr<WebCore::Event> prpEvent={…})  Line 2631 + 0×12 bytes C++
WebKit.dll!WebCore::Node::dispatchUIEvent(const WTF::AtomicString & eventType={…}, int detail=1, WTF::PassRefPtr<WebCore::Event> underlyingEvent={…})  Line 2799 + 0×22 bytes C++
WebKit.dll!WebCore::Node::defaultEventHandler(WebCore::Event * event=0x03ec3548)  Line 3021 + 0×23 bytes C++
WebKit.dll!WebCore::HTMLFormControlElementWithState::defaultEventHandler(WebCore::Event * event=0x03ec3548)  Line 472 C++
WebKit.dll!WebCore::HTMLInputElement::defaultEventHandler(WebCore::Event * evt=0x03ec3548)  Line 2442 C++
WebKit.dll!WebCore::Node::dispatchGenericEvent(WTF::PassRefPtr<WebCore::Event> prpEvent={…})  Line 2747 + 0x1b bytes C++
WebKit.dll!WebCore::Node::dispatchEvent(WTF::PassRefPtr<WebCore::Event> prpEvent={…})  Line 2631 + 0×12 bytes C++
WebKit.dll!WebCore::Node::dispatchMouseEvent(const WTF::AtomicString & eventType={…}, int button=0, int detail=1, int pageX=435, int pageY=73, int screenX=531, int screenY=178, bool ctrlKey=false, bool altKey=false, bool shiftKey=false, bool metaKey=false, bool isSimulated=false, WebCore::Node * relatedTargetArg=0×00000000, WTF::PassRefPtr<WebCore::Event> underlyingEvent={…})  Line 2924 C++
WebKit.dll!WebCore::Node::dispatchMouseEvent(const WebCore::PlatformMouseEvent & event={…}, const WTF::AtomicString & eventType={…}, int detail=1, WebCore::Node * relatedTarget=0×00000000)  Line 2833 C++
WebKit.dll!WebCore::EventHandler::dispatchMouseEvent(const WTF::AtomicString & eventType={…}, WebCore::Node * targetNode=0x03ee9b48, bool __formal=true, int clickCount=1, const WebCore::PlatformMouseEvent & mouseEvent={…}, bool setUnder=true)  Line 1845 + 0×23 bytes C++
WebKit.dll!WebCore::EventHandler::handleMouseReleaseEvent(const WebCore::PlatformMouseEvent & mouseEvent={…})  Line 1573 + 0x2f bytes C++
WebKit.dll!WebView::handleMouseEvent(unsigned int message=514, unsigned int wParam=0, long lParam=4784563)  Line 1402 C++
WebKit.dll!WebView::WebViewWndProc(HWND__ * hWnd=0x000d02da, unsigned int message=514, unsigned int wParam=0, long lParam=4784563)  Line 2052 + 0×14 bytes C++
user32.dll!77d18734()
[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]
user32.dll!77d18816()
user32.dll!77d189cd()
user32.dll!77d191f1()
user32.dll!77d18a10()
WinLauncher_debug.exe!wWinMain(HINSTANCE__ * hInstance=0×00400000, HINSTANCE__ * hPrevInstance=0×00000000, wchar_t * lpCmdLine=0x00020b14, int nCmdShow=1)  Line 241 + 0×10 bytes C++
Tagged with: