博文

好用的Shell:fish

先来一波安装: Ubuntu系统: $ apt-get update $ apt-get install fish Amazon Linux 2: 先执行 $ rpm -E %{rhel} 查看RHEL版本,如果是版本7,就运行 $ cd /etc/yum.repos.d/ $ wget https://download.opensuse.org/repositories/shells:fish:release:3/CentOS_7/shells:fish:release:3.repo $ yum install fish 可以编辑/etc/passwd文件,设置fish为默认的shell 也可以通过chsh来设置 $ chsh -s /usr/bin/fish 在python3-venv里使用fish $ source ./venv/bin/activate.fish

ubuntu启动ipv6

1、先看系列是否分配了IPV6。没分配先联系下服务商,我这里是已经分配惹。 $ ip addr | grep inet6 inet6 ::1/128 scope host inet6 210a:****:****:****:0:****:****:****/128 scope global dynamic noprefixroute inet6 fa82::****:**:****:2e53/64 scope link 2、修改网卡配置文件 $ vim /etc/netplan/50-cloud-init.yaml network:     version: 2     ethernets:         eth0:             dhcp4: true             match:                 macaddress: **:**:**:**:**:**             addresses:                 - 210a:****:****:****:0:****:****:****/128             set-name: eth0 增加了一行addresses配置,设置的IP地址就是第一步里返回的IP 3、查看IPV6的路由配置 $ route -6 找到Destination这一列,以第一个以/64结尾的ip,就是网关IP,比如:210a:****:****:****::/64 4、设置网关 $ ip -6 route add default dev eth0 via 210a:****:****:**** 测试一波IPV6 $ ping6 www.google.com 能ping通,就说明已经配置好了IPV6

Ubuntu安装Docker

先删除旧版本 $ sudo apt-get update $ sudo apt-get remove docker docker-engine docker.io containerd runc 添加apt包仓库 $ sudo apt-get update $ sudo apt-get install ca-certificates curl gnupg lsb-release 添加Dcoker的GPG key $ sudo mkdir -p /etc/apt/keyrings $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg 添加Docker源,适合bash的shell环境执行 $ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 开始安装 $ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin 运行hello-world看看是否安装成功 $ sudo docker run hello-world 当出现「Hello from Docker!」,而又没有报错说明安装成功。 官方文档 https://docs.docker.com/engine/install/ubuntu/ 安装成功之后,配置下日志的大小和ipv6支持。 增加文件:/etc/docker/daemon.json 写入 {     "log-driver": "json-file",

Tornado导出Excel

import io import asyncio import xlsxwriter import tornado.web class MainHandler(tornado.web.RequestHandler):     async def get(self):         self.set_header('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')         self.set_header('content-Disposition', 'attachment; filename=Export.xlsx')         output = io.BytesIO()         workbook = xlsxwriter.Workbook(filename=output, options={'in_memory': True})         worksheet = workbook.add_worksheet(name='test sheet')         worksheet.write(0, 0, 'a')         worksheet.write(0, 1, 'b')         worksheet.write(0, 2, 'c')         worksheet.write(1, 0, 1024)         worksheet.write(1, 1, 'z')         worksheet.write(1, 2, 23)         workbook.close()         self.write(output.getvalue())         await self.flush() def make_app():     return tornado.web.Application([         (r"/", MainHandler

强大的FFMPG

FFMPG转换格式日常用的少,主要是机器配置不行。 分享一波常用命令 使用ffmpeg下载视频: 保存为 MP4 ffmpeg -user_agent "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -i "/index.m3u8" -c copy -bsf:a aac_adtstoasc 20220430.mp4 使用ffmpeg直播摄像头 sudo ffmpeg \ -f video4linux2 -framerate 25 -video_size 1280x720 -i /dev/video0 \ -f alsa -ac 2 -i sysdefault:CARD=WEBCAM \ -c:v libx264 -b:v 1600k -preset ultrafast \ -x264opts keyint=50 -g 25 -pix_fmt yuv420p \ -c:a aac -b:a 128k \ -f flv "rtmp://sendtc3a.douyu.com/live/70302rd7iwAenSvy?wsSecret=&wsTime=622cb01c&wsSeek=off&wm=0&tw=0&roirecognition=0&record=flv&origin=tct"

FaceBook登录,从code到获得access token

文档来源:https://developers.facebook.com/docs/marketing-apis/overview/authentication/ 在FB的开发者后台配置好回调地址(Valid OAuth Redirect URIs):https://iwangtao.com/oauth2/meta/auth 然后下面网址,使用FB账号授权。v13.0是当前API接口版本。redirect_uri是配置的回调地址,FB用户授权之后,会把code传到这个网址。scope是授权的范围,这里的ads_read是查看FB广告权限; https://www.facebook.com/v13.0/dialog/oauth?client_id={你的App ID}&redirect_uri=https://iwangtao.com/oauth2/meta/auth&scope=ads_read 授权之后,然后跳转到https://iwangtao.com/oauth2/meta/auth?code={code}#_=_ 拿到code后,在服务器端使用GET方法请求下面接口。redirect_uri是后面配置的回调地址;app_secret是appid对应的app secret。 https://graph.facebook.com/v13.0/oauth/access_token?client_id={你的App ID}&client_secret={app_secret}&redirect_uri={redirect_uri}&code={code} 如果一切正常,就可以拿到access_token的JSON信息了 {     "access_token": "********",     "token_type": "bearer",     "expires_in": 5174633 }

使用nginx配置Vue项目,减少一次option请求

现在流行的前后端分离的写法。拆成不同Web服务进行部署。客户端一般是多发一个option请求解决跨域问题。有多个通过api拉数据请求,就有多少个option请求,对性能影响很大。 使用Nginx可以把特定路径的请求转发到指定服务里。 把前端网站部署域名为blog.iwangtao.com,然后有个后台服务,之前的域名是api.iwangtao.com。现在可以在blog.iwangtao.com里做配置,把blog.iwangtao.com下的/api/*请求转发到原api.iwangtao.com下。 定义好一个后台的upstream是这样的 upstream say-hi {     server 127.0.0.1:9000;     server 127.0.0.1:9001;     server 127.0.0.1:9002;     server 127.0.0.1:9003; } 在server内,添加 location /api/ {     proxy_pass_header Server;     proxy_set_header Host $http_host;     proxy_redirect off;     proxy_set_header X-Real-IP $remote_addr;     proxy_set_header X-Scheme $scheme;     proxy_pass http://say-hi/; } 「/api/」结尾一定要是「/」才会可以正常匹配。 普通前端匹配的路径,例如location / {} 抢占式前缀匹配的路径,例如location ^~ / {} 精确匹配的路径,例如location = / {} 命名路径,比如location @a {} 无名路径,比如if {}或者limit_except {}生成的路径 这样所有/api/请求都会转发到配置好的say-hi里