macOS Sierra (10.12.3)编译Caffe

截止2017-03-05的最新版本代码,后续代码编译可能有所不同。为了实验目的,本次不开启GPU的支持,仅仅使用CPU。

虽然Google开源了tensorflow,但是受限于天朝的网络问题,在没有梯子的情况下,是基本上没办法编译成功的,因此我们尝试使用老牌的Caffe来进行实验,看看效果。

默认大家已经成功安装了HomeBrew,没有安装的同学参考 让Mac也能拥有apt-get类似的功能——Brew。默认大家已经安装好Xcode的最新版本,并且安装了命令行编译工具。

  • 安装Git
$ brew install git
  • 下载源代码
$ git clone https://github.com/BVLC/caffe.git
  • 安装依赖的编译库
$ brew install protobuf

$ brew install boost

$ brew install gflags

$ brew install glog

$ brew install homebrew/science/opencv

$ brew install hdf5

$ brew install leveldb

$ brew install lmdb
  • 编译Caffe
$ cd caffe

$ cp Makefile.config.example Makefile.config

修改其中的编译选项:

$ vim Makefile.config

然后修改里面的内容,找到如下内容:

# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1

去掉注释,修改后如下:

# CPU-only switch (uncomment to build without GPU support).
 CPU_ONLY := 1

完成设置后, 开始编译

$ make all -j4

$ make test

$ make runtest

编译好的执行程序在build/tools/目录下。

Temporary failure in name resolution 错误解决方法

IPFire下一直提示更新失败,于是登录SSH,测试一下网络,发现无法解析域名

[root@ipfire ~]# ping www.baidu.com
ping: www.baidu.com: Temporary failure in name resolution

解决方法就是,编辑域名配置文件

$ vim /etc/resolv.conf

添加一个域名解析服务器即可

nameserver 114.114.114.114

参考链接


Temporary failure in name resolution 错误解决方法

IntelliJ IDEA 生成 serialVersionUID

serialVersionUID的作用

详见这篇文档  http://lenjey.iteye.com/blog/513736

简单来说就是,在序列化对象时,编译器会自动给对象生成一个serialVersionUID,之后任意改动这个对象都会与编译器生成的UID不匹配。如果我们显示指定了serialVersionUID,那么对象序列化之后,也可以修改这个对象。

serialVersionUID生成

我们可以任意指定serialVersionUID,如

private static final long serialVersionUID = 1L;

但最好还是使用让系统按照摘要算法生成一个指纹数字。eclipse是可以自动生成的,IDEA需要简单配置一下。

IntelliJ IDEA->Preferences->Inspections界面下

Serializable class without serialVersionUID后打钩,注意上面的Profile选为Default。

(继承了Serializable的类没有serialVersionUID就会Warning)

之后光标在继承了Serializable的类名上按 ALT+ENTER键,就会出现 Add serialVersionUID field 选项,生成的UID如下

private static final long serialVersionUID = 6496849704004740865L;

Ubuntu 14.04上卸载nginx之后重新安装没有重新生成配置文件的解决方法

在配置nginx做实验时配置错了,导致访问不了虚拟主机。一狠心把nginx的配置文件目录(/etc/nginx)都删除了,而且我没有备份这些配置文件,因此想重装nginx

本来以为直接使用如下apt-get指令

$ sudo apt-get --purge remove nginx
$ sudo apt-get install nginx

就可以搞定,但实际上并没有有自动产生nginx的配置文件,连/etc/nginx目录都没产生。
于是autoremove

$ sudo apt-get --purge remove nginx
$ sudo apt-get autoremove
$ sudo apt-get install nginx

提示

awk: cannot open /etc/nginx/nginx.conf (No such file or directory)

虽然产生了/etc/nginx目录了,但只有部分配置文件

conf.d sites-available sites-enabled

于是

$ sudo apt-get --purge remove nginx
$ sudo apt-get autoremove
$ dpkg --get-selections | grep nginx

罗列出与nginx相关的软件

nginx-common

然后卸载并重新安装

$ sudo apt-get --purge remove nginx-common
$ sudo apt-get install nginx

参考链接


nginx配置失败,卸载后重装出问题 awk: cannot open /etc/nginx/nginx.conf (No such file or directory),nginxawk

Windows 7 下无法查看DebugView的解决方案

Windows 7中开程序的人来说,也许会发现DebugViewWin7中无法查看OutputDebugString所抛出的消息,
这对像Timer或者是连续发生的(Event)事件(比如:OnPaintMouse移动等Event)进行DEBUG非常不方
便,也许这是微软为了安全原因考虑,所以把此功能给关闭。
※如果要打开此功能,请依照如下步骤进行:
1.打开注册表(在Run -> regedit)。
2.打开这个键:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]。
3.建立[Debug Print Filter]这个新键。
4.新增加一个“DEFAULT”的DWORD值,将其内容设置0x0f,如下图所示:
5.重启OS后生效。

这样以后你就可以使用OutputDebugString来输出信息了。

图方便的话,直接下载注册表文件 OutputDebugString 下载并解压缩后,双击导入即可。

参考链接


Win7下无法查看DebugView的解决方案

解决国内访问s3.amazonaws.com下载文件非常缓慢的问题

今天,尝试从 https://git-for-windows.github.io/ 更新msysgit到最新版本的时候,发现下载链接 https://github.com/git-for-windows/git/releases/download/v2.12.0.windows.1/Git-2.12.0-64-bit.exe被服务器重新定向到了亚马逊的服务器上去了,最后的下载地址是github-cloud.s3.amazonaws.com的某台机器上。但是国内访问亚马逊,基本上没办法下载成功的,很可能是被墙了。
搜索了一下,发现可以通过设置host,强制把访问节点从美国定向到香港的办法来解决这个问题。Windows下,编辑C:\Windows\System32\drivers\etc\hosts然后增加如下解析即可。

219.76.4.4 s3.amazonaws.com
219.76.4.4 github-cloud.s3.amazonaws.com

对于Linux以及macOS,则修改/etc/hosts

参考链接


github release 的github-cloud.s3.amazonaws.com实在太慢,下载老在10几k徘徊

TortoiseGit 2.4.0.2引入了一个新的BUG,导致无法提交,提示“fatal: protocol error: bad line length character: Welc”

今天(2017.02.27TortoiseGit 2.4.0发布了一个Hotfix来修正几个BUG,网站上的具体的版本信息如下:

2017-02-25 | Released TortoiseGit Hotfix 2.4.0.2 (fixes issue #2909 (Commit dialog unclosable) and issue #2911 (Add returns "invalid path") and contains PuTTY 0.68)

但是这次的修复引入了更大的BUG,导致无法提交代码,不管是拉取还是提交代码,都会提示"fatal: protocol error: bad line length character: Welc",如下图:

修复这个问题最简单的方法就是还原到TortoiseGit 2.4.0版本。

这个BUG是由TortoiseGitPlink.exe里面的代码改动引起的,只要还原这个文件到0.67版本(来自TortoiseGit 2.4.0),也可以解决这个问题。

目前已经提交了BUG给开发人员了。对于的BUG链接地址如下:
TortoiseGit 2.4.0.2 bug ( TortoiseGit 2.4.0 works but TortoiseGit 2.4.0.2 can not pull and push) "fatal: protocol error: bad line length character: Welc"

希望能尽快修复这个问题吧!

到目前为止(2017.05.09)这个问题依旧没有修复的可能,因此建议大家可以改用一下SourceTree-2.0.20.1,可以点击这里下载目前最新的版本。

mac下~/.bashrc不起作用

~/.bashrc里面的一些设置,比如alias命令的设置“不起作用”,新开一个终端都要source一下才起作用。

unix下当shelllogin shell.bash_profile才会加载,而bashrc正好相反。

真正的区别是在linux下,当用户登录到一个图形界面,然后打开一个终端terminal,那些shellnon-login shell

然而,在OS X登录的时候,并没有运行着一个shell,所以,在运行Terminal.app的时候,其实那是一个login shell

后来新建了.bash_profile加载一次.bashrc.

if [ "${BASH-no}" != "no" ]; then
    [ -r ~/.bashrc ] && . ~/.bashrc
fi

参考链接


mac下~/.bashrc不起作用

Jdom-XmlOutputter 换行(setIndent)

Jdom的XmlOutputter默认生成的文件不带换行,所有key-value对写在一行里,使用起来很不方便,XmlOutputter支持设置换行。

jdom1.0中写法如下

XmlOutputter xmlOut = new XmlOutputter("  ", true, "utf-8");

三个参数分别为,缩进(这里是两个空格),是否换行,字符编码

官方文档

jdom1.0以后不支持上面的写法,而是把三个参数剥离出来,形成了Format类

Format format = Format.getCompactFormat();
format.setEncoding("utf-8");
format.setIndent("  ");
XMLOutputter XMLOut = new XMLOutputter(format);

Ubuntu 14.04.5版本上安装并启用Apache 2.4.10版本的Event MPM模块

Apache 2.4版本开始已经尝试借鉴Nginx的实现方式来处理网络连接。但是到目前(2017.2.22)为止,实现的并不彻底,只是在处理HTTP协议的时候使用异步模式,而处理HTTPS协议的时候,依旧使用每个连接一个线程的模式。据说完整的支持HTTPS异步,要到Apache 3.x版本了。

目前的Apache MPM event本质上还是Apache MPM worker的优化版本,并不是一个完整的独立模式。

尽管支持的不是太完善,但是这部分的实现,已经能比较好的改善Apache 2.4的网络处理性能了,尤其是对于我这种访问压力不是太大的网站来说,目前应该是够用了的。暂时可以缓解一下迁移到Nginx的急迫性,并且比较好的减少访问网站时候的延迟比较高的问题。

到目前(2017.2.22)为止在Ubuntu 14.04.5版本上Apache Event MPM还不属于正式版本,而是被部署到了backports(待发布)分支上,处于候选发布状态,因此我们安装的时候,需要执行指定backports,具体执行命令如下:

$ sudo apt-get -t trusty-backports install apache2-mpm-event

模块的配置文件在/etc/apache2/mods-available/mpm_event.conf,目前我这边用默认配置已经足够了(足见访问量是多么的少,呵呵)。

启用Apache MPM event模块

$ sudo a2dismod mpm_worker

$ sudo a2dismod mpm_prefork

$ sudo a2enmod mpm_event

$ sudo service apache2 restart

查询Apache 2.4当前正在使用的模块

$ a2query -M

返回值会是event, prefork, worker中的一个,如果返回了event,则说明我们已经成功启用了Apache MPM event模块。

目前实际测试来看,确实能非常明显的加快网站的访问速度,访问延迟明显变短。

参考链接