Gitlab-shell 1.1.0 的 SSH 访问异常

GitLab 4.2 升级到 5.0,虽然 步骤 有点儿繁琐,但还算是一路绿灯,但最终却遇到了不能以 ssh 方式访问库的问题。搞了几个小时,找了所有能想到的地方,都搞不清楚究竟哪里错了,于是在 github 上给提了个 issue 3578

问题的情况简单来说就是,ssh -T 成功,但是 git clone/pull/push 却意外失败,另外 http 的方式是成功的,说明应该还是连接的问题。

唯一有可能存在疑问的地方,应该是 gitlab-shell 的版本。检查的时候会报告说需要 1.1.0,而事实根据升级指引中的操作结果是 1.2.0 的。但从 另一个 issue 的说明 看来,可以通过修改 check.rake 来实现“瞒天过海”。

暂停了 gitlab service,然后切换 gitlab-shell 的版本到 1.1.0

> cd /home/git/gitlab-shell
> git checkout v1.1.0
> git checkout -b v1.1.0

# 配置文件不需要改
> ./bin/install

重启 gitlab 后再试试 ssh -T git@mygitlab.com

结果却出错了!

/usr/local/lib/ruby/1.9.1/json/common.rb:148:in `parse': 743: unexpected token at '<html> (JSON::ParserError)
<html>
<head>
<title>Welcome to nginx!</title>
</head>
<body bgcolor="white" text="black">
<center><h1>Welcome to nginx!</h1></center>
</body>
</html>
'
     from /usr/local/lib/ruby/1.9.1/json/common.rb:148:in `parse'
     from /home/git/gitlab-shell/lib/gitlab_net.rb:24:in `discover'
     from /home/git/gitlab-shell/lib/gitlab_shell.rb:28:in `exec'
     from /home/git/gitlab-shell/bin/gitlab-shell:16:in `<main>'

为什么会出现这个错误,我没什么头绪,google 了一轮也没什么对症的答案。

要出现默认的 Nginx 页面,应该还是跟 Nginx 的配置有关,而哪个配置文件是从网上下载的,唯一就是指定了 IP 以及域名。就算直接用 IP 访问,也是可以看见 GitLab 的页面的,但是不会看见 Nginx 的默认页面。

这时,我想起之前曾经改过 /etc/hosts

127.0.0.1   mygitlab.com

如果在服务器端访问 http://mygitlab.com 的时候才会看见 Nginx 的默认页面。果断去掉这个 host 设定,然后再试,一切都正常了。

嗯嗯,具体什么原因要加这个 host 设定,不太清楚了,装 4.2 的时候的事情了。反正 gitlab-shell 1.1.0 跟它有冲突。不过应该算是 gitlab-shell 的问题,它不应该解析出域名的 IP 后直接用 IP 去访问,因为有可能一个 IP 上会挂好多个站点,默认的不一定就是 gitlab。

有时候指定 hosts 能解决一些问题,也有像这种帮倒忙的情况,能不加还是不加吧。

PS: mygitlab.com 不是一个真实的域名。

Update 17 Apr: Issue 3384: Gitlab can’t clone or push

转移 VirtualBox ubuntu.vdi 后的网络连接问题

由于磁盘空间的问题,需要迁移 vdi 文件去新的位置。关闭,转移,新建 Ubuntu 虚拟机直接引用转移后的 vdi,其它都保留原有的设置,一切都很好。

唯独启动后,ifconfig 一看就发现问题了,只有本地网络了。

一开始还是以为是 VBox 网络连接的问题,反复试了几次,问题依旧,而其它虚拟机同样的配置却可以正常运作。经过一翻 google,最终从 这里 得到启示。

> sudo mv /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/70-persistent-net.rules.bak

删掉应该也是可以的,重启之后问题就解决了。

如果 brew install 撞墙

某强已经无厘头到一定程度了,在进行 brew install pgrep 的时候

==> Installing proctools
==> Downloading http://downloads.sourceforge.net/project/proctools/proctools/0.4pre1/proctools-0.4pre1.tar.gz

curl: (56) Recv failure: Connection reset by peer
Error: Download failed: http://downloads.sourceforge.net/project/proctools/proctools/0.4pre1/proctools-0.4pre1.tar.gz

… …

翻墙下好之后,放到 ~/Library/Caches/Homebrew/ 就可以继续了。

不过如果多的话还真是挺麻烦的

… …

====== 超级华丽的分割线 2015/7/19 ======

现在 brew 可以设置 proxy 了,更加简单直接。

比如 android-sdk,由于众所周知的原因不能直接访问,于是就需要 proxy 出马了。


ALL_PROXY=socks5://127.0.0.1:1080 brew upgrade android-sdk

参考:

奇怪的乱码

项目中用到 FreeMarker,在 eclipse 里用 maven 插件 跑 jetty:run,看上去挺美好的。但是一旦修改 FreeMarker 的模版文件(包含中文,UTF-8 编码,无 BOM ),页面一刷新,乱码就出来了。关掉重开可以解决问题。但是总想不明白到底哪里出的问题。

我一开始猜测是 FreeMarker 的读取模版时候的编码问题,经过网上一轮 Google 之后,尝试了各式各样的设置 encoding 方法都不能解决问题。这个问题太困扰了,网上又找不到类似于这种第一轮启动没问题,一修改就出问题的情况,而这个情况在其他人哪里是可以重现的。难道就没有人遇到过?原本只是想简单用用,现在看来得调试进去看看到底出什么问题了。至少需要确认一个问题,究竟是哪个环节出现问题。

又经过一番逐行 debug,得到一个让人惊讶的线索。源代码显示,无论是第几次加载模版,调的都是同一个方法,这部分代码出错的几率不高。而逐行到加载得到模版内容(未经 parse 之前),修改前后加载得到的内容是不一样的,修改后重新加载得到的内容本身就有乱码。

至少,可以还 FreeMarker 一个清白了。凶手又会是谁呢? Continue reading

解放 WIN7 的 80 端口

貌似是做了什么更新,或者装了 WebMatrix 之后,就发现个怪事情。Nginx 启动不了,报告端口被占。原来为了省事就改了 81,但想想也不能那么回事啊,80 到底在干嘛呢?

> netstat -ano


80 端口居然被 PID 为 4 的进程所占据,更令人惊讶的是 PID=4 的是 System

Google 了一番,有说 关闭 “World Wide Web Publishing Service” 的,有说是 关闭 IIS 信息服务 的,更有是 修改注册表 的…… 除了注册表实在不想改,其它都试了下,WWW 发布服务根本没找到,IIS 信息服务也没有打开。这时候就蛋疼了。

往往疼能激发潜能。在将所有服务按状态排序之后,逐一检查所有已启动项。迅速得到一个可疑项:“Web 部署代理服务”。

设置手动启动并禁用之。

再检查 80 端口,成功解放。

真搞不明白,为啥微软要搞那么多名目来侵占跟 System 毫不相干的 80 端口呢?

IE 中图片大小的误判

IE8 以下的浏览器都会出现这个问题,不致命,但非常影响页面观感。幸运的是,你不一定能遇上。

情景是,图片需要动态加载,根据给出的缩放比例调整显示大小。图片是普通 PNG,只是存放点是多样化的,同样的图片,一个以文件形式存在,另一个是保存于缓存(内存)中,前面都是用 Apache,一个读文件返回,一个做转发,用 IE 访问它们,获取其大小信息,结果竟然是不一样的。

装载图片的代码片段:

function loadImg(url, callback) {
    var img = new Image();
    img.src = url;
    
    if (img.complete) {
        console.log("complete");
        return callback.call(img, url);
    }
    img.onload = function() {
        img.onload = null;
        callback.call(img, url);
    }
    return img;
}

要完成缩放,需要获取图片的原始大小。当然也可以用百分比数值,方案比较不是本文重点。下面写一个函数可以打印出图像对象上所有的数值属性,当然包括宽和高。

function getParam() {
    var arr = [];
    for(var i in this) {
        try {
            if (typeof this[i] !== 'number') continue;
            arr.push(i + ' : ' + this[i] + '\n');
        } catch(e) {} // this[i] 在 IE 下有可能会报错,不影响观察,暂且忽略
    }
    alert(arr.join('')); // 使用 alert 方便观看结果
};

然后都执行下面的,其中 testPngURL 分别为两者的 URL,这也是唯一的区别了。

preload(testPngURL, getParam);

两次执行的结果显示的 width 和 height 是不一样的,而且不成比例,而且结果是可以稳定重复的。我最纳闷的是 IE 凭什么得出另外那个错误结果的。我初时觉得可能是两次请求的 header 不一样,主要差异是存放于内存的,其响应的 Content-Type 是 application/octet-stream,文件形式的则是 image/png,内容长度是完全一样的。于是我使用 Fiddler 对内存图像的请求进行拦截,并修改其 Content-Type,结果是无效的。甚至将两者的响应头弄成完全一致,也得不到一致的结果。

暂时还没想到有什么方法可以绕过。而且最奇怪的是,有少数几个 png 的大小是正确的。难道问题出在 png 的数据上,有些隐藏的信息,但触发点到底是什么,可是敲爆头也不知道了。

虽然生产不会这么使用,但为了开发调试方便,我们会使用缓存来存放各种资源,其返回头都是非常简单而且统一的,无任何多余 header,浏览器不会自作主张做缓存。更新也方便,往同一个地址 PUT 内容即可。现在由于 IE 存在这样一个问题,其显示大小是不正确的,非常影响观感,不得不需要做些调整了。

Maven build 中启动 JMX Agent

为了监控 JVM,研究了下 VisualVM,但是不知道怎么导出里面的数据,可导出就比较方便做数据比对,而且也不知道怎么控制显示的历史信息跨度。而这两点在 JConsole 中都可以。于是要折腾 JConsole,一开始还不怎么顺利,虽然看上去只是几项配置。
因为在开发过程当中都是使用 mvn jetty:run 启动的。原来以为是这样:

mvn jetty:run -Dcom.sun.management.jmxremote.port=9410 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false

然后使用 jconsole 127.0.0.1:9410 ,提示是 Connection refused

后来了解到,如果 JMX Agent 启动成功的话,会产生一个端口监听。
再执行 netstat -a | grep 9410 ,毫无反应。

网上乱 google jconsole, jmx agent, jmx remote, jmx connection refused 等关键字都没什么头绪。
找到一篇 关于 jconsole 的错误排查 的不错的文章,但是情况不吻合,这里唯一区别的是不是直接 java 启动,而是通过 mvn ,曾经使用过调试,需要 Continue reading

IE 中对 toString 的双重标准

使用 for .. in 遍历对象,似乎没什么好说的,不过还是有例外。在各个浏览器里面跑下面的代码:

var obj = {
    toString: function() {
        return "custom.toString()";
    }
}
for(var i in obj) {
    alert(i);
}

它们都会 alert 一个 toString,除了 IE。一开始还以为是加载慢,后来才认识到,其实 IE 并不把它当成是一个自定义的对象方法。同样的情况也发生在 valueOf() 方法上,可以猜想,IE 可能把它当成是 native 的了。
Quick Fix – Internet Explorer and toString problems 里面,介绍了使用条件注释(conditional comment)的方法来解决。 Continue reading

Chrome,为什么第二张图片看不见呢?

在测试的时候,建立一个最小测试集对于测试调试是很有帮助的。

为了测试与图片装载相关的内容,建立了下面的页面。内容很简单,就是动态添加两个 IMG。

<html>
<head>
    <title>Test Loading IMG</title>
    <style>body { background-color: #00F; }</style>
</head>
<body>
<script>
function show() {
    for (var i = 0; i < 2; i++) {
        var img = new Image();
        img.src = "chrome.png";
        img.title = "Image here";
        document.body.appendChild(img);
    }
}
setTimeout(show, 1000);
</script>
</body>
</html>

用各种浏览器(IE6 除外)打开,理论上应该不会出什么乱子。

但是竟然发现在 chrome 里第二个图不见了。实际上图是在那里的,只是看不见,鼠标移上去,title 是能正确显示出来,进行全选操作之后,图就出现了。

当然,实际页面中不会只有两个 IMG,只要在 body 内加一个字符如 a,chrome 就可以正常显示了,-_-!!

当前我的 chrome 版本是 7.0.517.41 beta,估计会有人跟我说 chrome 更新这么快,beta 嘛,难免的。

希望 chrome 越办越好啦~

IE 中 png 黑底(半透明失效)的那点事

早有听闻 IE7+ 是支持 png 的,用下来感觉也还可以。但忽然之间,发现有一张 png 图片莫名其妙地黑底了,最先想到的是 png 的输出设置可能出现问题,于是试了 N 种设置黑底,只是黑底的形状有点不太一样,相当纳闷。没办法了,还原基本步。

<div id="box">I Believe</div>
<style>
#box {
    background: url(http://upload.wikimedia.org/wikipedia/commons/6/63/Wikipedia-logo.png) no-repeat;
    color: #FFFFCC;
    text-shadow: 1px 0 2px #897461, 0 1px 2px #897461, 0 -1px 2px #897461, -1px 0 2px #897461;
    filter: Dropshadow(offx = 1, offy = 0, color = #897461) Dropshadow(offx = 0, offy = 1, color = #897461) Dropshadow(offx = 0, offy = -1, color = #897461) Dropshadow(offx = -1, offy = 0, color = #897461);
    
    height: 200px;
    padding: 5px;
    width: 200px;
}
</style>

这个应用场景很简单,有一张 png 作为背景图,上面有些文字,对文字施加了一些发光效果(实际上阴影来实现)。在 firefox 和 IE 下的表现见下图: Continue reading