San Domingo's Blog

Courage, Duty, Honor!

为了大陆更好的访问,该blog已经迁移到这里继续维护

让进程在后台运行

| Comments

当使用ssh连接到服务器运行程序时,用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。但这往往不是我们想要的结果。为了避免这种情况的发生,让程序能够在服务器上正常运行,的解决办法就有两种途径:

  • 让进程忽略HUP信号;
  • 让进程运行在新的会话里从而成为不属于此终端的子进程。

nohup … &

nohup命令用途就是让提交的命令忽略HUP信号;&命令用途是让提交的命令在后台运行。同时使用nohup ... &可以让提交的命令忽略HUP信号,并将该命令放在后台运行。

e.g.:nohup sh big_task.sh > big_task.log 2>&1

Q:nohup 和 nohup … & 的区别?

A:nohup仅表示让提交的命令忽略hangup信号,但该命令仍然在前台运行,当前的shell会被阻塞,无法继续进行操作。但可以通过 ctrl-z将当前的命令挂起到后台,然后再使用bg命令让其在后台运行,这样就可以达到和使用nohup ... &同样的效果

Q:仅使用 & 命令会如何?

A:仅使用&命令仅会将命令放在后台执行,但仍然可能会受到HUP信号的影响。但此时可以通过使用disown -h命令让其忽略HUP信号

setsid

setsid可以让提交的命令在一个新的session中运行,新的进程不属于接受hangup信号的终端的子进程,这样即使ssh连接中断,新的进程也不会受到影响。

screen

screen可以用来创建一个新的session,它不属于ssh连接进程的子进程,因而不需要费心考虑HUP信号。

Macbook修复万金油

| Comments

Macbook正常使用极少出现问题,但一不小心碰到一个意外反而会让人不知所错。想想早年使用Windows时,纵使出现黑屏、蓝屏、卡成狗的情况,也可以坦然的面对,悠然的fix it,还很是怀念。这里开始记录一些修复Mac的万金油方式,等我有足够的RP遇到足够的问题的时候,这篇blog也就差不多算是写完善了。

重置PRAM

PRAM(Parameter random-access memory, 在基于Intel的Mac上也称为PRAM):存储了一些可以让OS X快速访问到的设置,例如指定的启动盘,显示分辨率,扬声器音量等。

已解决问题

  • 开机后一直黑屏,甚至没有白苹果。

重置步骤:

  1. 关机
  2. 在键盘上找到如下四个按键:Option, Command(⌘), PR,熟悉其位置,在步骤4中需要同时按下
  3. 按电源键开机
  4. 按了开机键后立刻同时按住Option, Command, P, R四个键。需要确保在出现灰色屏幕之前按下。保持按键直到Mac重启,再次听到开机音
  5. 同时松开全部按键

Ref: Apple Docs

P.S.(个人经历):在重置PRAM后Macbook仍然有问题时,可以尝试重置2-3次(保持按键直至Mac第二第三次重启再释放)。

SingleUser模式

已解决问题

  • 覆盖安装Yosemite Beta后,丢失管理员权限,通过进入SingleUser模式,删除/var/db/.AppleSetupDone后解决

在单用户或详细模式下启动

  1. 关闭 Mac(如果处于打开状态)。
  2. 按电源按钮以启动电脑。
  3. 立即按住 Command (Apple) 键和以下按键之一:
    • “s”键(用于单用户模式)。 (Command-S)
    • “v”键(用于详细模式)。 (Command-V)
  4. 当看到屏幕上出现白色文字时,即成功进入单用户模式或详细模式。

Ref: Apple DocsQuickly restore a missing admin account in OS X

重置SMC

SMC(System Mangement Controller):负责管理Mc的很多低级功能,例如对开机键做出相应,对Macbook的屏幕盖开合做出响应,环境广度感应等。

有时候SMC可能会出现问题,而导致系统出现异常行为。有些情况下,重置SMC可能是解决问题的唯一方法。但是!!!要尽可能通过其他方式来解决故障,重置SMC应该只是你最后的,压箱底的选择。

已解决问题

  • 暂时还没有使出这压箱底的大招

重置步骤(针对09年之后的Macbook):

  1. 关机
  2. 确保Mac的电源已经连接
  3. 同时按下(左侧)Shift-Control-Option 键和电源按钮。
  4. 同时松开所有按键
  5. 按电源键开机

Ref:Apple Docs

Class Not Found Exception and Error

| Comments

java.lang.ClassNotFoundException:

Java Doc

Thrown when an application tries to load in a class through its string name using:
* The forName method in class Class.
* The findSystemClass method in class ClassLoader .
* The loadClass method in class ClassLoader.
but no definition for the class with the specified name could be found.

This exception indicates that the class was not found on the classpath. This indicates that we were trying to load the class definition, and the class did not exist on the classpath.

该异常一般在运行时想要动态加载一个类时,发现该类不在classpath上时会被抛出。

java.lang.NoClassDefFoundError:

Java Doc

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in 
the definition of a class (as part of a normal method call or as part of 
creating a new instance using the new expression) and no definition of the 
class could be found.

This exception indicates that the JVM looked in its internal class definition data structure for the definition of a class and did not find it. This is different than saying that it could not be loaded from the classpath. Usually this indicates that we previously attempted to load a class from the classpath, but it failed for some reason – now we’re trying to use the class again (and thus need to load it, since it failed last time), but we’re not even going to try to load it, because we failed loading it earlier (and reasonably suspect that we would fail again). The earlier failure could be a ClassNotFoundException or an ExceptionInInitializerError (indicating a failure in the static initialization block) or any number of other problems. The point is, a NoClassDefFoundError is not necessarily a classpath problem.

简而言之就是类在加载的时候发生了错误,可能是

  • 类的静态初始化(块/域)出了问题

  • 编译成功的.class文件未出现在classpath中

Keep Going

| Comments

学艺不精,需要闭门造车几个月。。。

Classpath and Sourcepath

| Comments

java options

-classpath classpath

Set the user class path, overriding the user class path in the CLASSPATH environment variable. If neither CLASSPATH or -classpath is specified, the user class path consists of the current directory.

If the -sourcepath option is not specified, the user class path is searched for source files as well as class files.

-sourcepath sourcepath

Specify the source code path to search for class or interface definitions. As with the user class path, source path entries are separated by semicolons (;) and can be directories, JAR archives, or ZIP archives. If packages are used, the local path name within the directory or archive must reflect the package name.

Note that classes found through the classpath are subject to automatic recompilation if their sources are found.

Maven Dependency Mediation

| Comments

Maven的依赖调解

之前自己一直以为maven会选择最新版本的依赖,其实不然,完完全全的错误哇!

其实Maven进行依赖解析时,遵循以下逻辑:

  • 路径最短优先:根据依赖传递长度,选择拥有最短长度的依赖。

  • 如果依然存在冲突,则遵循最先声明优先,在pom.xml文件中按从上到下的顺序选择依赖。

32bit or 64bit

| Comments

CPU支持32位和64位,操作系统kernel分为32位和64位

概念

//TODO

衍生

早年09年macbook air高配,只有2GB的内存,升级了10.9的Mavericks后,开机便占用了1.5G以上的内存,想再打开其他应用已经成为妄想。 可以尝试使用32位kernal模式运行操作系统。 reference

Zsh新手指南

| Comments

使用技巧

  • zsh向下兼容bash
  • 更好的历史记录功能:输入部分命令后按上下方向键即可以在向前或者向后查找以此为前缀的历史命令
  • 强大的自动补全:输入一个命令后,之后的命令、参数不知道怎么输入时,可以无脑按tab,一般均会有提示
    • 输入 kill,然后tab,会列出当前会话中的所有进程
    • 输入 ssh,然后tab,会出现历史连接的host记录
  • 输入d,可以现实当前会话中访问的目录列表,再输入对应目录的编号即可以跳转到对应目录下
  • 几乎可以省略写cd命令

推荐插件

  • autojump

[Java]不同Jar包中出现同名class引起的程序Bug

| Comments

最近在研究boilerplate这个页面自动抽取方法,结果遇到了Stack Overflow的问题,报错现实问题在org.cyberneko.html.HTMLTagBalancer.endElement这里。这个问题是偶尔出现,而且频率也不高,追踪了几天,也找不到问题究竟出在哪里。周末有空了,想想还是来认真fix一下这个bug吧。

吸取了之前没有逻辑性的bug追踪过程,这次算是比较有条理的在解决问题,记录下解决思路,希望自己以后不要在栽在这样的坑里了。

发现问题

我们的java应用都是用shell脚本启动,在服务器上运行时,报出Stack Overflow的错误。接到报错后,立刻开始调试程序,在本地计算机上用shell脚本启动,也报同样的错误,然后在IDE中调试,一切正常。

解决思路

  1. google了下这个问题,发现cyberneko官方有issue,承认这是个bug,并在新版本中已经修复。
  2. 检查shell脚本,确认传入到Java程序中的参数时正确的。
  3. 查看并对比了IDE和shell脚本启动Java程序的jvm参数。发现略有不一样,逐个对比调试发现在shell脚本中使用IDE配置的classpath运行程序竟然没有报错,这下问题定位到错在classpath上了。
  4. 将shell和IDE中的classpah拿出来对比,发现cyberneko的版本一致,已经是最新的了。
  5. 栽入坑中若干小时…尝试对两个classpath配置逐条对比,并在正确的classpath上逐条来测试,企图重现错误。
  6. 许久才联想想到classload加载类的机制,才想到classpath中条目顺序的问题,试了一下,发现cyberneko和boilerpipe这两个jar包顺序如果颠倒了,就会报错。
  7. 检查boilerpipe和cyberneko这两个jar包,发现问题根源

    boilerpipe中竟然copy了cyberneko的两个类的代码,而且包名也没有修改,查看源码后,boilerpipe里copy的代码应该是比较旧版本的,因而导致了报错。

  8. 最后便是修复bug,我采取了比较简单的而暴力的方式,将boilerpipe的jar包中copy的代码直接删除,因为我的classpath中有cyberneko的jar包,所以在回归测试时,boilerpipe的抽取算法依然可用,至此,bug修复完毕。

事后

Bug追踪还是得顺藤摸瓜!切忌无脑失错。对于像我这种记性不好的,最好在纸张上记录下整个Bug追踪的线路,这样哪些路已经走过,哪些路走不通,哪些路还可以尝试,一目了然。

Mac新手指南(编写中)

| Comments

最近好友aKai终于从Linux阵营倒戈到了OS X,作为一名酷爱DIY的用户,他甚是不习惯OS X的各种操作,问了很多让Mac用户很是意外的简单问题。于是,想想还是在这里记录一下,为了日后有新的小伙伴倒戈来OS X留下入门可读的第一手资料。(本文是基于OS X 10.9.2 Mavericks)

本着易学易会的原则,尽可能将缩写、快捷键的完整英文表示写出来,OS X的很多操作都是很直觉式的操作,掌握了其根本思想后,日后自然便驾轻就熟了。因为个人有刨根问底的习惯,所以有引用的地方都尽可能的会给出原始url,例如软件方面,除了App Store,其余的尽量都给出官方下载地址。

一些简写:Win->Windows系统, app->application

常见概念对应

  • Finder –> 资源管理器(Win)
  • Activity Monitor –> 任务管理器(Win)
  • cmd键 –> Ctrl键(Win,绝大多数情况下)

安装软件

OS X上安装软件其实更像是Win和Linux的结合体,一般有一下几种安装方式:

  1. 如同Linux的软件中心,OS X有App Store,搜索软件,点击安装,输入apple ID确认即可。
  2. 如同Win的iso光盘镜像,OS X有dmg(Disk Image)格式的镜像,双击打开后一般会自动弹出一个窗口,一般包括一个app后缀的文件,和一个Applications文件夹的软连接(快捷方式 for Win用户),只需要拖动app文件放入Applications文件夹即可。
    • 如果发现双击后没有弹出任何窗口,可以在Finder的左边栏->设备(Devices)中找到刚刚点击的光盘镜像,点击后可以在Finder窗口中发现app文件和Applications文件夹。这里的Applications软链接指向的是/Applications文件夹,这也可以在Finder的左边栏里找到。可以直接把app文件拖入该文件夹完成安装。
  3. 如同Linux中的rpm安装包,Win的exe安装包,OS X有pkg安装包,直接双击,按照提示完成安装即可。
    • 有时pkg安装包会封装在光盘镜像dmg中,也按照pkg安装包的方式安装即可。
  4. 如同Linux的apt-get, yum包管理工具命令,OS X有brew,详细使用可google brew。

日常操作

打开软件

Win用户和Linux会把常用的软件放在桌面上,而OS X一般是将常用的软件放在Dock上。所有安装的软件都可以在/Applications文件夹里或点击Dock上的Launchpad找到。更快捷的方式是使用spotlight(屏幕右上角的放大镜)根据应用名来快速检索并打开应用。

关机

合上屏幕即可,OS X拥有混合睡眠的待机模式,不需要关机,合上屏幕即可带走,打开屏幕便可以使用。

系统设置

虚拟桌面

打开Mission Control.app,将鼠标滑到屏幕右上角的区域,会出现一个添加桌面的按钮,点击即可。

快捷键篇

OS X的默认快捷键一般是基于ctrl, opt, cmd (分别对应control, option, command键)加上其他按键组合完成的。

功能键符号注释

  • ↵ –> return
  • ⇥ –> tab
  • ⎋ –> esc
  • ⇧ –> shift
  • ⌫ –> delete
  • ⌃ –> control
  • ⌥ –> option
  • ⌘ –> command

贴两张图,保证直观

截图

  • cmd + shift + 3 截屏(等价于Print Screen),保存到桌面
  • cmd + shift + ctrl + 3 截屏,保存剪贴板
  • cmd + shift + 4 (+ space )截屏,自定义区域截图(指定窗口截图)
  • cmd + shift + ctrl + 4 (+ space )截屏,自定义区域选取(指定窗口截图)

日常操作

  • 在launchpad中按住opt键,可以删除软件(也可以直接去Applications文件夹中删除)

    日常编辑

  • cmd + c 复制
  • cmd + v 粘贴
  • cmd + opt + v 移动(剪切操作对应为:先复制,再移动)
  • return 文件重命名(!!!不是打开文件,如果需要打开文件,请使用下一条命令)
  • cmd + o 打开文件
  • space 快速预览文件
  • delete 删除前一个字符
  • fn + delete 删除后一个字符

终端操作

  • (current-path)$ open . 在终端中打开Finder并定位到current-path(pwd所对应路径)

其他按键

基于方向键的组合按键也可以产生很多实用的功能

  • fn + up = scroll up
  • fn+ down = scroll down
  • fn + shift + up = page up
  • fn+ shift + down = page down
  • fn + left = top
  • fn + right = bottom
  • opt + left/right = 输入光标按词移动
  • cmd + left = 输入光标移动到行首
  • cmd + right = 输入光标移动到行尾

常用软件

  • MPlayerX: 视频播放器,支持很多格式
  • iTunes (系统自带) 听音乐,Podcast
  • XLD: 无损音频解码器,支持无损格式的音乐播放
  • LaunchBar: 桌面启动器,比spotlight更好用(升Yosemite后估计就不太用得着了)的借助索引的启动器,剪贴板功能很实用,而且可以免费实用(Alfred好贵..TAT)
  • Eudic 词典,支持屏幕取词和划词解释。

开发者常用工具

如果你是一名程序开发者,以下工具还是建议安装的,至少让我个人觉得很是方便。

  • oh-my-zsh: 更好用的终端zsh 安装命令: 在终端下执行 curl -L http://install.ohmyz.sh | sh

  • brew: mac下的软件包管理工具 安装命令:在终端下执行 ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

  • iTerm2: 更好用的终端,其中的分屏功能很实用。

  • Sublime Text2: 轻便的文本编辑器
  • Mou: Markdown编辑器
  • Sequel Pro: MySQL客户端
  • Wunderlist(App Store): Go-To-Do软件,跨平台,免费