Secret 发布的文章

运营同学有一个需求提给了我,说是每周一和周五需要到系统手动导出所有成交报告,而系统是根据城市进行分库的,导完一个城市的成交报告需要切换系统的登录城市。这个步骤异常繁琐,希望我能给个解决方案来解放他的双手。

在项目拉取了一个 hotfix 分支就开搞,通过命令触发接口导出数据生成 CSV 文件并通过附件发送给我。

测试完成,数据完整。发给运营同学准备测试数据,然后气氛有点奇怪。

运营同学:乱码。

我:试试导入?

运营同学:还是乱码。

乱码?UTF-8 还乱码?这 Office 用得啥编码格式。

搜索一通,有说是 Excel 的 Bug,可以通过加 BOM 头搞定。

BOM 头是啥呢?

在 UCS 编码中有一个叫做 "Zero Width No-Break Space" ,中文译名作 “零宽无间断间隔” 的字符,它的编码是 FEFF。而 FFFE 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输字符 "Zero Width No-Break Space"。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian 的;如果收到 FFFE,就表明这个字节流是 Little- Endian 的。因此字符 "Zero Width No-Break Space" (“零宽无间断间隔”)又被称作 BOM。

类似 WINDOWS 自带的记事本等软件,在保存一个以 UTF-8 编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即 BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以 UTF-8 编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP 来说,BOM 是个大麻烦。

摘自 百度百科 BOM(Byte Order Mark)

再补充一份不同编码的字节顺序标记的表。

编码表示 (十六进制)表示 (十进制)
UTF-8EF BB BF239 187 191
UTF-16(大端序)FE FF254 255
UTF-16(小端序)FF FE255 254
UTF-32(大端序)00 00 FE FF0 0 254 255
UTF-32(小端序)FF FE 00 00255 254 0 0
UTF-72B 2F 76 和以下的一个字节:[38 / 39 / 2B / 2F]43 47 118 和以下的一个字节:[56 / 57 / 43 / 47]
en:UTF-1F7 64 4C247 100 76
en:UTF-EBCDICDD 73 66 73221 115 102 115
en:Standard Compression Scheme for Unicode0E FE FF14 254 255
en:BOCU-1FB EE 28及可能跟随着FF251 238 40及可能跟随着255
GB-1803084 31 95 33132 49 149 51

也就是说,只需要在 CSV 头部加一个 BOM 头就可以解决乱码。

<?php
    // 设置 UTF-8 BOM 头
    $bom = chr(239).chr(187).chr(191);
    $filecontents = $bom . $filecontents;
...

嗯,__记一笔,运营同学欠我一顿饭。__


一款简约的单页主题,很漂亮吧?

Hola

如何使用?

首先,你需要安装 Hexo 用做博客载体。关于安装步骤请善用搜索引擎。然后我们使用终端工具进入 Hexo 模版目录。

cd /your_hexo_path/theme/

现在,我们需要克隆主题仓库,使用终端工具拉取。

git clone https://github.com/isecret/Hola

稍等片刻,主题将安装在 Hexo 中,安装完成后需要修改 your_hexo_path/_config.yml,找到 theme 参数,将它修改为:

theme: Hola

自定义

站点关键字

修改 your_hexo_path/theme/Hola/config.ymlkeywords 参数。

建站日期

这个参数用于站点底部展示,修改 your_hexo_path/theme/Hola/config.ymlsince 参数。

导航栏

头部导航栏列表,修改 your_hexo_path/theme/Hola/config.ymlmenu 参数。

社交(Todo)

社交地址,修改 your_hexo_path/theme/Hola/config.ymlsocial 参数。

字数统计

在博客站点底部,有一个字数统计,但是你需要安装插件才能启用他。

使用终端工具执行命令:

npm install hexo-wordcount

安装完成后,需要修改 your_hexo_path/theme/Hola/config.yml,找到 footer_wordcount 参数将它修改为 enabled

底部补充

footer_expand 参数主要用于代码补充,当然你也可以直接修改主题源码。

站点微缩图

用于站点缩略图,ico 格式。修改 your_hexo_path/theme/Hola/config.ymlfavicon 参数。

站点 Logo(Todo)

站点Logo。修改 your_hexo_path/theme/Hola/config.ymllogo 参数。

一言 hitokoto

一言随机一句话副标题。修改 your_hexo_path/theme/Hola/config.ymlhitokotoenabled 参数启用。

Gitment

基于 Github 登录的评论系统。修改 your_hexo_path/theme/Hola/config.ymlgitment 参数启用。

腾讯统计

修改 your_hexo_path/theme/Hola/config.ymltencent_analytics 参数为你的 sId

建议

如果你有任何有趣的想法,请留言或 Email 告诉我。

感谢

Xdebug 是一个开放源代码的 PHP 程序调试器 (即一个 Debug 工具),可以用来跟踪,调试和分析 PHP 程序的运行状况。Xdebug 现在的最新版本添加了对 PHP7 的支持。——摘自『xdebug_百度百科

如果有学习过 C 的话,应该使用过 VC++ 的断点调试,可以对执行中的程序进行跟踪,分析程序的执行流程和影响性能缓慢的问题。不过在 PHP 这,却变成了 var_dump();die(); 一类的暴力手工断点。Xdebug 将很好的改变这一现状。

环境

  • 网络环境:局域网
  • 本地环境:Mac OSX 10.13.4 + Visual Studio Code 1.22.2
  • 开发环境:CentOS 7.4 x64、PHP 7.17 NTS x64
  • 代码同步:Visual Studio Code(SFTP)

Window 环境

安装拓展之前需要知道运行环境的 PHP 版本信息,以便下载正确的拓展。

首先,拓展分运行架构,x64 和 x86;其次 PHP 分版本,不同版本的拓展程序不同,以及 TS 和 NTS 版本。

通过右击计算机,属性中可以了解到环境的运行架构。

执行命令来获取 PHP 版本:

$ php -v
PHP 7.1.7 (cli) (built: Mar 15 2018 11:08:04) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Xdebug v2.7.0alpha1, Copyright (c) 2002-2018, by Derick Rethans

PHP 版本为 7.1.7,NTS 版本。

来到 XDebug 的官方站点下载对应拓展:[Xdebug:[Downloads]](https://xdebug.org/download.php)。

Unix 环境

Unix 环境下,测试服务器下载拓展:

$ wget https://xdebug.org/files/xdebug-2.7.0alpha1.tgz

解压拓展包并进入解压目录:

$ tar zxvf xdebug-2.7.0alpha1.tgz
$ cd xdebug-2.7.0alpha1

执行编译:

$ phpize
$ ./configure --enable-xdebug --with-php-config=/usr/local/php/bin/php-config # php 配置目录请以实际环境修改
# 省略...
$ make && make install
# 省略...
Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/
# 省略...

复制上拓展的存放目录,这很重要。

现在打开编辑 php.ini 文件:

$ /usr/local/php/etc/php.ini

底部追加 Xdebug 配置:

zend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so
[XDebug]
xdebug.remote_enable = on
xdebug.remote_autostart = 1
;xdebug.remote_host = 192.168.10.1
xdebug.remote_port = 9000
xdebug.remote_connect_back = 1
xdebug.auto_trace = 1
xdebug.collect_includes = 1
xdebug.collect_params = 1
xdebug.remote_log = /tmp/xdebug.log

以上配置中已经开启了远程调试。若是本机环境则配置 remote_enable0 即可。

配置完成后,重启 PHP:

$ service php-fpm restart

然后查看配置是否成功:

$ php -m
tokenizer
xdebug
xml
xmlreader
xmlrpc
xmlwriter
xsl
yaf
zip
zlib

[Zend Modules]
Xdebug

如果能看见 Xdebug 字样则配置成功,否则重新执行安装。

配置远程调试

这里我使用 Visual Studio Code 编辑器的 Xdebug 调试工具(需要安装)。打开一个项目,选择右边的蟑螂图标,进入 Xdebug界面,配置 Xdebug 远程调试,配置文件 configurations 新增一个项目配置:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Test",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "serverSourceRoot": "/home/wwwroot/pulin_openapi",
            "localSourceRoot": "${workspaceRoot}"
        },
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000,
        }
    ]
}

serverSourceRoot 是你服务器中项目的路径,localSourceRoot 是你本机环境中的项目路径。

现在,在项目中打上一个断点测试,按下 F5 一下吧~

参考

「hey serve the purpose of changing hydrogen into breathable oxygen, and they’re as necessary here as the air is, on Earth.」

「But I still say……they’re flowers.」

「If you like.」

「Do you sell them?」

「I’m afraid not.」

「But, maybe we could make a deal.」

日常循环 Flower Dance 的时候在评论置顶看见了碗叔中国巡演,从不追星的我竟然有些悸动?

24 日,17点,深圳·雅玛水公园。提前一个小时到达,因为是音乐节,还有其他的歌手在演出,舞台下观众熙熙攘攘。马上就要见到碗叔了,那个戴着帽子的肥胖大叔。: )

即将登场

天渐渐的黑了,现场人也越来越多,灯光把氛围烘托得很棒,碗叔他还带着帽子~

碗叔

讲真来之前我并不知道出了新专辑,直到买周边的时候发现了这个。新专辑 Flower Dance 都出 Pt.2 了,你脱单了吗?<( ̄︶ ̄)>

新专辑《Restory》

话说 Emliy Styer 小姐姐的声音很好听,上场时一句「牛逼」瞬间对这位小姐姐路转粉。

后来啊,天空飘起了小雨,现场依然热情不减。Emily Styer 现场弹奏了一首 Flower Dance,会弹钢琴的女孩子真美。音浪拍打在身上的感觉真的棒极了。 (●゚ω゚●)

最后的最后,一首现场版 Flower Dance 献给大家,由于视频太大了,我已经上传到网易云啦。

移步网易云:Flower Dance - DJ OKAWARI 深圳 2018 后青年音乐节

此文为 造轮子之谷歌镜像站 的衍生。

其实谷歌字体在 2017 年左右就已经解封了,现在解析到的一个北京的 IP 上。对于前端来说,使用谷歌字体再也不用担心加载不出来了。

最早玩博客的时候,谷歌字体是我必屏蔽的(解决不了问题,就解决出问题的代码),到后来我使用过 360 旗下的 http://fonts.useso.com (挂了)也用过 Cat Networks 下的 https://fonts.cat.net,到后来谷歌字体解封,喜大普奔连忙换上 https://fonts.googleapis.com,享受着谷歌给开发者带来的福利。

问题出现在最近,公司的网络防火墙貌似把谷歌字体库给墙了。以上所有字体库全都凉凉(<de;>防火墙:对,不是针对谁,在座的都是辣鸡)。这样带来的问题就是——我特么打开一个带谷歌字体的网页先让我看近半分钟的开场白。我的博客,我刚写的 OpenAPI,无一幸免。

我得做点什么。首先得明白是什么原因,打开终端输入命令 ping fonts.googleapis.com 得到 IP 172.217.24.42(香港,且无法 Ping 通);拔掉网线,连上手机热点终端输入命令 ping fonts.googleapis.com 得到 IP 203.208.50.70(北京,能 Ping 通)。

其实现在问题变得很简单了,公司的网络将谷歌字体库的域名仍解析在国外的服务器上。所以我们只需要将本地的 Hosts 文件手动指向北京的 IP 就好了。Windows 在 C:\Windows\System32\drivers\etc\hosts,Mac / UNIX 在 /etc/hosts 新增一行 203.208.50.70 fonts.googleapis.com 就能解决一半的问题。

然鹅。我就喜欢用复杂的方式来解决简单的问题!脑海中冒出一个有趣的想法——为什么不自己搭建一个谷歌字体镜像呢?

利用 Nginx 进行反向代理,然后用 CDN 做缓存

套路和搭建谷歌镜像站差不多,不过值得注意的是在 fonts.google.com 中得到的 CSS 文件里有 fonts.gstatic.com (北京 IP 为 203.208.51.56,修改 Hosts 文件的话需要新增一行 203.208.51.56 fonts.gstatic.com)的路径,如果 fonts.googleapis.com 被墙了,那么这个肯定也不可幸免。所以需要反向代理两个站点。

搭建这个镜像站也不需要境外服务器,只需要你的服务器能正常访问就行。配置如下:

server
{
    listen 80;
    # listen 443 ssl http2;
    server_name fonts.openapi.link;
  
    # 强制跳转 HTTPS
    #if ($server_port !~ 443){
    #    rewrite ^(/.*)$ https://$host$1 permanent;
    #}
    #HTTP_TO_HTTPS_END
    # HTTPS 证书地址
    # ssl_certificate    /foo/bar.key; 
    # ssl_certificate_key    /foo/bar.pem;
    # ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    # ssl_prefer_server_ciphers on;
    # ssl_session_cache shared:SSL:10m;
    # ssl_session_timeout 10m;
    # error_page 497  https://$host$request_uri;
    
    # 用于 fonts.googleapis.com 代理
    location /css {
      sub_filter 'fonts.gstatic.com' 'fonts.openapi.link';
      sub_filter_once off;
      sub_filter_types text/css;
      proxy_pass_header Server;
      proxy_set_header Host fonts.googleapis.com;
      proxy_set_header Accept-Encoding '';
      proxy_redirect off;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Scheme $scheme;
      proxy_pass https://fonts.googleapis.com;
      proxy_cache cache_one;
      proxy_cache_key $host$request_uri$is_args$args;
      proxy_cache_valid 200 304 301 302 1h;
      expires 365d;
    }
    # 用于 fonts.gstatic.com 代理
    location / 
    {
      proxy_pass_header Server;
      proxy_set_header Host fonts.gstatic.com;
      proxy_redirect off;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Scheme $scheme;
      proxy_pass https://fonts.gstatic.com;
      proxy_cache cache_one;
      proxy_cache_key $host$request_uri$is_args$args;
      proxy_cache_valid 200 304 301 302 1h;
      expires 365d;
    }
    # 日志
      access_log  /www/wwwlogs/fonts.openapi.link.log;
}

总算折腾完了,配置上 CDN,速度杠杠的。也欢迎使用我的谷歌字体镜像 fonts.openapi.link

嗷~对了!各位看官再等等,我有一个大宝贝给你们介绍一下(掏裤裆)——开放 API:为开发者而生。

后来我想想,我折腾了这么大一圈图什么呢?