Aug 14, 2014
对于django项目中的静态文件,尽管django的建议是让每个app拥有自己的static目录,然后由django将这些静态文件汇总到一起,但我的习惯是将静态文件目录/static/
放在根目录下,即
myproject/
|- manager.py
`- myproject/
|- app1
|- app2
|- static/ <-- 静态文件都放在这里
| |- js/
| `- css/
|- urls.py
|- settings.py
`- ...
这样部署之后可以将static
目录移出项目由nginx单独处理,而开发时就得改下urls.py
使python能处理这些静态文件。
(Read More)
Aug 12, 2014
最近在用RequireJS写一个可复用的UI组件。这个组件会利用RequireJS的模块依赖机制来加载所需的js文件,全部加载结束后,建立一个全局的入口函数供第三方使用,同时触发一个全局的事件,通知第三方入口函数已可以使用了。基本原理如下:
// main.js
requirejs(['app/ui'], function(ui) {
window.showUI = function(container) { // 注册全局入口函数
$(container).showUI();
};
$(document).trigger('uiloaded'); // 通知调用者入口函数可用
});
// app/ui.js
define(['jquery', 'mustache'], function($, mustache) {
...
});
(Read More)
Apr 3, 2014
今天遇到这样一个bug:客户端POST到服务器的一段数据导致服务器端发生未知异常。服务器端确认是编码转换错误。于是截取网络数据包进行分析,发现客户端POST的json数据中包含下面一段(hex形式):
... 61 64 20 b7 20 52 69 63 ...
问题就出在这个b7
上。查阅Unicode代码表后发现,U+00b7
是MIDDLE DOT,它的UTF-8表现形式应该是c2 b7
,但为何客户端发送的数据中它变成了b7
?
(Read More)
Mar 22, 2014
AutoCompleteTextView这个控件用于输入框的自动完成提示,非常适合搜索框等。它本质上是个EditText
,实际上它也是从EditText
继承的,使用起来也十分简单。
使用要点如下:
- 利用
ListAdapter
(一般使用ArrayAdapter
)为AutoCompleteTextView
提供数据,若有需要还可以重载getView()
以自定义列表项的显示方式。这一步同ListView
。
- 如果需要根据输入内容进行动态提示,那么adapter需要实现
Filterable
接口,重载getFilter()
函数实现提示算法。getFilter()
需返回Filter
对象,该对象包含至少两个方法:performFiltering()
在后台执行过滤,publishResults()
在UI线程执行,负责将过滤结果显示到列表中。还有第三个方法convertResultToString()
可以控制用户点击提示时要填充至输入框的文本内容。
示例代码大致如下。
(Read More)
Mar 4, 2014
Sometimes we need to display non printable characters (ASCII code < 32 or ASCII code > 127) for debug reason. Of course we can escape the characters to hexical code, such as '\x0a\x0d'
, but sometimes using “Control Pictures” code page in Unicode might be a better idea, because it requires less screen space.
(Read More)
Feb 18, 2014
所谓配置文件管理,就是在不改变源代码的前提下,拥有两套(甚至多套)配置文件,分别用于开发环境和生产环境,通过命令行选择配置文件。有些框架本身就支持多配置文件,例如Ruby On Rails,nodejs下的expressjs。python下的Flask虽然本身支持配置文件管理, 但单纯使用from_object
和from_envvar
却不是那么方便。有没有更好的办法?
答案是Flask-Environments这个包。它能通过FLASK_ENV
环境变量自动选择开发环境配置或生产环境配置。使用之前要先安装:
$ sudo pip install Flask-Environments
然后修改config.py
,将公用配置和默认配置写入Config
类,针对环境的特殊配置写入各个环境的类:
# config.py
import os
class Config(object):
DEBUG = True
BASEDIR = os.path.abspath(os.path.dirname(__file__))
HOST = '0.0.0.0'
PORT = '8000'
class Development(Config): # inherit from Config
pass
class Production(Config):
DEBUG = False
HOST = '127.0.0.1
PORT = 14000
(Read More)
Feb 10, 2014
有时候Windows下的文件夹/文件的权限设置会弄得乱七八糟的,连自己都不知道哪些文件有特殊权限了,而GUI上又没有明显的办法能清除这些特殊权限的。这时可以试试下面这个命令:
D:\> icacls 文件夹名 /T /Q /C /RESET
(Read More)
Jan 30, 2014
The data encoded in the PDF417 barcode on the back of the driver’s license can be decoded as below.
(Read More)
Jan 28, 2014
关于包
npm install
加上-g
参数可以全局安装,否则安装到当前目录下的node_module
里。
$ npm install -g <pkg_name>
全局和局部安装的区别:全局会注册PATH
变量但不能直接require
;局部能require
但不会注册PATH
。
用npm link <pkg_name>
可以将全局安装的包链接到本地的node_module
。
安装supervisor
包,以便随时加载被更改的源代码,方便开发调试。
$ sudo npm install -g supervisor
$ supervisor app.js
(Read More)
Aug 29, 2013
在WebView里加载SSL网页很正常,也没什么难度。但如果要加载的SSL页面的证书有问题,比如过期、信息不正确、发行机关不被信任等,WebView就会拒绝加载该网页。PC上的浏览器会弹出证书错误的对话框,提示你是否要无视错误继续浏览。实际上在WebView里也可以这样做,以实现加载证书有问题的页面。
WebView webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// *** NEVER DO THIS!!! ***
// super.onReceivedSslError(view, handler, error);
// let's ignore ssl error
handler.proceed();
}
}
(Read More)