These are blog posts from everyone:
在 Android 平台上,界面元素不能在定时器的响应函数里刷新。 以下这段代码中,mButton 的文本并不变化。 public class AndroidTimerDemo extends Activity { private Button mButton; private Timer mTimer; private TimerTask mTimerTask; /* Called when the activity is first created. / @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton = (Button) findViewById(R.id.Button01); mTimer = new Timer(); mTimerTask = new TimerTask() { @Override public void run() { Log.d("AndroidTimerDemo", "timer"); Calendar cal = Calendar.getInstance(); mButton.setText(cal.toString()); } }; mTimer.schedule(mTimerTask, 1000, 1000); } } 为了达到想要的效果,可以使用 Message Handler。在定时器响应函数里发送条消息,在 Activity 里响应消息并更新文本。 public class AndroidTimerDemo extends Activity { protected static final int UPDATE_TEXT = 0; private Button mButton; private Timer mTimer; private TimerTask mTimerTask; private Handler mHandler; /* Called when the activity is first created. / @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mButton = (Button) findViewById(R.id.Button01); mTimer = new Timer(); mHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case UPDATE_TEXT: Calendar cal = Calendar.getInstance(); mButton.setText(cal.toString()); break; } } }; mTimerTask = new ...
找到软件系统里最费时的代码,是提高系统性能的一个直接方法。 目前各种语言和平台基本上都有相应的工具做这种分析,Android 上也提供了一个 Traceview 工具。 Traceview 工作方式 ------------------- 要使用 Traceview,首先要生成 trace 文件。在需要跟踪的代码开始前调用 Debug. startMethodTracing(),在结束处高用 Debug.stopMethodTracing()。通常可以在 onCreate() 中调用 startMethodTracing(),在 onDestroy() 中调用 stopMethodTracing()。例如: // start tracing to "/sdcard/babytracker.trace" Debug.startMethodTracing("babytracker"); // ... // stop tracing Debug.stopMethodTracing(); 如果是在模拟器上生成 trace 文件,需要先创建一个 sd 文件。 生成 trace 文件后,把文件导出,然后即可用 traceview 工具查看。 其中 Inclusive time 表示函数和被它调用的函数总用时,Exclusive time 表示函数本身用时。 在 startMethodTracing() 调用后,程序的性能会降低,所以不要在最后发行版里使用。不过可以分析出函数的相对用时。
最近在做另一个 Android 项目,经常需要看开发文档。本来 Android 源代码里有文档,但是 Android SDK 自带的库不能指定源代码路径。 当然,先 google 一下。找到了 Eric Burke 的一篇博客。他通过 Android 的源代码,找到了 android.jar 的源码路径,即sdk_dir/sources,只需要把 Android 源码放到该路径,再刷新一下工程,可以直接浏览了! 不过有个问题,Android 的源代码散落在不同的目前,想把它们复制到一个目录不容易。 Dr. Michael Forster的博客给出了一个 Python 脚本来解决这个问题。
Django model 中定义的表名默认显示为英文, 可以通过一个子类 Meta 来控制. 例如: class Bank(models.Model): name = models.CharField(max_length=20, unique=True) class Meta: verbose_name = _("bank") verbose_name_plural = _("banks") Django 文档中的相关描述 ------------------------ verbose_name Options.verbose_name A human-readable name for the object, singular: verbose_name = "pizza" If this isn't given, Django will use a munged version of the class name: CamelCase becomes camel case. verbose_name_plural Options.verbose_name_plural The plural name for the object: verbose_name_plural = "stories" If this isn't given, Django will use verbose_name + "s".
本地网和 VPN 怎么共存 ---------------------- 由于很多原因, 经常会使用 VPN. VPN 有很多优点, 比如安全, 比如可以避开一些不必要的麻烦. 不过 VPN 也带来一些新麻烦, 例如, 访问一些本地服务器速度往往会慢很多. 如何才能让部分数据包走 VPN, 部分走本地网呢? 路由表 ------- 经过分析, 发现一般 VPN 客户端在 VPN 连接建立后, 会修改路由表添加一个默认路由, 让所有的数据包都走 VPN. 如果对路由表进行相应调整, 应该可以达到目的. 实例 ------ 连接 VPN 前的路由表 $ route print ... Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.4 1 127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 169.254.0.0 255.255.0.0 192.168.235.1 192.168.235.1 30 192.168.1.0 255.255.255.0 192.168.1.4 192.168.1.4 20 192.168.1.4 255.255.255.255 127.0.0.1 127.0.0.1 20 192.168.1.255 255.255.255.255 192.168.1.4 192.168.1.4 20 192.168.20.0 255.255.255.0 192.168.20.1 192.168.20.1 20 192.168.20.1 255.255.255.255 127.0.0.1 127.0.0.1 20 192.168.20.255 255.255.255.255 192.168.20.1 192.168.20.1 20 192.168.235.0 255.255.255.0 192.168.235.1 192.168.235.1 20 192.168.235.1 255.255.255.255 127.0.0.1 127.0.0.1 20 192.168.235.255 255.255.255.255 192.168.235.1 192.168.235.1 20 224.0.0.0 240.0.0.0 192.168.1.4 192.168.1.4 20 224.0.0.0 240.0.0.0 192.168.20.1 192.168.20.1 20 224.0.0.0 240.0.0.0 192.168.235.1 192.168.235.1 20 255.255.255.255 255.255.255.255 192.168.1.4 192.168.1.4 1 255.255.255.255 255.255.255.255 192.168.20.1 192.168.20.1 1 255.255.255.255 255.255.255.255 192.168.235.1 6 1 255.255.255.255 255.255.255.255 192.168.235.1 4 1 255.255.255.255 255.255.255.255 192.168.235.1 192.168.235.1 1 255.255.255.255 ...
最近云计算可以说是业界很热门的一个话题, 国内也有不少的公司开始涉足该领域. 不过, 也有不少人对这个新概念理解有点模糊. 到底什么是云计算呢? 这里我基于这几年的一点点经验, 尝试梳理一下. 云计算的定义 ---------- 云计算一种基于互联网的计算机技术. 用户不用关心平台的搭建和管理, 直接通过互联网使用云计算服务提供商提供的各种服务. 一般这些服务规模都是可动态调整的, 并且以虚拟化的资源形式提供. 典型的云计算服务形式包括: * Infrastructure as a Service (IaaS). 如 Amazon Web Services. * Platform as a Service (PaaS). 如 Google App Engine. * Software as a Service (SaaS). 如 Salesforce, 甚至像 gmail, Twitter, Facebook. 云计算的特点 ---------- 总体来说, 客户不再需要自己的物理平台, 而是租用第三方提供的资源, 根据对资源的消费付费. 具体带来的好处有: * 快速部署. 提高重复部署的平台效率, 像扩容护着部署一个类似的新平台会很方便. * 节省费用. 不需要为使用率低的任务购买整个平台. * 客户端不依赖. 可以使用 Web 浏览器来访问服务, 不论是手机还是 PC, 也不论是什么操作系统, 都可以正常访问. * 可靠性. 云集算有平台级的高可用和灾难恢复机制, 应用层几乎不用再关心这些问题. * 可扩展性. 扩展对用户来说完全透明, 可以根据资源的使用情况细粒度扩容. * 安全性. 集中的安全管理, 提高了安全性. * 节能. 在负载低的时段, 可以任务交由部分物理服务器处理, 关闭其他服务器而达到节电的目的. 负载增加后在动态开启服务器. 可见性分类 --------- 公开云 服务通过互联网提供. 复合云 可以同时通过互联网和内部网访问. 私有云 使用云计算解决方案搭建公司内部 IT 平台. 可以获得云计算的大部分优点, 又不用为把关键数据放在第三方担心. 这可能是公司 IT 解决方案的发展方向. 云计算和虚拟化 ------------ 云计算经常和虚拟化一起被人提及, 不过云计算并不一定基于虚拟化技术, 只能说虚拟化技术使得云计算平台搭建变得非常方便, 同时, 虚拟化技术也个云计算带来了一些有趣的新特性. 比如, 采用虚拟化技术可以大幅简化平台搭建过程, 可以提高可靠性, 可以节能. 再比如, 充分利用公司现有 IT 资源, 采用虚拟化技术提供虚拟操作系统作为开发办公使用, 员工只需一台瘦客户机即可, 可以大幅降低公司 PC 采购成本. 相关的虚拟化方案 -------------- 开源社区目前最流行也最稳定的虚拟化解决方案非 Xen 莫属. 目前有多家商业解决方案提供商也采用 Xen 解决方案.
Lycheemap is a map application for android. It's features including: - Online/off-line map browse. - Store the map data on SD card. - Show the current position based GPS module. - Map source switching. - Off-line map data creating. Download -------- apk map db The map data just includes Shenzhen City. Put the data file under iputy/lycheemap directory on the SD card. 荔枝地图 --------- 开始动手做这个地图软件的时候, 正好荔枝上市. 有位同事从老家带了一大包荔枝拿到办公室分享, 遂得名荔枝地图. 荔枝地图 是一个基于Android的地图工具。它的特性包括: - 在线/离线查看地图。 - 根据GPS数据标示当前位置。 - 地图源切换。 - 离线的地图数据制作工具。 下载 ---- apk文件 地图文件 地图文件原始数据从 ditu.google.cn 得来, 版权由谷歌公司所有. 目前只包括了深圳市地图. 地图文件要存放在 SD 卡 iputy/lycheemap 目录下. TODOs ------ - 目前离线地图数据搜索速度还有待提高. - 地图文件是用一个单独的软件制作的, 等有空制作成一个软件包一并发布.
Model(模式,XML数据或者一组API)本身不知道将被怎么使用。实际的算法被委托给 View (视图),也就是 模板。模板方法是MVC的一个子集,不包括C。 在面向对象语言里,首先一个类使用虚函数实现一个基本的算法设计,然后的继承的子类里实现实际的方法。通用算法只实现一次,实际的步骤的具体的子类里修改。 使用: - 让子类实现可变的行为。 - 避免代码重复。找出算法中的通用代码,把变化的部分在子类中实现。 - 控制哪些可以子类化。即哪些可以重载。 例子: .. code-block:: java /** * An abstract class that is common to several games in * which players play against the others, but only one is * playing at a given time. / abstract class Game { protected int playersCount; abstract void initializeGame(); abstract void makePlay(int player); abstract boolean endOfGame(); abstract void printWinner(); / A template method : / final void playOneGame(int playersCount) { this.playersCount = playersCount; initializeGame(); int j = 0; while (!endOfGame()) { makePlay(j); j = (j + 1) % playersCount; } printWinner(); } } //Now we can extend this class in order to implement actual games: class Monopoly extends Game { / Implementation of necessary concrete methods */ void initializeGame() { // Initialize money } void makePlay(int player) { // Process one turn of player } boolean endOfGame() { // Return true of game ...
环境 ==== .. code-block:: bash $ cat /etc/issue Ubuntu 8.10 n l $ dpkg -l |grep ejabberd ii ejabberd 2.0.3-1 ejabberd.cfg ============ .. code-block:: erlang %% Admin user {acl, admin, {user, "tigerz", "localhost"}}. %% Hostname {hosts, ["localhost", "192.168.1.5"]}. %%{odbc_server, {mysql, "server", "database", "username", "password"}}. {odbc_server, {mysql, "localhost", "ejabberd", "root", "xxxxx"}}. web admin ========= Web admin 的登录帐号一定要用JID的格式:username@hostname。在这个配置里要用 tigerz@192.168.1.5。之前只用tigerz一直登录被拒绝。
今天研究了一下 SQLite 查询优化的问题,搜索到了这篇文章: http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html 在最近的一个项目LycheeMap中的一个查询语句中加了“LIMIT 1”, 查询的速度马上有明显的提高. 看来 LIMIT n 意味着找到 n 个符合条件的记录就停止查询, 速度自然比没加要好很多. 5.4. Use LIMIT and OFFSET Sometimes you only need to check to see if there is at least one record that matches some criterion. SQLite doesn't implement the EXISTS keyword, but you can obtain the same result with LIMIT 1. 还有: 5.3. Order subqueries so smaller results are returned first If a query filters by multiple criteria, move the test to the front (left) which has the fewest results. A test which uses an index generally shouldn't be moved behind (to the right of) one which does. 跟我猜想一致.
这两天在看VNC相关的东西,正好工作中也碰到了一个客户端登录时用户名密码验证的讨论,就把VNC中用到的密码验证方法写了下来。 通常VNC服务器会有存有两个密码,一个是完全控制权限的密码,一个是只读权限密码,处理方式完全一样。 - 先随机产生一个16字节的密钥,把这个密钥发给客户端。 - 客户端用这个密钥把明文的密码用DES算法加密,并把加密的结果发给服务器。 - 服务器也用这个密钥对明文的密码用DES算法加密,把密文跟客户端返回的密文比较,如果相同,密码认证通过,否则不通过
随着宽带网的进一步普及,即于互联网业务受众将在逐步增加。特别是针对智能手机的信息服务在将来几年市场规模迅速扩大。随着 AJAX 的发展,宽带信息业务有往纯 WEB 方式发展的趋势。 目前在线的游戏大多是 C/S 结构的,用户必须要在自己的机器上安装一个客户端才能玩,对于 PC 用户来说问题不大,但对智能手机用户就不太方便了。智能手机平台比较多,开发客户端工作量比较大。另外,安装客户端可能会成为一部分潜在用户的门槛。基于 WEB 的解决方案有更好的跨平台性。 功能 ---- - 用户注册、登录、登出。 - 添加、删除好友,屏蔽不受欢迎的人。给好友发在线、离线消息。 - 可公开或隐藏自己的好友列表。 - 与好友玩在线游戏。创建游戏或加入别人创建的游戏。邀请好友参加游戏。 - 写文本的 BLOG。定阅其他用户的 BLOG,在 BLOG 更新后发自动发消息给订阅者。 发展 --- 系统设计 ------
今天妈妈特意打个电话给我,说野芹菜里面有蚂蟥,让我不要吃。 留存供参考。
Symbian C++ Tutorial 塞班 C++ 开发(一),源文件 读本程前请自行安装 Carbide.c++。Symbian 版本为 S60 5th。 源文件 源文件路径 * src: C++ 源文件 * inc: C++ 头文件 * GUI: 图形界面文件 * group: 编译文件 * sis: 片成的目标包和打包文件 Group 目录下有一个 bld.inf 文件,包含了 .mmp 文件,用于编译 Symbian 程序。.pkg 文件包含生成包的指令。 Symbian 用资料文件描述 GUI,扩展名为 .rss。这个文件放在 GUI/data。该文件经过编译生成 .rsc 文件。 另外还有一种头文件扩展名为 .hrh。这种头文件可以在 .cpp 和 .rss 之间共享。 .loc 文件用于放本地化字符串,在 .rss 文件中引用。
inotiy: .. code-block:: python #/usr/bin/env python import os from pyinotify import WatchManager, Notifier, ThreadedNotifier, EventsCodes, ProcessEvent wm = WatchManager() mask = EventsCodes.IN_DELETE | EventsCodes.IN_CREATE # watched events class PTmp(ProcessEvent): def process_IN_CREATE(self, event): print " Create: %s " % os.path.join(event.path, event.name) def process_IN_DELETE(self, event): print " Remove: %s " % os.path.join(event.path, event.name) notifier = Notifier(wm, PTmp()) wdd = wm.add_watch('/tmp', mask, rec=True) while True: # loop forever try : # process the queue of events as explained above notifier.process_events() if notifier.check_events(): # read notified events and enqeue them notifier.read_events() # you can do some tasks here... except KeyboardInterrupt: # destroy the inotify's instance on this interrupt (stop monitoring) notifier.stop() break
不知道为什么,也不知道从什么时候开始,人们都喜欢把人的性格、能力、成就等跟人的长相有意无意的做某种联系或者想像。就像京剧脸谱一样,奸诈之人就是白脸,忠贞之人就是红脸,而张飞就得是个黑脸乱髯的粗汉,云云。 可是事实真的是这样吗? 有没有人想过,可能张飞本是个白面书生呢?在那个年代,交通和通迅都不便利,名人也是靠很多人口耳相传才成为名人,而真正见过名人本尊的少之又少。而张飞素有“猛”的名声,按人们的想当然,被传说成黑脸粗汉也不足为奇。 然兰陵王高长恭为北齐大将,战功累累,却相貌柔美,以至于上阵要戴面具以威吓敌人,完全跟黑脸粗汉不粘边。 所以,威名远播的大将,也有可能是个白面书生。以貌取人不可取。
Exception Value: Incorrect string value: 'xC5x91 sem...' for column 'change_message' at row 1 在 Django admin 中修改表时,遇到这个错误,经 GOOGLE 分析发现是 django_admin_log.change_message 编码没有设置为 UTF8,不支持中文。