tag:blogger.com,1999:blog-82031402024-03-13T11:32:45.608-07:00Kids Return所有内容未经说明都是原创。注明出处后欢迎转载。Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.comBlogger204125tag:blogger.com,1999:blog-8203140.post-60305964119270658792016-05-28T12:35:00.001-07:002016-12-23T16:09:09.805-08:00Hadoop 基本指令format the namenode:
hdfs namenode -format
$ sbin/start-dfs.sh
$ sbin/stop-dfs.sh
主要配置文件
core-site.xml
hdfs-site.xmlAnonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-37659497994664712042016-05-28T12:34:00.000-07:002016-05-28T12:34:04.135-07:00使用jenv切换Java的version
$ jenv global
$ jenv verions
$ jenv enable-plugin mavenAnonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-6563824378427353092014-12-17T20:46:00.003-08:002014-12-17T20:47:36.695-08:00[Python] Class间大小比较(达到全序)在Python 2.x中, 可以方便的使用 __cmp__ 方法来实现class object之间的大小比较.
<br />
<pre class="prettyprint">class Foo:
def __init__(self, key):
self.key = key
def __cmp__(self, other):
return cmp(self.key, other.key)</pre>
如此Foo类型的object间的大小比较就可以用key这个域的值来实现.<br />
<br />
在Python 3以后, __cmp__ 方法被移除了. 实现Foo object间的大小比较, 需要用functools.total_ordering修饰这个class以后, 实现__eq__方法以及__lt__(或者__lt__, __le__, __gt__, __ge__中的任意一个).
<br />
<pre class="prettyprint">import functools
@functools.total_ordering
class Foo:
def __init__(self, key):
self.key = key
def __eq__(self, other):
return self.key == other.key
def __lt__(self, other):
return self.key < other.key</pre>
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-40184432355798361582014-08-11T23:53:00.001-07:002014-08-11T23:53:30.343-07:00[iOS] Apple的Push Notification Service: APNS 官方介绍
<br />
<ul>
<li><a href="https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html">Apple Push Notification Service</a>
</li>
</ul>
实现Push功能的例子
<br />
<ul>
<li>Server端Php代码的例子: <a href="http://learn-php-by-example.blogspot.com/2013/01/working-with-apple-push-notification.html">Learn PHP by Example - Working with Apple Push Notification</a></li>
<li><a href="http://tanqisen.github.io/blog/2013/02/27/ios-push-apns/">一步一步实现iOS应用PUSH功能</a>
</li>
<li>Apple Push Notification Services in iOS 6 Tutorial: <a href="http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1">Part 1</a>(APNS的设置), <a href="http://www.raywenderlich.com/32963/apple-push-notification-services-in-ios-6-tutorial-part-2">Part 2</a>(iOS App的编程)</li>
</ul>
APNS notification request与response的binary格式:
<br />
<ul>
<li><a href="https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1">Provider Communication with Apple Push Notification Service</a>
</li>
<li><a href="http://cocoaintheshell.com/2014/03/apns-binary-interface-notification-format/">Changes in the APNS Binary Interface and Notification Format</a></li>
</ul>
<div>
PHP中二进制数据的处理
<br />
<ul>
<li><a href="http://songjianyong.iteye.com/blog/1561513">php pack、unpack、ord 函数使用方法(二进制流接口应用实例)</a></li>
</ul>
</div>
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-39424222791230102552014-08-09T21:26:00.001-07:002014-08-09T21:26:45.364-07:00Base64 Encodingbase64 encode是一种编码方式. 这种编码方式用来将一段二进制数据变换成为"方便传输"的文本数据. 它的核心思想是把二进制数据按每3个字节划分为一段, 然后每一段里每6个bit映射为一个文本字符来表示. 6个bit最多只有64种可能, 所以可以用a-zA-Z0-9+/ 这64个大多数字符集里都有的文本来对应.
<hr />
在Objective C中, 使用如下的方法可以在二进制数据(NSDate类型)和based64 encoded数据(保存在NSString中)相互转换.
<pre class="code">// From binary data to base64 encoded string
NSString string;
if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
string = [data base64EncodedStringWithOptions:kNilOptions]; // iOS 7+
} else {
string = [data base64Encoding]; // pre iOS7
}
// From base64 encoded string to binary data
NSData *data;
if ([NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]) {
data = [[NSData alloc] initWithBase64EncodedString:string options:kNilOptions]; // iOS 7+
} else {
data = [[NSData alloc] initWithBase64Encoding:string]; // pre iOS7
}
</pre>
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-74266576030902946802014-08-05T15:53:00.000-07:002014-08-07T22:11:03.910-07:00[iOS] iOS开发涉及到的Certificate, Provisioning Profile
<h3>
iOS development/distribution</h3>
iOS开发最基本的证书. 其实是一个private key, Xcode使用该private key对App的code签名.
<ul>
<li>iOS Development Certificate: 该证书用来在Xcode上开发一个iOS app</li>
<li>iOS Distribution Certificate: 该证书用来将一个iOS使用App Store或者AdHoc方式来分发给用户</li>
</ul>
每一个Certificate可以对应多个App.
<h3>
iOS Push service</h3>
一个经过Apple授权的SSL Certificate, 使得App后端的notification server可以连接到Apple的APNS服务.
<ul>
<li>APNS Development SSL Certificate: 在开发测试期使用该证书. APNS的sandbox 服务器:gateway.sandbox.push.apple.com:2195</li>
<li>APNS Production SSL Certificate: 在App运行期使用该证书. 并连接APNS production 服务器:gateway.push.apple.com:2195</li>
</ul>
每一个特定的SSL Certificate只能对应一个iOS App ID.
<h3>
什么是Provisioning Profile</h3>
一个被Apple使用PKCS#7标准签名过的plist文件. 这个plist文件里以key-value pair的形式保存了关于这个App的一些基本属性. 比如AppIDName,证书创建和过期日期等等.
每一个Provisioning Profile需要对应
<ul>
<li>一个AppID</li>
<li>一个development/distribution certificate</li>
</ul>
<h4>
验证一个Provisioning Profile</h4>
<pre class="prettyprint">$ openssl smime -in /path/to/your/foo.mobileprovision -inform der -verify </pre>
这个命令会输出该plist文件的文本内容, 以及"Verification successful" 如果验证成功
<h3>
参考</h3>
<ul>
<li><a href="http://%3D/" what-is-a-provisioning-profile-part-1="" www.doubleencore.com="">What is a Provisioning Profile? Part 1</a></li>
<li><a href="http://www.doubleencore.com/2013/04/what-is-a-provisioning-profile-part-2/">What is a Provisioning Profile? Part 2</a></li>
<li><a href="http://tanqisen.github.io/blog/2013/02/27/ios-push-apns/">一步一步实现iOS应用PUSH功能</a></li>
</ul>Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-11923716972001853472014-07-17T19:58:00.001-07:002014-07-17T19:58:31.773-07:00SSL certificate记点笔记<br />
什么是SSL? https协议如运作:<br />
http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/x64.html<br />
<br />
检查你的server上的SSL certificate是否有效:<br />
http://www.digicert.com/help/<br />
<br />
创立一个self-signed ssl certificate:<br />
http://www.akadia.com/services/ssh_test_certificate.html
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-67264811968373521022014-05-21T21:36:00.004-07:002014-08-05T15:52:54.590-07:00[git] 建立以及使用Git的bare repogit repo分为bare和non-bare两种. non-bare repo最最常见, 它包括一个working tree(你提交到这个git repo里的文件和目录结构)以及一个.git文件夹(其中有各种git系统文件). 而bare repo仅仅有系统文件. 一般在git server上,所有的repo都是以bare形式存在的. 通常除了admin以外,大家是不需要和bare repo打交道的.
<br />
<br />
不过事事无绝对, 我就在工作中遇到这样的一个问题需要和bare repo打交道: 我的所有源代码都放在一个远端的git的repo(比如放在github上), 可是由于某些缘故我或者不能或者不愿意在我工作环境里直接和github上的repo同步. 一个折衷的方案就是在一台自己的server上建立这个github上的repo, 然后在我的工作环境中首先和server上得 repo同步, 然后再登陆到server上把server里地repo和github上的repo同步.<br />
这样造成的问题就是server上的repo必须得是bare. 如果它含有working tree, 那么就算将server上的repo里的.git目录作为upstream加入, pull的时候没有问题, 但push的时候也会有问题
<br />
<pre class="code">$ git remote add some_remote_name ssh://apc999@myhost/home/apc999/some-repo/.git
$ git pull some_remote_name master
.. works file ...
$ git push --set-upstream ssh://apc999@myhost/home/apc999/some-repo/.git master
...
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '/home/apc999/some-repo'</pre>
<br />
<h3>
如何使用bare repo</h3>
<h4>
1 建立一个bare的git repo</h4>
<pre class="code">$ git clone --bare my_project_on_github my-project.git</pre>
注意上面命令和普通git clone不一样的地方在于参数--bare. 普通的git clone命令会生成一个working tree和.git文件夹, 而--bare这样复制出来的bare repo就不包括working tree.
<br />
<h4>
2 bare和
non-bare repo的转换</h4>
比如你的/home/apc999/my-project是一个git working tree
<br />
<pre class="code">$ cd /home/apc999/my-project
$ git config --bool core.bare true</pre>
<h4>
3 更新bare repo</h4>
注意, 在一个bare repo里, 不能使用git pull来更新这个repo. 而需要使用git fetchAnonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com2tag:blogger.com,1999:blog-8203140.post-58687187171330431582014-04-20T15:15:00.002-07:002014-04-20T15:37:26.789-07:00小米盒子使用记录新拿到小米盒子, 记录并分享一下装机和使用心得.
<br />
<h3>
开箱照</h3>
<br />
简朴的可回收硬纸壳包装, 电源, 连接电视的HDMI, 遥控器. 小米盒子说白了其实就是一个跑Android的小电脑, 只是它需要使用电视作为显示器.
<br />
<table>
<tbody>
<tr>
<td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGiy28ugQb9XxSyf2u2Xdio_O2r7upBy5giCQc_vSWi2Rb09O9gWWM-ZqYUTF9jSw5sspz4KRVFZ1P7iavyX3efCbZNdku-xOLONSNqR3pV4RJaDTs8T2bAnYHwTJNJPZxbYAKkA/s1600/IMG_20140415_204928.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGiy28ugQb9XxSyf2u2Xdio_O2r7upBy5giCQc_vSWi2Rb09O9gWWM-ZqYUTF9jSw5sspz4KRVFZ1P7iavyX3efCbZNdku-xOLONSNqR3pV4RJaDTs8T2bAnYHwTJNJPZxbYAKkA/s200/IMG_20140415_204928.jpg" /></a></div>
</td><td><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb1Jf8Tp98Iqc1KXJ8vaFLuH41eOGY_jBw99dnsZAAf7echxfb4FqhTznS8rjBECvcieQy0xeb9WT_QNp7X9n4WZaN3N1iP4o-6CMHSmTJdxfoEqiHFm12fAQBxUj38pMTH_b_0g/s1600/IMG_20140415_205323.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb1Jf8Tp98Iqc1KXJ8vaFLuH41eOGY_jBw99dnsZAAf7echxfb4FqhTznS8rjBECvcieQy0xeb9WT_QNp7X9n4WZaN3N1iP4o-6CMHSmTJdxfoEqiHFm12fAQBxUj38pMTH_b_0g/s200/IMG_20140415_205323.jpg" /></a></div>
</td></tr>
</tbody></table>
<br />
<h3>
推荐App</h3>
小米盒子有一个micro-USB接口. 所以接上U盘后, 就可以直接读取并安装U盘里存储的apk文件. 如下图所示:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPSs-NF_VmFBfAbD2B5xUDyGgaeo9TvjrRS-60hOE-GEcmoJivxOhC7xS13Rk4chR8X6T_xlS8dtrmLHuXeNNJyVkZLU27URjlPEZ5C2BYPdDfHEi1jIysddQd432pEyODBihGOA/s1600/IMG_20140420_110701.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPSs-NF_VmFBfAbD2B5xUDyGgaeo9TvjrRS-60hOE-GEcmoJivxOhC7xS13Rk4chR8X6T_xlS8dtrmLHuXeNNJyVkZLU27URjlPEZ5C2BYPdDfHEi1jIysddQd432pEyODBihGOA/s320/IMG_20140420_110701.jpg" /></a></div>
<br />
这里是些常用的App:<br />
<ul>
<li>
<a href="http://wengleong1990.wordpress.com/2014/01/15/%E5%B0%8F%E7%B1%B3%E7%9B%92%E5%AD%90%E6%87%B6%E4%BA%BA%E5%8C%85%E5%90%84%E7%A8%AE%E5%BF%85%E8%A3%9D%E8%BB%9F%E4%BB%B6/">小米盒子懒人包
</a>这是一个网友自己组织的百度网盘, 常用装机软件的基本都有了.
</li>
<li>
<a href="http://www.togic.com/livetv">泰捷视频</a> 一个包括了很多电视台直播频道以及电影点播的App.
</li>
<li>
<a href="http://www.91vst.com/">VST全聚合</a>
</li>
<li>
<a href="http://www.tuziv.tv/">兔子桌面</a>
</li>
<li>
<a href="http://app.shafa.com/">沙发管家</a>
</li>
</ul>
<br />
<h3>
参考</h3>
<ul>
<li><a href="http://wengleong1990.wordpress.com/2013/12/25/%E5%B0%8F%E7%B1%B3%E7%9B%92%E5%AD%90%E4%BB%8B%E7%B4%B9%E3%80%81%E8%B6%8A%E7%8D%84%E6%95%99%E5%AD%B8%E5%8F%8A%E5%BF%85%E8%A3%9D%E8%BB%9F%E4%BB%B6%E3%80%81%E6%BE%B3%E9%96%80%E5%9C%B0%E5%8D%80%E5%AF%A6/">新小米盒子介紹、越獄教學及必裝軟件、澳門地區實際評測</a></li>
<li>
<a href="http://steachs.com/archives/3196">如何在小米盒子安裝第三方工具及 APP?讓它發揮更多作用</a></li>
<li><a href="http://www.kocpc.com.tw/archives/4737">新小米盒子 台灣區使用全攻略! 安裝應用、Root、購買 三個願望一次達成!</a></li>
<li><a href="http://www.rockfu.net/blog/2014/03/computer/hardware/%E5%B0%8F%E7%B1%B3%E7%9B%92%E5%AD%902%E9%A6%99%E6%B8%AF%E9%AB%94%E9%A9%97%E8%A8%98/">小米盒子2香港體驗記</a></li>
</ul>
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-32967967883262578172014-04-19T20:33:00.003-07:002014-04-20T15:22:02.002-07:00[MacOS] MacOS 10.9(Mavericks)上clang对未知参数报错的问题在MacOS 10.9上用pip安装一个库的时候发现clang报错
<br />
<pre class="code">$ sudo pip install mysql-python
cc -fno-strict-aliasing -fno-common -dynamic -arch x86_64 -arch i386 -g -Os -pipe -fno-common -fno-strict-aliasing -fwrapv -mno-fused-madd -DENABLE_DTRACE -DMACOSX -DNDEBUG -Wall -Wstrict-prototypes -Wshorten-64-to-32 -DNDEBUG -g -fwrapv -Os -Wall -Wstrict-prototypes -DENABLE_DTRACE -arch x86_64 -arch i386 -pipe -Dversion_info=(1,2,5,'final',1) -D__version__=1.2.5 -I/usr/local/Cellar/mysql/5.6.16/include/mysql -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c _mysql.c -o build/temp.macosx-10.9-intel-2.7/_mysql.o -Os -g -fno-strict-aliasing
clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command-line-argument-hard-error-in-future]
clang: note: this will be a hard error (cannot be downgraded to a warning) in the future
error: command 'cc' failed with exit status 1</pre>
<h3>
原因</h3>
XCode 5.1 以后, XCode的默认编译器clang会对所有它不认识的命令行flag报错
<a href="http://kaspermunck.github.io/2014/03/fixing-clang-error/">http://kaspermunck.github.io/2014/03/fixing-clang-error/</a><br />
<h3>
解决方法</h3>
参照这里给出的方案:
<a href="http://stackoverflow.com/questions/22313407/clang-error-unknown-argument-mno-fused-madd-python-package-installation-fa">http://stackoverflow.com/questions/22313407/clang-error-unknown-argument-mno-fused-madd-python-package-installation-fa</a><br />
<br />
在运行安装命令的时候先修改CFLAGS和CPPFLAGS
<br />
<pre class="code">$ export CFLAGS=-Qunused-arguments
$ export CPPFLAGS=-Qunused-arguments
$ sudo -E pip install mysql-python</pre>
注意由于安装过程中需要sudo, 所以为了让环境变量传递过去, 需要加上-E选项
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-59169508157631745712014-04-19T09:48:00.000-07:002014-04-19T10:02:15.801-07:00[MacOS] 在MacOS 10.9(Mavericks)设置Apache/PHP本来想自己写的. 但这篇实在写的太详实太好了.
<br />
<a href="http://www.coolestguidesontheplanet.com/downtown/get-apache-mysql-php-and-phpmyadmin-working-osx-109-mavericks">http://www.coolestguidesontheplanet.com/downtown/get-apache-mysql-php-and-phpmyadmin-working-osx-109-mavericks</a>
<br />
就捡几个重点的供我自己查询吧:
<br />
<h3>
启动/关闭/重启apache server</h3>
<pre class="code">$ sudo apachectl start
$ sudo apachectl stop
$ sudo apachectl restart</pre>
<br />
<h3>
几个重要的文件和路径</h3>
<ul>
<li>设置文件
<ul>
<li>
httpd的全局设置文件:/etc/apache2/httpd.conf</li>
<li>
用户apc999的设置文件:/etc/apache2/users/apc999.conf</li>
</ul>
</li>
<li>
apache的日志<ul>
<li>/var/log/apache2/error_log</li>
<li>/var/log/apache2/access_log</li>
</ul>
</li>
<li>web路径对应的本地路径
<ul>
<li>http://localhost/ 对应的本地路径 /Library/WebServer/Documents/ </li>
<li>http://localhost/~apc999 对应本地路径 /Users/apc999/Sites </li>
</ul>
</li>
</ul>
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-60779413707576280272014-02-17T23:20:00.005-08:002014-02-17T23:23:00.886-08:00[Emacs] Mac OS Terminal中设置Emacs热键由于工作条件的一些限制,我不能在MacOS中之间使用单独的Emacs App而必须要在Terminal里运行Emacs.所以我花时间设置了一下我的Emacs,使的它在Terminal中也可以像在App里一样完美运行.
<br />
<h3>
最大的障碍来自于Terminal里对于热键的设置</h3>
<hr />
在Terminal里设置按键(单独的按键以及组合按键)所激发的xterm key code. 下面这张图是我的设置:
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT-EGlvxn6Fj8W_rbStaLx37CQ35qVQWxryjw4OvjdMSl1sJiTrv4W9wfNF2zQ3lbevwPj9T_w2XCle_rWqNp0Kbiz8KWcdGlDyFbe5rNpCt9M-nZcsIB2s6OdVtRsddqp4JHBFQ/s1600/Screen+Shot+2014-02-17+at+10.57.02+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT-EGlvxn6Fj8W_rbStaLx37CQ35qVQWxryjw4OvjdMSl1sJiTrv4W9wfNF2zQ3lbevwPj9T_w2XCle_rWqNp0Kbiz8KWcdGlDyFbe5rNpCt9M-nZcsIB2s6OdVtRsddqp4JHBFQ/s320/Screen+Shot+2014-02-17+at+10.57.02+PM.png" /></a></div>
主要是关于方向键加上ctrl/shift/alt的组合.
<br />
<h3>
关于xterm key Code:</h3>
Terminal将按键事件转换成一个xterm key code并发送给当前窗口中运行的shell. 比如Shift加上方向键up被记录成一个code "\033[1;2A". 这里"\033"其实对应的是Esc键.
<br />
关于更多的xterm key code的简介可以从这里获得:<br />
<br />
<div style="text-align: center;">
<a href="https://code.google.com/p/mintty/wiki/Keycodes">https://code.google.com/p/mintty/wiki/Keycodes</a></div>
<br />
更加完整的的关于xterm code的reference:<br />
<div style="text-align: center;">
<a href="http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#PC-Style%20Function%20Keys">http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#PC-Style%20Function%20Keys</a>
</div>
总而言之, 你需要把你需要用到的组合按键设置在Terminal中, 使得Emacs可以收到<br />
<h3>
剩下的就是对于Emacs里热键的设置</h3>
<hr />
Emacs的key mapping系统无比的复杂. 我使用了一种笨办法: 把每一个我关心的热键组合的xterm key code都在input-decode-map里定义成对应的组合键. 比如下面的设置. 这里"\e"相当于"\033"
<br />
<pre class="code lang-el">(define-key input-decode-map "\e[9A" [(meta up)])
(define-key input-decode-map "\e[9B" [(meta down)])
(define-key input-decode-map "\e[9C" [(meta right)])
(define-key input-decode-map "\e[9D" [(meta left)])
(define-key input-decode-map "\e[2A" [(shift up)])
(define-key input-decode-map "\e[2B" [(shift down)])
(define-key input-decode-map "\e[2C" [(shift right)])
(define-key input-decode-map "\e[2D" [(shift left)])
(define-key input-decode-map "\e[10A" [(shift meta up)])
(define-key input-decode-map "\e[10B" [(shift meta down)])
(define-key input-decode-map "\e[10C" [(shift meta right)])
(define-key input-decode-map "\e[10D" [(shift meta left)])</pre>
<br/>
这样Emacs才能在key stream里识别出来传进来的meta/shift/ctrl等热键. 然后再使用Emacs里的global-set-key来绑定组合到特定的function上, 比如我设置meta加up为backward-paragraph:
<br />
<pre class="code lang-el">(global-set-key [(meta up)] 'backward-paragraph)
(global-set-key [(meta down)] 'forward-paragraph)
(global-set-key [(meta left)] 'backward-word)
(global-set-key [(meta right)] 'forward-word)</pre>
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-13002688113694884562014-02-04T10:07:00.001-08:002016-05-28T13:31:50.047-07:00[Linux/Mac] Terminal收到的Control Code和Escape Sequence Code在Linux和Mac里使用Terminal的时候常常会出现按下一个组合键出来一堆奇怪字符的情况. 这通常是由于这个按键组合未被Terminal识别成功. 现在操作系统的Terminal通常已经足够强大, 比如MacOS自带的Terminal以及iTerm等都可以自己设置从按键组合到Control Code或者Escape Sequence Code的映射来传给Shell. 由于我常常被这个问题困扰, 所以写下这篇笔记.
<br />
<h3>
何为Ctrol Code和Escape sequence code?</h3><hr/>
<p>这里有几篇很不错的讲解<a href="http://linux.about.com/od/ttl_howto/a/hwtttl08t03.htm">Text-Terminals on Linux</a>以及<a href="http://man7.org/linux/man-pages/man4/console_codes.4.html">Linux Console Codes</a></p>
基本这是一套沿用多年, 对按键组合编码的方案. 简单说来, Escape Sequence Code就是讲一个按键组合变成以\033(键盘上得Esc键)打头的一串字符. 比如
<pre>up \033[A
down \033[B
right \033[C
left \033[D
shift+up \033[1;2A
shift+down \033[1;2B
shift+right \033[1;2C
shift+left \033[1;2D
meta+up \033[1;4A
meta+down \033[1;4B
meta+right \033[1;4C
meta+left \033[1;4D
ctrl+up \033[1;5A
ctrl+down \033[1;5B
ctrl+right \033[1;5C
ctrl+left \033[1;5D
</pre>
不难看出其中的一些个规律 (Alt: 1, Ctrl: 2, Shift: 4, ...). 更多的code可以参考:
<a href="https://code.google.com/p/mintty/wiki/Keycodes">Key Codes</a>以及
<a href="http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#PC-Style%20Function%20Keys">xterm code:</a>
<h3>
如何得到一个按键(或者按键组合)当前对应的Escape Sequence Code</h3><hr/>
在MacOS的terminal里可以很方便的
<br />
<pre>Keystroke to Type Expected Output (for VT220 mapping)
ctrl-V backspace ^?
ctrl-V delete ^[[3~
ctrl-V ctrl-H ^H</pre>
<br />
或者使用sed命令
<pre>$ sed -n l
</pre>
在Linux的terminal下, 运行xev, 桌面角落里会出现一个小对话框。 同时terminal里会输出当前的事件, 比如按下了哪个键,松开了哪个键, 进而可以获得这些键的code
<br />
<h3><hr/>
在Emacs里如何使用键映射(keymap)</h3>
这是我写的一篇笔记<a href="http://apc999.blogspot.com/2014/02/emacs-mac-os-terminalemacs.html">Mac OS Terminal中设置Emacs热键</a><br />
http://blog.csdn.net/joans123/article/details/7562212<br />
<a href="http://www.masteringemacs.org/articles/2011/02/08/mastering-key-bindings-emacs/">Mastering Key Bindings In Emacs</a>Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-6933522388845858532014-01-02T10:26:00.001-08:002014-01-02T15:28:22.948-08:00[Linux] aptitude vs. apt-get<h3>
功能上的区别:</h3>
http://www.debian.org/doc/manuals/debian-faq/ch-pkgtools.en.html#s-aptitude
<br />
<h3>
彩蛋上的区别:</h3>
<br />
<pre class="code">$ apt-get moo
(__)
(oo)
/------\/
/ | ||
* /\---/\
~~ ~~
...."Have you mooed today?"...</pre>
<pre class="code">$ aptitude moo
There are no Easter Eggs in this program.</pre>
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-40372262021708702442013-12-10T23:30:00.001-08:002014-01-12T18:00:00.051-08:00[C++] 纳秒(ns)级精度的计时 在调试以及优化高性能的程序中,常需要对一小段程序计时. 普通的clock函数精度达不到ns级别.这里记录一下几种可以得到ns级高精度的计时方法.
<br />
<br />
<h2>
使用clock_gettime</h2>
<hr />
C++ 中可以使用clock_gettime, 得到
<br />
<pre class="code">
clock_gettime(CLOCK_REALTIME, &time1);
... your code to profile ...
clock_gettime(CLOCK_REALTIME, &time2);
</pre>
<h2>
使用rdtscp</h2>
<hr />
如果想得到更高精度的计时, 比如以CPU的时钟周期为单位,
对于比较新的Intel CPU, 可以使用rdtscp指令来获得当前CPU时钟周期读数.比较前后两次读数就可以得到以时钟周期为单位的逝去时间.
<br />
<pre class="prettyprint">// rdtscp ensure serialization, supported by newer CPUs
static __inline__ uint64_t rdtscp(void)
{
uint32_t hi, lo;
__asm__ __volatile__ ("rdtscp" : "=a"(lo), "=d"(hi));
return ((uint64_t)lo | ((uint64_t)hi << 32);
}</pre>
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com1tag:blogger.com,1999:blog-8203140.post-80858781674082916072013-10-30T11:06:00.001-07:002013-10-30T11:06:22.698-07:00Sublime Text 3 插件开发 (未完)Sublime Text (以下简称ST)提供了一个python的API接口. 在这个接口之上,用户可以开发自己的插件.
完整的ST3 API可以参见这里
<br />
<div style="text-align: left;">
<a href="http://www.sublimetext.com/docs/3/api_reference.html">http://www.sublimetext.com/docs/3/api_reference.html</a>
</div>
如果你想仔细研究这些API的定义以及ST自带Python模块的细节, 可以在ST下找到这个python API的文件. MacOS上,
在<span class="code">/Applications/Sublime Text.app/Contents/MacOS/</span>目录底下, 有2个文件
<span class="code">sublime.py</span>和<span class="code">sublime_plugin.py</span>.
<br />
<h3>
从一个最简单的plugin开始</h3>
<hr />
<pre class="code">import sublime, sublime_plugin
class HelloWorldCommand(sublime_plugin.TextCommand):
def run(self, edit):
self.view.insert(edit, 0, "Hello, World!")</pre>
将其命名为"hello_world.py"以后, 存在<span class="code">Packages/User</span>底下. 这个plugin就只干一件事儿, 当你在ST3自带的python console里(可以通过Ctrl+`呼出)运行
<br />
<pre class="code">view.run_command("hello_world")</pre>
就会在你正在编辑的文件里添加一段"Hellow, World!". 这里注意ST的命名习惯. 这个类的名字叫HellowWorld, console中ST会将其命名为hellow_world, 从而使用<span class="code">run_command("hello_world")</span>来运行之.Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-83148458112949115002013-10-13T19:58:00.000-07:002013-10-13T20:31:59.381-07:00在Sublime Text 3 中使用emacs键位我的目标很简单: 就是把sublime text的操作折腾的和emacs 一样<br />
<br />
<h1>
第一步, 安装sublemacspro.</h1>
<br />
参见这里: https://github.com/grundprinzip/sublemacspro<br />
基本上最基本的emacs操作比如ctrl-w, alt-w, ctrl-k, ctrl-y 等就有了.
<br />
<br />
<h1>
第二步, 增加一些我自己管用的keybinding</h1>
我是通过定制PreferencesKey->Binding->User来增加以下我自己习惯的键位:
<br />
<pre class="code">[
{ "keys": ["ctrl+f"], "command": "move", "args": {"by": "pages", "forward": true} },
{ "keys": ["ctrl+b"], "command": "move", "args": {"by": "pages", "forward": false} },
{ "keys": ["shift+ctrl+f"], "command": "move", "args": {"by": "pages", "forward": true, "extend": true} },
{ "keys": ["shift+ctrl+b"], "command": "move", "args": {"by": "pages", "forward": false, "extend": true} },
{ "keys": ["alt+down"], "command": "move", "args": {"by": "stops", "empty_line": true, "forward": true} },
{ "keys": ["alt+up"], "command": "move", "args": {"by": "stops", "empty_line": true, "forward": false} },
{ "keys": ["shift+alt+down"], "command": "move", "args": {"by": "stops", "empty_line": true, "forward": true, "extend": true} },
{ "keys": ["shift+alt+up"], "command": "move", "args": {"by": "stops", "empty_line": true, "forward": false, "extend": true} },
{ "keys": ["ctrl+c", "ctrl+c"], "command": "build"},
]</pre>
<h1>参考:</h1>
关于key binding 的commands<br />
http://www.sublimetext.com/docs/commands<br />
如何写一个plugin <br />
http://sublimetext.info/docs/en/extensibility/plugins.html <br />
st3的api <br />
http://www.sublimetext.com/docs/3/api_reference.html<br />
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-3051705758181246232013-09-25T08:33:00.004-07:002013-09-25T08:40:31.704-07:00[Math] 有趣的无穷数列求和<a href="http://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF">1 + 2 + 3 + 4 + ... = -1/12</a><br />
所有自然数之和为-1/12
<br />
这个在量子物理和弦论里有应用, 据说12个维度就是这么来的<br />
<br />
<a href="http://en.wikipedia.org/wiki/1_%E2%88%92_2_%2B_3_%E2%88%92_4_%2B_%C2%B7_%C2%B7_%C2%B7">1 - 2 + 3 - 4 + ... = 1/4</a><br />
<br />
<a href="http://en.wikipedia.org/wiki/1_%2B_2_%2B_4_%2B_8_%2B_%C2%B7_%C2%B7_%C2%B7">1 + 2 + 4 + 8 + ... = -1 </a>
<br />
或者等价于: 所有偶数和为-2<br />
其实这个可以自己推出来<br />
<br />
高斯他老人家就推了一堆这种神奇的结论Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-51810179954148685412013-07-12T10:35:00.002-07:002014-05-31T09:57:17.271-07:00[git] 一些git的使用小技巧记录一下我在平时使用git时候的一些小技巧. 关于git更全面的使用介绍(比如整个工作的流程 ), 参见我之前写的的<a href="http://apc999.blogspot.com/2010/07/git.html">"git 笔记"</a>.<br />
<br />
<ul>
<li>查看my_file和之前版本的区别
<pre class="code">$ git diff HEAD my_file #latest version checked-in
$ git diff HEAD~1 my_file #previous of the latest version
$ git diff HEAD~2 my_file #previous ^ 2 of the latest </pre>
</li>
<li>
跳过<span class="code">git add</span>而直接commit当前修改过的文件中那些被track的
<pre class="code">$ git commit . -m "foo"</pre>
</li>
<li>
把track的文件中所有被修改的都加入index
<pre class="code">$ git add -u</pre>
</li>
<li>
和HEAD比较, 当前工作目录下有那些具体的修改(可能跨几个文件)
<pre class="code">$ git diff HEAD</pre>
</li>
<li>
查看每次commit都改动了哪些文件
<pre class="code">$ git log --stat</pre>
查看上一次commit有哪些文件被改动
<br />
<pre class="code">$ git log -n 1 --stat</pre>
</li>
<li>
将当前branch rebase到本地的master branch上. 也就是当前branch的local commit会出现在commit log的最后
<br />
<pre class="code">$ git rebase master</pre>
</li>
<li>
指定从origin/master 来更新
<br />
<pre class="code">$ git rebase origin master</pre>
</li>
<li>
设置gitignore_global
建立<span class="code">~/.gitignore_global</span>, 然后执行
<pre class="code">$ git config --global core.excludesfile ~/.gitignore_global</pre>
</li>
<li>
查看当前git的config
<pre class="code">$ git config -l</pre>
</li>
<li>
设定当前git repository的email
<pre class="code">$ git config user.email "apc999@youremail.com"</pre>
查看当前git repository的email
<pre class="code">$ git config user.email</pre>
</li>
</ul>Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-29570819173687130912013-05-22T08:24:00.000-07:002013-05-22T08:24:20.461-07:00查看gcc预定义的macro在Linux或者MacOS的terminal里运行:
<pre class="code">$ cpp -dM /dev/null
#define __DBL_MIN_EXP__ (-1021)
#define __UINT_LEAST16_MAX__ 65535
#define __FLT_MIN__ 1.17549435082228750797e-38F
#define __UINT_LEAST8_TYPE__ unsigned char
#define __INTMAX_C(c) c ## L
#define __CHAR_BIT__ 8
#define __UINT8_MAX__ 255
#define __WINT_MAX__ 4294967295U
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __SIZE_MAX__ 18446744073709551615UL
#define __WCHAR_MAX__ 2147483647
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __DBL_DENORM_MIN__ ((double)4.94065645841246544177e-324L)
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __FLT_EVAL_METHOD__ 0
#define __unix__ 1
...</pre>
一般说来Linux平台上会预定义__linux__, 而MacOS会预定义__APPLE__Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-87772837222774604542013-04-13T09:20:00.002-07:002013-04-13T09:23:04.873-07:00[C] 线程局部存储 (thread-local storage)GCC 支持使用线程局部存储(TLS)来方便多线程的编程.通俗来说, TLS就是一些看起来global的变量, 但是它实际上是per-thread的<br />
使用TLS很简单,只需要用__thread关键字来修饰一个"全局变量",比如下面例子里的tid. 它在不同的thread里被输出的时候就是输出不同的值
<br />
<pre class="code">#include <stdio.h>
#include <pthread.h<
#define NUM_THREADS 5
<span style="color: red;">__thread long tid;
</span>
void print_tid() {
printf("Hello World! It's me, thread #%ld!\n", tid);
}
void *run_thread(void *threadid)
{
<span style="color: red;"> tid = (long)threadid;
</span> print_tid();
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0; t<NUM_THREADS; t++){
rc = pthread_create(&threads[t], NULL, run_thread, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
/* Last thing that main() should do */
pthread_exit(NULL);
}</pre>
运行
<br />
<pre class="code">$ gcc test_tls.c
$ ./a.out
Hello World! It's me, thread #0!
Hello World! It's me, thread #1!
Hello World! It's me, thread #2!
Hello World! It's me, thread #3!
Hello World! It's me, thread #4!</pre>
<h4>
参考</h4>
<a href="http://gcc.gnu.org/onlinedocs/gcc/Thread_002dLocal.html">GCC对TLS的支持</a>Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-89288159936555734402013-04-11T12:27:00.002-07:002013-09-26T19:43:06.707-07:00[C/C++] 随机数<h4>
C里的RAND</h4>
<hr />
<pre class="code">#include <stdlib.h>
#include <stdio.h>
int main()
{
srand(time(0));
printf("%d\n", rand());
return 0;
}</pre>
<h4>
使用C++11 里的Mersenne Twister随机数</h4>
<hr />
C++11支持的Mersenne Twister可以非常轻量级的快速生成大量随机数.适合在benchmark的时候使用
<pre class="code">#include <iostream>
#include <random>
main() {
std::mt19937_64 rng;
// 使用系统时间生成随机数种子
rng.seed(static_cast<unsigned int>(std::time(0)));
// 生成32-bit的随机整数
std::cout << rng() << std::endl;
// 生成 1到255之间(包括1和255) 的随机数
std::uniform_int_distribution<int> unif(1, 255);
std::cout << unif(rng)<< std::endl;
// 以概率0.3生成true, 0.7生成false
std::bernoulli_distribution bern(0.3);
std::cout << bern(rng) << std::endl;
}
</pre>
Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-71003912074518764342013-03-30T07:59:00.003-07:002013-03-30T08:08:07.803-07:00code style<h4>
Python的code style</h4>
Python官方约定的风格<a href="http://www.python.org/dev/peps/pep-0008/">PEP 8 -- Style Guide for Python Code</a><br />
<br />
<h4>
C++的code style</h4>
C++并无官方约定的风格。 我一般会遵从 Google 的<a href="http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml">C++ style guide</a>Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-12937988860008125862013-03-27T15:00:00.005-07:002013-03-30T08:06:14.824-07:00在MacOS和Linux上使用Ramdisk<h4>
在Linux上使用Ramdisk</h4>
<hr />
我使用如下脚本来生成一个大小可设定的tmpfs作为ramdisk
<br />
<pre class="code">#!/bin/bash
TMPFS_SIZE=12G
mkdir -p ./ramdisk
sudo umount ./ramdisk >& /dev/null
sudo mount -t tmpfs -o size=$TMPFS_SIZE,mode=0775,gid=binfan tmpfs ./ramdisk</pre>
<h4>
在MacOS上使用Ramdisk</h4>
<hr />
创建一个Ramdisk
<br />
<pre class="code">$ hdiutil attach -nomount ram://1165430
/dev/disk2
$ diskutil erasevolume HFS+ "ramdisk" /dev/disk2
Started erase on disk2
Unmounting disk
Erasing
Initialized /dev/rdisk2 as a 569 MB HFS Plus volume
Mounting disk
Finished erase on disk2 ramdisk</pre>
然后使用df就可以看见这个device了
<br />
<pre class="code">$ df
Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on
/dev/disk0s2 818359360 273993824 543853536 34% 34313226 67981692 34% /
devfs 381 381 0 100% 660 0 100% /dev
map -hosts 0 0 0 100% 0 0 100% /net
map auto_home 0 0 0 100% 0 0 100% /home
/dev/disk0s4 156733432 41530424 115203008 27% 108561 57608399 0% /Volumes/BOOTCAMP
localhost:/AI1XeO7VNLFdFPonF9OexW 818359360 818359360 0 100% 0 0 100% /Volumes/MobileBackups
/dev/disk1s1s2 35040 35040 0 100% 8758 0 100% /Volumes/HTC Sync Manager
<span style="color: red;">/dev/disk2 1165424 27376 1138048 3% 3420 142256 2% /Volumes/ramdisk</span></pre>
不用的时候在Finder里面弹出这个设备就可以了.Anonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0tag:blogger.com,1999:blog-8203140.post-53784306560738515102013-03-03T21:06:00.001-08:002013-03-03T21:06:43.139-08:00Memory barrier, volatile, cache coherency<a href="http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/memory-barriers.txt?id=HEAD">Linux Kernel关于memory barrier的介绍</a><br />
<br />
<span class="code">volatile</span>会强制在你的code里, 每次都re-read该变量值. 但是它不能控制这个值的来源---可能从memory中读入, 也可能因为你的code刚刚访问过这个变量从而从cache中读入而不是memory.
<br />
<br />
http://stackoverflow.com/questions/558848/can-i-force-cache-coherency-on-a-multicore-x86-cpuAnonymoushttp://www.blogger.com/profile/11341747245547226513noreply@blogger.com0