易栈网-膘叔

浏览模式: 标准 | 列表 | 图文
如何将域名转出琥珀网

如何将域名转出琥珀网

鉴于10多年前还留了几百块在琥珀网里,只能记录一下转出步骤了。。。。

第一步,琥珀网 点击菜单上的“我的域名”

第二步,琥珀网 点击你要转出的域名,进入“域名面板”

第三步,琥珀网 点击“基本设置”

第四步,琥珀网 把“域名转移锁定”设置为关闭

第五步,琥珀网 返回上一个页面,回到“域名面板”

第六步,琥珀网 点击“高级设置”

第七步,琥珀网 点击“邮件索取转移注册商密码即 Auth code”

第八步,琥珀网 到此域名已经解锁并且转移密码也发到域名所有人的邮箱,收到的邮件

第九步,琥珀网 拿“转移密码”去新的注册商提交转移即可
记得可能会在垃圾邮件里。
BTW:琥珀的域名要注册满60天后,才能转出(注册完后就等上2个月吧)
http://www.hupo.com,现在应该没有人用这个网站了吧?
phpcomposer换镜像

phpcomposer换镜像

最近好象phpcomposer的镜像有点问题,有些JSON包好象都无法更新了。还出现了404,导致根本无法更新,建议先换成laravel-china.org的源吧

打开:dl.laravel-china.org,里面有配置。如果偷懒,这一句也行:
composer config -g repo.packagist composer https://packagist.laravel-china.org
[转]2018国内优秀开源镜像站汇总

[转]2018国内优秀开源镜像站汇总

网上找的,主要是因为在国内,用了sury的PHP源,然后发现package.sury.org卡成狗,找啊找,找到了xtom.com.hk的镜像。发现非常快。顺便找到了下面的贴子。国内的PHP源,只有xtom有了,好纠结。好象香港的速度也挺快

原文来自:https://blog.csdn.net/gas_exchange/article/details/80913945

2018国内优秀开源镜像站汇总
一、站点版
企业站
1.网易:http://mirrors.163.com/
2.阿里云:http://mirrors.aliyun.com/ 同步频率为每天一次,每天凌晨2:00-4:00为镜像的同步时间
3.搜狐:http://mirrors.sohu.com/

1.清华大学:https://mirrors.tuna.tsinghua.edu.cn/
2.中国科技大学:http://mirrors.ustc.edu.cn/ 目前是中国大陆高校访问量最大,收录最全的开源软件镜像。
3.北京理工大学:http://mirror.bit.edu.cn/web/
4.北京交通大学:https://mirror.bjtu.edu.cn/cn/ eclipse, rpmfusion, linux kernel
5.浙江大学:http://mirrors.zju.edu.cn/ EPEL, Gentoo, Kali Linux, openSUSE, PostgreSQL
6.南阳理工学院:http://mirror.nyist.edu.cn/ 下载速度不理想
7.首都在线科技股份有限公司(英文名Capital Online Data Service):http://mirrors.yun-idc.com/
8.中国电信天翼云:http://mirrors.ctyun.cn/ 更新不及时

--EOF--

inotify的相关文章和资料

inotify的相关文章和资料

应该不会消失的链接:

1、https://infoq.cn/article/inotify-linux-file-system-event-monitoring

2、http://ju.outofmemory.cn/entry/264098

3、http://icodeit.org/2015/03/build-monitor-script-based-on-inotify/ ,他有提到mac用fswatch

4、http://ju.outofmemory.cn/entry/278544 有一个现成的同步脚本

其实我5年前有写过一个inotifywait + php 的脚本,主要是用来检测哪些文件被人修改了,用做防篡改。可能最近会重新用上,温故一下旧知识点

nginx+workerman做自动CI(初级)

nginx+workerman做自动CI(初级)

本文是利用nginx的proxypass来做代理到workerman创建的webserver上,从而使得github的git webhook可以起作用。

代码不复杂

1、准备一个composer.json,内容超短:

{"name":"auto deploy","authors":[{"name":"gouki","email":"neatcn@qq.com"},"require":{"workerman/workerman":"dev-master"},"license":"MIT"]}
2、复制下面的代码,并赋予可执行权限(也可以不赋予,直接使用php xxx.php start 即可)
#!/usr/bin/env php
<?php
/**
* composer.json的内容,如果不依赖其他系统,则runtime目录设置为/,同时设置PORT
* {"name":"auto deploy","authors":[{"name":"gouki","email":"neatcn@qq.com"},"require":{"workerman/workerman":"dev-master"},"license":"MIT"]}
* 使用方法:
* php {filename} start -d
* php {filename} reload -g -d
* php {filename} stop -g
*/

use Workerman\Connection\ConnectionInterface;
use Workerman\Worker;

include __DIR__ . "/vendor/autoload.php";

// define('ROOT_PATH', __DIR__);
//http server的端口,用于给nginx做反代,不要和其他程序有冲突
define('HTTP_SERVER', "http://0.0.0.0:8002");
//存放LOG的位置,记得以 / 结尾
define('RUNTIME_PATH', __DIR__ . "/runtime/");

//commit message中的关键字,检测到后才需要更新,如果留空。则全部更新
// define('DEPLOY_KEYWORD','deploy');
Worker::$pidFile = RUNTIME_PATH . str_replace('/', '_', __FILE__) . ".pid";

$config = [
'demo.neatstudio.com' => [
'target' => '/server/wwwroot/yzhan/neatstudio.com',
'secret' => '123456',
//commit message中的关键字,检测到后才需要更新,如果留空。则全部更新
'keyword' => 'deploy',
'commands' => [],
]
];

$worker = new Worker(HTTP_SERVER);
$worker->count = 1;
$worker->reloadable = false;
$worker->onWorkerStart = function() {
};
$worker->onError = function(ConnectionInterface $connection) {
$connection->close(resp_error_msg("ERROR", ['request' => func_get_args()]));
};

$worker->onMessage = function(ConnectionInterface $connection, $data) use ($config) {
// echo(sprintf("[%s]IP: %s:%s , Data: %s", date("Y-m-d H:i:s"), $connection->getRemoteIp(), $connection->getRemotePort(), var_export($data, true)));
$server = $data['server'];
if($server['CONTENT_TYPE'] === "application/x-www-form-urlencoded"){
$post = json_decode($data['post']['payload'], true);
} else{
$post = $data['post'];
}
$repository = $post['repository']['name'] ?? "";
$commitMsg = $post['head_commit']['message'] ?? "";

if(!isset($config[$repository])){//配置资源
$connection->close(resp_error_msg('GIT资源未配置'));
return;
}
$deployKeyword = $config[$repository]['keyword'];
//只有有关键字的时候才会部署
if($commitMsg && $deployKeyword && strpos($commitMsg, $deployKeyword) === false){
$connection->close(resp_error_msg('未检测到关键字,不用部署'));
return;
}
// echo $server['HTTP_X_HUB_SIGNATURE'], "\n";
// echo "sha1=" . hash_hmac('sha1', $GLOBALS['HTTP_RAW_REQUEST_DATA'], $config[$repository]['secret']), "\n";

if(strpos($server['HTTP_USER_AGENT'], "GitHub-Hookshot/") === false ||
$server['HTTP_X_HUB_SIGNATURE'] !== "sha1=" . hash_hmac('sha1', $GLOBALS['HTTP_RAW_REQUEST_DATA'], $config[$repository]['secret'])){
$connection->close(resp_success_msg('数据校验失败'));
return;
}

$ret = '';
//开始执行
$commands = [
"cd {$config[$repository]['target']} ",
"git fetch --all",
"git reset --hard origin/master",
"./yii cache/flush-schema --interactive=0",
];
$commands = array_merge($commands, $config[$repository]['commands'] ?? []);
exec(join(" && ", $commands), $ret);
// exec("cd {$config[$repository]['target']} && git fetch --all && git reset --hard origin/master && ./yii cache/flush-schema --interactive=0 ", $ret);
$connection->close(resp_success_msg('更新成功', $ret));
};
Worker::$logFile = RUNTIME_PATH . "workerman.log";
Worker::runAll();

function resp_json($data, $message = '', $is_error = 0)
{
$result['status'] = 0;
if($is_error){
$result['error'] = $data;
} else{
$result['status'] = 1;
$result['datas'] = $data;
}
$result['message'] = $message;
return json_encode($result, JSON_UNESCAPED_UNICODE);
}

function resp_success($data)
{
return resp_json($data);
}

function resp_success_msg($message, $data = [])
{
return resp_json($data, $message);
}

function resp_error($data)
{
return resp_json($data, '', 1);
}

function resp_error_msg($message, $data = [])
{
return resp_json($data, $message, 1);
}

是不是基本上控制 在100行内?因为访问量不会太大。所以我设置worker->count = 1,即,只启用一个子进程。

有人会说了,其实写一个PHP文件就可以了,设置为web目录指定一个域名不就完事了吗?是的,你说的这样其实也行,但有一点,如果你需要执行git命令还有使用exec命令,可能你的权限就不足了。而且。如果你的GIT是 采用root权限来git pull的。你拉回来的文件的owner都是root,这时候还需要执行chown -R www-data:www-data . 来处理,如果你是当成web项目来做,可能你就没有这个权限。

因此workerman就有了这样的功能。毕竟他是以root权限来运行的(也可以指定其他权限,如果指定非www-data[ubuntu/debian],你还得有权限设置目录的用户组)

-----

对比wallE和那个女娲系统,我这个是超级简单了。只有一个文件。而且不能远程操作(远程操作建议使用本程序+ansible),是不是也简单的够你用了,至少比以前写的 每分钟执行git pull一次好很多,workerman也支持多线程和多进程。性能也不差

mac finder中的cmd+x/cmd+v

mac finder中的cmd+x/cmd+v

如果直接在finder中cmd+x/cmd+v,是没有任何作用的。原来一直以为只有cmd+c/cmd+v,然后再去删除原来的。或者。。。。拖动文件

其实,cmd+c/cmd+option+v,就相当于剪切了!
这个快捷键,从Lion版开始就有了,只是之前真心不知道。
Yii2 ErrorHandler的自定义

Yii2 ErrorHandler的自定义

不想多说这个,这一篇写的很好:Yii2组件分析:错误处理(ErrorHandle),我在这里只是想多说一两句:Yii::$app->getErrorHandler()->register(),这一条非常重要。

为什么多提这一句,是因为我在开发的过程中,用了不少的module,想为每一个module都单独设置一个errorHandler,所以特别的在module的init里加入了:Yii::$app->setComponents(['errorHandler'=>['class'=>'CustomErrorHandler']]);然而并不起作用,因为就少了那一句:Yii::$app->getErrorHandler()->register();

原因就是上文链接中提到的。Yii2在register方法里对输出做了自定义的处理,如果你不做一次register,你所使用的,将一直是配置文件中所配置的那个ErrorHandler。

这也就说明了,Yii::$app->setComponents()这个方法,还是要根据实际 情况来的。不是说临时改点变量,就可以直接用的。慎重

tinymce 5 的dialog不再支持iframe了

tinymce 5 的dialog不再支持iframe了

尝试整个vue+tinymce的时候遇到点问题(之前说过,本来是用quillJS的。但如果要发表的内容支持那些微信编辑器里复制过来的内容。quill自己定义过的一些虚拟DOM就不支持了)

希望是美好的,实现起来是麻烦的,最后我放弃所有的选项,改用弹框iframe的形式。然而,问题就这么来了,tinymce5的dialog居然不支持iframe了。比如你看这个:https://github.com/tinymce/tinymce/issues/4786,官方直接说不支持了。NND

不过有人提示说,可以利用htmlpanel,直接在htmlpanel的html标签里,用<iframe。。。然后我试了一下。。居然真的OK

好吧,直接参考 这个了!https://github.com/tinymce/tinymce/issues/4786#issuecomment-463827289

JS文件:

function FileManager(callback, value, meta) {
var windowManagerURL = "/FilManage";// filemanager path

var windowManagerCSS = '<style type="text/css">' +
'.tox-dialog {max-width: 100%!important; width:97.5%!important; overflow: hidden; height:95%!important; border-radius:0.25em;}' +
'.tox-dialog__header{ display:none!important; }' +// for custom header in filemanage
'.tox-dialog__footer { display: none!important; }' +// for custom footer in filemanage
'.tox-dialog__body { padding: 0!important; }' +
'.tox-dialog__body-content > div { height: 100%; overflow:hidden}' +
'</style > ';
window.tinymceCallBackURL = '';
window.tinymceWindowManager = tinymce.activeEditor.windowManager;
tinymceWindowManager.open({
title: '',
body: {
type: 'panel',
items: [{
type: 'htmlpanel',
html: windowManagerCSS+ '<iframe src="' + windowManagerURL + '" frameborder="0" style="width:100%; height:100%"></iframe>'
}]
},
buttons: [] ,
onClose: function () {
if (tinymceCallBackURL!='')
callback(tinymceCallBackURL, {}); //to set selected file path
}

} );
}

iframe中:

var windowManager = top != undefined && top.tinymceWindowManager != undefined ? top.tinymceWindowManager : '';


if (windowManager != '') {
if (top.tinymceCallBackURL != undefined)
top.tinymceCallBackURL = path;
windowManager.close();
}
Error: Calling needs :cxx11 is disabled! There is no replacement.

Error: Calling needs :cxx11 is disabled! There is no replacement.

brew 安装个软件,没装成功却开始报这个错了:

Already up-to-date.

Error: Calling needs :cxx11 is disabled! There is no replacement.

Please report this to the chrisdeeming/legacyphp

tap: /usr/local/Homebrew/Library/Taps/chrisdeeming/homebrew-legacyphp/Formula/php@7.0.rb:41

我晕。现在都7.2了,这个源还报错?看了下官网。原来这个源不再需要:needcxx11了。OK,官网说重新brew update一下就好了。

重新brew update。恢复正常

1、https://github.com/chrisdeeming/homebrew-legacyphp/pull/4

2、https://github.com/chrisdeeming/homebrew-legacyphp/issues/2