年初,用mediawiki搭建了公司内部文档系统,用到现在,wiki还是不利于协作,找几个groupware研究研究。G一下,有小杜学习笔记的一篇开源Groupware软件试用手记 里面推荐使用 egroupware。
打开下载页面 http://www.egroupware.org/download,怎么有个 trial for 30 days,傻眼了几分钟,网上不是说免费的么?原来免费版本在下边有 sourceforge.net字样的连接,发现长时间呆在电脑旁,人都变傻了。
按照安装提示,填好一些选项,生成header.inc.php 文件,并修改文件权限
chmod 700 header.inc.php
设置检查页面发现session无法读写,修改为 apache user即可。
sudo chown deli:deli /var/lib/php/session
装完后,发现需要个中文语言包,原来不需要特别下载,访问 setup 目录,进入设置界面,修改语言。
遇到一些问题:
点 通讯录标签,页面空白,看了log:
[Mon Aug 30 16:21:05 2010] [notice] child pid 3045 exit signal Segmentation fault (11)
有时间再debug它。还在玩玩中,觉得ok才在公司推广使用。
下午试用了一下 大名鼎鼎的basecamp,发现商业的比较好用
恨不能自己亲自动手写一个,呵呵。一个买3k,卖出10k套,噢~~ 不好意思,哪有这么好的事,刚才做了个白日梦。
官方网 说只要60秒安装。我是照这个 http://www.hdlfactory.com/~filmil/fedora/installing-distcc-and-distccd-on-fedora-11.htm 操作,没遇到什么困难。
我的两台测试机器配置:
[deli@athena ~]$ lscpu
Architecture: i686
CPU(s): 2
Thread(s) per core: 1
Core(s) per socket: 2
CPU socket(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 23
Stepping: 10
CPU MHz: 2799.526
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 3072K
[deli@athena ~]$ free -m
total used free shared buffers cached
Mem: 1979 1820 159 0 360 879
-/+ buffers/cache: 580 1399
Swap: 2047 170 1877
下载Apache 2.2.16版本来测试,结果如下:
$ time make -j 8
...
make[1]: Leaving directory `/home/deli/Downloads/httpd-2.2.16'
real 0m37.824s
user 0m31.640s
sys 0m22.350s
[deli@athena httpd-2.2.16]$
$ time make -j 2
...
make[1]: Leaving directory `/home/deli/Downloads/httpd-2.2.16'
real 0m50.855s
user 0m43.442s
sys 0m22.492s
效果比较明显,正在研究如何分布式编译Android的代码。有个哥们写了在Ubuntu分布式编译Android的教程 http://mcuos.com/thread-5339-1-1.html ,写不够详细,看得不是很明白,还是先把概念弄清楚再动手吧。
从2.1 到 Android 2.2(Froyo),变化是蛮大的,Android 2.1 安装market,需要装一大驼的东东:
/etc/permissions/com.google.android.datamessaging.xml
/etc/permissions/com.google.android.gtalkservice.xml
/system/framework/com.google.android.gtalkservice.jar
/system/app/EnhancedGoogleSearchProvider.apk
/system/app/GoogleCheckin.apk
/system/app/GoogleApps.apk
/system/app/gtalkservice.apk
/system/app/SetupWizard.apk
/system/app/Vending.apk
/system/app/TalkProvider.apk
到了 2.2 只用两个包就搞定:
/system/app/GoogleServicesFramework.apk
/system/app/Vending.apk
第一个,美其名曰:Google服务框架,整合了很多东西,2.1版本的Vending.apk login部分,也整合到了GoogleServicesFramework.apk,系统更新也在这包里。
具体的包,网上搜 Android 2.2的ROM,多的是。中间遇到了一个问题,就是无法建立帐号,在添加帐号,点公司/Goolge 这两项都无响应,开始怀疑是AccountAndSyncSettings.apk 这个包有问题。后面查出打开wifi后,kernel没有上报消息,状态栏没显示wifi的图标。
Posted in Android
|
Tagged Market
|
Android market里软件列表,每页显示10条记录,没有显示上一页,下一页的按钮,依靠手滑动动态加载数据,当向下滚动时,最下边显示 Loading… 。数据加载结束,Loading底栏消失。

关于ListView的分段显示,有现成的库可用,比如 cwac-endless, 这个库不好之处,就是底部Loading的View无法定制。还有一个在google code上的androidpageablelistview 这个可以实现基本的分页,有手动操作显示上一页,下一页的按钮。
实现思路如下:
自定义 footer view, list_footer.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:gravity="center_vertical|center_horizontal"
android:orientation="horizontal"
android:id="@+id/loading_more"
android:visibility="gone"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
>
<ProgressBar
android:id="@+android:id/progress_large"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:indeterminate="true"
style="?android:attr/progressBarStyleSmall"
>
</ProgressBar>
<TextView
android:id="@+id/loading_msg"
android:paddingLeft="6.0dip"
android:paddingTop="2.0dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="1.0dip"
android:text="@string/loading"
>
</TextView>
</LinearLayout>
</LinearLayout>
用到 ListView addFooterView/removeView 这两个函数。
伪代码 (Pseudocode):
private ListView mListView;
private View mFooterView;
private OnScrollListener mOnListViewScrollListener;
mListView.addFooterView(mFooterView);
mListView.removeView(mFooterView);
mListView.setOnScrollListener(mOnListViewScrollListener);
mOnListViewScrollListener = new OnScrollListener() {
public void onScroll(AbsListView view, int firstCell, int cellCount,
int itemCount) {
if (firstCell != mFirstCell) {
// balabala
}
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
// Do nothing
}
};
在onScroll里要处理检查是否还有新的记录,如果有,调用addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了, 把自定义的mFooterView去掉。这里没有重写onScrollStateChanged函数,那么在onScroll就需要一个外部变量mFirstCell记录滑动位置。
再看看QQ空间体验版 for Android 是如何实现的,不用多说,show me the code:
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
shouldRefresh = false;
if (firstVisibleItem + visibleItemCount == totalItemCount) {
if (bHaveMore()) {
if (list.getFooterViewsCount() == 0) {
addRefreshfoot();
} else {
shouldRefresh = true;
}
}
}
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (shouldRefresh && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
if (isRefreshing == false) {
isRefreshing = true;
getMoreList();
}
}
}
Posted in Android
|
Tagged ListView, Loading
|
在前面写过一篇 《 Android Market的 Loading效果》,有贴出ProgressBar的图片,圆形的环是橙黄色的,从Android 2.0后,UI发生了变化,见下图。
拿QQ空间来做例子吧:
非常的简单,新建一个styles.xml文件,
<?xml version=”1.0″ encoding=”UTF-8″?>
<resources>
<style name=”qZoneListProgressStyle” parent=”@android:style/Widget.ProgressBar.Small”>
<item name=”android:indeterminateDrawable”>@anim/loading</item>
</style>
</resources>
写了个简单的示范例子,代码:qzoneLoading.tar,效果图为:

留意了一下UC浏览器的进度loading:
开始也以为是修改styles即可,反编译一下,才知道是在新建一个DrawWaitingPage.java类绘画. 大概是用到Paint,Canvas,Timer之类的,自定义一个View。
Posted in Android
|
Tagged Loading
|