Drupal只是提供了一个高度可定制的系统,并没有附带很多功能。在默认配置下,发布内容时,Drupal是用纯文本编辑器,而大多数情况下,我们需要更方便的所见即所得的编辑工具,以及包括选择、上传图片等更多功能。可以用以下几个步骤来给Drupal安装、配置一个可视化编辑器:
1) 安装Wysiwyg模块,和一般的module的安装方法一样。
安装好了,需要进行适当的配置:
Administer > Site configuration > Wysiwyg
2) Wysiwyg只是Drupal提供给各个可视化编辑器的API引擎,如果你没有安装任何编辑器,则需要安装一个。我这里选择TinyMCE,解压放到Drupal安装根目录下的sites/all/libraries/tinymce目录里。
如果没有libraries目录,则自己创建一个。
这个时候,再到Wysiwyg的设置里,就能选择TinyMCE作为编辑器了。
3) 选择TinyMCE作为编辑器后,需要到Administer –> Site configuration –> Input formats给用户分配适当的编辑器可视化功能选项。
这个时候,你再到Create content里,创建一个Blog entry看看,是不是有富文本编辑器了?
4) 按上面的步骤配好的编辑器,在你需要插入图像的时候,会弹出如下的对话框:

看看,并没有选择图片的按钮!
所以接下来,我们需要添加插入本地图片的功能。我们需要安装下面两个插件:
(1) IMCE模块
安装成功后,记得到Administer –> Site Configuration –> IMCE里,给需要上传图片文件的用户分派IMCE权限。否则,这些用户依然没有办法上传图片。
(2) IMCE Wysiwyg bridge模块
这个模块的功能是桥接IMCE和Wysiwyg,注意,这个是TinyMCE with WYSIWYG API来负责的。
安装好IMCE Wysiwyg bridge以后,记得到在Wysiwyg的配置里对TinyMCE和IMCE进行配置:

在Administer –> site Configuration –> Wysiwyg里,点Edit,进到TinyMCE profile for Filtered HTML页面里,点Buttons and plugins,把IMCE勾上。
现在来测试一下这个上传图片的功能:
在富文本编辑器里点击”选择图片”按钮后,会弹出如下对话框:

点击红色圆圈里的按钮后,就会弹出上传图片的对话框:
上传完图片后,选择这个图片,再点Send to TinyMCE,这样,就可以在富文本编辑器里看到这张图片了:
上传的文件默认会放在sites/default/files里。
注意:
如果你碰上了Drupal会自动帮你把换行符取消掉,或者你添加进来的图片不能在浏览的时候显示,那很有可能是下面这两个问题。请仔细查一查下面两个地方的Filters:
1) 检查一下Administer –> site Configuration –> Wysiwyg里的相关input format有没有问题。
2) 检查一下Administer –> site Configuration –> Input formats,看看这里面的Filters有没有把图片、换行等标识代码给过滤掉。
自己平时写了不少小玩意,或者换句话说,是很多小项目。这些小玩意,分散在硬盘的各个角落里,管理、查找起来相当不容易,尤其是一些修复bug的工作,用文本的方式不太好记录。
其实完全可以利用Drupal来进行项目管理工作,并且可以作为bug tracker系统来用,并且还支持多人协同开发的管理。
在Drupal里进行项目管理,需要安装下面两个模块:
1) project模块
注意,安装这两个模块,可能需要Views模块,需要Devel模块以及需要Comment_upload模块。
新建一个developer的role来负责与project有关的工作,所有的开发人员都可以放到这个角色当中。
通过User Management里灵活地进行管理权限地分配,控制这些帐号的权限,从而达到安全管理项目的要求。
当然,如果你喜欢用其它bug管理工具,你依然可以在Drupal里结合它们。比如,Bugbits模块就是把Drupal和Mantis集成起来使用。
Drupal自身的安装很简单,新建一个数据库,然后根据安装提示一步一步做就OK了。
而Drupal可以通过安装各种模块来提供更多定制功能,这些模块的安装方法基本相同,一般来说,就是以下几步:
1) 从Drupal Module里下载相关的模块;
2) 解压该Module到Drupal安装目录下的./modules/里,解压放这就可以了;
3) 登陆Drupal管理后台,Administer –> Site Building –> Modules,启用该模块即可。
具体的模块安装可能有一些需要特别注意的地方,可以查看模块包里的INSTALL.txt文件,获得详细信息。有一些模块可能会有一些依赖关系,详细地需要看安装时候的说明提示。
Windows自带有一个计算器,科学型的还做得和真的计算器一模一样。如果是复杂一点的算式,很容易就被复杂地科学运算法则给弄晕掉了。
SpeQ Mathematics是一个轻量级的计算器,可以输入一长串的数学公式来进行计算。这样的方法,更容易重复检查与核算,也更不容易出错。
可以用SpeQ Mathematics代替Windows计算器,在日常生活中进行一些相对来讲有点复杂的计算。再复杂一点的,估计就得靠matlab了。
前几天头脑一热,上淘宝买了两条短裤,主要是觉得街上的太贵了一点。淘宝上没实体店,总是要便宜一些吧?
其它倒还好,只是没想到裤子的小前门是用纽扣来进行开关的。这下子可痛苦死我了,每次上厕所就好像练手指功一样,比起一般的拉链,最少得多花上半分钟到一分钟的时间。
想不明白为什么要这样设计?如果在看得到的地方,用纽扣来代替拉链,那还可以称之为时尚、风格、复古;但是在看不到的地方,安上纽扣来,除了难扣以外,还有啥用处?
纽扣是一个伟大的发明,而拉链,则是一个更伟大的发明!现在,每天我都要在厕所里提醒自己若干次这句话!
MySQL GUI工具很多,最常用的恐怕是官方的MySQL GUI Tools了。不过呢,这个官方的工具,从各方面来说,只能算是中规中矩了。
相比来讲,MySQL-Front就要出色多了!MySQL-Front是一款小巧的管理MySQL的应用程序,其主要特性包括多文档界面、语法突出、拖拽方式的数据库和表格、可编辑/可增加/删除的域、可编辑/可插入/删除的记录、可显示的成员、可执行的SQL脚本并提供与外程序接口、保存数据到CSV文件等。除此之外,还提供了同步两个数据库的功能。
MySQL-Front是收费软件,试用版可以免费试用30天。
我之前的文章里不确定Zotero能否多台计算机同步记录数据,这两天仔细查了一下Zotero的网站,确定1.X版本是没有网络同步的功能,但是2.0版本却有网络同步的功能。
Zotero 2.0版本的同步功能,可以备份数据到Zotero的服务器上,然后,在另外一台机上同步下来。通过这个功能,我们就能在多台机器上同步一份相同的数据了。这个功能和Evernote的网络同步、备份功能相类似,也非常好用。
如果经常在多台电脑上工作的人,可以试试Zotero 2.0的网络同步功能;只在一台计算机上工作的人,也可以利用这个功能来备份自己的资料!
MySQL提供了C++语言的操作接口,用这个接口可以针对自己的数据库写一个C++的客户端出来,安装的方法请参看官方文档。
这个文章已经把在Visual Studio 2008里如何编写MySQL Connector C++的应用程序进行了详细的说明,此方法是针对MySQL Connector C++的安装包来介绍的。而另一篇文章则介绍了如何从MySQL Connector C++的源码包编译。
这里介绍一下Visual Studio 2005下面,用安装二进制包的方法来使用MySQL Connector C++的方法:
1) 先安装MySQL
记得要把Developer Components – C Include Files / Lib Files选上。当然,你不安装MySQL而只装这个单独的包也行,不过我还是建议在本地装一个MySQL,否则怎么测试呢?远程测试太麻烦了~~
2) 下载与Visual Studio 2005相对应的MySQL Connector C++版本
3) 在Visual Studio 2005里创建一个Win32 Console工程
File->New Project->Visual C++->Win32->Win32 Console Application
注意:”Application Settings”里的”Additional options: Precompiled header”默认是会被选上的,而我们这里,基本上可以不用这个。
4) 正确地配置工程属性
不管是Debug还是Release,都是用下面的方法设置就可以了,主要是把相关的头文件include到工程,再指定相关的动态链接库所在路径。
(1) 打开”project”->”properties”对话框,选择”configuration properties”
把MySQL Connector/C++的安装目录添加到Additional Include Directory里:
Project->Properties
Configuration Properties -> open tree view
C/C++ -> General -> Additional Include Directory
(2) 让编译器能找到MySQL Connector/C++的libraries,只要把MySQL Connector/C++安装目录里的lib/opt目录添加到搜索路径即可:
Linker -> General -> Additional Library Directories
(3) 编译器在编译的时候,让linker去链接MySQL Connector/C++的mysqlcppconn.lib库
把mysqlcppconn.lib添加到这里:
Linker -> Input -> Additional Dependencies
5) 可以试着编译下面的这段最基本的代码:
/*
examples/standalone_example_docs1.cpp
*/
/* Standard C++ includes */
#include
#include
/*
Include directly the different
headers from cppconn/ and mysql_driver.h + mysql_util.h
(and mysql_connection.h). This will reduce your build time!
*/
#include "mysql_connection.h"
#include "cppconn/driver.h"
#include "cppconn/exception.h"
#include "cppconn/resultset.h"
#include "cppconn/statement.h"
using namespace std;
int main(void)
{
cout << endl;
cout << "Running 'SELECT 'Hello World!' AS _message'..." << endl;
try {
sql::Driver *driver;
sql::Connection *con;
sql::Statement *stmt;
sql::ResultSet *res;
/* Create a connection */
driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "password");
/* Connect to the MySQL test database */
con->setSchema("test");
stmt = con->createStatement();
res = stmt->executeQuery("SELECT 'Hello World!' AS _message");
while (res->next()) {
cout << "\t... MySQL replies: ";
/* Access column data by alias or column name */
cout << res->getString("_message") << endl;
cout << "\t... MySQL says it again: ";
/* Access column fata by numeric offset, 1 is the first column */
cout << res->getString(1) << endl;
}
delete res;
delete stmt;
delete con;
} catch (sql::SQLException &e) {
cout << "# ERR: SQLException in " << __FILE__;
cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
cout << "# ERR: " << e.what();
cout << " (MySQL error code: " << e.getErrorCode();
cout << ", SQLState: " << e.getSQLState() << " )" << endl;
}
cout << endl;
return EXIT_SUCCESS;
}
如果一切顺序,应该就能连上本地的MySQL进行操作了。
经常在自己的Wordpress博客贴一些代码,可是Wordpress会自动帮我把每行开头的空格给过滤掉。这样就弄坏了代码的风格,代码的可读性很差,不可能上来看看代码还得再排排版吧?
有几种方法可能解决这个问题:
1) 在html编辑模式下,用 来添加空格;
2) 用<pre></pre>把代码给框起来, 或是用文件编辑器里的code按钮把代码给框起来。
在这里,我更倾向于用<pre></pre>标签,”pre”是早期HTML标准中用来指示”原样引用”的标记,取”preservation”的缩写。这样,用<pre></pre>标签就能把所有的代码原封不动的按编辑时的格式显示出来。
用下面的这段代码来试验一下:
for (num_data = 0; num_data < _NUM_DATA; num_data++)
{
for (y = 0; y < _Y; y++)
{
for (x=0; x < _X; x++)
{
LOG << _Pattern[num_data * _Y * _X + y * _X + x];
}
LOG << std::endl;
}
}
可以在这里试试<pre></pre>标签的效果。
最近写了一个神经网络的数字图像识别的程序,刚一开始,被位图的读写搞得晕头转向的。想当年还蛮熟悉的,太久没弄了,知识总是会忘记的!现在写下来,算是记一记笔记,以后再回忆就不会那么痛苦了!
位图文件由三部分组成:文件头 + 位图信息 + 位图像素数据,具体的结构如下图所示:
1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义:
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
其中的bfType值应该是”BM”(0x4d42),标志该文件是位图文件。bfSize的值是位图文件的大小;bfOffBits是指从BITMAPFILEHEADER开始,直到位图像素数据存储点的内存大小(距离),即用bfOffBits – sizeof(BITMAPFILEHEADER)就能得到BITMAPINFO在位图中实际所占有的空间大小。
2、位图信息中所记录的值用于分配内存,设置调色板信息,读取像素值等。
以下是位图信息结构的定义:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
可见位图信息也是由两部分组成的:位图信息头 + 颜色表。
2.1 位图信息头
位图信息头包含了单个像素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义:
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
2.2 颜色表
颜色表一般是针对16位以下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。而对于16位以下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。颜色表的作用就是创建调色板。
颜色表是由颜色表项组成的,颜色表项结构的定义如下:
typedef struct tagRGBQUAD { // rgbq
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。
3、位图数据
最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部分:位图数据。根据不同的位图,位图数据所占据的字节数也是不同的:对于8位位图,每个字节代表了一个像素;对于16位位图,每两个字节代表了一个像素;对于24位位图,每三个字节代表了一个像素;对于32位位图,每四个字节代表了一个像素;而对于单色位图来说,每一位代表一个像素。
这里有两点特别需要强调的:
1) 位图数据的字节数组是从图像的最下面一行开始逐行向上存储的,所以在选取源位图的实际范围的时候需要特别注意!
我习惯先用一个函数,把位图数据读成一个和位图结构、方向相似的矩阵,即最先读出的位图数据,是矩阵的最后一行。
2) 存取位图数据的字节数组有个问题需要引起开发人员的注意:字节数组中每个扫描行的字节数必需是4的倍数(即是32位的倍数),如果不足要用0补齐。
举例说,我有一个20 * 20个点的单色位图。在保存位图的时候,第一行有20个点,虽然只需要用20位的数据来保存就可以了;但是,这个时候,不足32位,则需要用12位0来补足。
这样,总共需要 20 * (20 + 12) = 640 位来保存这一行,即需要用640/8 = 80个字节来保存整幅图像。
VC知识库里的这篇文章提供了一个位图操作的类,可以借鉴一下!