作者归档:贺 利华

关于贺 利华

正在学习编程,享受编程 热爱文学,闲来读读《读库》 有思想,没理想 正在学会专注

Ubuntu 10.04 Reciteword发声问题解决方法

之前在学校时候学习使用Ubuntu时使用过一个非常优秀的软件那就是Reciteword,俗称黑客背单词,认识这款软件是因为自己在Ubuntu下使用的字典软件是stardict,这两款软件的作者是同一个,作者名字叫胡正

最近一段时间里工作上和家里都使用的Ubuntu,又想起了这款优秀的软件,那么好吧,我们这就开始安装吧,这里有一篇文章非常的详细,你只要按照这个流程安装,肯定成功。

但是在安装之后我们很有可能碰到不能正常发声的问题,那么我们如何解决这个问题呢?我在网上搜了一些相关的资料,自己一一尝试验证之后,发现这个法子很不错。

那就是在启动reciteword命令前,加上esound -noterminate -nobeeps &,也就是在终端中启动reciteword的命令应该是这样的esound -noterminate -nobeeps & reciteword,但是这样肯定是不方便的。那么我们可以这么做,也就是通过编辑/etc/esound/esd.conf文件来达成目的

例如我的/etc/esound/esd.conf文件内容如下:

[esd]

# autospawning is not recommended, since it can’t really be done
# right.  If you want your login session to be using a sound daemon,
# you should start it from the session controller, not some random
# app inside.
auto_spawn=1
spawn_options=-noterminate -nobeeps -as 2
spawn_wait_ms=100
# default options are used in spawned and non-spawned mode
default_options=2

修改该文件之后再次启动reciteword,就能正常发声了,但是还有一个问题,那就是你单击软件界面中的朗读按钮,软件并不会正常的朗读单词,在测试的过程中,如果你输入单词的速度很快的话,软件发出的那种老式打字机金属敲击的声音并不能跟上你的节奏,我想应该是esound自动多音频流播放的问题吧,解决方案参考了这篇文章这篇文章。

听说有alsa版本的,哪天试一试看看如何,嘿嘿,希望本文能对你有所帮助。

==========================更新=============================

在Ubuntu 10.04下编译可能会出现一个错误

bookfile.cpp: In function ‘gchar* rw_book_get_value(const gchar*, gchar*, gint)’:

在bookfile.cpp文件中找到原来的 tmp1 = strstr (str1, str2);

改为    tmp1 = (gchar*)strstr (str1, str2);

Ubuntu下让Air程序TweetDeck成功使用代理发推

在使用Ubuntu的过程中自己有一些需求,例如使用Twitter客户端发推,发现目前没有哪个程序中有设置代理这么一项,真是杯具啊,生活在天朝我们拥有很多的杯具,那么如何解决这个问题呢。在网上搜了一下,有一个哥们的方法很好很给力,例如我们将程序安装到/opt/TweetDeck目录下,那么我们可以在终端中以这样的命令启动程序,export http_proxy=http://127.0.0.1:1984/ && exec /opt/TweetDeck/bin/TweetDeck,如此就可以穿越我们伟大的GFW了,如果你觉得每次都这样非常不方便的话,那么我们将其做成shell文件即可。

1. 创建脚本,名为TweetDeck,sudo vim /usr/bin/TweetDeck

2 .脚本内容为:

#!/bin/bash
export http_proxy=http://127.0.0.1:1984/ #这是因为我使用的是Puff,其他http代理应该是一样的

exec /opt/TweetDeck/bin/TweetDeck

3. 将shell文件的权限改为可执行,sudo chmod +x /usr/bin/TweetDeck

之后你就可以顺利的从命令行启动你的客户端了,当然如果你想将主菜单以及桌面上的快捷方式也顺便修改一下的话,那么可以通过System->Preferences->Main Menu->Applications->Accessories->TweetDeck,找打你需要修改的项,然后选中Properties,找到Command选项,将Command指向刚才咱们创建的shell文件/usr/bin/TweetDeck即可,同理桌面程序启动器也可以通过其Properties中的Command子项来修改其启动的命令。

这样你就可以畅通无阻的开始在墙外的世界使劲推了。

上个图吧,:-)

TweetDeck截图

TweetDeck截图

中秋祝语(程序员版)

有的女人就像Windows 虽然很优秀,但是安全隐患太大。
有的女人就像UNIX  她条件很好,然而不是谁都能玩的起。
有的女人就像C# 长的很漂亮,但是家务活不行。
有的女人就像C++,她会默默的为你做很多的事情。
有的女人就像JAVA,只需一点付出她就会为你到处服务。
有的女人就像JAVA script,虽然对她处处小心但最终还是没有结果。
有的女人就像汇编 虽然很麻烦,但是有的时候还得求它。
有的女人就像 SQL,她会为你的发展带来莫大的帮助。
爱情就是死循环,一旦执行就陷进去了。
爱上一个人,就是内存泄露,你永远释放不了。
真正爱上一个人的时候,那就是常量限定,永远不会改变。
女朋友就是私有变量,只有我这个类才能调用。
情人就是指针用的时候一定要注意,要不然就带来巨大的灾难
祝各位在编程第一线的童鞋们,中秋快乐~

===========该文从某个QQ群中获得==================

Android中自定义ListView无法响应OnItemClickListener中的onItemClick方法问题解决方案

在Android软件设计与实现中我们通常都会使用到ListView这个控件,系统有一些预置的Adapter可以使用,例如SimpleAdapter和ArrayAdapter,但是总是会有一些情况我们需要通过自定义ListView来实现一些效果,那么在这个时候,我们通常会碰到自定义ListView无法选中整个ListViewItem的情况,也就是无法响应ListView的onItemClickListener中的onItemClick()方法,究竟是为什么呢?我之前也在网上查过不少的资料,但是没有发现什么有价值的文章,有一些是建议在Adapter的getView方法中对自己需要响应单击事件的控件进行设置。但是最终的效果并不是特别理想,而且我认为这是一种取巧的方式,并不推荐。之后自己查看了一下ViewGroup的源码,发现了以下的一段常量声明:

/**
* This view will get focus before any of its descendants.
*/
public static final int FOCUS_BEFORE_DESCENDANTS = 0x20000;
/**
* This view will get focus only if none of its descendants want it.
*/
public static final int FOCUS_AFTER_DESCENDANTS = 0x40000;
/**
* This view will block any of its descendants from getting focus, even
* if they are focusable.
*/
public static final int FOCUS_BLOCK_DESCENDANTS = 0x60000;

/**     * This view will get focus before any of its descendants.     */

public static final int FOCUS_BEFORE_DESCENDANTS = 0x20000;
/**     * This view will get focus only if none of its descendants want it.     */

public static final int FOCUS_AFTER_DESCENDANTS = 0x40000;
/**     * This view will block any of its descendants from getting focus, even     * if they are focusable.     */

public static final int FOCUS_BLOCK_DESCENDANTS = 0x60000;

我们看到了一行代码定义的变量的意思是“当前View将屏蔽他所有子控件的Focus状态,即便这些子控件是可以Focus的”,其实这段话的意思就是这个变量代表着当前的View将不顾其子控件是否可以Focus自身接管了所有的Focus,通常默认能获得focus的控件有Button,Checkable继承来的所有控件,这就意味着如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了,也就会响应onItemClickListener中的onItemClick()方法,然而将ListView的Item Layout的子控件focusable属性设置为false有点繁琐,我们可以通过对Item Layout的根控件设置其android:descendantFocusability=”blocksDescendant”即可,这样Item Layout就屏蔽了所有子控件获取Focus的权限,不需要针对Item Layout中的每一个控件重新设置focusable属性了,如此就可以顺利的响应onItemClickListener中的onItenClick()方法了。

Android TabActivity无法正常bindService解决方法

在Android开发的过程中,我们很有可能会使用到TabActivity来进行开发,而如果你的程序中需要针对TabActivity的TabHost中的每一个Activity绑定一个Service,通常我们的做法是在对应Tab页的Activity的onCreate()方法中进行bind操作,但是通过实践表明这个方法是无法达到绑定效果,在网上查了一下,发现在Google Android Issue中有这个缺陷,缺陷详细信息在这里(Google Android Issue 2483),三楼的oliver给出了正解

Using getApplicationContext().bindService instead of just bindService on your activity solves the problem as it is using the higher level application context.

也就是在TabActivy的TabHost中的Activity如果需要bindService的话,需要先调用getApplicationContext()获取其所属的Activity的上下文环境才能正常bindService,也就是在onCreate()方法中使用this.getApplicationContext().bindService([args…])就可以了,否则bindService将永远失败返回false。具体的代码并没有去查看,先记录一下吧。

====================明天是个好天气=======================