昨天,今天,明天,每天的每天,你是否都多懂得一点点...

星期日, 十月 13, 2019

[Youtube][跟峰哥学Node.js编程系列教程]使用Bootstrap 美化表单和表单的客户端验证 [第七期]

Tags: Javascript, nodejs, 峰哥, yufeng deng, expressjs, jade, pug, handlebars, bootstrap


本集主要讲如何使用 Bootstrap 来美化和验证表单,  并用 bootstrap 在客户端显示错误提示信息.

看完本集你将学会:

如何使用bootstrap 样式美化网页
如何使用浏览器内建的表单验证
如何使用bootstrap 显示漂亮的表单和错误提示



之前的教程可以在这个播放列表找到
https://www.youtube.com/playlist?list=PL3dZh-p-vVofgTEnJ_SL1LM9jxmQp19E2


视频里用到的代码请到

 
-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz
🔷 Twitter: https://twitter.com/fennng

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-




--
Feng

星期三, 十月 09, 2019

[网络技术]Pandoc Undefined control sequence error

When I used pandoc to one of my files, it produced the following error.

Error producing PDF.
! Undefined control sequence.
l.256 \tightlist



I don't know which part of the markdown cause this. Search on google and find this solution:


Simply adding a empty tightlist to the template file fixed the issue.


--
Feng

How to increase docker toolbox disk size

Today, when I tried to pull a pandoc docker image, I got the following error. Simply, I ran out of the disk.

image.png

But my harddrive still have more than 100G space left. So what's the problem.

The reason is that docker toolbox is actually running in a linux VM hosted by virtual box. The default disk size of the VM is 20G.

Increase Virtualbox vdisk

So things become clear, I need to increase the VM disk size. So that I stopped my VM and run the following command to get a bigger VM disk.

cd C:\Users\dengy\.docker\machine\machines\default\  set path=C:\Program Files\Oracle\VirtualBox;%path%  vboxmanage clonehd "disk.vmdk" "virtualdisk.vdi" --format vdi  vboxmanage modifyhd "virtualdisk.vdi" --resize 65536  

Then replace the old disk with the new one.

image.png

image.png

image.png

Re-partition the disk in linux

So far so good, but it didn't work. I restarted the machine, still lack of space.

Now, the "physical" disk has been increased, but the partition in linux system is still the old size. Follow this blog to re-partition the disk.

https://www.dengnz.com/2019/03/25/increase-azure-linux-vm-disk-size/ 

You will get permission denied, that's ok, restart the vm and run sudo resize2fs /dev/sda1

then you will get your disk size correct.

image.png

You are done!

星期一, 十月 07, 2019

[Youtube]Telegram Bot 使用Cloudflare CF worker 制作回声机器人 [第二集番外]

Tags: Telegram, 机器人, 聊天机器人,机器人编程,机器人代码, Telegram代码,Telegram Bot, Telegram编程

https://youtu.be/-_fcxPsCVYs



第二集的视频在这里
https://youtu.be/SxwsGWlMfP4

整个系列的视频请点视频右上角的感叹号.


哈喽, 大家好, 欢迎来到峰哥分享, 我是峰哥.

最近咳嗽的老毛病又犯了, 基本没办法讲话.

所以今天这个视频就打字好了.

今天我来介绍一下怎么样在Cloudflare 上用worker 来创建一个Telegram bot 的聊天机器人.

当然是最简单的机器人, 只能简单的回复文字, 而且还是同样的汤姆猫机器人, 就是你说什么, 它就说什么.

之前出的教程是在谷歌的 app script 上面的, 其实代码都是JS, 所以把我的GAS (google app script)
的教程拿在 cf worker 上面, 也是差不了多少.

所以, 今天就来教大家做一个最基础的机器人, 剩下的, 小伙伴们再看我的telegram bot的教程, 应该就能看明白了.

好吧, 开始教程!

首先, 我们需要创建一个机器人, 这个就直接看我的TG教程系列的第一集就可以了.

机器人申请好了, 我们来加一下 cf worker 的代码

还没有cloudflare 帐号的小伙伴自己注册一下, 这个很简单,我就不多介绍了.

自己到以下网址注册

https://dash.cloudflare.com/sign-up

然后登录

新建一个 worker 脚本

新建完脚本以后, 是一个简单的hello world 网页, 直接就是工作的.

通过 save and deploy 发布这个网站

到以下这个网址去抄网方的示例POST代码
https://developers.cloudflare.com/workers/templates/snippets/post_data/

抄来的代码最后那段HTML不要, 然后 save and deploy 就可以开作了

只是简单的显示了 The request was a GET

现在我来加入机器人的代码, 只有简单的几行, 非常容易!

粘贴完这段代码

let bodyString = await readRequestBody(request)

try {

let body = JSON.parse(bodyString);

const init = {
headers: { 'content-type': 'application/json' },
}

if (body.message) {
let payload = {
"method": "sendMessage",
"chat_id": body.message.chat.id,
"text": "Only echo back text",
"parse_mode": "markdown",
"disable_web_page_preview": true,
};
if (body.message.text) {
payload.text = body.message.text;

const myInit = {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
};

let myRequest = new
Request("https://api.telegram.org/bot682267360:AAHmjSil8oylavD2pENLLpcMU1svaD7mVeA/",
myInit)

//let myRequest = new Request("https://eaa874bb.ngrok.io", myInit)
fetch(myRequest).then(x=> {
console.log(x);

});


return new Response("OK")
} else {
return new Response("OK")
}

} else {
return new Response(JSON.stringify(body), init)
}

}catch(e){
return new Response(e)
}

注册刚才高亮的那段代码, 其中的网址是以下这段, 这里面从bot 开始, 就是机器人的token
https://api.telegram.org/bot682267360:AAHmjSil8oylavD2pENLLpcMU1svaD7mVeA/

注意后面那个 / 非常重要, 不能省略

好了, 现在发布改过的代码

发布完成后, 我们需要绑定机器人, 机器人的网址在这里

https://raspy-sun-ed74.fennng.workers.dev/

为了预防成一, 我们把这个网址做一下 urlencode

网上随便找一个在线的 url encoder , encoder 完是以下的样子

https%3A%2F%2Fraspy-sun-ed74.fennng.workers.dev%2F

现在找到绑定机器人的链接,以下这段是设置机器人的链接, 前面 https://api.telegram.org/bot 这段是固定的,

中间这段 682267360:AAHmjSil8oylavD2pENLLpcMU1svaD7mVeA 是机器人的 token

后面这段是设置机器人链接的方法 /setWebhook?url=

所以我们要把机器人后台链接放在这个链接的最后面

https://api.telegram.org/bot682267360:AAHmjSil8oylavD2pENLLpcMU1svaD7mVeA/setWebhook?url=https%3A%2F%2Fraspy-sun-ed74.fennng.workers.dev%2F

粘贴完后是上面这个样子

现在把这个链接放在浏览器的地址栏打开, 看到以下这个就是绑定成功

{"ok":true,"result":true,"description":"Webhook was set"}

现在我们去试下机器人

工作, 发布成功.

现在来随便改点东西, 简单的加了个签名, 现在再去看看

成功的改了....

很简单吧, 机器人的创建看第一集. 然后, 其它机器人的功能看我关于 谷歌app script 的教程就行了, 差不了多少.

注意的是, cf worker 的 fetch 是 promise, 这点和gas 有很大不同...做简单的机器人可以先不理会. 跟着我的代码写就行了.

好了, 今天的教程就到这里, 喜欢这个视频的话, 不要忘了点赞,订阅还有转发!

谢谢大家. 我们下载再见!


-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程,
如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz
🔷 Twitter: https://twitter.com/fennng

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-

星期六, 九月 28, 2019

[Youtube][跟峰哥学Node.js编程系列教程] 如何验证表单数据, 无害化处理, 给用户显示错误提示信息[第七期]

Tags: Javascript, nodejs, 峰哥, yufeng deng, expressjs, jade, pug, handlebars

本集主要讲如何使用 Express 来验证表单,  对用户从表单提交的数据进行无害化处理. 如何把错误信息显示在表单中提示用户正确的输入方式. 

看完本集你将学会:

如何验证表单
如何使用内建的验证方式, 如何验证邮箱格式
如何自定义验证方式
如何把用户输入的数据无害化  
如何在网页中显示错误信息


之前的教程可以在这个播放列表找到
https://www.youtube.com/playlist?list=PL3dZh-p-vVofgTEnJ_SL1LM9jxmQp19E2


视频里用到的代码请到

 
-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz
🔷 Twitter: https://twitter.com/fennng

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-


[Youtube][跟峰哥学Node.js编程系列教程] 如何生成表单并读取表单, 处理用户提交的内容与用户交互


Tags: Javascript, nodejs, 峰哥, yufeng deng, expressjs, jade, pug, handlebars

本集主要讲如何使用 Express 来生成表单, 本集使用 handlebars 作为HTML引擎 (前面讲过)
看完本集你将学会:

如何生成表单
如何读取表单 
如何在网页中使用用户提交的数据


之前的教程可以在这个播放列表找到
https://www.youtube.com/playlist?list=PL3dZh-p-vVofgTEnJ_SL1LM9jxmQp19E2


视频里用到的代码请到


-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz
🔷 Twitter: https://twitter.com/fennng

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-

--
Feng

星期六, 九月 14, 2019

[Youtube][跟峰哥学Node.js编程系列教程] 如何使用 Express Generator 快速生成项目文件

Tags: Javascript, nodejs, 峰哥, yufeng deng, expressjs, jade, pug, handlebars

本集主要讲如何使用expressjs 官方的 expgress generator 项目文件成生器来快速的生成一个 express 的程序.

看完本集你将学会:

如何安装 express generator
如何使用 express generator 来生成一个初始的 express 项目文件夹

之前的教程可以在这个播放列表找到
https://www.youtube.com/playlist?list=PL3dZh-p-vVofgTEnJ_SL1LM9jxmQp19E2


视频里用到的代码请到


-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz
🔷 Twitter: https://twitter.com/fennng

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-


--
Feng

星期三, 九月 11, 2019

A simple javascript threading experiment with setTimeout

I am going to add a global queue object to my nodejs express program, then this raises a concern of thread safety. 

I am implementing a queue with only 10 elements, the older elements will be throw away.  So I wrote the following code to test. 

In the following code, the if (queue.length > 10) can cause problem. Because when both thread run into this block and both finish pushing the element,  we will have 12 elements in the queue.

For example
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]

The new elements in this queue is 22, and 23.

Now thread 1 will do a slice and make the queue to be 

  [13, 14, 15, 16, 17, 18, 19, 20, 21, 22]  

At this point, because the queue length is 10, then the thread 2 will not do the slice.  The pushed element 23 is gone. 

If thread 2 read the queue length before thread 1 slice it. Then thread 2 will slice it again. 

the array become 

 [14, 15, 16, 17, 18, 19, 20, 21, 22]

Only 9 element in the queue, 13 is gone.


[javascript]

let queue = [];
let threads = 100000;
for (let i = 0; i < threads; i++) {
    setTimeout(() => {
        queue.push(i);
        // This line can have a dirty read
        if (queue.length > 10) {
            queue = queue.slice (1, 11);
        }

        if (i >= threads - 10) {
            console.log(queue);
        }
    }, 1000);
}

[/javascript]

But when I tested this in the browser. it never failed. It's very interesting. 

A small improvement is using a temp variable to hold the original queue outside the if block, then use the temp var in the if block. It will make sure only 1 element will be missing.  

[javascript]

let queue = [];
let threads = 100000;
for (let i = 0; i < threads; i++) {
    setTimeout(() => {
        queue.push(i);
       let tempQueue = queue;
        // This line can have a dirty read
        if (queue.length > 10) {
            queue = tempQueue.slice (1, 11);
        }

        if (i >= threads - 10) {
            console.log(queue);
        }
    }, 1000);
}

[/javascript]


--
Feng

如何在angular 等 Single Page App (SPA) 网页里面加谷歌 Adsense 广告



如果你在谷歌上搜索在angular 里面加 adsense 的方法, 很多人会告诉你这是不能的. 特别是一些比较老的文章. 

原因也很简单, 因为谷歌无法验证你的网站, 也就是不会在你的网站上投放广告. 但是这个已经是老黄历了, 现在的SPA的网站都是可以成功的投放谷歌的adsense 广告的. 如果你没有成功, 那应该是你没有做对.

首先, 我们来理解一下为什么过去在SPA中无法放谷歌的广告. SPA的特点就是, 几乎所有的内容都是由javascript 生成的, 如果你看首页的源码, 你可能只能看到短短的一页. 里面基本没有什么内容, 就是调用了几个javascript. 在不支持 javascript 的浏览器中, 这种网站基本就是一片空白.  SPA 既然叫做single page, 那就是只有一个页面. 没有更多的页面了, 所有的内容都是由javascript 生成并呈现的, 跳转页面也是由javascript 完成, 对于浏览器来说, 其实还是在index.html 这个页面.

早期的谷歌爬虫由于不支持 javascript, 所以它们是看不见网站的内容的, 在他们眼里, 这个网站就是一个空白页面. 试问一个空白页面有没有投放广告的必要? 所以, 早期的SPA是无法投放谷歌的广告的, 当然有些聪明人会给机器人设置一个特别的缓存页面让机器人可以看到一些内容从而通过验证.

而现在的爬虫基本上都可以认识SPA了, 所以也就不存在这个问题. 但是在SPA中投放广告还是有些不同的, 这就是为什么很多人不成功的原因. 因为谷歌提供的广告代码通常包含 javascript, 由于安全原因, 直接粘贴谷歌的代码在你想要的地方可能无效. 比如说在 angular 2+ 中, 你如果把谷歌的广告代码贴在某个 component 的 html 文件里, 这是没有用的, 因为 angular 会移除所有的 script tag, 所以谷歌广告的代码不会被执行, 所以要通过一些别的办法来运行这个Script, 或者干脆把这些代码放在 index.html 里面, 而不是component 里面.

以下的这种广告代码放在angular 的 index.html 是会工作的.

[javascript]
  <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-9753349551653834" data-ad-slot="3179523493"
    data-ad-format="auto" data-full-width-responsive="true"></ins>
  <script>
    (adsbygoogle = window.adsbygoogle || []).push({});
  </script>
  [/javascript]  

演示请看这里 


--
Feng

星期一, 九月 09, 2019

[Youtube][跟峰哥学Node.js编程系列教程] 在Nodejs Express 程序中使用静态文件, CSS, 图片, Javascript, CSS网页布局, JS飘雪效果示例

Tags: Javascript, nodejs, 峰哥, yufeng deng, expressjs, jade, pug, handlebars


本集主要讲如何在Express 程序中使用静态的CSS, 图片还有Javascript 文件

看完本集你将学会:

如何在Nodejs + express 的程序中使用任何静态文件 
如何在网页中加入图片
如何简单的用CSS布局
如何写javascript 和使用别人的Javascript加到自己的网页中

视频里用到的代码请到



-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-

星期日, 九月 08, 2019

[Youtube]Telegram Bot 回声机器人代码详解[第二集半]

Tags:  
Telegram, 机器人,
 聊天机器人,机器人编程,机器人代码, Telegram代码,Telegram Bot, Telegram编程    


本视频由观众投稿, 是对Telegram 机器人编程系列第二集汤姆猫内容的补充. 本视频详细介绍了第二集里面的代码意思. 感觉投稿的小伙伴. 我一直以为是个小伙子, 看到视频才知道是个美少女! 汗!!

第二集的视频在这里

整个系列的视频请点视频右上角的感叹号.

-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-

星期日, 八月 25, 2019

[Youtube][跟峰哥学Node.js编程系列教程] 使用Nodejs做个简单的网站, Nodejs+expressjs+nodemon 开发 网站

Tags: Javascript, nodejs, 峰哥, yufeng deng, expressjs, nodemon


本集开始讲使用nodejs做网站的开发, 简单的介绍了 router, 还有 nodemon. 

看完本集你将学会:

如何使用 Nodejs + express + nodemon 做一个网站
如何加入更多的网页
如何使用不同的网址跳转到不同的网页
如何自动更新程序

视频里用到的代码请到


-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-


星期四, 八月 15, 2019

[Youtube][跟峰哥学Node.js编程系列教程] 为什么学Node.js和开发环境的搭建

Tags: Javascript, nodejs, 峰哥, yufeng deng


本集介绍Nodejs, 还有它和Javascript 的关系. 然后讲讲Nodejs 开发环境的搭建, 同时演示如何用五行代码做出一个最简Hello World 网站.

视频里用到的代码请到我的博客里找 https://www.dengnz.com/blog/


[bash]
npm init
npm install express --save
[/bash]

[javascript]
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening on port ${port}!`))
[/javascript]
-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-


--
Feng

星期日, 八月 04, 2019

[Youtube]如何使用 Nginx-proxy 反向代理把HTTP网站(服务)变成HTTPS

tags: docker, reverse-proxy, nginx-proxy, nginx , HTTPS,SSL 

上一期我讲过怎么用 Nginx 反向代理把使用一个80端口支持多个网站. 今天我来介绍一下怎么结合companion 来实现HTTPS. 这样你就可以把你的HTTP的网站或者服务变成HTTPS的服务. 这个方法会自动生成证书, 你不需要手动管理你的证书.



以下是视频中用到的代码

[bash]
sudo docker network rm feng-net
sudo docker network create feng-net

sudo docker rm -f nginx-proxy
sudo docker run -p 80:80 -p 443:443 \
    -d \
    --name nginx-proxy \
    --network feng-net \
    --network-alias nginx-proxy-host\
    -v /usr/share/nginx/html \
    -v /etc/nginx/vhost.d \
    -v /var/run/docker.sock:/tmp/docker.sock:ro \
    jwilder/nginx-proxy


sudo docker rm -f nginx-proxy
sudo docker run -p 80:80 -p 443:443 \
    -d \
    --name nginx-proxy \
    --network feng-net \
    --network-alias nginx-proxy-host\
    -v  /home/fennng/certs:/etc/nginx/certs:ro \
    -v /etc/nginx/vhost.d \
    -v /usr/share/nginx/html \
    -v /var/run/docker.sock:/tmp/docker.sock:ro \
    --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy \
    jwilder/nginx-proxy


sudo docker rm -f companion
sudo docker run \
    -d \
    --name companion \
    --network feng-net \
    --network-alias companion-host \
    -v /home/fennng/certs:/etc/nginx/certs:rw \
    -v /var/run/docker.sock:/var/run/docker.sock:ro \
    --volumes-from nginx-proxy \
    jrcs/letsencrypt-nginx-proxy-companion



sudo docker rm -f www
sudo docker run \
    -d \
    -e VIRTUAL_HOST=www.fengnz.tk \
    -e "LETSENCRYPT_HOST=www.fengnz.tk" \
    -e "LETSENCRYPT_EMAIL=soody@qq.com" \
    --network feng-net \
    --network-alias  www-host \
    --name www  \
    -p 81:80 \
    nginxdemos/hello

sudo docker rm -f bbs
sudo docker run \
    -d \
    -e VIRTUAL_HOST=bbs.fengnz.tk \
    -e "LETSENCRYPT_HOST=bbs.fengnz.tk" \
    -e "LETSENCRYPT_EMAIL=soody@qq.com" \
    --network feng-net \
    --network-alias  bbs-host \
    --name bbs  \
    -p 82:8000 \
    crccheck/hello-world

sudo docker run --name web-test1 -p 80:80 -d --rm nginxdemos/hello
sudo docker run --name web-test2 -p 80:8000 -d --rm crccheck/hello-world


[/bash]

-~-~~-~~~-~~-~-

本频道旨在分享生活中各种小技巧, 如用小米盒子看国内视频, 如何使用KODI看电影等等. 同时我也会分享一些编程的教程, 如编写Telegram机器人, 建站等。 点击进入我的频道: goo.gl/5tyxcf

🔷 订阅我的频道: goo.gl/KuF3bY
🔷 telegram电报群: t.me/fengsharegroup
🔷 我的博客: www.dengnz.com/blog
🔷 Facebook: www.facebook.com/fengnz

觉得我的视频对你帮助很大的话, 请我喝杯咖啡吧
微信赞赏码: goo.gl/uKoE8w
-~-~~-~~~-~~-~-

--
Feng

星期二, 七月 30, 2019

[网络技术]Linux 下免SUDO使用 docker 命令

在linux 使用 docker 需要ROOT权限, 所以每次使用 Docker 都需要 sudo docker, 

当然你也可以 sudo -s 直接在root 下运行, 但是总会有各种各样的问题

使用以下三个命令可以免 sudo 运行 docker

[bash]
sudo groupadd docker
sudo gpasswd -a $USER docker
newgrp docker  
[/bash]





--
Feng

星期一, 七月 29, 2019

[Youtube]如何使用 Nginx-proxy 做反向代理实现单端口多服务(网站)

tags: docker, reverse-proxy, nginx-proxy, nginx


如果你有一台VPS虚拟机, 而且已经在上面跑了一个网站, 现在你想在同一台虚拟机上再跑另一个网站, 但是你的VPS只开了80和443两个端口, 其它端口你不能开. 或者说,你的虚拟机可以开别的端口, 但是你觉得把网站跑在其它端口太LOW了, 别人一看到有端口的链接估计都不敢点. 所以, 问题来了, 怎么在同一个80端口或者443端口里面同时跑多个网站(或者服务)呢?

今天我来介绍一个超级好的docker 容器镜像  Nginx-proxy

为什么要介绍这个docker 版的而不是直接介绍 Nginx 本身呢? 因为我用的是这个, 我的大部分服务都在docker 里运行, 就算不是在docker 里运行的, 我也有办法和 nginx-proxy 一起使用. nginx-proxy 支持多服务, SSL 证书自动设置与更新, 而且还支持负载平衡, 实在是太方便了, 不需要自己去研究 nginx 的反向代理设置.

今天我先介绍在80端口实现多个网站. 之后如果有需要, 我再介绍如何让你的网站支持 HTTPS (SSL). 

以下是视频中用到的代码

[bash]

sudo docker network rm feng-net
sudo docker network create feng-net

sudo docker rm -f nginx-proxy
sudo docker run -p 80:80 -p 443:443 \
    -d \
    --name nginx-proxy \
    --network feng-net \
    --network-alias nginx-proxy-host\
    -v /usr/share/nginx/html \
    -v /etc/nginx/vhost.d \
    -v /var/run/docker.sock:/tmp/docker.sock:ro \
    jwilder/nginx-proxy


sudo docker rm -f www
sudo docker run \
    -d \
    -e VIRTUAL_HOST=www.fengnz.tk \
    --network feng-net \
    --network-alias  www-host \
    --name www  \
    -p 81:80 \
    nginxdemos/hello

sudo docker rm -f bbs
sudo docker run \
    -d \
    -e VIRTUAL_HOST=bbs.fengnz.tk \
    --network feng-net \
    --network-alias  bbs-host \
    --name bbs  \
    -p 82:8000 \
    crccheck/hello-world

sudo docker run --name web-test1 -p 80:80 -d --rm nginxdemos/hello
sudo docker run --name web-test2 -p 80:8000 -d --rm crccheck/hello-world


[/bash]



--
Feng

星期日, 七月 28, 2019

单面打印机打双面的方法, 无需重整页面顺序


我的打印机是一台兄弟的黑白激光打印机 Brother DCP 1610W
这是一台只能单面打印的打印机, 如果想打双面的话, 要先打单面, 再把打印好的纸放回打印机再打另外一面. 操作很简单, 但如果纸的顺序没有放好, 就会打错页哦. 如果按先打单页,再打双页的方法打印的话, 单面打完后, 要把纸张的顺序全部反过来, 第一页变成最后一页,再反过来重新插进打印机打. 这样就比较麻烦,而且容易出错.

今天我来教大家我的方法, 用这样的方法打印出来, 页面顺序就是直接正确的.

首先,我们只打双数页, 如图, 把页面顺序颠倒打印,这样打印机会从最后一页开始打印.



打印出来的纸拿出来, 直接翻转后塞回打印机, 注意以下两点

1 空白面朝上
2 页头朝打印机进纸口的里面

然后再打印单数页, 这回要把颠倒顺序的勾去掉, 这次从第一页开始打印.

这样打印出来, 顺序直接就是对的啦.

为什么要先打双数页呢? 因为如果碰到奇数页数的文档, 先打单数页的话, 要拿掉一张纸. 要么就容易把最后一页忘在打印机里.






--
Feng

星期三, 七月 24, 2019

[网络技术]在 VIM中, 如何打开最近使用过的文件

打开最近文件是个非常基本的编辑器功能. 但是在VIM中却没有那么好找. 不过当你找到后, 发现其实还是很容易的.

在VIM的命令模式输入

:browse oldfiles

就会弹出最近打开过的100个文件.

如果清单很长的话, 按空格翻页, 或者直接按q停止翻页. 这个时候输入序号, 回车就可以直接跳到你要的文件.



觉得麻烦你可以直接把这个命令MAP到一个快捷键 , 比如

[bash]
:map <F2> :browse oldfiles<cr>
[/bash]

这样, 直接按F2就可以弹出最近打开过的文件了.

--
Feng

[网络技术]给想学AI的新手指一条明路

注: 这里讲的AI特指神经网络的深度学习, 也就是 Deep Learning, Artificial Neural Network.

师父领进门, 修行靠个人. 虽然说修行是靠个人, 但是如果没有这个领进门,你就不得其门而入, 你在门外的修行, 总是事倍而功半, 修了半天, 还是个门外汉. 所以, 这个领进门的份量龙其的重.

如果你对神经网络的深度学习很有兴趣, 但是看了一堆的网上的文章以后,也还是糊糊涂涂, 不得其门而入, 那你应该听听我的建议.

你也许对深度学习有点熟悉, 至少很熟悉里面的一些专有名词, 比如说 DNN, CNN, Stochastic Gradient Descent, Adam, Adaptive learning rates, Momentum, softmax 等等. 但你只是熟悉这些名词而已, 却不明了它们真正的意思. 你在网上爬了很多文章, 甚至看了不少的论文, 但是总还是感觉云里雾里的, 感觉好像有点懂了, 但是一看到数学的公式就懵圈了.  那是因为你没有真正的学过一个系统的课程.

不要看网上那些文章了, 在这之前, 你应该学习一下以下两个课程.




这两个课程的主讲是Andrew NG. 这个课程可以免费学习 (用 audit course).  这个课程真的非常好, 由线入深的讲解了深度学习的原理(其实原理很简单). 懂得原理以后,你再理解起其它的东西就会事半功倍. 而且也有能力分辨网上的一些文章是否对你有用. 而不会浪费时间在看那些千篇一律的文章上面,一直重复的看同样的东西, 同样的名词. 总之,学完这两个课程以后, 你再去看网上的文章最觉得不会太难了.


 
 

--
Feng

其它博客地址

此博客的同步博客地址: http://fengnz.wordpress.com
点这里进入我的MSN SPACE.