docker 获取宿主机ip的方式

在宿主机中执行下面的命令,反馈的ip即是宿主机ip:

#ping host.docker.internal
发表在 docker | 留下评论

docker 启动时修改启动命令参数,gitlab-runner docker启动时修改用户运行用户为root

1. 通过docker inspect 【gitlab-runner】查看容器信息
2. 参考 Args 可修改默认执行参数
例如 gitlab-runner docker 默认启动参数为 –user=gitlab-runner, 要修改为root用户可使用下面的命令

docker run -d --name gitlab-runner -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /root/.ssh:/root/.ssh -v /www:/www gitlab/gitlab-runner:alpine-v13.12.0 run --user=root --working-directory=/home/gitlab-runner
//最后的  run --user=root --working-directory=/home/gitlab-runner 即是修改的默认启动参数
发表在 docker, git | 标签为 , | 留下评论

node 调试用web server

//index.js
const http = require('http')
const server = http.createServer((req, res) => {
    // req即request,res即response

     //console.log('ok'); // 每次请求都会执行一次回调函数中的语句

   // 浏览器输入的 url 为 http://localhost:2000/hello?username=sense&sex=male#hello,
   // 则 req.url 为 /hello?username=sense&sex=male,
   // 浏览器输入的 url 中的 hash(如上的 #hello)无法传递到后端
   const url = req.url.split('?')[0]

   res.end(url)
   // 每次触发请求回调函数中只能调用一次response.end(),否则会报错
 })
const port = 3000;
server.listen(port)
console.log('hello port '+ port);
#node index.js
发表在 js, 前端 | 留下评论

设计模式感悟

1. 只有真正的熟悉掌握了一种设计模式的思想以及使用场景和使用方法,才能触类旁通的快速了解它的设计模式,而不是似是而非的懵懂!
2. 当你真正的熟悉的掌握了两种或3种设计模式,那么在设计代码时,其他的设计模式对你来说才“真正”的提供了一种“解决问题的思想“而已,很快的就能被你掌握和使用!
3. 当你对于一种设计模式不断加深了解的同时,你也会对设计模式的思想其他设计几种模式潜移默化的加深了解。

发表在 设计模式 | 留下评论

Yii debug 工具 dump panel 使用

1. 设置 yii debug

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
        // uncomment the following to add your IP if you are not connecting from localhost.
        'allowedIPs' => ['127.0.0.1'],
        'panels' => [
            //设置dump,默认的dump只接受 application 分类,vendor/yiisoft/yii2-debug/src/panels/DumpPanel.php
            'dump' => [
                'class' => 'yii\debug\panels\DumpPanel',
                'categories' => ['response'],
            ]
        ]
    ];
}

2. 使用

//yii debug dump 默认只收集debug级别的日志
\Yii::debug("hi", "response");//response 是在配置时使用的日志分类
发表在 php, yii2 | 留下评论

工厂方法模式

假设要实现一个功能,要封装访问数据库的操作。
1. 不实用设计模式的情况:

/**
 *文件列表
 *|
 *|--Database.php 数据库封装类
 *|--main.php 使用程序(客户端)
 */

/**
 * Database.php 数据库封装
 */
class Database{
    public $connect = null;
    function select(){
        //...
    }
    function insert(){
        //...
    }
    function update(){
        //...
    }

    function delete(){
        //...
    }
}

/**
 * main.php
 */
$db = new Database();
$db->select();

//缺点:耦合严重,不好扩展

2. 简单工厂

/**
 *文件列表
 *|--drivers 数据库连接封装
     |-- BaseDrivers.php 产品超类
     |-- Mysql.php 具体的产品
     |-- TiDb.php 另一个具体的产品
 *|--DbFactory.php 数据库工厂
 *|--main.php 使用程序(客户端)
 */

/**
 * DbFactory.php 数据库工厂(简单工厂,产品是指定类型的数据库操作具柄)
 */
class DbFactory
{
    public static function getDatabase($name):Database
    {
        if($name == "mysql"){
            return new Mysql();
        }else if($name = "tidb"){
            return new TiDb();
        }

        throw new \Exception("driver not find:".$name);
    }
}

/**
 * BaseDrivers.php 数据库驱动基础类(简单工厂模式中的产品的超类,定义产品接口)
 */
abstract class BaseDrivers
{
    public $connect = null;
    abstract function select();
    abstract function insert();
    abstract function update();
    abstract function delete();
}


/**
 * Mysql.php mysql 数据库驱动类(具体的产品)
 */
class Mysql extends BaseDrivers
{

    function select()
    {
        // TODO: Implement select() method.
    }

    function insert()
    {
        // TODO: Implement insert() method.
    }

    function update()
    {
        // TODO: Implement update() method.
    }

    function delete()
    {
        // TODO: Implement delete() method.
    }
}


/**
 * TiDb.php tidb数据库驱动类(另一种具体的产品)
 */
class TiDb extends BaseDrivers
{

    function select()
    {
        // TODO: Implement select() method.
    }

    function insert()
    {
        // TODO: Implement insert() method.
    }

    function update()
    {
        // TODO: Implement update() method.
    }

    function delete()
    {
        // TODO: Implement delete() method.
    }
}


/**
 * main.php
 */
$database = DbFactory::getDatabase('mysql');//获取mysql的数据库操作
$database->select();

//优点:不说了,自行百度
//缺点:如果在添加其他的数据库类型操作,必须得修改DbFactory.php,增加 if...else... ,然后才能在main中获取新的数据库操作句柄

3. 工厂方法模式

/**
 *文件列表
 *|--drivers 数据库连接封装
     |-- BaseDrivers.php 产品超类
     |-- Mysql.php 具体的产品
     |-- TiDb.php 另一个具体的产品
 *|--factories.php 工厂封装
 *   |-- BaseFactory.php 工厂超类
 *   |-- MysqlFactory.php 具体工厂(只生产mysql产品的工厂)
 *   |-- TiDbFactory.php 另一个具体的工厂(只生产TiDb产品的工厂)
 *|--main.php 使用程序(客户端)
 */

/**
 * BaseFactory.php 工厂超类
 */
interface  BaseFactory
{
    function getDb();
}


/**
 * MysqlFactory.php mysql工厂
 */
class MysqlFactory implements BaseFactory
{
    function getDb()
    {
        return new Mysql();
    }
}


/**
 * TiDbFactory.php TiDb工厂
 */
class TiDbFactory implements BaseFactory
{
    function getDb()
    {
        return new TiDb();
    }
}

/**
 * BaseDrivers.php 数据库驱动基础类
 */
abstract class BaseDrivers
{
    public $connect = null;
    abstract function select();
    abstract function insert();
    abstract function update();
    abstract function delete();
}


/**
 * Mysql.php mysql 数据库驱动类
 */
class Mysql extends BaseDrivers
{

    function select()
    {
        // TODO: Implement select() method.
    }

    function insert()
    {
        // TODO: Implement insert() method.
    }

    function update()
    {
        // TODO: Implement update() method.
    }

    function delete()
    {
        // TODO: Implement delete() method.
    }
}


/**
 * TiDb.php tidb数据库驱动类
 */
class TiDb extends BaseDrivers
{

    function select()
    {
        // TODO: Implement select() method.
    }

    function insert()
    {
        // TODO: Implement insert() method.
    }

    function update()
    {
        // TODO: Implement update() method.
    }

    function delete()
    {
        // TODO: Implement delete() method.
    }
}


/**
 * main.php
 */
$database = MysqlFactory::getDb();
$database->select();

//优点:新增数据库类型时,不用在修改框架部分代码(没有了Factory.php,不用在依赖这个类了)。只需要新添加一个对应的工厂,然后新增加一个数据库driver(产品),就可以直接在客户端(main.php)使用了,完全不影响其他的已经完成的功能。
发表在 设计模式 | 留下评论

mysql 新增数据时防止唯一字段重复导致插入错误

insert into a (id) 
select 1 from DUAL
where not exists (select id from a where id = 1)
发表在 未分类 | 留下评论

git tag 管理

查看所有标签

git tag

查看指定格式的标签

git tag -l v1.*.*

检出到某个标签

git checkout v1.0.0

创建标签(本地)
1.

git tag v1.0.0

2. (推荐)

git tag -a v1.0.0 -m "这是备注信息"

3.

git tag -a v1.0.0 [分支版本号] -m "这是备注信息"

删除标签

git tag -d v1.0.0

删除远程标签
1. 删除本地标签
2.

git push origin :refs/tags/v1.0.0

把标签推送到服务器上
1. 推动所有标签

git push origin --tags

2. 推送指定版本

git push origin v1.0.0
发表在 git | 标签为 , , | 留下评论

js 一键复制文本

function copyToClipboard(t) {
	if (window.clipboardData && window.clipboardData.setData) return clipboardData.setData("Text", t);
	if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
		var e = document.createElement("textarea");
		e.textContent = t, e.style.position = "fixed", document.body.appendChild(e), e.select();
		try {
			return document.execCommand("copy")
		} catch (t) {
			return console.warn("Copy to clipboard failed.", t), !1
		} finally {
			document.body.removeChild(e)
		}
	}
}
发表在 js, 前端 | 标签为 | 留下评论

基于swoole实现超简单子进程管理工具

<?php
/**
 * 子进程管理工具,处理大数据时,防止创建过多的子进程导致内存过载
 * swoole 官网 https://wiki.swoole.com/
 */

namespace app\library;


use Swoole\Process;

/**
 * Class SubProcess 基于swoole实现的子简单进程管理,主要用于让"子进程"完成数据处理任务。
 * eg:
 * $subProcess = new SubProcess(10); //最多启用10个子进程
 * $id = 0;
 * while(1){
 *      $list = $db->where(['>', 'id', $id])->limit()->queryAll();//获取一批数据
 *.     if(!$list) break;
 *.     
 *      $id = $list[count($list)-1]['id'];
 *      $subProcess->do(function()use($list){//交付给子进程执行
 *          Yii::$app->db->close();//重新启用db,子进程中资源类型的变量将会失效,重新获取
 *          //do something
 *      });
 * }
 * $subProcess->wait();//等待所有子进程执行完毕
 * @package app\library
 */
Class SubProcess
{
    protected $maxNum = 0;
    protected $list = [];

    public function __construct($maxNum = 10)
    {
        $this->maxNum = $maxNum;
    }

    /**
     * 在子进程中处理
     * @param $callback
     */
    public function do($callback)
    {
        $this->canAdd();
        $process = new Process(function () use ($callback) {
            call_user_func($callback);
        });
        $process->start();
        $this->list[$process->pid] = 1;
    }

    /**
     * 等待所有子进程完成
     */
    public function wait()
    {
        while (count($this->list)) {
            $this->waitASubProcess();
        }
    }

    /**
     * 是否需要添加子进程
     * @return bool
     */
    protected function canAdd()
    {
        if (count($this->list) < $this->maxNum) {
            return true;
        }

        $this->waitASubProcess();
        return true;
    }

    /**
     * 等待一个子进程结束
     */
    protected function waitASubProcess()
    {
        $status = Process::wait();
        unset($this->list[$status['pid']]);
    }
}
发表在 php, php函数集, swoole, 基础, 框架 | 标签为 , , | 留下评论