Word 中实现无格式粘贴的便捷方式

使用 Word 编辑文档时,常常需要从其他(Word/Excel)文档或者网页上复制内容。但是剪贴板中的内容往往是带有格式,直接粘贴进文档中会破坏当前的格式。

一般来说,有多种方式来实现无格式粘贴:

记事本消除法

借助于记事本或者其他txt文件编辑器,可以只保留文本内容的方式获得plain的文本。这种方式更适合于粘贴大宗文本之前需要进行二次编辑以及共享编辑成果的情况。普通文本状态下我们可以更加专注于文本内容本身的组织编排而不受到格式的干扰。
由于需要借助于第三方软件,在面对(大量的)短文本时这往往会让工作变得复杂。

Word菜单命令消除法

途径一:

“编辑”→“选择性粘贴”

“右键单击鼠标”→“选择性粘贴”
打开“选择性粘贴”对话框

在“粘贴”的“方式”选项中选择“无格式文本”方式
选择性粘贴对话框

途径二:

粘贴后打开浮现的“粘贴选项”→“只保留文本”
粘贴选项情景菜单

除了以上两种途径还可以使用“字体”中的“清除格式”命令消除源格式的干扰,但是这种方式会将你之前设置好的文本格式一并消除,所以算不上无格式的粘贴。
显然通过这些菜单命令的方式仍然达不到今天要介绍的便捷方式效果。幸运的是我们解决问题思路已经基本接近了——通过软件内置命令实现,不幸的是 Word 这款老软件里并没有提供 “无格式粘贴” 这样一个流行的命令。

不过既然是可以通过组合命令完成的工作,我们会想到利用 Office里的宏 Macro 来实现自动化的处理。

快捷键+宏命令

首先将处理流程转为宏:

  1. 打开或新建一个普通 Word 文档;
  2. 在“页面视图”下:“工具”→“宏”→“宏…”,打开“宏”对话框;
  3. 在“宏”对话框中:“宏名”文本框中输入你要建立的“宏”的名称(比如:PastePlainText),点击右侧的“创建”按钮,打开新建宏的编辑界面;
  4. 编辑代码编辑区中代码如下图,点击工具栏上的保存按钮保存代码,然后点击最左的视图切换按钮关闭编辑页面,返回 Word 视图完成创建;
    编辑宏代码

然后为宏设置一个快捷键:

  1. 在“页面视图”下:“工具”→“自定义键盘…”,打开“自定义键盘”对话框;
  2. 在“自定义键盘”对话框中:“类别”选择“宏”,右侧选中前面创建好的“PastePlainText”宏,在“按新快捷键”文本框中按下你要设定的快捷键组合,比如“Control+V”,最后点击“指定”按钮。确保“目标指定到”的状态提示为[未指定],否则会覆盖之前的快捷键。
    制定快捷键

至此,我们就可以通过便捷的方式实现“无格式粘贴”,开始复制粘贴吧!

注:以上 Microsoft® Word for Mac 2011 为例,除了键盘设置外,基本适用于2007版以后的Windows版 Word 软件。

Mac截图技巧

日常工作中,有时候会需要在屏幕上截图。今天分享一下如何利用Mac自带抓图应用完成我们需要的截图任务。这里分两类方法介绍:

菜单流

第一类方法就是通过打开“抓图”软件,利用软件清晰明了的菜单进行截图。

所以,首先需要在应用程序中找到并打开软件,你通常会在实用工具这个应用文件夹中找到。

接下来我们主要关注的是捕捉这个菜单项。

捕捉菜单项

点击选用的每个截图功能,都会弹出一个对话框,提示如何操作,在此就不赘述了。只需要按照实际情况使用不同截图方式便可。

这里要说的是使用这种方式只适合不熟悉的软件功能的时候使用。
要想提高效率还是要使用快捷键的方式完成任务 >>

快捷键流

这里的快捷键跟不是前面菜单旁边提示的快捷键,而是Mac系统提供的快捷键,不需要借助于上面的软件就能完美实现截图。

快捷键一:截取整个屏幕

command + shift + 3

比如在这种全屏的时候
全屏
只需要上面的快捷键可以轻松截取当前整个屏幕。

快捷键二:截取部分屏幕

command + shift + 4

连续按下上面的三个键后,光标会变成十字状,旁边显示坐标以作辅助。

拖拽光标画出一个截图区域后,系统会自动将图片保存至桌面上。

如果拖拽光标画出一个区域后不松开鼠标,可以

按住空格键,对移动当前截图区域而不需要重新选择;
按住 shift 键,可以只对截图区域进行一个方向的缩放;
按住 option 键,则是在保证长宽比的情况下进行缩放;
如果想要放弃本次截图,只需要按一下 esc 键。

通过上面的组合,截图的时候很容易控制。

快捷键三:截取窗口

按下快捷键二后再按空格,即可切换到窗口截取模式(光标变成照相机的形状)。
将光标(鼠标)移动到需要截取的窗口,单击鼠标左键即可。
抓取窗口

可以看到抓取的窗口会自己带上一个漂亮的投影,赶脚档吃瞬间提高了不少 * _ *
当然如果不需要阴影,只需要用菜单流的方式抓图窗口即可。

Happy Mac ↑

锋利的Node.js图片处理库sharp

由于项目中需要用户上传的头像的功能,所以就参照一些网站实现在线图片裁切的功能。
经过朋友推荐和多方比较,前端采用 Jcrop 和 jQuery Form 实现用户界面,把用户要裁切的图片区域和图片异步的方式提交后端。
而后端则负责对图片的裁切,输出并保存为用户头像。

这篇主要以Express框架为例介绍如何在Node.js开发环境中使用sharp库处理图片。

sharp是由伦敦的一位开发者lovell开发的基于libvips的一款轻快的图片处理库。
以下是原文介绍,详情可以戳上面的Github链接了解更多。

The fastest Node.js module for resizing JPEG, PNG, WebP and TIFF images. Uses the libvips library.

安装

关于安装需要注意除了基本的Node.js开发环境之外,还需要预装libvips库。关于如何在各个平台上安装vips,其GitHub页面已经给出详细的参考,我在CentOS和Mac OS上都已成功预装。不过在Mac上安装时遇到一些问题,已经在之前的文章中给出相应的解决过程。

按照官方提示安装好sharp之后就可以开始对图片进行裁切、缩放、旋转,并且可以更改图片的输出格式,质量等。这些已经完全能满足裁切头像的需求了!

使用

首先自然是需要引入sharp库

1
var sharp = require('sharp');

风格

sharp使用的是跟jQuery类似的链式操作风格:sharp('input.jpg').resize(300, 300).max() ...

示例

下面代码(有省略)就是根据前台传送过来的裁切数据,进行裁切的片段

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
// 对数据格式进行转换
var left = data.x;
var top = data.y;
var width = data.w;
var height = data.h;
// 获取上传的图片,进行裁切
fs.exists(imagePath, function(exists){
if (exists) {
sharp(imagePath)
.extract(top, left, width, height)
.resize(150, 150)
.sharpen()
.quality(100)
.toFile(avatarPath, function (err) {
if (err) throw err;
console.log('Completed!');
// 更新数据库
...
// 头像保存成功,返回成功消息给前端
res.json({success: true, data: {message: '头像已保存'}});
});
} else {
console.log('原图已过期,请重新上传');
res.json({success: false, data: {message: '操作超时,请重新上传'}});
}
});

通过上面的一段代码,就可以实现对用户前一步上传的图片进行制定范围的裁切。
开始裁切图片之前需要检查图片是否存在,如果已经丢失或未保存则返回错误信息告知前端用户。
接下来就是使用sharp对图片进行实际的操作,sharp API的链式调用方式使得处理图片如同工厂里的流水线拼接。

首先,把图片路径imagePath传递给sharp把这张图片送入车间;

然后是调用extract(top, left, width, height)按照裁切图纸,也就是裁切坐标对图片进行粗加工。这里需要注意的是需要对坐标进行简单的置换——第一个参数对应图片的起始纵坐标data.y,第二个参数则对应裁切区域的起始横坐标data.x

接下来是通过resize(width, height)将图片按照制定规格进行缩放;

当然加工的图片还需要对其质量进行控制,这里通过sharpen()quality()分别对图片进行锐化和设定输出质量。quality()针对JPEG, WebP 和 TIFF三种可以控制输出质量的格式进行控制,范围为1~100,默认为80,似乎和Photoshop默认的JPEG输出质量一致;

最后一步就是对加工完成的图片进行输出,sharp提供了pipe和文件两种方式,这里用到的是直接另存为图片的方式,使用toFile()完成最后的出厂工作。指定的输出图片路径可以是已经存在的图片,只要有文件写入权限sharp会覆盖旧的文件。但是目标文件不能是输入源,也就是不能把加工出来的成品和加工原材料放在同一个位置;
toFile()还接受另一个参数即回调函数,这个回调函数只接收一个错误信息作为参数,从而可以判断图片处理是否成功。这里选择在成功保存头像后将裁切数据保存在数据库中,这样就可以实现帮助用户重新载入裁切区域的功能。

常见错误

Bad extract area
在使用extract()对图片进行裁切时,主要注意裁切坐标只能在图片自身的范围内,比如起点横坐标left加上裁切横长width超过了图片的右边界,sharp会报出Bad extract area非法裁切区域的错误,特别注意前面提到的左上横高的参数顺序。当然我们可以在裁切前,通过sharp提供的另外一个接口先获取图片的尺寸。

获取图片信息

在对图片进行处理之前,往往需要先获取图片的尺寸格式等基本进行。sharp中可以通过metadata()获取图片的一些重要的元数据,比如尺寸、格式和颜色空间等。用法可以参考官方的示例:

1
2
3
4
5
6
var image = sharp(inputJpg);
image.metadata(function(err, metadata) {
image.resize(metadata.width / 2).webp().toBuffer(function(err, outputBuffer, info) {
// outputBuffer contains a WebP image half the width and height of the original JPEG
});
});

上面的例子,输出的Buffer信息是一个源图片宽和高各缩小一半的WebP格式图片。

关于sharp的性能,可以参考官方给出的同imagemagick-native,imagemagick,gm进行对比测试样本:Performance

gm是另一个Node.js开发环境下的图形处理库(包),不过gm所使用的底层库是更加常见 GraphicsMagick,相信对于开发过图片处理模块的PHPer来说很熟悉了。我在选择包的时候比较看重其效率,在看到sharp简述中的Fast后就决定试用一下。如果你也正在寻找一个在Node.js中高性能的图片处理方式,不妨试试sharp!

Passport笔记

Things to be notice 写在前面:这篇文主要是Passport官方文档的阅读笔记,多有纰漏,仅做参考。This post only notes things need to be noted while taking advantage of Passport.

Passport是一个可扩展的(用户)认证框架;
Passport借助于其丰富可选的认证策略帮你搭建现代的用户认证系统。(包括OAuth以及OpenID)

Strategies

Before asking Passport to authenticate a request, the strategy (or strategies) used by an application must be configured.

在使用Passport进行(用户)认证之前,必须配置你的应用需要使用的认证策略。

比如使用LocalStrategy可以搭建单纯的用户名密码认证(即登录,注册等)。

Verify Callback

认证回调用于验证用户是否拥有登录资格
function (username, password, done)

通过done回调函数返回认证结果

done(error, user, info)

中间件

在以Connect或者Express为基础的应用中,需要用到passport.initialize()这个中间件来对Passport进行初始化。
另外如果需要启用Session来保存用户对话,还需要在系统启用session后(即app.use(express.session());)引入passport.session()中间件
才可以保证对话能被成功地存起来。

If enabled, be sure to use express.session() before passport.session() to ensure that the login session is restored in the correct order.

Sessions

1
2
3
4
5
6
7
8
9
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});

对用户对话进行“编解码”,由应用层决定并完成编解码方式,并且不受认证层的干扰和限制。

内置操作

Log In

Passport提供了req.login()别名req.logIn()的方法完成对话创建。
注意,passport.authenticate()中间件已经包含了对此方法的调用。一般只在允许用户注册成功后立即将其账户登录时,手动调用req.login()完成对话的创建。

Authorize

现在很多应用会有这样的需求:允许用户用N个第三方账户登录系统。于是就需要让用户进行多个第三方的授权,即通常所说的Connect。中文多对应为“绑定”。
当然用户一般可以随时“解绑”~

这样用户就可以同时绑定微博和QQ以及人人网等账号,并在随后用任意的方式登录应用。如此一来用户体验会得到提升,并且应用可以获得找到潜在用户的途径,不解释 → →

当然对于绑定来说,用户首先(不管用哪一方)要能登录到应用中来,然后才可能绑到已经登录的账号上。

对于这种需求,passport提供了另一个接口passport.authorize()

User Profile

标准化用户信息的常用字段:

  • provider{String} 认证方,提供认证的第三方服务的名称
  • id{String} 用户在第三方的标识ID
  • displayName{String} 顾名思义,在第三方显示用的名字,相当于昵称
  • name{Object}
    • familyName{String} 姓氏,西方文化中的 Last name
    • givenName{String} 名字,对应 First Name
    • middleName{String} 中文没有对应概念,一般只出现在一些西方国家的人名中,涉及较少
  • emails{Array}[n]
    • value{String}实际存放邮件地址的字段
    • type{String}按照标准区分电子邮箱用途,如家庭,工作等
  • photos{Array}[n]
    • value{String}实际存放图片地址的字段

以上只是较为基本常用的信息字段,各个第三方提供的个人信息不仅相同,通常还是需要查看具体的官方相关说明。

需要提一下,两个我时常会混淆的单词:

  1. Authorize [ˈɔːθəraɪz] 授权
  2. Authenticate [ɔː’θentɪkeɪt] 认证,验证

To Be Append…

Error Cache Miss 调试错误

在使用jqueryForm进行调试的时候(以Ajax方式提交表单),发现程序逻辑运行没有问题,但是每次打开chrome的开发者工具,console中总是出现一条Failed to load resource: net::ERR_CACHE_MISS的错误信息,怀疑是Jade编译出的javascript文本有问题,发现分离出单独的js脚本也没有效果。

最后在百度上搜到了阿里云的一个帖子:
http://bbs.aliyun.com/read/178977.html

核心内容是这样的:

开发人员工具载入缓存的时候,说找不到资源。
问题根本在于你先打开页面,再打开chrome的开发人员工具。而页面本身设置了no-store 无缓存,所以后者打开的开发人员工具去不到缓存。如果你已经打开开发者工具的时候,再刷新就不会有这个错误了…

检查了一下页面Header,果然是通过Cache-Control: max-age=0使得页面没有缓存可以被读取。
好在不影响程序本身的运行,暂时可以忽略。

Continue Coding!

解决在OS X安装libvips图形库的问题

解决vips库安装失败问题

写在前面:本文列出了问题解决的思路和过程,如果需要直接找到简洁的答案,请(mei)移(ce)步(shi):
http://stackoverflow.com/questions/26195880/libvips-cannot-install-due-to-wrong-python-location

手头上的项目需要在服务器端使用Node.js进行图片处理,一番折腾后找到了gm和lovell/sharp两个库。
由于sharp依赖于libvips,所以尝试在本地的OS中安装先。
按照sharp的提示,执行:

1
brew install homebrew/science/vips --with-webp --with-graphicsmagick

brew工作后开始安装各种依赖先,就在所有依赖包都安装完成后,brew抛出异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
==> Installing vips from homebrew/homebrew-science
==> Downloading http://www.vips.ecs.soton.ac.uk/supported/7.40/vips-7.40.11.tar.gz
Already downloaded: /Library/Caches/Homebrew/vips-7.40.11.tar.gz
==> ./configure --prefix=/usr/local/Cellar/vips/7.40.11 --with-magick --with-magickpackage=GraphicsMagick
==> make check
/usr/local/Cellar/gobject-introspection/1.42.0/bin/g-ir-scanner --add-include-path=. --namespace=Vips --nsversion=8.0 --libtool="/bin/sh ../libtool" --include=GObject-2.0 --library=libvips.la --warn-all --verbose --identifier-prefix=Vips --identifier-prefix=vips --symbol-prefix=vips --symbol-prefix=im --symbol-prefix=im_ --cflags-begin -I../libvips/include --cflags-end arithmetic/abs.c arithmetic/add.c arithmetic/arithmetic.c arithmetic/avg.c arithmetic/binary.c arithmetic/boolean.c arithmetic/complex.c arithmetic/deviate.c arithmetic/divide.c arithmetic/getpoint.c arithmetic/hist_find.c arithmetic/hist_find_indexed.c arithmetic/hist_find_ndim.c arithmetic/hough.c arithmetic/hough_circle.c arithmetic/hough_line.c arithmetic/invert.c arithmetic/linear.c arithmetic/math.c arithmetic/math2.c arithmetic/max.c arithmetic/measure.c arithmetic/min.c arithmetic/multiply.c arithmetic/nary.c arithmetic/profile.c arithmetic/project.c arithmetic/relational.c arithmetic/remainder.c arithmetic/round.c arithmetic/sign.c arithmetic/statistic.c arithmetic/stats.c arithmetic/subtract.c arithmetic/sum.c arithmetic/unary.c arithmetic/unaryconst.c cimg/cimg_dispatch.c colour/colour.c colour/colourspace.c colour/dE00.c colour/dE76.c colour/dECMC.c colour/float2rad.c colour/icc_transform.c colour/Lab2LabQ.c colour/Lab2LabS.c colour/Lab2LCh.c colour/Lab2XYZ.c colour/LabQ2Lab.c colour/LabQ2LabS.c colour/LabQ2sRGB.c colour/LabS2Lab.c colour/LabS2LabQ.c colour/LCh2Lab.c colour/LCh2UCS.c colour/rad2float.c colour/scRGB2sRGB.c colour/scRGB2XYZ.c colour/sRGB2scRGB.c colour/UCS2LCh.c colour/XYZ2Lab.c colour/XYZ2scRGB.c colour/XYZ2Yxy.c colour/Yxy2XYZ.c conversion/bandary.c conversion/bandbool.c conversion/bandjoin.c conversion/bandmean.c conversion/bandrank.c conversion/cache.c conversion/cast.c conversion/conversion.c conversion/copy.c conversion/embed.c conversion/extract.c conversion/falsecolour.c conversion/flatten.c conversion/flip.c conversion/gamma.c conversion/grid.c conversion/ifthenelse.c conversion/insert.c conversion/join.c conversion/msb.c conversion/recomb.c conversion/replicate.c conversion/rot.c conversion/rot45.c conversion/scale.c conversion/sequential.c conversion/subsample.c conversion/tilecache.c conversion/wrap.c conversion/zoom.c convolution/compass.c convolution/conv.c convolution/convolution.c convolution/convsep.c convolution/correlation.c convolution/fastcor.c convolution/gaussblur.c convolution/im_aconv.c convolution/im_aconvsep.c convolution/im_conv.c convolution/im_conv_f.c convolution/sharpen.c convolution/spcor.c create/black.c create/buildlut.c create/create.c create/eye.c create/fractsurf.c create/gaussmat.c create/gaussnoise.c create/grey.c create/identity.c create/im_benchmark.c create/invertlut.c create/logmat.c create/mask.c create/mask_butterworth.c create/mask_butterworth_band.c create/mask_butterworth_ring.c create/mask_fractal.c create/mask_gaussian.c create/mask_gaussian_band.c create/mask_gaussian_ring.c create/mask_ideal.c create/mask_ideal_band.c create/mask_ideal_ring.c create/other_dispatch.c create/point.c create/sines.c create/text.c create/tonelut.c create/xyz.c create/zone.c draw/draw.c draw/draw_circle.c draw/draw_flood.c draw/draw_image.c draw/draw_line.c draw/draw_mask.c draw/draw_rect.c draw/draw_smudge.c draw/drawink.c foreign/analyze2vips.c foreign/analyzeload.c foreign/csv.c foreign/csvload.c foreign/csvsave.c foreign/dzsave.c foreign/fits.c foreign/fitsload.c foreign/fitssave.c foreign/foreign.c foreign/jpeg2vips.c foreign/jpegload.c foreign/jpegsave.c foreign/magick2vips.c foreign/magickload.c foreign/matlab.c foreign/matload.c foreign/matrixload.c foreign/matrixsave.c foreign/openexr2vips.c foreign/openexrload.c foreign/openslide2vips.c foreign/openslideload.c foreign/pngload.c foreign/pngsave.c foreign/ppm.c foreign/ppmload.c foreign/ppmsave.c foreign/radiance.c foreign/radload.c foreign/radsave.c foreign/rawload.c foreign/rawsave.c foreign/tiff2vips.c foreign/tiffload.c foreign/tiffsave.c foreign/vips2jpeg.c foreign/vips2tiff.c foreign/vips2webp.c foreign/vipsload.c foreign/vipspng.c foreign/vipssave.c foreign/webp2vips.c foreign/webpload.c foreign/webpsave.c freqfilt/freqfilt.c freqfilt/freqmult.c freqfilt/fwfft.c freqfilt/invfft.c freqfilt/phasecor.c freqfilt/spectrum.c histogram/hist_cum.c histogram/hist_equal.c histogram/hist_ismonotonic.c histogram/hist_local.c histogram/hist_match.c histogram/hist_norm.c histogram/hist_plot.c histogram/hist_unary.c histogram/histogram.c histogram/maplut.c histogram/percent.c histogram/stdif.c iofuncs/base64.c iofuncs/buf.c iofuncs/buffer.c iofuncs/cache.c iofuncs/enumtypes.c iofuncs/error.c iofuncs/gate.c iofuncs/generate.c iofuncs/header.c iofuncs/image.c iofuncs/init.c iofuncs/mapfile.c iofuncs/memory.c iofuncs/object.c iofuncs/operation.c iofuncs/rect.c iofuncs/region.c iofuncs/semaphore.c iofuncs/sink.c iofuncs/sinkdisc.c iofuncs/sinkmemory.c iofuncs/sinkscreen.c iofuncs/system.c iofuncs/threadpool.c iofuncs/type.c iofuncs/util.c iofuncs/vector.c iofuncs/vips.c iofuncs/vipsmarshal.c iofuncs/window.c morphology/countlines.c morphology/hitmiss.c morphology/labelregions.c morphology/morph.c morphology/morphology.c morphology/rank.c mosaicing/global_balance.c mosaicing/im_avgdxdy.c mosaicing/im_chkpair.c mosaicing/im_clinear.c mosaicing/im_improve.c mosaicing/im_initialize.c mosaicing/im_lrcalcon.c mosaicing/im_lrmerge.c mosaicing/im_lrmosaic.c mosaicing/im_remosaic.c mosaicing/im_tbcalcon.c mosaicing/im_tbmerge.c mosaicing/im_tbmosaic.c mosaicing/match.c mosaicing/merge.c mosaicing/mosaic.c mosaicing/mosaic1.c mosaicing/mosaicing.c resample/affine.c resample/interpolate.c resample/quadratic.c resample/resample.c resample/shrink.c resample/similarity.c resample/transform.c video/im_video_test.c video/video_dispatch.c include/vips/basic.h include/vips/vips.h include/vips/object.h include/vips/image.h include/vips/error.h include/vips/foreign.h include/vips/interpolate.h include/vips/header.h include/vips/operation.h include/vips/enumtypes.h include/vips/arithmetic.h include/vips/conversion.h include/vips/type.h libvips.la --output Vips-8.0.gir
/bin/sh: /usr/local/Cellar/gobject-introspection/1.42.0/bin/g-ir-scanner: /usr/local/opt/python/bin/python: bad interpreter: No such file or directory
make[2]: *** [Vips-8.0.gir] Error 126
make[1]: *** [check-recursive] Error 1
make: *** [check-recursive] Error 1
READ THIS: https://github.com/Homebrew/homebrew/wiki/troubleshooting
If reporting this issue please do so at (not Homebrew/homebrew):
https://github.com/homebrew/homebrew-science/issues

好长的错误信息,不过DEBUG时候要有明(xian)察(de)秋(dan)毫(teng)的耐心,终于发现真正的错误信息在最后(⊙o⊙)…

1
/bin/sh: /usr/local/Cellar/gobject-introspection/1.42.0/bin/g-ir-scanner: /usr/local/opt/python/bin/python: bad interpreter: No such file or directory

于是第一时间把/usr/local/Cellar/gobject-introspection/黏贴到chrome中想去google上找答案,回车后发现chrome竟然直接在页面显示上面的路径,才想起来这是多合一的搜索框的好(huai)处,以后可以直接拿浏览器当finder用了。

顺着路径找到了名字叫 g-ir-scanner 的这个文档。发现这个shell程序需要python来执行了,怀疑是不是之前的python安装有问题(虽然对python没大了解,但是感觉其版本让人眼花缭乱的)。
which了一下python果然不在/usr/local/opt下面,方才断定是python安装的问题。

上google查找了一堆相关页面也没发现有直接的解决办法。决定按照brew给出了类似提示解决:

1
2
3
4
5
6
7
8
9
10
➜ ~ brew info python
python: stable 2.7.8 (bottled), HEAD
https://www.python.org
Not installed
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/python.rb
==> Dependencies
Build: pkg-config ✔
Required: openssl ✘
Recommended: readline ✘, sqlite ✘, gdbm ✔
...

Oh-my, python果然没有’安装’,想起来之前用的一直是OS X提供的native版本。

1
2
3
4
5
6
7
8
9
10
➜ ~ brew info gobject-introspection
gobject-introspection: stable 1.42.0 (bottled)
http://live.gnome.org/GObjectIntrospection
/usr/local/Cellar/gobject-introspection/1.42.0 (196 files, 10M) *
Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/gobject-introspection.rb
==> Dependencies
Build: xz ✔, pkg-config ✔
Required: glib ✔, libffi ✔
==> Options

但是可以看出gobject-introspection的formula并没有把python列为Required。但是安装vips时候似乎又需要python,所以会出上面的问题╮(╯▽╰)╭

好了,现在解决办法是重新安装一下gobject-introspection

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
➜ ~ brew reinstall gobject-introspection
==> Reinstalling gobject-introspection
==> Installing dependencies for gobject-introspection: readline, sqlite, openssl, python
==> Installing gobject-introspection dependency: readline
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/readline-6.3.8.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring readline-6.3.8.mavericks.bottle.tar.gz
==> Caveats
This formula is keg-only, which means it was not symlinked into /usr/local.
Mac OS X provides similar software, and installing this software in
parallel can cause all kinds of trouble.
OS X provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.
Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:
LDFLAGS: -L/usr/local/opt/readline/lib
CPPFLAGS: -I/usr/local/opt/readline/include
==> Summary
🍺 /usr/local/Cellar/readline/6.3.8: 40 files, 2.1M
==> Installing gobject-introspection dependency: sqlite
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/sqlite-3.8.7.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring sqlite-3.8.7.mavericks.bottle.tar.gz
==> Caveats
This formula is keg-only, which means it was not symlinked into /usr/local.
Mac OS X already provides this software and installing another version in
parallel can cause all kinds of trouble.
OS X provides an older sqlite3.
Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:
LDFLAGS: -L/usr/local/opt/sqlite/lib
CPPFLAGS: -I/usr/local/opt/sqlite/include
==> Summary
🍺 /usr/local/Cellar/sqlite/3.8.7: 9 files, 2.1M
==> Installing gobject-introspection dependency: openssl
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/openssl-1.0.1j.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring openssl-1.0.1j.mavericks.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
/usr/local/etc/openssl/certs
and run
/usr/local/opt/openssl/bin/c_rehash
This formula is keg-only, which means it was not symlinked into /usr/local.
Mac OS X already provides this software and installing another version in
parallel can cause all kinds of trouble.
Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries
Generally there are no consequences of this for you. If you build your
own software and it requires this formula, you'll need to add to your
build variables:
LDFLAGS: -L/usr/local/opt/openssl/lib
CPPFLAGS: -I/usr/local/opt/openssl/include
==> Summary
🍺 /usr/local/Cellar/openssl/1.0.1j: 431 files, 15M
==> Installing gobject-introspection dependency: python
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/python-2.7.8_2.mavericks.bottle.3.tar.gz
######################################################################## 100.0%
==> Pouring python-2.7.8_2.mavericks.bottle.3.tar.gz
==> Caveats
Setuptools and Pip have been installed. To update them
pip install --upgrade setuptools
pip install --upgrade pip
You can install Python packages with
pip install <package>
They will install into the site-package directory
/usr/local/lib/python2.7/site-packages
See: https://github.com/Homebrew/homebrew/wiki/Homebrew-and-Python
.app bundles were installed.
Run `brew linkapps` to symlink these to /Applications.
==> /usr/local/Cellar/python/2.7.8_2/bin/python -s setup.py --no-user-cfg install --force --verbose --install-scripts=/u
==> /usr/local/Cellar/python/2.7.8_2/bin/python -s setup.py --no-user-cfg install --force --verbose --install-scripts=/u
==> Summary
🍺 /usr/local/Cellar/python/2.7.8_2: 4776 files, 76M
==> Installing gobject-introspection
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/gobject-introspection-1.42.0.mavericks.bottle.1.tar
Already downloaded: /Library/Caches/Homebrew/gobject-introspection-1.42.0.mavericks.bottle.1.tar.gz
==> Pouring gobject-introspection-1.42.0.mavericks.bottle.1.tar.gz
🍺 /usr/local/Cellar/gobject-introspection/1.42.0: 196 files, 10M

然后再重复之前的libvips安装命令:

1
2
3
4
5
6
7
8
➜ ~ brew install homebrew/science/vips --with-webp --with-graphicsmagick
==> Installing vips from homebrew/homebrew-science
==> Downloading http://www.vips.ecs.soton.ac.uk/supported/7.40/vips-7.40.11.tar.gz
Already downloaded: /Library/Caches/Homebrew/vips-7.40.11.tar.gz
==> ./configure --prefix=/usr/local/Cellar/vips/7.40.11 --with-magick --with-magickpackage=GraphicsMagick
==> make check
==> make install
🍺 /usr/local/Cellar/vips/7.40.11: 196 files, 13M, built in 82 seconds

终于问题得到了解决,剩下的就是驱动sharp了。

Let’s coding!

写在后面:解决这一个问题大概花费了3个半小时,无奈咱的网路环境就是name非比寻常!连Xcode都没法直接更新。