我有很多自己的个人代码是跑在家里的服务器中的.一般来说都是自动化的处理我的一些生活问题,与数据收集等相关活动.
所以一般没有客户端访问家里服务器的需求.
但是很多时候脑子突发奇想.有一些小点子,一些小的bug或者小的优化,代码修改完成之后,有一个部署到需求.
因为家里服务器没有一个稳定的外网IP的,外网不能直接连接服务器.
所以我们需要 内网穿透

ngrok

选择ngrok的原因很简单,配置方便,并且支持tcp协议.
支持tcp协议代表,我可以直接在外面用SSH来访问家里的机器.

用法

首先你需要去官网注册一个账号
下载ngrok,并且解压到一个你喜欢的目录下面
去官网复制你的授权码
授权ngrok
ngrok authtoken 授权码

http

ngrok http 8080

tcp

ngrok tcp 22

最终你会得到,一个外网可以访问的地址.
用这个地址就可以直接访问到你本机的端口了.

当我们拥有这样一个公网地址之后,我们就可以ssh来控制家里的机器
或者使用github的webhook来做一切你想要做的事情.

环境

1、代码通过git管理,放在了coding上(放在github或者其他平台也都可以)
2、服务器用的阿里云
3、服务器用的ubuntu 16.04
4、客户端用的mac
5、docker镜像平台为dockerhub

准备

1、服务器开通SSH
2、服务器安装Docker
3、掌握基本的shell命令

开始

1、服务器 安装docker
https://docs.docker.com/install/
2、服务器拉取docker jenkins镜像:

1
docker pull jenkins:latest

3.服务器运行dokcer jenkins容器:

1
sudo docker run -d --name jenkins_node -p 49002:8080 -v /var/jenkins_node:/var/jenkins_home jenkins:lates

Map command 键

Mac 和 win的键盘不一样,但使用 Mac 一年时间感觉 Mac 键盘部局还是比较好用的。为了按键匹配把 Alt 和 Win 键换一下,可以直接在 Mac的设置中设置:

Setting -> Keyboard -> Modifier Keys… -> Select Keyboard (choose USB Keyboard) -> switch Option Key and Command Key

这样设置完之后 Win键就和 Command 对应了,Command + C, Command + V 用起来习惯多了。

设置多媒体键

经常听音乐,所以常需要调节音量,但 F1-F12已经被我改为普通功能了,所以不能直接改过来用作多媒体控制(我主要用来控制音量)在 zhihu 上找到有人推荐Karabiner 下载了一个来玩,感觉还是蛮好用的。

这里我将87键键盘的右上角三个键 Ps/SR, ScLk, Pa/Br 键对应到音量静音、减、增三个键,这个功能有预置,可以直接搜索到并 enable 即可:

另外也可以自定义按键对应:

打开 private.xml 输入需要定制的内容

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<!-- 这里我把 Insert 键换成 Launchpad 键-->
<root>
<item>
<name>Insert Key Launchpad</name>
<identifier>private_pc_insert_to_launchpad</identifier>
<autogen>__KeyToKey__ KeyCode::PC_INSERT,KeyCode::LAUNCHPAD</autogen>
</item>
</root>

保存后 reload 即可。

更多例子参考官方样例中的代码

有了高效的工具就剩下好好工作了~

报错:

1
2
3
4
5
6
7
8
root@iZ94t4csjq4Z:~# mongo
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
2018-03-21T02:45:58.758+0800 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused
2018-03-21T02:45:58.791+0800 E QUERY [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :
connect@src/mongo/shell/mongo.js:237:13
@(connect):1:6
exception: connect failed

解决方法:

1
2
3
4
sudo rm /var/lib/mongodb/mongod.lock
sudo mongod --repair --dbpath /var/lib/mongodb
sudo mongod --fork --logpath /var/lib/mongodb/mongodb.log --dbpath /var/lib/mongodb
sudo service mongodb start

报错:

1
2
root@iZ94t4csjq4Z:~# sudo service mongodb start
Failed to start mongodb.service: Unit mongodb.service is masked.
1
2
root@iZ94t4csjq4Z:~# sudo chown -R mongodb:mongodb /var/lib/mongodb
root@iZ94t4csjq4Z:~# sudo systemctl start mongod

等了好久好久,今天终于见到你了。

首先你可以查看下官方提供的支持申请通配符证书的客户端列表:https://letsencrypt.org/docs/client-options/。

这些客户端支持最新的ACME v2接口,而这个接口目前已经正式支持申请通配符证书啦。

这里,我使用acme.sh(https://github.com/Neilpang/acme.sh)这个Client,它是直接在bash下运行,使用非常简单,而且支持大多数DNS服务器的API自动验证!

1、安装acme.sh

1
curl https://get.acme.sh | sh

一句话完成安装,安装过程分为:

1)复制acme.sh的程序文件到当前用户主目录,比如root用户的:~/.acmh.sh目录下

2)创建一个alias:acme.sh=~/.acme.sh/acme.sh

2、装完后,就可以开始申请证书了,这里我用的是阿里云的DNS,所以为了能配合完成自动验证,需要在acme.sh的配置中写入阿里云的密钥信息:

1
2
3
4
5
vim ~/.acmh.sh/account.conf

#添加阿里云密钥,改成自己的
Ali_Key="xxxx"
Ali_Secret="xxxxx"

3、最后,重点来了,通配符证书申请命令(以我自己的域名为例):

1
acme.sh  --issue -d junyao.tech  -d *.junyao.tech  --dns dns_ali

注意,这里–dns参数使用的是dns_ali,告诉acme.sh使用阿里云的DNS接口去自动验证。(好处:全程无干预,不需要暂停web服务器!)

4、查看生成的证书文件,证书默认生成在:~/.acme.sh/junyao.tech下:

5、最后,就是配置Apache、NGINX啦。这里以nginx为例子:

首先我们要把生成的证书文件复制出来,这里我放到/etc/nginx/ssl/目录下,运行下面命令:

1
2
3
4
acme.sh --install-cert -d junyao.tech \
--cert-file /etc/nginx/ssl/junyao.tech-cert.pem \
--key-file /etc/nginx/ssl/junyao.tech-key.pem \
--fullchain-file /etc/nginx/ssl/junyao.tech-fullchain.pem

6.配置Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {  
listen 80;
listen 443 ssl;
server_name junyao.tech;
#error_page 404 =/404.html;
location / {
root /alidata/www;
index index.html;
}
ssl_certificate /etc/nginx/ssl/junyao.tech/junyao.tech-fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/junyao.tech/junyao.tech-key.pem;

ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
}

最后reload一下 nginx

总结:

这里把几个命令整一起,方便使用。

首先,我这里用的阿里云的解析,所以,需要提前设定阿里云的密钥,方法是:

1
2
3
4
5
vim ~/.acmh.sh/account.conf

#添加阿里云密钥,改成自己的
Ali_Key="xxxx"
Ali_Secret="xxxxx"

保存之后,后面使用这个参数时(–dns dns_ali),就自动读这个信息了。

下面是把申请证书和复制证书放在一个文件(new_https.sh)中执行了,只需要传入参数(申请的域名),完成后,只需要去手动修改下apache的配置即可(nginx同理)

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
if [ ! -n "$1" ] ;then
echo "please input domain"
else
/root/.acme.sh/acme.sh --issue -d $1 -d *.$1 --dns dns_ali
mkdir /etc/nginx/ssl/$1
/root/.acme.sh/acme.sh --install-cert -d $1 \
--cert-file /etc/nginx/ssl/$1/$1-cert.pem \
--key-file /etc/nginx/ssl/$1/$1-key.pem \
--fullchain-file /etc/nginx/ssl/$1/$1-fullchain.pem
fi

使用方法:

1
new_https.sh junyao.tech

mongodb基础篇

先讲讲简单的monngodb部署docker.
MongoDB 是一款较为常用的NOSQL 数据库,结合 Docker 使用,能实现轻松配置部署、迁移,本文以下为简要介绍如何在 Docker 中部署并使用 MongoDB。下文主要分为几个部分,内容如下:

MongoDB 镜像安装
MongoDB 容器创建
MongoDB 容器数据目录挂载
MongoDB 数据迁移
MongoDB 常用 Docker 命令

MongoDB Docker 镜像安装

MongoDB 提供官方镜像,下载安装镜像方法如下:

1
docker pull mongo

以上命令为安装 MongoDB 最新版本的镜像。

MongoDB Docker 容器创建

MongoDB Docker 容器创建有以下几个问题:
1- MongoDB 容器基本创建方法和数据目录挂载
2- MongoDB 容器的数据迁移
3- MongoDB 设置登录权限问题

MongoDB 容器基本创建方法和数据目录挂载

MongoDB 容器基本创建命令如下:

1
2
docker run -p 27017:27017 -v <LocalDirectoryPath>:/data/db --name docker_mongodb -d mongo

在上面的命令中,几个命令参数的详细解释如下:

-p 指定容器的端口映射,mongodb 默认端口为 27017
-v 为设置容器的挂载目录,这里是将即本机中的目录挂载到容器中的/data/db中,作为 mongodb 的存储目录
–name 为设置该容器的名称
-d 设置容器以守护进程方式运行
以上是 MongoDB 容器创建后的信息。

随后我们创建一个test_database的数据库,然后在创建一个test_collection的集合.

容器数据迁移

接下来,我们先停止刚才创建的 docker_mongodb 容器,命令如下:

1
docker stop docker_mongodb

然后我们再创建一个新的 MongoDB 容器,挂载刚才刚刚的数据目录,命令如下:

1
2
docker run -p 27017:27017 -v <LocalDirectoryPath>:/data/db --name docker_mongodb_migration -d mongo

我们可以容器查询命令,查看当前 Docker 的容器状态,命令如下:

1
docker container ls -a

这里的 -a 参数是查看所有的容器,包括已经停止的容器。
连接数据库,可以看到我们看到我们再 docker_mongodb 中创建的数据,这里表明我们新创建的 docker_mongodb_migration 挂载的数据目录和 docker_mongodb 相同,利用这一方法,我们可以实现简单的数据迁移。

MongoDB 的 Docker 常用命令

查看当前运行的容器
1
2
3
4
# 查看正在运行的容器
docker container ls
# 查看所有容器
docker container ls -a
停止容器
1
2
3
4
# 指定 CONTAINER ID 停止容器
docker stop <CONTAINER ID>
# 指定容器名称停止容器
docker stop <CONTAINER NAME>
启动已经停止的容器
1
2
3
4
# 指定容器 CONTAINER ID 启动容器
docker start <CONTAINER ID>
# 指定容器名称启动容器
docker start <CONTAINER NAME>
重启已经运行的容器
1
2
3
4
# 指定容器 CONTAINER ID 重启容器
docker restart <CONTAINER ID>
# 指定容器名称重启容器
docker restart <CONTAINER NAME>
进入 mongo 交互模式
1
docker exec -it <CONTAINER NAME> mongo admin

node 基础篇

再讲讲简单的node部署docker.

一直以来,在微信中内嵌视频总是收到IOS及微信的双重限制,主要是必须被调用原生播放器,但是我希望在HTML的文档流中内嵌视频,而不调用原生组件,其方法是

第一步:调用createjs框架

1
<script src='/path/createjs-2015.11.26.min.js'></script>

第二步:DOM部分:

1
2
<canvas id="canvas" width="640" height="1008"></canvas>
<video id="video" ></video>

第三步;CSS部分:我使用的是全屏幕绘制,将视频元素隐藏

1
2
3
4
5
6
7
8
9
10
11
canvas{
position:absolute;
width:100%;
height:100%;
top:0px;
left:0px;
}
#video{
display:none;
}

第四步:JS部分:

以下是设置video元素的属性

1
2
3
4
5
var video = document.getElementById('video');
video.src = 'images/video.mp4';
video.setAttribute('webkit-playsinline',true); //IOS内连方式播放视频
video.setAttribute('playsinline',true);//IOS微信浏览器内连方式播放视频
video.setAttribute('x5-video-player-type','h5');//Android微信浏览器启用h5播放器

以下开始绘制视频

1
2
3
4
5
var stage = new createjs.Stage('canvas');  //设置舞台
var bitmap = new createjs.Bitmap(video); //载入视频
stage.addChild(bitmap);
createjs.Ticker.setFPS(25); //设置帧率
createjs.Ticker.on('tick',stage); //刷新舞台

演示地址

DEMO

1. 单位,比例统一

   在建模型前先设置好单位,在同一场景中会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序需要缩放也可以统一调整缩放比例。统一单位为米。

2. 模型规范

 ⒈ 所有角色模型最好站立在原点。没有特定要求下,必须以物体对象中心为轴心。
 ⒉ 面数的控制。移动设备每个网格模型控制在300-1500个多边形将会达到比较好的效果。   而对于桌面平台,理论范围1500-4000。如果游戏中任意时刻内屏幕上出现了大量的角色,那么就应该降低每个角色的面数。比如,半条命2对于每个角色使用2500-5000个三角面。
正常单个物体控制在1000个面以下,整个屏幕应控制在7500个面以下。所有物体不超过20000个三角面。
 ⒊ 整理模型文件,仔细检查模型文件,尽量做到最大优化,看不到的地方不需要的面要删除,合并断开的顶点,移除孤立的顶点,注意模型的命名规范。模型给绑定之前必须做一次重置变换。
 ⒋ 可以复制的物体尽量复制。如果一个1000面的物体,烘焙好之后复制出去100个,那么他所消耗的资源基本和一个物体消耗的资源一样多。

3. 材质贴图规范

 ⒈ 我们目前使用的Unity3D软件作为仿真开发平台,该软件对模型的材质有一些特殊的要求,在我们使用的3dsMax中不是所有材质都被Unity3D软件所支持,只有standard(标准材质)和Multi/Sub-Objiect(多维/子物体材质)被Unity3D软件所支持。注:Multi/Sub-Objiect(多维/子物体材质)要注意里面的子材质必须为standard(标准材质)才能被支持。
⒉  Unity3D目前只支持Bitmap贴图类型,其它所有贴图类型均不支持。只支持DiffuseColor(漫反射)同self-Illumination(自发光,用来导出lightmap)贴图通道。 Self-Illumination(不透明)贴图通道在烘焙lightmap后,需要将此贴图通道channel设置为烘焙后的新channel,同时将生成的lightmap指向到self-Illumination。
3. 贴图文件格式和尺寸
  原始贴图不带通道的jpg,带通道的为32位tga或者 png,尺寸最大别超过2048,贴图文件尺寸须为2的N次方 (8、16、32、64、128、256、512、1024)最大贴图尺寸不能超过1024x1024,特殊情况下尺寸可在这些范围内做调整。

4. 贴图材质应用规则

⒈贴图不能为中文命名,不能有重名;
⒉材质球命名与物体名称一致,材质球的父子层级的命名必须一致;
⒊同种贴图必须使用一个材质球;
⒋除需要用双面材质表现的物体之外,其他物体不能使用双面材质;
⒌材质的ID和物体的ID号必须一致;
⒍若使用completemap烘焙,烘焙完毕后会自动产生一个shell材质,必须将shell材质变为standard标准材质,并且通道要一致,否则不能正确导出贴图;
⒎带Alpha通道的贴图存储为tga或者png格式,在命名是必须加_al以区分。
⒏模型需要通过通道处理时需要制作带有通道的纹理,在制作树的通道纹理是,最好将透明部分改为树的主色,这样在渲染是可以使有效边缘部分的颜色正确,通道纹理在程序渲染时占用的资源币同尺寸的普通纹理要多.通道纹理命名时应以_al结尾。

5. 模型烘焙及导出

模型的烘焙方式有两种:
**   ⒈ 一种是LightMap烘焙贴方式,这种烘焙贴图渲染出来的贴图只带有阴影信息,不包含基本纹理。具体应用于制作纹理较清晰的模型文件(如地形),原理是将模型的基本纹理贴图和LightMap阴影贴图两者进行叠加。优点是最终模型纹理比较楚,而且可以使用重复纹理贴图,节约纹理资源;烘焙后的模型可以直接导出FBX文件,不用修改贴图通道。缺点是LightingMap贴图不带有高光信息;
**   ⒉ 另一种是CompleteMap烘焙方式,这种烘焙贴图方式的优点是渲染出来的贴图本身就带有基本纹理和光影信息,但缺点是没有细节纹理,且在近处时纹理比较模糊。
  ⒊烘焙贴图设置。
     在进行completemap烘焙方式设置时应注意:贴图通道和物体uv坐标通道必须为1通道,烘焙贴图文件存储为tga格式,背景要改为与贴图近似的颜色;
     lightingmap烘焙设置时,和completemap设置有些不同,贴图通道和物体uv坐标通道必须为3通道,烘焙时灯光的阴影方式为adv.raytraced 高级光线跟踪阴影,背景色要改为白色,可以避免黑边的情况。

    主要物件的贴图uv必须手动展开。

6. 模型绑定及动画

  1. 骨骼必须为IK、CAT、BIP三类,unity不认虚拟体动画,单个物体骨骼数量不超过60个。
  2. 动画帧率、帧数的控制,一般情况下为每秒10帧,一个动画尽量控制在1秒内完成。
  3. 角色蒙皮、动作调节规范详见—(动画规范流程表)。
  4. 导出动画,分开2个文件,导出没有动作的模型、骨骼,模型需要带有蒙皮信息。之后调节好做动画后导出的就是只有骨骼的fbx文件。

7. 模型导出

**  **⒈ 将烘焙材质改为标准材质球,通道为1,自发光100%;
  ⒉ 所以物体名、材质球名、贴图名保持一致;
  ⒊ 合并顶点,清除场景,删除没有用的一切物件;
  ⒋ 清材质球,删除多余的材质球(不重要的贴图要缩小);
  ⒌ 按要求导出fbx(检查看是否要打组导出),导出fbx后,再重新导入max中查看一遍fbx的动画是否正确;
  ⒍ 根据验收表格对照文件是否正确;

8. 文件备份提交标准

  ⒈ 最终确认后的max文件分 角色模型、场景模型、道具模型带贴图存放到服务器相应的” 项目名/model/char” “项目名/model/scene”  “项目名/model/prop”文件夹里面。动画文件对应的存放至anim 文件夹中。
  ⒉ 导出给程序obj、fbx等格式文件统一存放至export文件夹下的子文件夹anim、model、prop

** 9.  项目命名要求**

**  **⒈ 项目进入策划时,各部门统一为项目命好名称,服务器建立项目名称文件夹,制作人员本机制作时建立对应名称的项目文件夹。
  ⒉ 角色模型命名:项目名_角色名字,max文件中模型对象如果需要分开各部位时,应在此命名的基础上_部位,如角色头部命名为:项目名_角色名_head ,以此类推。对应的材质球、贴图都将命名一致。
  ⒊ 场景、道具命名:项目名_场景名称,max文件中对应的物体为项目名_场景名物体名,同类的比较多的情况下,命名为:项目名_场景名_物体名_01—–02……同类型的物体以数字类推方式命名。材质球、贴图对应物体名字。同类物体只需要给同一个材质球,同一贴图即可。
  ⒋ 带通道的贴图:要加_al后缀
  ⒌ 特效贴图以特效名称命名,贴图加入_vfx后缀。

本例为vray烘培,主要是 max模型 导入unity中,如果是移动平台,资源需要保证最优化和最好效果兼顾,故将模型烘培。

(一) Completemap和lightingmap的区别

1.lightingmap

优点:纹理清晰。(可以在photoshop软件里调节对比度来改善!)

缺点:光感没有complete的光感好,只支持max默认的材质,要出好的和表面丰富的效果的话就只能在ps自己画了对美工要求很高,所消耗的资源是completemap烘焙方式的两倍。

适用的范围:适用于大面积的墙体,室内外大的地面等

2.completemap

优点:光感好!!支持多数的复合材质

缺点:好的效果需要,烘焙的尺寸大一些才可以,否则会很模糊,消耗的资源多。

适用的范围:适用于小物件,及需要重点表现的物体,对于没有纹理材质的物体,例如白墙。也可以用complete渲染烘焙方式。对于室外鸟瞰的文件,如果相机不就近看,可以考虑把周围周围周围周围周围黑名一片楼合并成一个物体,然后再进行complete烘焙一下,这样可以节省很多资源

往往在制作室内的小场景文件及室外的鸟瞰文件,complete用的会多一些;而一些需要着重于纹理表现的场景文件,例如房地产小区等,在用lghtmap渲染烘焙会多一些。具体在项目中使用complete还是使用lightmap,还是要看具体的情况。

在webmax虚拟过程中,若不知道选用哪种渲染烘焙方式的时候,建议使用completemap渲染烘焙方式,因为这种方式所消耗的资源来说比较小。

毕竟webmax最终是要发布网络上,所以我尽量去考虑如何的去节省资源。

(二)max 2016的烘焙流程

目前我们就针对于max 2016的lihtmap渲染烘焙进行简要介绍。

在3ds max 2016中对物体进行lihtmap烘焙的制作步骤如下:

(1) 在3ds max任意视图中选择所有物体(也可直接按下Ctrl+A组合键)。
(2) 单击Rendering \ Render To Texture(或直接按下数字键“0”),随后便会弹出Render To Textures对话框。
(3) 依次按照下图所示的参数进行设置,图中提示部分是必须设置的,其他为默认参数,若默认值被误修改,请根据下图恢复这些默认值。设置完毕后点击Render开始烘焙。

Paste_Image.png

Paste_Image.png

Paste_Image.png

最后render即可烘焙渲染了。

(三)vray3.0的烘焙流程实例

在vray3.0版本,烘焙的选项多了几项,我们需要选择vray所提供的烘焙项。如图:

对于两种烘焙方式,我们分别介绍一下:

打开一个场景,渲染最终的效果如图:

Paste_Image.png

在得到满意的渲染效果之后,可以开始烘焙的工作

(1) vraycompletemap烘焙

Paste_Image.png

使用vrayCompleteMap时,记得采用通道1,因为unity仅支持vraycompletemap通道1

(2) vraylightmap烘焙

在用此烘焙文件的时候,需要注意两点

(a) 光贴图烘焙的选项,要选择vraylightmap,而不能用lightmap

(b) 在渲染得控制面板里面,把Global switches下的maps选项的钩去掉 如图:

Paste_Image.png

Paste_Image.png

记得通道使用 通道3,unity支持vraylightmap通道3

0%