<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>aLong</title><link>https://blog.51ai.vip/</link><description>Recent content on aLong</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 02 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.51ai.vip/index.xml" rel="self" type="application/rss+xml"/><item><title>hopen-once.sh 的 CLI 设计取舍</title><link>https://blog.51ai.vip/posts/hopen-once-cli%E8%AE%BE%E8%AE%A1%E5%8F%96%E8%88%8D/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/hopen-once-cli%E8%AE%BE%E8%AE%A1%E5%8F%96%E8%88%8D/</guid><description>git库: herdr-recipes
写 shell 工具时，我越来越倾向于让脚本接受尽量多的写法。
用户不会背你的 flag 设计，只会按自己最舒服的方式打命令。脚本越包容， adoption 越高。
这篇文章以 hopen-once.sh 的 pane 命名参数 -N 为例，看一个参数怎么同时支持三种语法，以及背后做了哪些取舍。
1. 问题：给 pane 起名字 hopen-once.sh 在 herdr 里打开一组 pane 布局，并在每个 pane 里启动 agent。4 个 pane 的 2×2 布局，你通常会给每个 pane 起个名字，方便后续切换时认得出：
┌──────────┬──────────┐ │ 实现A │ 实现B │ ├──────────┼──────────┤ │ review │ 兜底 │ └──────────┴──────────┘ 起名字本身不难。但问题是：不同用户的命令行习惯不一样。
有人习惯重复 flag：
-N 实现A -N 实现B -N review -N 兜底 有人喜欢逗号分隔：
-N &amp;#34;实现A,实现B,review,兜底&amp;#34; 还有人觉得名字和 agent 写在一起更自然：
codex:实现A codex:实现B pi:review claude:兜底 三种写法，同一个意思。我要让它们都能工作。</description></item><item><title>用 herdr pane layout 搭建并行编码工作流</title><link>https://blog.51ai.vip/posts/%E7%94%A8-herdr-pane-layout-%E6%90%AD%E5%BB%BA%E5%B9%B6%E8%A1%8C%E7%BC%96%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%B5%81/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E7%94%A8-herdr-pane-layout-%E6%90%AD%E5%BB%BA%E5%B9%B6%E8%A1%8C%E7%BC%96%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%B5%81/</guid><description>git库: herdr-recipes
前提一安装herdr
我现在的终端里通常会同时开着三四个 AI agent。左上角在写功能 A，右上角在写功能 B，下方有另一个 agent 专门做 review。我不需要等一个跑完再起下一个。
这篇文章记录的是我具体怎么搭的。
1. 单 agent 串行的瓶颈 最近同时在做三件事：实现用户列表分页、修登录态过期判断、review 同事刚提的 PR。三件事互不依赖，但用单个 agent 只能排队。
实现分页 → 等它跑完 修复登录态 → 等它跑完 review PR → 等它跑完 agent &amp;ldquo;思考&amp;quot;的时候终端空着，更麻烦的是上下文污染：跑完第 1 个任务的 agent 记住了大量实现细节，再让它做第 3 个 review 时，上下文已经偏了。
2. 把团队座位投射到终端上 herdr 是一个终端多路复用器，和 tmux / zellij 类似，但它对&amp;quot;开新 workspace、按比例 split pane、在指定 pane 里启动命令&amp;quot;这套操作有原生支持。
我的映射关系很简单：
一个 pane = 一个 agent 一个 layout = 一套座位表 一个 workspace = 一个项目上下文 把&amp;quot;团队怎么坐&amp;quot;配成模板，一键开出来。
3. 6 种布局代号 hopen.</description></item><item><title>欢迎来到龙餐馆观后感</title><link>https://blog.51ai.vip/posts/%E6%AC%A2%E8%BF%8E%E6%9D%A5%E5%88%B0%E9%BE%99%E9%A4%90%E9%A6%86%E8%A7%82%E5%90%8E%E6%84%9F/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E6%AC%A2%E8%BF%8E%E6%9D%A5%E5%88%B0%E9%BE%99%E9%A4%90%E9%A6%86%E8%A7%82%E5%90%8E%E6%84%9F/</guid><description>⚠️有剧透，最好先看原片。⚠️
2026/8/30 看了《龙餐馆》，迟到了，少看了四五分钟。进来就看到徐福从老家出来，孩子（女儿）生他的气，福和父母告别就走了。
然后是他到海外的场景。脱鞋，初见俊生小哥，面试。面试时扎伊德说“你这味道咸了”。这句话或许能听出一些弦外之音，我当时想的是这可能是让他入乡随俗。看到最后才明白，应该是觉得他不懂这里的环境和文化。
再后面是战争开始后，徐福因钱留下来负责供应饭菜。这时候能看到他了解了马俊生的想法，再加上高薪继续留下来炒饭，期间也发现赛夫有炒菜天赋。倒卖酒的桥段还带出了托尼这个角色。到这里展现了突发事件后城市的混乱、危险、残酷。很多人瞬间就没了，从这里也能看出来，有政府支援、有势力背景的还能受到一定保护。
下一段印象深的是他们被抓进美军牢房后的故事，这里遇到了校长和美军各级军官。这里暴露了赛夫被罪恶包裹的那颗心，差点杀了一个美军。原本眼看就要被释放，却又因为他们的恶作剧而陷入更悲惨的处境。也是因为这个处境，让赛夫看到了残酷的真相，戳破了校长组织的另一面。徐福也阻止了赛夫差点误入歧途，为了让赛夫踏踏实实当个厨子，也求了校长别让他加入。这里也让我想起了前一天给别人留言：年轻人容易上头，不是他们的错，而是长辈需要负起指导的责任，是整个社会长辈们的责任。看到这里觉得印证了自己说的话——孩子们是天真的，可能被几句话就忽悠去做自己不知道的事。还好赛夫看到了，这是我第一次担心他。
在校长这里徐福也没闲着，用积蓄找到一个蛇头帮助他们跑路。后面因为马俊生用发芽土豆给孩子们下药，拖延校长的行动，导致马俊生一命呜呼。这次马俊生的命换来了徐福改变想法，决定救了一批相信他们的孩子。扎伊德被安排追回孩子，这时候我最担心的不是徐福，因为是倒叙，我们已经知道他还活着。我看到扎伊德处决徐福时，赛夫是亲眼看到的，这是我第二次担心赛夫，怕他被仇恨包裹，做出过激的事或再次误入歧途。
在校长的行动中很多人又成为炮灰：检查的士兵们、平民，像贾马尔一样的工具人，还有那位想回家的托尼。炮灰有没有立场根本不重要，他们很多只是为了活着，也可能为了追求什么。但他们的位置就是棋子，是工具。
结局相对是美好的。赛夫继续开龙餐馆，菜谱里有一道菜纪念徐福。徐福也看到了多年后的赛夫。被救出来的孩子也得以安置。扎伊德可能是故意暴露自己来帮助徐福完成愿望吧，我想当时扎伊德没有把握能保住徐福，所以他选择牺牲自己，帮徐福完成这件事。
看完之后，心里一直堵得慌。我在小红书看到了“张嘴”这个词被一些人提起，这里我没想到，但看完之后觉得“张嘴”还是为了“好好吃饭”。想做别的很难，因为像被战争碾过的人，可能连大气都没出过就没了。你张嘴，大概率是为了活着。像徐福一样，为了活着只能卑微、忍气吞声地考虑怎么活下去、怎么逃。
另一个是美军抓他们三个人的时候说：现在你们也卷入了此次战争。即便他们没和扎伊德合伙，依然是被卷入战争的。战争不会问那些人是否希望参与。作为底层的人，没有扎伊德那样能逃海外的条件，没有政府背景，也没有其他选择。虽然他自己没有这么做，但至少他有条件；而更多的人是没有选择的，活着都困难重重。
还有一个事。战争开始那段，美军入驻后，我听到后面一个孩子说：美国人真坏。听声音估计是个十岁左右的孩子，当时我觉得他很单纯。看完之后我觉得还好这孩子不在电影里，但他这么想不是他的错。
我堵的不是战争。我堵的是&amp;quot;赌&amp;quot;这件事。
扎伊德赌了一次，把自己暴露出去，让徐福活着做完那件事。 徐福赌了一次，用攒下的钱找蛇头，让自己活着逃出那座城。 马俊生赌了一次，用发芽土豆给孩子下药——他赌输了，命没了。 赛夫没赌，他被徐福挡了一次，没被拉进另一条路。
一个会让人好好吃饭的人，最后是赌赢了一次。 但跟他一起赌的人，付出了他们付不起的代价。
我看完之后，再看身边的人吃饭，会想起这部电影。 想起那些赌赢的人，和没赌赢的人。 想起&amp;quot;好好吃饭&amp;quot;这四个字，从来不是免费的。
完结 祝好 🍀</description></item><item><title>Pi agent 功能调试记录</title><link>https://blog.51ai.vip/posts/pi-agent-%E5%8A%9F%E8%83%BD%E8%B0%83%E8%AF%95%E8%AE%B0%E5%BD%95/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/pi-agent-%E5%8A%9F%E8%83%BD%E8%B0%83%E8%AF%95%E8%AE%B0%E5%BD%95/</guid><description>本文根据我与 Pi agent 的需求对话整理而成，保留原始需求与实现结果，不是 AI 代写的成文内容。
会话记录 日期：2026-08-05 会话文件：~/.pi/agent/sessions/&amp;lt;project-session&amp;gt;/2026-08-05T05-17-18-427Z_019fd05a-c8db-7253-98ab-c90aa763278f.jsonl 处理事项：删除保护、小鱼（zen）、status lines 调整，以及额外的 hjob 任务管理。 1. 删除保护 原始需求（8 句） Pi 没有权限控制，希望增加一个控制删除动作的开关：开启时可以删除，关闭时在删除前提醒我是否允许操作。 支持通过 command 进行开关控制。 删除当前目录下的 x.md。 删除功能需要在每个项目目录运行后增加 .pi/operation_log 文件，记录删除操作的时间（系统时区）、指令详情、是否允许（yes/no）以及结果（ok/fail）。 输入 /reload（原记录中的未完成片段）。 删除目录下的 md 文件和 png 文件。 后来发现“删除保护：关（删除命令需确认）”的文案语义相反：删除保护开启时需要确认，关闭时直接删除，也不记录日志。 将“删除命令需确认”改为“需确认”。 实现产物 实现文件：~/.pi/agent/extensions/delete-guard.ts
支持 /delete-guard on|off|toggle|status。 删除保护开启：删除前需要确认，并将时间、指令、是否允许和执行结果写入 .pi/operation_log。 删除保护关闭：直接放行，不提示，也不记录日志。 效果 删除保护开启后，执行删除操作会先触发确认提示：
允许或拒绝后的日志记录：
2. 小鱼（zen 扩展） 原始需求（3 句） 建议将 Pi command zen 的小鱼气泡放在鱼的上一行；与鱼保持当前的水平距离，但不要和鱼处在同一行。 看到效果后，希望气泡与鱼再近一点；鱼转向时，也要注意气泡的位置。 补充测试命令：/zen（原始记录中写作 /zem）。 实现产物 实现文件：~/.pi/agent/extensions/zen/lib/working-ship.ts
气泡从鱼所在行移到鱼的上一行，水平位置保持不变。 FISH_BUBBLE_GAP 从 2 改为 1，让气泡更靠近小鱼。 鱼转向时，气泡始终跟随鱼头切换到对应一侧，已逐帧验证。 zen地址: https://github.</description></item><item><title>Skillcaddy：统一管理 AI Agent Skill 的轻量方案</title><link>https://blog.51ai.vip/posts/skillcaddy-unified-skill-asset-manager/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/skillcaddy-unified-skill-asset-manager/</guid><description>是什么 / 定位 如果你同时使用 Claude Code、Codex、OpenCode、Pi 等多个 AI Agent，肯定会遇到一个问题：
skill 到底装在哪里？
装全局（~/.claude/skills/、~/.agents/skills/） → context 膨胀，多个项目互相污染 装项目里拷贝 → 改了一个地方，其他项目还要手动同步 Skillcaddy 的思路很简单：既然 symlink 就能解决，那就做一个管理 symlink 的小工具。
一个中央 skill 仓库，按需软链到各项目的 .claude/skills/ 或 .agents/skills/ 目录。
它不做语义分析、不做云端同步 —— 纯粹是本地文件管理的自动化，适合追求极简工具链的开发者。
一个 AISkills 仓库，多个 Agent 共享
核心功能 集中式的 skill 仓库位于 ~/skillcaddy 所有 skill 源码放这里，统一管理，包括 git 版本追踪。
~/AISkills 作为所有 skill 的根目录
一个命令，按需 link 到当前项目 sc-link（或 skillcaddy link）会把当前项目需要的 skill 从中央仓库软链到本地 .claude/skills/。 不想用的时候 sc-unlink 清除。
一行命令完成 skill 安装
跨 Agent 共享 无论 .</description></item><item><title>iFlow将command转换成skill</title><link>https://blog.51ai.vip/posts/iflow%E5%B0%86command%E8%BD%AC%E6%8D%A2%E6%88%90skill/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/iflow%E5%B0%86command%E8%BD%AC%E6%8D%A2%E6%88%90skill/</guid><description>之前帖子 提到通过iflow编写mdt指令。 我懒得通过指令去执了，所以让模型自己执行skill更舒服。
修改的经过 因为已经有了指令，所以我直接 @~/.iflow/commands/mdt.md 让他分析是否可以做成skill。
iflow回复没问题，问我要不要开始。
因为我已经安装了 skill-creator 这个任务他肯定会调用skill去实现。
中间他希望删除掉示例文件，我没同意。
后面做完就有了开头的结果。
翻译的文件内容片段
iflow 操作简单、功能强大。 👍</description></item><item><title>Iflow通过hooks增加提醒</title><link>https://blog.51ai.vip/posts/iflow%E9%80%9A%E8%BF%87hooks%E5%A2%9E%E5%8A%A0%E6%8F%90%E9%86%92/</link><pubDate>Thu, 04 Dec 2025 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/iflow%E9%80%9A%E8%BF%87hooks%E5%A2%9E%E5%8A%A0%E6%8F%90%E9%86%92/</guid><description>iflow通过hooks增加提醒 背景需求 使用iflow cli 时当我们下发一个任务或对话时在等待响应时，可能抽空做点别的事情。如果忘记了查看结果，那可能错过很久才想起来。
此时我希望让iflow给我一个反馈，这个功能iflow提供了 hooks。
我的电脑时macOS系统，所以一下基本都是按照我自己环境进行的调整，其他他做系统类似适当调整即可。
结果 一种✅结束完成通知，另一种🔔权限等提示的通知。
准备 我们需要在用户的iflow目录下调整settings.json 。
在我的操作系统下这个路径是： ~/.iflow/settings 。
编辑内容：
&amp;#34;hooks&amp;#34;: { &amp;#34;Stop&amp;#34;: [ { &amp;#34;hooks&amp;#34;: [ { &amp;#34;type&amp;#34;: &amp;#34;command&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;bash ~/.iflow/hooks/stop.sh&amp;#34; } ] } ], &amp;#34;Notification&amp;#34;: [ { &amp;#34;matcher&amp;#34;: &amp;#34;*&amp;#34;, &amp;#34;hooks&amp;#34;: [ { &amp;#34;type&amp;#34;: &amp;#34;command&amp;#34;, &amp;#34;command&amp;#34;: &amp;#34;bash ~/.iflow/hooks/notification.sh &amp;#39;default&amp;#39;&amp;#34; } ] } ] } 这里看到，我们通过调用两个脚本来进行下一步操作。脚本的位置在 ~/.iflow/hooks/ 。
脚本文件 stop.sh
#!/bin/bash # Stop hook脚本 - 任务完成通知 # 参数1: 标题 # 参数2: 消息内容 TITLE=&amp;#34;iFlow 通知&amp;#34; MESSAGE=&amp;#34;✅ 完成/结束&amp;#34; # 显示通知（使用 osascript 作为备用方案） osascript -e &amp;#34;display notification \&amp;#34;$MESSAGE\&amp;#34; with title \&amp;#34;$TITLE\&amp;#34; subtitle \&amp;#34;请查看 iflow\&amp;#34;&amp;#34; 2&amp;gt;/dev/null || \ # terminal-notifier \ # -message &amp;#34;$MESSAGE&amp;#34; \ # -title &amp;#34;$TITLE&amp;#34; \ # -subtitle &amp;#34;请查看 iflow&amp;#34; \ # -sender dev.</description></item><item><title>Raycast新版AI功能Custom Providers体验</title><link>https://blog.51ai.vip/posts/raycast%E6%96%B0%E7%89%88ai%E5%8A%9F%E8%83%BD%E4%BD%93%E9%AA%8C/</link><pubDate>Thu, 31 Jul 2025 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/raycast%E6%96%B0%E7%89%88ai%E5%8A%9F%E8%83%BD%E4%BD%93%E9%AA%8C/</guid><description>之前使用第三方的转发体验了三方API的接入。现在最新版支持Custom Providers 功能了。
通过Custom Providers 接入API 在 Raycast 中，添加自定义模型（Custom Providers）的具体位置如下：
打开 Raycast。 进入 Settings（设置）。 点击左侧的 AI 选项卡。 第一次需要在AI选项最底下的Experiments中开启Custom Providers。 在 AI 选项卡页面，找到 Custom Providers（自定义提供商）部分。 点击 Reveal Providers Config（显示提供商配置）按钮，这会在 Finder 中打开配置文件目录。 点击后会跳转到具体目录中。默认是有一个providers.template.yaml名字的文件。这个文件是一个模板，根据模板创建一个名称为providers.yaml 。 通过dia 我询问了一下，可能 raycast仅加载此文件。 其他名称的我没做测试。 配置providers 我这里偷个懒，直接使用claude code进行配置，告诉他一些参数。
他呱唧呱唧的写完了大致的配置，我在base_url 加入了/v1，不加实际测试不正常。 api_key 我也改写成真实的(之前告诉他的是一个假的为了隐私)。
通过测试没问题，可以使用。但有些能力限制。
custum providers 体验 接入后，对话是没问题的。gemini 2.5 支持联网搜索，但实际体验下来不可以。 可以打开本地的一些程序，比如浏览器，apple music等等。 MCP支持有问题，我不知道是模型的事还是什么。比如通过exa搜索会返回error。 这是我在其他工具中没遇到的。
使用raycast支持的模型，比如填写gemini key 的模型支持联网，调用MCP都OK。 如图：
在raycast可以判断你接入的模型支持什么：
我在dia询问大致也是类似的回答吧：
以上就是大致的体验。Custom Providers给接入第三方接入提供了便利，让我不需要在本机开启其他proxy。 直接使用自定义的API，期待这方面后续的发展。
完结 祝好 🍀</description></item><item><title>一站式解决多API管理痛点</title><link>https://blog.51ai.vip/posts/%E4%B8%80%E7%AB%99%E5%BC%8F%E8%A7%A3%E5%86%B3%E5%A4%9Aapi%E7%AE%A1%E7%90%86%E7%97%9B%E7%82%B9/</link><pubDate>Mon, 21 Jul 2025 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E4%B8%80%E7%AB%99%E5%BC%8F%E8%A7%A3%E5%86%B3%E5%A4%9Aapi%E7%AE%A1%E7%90%86%E7%97%9B%E7%82%B9/</guid><description>虽然许多平台提供丰富的API福利，但大多数被闲置了：有些有效期短暂，有些注册后就被遗忘。更麻烦的是不同平台的模型命名混乱、接入方式各异。
最近发现LiteLLM这个项目深得我心——它能统一管理所有AI模型API！通过搭建代理网关，只需一个URL和Key就能调用任意模型，就像把法宝都装进乾坤袋✨
📌 解决的核心问题：
自动容错：API失效时自动冷却重试，避免手动切换 福利整合：集中管理所有API Key，告别Cherry Studio重复注册 名称统一：自定义模型组名（如gemini-2.5-flash兼容多版本） 跨工具兼容：通过统一接口接入ChatGPT/Claude等客户端 🛠 搭建实录（本地版） 因代理环境在本地，选择本地部署。服务器部署需注意规避网络限制问题
📂 目录结构 . ├── docker-compose.yml ├── .env # 密钥管理 └── config/ ├── config.yaml # 主配置 ├── router.yaml # 路由策略 └── models/ # 模型配置集 ⚙️ 关键配置 1. Docker-Compose（精简版）
services: litellm: image: ghcr.io/berriai/litellm:main-stable volumes: - ./config:/app/config # 挂载整个配置目录 command: --config=/app/config/config.yaml ports: - &amp;#34;4000:4000&amp;#34; env_file: - .env # 安全加载密钥 2. 配置分层设计
config.yaml 引用子配置，核心参数示例： include: [models.yaml, router.yaml] # 模块化加载 litellm_settings: num_retries: 3 # 失败重试 request_timeout: 10 drop_params: true # 清理冗余参数 router.</description></item><item><title>Fellou浏览器体验记录</title><link>https://blog.51ai.vip/posts/fellou%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BD%93%E9%AA%8C%E8%AE%B0%E5%BD%95/</link><pubDate>Mon, 16 Jun 2025 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/fellou%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BD%93%E9%AA%8C%E8%AE%B0%E5%BD%95/</guid><description>上一篇水文写了Dia浏览器的体验，佬友问我是否可以使用Fellou浏览器。我开始不知道他是什么。 佬友私信给我一个邀请码，我注册了账号，体验了一下，感觉还不错。所以我记录一下体验。在此感谢佬友分享🫰。
Fellou是什么， Agentic是什么 在看到Fellou的官网，世界首款Agentic浏览器。 这么说我还真不了解什么是agentic。
询问llama4 得知：
原来Agentic是Fellou浏览器的特色之一，它是一种基于人工智能的浏览器，可以自动识别和处理网页上的各种元素，如文本、图片、视频等，从而提供更加智能和高效的浏览体验。
我感觉可能AI浏览器就像安装了插件，智能识别内容、总结和帮你生成内容。虽然Dia内置了一些功能。但他还没有实现类似Fellou的Agentic。
Agentic浏览器可以自动识别和处理网页上的各种元素，如文本、图片、视频等，从而提供更加智能和高效的浏览体验。简单理解为，他帮你做了一些事情使你更加方便。
例子1: 我让他打开百度地图，然后给我从国贸到团结湖的骑行路线。结果是： 这目前Dia是完成不了啊，这就是AI和Agentic的区别之一吧。
例子2: 访问论坛时，看到一个提问。 *这时候在底下询问我需要我帮你查找有关的资料吗？ * 点开这个，右侧就开始DeepSearch了。 看这个搜索的内容可不是简单的OP标题，是理解后进行的理解问题再规划查询。
右侧能看到结果：值得注意在最底下有个run，你点击他就开始执行了。 点击run就在浏览器单开一个tab开始执行了。
直到他完成返回结果。
生成搜索结果时的界面：
左侧正在生成一个HTML的报告页面，右侧的对话中进行了报告内容的摘要信息。
最终结果😱，一个问题让他一搞变成了一大篇。好在能分享 结果太恐怖点这看 够deep，够search，够cool！
例子3: 我还是想对比一下Dia和Fellou的话题总结。 结果好坏老友们自品一下，我个人感觉Fellou比Dia总结的好些。 Dia内容里还能看到一个神奇的qq新闻地址。😨
例子4： 类似Dia的水贴回复，我就是举个例子我可没真水啊🥹。 这又体现他Agentic的特性了。他不仅帮你生成了内容，还给你回复了🤩。 自动水贴成功啊。就是慢点，他规划好怎么去做这个事，通过截屏寻找要操作的位置按步骤最后执行成功。 🎊 但我改了，他那句不太好，也为了避免老友举报，我编辑人工调整了。
类似像YTB视频总结，文章总结等等都OK的。
录制一个短视频体现他Agentic的特性 🔗 点击查看Fellou浏览器Agentic特性演示视频
通过以上几个例子，我想佬友们会体会到agentic是什么感觉。和Dia的区别是什么。
UI、交互 Dia我很喜欢，他的UI，交互等等。这里页简单对Fellou进行一些观察吧。
打开主界面看起还也是简约的：
操作类似的，在中间的input框或地址栏，会弹出来一个黑色input框神奇🤨。 输入可以可以进行对话、访问网站或其他指令。
当使用浏览的起Deep Action是，窗口会像类似苹果那种窗口边框变换颜色的效果。
输入/各种搜索 输入@ 选择上下文
输入tab 切换到Fellou搜索
设置简洁，支持多Profiles 完结
祝好 🍀</description></item><item><title>Dia浏览器体验记录</title><link>https://blog.51ai.vip/posts/dia%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BD%93%E9%AA%8C%E8%AE%B0%E5%BD%95/</link><pubDate>Fri, 13 Jun 2025 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/dia%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BD%93%E9%AA%8C%E8%AE%B0%E5%BD%95/</guid><description>早在论坛拿到邀请🐎，下载打开一看，这啥啊这事？ 这么简约？
当个AI提问 最开始就用它来当个AI，做一些简单事情。 比如打开一个文章、帖子，问他讲了什么。 根据内容再提出其他问题。
在浏览的内容点击 chat 按钮或者快捷键 command(ctrl) + e。
也可以在地址栏输入 选择chat。
对话支持文件上传。
例子：
演示图片瑕疵，我后面又看了其他主题。截图时没注意。 🤫
生成内容 好看完了帖子，想表达却又不知道怎么说呢？ 让他搞吧。
此时输出内容UI不同，这个insert按钮需要你在网页定位到能输入的地方。
另一个例子：
个性化设置 Personalize 四个选项我的理解 第一项看起来是品味。 我不太理解，大概是你喜欢什么品牌、作家等的风格吧。比如鲁迅分、川普风。🐒
第二项那里，如果你常看见他时不时出来英文，也可以在这里提醒他 speak chinese。 具体描述你喜欢什么形式内容更容易接受。比如分段落展示、脑图、图标等等。
第三项 我理解是输出的风格、形式等吧。比如加不加emoji。
第四项是关于编程偏好的设定，比如你用什么语言、什么架构、什么框架等等等。
每个选项不一样，我这里演示第三个 关于 Wirte 的风格。
这里我需要提醒他，如果我访问的内容是英文时，你输入内容也相同。
这样才能与世界通话嘛。 😂
🔔提示内容： If the tab content is in English, please generate content that is also in English.
输出：
如果没有这句提示，他会根据对话语言，输出中文夸赞内容。😮‍💨
多标签对话 比如以Hugo 文档为例，他有四个页面。 抛出quick start 还有三个。如果我直接问模型可能他会告诉我内容，但我想自己再去看看文档又不知道再哪段（比如内容多很多）时。 可以都打他 用@去选择这些tab页。
我上面问了关于修改主题的话题，然后问哪个文档有提到。
除此还能想到比如一个新闻多个页面去总结、对比。 不同产品或网站的东西对比、询问等。</description></item><item><title>RaycastAI Proxy</title><link>https://blog.51ai.vip/posts/raycastai-proxy/</link><pubDate>Wed, 11 Jun 2025 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/raycastai-proxy/</guid><description>一直在重度使用Raycast，AI方面之前一直使用chatGPT插件但是他有个缺点，不能继续对话。
前天reddit发现一个项目： raycast-ai-openrouter-proxy
就是直接使用官方的AI功能，通过一个服务来实现接入其他平台的LLM API。
也有个缺点就是不展示思考信息。
看图： 输入内容 tab
继续对话： command+J 切换模型有提示
选择模型和配置prompt： 部署+配置 克隆项目后 我稍微调整了一下compose
services: raycast-ai-proxy: restart: unless-stopped build: . ports: - &amp;#39;11435:3000&amp;#39; volumes: - ./models.json:/app/models.json:ro environment: # 配置通过 .env 导入 - API_KEY=${API_KEY} - BASE_URL=${BASE_URL} 配置参数 API_KEY=&amp;#34;sk-xxx&amp;#34; # 你的key BASE_URL=&amp;#34;https://ark.cn-beijing.volces.com/api/v3&amp;#34; # 我这里配置的火山 # BASE_URL=&amp;#34;https://openrouter.ai/api/v1&amp;#34; # 默认写的 openrouter 配置模型 model.json 默认model.json提供了一些案例。
{ &amp;#34;name&amp;#34;: &amp;#34;Doubao-1.5-vision-pro-32k&amp;#34;, &amp;#34;id&amp;#34;: &amp;#34;ep-xxx-xxx&amp;#34;, &amp;#34;contextLength&amp;#34;: 10240, &amp;#34;capabilities&amp;#34;: [&amp;#34;vision&amp;#34;, &amp;#34;tools&amp;#34;], # 支持多模态和tools &amp;#34;temperature&amp;#34;: 0.8 }, { &amp;#34;name&amp;#34;: &amp;#34;DeepSeek-V3-0324&amp;#34;, &amp;#34;id&amp;#34;: &amp;#34;ep-xxx-xxx&amp;#34;, &amp;#34;contextLength&amp;#34;: 10240, &amp;#34;capabilities&amp;#34;: [&amp;#34;tools&amp;#34;], &amp;#34;temperature&amp;#34;: 0.</description></item><item><title>Gemini制作AppleScritp一次过</title><link>https://blog.51ai.vip/posts/gemini%E5%88%B6%E4%BD%9Capplescritp%E4%B8%80%E6%AC%A1%E8%BF%87/</link><pubDate>Tue, 20 May 2025 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/gemini%E5%88%B6%E4%BD%9Capplescritp%E4%B8%80%E6%AC%A1%E8%BF%87/</guid><description>前提 我喜欢使用Arc浏览器，自从同厂出的Dia出来后体验AI部分功能不错。但用它当作主力还是有点Chrome的感觉。我还是喜欢使用Arc，我想能否使用插件或者脚本来实现这个功能呢。没写过插件、脚本我问了大模型告诉我 open -a &amp;quot;Dia&amp;quot; &amp;quot;https://example.com&amp;quot; 能实现我的想法💡。 哈哈，没错可以的。
处理过程 但当我问怎么通过Arc浏览器去实现时，大模型就说法不一了。我测试了qwen3、claude3.7还有gemini2.5 pro。国内qwen3、扣子空间都是拒绝回答这个，提示违规😓。
结果是：
一开始都说插件能搞定，但通过cursor没实现成功。
zed我也试了试效果也不对。 他们确实制作了一个浏览器插件，我从网上生成能了icon本地加载一看，我靠他们那个插件有个按钮，点击下载了一个sh文件，打开一看 是我上面的那条命令。 🤔 这么忽悠我啊？
再去问问，她们说权限不行，浏览器不支持执行脚本等等等。我没开发过不懂，继续告诉他我使用的笔记本是macOS系统，能否通过系统实现这个功能。模型说可以使用Apple Script。 嗯，我没用过，那请开始你的表演。 由于其他模型回答都是写了个脚本，没说清楚具体怎么使用。我最终选择了一个不错的答案，Gemini 3.5 pro的结果。
👉对话分享链接
如果链接看不了，下面插入图片： 问题：
思考内容：
返回的内容：
实验结果： 按照模型的回答，按照方法二一次成功。方法二中对于我完全没用过的小白来说，按照文字就能操作了，很强👍。那其他模型由于没有这么细致我就待过不提了😟。
最后在Arc上加入快捷键：
配置快捷键的具体过程是：
在Arc 点Services， Services Seetings 。 在Services 中找到 你的脚本，在右侧双击录入快捷键。 我从来没用过Apple Script，也没开发过浏览器插件。 功能看起来在熟练的大佬眼里这就是个小功能，手到擒来。对于我就是作大山，我的心智是抵抗学习这些东西的，越不会越不想学。
在模型的能力下，让我通过想法到实现目的只需要1个小时左右。前期我一直考虑是否能通过插件实现，试了三次插件都没实现，其他模型会提示没办法执行脚本。也有模型提示使用dia://xxx.com 方式，我在dia浏览器测试不可以❌。实现后同样结果。
最后我选择在Google Al Studio的Gemini 2.5 Pro Preview 05-06实现此功能。让我对开发一些小玩意儿增强了自信。
同时在国内的体验中，都是拒绝回答这话题，我不知道哪句话是敏感性的😓。 完结 祝好 🍀</description></item><item><title>通过gitlog用AI整理项目记录</title><link>https://blog.51ai.vip/posts/%E9%80%9A%E8%BF%87gitlog%E7%94%A8ai%E6%95%B4%E7%90%86%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/</link><pubDate>Wed, 19 Feb 2025 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E9%80%9A%E8%BF%87gitlog%E7%94%A8ai%E6%95%B4%E7%90%86%E9%A1%B9%E7%9B%AE%E8%AE%B0%E5%BD%95/</guid><description>git log 列出时间段内容 导出2024全年内容到文本： git log --since=&amp;quot;2024-01-01&amp;quot; --until=&amp;quot;2024-12-30&amp;quot; --pretty=format:&amp;quot;%h - %an, %ad : %s&amp;quot; --date=iso &amp;gt; commits_2024.txt
讲这个文件加入单独的知识库中 此处使用cherry studio进行知识库添加操作。
但文件直接加入，模型我选的 baai/bge-m3。
使用模型对导出的内容进行处理 请根据提供的gitcommitlog进行总结。 总结的内容是2024年1月1日至2024年12月31日一共开发多少新功能，主要功能名称是什么，修复或优化多少功能点其中调整优化次数多的top3。
总结内容如下： 通过总结，我们可以将此段内容加入总结中或者用来PPT内容的中。</description></item><item><title>观《李继刚：当我们说「提示词」时，到底在说什么？》所感</title><link>https://blog.51ai.vip/posts/%E8%A7%82%E6%9D%8E%E7%BB%A7%E5%88%9A%E5%BD%93%E6%88%91%E4%BB%AC%E8%AF%B4%E6%8F%90%E7%A4%BA%E8%AF%8D%E6%97%B6%E5%88%B0%E5%BA%95%E5%9C%A8%E8%AF%B4%E4%BB%80%E4%B9%88%E6%89%80%E6%84%9F/</link><pubDate>Tue, 31 Dec 2024 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E8%A7%82%E6%9D%8E%E7%BB%A7%E5%88%9A%E5%BD%93%E6%88%91%E4%BB%AC%E8%AF%B4%E6%8F%90%E7%A4%BA%E8%AF%8D%E6%97%B6%E5%88%B0%E5%BA%95%E5%9C%A8%E8%AF%B4%E4%BB%80%E4%B9%88%E6%89%80%E6%84%9F/</guid><description>文中看到一两句觉得不错的话:
能让提示词产生惊艳效果的往往是，让模型不按照训练时候的权重、参数结构等既定的默认路径输出，人类的提示词要能唤醒模型与之『共振』。
AI 来了。……人类的宇宙是什么？是我脑海中的认知宇宙。AI 的宇宙是什么？是参数宇宙。现在这两个宇宙要产生交流，这个交流的宇宙语，我们把它定义为提示词。
我没有美丽的词汇去描述那些,正巧前几天看到有话题再提这个. 也看到不少佬友跟帖在说是与非.
别人怎么看都是别人的,我要考虑是对方是否说明什么,我能理解到什么地步.我要学习那些内容.
有些好的 提示词、提示片段就是能达到一定预期.这说明效果是有的,但也别像短视频那种傻吹就好. 各厂家也在发布模型的prompt文档内容.
从中我想到自己记住的几句:
*「万物本虚，万法本无，得虚无之窍者，知法术之要乎！」
*「法本无祖，术本无状，师之于心，得之于象。」
原文: https://mp.weixin.qq.com/s/c4RRQP7UfdgZiVDvaN4LwA</description></item><item><title>11.19日记</title><link>https://blog.51ai.vip/posts/11.19%E6%97%A5%E8%AE%B0/</link><pubDate>Fri, 22 Nov 2024 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/11.19%E6%97%A5%E8%AE%B0/</guid><description>因为针灸，我需要下班后吃完饭再去。然而，针灸附近不仅没什么好吃的，连炒菜都没有。每次下班，我习惯去老乡鸡，选菜简单，通常是西红柿鸡蛋加上其他随意的搭配。今天写这段笔记是因为我又见到了她。几乎每次去都能遇见她，不免让我注意到她的存在。
我发现她吃饭时总是很忙活。每当我都已经吃完，她还在餐区来回穿梭，拿这个拿那个。我不禁疑惑，她是不是有什么问题？转念一想，嗐，我自己没病也不会在这儿吃饭了。或许，每个人心里都有那么一点点小问题吧。</description></item><item><title>Obsidian插件使用</title><link>https://blog.51ai.vip/posts/obsidian%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8/</link><pubDate>Fri, 01 Nov 2024 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/obsidian%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8/</guid><description>场景 一直使用Obsidian进行记录内容,网页上很多内容觉得不错想摘录一下. 之前使用过的内容是简悦和一个Safari的脚本.
前阵子看到有人分享Obsidian的插件,装上一直没用,本周体验完记录一下.
本次记录时演示的浏览器是 zen browser .
安装插件 下面是支持浏览器的地址:
hrome Web Store for Chrome, Brave, Edge, Arc, Orion, and other Chromium-based browsers.
Firefox Add-Ons for Firefox and Firefox Mobile.
Safari Extensions for macOS, iOS, and iPadOS.
使用 安装完再浏览器上可以看到插件图标.
在使用之前我们先进行一些配置,点击图标后点击设置按钮:
基本设置 基本设置中,最需要设置的是 Vaults 目录,可以配置一个或多个,当在插件上保存时可以切换不同的 Vault 进行保存.
输入Vault名字,回车添加.
属性配置 属性我没有调整,使用的默认值.等需要进阶或者修改时候再考虑.
荧光笔配置 荧光笔目前用起来不是很好用. 他能给网页进行高亮,通知在配置时是否显示,已经再导出内容是,是否用高亮的内容替换原文.
白话就是仅导出高亮内容.看你选择,我选择默认替换原文.
模版配置 模版我修改的地方不多,我仅把Vault设置了默认的名字,没有选择LastUsed. 如果多个库可以用lastUsed更合适.
模版有一处配置会影响导出结果:
默认是创建新文件. 如果需要进行同名称追加和日记可以自行选择测试.
导出测试 插件图标上也有些按钮,下面进行简单介绍:
在Add to obsidian 按钮上面是选择输出的vault,后面的输入是指定输出目录, 默认是Clippings .
原文导出 在浏览的网页导出原文是,点击插件图标后选择 Add to Obsidian .</description></item><item><title>zabbix6.0+docker-compose部署</title><link>https://blog.51ai.vip/posts/zabbix6.0docker-compose%E9%83%A8%E7%BD%B2/</link><pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/zabbix6.0docker-compose%E9%83%A8%E7%BD%B2/</guid><description>zabbix6.0 已是新LTS版本。根据zabbix-docker上的trunk版本来搭建zabbix6.0。
根据踩坑，记录docker-compose 执行后遇到的一些问题。
zabbix 6.0 LTS已发布 本文中的镜像为当时为zabbix6.0预发布版本（trunk）。目前zabbix6.0LTS版本已发布。 请结合 官方镜像
部署 主机安装好docker、docker-compose。
文件包含:env_vars ,
docker-compose.yml。
密码6387
下载完成后解压到同一目录， 并执行docker-compose up -d
这时候可以看到各服务拉取镜像并启动。
docker-compose 文件内容 version: &amp;#39;3.5&amp;#39; services: m-server: container_name: m-server image: zabbix/zabbix-server-mysql:alpine-trunk restart: always ports: - &amp;#34;10051:10051&amp;#34; volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - ./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro - ./zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro - ./zbx_env/var/lib/zabbix/export:/var/lib/zabbix/export:rw - ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro - ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro - ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro - ./zbx_env/var/lib/zabbix/mibs:/var/lib/zabbix/mibs:ro env_file: - ./env_vars/.env_db_mysql - ./env_vars/.env_srv secrets: - MYSQL_USER - MYSQL_PASSWORD - MYSQL_ROOT_PASSWORD # - client-key.pem # - client-cert.</description></item><item><title>Arc Search小记</title><link>https://blog.51ai.vip/posts/arc-search%E5%B0%8F%E8%AE%B0/</link><pubDate>Sat, 19 Oct 2024 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/arc-search%E5%B0%8F%E8%AE%B0/</guid><description>起因 由于safari访问论坛或者网页提示版本低,所以就升级了iOS系统. 升级到了iOS17.7,舍弃了巨魔老弟啊. 拥抱一些之前装不上的APP.
基本功能介绍 在macOS上已经使用了几个月的arc浏览器了,之前在手机安装过一个arc手机版除了能同步标签好像没啥新鲜玩意儿就卸载了.
现在新的 Arc Search有一些新功能.下面简单记录一下.
界面很简约 🎬: https://watch.wave.video/Z84ahCqYM5UO97hl
打开App后很简约,上面有个大大的logo. 这玩意儿可以拖拽,旋转.拿来解闷的吗? 底部三个按钮,左侧是同步的电脑标签(提前已经登陆与电脑版账号).中间➕号快速启动,长按这个可以呼出arc那个小助手.右侧是设置按钮.
底栏上划和➕号功能一样.
输入右侧支持语音助手和快速切换隐私模式👀. 这个👀切换相当丝滑.
这个页面可以pin一些常用的网页.便于快速打开. 最顶部的搜索输入默认是走搜索引擎,输入的同时下面会有提示,这些提示功能是通过AI帮你返回搜索信息内容.
网页总结 🎬: https://watch.wave.video/wjieIYr66NLni9YG
网页总结有一个手势,双指捏合网页缩小后开始总结.
Pin 和PC功能一样,支持pin到pc同步的空间.第一个Favorite in App 是钉在App的启动页上,当点击下栏+号或者上划是能看到钉的链接.
翻译 🎬: https://watch.wave.video/wLN3YbdOkwouKosc
翻译和chrome体验是类似的,可能就是一个功能.我不清楚,单我发现一个不错的看书方式,就是之前提到过的Flow加载书,用它来翻译.有个缺点是字体颜色不知道为什么会变色. 翻译速度挺快的.
设置 其他设置中有个 Raise to Call Arc 这个功能有点意思,当你打开arc,拿起手机像打电话一样可以呼出来助手,你说话它去处理(播放🎵),最后播放处理结果.
站点设置 广告,禁提示cookie,禁止跟踪这些默认开启.
UI交互 🎬: https://watch.wave.video/0u8ckdJkSUejvaPc
底栏左侧按钮上划时快速切换打开的网页,点击打开打开页面的预览,上划关闭网页.长按打开PC同步的space内容.
大概就这些,感谢浏览.
完结 祝好</description></item><item><title>Snapbox</title><link>https://blog.51ai.vip/posts/snapbox/</link><pubDate>Sat, 14 Sep 2024 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/snapbox/</guid><description>一款macOS的APP app网站 : https://snapbox.app/
我在v2ex上看到此贴.
作者3.5天的时间通过Claude 3.5 Sonnet协助开发的macOS App.需要M系列芯片的设备.
看起来像是spotlight,raycast这种工具的方式启动,调出后实现与AI的一系列操作. 比如翻译、对话、优化内容等工作.
支持ollama和服务提供商API.
配置内容简单,支持prompt.
接入配置 呼出主界面时,进入 settings.
设置界面中的 SELECT PROVIDER中选择模型的厂商.
我这里配置过Ollama和Custom Endpoint.Custom Endpoint我选择了 siliconflow.
配置时,输入完 CUSTOM ENDPOINT URL 和 ** CUSTOM ENDPOINT API KEY**后可以获取模型.
勾选自己使用的模型名字即可.如果API服务商不支持获取可以自己点击+号添加.
功能演示 我觉得此软件的特色是:
此软件支持全局快捷键,呼出程序,快捷进入某特定prompt等.
选择文字后会被程序捕获. 免去了复制粘贴.
常规对话 复制粘贴、打字与AI交互. 快捷上支持重新生成、继续、继续输入.
放个视频演示:
https://watch.wave.video/6UP7usIlnYJ9vC0B
Reactor 模式 此模式是监听你的指针选择,剪切板内容.快速响应.
放个视频演示:
https://watch.wave.video/KRjgWJQ5nJmSj0yX
最后 看到作者仅用几天时间借助大模型开发出一个功能丰富的app，令人惊叹。
既体现了大模型的强大能力，也展示了作者高超的开发技巧和创新思维。
反思自己也在日常工作中尝试利用AI模型来优化脚本编写和项目代码调整，确实感受到了效率的提升。
展望未来，AI辅助开发很可能成为主流趋势。but我们仍需谨慎对待，在享受AI带来便利的同时，也要注意培养自身解决问题的能力，而不是过度依赖AI。
完结~ 感谢观看</description></item><item><title>Arc</title><link>https://blog.51ai.vip/posts/arc/</link><pubDate>Fri, 13 Sep 2024 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/arc/</guid><description>背景 使用arc浏览器作为主力之前,更喜欢chrome.
也考虑edge替代朴素的chrome.事与愿违,在后面使用中edge变越越来越不喜欢的东西.
加入了很多我不喜欢、不去用的功能展示在界面上. 后面我就没继续使用了,不评价edge的好坏.我不喜欢用它.
后面看到arc,也是简单尝试了一下,后面我觉得不错的菜就换成了主力.
喜欢的功能 下面我介绍一下我使用这个arc浏览器喜欢的点.
space 在每个Space可放不同的标签,做到了管理和分类. 同时还可以定制颜色,样式.
可以根据不同账号(profile)分配不同的会话信息. 也就是一个浏览器不同space区分账号.满足挂小号、测试等需要多身份在同一个浏览器访问.
如上图,我新建了一个along的profile,创建了一个space. 在访问linux.do时,如图.如果我有小号就可以这么搞拉.
Easel 我用这个功能很简单,就是看下动态信息. 比如你想一些动态信息,但又不需要整个页面,是不是想把局部拿出来. 白板可以的,你截取某网页部分放到白板里,开启就可以实现.
上面是我自己创建的两个页面. 这俩一个是没事看看模型排行. 另一个是关注自己的其他信息.
可能图片不能直观解释这个用途.放个动图,看那个时间的变化:
当我想看周刊我就直接在这里点就好了,不需要单独打开此网站去查看这个列表,美滋滋.
我能想到画架的用途还有: 头脑风暴、协作、笔记、可视化信息、素材灵感搜集、整理内容、组织结构.
这些做完可以分享.
Boost 这个功能可更改网页一些元素的颜色，字体类型、字体大小等. 还是以佬友为例:
主题是默认,我通过boost功能将颜色、字体、英文文字是蛇形、全大写、全小写的配置来自定义一下.
boost中我最喜欢的是zap. 可以隐藏掉自己不喜欢的页面元素.
继续以佬友为例: 点击zap后,可以选择页面元素.
当选择元素后点击 zap this 就可以干掉他.
这是隐藏掉一些页面元素后的样子.
Favorite 这是左上角那部分内容,做多可以放12个块.块支持split的组合tab.特定适配过的还有奇效,比如gmail、outlook、slack等等等. 我把常用的网站放在这里,佬友有消息提示,这icon上会有标记的.以便我打开查看消息.
Split 通过简单拖拽,可实现tab的分屏. 新打开一个网页想和当前tab做分屏,点击链接时按住option就实现了分屏.
能分能拆,用起来体验不错.但有一点不太好,就是在分屏中关闭的tab就没了.只能重新pinned.
搜索 默认地址栏输入内容能搜索,或者自己访问搜索引擎.
我更喜欢在command + T 弹出来的对话框里进行搜索. 他像 raycast 功能那样快捷搜索.
GitHub:
linux.do:
在设置中添加:
红框中就是演示的两个.
操作 使用工具我比较看重工具是否符合我的需求.已经使用上顺不顺手. 很显然我喜欢arc的一些功能和交互.尤其是在快捷键上也挺顺手的. 举个例子: 我打开佬友后,默认看话题是自定进入话题页面的.有人希望每次单开tab什么的.在arc上选择很多.
在split上看主题(一般的网页是直接option+链接就打开split模型):
如果我不知道是否值得,想简单了解一下再做决定呢?那就按住shift 弹出一个浏览器进行浏览,之后可以查看、分屏、关闭等操作.
如果你想打开新tab查看主题,也可以按住shift+command 点击主题,就是在新的tab也查看.</description></item><item><title>LLM_fine Tuning</title><link>https://blog.51ai.vip/posts/llm_fine-tuning/</link><pubDate>Thu, 15 Aug 2024 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/llm_fine-tuning/</guid><description>微调 fine-tuning 微调是一种监督学习过程,在这个过程中可以使用一组带标签的示例数据来更新LLM的权重.使其为特定任务生成良好完成的能力.
指令微调特别擅长提高模型在各种任务中的性能. 比如想让模型翻译能力增强,那就给他一些示例是包括翻译这句话之类的说明.即时完成示例允许模型学习生成遵循给定说明的响应.
微调大致步骤 准备训练数据,需要特定的格式. 也可以通过数据集+模版来处理使其既是模版又是数据集(指令数据集). 将数据集划分为训练验证和测试.然后使用计算出的损失来更新标准反向传播中的模型权重(standard backpropagation)。多批次重复操作. 更新完进行最终的性能评估.通过测试得出精度. 最终得到一个微调模型(Instruct LLM).</description></item><item><title>Nightingle夜莺Docker版SNMP监控</title><link>https://blog.51ai.vip/posts/nightingle%E5%A4%9C%E8%8E%BAdocker%E7%89%88snmp%E7%9B%91%E6%8E%A7/</link><pubDate>Fri, 23 Jun 2023 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/nightingle%E5%A4%9C%E8%8E%BAdocker%E7%89%88snmp%E7%9B%91%E6%8E%A7/</guid><description>起因 对夜莺很感兴趣，想使用一下。我看官方提供了v6版本的docker-compose。而且我之前有使用过promtheus和grafana，虽然很好但是总觉得还是得二开。总有一天有人去搞一个不错的玩意儿出来。官方文档地址
安装与配置 直接运行docker版本的demo，启动后，我发现有prometheus和categraf。但我想根据官方文档使用VictoriaMetrics单机版本。
使用VictoriaMetrics 我在compose中去掉了prometheus，然后在主机安装了VictoriaMetrics。我没用在compose中添加，我懒改了。直接看官当文档多香。
后面启动后修改数据源： 添加好数据源后，看下是否正常： 时序指标随便敲敲看有没指标 看到有指标我很自信的说成了。
后面我加了两个Ping，发现可以没问题的。
使用内置的展示仪表盘美滋滋。
SNMP部分 之后我想测试SNMP部分，这是我工作需要的内容。
首先默认的官方demo没有提供相关categraf插件配置。他的插件都是在github上面的。下载一份放到demo的categraf/conf目录下。 我的路径： home/xxx/nightingate/docker/categraf/conf
我这里用到snmp， 就拷贝input.snmp 这个目录到上面路径内。
进入这个input.snmp,里面有两个文件,一个 snmp.toml另一个是snmp.toml.example 。实际使用的是第一个，在里面编辑内容：
[[instances]] agents = [&amp;#34;udp://10.10.10.2:161&amp;#34;] timeout = &amp;#34;5s&amp;#34; version = 2 path = [&amp;#34;/usr/share/snmp/mibs&amp;#34;] community = &amp;#34;public&amp;#34; agent_host_tag = &amp;#34;switch&amp;#34; retries = 1 [[instances.field]] oid = &amp;#34;.1.3.6.1.2.1.1.3.0&amp;#34; name = &amp;#34;uptime&amp;#34; [[instances.field]] oid = &amp;#34;.1.3.6.1.2.1.1.5.0&amp;#34; name = &amp;#34;source&amp;#34; is_tag = true [[instances.table]] oid = &amp;#34;IF-MIB::ifTable&amp;#34; name = &amp;#34;interface&amp;#34; inherit_tags = [&amp;#34;source&amp;#34;] index_as_tag = true include_filter = [&amp;#34;ifIndex:2&amp;#34;,&amp;#34;ifIndex:4&amp;#34;] [[instances.</description></item><item><title>Roadmap&amp;Go</title><link>https://blog.51ai.vip/posts/roadmapgo/</link><pubDate>Mon, 15 May 2023 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/roadmapgo/</guid><description>技术类的Roadmap（路线图）具有许多好处，下面是其中几个主要的好处：
明确目标：Roadmap可以帮助技术团队明确目标和愿景。它提供了一个清晰的计划，使团队成员知道他们正在朝着什么方向前进，并且可以更好地集中精力和资源。 规划优先级：Roadmap可以帮助团队确定优先级和时间表。通过将不同的功能、项目和任务安排在时间轴上，团队可以了解何时开始和完成每个任务，从而更好地分配资源和人力。 沟通和协作：Roadmap是与团队成员、管理层和利益相关者进行沟通和协作的重要工具。它提供了一个共同的视觉框架，帮助各方理解技术发展的方向和计划，从而促进更好的合作和决策制定。 风险管理：Roadmap有助于识别和管理潜在的风险和挑战。通过在Roadmap中考虑外部因素、技术依赖关系和风险因素，团队可以更好地规划和应对可能的问题，降低项目失败的风险。 激励和动力：Roadmap可以为团队提供激励和动力。清晰的目标和规划可以激发团队成员的工作热情和投入，使他们感到对项目和组织的价值和重要性。 我之前保存过GitHub: Alikhll/golang-developer-roadmap的roadmap。正好在上周末想看看自己找一块内容来学习学习。我发现作者还是2021年的版本，后面也没有更新什么。那我想在obsidian中把这个图复刻一个，然后根据内容去做计划去学习。后来我又想到另一个roadmap也不错。正好两个整合一下。那么就有了一个我魔改的内容。
此图是通过Obsidian的canvas 功能进行的制作。并且我后面打算通过双链来完成此图中部分内容的笔记。
此图整体可以看到通过颜色来区分了一些作者划分的知识点优先级，以便确定哪些内容应优先进行。此图我觉得有个遗憾就是没能够持续进行更新。后面还好我找到另一个认为不错的roadmap进行补充和完善。
主体还是golang-developer-roadmap，顺便在前后加入了 Backend Developer ,后面加入了Full Stack Developer。 其实还有很多roadmap相关，比如devops，docker，Frontend Developer等等吧都会涉及到一些内容。并且这个roadmap还可以在图中交互，我觉得不错。
主要不错地方包含：
可交互。 此roadmap是持续更新的。 比如这个后端内容中，你点击 What is HTTP？ 在右侧弹出内容中，可以看到具体内容，并有相关的链接可以去访问。 最上面还有个状态，可通过状态编辑此内容是否已经达到目的。
点击Update Status后可以看到有三个选项。
点击Done之后，图中将做出变化：
个人认为是个不错的方式。
个人认为技术类的Roadmap可以帮助团队提高效率、降低风险、改善沟通和协作，并为实现技术目标提供清晰的指导。它是一个重要的管理工具，有助于组织和规划技术团队的工作，使其能够更好地满足业务需求并取得成功。
完结 祝好 ～</description></item><item><title>Colima MacOS最小的设置运行容器运行时,替换Docker Desktop方案</title><link>https://blog.51ai.vip/posts/colima-macos%E6%9C%80%E5%B0%8F%E7%9A%84%E8%AE%BE%E7%BD%AE%E8%BF%90%E8%A1%8C%E5%AE%B9%E5%99%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9B%BF%E6%8D%A2docker-desktop%E6%96%B9%E6%A1%88/</link><pubDate>Fri, 07 Apr 2023 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/colima-macos%E6%9C%80%E5%B0%8F%E7%9A%84%E8%AE%BE%E7%BD%AE%E8%BF%90%E8%A1%8C%E5%AE%B9%E5%99%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E6%9B%BF%E6%8D%A2docker-desktop%E6%96%B9%E6%A1%88/</guid><description>Colima GitHub
Colima 是一个轻量级的容器运行时，专门针对开发者在本地环境中运行容器应用。它的目标是提供一种比 Docker Desktop 更简单、更快速、更安全的容器运行时解决方案。
Colima 基于 Moby 和 LinuxKit 构建，具有以下特点：
由于它只是一个容器运行时，因此相对于 Docker Desktop，它的安装和启动速度更快，所需的资源更少。 它使用了轻量级的虚拟化技术，例如 HyperKit 和 VPNKit，以提高容器的性能和安全性。 Colima 提供了一组简单的 CLI 命令，使得用户可以轻松地启动、停止、删除容器，以及执行其他常见操作。 它还提供了一些有用的功能，例如在本地浏览器中打开容器中运行的应用程序、自动重启容器等。 总的来说，Colima 是一个轻量级、易于使用的容器运行时，旨在为开发者提供一种更快、更安全的容器环境，使得开发和测试容器应用程序变得更加轻松。
安装 在 macOS 上安装 Colima 很简单，只需要执行以下几个步骤：
首先，您需要打开终端并使用 Homebrew 包管理器安装 Colima。如果您没有安装 Homebrew，请先安装 Homebrew： /bin/bash -c &amp;quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&amp;quot;
安装 Colima： brew install colima
安装完成后，您可以使用 colima 命令来启动 Colima： colima start
如果您想停止 Colima，可以使用以下命令： colima stop
要卸载 Colima，请运行以下命令： brew uninstall colima
安装完成后，您就可以使用 Colima 运行和管理容器应用程序了。
docker交互 启动 Colima 后，您可以使用 Docker CLI 与容器交互。在 Colima 中，Docker CLI 已经预先安装了，所以您可以直接使用 docker 命令来管理容器。</description></item><item><title>Ubuntu22.04安装kubeadm</title><link>https://blog.51ai.vip/posts/ubuntu22.04%E5%AE%89%E8%A3%85kubeadm/</link><pubDate>Wed, 11 Jan 2023 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/ubuntu22.04%E5%AE%89%E8%A3%85kubeadm/</guid><description>学习k8s 学习k8s做笔记，通过kubeadm搭建1master、2node。网络插件：flannel。系统Ubuntu22.04
系统安装docker Docker官方手册
master、node设备各安装docker、kubelet、 kubeadm、 kubectl。
为kubeadm准备 master、node进行准备工作：
将cgroup处理改成systemd nano /etc/docker/daemon.json
{ &amp;#34;exec-opts&amp;#34;: [&amp;#34;native.cgroupdriver=systemd&amp;#34;], &amp;#34;log-driver&amp;#34;: &amp;#34;json-file&amp;#34;, &amp;#34;log-opts&amp;#34;: { &amp;#34;max-size&amp;#34;: &amp;#34;100m&amp;#34; }, &amp;#34;storage-driver&amp;#34;: &amp;#34;overlay2&amp;#34; } sudo systemctl enable docker sudo systemctl daemon-reload sudo systemctl restart docker
为了让 Kubernetes 能够检查、转发网络流量，你需要修改 iptables 的配置，启用“br_netfilter”模块 nano /etc/modules-load.d/k8s.conf
br_netfilter nano /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward=1 sudo sysctl --system
修改“/etc/fstab”，关闭 Linux 的 swap 分区，提升 Kubernetes 的性能 sudo swapoff -a sudo sed -ri &amp;#39;/\sswap\s/s/^#?/#/&amp;#39; /etc/fstab 安装kubeadm Kuneadm官方手册 在master、node上都需要安装</description></item><item><title>通过minikube部署K8S学习环境</title><link>https://blog.51ai.vip/posts/%E9%80%9A%E8%BF%87minikube%E9%83%A8%E7%BD%B2k8s%E5%AD%A6%E4%B9%A0%E7%8E%AF%E5%A2%83/</link><pubDate>Fri, 06 Jan 2023 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E9%80%9A%E8%BF%87minikube%E9%83%A8%E7%BD%B2k8s%E5%AD%A6%E4%B9%A0%E7%8E%AF%E5%A2%83/</guid><description>Minikube 是本地 Kubernetes，专注于让 Kubernetes 易于学习和开发。
MacOS部署方式: 官方教程
本次使用的驱动是 parallels驱动。所以本机需要安装此软件。 安装kubectl：brew install kubectl 安装minikube：
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 sudo install minikube-darwin-amd64 /usr/local/bin/minikube 通过minikube启动集群 minikube start \ --kubernetes-version=v1.23.9 \ --image-mirror-country=&amp;#39;cn&amp;#39; \ --registry-mirror=https://？？？？？.mirror.aliyuncs.com 因为是国内，所以--image-mirror-country='cn'。通过--registry-mirror为 Docker daemon 配置镜像加速。例如上面是阿里云镜像服务地址。 因为我学习的版本是1.23.x，所以制定了版本--kubernetes-version=v1.23.9。 默认他读去了驱动配置，识别是parallels,自己定义方式--driver=hyperkit。
安装结果： 错误： 如果存在错误请看具体上面的问题，很多情况都能直观看到提示。其中图标是❗️提示一些问题、💡给你一些建议等等。
驱动选择： 使用docker驱动需要安装docker desktop。其他驱动：virtualbox、vmware、ssh、Hyperkit等。具体详见drivers page
验证结果 查询minikube状态 进入面板 kubectl控制 minikube kubectl -- get pods -A kubectl在minikube中使用，需要写 nimikune kubectl --后面加入执行的命令。 macos默认使用的zsh，在zsh加入alias就可以敲的少的了。
vi ~/.zshrc #加入一行 alias kubectl=&amp;#34;minikube kubectl --&amp;#34; #退出 source ~/.zshrc 再创建一个Pod 创建： kubectl run nginx --image=nginx:alpine 查询： kubectl get pods nginx 详情： kubectl describe pods nginx 到这里k8s可以使用了。</description></item><item><title>IOS使用Shadowrocket激活Emby</title><link>https://blog.51ai.vip/posts/ios%E4%BD%BF%E7%94%A8shadowrocket%E6%BF%80%E6%B4%BBembyx/</link><pubDate>Wed, 16 Nov 2022 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/ios%E4%BD%BF%E7%94%A8shadowrocket%E6%BF%80%E6%B4%BBembyx/</guid><description>前提需要手机安装ShadowRocket。没有可以自己去找共享ID。 长按后弹出选项： 打开配置，例如在default上添加规则。点击default，编辑纯文本。 在文本最下面加入内容：
[Script] EmbyPremiere = type=http-response,script-path=https://gitlab.com/iptv-org/embypublic/-/raw/master/Script/EmbyPremiere.js,pattern=^https?:\/\/mb3admin.com\/admin\/service\/registration\/validateDevice,max-size=131072,requires-body=true,timeout=10,enable=true [MITM] hostname = mb3admin.com 点击保存后，点右侧!进入。点击HTTPS解密。 开启HTTPS加密，会生成证书。同意安装描述文件。右上角点击勾。 去手机设置中，通用-&amp;gt;描述文件与设备管理-&amp;gt;点击描述文件(名称大概有Shadowrocket那个)-&amp;gt;安装。 注意在Shadowrocket的首页上，全局路由选择配置。
最后进入Emby软件。可能会提示证书点OK。如果没有提示，点一个影片后也会提示，点OK。如果Shadowrocket开启通知可以看到提示认证成功。 后面就可以畅快看影视啦。
下次进入Emby时不需要Shadowrocket的配置了。当出现付费提示再开启那个配置就可以激活了。
完结～ 祝好！</description></item><item><title>Zabbix自动发现SNMP设备</title><link>https://blog.51ai.vip/posts/zabbix%E8%87%AA%E5%8A%A8%E5%8F%91%E7%8E%B0snmp%E8%AE%BE%E5%A4%87/</link><pubDate>Wed, 12 Oct 2022 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/zabbix%E8%87%AA%E5%8A%A8%E5%8F%91%E7%8E%B0snmp%E8%AE%BE%E5%A4%87/</guid><description>Zabbix提供高效灵活的网络自动发现功能。 网络发现的优势：
加快部署速度 简化管理 在快速变化的环境中避免过度管理 manual-zh 发现SNMP例子 网段内存在几天设备，其中一台是SNMPv2，一台SNMPv3，通过发现将他们加入并监控
大概流程：
发现规则，通过发现规则去发现设备。 发现后的动作，发现设备后做什么。 验证发现结果。 创建发现规则 Configuration -&amp;gt; Discovery -&amp;gt; Create discovery rule 通过SNMPv2协议，根据oid检查。 这个oid是设备名。 community是根据设备来的。通过SNMP取设备名，host名称是IP地址，可见名称是SNMP取的设备名称。
重点配置内容：
IP range 发现IP范围 Update interval 发现周期 Checks 使用此检查列表来执行网络发现 Device uniqueness criteria 唯一标识 Host name 主机名称 Visible name 可见名称 创建发现动作 Configuration -&amp;gt; Actions -&amp;gt; Discovery actions
Action 选项中： 主要配置Conditions内容： 我写了两个条件，因为我发现写了v2，v3版本的协议。所以有两个条件。如果都是v2就写一个就ok。简单来讲满足我demo。
Operations 选项： 发现的设备添加， Add host 。 加入设备组， Add to host groups：组名。 关联模版，Link to templates：模版名。 开启Host。 通过这个配置后，发现的主机会根据这个配置进行操作。</description></item><item><title>Lux视频下载工具</title><link>https://blog.51ai.vip/posts/lux%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD%E5%B7%A5%E5%85%B7/</link><pubDate>Thu, 01 Sep 2022 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/lux%E8%A7%86%E9%A2%91%E4%B8%8B%E8%BD%BD%E5%B7%A5%E5%85%B7/</guid><description>简介 是一个下载视频的软件. 我一般通过此软件下载b站视频.支持专辑下载. 支持的站点: 介绍
仓库 github:lux
安装(mac) brew install lux
需要的依赖 ffmpeg
使用 命令: lux [OPTIONS] URL [URL...]
例子:
#我想下载某专辑视频,首先创建一个文件夹 mkdir golang #然后进入文件夹 cd golang ##执行lux 下载专辑 (-eto bilibili每集文件名不包含播放列表标题) lux -p -eto https://www.bilibiLi.com/video/BV1SF411z7XW ##选择性下载 例如只下载 10-20集 lux -p -eto -items 10-20 https://www.bilibiLi.com/video/BV1SF411z7XW ## 选择清晰度 需要-i查看一下清晰度.查看 download with值 lux -i https://www.bilibili.com/video/BV1SF411z7XW ## 加入清晰度参数1080(不建议,列表执行清晰度可能不全是1080会导致报错) lux -p -eto -f 80-7 https://www.bilibili.com/video/BV1SF411z7XW 图片展示 下载: 下载完成结果 查询清晰度</description></item><item><title>Zabbix6 网络发现</title><link>https://blog.51ai.vip/posts/zabbix-%E7%BD%91%E7%BB%9C%E5%8F%91%E7%8E%B0/</link><pubDate>Fri, 14 Jan 2022 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/zabbix-%E7%BD%91%E7%BB%9C%E5%8F%91%E7%8E%B0/</guid><description>Zabbix6 网络发现
功能 快速发现并添加主机
简单的管理
随着环境的改变而快速搭建系统
发现配置依据 IP地址段
基于服务(FTP、SSH、Web、POP3、IMAP、TCP&amp;hellip;)的
从Zabbix-Agent接收到的信息
SNMP agent接收的信息
添加方式 创建 Discovery rule
Name：规则名称（唯一）
Discovery by proxy： 是否由代理执行
IP range： IP地址范围
单个IP: 192.168.1.33 IP段: 192.168.1-10.1-255. 范围受限于覆盖地址的总数（小于64K）。 子网掩码: : 192.168.4.0/24 支持的子网掩码: /16 - /30 for IPv4 addresses /112 - /128 for IPv6 addresses\IP列表: 192.168.1.1-255, 192.168.2.1-100, 192.168.2.200, 192.168.4.0/24 Zabbix 3.0.0起，此字段支持空格，表格和多行。
Update interval: Zabbix执行规则的频率
Checks: 发现的方式
Device uniqueness criteria：设备唯一标识
Host name ： 主机名
Visible name：描述名
这三个选项是根据，checks里面的相关类型出来的数据。基本上都有IP地址，当checks Type 选择了 SNMP或者zabbix agent时，下面选项可以提供这两种对应的数据作为选项。</description></item><item><title>linux环境redis开机启动</title><link>https://blog.51ai.vip/posts/linux%E7%8E%AF%E5%A2%83redis%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8/</link><pubDate>Tue, 11 Jan 2022 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/linux%E7%8E%AF%E5%A2%83redis%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8/</guid><description>前提 系统部署在ubuntu20.04中，用到redis数据库。 但是测试时候，设备重启发现redis服务没有启动。 由于是变异安装的，系统找不到redis.service。
解决方案 系统添加服务文件，并执行。
编写文件 文件路径/usr/lib/systemd/system
编写文件 vi /usr/lib/systemd/system/redis.service
[Unit] #服务描述 Description=Redis persistent key-value database #服务依赖 After=network.target After=network-online.target Wants=network-online.target [Service] #启动 命令 ExecStart=/home/monitor/redis-6.0.8/src/redis-server /home/monitor/redis-6.0.8/redis.conf --protected-mode no #停止命令 ExecStop=/home/monitor/redis-6.0.8/src/redis-cli shutdown # Restart=always #服务类型 Type=forking #User=redis #Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 [Install] #服务安装设置 WantedBy=multi-user.target 服务配置文件分为[Unit]、[Service]和[Install]三部分。 具体详细的解释需要结合linux知识补充。
服务生效 系统重新读取所有服务文件： systemctl daemon-reload 启用/禁用开机自启动: systemctl enable/disable redis 启动/重启redis： systemctl start/restart redis</description></item><item><title>S5720 SNMP v3配置</title><link>https://blog.51ai.vip/posts/s5720-snmp-v3/</link><pubDate>Tue, 16 Nov 2021 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/s5720-snmp-v3/</guid><description>S5720 SNMP v3配置 系统视图 system-view
SNMP服务 snmp-agent
管理端口(默认161) snmp-agent udp-port *port-num*
配置版本(默认v3) snmp-agent sys-info version *v3*
配置用户组 snmp-agent group v3 *group-name* {authentication | privacy | noauthentication}
三种认证加密方式
配置v3用户 snmp-agent usm-user v3 *user-name* [ group *group-name*] 配置用户认证密码 snmp-agent usm-user v3 *user-name* authentication-mode { md5 | sha } [ cipher *password* ]
配置加密密码 snmp-agent usm-user v3 *user-name* privacy-mode { des56 | aes128 |aes192 | aes256 | 3des } [ cipher *password* ]</description></item><item><title>zabbix proxy cannot perform check now for itemid [xxxxx]: item is not in cache</title><link>https://blog.51ai.vip/posts/zabbix-proxy-cannot-perform-check-now-for-itemid-xxxxx-item-is-not-in-cache/</link><pubDate>Wed, 27 Oct 2021 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/zabbix-proxy-cannot-perform-check-now-for-itemid-xxxxx-item-is-not-in-cache/</guid><description>zabbix proxy cannot perform check now for itemid [xxxxx]: item is not in cache 情况 接上次做完容器部署proxy后，为其添加host进行添加任务。
发现一直没有数据，就到item里面执行 execute now。
然后过了几分钟回来一看，还是没有。
Emmm，看下log吧。
Server没一场，那问题就在proxy了吧。
连上proxy去看看： 提示好像是去检查对应的itemid，然后说item不在还cache中。 赶紧上网科普！
原因 因为是主动的proxy，那他会定期去server要数据。
这个3600就是配置的更新周期了。1个小时才去要一次，所以肯定是没监控了。
为了验证，就等了1小时看看： 实锤了，1小时。后面也就有了数据。 Host是1小时之后开始有数据的，也就是他同步后就开始执行监控项了。
查询到的内容： [地址](https://subscription.packtpub.com/book/networking_and_servers/9781784399764/1/ch01lvl1sec10/understanding-the-zabbix-proxies-data-flow) 解决 Ok，那么在重新部署的容器加上此参数(ZBX_CONFIGFREQUENCY)。
docker run --name zbxproxy -d \ -e ZBX_SERVER_HOST=192.168.10.66 \ -e ZBX_HOSTNAME=&amp;#34;testproxy&amp;#34; \ -e ZBX_TIMEOUT=&amp;#34;10&amp;#34; \ -e ZBX_TLSACCEPT=psk \ -e ZBX_TLSCONNECT=psk \ -e ZBX_TLSPSKIDENTITY=helloworld \ -e ZBX_TLSPSKFILE=zbx_proxy.psk \ -e ZBX_CONFIGFREQUENCY=600 \ -v /etc/localtime:/etc/localtime:ro \ -v /zbx_proxy.psk:/var/lib/zabbix/enc/zbx_proxy.psk \ --restart=always \ zabbix/zabbix-proxy-sqlite3:alpine-trunk &amp;ndash;祝好</description></item><item><title>Zabbix-Proxy 部署运行</title><link>https://blog.51ai.vip/posts/zabbix-proxy-%E9%83%A8%E7%BD%B2-%E8%BF%90%E8%A1%8C/</link><pubDate>Thu, 24 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/zabbix-proxy-%E9%83%A8%E7%BD%B2-%E8%BF%90%E8%A1%8C/</guid><description>前提 版本： zabbix-server 5.4
任务： 通过SNMP监控网络设备，需要需通过zabbix-proxy 发送到zabbix-server。
安装Zabbix-Proxy 安装Zabbix仓库 wget https://repo.zabbix.com/zabbix/5.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.4-1+ubuntu20.04_all.deb dpkg -i zabbix-release_5.4-1+ubuntu20.04_all.deb apt update 安装Zabbix-proxy &amp;amp; mysql 这里我选择的是mysql作为数据库
apt install mysql-server
apt install zabbix-proxy-mysql
导入数据 zcat /usr/share/doc/zabbix-proxy-mysql/schema.sql.gz | mysql -uzabbix -p zabbix
这里可能跑不通。我装了两次都发现没有 schema.sql.gz 这个文件。 如果你也是，那需要找一下这个sql文件。
下载5.4源码包： wget https://cdn.zabbix.com/zabbix/sources/stable/5.4/zabbix-5.4.1.tar.gz 解压之后，在 /zabbix-5.4.1/databases/mysql/ 中
通过 cat schema.sql | mysql -uzabbix -p 导入到数据库中。
4.配置zabbix-proxy
vim /etc/zabbix/zabbix_proxy.conf
修改Zabbix Server地址,Hostname，在server添加中，此名称要与这里一致。
修改为正确的数据库名字、用户名、密码。
其他配置可以酌情配置。例如server配置频率，log位置，本地缓存时间、主动被动、监听端口等等。
启动zabbix-proxy systemctl start zabbix-proxy &amp;amp;&amp;amp; systemctl enable zabbix-proxy 在zabbix-server 中添加proxy，然后在对应的host主机上选择proxy。 zabbix-proxy log 默认配置的位置： /var/log/zabbix/zabbix_proxy.</description></item><item><title>小米手环解锁MacOS系统笔记本MacBookPro</title><link>https://blog.51ai.vip/posts/%E5%B0%8F%E7%B1%B3%E6%89%8B%E7%8E%AF%E8%A7%A3%E9%94%81macbookpro%E7%AC%94%E8%AE%B0%E6%9C%AC/</link><pubDate>Fri, 21 May 2021 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E5%B0%8F%E7%B1%B3%E6%89%8B%E7%8E%AF%E8%A7%A3%E9%94%81macbookpro%E7%AC%94%E8%AE%B0%E6%9C%AC/</guid><description>通过小米手环解锁笔记本 官方windows是提供了方法的。 我目前用的MacBookPro，所以说下苹果笔记本的解锁方式。
安装软件BLEUnlock 库
安装方式： brew 安装 brew install bleunlock
或下载程序 下载发布的程序
安装好打开软件： 设备列表选择手环，如果发现不到就在小米运动app中打开实验室选项里小米笔记本解锁开关。
设备列表选择你的小米手环。
解锁RSSI与锁定RSSI 是根据你dBM值来判断是否锁定/解锁笔记本。是一个阈值。
延迟锁定，无信号超时是时间阈值。功能顾名思义。
我这里选择开启了屏保来锁定、以及开机启动。
通过以上配置之后，我们就可以通过小米手环来解锁MacOS笔记本了。
请注意一点 如果你是每天背着本上下班的话，那我建议上下班前后别开启此功能。 为什么呢，因为你设定的RSSI值肯定是离近笔记本的。这时候你带着手环和笔记本的时候。他很容易就吧本解锁了。然后你发现从书包拿出来本巨热无比。
为啥呢，他唤醒了设备啊 还解锁了～
这点我不知道怎么搞定呢，好 结束～
祝好
拜拜～</description></item><item><title>小米手环表盘自定义</title><link>https://blog.51ai.vip/posts/%E5%B0%8F%E7%B1%B3%E6%89%8B%E7%8E%AF%E5%8F%98%E7%9B%98%E8%87%AA%E5%AE%9A%E4%B9%89/</link><pubDate>Thu, 20 May 2021 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E5%B0%8F%E7%B1%B3%E6%89%8B%E7%8E%AF%E5%8F%98%E7%9B%98%E8%87%AA%E5%AE%9A%E4%B9%89/</guid><description>前阵子媳妇给买了个手环。小米手环5NFC，价格还可以。 定义表盘 手环就不做评价了，我感觉续航不错。屏幕划痕太容了吧。
吐槽完了说下能玩的也就表盘了吧。
出小米运动能同步的那些之外，总想搞点与众不同的。
请访问-&amp;gt;AW 不仅是小米5，6都有了。
我们根据自己的设备来选择。
可以看到有面上方有个分类，语言筛选。
这个还是很有用的，如果你只希望看到中文表盘，那就选择中文。 但是中文可能相对较少，我建议所有，然后看喜欢的界面吧。毕竟表盘上也没几个字。
当我们点中某一个表盘，他会进到详情页。 点击下载，可以弹出来具体的表盘文件。 可以看到不同的文件有一些描述，比如语言，以及其他的一些描述。根据喜好下载。
我建议手机下载，省的再从电脑发到手机上。
下完之后，下面就需要同步表盘了。
我目前知道的方式，就是通过一些APP来同步。其他方式我没研究过。
我使用的手机是Iphone，所以我安装此软件：amaztools。 安装完软件进入： 主页同步信息等这些不重要略过。 这里app也提供了一些表盘。相比之下，这里面内容不多。喜欢可以看看，下载。在这里的下载后，同步就好。
这里展示从app下载的表盘。 在More里面，有我们需要的功能，install custom file。安装我们下载的表盘。
点击 install custom file 选择我们下载的变盘，然后同步到手环上。 过程就结束了。
真的结束了吗？！ 还要下载好多一个个去试～ 哈哈哈哈
结束 祝好</description></item><item><title>Mac OS自己安装的小软件</title><link>https://blog.51ai.vip/posts/mac-os%E8%87%AA%E5%B7%B1%E5%AE%89%E8%A3%85%E7%9A%84%E5%B0%8F%E8%BD%AF%E4%BB%B6/</link><pubDate>Thu, 06 May 2021 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/mac-os%E8%87%AA%E5%B7%B1%E5%AE%89%E8%A3%85%E7%9A%84%E5%B0%8F%E8%BD%AF%E4%BB%B6/</guid><description>自己使用Mac一年多 自己在19年12月换了mac 16&amp;quot; 笔记本。之前一直windwos，后来看很多讲师在讲课的时候都是mac本本。又觉得windws10更新频繁，还强制让我很不爽。
最后凑巧16&amp;quot;出来后，自己媳妇送了我一台。美滋滋～
讲讲我说的小软件 一些好玩的，实用的软件。
Bob Hidden Bar itsycal pap.er uPic Go2Shell uTools PicGo electerm BLEUnlock Clipy</description></item><item><title>SSH 指定端口访问</title><link>https://blog.51ai.vip/posts/ssh-%E6%8C%87%E5%AE%9A%E7%AB%AF%E5%8F%A3%E8%AE%BF%E9%97%AE/</link><pubDate>Sat, 13 Mar 2021 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/ssh-%E6%8C%87%E5%AE%9A%E7%AB%AF%E5%8F%A3%E8%AE%BF%E9%97%AE/</guid><description>很尴尬 今天测试，一个通过隧道远程到设备的功能。
隧道创建完成，然后我就要ssh到哪台设备。反复连接一直不通，心里万马奔腾啊！～
查看配置没问题啊，怎么就！@#¥%！！！
后来发现 自己的锅， ssh user@ip：prot Hahaha～～
SSH连接 SSH 默认端口22，通常我们ssh 时候指令是这样的 ssh user@ip
指定端口 指定端口 我很少用，即便是改端口的我也大部分终端软件去连的。
正确方式： ssh -p port user@ip
记忆深刻，这下很尴尬。 特此记录。</description></item><item><title>解决/usr/local/go/pkg/darwin_amd64/runtime/cgo.a: permission denied问题</title><link>https://blog.51ai.vip/posts/%E8%A7%A3%E5%86%B3-usr-local-go-pkg-darwin-amd64-runtime-cgo-a-permission-denied%E9%97%AE%E9%A2%98/</link><pubDate>Mon, 22 Feb 2021 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E8%A7%A3%E5%86%B3-usr-local-go-pkg-darwin-amd64-runtime-cgo-a-permission-denied%E9%97%AE%E9%A2%98/</guid><description>最近Goland在run的时候发现一个问题 open /usr/local/go/pkg/darwin_amd64/runtime/cgo.a: permission denied
情况具体是当我run的时候有问题。debug可以。根据错误提示看到是权限的事。
解决方式 执行 sudo chown -R xxx:yyy /usr/local/go
xxx 用户名， yyy 组名
命令的目的：更改go目录的所有者用户和组。
查看用户名&amp;amp;用户组 当前用户名 常用命令 who am i 查看当前用户名和组 ls -la
参考 https://github.com/golang/go/issues/37962</description></item><item><title>Grafana插件Plugin中文汉化</title><link>https://blog.51ai.vip/posts/grafana%E6%8F%92%E4%BB%B6plugin%E4%B8%AD%E6%96%87%E6%B1%89%E5%8C%96/</link><pubDate>Mon, 30 Nov 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/grafana%E6%8F%92%E4%BB%B6plugin%E4%B8%AD%E6%96%87%E6%B1%89%E5%8C%96/</guid><description>汉化三方插件 前面说过汉化Grafana的工作。目前在7.2.1上面，大部分已经完成。细节继续完善。 今天考虑在第三方插件上做一些汉化。点到插件一看全是英文感觉很突出。领导看到了也不爽啊-.-！。
找个软的捏 饼图在展示方面比较直观。Grafana上有一个插件Pie Chart 。这个现象比较少，同时在一些模版上使用中。就拿这个热热身。
具体步骤 下载项目
项目地址：piechart-panel 文件结构：
git clone git@github.com:grafana/piechart-panel.git cd piechart-panel # 进入到目录 yarn install 我直接把项目clone到grafana存放插件的位置，我的grafana是为了测试run的一个docker镜像。把插件目录挂载到本机，代码clone到目录中。
汉化工作
根据上面目录看，主要修改文件都在src里面。 IDE打开此项目，在src中修改需要编辑的文件。
图片举例，选项第一项选择图形类型。选项内容pie / donut。通过翻译我修改成了 派/甜甜圈。根据修改内容其他地方设计修改的都需要修改。我通过查询替换方式，在其他文件中修改了代码中的判断。例如上图右侧展示的文件类似。
build插件
修改完需要的内容之后，grafana是能识别到有一个插件，但没有build时候他会提示你没有build插件。就是他不认识你的项目代码。
这个怎么处理呢？看官方的文档
执行 yarn dev
# 执行结束提示，美滋滋～ ✔ Bundling plugin in dev mode ✨ Done in 4.91s. 执行完毕我们重启grafana就可以看到成果了。
对比下原来的版本和汉化后的版本：
before：
After：
测试&amp;amp;调试
以上2，3步骤基本就是一个测试、调试的过程。
我开始先把所有配置项汉化。然后再处理选项参数。 接着build，重启grafana查看。如此往复达到预期目标。 我本机调试用docker启动grafana，测完删了容器就好了。
持续改进 考虑持续处理某个插件，可以考虑fork原插件项目，remote add XXX源。 然后新建分之来做自己的处理。master fetch XXX源 以跟踪上游的更新。 这样自己项目安装插件时候拉自己的就好啦，美滋滋。</description></item><item><title>docker-compose编排搭建prometheus+grafana+alertmanager+node-exporter+snmp-exporter</title><link>https://blog.51ai.vip/posts/docker-compose%E7%BC%96%E6%8E%92%E6%90%AD%E5%BB%BAprometheus-grafana-alertmanager-node-exporter-snmp-exporter/</link><pubDate>Tue, 17 Nov 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/docker-compose%E7%BC%96%E6%8E%92%E6%90%AD%E5%BB%BAprometheus-grafana-alertmanager-node-exporter-snmp-exporter/</guid><description>Docker-compose 目前集成很多Exporter，加上grafana的image-renderer，后面又加上ping-exporter，很多东西加起来发现操作一次docker 很烦啊。
科普之后感觉自己对k8s还有有些发怵的。从简单的一个入手吧，选择了docker-compose。
Docker-Compose项目是Docker官方的开源项目，负责实现对Docker容器集群的快速编排。
安装 安装方式看了一下，我选择直接下载bin文件方式：
curl -L https://get.daocloud.io/docker/compose/releases/download/1.12.0/docker-compose-`uname -s`-`uname -m` &amp;gt; /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose``` 通过 docker-compose version 看到版本信息算是安装完成。
编写docker-compose.yml 目录结构： ├── docker-compose.yaml ├── prometheus │ ├── rules │ │ └── *(rules).yaml/json │ ├── nodes │ │ └── *(nodes).yaml │ ├── data │ │ └── ... # 挂载prom的data数据 │ └── prometheus.yaml ├── alertmanager │ ├── templates │ │ └── *.tmpl │ └── alertmanager.yaml ├── grafana │ ├── data │ │ ├── plugins #插件目录 │ │ ├── png │ │ └── grafana.</description></item><item><title>关闭Mac的Microsoft AutoUpdate</title><link>https://blog.51ai.vip/posts/%E5%85%B3%E9%97%ADmac%E7%9A%84microsoft-autoupdate/</link><pubDate>Tue, 13 Oct 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E5%85%B3%E9%97%ADmac%E7%9A%84microsoft-autoupdate/</guid><description>最近使用Office 发现AutoUpdate一直会启动。我也不需要里面的更新。每次还要把它推出。
网上看到有两种方法，一种是暴力删除，另一种是通过权限限制。
暴力可不是我喜欢的方式，所以选择后者。
方法：
打开终端
cd /Library/Application\ Support/Microsoft/MAU2.0 sudo chmod 000 Microsoft\ AutoUpdate.app 两行命令后，输入密码就可以了。</description></item><item><title>申请Let's Encrypt HTTPS 证书脚本</title><link>https://blog.51ai.vip/posts/%E7%94%B3%E8%AF%B7let-s-encrypt-https-%E8%AF%81%E4%B9%A6%E8%84%9A%E6%9C%AC/</link><pubDate>Wed, 24 Jun 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E7%94%B3%E8%AF%B7let-s-encrypt-https-%E8%AF%81%E4%B9%A6%E8%84%9A%E6%9C%AC/</guid><description>最近需要到SSL证书，又想免懒。选择脚本来更新SSL证书文件 Let’s Encrypt是一个由非营利性组织互联网安全研究小组（ISRG）提供的免费、自动化和开放的证书颁发机构（CA）。 简单的说，借助Let’s Encrypt颁发的证书可以为我们的网站免费启用HTTPS(SSL/TLS) 。
那我们通过一个脚本来申请：
脚本名称： acme.sh
安装acme.sh： curl https://get.acme.sh | sh
创建指令： alias acme.sh=~/.acme.sh/acme.sh
测试收否安装成功： acme.sh --Version 出现版本，安装完成。
生成证书 acme.sh --issue -d demo.com -d www.demo.con -w /home/wwwroot/demo.com
–issue是acme.sh脚本用来颁发证书的指令； -d是–domain的简称，其后面须填写已备案的域名； -w是–webroot的简称，其后面须填写网站的根目录。
查看证书 acme.sh --list
Nginx 配置 项目是Nginx，下面是对Nginx的配置。
acme.sh &amp;ndash;installcert -d demo.com &amp;ndash;key-file /etc/nginx/ssl/demo.com.key &amp;ndash;fullchain-file /etc/nginx/ssl/fullchain.cer &amp;ndash;reloadcmd &amp;ldquo;service nginx force-reload&amp;rdquo;
通过 installcert 来完成安装，此处我们需要把*.key,fullchain.cer 文件拷贝到指定位置。最后通过reload命令让Nginx重载（force-reload 我环境中无法使用此参数，这里换成 restart）。
最后我们需要配置Nginx的443 server
server { listen 443 ssl; server_name demo.com; ssl on; ssl_certificate /etc/nginx/ssl/fullchain.cer; ssl_certificate_key /etc/nginx/ssl/esofar.</description></item><item><title>GORM 创建联合约束/索引</title><link>https://blog.51ai.vip/posts/gorm-%E5%88%9B%E5%BB%BA%E8%81%94%E5%90%88%E7%BA%A6%E6%9D%9F-%E7%B4%A2%E5%BC%95/</link><pubDate>Thu, 11 Jun 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/gorm-%E5%88%9B%E5%BB%BA%E8%81%94%E5%90%88%E7%BA%A6%E6%9D%9F-%E7%B4%A2%E5%BC%95/</guid><description>GROM创建联合索引 之前提到一个联合约束，那么根据需求再次做一个演示：
type Demo struct { ID uint `gorm:&amp;#34;primary_key&amp;#34;` CreatedAt time.Time UpdatedAt time.Time DeletedAt *time.Time `gorm:&amp;#34;index;unique_index:name_d&amp;#34;` Name string `gorm:&amp;#34;unique_index:name_d&amp;#34;` Status int } 通过demo 迁移后，deleted_at 与 name 会形成一个联合约束。
-OK,完结-</description></item><item><title>解决约束与软删除冲突</title><link>https://blog.51ai.vip/posts/%E8%A7%A3%E5%86%B3%E7%BA%A6%E6%9D%9F-%E8%BD%AF%E5%88%A0%E9%99%A4%E5%86%B2%E7%AA%81/</link><pubDate>Thu, 11 Jun 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E8%A7%A3%E5%86%B3%E7%BA%A6%E6%9D%9F-%E8%BD%AF%E5%88%A0%E9%99%A4%E5%86%B2%E7%AA%81/</guid><description>约束&amp;amp;软删除冲突 本咸鱼对数据库方面研究甚少。能存数据就没多考虑其他问题。尤其是在设计方面。都是按照接口或者业务推到一下就好了。 这次考虑一个问题，学习了一个小问题的处理。 就是标题所述 约束与软删除的冲突。
场景问题例子：
一表单 字段为：
|:&amp;ndash;| | id | | name | |&amp;hellip; | | u_number | | deleted_at |
考虑 u_number 唯一问题，添加 约束 UNIQUE。 u_number 是可复用的一些唯一数据。
那么问题来了：
当操作软删除时候，deleted_at (类型 datetime) 填充删除时间后，我理想化数据已经被删除。当 u_number 被其他用户使用插入此表结果是失败的。
解决方式 u_number 因为唯一，导致后续使用此前删除的数据是不可行的，如果直接删前者数据也是不太有B格，不科学的事情。 通过 联合的约束来完善此事，deleted_at 正好是时间， 与其联合使用即解决此事。
约束不再是单一约束 u_number 修改成 u_number,deleted_at。
-OK，完结。-</description></item><item><title>Linux重启后Docker设置自动启动&amp;容器自动启动设置</title><link>https://blog.51ai.vip/posts/linux%E9%87%8D%E5%90%AF%E5%90%8Edocker%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8-%E5%AE%B9%E5%99%A8%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8%E8%AE%BE%E7%BD%AE/</link><pubDate>Mon, 18 May 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/linux%E9%87%8D%E5%90%AF%E5%90%8Edocker%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8-%E5%AE%B9%E5%99%A8%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8%E8%AE%BE%E7%BD%AE/</guid><description>Linux系统重启后Docker自动启动 系统重启后，如果docker没有启动，那么docker下所有的服务就都挂了。 配置过一次总是忘记命令，这里特意记录一下： systemctl enable docker.service
容器自动启动配置 容器配置好自动启动后，当docker运行后，容器也自动启动。这样能保证服务的稳定性。不用再登录到系统来操作各种容易启动问题。 涉及到的参数为： --restart=always
参数有：
no，默认策略，在容器退出时不重启容器
on-failure，在容器非正常退出时（退出状态非0），才会重启容器。例如：on-failure:3，在容器非正常退出时重启容器，最多重启3次
always，在容器退出时总是重启容器
unless-stopped，在容器退出时总是重启容器，但是不考虑在Docker守护进程启动时就已经停止了的容器
容器已存在更新重启配置 可能容器我们已经生成了，后面想实现always这个参数，可以用到下面的命令： docker container update --restart=always 容器名XXX 这样就达到了想要的目的。</description></item><item><title>解决MAC软件提示已损坏或移到废纸篓</title><link>https://blog.51ai.vip/posts/%E8%A7%A3%E5%86%B3mac%E8%BD%AF%E4%BB%B6%E6%8F%90%E7%A4%BA%E5%B7%B2%E6%8D%9F%E5%9D%8F%E6%88%96%E7%A7%BB%E5%88%B0%E5%BA%9F%E7%BA%B8%E7%AF%93/</link><pubDate>Fri, 07 Feb 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E8%A7%A3%E5%86%B3mac%E8%BD%AF%E4%BB%B6%E6%8F%90%E7%A4%BA%E5%B7%B2%E6%8D%9F%E5%9D%8F%E6%88%96%E7%A7%BB%E5%88%B0%E5%BA%9F%E7%BA%B8%E7%AF%93/</guid><description>系统版本 macOS Catalina 10.15.1
方法一
允许任何来源的应用。
系统偏好设置 -&amp;gt; 安全性和隐私： 在 允许从以下位置下载的应用程序 选项中选择 任何来源
在 Sierra 10.12 中可能看不到这个选项，开启此功能需要执行命令sudo spctl --master-disable,
输入密码就可以看到此选项。
方法二
如果上面发法还是打不开，可能需要此方法。
sudo xattr -r -d com.apple.quarantine /Applications/xxxx.app/
这里的x x.app如果你不知道名字，可以通过 应用中查看应用简介中的名称与扩展名,
或者在Applications目录下输入名称补全</description></item><item><title>Mac book pro 终端走代理配置</title><link>https://blog.51ai.vip/posts/mac-book-pro-%E7%BB%88%E7%AB%AF%E8%B5%B0%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE/</link><pubDate>Mon, 20 Jan 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/mac-book-pro-%E7%BB%88%E7%AB%AF%E8%B5%B0%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE/</guid><description>mac 终端走ssr代理 前提是你已经知道怎么使用shadowsocks软件，并且可以出去之后。
看下自己ssr 代理端口号是多少 高级设置看下 本地Socks5监听端口 记住这个端口号。 后面： mac 现在默认终端是用的zsh 编辑 vi ～/.zshrc 在最后加入 //alias 后面的名字自己可以按照习惯定义， 比如我定义proxy 是 ss。 每当我需要时候 ss 一下就可以了。 不需要的时候执行第二句。
//端口按照你的来配置alias unproxy=&amp;#39;unset all_proxy&amp;#39; alias proxy=&amp;#39;export all_proxy=socks5://127.0.0.1:1086&amp;#39; 测试： 首先在没有走ss 的时候， curl cip.cc 得到一个国内的信息。 当使用ss之后， 再通过这个查询就可以看到变化了。
为了便捷，我觉得这个命令也可以设置成别名方式。
设置一个where 每次当我迷茫不知道自己出没出去的时候，就可以 输入where 看下。 alias where='curl cip.cc'</description></item><item><title>Golang 环境准备</title><link>https://blog.51ai.vip/posts/golang-%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87/</link><pubDate>Thu, 16 Jan 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/golang-%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87/</guid><description>安装GOlang 环境:macOS
shell: zsh
安装步骤： brew update &amp;amp;&amp;amp; brew upgrade # 更新 brew install go # 安装 go 配置环境变量 我的本shell 是zsh 下面是按照zsh配置： 如果需要修改默认的环境变量配置修改 vim ~/.bash_profile 或 vim ~/.zshrc # GOROOT安装的路径 export GOROOT=/usr/local/Cellar/go/1.9/libexec #GOPATH root bin export GOBIN=$GOROOT/bin export PATH=$PATH:$GOBIN #GOPATH export GOPATH=$HOME/go #GOPATH bin export PATH=$PATH:$GOPATH/bin 退出保存后，使文件生效 source ~/.zshrc=</description></item><item><title>golang.org/x/xerrors：undefined: errors.Frame</title><link>https://blog.51ai.vip/posts/golang-org-x-xerrorsundefined-errors-frame/</link><pubDate>Thu, 16 Jan 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/golang-org-x-xerrorsundefined-errors-frame/</guid><description>项目初始化遇到问题 错误为：
../go/pkg/mod/golang.org/x/xerrors@v0.0.0-20190410155217-1f06c39b4373/adaptor_go1_13.go:16:14: undefined: errors.Frame ../go/pkg/mod/golang.org/x/xerrors@v0.0.0-20190410155217-1f06c39b4373/format_go1_13.go:12:18: undefined: errors.Formatter exit status 2 exit status 1 通过科普得到一个方法： go get -u golang.org/x/xerrors
问题解决了。</description></item><item><title>yarn install phantomjs-prebuilt: Command failed.</title><link>https://blog.51ai.vip/posts/yarn-install-phantomjs-prebuilt-command-failed/</link><pubDate>Thu, 16 Jan 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/yarn-install-phantomjs-prebuilt-command-failed/</guid><description>项目yarn install 出现phantomjs-prebuilt： Command failed. 自己在项目中发现执行 yarn install时候，一直卡住没走完。
最后报错， error phantomjs-prebuilt： Command failed.
可以看到错误中，他是从 github.com/Medium/&amp;hellip; 感觉就是没下载成功吧。
最开始以为网络问题，翻墙等方式都试过后发现还是没完成。
没办法，借助网络得知。可以轻松搞定：
npm config set phantomjs_cdnurl=http://cdn.npm.taobao.org/dis&amp;hellip; yarn config set &amp;ldquo;phantomjs_cdnurl&amp;rdquo; &amp;ldquo;https://npm.taobao.org/mirrors/phantomjs&amp;quot;
看你是npm 还是node。按照上面方式设置一下。
rm -rf path/node_moudels
yarn install
解决问题，美滋滋。
引用地址</description></item><item><title>MySQL5.7修改root密码</title><link>https://blog.51ai.vip/posts/mysql5-7%E4%BF%AE%E6%94%B9root%E5%AF%86%E7%A0%81/</link><pubDate>Wed, 15 Jan 2020 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/mysql5-7%E4%BF%AE%E6%94%B9root%E5%AF%86%E7%A0%81/</guid><description>最近维护一个MySQL数据库，由于各种原因，密码已经不知道了。现在让我在这台服务器上使用里面的MySQL数据库。
怎么办？
首先问了一圈没有人知道。那么只能靠自己了。
查看软件版本: mysql --version
之后通过神奇的Google科普了一下。 知道了具体的方法：
关闭mysql服务。
修改my.conf 在里面[mysqld] 下面最后加入一行
[mysqld] ... skip-grant-tables 修改完保存退出。
重启mysql服务。
mysql 进入mysql 不需要密码了。
show databases; 查看数据库
use mysql; 选择 mysql 数据库 在此数据库执行更新语句（修改root用户的密码为root）： update user set authentication_string=password('root') where user='root'; flush privileges; 更新权限
退出mysql
把最开始my.conf加入的语句删除。
重启mysql服务
最后可以通过设置的密码登陆数据库了。</description></item><item><title>Prometheus-SNMP_Exporter Generator</title><link>https://blog.51ai.vip/posts/prometheus-snmp-exporter-generator/</link><pubDate>Tue, 24 Dec 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/prometheus-snmp-exporter-generator/</guid><description>Prometheus-SNMP Exporter 生成器从generator.yml读取并写入snmp.yml。
之前在说Prometheus-snmp_export部署时,没有具体提到snmp.yml的生成器是怎么生成的.几乎用的都是github上的snmp.yml文件(只在demo中添加了auth配置).
因为刚好所有通用的指标都取得通用的mib树. 在后期我搜集设备的信息需要一些私有mib的数据,这时候需要自己通过生成器来生成snmp.yml.
Generator 的操作步骤 下载需要的程序(Docker方式跳过此步骤) # Debian-based distributions. sudo apt-get install unzip build-essential libsnmp-dev # Debian-based distros # Redhat-based distributions. sudo yum install gcc gcc-g++ make net-snmp net-snmp-utils net-snmp-libs net-snmp-devel # RHEL-based distros go get github.com/prometheus/snmp_exporter/generator cd ${GOPATH-$HOME/go}/src/github.com/prometheus/snmp_exporter/generator go build make mibs(不建议直接make) 这里直接make mibs 可能会失败,在make文件里设置的源有些已经不能访问了或执行出现错误.
我建议先下载好mibs ,我已经上传github.
建议自行搜集mib 不执行make mibs会方便一些
把所有的mib放入mibs 目录下.
需要准备好所有需要涉及到的mib文件. 除了公有的mib,我们还需要监控目标设备的私有mib.思科/华为之类的会提供这些mib,像锐捷这种需要和商务部联系.
一些mib:
https://github.com/netdisco/netdisco-mibs
https://github.com/pgmillon/observium/tree/master/mibs
https://github.com/librenms/librenms/tree/master/mibs
当我们准备好所有的mib后,需要编写一个generator.yml. 下面是一个翻译的官方文档(翻译比较烂,自行查阅[原文]([https://github.com/prometheus/snmp\_exporter/tree/master/generator](https://github.com/prometheus/snmp\_exporter/tree/master/generator))):
modules: module_name: # 模块名称。您可以根据需要拥有任意数量的模块。 walk: # 要walk的OID列表。 也可以是SNMP对象名称或特定实例。 - 1.</description></item><item><title>Prometheus告警模板详解</title><link>https://blog.51ai.vip/posts/prometheus%E5%91%8A%E8%AD%A6%E6%A8%A1%E6%9D%BF%E8%AF%A6%E8%A7%A3/</link><pubDate>Wed, 04 Dec 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/prometheus%E5%91%8A%E8%AD%A6%E6%A8%A1%E6%9D%BF%E8%AF%A6%E8%A7%A3/</guid><description>目的 之前配置告警之后,可以发送告警信息.但对于数据具体的结构信息,在模板中数据读取都比较懵.原因是不太清除警报都提供了哪些数据,除了我们设置的信息,还有没有其他的信息.
告警数据结构 官方docs
推送数据结构:
Alerts数据 KV数据的处理方式 KV结构很简单,键值对.通过键获取对应的值.下面提供了一些方法处理这种结构的一些方法.
字符串相关方法 警报提供的数据是通过GO模板解析的,GO模板的功能通过GO模板文档可以了解.
下面提供了一些处理字符串的方法:
微信通知的DEMO 上图中是微信接受的通知,下面展示通知模板的代码.
{{- define &amp;#34;_alert_list&amp;#34; -}} {{- range .Alerts.Firing -}} ----------------------- 告警类型：{{ .Labels.alertname }} 告警主题: {{ .Annotations.summary }} 告警详情: {{ .Annotations.description }} 触发时间: {{ (.StartsAt.Add 28800e9).Format &amp;#34;2006-01-02 15:04:05&amp;#34; }} {{ end -}} ---------结束----------------- {{- end -}} {{- define &amp;#34;_resolve_list&amp;#34; -}} {{- range .Alerts.Resolved -}} ************************** 告警类型：{{ .Labels.alertname }} 告警主题: {{ .Annotations.summary }} 告警详情: {{ .Annotations.description }} 触发时间: {{ (.StartsAt.Add 28800e9).</description></item><item><title>Prometheus标签处理&amp;服务发现</title><link>https://blog.51ai.vip/posts/prometheus%E6%A0%87%E7%AD%BE%E5%A4%84%E7%90%86-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/</link><pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/prometheus%E6%A0%87%E7%AD%BE%E5%A4%84%E7%90%86-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/</guid><description>标签处理的重要性 之前的[配置](https://blog.51ai.vip/2019/10/09/prometueus-yml%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E/中提到了标签的处理,不过由于写的是静态的配置,标签可以自己设置或者不设置都可以.
当使用服务发现之后发现标签处理的重要性提升了更高的级别.
标签处理 - job_name: &amp;#39;node&amp;#39; static_configs: - targets: [&amp;#39;172.16.23.110:9100&amp;#39;,&amp;#39;172.16.23.111:9100&amp;#39;] metric_relable_configs: #通过正则重命名标签 - action: replace #replace替换是默认动作。keep（只参加匹配标签的实例）、drop（不采集匹配正则的实例）、labelkeep\labeldrop(对标签进行过滤处理而非实例)等动作 source_labels: [&amp;#39;job&amp;#39;] #原标签，job是默认就会产生的标签，这里job标签的值是node regex: (.*) #正则匹配，这里匹配job标签内的内容，也就是node replacement: beijing #替换成什么内容，如果写$1就是将正则里读取的值 target_label: idc #把替换内容赋值给idc标签 - action: labeldrop #删除标签 regex: job #把原job标签删除 - job_name: &amp;#39;prometheus&amp;#39; static_configs: - targets: [&amp;#39;localhost:9090&amp;#39;] labels: location: bj3 relabel_configs: - action: replace source_labels: [&amp;#39;job&amp;#39;] regex: (.*) replacement: $1 target_label: server 以上两个例子都是替换标签,job:node中,删除了前job标签,下面的job新增了&amp;rsquo;server&amp;rsquo;标签内容取的job内容,但没删除job标签.
通过标签我们组成多维模型.可以对标签重命名,删除,过滤信息等.
服务发现 之前配置中的静态配置需要一个一些写配置,设备或者服务多的时候容易头大.
这里可以通过服务发现简化手动配置工作.
Prometheus支持多种服务发现机制,例如: consul、dns、openstack、file、kubernetes等.
这里举例file.比较简单的方式.
file机制中:需要提供文件来获取内容.文件格式为YAML 或 JSON格式.
prometheus配置:</description></item><item><title>M3DB笔记</title><link>https://blog.51ai.vip/posts/m3db%E7%AC%94%E8%AE%B0/</link><pubDate>Fri, 29 Nov 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/m3db%E7%AC%94%E8%AE%B0/</guid><description>M3DB笔记 前阵子研究prometheus,初期没有考虑存储问题.本地默认存储30天数据.
监控已经折腾完毕,现在需要来处理存储的方案.
通过互联网的科普,发现目前有两个方案可以解决这个问题.
thanos
M3DB
thanos是需要存储云端数据(本地存储官方不推荐).不符合我们的考虑范围内.那就来学习M3DB了.
简介 M3可以在较长的保留时间内可靠地存储大规模指标。为了向更广泛的社区中的其他人提供这些好处，我们决定开放M3平台作为Prometheus的远程存储后端，Prometheus是一种流行的监控和警报解决方案。正如其文档所述，Prometheus的可扩展性和耐用性受到单个节点的限制。 M3平台旨在为Prometheus指标提供安全，可扩展且可配置的多租户的存储。
M3于2015年发布，目前拥有超过66亿个时间序列。 M3每秒聚合5亿个指标，并在全球范围内（使用M3DB）每秒持续存储2000万个度量指标，批量写入将每个指标持久保存到区域中的三个副本。它还允许工程师编写度量策略，告诉M3以更短或更长的保留时间（两天，一个月，六个月，一年，三年，五年等）以特定的粒度（一秒，十秒，一分钟，十分钟等）。这允许工程师和数据科学家使用与定义的存储策略匹配的度量标签（标签），在精细和粗粒度范围内智能地存储不同保留的时间序列。例如，工程师可以选择存储“应用程序”标记为“mobile_api”且“端点”标记为“注册”的所有度量标准，这些标记在10秒粒度下为30天，在一小时粒度下为5年。
相关组件 M3 Coordinator M3 Coordinator是一种服务，用于协调上游系统（如Prometheus和M3DB）之间的读写操作。它还提供了管理API，用于设置和配置M3的不同部分。它是用户可以部署以访问M3DB的优势的桥梁，例如长期存储和与其他监控系统（如Prometheus）的多DC设置。
M3DB M3DB是一个分布式时间序列数据库，提供可扩展存储和时间序列的反向索引。它经过优化，具有成本效益和可靠的实时和长期保留指标存储和索引
M3 Query M3 Query是一种服务，它包含一个分布式查询引擎，用于查询实时和历史指标，支持多种不同的查询语言。它旨在支持低延迟实时查询和可能需要更长时间执行的查询，聚合更大的数据集，用于分析用例
M3 Aggregator M3 Aggregator是一种作为专用度量聚合器运行的服务，它基于存储在etcd中的动态规则提供基于流的下采样。它使用领导者选举和聚合窗口跟踪，利用etcd来管理此状态，从而可靠地为低采样度量标准发送至少一次聚合到长期存储。这提供了成本有效且可靠的下采样和汇总指标。这些功能也存在于M3协调器中，但专用聚合器是分片和复制的，而M3协调器则不需要并且需要谨慎部署和以高可用性方式运行。还有一些工作要使用户更容易访问聚合器，而无需他们编写自己的兼容生产者和消费者。
入门 上面的组件通俗讲:
prometheus 需要通过M3 Coordinator来协调存储与查询到M3DB,prometheus本地存储数据时间与这个没关系.
上面没有提到一个名字etcd服务.此服务推断拓扑\配置功能. 如果db嵌入此服务就称为种子节点SeedNode.
官方提供了一个镜象,里面包含 M3 Coordinator + SeedNode.
拉取镜象:docker pull quay.io/m3db/m3dbnode:latest
启动名为m3db容器:docker run -d -p 7201:7201 -p 7203:7203 -p 9003:9003 --name m3db -v $(pwd)/m3db_data:/var/lib/m3db quay.io/m3db/m3dbnode:latest
该容器的端口为7201（用于管理集群拓扑），端口为7203，Prometheus用来刮除M3DB和M3Coordinator生成的度量，端口9003（用于读取和写入度量）已公开。
这时候m3db已经启动,需要创建一个初始命名空间.官方镜象默认是type:local,namespace:default. 这个可以进入容器查看到配置位置/etc/d3dbnode/m3dbnode.yml.如果我们创建其他命名空间需要在m3coordinator中配置好.
curl -X POST http://localhost:7201/api/v1/database/create -d '{ &amp;quot;type&amp;quot;: &amp;quot;local&amp;quot;, &amp;quot;namespaceName&amp;quot;: &amp;quot;default&amp;quot;, &amp;quot;retentionTime&amp;quot;: &amp;quot;24h&amp;quot; }'</description></item><item><title>网络传输速度测试工具</title><link>https://blog.51ai.vip/posts/%E7%BD%91%E7%BB%9C%E4%BC%A0%E8%BE%93%E9%80%9F%E5%BA%A6%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/</link><pubDate>Wed, 23 Oct 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E7%BD%91%E7%BB%9C%E4%BC%A0%E8%BE%93%E9%80%9F%E5%BA%A6%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/</guid><description>网络传输测试软件 最近公司测试限速,搜集软件发现两款,iperf,LANSpeedTest. iperf,多平台. LANSpeedTest,读写显示,操作简单. 局域网测试传输,优先考虑UDP.
iperf Iperf可以报告带宽,延迟抖动和数据包丢失. 官方文档 安装不写了.跳过
iperf常用参数介绍
-i 2 #表示每2秒显示一次报告 -w 80k #对于TCP方式，此设置为TCP窗口大小。对于UDP方式，此设置为接受UDP数据包的缓冲区大小，限制可以接受数据包的最大值 -B 192.168.122.1 #绑定到主机的多个地址中的一个。对于客户端来说，这个参数设置了出栈接口。对于服务器端来说，这个参数设置入栈接口。这个参数只用于具有多网络接口的主机。 #在Iperf的UDP模式下，此参数用于绑 定和加入一个多播组。使用范围在224.0.0.0至239.255.255.255的多播地址 #常用客户端参数 -b 100m #用于udp测试时，设置测试发送的带宽，单位：bit/秒，不设置时默认为：1Mbit/秒 -c #指定服务端ip地址 -d #同时测试上行和下行 -t 10 #设置传输时间，为10秒 -P 5 #指定发起5个线程 UDP测试 服务端 iperf -u -s # -u表示以udp模式运行，-s表示作为服务端, 这里需要设置ip 客户端 iperf -u -c 192.168.100.11 -b 100M -t 60 -i 2 #解释：在udp模式下，以100Mbps为数据发送速率，客户端到服务器192.168.100.11上传带宽测试，测试时间为60秒 iperf -u -c 192.168.100.11 5M -P 30 -t 6 #客户端同时向服务器端发起30个连接线程，以5Mbps为数据发送速率 iperf -u -c 192.168.100.11 -b 100M -d -t 60 #以100M为数据发送速率，进行上下行带宽测试 TCP测试 服务端 iperf -s 客户端 iperf -c 192.</description></item><item><title>Prometheus-AlertManager警告管理搭建与配置</title><link>https://blog.51ai.vip/posts/prometheus-alertmanager%E8%AD%A6%E5%91%8A%E7%AE%A1%E7%90%86%E6%90%AD%E5%BB%BA%E4%B8%8E%E9%85%8D%E7%BD%AE/</link><pubDate>Sat, 19 Oct 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/prometheus-alertmanager%E8%AD%A6%E5%91%8A%E7%AE%A1%E7%90%86%E6%90%AD%E5%BB%BA%E4%B8%8E%E9%85%8D%E7%BD%AE/</guid><description>AlertManager AlertManager处理由客户端应用程序（如Prometheus服务器）发送的警报。 它负责重复数据消除、分组，并将它们路由到正确的接收器集成（如电子邮件、PagerDuty或OpsGenie）。 它还负责消除和抑制警报。
通过翻译官方文档可以了解到,AlertManager是负责为Prometheus(本身不会发送警报)发送警报的工具. AlertManager不是简单发送警报,可以消除重复警报,分组,抑制警报功能.并支持多接收器.
Prometheus-&amp;gt;触发定义的警报规则-&amp;gt;AlertManager-&amp;gt;发送警报到指定通知渠道.
为了能让Prometheus发送警报,我们需要:
搭建AlertManager服务. 定义AlertManager通知配置. 定义Prometheus警报规则并引入. 测试警报. 定义通知模板. 定义AlertManager通知配置 global: smtp_smarthost: &amp;#39;smtp.163.com:25&amp;#39; # 邮箱smtp服务器代理 smtp_from: &amp;#39;shitu-0071@163.com&amp;#39; # 发送邮箱名称 resolve_timeout: 5m # 处理超时时间，默认为5min smtp_auth_username: &amp;#39;shitu-0071@163.com&amp;#39; # 邮箱帐户 smtp_auth_password: &amp;#39;******&amp;#39; # 邮箱授权码(注意是授权码,不知道自己查一下) wechat_api_url: &amp;#39;https://qyapi.weixin.qq.com/cgi-bin/&amp;#39; # 企业微信地址 # 定义模板信心 templates: - &amp;#39;template/*.tmpl&amp;#39; # 定义路由树信息 route: group_by: [&amp;#39;alertname&amp;#39;, &amp;#39;cluster&amp;#39;, &amp;#39;service&amp;#39;] # 报警分组依据,设置后会按照设定值分组,例如instance,alertname等 # 同标签警告会在作为一组警报发送 group_wait: 10s # 组内等待时间,触发阈值后,XXs后发送本组警报 group_interval: 10s # 每个组之前间隔时间(group_by设定的值划分的组) repeat_interval: 1m # 重复发送警报的周期 (对于email配置中，此项不可以设置过低，否则将会由于邮件发送太多频繁，被smtp服务器拒绝) receiver: &amp;#39;email&amp;#39; # 发送警报的接收者的名称 # 以下receivers name的名称 routes: - match: # 普通匹配 serverity: critical # 警告级别critical receiver: email # 通过邮件发送 - match_re: # 正则匹配 severity: ^(warning)$ # 匹配警告级别为warning的 receiver: wechat # 通过微信发送告警 - receiver: along # 定义接收者 match: # 匹配 severity: test # 等级为test # 定义警报接收者信息 receivers: - name: &amp;#39;email&amp;#39; # 警报 email_configs: # 邮箱配置 - to: &amp;#39;******@163.</description></item><item><title>windows10家庭版启用组策略gpedit.msc</title><link>https://blog.51ai.vip/posts/windows10%E5%AE%B6%E5%BA%AD%E7%89%88%E5%90%AF%E7%94%A8%E7%BB%84%E7%AD%96%E7%95%A5gpedit-msc/</link><pubDate>Tue, 15 Oct 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/windows10%E5%AE%B6%E5%BA%AD%E7%89%88%E5%90%AF%E7%94%A8%E7%BB%84%E7%AD%96%E7%95%A5gpedit-msc/</guid><description>启用组策略gpedit.msc 家庭版很多功能不能使用,凑巧用的就是家庭版. 还想使用gpedit.msc来关闭windows10的更新. 找到一个可行的方法.
需要创建一个脚本. 如果你没有编辑器,那么可以创建一个文本文档. 复制下面一段到本文中. @echo off pushd &amp;#34;%~dp0&amp;#34; dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum &amp;gt;List.txt dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum &amp;gt;&amp;gt;List.txt for /f %%i in (&amp;#39;findstr /i . List.txt 2^&amp;gt;nul&amp;#39;) do dism /online /norestart /add-package:&amp;#34;C:\Windows\servicing\Packages\%%i&amp;#34; pause 如果编辑器直接复制一个文档另存到XX.cmd 即可. 如果是文本文档那么就是把后缀的.txt改成.cmd. 管理员身份运行这个脚本.等他走完会退出,win+r 即可使用gpedit.msc了. 美滋滋!~ 禁用windows10更新 win+r 输入gpedit.msc. “本地计算机策略”-“计算机配置”-“管理模板”-“Windows组件”-“Windows 更新”-“配置自动更新”. 点击配置自动更新设置为禁用</description></item><item><title>curl: (3) Illegal characters found in URL</title><link>https://blog.51ai.vip/posts/curl-3-illegal-characters-found-in-url/</link><pubDate>Wed, 09 Oct 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/curl-3-illegal-characters-found-in-url/</guid><description>curl: (3) Illegal characters found in URL 昨天在服务器上执行一个脚本,在linux新建的sh,把本地编辑器的内容粘贴到文件里. 结果执行的时候报错了. 问题就是 curl:(3)Illegal characters found in URL
看着一脸懵逼啊!~
google了一下,看到几个方法.其中一个我感觉还不错:
首先vi 进入sh脚本 vi XXX.sh :set ff? # 这里我现实的是 fileforma=dos 我这里显示是这个 :set fileformat=unix # 把fileforma 设置好 :wq 通过这个方式,可以解决这个问题,网上也有人提出其他方法把\r\n 手动替换\n的.
参考: http://www.itbiancheng.com/linux/4885.html</description></item><item><title>Prometueus.yml配置文件说明</title><link>https://blog.51ai.vip/posts/prometueus-yml%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E/</link><pubDate>Wed, 09 Oct 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/prometueus-yml%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E/</guid><description>整体配置 prometueus.yml 配置文件注解与说明
global: # 全局配置 scrape_interval: 15s # 默认值为 1m，用于设置每次数据收集的间隔 scrape_timeout: 10s # 默认10s,收集超时时间 evaluation_interval: 15s # 记录规则/告警的执行周期 默认1m external_labels: # 时间序列和警告与外部通信(远程存储/警报灯)时用的外部标签 monitor: &amp;#39;ctmonitor&amp;#39; rule_files: # 指定告警规则文件&amp;amp;记录文件 - &amp;#34;/usr/local/prometheus/rules.yml&amp;#34; alerting: # 告警管理配置 alert_relable_configs: # 修改告警内容 - alertmanagers: # 告警管理起配置 - static_configs: # 静态配置 - targets: # 警告器地址 - 172.16.23.12:9093 # 用于配置 scrape 的 endpoint 配置需要 scrape 的 targets 以及相应的参数 # 抓取(pull)，即监控目标配置。默认只有主机本身的监控配置 scrape_configs: # 抓取配置选项 - job_name: prometheus # 默认情况下分配给刮削度量的作业名称。 scrape_interval: 5s # 从这项工作中获取目标的频率。 scrape_timeout: 3s # 每次获取超时时间 honor_timestamps: true # 默认false, 在获取时是否使用当前的时间戳 metrics_path: /metrics # 从目标获取度量的http资源路径。 scheme: http # static_configs: # 为此作业标记的静态配置目标的列表。 - targets: # 目监控标 - 172.</description></item><item><title>yaml规则</title><link>https://blog.51ai.vip/posts/yaml%E8%A7%84%E5%88%99/</link><pubDate>Tue, 24 Sep 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/yaml%E8%A7%84%E5%88%99/</guid><description>yml 语法 最近经常配置一些服务，发现大部分都是yml类型文件。小记一下。
规则 大小写敏感 缩进表示层级 注释 # 结构： 对象： ：符号
name: admin 数组： - 符号
user: - name: admin - height: 178 - age: 30 字符串： 默认无引号，内部含有空格或特殊符号需要加''
name: admin desc: &amp;#39;he was cool&amp;#39; null： ~
value: ~ 层级依靠缩进：
job: - jobconfig: name: &amp;#39;snmp-sw01&amp;#39; - target: - 192.168.1.88</description></item><item><title>Grafana中文化</title><link>https://blog.51ai.vip/posts/grafana%E6%B1%89%E5%8C%96/</link><pubDate>Mon, 16 Sep 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/grafana%E6%B1%89%E5%8C%96/</guid><description>可视化图表 Grafana是一个通用的可视化工具。通过Grafana可以管理用户权限，数据分析，查看，导出，设置告警等。
仪表盘Dashboard 通过数据源定义好可视化的数据来源之后，对于用户而言最重要的事情就是实现数据的可视化。
面板 Panel Panel是Grafana中最基本的可视化单元。每一种类型的面板都提供了相应的查询编辑器(Query Editor)，让用户可以从不同的数据源（如Prometheus）中查询出相应的监控数据，并且以可视化的方式展现。 Grafana中所有的面板均以插件的形式进行使用，当前内置了5种类型的面板，分别是：Graph，Singlestat，Heatmap, Dashlist，Table以及Text。
翻译工作 上面简单介绍了一下工具，主要是让我们方便查看监控的数据。这里我还是没有更深入的去研究公式等图形的设置。这里先主要写一下翻译方面的工作。
公司也考虑展示内容为中文化比较好，这里Grafana没有提供语言包的方式来处理多语言问题。在我查看代码过程中，发现工具后台是在GO里面写死的很多导航，返回值等数据。前台是在页面上直接写的很多内容。所以我个人认为无法使用语言包来直接处理多语言问题。那就只好自己来搞定了。
翻译的内容 更具代码查看，主要分为两大部分：
后端： go文件，主要内容在/pkg 目录下。 前端： 1. 系统页面 2. 插件页面 这些在/public 目录下 准备工作 首先git clone Grafana库 git clone https://github.com/chenweil/grafana.git
之后我们根据自己翻译的版本来检出自己的项目。 这里我们使用的v6.3.4 ，官方版本中可以查看到tag v6.3.4,并重命名自己的分支为6.3.4-chs： git checkout -b 6.3.4-chs
通过 git branch 命令查看自己处于哪个分支上。 这里如果你不是很熟悉git命令行，可以使用sourcetree工具操作，相对来说点点鼠标就可以搞定了。
我们在自己创建的分支就可以来处理我们的工作了。
前端调试环境 需要 npm，nodejs，yarn
终端执行命令 yarn install --pure-lockfile 初始化. 如果没有报错的情况,证明ok.
出现错误请先处理问题. 开启调试环境时候，是开启前端的热加载来协助我们调试。 这里安装完三个环境可能在执行 yarn start 时报错，这里如果你是在windows上，需要再安装一下sass.(根据报错来看问题，我这里遇到缺少sass问题)
当我们yarn start 执行后，等待一段时间，build at 时间证明准备工作已完成，下面就需要我们在调试模式下测试了。
还需要一个调试的Grafana服务程序，这里是windows环境，所以直接从官方下载了zip包，执行bin下的grafana-server.exe 来启动服务。需要再conf文件夹修改一下public前端资源的配置，如果不修改那么你翻译的信息是看不到的，服务会直接读取的当前的public，我们这需要读取翻译的public文件位置。
配置在windows服务程序的 /conf/defaults.ini 修改内容：</description></item><item><title>Centos7安装nodejs</title><link>https://blog.51ai.vip/posts/centos7%E5%AE%89%E8%A3%85nodejs/</link><pubDate>Mon, 02 Sep 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/centos7%E5%AE%89%E8%A3%85nodejs/</guid><description>安装nodejs 下载官方node的tar包: https://nodejs.org/en/download/
wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz
解压下载文件 tar -xvf node-v10.16.3-linux-x64.tar.xz
部署bin 这里下载位置为家里面 ~/
ln -s ~/node-v10.16.3-linux-x64/bin/node /usr/bin/node
ln -s ~/node-v10.16.3-linux-x64/bin/npm /usr/bin/npm
一个是node 另一个是npm
验证 node -v npm -v</description></item><item><title>Prometheus-snmp_export部署</title><link>https://blog.51ai.vip/posts/prometheus-snmp-export%E9%83%A8%E7%BD%B2/</link><pubDate>Thu, 29 Aug 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/prometheus-snmp-export%E9%83%A8%E7%BD%B2/</guid><description>SNMP SNMP(simple network management protocol)是因特网架构委员会IAB定义的一个应用层协议。SNMP广泛用于管理和监控网络设备，大多数专业的网络设备都有SNMP agent代理，这些代理被激活和配置后用于和SNMP管理 NMS(network management system)网络管理系统通信。
目的 通过snmp_export,获取设备信息.
准备 系统: centos7,docker19. 之前已经安装好 Prometheus
此处目标设备是华为交换机 s2700
部署snmp_expoer snmp.yml 配置文件不是自己定义的,是通过注册生成或下载的.这里我通过github下载配置文件.
snmp.yml
配置snmp_export 配置文件 snmp.yml version: 2 auth: community: **交换机设置的团体名** 查找到if_mib 再此段结尾中加入 上面的配置(大概行数6199).
部署snmp_expor docker run -d --restart always \ -v /home/along/snmp.yml:/etc/snmp_exporter/snmp.yml \ -p 9116:9116 --name snmp-exporter prom/snmp-exporter \ --config.file=&amp;#34;/etc/snmp_exporter/snmp.yml&amp;#34; 配置华为s2700交换机 自行查阅文档.懒得写了.
验证服务 访问 http://IP:9116/metrics 能返回数据,snmp_export服务正常.
测试是否能获取到目标设备的数据: 访问 http://IP:9116/snmp?target=DEVIP 能获取到数据,配置成功.
注意防火墙 把需要的端口加入规则中,不然访问不到排查绕弯路
配置promthues 修改 promthues.yml文件. 添加一个新的job.
- job_name: snmp honor_timestamps: true params: module: - if_mib scrape_interval: 15s scrape_timeout: 10s metrics_path: /snmp scheme: http static_configs: - targets: - 172.</description></item><item><title>Prometheus+Grafana安装搭建</title><link>https://blog.51ai.vip/posts/prometheus-grafana%E5%AE%89%E8%A3%85%E6%90%AD%E5%BB%BA/</link><pubDate>Wed, 28 Aug 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/prometheus-grafana%E5%AE%89%E8%A3%85%E6%90%AD%E5%BB%BA/</guid><description>介绍 Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发，是Google BorgMon监控系统的开源版本。 2016年由Google发起Linux基金会旗下的原生云基金会(Cloud Native Computing Foundation), 将Prometheus纳入其下第二大开源项目。Prometheus目前在开源社区相当活跃。 Prometheus和Heapster(Heapster是K8S的一个子项目，用于获取集群的性能数据。)相比功能更完善、更全面。Prometheus性能也足够支撑上万台规模的集群。
Prometheus的特点:
多维度数据模型。 灵活的查询语言。 不依赖分布式存储，单个服务器节点是自主的。 通过基于HTTP的pull方式采集时序数据。 可以通过中间网关进行时序列数据推送。 通过服务发现或者静态配置来发现目标服务对象。 支持多种多样的图表和界面展示，比如Grafana等。 架构图 Prometheus服务大致过程： Prometheus 定时去目标上抓取metrics(指标)数据，每个抓取目标需要暴露一个http服务的接口给它定时抓取。Prometheus支持通过配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup等方式指定抓取目标。Prometheus采用PULL的方式进行监控，即服务器可以直接通过目标PULL数据或者间接地通过中间网关来Push数据。
Prometheus在本地存储抓取的所有数据，并通过一定规则进行清理和整理数据，并把得到的结果存储到新的时间序列中。
Prometheus通过PromQL和其他API可视化地展示收集的数据。Prometheus支持很多方式的图表可视化，例如Grafana、自带的Promdash以及自身提供的模版引擎等等。Prometheus还提供HTTP API的查询方式，自定义所需要的输出。
PushGateway支持Client主动推送metrics到PushGateway，而Prometheus只是定时去Gateway上抓取数据。
Alertmanager是独立于Prometheus的一个组件，可以支持Prometheus的查询语句，提供十分灵活的报警方式。
Prometheus 支持通过SNMP协议获取mertics数据.通过配置job,利用snmp_export读取设备监控信息.
指标(Metric)类型 Counter 计数器,从数据0开始累计计算. 理想状态会永远增长. 累计计算请求次数等 Gauges 瞬时状态的值. 可以任意变化的数值，适用 CPU 使用率 温度等 Histogram 对一段时间范围内数据进行采样，并对所有数值求和与统计数量、柱状图. 某个时间对某个度量值，分组，一段时间http相应大小，请求耗时的时间。 Summary 同样产生多个指标，分别带有后缀_bucket(仅histogram)、_sum、_count Histogram和Summary都可以获取分位数。 通过Histogram获得分位数，要将直方图指标数据收集prometheus中， 然后用prometheus的查询函数histogram_quantile()计算出来。 Summary则是在应用程序中直接计算出了分位数。 Histograms and summaries中阐述了两者的区别，特别是Summary的的分位数不能被聚合。 注意，这个不能聚合不是说功能上不支持，而是说对分位数做聚合操作通常是没有意义的。 LatencyTipOfTheDay: You can’t average percentiles. Period中对“分位数”不能被相加平均的做了很详细的说明：分位数本身是用来切分数据的，它们的平均数没有同样的分位效果。
主要我们监控用到最上面两种,下面两种类型目前我没有接触,上面这段文字与介绍引用自lijiaocn
安装Prometheus 本次搭建利用docker方式.整体搭建完成需要两个容器.暂不配置告警相关,只做监控数据
前提 搭建位置: /home/aLong/prometheus/
环境:docker19.03.1 需要指定版本请查阅官方文档.
系统:centos7
准备工作 Prometheus的配置文件: prometheus.</description></item><item><title>Centos5不升级内核更新</title><link>https://blog.51ai.vip/posts/centos5%E4%B8%8D%E5%8D%87%E7%BA%A7%E5%86%85%E6%A0%B8%E6%9B%B4%E6%96%B0/</link><pubDate>Fri, 23 Aug 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/centos5%E4%B8%8D%E5%8D%87%E7%BA%A7%E5%86%85%E6%A0%B8%E6%9B%B4%E6%96%B0/</guid><description>前提 公司需要环境Centos5, 又不能升级内核.
查了一下 大概是 需要 yum –exclude=kernel* update 或者修改 yum.conf
测试一下 出现一个问题: Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile YumRepo Error: All mirror URLs are not using ftp, http[s] or file. Eg. Invalid release/ removing mirrorlist with no valid mirrors: /var/cache/yum/base/mirrorlist.txt Error: Cannot find a valid baseurl for repo: base 根据查询到的信息是,没有正常的源.
解决问题 根据网上的源地址 修改一下: 位置: /etc/yum.repos.d/CentOS-Base.repo
修改内容: [base] name=CentOS-5.11 - Base #mirrorlist=http://mirrorlist.centos.org/?release=5.11&amp;amp;arch=$basearch&amp;amp;repo=os baseurl=http://vault.centos.org/5.11/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5 #released updates [updates] name=CentOS-5.</description></item><item><title>Laradock安装与使用</title><link>https://blog.51ai.vip/posts/laradock%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8/</link><pubDate>Thu, 15 Aug 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/laradock%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8/</guid><description>Laradock 安装与使用 官网
GitHub: https://github.com/laradock/laradock
要求 Git Docker &amp;gt;= 17.12 项目的位置 已有项目情况: git submodule add https://github.com/Laradock/laradock.git 克隆到项目根目录. 结构 :
project-a laradock-a project-b laradock-b 没有项目情况: git clone https://github.com/laradock/laradock.git 克隆后,在同级部署项目. laradock project-x project-y 启动环境 clone下来还没有生成.
进入laradock目录,编辑Web服务器站点配置. cp env-exalpme .env 环境是laradock环境,里面可以对相应的版本,配置进行修改. 例如指定mysql版本为5.7 ,vim .env ,搜索到mysql部分, 修改MYSQL_VERSION=5.7.26 保存退出.(这里还没生成容器前可以统一配置好需要的环境,再生成容器.)
例如我们需要启动环境需要 mysql,redis,nginx.
执行 docker-compose up -d nginx mysql redis
经过漫长等待后,可以得到我们想要的环境,通过 docker ps 或者 docker-compose ps 查看容器.
如果先生成容器,在之后编辑环境时,需要停掉容器,修改完 build之后 再start 容器. 例如修改nginx:
docker-compose stop nginx 修改.env 或者 nginx conf docker-compose build nginx (完全重建,加参数: &amp;ndash;no-cache) docker-compose start nginx Nginx 配置项目 我们再laradock中,进入nginx/sites/ 下.</description></item><item><title>SwitchHosts管理编辑hosts工具</title><link>https://blog.51ai.vip/posts/switchhosts%E7%AE%A1%E7%90%86%E7%BC%96%E8%BE%91hosts%E5%B7%A5%E5%85%B7/</link><pubDate>Wed, 14 Aug 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/switchhosts%E7%AE%A1%E7%90%86%E7%BC%96%E8%BE%91hosts%E5%B7%A5%E5%85%B7/</guid><description>管理Hosts工具 SwitchHosts 地址: SwitchHosts
开发工程中,针对不同项目设置不同的域名.
办法很多,例如直接编辑hosts文件,通过环境工具提供的功能设置等.
现在要安利一款便捷实用的工具. SwitchHosts!!
为什么,首先这工具是多平台支持的,我们可以在不同系统中使用.如果之前是靠编辑hosts文件的话,那不同的hosts位置还需要记忆一下,当然这也算不了什么难事.
他的有点不在于能简单编辑hosts文件,也有之前的记录,还可以通过url来读取云端的hosts信息.导入导出功能等. 总之又可以偷懒了.
主界面:
我们可以编辑不同host 分组,使用时打开开关按钮即可使用.
示例中使用的My hosts中的配置
配置界面:
支持中文,主题黑白两色.</description></item><item><title>VMware安装MacOS系统</title><link>https://blog.51ai.vip/posts/vmware%E5%AE%89%E8%A3%85macos%E7%B3%BB%E7%BB%9F/</link><pubDate>Mon, 12 Aug 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/vmware%E5%AE%89%E8%A3%85macos%E7%B3%BB%E7%BB%9F/</guid><description>虚拟机安装 macOS 准备工作: VM关闭进程,利用macOS Unlocker修改VM使其能安装macOS系统, 执行程序 win-install.cmd 使用管理员权限运行脚本. 准备好macOS镜象. 利用VM创建虚机,系统类型选择macOS,版本号选择与下载的镜象版本相同. 装系统: 启动虚拟机,并通过cdrom加载镜象. 首次安装需要先利用系统内硬盘工具格式化硬盘,之后利用安装工具进行系统安装. 异常问题: 开启虚拟机弹出错误:vcpu-0 错误. 修改虚机镜象文件.vmx 在smc.present = “TRUE”下面插入一行代码: smc.version = 0
不能正常登陆APPID 需要修改虚拟机,利用Chameleon Wizard 伪造设备信息. 保存 生成的信息 去修改镜象所在文件下的.vmx
修改 board-id.reflectHost = &amp;ldquo;TRUE&amp;rdquo; 为FALSE,并在下面插入需要的伪造设备信息例子:
board-id = &amp;ldquo;Mac-94245B3640C91C81&amp;rdquo; hw.model.reflectHost = &amp;ldquo;FALSE&amp;rdquo; hw.model = &amp;ldquo;MacBook Pro&amp;rdquo; serialNumber.reflectHost = &amp;ldquo;FALSE&amp;rdquo; serialNumber = &amp;ldquo;C02JJ8B3DH2G&amp;rdquo; smbios.reflectHost = &amp;ldquo;FALSE&amp;rdquo;
这段信息中的board-id 与 serialNumber 不要与例子的相同.其他可以参考.最后保存,重启.
重启之后尝试是否可以登陆市场.</description></item><item><title>数据库迁移</title><link>https://blog.51ai.vip/posts/laravel5%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB/</link><pubDate>Fri, 26 Jul 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/laravel5%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%81%E7%A7%BB/</guid><description>Laravel5 数据库迁移笔记 创建迁移文件 命令: make:migration
举例: php artisan make:migration create_users_table --create=users
生成位置: 项目/database/migrations/下 文件名已时间开头,后面是自己创建迁移文件名字.
&amp;ndash;creat 指定数据库中表的名字
编辑迁移文件 打开迁移文件:
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create(&amp;#39;users&amp;#39;, function (Blueprint $table) { $table-&amp;gt;bigIncrements(&amp;#39;id&amp;#39;); $table-&amp;gt;string(&amp;#39;name&amp;#39;); $table-&amp;gt;string(&amp;#39;email&amp;#39;)-&amp;gt;unique(); $table-&amp;gt;timestamp(&amp;#39;email_verified_at&amp;#39;)-&amp;gt;nullable(); $table-&amp;gt;string(&amp;#39;password&amp;#39;); $table-&amp;gt;rememberToken(); $table-&amp;gt;timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists(&amp;#39;users&amp;#39;); } } 文件中有两个方法,up/down .</description></item><item><title>Composer笔记</title><link>https://blog.51ai.vip/posts/composer%E7%AC%94%E8%AE%B0/</link><pubDate>Mon, 15 Jul 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/composer%E7%AC%94%E8%AE%B0/</guid><description>composer - laravel5 创建laravel项目： conposer create-project laravel/laravel=5.8.* --prefer-dist ./XXX
laravel=5.8.* 这里代表要部署5.8中最高版本 &amp;ndash;prefer-dist 参数代表优先下载zip
安装vendor: composer install
composer install --prefer-dist
更新： composer update
composer版本更新： composer self-update
利用composer 创建laravel控制器： php artisan make:controller HomeController 会在http下 创建一Home的控制器
如果存在分目录情况，需要指定目录： php artisan make:controller Home/HomeController
Laravel config: 编写一些类的别名，controller中 use 简短的别名为目的。
位置：config/app 存在一数组 aliases 在里面添加
创建模型： 创建一个user 的model
php artisan make:model User
指定目录加入目录即可
获取项目路由： php artisan route:list
composer在项目中安装三方库时候出现报错： 执行命令： composer Install
返回错误： Your requirements could not be resolved to an installable set of packages.</description></item><item><title>无版权素材站点</title><link>https://blog.51ai.vip/posts/%E6%97%A0%E7%89%88%E6%9D%83%E7%B4%A0%E6%9D%90%E7%AB%99%E7%82%B9/</link><pubDate>Thu, 27 Jun 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/%E6%97%A0%E7%89%88%E6%9D%83%E7%B4%A0%E6%9D%90%E7%AB%99%E7%82%B9/</guid><description>最近找素材收集一些站点 无版权对于我们来说可以放心使用 列表如下：
http://www.pexels.com/
http://www.gratisography.com/　https://visualhunt.com/
http://finda.photo
http://cupcake.nilssonlee.se/
https://www.photock.jp/
http://pngimg.com/
http://www.designerspics.com
http://kaboompics.com/
https://pixabay.com/
https://visualhunt.com/
http://finda.photo
http://www.freemagebank.com/
https://stocksnap.io/
http://picjumbo.com/
http://stokpic.com/
https://cn.freeimages.com/
http://www.imcreator.com/free
https://www.piqsels.com/zh
https://magdeleine.co/browse/
https://colorhub.me/
https://picjumbo.com/
http://streetwill.co/
https://www.foodiesfeed.com/
http://www.peakpx.com/
http://www.polayoutu.com/collections
https://negativespace.co/
https://freeforcommercialuse.net/
https://mmtstock.com/</description></item><item><title>Hexo笔记</title><link>https://blog.51ai.vip/posts/hexo%E7%AC%94%E8%AE%B0/</link><pubDate>Tue, 04 Jun 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/hexo%E7%AC%94%E8%AE%B0/</guid><description>多tag 文章中 多tag时,无法直接, 空格这种.
方式一:
tags: [tag1,tag2]
方式二:
tags: - tag1 - tag2</description></item><item><title>Python建立SocketSSL连接</title><link>https://blog.51ai.vip/posts/python%E5%BB%BA%E7%AB%8Bsocketssl%E8%BF%9E%E6%8E%A5/</link><pubDate>Tue, 04 Jun 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/python%E5%BB%BA%E7%AB%8Bsocketssl%E8%BF%9E%E6%8E%A5/</guid><description>Python Socket连接 5月中旬遇到一个功能,需要利用Python建立Socket tcp连接,于设备通讯发送相关数据.
这块没接触,Python也是hello world水平.
赶紧恶补一下:
Socket是网络编程的一个抽象概念。
通常我们用一个Socket表示“打开了一个网络链接”，打开一个Socket需要知道目标计算机的IP地址和端口号，再指定协议类型。
服务端我也不知道什么样,这里只记录客户端的相关.
这里我们得到一个文档说,需要建立socket SSL 连接,通过XML格式发送数据.
非ssl的socket: import socket # 创建一个socket: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: s.connect((&amp;#39;192.168.1.230&amp;#39;, 80)) SSL socket: 端口是3344,ssl跳过验证,如果验证参数需要修改.
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) c = ssl.wrap_socket(s, cert_reqs=ssl.CERT_NONE) try: c.connect((&amp;#39;192.168.1.230&amp;#39;, &amp;#39;3344&amp;#39;)) except: return 2 这下与那台设备可以正常通讯了,后面实现具体功能就ok了.</description></item><item><title>Ubutun16.04安装Python</title><link>https://blog.51ai.vip/posts/ubutun16-04%E5%AE%89%E8%A3%85python/</link><pubDate>Fri, 24 May 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/ubutun16-04%E5%AE%89%E8%A3%85python/</guid><description>目的 安装python3.7.3 安装pip
准备工作 系统内置python2.X,去除默认python的软链, sudo rm /usr/bin/python 安装一些软件包&amp;amp;软件包保持最新状态. sudo apt-get update
sudo apt-get install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
安装Python 通过编译安装python
默认我下载在home里, cd
下载新python文件, wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz 解压文件, tar zxf Python-3.7.3.tgz
把这个文件拷贝到放置的位置. 这里我放到/usr/local/python mkdir -p /usr/local/python
进入这个目录, 执行 ./configure --enable-optimizations 之后执行 sudo make -j 8 这里8根据设备cpu核心数来的,不知道你可以写1(手动滑稽)
make之后 该 make install 嘛? NO! 是 sudo make altinstall
装完之后, 可以尝试 python &amp;ndash;version 看看有没有, 如果没有或者版本不对.可能是准备里你没有删除 /usr/bin/python 或者这个不存在. 需要手动添加一下,我这个是没有给我创建成功.
sudo ln -s /usr/local/Python-3.</description></item><item><title>Go学习笔记</title><link>https://blog.51ai.vip/posts/go%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</link><pubDate>Wed, 15 May 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/go%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</guid><description>变量 var 声明,支持类型判断.
var name string string类型 name
var s string 值初始化
var age = 20 age 类型自动推断
height := 165 简短声明(仅限函数使用)
i,j,k := 3.8,true,100 声明一组变量
_, res := 123,321 _特殊变量名,赋予他的值会被丢弃
常量 const 声明
const Pi = 3.14 声明一个常量Pi
const( apple = &amp;#34;fruit&amp;#34; banana ) banana 常量未定义初始化值会与apple值相同
数据类型 boolean,整型,浮点型,字符串,错误
布尔 bool 初始化默认fasle
整型
int8,int16,int32,int64 (有符号)
uint8(byte),uint16,uint32(rune),uint64 (无符号)
uintptr
byte,rune 与uint8,uint32别名
整形初始化默认值0
浮点型
float32,float64(默认浮点类型)
complex64,complex128
float32,float64 初始化默认值0
字符串
双引号或``,UTF8编码,\转义
初始化默认值&amp;quot;&amp;quot;
修改需要转换类型为 rune或byte 操作后再转换</description></item><item><title>redis笔记</title><link>https://blog.51ai.vip/posts/redis%E7%AC%94%E8%AE%B0/</link><pubDate>Thu, 25 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/redis%E7%AC%94%E8%AE%B0/</guid><description>redis笔记 单进程,默认16库,
select N 切换库
flushdb 清空库
类型 string 字符串 list 列表 set 集合 sorted set有序集合 hash哈希 一个字符串支持512M
有序集合 每个元素会关联一个double类型分数。成员唯一，分数可以重复。
常用命令 key： keys * exists key move key db 移除key 从库中 expire key 为key 设置过期时间 ttl key 查看多少秒过期，-1 永不过期， -2已过期 type key 查看类型 del key 删除 string： getrange key 0-N setrange key 0-N XXX 获取字符串范围内容， 设置范围内为XXX
setex 设置生命值多少秒 setnx key 设置一个不存在的key
mset mget msetnx
list： lpush rpush lrange lpop rpop lindex llen lrem key 2 value 删除2个value ltrim key 0-N 截取并复制给key （其他的删除了） rpoplpush 弹出前面key的值 加入后面的key中 lset key index value 设置key中 index下标的值 linsert key before/afrer value1 value2 key中1值得前面后后面加入2值 set： sadd key value 添加到key集合 smembers key 查询集合 sismember key m 查询m是否在key集合中 scard key 集合ket的基数 spop key 随机移除一个元素并返回元素的值 srem key m 移除m从key的集合中 smove K1 K2 m 将k1的m一刀k2里 sinter key1 key2 交集 sunion key1 key2 并集 sdiff key1 key2 差集 hash： hset user name ali hset user age 33 设置user数据 hget user name 获取user.</description></item><item><title>gulp笔记</title><link>https://blog.51ai.vip/posts/gulp%E7%AC%94%E8%AE%B0/</link><pubDate>Mon, 22 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/gulp%E7%AC%94%E8%AE%B0/</guid><description>gulp gulp.js是一个前端构建工具。
安装 npm 安装全局gulp，npm install -g gulp。（如果没有梯子，最好安装下cnpm） cnpm 安装 npm install -g cnpm --registry=https://registry.npm.taobao.org 安装完cnpm，下面所有npm操作替换cnpm 执行即可。 进入项目，初始化（npm init） 项目安装gulp，项目文件夹下，npm install --save-dev gulp。 (&amp;ndash;save-dev 加入此项目依赖中，不需要可取消这个参数) 项目根创建gulpfile.js文件，文件内创建任务测试。 var gulp = require(&amp;#39;gulp&amp;#39;); gulp.task(&amp;#39;default&amp;#39;,function(){ console.log(&amp;#39;hello world!&amp;#39;); }); 运行 gulp，可以看到默认执行，输出 hello world! 。测试成功。 gulp API 上面运行 gulp 执行default ，这个是gulp API。 [文档](https://www.gulpjs.com.cn/docs/api/) gulp工作方式 gulp.src 获取文件流,通过pipe方法导入到插件，插件处理的流通过pipe方法导入 gulp.dest中, gulp.dest 输出目标文件。
gulp src gulp.src(globs[, options])
输出（Emits）符合所提供的匹配模式（glob）或者匹配模式的数组（array of globs）的文件。 将返回一个 Vinyl files 的 stream 它可以被 piped 到别的插件中。
文档这意思看着有点费劲，理解为获取文件路径。gulp通过这个方法获取到处理的文件流。
参数：</description></item><item><title>Centos7时间设置</title><link>https://blog.51ai.vip/posts/centos7%E6%97%B6%E9%97%B4%E8%AE%BE%E7%BD%AE/</link><pubDate>Fri, 19 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/centos7%E6%97%B6%E9%97%B4%E8%AE%BE%E7%BD%AE/</guid><description>Centos7时间相关 查看时间 date hwclock 硬件时间 timedatectl 各时间状态
设置&amp;amp;更新服务时间 安装ntpdate yum install utp ntpdate
设置同步 ntpdate cn.pool.ntp.org (time.windows.com) 地址看喜好
设置硬件时间 hwclock &amp;ndash;systohc
设置时区 timedatectl set-timezone Asia/Shanghai （上海）
timedatectl 很多设置，需要请查相关资料。</description></item><item><title>Centos7防火墙相关设置</title><link>https://blog.51ai.vip/posts/centos7%E9%98%B2%E7%81%AB%E5%A2%99%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE/</link><pubDate>Thu, 18 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/centos7%E9%98%B2%E7%81%AB%E5%A2%99%E7%9B%B8%E5%85%B3%E8%AE%BE%E7%BD%AE/</guid><description>Centos7与之前不太一样 以前都是用iptables，公司服务器环境事7，凑巧不熟一台新服务。我为了测试，再本地虚机上装了一台。 这里默认防火墙是 firewall，其实为了省事还是可以安装一个iptables的。这里学习一下firewall一些操作。
查看防火墙服务状态 systemctl status firewalld
####查看f防火墙状态 firewall-cmd --state
查看规则 firewall-cmd --list-all ####停止&amp;amp;开启防&amp;amp;重启火墙 systemctl stop firewalld.service systemctl start firewalld.service systemctl restart firewalld.service
关闭防火墙 systemctl disable firewalld.service
重载防火墙 firewall-cmd —reload
查询开放端口 firewall-cmd --list-ports
开放一个端口 例如tcp 8010 firewall-cmd &amp;ndash;zone=public &amp;ndash;add-port=80/tcp &amp;ndash;permanent
–zone #作用域 –add-port=8010/tcp #添加端口，格式为：端口/通讯协议 –permanent #永久生效，没有此参数重启后失效
查询某端口是否开放(8010) firewall-cmd --query-port=8010/tcp
移除端口规则 firewall-cmd --permanent --remove-port=8010/tcp</description></item><item><title>Centos7启动等级设置</title><link>https://blog.51ai.vip/posts/centos7%E5%90%AF%E5%8A%A8%E7%AD%89%E7%BA%A7%E8%AE%BE%E7%BD%AE/</link><pubDate>Mon, 15 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/centos7%E5%90%AF%E5%8A%A8%E7%AD%89%E7%BA%A7%E8%AE%BE%E7%BD%AE/</guid><description>Centos7启动级别 启动级别分为7个： 0 - 系统停机状态 1 - 单用户工作状态 2 - 多用户状态（没有NFS） 3 - 多用户状态（有NFS） 4 - 系统未使用，留给用户 5 - 图形界面 6 - 系统正常关闭并重新启动
切换启动级别 之前一直都是在种端中输入指令 init3 切换启动级别。 设置永久启动3级别， vi /etc/inittab 把init3设置默认即可。
centos7 设置出现不同 runlevels被targets所取代，即CentOS7采用加载target的方式来替代之前的启动级别。 multi-user.target = init3 graphical.target = init5 我们日常实用图形窗口init5，我们不需要图形，可以切换到init3等启动级别上。 systemctl set-default multi-user.target 设置为init3 systemctl set-default graphical.target 设置为init5</description></item><item><title>Docker常用命令</title><link>https://blog.51ai.vip/posts/docker%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</link><pubDate>Thu, 11 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/docker%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/</guid><description>Docker常用命令 说常用不如说自己用到的命令。
容器相关 学习了一下docker，基础常用命令记录下。 ####docker run/新建并启动容器 这个run其实包含两个不走，先执行新建容器(docker create),接着启动容器(docker start)。敲两个是不是有点麻烦吧。
docker run xx [COMMAND]
例子 docker run -it ubuntu:14.04 /bin/bash
这里希望启动一个基于 ubuntu 14.04镜像 来创建一个容器，-t选项让Docker分配一个伪终端（pseudo-tty）并绑定到容器的标准输入上，-i则让容器的标准输入保持打开。更多的命令选项可以通过man docker-run命令来查看。之后命令还有一项，启动一个bash终端。 这条命令涉及到很多知识了。 -参数 常用 -i -d -t -p， -d 是否在后台运行，-p 映射到本地主机端口。剩下的看手册来补下。
docker create &amp;amp;&amp;amp; docker start &amp;amp;&amp;amp; docker stop 创建，启动，停止。 有一个容易停止了，可以用 docker start XX容器 启动。 XX 可以是容器的ID，也可以是name。
docker rm 删除一个容器（最好先把这个容器停止了再删除）。 -f 可以强制删除。-v 删除与容器关联的卷（如果刚学习还真不知道什么是卷）。
docker attach 进入容器，如果开启了一个 -d 后台启动容器。 我们怎么进去看看？ docker attach XX容器 这个命令我学习时候用过，感觉有时候不太好使。命令执行完卡那不动。
docker exec 可以在容器内直接执行任意命令。 docker exec -it xx /bin/bash 这可以进入xx镜像，并打开bash。 相比这个比上面的attach 好多了。</description></item><item><title>Ubutun下安装Docker</title><link>https://blog.51ai.vip/posts/ubutun%E4%B8%8B%E5%AE%89%E8%A3%85docker/</link><pubDate>Thu, 04 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/ubutun%E4%B8%8B%E5%AE%89%E8%A3%85docker/</guid><description>Docker简介 一个能够把开发的应用程序自动部署到容器的开源引擎 三大概念：镜像（Image）容器（Container）仓库（Repository）
具体信息请参考官方。官方概述（养成看文档习惯）
安装环境 Ubuntu 16.04 LTS
Docker安装 根据官方doc安装。官方doc 1.如果你之前装过，命令卸载。 sudo apt-get remove docker docker-engine docker.io containerd runc
2.更新包索引 apt-get update
3.安装包以允许apt通过HTTPS使用存储库: sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common （斜线换行，一条命令）
4.添加Docker的官方GPG密钥: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88
5.使用以下命令设置稳定存储库。要添加 夜间或测试存储库，请在下面的命令中的单词后添加单词nightly或test（或两者）stable。 $ sudo add-apt-repository \ &amp;quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable&amp;quot; (lsb_release -cs子命令返回Ubuntu发行版的名称)
6.安装最新版本的Docker CE和containerd，或者转到下一步安装特定版本： sudo apt-get install docker-ce docker-ce-cli containerd.</description></item><item><title>Hexo博客安装与配置</title><link>https://blog.51ai.vip/posts/hexo%E5%8D%9A%E5%AE%A2%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/</link><pubDate>Mon, 01 Apr 2019 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/hexo%E5%8D%9A%E5%AE%A2%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/</guid><description>wordpress 之后 wordpress 使用很方便，但是折腾几次之后。由于一次意外，导致管理者把我的vps被停掉。虽然有些文章还是保留了。但是这次之后感觉自己还是找一个稳妥的家。连接hexo搭建的博客之后，打算自己来折腾一下。
记录笔记环境 在windows上写笔记，环境目前是windows下操作。linux，mac系统中需要注意一些细节吧。存在提不到情况，先做好出现问题考虑自行排查。
准备 看下hexo的安装提示。 hexo 需要Node.js 和 Git 。
安装 Node.js 官网: 官网 widows，mac，linux 都有对应的安装方法。根据自己的环境来安装。 安装 Git 官网: 官网 根据自己环境安装。 安装Hexo 通过npm来安装 Hexo。 命令: npm install -g hexo-cli 什么鬼，通过这个命令发现没有实现正常安装。理由，我们在天朝。 解决方式： 替换国内npm源。 命令: npm install -g cnpm --registry=https://registry.npm.taobao.org 请注意不同系统在操作此命令时，需要一些设置。linux 如果使用下面命令需要自建软链。 cnpm ln -s /yourdir/bin/cnpm /usr/local/npm 下一步用cnpm 来安装 Hexo： cnpm install hexo-cli -g 验证hexo 是否安装： hexo v 会列出版本信息。 下面使用Hexo来创建blog： 创建项目文件夹。这里开始通过git bash来使用命令行操作。 进入项目文件夹，初始化。 hexo init （这里也可以，通过 hexo init 你的项目文件夹名 结果一样） 这里会看到目录有相关文件了。具体这些文件，看下 手册 是什么意思。 这时候其实已经是一个博客站点了。 命令 hexo g , hexo s 得到信息：Hexo is running at http：//lcoalhost:4000` 注意4000端口需要未被占用。 访问地址就可以看到初始化的站点了。 （不喜欢默认主题可以修改主题） 写文章 写文章需要先创建文档，这个文档默认生成在_post 文件夹下。</description></item><item><title/><link>https://blog.51ai.vip/index-about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/index-about/</guid><description>😊 welcome 👉🏻 Posts 👉🏻 Tags</description></item><item><title/><link>https://blog.51ai.vip/posts/index-about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.51ai.vip/posts/index-about/</guid><description>aLong blog welcome to my blog.
posts posts tags tags</description></item></channel></rss>