关于Ubuntu上的字体

最近下定决心把Windows桌面换成了Linux,准确的说是LinuxMint
原因很多,有几点比较突出:
1、Windows下面的Android模拟器运行速度不佳
2、比较喜欢Ubuntu下面的字体,在看网页的时候效果很不错
3、vi、emacs

不过,这些跟Ubuntu上的字体有什么关系?
故事是这样的:
KDE桌面一直被传的有多么多么优秀,今天特意想尝试一番,在Ubuntu上安装KDE桌面,当然是选kubuntu啦,怎么安装就不打算在这里说了,网上一搜一大把解决方案。
在顺利安装KDE桌面以后,问题就来了,之前浏览器那么舒服的字体变糊了,所以今天也找了一堆这方面的资料,比如:
ubuntu chrome字体发虚修复
http://goo.gl/sX9yi
10.10卸载KDE后Firefox字体丑陋
http://forum.ubuntu.com.cn/viewtopic.php?f=8&t=300276
还有怎么完全卸载KDE桌面之类的问题,这里有一个比较土的办法:
sudo apt-get autoremove kde [tab][tab]
然后出来这么一堆:

kde-baseapps-bin kdenetwork-filesharing
kde-config-gtk kdepim-groupware
kde-config-touchpad kdepim-kresources
kdegraphics-strigi-analyzer kdepim-runtime
kde-l10n-engb kde-runtime
kde-l10n-zhcn kde-runtime-data
kdelibs5-data kde-window-manager
kdelibs5-plugins kde-workspace-bin
kdelibs-bin kde-workspace-data
kdemultimedia-kio-plugins kde-zeroconf

选择输入这个即可卸载KDE桌面的核心内容:
sudo apt-get autoremove kde-runtime
ps:现在特别讨厌kubuntu,谁叫它把那什么字体显示搞的乱七八糟的呢,:-)
由于问题没处理到关键点上,所以上面方案全部都是浮云一般,后来多亏这个:
Ubuntu 字体发虚的问题
http://hi.baidu.com/kfctime/blog/item/dd46ae35aa692280a71e1273.html
就是把$HOME/.fonts.conf删除掉,注销一下,然后字体发虚的问题就没有了!
之前折腾那么多,最后就让这么一句简单的命令就给全盘否定了…

其实平时我们在处理问题的时候经常会遇到类似这种情况,一个问题来了,很多时候我们没能冷静下来去寻找“病因”,而是一味的盲目去“解决问题”,当把自己折腾的快崩溃的时候,运气好的话,偶然发现一个非常简单的解决方法,然后尽发感慨:原来就这么一回事啊!!

是啊,原本就这么一回事,为何要把它想的那么复杂呢?

在Mac上使用tree命令

tree在终端上能够很好的显示一个目录的文件结构,有的时候非常实用,在Ubuntu上安装非常方便
sudo apt-get install tree
在终端下查看一个文件夹的目录结构,效果如:

nerdtree
├── doc
│   └── NERD_tree.txt
├── nerdtree_plugin
│   ├── exec_menuitem.vim
│   └── fs_menu.vim
├── plugin
│   └── NERD_tree.vim
└── syntax
└── nerdtree.vim

那么,如何在Mac下使用tree呢?
这里列举两种比较实用的方法:
1、通过tree源码编译安装
下载源码:curl -O ftp://mama.indstate.edu/linux/tree/tree-1.6.0.tgz
解压源码:tar xzvf tree-1.6.0.tgz
修改Makefile文件:
tree默认的是linux的编译环境,因此移植到mac里面需要注释掉linux的编译选项,换成mac的编译选项
直接vim Makefile这个文件

# Linux defaults:
#CFLAGS=-ggdb -Wall -DLINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
#CFLAGS=-O4 -Wall -DLINUX -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
#LDFLAGS=-s
启用mac的编译
# Uncomment for OS X:
CC=cc
CFLAGS=-O2 -Wall -fomit-frame-pointer -no-cpp-precomp
LDFLAGS=
OBJS+=strverscmp.o

接下来 make 然后 make install 就可以了,make install的时候注意权限,不然会提示安装失败!
参考:http://www.fly3q.com/2011/08/mac-command-to-also-spend-tree.html
2、通过brew安装
brew install tree
当然,首先你的Mac得安装好了brew!
brew的安装:https://github.com/mxcl/homebrew/wiki/installation
差不多,OK!

#Android# 关于多层嵌套Tab选项卡式布局中弹出Dialog的注意事项

情景:
若有一嵌套Tab选项卡式布局实现是这样的:最外层是一个ActivityGroup,ActivityGroup中又嵌套有Tab选项卡,选项卡中来回切换的View是Activity,若最里面的其中一个Activity中有一个ListView,在ListView中很常见的操作方式有单击item和长按item等操作(其实Android系统的通讯录就是一个很好的例子),现有需求:长按item需要出现一个弹出框。这个时候,若是不注意细节,报个异常太正常了!
分析:
需要注意的是,AlertDialog.Builder dialog = new AlertDialog.Builder(Context context);这个Context必须得是Activity,如果你是类似这种写法:

Context mContext = getApplicationContext();
Dialog dialog = new Dialog(mContext);
dialog.setContentView(R.layout.custom_dialog);
dialog.setTitle("Custom Dialog");

那么,你会看到一串很熟悉的异常信息:

Uncaught handler: thread main exiting due to uncaught exception
android.view.WindowManager$BadTokenException: Unable to add window — token null is not for an application

原因,相信看异常信息也能大概明白,这里可以看看文档中的内容:

public Dialog (Context context)
Since: API Level 1
Create a Dialog window that uses the default dialog frame style.
Parameters
context The Context the Dialog is to run it. In particular, it uses the window manager and theme in this context to present its UI.

http://developer.android.com/reference/android/app/Dialog.html
另外,在以上的情景中,Context还不能是ActivityGroup下面的子Activity,而应该是最外层的这个ActivityGroup本身,否则也会引发异常!
拓展:
上面提到了单击和长按的两种常见操作方式,那么有假如ListView这么一段代码:

mListView.setOnItemLongClickListener(new OnItemLongClickListener() {

	@Override
	public boolean onItemLongClick(AdapterView<?> parent, View view,
			int position, long id) {
		...
		return true;
	}
});

这里面,我之前有点模糊的就是那个return的值,true/false到底区别在哪里?后来通过自己测试了以后算是弄清楚了区别,其实,它类似于WPF中的事件路由。
若该ListView单击和长按都要调用相关的方法,长按操作其实也有单击那么一下动作,那这个时候,那个return的值就起决定作用了,若为true,那么长按以后,单击事件就不执行了,若为false,长按、单击都执行,在实际场景中,一般不会有用false的那种情况!
推荐阅读:
Android中GUI系统的Event路由机制
http://blog.csdn.net/seker_xinjian/article/details/6253617
WPF事件路由
http://syxc.iteye.com/blog/856140

#HTML5# 整理一些HTML5资料

开始考虑研究HTML5了,特意整理一些有关HTML5、Web App相关的资源,方便日后查阅:
Google推出的HTML5rocks
http://www.html5rocks.com/en/
HTML5 and web standards
http://www.apple.com/html5/
IE testdrive
http://ie.microsoft.com/testdrive/
http://html5labs.interoperabilitybridges.com/
Mozilla
https://developer.mozilla.org/en/HTML/HTML5
Opera
http://dev.opera.com/web
html5demos
http://html5demos.com/
webapptrend
http://www.webapptrend.com/

#Android# Android中将彩色图片转换成灰色

在平时的开发中,经常会遇到需要将一张彩色的图片转换成灰色,如QQ头像(online:彩色,offline:灰色)的处理,Android中可以这样:

/**
 * 转换图片成灰色
 * @param bmpOriginal
 * @return
 */
public static Bitmap toGrayscale(Bitmap bmpOriginal) {
	int width, height;
	height = bmpOriginal.getHeight();
	width = bmpOriginal.getWidth();

	Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,
			Bitmap.Config.RGB_565);
	Canvas c = new Canvas(bmpGrayscale);
	Paint paint = new Paint();
	ColorMatrix cm = new ColorMatrix();
	cm.setSaturation(0);
	ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
	paint.setColorFilter(f);
	c.drawBitmap(bmpOriginal, 0, 0, paint);
	return bmpGrayscale;
}

至于如何获得Bitmap图像,可以试试这个:
BitmapFactory.decodeResource(xx,xx);
Android的ImageView有个setImageBitmap(Bitmap bm);的函数。

#Android# 分享一个问题:在activitygroup中添加一个activity,顶部出现一条黑线

在activitygroup中添加一个activity,顶部出现一条黑线,用setTheme(android.R.style.Theme_Translucent_NoTitleBar_Fullscreen);设置了没效果,有没有用过的?
出自:
http://www.coder007.net/article-134-1.html
解答:
给Application或者该Activity设置一个Theme,添加一项<item name="android:windowContentOverlay">@null</item>即可,实现如下所示:

  • 定义style
  • <style name="CustomTheme" parent="@android:style/Theme.NoTitleBar">
        <item name="android:windowContentOverlay">@null</item>
    </style>
    
  • 添加Theme
  • <activity android:name=".TestActivity"
        android:theme="@style/CustomTheme" />
    

    ok!

    #Android# 一些Android设计规范相关的资料

    最近频繁的在查阅Android设计规范相关的资料,每次Google、百度也挺麻烦的,在此整理一下,图个方便(4.0系统为主)。

    多图详解 “Android UI”设计官方教程
    http://mobile.51cto.com/android-223416.htm
    Android Design
    http://developer.android.com/design/index.html
    Android 设计指南非官方简体中文版
    http://www.topfun.us/adchs/index.html
    Android 4.0设计规范 优先导读 十大改变 (附全文翻译pdf)
    http://cdc.tencent.com/?p=5082
    Android 4.0应用界面设计分析
    http://xdc.baidu.com/?p=1044

    周边资源:
    “少即是多”—UI设计的三大趋势
    http://www.36kr.com/p/84933.html
    Path 2.0的华丽转身
    http://ucdchina.com/snap/11317

    #Android# 获取标题栏和状态栏高度

    获取状态栏高度
    decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。于是,我们就可以算出状态栏的高度了。

    Rect frame = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    int statusBarHeight = frame.top;

    获取标题栏高度
    getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view就是程序不包括标题栏的部分,然后就可以知道标题栏的高度了。

    int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
    // statusBarHeight 是上面所求的状态栏的高度
    int titleBarHeight = contentTop - statusBarHeight;

    From: http://craining.blog.163.com

    #Ubuntu# Ubuntu打包解压命令

    每次要用这当中的一些命令时总是有些记不清楚,现整理一些常用的命令,备忘之:
    .tar
    解包:tar xvf FileName.tar
    打包:tar cvf FileName.tar DirName
    (注:tar是打包,不是压缩!)
    ———————————————
    .gz
    解压1:gunzip FileName.gz
    解压2:gzip -d FileName.gz
    压缩:gzip FileName
    .tar.gz.tgz
    解压:tar zxvf FileName.tar.gz
    压缩:tar zcvf FileName.tar.gz DirName
    ———————————————
    .bz2
    解压1:bzip2 -d FileName.bz2
    解压2:bunzip2 FileName.bz2
    压缩: bzip2 -z FileName
    .tar.bz2
    解压:tar jxvf FileName.tar.bz2
    压缩:tar jcvf FileName.tar.bz2 DirName
    ———————————————
    .bz
    解压1:bzip2 -d FileName.bz
    解压2:bunzip2 FileName.bz
    压缩:未知
    .tar.bz
    解压:tar jxvf FileName.tar.bz
    压缩:未知
    ———————————————
    .Z
    解压:uncompress FileName.Z
    压缩:compress FileName
    .tar.Z
    解压:tar Zxvf FileName.tar.Z
    压缩:tar Zcvf FileName.tar.Z DirName
    ———————————————
    .zip
    解压:unzip FileName.zip
    压缩:zip FileName.zip DirName
    ———————————————
    .rar
    解压:rar x FileName.rar
    压缩:rar a FileName.rar DirName

    rar请到:http://www.rarsoft.com/download.htm 下载!
    解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
    [root@www2 tmp]# cp rar_static /usr/bin/rar
    ———————————————
    .lha
    解压:lha -e FileName.lha
    压缩:lha -a FileName.lha FileName

    lha请到:http://www.infor.kanazawa-it.ac.jp/~ishii/lhaunix/下载!
    >解压后请将lha拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
    [root@www2 tmp]# cp lha /usr/bin/
    ———————————————
    .rpm
    解包:rpm2cpio FileName.rpm | cpio -div
    ———————————————
    .deb
    解包:ar p FileName.deb data.tar.gz | tar zxf -
    ———————————————
    .tar .tgz .tar.gz .tar.Z .tar.bz .tar.bz2 .zip .cpio .rpm .deb .slp .arj .rar .ace .lha .lzh .lzx .lzs .arc .sda .sfx .lnx .zoo .cab .kar .cpt .pit .sit .sea
    解压:sEx x FileName.*
    压缩:sEx a FileName.* FileName

    sEx只是调用相关程序,本身并无压缩、解压功能,请注意!
    sEx请到: http://sourceforge.net/projects/sex下载!
    解压后请将sEx拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
    [root@www2 tmp]# cp sEx /usr/bin/
    From:http://blog.csdn.net/zad522/article/details/2770446