XStack

Deep into details

0%

最近在学习树莓派, 找了个公开课, 是个在线的网页, 不过我还是习惯看PDF文档, 我是这样把网页转换成PDF的:

  1. Chrome打开网页
  2. 改样式: 主要是要删除一些不必要的信息及避免表格被打印到两页上
  3. Command+P打印页面

其中, 修改的样式内容如下:

1
2
3
4
5
6
7
8
9
10
11
body.two-col ul#nav-primary, body.three-col ul#nav-primary{display: none;}
ul#nav-breadcrumb{display: none;}
div#dept-title{display: none;}
div#sub-brand{display: none;}
.dept div#header{display: none;}
div#container{border-left:none;border-right:none;border-bottom: none;}
ul#site-info{display: none;}
body{background: none;margin:30px;}
table{page-break-inside:avoid;} // 避免表格被分到两页打印
#pageFooter{margin-bottom: 0;}
body.two-col div#content, body.three-col div#content{float:none;}

PS:

  1. 现在看到第三节函数部分
  2. 树莓派还是给初学者降低了很多陡峭的曲线, 可以直达kernel, 而不是必须要弄先明白MBR, bootloader, 实模式等概念才能继续.
  3. ARM是英国的, 树莓派是英国的, MIPS也被英国的Imagination收购了, 又冒出来一个Graphcore.

日志的区分与汇总方式: 一次事务采用独特标记与事务内异步事务的附加标记方式, 说明如下:#

  1. 为每次HTTP事务分配一个id, 本次事务内全部日志都输出该标记, 方便查找时以此为唯一索引, 可以查找这次请求过程中所有相关输出
  2. 单次事务中, 所有对外部依赖的操作(包括接口请求,Redis操作,MongoDB操作等)均加独特id标记, 并附加到请求的id后, 构成形如: <user-request-id>:<redis-request-id>的形式, 内部再有细节划分则追加到后面, 以冒号分隔(其它分隔符也可以, 主要是为了更好的使用阿里云日志的搜索功能)
    id生成算法:
    1
    2
    3
    4
    5
    // 10(或11)位的短字符串
    Math.random().toString(36).substr(2)

    // 唯一程度更高的19(或18)位字符串
    Math.random().toString(36).substr(2)+new Date().getTime().toString(36)

    长内容的隐藏与查找#

    在使用id进行查找时, 存在着有些内容返回过多, 不需要展示的情况(如请求的响应信息, 只在必要时才需要查找出来), 此时, 最好不要使用id前缀, 否则容易被长内容干扰, 抓不住重点.
    为了解决这个问题, 可以在存在长内容的时候使用两条记录: 一条内容包含id, 同时包含一个随机串, 通过随机串可以查找到具体内容:
    1
    2
    log.info(logPrefix + ":请求信息key:" + uniqueKey);
    log.info(uniqueKey + ": 请求详细信息: " + result);

    日志记录的内容:#

  3. 标识部分: 用户标识/页面标识/关键判定/
  4. 内容部分: Redis的k-v/请求数据/响应数据/错误信息/步骤信息

什么时候需要加日志:#

  1. 所有的外部依赖(请求/Redis/MongoDB/文件IO等)
  2. 关键判断逻辑需要详细记录判定的依据, 次关键判断记录判定结果, 不关键的可以不加

快速跑起来#

  1. 官网下载源码包
  2. 解压安装: tar zxvf redis-3.2.8.tar.gz
  3. 进入目录: cd redis-3.2.8/
  4. 编译: make
    编译完成后, 最重要的两个文件是: src目录里面的redis-server redis-cli两个文件, 把这个文件拷贝到PATH中即可运行.
  5. 简陋地运行一下: src/redis-server redis.conf 命令后指定配置文件即可跑起来

更好的封装#

参照Nginx的形式, 做了如下的处理:

  1. 创建主目录: sudo mkdir /usr/local/redis
  2. 主目录内的目录结构:
  3. bin - 主要存放redis-server redis-cli两个可执行文件, 把这个目录放到PATH中即可(我是图方便直接修改了/etc/profile文件) 按照标准, 应该区分sbin和bin目录, 就不再找麻烦了吧
  4. conf - 主要存放配置文件(复制、修改自源码目录下的redis.conf这个文件)
    按照需要修改端口号,监听地址(0.0.0.0),logfile路径,pidfile路径, daemonize yes, dir /usr/local/redis/, dbfilename dump.rdb
  5. logs - 把日志输出到这里(logs/redis.log)
  6. redis.pid(文件 - 保存redis的pid)
  7. dump.rdb(文件 - 保存redis数据)
  8. 作为服务启动:
    复制如下内容到/etc/init.d/redis, 里面的前两行注释是给chkconfig使用的, 之后的启动命令就是以www用户启动服务(sudo -u www $EXEC $CONF)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    # chkconfig:   2345 90 10
    # description: Redis is a persistent key-value database
    PATH=/usr/local/bin:/sbin:/usr/bin:/bin

    REDISPORT=6378
    EXEC=/usr/local/redis/bin/redis-server
    REDIS_CLI=/usr/local/redis/bin/redis-cli

    PIDFILE=/usr/local/redis/redis.pid
    CONF="/usr/local/redis/conf/redis.conf"

    case "$1" in
    start)
    if [ -f $PIDFILE ]
    then
    echo "$PIDFILE exists, process is already running or crashed"
    else
    echo "Starting Redis server..."
    sudo -u www $EXEC $CONF
    fi
    if [ "$?"="0" ]
    then
    echo "Redis is running..."
    fi
    ;;
    stop)
    if [ ! -f $PIDFILE ]
    then
    echo "$PIDFILE does not exist, process is not running"
    else
    PID=$(cat $PIDFILE)
    echo "Stopping ..."
    $REDIS_CLI -p $REDISPORT -a 123wujiecao SHUTDOWN
    while [ -x ${PIDFILE} ]
    do
    echo "Waiting for Redis to shutdown ..."
    sleep 1
    done
    echo "Redis stopped"
    fi
    ;;
    restart|force-reload)
    ${0} stop
    ${0} start
    ;;
    *)
    echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
    exit 1
    esac
  9. 启停命令service redis startservice redis stop
  10. 注册为启动命令: sudo chkconfig --add redis
    检查是否成功: chkconfig --list redis, 如果返回类似redis 0:off 1:off 2:on 3:on 4:on 5:on 6:off的结果就说明成功了

PS: 强制关闭进程#

遇到一个颇尴尬的问题: 启动后, 由于配置文件中没有指定dir /usr/local/redis/, 导致redis关闭的时候写文件时没有权限, 就不能完成关闭, 就怎么都不能关闭服务, 只能强制杀死进程:sudo kill -9 <pid>

$ xxd ***.bin
vim下可以调用xxd来查看:%!xxd
使用od命令也可以, 输出也更友好
$ od -t x1 boot.bin

实现效果#

显示上调命令返回状态➜路径@时间

代码#

1
2
local ret_status="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
PROMPT='${ret_status}%{$fg[cyan]%}%c%{$reset_color%}@%{$fg[blue]%}%`date "+\%H:%M"`%{$reset_color%}\$'

说明#

  1. 把git状态干掉了, 加上以后在大项目下面,会很卡,明显影响效率
  2. oh-my-zsh的prompt设置在theme里面(theme设置在~/.zshrc里面, 比如我的主题存放在~/.oh-my-zsh/themes/robbyrussell.zsh-theme)
  3. bash是$PS1,不过,上面的命令仅适用于zsh

以上, 备忘

代码#

1
2
3
4
5
6
7
8
9
10
11
const fs = require('fs');
var path = '/Volumes/';
fs.watch(path, function (event, filename) {
fs.exists(path+filename, function(exist){
if(exist){
console.log("mount as:"+filename);
}else{
console.log("unmount:"+filename);
}
});
});

原理#

系统会mount设备到/Volumes/目录,创建一个新文件夹,所以,监听/Volumes/目录变动即可

位置#

1
cd /System/Library/Frameworks

OpenGL调用#

1
gcc source.c -framework GLUT -framework OpenGL

需要使用osascript命令来搞

代码#

1
2
3
4
5
6
7
8
tell application "System Events"
tell desktop 1
set picture to "/Users/pxl/Pictures/earth.jpg"
end tell
tell desktop 2
set picture to "/Users/pxl/Pictures/wall.png"
end tell
end tell

如何使用#

  1. 命令行直接输入osascript,然后粘贴上面的代码后,按Ctrl+D即可执行
  2. 另外一种执行方式:保存为background.scpt, 然后执行命令osascript background.scpt

更多关于osascript#

  1. 帮助文档
  2. API