apt-get包管理工具

什么是apt-get

    apt(the Advanced Packaging Tool)是debian,ubuntu发行版的包管理工具,与红帽中的yum工具非常类似。

基本用法

* 搜索包 apt-cache search
* 获取包信息 apt-cache show
* 安装 apt-get install packagename
* 卸载 apt-get remove packagename
* 更新源 apt-get update
* 更新已安装的包 apt-get upgrade
* 升级系统 apt-get dist-upgrade
* 下载包的源代码 apt-get source packagename

镜像源

apt-get通过镜像源获得软件包
镜像源配置文件:/etc/apt/sources.list
 
网易镜像源
http://mirrors.163.com/.help/debian.html
搜狐镜像源
http://mirrors.sohu.com/help/debian.html
阿里镜像源
http://mirrors.aliyun.com/help/debian
 
sources.list有多个版本,不要下错版本
etch    -- debian 4.x
lenny   -- debian 5.x
squeeze -- debian 6.x
wheezy  -- debian 7.x

debian版本

版本 代号    发布日期  
1.1  Buzz   1996年6月17日 
1.2  Rex    1996年12月12日
1.3  Bo     1997年6月2日
2.0  Hamm   1998年7月24日
2.1  Slink  1999年3月9日
2.2  Potato 2000年8月15日
3.0  Woody  2002年7月19日
3.1  Sarge  2005年6月6日 
4.0  Etch   2007年4月8日
5.0  Lenny  2009年2月14日
6.0  Squeeze 2011年2月6日 
7.0  Wheezy 2013年5月5日
8.0  Jessie 尚无确切时间表
 
 

JSTL日期格式化

引入标签库

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

用法

<fmt:formatDate value="${DATE}"    pattern="yyyy-MM-dd HH:mm:ss" type="date" dateStyle="long" /> 
 

forEach迭代列表与整数

整数迭代

<!-- 简单示例 -->
<c:forEach var="i" begin="1" end="10" step="1"> 
    <c:out value="${i}" />
</c:forEach>

<!-- 传入变量 -->
<c:forEach var="i" begin="1" end="$(totalPage)" step="1"> 
    <c:out value="${i}" />
</c:forEach>

列表迭代

<!-- experts是个List<Map>-->
<c:forEach items="${experts}" var="expert" varStatus="status" begin="0" end="9">
    <tr>
    <td>${status.index+1}</td>
    <td><img src="${expert.headImagePath}"/></td>
    <td>${expert.expertName}</td>
    <td>${expert.phone}</td>
    <td>${expert.address}</td>
    <td>${expert.expertIntroduction}</td>
    <td>${expert.createTime}</td>
    <td data-expertid="${expert.expertID}">
    </tr>
</c:forEach>

参数说明

items 被迭代的列表(迭代整数时不用设置)
begin 开始的元素(0=第一个元素,1=第二个元素)
end最后一个元素(0=第一个元素,1=第二个元素)
step每次迭代的步长
var 当前条目的变量名称
varStatus 循环状态的变量名称(可以获取序列号)
 

shadowsocks简易代理

以下是运行在windows的简易shadowsocks
帐号可从以下地方获取
http://boafanx.tabboa.com/boafanx-ss/
https://www.shadowsocks.net/get
配置信息示例
{
    "server":"208.110.83.242",  //服务器ip
    "server_port":43202,        //服务端口
    "local_port":1080,          //本地端口
    "password":"sonydafahaoMA", //用来加密的密码
    "timeout":600,              //超时时间
    "method":"aes-256-cfb"      //加密方法
}
  • 运行boafanx-ss.exe
代理已经启动启动,接下来就可以使用代理了,下面以chrome浏览器为例
  • chrome使用代理
首先chrome需要安装了switchysharp插件.
然后设置代理 socks5 127.0.0.1 1080 
再设置切换规则 *.google.com* 通配符 shadowsocks
  • privoxy.exe可以将socks代理转换成http代理
详细见 http://boafanx.tabboa.com/105.boafanx
 
 
来源 http://boafanx.tabboa.com/105.boafanx 

上士闻道,勤而行之

上士闻道,勤而行之。中士闻道,若存若亡。下士闻道,大笑之。不笑不足以为道。

指定google搜索的网站

用法

关键词 site:网站地址

例如

在自己的网页中调用搜索引擎

示例

下面是常见示例,先动手试试
<meta charset="UTF-8" />
<body>
    <!-- 调用google搜索 -->
    <form method=get action="http://www.google.com/search"  target="_blank">
        <!-- input的中name必须为q,否则提交失败,返回google首页-->
        <input type=text name=q size=40 maxlength=255 >
        <!--input type=hidden name=sitesearch value="yongqing.is-programmer.com"-->
        <input type=submit name=btnG value="谷歌搜索">
    </form>

    <!-- 调用baidu搜索 -->
    <form action="http://www.baidu.com/baidu" target="_blank">
        <!-- input的中name必须为word,否则提交失败,返回baidu首页-->
        <input type=text name=word size=40>
        <!--input type=hidden name=si value="yongqing.is-programmer.com"-->
        <input type="submit" value="百度搜索">
    </form>
    <!-- 调用yahoo搜索-->
    <form action="http://www.yahoo.com.cn/search">
        <input type=text name="p">
        <!--input type=hidden name=vs value="yongqing.is-programmer.com"-->
        <input type="submit" value="Yahoo 搜索">
    </form>
</body>

调用google的参数

发现还可以传递其它参数,它们有什么作用?
<!–Google站内搜索–>
<form method=get action=”http://www.google.com/search”>
    <input type=text name=q>
    <input type=submit name=btnG value=”Google 搜索”>
    <input type=hidden name=sitesearch value=”yongqing.is-programmer.com”>
    <input type=hidden name=hl value=zh-CN>
    <input type=hidden name=ie value=utf-8>
    <input type=hidden name=oe value=utf-8>
</form>
name="q": 搜索的字符串
name="sitesearch": 指定要搜索的网站.
name="hl": 以指定语言显示搜索结果. 比如"zh-CN", "zh-TW", "en"
name="ie": 指明搜索网页的编码,默认是UTF-8.
name="oe": 以指定编码显示搜索结果,默认是UTF-8. 
还有其它参数
name="safe"
name="newwindow"
 
仔细看google首页的源码,发现也用这样的调用方式.
如果想要搜索指定网站的网页,google比较好用,比较适合方在个人博客中,作为搜索工具
百度、yahoo就不介绍了,有兴趣可以研究下.
 
 

修改jinja2模板中变量标识符

使用webpy时,修改jinja2变量标识

重写webpy包中的template.py文件中的render_jinja类.
class my_render_jinja:
    """Rendering interface to Jinja2 Templates

    Example:

        render= render_jinja('templates')
        render.hello(name='jinja2')
    """
    def __init__(self, *a, **kwargs):
        extensions = kwargs.pop('extensions', [])
        globals = kwargs.pop('globals', {})

        from jinja2 import Environment, FileSystemLoader
        self._lookup = Environment(loader=FileSystemLoader(*a, **kwargs), extensions=extensions)
        # 添加下面两句代码,修改标识符
        self._lookup.variable_start_string = '{{ '
        self._lookup.variable_end_string = ' }}'
        self._lookup.globals.update(globals)

    def __getattr__(self, name):
        # Assuming all templates end with .html
        path = name + '.html'
        t = self._lookup.get_template(path)
        return t.render

有其它方式吗?

jinja2的变量标识符可以通过以下方式访问到,但是无法被修改
# 可以通过以下方式访问
import jinja2
jinja2.defaults.VARIABLE_START_STRING
jinja2.defaults.VARIABLE_END_STRING
jinja2.environment.VARIABLE_START_STRING
jinja2.environment.VARIABLE_END_STRING

# 使用以下方式赋值均无效
jinja2.defaults.VARIABLE_START_STRING = '{{ '
jinja2.defaults.VARIABLE_END_STRING = ' }}'
jinja2.environment.VARIABLE_START_STRING = '{{ '
jinja2.environment.VARIABLE_END_STRING = ' }}'
为什么无效?
 
原因是导入jinja2时,执行了jinja2包中的__init__.py文件,而__init__.py中导入Environment对象
Environment对象的构造函数__init__(variable_start_string=VARIABLE_START_STRING,variable_end_string=VARIABLE_END_STRING,...)有默认值
默认值在Environment被导入时,已经固定,之后无法被修改
所以使用赋值的方式无效
 
 
了解原因后,可以找到另外一种方法,在import前设置
__docformat__ = 'restructuredtext en'
__version__ = '2.7.2'

# high level interface
# 在此处添加下面三句代码
import defaults
defaults.VARIABLE_START_STRING = '{{ '
defaults.VARIABLE_END_STRING = ' }}'
from jinja2.environment import Environment, Template

# loaders
from jinja2.loaders import BaseLoader, FileSystemLoader, PackageLoader, \
     DictLoader, FunctionLoader, PrefixLoader, ChoiceLoader, \
     ModuleLoader
 

angularjs过滤器(number)

用来精确浮点数(指定小数点位数).

在html中用法

{{ number_expression | number : fractionSize}}

在js中用法

$filter('number')(number, fractionSize)

参数

  • number 待精确的数字
  • factionSize(可选) 小数点后精确位数,默认值是3.
默认情况下保留的小数位数小于等于3. 比如: 1234-->1234;1234.56789-->1234.568;1234.56-->1234.56)

例子

<!doctype html>
<html ng-app='demo'>
<meta charset='utf-8'>
<body>
<div ng-controller="ExampleController">
  输入数字: <input ng-model='val'><br>
  <!-- 默认格式 -->
  默认格式: <span id='number-default'>{{val | number}}</span><br>
  <!-- factionSize=0 -->
  保留0位: <span>{{val | number:0}}</span><br>
  <!--factionSize大于小数点位数 -->
  保留10位: <span>{{val | number:10}}</span><br>
  <!-- factionSize小于小数点位数-->
  保留2位: <span>{{val | number:2}}</span>
</div>

<script src="/static/lib/angular/angular.js"></script>
<script src="/static/lib/angular-resource/angular-resource.min.js"></script>
<script>
    var app = angular.module('demo', ['ngResource'])
    .controller('ExampleController', function($scope) {
        $scope.val = 1234.56789;
    });
</script>
</body>
</html>
 
显示结果
输入数字: 1,234.56789
默认格式: 1,234.568
保留0位: 1,235
保留10位: 1,234.5678900000
保留2位: 1,234.57
 

判断端口通不通的几种方法

 
通常使用"telnet ip port"判断端口通不通. 有其它方法吗?先看下面的几种方法

准备环境

启动一个web服务器,提供端口.
[wyq@localhost ~]$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
用其它web服务器提供端口也一样,由于python比较方便,这里就用它

使用telnet判断

telnet是windows标准服务,可以直接用;如果是linux机器,需要安装telnet.
 
用法: telnet ip port
 
先用telnet连接不存在的端口
[wyq@localhost ~]$ telnet localhost 9000
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
直接提示连接被拒绝
 
再连接上面提供的端口
[wyq@localhost ~]$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
看到"Connected to localhost." 可以知道连接成功了.
 
后台服务器有什么反映?
[wyq@localhost monitor]$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
没有任何反映
 
此时telnet停住了,随便输入一个字符"a",然后回车
[wyq@localhost ~]$ telnet localhost 8080
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
a
<head>
<title>Error response</title>
</head>
<body>
<h1>Error response</h1>
<p>Error code 400.
<p>Message: Bad request syntax ('a').
<p>Error code explanation: 400 = Bad request syntax or unsupported method.
</body>
Connection closed by foreign host.
 
再看服务器
[wyq@localhost monitor]$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
127.0.0.1 - - [22/Aug/2014 07:15:16] code 400, message Bad request syntax ('a')
127.0.0.1 - - [22/Aug/2014 07:15:16] "a" 400 -
 
上面是linux环境下telnet连接一个web服务端口的情况. 

使用ssh判断

ssh是linux的标准配置并且最常用,可以用来判断端口吗? 
 
用法: ssh -v -p port username@ip
-v 调试模式(会打印日志).
-p 指定端口
usernmae可以随意
 
连接不存在端口
[wyq@localhost ~]$ ssh -v -p 9000 wyq@localhost
OpenSSH_6.4, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /home/wyq/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 51: Applying options for *
debug1: Connecting to localhost [127.0.0.1] port 9000.
debug1: connect to address 127.0.0.1 port 9000: Connection refused
ssh: connect to host localhost port 9000: Connection refused
"Connection refused"表示端口不可用
 
连接存在的端口
[wyq@localhost ~]$ ssh -v -p 8080 wyq@localhost
OpenSSH_6.4, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /home/wyq/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 51: Applying options for *
debug1: Connecting to localhost [127.0.0.1] port 8080.
debug1: Connection established.
debug1: identity file /home/wyq/.ssh/id_rsa type 1
debug1: identity file /home/wyq/.ssh/id_rsa-cert type -1
debug1: identity file /home/wyq/.ssh/id_dsa type -1
debug1: identity file /home/wyq/.ssh/id_dsa-cert type -1
debug1: identity file /home/wyq/.ssh/id_ecdsa type -1
debug1: identity file /home/wyq/.ssh/id_ecdsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.4
debug1: ssh_exchange_identification: <head>

debug1: ssh_exchange_identification: <title>Error response</title>

debug1: ssh_exchange_identification: </head>

debug1: ssh_exchange_identification: <body>

debug1: ssh_exchange_identification: <h1>Error response</h1>

debug1: ssh_exchange_identification: <p>Error code 400.

debug1: ssh_exchange_identification: <p>Message: Bad request syntax ('SSH-2.0-OpenSSH_6.4').

debug1: ssh_exchange_identification: <p>Error code explanation: 400 = Bad request syntax or unsupported method.

debug1: ssh_exchange_identification: </body>

ssh_exchange_identification: Connection closed by remote host
"Connection established" 表示已经连上端口
 
服务器输出
[wyq@localhost ~]$ python -m SimpleHTTPServer 8080
Serving HTTP on 0.0.0.0 port 8080 ...
127.0.0.1 - - [22/Aug/2014 13:32:55] code 400, message Bad request syntax ('SSH-2.0-OpenSSH_6.4')
127.0.0.1 - - [22/Aug/2014 13:32:55] "SSH-2.0-OpenSSH_6.4" 400 -
 

使用wget判断

wget是linux下的下载工具,需要先安装.
 
用法: wget ip:port
 
连接不存在的端口
[wyq@localhost ~]$ wget localhost:9000
--2014-08-22 13:36:42--  http://localhost:9000/
正在解析主机 localhost (localhost)... 127.0.0.1
正在连接 localhost (localhost)|127.0.0.1|:9000... 失败:拒绝连接。
连接存在的端口
[wyq@localhost ~]$ wget localhost:8080
--2014-08-22 13:37:22--  http://localhost:8080/
正在解析主机 localhost (localhost)... 127.0.0.1
正在连接 localhost (localhost)|127.0.0.1|:8080... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2770 (2.7K) [text/html]
正在保存至: “index.html”

100%[======================================>] 2,770       --.-K/s 用时 0s      

2014-08-22 13:37:22 (105 MB/s) - 已保存 “index.html” [2770/2770])

总结

提供端口服务,则使用了tcp协议,上面是以web服务器为例。如果服务器是更简单的tcp服务器,三个工具同样适用.
三个工具的共同点是:1.以tcp协议为基础;2.能访问指定端口. 遵循这两点可以找到很多工具.
在windows下使用telnet比较方便,linux下个人就比较喜欢用wget.