Nodejs Tips: 在virtualenv下使用nodejs

如题, python的辅助工具virtualenv, 让python的扩展库版本独立, 且不会污染主环境, 最近在用express.js写页面, 也希望能用到类似virtualenv的工具, 没发现一个特别合适的, 于是我的想法是直接装一个node到virtual的bin下面, 额外修改一下环境变量.

在ubuntu 12.04环境下一切正常. 这里虚拟环境路径以virtenv为例

1. 安装node到虚拟环境(virtenv).

1.1 直接用的是官网二进制包 (Gohan觉得用二进制包比较方面快速)

# 安装额外工具
$ sudo apt-get install curl

project$ virtualenv virtenv
project$ wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz
project$ tar zxvf node-v0.10.28-linux-x64.tar.gz
project$ cp -r node-v0.10.28-linux-x64/* virtenv/
project$ rm node-v0.10.28-linux-x64.tar.gz

1.2 直接用源码编译安装

# 编译需要额外安装编译工具
$ sudo apt-get install curl build-essential openssl libssl-dev pkg-config

# 先激活现有的virtualenv环境
project$ . virtualenv virtenv
(virtenv)project$ curl http://nodejs.org/dist/v0.10.28/node-v0.10.28.tar.gz | tar xvz
(virtenv)project$ cd node-v0.10.28
(virtenv)node-v0.10.28$ ./configure --prefix=$VIRTUAL_ENV
(virtenv)node-v0.10.28$ make install
(virtenv)node-v0.10.28$ deactivate
(virtenv)node-v0.10.28$ cd ..
(virtenv)project$ deactivate
# 删掉所有node源码
project$ rm -rf node-v0.10.28/

2. 修改virtualenv的active脚本

为了让virtualenv下的node也能用全局的NODE_PATH环境.

编辑虚拟路径下的active脚本(virtenv/bin/active)

找到修改virtualenv中PATH的地方

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

# 在这里照猫画虎写一段NODE_PATH的重定义
# 如果存在$NODE_PATH, 则追加, 否则直接定义一个NODE_PATH
_OLD_NODE_PATH="$NODE_PATH"
if [ -n "$_OLD_NODE_PATH" ] ; then
    NODE_PATH="$VIRTUAL_ENV/lib/node_modules"
else
    NODE_PATH="$VIRTUAL_ENV/lib/node_modules:$NODE_PATH"
fi
export NODE_PATH

在deactive()函数中, 找到还原virtualevn中PATH得地方

deactivate () {
    # ...
    if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
        PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
        export PYTHONHOME
        unset _OLD_VIRTUAL_PYTHONHOME
    fi
    # 在这里照猫画虎NODE_PATH的还原
    # 如果之前的_OLD_NODE_PATH没有定义, 则不去处理, 否则就还原. 这里我查到了-v的用法, 不确定非bash能不能支持.
    if [ -v _OLD_NODE_PATH ] ; then
        if [ -n "$_OLD_NODE_PATH" ]; then
            NODE_PATH="$_OLD_NODE_PATH"
            export NODE_PATH
            unset _OLD_NODE_PATH
        else
            unset NODE_PATH
            unset _OLD_NODE_PATH
        fi
    fi
    # ...
}

3. 完事儿

好了, 现在在virtualenv下头可以放心用npm install -g了不用担心环境被污染了.

Posted in Useful Tips | Tagged , | Leave a comment

Vim Tips: 如何选中一些行来缩进

选中一块代码来设置缩进为3个空格

  1. 选需要缩进的块, Shift+V, 选中后, 按:.

  2. 看到状态栏会出现: :'<,'>

  3. 缩进三个空格, 那么输入le 3, 回车, done!

选中一块代码缩进2个单位缩进(相对缩进)

  1. 选需要缩进的块, Shift+V

  2. 选中后, 2个单位缩进, 输入2>>, 一个单位缩进使用>>.

  3. 可以用'<<‘来反向操作

缩进单位可以通过shiftwidth来修改.

Posted in Uncategorized | Leave a comment

tmux command 基本用法

tmux是一个命令行多屏辅助工具, 在这里总结一些常用的tmux的command.

tmux中, 可以开启一个session, session对应一个到多个window, 每一个window又有一个到多个panel.

创建新session

tmux new [-d] [-n window-name] [-s session-name] [-t target-session] [-x width] [-y height] [shell-command]

new为缩写, 完整拼写new-session
-d: 如果使用-d参数, 那么新建的session不会被默认attach.
-n: 新建session中的窗口名
-s: session的名字
-t: 目标session, 使用它会和目标session共享窗口, 比较高级的用法

tmux new

最基础的用法足够

连接(attach)已有session

tmux attach [-dr] [-t session_name]

attach为缩写, 完整拼写attach-session
-d: 给其他attach的连接踢掉, 保证只有自己attach
-r: 只读
-t: 指定目标session名称, attach到这个session, 优先选用最近使用, 并且没有被attach的session

杀掉指定的session

tmux kill-session [-t session_name]

杀掉所有的session

tmux kill-server
Posted in Useful Tips | Tagged , | Leave a comment

Saltstack Tips

通过boostrap脚本来安装saltstack(Install saltstack using bootstrap script)

最近半个月在试着用saltstack, 安装saltstack还是用官方提供的bootstrap脚本最方便了.

同时安装master和minion:

curl -L http://bootstrap.saltstack.org | sudo sh -s -- -M

只安装minion:

curl -L http://bootstrap.saltstack.org | sudo sh

查看详细参数:

$ sh bootstrap-salt.sh -h

修改某个minion的unix密码(change a minion’s unix password)

用saltstack可以自己写state去管理某个minion的用户属性, 给用户设置密码.

同时也可以直接在命令行使用shadow这个模块去重设密码.

比如我要给minion-id=node1的机器的用户gohan设置密码为"password":

先获取password的hash:

python -c "import crypt; print crypt.crypt('password', '$6$SALTsalt')"

其中$6$对应的是获取sha512类型的hash, 后边的SALTsalt是盐, 可以自己生成随机字符串.

执行得到的hash: $6$SALTsalt$UiZikbV3VeeBPsg8./Q5DAfq9aj7CVZMDU6ffBiBLgUEpxv7LMXKbcZ9JSZnYDrZQftdG319XkbLVMvWcF/Vr/

设置node1的密码:

sudo salt "node1" shadow.set_password gohan '$6$SALTsalt$UiZikbV3VeeBPsg8./Q5DAfq9aj7CVZMDU6ffBiBLgUEpxv7LMXKbcZ9JSZnYDrZQftdG319XkbLVMvWcF/Vr/'

收到返回:

node1:
True

设置成功!

生成password hash的代码:

#!/usr/bin/python
import crypt
import random, string
password = raw_input("Enter Password:")
N = 8
salt = ''.join(random.choice(
    string.ascii_letters + string.digits) for _ in range(N))
print crypt.crypt(password, '$6$'+salt)
Posted in Useful Tips | Leave a comment

Ubuntu Tips

查看ubuntu已经安装的包(How to list all installed Ubuntu packages)

To get a list of packages installed locally do this in your terminal:

dpkg --get-selections | grep -v deinstall

To save that list to a text file called packages on your desktop do this in your terminal:

dpkg --get-selections | grep -v deinstall > ~/Desktop/packages

(you don’t need to run this as the superuser, so no sudo necessary here)

Source

把当前的ubuntu安装精简到ubuntu-minimal. (Remove all packages from Ubuntu except ubuntu-minimal)

It’s fairly easy with aptitude. First, make sure you have it and ubuntu-minimal installed:

sudo apt-get install aptitude ubuntu-minimal

Then, mark all packages as being automatically installed, except ubuntu-minimal:

sudo aptitude markauto '~i!~nubuntu-minimal'

After that, you should be left with only ubuntu-minimal, and the things it depends on.

WARNING: This doesn’t include a kernel, so I suggest installing linux-image-generic immediately.

Source

Ubuntu下supervisord的自启动 Automatically start supervisord on Ubuntu

Actually, I found one that works here https://gist.github.com/Gohan/9706689. To install it:

sudo curl https://gist.githubusercontent.com/Gohan/9706689/raw/f8cdee4bb3ca34f43e0fe839850f6cf01fc9b9a7/supervisord.sh -o /etc/init.d/supervisord

to run it

sudo chmod +x /etc/init.d/supervisord

and to automatically schedule it, do

sudo update-rc.d supervisord defaults

Make ensure correct pid in /etc/supervisord.conf which is mapped in /etc/init.d/supervisord
注意要让supervisord配置的pid路径和这个init脚本匹配(修改成如下)

example: pidfile=/var/run/supervisord.pid

Stop and Start work properly

sudo service supervisord stop
sudo service supervisord start

Source

Openvz rsyslogd spins CPU bugs workaround

For those running OpenVZ/Proxmox containers, one simple workaround is to
disable the imklog module using this :

sudo sed -i -e 's/^$ModLoad imklog/#$ModLoad imklog/g' /etc/rsyslog.conf
sudo service rsyslog restart

This fixes the 100% CPU usage of rsyslog in Natty, Oneiric and Precise
containers.


You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to rsyslog in Ubuntu.
https://bugs.launchpad.net/bugs/523610

Title:
rsyslogd spins CPU on some kernels

Status in “rsyslog” package in Ubuntu:
Fix Released
Status in “rsyslog” source package in Lucid:
Fix Released

Bug description:
While running 20100218 EC2 image (ami-0512fe6c) rsyslog is constantly
the following message (found in /var/log/kern.log):

Feb 18 05:01:52 ubuntu kernel: imklog 4.2.0, log source = /proc/kmsg started.
Feb 18 05:01:52 ubuntu kernel: Cannot read proc file system: 1 – Operation not permitted.
Feb 18 05:02:22 ubuntu kernel: last message repeated 643668 times
Feb 18 05:03:22 ubuntu kernel: last message repeated 1865459 times
Feb 18 05:04:22 ubuntu kernel: last message repeated 1327321 times
Feb 18 05:05:22 ubuntu kernel: last message repeated 1644146 times
Feb 18 05:06:23 ubuntu kernel: last message repeated 1826234 times
Feb 18 05:07:23 ubuntu kernel: last message repeated 1817861 times
Feb 18 05:08:23 ubuntu kernel: last message repeated 1807415 times
Feb 18 05:09:23 ubuntu kernel: last message repeated 1813151 times
Feb 18 05:10:23 ubuntu kernel: last message repeated 1857271 times
Feb 18 05:11:23 ubuntu kernel: last message repeated 1810173 times
Feb 18 05:12:23 ubuntu kernel: last message repeated 1826654 times
Feb 18 05:13:23 ubuntu kernel: last message repeated 1825384 times

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/rsyslog/+bug/523610/+subscriptions

source

Posted in Useful Tips | Tagged , | Leave a comment

GWeekly[0]=不破不立

from_hxs新的一年的第一篇博客(魂淡, 马上都到劳动节了!), 还是来这里记录一下. 这里长了蛮多草, 原因都是博主太懒, 领了结婚证过了4个多月才来这里打扫. 以前的回顾风格破除掉, 这里继续发表我的随行随想, 一些不完善的技术记录, 也陆陆续续在这里放出来好了.

新的一年, 生活方面多了些颜色, 一些好习惯丢掉了又再捡回来. 日常锻炼还是没有养成规律.

还是经常能看到不远处负能量, 家乡的自来水也出了问题, 没做好的事儿太多, 认真对待自己做的这些事儿. 继续向往正直和公平, 前路漫漫.

工作方面, 在新的小组呆了快半年, 做一个产品比做组件更多的和用户的需求打交道, 也有机会和产品同事沟通, 工作的心情最近略复杂, 产品服务器端的支持目前还是太薄弱, 产品的目标有点混乱却矛盾, 所以我自己也进入了某种迷途.

学习折腾方面, 在vs2012上用boost asio做了数据收发的尝试, 用flask做了个数据库应用抓取特定网站的商品价格, 这次用了uwsgi的worker和supervisor的进程管理, 还使用了celery这个工具替代cron做定时任务调度. 给blog程序迁移到一个新的vps, 给原来写的吸血鬼webapp从linode迁移出去, 把原来apache+mod_wsgi换成了nginx+uwsgi, 着实觉得有时候写的东西放在新的机器手动去部署效率太低, 于是重头再开始看看saltstack, 以前看过puppet的文档, 简单尝试过后再看到saltstack的文档和相关视频, 发现还是saltstack更有feel.

以后的回顾不定期更新, 频率未知:P.

Posted in GWeekly | Tagged | 4 Comments

GWeekly[16,19]=老夏能有什么办法, 而我也没有什么变化

距离上次更新都过去了两月, 对我来说有些子空白, 浮躁的心态没完全消散. 纸上只有断续支离破碎的记录, 好的习惯被打乱, 但是还是过来回顾一番吧.

  生活方面, 如上面说, 两个字来总结, 浮躁, 放松的时间没花太多时间做回顾, 却受到工作, 各种乱七八糟想法的干扰, 也就在这段时间我又虚长了一岁. 在这段时间, 和泥巴旅行两次, 两个人短时间的珠海行, 还有她们游戏工作室的桂林游, 每年应该抽出空来离开熟悉的地方到处走走, 不过劳累和危险这些成本让我这个胆小的懒人有点缺乏兴趣. 泥巴生日那天在桂林过的, 整个一天都在山上, 所以就只是一起喝喝咖啡巧克力奶来庆祝了. 生日快乐! 月末这个周末, 表哥一家三口出境旅行经过深圳, 一起吃了顿晚饭, 讲到我仿佛和5年前看起来没什么变化, 我也不知道这是好还是坏. 愿赤子之心常在, 而心智更加成熟, 同时尽快摆脱最近的浮躁, 再挣扎几下.

  工作学习, 这两个月大多时间埋头干活, 做了挺多需求细节调整, 显示效果的界面开发, 对boost,protobuf,项目自己使用的UI框架有更多的熟练和应用, sharedfromthis, trackable这样的机制也了解了更多. 由于对现有框架提供的公共功能不熟悉, 额外花时间引入了基于zlib的minizip做zip文件的解压缩. 虽说自己对产品特性本身和发展方向不算特别认同, 但是当下的需求的实现过程中让我获得了不少新的经验和体会, 需求增改以及bug引入都不少, 周六基本都在加班了. 个人学习, 说来惭愧, 没有好好看什么书, 业余关注一下便宜的年付VPS, 装装win server等等, 写greasemonkey脚本. 想用CMake+SDL+boost+c++11做一个跨平台的小游戏架子, 发现源文件编码win和linux没法达到很好兼容, 命令行显示中文的地方都要做特殊处理, 有点怕怕, 之后还是先面向win吧.

  休闲娱乐, 除了上面说道的两次旅行, 趁着周末放假还看了几部电影, <狄仁杰神都龙王>, 耍酷的<惊天魔盗团>, <海扁王2>等等, 在看一本叫做think, fast and slow的决策判断心理书, 看完了一部据称是日版甄嬛传的蛮热血的<半泽直树>.

这两个月来都没整理阅读link, 简单列几个看过有点印象的.

marked:

228990H过去了, 我很怀念它们, T_T.

Posted in GWeekly | 1 Comment

GWeekly[14,15] = 说多了都是造谣

truth又是飞快渡过的一个月, 这个月的日志写的有点儿七零八落, 最近看到几则荒唐的因为”造谣”被拘留什么的, 感觉小伙伴们一不小心就当了造谣罪名的冤大头. 我觉得造谣传谣本身应该坚决抵制, 人人都应该为自己的言行负责, 但当消息不通畅, 真伪莫辩时, 真相被屏蔽时, 仅仅去指责那些碎碎念般的造谣就有点本末倒置了. 指责别人造谣之前, 先做到自己反映了真相, 远离了谎言吧. 因此我一直不喜欢玩那个锻炼口才的”杀人游戏”, 用有逻辑的谎言蒙蔽无知的平民, 亦或者做真的自己被敌人陷害和挑拨, 牢骚到此为止, 说多了都是造谣.

  生活方面, 这个月还是断续有游泳和晚上的跑步, 强度一直不大, 周末又再打了次羽毛球, 今年打球的次数大概还没上两位数. 睡眠方面不是很规律, 时而晚睡, 时而周末补觉. 最近几天情绪起伏, 花些时间定定神罢.

  工作学习, 做的东西还是比较的新鲜, 一些工具用起来不算顺手, 开发迭代效率不高, 我只能算是尽力. COM原理和应用这块确实增进了一下, 大学时候看书看不大懂的地方, 这些年渐渐的有更多的认识和理解了. 技术阅读还是看c++ boost相关的书和实践, 用android studio写小应用. 看了一点unity3d相关的开发方法, 也许以后会玩一下.

  娱乐休闲, 几天就给进击的巨人给追到最新了, 很满足的看了最新的龙珠剧场版, 现在沉迷在<古剑2>的游戏中, 作为单机游戏, 古剑2的瑕疵还是不少, 不过也许是好久没投入玩这些游戏, 我还是一点一点儿的玩.

marked:

回顾完毕, 下次再来.

Posted in GWeekly | 2 Comments

GWeekly[12,13] = 出道四年

4years扳指头一数, 工作已经四年, blog回顾又继续犯着拖延症, 其他分心事儿做的太多, 这会儿开始回顾吧.

  生活方面, 没大变化, 初用fitbit这样的穿戴玩意儿记录运动和睡眠. 工作日状况好每天能走路1w步, 睡觉大概不到7小时有效睡眠, 应该还能优化, 偶尔在公司的健身自行车运动半小时. 这两周的周末都会带泥巴去游泳一次, 也算是一点点的锻炼身体吧.

  工作学习, 入职四周年, 转岗到了公司一个挺新的部门, 感谢之前blankyao的推荐. 不再继续做游戏部门的微端项目, 因为公司的亲属回避种种, 之前半年的工作结果只算是半个圆满, 各个游戏工作室在自主研发中更偏向移动端的开发, 在计划上客户端相关的时间精力投入也就放少了. 刚刚进入新部门不到一周, 还在最初上手熟悉中, 工作还是win客户端开发, 目前接触些界面开发的东东, 基于COM/ATL相关框架下的C++开发, 和之前在游戏部门接触的UI界面引擎相比, 周边工具也同样有诸多不好用不方便的地方, 同想象中的差的挺多. 最近没怎么看书, Secrets of the JavaScript Ninja还挂在那里, 用android studio写了一个简单的android程序放在github, 用来计算最近每次玩农场主桌游的得分, 也算对android下普通应用开发的一个了解和实践.

  娱乐休闲, 最近玩了挺多游戏, 试玩了同事推荐的cubeworld, 玩catcher推荐的饥荒, catcher送我的电厂之the first spark也打开玩了两次. 周末和泥巴看了几部电影话剧的, 从<天台>到<环太平洋>的各种类型, 对龙珠剧场版有着好多期待, 接下来一个月内应该能看到了吧. 最近刚入一个hiwifi智能路由, 发现还有点儿意思, 挺新鲜的于是就在原来的路由后边接了这个新路由, 很创新, 线路加速还是相当方便的. 不知道以后有没机会自己去diy一些应用来控制它.

marked:

回顾完毕, 下次继续, 跑会儿步去.

Posted in GWeekly | 2 Comments

GWeekly[10, 11] = 透过棱镜的网络

nsa-prism这个月最让我在意的事儿就是棱镜事件, google的透明报告以前也注意过, 正面的意义能够理解. 当网络行为背后是老大哥的眼睛监控, 心里必定是吞了苍蝇般的难受, 棱镜相比天朝的监控做的更有法可依, 但是大多数人都好不知情, 也许需要更多的透明才能让大家觉得心里安稳. 如果监听项目如同防火墙一般规则清晰透明, 目的如同官方说明般纯洁, 那倒也可以安心了. 斯诺登在爆料这件事儿上做的是够勇气的, 默默佩服. 至于天朝更加黑的乌鸦, 让人心中不安不是一天两天, 两个坏蛋选一个不那么坏的, 继续用海外产品, google家的reader退休了, 带着些感谢和回忆向你告别, 使用你有5年多了.

  生活方面, 端午的假期请两天家和泥巴回了趟兰州, 见了下爷爷奶奶, 按照行程逛了几个景点, 一天天都好赶, 回家都会这么累吧, 赶回去深圳那天头晕脑胀上吐下泻好厉害, 好久身体没有这么失控了, 绝对是前几天吃的太撑破坏了平衡. 这次回去见的爸妈, 亲戚还有爸妈的朋友都说我比之前瘦了不少, 自己并没有感觉, 身体太弱被爸妈担心了, T_T, 要用点心吃东西和保持健康了.

  工作学习, 我在项目组的工作这月给需求支持的接口实现搞好了, 可是项目组的负责功能的开发同事还是抽身不开做整个的需求, 只是自己反复跑测试来检查效果, google test 1000遍这样跑我写的用例, 改掉我实现的子系统线程同步的bug, 额外发现一个项目内消息处理丢消息的bug. 这段时间还在项目组做的游戏的测试简化环境加入一个工具功能, 导出一个特效fxstudio工程关联(需要加载)的资源列表, 最早是做在程序外, 重新简化写的工程文件路径解析, 考虑到游戏那边的特效需求会变更, 改成了用游戏内的流程, 顺便实践了一下wtl程序的基本写法. 学习方面, 回家时候看了本小小书, <理解Unix进程>其实是用ruby api操作unix进程的示例书, 看掉了松本行弘写的被称为民科书的<代码的未来>, 重新开始翻SICP书, 上次卡在第二章的某处, 因此就从第二章重新开始读吧, 试用light table敲了几行的clojure, 还是门外汉. 周末休息时候带泥巴用lua写写快排什么的, 也算有趣, 了解了一下yupoo云存储发现价格蛮贵的, 现在折腾了一个vps+bittorrentsync+nginx来做个人的存储环境, 不过vps比较容易挂掉.

  休闲娱乐, 放假回家重游了一下附近的景泰石林, 宁夏沙坡头. 最近的桌游活动每次都玩农场主, 倒也算欢乐. 几个电影<逆世界>, <超人>. 还有泥巴带我看的日剧.

marked:

回顾完毕, 下次继续~

Posted in GWeekly | Leave a comment