作者归档:ning

Appwrite介绍:开源的移动和WEB后端服务

Appwrite是面向前端和移动开发人员的新型开源端到端后端服务器,可让您更快地构建应用程序。

Appwrite的目标是抽象和简化REST API和工具背后的常见开发任务,以帮助开发人员更快地构建高级应用程序。

在这篇文章中,我将简要介绍一些主要的Appwrite服务,并解释它们的主要功能以及它们的设计方式,以帮助您比从头开始编写所有后端API时更快地构建下一个项目。

Appwrite服务器打包为docker容器,您可以使用本地计算机或云提供商终端上的简单docker-compose命令轻松设置。

mkdir appwrite-ce && \
cd appwrite-ce && \
curl -o docker-compose.yml https://appwrite.io/docker-compose.yml && \
docker-compose up -d --remove-orphans

Appwrite身份验证

您可以轻松地将OAuth提供程序集成为应用程序的新登录方法

通过Appwrite身份验证服务,您可以轻松管理用户注册并登录您的应用。Auth服务还提供与多个OAuth提供商的内置集成,如Facebook,Github,LinkedIn等。

除了管理对您的应用及其不同资源的访问控制之外,Auth服务还抽象其他重复任务,例如管理用户电子邮件确认和密码恢复。

使用Auth服务可以节省构建稳定安全的用户身份验证和授权系统所带来的大量时间和顾虑,同时还必须与多个第三方登录方法集成。

Appwrite帐户

file

Appwrite Account服务向您的客户端公开了一个API,允许您与当前登录的用户帐户进行交互。

Appwrite帐户服务可让您管理用户活动会话。

帐户服务允许您的用户更新其帐户相关信息,并保存他们的私人偏好,如用户界面语言,时区或喜爱的主题。您可以使用您希望的任何偏好设置用户。

您还可以使用API获取用户活动会话的列表,包括有关会话位置,设备,操作系统和用户代理的信息。使用API安全日志端点,您可以让用户查看其最新登录,密码恢复和其他安全敏感事件。

Appwrite数据库

file

Appwrite数据库仪表板允许您轻松浏览项目集合和文档。

Appwrite数据库服务允许您直接从客户端应用程序集成您的用户和应用程序数据,无论是浏览器还是本机应用程序。数据库中的每个文档都能够嵌套其他子文档。使用Appwrite数据库筛选器,您可以应用高级查询并筛选嵌套文档集合。

每个文档都可以为特定用户,用户团队,API密钥或用户角色设置读写权限。使用Appwrite数据库,简单而灵活的权限机制,您可以为您的应用程序管理复杂和复杂的访问控制逻辑。

Appwrite数据库还可以灵活地选择结构化数据收集或灵活的收集,以便随时管理数据。使用Appwrite,简单而强大的数据集合,您可以为集合中的每个文档强制执行数据结构和验证规则。

Appwrite存储

Appwrite Storage服务是让您或您的应用用户安全,简单地上传和管理文件的最简单方法。

Appwrite Storage API利用了Appwrite数据库使用的相同的简单读写权限机制。这使您可以轻松确定所有用户,特定用户甚至用户团队是否可以访问您的文件。

var appwrite = new window.Appwrite();

appwrite
    .setEndpoint('https://localhost/v1')
    .setProject('[PROJECT-ID]')
;

var file  = document.getElementById('file-input').files[0];
let read  = ['*']; // wildecard read access
let write = ['user:self']; // write access only to me

appwrite.storage.createFile(file, read, write)
    .then(function (response) {
        console.log('file uploaded successfully');
    }, function (error) {
          console.log(error);
    });

Appwrite Storage API允许您轻松地在应用程序中集成安全文件上载。

Appwrite Storage服务还提供与自动更新的防病毒服务器的内置集成。所有上传到您系统的新文件都会进行扫描和验证,以确保您和您的用户的安全。

Appwrite Storage服务提供的最有用的功能之一是能够预览文件内容并在应用程序或网站中将其显示为缩略图。您还可以动态更改缩略图的大小,在不同的图像格式之间进行转换(支持webp!)并更改其质量以提高网络性能。

Appwrite Teams

Appwrite Teams服务允许您和您的用户创建团队并共享不同API资源(如文件或文档)的权限。这是为您的产品实施复杂访问控制要求的一种非常简单的方法。

每个团队成员也可以被授予不同的角色,以便您获得更大的灵活性。

Appwrite Task

file

Appwrite Task 服务是设置定期计划作业的好方法。

而不是使用复杂的crontabs或长时间运行的守护进程处理并担心容错,监视和错误记录等问题,您需要做的就是提交一个表单,其中您的任务作为HTTP端点和类似cron的语法来指示如何经常应该执行。就这么简单。

您还可以使用任务高级选项向请求添加不同的HTTP标头,或使用基本HTTP身份验证对其进行保护。不用说,所有敏感的HTTP密码都在Appwrite内部数据库中安全加密。

Appwrite Webhooks

file

您可以从Appwrite控制台轻松注册新的webhook。

Appwrite Webhooks旨在让您轻松方便地集成后端的自定义行为。

想要在新用户注册到您的应用时收到短信?想要在您的某个应用文档获得更新时清除缓存吗?只需添加一个新的webhook,当特定的Appwrite事件触发时,该webhook会触发您端点的HTTP端点。使用Appwrite Webhooks你只会受到想象力的限制。

Appwrite Github

https://github.com/appwrite/appwrite

Arch linux / manjaro开启bbr

查看内核版本号

uname -r

如果内核版本大于等于4.9可以直接开启

检查bbr模块是否存在

然后使用命令modinfo tcp_bbr查看内核模块是否存在。

modinfo tcp_bbr

开启bbr模块

sudo  modprobe tcp_bbr

下次自动开启

默认没有开启,自动开启

echo "tcp_bbr" > /etc/modules-load.d/80-bbr.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.d/80-bbr.conf
echo "net.core.default_qdisc=fq" >> /etc/sysctl.d/80-bbr.conf

立即加载

sysctl -p 

检查是否成功

sysctl net.ipv4.tcp_congestion_control

Mysql不锁表增加字段和索引方法

Mysql 8.0.12 新增 instant 算法,秒级添加字段

ALTER TABLE `member` ADD `user_from` smallint(1) NOT NULL, ALGORITHM=instant

看了网上很多回答,基本都是过时和错误的。

5.6 以后增加了ONLINE DDL,

实现不锁表增加字段和索引非常简单。

解决办法

ALTER TABLE `member` ADD `user_from` smallint(1) NOT NULL, ALGORITHM=INPLACE, LOCK=NONE

ALGORITHM表示算法:default默认(根据具体操作类型自动选择),inplace(不影响DML),copy创建临时表(锁表),INSTANT只修改元数据(8.0新增,在修改名字等极少数情况可用)

LOCK表示是否锁表:default默认,none,shared共享锁,exclusive

什么情况下会inplace,什么情况下会copy?

什么情况下会inplace,什么情况下会copy,具体参考:Online DDL Operations

5.6以前版本解决办法

参考

打印机自助打印代码(队列监控拦截+取消+状态获取)(附C#,C++,VB实现)

Monitor jobs in a printer queue (.NET)

https://www.codeproject.com/Articles/51085/Monitor-jobs-in-a-printer-queue-NET

c# 完整代码展示了如何获取打印机任务状态

file

Print Spooler API

https://docs.microsoft.com/zh-cn/windows/win32/printdocs/print-spooler-api

The Print Spooler API provides an interface to the print spooler for applications to manage printers and print jobs.

The Print Spooler API is used by an application as part of its programming and not directly by end users.

PrintQueue.GetPrintJobInfoCollection Method

Creates a collection that contains a PrintSystemJobInfo object for each job in the queue.

https://docs.microsoft.com/en-us/dotnet/api/system.printing.printqueue.getprintjobinfocollection?view=netframework-4.8

"Virtual Printer" or "Moving Printjobs" (C++)

https://cboard.cprogramming.com/windows-programming/108156-virtual-printer-moving-printjobs.html

Monitoring a Printer Queue from VB.NET

https://www.codeproject.com/Articles/3313/Monitoring-a-Printer-Queue-from-VB-NET

How to catch printer event in python

https://stackoverflow.com/questions/15748386/how-to-catch-printer-event-in-python

Printers and SafeHandles

https://www.codeproject.com/Articles/14690/Printers-and-SafeHandles

Printers and SafeHandles (Part 2)

https://www.codeproject.com/Articles/15084/Printers-and-SafeHandles-Part-2

内网穿透工具比较(ngrok,frp,lanproxy,goproxy,nps)

从是否有API,客户端单独key,子域名,收费模式,采用语言,github stars多个维度比较了ngrok, frp, lanproxy, goproxy, nps几款内网穿透工具

file

ngrok

https://github.com/inconshreveable/ngrok

frp

https://github.com/fatedier/frp

lanproxy

https://github.com/ffay/lanproxy

goproxy

https://github.com/snail007/goproxy

nps

https://github.com/cnlh/nps

综上,
如果希望自己二次开发(有API可以调用)或者有多个租户(每个客户端一个单独的key),建议使用nps。
如果希望简单上手,没有多个租户的要求,建议使用frp。

2020.8.11更新:frp已支持OIDC认证

composer require 慢的解决办法

使用composer镜像

使用aliyun镜像

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

禁止安装时更新

composer require 添加 --no-update 参数

composer require packagename --no-update

centos下supervisor安装和使用

安装

dnf update -y
dnf install supervisor
sytemctl enable supervisord

配置

vim /etc/supervisor/xxx.conf

    [program:testprogram]
    directory = /root/go/src/test
    command = /root/go/src/test/bin/server
    autostart = true
    startsecs = 5
    autorestart = true
    startretries = 3
    user = root
    redirect_stderr = true
    stdout_logfile = /var/log/supervisor/test.log

使用

supervisorctl reload
supervisorctl start xxx
supervisorctl status

微信小程序抽奖平台源码(4套)

一,https://github.com/tuoxie15/LuckDrawProgram

    页面

├── home                   首页 奖品列表页
├── luckDraw               奖品详情页 抽奖页
├── personalCenter         个人中心 我参加的抽奖、中奖纪录、收货地址
├── past                   我参与过的抽奖页 待开奖、已结束
├── prize                  中/未中奖展示页、分享页、通过通知点进去展示页
├── record                 中过奖的记录页
├── portraitList           头像列表
├── FLBRecord              福利分领取记录
├── exchangeDetails        兑换商品详情
├── exchangeRecord         兑换商品记录
├── rankingList            排行榜
├── strategy               赚币攻略
|—— getMoreFLC             福利分页面 获得更多福利分
|—— historyDraw            历史抽奖
|—— sponsor                成为赞助商
|—— feedBack               意见反馈

二,https://github.com/ezshine/mp_luckydraw

一套微信小程序抽奖平台(包含全部前后端源码)

功能介绍

1、口令抽奖: 大家都知道小程序的限制颇多,不能引导回公众号,即使关联跳转小程序,也有数量限制。口令抽奖一来可以限制参与抽奖的人,二来可以通过口令提示引导回公众号下发口令,带动关注。

2、限定地点: 我希望这个小程序未来也可以帮助线下的商户发起抽奖活动,那么做一个参与的位置电子围栏是很有必要的。

3、限定性别: 不多解释

4、条码解锁: 这个的思路也很好玩,让抽奖活动需要触发扫描特定的条形码方可参与。那么自然特别适合快速消费品品牌来玩。

5、RP币

三,https://github.com/ifanrx/hydrogen-lottery-miniprogram

知晓云抽奖小程序

四,https://github.com/wang-binbin/smallAppsLottery

golang交叉编译

Windows主机编译Linux,MAC客户端

Windows主机编译Windows客户端

SET CGO_ENABLED=0
SET GOOS=windows
SET GOARCH=amd64
go build -o client-windows.exe main.go

Windows主机编译LINUX客户端

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64
go build -o client-linux main.go

Windows主机编译MAC客户端

SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build -o client-mac main.go

Linux主机编译Widows,MAC客户端

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o client-linux main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o client-mac main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o client-windows.exe main.go

MAC主机编译Widows,linux客户端

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o client-linux main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o client-mac main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o client-windows.exe main.go

PHP7.3 zts(线程安全)编译以及多线程(pthreads)使用

下载PHP

下载地址:https://www.php.net/downloads.php,开始下载:

su root
mkdir tmp
cd tmp
wget https://www.php.net/distributions/php-7.3.7.tar.bz2

编译安装PHP开启线程安全

tar -jxvf php-7.3.7.tar.bz2
cd php-7.3.7
yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libicu-devel

编译

./configure \
--prefix=/usr/local/php-7.3.7-ts \
--enable-maintainer-zts \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--enable-bcmath \
--enable-exif \
--enable-intl \
--enable-mbstring \
--enable-pcntl \
--with-pdo-mysql \
--enable-sockets \
--enable-mysqlnd \
--with-gd

然后:

make && make install

更新autoconf

Autoconf version 2.68 or higher is required错误是才需要此步骤

wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
tar -zxvf autoconf-latest.tar.gz 
cd autoconf-2.69/
.configure
make
make install
autoconf --version 

安装pthreads

git clone https://github.com/krakjoe/pthreads.git
cd pthreads
/usr/local/php-7.3.7-ts/bin/phpize
./configure --with-php-config=/usr/local/php-7.3.7-ts/bin/php-config
make
make install

修改 /usr/local/php-7.3.7-ts/lib/php.ini,增加 extension=pthreads

测试pthreads

/usr/local/php-7.3.7-ts/bin/php worker.php

<?php

class MyWorker extends Worker
{
    public $id;
    public $time;

    public function __construct($id, $time)
    {
        $this->id = $id;
        $this->time = $time;
    }

    public function run()
    {
        while (true) {
            echo sprintf(worker %s is running, %s\n, $this->id, date('Y-m-d H:i:s'));
            sleep($this->time);
        }
    }
}

class MyManager
{
    /**
     * @var MyWorker[]
     */
    protected $workers;

    public function add(MyWorker $work)
    {
        $this->workers[$work->id] = $work;
        echo 'add worker' . $work->id . \n;
    }

    public function run()
    {
        foreach ($this->workers as $id => $work) {
            echo 'run worker' . $work->id . \n;
            $work->start();
        }
    }
}

$manager = new MyManager();
$manager->add(new MyWorker('1', 1));
$manager->add(new MyWorker('2', 3));
$manager->run();