Sourceforge.net 高速镜像站分享

Published on:
Tags: Mirrors

SourceForge.net, 又称SF.net, 是开源软件开发者进行开发管理的集中式场所, 也是全球最大开源软件开发平台和仓库.

下面提供两个可用的镜像站地址:

  1. ftp://ftp.heanet.ie/mirrors/download.sourceforge.net/ [2013-11-03 可用]

  2. ftp://ftp.jaist.ac.jp/pub/sourceforge/ [2013-11-03 可用]

SourceForge.net 官方提供的镜像站列表:

Mirrors – sourceforge [2013-11-03 可用, 百度快照]

HTML/CSS 布局经典之单栏居中的两种实现方式

Published on:

自动外边距法:

body {
    text-align:center;/* 针对 IE5 的居中问题进行微调 */
}
div#content {
    margin-left:auto; margin-right:auto; width:300px; /* 使用自动外边距达到居中目的 */
    text-align:left;/* 针对 body.text-align=center 导致文本内容居中显示的异常 */
}

负外边距法:

div#content {
	position:absolute; left:50%;/* 第一步 */
	width:300px; margin-left:-150px;/* 第二步, 设置 margin-left 为 width 的一半 */
}

参考连接: 1. 完美解决CSS网页水平居中

Lion 下, 为终端工具添加 tree 命令

Published on:
Tags: Lion MAC OS X

情况描述:

希望 Lion 能够在终端下打印指定目录的结构树;

解决方案:

方案一(手动添加 tree 命令):

  1. 将此命令添加到 ~/.profile 文件中, 注销一次即可使用:
function tree {
    find $&;{1:-.} -print | sed -e ’s;[^/]*/;|____;g;s;____|; |;g’
}

方案二(自动安装 tree 命令):

  1. 使用 mac ports 安装 tree 命令, 即可使用:
sudo port install tree

注意:

  1. 方案一提供的功能比较单一, 方案二则有更多的功能细节;

  2. 方案二依靠 mac ports 安装, 而安装 mac ports 则需要 XCode 的支持才可以;

  3. 若想直接查看当前目录的结构树, 而有不想添加 tree 命令, 则可快速执行如下命令:

find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'

参考资料:

1. http://www.kingluddite.com/tools/adding-tree-command-to-the-terminal-mac-osx

Unix 下, 两步快速杀死占用8080端口的进程

Published on:

情况描述:

使用 mvn jetty:run 运行 jetty 之后, 通过 Control + Z 结束掉当前进程. 重新执行此命令时, 返回结果”8080端口已被占用”

解决方案:

  1. 找到监听 8080 端口的 java 进程:
lsof -i tcp:8080 #例如: 5123
  1. 终止此进程:
sudo kill -9 5123

搞定!

Ubuntu 下, 两步快速卸载已安装的无界面程序

Published on:
Tags: linux ubuntu

问题描述:

使用 115backup.deb 安装了”115网盘”. 需要卸载时, 在”Ubuntu 软件中心”无法找到, 也无法通过关键字”115”检索到;

解决方案:

  1. 查找 115backup.deb 安装后的真实名字:
dpkg --get-selections | grep 115 # 结果发现是 115backup
  1. 使用 apt-get 删除 115backup:
sudo apt-get remove 115backup

适用情况:

使用 deb 包或 apt-get 安装的应用程序

Ubuntu下,快速修复崩溃的Unity

Published on:
Tags: linux ubuntu

废话不多说,直接上方法:

  1. 使用Alt + Ctrl + T启动Terminal;

  2. 执行如下命令:

    unity --reset-icon #方法一:仅恢复崩溃的图标
    unity --reset #方法二:恢复unity
    dconf reset -f /org/compiz; sleep 2; unity #方法三:如果方法一,方法二均无效的情况下使用

PHP琐碎技巧,mysqli之预处理语句的使用

Published on:
Tags:
  1. 数据库描述: 数据库名称: db_test 表名称: tb_user 表结构:
|      name      |       type        |    is null     |     is key        |       is auto       |
|----------------|-------------------|----------------|-------------------|---------------------|
|    id          |       int         |    not null    |    primary key    |    autoincrement    |
|    username    |    varchar(32)    |    not null    |    no primary key |    no auto increment|
|    password    |    varchar(64)    |    not null    |    no primary key |    no auto increment|

用户名: root            密码: root

  1. 连接数据库:
$mysqli = new mysqli($db_url, $db_user, $db_password, $db_name);
  1. 设定连接编码:
$mysqli->set_charset($db_charset);
  1. 判断是否连接正常:
if (mysqli_connect_errno()) {
    die('无法连接数据库: '.mysqli_connect_error());
}
  1. 获取预处理引用:
$sql_update = "UPDATE `tb_user` SET `password`=? where `username`=?";
$stmt = $mysqli->prepare($sql_update);
  1. 向预处理语句绑定数据:
$stmt->bind_param("ss", $password, $username);//i:integer;s:string;d:double;b:blob;
  1. 为变量设置真实数据:
$username = 'tom';//where username=$username
$password = 'apple';// set password=$password
  1. 执行预处理引用:
$stmt->execute();
  1. 检查是否正确执行:
$stmt_error = mysqli_stmt_error($stmt);
if (strlen($stmt_error) == 0) {
    echo('update successfully!');
} else {
    die('prepared statement ecexute error: '.$stmt_error);
}
  1. 关闭打开的数据库连接:
$stmt->close();
$mysqli->close();

完整的代码如下:

$mysqli = new mysqli('localhost', 'root', 'root', 'db_test');
$mysqli->set_charset('utf8');
if (mysqli_connect_errno()) {
    die('无法连接数据库: '.mysqli_connect_error());
}

$sql_update = "UPDATE `tb_user` SET `password`=? WHERE `username`=?";
$stmt = $mysqli->prepare($sql_update);

$stmt->bind_param("ss", $password, $username);//i:integer;s:string;d:double;b:blob;

$username = 'tom';//WHERE username=$username
$password = 'banana';//SET password=$password

$stmt->execute();

$stmt_error = mysqli_stmt_error($stmt);
if (strlen($stmt_error) == 0) {
    echo('update successfully!');
} else {
    die('prepared statement ecexute error: '.$stmt_error);
}

$stmt->close();
$mysqli->close();

Ubuntu下,录制gif图片的方法

Published on:
Tags: linux ubuntu

Ubuntu 下, 如何录制 gif 格式的屏幕截图

  1. 安装 gtk-recordmydesktop 来录制屏幕, 安装 mplayer 將视频分解成单帧图片, 安装 imagemagick 將单帧图片压缩成一张 gif:
sudo apt-get install imagemagick mplayer gtk-recordmydesktop
  1. 命令行下执行, 录制并保存文件为 out.ogv:
gtk-recordmydesktop
  1. 执行如下命令將 out.ogv 分解成单帧图片:
mplayer -ao null out.ogv -vo jpeg:outdir=.
  1. 执行如下命令將单帧图片压缩成 gif 图片:
convert *.jpg out.gif
  1. 执行如下命令將 gif 图片进行压缩:
convert out.gif -fuzz 10% -layers Optimize optimized.gif

Android中, 单击EditText弹出日期选择器而非软键盘的实现方法

Published on:
Tags:

实现效果如图,文字描述如下:

点击 EditText 后, 不弹出虚拟键盘, 而是弹出日期选择器;

实现方法:

  1. 禁止弹出虚拟键盘: 添加
android:inputType="none"

EditText.setInputType(InputType.TYPE_NULL);
  1. 点击时弹出日期选择器:
//针对非聚焦状态下点击EditText
EditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            showDialog(自定义 DatePickerDialog 的 ID);
        }
    }
});

//针对聚焦状态下点击EditText
EditText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(自定义 DatePickerDialog 的 ID);
    }
});

注意:

  1. 如果要保证聚焦状态下禁止弹出软键盘, 必须加上
EditText.setInputType(InputType.TYPE_NULL);

PHP, 数组中增删改查的技巧

Published on:
Tags:
  1. PHP 数组自定义排序

使用方法:

usort($customArray, "customSortFunctionName");#usort(数组, 自定义排序方法);

举例:

# 按照水果价格排序, 默认升序排列
function sort_by_price($fruit_a, $fruit_b) {
    if ($fruit_a['price'] > $fruit_b['price']) {
        return 1;
    } else if ($fruit_a['price'] == $fruit_b['price']) {
        return 0;
    } else {
        return -1;
    }
}

$fruit_array = array(
    array(
        "name"=>"Apple",
        "price"=>9
    ),
    array(
        "name"=>"Banana",
        "price"=>10
    ),
    array(
        "name"=>"Cherry",
        "price"=>8
    )
);

echo "排序前:";
print_r($fruit_array);# 查看排序前, $fruit_array 内容
echo "<br />";
usort($fruit_array, "sort_by_price");# 排序
echo "排序后:";
print_r($fruit_array);# 查看排序后结果
  1. 向数组指定位置插入内容

使用方法:

array_splice(array, offset, length, array): 向数组指定位置插入至少一个元素;

举例:

$fruit_a = array("Apple", "Almond", "Apricot");
$fruit_b = array("Banana", "Blackberry", "Beechnut");
echo "Before:<br />";
var_dump($fruit_a);
array_splice($fruit_a, 2, 0, $fruit_b);#将 $fruit_b 的内容插入到 $fruit_a 的第二个元素后面
echo "<br />After:<br />";
var_dump($fruit_a);
  1. 移除数组中指定位置内容

使用方法:

array_splice($customArray, $itemPosition, 1);#array_splice(自定义数组, 待移除内容在数组中的位置, 1);

举例:

$fruit_array = array(
    array(
        "name"=>"Apple",
        "price"=>9
    ),
    array(
        "name"=>"Banana",
        "price"=>10
    ),
    array(
        "name"=>"Cherry",
        "price"=>8
    )
);

echo "<br />Before:<br />";
prit_r($fruit_array);#移除 Banana 前, 查看 $furit_array 内容
array_splice($fruit_array, 1, 1);#移除 Banana
echo "<br />After:<br />";
var_dump($fruit_array);#移除 Banana 后, 查看 $furit_array 内容
  1. 批量移除数组中符合条件的元素:

使用方法:

array_walk($customArray, "customBatchDeleteFunctionName");#array_walk(自定义数组, 自定义批量删除方法)
sort($customArray);

举例:

$fruit_basket_array = array(
    array(
        'fruit_level'=>100,
        'fruit_name'=>"apple"
    ),
    array(
        'fruit_level'=>"error",
        'fruit_name'=>"banana"
    ),
    array(
        'fruit_level'=>100,
        'fruit_name'=>"cherry"
    ),
    array(
        'fruit_level'=>100,
        'fruit_name'=>"date"
    ),
    array(
        'fruit_level'=>"error",
        'fruit_name'=>"eggplant"
    )
);

echo "<br/>Before:<br/>";
print_r($fruit_basket_array);# 移除 fruit_level 非 100 之前, 查看 fruit_basket_array 内容

# 批量处理
array_walk($fruit_basket_array, function($val, $key) use(&$fruit_basket_array) {
    if ($val['fruit_level'] !== 100) {
        unset($fruit_basket_array[$key]);
    }
});
sort($fruit_basket_array);# 对处理结果重建索引和排序

echo "<br/>After:<br/>";
print_r($fruit_basket_array);# 移除 fruit_level 非 100 之后, 查看 fruit_basket_array 内容