shell必备利器-fzf 模糊搜索

大家使用Linux命令行中,是否碰到过这样的场景:以前使用过的命令或文件,但时间一长记得不准确了,但有几个关键字还是有印象的,这时候如何能快速、准确的找出当时的命令或文件?

大家肯定会想到,用history | grep的方法,现在给大家介绍一个更简便的方法,就是今天要说的fzf脚本。

1. 安装(使用git的方法)

git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

2. 快速查找历史命令
fzf安装后,默认会覆盖原有的Ctrl+R的功能。
因此再按Ctrl+R的时候,就会进入fzf的查找界面,查询方式类似于baidu、google等搜索引擎:支持查询多个关键字,默认为AND的关系。
举个例子:如果记得以前启动seafile的命令,按照记忆输入 seafile start,就可以所有包含这两个关键字的历史命令。
候选列表操作方法:
上下移动:箭头键,或Ctrl+/Ctrl+p
选择:回车键,或用鼠标左键单击
退出:ESC或Ctrl+g

3. 快速选择文件
快捷键:Ctrl+t,列出当前文件夹及子文件夹中的文件

4 快速进入文件夹
快捷键:Atl+c,递归列出当前文件家下的所有子文件
按回车键自动进入选中的文件夹

5. 不使用快捷键的方式触发fzf
在cd vi等命令中选择文件或文件夹的时候,输入**,按TAB,将使用fzf进行查找

参考资料
Shell脚本:模糊搜索神器

曲折的Seafile安装过程

嗯,我得承认,这次安装Seafile折腾的事情,完全是因为最初想偷个懒:申请的vps是centos 6.9 64位,不是Seafile官方推荐的centos 7,所以在网上找了个安装教程开始安装,于是开始了漫长的折腾。

参考文章:
CentOS6.8安装seafile
官方文档: 部署 Seafile 服务器(使用 SQLite)

1、因文件数量不会太多,不想再安装mysql,想用个sqlite算了。结果在安装seafile的时候,报错找不到sqllite3模块。查资料下载源代码编译sqlite3,又重新编译python2.7,算是安装上了。

2、安装完成后启动,一切正常,但访问seahub的时候,出现Internal Error 500的错误。诡异的是,所有日志文件中均没有报错,查了N多资料,最大的可能说是python依赖的包没安装全,但实在没头绪找出缺少哪些包。

3、当时心里不忿,难道6.9就装不上?VPS重新安装了同样的操作系统,按照步骤重新一步一步来,到seafile启动时候,出现和第一个参考资料出现了同样的错误: ”libc.so.6: version `GLIBC_2.14′ not found”.

按照文章中给出的方法,下载新版本的glibc编译安装后,想把lib64/libc.so.6的软链接,修改为编译后libc文件。先把源文件重命名,然后建立新的软连接,居然报错了:

ls: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

不得已,查资料修改,按照下面的方法改过来:

LD_PRELOAD=/lib64/libc-2.14.so ln -s /lib64/libc-2.14.so /lib64/libc.so.6

可惜的是,软链接修改后,seafile仍然无法启动。
更悲催的是,中间参考一篇文章,建议将新版本的libc编译覆盖到原位置。尝试了一下,在make或make install中间出错后,出现N多loading shared libraries的问题,基本上这个操作系统的命令都不能用了,连恢复的方法想不到了。

4、幸亏吃饭后脑子清醒了一些:既然操作系统已经坏了,干脆按照官方建议在centos 7下安装吧。
没有再找其他资料,按照官方安装文档一步步执行,顺顺当当的安装成功后,使用也一切正常。

后记:
官方6.1版本的客户端,不支持windows xp操作系统。所幸的是服务器端兼容性比较好,在网上找5.X版本安装后也能正常使用。
吐个槽就是官方的下载页面, 服务器端和客户端都只有最新版本,要是有历史版本的下载链接就更方便了。

zsh使用小记

知乎上关于zsh亮点的文章,我是看了这个介绍才对zsh有了兴趣:为什么说 zsh 是 shell 中的极品?

安装过程

yum -y install git zsh

# 安装oh-my-zsh
wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

# 安装插件autojump

git clone git://github.com/joelthelion/autojump.git ~/.oh-my-zsh/custom/plugins/autojump
cd  ~/.oh-my-zsh/custom/plugins/autojump
./install.py

# 安装其他插件
git clone https://github.com/zsh-users/zsh-completions ~/.oh-my-zsh/custom/plugins/zsh-completions
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM}/plugins/zsh-syntax-highlighting

# 修改~/.zshrc
# 加到最后一行
[[ -s ~/.autojump/etc/profile.d/autojump.sh ]] && . ~/.autojump/etc/profile.d/autojump.sh
# 启用插件
plugins=(
  git autojump zsh-completions zsh-autosuggestions zsh-syntax-highlighting
)
# 修改插件主题
ZSH_THEME="ys"

# 重新加载配置文件
source ~/.zshrc
autoload -U compinit && compinit

# 打开新的terminal, 验证新的插件功能是否已经生效

zsh的插件列表:
awesome-zsh-plugins
oh-my-zsh Plugins Overview

另外记录两个其他的命令

# 修改时区
echo "export TZ='Asia/Shanghai'" >> /etc/profile
source /etc/profile

# 查看历史操作,去重
history | awk '{$1=""; print $0;}' | uniq

Tmux学习记录

一、安装
高版本的centos可以用yum直接安装,我用5.9 64位版本还不行,需要从源代码编译,且需要先编译依赖的libevent包
参考文章:Tmux学习笔记
有几个补充:
1. 首先需安装gcc
2. ncurses安装的是6.1版本,5.9版本在make的时候会报错
3. tmux安装版本为2.6
4. tmux的configure语句需修改

yum install gcc ncurses-devel

wget https://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar zxvf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local/libevent
make && make install

wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.1.tar.gz
tar xf ncurses-6.1.tar.gz
cd ncurses-6.1
./configure --prefix=/usr/local/ncurses
make && make install

wget https://github.com/tmux/tmux/releases/download/2.6/tmux-2.6.tar.gz
tar xf tmux-2.6.tar.gz
cd /opt/tmux-2.6
./configure CFLAGS="-I/usr/local/libevent/include -I/usr/local/ncurses/include" LDFLAGS="-L/usr/local/libevent/lib -L/usr/local/ncurses/lib" --prefix=/usr/local/tmux

cp /usr/local/libevent/lib/libevent-2.0.so.5 /usr/lib64
cp /usr/local/tmux/bin/tmux /usr/local/bin/

tmux -V

二、使用教程的参考文章:
Tmux使用手册
tmux-Productive-Mouse-Free-Development_zh
上面的文章已经讲的非常全面了,在实际测试过程中,记录几个实用的小Tips:
1、我是在windows上使用ssh的方式连接linux服务器上,如果想把Tmux窗口中文本复制到windows上,可以使用Shift+鼠标左键选择的方式。使用shift+insert的快捷键,可以将windows操作系统的剪贴板内容复制到tmux中。
2、快捷键Crtl+d可以直接关闭当前窗口
3、Tmux的窗口是没有滚动条的,如果想查看屏幕以前输出的内容,需要先进入复制模式,按照vi的方式进行上下滚动(j/k按行滚动,Crtl+b/Ctrl+f按屏幕滚动)
4、快捷键Prefix+=,列出所有粘贴缓存区并粘贴选中的缓存内容,可以在不同的session、窗口之间共享数据,相当于windows中的多重剪贴板功能,非常实用。

===update 2018-04-06===

为了让tmux中vi正常显示中文,需要设置环境变量
export LANG=”zh_CN.utf8″
export LC_ALL=”zh_CN.utf8″

superset安装记录

由于不熟悉python,踩了不少坑,仅以此文记录

1. centos 5.8 32位,更新及安装基本的编译环境

sudo yum upgrade python-setuptools
sudo yum install gcc gcc-c++ libffi-devel python-devel python-pip python-wheel openssl-devel libsasl2-devel openldap-devel

2. 安装Python 3.4.8,注意要使用altinstall,否则后面的安装过程会出现找不到python 2 module的错误

wget https://www.python.org/ftp/python/3.4.8/Python-3.4.8.tgz
tar xvf Python-3.4.8.tgz
cd Python-3.4.8

/configure --prefix=/usr/local
make
make altinstall

创建python3和pip的链接

cd /usr/bin
ln -s /usr/local/python3/bin/python3.4 ./python3
ln -s /usr/local/python3/bin/pip3.4 ./pip

不建议将python3设置默认的python执行程序,否则执行后续的yum操作会报错,当然可以用下面的脚本执行yum,但毕竟麻烦。

cd /usr/bin
python2.6 yum list installed

3. 修改环境变量,
当前目录增加到PATH中,设置语言为UTF-8,否则执行fabmanager会报错

vi ~/.bash_profile
将最后几行修改为:

PATH=.:$PATH:$HOME/bin
export PATH
export LC_ALL=en_US.utf-8
export LANG=en_US.utf-8export LANG=en_US.utf-8

4. 安装superset

pip install --upgrade setuptools pip

pip install superset

cd /usr/local/python3.4 /bin
python3 fabmanager create-admin --app superset
python3 superset db upgrade
python3 superset load_examples
python3 superset init
python3 superset runserver

5. 访问superset

http://localhost:8088

用户名为admin,口令是fabmanger中设置的口令

参考资料;
官方安装文档

oracle expdp impdp使用记录

查询系统中的Directory

SELECT * FROM dba_directories

创建新的Directory

CREATE DIRECTORY dmpdir AS '/opt/oracle';
Directory created.

GRANT read, write ON DIRECTORY dmpdir TO scott;
Grant succeeded.

su – oracle

expdp user/password@oracle_sid parfile=ecc_fms_exp.par

impdp user/password@oracle_sid parfile=ecc_fms_imp.par

ecc_fms_exp.par
schemas=ECC_FMS_01
directory=DATA_PUMP_DIR
dumpfile=ecc_fms_without_srpcell.dmp
logfile=ecc_fms_without_srpcell_exp.log
exclude=table:”like ‘SRP_SHEET_CELL__’”
exclude=table:”like ‘SRP_SHEET_CELL___’”

ecc_fms_imp.par
directory=DATA_PUMP_DIR
dumpfile=ecc_fms_without_srpcell.dmp
logfile=ecc_fms_without_srpcell_imp.log
remap_schema=ECC_FMS_01:ECC_FMS_03
# include=TYPE_SPEC
transform=oid:n

[转]Mysql中模拟递归查询

众所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的。这个得益于Mysql允许在SQL语句内使用@变量。以下是示例代码。

创建表格

CREATE TABLE `treenodes` (
`id` int , -- 节点ID
`nodename` varchar (60), -- 节点名称
`pid` int  -- 节点父ID
);

插入测试数据

INSERT INTO `treenodes` (`id`, `nodename`, `pid`) VALUES
('1','A','0'),('2','B','1'),('3','C','1'),
('4','D','2'),('5','E','2'),('6','F','3'),
('7','G','6'),('8','H','0'),('9','I','8'),
('10','J','8'),('11','K','8'),('12','L','9'),
('13','M','9'),('14','N','12'),('15','O','12'),
('16','P','15'),('17','Q','15'),('18','R','3'),
('19','S','2'),('20','T','6'),('21','U','8');

查询语句

SELECT id AS ID,pid AS 父ID ,levels AS 父到子之间级数, paths AS 父到子路径 FROM (
    SELECT id, pid,
        @le:= IF (pid = 0 ,0,
        IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0  ,
					SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1
					,@le+1) ) levels,
        @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel,
        @pathnodes:= IF( pid =0,',0',
        CONCAT_WS(',',
        IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0  ,
					SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1)
					,@pathnodes ) ,pid  ) )paths,
        @pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall
    FROM  treenodes,
    (SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='') vv
    ORDER BY  pid,id
) src
ORDER BY id

Mysql的行锁只锁一行记录吗?

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。
InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁,会把所有扫描过的行都锁定!

在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。
由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。
当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;

另外间隙锁也会锁多行,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁!

当发生死锁的时候,Innodb目前处理死锁的方法是将持有最少行级排他锁的事务进行回滚。

查看INNODB中可能存在的死锁情况:
SHOW ENGINE INNODB STATUS

[读书笔记]图解CIO工作指南-IT组织和人才

IT运营的功能划分为管理和服务两方面:

  1. IT管理功能,包括IT战略、IT计划、IT投资、IT成本管理、项目群管理、IT资产管理、IT系统推广、协助推动业务变革。
  2. IT服务功能:IT系统构思、需求分析、系统设计、开发、运营和维护,以及IT基础设施、IT采购和IT项目管理。

IT运营与企业内其他部门的协作关系:

  1. 经营层:确认IT规划、IT投资、IT成本和IT风险管理的有效性
  2. IT和业务部门共同完成的职责:IT战略和IT投资
  3. 业务部门为主的工作:推动业务变革和IT系统的普及使用,IT起到协助的作用。
  4. IT为主的工作:上面提到的IT服务包含的所有工作,包括IT管理中的战略、组织和人才

IT母公司和分子公司的关系

  1. 上游功能专注型:母公司负责IT管理的所有工作以及IT系统、基础设施的设计,分子公司负责基础设施的构建、应用程序开发和应用。在IT服务提供领域,母公司可以适当放权,将系统级的设计、开发、采购、运营、项目管理下方到子公司。
  2. 战略功能专注型:母公司负责IT总体的战略、计划、投资、成本、项目群管理、组织和人才管理,如果母公司更偏向与战略,其管理范畴就只包括IT总体的战略、计划、投资、成本。

以上每种模式各有优缺点,需要CIO根据公司经营事业、IT部门的状况选择最适合的一种。

IT组织的三种形态

  1. 集权型:IT运营所有功能集中在IT部门,适合在全公司层面优化IT运用,发挥统筹管理的效果,尤其适合于各业务部门之间关联性较强的情况;缺点是难以配合各业务部门的需求和效率。
  2. 分权型:IT运营功能仅配置在业务部门,容易和业务部门配合,但会导致出现重复建设的问题
  3. 联邦型:IT运营功能分散在业务部门的IT团队以及母公司的IT部门,能够充分发挥集权型和分权型的优势,但母公司IT部门和业务部门IT团战的协调、管理负担较重。

IT应强化的两大功能

  1. IT战略:确保IT的工作与组织的中长期经营战略和事业战略相匹配,IT应该和经营层、业务部门深入沟通,在此基础上确定IT的运用分支
  2. 协助推动业务变更:在业务产生变革想法的阶段,IT就应该提供咨询和帮助,尤其在如何利用IT的部分提供支援。

总体上,IT应该完成从成本中心到业务伙伴转变,IT的传统是按照经营和业务部门的需求完成系统构建,并并保证稳定运行;但在全球化、数字化的背景下,经营层对IT的期待发生了改变,更期望IT为商业模式的变革、业务流程的变革等经营课题的解决方案提供相应机制。

企业的IT人才类型

  1. IT策划人才
    • IT战略规划师:负责IT战略的制定和推进
    • IT商务主管:负责业务变革和相关业务系统的车号
    • IT分析师:IT项目的可行性分析和确认、系统化构思、计划和需求定义
  2. IT服务提供人才
    • IT架构师:IT架构设计、IT标准(应用程序和数据结构的标准化)制定
    • 项目经理:项目立项,交付期、品质、成本的管理
    • 应用工程师:系统需求定义、应用程序的设计、开发和运营
    • 技术工程师:系统基础架构的设计和运营,软硬件的采购规格制定
    • 系统运营经理:系统容量设计、故障管理、系统变更管理,能够完善整体运营流程的优化

IT人才培养

为了培养同时精通业务和IT的人才,需要在业务边和IT部门之间建立人事轮岗制度。
在IT战略方面,为培养全公司整体优化的视点,建议建立经营企划部门和IT部门的兼容和轮岗制度。

  1. IT策划人才:不以IT专业能力为目的,从业务部门和IT部门的企划人才中重点培养
  2. IT架构师:从新开发系统机会进行培养俯瞰系统、理解系统架构的能力,IT架构师需要理解和掌握不断变化的IT技术,企业内部的信息收集和研究开发能力有限,必要的时候可以借助于外部专家和供应商合作伙伴。
  3. 其他人才,在系统开的和运营等实践经验的积累进行培养。

[读书笔记]图解CIO工作指南-工作职责和工作领域

CIO工作职责

  1. 在企业经营和业务运作中推进IT运用,成为企业经营层和IT之间的沟通桥梁

要求具备沟通能力、领导能力、协调能力,以及对业务的深入理解
实现形式:
成立CIO办公室,为CIO决策提供所需信息,准备与业务、IT子公司的协同工作;
可以是IT部门内部领导兼职的虚拟组织。

  • 2. 统管IT部门和信息系统

擅长IT实务的管理者,具备构建、维护复杂系统的能力,同时能正确判断突发问题的风险并解决问题。
常见的方式是CIO负责沟通,其他管理负责人负责此职责(美国企业中的CTO职责)

工作领域

  • 战略、治理

与企业经营者一起制定符合企业战略的IT战略,并确定实现该战略的治理机制

  • 投资、成本
  • IT组织、人才

确定IT、业务、IT分子公司、外部供应商的职责和责任划分,在此基础上确定IT组织形态
同时制定IT人才标准,并努力获得和培养

  • 资源管理

包含企业内部资源(人力、物力、资金)和外部资源(供应商、专家、外包服务商),建立外部资源管理框架

  • IT服务

包含应用系统的开发、实施、问题咨询和处理

  • IT风险

评估系统故障、停机、信息安全泄露的风险并建立对策

  • IT架构

根据企业经营和业务战略追求的商业模型,构思企业信息系统的整体结构,即IT架构,并建立起对应的管理框架