[python]如何在django中访问静态文件

对于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)

[js]在RequireJS中复用已加载的jQuery

最近在用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)

[android]POST请求中的UTF-8编码问题

今天遇到这样一个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)

[Android]AutoCompleteTextView使用小结

AutoCompleteTextView这个控件用于输入框的自动完成提示,非常适合搜索框等。它本质上是个EditText,实际上它也是从EditText继承的,使用起来也十分简单。

使用要点如下:

  1. 利用ListAdapter(一般使用ArrayAdapter)为AutoCompleteTextView提供数据,若有需要还可以重载getView()以自定义列表项的显示方式。这一步同ListView
  2. 如果需要根据输入内容进行动态提示,那么adapter需要实现Filterable接口,重载getFilter()函数实现提示算法。getFilter()需返回Filter对象,该对象包含至少两个方法:performFiltering()在后台执行过滤,publishResults()在UI线程执行,负责将过滤结果显示到列表中。还有第三个方法convertResultToString()可以控制用户点击提示时要填充至输入框的文本内容。

示例代码大致如下。

(Read More)

Display non printable characters

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)

[python]管理Flask的配置文件

所谓配置文件管理,就是在不改变源代码的前提下,拥有两套(甚至多套)配置文件,分别用于开发环境和生产环境,通过命令行选择配置文件。有些框架本身就支持多配置文件,例如Ruby On Rails,nodejs下的expressjs。python下的Flask虽然本身支持配置文件管理, 但单纯使用from_objectfrom_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)

[win7]清除文件夹的权限设置

有时候Windows下的文件夹/文件的权限设置会弄得乱七八糟的,连自己都不知道哪些文件有特殊权限了,而GUI上又没有明显的办法能清除这些特殊权限的。这时可以试试下面这个命令:

D:\> icacls 文件夹名 /T /Q /C /RESET

(Read More)

Driver's License Decoding

The data encoded in the PDF417 barcode on the back of the driver’s license can be decoded as below.

(Read More)

Node.js学习笔记

关于包

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)

[Android]用WebView访问证书有问题的SSL网页

在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)