Archive for the ‘技术’ Category

Search bar in Firefox 34

Monday, January 5th, 2015

The latest Firefox 34 shipped with a revised search bar design. To be honest, I don’t like it because I need to change the default search engine from time to time and do not want to click my preferred search engine every time I search.

Lucky it’s possible to restore the previous design by modifying the Firefox configuration – to change ‘browser.search.showOneOffButtons‘ to false (details – http://forums.mozillazine.org/viewtopic.php?f=23&t=2890823)

Before                                                               After

before

after

Windows 7自建虚拟无线WiFi

Monday, September 22nd, 2014

升级到iOS8后, Cisco LEAP协议不支持,无法连到公司内部无线网,中国移动GPRS实在太慢。找到几篇文章,使用Windows 7自带的虚拟WiFi在笔记本上自建AP,让移动设备上网,步骤简化如下:

1. 在管理员权限下运行命令行cmd;

2. 运行命令 netsh wlan set hostednetwork mode=allow ssid=<your_ap_name> key=<password>

其中<your_ap_name>是无线AP的ssid,用手机找WiFi可以发现;<password>是这个AP的连接密码;

3. 接着运行 netsh wlan start hostednetwork,这样在网络连接可以看到该虚拟WiFi连接:

virtual_wifi

4. 把一个实际网络连接的流量共享给该虚拟WiFi。方法是右键选择当前可用网络连接的‘属性’,然后在共享里分享给虚拟WiFi。

最后,如果你装了防火墙如Symantec Endpoint Protection,需要添加一条过滤规则放行移动设备对此虚拟WiFi适配器的访问。

 

CORS (Cross-Origin Resource Sharing) preflighted OPTIONS request

Monday, September 15th, 2014

CORS提供了安全访问跨域请求的方案,目前主流的浏览器都支持CORS。其中CORS preflighted request中提到浏览器需要先发出一个OPTIONS的请求在服务器端获得通过后(利用HTTP response中的CORS header进行审批)才可以进行后续的访问。根据规范,此HTTP OPTIONS请求中不允许携带任何cookie

我很想知道这样的设计是出于什么考虑?如果是出于安全考虑,那么当前用户session如果已经登录此跨站网站并且有cookie,这些cookie对所访问的跨域服务器来说是没有个人信息泄露的问题,因为本来这些cookie就是服务器产生并返回给浏览器的,你送不送不存在安全隐患。Chrome之前有个bug就是在OPTIONS请求里面带了cookie,最近刚刚修复,而Chrome并没有质疑规范的设计是否合理。

不允许带Cookie在采用了如TAM, Siteminder等统一认证的环境下很麻烦,因为这样的request还没有机会到达应用本身就被前端reverse proxy(或web server agent)拦住了,而它们都不具备判断目标应用是否会放行此跨域请求的能力(一般情况下应用程序负责维护一个信任网站的白名单),所以还得通过配置放行此无cookie的请求到目标应用。

 

上手Bluemix (3)

Tuesday, August 19th, 2014

截止上篇文章,我们已经在Bluemix上构建了一个可以连接Bluemix数据库服务、基于WebSphere Liberty Server的Java Web应用了。我们提到Connections Blogs的老版本(相比新版本对WebSphere Application Server (WAS)已经是最小的了)跑起来还是会有很多错误,大致总结一下:

1) WAS专用API. 如做Basic Authentication用的是WAS Programmatic Login的API;

2) 和WAS环境相关的配置文件。代码中需要到WAS环境下特定的目录找某些配置文件;

3) 不同Web container的实现差异。在移植过程中发现对于URL的最后一个斜杠/,在WAS和Liberty中处理是不同的;

4) 文件系统。Blogs会把上传附件保存在文件系统,目前我也不清楚Bluemix上给我的空间大小(应该是1G)和位置。通过测试说明至少服务器端代码是可以在Liberty安装目录下创建目录和文件的;

5) Directory service。这是Connections自己的code,根据用户配置调用WAS VMM API从Federated Repository,或者Connections Profiles里查找用户详细信息。这两个数据源在Bluemix上都没有,所以需要更新一些代码跳过用户同步过程。

在disable了Basic Authentication、Connections navbar、Directory service和Lucene index后,Blogs最终可以跑在Bluemix上。

最后的问题是用户登录,我没打算搞个LDAP,只要创建些简单的测试用户就可以了。在Liberty里很容易做到,通过在server.xml中添加用户定义和角色定义,如下:

定义用户:

<basicRegistry id=”basic” realm=”WebRealm”>
      <user name=”ajones1″ password=”jones1″/>
      <user name=”ajones2″ password=”jones2″/>
      <user name=”ajones3″ password=”jones3″/>
      <user name=”ajones4″ password=”jones4″/>
      <user name=”ajones5″ password=”jones5″/>
      <user name=”ajones6″ password=”jones6″/>
</basicRegistry>

定义用户在应用中的role:

<application type=”war” id=”blogs” name=”blogs” location=”blogs.war”>
    <application-bnd>
        
        <security-role name=”person“>
            <special-subject type=”ALL_AUTHENTICATED_USERS” />
        </security-role>
        <security-role name=”admin“>
            <user name=”ajones1″/>
        </security-role>
        
    </application-bnd>
</application>

“ALL_AUTHENTICATED_USERS”是个特殊的保留角色,对应于WAS的相同角色,用来指定所有已登录用户。测试中我发现security-role的映射有bug,不是每次调用request.isUserInRole(role)都会返回正确的结果。

接下来的事情很关键 – 如何把一份自定义的server.xml文件上传到server端?答案:你做不到。目前找到的解决方案是按照Bluemix的buildpack去部署应用,即同时上传Liberty的Runtime和应用程序。利用Eclipse的Bluemix插件很容易实现:

1) 下载Eclipse Bluemix插件。在Eclipse Marketplace搜索‘bluemix’,找到后安装:

bluemix-plugin-install

2) 安装后右键在Server Tab里点New Server,选择IBM Bluemix,开始配置:

config-bluemix-plugin

domain

bind-db

3) 配置完成后,可以直接用Publish选项发布整个Runtime和application。

upload

<终>

上手Bluemix (2)

Friday, August 15th, 2014

上次说到在Bluemix新建一个简单的Java webapp,现在这个Java应用需要访问数据库服务来存取数据,我们来看看在Bluemix上该如何使用和管理数据库服务。首先,Bluemix上有多种数据库服务供选择,有传统的关系型数据库也有NoSQL (包含了IBM收购的Cloudant),因为Connections本身支持包括DB2, Oracle和SQL Server,所以我们选择基于IBM DB2的数据服务。

可以从Dashboard的Service tab或者直接从Catalog进入服务选择界面,选择Data Management -> SQL Database:

database

创建时需要指定服务名(注意这个名字既不是数据库名也不是schema名,仅仅是个标示符),同时如果应用已经创建好,可以在创建数据库服务的时候直接绑定应用。

create-db-instance

创建好数据库服务后回到Dashboard,可以看到名下有一个应用和一个服务 – APPS(1) & SERVICES(1) – 移植Connections Blogs需要的全部组件都齐了。

db-service

在创建并绑定数据库服务后,点击应用的Runtime选项,可以看到新生成的环境变量。这里包含了有关数据库连接的全部信息 – 注意所有的配置信息都无法更改,一旦重新创建数据库服务,数据库名、用户名、密码等都会随之改变。这些所谓’环境变量‘实际上是保存在Liberty的server.xml中,这样app在启动的时候可以正确的找到JNDI data source。

env_variable

接下来,我们需要创建数据库schema,tables,indexes…点击进入添加好的数据库服务,点’Launch’按钮会打开一个数据库管理界面,点击‘Work with Database Objects’就可以开始创建数据对象了。Bluemix的数据库服务不支持用本地的数据库客户端直接连接,所有的数据管理操作都必须在Web界面上完成。

schema

大家注意到上图有个名叫‘REUNOBRW’的schema,它和上上图里的环境变量中的数据库用户名是一致的。之所以要手工创建‘REUNOBRW’ schema的原因在于我们要移植的Blogs早期版本(1.0.2)里,所有的数据库访问代码是仅有table名,不带schema名的,如下:

<select id=”getWebsiteById” parameterClass=”string” resultMap=”Website” >
      SELECT * FROM website WHERE id = #value#
</select>

在Bluemix环境中,这样的调用会自动在前面以用户名作为schema名。除非我们修改全部的SQL把它们都带上schema名,否则只能创建一个和用户名同名的schema。这个做法虽然可以工作,但一旦数据库服务重建schema也必须要重建,作为测试可以但作为生产环境的开发这样是不可取的。创建好schema后,可以创建table等对象了,点击Run DDL来指行数据库命令(注意不是所有的SQL都支持,比如我们无法创建table space)。下面是在创建好tables、运行应用后查询用户表的例子 –

run-sql现在可以把Connections Blogs build成一个.war文件,通过cf push到Bluemix上,它可以正确的连接数据库,但界面上有很多错误,绝大部分是因为已有代码是在WebSphere Application Server下测试运行的,在Liberty环境下存在问题。另外也没有办法登录,因为我们还没有定义用户库。下篇文章我们将继续讨论应用的迁移。

上手Bluemix (1)

Thursday, August 14th, 2014

之前写了个短文,说把IBM Connections Blogs移植到了Bluemix上。今天花点时间,写写具体的过程。对于不熟悉Bluemix的人,我一句话解释一下:Bluemix是IBM的PaaS平台,供开发者构建在云上跑的应用,而Bluemix本身是架在SoftLayer (IBM IaaS)之上的。

先来看看Bluemix长啥样。对于首次访问的用户,基本上唯一有用的界面就是Catalog了,里面列举了Bluemix提供的runtime、service和各种组件,大家的第一个应用就从这里开始。

catalog

IBM Connections是基于Java的Web应用,所以我们选择的Runtime是Liberty for Java(一个约20MB左右的Java Web容器)。输入基本参数,一个缺省的Webapp和一个WebSphere Liberty Profile的instance就产生了。这个webapp的首页是显示当前应用的一些运行时参数。

liberty当创建好第一个应用后,Dashboard就成了常用的视图了,应用的启/停、监控、服务的创建和绑定都要在这个界面上完成。

quickstart

对于新手来说,’View Quick Start’按钮很有帮助,它指导开发者之后需要做的事情,包括安装cf工具来做应用上载,以及如何登陆和访问。我一开始就是按照这个步骤在写了Hello World之后把应用打包后用cf push到Bluemix上的。

有了第一个可以运行的demo webapp后,可以从Dashboard中把这个应用打包下载到本地,展开后用Eclipse在本地继续开发,完成后重新打包上传。多尝试几次后,就可以熟练的更新、上传应用了。需要注意的是,应用更新的最小粒度是.war(至少今天我都没有找到文件级别的更新),也就是说即使要改一个JSP文件也需要完整打包后上传。我试图找到类似SSH的方式允许远程文件上传,但最终没有找到。开发者能够在文件级别范围的访问仅限于在’Files and Logs’菜单下浏览文件目录并下载里面的文件,如log等。

filesystem

最后谈谈本地开发和测试。开发者可以使用Eclipse加上WebSphere Liberty Profile runtime集成到Eclipse中,具体下载地址 – https://developer.ibm.com/wasdev/downloads/liberty-profile-using-eclipse/。搞定后的开发环境大概是这样的(截图里面的Bluemix插件,下次再介绍)。

eclipse

好了,到此为止一个简单的Java webapp已经可以欢快的跑在Bluemix之上,我们也初步了解了开发者该如何更新和部署这个应用了。接下来,谈谈如何创建一个数据库服务并绑定应用,待续。

WordPress测试

Thursday, August 14th, 2014

新浪微博自动发布测试。

配置方法:http://www.weibo.com/tool/bloglink

评论添加图片验证码

Tuesday, August 12th, 2014

装了SI CAPTCHA – http://wordpress.org/plugins/si-captcha-for-wordpress/, 现在评论需要图片验证码,观察一下效果。

把Fiddler配置成reverse proxy

Friday, August 1st, 2014

Fiddler是用作Web调试的工具,因为一个需求想自己搭一个简单的reverse proxy,试了几个工具都不太好用。做了些功课发现可以把Fiddler配置成reverse proxy。大致步骤如下:

1) 配置成Fiddler的侦听端口

这个很容易,在平时用作调试的时候就已经有了。需要注意的是要允许其他电脑访问Fiddler服务;

fiddler1

2) 侦听HTTPS端口

侦听HTTS端口在界面上没有办法配置,需要在Fiddler QuickEexc命令行里输入:!listen 443 proxy.mycompany.com

fiddler2

 

3) 定制HTTP  response处理脚本

Reverse proxy最重要的一个功能是对返回的HTTP response进行预处理,之后再返回给浏览器。比如把嵌入在HTML中的所有绝对URL的hostname变成reverse proxy自己的hostname,这样才能保证用户后续的访问可以指向正确的服务器地址。Fiddler提供了脚本支持来完成对HTTP response的修改。

你可以使用Fiddler的菜单调出脚本用文本编辑器进行编辑,或者安装FiddlerScript插件进行开发(有代码提示功能)。

fiddler3

你可能需要定制的地方包括:

3.1)对所有HTTP 302进行截获,把重定向地址改成reverse proxy自己的地址,代码大致如下:

static function OnBeforeResponse(oSession: Session) {

..

if (oSession.HostnameIs(“server.mycompany.com”)){
            var redirect = oSession.oResponse.headers.AllValues(“Location”);
            if (redirect != “”) {
                redirect = redirect.replace(“server.mycompany.com”, “proxy.mycompany.com”);
                oSession.oResponse.headers.Remove(“Location”);
                oSession.oResponse.headers.Add(“Location”, redirect);
            }

3.2) 对所有HTTP response 200的正文进行扫描,替换掉里面嵌入的绝对URL:

 if (oSession.oResponse.headers.ExistsAndContains(“Content-Type”,”text/html”)){
                oSession.utilDecodeResponse();
                oSession.utilReplaceInResponse(“server.mycompany.com”,”proxy.mycompnay.com”);
            }
            
        }

 

现在可以启动你的本地浏览器来访问用Fiddler搭成的reverse proxy了: http://proxy.mycompany.com/

:Fiddler配置为reverse proxy的官方文档(不详细,要结合本文内容)- http://docs.telerik.com/fiddler/configure-fiddler/Tasks/UseFiddlerAsReverseProxy

升级到WP 3.9.1

Thursday, July 31st, 2014

把dreamhost上的WordPress升级到了3.9.1,并且安装了CleanTalk反垃圾评论插件,开放了评论看看效果如何。

暂时关闭评论

Tuesday, July 29th, 2014

最近垃圾评论数量太多,已经设定了一些过滤器但效果不佳。在找到好的解决方案之前只能暂时关闭评论。

IBM Connections5.0新功能介绍(4) – 自动图片上传

Wednesday, July 2nd, 2014

Connections 5.0的自动图片上传功能极大简化了图片附件上载的过程 – 它允许用户用copy/paste的方式把图片拷贝到编辑器中,Connections会自动把图片解码并上传到后台服务生成附件,之后服务器返回一个图片的URL并插入到当前编辑器中,整个过程对用户是完全透明的。

现在的新浏览器很多都已经支持图片拷贝功能,但浏览器的处理方法是把图片用BASE64编码,并嵌入到正文中。这种方法有不少问题,比如图片无法单独缓存,第三方应用无法正确显示图片等。Connections采用的方法在用户体验、适用性和性能上达到了最好的平衡。

IBM Connections 5.0文档

Friday, June 27th, 2014

IBM Connections 5.0管理员文档 –

http://www-01.ibm.com/support/knowledgecenter/SSYGQH_5.0.0/admin/welcome_admin.html

IBM Connections 5.0用户文档 –

http://www-01.ibm.com/support/knowledgecenter/SSYGQH_5.0.0/user/welcome_end_user.html

IBM Connections 5.0 API文档 –

http://www-10.lotus.com/ldd/appdevwiki.nsf/xpAPIViewer.xsp?lookupName=IBM+Connections+5.0+API+Documentation#action=openDocument&content=catcontent&ct=api

IBM Connections5.0新功能介绍(2) – 社区

Thursday, June 26th, 2014

与Connections 4.5相比,5.0中社区(Communities)在管理和可用性方面有了很多提升,一一道来。

1. 社区搬家

这个功能是很多客户需要的,在内部我们也听到了相同的反馈。用户需要把一个社区放在另外一个社区下成为子社区,或者把已有的子社区升级为父社区。5.0中社区搬家功能可以允许用户自由移动子、父社区。不过该功能并没有在Web界面上提供(计划中),管理员可以公共社区的MBean命令行通过指定源、目标社区 uuid来实现搬家。搬家后Connections会根据原先和现在的社区权限和成员进行自动数据合并。

2. 社区回收站

在5.0之前,删除社区就意味着社区下的数据被物理删除,无法恢复。5.0中引入的回收站的功能,被删除的社区首先被放在回收站中,社区管理员可以在指定时间内恢复。被软删除的社区无法被用户访问到,社区内包含的应用数据如博客、活动、wikis等数据也被隐身禁止访问。

3. 社区缺省应用

如果社区内某应用是绝大多数社区用户一进来就会使用的功能,可以把它定义为缺省应用,这样在社区列表中点击一个社区链接的时候,被直接被定向到该社区应用了,导航被简化了。

4. 一键加入子社区和其父社区

在5.0中,当加入一个公共子社区的时候可以同时加入父社区,而之前必须先加入父社区,然后才能加入其子社区。

5. 外部社区

在上篇文章提到过employee.extended角色可以创建外部社区并邀请外部用户成为社区成员。

6. 社区新应用 – Gallery和Survey

Gallery取代了之前版本的Media Gallery(仍可以使用),虽然都是用Files作为后台文件存储和管理但用户体验不同。现在可以把一个folder当做一个gallery的目录,支持图片、视频的预览和播放,如果安装了IBM Docs Viewer还可以预览MS Office/OpenOffice文件。Survey的后台是IBM Forms,安装配置好后可以在社区内提供投票功能。有关IBM Forms的安装配置,可以在IBM Connections5.0在线文档中找到。

IBM Connections5.0新功能介绍(1) – 内、外部用户协作

Thursday, June 26th, 2014

IBM Connections 5.0 – 内/外部协作

Connections在应用部署场景上基本有两种。一是企业内部部署,供员工使用,另一种在公网部署,供网民使用 (如IBM developerWorks交流区),如果客户需要同时拥有两种协作模式并存的话,在5.0之前只能部署两套单独的环境。

在5.0中,我们增加了内、外部用户协作的功能,希望解决的应用场景是在单一部署下既允许员工内部正常的使用,又可以邀请外部用户登录和员工协作,如在社区共享信息、上传文件等。要解决的关键问题有两个:1) 为Connections用户添加角色以区分不同用户类型;2)保证外部用户在受限外网内工作,比如禁止查看共有信息(公共博客、社区、论坛…)、禁止搜索员工目录、限制社区管理权限等等。在5.0中我们引入了两类用户(内部用户和外部用户)和三种角色(employee, employee.extended, visitor)。其中employee和employee.extended是内部用户,employee是缺省用户角色,如果从Connections 4.x升级上来的全部用户都是employee。employee.extended和employee相比,多出的权限是允许创建‘外部内容’。在5.0中,‘外部内容‘指的是可以被受邀请的外部用户(visitor)访问到的内容。

visitor角色是外部用户,在5.0中是支持的唯一的外部角色。哪visitor能做哪些事呢?可以来看看一个visitor登录后的界面:

可以看到visitor登录后在导航条内只有社区和文件。visitor可以在文件中自由上传文件,而他在社区中的权限,概况一下:

1)visitor不能成为社区管理员;

2)visitor只能被邀请到外部私有社区;

3)只有employee.extended角色创建的外部私有社区才可以邀请visitor;

4)一旦visitor成为外部私有社区成员,它的权限基本上与employee角色的社区成员一致,可以任意在社区内创建内容,在有些功能点如员工目录浏览、完整电子名片、导出社区成员列表等上受到限制。

一个visitor要登录Connections,必须为他在LDAP和Profiles里创建记录。LDAP记录用来登录验证用户名和密码,Profiles记录用来保存其角色信息和个人的其他信息(所以要求如果客户需要使用外部用户功能时,必须要安装Profiles并且打开WPI设置 – 位于LotusConnections-config.xml内,用Installer安装后缺省打开)。在LDAP中标记一个用户是外部用户有多钟方法 – 分支、属性和Javascript,通过TDI利用LDAP上的这些值可以把外部用户导入到Profiles中。在完成了TDI外部用户导入以后,系统中会存在两类用户:employee(之前存在的用户,或者LDAP中不具备外部用户标记的用户)和visitor。如果要添加employee.extended用户,或者要改变某个用户的角色该怎么做?答案是使用Profiles MBean命令行,或者是Profiles administrative REST API。MBean命令行还支持批量更新用户角色。

在UI方面,为了醒目的标示出一个社区、文件是外部用户可参与的内容,我们在界面上用黄色的提示条、图标和用户头衔装饰的方法,时刻提醒用户这是一个外部用户可以访问到的内容:提醒用户发帖的时候,仔细拿捏一下。

安装配置上,Connections 5.0并没有为外部用户引入额外的配置文件和参数,也就是说当安装好后,系统既可以用作纯内部员工使用,也可以混合使用。一旦引入了外部用户,为了保证信息隔离,我们要求完成两个额外配置:

1) 禁止匿名访问。因为visitor不可以访问内公共内容,所以必须强制用户登录。禁止匿名访问功能在前几个版本就已经实现了,是通过在WebSphere管理控制台把‘reader’映射为All Authenticated。

2) 禁止公开缓存 (public cache)。为了提高HTTP性能,Connections会在公共资源如公共博客、论坛的HTTP response中加入publich cache control header,它们可以被cache proxy所缓存住,当有其他用户访问被cache住的link的时候可以直接从缓存服务器返回。但在启用外部用户的情况下,这些缓存会带来信息泄露的问题,因为一个visitor可以请求一个本不允许访问的公共资源链接,绕过后台应用的权限检查而读到该内容。要禁止公共缓存,需要在LotusConnections-config.xml中加入一个属性 :

<genericProperty name=”publicCacheEnabled”>false</genericProperty>

利用SSH Tunnel实现一键翻墙

Monday, June 23rd, 2014

首先,’一键翻墙‘并不是真正的’一键‘,在Firefox用此方法至少需要三键,而且这个方法的门槛不低,不仅需要一个可以提供SSH访问的中继服务器,客户端的设置也比较麻烦,所以本方法不适用非IT人士。

步骤:

1. 首先你需要一个提供SSH的中继服务器,这里以dreamhost.com为例。如果购买过dreamhost的虚拟主机服务的用户,在https://panel.dreamhost.com 上创建可以使用访问SSH的用户账户,利用该账户可以SSH到服务器:

2. 用Putty(一个Windows 上的SSH客户端软件)创建一个SSH Tunnel,以在客户端创建一个可供浏览器使用的代理服务器。首先,输入dreamhost的主机名、端口号,然后到Connections -> SSH -> Tunnels窗口,选择’Dynamic’,然后输入一个本机端口号,如9999,然后点’Add’,完成后把该配置在Putty内保存成一个‘Saved Session’: 注意保存后的配置名在之后的配置中会使用到。

3. 安装两个Firefox插件。

插件1: Proxy Selector – https://addons.mozilla.org/en-US/firefox/addon/proxy-selector/。这个插件允许在Firefox上配置多个备选proxy,并快速切换。这里我们配置一个本地localhost的代理服务器,其端口号为上步在putty的Tunnels中配置的9999端口。注意需要把代理类型设置为‘Socket 4’。

插件2:External application Button – https://addons.mozilla.org/en-US/firefox/addon/external-application-button/ 这个插件的作用是在Firefox上创建运行本地应用程序的快捷方式,用来快速启动putty命令行方式(可预先配置好用户名和密码)。

这里我们建立了一个快捷方式,指向了一个bat文件startPuttySilent.bat。此bat文件内容如下:

start “” c:\app\putty.exe -load “tournemire.dreamhost.com” -l <USERNAME> -pw <PASSWORD>

注意这里带了双引号的tournemire.dreamhost.com并不代表一个服务器,而是你在步骤2中在Putty上定义的‘Saved Session’名字,你可以取如 ‘My proxy server’这样的名字,它实际指向了putty中该配置中定义的SSH服务器地址。

-l和-pw分别为用户名和密码。如果担心安全问题,可以不指定,而是在每次启动SSH连接的时候手工输入。命令行前使用了‘start…’ 的目的在于启动后只保留putty的命令行窗户,而原始的Windows命令行窗口关闭,否则会显示两个黑窗口。

现在需要的配置都完成了,当你需要启动代理翻墙的时候只需要:

1. 在Firefox中Proxy Selector插件选项定义好的本地代理(2键);2) 在Firefox点击定义好的外部putty应用快捷方式 (1键) – 最快3键可以完成代理切换。

搬到Softlayer?

Friday, May 23rd, 2014

现在博客几乎不写了,仅仅维护着老内容,dreamhost上其他服务几乎不用。在考虑搞个Softlayer的VM玩玩,自己搭个环境。需要考虑的问题:

1. 价格 – 还没仔细研究过,等softlayer落地中国后看看;

2.维护成本 – 自己要管理虚机、操作系统、应用软件了,比以前一个admin界面麻烦了,值得吗?

Firefox新浪微博插件

Thursday, October 10th, 2013

没找到好的Firefox微博搜索插件,自己做了一个,挺好用。

下载:Firefox新浪微博搜索。把该xml文件拷贝到Mozilla Firefox\browser\searchplugins目录下,重启Firefox即可。如果不生效,在Windows 7下进入C:\Users\<USERNAME>\AppData\Roaming\Mozilla\Firefox\Profiles\<YOURPROFILENAME>\目录下,删除search.json文件,然后重启Firefox。

回来了

Tuesday, September 18th, 2012

今天的STSM party,自己的老博客被翻出来当素材了,以前写的东西,贴的照片自己都记不太清了。很高兴这段历史一直在这里, 任何人都看到。。。

感谢这么多同事给我的祝福,很多的video看的出来精心策划,甚至有很多镜头上的同事我都不认识,太辛苦大家了。另外宝宝也顺道上了镜,呵呵,以后长大了跟他说道说道。

被dreamhost扣了钱

Monday, July 4th, 2011

Web hosting的年费,$119.40,比起免费的新浪微博,太贵了。虽说有10几个GB的存储,FTP, email,论坛,都用不上就连最常用的博客也已经更新很少了。是时候考虑新的方案了。