分类 默认分类 下的文章

转自:https://gist.github.com/lzqwebsoft/6458377

  1. Prism

  Prism是一个只有1.5KB大小的压缩版轻量级工具,能够简单方便的整合到CSS和JavaScript文件里,运行速度很快。已经使用在Dabblet里(一个交互式的CSS场地)美化了很多代码,所以说Prism很稳定。新的编程语言也可以加入进来,在使用这个插件架构的前提下,新加入的语言功能性将不断提升;外观风格和使用感觉都可以通过CSS来设计。

  2. Rainbows

  Rainbow是一款用JavaScript脚本编写的只有1.4KB的轻量级工具。它只需要在有必要高亮显示的语言上使用JavaScript模型来保持事情简单化就可以了。同样,颜色和字体可以通过CSS主题支持来完全自定义。

  3. Snippet

  Snippet是一个jQuery插件,建立在SHJS脚本的顶部以此来高亮显示HTML文件里的源代码。它支持很多种类的脚本语言:JavaScript、SQL、PHP和Ruby等等。其包含39个内置的独一无二的配色图案,可以不断的变换调试。

  4. Geshi

  这是一个高度自定义的语法高亮显示工具,可以在网页里用来更好的展示代码片段。Geshi经过开发后来应用在phpBB论坛软件上,但在功能特性上仍然是分开使用的。此外,这个语法高亮工具支持几乎所有的流行编程语言,像ActionScript、ASP、C、JAVA、PHP、Ruby和SQL等等。

  5. Syntax Highlighter

  Syntax Highlighter帮助一个开发者/码农轻松在线公布代码片段,而且代码的外观看上去也很不错。说白了,它就是一个100%建立在JavaScript基础上的高亮显示工具,不用考虑服务器上有什么其他东西。支持多款编程语言,压缩后的核心库只有11KB大小。然而,Syntax Highlighter并不具备编写高亮代码的能力,也不为用户提供编写源代码的能力。

  6. Google Code Prettify

  这是在Google Code网站使用的脚本。这个脚本能够自动查出正在使用的编程语言,进行相应的美化。同时也可以通过CSS来自定义。

  7. Hightlight.js

  Hightlight.js基本上不需要采用复杂的步骤就可以使用了,因为它的自动化程度很高:找出代码块,检测语言,高亮显示一下就行了。它已经开始支持第三方应用程序,并提供Firefox扩展程序用于查看代码,但是没有语法高亮显示。

  8. SHJS:Syntax Highlighting in JavaScript

  SHJS是一个JavaScript程序,它可以高亮显示在HTML文档里的源代码段落。文件使用SHJS将会通过web浏览器高亮显示在客户端。这就赋予了SHJS一项功能,那就是能够高亮显示源代码是使用不同的语言编写的。

  9. Quick Highlighter

  这个在线高亮工具提供许多编码语言,你可以选择多个选项将这些编码语言集体高亮显示。在高亮显示代码、Combine Style、HTML Code、Highlight内置关键词、数据类型、Strict Mode和Wrap过剩文本之前你可以选择检查或者不检查代码。

  10. Ultraviolet

  Ultraviolet是一个运行在Ruby上的语法高亮引擎,支持50种以上的编程语言和20种以上的主题。

  11. Pygments:Python Syntax Highlighter

  这款语法高亮工具是用Python构建的,支持大部分的编程语言、多种输出格式,它还可以被当作是一个命令行工具或者是一个类库来使用。

  12. Lighter for MooTools

  Lighter是一个免费的语法高亮工具,专门为MooTools而开发的。MooTools开发者在创建Lighter之初运用了许多框架结构上的功能特点。它运用起来就像是在网页上添加一个单独的脚本那样简单,选择你想要高亮显示的元素,Lighter会自动处理其余部分。

  13. CodePress

  CodePress是一个基于网络的源代码编辑器,带有用JavaScript编写的语法高亮工具,随着在浏览器里连续打字,文本的颜色会实时发生变化。除此以外,它还有代码片段、自动完成、快捷方式和多窗口功能。

  14. Beauty of Code

  这个jQuery语法高亮插件使用的是Alex Gorbatchev里的语法高亮显示,但有一点不一样:它能够产生更多的xhtml兼容的代码。

  15. Jush JavaScript Syntax Highlighter

  JavaScript Syntax Highlighter可以用在客户端的语法高亮程序里,支持的语言有HTML、CSS、JavaScript、PHP、SQL、HTTP、SMTP协议、php.ini和Apache配置。

转自阿里云社区文章:https://developer.aliyun.com/article/802318
使用场景
本地网络联机游戏
远程桌面
程序远程调试
远程文件传输等

前情提要
Zerotier作为一款开源异地虚拟局域网构建工具,已经被广泛关注和应用,相比蒲公英、花生壳等工具,zerotier免费、可加入节点多,数据传输安全,但有时两台都在内网的主机打通udp隧道较为困难,而且通常延迟较高,好在官网提供了解决方案,即使用一台接入公网的主机作为MOON节点,用于初始化打通两节点之间的隧道,使延迟可以从几百ms降至十几ms,故我选择了阿里云2核2g内存的ecs作为moon节点,十分有效。

ecs/MOON端
出于个人习惯,我选择ubuntu20.04作为操作系统
1.下载Zerotier
参考官网指南

curl -s https://install.zerotier.com | sudo bash

2.启动zerotier服务

service zerotier-one start

3.加入zerotier网络

zerotier-cli join <your_network_id>

之后在web端控制台允许此节点接入网络

4.生成MOON节点
首先进入zerotier目录“/var/lib/zerotier-one”

cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public >> moon.json

然后修改moon.json

{
  ..
  {
    ..
    ”stableEndpoints”:[]
  }
  ..
}

添加ECS的公网ip地址

{
  ..
  {
    ..
    ”stableEndpoints”:[“<your_ip_addr>/9993”]
  }
  ..
}

保存并退出
5.生成签名文件

Zerotier-idtool genmoon moon.json

命令执行后,当前目录生成一个名为000000xxxxxxxxxx.moon的文件

其他主机/PLANET端
6.配置moon
将签名文件放在当前目录的子目录“moons.d”(首次需要新建目录)下,并拷贝该签名文件至所有需要配置moon节点的主机中,对于windows系统的节点,找到该路径“C://ProgramData/Zerotier/One/”,在此目录下新建moons.d文件夹,并放入签名文件。最后重启zerotier服务

Service zerotier-one restart

7.测试效果
使用命令:

Zerotier-cli peers

查看各节点状态(windows系统下zerotier-cli位于“C://Program Files(x86)/ZeroTier/One/”下),
出现为“MOON”的节点则配置成功,如果MOON节点对应为“—1–”,等待一段时间即可自动修改为ecs公网ip地址,可以通过分别ping moon节点的公网地址和虚拟局域网内网地址对比延迟来确定是否打通局域网。

最近在使用群晖 NAS 自带的 Docker 应用时,总是出现容器无法停止的情况,即使在命令行中使用 docker stop 也无济于事。

想再去控制台重启 Docker 应用,又发现 Document Viewer 应用依赖到 Docker 应用,无法单独重启 Docker ,必须先停掉 DocViwer 容器。

完蛋,这就进入死循环了……

由于群晖 NAS 系统是定制的,所以一般的 Linux 操作方式在群晖 NAS 的 shell 上是没用的。所以只能找相关的 Docker 服务重启脚本。

通过全局搜索,我找到了 /var/packages/Docker/scripts/start-stop-status 这个脚本。嗯,看起来应该是它没差了。

通过对脚本的查看,确认了可以重启 Docker 服务后,便执行对应的操作进行重启:

bash /var/packages/Docker/scripts/start-stop-status stop;
bash /var/packages/Docker/scripts/start-stop-status start;
重启完成后,Docker 服务果然恢复,能正常停止容器了。

转载自:https://huangzz.xyz/qun-hui-nas-shou-dong-chong-qi-docker-fu-wu.html

jenkins中的ansible插件在执行ansible命令

/usr/bin/ansible-playbook /etc/ansible/playbook/deploy.yml -l houtai -f 5 --private-key /tmp/ssh10272501188555214818.key -u root -e srcdir=/var/lib/jenkins/workspace/x.xx.com/ -e destdir=/web/tell/ -e opts=--exclude-from=/etc/ansible/playbook/deploy.exclude --become-user root

playbook任务配置文:deploy.yml

- hosts: test,online
  remote_user: root
  tasks:
          - name: deploy code to remote server
            synchronize:
                    src: '{{ srcdir }}'
                    dest: '{{ destdir }}'
                    mode: push
                    dirs: yes
                    owner: no
                    group: no
                    copy_links: no
                    delete: no
                    rsync_opts: '{{ opts | default("") }}'

          - name: copy files if not existing, and delete extraneous files
            synchronize:
                    src: '{{ srcdir }}/{{ item }}'
                    dest: '{{ destdir }}/{{ item }}'
                    mode: push
                    dirs: yes
                    owner: no
                    group: no
                    copy_links: no
                    delete: yes
                    rsync_opts: '--ignore-existing'
            with_items:
                    - common/coreCss/
                    - common/coreJs/
                    - common/css/
                    - common/js/
            ignore_errors: true

          - name: change files mode
            file:
                path: '{{ destdir }}/{{ item.0 }}'
                mode: '{{ item.1 }}'
            with_list:
                    - ['protected/yiic', '0755']
            ignore_errors: true

          - name: opcache_reset
            shell: /usr/bin/php -r 'opcache_reset();'
            ignore_errors: true

synchronize文件同步模块:文件忽略配置 deploy.exclude

.git
.idea
.user.ini
lextab.py
yacctab.py
/assets
/attachments
/uploads
node_modules
/protected/runtime

居中剪裁大致思路:

  1. 首先将图像进行缩放,使得缩放后的图像能够恰好覆盖裁减区域。(imagecopyresampled — 重采样拷贝部分图像并调整大小)
  2. 将缩放后的图像放置在裁减区域中间。(imagecopy — 拷贝图像的一部分)
  3. 裁减图像并保存。(imagejpeg | imagepng | imagegif — 输出图象到浏览器或文件)

    /**
     * 居中裁剪图片
     * @param string $source [原图路径]
     * @param int $target_w [设置宽度]
     * @param int $target_h [设置高度]
     * @param string $target [目标路径]
     * @return bool [裁剪结果]
     */
    private function imageCenterCrop($source, $target_w, $target_h, $target)
    {
        if (!function_exists('gd_info')) {
            $this->msg('gd库扩展未安装');
            return false;
        }

        if (!file_exists($source)) {
            $this->msg("文件不存在: {$source}");
            return false;
        }

        list($source_w, $source_h, $_type) = getimagesize($source);
        $this->msg("图片类型:{$_type},{$source}");

        /* 根据类型载入图像 */
        switch ($_type) {
            case IMAGETYPE_WEBP:
                $image = imagecreatefromwebp($source);
                break;
            case IMAGETYPE_JPEG:
                $image = imagecreatefromjpeg($source);
                break;
            case IMAGETYPE_PNG:
                $image = imagecreatefrompng($source);
                break;
            case IMAGETYPE_GIF:
                $image = imagecreatefromgif($source);
                break;
            default:
                $this->msg("不支持的文件类型: {$source}");
                return false;
        }
        /* 计算裁剪宽度和高度 */
        $judge = (($source_w / $source_h) > ($target_w / $target_h));
        $resize_w = $judge ? ($source_w * $target_h) / $source_h : $target_w;
        $resize_h = !$judge ? ($source_h * $target_w) / $source_w : $target_h;
        $start_x = $judge ? ($resize_w - $target_w) / 2 : 0;
        $start_y = !$judge ? ($resize_h - $target_h) / 2 : 0;
        /* 绘制居中缩放图像 */
        $resize_img = imagecreatetruecolor($resize_w, $resize_h);
        imagecopyresampled($resize_img, $image, 0, 0, 0, 0, $resize_w, $resize_h, $source_w, $source_h);
        $target_img = imagecreatetruecolor($target_w, $target_h);
        imagecopy($target_img, $resize_img, 0, 0, $start_x, $start_y, $resize_w, $resize_h);
        /* 将图片保存至文件 */
        if (!is_resource($target)) {
            $_dir = dirname($target);
            if (!is_dir($_dir) && !@mkdir($_dir, 0777, true)) {
                $this->msg("创建目录失败:{$_dir}");
                return false;
            }
        }
        switch ($_type) {
            case IMAGETYPE_WEBP:
                imagewebp($target_img, $target);
                break;
            case IMAGETYPE_JPEG:
                imagejpeg($target_img, $target);
                break;
            case IMAGETYPE_PNG:
                imagepng($target_img, $target);
                break;
            case IMAGETYPE_GIF:
                imagegif($target_img, $target);
                break;
        }
        return boolval(file_exists($target));
    }