Ed2k

基本原理

区别于BT,核心概念在于文件共享。

  1. 设置共享目录,该目录中的所有文件,都会实时共享到eDonkey和KAD网络中。
  2. 目录中共享了的文件都会生成eD2k链接,所有人通过相应的eD2k链接,都能够拿到你共享的文件,
    1. 一旦有人下载相应文件,那么你的eMule客户端就会上传数据。
    2. 平时使用eD2k链接下载,资源也是来自他人eMule所共享的文件的。
    3. 当然,共享目录中也可以啥都不放,但很多eMule客户端都拥有队列优先级机制,上传得少,下载速度也会被限制。

与BT的区别

  1. 资源持久性
    1. 对于BT来说,用户被视为下载者。当用户上传到指定比率作为一个下载者的义务就完成了,一般就停止上传了,这使得BT在下热门资源的时候速度快,但是对冷门资源来说即使这个文件没有被删除也不会有上传者了。
    2. 而对于eMule来说,用户被视为分享者。只要用户文件没被删除作为资源分享者就一直上传,这样可以长期保源。
  2. 资源搜索能力
    1. BT协议中没搜索功能
    2. eMule搜索的时候每个资源大小来源数甚至拥有者对其的评价都是一目了然的,这样使得资源广泛分布,也有利于资源优胜劣汰,从而达到长期保源的目的。

基本概念

eD2k:

eDonkey网络所使用的协议,eDonkey网络所共享的文件会生成eD2k开头的链接。

电驴

eDonkey2000:(又称:eDonkey;缩写:eD2k;非官方中文译名:电驴)最先开发使用eDonkey网络的文件共享客户端软件。2000年起开发,2005年停止维护,之后eDonkey网络被其他软件沿用。

电骡

eMule:(官方中文名:电骡)eMule及其Mods是现在最流行的一款eDonkey网络文件共享客户端软件。2002年起开发。

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

作者:qysnn
链接:https://www.zhihu.com/question/19922200/answer/29022933
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Php

enable php curl extension

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

Bash Scripting

简介

记录一下bash脚本编写的东东,可以参考cheatsheet

调试打印

在Bash脚本里打开打印,并利用shellprof./shellprof ./testcase.sh计算时间。

1
2
3
4
5
6
7
8
9
#!/bin/bash

# 使用 trap 来捕获 DEBUG 信号,每次执行命令前触发
trap 'echo "$BASH_COMMAND"' DEBUG

# 设置调试模式打印前缀PS4,包含时间戳和行号
export PS4='+ $(date "+%Y-%m-%d %H:%M:%S.%3N")\011 '

set -x # 开启调试模式

基础知识

参数

  • $? 是上一个指令执行的状态值
  • $@ 代表shell脚本的命令行参数. $1 , $2 , etc., 分别代表命令行传入的第一个和第二个参数。举例,对于命令./run.sh XXX YYY,$1代表XXX , $2代表YYY

#匹配并删除最短前缀

1
2
3
4
5
6
7
8
9
10
str="/path/to/foo.cpp"
echo "${str%.cpp}" # /path/to/foo
echo "${str%.cpp}.o" # /path/to/foo.o
echo "${str%/*}" # /path/to

echo "${str##*.}" # cpp (extension)
echo "${str##*/}" # foo.cpp (basepath)

echo "${str#*/}" # path/to/foo.cpp
echo "${str##*/}" # foo.cpp

在 Bash 脚本中,### 符号用于字符串操作,具体用于删除前缀部分:

  1. ${str#pattern}:删除变量 str 中最短匹配 pattern 的前缀。
  2. ${str##pattern}:删除变量 str 中最长匹配 pattern 的前缀。

例如:

  1. echo "${str##*.}":这行代码使用 ## 删除了最后一个 . 及其前面的所有内容,从而只保留了文件扩展名 cpp。这是因为 * 匹配所有字符。
  2. echo "${str##*/}":这行代码使用 ## 删除了最后一个 / 及其前面的所有内容,因此只保留了文件名 foo.cpp
  3. ${str#*/} 删除了第一个 / 之前的部分,结果是 path/to/foo.cpp
  4. ${str##*/} 删除了最后一个 / 之前的所有部分,结果是 foo.cpp

这两个符号用于简化路径处理和提取文件名等。

变量作用域

  • Bash 中的变量是 全局变量,也就是说,在脚本中的任何地方都可以访问到这个变量,除非使用 local 关键字将其作用域限制在特定的函数中。
  • local 声明的变量确实限制了它的作用域,但作用域仅限制在当前函数及其子函数(嵌套函数)内。对于嵌套函数,还是共用(读取和修改)上层的local变量。

函数传参

  • Bash里的函数传参和脚本的命令行参数也是共用$@$1等,但是默认是函数的局部变量。
  • 如果忘记使用局部变量,这常会导致一个问题:
    • 外层的for循环的i被内层函数的for循环i修改导致循环异常。
    • 解决方案:需要将内层函数的for循环i定义为local,来与上层的隔离。

其他

  • /dev/null是一个几乎不管向它写入什么,都只返回成功,但是什么都没真的写入的文件。换句话说就是个“无底洞”,扔进去的东西肯定算扔进去了,但是扔进去就看不见了。

Environment

1
2
3
4
5
6
7
8
9
10
11
# read
SCRIPT_DIR="$(dirname $0)"

# set
export HOSTNAME="$(hostname)"

# check Environment
if [[ -z "${ITHEMAL_HOME}" ]]; then
echo "ITHEMAL_HOME environment variable must be set!"
exit 1
fi

实例

判断docker是否启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function container_id() {
sudo docker ps -q --filter 'name=ithemal$'
}

CONTAINER="$(container_id)"

if [[ -z "${CONTAINER}" ]]; then
read -p "Container is not currently running. Would you like to start it? (y/n) " -r

if [[ !($REPLY =~ ^[Yy]) ]]; then
echo "Not starting."
exit 1
fi

# others
fi

尝试获取sudo权限

1
2
3
4
5
6
function get_sudo() {
if ! sudo -S true < /dev/null 2> /dev/null; then
echo "sudo access required for docker:"
sudo true
fi
}

重连或者创建一个到名称为$1tmux窗口

1
2
3
4
5
6
7
8
9
#!/usr/bin/env bash

SESSION=$(tmux ls -F '#S #{session_attached}' | grep ' 0$' | head -n 1 | awk '{$NF=""; print $0}' | awk '{$1=$1;print}')

if [ ! -z "${SESSION}" ]; then
tmux attach -t "${SESSION}"
else
tmux new "bash -l"
fi

参考文献