submarinecablemap.png

陆地光缆:http://www.chinatelecom.com.hk/www/other/global
海底光缆:http://www.submarinecablemap.com/#/

点击地点可以高亮显示所有连接到此地的光缆,在右侧点击光缆名称可以高亮显示该条光缆。

Submarine Cable Map是TeleGeography公司制作的。
具体步骤就是先在Adobe Illustrator中画出光缆的路径,并使尽可能的清晰,能轻易分辨出每条光缆。光缆的实际位置和地图位置并不相同。
之后使用Avenza开发的MAPublisher插件来导出光缆路径和着陆城市坐标的KML文件。
将KML上传到Google's Fusion Tables,这是一个制作可视化数据的免费工具。它可以将KML数据中的光缆和城市坐标画到可交互的Google地图上。
通过Google's Maps API v3,将路径和城市生成两个层。
这个公司进行进行了进一步开发,让地图上的路径和城市点可以根据用户点击来高亮显示。

原版的分页代码中的类名是写死了的,换个前端框架就不能匹配了。
想了半天,自己写了生成Semantic UI分页代码的函数。
可以根据总页码适应,使当前最多出现10个页码,而不是总共有多少页就出现多少页码。

function semanticPage($totalPage,$currPage,$urlFuncParam){
    // 参数为总页数,当前页码,U方法生成url使用的参数,比如说"Admin/Index/Article?p="
    $html="<div class='ui right floated pagination menu'>";
    if($currPage!=1){
        $html.='<a href="'.U($urlFuncParam.($currPage-1)).'" class="icon item"><i class="left chevron icon"></i></a>';
    }
    if($totalPage<10){
        for($i=1;$i<$totalPage;$i++){
            if($i==$currPage){
                $html.='<a href="'.U($urlFuncParam.$i).'" class="item active">'.$i.'</a>';
            }else{
                $html.='<a href="'.U($urlFuncParam.$i).'" class="item">'.$i.'</a>';
            }
            
        }
    }else{
        if($currPage<5){
            for($i=1;$i<=10;$i++){
                if($i==$currPage){
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item active">'.$i.'</a>';
                }else{
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item">'.$i.'</a>';
                }
            }
        }else if($totalPage-$currPage<5){
            for($i=$totalPage-9;$i<=$totalPage;$i++){
                if($i==$currPage){
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item active">'.$i.'</a>';
                }else{
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item">'.$i.'</a>';
                }
            }
        }else{
            for($i=$currPage-4;$i<=$currPage+5;$i++){
                if($i==$currPage){
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item active">'.$i.'</a>';
                }else{
                    $html.='<a href="'.U($urlFuncParam.$i).'" class="item">'.$i.'</a>';
                }
            }
        }
    }
    if($currPage!=$totalPage){
        $html.='<a href="'.U($urlFuncParam.($currPage+1)).'" class="icon item"><i class="right chevron icon"></i></a>';
    }
    $html.="</div>";
    return $html;
}

今天遇到Vue提示这个错误:
inline selected attributes on <option> will be ignored when using v-model. Declare initial values in the component's data option instead.

代码如下:

<select v-model="selectedCapacity">
  <option value="" disabled selected>快速选择</option>
  <option value="1.5">小电水壶(1.5L)</option>
  <option value="2">雪碧瓶(2L)</option>
  <option value="5">大水壶(5L)</option>
  <option value="20">一桶(20L)</option>
</select>

这个提示是说,不能在option中添加selected来让它默认选中,而是要为它设置一个value,比如说空字符串"",然后在Vue的data里面让这个model等于设置的""
此处把selected取消,然后去data里面定义selectedCapacity=""即可。

内网IP有什么用处和注意事项?

  • 内网IP流量不计费。
  • 内网IP只在统一区域生效(比如芝加哥的机器不能通过内网IP连接新泽西的机器)
  • 需要自己手动配置。
  • 只能连接本账户的机器,不能连接其他客户的机器。
  • 虽然Vultr会分配一个IP,但你可以无视它,用任何IP都行

开通

进入现有主机,Settings,ipv4,Private Network,如图。
我已经开通了,没有开通的,点Private Network下面那个按钮就好。
privatenetwork.png

配置

CentOS配置如下,更多机器见官方教程
编辑这个文件nano /etc/sysconfig/network-scripts/ifcfg-eth1
输入

DEVICE=eth1
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=10.99.0.10
NETMASK=255.255.0.0
IPV6INIT=no
    MTU=1450

按Ctrl+X,输入Y保存。
重启网络服务service network restart即可。

抄袭自:这个网站

1. 启用HTTPS后提示ERR_SSL_PROTOCOL_ERROR

  1. 首先用openssl检查证书是否合法openssl s_client -connect ss.fly2x.com:443 -servername ss.fly2x.com
    系统返回
CONNECTED(00000003)
140495365109576:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 268 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

  1. 查看nginx log。
  • 要找到log,首先查看nginx配置文件
  • nginx配置文件用命令nginx -t显示
2017/01/26 22:45:15 [error] 2952#2952: *117 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: 123.123.123.123, server: 0.0.0.0:443
  1. 这个网页给出了解决方法:
    在虚拟服务器配置文件的listen指令后添加default_server
 listen 443 default_server ssl;

2. 重定向过多

设置config/.config.php中打开debug,查看错误原因

3. "AUTH" failed: ERR Client sent AUTH, but no password is set

给redis设置密码。这个网页告诉我们可以设置在配置文件中永久有效,或者使用redis命令行工具一次有效。
找到配置文件例子,redis.conf,在其中找到reqiurepass,确保它前面没有#号,在后面加上空格,输入密码。
启动redis时,要指定配置文件,否则还是没有密码。./redis-server redis.conf

4. 添加统计代码:

在 resources/views/{主题名} 下创建一个 analytics.tpl,把统计代码贴进去
然后在config/.config.php文件里面把以下设置为true。
$System_Config['enable_analytics_code']='true';

5. 即使开启debug也是500错误:

在public/index.php里面添加
ini_set("display_errors", "On");
error_reporting(E_ALL | E_STRICT);

6. php出错提示缺少文件/vendor/autoload.php

运行php composer.phar install安装依赖文件

7. Failed to download xxx/yyy from source: The Process class relies on proc_open, which is not available on your PHP installation.Now trying to download from dist

php禁用了proc_open,于是程序使用了另一种方式下载。
如果没有安装成功就启用proc_open函数。
编辑php.ini,把disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait...里面的proc_open删掉。

8. 后台用户列表,在线列表打不开

下载纯真IP文件到storage目录
http://piccdn.fly2x.com/qqwry.dat 2017-08-17更新

9. php composer.phar install出错

Cannot create cache directory
/root/.composer/cache/repo/https---packagist.org/, or directory is not writable. Proceeding without cache Cannot create cache directory
/root/.composer/cache/files/, or directory is not writable. Proceeding without cache
[ErrorException]
is_dir(): open_basedir restriction in effect. File(/root/.composer) is not within the allowed path(s):
(/home/wwwroot/default:/tmp/:/proc/:/home/wwwroot)

编辑/etc/php.ini或者/usr/local/php/etc/php.ini,找到open_basedir = /home/wwwroot/default,更改为open_basedir = /home/wwwroot/default:/root/.composer/,用冒号隔开。open_basedir的参数不一定完全一致,在后面加冒号和/root/.composer/即可。
也可以在nginx/conf/fastcgi.conf里面或者站点的conf文件里面添加以下语句
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/:/root/.composer/";

10. 后端无法连接,提示{"ret":0,"data":"token or source is invalid}

首先面板配置文件中的muKey是可以设置多个,用逗号隔开。检查key是否正确。
然后,连接API的IP只能是127.0.0.1或者设置的节点IP。检查是否开启了cdn,导致面板获得的IP不是节点IP而是cdn的IP。
可以在节点服务器用curl https://你的站点地址/mod_mu/func/ping?key=设置的muKey,如果响应为{"ret":1,"data":"pong"}那么就成功了。
如果提示(53) SSL Connect Error,更新curl。
如果使用CloudFlare的cdn,可以在nginx该站点配置文件中的server{}里面添加以下代码,将属于CloudFlare的IP段替换为真实IP。

set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;#  以上代码表示从这些ip发送的请求不是用户真实ip
real_ip_header    X-Forwarded-For; # 将请求头的用户ip替换为代理转发的ip
real_ip_recursive on; # nginx会查找转发链,返回第一个不在以上列表中的ip作为用户真实ip

要是nginx提示没有readip模块,需要重新编译安装。加上参数--with-http_realip_module
军哥的lnmp可以很方便地重新编译安装,在lnmp/lnmp.conf里面修改Nginx_Modules_Options='--with-http_realip_module',然后./upgrade.sh nginx即可。
此方法来自https://www.cmsky.com/lnmp-nginx-realip/

11. 原版ss怎么设置

服务器端

  • 加密方式,前面带[SS 可连接]的都可以,推荐以下几种
    [SS 可连接] aes-128-gcm
    [SS 可连接] aes-192-gcm
    [SS 可连接] aes-256-gcm
    [SS 可连接] chacha20-ietf-poly1305
    [SS 可连接] xchacha20-ietf-poly1305
  • 协议:origin
  • 混淆:
    [SS 可连接] simple_obfs_http
    [SS 可连接] simple_obfs_tls

PC

  1. 下载原版安装文件
  2. 下载obfs插件,放到同一文件夹
  3. 添加服务器界面设置插件,参数中的obfs可选参数为http和tls,与服务器端的混淆一致。
    插件:plugin: obfs-local
    插件参数:obfs=http;obfs-host=www.baidu.com
  4. 直接扫二维码添加,会自动添加插件配置。

安卓

  1. 在play市场下载原版并安装
  2. 在play市场下载Simple Obfuscation
  3. 在服务器详情界面添加插件并进行配置