我最常用的Mac OS X快捷键

用Mac不用快捷键就等于浪费了一大半效率!所以小总结一下。先说明,我是10.7系统,也许新版本的有些不兼容。

  • finder中上一页和下一页的快捷键:cmd + [ 和 cmd + ] ,等价于点击finder左上角的两个小箭头。
  • finder中类似windows的“向上”功能的快捷键:cmd + ↑
  • 我们知道三指可以拖动窗口,但是按住 cmd 再用三指可以拖动非激活的窗口哦~~
  • finder中按住cmd点击侧边栏的项目,可以在新窗口打开该项目。有时我们要移动文件的话会比较方便。
  • 类似windows中 Home 和 End 键的功能(光标跳到行首和行尾)可以用 cmd + ← 和 cmd + →实现。
  • fn + delete可以删除光标后面的字符。
  • 我们知道 cmd + tab 可以切换应用程序,类似的, cmd + ~ 可以在同一个应用程序的多个窗口之间切换哦~
  • 我们知道右键单击一个文件可以选择其他打开方式,但只对本次打开生效。如果想一劳永逸怎么办呢?右键单击之后按住 option 键看看,“打开方式”是不是变成了“总是以此方式打开”?
  • (接上)如果想一次设定所有同类文件的打开方式怎么办呢?按 cmd + i (或在右键菜单中选择“显示简介”)修改打开方式以后点击下面的“全部更改”按钮。
  • (接上)很多菜单中按住option就会出现一些其他选项,大家不妨多试试。比如单击菜单栏的音量图标只会显示一个音量条,试试按住option再单击之~有惊喜。
  • cmd + w 关闭窗口,cmd + q 关闭程序,最常使用的两个快捷键。在safari中按住 option + cmd + w 可以关闭所有其他标签哦。
  • cmd + shift + 3全屏截图,cmd + shift + 4区域截图,截图保存在桌面上,也挺常用。
  • safari全屏的时候,如果我们要选择网页中的大段文字,会发现鼠标到了页面底端时页面不会自动向下滚动。此时按按方向键 ↑ ↓ 试试看?
  • safari中快速定位到页面顶端或低端:cmd + ↑ 和 cmd + ↓
  • (接上)finder中列表模式下想定位到第一个或最后一个文件时,就不能用上述快捷键啦,而是用 option + ↑ 和 option + ↓
  • 按住 cmd 点击finder窗口的标题可以显示该文件夹的具体地址。
  • (接上)按住 cmd 点击dock上的图标也可以直接打开该应用程序或文件夹所在的位置
  • 全屏模式下dock是隐藏的,想要显示出来就把鼠标移到屏幕下边缘,松开手,再向下移动,就显示出来啦。
  • safari中如果不小心关闭了一个标签,可以用 cmd + z 重新打开之。
  • 截图时按 cmd + shift + 4 以后如果再按一下空格,鼠标变成一个小相机,此时可以直接截取某个窗口,超级方便!
  • 最后介绍一个用Alfred2软件实现的快捷键:在任何时候都可以用 cmd + e 打开finder(保留了windows的习惯):方法是新建一个workflow,在里面添加两个项目,一个triggers,选择Hotkey选项,然后设置hotkey为 cmd + e。再添加一个Actions,选择Launch Apps/Files,然后定位到/System/Library/CoreServices/Finder.app。最后把这两个项目连接起来就完成啦!如图:

Tips On WordPress.com

在wordpress.com呆了一段时间,也摸索出了一些小技巧,记录一下。

遇到问题大可参考官方support页面,里面介绍十分详细。

首先,wordpress.com是一个免费平台,运作方式跟wordpress.org不同,这里不需要考虑空间建立,ftp上传文件之类的问题,更适合像我一样没有建站经验的小白。正因为它免费,网站中能定制的东西就很少。所以也不要奢求那么高级的主题定制了,从免费模板里挑一个看起来比较好的就开始进入正题吧——写博客。

技术博客里常常要引用代码,但它没有提供代码工具,这里给出一个tip可以手动实现我博客中的代码引用效果:
博客编辑页面有两个模式:Visual和Text,首先要切换到Text模式下。然后按照如下格式书写:

屏幕快照 2013-11-09 下午5.04.49

就可以插入代码环境了。代码语言是用来显示高亮的,还有其他可定制选项,详见这里

我是个HTML盲,所以顺便记录一下其他我需要用的tips:
修改字号:<font size=”2″>内容</font>
显示等宽字体:<tt>内容</tt>
粗体:<b>内容</b>
(随时补充…)

如何找到博客的设置?        因为wordpress.com允许每个用户同时拥有多个博客,所以其实网站的“设置”是分两级的:一是对所有的博客的设置,通过点击页面左上角的“W” logo中的Settings进入;另一个是对你的某个博客的设置,在左上角第二个图标(你的博客名字)中的Dashboard里找到。Dashboard就是一般称作的后台,在这里可以新建和管理你的Posts,Pages,博客页面设置等等。

怎样在页面顶部添加菜单?        我觉得所有内容按时间顺序放在首页有点乱,可以在Dashboard的Appearance ->  Menus里添加菜单项,在设置页面左侧,我选择了把常用Category都添加到菜单栏中,这样就能快速访问到某个主题的全部博客了。另外这里也能方便地添加多级子菜单,如果博客内容很多的话,添加menu是一个很好的组织方式。

Posts和Pages的区别。        posts是你的全部文章保存的地方,pages是一个个的静态页面,pages不能添加标签什么的,你也不能选择把某个post发布到哪个page里面。posts的管理方式是用categorys、tags,而不是用pages。另外在Dashboard的Settings -> Reading里可以选择在博客首页显示某个特定的page而非你的全部博文。

在Dashboard -> Settings -> General里,页面右侧可以添加网站图标,可以在浏览器地址栏显示出来。就像我那小黄人的眼睛一样。

然后还有一个跟wp.com本身没啥关系,但是对我写博客很有必要的一个tip,就是保存Terminal内容的工具。
其实是一条linux命令:

script [filename]
你的操作
exit

在上述两条命令之间的所有操作都会被记录下来。注意是“所有”操作!如果你中途打错字了,也会被记录下来。。。

Q&A1

连接好BBB以后,先需要熟悉一下可能会用到的硬件外设,解决一些实用的调试问题。为了不一下子面对太多问题,暂时先使用片上自带的的gcc编译器而非交叉编译,先使用纯命令行和vim写程序而非IDE。虽然慢点,但很简单。

Qs:

  1. 怎样在片上编写、编译、执行、修改c语言程序?怎样debug?
  2. terminal命令和用c语言编写程序有什么相同和不同?能互相转化吗?
  3. 怎样操作IO口(both in and out)?
  4. 怎样使用AD?
  5. 怎样保存变量数据?
  6. 怎样向电脑传输数据?是否有必要用串口?怎么用?

等我解决了这几个问题再来更新博客。

================================================================

A1:Linux编程的基本操作。只列出命令名,具体功能请自行Google。
首先是Linux基本功如

  1. 随意跑到任意目录下(cd),查看目录下有什么(ls -l),显示目录(pwd)
  2. 新建(mkdir、vi、vim)、移动(cp、mv)、删除(rm -rf)文件和目录
  3. 根据(部分)文件名查找文件(find -name),根据文件内容查找文件(grep),在某个文件中查找某些内容并定位(grep -n)
  4. 查看文件内容(cat、more、less),编辑文件(vi、vim、echo)(echo的功能其实是向标准设备输出)
  5. 结束正在执行的任务(control+C)
  6. 自动补全文件名(tab键)
  7. 注意文件或目录名中出现任何符号时要在前面加上\转义字符

上面提到的vi或vim编辑器的使用

  1. i进入编辑模式,esc退出编辑模式,进入命令模式
  2. 命令模式下输入 :q 退出,输入 :wq 保存并退出,输入 :q! 强制退出

然后是关于编译执行调试c程序

  1. gcc test.c -o test 编译test.c并生成可执行文件test
  2. ./test 执行test文件(别忘了加./)
  3. 先执行gcc -g test.c -o testdebug 生成包含标准调试信息的文件testdebug,然后可以用gdb testdebug命令来调试程序

A2:(见A3的例子就明白了)

A3:怎样操作io口?(学习自这里 )
首先是直接用shell控制io口。

root@beaglebone:~# cd /sys/class/gpio
root@beaglebone:/sys/class/gpio# ls -l
total 0
--w------- 1 root root 4096 Jan  1 00:00 export
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip32 -> ../../devices/virtual/gpio/gpiochip32
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip64 -> ../../devices/virtual/gpio/gpiochip64
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip96 -> ../../devices/virtual/gpio/gpiochip96
--w------- 1 root root 4096 Jan  1 00:00 unexport
root@beaglebone:/sys/class/gpio# echo 44 > export
root@beaglebone:/sys/class/gpio# ls -l
total 0
--w------- 1 root root 4096 Jan  1 00:03 export
lrwxrwxrwx 1 root root    0 Jan  1 00:03 gpio44 -> ../../devices/virtual/gpio/gpio44
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip32 -> ../../devices/virtual/gpio/gpiochip32
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip64 -> ../../devices/virtual/gpio/gpiochip64
lrwxrwxrwx 1 root root    0 Jan  1 00:00 gpiochip96 -> ../../devices/virtual/gpio/gpiochip96
--w------- 1 root root 4096 Jan  1 00:00 unexport
root@beaglebone:/sys/class/gpio# cd gpio44
root@beaglebone:/sys/class/gpio/gpio44# ls -l
total 0
-rw-r--r-- 1 root root 4096 Jan  1 00:03 active_low
-rw-r--r-- 1 root root 4096 Jan  1 00:03 direction
-rw-r--r-- 1 root root 4096 Jan  1 00:03 edge
drwxr-xr-x 2 root root    0 Jan  1 00:03 power
lrwxrwxrwx 1 root root    0 Jan  1 00:03 subsystem -> ../../../../class/gpio
-rw-r--r-- 1 root root 4096 Jan  1 00:03 uevent
-rw-r--r-- 1 root root 4096 Jan  1 00:03 value
root@beaglebone:/sys/class/gpio/gpio44# cat direction
in
root@beaglebone:/sys/class/gpio/gpio44# echo out > direction
root@beaglebone:/sys/class/gpio/gpio44# cat direction
out
root@beaglebone:/sys/class/gpio/gpio44# cat value
0
root@beaglebone:/sys/class/gpio/gpio44# echo 1 > value
root@beaglebone:/sys/class/gpio/gpio44# cat value
1


解释一下,首先要把某个(本例中是第44个)gpio export一下,变成用户可用的状态,然后目录里就会多出来一个gpio44文件夹,进入它对相应文件进行读写就可以操作io口了。输入输出是一样的道理。读的话Linux会自动实时更新value文件里的数据,但更新速度有多快暂时还不清楚,高速io操作的话用这种方法感觉不靠谱。不过速度不敏感的话是没问题的。

用c程序控制io口,我们当然可以完全照搬上面对文件操作的过程,只不过写成c语言的形式。具体如下

#include
#include
#include
#include  //define O_WRONLY and O_RDONLY

#define SYSFS_GPIO_DIR "/sys/class/gpio"
#define MAX_BUF 64

void main()
{
	int fd, len;
	char buf[MAX_BUF];
	char ch;
	int i;

	//export gpio44
	fd = open(SYSFS_GPIO_DIR "/export", O_WRONLY);
	len = snprintf(buf,sizeof(buf),"44");
	write(fd,buf,len);
	close(fd);

	//set direction
	snprintf(buf,sizeof(buf),SYSFS_GPIO_DIR"/gpio44/direction");
	fd = open(buf, O_WRONLY);
	write(fd, "in", 3);
	close(fd);

	//read and print value 10 times
	for(i=0;i<10;i++)
	{
		snprintf(buf,sizeof(buf),SYSFS_GPIO_DIR"/gpio44/value");
		fd = open(buf, O_RDONLY);
		read(fd,&ch,1);
		printf("%c\n",ch);
		close(fd);
		sleep(1);
	}
}


如上所述,用文件操作的话,速度受制于linux设定的文件更新速度。实际上也可以用直接读取寄存器的方法。详见这里

A4:暂且引用一下这里的方法。

root@beaglebone:~# echo cape-bone-iio > /sys/devices/bone_capemgr.8/slots
root@beaglebone:~# find /sys/ -name '*AIN*'
/sys/devices/ocp.2/helper.14/AIN0
/sys/devices/ocp.2/helper.14/AIN1
/sys/devices/ocp.2/helper.14/AIN2
/sys/devices/ocp.2/helper.14/AIN3
/sys/devices/ocp.2/helper.14/AIN4
/sys/devices/ocp.2/helper.14/AIN5
/sys/devices/ocp.2/helper.14/AIN6
/sys/devices/ocp.2/helper.14/AIN7
root@beaglebone:~# cat /sys/devices/ocp.2/helper.14/AIN1
1365
root@beaglebone:~# cat /sys/devices/ocp.2/helper.14/AIN1
1297
root@beaglebone:~# cat /sys/devices/ocp.2/helper.14/AIN1
1295


在这里我开启了8个AIN中的AIN1,并读取了3次数值,可以看到值在一定范围内波动。关于这么做的原理呢,涉及到一个很复杂但很重要的东西,叫做Device tree。这是新版的嵌入式linux用于统一管理硬件资源的方式。这部分内容比较多,我还没来得及消化,今后会用专文来写这部分。

A5:写入文件就可以啦,像前面的用c语言操作io口例程那样。

A6:基于ssh连接的话,用scp [OPTIONS] file_source file_target命令就可以了。例如:
从电脑复制到BBB:

# scp /Users/myname/full.tar.gz root@192.168.7.2:/home/root

然后会提示你输入另外那台192.168.7.2主机的root用户的登录密码,接着就开始copy了,复制目录加参数-r即可
从BBB复制到电脑:

# scp root@192.168.7.2:/home/root/full.tar.gz /Users/myname/full.tar.gz

暂时用这种方法足够调试程序了,串口只有在实时查看数据时才有必要用,等需要用时再说。
会互传文件以后,编写程序就更方便了,我甚至可以在Mac上装上gcc编译器(这是很容易的事),某些与硬件无关的程序可以在电脑上书写并编译通过以后再拷贝到BBB中去,修改内容和编译速度都会快很多。

Start Using Beaglebone Black

在这里你可以了解到上手Beaglebone Black(以下简称BBB)是多么容易!

BBB板子上就有一块2GB的eMMC存储空间,内部已经装好了Angstrom Linux系统,因此我们拿到板子以后,不用再买配件(sd卡什么的),不用再下载安装操作系统,只需安装一两个驱动,马上就能开始学习和开发。

有两种方式开发BBB:

一种是用HDMI线连到显示器上,然后再在USB插上键盘鼠标等外设,把它当做一台电脑来使用(这个不是官方最推荐的方法,所以购买时没有附带HDMI线,需要额外购买)。

因为我没有显示器,只有一台笔记本电脑,因此我使用下面的方法开发。

另一种是用随板子自带的usb线连到笔记本上。
屏幕快照 2013-11-01 下午1.09.35
此时有两种方法对BBB上的linux进行操作:
1、纯Terminal文字界面,利用ssh连接并操作BBB的terminal。ssh是Secure Shell的缩写,利用它,我们可以在电脑的Terminal上直接远程操作BBB的terminal。
如果你的电脑上有Linux系统或Mac OS,那就特别方便了,打开terminal输入
ssh root@192.168.7.2
然后输入密码(默认为空)
然后就连接好了(注意你的IP地址可能会不同)。
屏幕快照 2013-11-01 下午1.17.49
使用完毕以后,不要直接拔电源,输入shutdown now命令来关机。
实际上,就算你的电脑里没有terminal软件都没关系,BBB官网提供了基于HTML5的网页模拟ssh,你只要有Chrome浏览器就够了!顺便说一句,BBB的系统里还自带了Cloud9 IDE,你也可以通过网页编写Java程序(不过我似乎用不上Java)。
屏幕快照 2013-11-01 下午1.25.52
2、使用VNC来获得系统的图形界面。不过通过terminal就可以操作BBB的IO口,因此图形界面对我来说暂时不是必要的,待我以后再研究之。
.

Beaglebone Black Introduction & Useful Links

开源硬件在国外火得一塌糊涂,国内却没有那么多人玩,直接导致中文论坛资料严重缺乏……但这也挡不住Beaglebone Black的魅力,几经比较之后还是决定购买这个“狗骨头”!

beaglebone_black beaglebone-specs

Beaglebone Black(以下简称BBB)是一款2013年刚刚诞生的开源硬件。其前身是Beaglebone,二者外形一致,但前身是白色板子,而新版是黑色板子。大家现在购买的话买新的就好,性能比前身强大很多,价格还反而减了一半,只需不到400元rmb。

这400元买到的是什么呢?BBB的参数尺寸啥的可以轻松百度到,我写点不容易百度到的:

1、它选用的处理器,TI公司出的AM3359芯片,是一款性价比极高的ARM Cortex-A8内核芯片(据说是最便宜的A8核芯片),BBB这块板子也是TI公司的官方指定开发板之一。如果对芯片的工作原理感兴趣,你甚至可以在TI官网上下载到一本4000多页的详细手册。(参考 http://www.ti.com/tool/BEAGLEBK 和 http://www.ti.com/product/am3359

2、软硬件统统开源,你可以在BBB官方wiki页面下载到电路原理图和PCB图(用的是Allegro)。在我看来这是它比树莓派好的一个地方,因为我不仅要学习软件,还要学习硬件。而树莓派是不开放电路硬件的。(参考 http://circuitco.com/support/index.php?title=BeagleBoneBlack

3、逐渐庞大的社区(以国外的为主)。开源硬件最大的好处就在此,全世界的人跟你一起玩同一块板子,有问题大家一起讨论,而且国外很多高手是很有分享精神的,如果你能上Youtube,会找到很多教程视频(虽然淘宝上热销的Cortex-A8开发板也有很多人在用,但相关的论坛博客就没法比了)。“逐渐庞大”的意思是,BBB才刚出不到一年,社区数量肯定不能跟树莓派好几年积累下来的数量相比。但从这块板子超高的性价比和扩展性来看,未来一定会火!

4、很高的扩展性。板子引出了92个引脚,你可以接上几乎任何能想象到的外设(官网也有买各种外设插接板,可惜国内没有代购,不是很好买)。包括AD转换、LCD显示屏、PWM输出、I2C、串口等等应有尽有。

5、就算你是完全的菜鸟(我就是),也能在一天之内上手。买来的板子已经预装了Angstrom Linux系统,用一根USB线连接电脑以后,根据指示安装驱动,然后使用SSH马上就能连接好并开始你的嵌入式Linux之旅。(参考 http://beagleboard.org/Getting%20Started

开源硬件还是有很多选择的,Arduino、Raspberry Pi、Cubieboard、pcduino等等都很不错,以上是我购买之前查到的信息以及购买之后亲身感受的综合。希望我在未来能发挥出这块板子最大的价值!

附:我找到的比较好的含有Beaglebone的技术博客和文章(随时更新)

http://circuitco.com/support/index.php?title=BeagleBoneBlack(官方wiki必须要先看,最重要的是下载里面的System Reference Manual (PDF),官方用户手册和硬件资料)

http://derekmolloy.ie/beaglebone/  (力荐!适合初学者,内容多而且相对基础,而且在YouTube上有视频讲解非常详细)

http://www.element14.com/community/community/knode/single-board_computers/next-gen_beaglebone/blog(这个博客内容相对高级一些,内容也很多,不过向更早翻的话也能找到一些面向初学者的文章)

http://elinux.org/BeagleBone(另一个wiki页面,里面介绍得也很详细,关键是包含大量链接可以探索)

http://hipstercircuits.com(个人博客,内有散落的关于BBB的文章,不太好找,但多精品)

http://beaglebone.cameon.net/home(里面Beaglebone的文章比较多,也有为Beaglebone black补充说明的)

http://www.armhf.com/index.php/category/beaglebone-black/(有几篇入门文章)

http://makezine.com/projects/make-32/get-started-with-beaglebone/(是Beaglebone的上手简介,不是BBB的,看看也无妨)

Stepping into the world of embedded-Linux and Beaglebone Black

总是从各种渠道听说Linux如何优秀,但每次装ubuntu都没能学到什么东西。我分析主要原因是没有明确的学习目的所致。几天前导师布置下来任务,我自告奋勇提出用ARM嵌入式Linux解决,因此从现在开始的两年,我必将和它死磕了!
我决定在实践中学习,因此得先买一款板子。几经比对,选择了Beaglebone Black(以下简称BBB)。这其实是个冒险的决定,因为BBB的处理器是ARM Cortex-A8核的,我之前只玩过Cortex-M3内核的STM32芯片,跨越了多数人必经的ARM9,一下子跳到这么高端的芯片,还是叫我纠结了一阵的。但实在抵挡不住BBB这块板子的魅力,所以狠心决定一不做二不休,就它了!
买来之后我更觉得买值了。因为Linux几乎零基础的我,用了一下午就摸清了基本开发方法,熟悉了很多装了N次ubuntu都没搞清的概念。这一切得益于BBB的人性化设计和YouTube上一位大神的视频教程。稍后我会记录一下我的BBB上手过程供新手参考。
Anyway,嵌入式Linux,我来了!