存档: 标签: ‘Linux’

让codeigniter在Linux主机运行时忽略url大小写

没有评论 2010年8月9日

codeigniter框架(CI框架)的web应用在Linux主机里运行,会发现其对url的大小写很敏感。尤其是针对控制器的路由上。其实其他的一些web应用程序及框架可能也有这样的问题。

基本原因是CI框架在路由的时候,其实是通过地址判断文件是否存在,从而决定加载。同时Linux系统对文件名有大小写区分。
于是在地址栏里输入http://yoursite.com/Hello/hell的时候,打开的是一个名叫Hello的控制器,而同时加载的是controller下的Hello.php这个文件,如果你的文件名是hello.php,那么肯定就有404的错误。同样的如果你的控制器文件名字是hello.php,而你的地址是http://yoursite.com/Hello/hell,其要寻找的控制器文件Hello.php的时候自然就会判定不存在。

解决方法很简单,就是在system/libraries里的Router文件里加一条强制将控制器转化为小写的语句。然后将所有的控制器文件名改为小写(注意是文件名,不是类的名字)。
因为是修改框架本身的源文件,所以请备份好原文件。

1. 具体如下,找到system/libraries里的Router文件,修改源文件:

//找到 function _validate_request

	function _validate_request($segments)
	{
		//增加下面这一句,其实就是强制将控制器名字转化为小写
                $segments[0] = strtolower($segments[0]);

		// Does the requested controller exist in the root folder?
		if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
		{
			return $segments;
		}

2. 将controllers文件夹下的文件都用小写的文件名,这也是codeigniter推荐的命名方式。

其实很多时候codeigniter并不推荐修改源文件,但是个人觉得这个方法最直接最有效,若有其他的方法,请留言告知,谢谢。

fcitx的配置及美化

没有评论 2010年6月21日

备份下我的fcitx的配置及美化,方便以后使用。

###fcitx配置文件

[程序]
显示字体(中)=WenQuanYi Micro Hei
显示字体(英)=Luxi Sans
显示字体大小=12
主窗口字体大小=9
字体区域=zh_CN.UTF-8
使用AA字体=1
使用粗体=1
使用托盘图标=1

[输出]
数字后跟半角符号=1
Enter键行为=2
分号键行为=2
大写字母输入英文=1
转换英文中的标点=1
联想方式禁止翻页=1

[界面]
候选词个数=9
主窗口是否使用3D界面=0
输入条使用3D界面=0
主窗口隐藏模式=1
显示虚拟键盘=0
是否自动隐藏输入条=1
输入条是否居中=0
首次显示输入条=1
#输入条固定宽度(仅适用于码表输入法),0表示不固定宽度
输入条固定宽度=0
输入条偏移量X=0
输入条偏移量Y=12
序号后加点=1
显示打字速度=1
显示版本=0
光标色=102 159 66
主窗口背景色=255 255 255
主窗口线条色=203 202 186
主窗口输入法名称色=153 153 153 102 159 66 56 134 230
输入窗背景色=255 255 255
输入窗提示色=2 89 196
输入窗用户输入色=255 0 132
输入窗序号色=0 66 200
输入窗第一个候选字色=0 99 200
#该颜色值只用于拼音中的用户自造词
输入窗用户词组色=0 99 200
输入窗提示编码色=255 0 132
#五笔、拼音的单字/系统词组均使用该颜色
输入窗其它文本色=56 134 230
输入窗线条色=203 202 186
输入窗箭头色=193 227 151
虚拟键盘窗背景色=220 220 220
虚拟键盘窗字母色=80 0 0
虚拟键盘窗符号色=0 0 0

# 除了“中英文快速切换键”外,其它的热键均可设置为两个,中间用空格分隔
[热键]
打开/关闭输入法=CTRL_SPACE
# 中英文快速切换键 可以设置为L_CTRL R_CTRL L_SHIFT R_SHIFT L_SUPER R_SUPER
中英文快速切换键=L_SHIFT
双击中英文切换=0
击键时间间隔=250
光标跟随=CTRL_K
隐藏主窗口=CTRL_ALT_H
切换虚拟键盘=CTRL_ALT_K
GBK支持=CTRL_M
GBK繁体切换键=CTRL_ALT_F
联想=CTRL_L
反查拼音=CTRL_ALT_E
全半角=SHIFT_SPACE
中文标点=ALT_SPACE
上一页=,
下一页=.
第二三候选词选择键=0

[输入法]
使用拼音=1
拼音名称=智能拼音
使用双拼=0
双拼名称=智能双拼
默认双拼方案=自然码
使用区位=0
区位名称=区位
使用码表=0
提示词库中的词组=1
其他输入法=

[拼音]
使用全拼=0
拼音自动组词=1
保存自动组词=0
增加拼音常用字=CTRL_8
删除拼音常用字=CTRL_7
删除拼音用户词组=CTRL_DELETE
# 拼音以词定字键,等号后面紧接键,不要有空格
拼音以词定字键=[]
# 重码调整方式说明:0-->不调整  1-->快速调整  2-->按频率调整
拼音单字重码调整方式=2
拼音词组重码调整方式=1
拼音常用词重码调整方式=0
模糊an和ang=0
模糊en和eng=0
模糊ian和iang=0
模糊in和ing=0
模糊ou和u=0
模糊uan和uang=0
模糊c和ch=0
模糊f和h=0
模糊l和n=0
模糊s和sh=0
模糊z和zh=0

让nvidia显卡在Linux下正常驱动

没有评论 2010年5月5日

ubuntu从9.10升级到10.04后不能开启特效。
nvidia-settings的面板里能看到显卡和具体配置,却无法开启特效。
提示的错误是:no device
完全卸载了驱动并重新安装了闭源驱动,并执行sudo nvidia-xconfig依旧如此无效。

估计是xorg.conf的原因,后来对比了几次nvidia-xconfig生成的xorg.conf,发现原来这个文件并没被重写,新生成的文件和之前的完全一样(新文件和备份文件没区别)。
想了下,之前nvidia-settings里的可以读取到xorg.conf的文件,而nvidia-xconfig就是将nvidia-settings里读取的配置直接保存为当前的xorg.conf。那么不管是升级还是什么情况造成xorg.conf出错,只要nvidia-settings可以读取文件,最后nvidia-xconfig都将错误的配置生成错误的xorg.conf。

索性删除xorg.conf文件,重新生成。
成功开启特效。

不知道这个算不算是nvidia-xconfig的bug。至少我觉得这个命令应该是直接重置复写吧,不然备份的意义何在。
也不知道这个方法算不算解决nvidia显卡在ubuntu等Linux下无法驱动的一个方法。
反正记录下,备查。

解决mplayer中文字幕显示乱码与ibus不能输入中文

没有评论 2009年12月30日

解决mplayer中文字幕显示乱码

忘记啥时候开始,我的mplayer显示中文字幕是乱码,其实也不完全叫做乱码就是所有字幕只显示一根横线偶尔能显示正确的数字,而我的mplayer的配置文件很久都没改动过了,配置文件的内容也是这种网上能找到的:
在mplayer得gui界面点击右键打开配置,字幕选项卡下设置Encoding为cp936;在字体选项卡下设置中文字体,并使用Encoding为Unicode。
当上面的方法无效时,请输入

locale

查看下LC_CTYPE是否为zh_CN.*,如果不是请打开”/etc/environment”,修改或添加

LC_CTYPE="zh_CN.UTF-8"

我也是在前段时间更换系统字体的时候,发现很多字体在全英文界面下表现很不错,这时我才反应过来,我使用的英文操作系统,虽然有中文语言包,但是locale的设置应该全是en_US.UTF-8,估计是LC_CTYPE的原因造成的,于是在/etc/environment里加了一段LC_CTYPE=”zh_CN.UTF-8″便解决中文字幕乱码(其实该说是横码)问题。

解决ibus不能输入中文

同时得以解决的是ibus拼音输入法有时不能输入中文的问题。之前ibus拼音输入法动不动就会“失灵”,没法输入中文,状态条直接消失不见。
我估计的原因是,ibus只是一个输入法框架,它会为各种语言输入提供一个基础,其中包括英文,所以LC_CTYPE为en_US.UTF-8的时候能启动ibus,但是在具体负责中文输入的还是ibus-pinyin这个模块,就是说最后中文输入法还是得和LC_CTYPE挂上勾,还是要设置为zh_CN.*。

为gtk程序实现国际化和本地化

1条评论 2009年12月22日

这是一个学习笔记,内容是在Linux系统下以一个简单的gtk程序为基础,为其添加对i18n和l10n的支持。从而了解怎么实现gtk程序的国际化和本地化。

基本的概念

  • 什么是i18n,i18n是internationalization的简称,指程序能提供不同语言显示的国际化支持。
  • 什么是l10n,l10n是localization的简称,指程序的能拥有某一特定语言支持的本地化。

更多的信息可以自行google或者参看一下这里 http://www.linuxforum.net/doc/i18n-new.html

  • 基本原则:标记代码中用户在程序使用过程可见的字符串。
  • 基本原理:整个过程是代码中使用 _()和N_()的方式来标记你需要翻译的字符串(即用户在使用过程可见的字符串),提取并翻译这些字符串后,将其单独格式化,存放到语言文件夹。

国际化

  1. 首先寻找你要翻译的字符串
  2. 然后gettext()函数将需要翻译的字符串进行标记
  3. 进行编译

本地化

  1. 提取被比较的字符串
  2. 进行翻译
  3. 格式化
  4. 将文件存放到本地文件夹

国际化具体过程

我们先来看看gtk程序的国际化。
首先是在需要提供国际化的程序代码里增加一些我们将要用到的库和申明。

//要包含一个头文件。
#include    <glib/gi18n.h>    //versions 2.4及更高版本使用

//同时需要一些基本的申明。
#define  GETTEXT_PACKAGE    "Hello_I18n" // 可以换成你需要的名字
#define  LOCALEDIR    "mo"        //定义本地语言文件存放路径

//以及对gettext()进行初始化
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);

现在可以对我们代码中需要翻译的字符串进行标记了。
例:
原代码如下

gtk_window_set_title(GTK_WINDOW(window),  "Hello I18n!");

需要标记的字符串为“Hello I18n!”,上面的语句说明了在程序的标题栏里要显示的字符串为“Hello I18n!”,那么需要将上面的语句改为下面这样:

gtk_window_set_title(GTK_WINDOW(window),  _("Hello I18n!"));

但是如果我们要对静态字符串进行标记的话,就要使用另一种方式N_().
例:

const char *warning = "The alien is behind you! \n";

我们需要将其改为:

const char *warning = N_("The alien is behind you! \n");

就这样我们完成了程序的国际化,你可以编译你的程序。

本地化具体过程

而做完国际化后,我们需要做的是本地化。
在终端下面通过xgettext命令,我们可以将我们代码test.c中标记的字符串提取出来并保存在test.po里:

xgettext -a -o test.po test.c

我们打开test.po可以看见一些信息
例如:

msgid "test.\n"
msgstr ""

那么我们本地化就是对这样的字符串根据不同的地区语言进行翻译,例如我们的中文:

msgid "test.\n"
msgstr "测试。\n"

并且修改

charset=CHARSET\n

charset=utf-8\n

然后保存。
接下来格式化文件:

msgfmt -o test.mo test.po

然后将test.mo文件复制到LOCALEDIR下面对应的文件夹里。例如,我们在前面的例子里定义LOCALEDIR为mo。

cp test.mo mo/zh_CN/LC_MESSAGES

现在如果我们的LC_ALL为zh_CN,那么我们如果执行这个程序,就可以看见中文了。而不是原来的英文或者其他语言。

一个国际化以后的简单例子:

#include    <gtk/gtk.h>
#include    <glib/gi18n.h>

#define GETTEXT_PACKAGE    "Test"
#define LOCALEDIR    "mo"

int main ( int   argc,
 char *argv[] )
{
 GtkWidget *frame;
 GtkWidget *label;

 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
 textdomain(GETTEXT_PACKAGE);

 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
 gtk_window_set_title(GTK_WINDOW(window),  _("Hello I18n!"));
 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
 g_signal_connect(G_OBJECT(window), "destroy",
 G_CALLBACK(gtk_main_quit),
 NULL);
 gtk_container_set_border_width(GTK_CONTAINER(window), 10);
 frame = gtk_frame_new(_("WARNING"));
 label = gtk_label_new(_("\n  The alien is behind you!\n"));
 gtk_container_add(GTK_CONTAINER(frame), label);
 gtk_container_add(window, frame);
 gtk_widget_show_all(window);
}

清理电脑里的文件时发现的笔记,写了有些年头了,而现在,似乎大家都用python在写gtk的程序了。
P.S 有时做一些贡献很简单,比如为自己喜欢的软件实现本地化。