从Mac OS X 上移除 mysql
我这台机器上原来有Mysql,后来又用了MacPort,用Macport又装了个Mysql,搞到极其混乱,现在八不清谁跟谁,索性把他们都Uninstall了,然后再用Port重新装过。
先用Port把Port的版本unistall,前提是要停止Mysql:
sudo port uninstall mysql5
然后开始删文件吧。
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
编辑 /etc/hostconfig 删除这行: MYSQLCOM=-YES- rm
-rf ~/Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
折腾TinyMCE图片上传的结果
由于敬爱的DropBox同学不幸被吾裆阉割了一半(不能访问外链,还能同步),导致本博的部分重要图片被墙,无法翻墙的同学看着大叉叉心神不宁。我以前使用毕卡索来做图片服务器,后来毕卡索被墙后换了DropBox,但不幸的是DB同学由于出过不少次风头而也被切了一半,看来,图片这东西还是放在自己服务器靠谱,就算被墙也是换个域名的事,不用大量修改文章里的图片链接那么痛苦。
本博在去年更新程序的时候换了TinyMCE做为WYSIWYG编辑器,但一直没有时间做个图片上传的插件(用不起官方那个商业版的),最近决定折腾折腾。
凡事先Google,django + tinymce + image 等关键字一出,马上找到一些好东东。
首先是Django-FileBrowser,她是一个强大而美丽的文件管理器。

更多截图。
然后我顺腾摸瓜找到了Django-grappelli,她又是一套优雅实用的Django-admin样式和扩展,除了有一套优雅大方的样式,她还为Admin加入了书签和导航栏等功能,甚为实用,可移步到这里来围观围观。
这两个应用都与TinyMCE完美整合,最好两者一起使用,当然不用grappelli也无大碍。
这两个应用我都照单全收了,我在线把她们安装到我的服务器上,这样一来,我不仅解决了图片上传的问题,还收获了一套美观的样式、得到了一个实用的文件管理器。喔!上艳照。

现在发图方便了,下面我要发飚了。
以后就使用Chrome书签了!
Chrome书签支持同步了。对我而言这太好了!虽然其他浏览器可能也有书签同步的功能,但是对我而言没有吸引力了,Chrome已经把他们打败了。因为我已经徹徹底底地从Firefox粉变成了Chrome死忠。
在以前,浏览器的书签对我而言作用甚小,类似鸡肋,因为我同时使用着至少三台电脑,用着几种不同的浏览器,大部份是Firefox和IE。所幸的是两种浏览器都支持google toolbar,所以当时就使用了google bookmarks来管理书签。通过google toolbar 使用bookmarks比较不爽的就是响应速度,毕竟bookmarks是在结加载,实时同步的。
现在我在所有操作系统上的浏览器都转到Chrome上面来了,我再次面临着书签的问题,Chrome支持扩展后出现了一个google bookmarks的扩展,但使用体验一般差,很想干掉它。这时我就想,都是Google的东西,干嘛好好的有书签不用,要装个插件?这不是瞎折腾吗。。
我认为Google以后会把Chrome书签与google bookmarks合并在一起,因为他们是相同的Google用户在Google上性质相同的两份数据,有什么理由不合并吗?如果Google不打算合并的话,那我失望就大了。
先不管Google合不合并,我先把google bookmarks先导入到我的Chrome书签中来。以后咱就只用chrome书签了。
下面附上把google bookmarks导入到Chrome书签的方法:
1、登录Google bookmarks:http://www.google.com/bookmarks
2、点击左侧导航栏的 Export Bookmarks,下载html格式的书签文件。
3、使用其他浏览器,如Firefox导入刚下载的html书签文件。
4、打开Chrome,选项中,导入另一个浏览器数据,选择刚用来导入书签的浏览器Firefox,导入。
5、成功。
让R与Python共舞
R(又称R语言)是一款开源的跨平台的数值统计和数值图形化展现工具。通俗点说,R是用来做统计和画图的。R拥有自己的脚本语言和大量的统计、图形库(得益于开源社区),这让她看起来既美又实用。与其他同类软件(如SPSS)相比,R的特点是纯命令行的,这倒也好,我们更应该把注意力放在数据本身,而非统计工具的UI。
R虽说有一套自己的语言,还挺完备,但她最专业的还是做统计和画图,而像连接数据库、文本处理、文件操作等这些脏活可不能委屈R来干哪,这些得有其他语言来负责,我的选择是咱最熟悉的、做这些脏活最棒的Python。那接下来的问题很清楚了,R和Python如何一起工作?拍拍脑袋,想到可能有下面几种办法:
1. R和Python只共享文件,Python把源数据处理干净,生成格式化的文件放在预定的目录下,做个定时器让R去读文件,最终输出统计结果和图表。
这种做法一定程度上可行,除了做定时器外,还可以让Python即时执行"rscript"命令调用R脚本来工作,只是这种办法限制太大,只能够交换文件,Python不能对R进行精确的控制。
2. 让Python直接调用R的函数,R是开源项目,肯定会有一些第三方库实现Python与R互通。
果然,我找到了rpy2,可以实现使用python读取R的对象、调用R的方法以及Python与R数据结构转换等。实际上除了Python,其他语言与R互通的第三方包也大大的有。
最后我选择第2种方法,来让R与Python共舞。
模块 rpy2.robjects 是rpy2对R的一个高级封装,该模块里包含了一个r对象和一系列的R数据结构。使用rpy2的大多数情况,只需要跟这个模块打交道即可。rpy2的安装在此不多讲了,有兴趣的同学看文档去,直接体验一下R如何与Python无缝整合吧。
了解r实例
r实例是指rpy2.robjects.r,它是在Python中的嵌入式R进程,把r当作从python走向R的通道来看就可以了。通过r实例,我们可以读取R的内置变量、调用R的函数、甚至,直接把它当作R的解析器来用。
访问R的对象
在R的命令行中,我们直接输入对象名来访问R的内置对象,如pi、letters:
在R控制台中访问R对象
而使用r实例,python访问R对象也很简单,而且方法很多:
在python中访问R对象
在这段代码中,我们用了三种方式来访问R对象,把r实例当作字典,把r实例当作方法,把r实例当作一个类对象(真是神喻呀~)。在实际中,使用哪一种方式要因习惯而异,我喜欢的方法是使用第三种,把r实例当作自己人,直接使用"."来访问R对象。但这种方法有一个缺陷,就是不能访问带名字空间的R对象或函数,而其他两种方式是可以的,这点将在随后说明。
调用R函数
通过r实例,我们可以轻易地实现用Python调用R的函数。下面我们分别在R控制台和python命令行下读一个数据文件并画一张点图。
R控制台读取文件画点图
代码解读:
data.csv 的内容就是上面代码的3到7的内容。
data = read.table('data.csv') :把文件读进一个数据框变量data中。
mtx = data.matrix(data):把data转变成矩阵。
dotchart(mtx)用矩阵的数据画点图。
结果如下:
接下来用python来做一遍同样的事情,我们之前了解到,使用r实例可以直接访问R对象,还可以直接调用R的函数,其实在Python看来,对象和函数是相同的东西,函数也是一种对象罢了。现在来试一下调用"read.table()"函数读入一个数据文件data.csv:
出错了!怎么回事?在上面我提到过了,使用“.”引用的方式不能访问带有名字空间的R对象和函数,read.table 是表示在read包下面的table函数,通过"."的形式调用失败,必须要用字典的方式或参数的方式来获得:
这段代码得到的结果与在R控制台下画点图的效果是一样的。最后一行r.dotchart(mtx)是直接通过"."来调用R的函数dotchart的,在没有名实空间的情况下,是正常的。如果你为了避免太多不可控制的出错机会,你可以统一地使用字典的方式来访问R对象和方法,这是最保险的方法,虽然我个人认为看起来有点别扭。
r实例就是一R控制台
其实r实例就是一个可交互的R控制台,只不过交互对象是Python与R罢了,为了证明r实例具有R控制台的特性,来做个实验,写一串R脚本,作为Python一个字符串变量的内容,把该字符串传给r实例,然后把r实例当作方法来调用:

出来的结果这样:

注意,把r实例当作控制台,只能够通过r(r代码)的方式来使用r实例,字典的方式行不通。
加载自定义函数
在实际应用中,使用R语言来编写自己的函数同样是不可避免的,在R控制台中,可以使用source('script_path')的方法来加载自定义R脚本。而在Python中使用自己义R脚本中的函数也同样方便:使用r.source('script_path')即可把自定义函数加载到全局环境中,再使用r.自定义方法名就可以实现调用,我就是这样做的,在此不再详述,同学们自己动手玩一下。
R Vector与Python list
向量(Vector)是R的一个最重要的也是最常用的数据类型,可以理解为一个二维数据,对应Python的list。在R控制台中,声明一个变量:“x <- 1”,X会被声明成一个向量,而其第一个值是1。R常常用c()函数来声创建一个由多个值组成的向量,例如c(1,2,3,4)。Python要与R打交道,除了访问R对象和调用R函数,还有就是要学会如何转换常见的数据类型。
rpy2提供了几个类,供我们把Python的list转换成R的Vector。分别是robjects.IntVector,robjects.Boolvector,robjects.StringVector,robjects.FloatVector.以IntVector为例,将Python的list转换成R的Vector:robjects.IntVector([1,2,3,4,5]),毕!
下面来使用刚学到的类型转换知识画上一个例子的散点图来结束此次体验:
没有结束
rpy2提供的不仅仅是上面这些,上面的知识只是rpy2所提供的20%,但是已经足以解决80%的问题。rpy2还提供了更低级的API,你可以做更多的事情,例如你可以实现另一个robjects对象来支持使用"."来访问带名字空间的对象和函数。更多的知识,请移步官方文档。
ubuntu9.10下python访问Sql server的解决方案
在Linux/Unix/Mac下面通过程序来访问M$的Sql Server是一件很折腾的事情,赖总说,linux遇上windows就是杯具啊。最近不幸自己也遇上了,折腾了好一段时间,参考过不下于100+的网页,给过两个老外写邮件,终于还是没有搞定snow leopard上的,但总算搞定了linux上的。
纵观网上的一些参考材料,中文偏少,以赖总一年之前那篇被转载居多,而且大多数语焉不详,只道How,不道Why,当linux发行版本换或软件一升级就套不上了;英文很多,但各有千秋,参考起来也很头大。今天,咱在授人与鱼(如果你的系统配置和我的一样)之余顺便授人与渔,希望自己这次折腾的经验可以给以后需要的同学们带来点方便或启示什么的。
在开始之前,请问一下自己,真的有必要这样折腾吗?现在放弃还来得及,如果点头就继续往下看吧。
其实也没那么恐怖,我自己像个盲头苍蝇乱撞才会踫到一脸灰,如果一开始把原理搞清楚,做起来就快了。
首先,再确定一下我们的目标是:在linux下通过python访问Sql Server!关键字是linux、sqlserver、python。我的系统配置:ubuntu9.10 desktop 64bit、python2.5、SqlServer2005,配置不同的同学在理解原理之余应该也可以自行解决了。
基本原理
一、Linux下应用程序是一般怎样访问数据库的?
目前比较流行的方法是应用程序通过ODBC(Open DataBase Connectivity)来访问数据库。
在ODBC诞生之前,如果要开发数据库应用程序,则必须要使用数据库厂商随数据库产品一同发布的一些工具集来访问数据库,或者在程序中使用嵌入式SQL来访问数据库。当时,对于访问数据库的方法,缺乏一个基于C语言的统一编程接口。ODBC(Open Database Connectivity,开放数据库互连)提供了一种标准的API(应用程序编程接口)方法来访问DBMS(Database Management System)。这些API利用SQL来完成其大部分任务。

见ODBC的架构图,ODBC的驱动管理器自动处理各种数据库驱动与数据源(如各种数据库,甚至Excel)的关系,应用程序只需要使用ODBC的API即可,底层的细节对于应用程序来说是透明的。熟悉Java的同学回想一下JDBC,与ODBC的思路是一个道理,各种数据库有各自对应的JDBC驱动,同时也会有与之对应的ODBC驱动。
那么,要达到linux下应用程序访问数据库的目的,我们需要安装Linux下的ODBC库:unixODBC,目前ODBC在各种操作系统上均有实现,如windows的MS ODBC,还有Mac下的iODBC。
需要注意一点就是,要在Linux下让应用程序访问数据库,使用ODBC不是唯一的方法,只是本解决方案的方法。
二、怎样通过程序访问Sqlsever?
众所周知,程序访问数据库通常需要用到数据库的驱动程序(Database Driver)。Sqlserver(及SyBase)使用TDS(Tabular_Data_Stream)作为它的数据库现客户端传输的协议。关于TDS:
TDS(Tabular_Data_Stream)是一个应用层协议,用于数据库服务器与客户端传递数据,于1984年由Sybase公司发起并开发,用在它们的Sybase Sql Server关系数据库引擎,后来被微软的Sql Server所用。
所以不难理解,SqlServer的Java 驱动包 JTDS,就是TDS的一个Java实现(同时是JDBC的实现)。而For linux,开源社区有一个叫freetds的实现。Linux的程序可以直接通过它来访问SqlServer,是的,可以跳过ODBC。使用ODBC只不过是希望使得更多的方言(不同的编程语言)可以以一致的方式来访问数据库。
三、当Linux遇上SqlServer?
unixODBC使得linux上的程序可以以一统一的方式来访问数据源(这里叫以linux的方式),freetds是专为SqlServer而实现的数据库驱动。那么如果我们要以linux的方式去访问SqlServer呢?那就把两者两者连接起来吧!tdsodbc做这个的,在它的帮助下,linux上的应用程序完全可以不用关心freetds,只要以odbc的方式去访问数据源即可。
四、再加一个Python如何?
pyodbc是ODBC的一个python封装,它允许任何平台上的python具有使用ODBC API的能力。那意味着,pyodbc是python语言与ODBC的一条桥梁。
就这样,我们把它们的关系一拉直就是这样:
python程序 ─》pyodbc ─》ODBC(unixODBC) ─》Database Driver(freetds) ─》DataSource/Database。
开始行动
一、安装linux下Sqlserver的驱动程序
我们先来安装SqlServer的驱动程序,再安装ODBC相关的,目的是想尽快可以进行测试,因为在安装完Freetds之后,我们马上就可以在linux下连上SqlServer了。
安装Freetds,不要使用apt-get install 来安装,因为源里的版本不一定是新的,建议版本是0.82版,下载源码手工编译安装,因为有好些参数需要在编译中指定的。
1、使用命令行,切换到解压后freetds的目录下面,执行以下命令
./configure \
--prefix=/etc/freetds \
--with-tdsver=8.0
--enable-msdblib \
--enable-dbmfix \
--with-gnu-ld \
--enable-shared \
--enable-static
2、sudo make
3、sudo make install
好了。如果不出意外,freetds已经安装好了。再安装一个小工具freetds-bin,用来测试一下连接你的数据库:
apt-get freetds-bin
安装完毕后,可以使用tsql命令来进行测试SqlServer数据库连接:
jeff@ubuntu:~$ tsql -H 192.168.0.204 -p 1433 -U sa
locale is "en_US.UTF-8"
locale charset is "UTF-8"
Password:
1>
这时,成功地在Linux下访问上了远程的Sql Server数据库。胜利迈出了第一步!
二、安装linux下的ODBC驱动管理程序
现在安装unixODBC,让linux下的应用程序可以通过ODBC来访问数据源。我们需要分别安装unixodbc,unixodbc-dev,unixodbc-bin(可选),tdsodbc
apt-get install unixodbc unixodbc-dev unixodbc-bin tdsodbc
前面讲过了,ODBC驱动管理器会管理数据库驱动和数据源,那么它是如何管理的呢?答案是配置文件,分别有数据库驱动的配置文件和数据源的配置文件,分别是odbcinst.ini和odbc.ini,其所在的位置可能会因操作系统和安装方式而异,不过可以使用odbcinst -j命令来查看:
root@ubuntu:/home/jeff# odbcinst -j
unixODBC 2.2.11
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
USER DATA SOURCES..: /root/.odbc.ini
在输出的结果中看到数据库驱动的配置文件是/etc/odbcinst.ini、数据源配置是/etc/odbc.ini和/root/odbc.ini。我们可以打开这两个文件看看,是没有内容D。现在我们要做的就是配置数据驱动以及数据源。
配置ODBC的时候,我们可以直接往两个配置里面增加内容,但这种方式不推荐,而推荐使用odbcinst命令来安装驱动信息和数据源信息。
配置数据驱动
首先,创建一个tds.driver.template的文件,输入以下内容并保存:
[TDS]
Description = FreeTDS Driver for Linux & MSSQL on Win32
Driver = /usr/lib/odbc/libtdsodbc.so
Setup = /usr/lib/odbc/libtdsS.so
[TDS]这一行意为开始定义一个名叫TDS的数据库驱动,下面是这个数据库的相关属性,请检查一下,Driver和Setup所指的两个lib文件是否存在,如果不存在,要好好检查一下这一步的安装工作有没到位啦,现在把tds.driver.template里定义的数据库驱动安装到系统的ODBC驱动库,执行如下命令:
root@ubuntu:/home/jeff# odbcinst -i -d -f tds.driver.template
-i 表示install,安装
-d 表示driver,所安装的是驱动
-f 表示file,指定要安装的文件
配置数据源
接下来,创建一个tds.datasource.template文件,输入以下内容并保存:
[my_data]
Description = Connection to windows virtual machine
Driver = TDS
Trace = No
Database = testdb
Server = 192.168.0.2
Port = 1433
TDS_Version = 8.0
[my_data]一行意为开始定义一个名叫my_data的数据源。Driver属性指定的名字是预定义好的TDS驱动,其他是一些数据库的相关属性,如服务器地址,端口等。
现在把tds.datasource.template文件里定义的数据源安装到系统的ODBC数据源中,执行下面的命令:
root@ubuntu:/home/jeff# odbcinst -i -s -l -f tds.datasource.template
-i 表示install,安装
-s 表示source,所安装的是数据源
-l 表示把数据源安装到系统的全局数据源配置文件,用-h则是安装到用户的数据源配置文件中
-f 表示file,指定要安装的文件
OK,把驱动和数据源都安装好了,现在来测试一下通过ODBC访问SQL Server如何吧,使用unixODBC自带的isql命令,使用格式为: isql 数据源名 用户名 密码
root@ubuntu:/home/jeff# isql my_data sa password
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
如果你看下上面类似的画面,说明ODBC和SQL Server现在沟通得很好,这时你可以在SQL>提示符下输入Sql语句试一把,感觉High吧?还有一步,我们就成功了。
三、安装odbc协议的python实现--pyodbc
到这里下载pyodbc,解原缩后使用python install.py setup来安装,如果一切顺利那就恭喜你了,如果安装过程报错,那你一定是少了一些什么!我安装pyodbc也装了蛮久才成功,我的经验是:如果报错,检查一下你的系统是否安装了下面的一些lib,如果没有请通过apt-get install来安装:
g++,unixODBC-dev,python-dev
好,到这里假设pyodbc已经安装完毕了。那么,照这里测试一下吧!整个过程就这样分三步走,每一步做完都要保证测试通过,这样中间出错的话,问题也容易定位得多了!
目标达成!不过,当我把这过程写完的时候反而觉得这是小菜一碟了。。。囧。。希望自己没有小题大作,希望对将来不幸要折腾Sql Server的同学有所帮助。
参考文档:
来自赖总的经验:http://blog.csdn.net/lanphaday/archive/2009/01/20/3838967.aspx
和这位老外兄弟就mac上的连接问题沟通了几次,他这篇linux+mssql的文档值得一读:http://blog.singletoned.net/2009/07/connecting-to-ms-sql-server-from-python-on-linux/
http://code.google.com/p/pyodbc/
http://www.unixodbc.org/doc/FreeTDS.html
还有很多数不胜数的maillist归档和网页。感谢互联网,感谢google。
Hello Chrome,Goodbye Firefox!
和Chrome相处得越是久,就越是觉得她好了。。虽然目前的版本还是Beta或Dev版,但是她比Firefox更快、更简洁、更人性化,并且现在已经开始有大量的Extensions可以使用了,所以,我已经越来越多的时间是与Chrome相处,而Firefox就要Say Google bye了。
Firefox曾经是我工作和生活中最最重要的Browser,其优秀的扩展性和大量的插件是我使用她的重要原因。但随着使用的插件越来越多,Firefox的问题仿佛也越来越大,主要表现为启动时间长,严重时就像启动一台PC一样慢~,另外还经常出现响应过慢,然后无故崩溃的情况,并且这种情况越来越多。最后我实在无法忍受的时候把很多插件禁用,但依然不见得改善多少,最让我抓狂的是Agent Switcher这个插件,不管我是否禁用,卸载与否,Firefox启动后默认的Agent居然变成了手机。。真汗。。没办法,我与Firefox缘尽于此。
Chrome与Firefox相比,有几个我认为很重要的优点:
一、Chrome一个标签页对应一个进程,所以一个页面崩溃了,不影响整个Browser,而Firefox(包括其他浏览器)则会因为一个页面崩溃而全盘崩溃。不仅如此,Chrome的插件也是以独立进程的形式运行的。
二、Chrome的界面很清爽,地址栏即搜索框!并且地址栏有一点很重要,用户输入地址的时候,Chrome把匹配程度最高的地址显示在地址栏内,其他地址以下拉列表形式出现在下面,通常情况下我都不需要做选择,直接回车即可访问最匹配的地址,而Firefox不会这样做,不管你要访问哪个地址,要不你输入全部字符,要不手移到方向键盘,选择一下,再回车。safari这点也做得不错,只是我觉得firefox比较不贴心就是在这里。
下面是Chrome的地址栏的智能提示:

下面是Firefox的地址栏的智能提示:

三、Chrome的插件风格一致,她的插件都统一的以小图标的形式放在地址栏右侧,这样一来,地址栏、工具栏(插件栏)合二为一,不占地方,又方便管理。而Firefox的插件则是五花八门,状态栏上有插件,菜单里面的插件,工具栏上有插件,插件一多,真的是眼都花了。
嗯,看看Chrome的插件布局:

总的来说,我是想要一个清爽快速和稳定的Browser,目前Chrome是我最理想的选择。当然Firefox有不少很好的插件曾经是我爱不释手,但Chrome的插件中心上面的插件也越来越多,到目前为止,我装的好几个小插件都能满足我目常的使用了。
但杯具的是Chrome的插件中心是被GFW的。。anyway。。我只需要在终端下面输入"fuckgfw"命令即可顺利使用。管他墙与不墙。。
诱惑
这世界充满了诱惑,每个人的不同,每人每个时段的也不同。
最近身边发生的事情太多了,朋友的,同事的。原来改变可以发生得如此快和激烈,看上去很混乱,也很容易让人感觉浮躁。其实都可以理解,生活的压力嘛,大家都到了这个年纪了,生活应该是越来越好的,有些事情还是得改变的。
我想,如果可以按照自己的价值观来做一些真正有意义的事情又同时产生价值,那是最理想的状态。但这不容易,尤其当我们面临着如此多的压力和其他诱惑的时候。不过我的想法还是坚持自己的原则,做人凭真材实料,不靠忽悠,做事做实事,做有用的事,在某个领域内做到极致。
有时候,钱赚得多不一定开心,毕竟,做人为钱活着很累!谈谈抱负、谈谈付出开心多了,当然,前提是要解决温饱。
在此还是一如既然地祝福的朋友、同事们以后越混越好。公司生意蒸蒸日上。祝自己天天有最Fit的状态进行战斗。
现在最重要的是,祝俺娘子生日快乐!