首先,点击这里下载 Discord 。
吃鸡盛行,不得不使用靠谱的连麦软件,但是为什么还是 YY ?
我想了一个晚上,没想到任何优势,要硬说优点,可能只有:
为什么不直接说 YY 的缺点?这样可能缺少说服力。
功能 | YY 语音 | Discord |
---|---|---|
免费使用 | √ | √ |
IP&DDoS保护 | √ | √ |
浏览器支持 | √ | |
移动应用 | √ | √ |
好友功能 | √ | √ |
游戏内覆盖 | √ | |
低延迟 | √ | √ |
最小的CPU使用率 | √ | |
自定义热键 | √ | √ |
智能推送通知 | √ | |
权限 | √ | √ |
多个频道 | √ | √ |
markdown文本聊天 | √ | |
个别音量控制 | √ | |
Bot | √ | |
自制插件 | √ | |
自制主题 | √ | |
自定义CSS | √ | |
国际化 | √ | |
开发指南 | √ |
功能 | YY 语音 | Discord |
---|---|---|
广告 | √ | |
捆绑安装 | √ | |
弹窗 | √ | |
实名 | √ | |
会员 | √ | |
账号等级 | √ | |
新闻 | √ | |
低俗直播 | √ |
Discord 专注于游戏语音,从官网下载页,我们就可以看到非常的简洁。
而 YY7 下载页,介绍了一堆鸡肋功能,最后一个极速体验简直笑死人,YY 待机情况cpu使用率和内存占用不忍直视。
广告,我最想吐槽,记得有一次,YY 伪装成 Steam 图标闪烁,点开发现尽然是 YY ,真是服气。
用 Google 搜 YY 流氓
关键字可以看到超多的吐槽,有甚者说 360 都治不住。
当然,discord 也并不是没有短板,很直观的一点就是注册验证邮箱时要 番羽 土蔷 。最近的服务器在香港,大陆没有。
以上对比如有错误,希望能留言指出。
这里以后想到了就来补充。
]]>说实话,2017 的很多事情已经忘记,唯一清晰的就是 Jekyll Theme MDUI.
2017 的二月份,了解了 Jekyll 、 Materializecss ,尝试去撸一个 Jekyll 主题,当然是以失败告终.
三月份,了解到 MDUI ,首先感谢一波开发者开发出如此易用使用的 Material 风格的 UI 库.
开始使用 MDUI 去写新的主题,磕磕碰碰算是完成了 V1 的开发.
前几天去关闭最后的 issue 的时候,还是蛮开心的. 但是回头看看,写的很一般.
V2 不出意外应该会写.
2017 过的挺踏实的:
说说计划:
好了,学习去了,溜了.
]]>需要安装以下工具:
新建并进入要工作的目录:
mkdir workspace
cd workspace
不建议使用 windows 系统
创建 NGINX 的 Dockerfile
:
mkdir nginx
cd nginx
vim Dockerfile
输入:
FROM nginx
COPY nginx/default.conf /etc/nginx/conf.d/default.conf
可以看的我们 COPY
了一份 default.conf
,因此还要再新建一个 default.conf
:
vim default.conf
输入:
server {
listen 80;
server_name localhost;
root /app;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~* /(images|css|assets) {
index index.html;
}
}
创建conf.d
文件夹:
mkdir conf.d
以后所有的服务器配置全部放置在 conf.d
文件夹里。
返回 workspace
并创建 docker-compose.yml
:
# 这个时候的工作目录是在 workspace !
vim docker-compose.yml
输入以下内容:
version: '2.1'
services:
nginx:
build:
context: .
dockerfile: ./nginx/Dockerfile
volumes:
- ./site/data:/app
- ./nginx/conf.d:/etc/nginx/conf.d
ports:
- 80:80
- 443:443
在 volumes 中可以看的,./site/data
对应 /app
,也就是说,未来我们的jekyll构建的文件都将在 ./site/data
中。
这个时候,我们的 nginx
已经可以跑起来了,你可以在 ./site/data
创建一个index.html
,并使用:
docker-compose build
docker-compose up
然后访问你的ip,就可以看到了。
想当初,要使用 githooks 自动部署,必须在服务器安装 Ruby 。
如今,Docker 大法好。
在 workspace
下创建 jekyll
目录并建立 Dockerfile :
mkdir jekyll
cd jekyll
vim Dockerfile
输入:
FROM jekyll/jekyll
CMD jekyll build -w
返回 workspace
,编辑 docker-compose.yml
:
vim docker-compose.yml
修改为:
version: '2.1'
services:
# nginx 在这
nginx:
build:
context: .
dockerfile: ./nginx/Dockerfile
volumes:
- ./site/data:/app
- ./nginx/conf.d:/etc/nginx/conf.d
- /etc/letsencrypt:/etc/letsencrypt
ports:
- 80:80
- 443:443
# jekyll 在这
jekyll:
build:
context: .
dockerfile: ./jekyll/Dockerfile
volumes:
- ./site/source:/srv/jekyll
- ./site/data:/srv/jekyll/_site
在 volumes 中可以看的,./site/source
对应 /srv/jekyll
,也就是说,我们的jekyll 站点的源码就在 ./site/source
中;./site/data/homepage
对应 /srv/jekyll/_site
,也就是说,我们 jekyll 构建后的内容就在 ./site/data
中。
./site/data
目录正好对应 nginx。
比较建议将
./site/data:/srv/jekyll/_site
改为./site/data/jekyllsite:/srv/jekyll/_site
,并在./nginx/conf.d
里新建 nginx 配置,这样你可以更方便的管理一个以上的站点。
这个时候,我们的 jekyll
已经可以跑起来了,你可以在 ./site/source
中拉取我们的 jekyll 项目:
# ./site/source 目录里,命令最后有个"."
git clone https://git.coding.net/KeJun/homepage.git .
然后执行:
# `workspace` 目录里
docker-compose build
docker-compose up
此时,访问 ip ,成功的将jekyll部署啦~
由于我的远程仓库在 coding 里,无法操作 githooks 。
但是,无论是 github 还是 coding 都提供了 WebHook 。
我使用 nodejs 造了一个接受 coding webhook 一小段代码。
返回 workspace
,创建 autopull
目录并新建 config.js
:
module.exports = {
folder : "site",
port : 9091,
token : "xxx"
};
新建 index.js
:
var http = require('http');
var exec = require('child_process').exec;
var config = require('./config.js');
var main = function (data,res) {
//校验是不是第一次绑定
if (data.zen){
console.log(data.zen);
res.end();
return 0;
}
//校验 event 类型
if (data.event === "push") {
//校验 token 类型
if (data.token == config.token) {
//执行 pull
exec("cd "+config.folder+" && git pull", function (err, stdout) {
var cmd_message = stdout.replace(/^[0-9a-f]+?\ /, '');
console.log(cmd_message);
//console.log(err);
res.end();
});
}
}
}
var server = http.createServer(function (req, res) {
var POST = "";
req.on('data', function (chunk) {
POST += chunk;
});
req.on('end', function () {
POST = JSON.parse(POST);
res.writeHead(200, {
"Content-Type": "text/plain"
});
main(POST,res);
});
});
server.listen(config.port);
console.log("Server runing at port: " + config.port + ".");
这段代码参考了使用 Node.js 实现简单的 Webhook,目前自用还没有看到bug,有 dalao 的话帮忙优化以下。
新建 Dockerfile
:
FROM node:6-alpine
ENV NODE_ENV production
RUN apk update && apk upgrade && \
apk add --no-cache bash git openssh
WORKDIR /usr/src/app
COPY ./* /usr/src/app/
EXPOSE 9091
CMD node index.js
这里我们在容器里安装了 git
返回 workspace
并修改 docker-compose.yml
:
# 这个时候的工作目录是在 workspace !
vim docker-compose.yml
修改为:
version: '2.1'
services:
# nginx 在这
nginx:
build:
context: .
dockerfile: ./nginx/Dockerfile
volumes:
- ./site/data:/app
- ./nginx/conf.d:/etc/nginx/conf.d
- /etc/letsencrypt:/etc/letsencrypt
ports:
- 80:80
- 443:443
# jekyll 在这
jekyll:
build:
context: .
dockerfile: ./jekyll/Dockerfile
volumes:
- ./site/source:/srv/jekyll
- ./site/data:/srv/jekyll/_site
# autopull 在这
autopull:
build:
context: .
dockerfile: ./autopull/Dockerfile
ports:
- 9091:9091
volumes:
- ./site/source:/usr/src/app/site
./site/source:/usr/src/app/site
注意这里一定要加上 site
。
现在我们就可以启动咯!
# `workspace` 目录里
docker-compose build
docker-compose up
现在,在 coding 仓库项目设置中添加一个WebHook,并将 url 指向,你 服务器ip:9091
,如果设置令牌的话,一定要和 config.js
中的 token
一致。
绑定成功后, coding 会自动发送:
{
"token": "123",
"zen": "Coding! 让开发更简单"
}
如果没有意外,你可以在 console 里看到 autopull_1 | Coding! 让开发更简单
。
这个时候,尝试修改远程仓库文件并提交,你会在 console 里看到类似下面的信息:
autopull_1 | Updating c79effb..0fba65c
autopull_1 | Fast-forward
autopull_1 | offline.html | 3 +--
autopull_1 | 1 file changed, 1 insertion(+), 2 deletions(-)
autopull_1 |
jekyll_1 | Regenerating: 1 file(s) changed at 2017-08-18 07:43:04 ...done in 0.081600133 seconds.
至此,我们就完成了,一切就绪后,我们使用:
docker-compose up -d
在后台运行 docker ,享受高枕无忧。
补充一下文件树:
├── autopull
│ ├── config.js
│ ├── Dockerfile
│ ├── index.js
│ └── package.json
├── docker-compose.yml
├── jekyll
│ └── Dockerfile
├── nginx
│ ├── conf.d
│ │ └── homepage.conf
│ ├── default.conf
│ └── Dockerfile
└── site
├── data
│ ├── homepage
│ └── ...
│ └── index.html
└── source
└── ...
]]>某天某人尝试折腾宝塔面板,但没注意看宝塔面板只适合纯净系统。
于是尝试卸载不行就重装的无敌大法,突然想起了 halyul 的站用了 docker 。向 dalao 看齐。
再本地调试的时候,实在忍受不了 PowerShell 难看的默认样式,就开始折腾了。
首先通过强大的浏览器找的了 How to Change PowerShell Console Font and Background Colors 这篇文章。
确实写的蛮不错,复制粘贴用了之后好爽。
配图的截图就来自于这个的运行结果:
Function Test-ConsoleColor {
[cmdletbinding()]
Param()
Clear-Host
$heading = "White"
Write-Host "Pipeline Output" -ForegroundColor $heading
Get-Service | Select -first 5
Write-Host "`nError" -ForegroundColor $heading
Write-Error "I made a mistake"
Write-Host "`nWarning" -ForegroundColor $heading
Write-Warning "Let this be a warning to you."
Write-Host "`nVerbose" -ForegroundColor $heading
$VerbosePreference = "Continue"
Write-Verbose "I have a lot to say."
$VerbosePreference = "SilentlyContinue"
Write-Host "`nDebug" -ForegroundColor $heading
$DebugPreference = "Continue"
Write-Debug "`nSomething is bugging me. Figure it out."
$DebugPreference = "SilentlyContinue"
Write-Host "`nProgress" -ForegroundColor $heading
1..10 | foreach -Begin {$i=0} -process {
$i++
$p = ($i/10)*100
Write-Progress -Activity "Progress Test" -Status "Working" -CurrentOperation $_ -PercentComplete $p
Start-Sleep -Milliseconds 250
}
} #Test-ConsoleColor
在终端输入 Test-ConsoleColor
就可以测试各种类型输出的颜色。
最终,我没有选择这个。
lukesampson/concfg 可以用来导入和导出Windows控制台的设置。总之 concfg 十分方便。
安装很简单,首先安装 scoop
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
如果你没有打开运行远程签名的脚本文件则会提示你输入下面的指令:
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
允许之后,再允许一次安装命令即可。
使用 scoop help
检查是否已安装成功。
接下来只要使用 scoop install concfg
就完成了concfg的安装。
首选 Inziu Iosevka 系列字体,可以在 Inziu Iosevka 下载,然后安装到C:\Windows\Fonts
(安装后会有三个小字体,Inziu Iosevka SC/TC/J 和 Inziu IosevkaCC SC/TC/J 可以用于控制台)。
另外还需要修改注册表:
HKEY_LOCAL_MACHINE >> SOFTWARE >> Microsoft >> Windows NT >> CurrentVersion >> Console >> TrueTypeFont
新增一个字符串项目,内容为“Inziu Iosevka SC”。
新建一个 Ttheme.cfg
文件,并键入如下内容:
{
"cursor_size": "small",
"command_history_length": 50,
"num_history_buffers": 4,
"command_history_no_duplication": false,
"quick_edit": true,
"insert_mode": true,
"load_console_IME": true,
"font_face": "Inziu Iosevka SC",
"font_true_type": true,
"font_size": "0x18",
"font_weight": 0,
"screen_buffer_size": "80x3000",
"window_size": "80x20",
"fullscreen": false,
"popup_colors": "cyan,white",
"screen_colors": "white,black",
"black": "#1E1E1E",
"dark_blue": "#2472C8",
"dark_green": "#0DBC79",
"dark_cyan": "#11A8CD",
"dark_red": "#CD3131",
"dark_magenta": "#BC3FBC",
"dark_yellow": "#E5E510",
"gray": "#E5E5E5",
"dark_gray": "#666666",
"blue": "#3B8EEA",
"green": "#23D18B",
"cyan": "#29B8DB",
"red": "#F14C4C",
"magenta": "#D670D6",
"yellow": "#F5F543",
"white": "#E5E5E5"
}
当然可以根据自己的需求随意改动。
在此处打开 PowerShell ,使用 concfg import Ttheme.cfg -n
命令后新开一个 PowerShell 窗口,就完成拉~
Linux一般将文件可存取的身份分为三个类别,分别是 owner/group/others,且三种身份各有 read/write/execute 等权限——鸟哥
如文章头图所示,r = 4,w = 2 , x = 1。
我们一般在网上所找到的授予755
权限就是相当于-rwxr-xr-x
,777
权限就是-rwxrwxrwx
。
与文件权限相关的命令主要有三个:
chgrp
:改变文件所属群组chown
:改变文件拥有者chmod
:改变文件的权限, SUID, SGID, SBIT等等的特性chgrp
改变一个文件的群组很简单,直接以chgrp
来改变即可,这个指令就是change group
的缩写嘛!很好记吧! QwQ。
[kejun@localhost ~]$ chgrp [-R] dirname/filename ...
选项与参数:
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件、目录
都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。
其他参数使用man chgrp查询
范例:
将test.sh的所属群组更改为testgrp
[kejun@localhost ~]$ chgrp testgrp test.sh
[kejun@localhost ~]$ ls -l
-rw-rw-r--. 1 kejun testgrp 0 Jul 12 03:43 test.sh
chown
如何改变一个文件的拥有者呢?很简单呀!既然改变群组是change group,那么改变拥有者就是change owner啰!
chown
也可以直接修改所属群组~
[kejun@localhost ~]$ chown [-R] 帐号名称 文件或目录
[kejun@localhost ~]$ chown [-R] 帐号名称:群组名称 文件或目录
选项与参数:
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都变更
范例:
将test.sh的文件拥有者更改为testusr、文件所属群组更改为testgrp
[kejun@localhost ~]$ chown testusr:testgrp test.sh
chmod
文件权限的改变使用的是chmod这个指令,权限的设置方法有两种,分别是数字或符号。
如开头所说,各权限对应分数如下:
r:4 w:2 x:1
[kejun@localhost ~]$ chmod [-R] xyz 文件或目录
选项与参数:
xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
-R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
范例:
将test.sh文件的所有权限都启用
[kejun@localhost ~]$ chmod 777 test.sh
如果要将权限变成-rwxr-xr--
,那么对应分数就是 [4+2+1][4+0+1][4+0+0]=754;使用chmod 754 filename
即可完成。
chmod | u g o a |
+(加入) -(除去) =(设置) |
r w x | 文件或目录 |
范例1:
将 test.sh 文件的权限设置为-rwxr-xr-x
[kejun@localhost ~]$ chmod u=rwx,go=rx test.sh
范例2:
为 test.sh 的ugo加上可执行权限
[kejun@localhost ~]$ chmod a+x test.sh
希望看到此文的同学能够一起讨论更高效的自动化部署。
感谢Mysaku提供的机器测试。
下面命令中:
root@server$
前缀表示服务器的root用户;git@server$
前缀表示服务器的git用户;localhost$
前缀表示本地用户;新建一个git
用户
root@server$ adduser git
授与无需密码操作的权限
root@server$ sudo vim /etc/sudoers
添加 git ALL=(ALL:ALL) ALL
然后使用 :wq!
强制保存并退出。
授予操作 nginx 放网页的地方的权限
root@server$ cd /var/www
root@server$ mkdir jekyll
root@server$ chown git:git -R /var/www/jekyll
root@server$ su git
git@server$ cd ~
git@server$ mkdir jekyll.git
git@server$ cd jekyll.git/
git@server$ git --bare init
git@server$ vim hooks/post-receive
复制下面的内容粘贴并保存:
#!/bin/bash
GIT_REPO=$HOME/jekyll.git
TMP_GIT_CLONE=$HOME/tmp/myrepo
PUBLIC_WWW=/var/www/jekyll
git clone $GIT_REPO $TMP_GIT_CLONE
cd $TMP_GIT_CLONE
bundle
jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW
rm -Rf $TMP_GIT_CLONE
exit
最后授予执行权限
git@server$ chmod +x hooks/post-receive
推荐使用git用户安装jekyll。
如何安装 jekyll ?详见此文章。
接下来上传本地机器的SSH公钥到服务器。
首先打开你本地机器的git bash
输入:
localhost$ ssh-keygen -t rsa
localhost$ vim ~/.ssh/id_rsa.pub
"*yy
"*yy
为vim的复制命令。
继续返回到服务器(git用户)。
git@server$ cd ~
git@server$ mkdir .ssh && cd .ssh
git@server$ touch authorized_keys
git@server$ vim authorized_keys
粘贴刚刚复制的公钥。
现在,在本地机器 使用 ssh git@yourvpsip
已经可以成功登陆啦~
如果你vps的端口不是22,那么在本地机器:
localhost$ vim ~/.ssh/config
输入,并调整为你vps的信息:
Host #VPS IP
HostName #VPS IP
User git
Port #SSH Port
IdentityFile ~/.ssh/id_rsa
在你本地机器的博客仓库中添加一个远程仓库:
localhost$ git remote add www git@yourvpsip:~/jekyll.git
现在,每次发布新文章只要push
即可~
localhost$ git push www master
记得配置http哟~
]]>仅在win7+win10下测试。
不过本文是写给不想用 bash 的同学。
如果你使用的是 Ubuntu ,请查看此文章
Ruby 2.4.1-1
。run ‘ridk install’ to install MSYS2...
复选框并点击完成。
Add Ruby executables to your PATH
复选框。打开cmd窗口,键入如下:
gem install bundler jekyll
至此,已经完成。
新建博客:
jekyll new blog
使用cd blog
进入blog
文件夹并安装依赖:
bundle install
运行:
jekyll s -w
如果出现
Please add the following to your Gemfile to avoid polling for changes:
gem 'wdm', '>= 0.1.0' if Gem.win_platform?
请不要担心,目录仍然会被正常监视(我也不知道为啥,反而尝试安装wdm
倒是会报错)。
现在使用chrome53+
访问 127.0.0.1:4000/
。
嗯,几乎和linux下体验差不多。妈妈再也不用担心我的系统是windows啦(雾
RubyInstallers可以使用命令行安装,既然如此我为何不写个bat呢?
JavaScript 是一门为你的网站添加交互功能的编程语言。
JavaScript(缩写:JS)是一门成熟的动态编程语言,当应用于HTML文档时,可以在网站上提供动态交互性。
index.html:
<script src="scripts/main.js"></script>
将 </script/> 元素放在 HTML 文件底部的原因是,浏览器解析 HTML 似乎按照代码出现的顺序来的。如果 JavaScript被首先读取,它也应该影响下面的 HTML,但有时会出现问题,因为 JavaScript 会在 HTML 之前被加载,如果 JavaScript 代码出现问题则 HTML 不会被加载。所以将 JavaScript 代码放在底部是最好的选择。
scripts/main.js:
var maHeading = document.querySelector('h1');
maHeading.innerHTML = 'hello, world';
var myVariables;
行末的分号表示语句结束;几乎可以以任何名称来命名一个变量;JavaScript 是对大小写敏感的
定义的变量可以赋值:
myVariables = 'Bob';
可以通过变量名称检索变量:
myVariables;
多行注释:
/*
注释
*/
单行注释:
// 注释
if…else等
除了浏览器内置函数,允许自定义函数:
//创建
function multiply(num1,num2){
var result = num1 * num2;
return result;
}
//使用
multiply(4,7);
return 语句告诉浏览器返回 result 变量以便使用。这是很有必要的,因为函数内定义的变量只能在函数内使用。这叫做作用域 scoping
事件是能够捕捉浏览器操作并且允许你运行代码进行响应的代码结构.
document.querySelector('html').onclick = function(){
alert('Ouch! Stop poking me!');
}
var myImage = document.querySelector('img');
myImage.onclick = function(){
var mySrc = myImage.getAttribute('src');
if(mySrc === 'images/firefox-icon.png'){
myImage.setAttribute('src','https://ooo.0o0.ooo/2017/06/02/59312aafca8db.jpg');
}else{
myImage.setAttribute('src','images/firefox-icon.png');
}
}
var myButton = document.querySelector('button');
var myHeading = document.querySelector('h1');
function setUserName(){
var myName = prompt('Please enter your name.');
localStorage.setItem('name',myName);
myHeading.innerHTML = 'Mozilla is cool, ' + myName;
}
if (!localStorage.getItem('name')){
setUserName();
} else {
var storedName = localStorage.getItem('name');
myHeading.innerHTML = "Mozilla is cool, " + storedName;
}
myButton.onclick = function(){
setUserName();
}
https://yourblogurl/pages/editor.html
。CREATE FILE
按钮。Download
按钮。_posts
文件夹。git push
。Material Design 设计,大部分配置使用 _data 文件,无需重启 jekyll
即可完成配置。
MDUI 是一套用于开发 Material Design 网页的前端框架。
The theme is available as open source under the terms of the MIT License.
]]>