首页
友情链接
关于
推荐
工具
Linux
Search
1
欢迎使用 Typecho
20,229 阅读
2
Playwright使用记录
3,522 阅读
3
(Windows)以一种访问权限不允许的方式做了一个访问套接字的尝试处理
3,480 阅读
4
Unity独立安装后添加IL2CPP等编译组件
2,720 阅读
5
Windows上GCC安装
2,469 阅读
全部博文
游戏开发
Unity
Godot Engine
GDScript
编程代码
C#编程
GoLang编程
PowerShell
开发工具
Git
笔记备忘
登录
Search
标签搜索
docker
Godot
GCC
CMS
Proto.Actor
Actor模型
winpty
msys2
Unity
IL2CPP
package
golang
ssh
proxy
proxychains
minikube
k8s
n2n
PowerShell
ChatGPT
玖亖伍
累计撰写
33
篇文章
累计收到
221
条评论
首页
栏目
全部博文
游戏开发
Unity
Godot Engine
GDScript
编程代码
C#编程
GoLang编程
PowerShell
开发工具
Git
笔记备忘
页面
友情链接
关于
推荐
工具
Linux
搜索到
17
篇与
的结果
2022-06-29
虚拟组网工具n2n源码编译记录
操作环境: Ubuntu 20.4 LTS系统需要安装的编译相关的工具sudo apt install gcc g++ make git vim autoconf -y# clone源码(使用 https://ghproxy.com/ 加速) git clone https://ghproxy.com/https://github.com/ntop/n2n.git n2n-src # 编译配置 cd n2n-src/ ./autogen.sh ./configure # 编译 make # 安装 sudo make install
2022年06月29日
357 阅读
0 评论
0 点赞
2022-05-24
SSH反向代理的使用
准备工作说明:12.34.56.78 为公网服务器, ssh端口为22192.168.1.2 为内网服务器(未开放访问公网), ssh端口为10022192.168.1.5 为本机, 可访问192.168.1.2和12.34.56.78涉及到的命令# 设置SOCKS5代理 ssh -o StrictHostKeyChecking=no 12.34.56.78 -l user0 -p 22 -D 0.0.0.0:12080 -N -v # 设置反向隧道到代理 ssh -o StrictHostKeyChecking=no 192.168.1.2 -l devops -p 10022 -R 8051:127.0.0.1:12080 -N -v # 本机连接到私域服务器,下面的命令在其上执行 ssh 192.168.1.2 -l devops -p 100221. 修改hosts,绕过DNS解析编辑hosts文件,按需设置: sudo vim /etc/hosts119.84.77.214 mirrors.aliyun.com 140.83.35.89 ghproxy.com 65.52.183.205 packages.microsoft.com2. 安装proxychains获取proxychains源码# 临时设置代理 export ALL_PROXY=socks5://127.0.0.1:8051 # 获取proxychains源码 git clone https://ghproxy.com/https://github.com/rofl0r/proxychains-ng.git proxychains-ng-src # 取消临时代理 unset ALL_PROXYproxychains编译和安装cd proxychains-ng-src/ ./configure make sudo make install sudo make install-config修改proxychains配置添加代理: sudo vim /usr/local/etc/proxychains.conf[ProxyList] socks5 127.0.0.1 80513. 使用示例通过proxychains安装.NET6和Powershellproxychains4 wget -c https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb sudo proxychains4 apt update # 安装常用和必要软件 sudo proxychains4 apt install -y apt-transport-https software-properties-common w3m tree # 安装 .NET6和pwsh sudo proxychains4 apt install -y dotnet-sdk-6.0 powershell # 验证 dotnet --info pwsh --version运行filebrowserproxychains4 wget -c https://ghproxy.com/https://github.com/filebrowser/filebrowser/releases/download/v2.21.1/linux-amd64-filebrowser.tar.gz tar -zxvf linux-amd64-filebrowser.tar.gz mkdir data-store /home/devops/filebrowser/filebrowser --address "0.0.0.0" --port "2554" --root /home/devops/filebrowser/data-store # 本地代理(本地访问: http://127.0.0.1:2554/) ssh -o StrictHostKeyChecking=no 192.168.1.2 -l devops -p 10022 -L 2554:127.0.0.1:2554 -N -v
2022年05月24日
347 阅读
0 评论
0 点赞
2022-05-20
Ubuntu上MySQL8备忘
安装mysql# 服务器 sudo apt install mysql-server -y # 客户端 sudo apt install mysql-client -y设置密码并开启远程连接修改mysql配置vim /etc/mysql/mysql.conf.d/mysqld.cnf主要配置内容[mysqld] # mysql 监听主机 bind-address = 0.0.0.0 # mysql X插件 监听主机(如果启用了的话) mysqlx-bind-address = 0.0.0.0修改mysql内部设置超管方式运行mysql# Ubuntu上全新安装的mysql8没有默认启用密码插件 sudo mysql执行如下sql操作-- 修改默认root@localhost使用密码插件并设置密码 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your password'; -- 添加root允许远程主机访问(如果有必要,务必确保安全) CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your password'; -- 授予远程访问全部权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; -- 刷新权限 FLUSH PRIVILEGES; exit安装mysql后需要修改忽略表名大小写Windows上,MySQL默认是忽略表名大小写的;Linux上,MySQL默认是区分表名大小写的,且MySQL初始化之后是不允许修改忽略表名大小写配置的,而MySQL安装过程会自动初始化。如下操作参考: How to install MySQL 8.0 with lower_case_table_names=1 on Ubuntu Server 20.04 LTS successfully?如果需要在MySQL安装后修改为忽略表名大小写,则需要删除MySQL数据,重新初始化,所以,如下操作前请备份数据;修改mysql配置vim /etc/mysql/mysql.conf.d/mysqld.cnf主要配置内容[mysqld] lower_case_table_names = 1清理数据(操作前务必备份数据)# 停止服务 sudo service mysql stop # 删除mysql数据文件夹及内部数据 sudo rm -rf /var/lib/mysql # 重新创建mysql数据文件夹并赋予合适的权限 sudo mkdir /var/lib/mysql sudo chown mysql:mysql /var/lib/mysql sudo chmod 700 /var/lib/mysql # 重新初始化mysql sudo mysqld --defaults-file=/etc/mysql/my.cnf --initialize --lower_case_table_names=1 --user=mysql --console # 启动服务 sudo service mysql start # 查看mysql临时密码 sudo grep 'temporary password' /var/log/mysql/error.log # 使用(临时密码)登录mysql sudo mysql -u root -p # 参考前面允许远程配置部分,修改密码可参考的mysql语句-- 查看用户、认证方式、主机等信息 SELECT user,authentication_string,plugin,host FROM mysql.user; -- 是否启用了ssl SHOW VARIABLES LIKE 'have_ssl'; -- 是否忽略大小写 SHOW VARIABLES LIKE 'lower_case_%';
2022年05月20日
500 阅读
0 评论
0 点赞
2021-08-02
Playwright使用记录
Playwright for .NET is the official language port of Playwright, the library to automate Chromium, Firefox and WebKit with a single API.操作记录# 安装 Playwright 工具 dotnet tool install --global Microsoft.Playwright.CLI # 创建项目 dotnet new console -n PlaywrightDemo cd PlaywrightDemo # 安装依赖 dotnet add package Microsoft.Playwright --prerelease # 用Playwright 工具安装浏览器 playwright install # chromium v888113 downloaded to C:\Users\gsw\AppData\Local\ms-playwright\chromium-888113 # firefox v1268 downloaded to C:\Users\gsw\AppData\Local\ms-playwright\firefox-1268 # webkit v1490 downloaded to C:\Users\gsw\AppData\Local\ms-playwright\webkit-1490 # ffmpeg v1005 downloaded to C:\Users\gsw\AppData\Local\ms-playwright\ffmpeg-1005 # 运行项目(PlaywrightDemo) dotnet run # 自动生成代码 playwright codegen # 打开指定页面(可调试或生成代码) playwright open https://gsw945.com/ # 以指定的语言、时区、和窗口大小,使用chromium浏览器打开指定页面,生成C#代码 playwright codegen --target csharp --browser chromium --channel chrome --lang "zh-CN" --timezone "Asia/Shanghai" --viewport-size "1920,1080" "https://gsw945.com/"代码示例using Microsoft.Playwright; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; class Program { /// <summary> /// 等待退出 /// </summary> private static ManualResetEvent waitQuitEvent = new ManualResetEvent(initialState: false); public static async Task Main() { // 设置调试相关环境变量 Environment.SetEnvironmentVariable("PWDEBUG", "console"); Environment.SetEnvironmentVariable("DEBUG", "pw:api"); var appDataLocal = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); Console.WriteLine($"playwright下载浏览器目录: {Path.Combine(appDataLocal, "ms-playwright")}"); List<KeyValuePair<string, string>> envs = new List<KeyValuePair<string, string>>(); foreach (DictionaryEntry envItem in Environment.GetEnvironmentVariables()) { envs.Add(new KeyValuePair<string, string>((string)envItem.Key, (string)envItem.Value)); } // 创建playwright实例 using var playwright = await Playwright.CreateAsync(); // 创建Chromium浏览器实例 await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions() { Headless = false, // 关闭无头模式(有界面) Channel = "chrome", // 指定采用chrome浏览器类型 Devtools = true, // 启用开发者工具 ChromiumSandbox = false, // 关闭浏览器沙盒 Env = envs, // 环境变量 ExecutablePath = string.Empty, // 不指定浏览器可执行文件位置,会自动寻找 ms-playwright 下载的浏览器 }); browser.Disconnected += (object sender, IBrowser e) => { Console.WriteLine($"On Browser Close"); }; // 浏览器上下文 await using var context = await browser.NewContextAsync(new BrowserNewContextOptions { ViewportSize = new ViewportSize { Width = 1536, // 1920 * 0.8 Height = 864, // 1080 * 0.8 }, // 视口大小 Locale = "zh-CN", // 语言(区域) TimezoneId = "Asia/Shanghai", // 时区 }); context.Close += (object sender, IBrowserContext e) => { Console.WriteLine($"On Context Close"); }; // 新开页面(空白页) var page = await context.NewPageAsync(); // var page = await browser.NewPageAsync(); page.Close += (object sender, IPage e) => { Console.WriteLine($"On Page Close"); }; page.Dialog += async (_, dialog) => { Console.WriteLine(dialog.Message); await dialog.DismissAsync(); }; // 新开的页面跳转(打开)到指定URL await page.GotoAsync("https://gsw945.com/"); // await page.GotoAsync("https://playwright.dev/dotnet"); // 当前页面截图并保存到指定位置 var screenshotPath = Path.GetFullPath("screenshot.png"); await page.ScreenshotAsync(new PageScreenshotOptions { Path = screenshotPath, FullPage = true, Type = ScreenshotType.Png, OmitBackground = true }); if (File.Exists(screenshotPath)) { Console.WriteLine($"页面截图: {screenshotPath}"); // File.Delete(screenshotPath); } // (通过css选择器选择)点击指定的元素(如果元素还未出现在DOM中则等待) // refer: https://playwright.dev/dotnet/docs/core-concepts#auto-waiting await page.ClickAsync("a[title=\"友情链接\"]"); // (通过css选择器选择)等待元素出现在DOM中 await page.WaitForSelectorAsync("#Joe_Baidu_Record"); // 执行javascript表达式并取得结果 // refer: https://playwright.dev/dotnet/docs/core-concepts#execution-contexts-playwright-and-browser var href = await page.EvaluateAsync<string>("document.location.href"); Console.WriteLine($"href: {href}"); // 普通逻辑, 等待console退出 await StartWait2Exit(context); } public static async Task StartWait2Exit(IBrowserContext context) { Console.WriteLine("-".PadLeft(60, '-')); Console.WriteLine("Press [Ctrl + C] or [Q] or [Esc] to quit..."); Console.WriteLine("-".PadLeft(60, '-')); // Ctrl + C 捕获 Console.CancelKeyPress += (object sender, ConsoleCancelEventArgs eventArgs) => { eventArgs.Cancel = true; Console.WriteLine("[Ctrl + C] pressed, to quit."); waitQuitEvent.Set(); }; Thread t = new Thread(() => { while(true) { // 监听是否关闭了浏览器(playwright 断开连接 或 所有打开的页面全部都关闭了) if (!context.Browser.IsConnected || context.Pages.Count < 1) { Console.WriteLine("Detect Browser Context Is Not Connected or No Page is Open"); } // 如果输入输出未重定向 if (!Console.IsInputRedirected && Console.KeyAvailable) { // 读取键盘输入 ConsoleKeyInfo keyInfo = Console.ReadKey(intercept: true); Console.WriteLine($"Key: {keyInfo.Key}"); // Q或ESC键,退出 if (keyInfo.Key == ConsoleKey.Q || keyInfo.Key == ConsoleKey.Escape) { break; } } Thread.Sleep(millisecondsTimeout: 50); } waitQuitEvent.Set(); }); t.IsBackground = true; t.Start(); waitQuitEvent.WaitOne(); await Task.Yield(); } }参考Getting Started | PlaywrightDebugging toolsPlaywright for .NETPlaywrightBrowserBrowserContextPagePage.ScreenshotAsync(options)Page.WaitForSelectorAsync(selector, options)https://github.com/microsoft/playwrighthttps://github.com/microsoft/playwright-dotnet
2021年08月02日
3,522 阅读
0 评论
1 点赞
2021-07-29
Proto.Actor Bootcamp 学习笔记
Proto.Actor Bootcamp一、介绍Actor模型和Proto.Actor1. 为何使用Actor模型源: Docs\Bootcamp\Unit 1\Lesson 1: Why use the actor model无需手动控制线程高级抽象垂直伸缩(扩大)水平伸缩(扩展)容错和错误处理常见的体系结构2. Actor模型适用的应用类型源: Docs\Bootcamp\Unit 1\Lesson 2: Types of applications for which actors are suitable.交易应用可分包的应用服务通信应用多人游戏交通管理数值处理物联网3. Proto.Actor在不同类型的应用中的使用源: Docs\Bootcamp\Unit 1\Lesson 3: Use of Proto.Actor in different types of applications.服务端服务后端(Web Api等)Web应用客户端控制台应用WPF应用4. 反应式编程宣言源: Docs\Bootcamp\Unit 1\Lesson 4: The Reactive ManifestoProto.Actor 遵循反应式编程宣言事件驱动弹性伸缩容错恢复响应性5. Proto.Actor的关键特性源: Docs\Bootcamp\Unit 1\Lesson 5: Key features of the Proto.Actor.并发和异步分布式处理高性能容错在单个应用程序使用多种编程语言的能力6. Actor和消息源: Docs\Bootcamp\Unit 1\Lesson 6: Actors and messages.Actor之间通过消息进行交互消息是异步的7. Proto.Actor中Actor是什么源: Docs\Bootcamp\Unit 1\Lesson 7: What’s an actor in Proto.Actor.一切都是Actor遵循 单一功能原则(Single responsibility principle)Actor功能接收消息并处理创建更多的Actor给其他Actor发消息改变状态以便可以处理后续消息Actor包括State 状态Behavior 行为对接收到的消息的处理Mailbox 信箱默认先入先出(FIFO)可用算法控制优先级Child actors 子级Actorcontext.actorOf (...) 创建context.stop (child) 停止Supervisor strategy 监管策略重启子级Actor,保持子级Actor的状态重启子级Actor,恢复子级Actor到标准状态停止子级Actor传递错误到父级Actor8. Proto.Actor中消息是什么源: Docs\Bootcamp\Unit 1\Lesson 8: What’s a message in Proto.Actor.Actor之间传递的数据(可以是普通的类)消息(在创建后)是不可变的消息是线程安全的9. Proto.Actor中Props、RootContext和ActorContext分别是什么源: Docs\Bootcamp\Unit 1\Lesson 9: What’re Props, RootContext, and ActorContext in Proto.Actor.RootContext 创建初始(顶级)Actor, 和应用系统中的Actor交互ActorContext 创建(普通, 非顶级)Actor, 和其他Actor交互, 存储Actor相关的数据Props 一个配置类, 设置创建Actor的参数10. Proto.Actor监管层级概述源: Docs\Bootcamp\Unit 1\Lesson 10: Overview of the supervisor hierarchy in Proto. Actor.错误处理自我修复11. 安装Proto.Actor源: Docs\Bootcamp\Unit 1\Lesson 11: Installing Proto.Actor.Proto. Actor 主要的NuGet包Proto.Schedulers.SimpleScheduler 调度消息(延迟发送或间隔重复发送等)Proto.Persistence.* 持久化Actor状态Proto.Remote 远程Proto.Cluster.* 集群Proto.OpenTracing 追踪和调试Actor二、 Actor和消息的定义和使用1. 定义Actor源: Docs\Bootcamp\Unit 2\Lesson 1: Defining Actors.一个继承自Proto.Actor的Actor基类的类定义可以处理的消息类型确保Actor的内部状态不会被其他Actor改变一个Actor的功能应该足够简单,如果太负责则应该拆分为单独的Actor注意Actor使用的计算资源和内存消耗2. Actor引用源: Docs\Bootcamp\Unit 2\Lesson 2: Actor References.PID 区分Actor, Actor的抽象层唯一增量分配Actor之间通过PID通信3. 定义消息源: Docs\Bootcamp\Unit 2\Lesson 3: Defining Messages.使用C#创建消息普通C#类类属性外部只读Protocol Buffers (protobuf)字段唯一编号1~536870911 取值区间19000~19999 保留值区间(内部使用)1~15 占用1个字节16~2047 占用2个字节option csharp_namespace 定义生成的C#代码的namespacepackage 防止消息定义命名冲突4. 发送消息的类型:源: Docs\Bootcamp\Unit 2\Lesson 4: Types of Message Sending.Send() 发送消息, 无需等待响应, 性能消耗小RequestAsync() 发送消息, 等待响应, 可设置等待超时Forward() 转发收到的消息到其他Actor5. Actor实例化:源: Docs\Bootcamp\Unit 2\Lesson 5: Actor Instantiation.6. 定义Actor将要处理的消息:源: Docs\Bootcamp\Unit 2\Lesson 6: Defining Which Messages an Actor will processing.7. 发送自定义消息:源: Docs\Bootcamp\Unit 2\Lesson 7: Sending a Custom Message.三、 理解Actor的生命周期和状态1. Actor生命周期源: Docs\Bootcamp\Unit 3\Lesson 1: Actor Lifecycle.Actor生命周期状态Starting ProcessMessageAsync()Receiving MessagesStopping产生原因:调用 ActorContext.Stop() 或 ActorContext.StopAsync()子级Actor出现错误,父级Actor会发送停止消息给它状态拆分:Stopping 收到Stop消息, 准备停止Stop Actor已停止, 使用的资源已释放Restarting 停止之后, 收到Restart消息Terminated 收到Terminated消息, 不再接受任何消息, 不能被重新加载2. Actor生命周期消息源: Docs\Bootcamp\Unit 3\Lesson 2: Actor Lifecycle Messages.3. 终止Actor和Actor的层次结构源: Docs\Bootcamp\Unit 3\Lesson 3: Terminating Actors and Hierarchy of Actors.4. PoisonPill消息及其用法源: Docs\Bootcamp\Unit 3\Lesson 4: What is the Poison Pill message and how to work with it.5. 可切换的Actor行为源: Docs\Bootcamp\Unit 3\Lesson 5: Switchable Actor Behavior.Behavior 运行时动态修改Actor的行为Become() 清空行为栈,添加行为BecomeStacked() 不清空行为栈,追加行为ReceiveAsync(context) 消息处理6. 使用行为切换重构源: Docs\Bootcamp\Unit 3\Lesson 6: Refactoring with using behavior switching.四、 创建Actor层级和错误处理1. 监控和Actor层级源: Docs\Bootcamp\Unit 4\Lesson 1: Supervisor and actor hierarchy.system.Root.Spawn(props); 创建顶级(Actor)Actorcontext.Spawn(props); 创建子级Actor2. 演示监控者的能力和Actor层级的应用概览源: Docs\Bootcamp\Unit 4\Lesson 2: Overview of the application that demonstrates the supervisor’s capabilities and the actors hierarchy.3. Actor的地址和PID源: Docs\Bootcamp\Unit 4\Lesson 3: Actor’s address and PID.$"{system.ProcessRegistry.NextId()}/{name}" PID格式var moviePlayCounterActorPid = new PID(system.ProcessRegistry.Address, "$1/MoviePlayCounterActor"); 手动创建PID4. 创建 UserCoordinatorActor源: Docs\Bootcamp\Unit 4\Lesson 4: Creating UserCoordinatorActor.5. 创建 MoviePlayCounterActor源: Docs\Bootcamp\Unit 4\Lesson 5: Creating MoviePlayCounterActor.6. 父级Actor如何监管他们的子级Actor源: Docs\Bootcamp\Unit 4\Lesson 6: How parent actors are watching over their children actors.继续处理(忽略错误)重启完全停止委托上层Actor处理7. 控制子级Actor的策略源: Docs\Bootcamp\Unit 4\Lesson 7: Strategies to control the state of children’s actors.WithChildSupervisorStrategy() 重写子级Actor监控策略public delegate SupervisorDirective Decider(PID pid, Exception reason); Decider委托OneForOneStrategy 仅仅产生异常的子级Actor会执行从Decider()方法收到的指令(Directive)AllForOneStrategy 所有的子级Actor都会执行从Decider()方法收到的指令(Directive)五、 消息路由使用路由控制消息流:性能 (使用Proto.Actor路由)消息内容 (使用常规Actor)状态1. 路由模式源: Docs\Bootcamp\Unit 5\Lesson 1: Router pattern.性能收到不同内容的消息取决于路由的状态2. 利用Proto.Actor路由负载均衡源: Docs\Bootcamp\Unit 5\Lesson 2: Load balancing with Proto.Actor routers.两种内置路由类型:Pool 负责Actor的创建和完成后的移除,是Actor的父级ActorGroup 不参与Actor的创建,与Actor的层级结构无关几个内置路由:Round-robin 顺序发送消息到ActorHash key 消息携带地址Random 随机选择接收者Weighted round robin 和Round-robin类似,但支持为特定的接收者定制权重Broadcast 消息发给组里面的所有Actor3. 路由池源: Docs\Bootcamp\Unit 5\Lesson 3: Pool Router.路由创建远程路由 - 特殊消息:RouterAddRoutee 将本地Actor或远程Actor的PID添加到路由表中RouterRemoveRoutee 从路由表中移除PIDRouterGetRoutees 获取(当前路由器)使用的路由表Routees 包含当前(路由器的)路由表状态检测4. 路由组源: Docs\Bootcamp\Unit 5\Lesson 4: Group Router.组创建5. 一致性哈希路由源: Docs\Bootcamp\Unit 5\Lesson 5: ConsistentHashing Router.将消息(Message)转换为消息键(Message Key)对象。IHashable接口基于消息键(Message Key)创建散列码(Hash Code)根据哈希码(Hash Code)选择虚拟主机(Virtual host)发送消息到选择的虚拟主机6. 使用Actor实现路由模式源: Docs\Bootcamp\Unit 5\Lesson 6: Implementation of the router pattern with using actors.根据内容路由基于状态路由六、 消息通道1. 通道类型源: Docs\Bootcamp\Unit 6\Lesson 1: Channels Types.point-to-point, 连接发送者(sender)和接受者(recipient)publisher/subscriber, 可运行期间动态改变接受者,实现EventStream类2. 点对点通道源: Docs\Bootcamp\Unit 6\Lesson 2: Point-to-point Channel.每条消息只会发给某一个接收者发送者知道接收者3. 发布/订阅通道源: Docs\Bootcamp\Unit 6\Lesson 3: Publisher/Subscriber Channel.单条消息可以发送给多个接收者发送者不关心接收者是谁4. 事件流源: Docs\Bootcamp\Unit 6\Lesson 4: EventStream.Subscribe<T>()Unsubscribe()Publish(msg)5. 死信(无法投寄的信)源: Docs\Bootcamp\Unit 6\Lesson 5: DeadLetter Channel.6. 保证投递源: Docs\Bootcamp\Unit 6\Lesson 6: Guaranteed delivery.七、Proto.Actor远程1. 水平伸缩是什么源: Docs\Bootcamp\Unit 7\Lesson 1: What is horizontal scaling.典型网络拓扑Bus 总线Star 星形Ring 环形Mesh 网状Tree 树形Point-to-Point 点对点2. Proto.Actor远程概览源: Docs\Bootcamp\Unit 7\Lesson 2: Overview Proto.Actor Remote.Proto.Remote关键特性位置透明(Location transparency)远程创建(Remote spawning)gRPC流(gRPC Streams)3. Proto.Actor远程使用示例源: Docs\Bootcamp\Unit 7\Lesson 3: Example of working with Proto.Actor Remote.八、Proto.Actor集群1. 为什么你需要集群源: Docs\Bootcamp\Unit 8\Lesson 1: Why do you need clusters.2. 集群中的成员源: Docs\Bootcamp\Unit 8\Lesson 2: Membership in the cluster.3. 加入集群源: Docs\Bootcamp\Unit 8\Lesson 3: Joining to the cluster.分布式架构中,服务发现的功能集群中的元信息服务的一致性注册和监控组件可用性的机制组件发现的机制服务发现Proto.Cluster.ConsulProto.Cluster.SingleRemoteInstance4. 在集群中处理任务源: Docs\Bootcamp\Unit 8\Lesson 4: Processing tasks in the ClusterTODO: 学习记录, 此处继续
2021年07月29日
497 阅读
0 评论
0 点赞
2021-06-29
Docker笔记
示例DockerfileFROM alpine:latest ARG TAG=0.0.1 ARG PORT_ARG=3080 RUN apk add --no-cache bash # 切换默认shell为bash SHELL ["/bin/bash", "-c"] RUN echo tag=$TAG RUN echo port_tag=$PORT_ARG构建docker build --no-cache --progress plain --rm --build-arg TAG=0.0.3 --build-arg PORT_ARG=3000 --tag hello/world:0.0.3 .运行docker run hello/world:0.0.3笔记ARG 用来声明参数,语法为ARG <key>=<default-value>,需要在在FROM之后才会有作用build时, 通过--build-arg的方式传递,语法为--build-arg <key>=<value>, 可以多组参考How To Pass Environment Info During Docker BuildsDocker: How to use bash with an Alpine based docker image?
2021年06月29日
493 阅读
1 评论
0 点赞
2021-02-27
OctoberCMS使用记录
前置说明操作系统: Ubuntu 20.04.1 LTSWEB组合:nginx/1.18.0 (Ubuntu) sudo apt install nginxphp-fpm7.4 sudo apt install php-fpmphp7.4 sudo apt install php用到的工具:wget sudo apt install wgetunzip sudo apt install unzip操作步骤确保PHP扩展已安装# 安装php扩展 sudo apt-get install php-ctype php-curl php-xml php-fileinfo php-gd php-json php-mbstring php-mysql php-sqlite3 php-zip # 重启php-fpm sudo service php7.4-fpm restart下载OctoberCMS安装文件 install-master.zipwget --continue --output-document=install-master.zip http://octobercms.com/download解压到Web所在目录unzip install-master.zip -d /home/gsw945/web-demos配置nginx以运行OctoberCMS安装文件sudo vim /etc/nginx/conf.d/octobercms.conf内容如下(一般nginx中的php简单配置)server { listen 1501; listen [::]:1501; root /home/gsw945/web-demos/install-master; index index.php index.html index.htm; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 安装过程中需要下载文件,所以需要设置较长的超时时间(单位:秒, 默认为60) fastcgi_read_timeout 3600; fastcgi_send_timeout 3600; fastcgi_connect_timeout 3600; } location ~ /\.ht { deny all; } }让nginx重新加载配置sudo service nginx reload执行安装操作 浏览器访问 http://127.0.0.1:1501/install.php 开始执行安装脚本System Check确保每一项都是OK的,否则需要修复问题后刷新页面重新检查 确认无误后,点击页面右下角按钮 Agree & Continue 进入下一步骤ConfigurationDatabase 数据库配置,按需设置(此处以最简单的 SQLite 为例) Administrator 平台管理账户配置,按需设置(用户名和密码请妥善记忆) Advanced 高级配置(安全性),按需设置,可保持默认 确认无误后,点击页面右下角按钮 Continue 进入下一步骤Getting started 提供了3种方式: Start from scratch 不选择任插件和主题(仅自动包含默认的demo),需要手写网页代码(HTML/CSS/JS)选择该方式,会立即开始下载默认的demo主题 中途可能会出现下载超时的情况 可以酌情修改nginx配置,示例如下server { listen 1501; listen [::]:1501; root /home/gsw945/web-demos/install-master; index index.php index.html index.htm; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 安装过程中需要下载文件,所以需要设置较长的超时时间(单位:秒, 默认为60) fastcgi_read_timeout 3600; fastcgi_send_timeout 3600; fastcgi_connect_timeout 3600; } location ~ /\.ht { deny all; } }执行nginx的 reload 或 restart` 命令,重新加载应用配置后,点击 Try again 即可继续上一步的操作下载完成之后,会自动解压并清除安装文件,显示如下内容,则表示已经安装成功 Website address 网站前台Administration Area 网站管理后台点击网站前台链接,可正常进入网站前台,但是点击前台页面内页面顶部的链接和网站管理后台链接,页面却显示 404 Not Found,这是因为需要继续针对nginx进行设置,添加OctoberCMS需要的配置,同时移除安装阶段添加的超时设置(因为默认的60秒超时已足够),完整配置如下:server { listen 1501; listen [::]:1501; root /home/gsw945/web-demos/install-master; index index.php index.html index.htm; server_name _; location / { rewrite ^/.*$ /index.php last; } location ~ ^/index.php { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.4-fpm.sock; } location ~ /\.ht { deny all; } # Whitelist ## Let October handle if static file not exists location ~ ^/favicon\.ico { try_files $uri /index.php; } location ~ ^/sitemap\.xml { try_files $uri /index.php; } location ~ ^/robots\.txt { try_files $uri /index.php; } location ~ ^/humans\.txt { try_files $uri /index.php; } ## Let nginx return 404 if static file not exists location ~ ^/storage/app/uploads/public { try_files $uri 404; } location ~ ^/storage/app/media { try_files $uri 404; } location ~ ^/storage/app/resized { try_files $uri 404; } location ~ ^/storage/temp/public { try_files $uri 404; } location ~ ^/modules/.*/assets { try_files $uri 404; } location ~ ^/modules/.*/resources { try_files $uri 404; } location ~ ^/modules/.*/behaviors/.*/assets { try_files $uri 404; } location ~ ^/modules/.*/behaviors/.*/resources { try_files $uri 404; } location ~ ^/modules/.*/widgets/.*/assets { try_files $uri 404; } location ~ ^/modules/.*/widgets/.*/resources { try_files $uri 404; } location ~ ^/modules/.*/formwidgets/.*/assets { try_files $uri 404; } location ~ ^/modules/.*/formwidgets/.*/resources { try_files $uri 404; } location ~ ^/modules/.*/reportwidgets/.*/assets { try_files $uri 404; } location ~ ^/modules/.*/reportwidgets/.*/resources { try_files $uri 404; } location ~ ^/plugins/.*/.*/assets { try_files $uri 404; } location ~ ^/plugins/.*/.*/resources { try_files $uri 404; } location ~ ^/plugins/.*/.*/behaviors/.*/assets { try_files $uri 404; } location ~ ^/plugins/.*/.*/behaviors/.*/resources { try_files $uri 404; } location ~ ^/plugins/.*/.*/reportwidgets/.*/assets { try_files $uri 404; } location ~ ^/plugins/.*/.*/reportwidgets/.*/resources { try_files $uri 404; } location ~ ^/plugins/.*/.*/formwidgets/.*/assets { try_files $uri 404; } location ~ ^/plugins/.*/.*/formwidgets/.*/resources { try_files $uri 404; } location ~ ^/plugins/.*/.*/widgets/.*/assets { try_files $uri 404; } location ~ ^/plugins/.*/.*/widgets/.*/resources { try_files $uri 404; } location ~ ^/themes/.*/assets { try_files $uri 404; } location ~ ^/themes/.*/resources { try_files $uri 404; } }浏览器进入管理后台 http://127.0.0.1:1501/backend,输入刚才自己设置的用户名和密码登录,发现页面都是英文的,点击页面右上角的头像图标,在显示的下拉框中点击 Back-end preferences 就可打开语言设置页面,按需设置后保存,刷新页面,发现就变成了自己想要的语言(如下以简体中文为例) Start from a theme 选择某一种网站类型的主题,基于此创建站点选择该方式,会出现主题列表供选择 确认眼神,选择一个主题(如下以 Flat UI 为例)后,点击 install,会有确认提示,点击 confirm 就会开始下载 后续和 Start from scratch 方式相同Use a project ID 适用于创建过 OctoberCMS 项目,或自定义选择插件和主题的情况,暂不考虑后续操作,譬如邮件设置、自选插件和主题等设置,可在管理后台中操作,此处不再赘述。参考Installation - October CMSConfiguration - October CMSNginx + Php-fpm fastcgi upstream timed out
2021年02月27日
589 阅读
0 评论
0 点赞
1
2