德瑞斯·布塔特 网址:https://dri.es/ 英语 将Drupal的布局生成器发展为体验生成器 https://dri.es/evolving-drupal-layout-builder-to-an-experience-builder <图><img src=“https://dri.es/files/cache/drupal/experience-builder-announcement-1280w.jpg“width=”1280“height=”853“alt=”一个人与带有图形和界面组件的未来全息显示器交互。“title=”体验生成器公告“></图><p>想象一下一个安装<a href=“https://www.drupal.org/“>Drupal</a>立即提供了一种创造性的体验,允许您立即构建和设计页面,而无需任何其他模块或配置</p><p><a href=“https://dri.es/why-drupal-layout-builder-is-so-unique-and-fowerful“>2018年Drupal的Layout Builder是实现这一愿景的重要里程碑,但这只是第一步。Layout Builder为站点构建者提供了强大的拖放界面,用于在可定制的布局中创建和安排内容</p><p>尽管它取得了成功,但显然迫切需要改进现有的Layout Builder。众多社区开发的模块增强了Layout Builder,凸显了需要更全面的解决方案</p>(第页)<p>这就是为什么去年在DrupalCon Lille,我很高兴<a href=“https://dri.es/state-of-drupal-presentation-october-2023“>宣布“下一代页面生成器”计划,旨在改进和扩展布局生成器,以提供真正直观、现成的页面构建体验</p><p>自宣布“下一代页面生成器”以来,由<a href=“https://www.drupal.org/u/lauriii网站“>Lauri Eskola(阿基亚语),a<a href=”https://www.drupal.org/about/core/policys网站“>Drupal Core Committer,我们已经进行了广泛的研究和规划</p><p>受用户反馈的启发,我们决定进行两项更改。首先,我们决定拓宽我们的关注点:我们不仅将改进Layout Builder的页面构建功能,还将集成基本的主题功能,使用户无需编辑Twig文件即可轻松设置页面样式。其次,考虑到这一更广泛的范围,我们将该计划从“下一代页面生成器”重命名为“体验生成器”</p>(第页)<p>最近几个月,我们探讨了如何创建这样一个体验生成器的几个选项,包括加速开发布局生成器,切换到<a href=“https://wordpress.org/gutenberg网站/“>古腾堡,采用<a href=”https://www.drupal.org/project/paragraphs(网址:https://www.drupal.org/project/paragraphs)“>段落</a>,或使用新的开源<a href=”https://github.com/plasmacapp/plasic网址“>质粒</a></p><p>在与包括Automatic的Gutenberg团队在内的关键利益相关者进行彻底分析和讨论后,Drupal核心委员会决定,最佳方法是扩展Layout Builder,同时合并Paragraphs的最佳元素</p>(第页)<p>展望未来,我希望Experience Builder成为布局设计、页面构建和基本主题的首选Drupal工具。我们的主要目标是创建一个站点建设者喜爱的工具,提供令人惊叹的现成体验。通过集成段落中的关键功能,我们还旨在创建一个统一的解决方案,减少碎片化,加速创新,并确保Drupal保持在网站建设的前沿</p>(第页)<p>我们未来的成功取决于将Drupal的可用性扩展到更广泛的受众。我们的CMS功能通常比竞争对手更好,但并不总是用户友好。在Drupal 7时代,Drupal是低代码的OG(Original Great),但今天我们在易用性方面被竞争对手超越了。如果没有用户体验的改进,我们将失去优势。Experience Builder计划旨在让更多人了解Drupal的威力</p>(第页)<p class=“pullquote”>我强烈认为,统一的体验构建器是我们现在可以采取的最重要举措之一</p>(第页)<p>开发体验生成器是一项艰巨的任务,需要付出大量的努力,进行广泛的协作,并在用户体验和设计方面拥有丰富的专业知识。作为Drupal核心提交人,我们被推进这一倡议的紧迫感所驱动。我们致力于快速前进和快速迭代,但要取得成功,我们还需要您的支持。社区将有很多机会合作并为这一倡议作出贡献</p>(第页)<p>有关更多信息,请查看<a href=“https://www.drupal.org/about/core/blog/working-toward-an-experience-builder“>Lauri关于这个主题的最新博客帖子。此外,我将在几周后的DrupalCon Portland主题演讲中进一步讨论这一点</p> 2024年4月23日星期二12:30:15-0400 德里斯 dbe61ec2-4 e46-4e1b-b78b-f67088电子58868 建造我自己的二氧化碳监测仪 https://dri.es/building-my-own-co2监视器 <p>多年来,我一直担心<a href=“https://en.wikipedia.org/wiki/Carbon_dioxide“>CO<sub>2</sub></a>水平在我们孩子的卧室里。直到最近,我们的两个儿子还在我们的公寓里共用一间小卧室。每天晚上,他们都坚持关上门,以隔绝光线和噪音。然而,一旦他们睡着了,我会悄悄地打开门,确保他们有足够的新鲜空气来助燃他们的梦想</p><p>当我们呼吸时,我们的身体自然排出CO(二氧化碳)。当CO<sub>2</sub>与我们体内的水发生反应时,它变成<a href=“https://en.wikipedia.org/wiki/Carbonate网站“>碳酸盐</a>可以微妙地改变我们身体的内部平衡。这就是为什么高浓度的CO<sub>2</sub>会对身体有害,就像在封闭的卧室里一样</p><p>室外CO浓度平均约为400 ppm(百万分之一),但室内浓度高达800 ppm被认为是健康的。在800至1200 ppm之间,可能会出现轻微的不适,高于2000 ppm的水平表明空气质量较差,从而对健康构成风险</p>(第页)<p>A<A href=“https://iopscience.iop.org/article/10.1088/1748-9326/ac1bd8/meta“>哈佛大学的关键研究发现,CO每增加500 ppm,认知反应时间就会减慢1.4-1.8%,生产力就会下降2.1-2.4%。此外https://link.springer.com/chapter/10.1007/978-981-13-9520-8_99“>另一项研究</a>将高CO<sub>2</sub>水平与睡眠质量下降联系起来。这些发现突出了室内CO<sub>2</sub>水平对我们的身体健康、心理表现和睡眠质量的影响</p><p>开发后<a href=“https://dri.es/building-my-own-温度和湿度监测器“>我自己的温度计,我对CO监测越来越感兴趣。尽管有许多商用CO 2探测器可用,但我选择以温度计项目为起点,构建自己的CO 2监测仪。用CO传感器更换温度和湿度传感器是一个简单的过程</p>(第页)<p>它确实需要深入研究CO<sub>2</sub>传感器,这让我想到了Sensirion SCD41传感器。与许多其他仅估计CO<sub>2</sub>水平的CO<sub>2</sub>传感器不同,SCD41传感器利用先进的光声无损检测技术来准确测量实际的CO<sub>2</sub>浓度。根据<a href=“https://sensirion.com/media/documents/9E7DA521/627C2C8D/CD_IN_SCDxx_Transmissive_and_photoacoustic_NDIR_sensing_D1.pdf“>文档</a>:</p>SCD4x系列基于光声NDIR技术。该技术利用CO<sub>2</sub>分子的特性,强吸收波长约为4.2µm的红外(IR)光。当该波长的光通过气体样品照射时,CO浓度可以通过吸收的光的比例计算得出</方块引号><div class=“large”><图><img src=“https://dri.es/files/cache/blog/esp32-s3-with-scd41-1280w.jpg“width=”1280“height=”850“alt=”ESP32-S3开发板与SCD41 CO2和温度传感器相连。比例尺包括硬币和钢笔。SCD41传感器的尺寸大致相当于硬币,ESP32-S3板的直径约为硬币的两倍。“title=”带SCD41传感器的ESP32-S3开发板“><figcaption><em>一个带有ESP32-S3芯片的开发板(左)连接到右侧的SensionSCD41传感器,该传感器测量二氧化碳水平和温度</em></figcaption></图></div><p>我的ESP32设备每隔几分钟测量一次CO浓度,连接到WiFi并将此数据发送到我的web服务端点https://dri.es/传感器</code>。此端点处理并可视化数据。不同于<a href=“https://dri.es/sensors/basement-belgium网站“>我们的地下室温度</a>,我选择将CO数据保密,不向公众开放</p><p>在我更新了ESP32开发板上的客户端代码以使用新的传感器之后,我还必须对用于数据可视化的后端代码进行一些小的调整</p>(第页)<p>一旦一切正常,我就偷偷把我的项目放进了卧室,避开了凡妮莎关于把我们的卧室变成小工具实验室的任何反对意见</p><p>第二天早上,我收到了一些令人惊讶的数据:CO浓度已飙升至2500 ppm!这是意料之外的,因为我们总是睡在门微开,吊扇放低的地方</p>(第页)<图><img src=“https://dri.es/files/images/blog/co2-bedroom-before.png“width=”1506“height=”266“alt=”彩色图表,显示睡眠期间二氧化碳浓度逐渐增加。“title=”之前的CO2卧室“><figcaption><em>我的二氧化碳监测仪上的一张图表,显示了连续四天的每小时空气质量。每排是一天,每平方是一小时。绿色方块表示正常CO2水平和清洁空气;红色方块表示二氧化碳含量高,会影响睡眠和注意力。每天,方块从绿色变为红色,表明睡眠期间空气质量下降</em></figcaption></图><p>哈佛大学的研究强调,如此高的CO<sub>2</sub>水平会对睡眠质量和认知功能产生负面影响</p>(第页)<p>在对我的代码进行了三次检查并连续几晚监测了浓度后,趋势很明显:一氧化碳浓度在一夜之间持续增加,达到了超出推荐指南的水平</p>(第页)<p>凭借几天的数据,我向凡妮莎介绍了我的发现。起初,她遇到了她特有的怀疑态度(读作:护目镜),她迅速启用了Nest恒温器的空气循环模式。此功能自动启动风扇以循环空气,确保新鲜空气而无需加热或冷却</p>(第页)<p>下图显示了在恒温器上使用空气循环模式如何显著提高卧室中的CO浓度。事实证明,这比仅仅把门打开和依靠吊扇要有效得多。我花了几个晚上的时间来构建和分析,瓦妮莎在不到一分钟的时间内就进行了补救</p>(第页)<图><img src=“https://dri.es/files/images/blog/co2-bedroom-after.png“width=”1506“height=”266“alt=”彩色图表显示整个晚上稳定健康的二氧化碳水平。“title=”二氧化碳卧室之后“><figcaption><em>我的二氧化碳监测仪上的一张图表,显示了连续四天的每小时空气质量。每排是一天,每平方是一小时。绿色方块表示正常CO2水平和清洁空气;红色方块表示二氧化碳含量高,会影响睡眠和注意力。图表显示,在我们启用Nest的空气循环功能后,二氧化碳水平保持健康</em></figcaption></图><p>当然,打开窗户是改善室内空气质量的简单方法,与Nest的空气循环模式相比,它可能更有效地降低CO浓度。然而,有人告诉我,住在城市里,有白色的窗帘会让我们犹豫不决</p><p>然而,这个项目强调了一点好奇心和创造力可以如何提高我们生活空间的健康和舒适度</p>(第页)<p>启动您自己的CO<sub>2</sub>监控项目是一项令人兴奋且有回报的努力。在这篇博客文章的其余部分,我将帮助你开始。我已经详细介绍了硬件设置并提供了客户端代码。如前所述,后端代码基于<a href=“https://dri.es/building-my-own-温度和湿度监测器“>我的温度计项目</a>,请参考该项目了解更多详细信息</p><h3>使用的硬件</h3><p>对于这个项目,我购买了:</p><ol><li><a href=“https://www.adaruit.com/product/5323“>Adafruit ESP32-S3 Feather</a>:具有Wi-Fi和蓝牙功能的微控制器板,用作我项目的中央处理单元</li><li><a href=“https://www.adafruit.com/product/5190网址“>Adafruit SCD41传感器:高精度CO和温度传感器</li><li><a href=“https://www.adaruit.com/product/1578“>3.7v 500mAh电池</a>:小型便携式电源</li><li><a href=“https://www.adaruit.com/product/4399“>STEMMA QT/Qwiic JST SH 4针电缆</a>:无需焊接即可将传感器连接至电路板</li></ol><h3>客户代码</h3><p>我还喜欢什么<a href=“https://sensirion.com网站/“>Sensirion</a>是指他们的传感器有Arduino库,包括SCD4x系列(https://github.com/Sensirion/arduino-i2c-scd4x). 这些可以通过Adafruit IDE轻松安装</p>(第页)<图><img src=“https://dri.es/files/images/blog/sensirion-scd4x-installation-arduino-ide.png“width=”1714“height=”1334“alt=”Arduino IDE的屏幕截图,其中包含一个对话框,用于安装“Sensionon I2C SCD4x”库的“Sensionon Core”依赖项。“title=”Sensirion SCD4x安装Arduino IDE“><figcaption><em>通过Arduino IDE安装Sensirion SCD4x库</em></figcaption></图><p>安装完成后,将其纳入您的项目很简单–只需在代码中包含<code>#include“SensirionI2CScd4x.h”</code></p>(第页)<p>下面是完整的客户端代码。它附带了非常详细的代码注释,以便于理解</p>(第页)<pre><code class=“language-c”tabindex=“0”>#include“SensirionI2CScd4x.h”#包括“Adafruit_MAX1704X.h”#包括“WiFiManager.h”#包括“ArduinoJson.h”#包括“HTTPClient.h”#包括“Wire.h”//Adafruit_SCD4x传感器是一种CO2、温度和湿度传感器//I2C接口。SensirionI2CScd4x scd4x;//Adafruit ESP32-S3羽毛配备内置MAX17048 LiPoly/LiIon//蓄电池监测器。MAX17048可精确监控电池的//电压。利用Adafruit库不仅可以帮助我们获得原始的//来自电池单元的电压数据,但也将这些数据转换为更多//直观的电池百分比或充电水平。我们将转交电池//web服务端点的百分比,可以将其可视化或用于//当电池需要充电时发送通知。Adafruit_MAX17048 maxlipo;//setup()函数用于初始化设备的硬件和//通信。它在启动时执行一次。这里,我们开始连载//通信、初始化传感器、连接到Wi-Fi并发送初始//数据。无效设置(){序列开始(115200);//等待串行连接建立,然后继续。//这对于具有本机USB接口的板至关重要。在没有该循环的情况下,//发送到串行监视器的初始输出丢失。此代码不是//使用电池运行时需要。//延迟(5000);//从MAC地址的段生成唯一的设备ID。//由于MAC地址是永久的,并且在重新启动后保持不变,//这保证了设备ID保持一致。为了实现//压缩ID,仅使用MAC地址的特定部分,//特别是0x10000和0xFFFFF之间的范围。此范围//转换为固定长度为5个字符的十六进制字符串,//为我们提供了大约100万个唯一ID。这种方法平衡了//具有紧性的唯一性。uint64_t芯片ID=ESP.getEfuseMac();uint32_t设备值=((uint32-t)(芯片ID&gt;&gt;16)&amp;0x0FFFFF)|0x10000;char设备[6];//5个字符用于十六进制表示+空终止符。sprintf(设备,“%x”,设备值);//对小写十六进制字母使用“%x”//初始化MAX17048传感器。if(maxlip.begin()){Serial.println(F(“MAX17048电池监视器已初始化”);}其他{Serial.println(F(“找不到MAX17048电池监视器!”);回报;}//初始化SHT4x传感器。scd4x.begin(有线);uint16_t错误;//将温度传感器的偏移调整到1度,以纠正偏差,//包括传感器自愈和环境因素(如阳光照射)。//出厂默认值为4度。为您的特定设置自定义此偏移//以提高温度读数的准确性。error=scd4x.setTemperatureOffset(1.0);if(错误){Serial.print(F(“尝试设置温度偏移时出错:”);Serial.println(错误);回报;}//启动CO2浓度、相对湿度和//温度。我们使用“单发”模式,这意味着传感器执行//一次性测量。此过程大约需要5秒钟才能完成。//测量后,结果可供检索。错误=scd4x.measureSingleShot();if(错误){Serial.print(F(“尝试将传感器置于单发模式时出错:”);Serial.println(错误);回报;}//在开始下一次测量之前,延迟1秒。这个//延迟有助于确保传感器有足够的时间为下一次做好准备//正在读取。本规程符合一般传感器操作指南,//测量之间的短暂停顿有助于实现更准确的测量//并通过使传感器的内部组件稳定来稳定读数。延迟(1000);//根据传感器的数据表,我们应该忽略第一个CO2读数//在传感器已经通电或复位之后。这背后的理由是//传感器读数需要一次测量才能稳定。因此,我们//执行第二次“单次”测量,并使用此结果//二读。错误=scd4x.measureSingleShot();if(错误){Serial.print(F(“尝试将传感器置于单发模式时出错:”);Serial.println(错误);回报;}//从传感器读取CO2、温度和湿度值。uint16_t二氧化碳=0;浮子温度=0.0f;浮子湿度=0.0f;error=scd4x.readMeasurement(二氧化碳、温度、湿度);if(错误){Serial.print(F(“读取测量值时出错:”);Serial.println(错误);回报;} //读取电池电量并将其上限设置为100%。此步骤可纠正任何//读数高于100%,这似乎是由于测量异常或//计算不准确。这样可以确保显示或报告的电池//水平是可信的。浮动电池百分比=maxlipo.cellPercent();电池百分比=(电池百分比&gt;100)?100:电池百分比;WiFiManager WiFiManager;//取消注释下一行以删除所有保存的WiFi凭据。//这对于调试或重新配置很有用。//wifi管理器.resetSettings();//此WiFi管理器尝试使用已知的//凭据,存储在RAM中。如果失败,设备将切换到Access//点模式,创建名为“温度监视器”的网络。在这种模式下,//连接到此网络,导航到设备的IP地址(默认IP//是192.168.4.1),配置门户将是//显示,允许您输入新的WiFi凭据。提交后,//设备将重新启动并尝试使用连接到指定的网络//这些新证书。if(!wifiManager.autoConnect(“二氧化碳监测器”){Serial.println(F(“无法连接到WiFi…”));//如果设备无法连接到WiFi,它将重新启动并重试。//这种方法对于处理临时网络问题很有用。然而,//在网络持续不可用的情况下(例如路由器//停机一个多小时,信号持续不佳)//重启和尝试WiFi连接可能会快速耗尽电池电量。ESP.重启();//允许重新启动过程正常启动的强制延迟。延迟(1000);回报;}//将收集的数据作为JSON发送到指定的URL。sendJson数据(“https://dri.es/传感器“,设备,二氧化碳,温度,湿度,电池百分比);//WiFi消耗大量电量,因此在完成后将其关闭。WiFi.断开连接(true);//进入深度睡眠10分钟。ESP32-S3的深度睡眠模式将//关闭大多数组件(RTC除外)的功耗。这个//这种模式对于电池供电的项目来说是有效的,因为这些项目需要持续运行//不需要。当设备在设定时间后醒来时,它会运行//setup(),因为状态没有保留。Serial.println(F(“睡10分钟……”);ESP.deepSleep(10*60*1000000);//10分钟*60秒/分钟*1000000微秒/秒。}bool sendJsonData(const char*url,const char*设备,浮子二氧化碳,浮子温度,浮子湿度,浮子电池){静态Json文档&lt;200&gt;文档;//将浮点值舍入到小数点后一位,以获得高效数据//变速箱。此方法减少了JSON有效负载的大小,即//对于使用电池运行的物联网应用程序非常重要。doc[“device”]=设备;doc[“co2”]=字符串(co2,0);doc[“temperature”]=字符串(温度,1);doc[“湿度”]=字符串(湿度,1);doc[“battery”]=字符串(battery,0);//将JSON序列化为字符串。字符串jsonData;serializeJson(doc,jsonData);//使用提供的URL初始化HTTP客户端。HTTPClient HTTPClient;httpClient.begin(url);httpClient.addHeader(“内容类型”,“应用程序/json”);//发送HTTP POST请求。int httpCode=httpClient。POST(jsonData);//关闭HTTP连接。httpClient.end();//将调试信息打印到串行控制台。Serial.println(“Sent'”+jsonData+“”to“+String(url)+”,return code“+httpCode);返回(httpCode==200);}无效循环(){//ESP32-S3从深度睡眠中醒来后重置并运行setup(),//使这个连续循环变得不必要。}</code></pre> 2024年4月7日,星期日05:21:37-0400 德里斯 031c7774-a7a9-4e6d-af62-1d940bf64806 悉尼歌剧院使用Drupal https://dri.es/sydney-opera-house-using-drupal网站 <图><img src=“https://dri.es/files/cache/australia-2024/sydney-opera-house-1280w.jpg澳大利亚“width=”1280“height=”850“alt=”晚上的悉尼歌剧院,灯光反射在水中。“title=”悉尼歌剧院“></图><p>纵观其50年的历史,<a href=“https://www.sydneyoperahouse.com/“>悉尼歌剧院(Sydney Opera House)欢迎音乐家、舞蹈家、演员、剧作家、电影制作人、当代艺术家和思想家,他们挑战并定义了文化场景。因此,悉尼歌剧院每年吸引着来自世界各地的数百万游客</p><p>悉尼歌剧院不仅具有令人难以置信的文化重要性,也是一座建筑杰作。其独特的设计使其成为世界上最具标志性的建筑之一,并为其赢得了一席之地https://whc.unesco.org/“>联合国教科文组织世界遗产</p><p>去年,悉尼歌剧院选择将其网站迁移到<a href=“https://www.drupal.org/“>Drupal</a>。今天,它正在运行Drupal 10。这家著名机构决定在Drupal上重新启动其网站,这突出了Drupal管理复杂网站的灵活性、安全性和能力</p>(第页)<p>几周前,在<A href=“https://dri.es/drupal-adventures-in-japan-and-astralia网址:“>我在澳大利亚的访问</a>,我在悉尼歌剧院会见了Drupal团队。我对团队致力于使用开放源代码来扩大文化访问以及他们对与其他艺术和文化组织合作的热情印象特别深刻。他们对创新、包容性和合作的关注与e开源和<a href=“https://dri.es/tag/open-web“>开放Web。Drupal对他们来说是一个很好的解决方案</p><div class=“video”><iframe src=“https://www.youtube-nocookie.com/embed/l8ouigVtUvo“width=”640“height=”360“loading=”lazy“title=”YouTube视频“allow=”自动播放;加密媒体“allowfullscreen> 2024年4月3日星期三14:51:08-0400 德里斯 9db7baf1-af4b-4dc9-9cd8-0fa15ad68145 建造我自己的温度和湿度监测器 https://dri.es/building-my-own-温度和湿度监测器 <p>去年秋天,我们游览了法国香槟地区,该地区以起泡葡萄酒而闻名。我们探索了古老的地下酒窖,在那里香槟经历了从葡萄汁到起泡酒的神奇转变。这些酒窖通常有30米深,长达公里,温度恒定在10-12°C左右,为香槟的陈酿和储存提供了完美的条件</p>(第页)<图><img src=“https://dri.es/files/cache/miscellaneous-2023/champagne-tunnel-1280w.jpg“width=”1280“height=”850“alt=”悬挂在地下隧道中的发光灯泡。“title=”香槟隧道“><figcaption><em>25米深的香槟隧道,通常绵延数英里/公里</em></figcaption></图><p>在品尝了各种香槟后,我们带着八箱香槟回家,存放在家的地下室。然而,与那些深地窖不同,我们的地下室只有几米深,这引发了一个简单的问题,让我陷入了一个尴尬的境地:我们地下室的温度相比如何</p>(第页)<p>我决定使用开放硬件和定制软件构建自己的“温度监控系统”,而不是仅仅买一个温度计。毕竟,当你可以花上几个晚上来修补硬件、传感器、电线和编写自己的软件时,谁还需要一个简单的解决方案呢?有时,越多就是越多</p>(第页)<p>基本想法是:每15分钟跟踪一次地下室的温度和湿度,并将这些信息发送到网络服务。此web服务分析数据,并在我们的地下室变得太冷或太热时向我们发出警报</p>(第页)<p>我在去年圣诞节前后启动了这个监控系统,所以它已经运行了近三个月了。您可以在<a href=“https://dri.es/传感器">https://dri.es/传感器</a>。是的,在网上公布我们的地下室温度有点奇怪,但这一切都很有趣</p>(第页)<图><img src=“https://dri.es/files/cache/blog/temperature-monitor-1280w.png“width=”1280“height=”960“alt=”显示比利时地下室温度和湿度读数的网页。“title=”温度监视器“><figcaption><em><A href=“https://dri.es/sensors/3ce1d“>我的地下室温度仪表盘</a>。</em></figcaption></图><p>到目前为止,<a href=“https://dri.es/sensors/basement-belgium网站“>我们地下室的温度非常适合储存葡萄酒。不过,我预计在夏季会有所变化</p><p>在本文的其余部分,我将分享如何构建收集和发送数据的客户端,以及处理和可视化数据的web服务后端</p>(第页)<h3>使用的硬件</h3><p>对于这个项目,我购买了:</p><ol><li><a href=“https://www.adaruit.com/product/5323“>Adafruit ESP32-S3 Feather</a>:具有Wi-Fi和蓝牙功能的微控制器板,用作我项目的中央处理单元</li><li><a href=“https://www.adaruit.com/product/5776“>Adafruit SHT4x传感器:高精度温度和湿度传感器</li><li><a href=“https://www.adaruit.com/product/1578“>3.7v 500mAh电池</a>:小型便携式电源</li><li><a href=“https://www.adaruit.com/product/4399“>STEMMA QT/Qwiic JST SH 4针电缆</a>:无需焊接即可将传感器连接到板上</li></ol><p>硬件总成本为32.35美元。我喜欢<a href=“https://www.adaruit.com/“>Adafruit很多,但值得注意的是,他们的产品通常价格较高。你可以在其他地方找到价格低至10-15美元的同类硬件。考虑到他们为创客社区创造了多少有价值的内容,Adafruct的溢价是可以理解的</p><div class=“large”><图><img src=“https://dri.es/files/cache/blog/esp32-s3-with-sht41-1280w.jpg“width=”1280“height=”850“alt=”ESP32-S3开发板与SHT41温度和湿度传感器相连,由电池组供电。比例尺包括2欧元硬币。SHT41传感器的尺寸大致相当于硬币,ESP32-S3板的直径约为硬币的两倍。“title=”带SHT41传感器的ESP32-S3开发板“>ESP32-S3开发板(中间)与Sensirion SHT41温度和湿度传感器(左侧)相连,由电池组(右侧)供电</em></figcaption></图></div><h3>Adafruit ESP32-S3 Feather的客户代码</h3><p>我使用<a href=“https://www.arduino.cc/en/software网站“>Arduino IDE</a>,一个广泛使用的平台,用于开发代码并将其上传到Arduino-compatible板</p><p>该代码每15分钟测量一次温度和湿度,连接到WiFi,并将此数据发送到<code>https://dri.es/传感器</code>,我的web服务端点</p>(第页)<p>我的目标之一是创建一个可以长时间运行而不需要给电池充电的系统。ESP32-S3支持“深度睡眠”模式,除时钟和内存外,它几乎关闭了所有功能。通过在两次测量之间将ESP32-S3置于深度睡眠模式,我能够显著降低功率</p>(第页)<p>现在您已经了解了高级设计目标,包括深度睡眠模式,我将在下面分享完整的客户端代码。它包括详细的代码注释,使其具有自解释性</p>(第页)<pre><code class=“language-c”tabindex=“0”>#include“Adafruit_SHT4x.h”#包括“Adafruit_MAX1704X.h”#包括“WiFiManager.h”#包括“ArduinoJson.h”#包括“HTTPClient.h”//Adafruit_SHT4x传感器是一种高精度的温度和湿度传感器//带I2C接口的传感器。Adafruit_SHT4x sht4=Adafruit _SHT4x();//Adafruit ESP32-S3羽毛配备内置MAX17048 LiPoly/LiIon//电池监控器。MAX17048可精确监控电池的//电压。利用Adafruit库,不仅可以帮助我们获得原始的//来自电池单元的电压数据,但也会将此数据转换为更多//直观的电池百分比或充电水平。我们将转交电池//web服务端点的百分比,该端点可以将其可视化或用于//当电池需要充电时发送通知。Adafruit_MAX17048 maxlipo;//setup()函数用于初始化设备的硬件和//通信。它在启动时执行一次。这里,我们开始连载//通信、初始化传感器、连接到Wi-Fi并发送初始//数据。无效设置(){序列开始(115200);//等待串行连接建立,然后继续。//这对于具有本机USB接口的板至关重要。如果没有这个循环,//发送到串行监视器的初始输出丢失。此代码不是//使用电池运行时需要。//延迟(1000);//从MAC地址的段生成唯一的设备ID。//由于MAC地址是永久的,并且在重新启动后保持不变,//这保证了设备ID保持一致。为了实现//压缩ID,仅使用MAC地址的特定部分,//特别是0x10000和0xFFFFF之间的范围。这个范围//转换为固定长度为5个字符的十六进制字符串,//为我们提供了大约100万个唯一ID。这种方法平衡了//具有紧性的唯一性。uint64_t芯片id=ESP.getEfuseMac();uint32_t设备值=((uint32-t)(芯片ID&gt;&gt;16)&amp;0x0FFFFF)|0x10000;char设备[6];//5个字符用于十六进制表示+空终止符。sprintf(设备,“%x”,设备值);//对小写十六进制字母使用“%x”//初始化SHT4x传感器:if(第4.begin()页){Serial.println(F(“SHT4温度和湿度传感器已初始化。”);sht4.设置精度(SHT4X_HIGH_PRECISION);sht4.设置加热器(SHT4X_NO_HEATER);}其他{Serial.println(F(“找不到SHT4传感器”);}//初始化MAX17048传感器:if(maxlip.begin()){Serial.println(F(“MAX17048电池监视器已初始化”);}其他{Serial.println(F(“找不到MAX17048电池监视器!”);}//插入一个短延迟,以确保传感器准备就绪且其数据稳定:延迟(200);//从SHT4传感器检索温度和湿度数据:传感器_事件_湿度、温度;sht4.getEvent(湿度和温度);//获取电池百分比,如果超过100%,则进行校准:float batteryPercent=最大脂细胞百分比();电池百分比=(电池百分比&gt;100)?100:电池百分比;WiFiManager WiFiManager;//取消注释下一行以删除所有保存的WiFi凭据。//这对于调试或重新配置很有用。//wifiManager.resetSettings();//此WiFi管理器尝试使用已知的//凭据,存储在RAM中。如果失败,设备将切换到Access//点模式,创建名为“温度监视器”的网络。在这种模式下,//连接到此网络,导航到设备的IP地址(默认IP//是192.168.4.1),配置门户将是//显示,允许您输入新的WiFi凭据。提交后,//设备将重新启动,并尝试使用连接到指定的网络//这些新证书。if(!wifiManager.autoConnect(“温度监视器”){Serial.println(F(“无法连接到WiFi…”));//如果设备无法连接到WiFi,它将重新启动并重试。//这种方法对于处理临时网络问题很有用。然而,//在网络持续不可用的情况下(例如路由器//下降一个多小时,信号一直很差)//重启和尝试WiFi连接可能会快速耗尽电池电量。ESP.重启();//允许重新启动过程正确启动的强制延迟:延迟(1000);}//将收集的数据作为JSON发送到指定的URL:发送JsonData(“https://dri.es/传感器“,设备,温度,湿度,相对湿度,电池百分比);//WiFi消耗大量电量,因此在完成后将其关闭:WiFi.断开连接(true);//进入深度睡眠15分钟。ESP32-S3的深度睡眠模式将//关闭大多数组件(RTC除外)的功耗。这个//这种模式对于电池供电的项目来说是有效的,因为这些项目需要持续运行//不需要。当设备在设置的时间段后唤醒时,它会运行//setup(),因为状态没有保留。Serial.println(F(“睡15分钟……”);ESP.deepSleep(15*60*1000000);//15分钟*60秒/分钟*1000000微秒/秒。}bool sendJsonData(const char*url,const char*device,浮子温度,浮子湿度,浮子电池){静态Json文档&lt;200&gt;文档;//将浮点值舍入到小数点后一位,以获得高效数据//变速箱。此方法减少了JSON有效负载的大小,即//对于使用电池运行的物联网应用程序非常重要。doc[“device”]=设备;doc[“temperature”]=字符串(温度,1);doc[“湿度”]=字符串(湿度,1);doc[“电池”]=字符串(电池,1);//将JSON序列化为字符串:字符串jsonData;serializeJson(doc,jsonData);//使用提供的URL初始化HTTP客户端:HTTPClient HTTPClient;httpClient.beggin(url);httpClient.addHeader(“内容类型”,“应用程序/json”);//发送HTTP POST请求:int httpCode=httpClient。POST(jsonData);//关闭HTTP连接:httpClient.end();//将调试信息打印到串行控制台:Serial.println(“Sent'”+jsonData+“”to“+String(url)+”,return code“+httpCode);返回(httpCode==200);}无效循环(){//ESP32-S3从深度睡眠中醒来后重置并运行setup(),//使这个连续循环变得不必要。}</code></pre><h3>进一步优化电池使用</h3><p>当我在2023年圣诞节前后推出温度计时,电池电量为88%。如今,这一比例为52%。一些快速计算表明,它每月大约消耗12%的电池。考虑到目前的使用率,它大约需要每8个月充电一次</p>(第页)<p>到目前为止,连接WiFi和发送数据是主要的电力消耗。为了延长电池寿命,我可以减少每15分钟发送一次更新的频率,只在温度发生变化时发送更新(温度通常不变或相差0.1°C),或者将多批数据点一起发送。这些方法中的任何一种都可以满足我的需要,但我还没有实现它们</p>(第页)<p>或者,我可以将微控制器连接到5V电源适配器,但这其中的乐趣何在?这违反了项目的“更多是更多”原则</p>(第页)<h3>处理web服务请求</h3><p>在ESP32-S3上运行客户端代码并将传感器数据发送到https://dri.es/传感器</code>,下一步是设置web服务端点以接收此传入数据</p>(第页)<p>当我使用<a href=“https://www.drupal.org/“>Drupal</a>对于我的网站,我在Drupal中实现了web服务端点。Drupal使用<a href=”网址:https://symfony.com/“>Symfony是一个流行的PHP框架,用于其架构的大部分。这种组合为实现web服务提供了一种简单但强大的方法,类似于其他现代服务器端web开发框架(如Laravel、Django等)中的方法</p><p>以下是我的<a href=“https://www.drupal.org/docs/drupal-apis/routing-system网站“>Drupal路由配置如下:</p><pre><code class=“language-yaml”tabindex=“0”>sensors.sensor_data:路径:“/sensors”方法:[POST]默认值:_控制器:“\Drupal\sensors\controller\SensorMonitorController::postSensorData”要求:_访问:“TRUE”</code></pre><p>上述配置指示Drupal向<code>发送POST请求https://dri.es/传感器</code>到<code>SensorMonitorController类的<code>postSensorData()方法</p>(第页)<p>此方法的实现处理请求身份验证,验证JSON有效负载,并将数据保存到MariaDB数据库表中。伪代码:</p>公共函数postSensorData(Request$Request):JsonResponse{$content=$request-&gt;获取内容();$data=json_decode($content,TRUE);//验证JSON负载://验证请求:$device=DeviceFactory::getDevice($data['device']);if($device){$设备-&gt;记录传感器事件($data);}return new JsonResponse(['message'=&gt;'谢谢!']);}</code></pre><p>为了测试web服务,您可以使用cURL等工具:</p><pre>$curl-X POST-H“内容类型:应用程序/json”-d'{“设备”:“0xdb123”,“温度”:21.5,“湿度”:42.5,“电池”:90.0}'https://localhost/sensors</code></pre><p>虽然cURL非常适合快速测试,但我使用<a href=“https://dri.es/phpunit-tests-for-drupal网站“>PHPUnit测试</a>用于<a href=”https://dri.es/my-drupal-deployment-workflow“>我的CI/CD工作流。这确保了一切正常,即使在升级Drupal、Symfony或堆栈的其他组件时也是如此</p><h3>将传感器数据存储在数据库中</h3><p><code>$device-&gt;的主要用途;传感器监控控制器:postSensorData()中的recordSensorEvent()</code>用于将传感器数据存储到SQL数据库中。因此,让我们深入研究数据库设计</p>(第页)<p>我对数据库后端的主要设计目标是:</p><ol><li>不是无限期地存储每个数据点,而是只保留所有设备上每种传感器类型的日平均值、最小值、最大值和最新读数</li><li>让您在未来轻松添加新设备和新传感器。例如,如果有一天我决定在卧室里增加一个二氧化碳传感器(这是我在脑海中做出的决定,但还没有达到我的另一半),我希望这很容易</li></ol><p>为此,我创建了以下MariaDB表:</p>创建表格传感器数据(日期日期,设备VARCHAR(255),传感器VARCHAR(255),平均值十进制(5,1),最小值小数(5,1),最大值小数(5,1),最小时间戳DATETIME,最大时间戳DATETIME,读数SMALLINT NOT NULL,唯一密钥UNIQUE_stat(日期、设备、传感器));</代码></pre><p>每个字段的简要说明:</p><ul><li><code>日期</code>:每个传感器读数的日期。当我们每天汇总数据时,它不包括时间成分</li><li><code>设备</code>:提供传感器数据的设备的设备ID,例如“地下室”或“卧室”</li><li>传感器:传感器的类型,例如“温度”、“湿度”或“二氧化碳”</li><li><code>avg_value</code>:当天传感器读数的平均值。由于没有存储单个读数,因此使用以下公式计算滚动平均值并更新每个新读数:<数学><mi>平均值</mi><mo>=</mo><mi>平均值</mi><mo>+</mo><mfrac><mrow><mi>新值</mi><mo>-</mo><mi>平均值</mi></mrow>新总读数</mfrac></math>。这种方法可能会累积较小的舍入误差,但模拟表明,对于这种用例,这些误差可以忽略不计</li><li><code>min_value</code>和<code>max_value</code>:传感器的每日最小和最大读数</li><li><code>min_timestamp和max_timestapp:记录当天最小值和最大值的确切时刻</li><li><code>读数</code>:全天读取的读数(或测量值)数量,用于计算滚动平均值</li></ul><p>实际上,<code>recordSensorEvent()</code>方法需要确定当前日期是否已经存在记录。根据此决定,它将插入新记录或更新现有记录</p>(第页)<p>在Drupal中,使用<a href=“https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Database%21Database.api.php/group/database/10“>Drupal的数据库层。此函数一步完成插入新数据和更新现有数据的操作</p>私有函数updateDailySensorEvent(string$sensor,float$value):void{$timestamp=\Drupal::time()-&gt;获取请求时间();$date=日期('Y-m-d',$timestamp);$datetime=日期('Y-m-d H:i:s',$timestamp);$connection=数据库::getConnection();$result=$connection-&gt;合并('sensor_data')-&gt;钥匙([“设备”=&gt$这个-&gt;身份证件,“传感器”=&gt$传感器,“日期”=&gt$日期,])-&gt;字段([“平均值”=&gt$值,“最小值”=&gt$值,“最大值”=&gt$值,'min_timestamp'=&gt$日期时间,“max_timestamp”=&gt$日期时间,“读数”=&gt;1,])-&gt;表达式('avg_value','平均值+((:新值-平均值)/(读数+1))',[':新值'=&gt;$value])-&gt;表达式('min_value','LEAST(min_value,:value)',[':value'=&gt;$value])-&gt;表达式('max_value','GREATEST(max_value,:value)',[':value'=&gt;$value])-&gt;表达式('min_timestamp','IF(LEAST(min_value,:value)=:value,:timestamp,min_timetamp)',[“:value”=&gt;$value,“:timestamp”=&lt;$datetime])-&gt;表达式('max_timestamp'、'IF(GREATEST(max_value,:value)=:value、:timestamp、max_timetamp)'、[':value'=&gt;$value、':timestamp'=&lt;$datetime])-&gt;表达式(“读数”,“读数+1”)-&gt;执行();}</code></pre><p>以下是查询的作用:</p><ul><li>它检查当前传感器和日期的记录是否存在</li><li>如果没有,它会创建一个带有传感器数据的新记录,包括初始平均值、最小值、最大值和最新值读数,以及这些值的时间戳</li><li>如果记录确实存在,它会使用新的传感器数据更新记录,调整平均值,如果新读数是新的最小值或最大值,则更新最小值和最大值及其时间戳</li><li>该功能还增加读数计数</li></ul><p>对于那些不使用Drupal的用户,可以使用MariaDB的<code><a href=“https://mariadb.com/kb/en/insert-on-uplicate-key-update/“>INSERT…ON DUPLICATE KEY UPDATE</a></code>命令,该命令允许基于指定的唯一键是否已存在于表中的相同条件插入或更新逻辑</p><p>以下是从<a href=“https://dri.es/effortless-inspection-of-drupal-database-queries“>MariaDB的一般查询日志帮助您开始:</p>插入传感器数据(设备、传感器、日期、最小值、最小时间戳、最大值、最大时间戳、读数)值(“0xdb123”,“温度”,“2024-01-01”,21,“2024-01-01 00:00:00”,21、“2024-01 00:00-00”,1);更新传感器数据设置最小值=最小值(最小值,21),min_timestamp=IF(最小值(min_value,21)=21,'2024-01-01 00:00:00',min_timetamp),最大值=最大值(max_value,21),max_timestamp=IF(最大值,21)=21,'2024-01-01 00:00:00',最大时间戳),读数=读数+1WHERE device=“0xdb123”AND sensor=“temperature”AND date=“2024-01-01”</代码></pre><h3>生成图形</h3><p>数据安全存储在数据库中后,下一步涉及生成图形。为了实现这一点,我编写了一些自定义PHP代码来生成可缩放向量图形(SVG)</p>(第页)<p>考虑到这篇博客文章已经很长了,我不告诉你细节。现在,那些好奇的人可以使用其web浏览器中的“查看源代码”功能来检查<a href=“https://dri.es/sensors/basement-belgium网站“>温度计页面</a></p><h3>结论</h3><p>有趣的是,法国香槟酒窖的参观引发了一个意想不到的项目。选择建造一个温度计而不是买一个,让我重新投入到对硬件和低级软件的旧有热情中</p>(第页)<p>我还喜欢控制自己的数据和软件。它给我一种控制感和创造力</p>(第页)<p>作为Drupal的项目主管,使用<a href=“https://www.drupal.org/“>Drupal为物联网(Internet-of-Things,IoT)后端带来了意想不到的喜悦。我喜欢Drupal这样开源平台的强大功能和灵活性</p><p>作为下一步,我希望为我的温度计设计一个外壳并进行3D打印,这是我以前从未做过的。如前所述,我还考虑集成其他传感器。敬请期待更新</p>(第页) 2024年3月12日星期二06:42:08-0400 Dries公司 645815d3-eac0-46cd-88ff-cebf62fc7a43 Drupal在日本和澳大利亚的冒险 https://dri.es/drupal-adventures-in-japan-and-astralia网址: <p>下周,我要去日本和澳大利亚旅行。我以前去过这两个国家,迫不及待地想回来——它们是我在世界上最喜欢的地方之一</p>(第页)<p>我的目标是与每个国家的本地Drupal社区建立联系,讨论Drupal的未来,相互学习,合作</p>(第页)<p>我还将与Acquia在这两个国家的客户和合作伙伴联系,分享我们的愿景、战略和产品路线图。作为其中的一部分,我期待着与Acquia团队一起度过一段时间——大约20名员工在日本,35名员工在澳大利亚</p>(第页)<p>我将在<a href=“https://connpass.com/event/307570/“>Drupal活动于3月14日晚在日本雅虎举行</p><p>在澳大利亚期间,我将参加<a href=“https://drupalsouth.org/events/drupalsort-sydney-2024“>Drupal South于3月20日至22日在悉尼共济会中心举行。我很高兴能在3月20日上午发表开幕式主题演讲,届时我将深入研究Drupal的过去、现在和未来</p>(第页)<p>我期待着回到澳大利亚和日本,与老朋友和当地社区重新联系</p>(第页) 2024年3月4日,星期一17:23:50-0500 德里斯 1643f1bb-6bc2-41a9-b4b3-22667d57b6a3 两年后:我的Web3网站还存在吗? https://dri.es/两年后-is-my-web3-website-still-standing <图><img src=“https://dri.es/files/cache/blog/web3-exploration-1280w.jpg“width=”1280“height=”853“alt=”平台上的两个人观察分散的节点网络。“title=”Web3探索“></图><p>两年前,<a href=“https://dri.es/my-first-web3-网页“>我使用<a href=”https://ipfs.io/“>IPFS</a>(行星间文件系统)和<a href=”https://ens.domains网址/“>ENS(以太坊名称服务)。当时,Web3工具受到了很多媒体的关注,我想尝试一下</p><p>自从两年前我建立Web3网站以来,我基本上忘记了它。两年来我没有更新它,也没有关注它。但现在我们已经达到了两年的目标,我很好奇:我的Web3网站还在线吗</p>(第页)<p>当时,我还指出,Web3不适合托管现代web应用程序,除了一个小的利基:需要高弹性和不频繁的内容更新的静态站点</p>(第页)<p>我还好奇地探索Web3技术的演变,看看它们是否更适用于网站托管</p>(第页)<h3>我最初的Web3实验</h3><p>在我最初的博客文章中,我记录了建立Web3托管的“Hello World”的过程。我在IPFS上存储了一个HTML文件,使用“固定服务”确保其可用性,并使用ENS域访问它</p>(第页)<p>对于那些对Web3有基本了解的人来说,以下是两年前我启动第一个Web3网站的步骤摘要:</p><ol><li><strong>购买了ENS域名:</strong>我使用以太坊的加密钱包通过<a href=“https://ens.domains网址/“>以太坊名称服务</a>,传统DNS(域名系统)的分散替代方案</li><li><strong>将HTML文件上传至IPFS:</strong>我将静态HTML页面上传至https://ipfs.io/“>InterPlanetary File System(IPFS),它涉及运行我自己的IPFS节点并利用各种固定服务,如<a href=”网址:https://infura.io/“>感染,<a href=”https://fleek.co网址/“>Fleek和<a href=”https://pinata.cloud网站/“>Pinata</a>。这些钉扎服务确保即使我自己的IPFS节点离线,内容也能保持在线可用</li><li><strong>访问了网站:</strong>我确认我的网站可以通过兼容IPFS的浏览器访问</li><li><strong>将我的网页映射到我的域名:</strong>最后一步,我将我的IPFS-hosted站点链接到我的ENS域<code>dries.eth</code>,使网页可以用一个简单的域名访问</li></ol><p>如果上述四个步骤让您感到困惑,我建议您阅读<a href=“https://dri.es/my-first-web3-网页“>我的原始帖子</a>。它有2000多个单词,包括屏幕截图和上述步骤的详细说明</p><h3>检查各种Web3服务的脉搏</h3><p>作为我检查的第一步,我想验证一下我在原始博客文章中引用的各种服务是否仍在运行</p>(第页)<p>下表显示的结果非常令人鼓舞:以太坊、ENS、IPFS、Filecoin、Infura、Fleek、Pinata和web3.storage都可以运行</p>(第页)<p>ENS和IPFS这两项主要技术都得到了积极维护和开发。这表明Web3技术已经奠定了坚实的基础</p>(第页)<表格><tr>服务描述2024年2月左右)</tr><tr><td><a href=“https://ens.domains网址/“>ENS公司</a></td><td>基于区块链的命名协议为Web3提供DNS,将域名映射到以太坊地址</td><td>是的</td></tr><tr><td><a href=“https://ipfs.io/“>IPFS</a></td><td>用于在分布式文件系统中存储和共享数据的对等协议</td><td>是的</td></tr><tr><td><a href=“https://filecoin.io/“>文件币</a></td><td>基于区块链的存储网络和加密货币,激励数据存储和复制</td><td>是的</td></tr><tr><td><a href=“网址:https://infura.io/“>感染</a></td><td>提供工具和基础设施来管理IPFS上的内容,以及其他工具,供开发人员将其应用程序连接到区块链网络并部署智能合约</td><td>是</td></tr><tr><td><a href=“https://fleek.co网址/“>弗莱克</a></td><td>使用IPFS和ENS构建网站的平台</td><td>是的</td></tr><tr><td><a href=“https://pinata.cloud/“>皮纳塔</a></td><td>提供工具和基础架构来管理IPFS上的内容,最近还提供了<a href=“网址:https://www.farcaster.xyz/“>Farcaster应用程序</td><td>是的</td></tr><tr><td><a href=“https://web3.storage网站/“>web3.存储</a></td><td>提供工具和基础结构来管理IPFS上的内容,并支持Filecoin</td><td>是的</td></tr></表格><h3>我的Web3网站还在运行吗</h3><p>看到所有这些Web3服务都在运行是令人鼓舞的,但最终的测试是检查我的Web3网页<code>dries.eth</code>是否仍然有效。这些服务正常运行是一回事,但我的网站正常运行又是另一回事。以下是我在详细检查中发现的:</p><ol><li><strong>域所有权验证:</strong>快速检查https://etherscan.io/name-lookup-search?id=dries.eth“>etherscan.io</a>确认<code>dries.eth</code>仍然向我注册。放心</li><li><strong>ENS注册商访问:</strong>使用我的加密钱包,我可以轻松登录ENS注册器并管理我的域。我甚至成功地将<code>dries.eth更新为测试</li><li><strong>IPFS内容可用性:</strong>我的网页仍然可以在IPFS上使用,这要归功于两年前钉住了它。登录<a href=“https://fleek.co网址/“>Fleek和<a href=”https://pinata.cloud网站/“>Pinata</a>,我在他们的管理仪表板上找到了我的内容</li><li><strong>Web3和ENS网关访问:</strong>我可以使用Web3浏览器访问<code>dries.eth,也可以通过与IPFS兼容的ENS网关,如<a href=“网址:https://dries.eth.limo/">https://dries.eth.limo(网址:https://dries.eth.limo)/</a>–一项以隐私为中心的服务,自我第一次发表博客文章以来,这是一项全新的服务</li></ol><p>判决?不仅这些Web3服务仍在运行,而且我的网页也在继续工作</p>(第页)<p>这一点尤其值得注意,因为我没有登录这些服务,没有进行任何维护,或者两年没有支付任何托管费用(我使用的固定服务有一个免费层)</p>(第页)<h3>亲自访问我的Web3页面</h3><p>对于有兴趣访问我的Web3页面的人(也许是你第一次访问Web3?),有几种方法可供选择,每种方法都有不同的Web3程度</p>(第页)<ul><li><strong>使用支持Web3的浏览器:</strong>浏览器,如<a href=“https://ballow.com网站/“>勇敢</a>和<a href=”https://www.opera.com/“>Opera</a>提供内置的ENS和IPFS支持。它们可以解析ENS地址和解释IPFS地址,使得通过HTTP或HTTPS浏览IPFS内容就像浏览传统web内容一样容易</li><li><strong>安装Web3浏览器扩展:</strong>如果您喜爱的浏览器不支持现成的Web3,请添加浏览器扩展,如<a href=“https://metamask.io/“>MetaMask可以帮助您访问Web3应用程序。MetaMask可与Chrome、Firefox和Edge配合使用。它允许您使用<code>.eth</code>域进行以太坊事务或访问IPFS上的内容</li><li><strong>通过ENS网关访问:</strong>对于那些寻求最简单方式访问Web3内容而不安装任何新内容的人,使用ENS网关,例如https://eth.limo/“>eth.limo</a>是最简单的方法。此网关将ENS域映射到DNS,提供直接导航到Web3站点,如我的<a href=”网址:https://dries.eth.limo/">网址:https://dries.eth.limo/</a>。它是Web2(传统web)和Web3之间的简单桥梁</li></ul><h3>使用IPNS优化内容更新</h3><p>在<a href=“https://dri.es/my-first-web3-网页“>我的原始帖子</a>,我强调了各种挑战,例如托管动态应用程序的限制、更新的成本以及这些更新的速度较慢。虽然这些问题仍然存在,但我的初步分析是在对可用技术的不完全理解的情况下进行的。我想深入研究这些限制s、 并完善我之前的陈述</p>(第页)<p>其中一些挑战源于IPFS作为“内容寻址网络”运行的事实。与使用URL或文件路径定位内容的传统系统不同,IPFS使用内容本身的唯一散列。此散列用于定位和验证内容,但也有助于分散存储</p>(第页)<p>虽然通过散列寻址内容的原理非常有趣,但它也引入了一些复杂因素:每当内容更新时,其散列都会发生变化,这使得链接到更新的内容变得非常困难。具体来说,每次我更新Web3站点的内容时,我都必须更新我的ENS记录,并在以太坊网络上支付翻译费</p><p>当时,我对<a href=“https://docs.ipfs.tech/concepts/ipns/“>InterPlanetary Name System(IPNS)。不要将IPNS与IPFS混淆,IPNS通过为IPFS上的内容分配可变名称来解决此挑战。您可以将IPNS视为提供“别名”或“针对IPFS地址的重定向”:IPNS地址始终保持不变并指向最新的IPFS地址。它有效地消除了每次内容更改时更新ENS记录的必要性,减少了开支,并使更新过程更加自动化和高效</p><p>要利用IPNS,您必须采取以下步骤:</p><ol><li>将HTML文件上载到IPFS并接收IPFS哈希</li><li>将此哈希发布到IPNS,创建一个指向最新IPFS哈希的IPNS哈希</li><li>将您的ENS域链接到此IPNS哈希。由于IPNS散列保持不变,因此只需更新一次ENS记录</li></ol><p>如果没有IPNS,更新内容将涉及:</p><ol><li>更新HTML文件</li><li>将修改后的文件上载到IPFS,生成新的IPFS哈希</li><li>用新的IPFS散列更新ENS记录,这需要一些Ether,可能需要几分钟</li></ol><p>使用IPNS,更新内容包括:</p><ol><li>更新HTML文件</li><li>将修改后的文件上载到IPFS,生成新的IPFS哈希</li><li>更新IPNS记录以引用这个新的散列,它是免费的,几乎是即时的</li></ol><p>尽管与原始方法相比,IPNS是一种更快、更具成本效益的方法,但它仍然具有一定的复杂性。由于额外的重定向步骤,还存在较小的运行时延迟。然而,我相信这种权衡是值得的</p><h3>更新我的Web3站点以使用IPNS</h3><p>有了这些新发现的知识,我决定在自己的网站上使用IPNS。我使用IPFS桌面应用程序(见屏幕截图)和IPFS的命令行工具生成了一个IPNS哈希:</p>$ipfs-name publish/ipfs/bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q&gt;发布至k51qzi5uqu5dgy8mzjtcqvgr388xjc58fwpreddbb1fisq1kvl34sy4h2qu1a:/ipfs/bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q<图><img src=“https://dri.es/files/images/blog/publish-to-ipns-from-ipfs-desktop.png“width=”2210“height=”1604“alt=”IPFS Desktop应用程序的屏幕截图,显示HTML文件,下拉菜单选项为“发布到IPNS”。“title=”从IPFS桌面发布到IPNS“><figcaption><em>IPFS Desktop应用程序显示带有“发布到IPNS”选项的index.html文件</em></figcaption></图><p>生成IPNS散列后,我可以使用IPFS协议访问Brave中的站点ipfs://bafybeibbkhmln7o4ud6an4qk6bukcpri7nhiwv6pz6ygslgtsrey2c3o3q</code>,或通过位于<code>的IPNS协议ipns://k51qzi5uq5dgy8mzjtcvgr388xjc58fw预定义b1fisq1kvl34sy4h2qu1a</code></p>(第页)<图><img src=“https://dri.es/files/images/blog/勇敢-ipns.png“width=”1588“height=”1050“alt=”浏览器窗口显示简单的;你好,世界&quot;IPNS上的网页。“title=”勇敢的IPNS“>使用IPNS的Brave中的My Web3站点</em></figcaption></图><p>接下来,我更新了<code>dries.eth</code>的ENS记录,以链接到我的IPNS散列。这个改变让我付出了代价0.0011以太币(目前为4.08美元),如<a href=“https://etherscan.io/tx/0xfc8be3add432e7440478897726eced850087cb8a1f79dcdeb926e575c31e3f8c“>Etherscan事务</a>。一旦事务处理完毕,<code>就会变干。eth开始定向到新的IPNS地址</p><图><img src=“https://dri.es/files/images/blog/ipns-record-on-ereum-name-service.png“width=”2048“height=”1536“alt=”确认以太坊名称服务上“dries.eth”的更新内容哈希的屏幕,带有查看以太坊上交易的链接。“title=”以太坊名称服务上的IPNS记录“><figcaption><em><A href=“https://ens.domains网址/“>ENS网站</a>,成功更新了<code>dries.eth。</em></figcaption></图><h3>正在ENS中回滚我的IPNS记录</h3><p>不幸的是,我的兴奋是短暂的。一天后,<code>dries.eth停止工作。事实证明,IPNS记录需要保存下来,这是一个艰难的教训</p>(第页)<p>虽然IPFS内容可以通过“固定”持久化,但IPNS记录需要定期“重新发布”才能保持活动状态。本质上,网络的分布式哈希表(DHT)可能会在一定时间(通常是24小时)后删除IPNS记录。为了防止删除IPNS记录,所有者必须在DHT忘记它之前“重新发布”它</p><p>我发现我使用的固定服务–<a href=“https://dolphin.io网址“>海豚,<a href=”https://fleek.co网址“>Fleek</a>和<a href=”https://pinata.cloud网站“>Pinata</a>–不支持IPNS重新发布。进一步研究发现,很少有IPFS提供商支持。</p><p>在我的研究中,我发现<a href=“https://filebase.com“>Filebase</a>,一家总部位于波士顿的小型公司,只有不到五名员工,这是我以前从未见过的。有趣的是,他们同时提供IPFS固定和IPNS重新发布。然而,要固定我现有的HTML文件并重新发布其IPNS散列,我必须订阅他们的服务,每月费用为20美元</p><p>面对保持IPNS散列活动的挑战,我发现自己正处于十字路口:要么每月花20美元购买Filebase之类的服务,为我处理IPNS重新发布,要么负责运行我自己的IPFS节点</p><p>当然,分散存储的全部意义在于人们运行自己的节点。然而,考虑到我的项目范围(单个HTML文件),运行专用节点的工作量似乎不成比例。我还在我的个人笔记本电脑上运行IPFS节点,它并不总是在线的。也许有一天我会尝试在Raspberry Pi或类似的设置上设置一个专用的IPFS节点</p>(第页)<p>最终,我决定将我的ENS记录切换回原来的IPFS链接。此更改记录在<a href=“https://etherscan.io/tx/0xb2d68b8244daa4412c8a04d13c66c8705cdeb2233c8f219486c14225ac90440a“>Etherscan交易</a>,花费我0.002以太币(目前为6.88美元)</p><p>尽管IPNS奏效了,或者可以奏效,但它对我来说并不奏效。尽管遇到了挫折,但整个经历都是一次很棒的学习之旅</p>(第页)<p><i> (更新:发布此博客帖子几天后,有人善意推荐<A href=“https://dwebservices.xyz/">https://dwebservices.xyz/</a>,声称其免费层包括IPNS重新发布。虽然我还没有亲自测试,但请快速浏览<a href=“https://dwebservices.xyz/关于/“>他们的about页面</a>表明他们可能是一个很有前途的解决方案。)</i></p><h3>Web3对大多数人来说仍然太复杂</h3><p>在过去两年里,Web3托管并没有扰乱主流网站托管市场。尽管Web3很有吸引力,但主流网站托管简单、可靠,能够满足几乎所有用户的需求</p>(第页)<p>尽管Ethereum网络进行了重大升级https://ethereum.org/en/energy-consumption网站/“>通过过渡到权益证明(PoS),能耗降低了99%以上共识机制、环境考虑,尤其是与区块链技术相关的碳足迹,继续为Web3技术的广泛采用带来更多挑战。(注:ENS在区块链上运行,但IPFS没有。)</p><p>在检查过程中,我发现了创新和进步的孤岛。钱包和ENS域变得更容易使用。然而,与Web2托管的简单性相比,使用IPFS和ENS创建基本网站的整个过程仍然相对复杂</p>(第页)<h3>需要与SQL兼容的Web3数据库</h3><p>使用<a href=“网址:https://www.drupal.org/“>Drupal和<a href=”https://wordpress.org/“>WordPress依赖于一个技术堆栈,其中包括文件系统、域名系统(例如DNS)、数据库(例如MariaDB或MySQL)和服务器端运行时环境(例如PHP)<p>虽然IPFS和ENS为前两个提供了分散的替代方案,但数据库和运行时环境的等效方案还不太成熟。这限制了可以轻松从Web2移动到Web3的应用程序类型</p><p>一个重大突破是开发一个与SQL兼容的分散式数据库,但目前这似乎并不存在。在没有中央机构的情况下确保跨多个节点的数据完整性和机密性,以及满足现代web应用程序的吞吐量需求的复杂性,可能太复杂而难以解决</p>(第页)<p>毕竟,区块链作为去中心化的数据库已经发展了十多年,但缺乏对SQL语言的支持,并且在动态网站所需的速度和效率方面还不够</p>(第页)<h3>需要分布式运行时</h3><p>现代网站的另一个关键组件是运行时环境,它执行web应用程序的服务器端逻辑。传统上,这是PHP、Python、Node.js、Java等的领域<p><a href=“https://en.wikipedia.org/wiki/WebAssembly网站“>WebAssembly</a>(WASM)可能成为一种潜在的解决方案。它可以成为一种有趣的分散式解决方案,因为WASM二进制文件可以托管在IPFS上。</p><p>然而,当WASM在客户端(即在浏览器中)运行时,它无法提供服务器端环境的全部功能。这种限制使得完全复制传统web应用程序变得非常困难</p>(第页)<p>因此,目前Web3的应用程序非常有限。虽然可以在IPFS上托管静态网站,但需要数据库交互和服务器端处理的动态应用程序很难过渡到Web3。</p><h3>弥合Web2和Web3之间的差距</h3><p>短期内,最有可能的前进道路是将分散技术与传统技术相结合。例如,网站可以将其静态文件存储在IPFS上,同时依靠传统的Web2解决方案实现其动态功能</p>(第页)<p>展望未来,<a href=“网址:https://orbitdb.org/“>OrbitDB与IPFS集成的点对点数据库显示出了良好的前景。然而,Orbit数据库缺乏与SQL的兼容性,这意味着应用程序需要重新设计,而不是简单地传输</p><h3>Web3网站托管仍然是利基</h3><p>即使是托管不需要数据库或服务器端处理的静态网站的任务,在Web3生态系统中也是相对合适的</p>(第页)<p>正如我在<a href=“https://dri.es/my-first-web3-网页“>我的原始帖子</a>:<q>在目前的状态下,IPFS和ENS对大多数网站所有者的价值有限,但对所有网站所有者中非常狭小的一部分来说却有巨大的价值</p><p>IPFS和ENS因其在审查阻力和可靠性方面的优势而脱颖而出。然而,对于大多数用户来说,Web2托管静态站点的便利性和充分性往往超过了这些好处</p>(第页)<p>更广泛地接受新技术(如Web3)的关键在于发现新的大规模市场用例或显著增强现有用例的用户体验。Web3没有找到通用应用程序,或者在用户体验方面没有超过Web2</p>(第页)<p>SaaS平台的流行强调了这一点。它们之所以占据主导地位,并不是因为它们是最具弹性或最稳健的选择,而是因为它们最方便。尽管Web3提供了弹性和自主权的好处,但大多数人选择弹性较小但更方便的SaaS解决方案</p><h3>结论</h3><p>尽管在Web3上投资了数十亿美元并取得了显著进展,但其用于网站托管仍有很大的局限性</p>(第页)<p>Web3社区面临的主要挑战是开发新的、具有广泛吸引力的应用程序,或者显著提高现有技术的可用性</p>(第页)<p>网站托管属于现有用例的类别</p>(第页)<p>不幸的是,Web3仍然主要局限于静态网站,因为它还没有提供SQL数据库和服务器端运行时的强大替代方案</p>(第页)<p>即使在静态网站的有限范围内,用户体验的改进也微不足道,只关注技术堆栈的各个部分。整体端到端体验仍然很复杂</p>(第页)<p>尽管如此,我的Web3页面在两年后仍在运行,这一事实令人鼓舞,表明了底层技术的健壮性,即使其当前的使用仍然有限。我越来越喜欢IPFS,我希望将来能用它做更多有用的实验</p>(第页)<p>综上所述,我认为Web3不会很快在网站托管领域掀起风暴。也就是说,随着时间的推移,Web3可能会变得更具吸引力和功能性。总之,关注这个空间绝对是有趣和值得的</p>(第页) 2024年2月29日星期四10:06:36-0500 德里斯 cc821181-2e4b-4e66-94c5-3987b34df49e Acquia是2024年Gartner数字体验平台幻方图的领导者 https://dri.es/acquia-a-leader-in-the-2024-gartner-magic-quadrant-for-digital-experience-platforms <图><img src=“https://dri.es/files/images/acquia/gartner-magic-quadrant-for-digital-experience-platforms-2024.png“width=”2794“height=”3200“alt=”显示2024年数字体验平台状态的图表。供应商根据其执行能力和愿景的完整性绘制在网格上。Acquia被置于“领导者”象限,表明其在愿景和执行力方面表现出色。“title=”2024 Gartner数字体验平台幻方图“></图><p>连续第五年,<a href=“https://www.acquia.com/“>Acquia已在<a href=”https://www.acquia.com/resources/report/gartner-dxp-magic-象限“>Gartner数字体验平台幻方图(DXP)</a></p><p>Acquia从<a href=“https://www.gartner.com/“>Gartner基于产品愿景的完整性和执行能力</p><p>我们的愿景和执行的核心是对开放的深刻承诺。利用<a href=“https://www.drupal.org/“>Drupal,<a href=”网址:https://www.mautic.org/“>Mautic和开放API,我们构建了最开放的DXP,使客户和合作伙伴能够根据他们的需求定制我们的平台</p><p>我们对开放性的强调延伸到确保我们的解决方案具有可访问性和包容性,让每个人都能使用。我们还优先考虑通过数据安全和合规性建立信任,这是我们开放哲学的组成部分</p>(第页)<p>我们很荣幸被纳入本报告,并感谢我们的客户和合作伙伴的支持与合作</p>(第页)<h3>Gartner的强制性免责声明</h3><div style=“font-size:80%;过滤器:亮度(85%);”><p>Gartner,数字体验平台幻方图,Irina Guseva,Jim Murphy,Mike Lowndes,John Field,2024年2月21日</p><p>此图由Gartner,Inc.发布,作为更大研究文档的一部分,应在整个文档的上下文中进行评估。可根据Acquia的要求提供Gartner文档</p>(第页)<p>Gartner不支持其研究出版物中描述的任何供应商、产品或服务,也不建议技术用户仅选择评级最高或其他指定的供应商。Gartner研究出版物由Gartner的研究机构的意见组成,不应被解释为事实陈述。Gartner不承担与本研究相关的所有明示或暗示担保,包括任何适销性或特定用途适用性担保</p>(第页)<p><i> Gartner是Gartner的注册商标和服务标志,而幻方图是GartnerInc.和/或其附属公司在美国和国际上的注册商标,并经许可在此使用。保留所有权利</p>(第页)</div> 2024年2月26日,星期一17:09:19-0500 德里斯 6a40661f-116e-4369-9411-19aeaf5dfdc5 中本佐治的Drupal冒险 https://dri.es/satoshi-nakamoto-drupal-adventure网站 <p>比特币项目的早期贡献者马尔蒂·马尔米(Martti Malmi)最近分享了一段精彩的互联网历史:https://mmalmi.github.io/satoshi网站/“>他与比特币神秘创始人中本聪之间的私人电子邮件存档</p><p>中本聪的身份仍然是科技界最大的谜团之一。尽管多年来进行了广泛的调查、投机性报道和无数的声明,但比特币创造者的真实身份仍不得而知</p>(第页)<p>Martti Malmi发布了这些<a href=“https://mmalmi.github.io/satoshi网站/“>私人对话</a>针对一个法院案件,重点关注中本聪的真实身份以及比特币品牌和技术的合法权益</p><p>这些电子邮件提供了比特币早期的一些有趣细节,也可能为佐藤的身份提供一些新线索</p>(第页)<p>Satoshi和Martti在很多方面进行了合作,包括重新推出比特币网站。他们的目标是扩大公众对比特币的理解和认识</p>(第页)<p>令我惊讶的是,电子邮件显示他们选择了<a href=“https://www.drupal.org/“>Drupal作为他们首选的CMS!(感谢<a href=”https://www.drupal.org/u/jeremy网站“>杰里米·安德鲁斯让我意识到。)</p><图><img src=“https://dri.es/files/images/drupal/satoshi-martti-drupal-1.png“width=”1280“height=”440“alt=”Satoshi Nakamoto给Martti Malmi的电子邮件,日期为2009年12月,内容是关于比特币的新Drupal网站上线,是对旧的比特币.org页面的改进。“title=”Satoshi向Martti发送关于在Drupal上发布的邮件“></图><p>这些电子邮件详细介绍了Satoshi的实际参与,从安装Drupal主题到配置Drupal的<code>.htaccess</code>文件,再到探索Drupal多语言功能</p>(第页)<图><img src=“https://dri.es/files/images/drupal/satoshi-martti-drupal-2.png“width=”1280“height=”650“alt=”Satoshi Nakamoto给Martti Malmi的电子邮件,日期为2009年11月,讨论Drupal主题安装并比较Drupal和Joomla!。“title=”Satoshi向Martti发送关于Drupal主题和Joomla的邮件!"></图><p>在对话的某个时候,Satoshi对Drupal的论坛模块表示了保留意见</p>(第页)<图><img src=“https://dri.es/files/images/drupal/satoshi-martti-drupal-3.png“width=”1280“height=”740“alt=”Satoshi Nakamoto给Martti Malmi的电子邮件,日期为2009年11月,内容是关于Drupal作为CMS而非Wiki,并表示Drupal的论坛功能并不理想,但优于Wiki。“title=”Satoshi向Martti发送邮件,介绍Drupal的论坛功能“></图><p>值得一提的是,这证明我不是中本佐治。如果我是,我会立刻选择Drupal,而且我永远不会质疑Drupal的论坛模块</p>(第页)<p>除了玩笑之外,作为Drupal的创始人和项目负责人,了解Satoshi对Drupal使用的情况是Drupal丰富历史的一个很好补充。几乎每天,我都会被Drupal带来的意想不到的影响所鼓舞</p>(第页) 2024年2月25日星期日15:02:18-0500 德里斯 ec97c277-d0df-46a9-9b6c-ee7a9b048c9c 再见第三方cookie https://dri.es/goodby-third-party-cookie <图><img src=“https://dri.es/files/cache/drupal/cookieless-future-1280w.jpg“width=”1280“height=”717“alt=”一位男性商务人士在未来的加密朋克环境中使用笔记本电脑。“title=”无Cookie未来“></图><p>近三十年来,<strong>第三方cookie一直是网络上的主要隐私问题。它们允许广告商等组织跟踪用户在多个网站上的浏览活动,通常无需明确同意</p>(第页)<p>与第三方Cookie不同,<strong>第一方Cookie</strong>仅限于您所在的网站。它们通常用于改善用户体验,例如保持您登录、记住购物车中的内容等</p>(第页)<p>当然,第一方cookie也可以像Google Analytics一样用于跟踪您的活动,但不能用于跟踪该站点以外的用户。虽然这两种类型的cookie都可以用于跟踪用户,但第三方cookie的侵入性更强,问题更大</p>(第页)<p>2018年,我决定从我的个人网站上删除所有跟踪工具,包括谷歌分析。我的网站追求印刷作品的隐私。一本书的匿名性具有独特的魅力,我很高兴不知道谁会访问我的网站</p>(第页)<p>也就是说,我对使用第一方cookie没有异议,前提是它是双方同意的,并用于改善用户体验。我理解它们对许多组织的重要性,尤其是在营销方面</p>(第页)<p>幸运的是,第三方cookie的时代即将结束。Safari和Firefox等浏览器已经采取措施限制第三方跟踪。他们仍然允许某些第三方Cookie来确保网站正常工作。两个示例包括:</p><ol><li>电子商务网站通常依靠第三方cookie来集成支付系统。阻止这些cookie可能会中断支付过程</li><li>复杂的数字平台,如医疗保健和政府网站,有时使用跨站点身份验证链接部门网站&nbsp;阻止这些可能会阻止访问重要服务</li></ol><p>虽然Safari和Firefox限制第三方Cookie已有一段时间,但谷歌Chrome却落后了&nbsp;谷歌直到2024年初(几周前)才开始逐步淘汰第三方cookie,最初只有1%的用户。他们的计划是到2024年底将其扩展到所有用户</p><p>谷歌的战略可以从两个方面看:</p><ol><li>消极地说,谷歌可能会推迟淘汰计划,因为它从这些cookie产生的广告收入中获利</li><li>积极地说,谷歌在删除第三方cookie方面非常谨慎,以避免干扰那些出于非广告目的而依赖第三方Cookie的网站</li></ol><p>作为一个普通的Chrome用户,我不想等到2024年底。如果你也这么认为的话,你现在可以在Chrome中屏蔽第三方cookie。只需前往<code>Settings(设置)</code>,选择<code>Privacy and Security(隐私和安全)</ccode>,然后激活<code]Block third cookie(阻止第三方cookie)</code>&nbsp;只是要小心,因为有些网站可能会停止工作</p>(第页)<p>如果您管理或开发网站,请检查它们是否依赖第三方Cookie。使用<a href=“https://dri.es/the-little-http-header-analyzer-that-could“>my HTTP Header Analyzer</a>检查指示第三方cookie的<code>SameSite=None属性,或通过在Chrome中禁用它们进行测试</p> 2024年2月5日,星期一06:57:52-0500 德里斯 48879b92-bf1a-4b1f-bb0f-0d19a7ff747f 小型HTTP头分析器 https://dri.es/the-little-http-header-analyzer-that-could <p>HTTP标头在使您的网站快速安全方面起着至关重要的作用。出于这个原因,我经常检查HTTP头以排除缓存问题或检查安全设置</p>(第页)<p><a href=“https://www.rfc-editor.org/rfc/rfc9110.html“>HTTP标准和记住所有最佳实践的挑战促使我开发了一个https://dri.es/headers(标题)“>HTTP标头分析器</a>四年前</p><p>它非常简单:输入一个URL,该工具将分析web服务器、CMS或web应用程序发送的标题。然后解释这些标题,给出分数,并建议可能的改进</p>(第页)<p>有关演示,请单击<code><a href=“https://dri.es/headers?url=https://www.reddit.com">https://dri.es/headers?url=https://www.reddit.com</a></code>。正如URL所示,它将分析<a href=“https://www.reddit.com/“>Reddit.com</a></p><p>我在COVID早期的一个周末项目中就开始了这项工作,将其视为我工具包中的另一个补充。当时,我只是将其添加到我的<a href=“https://dri.es/项目“>项目页面</a>,但从未在我的博客上宣布或提及</p><p>那么为什么现在就写呢?因为我碰巧检查了我的日志文件,你瞧,这台小扫描仪可以扫描500多万次,平均每天超过3500次</p>(第页)<p>所以四年后,经过五百万次扫描,我终于向世界宣布了</p>(第页)<p>如果您还没有尝试过我的HTTP头分析器,<a href=“https://dri.es/headers(标题)“>查看它</a>。它是免费的,易于使用,无需注册,并且旨在帮助提高网站的性能和安全性</p><p>爬虫适用于所有网站,但很自然,我为<a href=“https://www.drupal.org“>Drupal</a>站点</p><p>我对爬行器没有任何重大计划。在某种程度上,我想把它转移到自己的域中,因为它作为我个人网站的一部分有点不合适。但就目前而言,这不是一个优先事项</p>(第页)<p>目前,我愿意接受任何反馈或建议,并将致力于做出任何必要的更正或改进</p>(第页)<p>知道这个工具让成千上万的网站变得更快、更安全是值得的!这也是一个很好的提醒,让你分享你的工作,即使是以最简单的方式——你永远不知道它可能产生的影响</p>(第页) 2024年2月1日星期四08:49:25-0500 德里斯 992e1b2b-088d-4d2e-9867-21d1cb0d58dd