这份官方教程在7月初发布的，等到现在好像也没有汉化版，所以直接上手学了，顺便把我翻译的章节放上来。原书地址：https://PyTorch.org/assets/deep-learning/Deep-Learning-with-PyTorch.pdf配套代码：https://github.com/deep-learning-with-PyTorch/dlwpt-code本书论坛：https://livebook.manning.com/#!/book/deep-learning-with-PyTorch/discussion[scode type="yellow"]本人深度学习小白，英文水平极其有限，大部分地方都借助了翻译软件，仅作为学习过程的记录，大家学的话还是直接看原文或者等其他人翻译。另：有删减。[/scode]深度学习革命为了领会这种深度学习方法所带来的范式转变，让我们回过头来看一看。直到过去十年，机器学习严重依赖于特征工程（feature engineering）。特征是对输入数据的转换，便于下游算法（如分类器）在新数据上产生正确的结果。特征工程包括提出正确的变换，以便下游算法能够解决一个任务。例如，为了区分手写数字图像中的1和0，我们会想出一组滤波器来估计图像上的边缘方向，然后训练一个分类器来预测给定边缘方向分布的正确数字。另一个有用的特征可能是封闭的孔的数量，如0、8。深度学习则从原始数据中自动找到这样的表征，以成功执行任务。在1与0的例子中，过滤器会在训练过程中通过反复观察成对的例子和目标标签来完善。这并不是说深度学习中没有特征工程，我们经常需要在学习系统中注入某种形式的先验知识。然而，神经网络能够摄取数据，并在例子的基础上提取有用的表征，这就是深度学习的强大之处。深度学习从业者的关注点并不在于手动制作这些表征，而是在数学实体上进行操作，使其从训练数据中自主发现表征。通常情况下，这些自动创建的特征比那些手动制作的特征更好！与许多颠覆性技术一样，这一事实导致了观念的改变。在图1.1的左侧，我们看到一个从业者正在忙着定义工程特征，并将其输入到学习算法中；任务的结果将和从业者的工程特征一样好。右边是深度学习，原始数据被输入到算法中，算法自动提取分层特征，在算法的引导下，优化自己的任务表现；结果将和从业者的表现一样好，以驱动算法向目标前进。 图1.1：由于数据的增长和计算需求，深度学习从手动提取特征中解脱出来从图1.1的右侧，我们已经可以窥见成功执行深度学习所需要的条件：我们需要有办法提取我们手头的任何数据。我们需要以某种方式定义深度学习机器。我们必须有一种自动化的方式，训练，以获得有用的表征，并使机器产生期望的输出。这就需要我们仔细研究一下我们一直在说的训练这件事。在训练过程中，我们使用一个标准，一个闹喊模型输出和参考数据的实值函数，为我们模型的期望输出和实际输出之间的差异打分（按照惯例，分数越低越好）。 训练包括通过逐步修改我们的深度学习机器来推动标准向更低的分数发展，直到它达到低分数。PyTorch为什么选PyTorch？它简单易用，足够Pythonic，任何python编程老手都会感到熟悉。具体来说，PyTorch提供了一种数据类型：张量（Tensor），用于存放数字、向量、矩阵、数组等，并提供了相应的函数。如果你熟悉numpy库的话，应该会更容易上手。PyTorch提供了GPU加速计算，这比CPU快了50倍。另外，PyTorch在数据运算方面进行了优化。这两个特性对于任何科学计算都是有用的，因此不打算深度学习的老哥也可以尝试学习。PyTorch的一个设计驱动因素是表达能力，它允许开发人员实现复杂的模型，而不会因为库（它不是一个框架）过于复杂而受到影响。基于这个原因，PyTorch在研究中得到了广泛的采用，国际会议上的高引用率就证明了这一点PyTorch配置了C++，这使得它可以在脱离python的环境中运行，这个特性增强了其灵活性。为了更好学习本书，你需要以下两个条件：有一定的Python编程经验。我们不打算在教授python上花费时间；你需要了解 Python 数据类型、类、浮点数字等。愿意深入研究并动手操作。我们将从基础开始，积累我们的工作知识，如果你跟着我们一起学习，你会学得更轻松。本书专注于实用的PyTorch，目的是覆盖足够的领域，让你能够用深度学习解决现实世界的机器学习问题，比如在视觉领域，或者探索研究文献中出现的新模型。与深度学习研究相关的大部分文献都可以在https://arxiv.org中找到。PyTorch如何支持深度学习项目让我们通过研究深度学习项目需要从pytoch中获得什么，来更好地了解PyTorch的构成。首先，PyTorch的 "Py "如同Python中的 "Py"，但其中有很多非Python代码。其实出于性能考虑，PyTorch的大部分代码都是用C++和CUDA（www.geforce. com/hardware/technology/cud）编写的，CUDA是NVIDIA公司的一种类似C++的语言，编译后可以在GPU上大规模并行运行。有一些方法可以直接从C++语言中运行PyTorch，我们将在第15章中讨论这些方法。这个功能的动机之一是为在生产中部署模型提供一个可靠的策略。然而，大多数情况下，我们会从Python中与PyTorch交互，构建模型，训练模型，并使用训练好的模型来解决实际问题。事实上，PyTorch 在可用性和与更广泛的 Python 生态系统集成方面的优势在于 Python API。正如我们已经提到的，PyTorch 的核心是一个提供多维数组的库，也就是 PyTorch 中的 tensors（我们将在第 3 章中详细介绍），以及 PyTorch 模块提供的大量操作库。在PyTorch中，将计算从CPU转移到GPU上，只需要一两个额外的函数调用即可。PyTorch 提供的第二项核心功能是，张量跟踪对其执行的操作，并分析计算输出相对于任何输入的导数，这是用于数值优化的。通过拥有 tensors 和支持 autograd 的张量标准库，PyTorch 可用于物理、渲染、优化、模拟、建模等，我们很有可能看到 PyTorch 以创造性的方式应用于各种科学应用中。但 PyTorch 首先是一个深度学习库，因此它提供了构建神经网络并对其进行训练所需的所有构件。图1.2显示了一个标准设置，它加载数据、训练模型，然后将该模型部署到生产中。 图1.2：PyTorch项目结构示意图，包括加载数据、训练与应用用于构建神经网络的PyTorch核心模块位于torch.nn中，它提供了常见的神经网络层和其他架构组件。全连接层、卷积层、激活函数和损失函数都可以在这里找到（我们将在本书的其他部分详细介绍这些内容）。 这些组件可以用来构建和初始化我们在图 1.2 中看到的未训练模型。为了训练我们的模型，我们需要一些额外的东西：一个训练数据的来源，一个使模型适应训练数据的优化器，以及一个将模型和数据送到硬件的方法，这些硬件将实际执行训练模型所需的计算。在图 1.2 左侧，我们可以看到，在训练数据到达我们的模型之前，需要进行相当多的数据处理。首先，我们需要获取数据。然后，我们需要将数据中的每个样本转换为PyTorch能够实际处理的东西：tensors。在自定义数据（无论其格式如何）和标准化的 PyTorch tensors之间的桥梁就是 torch.utils.data 中 提供的 Dataset 类。由于这个过程在不同的问题上有很大的不同，所以我们必须自己实现这个数据源。我们将在第 4 章中详细研究如何将我们可能要处理的各种类型的数据表示为 tensors。由于数据存储往往很慢，特别是由于访问延迟，我们希望能并行化数据加载。但是由于Python的许多优点并不包括简单、高效、并行处理，因此我们需要多个进程来加载数据，以便将它们组合成批处理：包含多个样本的 tensors。这一点比较复杂，但由于它也比较通用，PyTorch在Dataloader类中提供了所有这些神奇的功能。它的实例可以在后台生成子进程来加载数据集的数据，这样，只要训练循环可以使用它，它就可以准备好并等待训练循环。我们将在第7章认识和使用Dataset和DataLoader。有了获取批量样本的机制，我们可以转向图1.2中心的训练循环本身。通常情况下，训练循环是作为一个标准的Python for循环来实现的。在最简单的情况下，模型在本地CPU或单个GPU上运行所需的计算，一旦训练循环有了数据，就可以立即开始计算。这有可能也是你的基本设置，我们在本书中也会假设这样的设置。在训练循环的每一步，我们都会对我们从数据加载器中得到的样本评估我们的模型。然后，我们使用一些准则或损失函数将模型的输出与期望的输出（目标）进行比较。正如它提供了用于构建模型的组件一样，PyTorch 也提供了各种损失函数供我们使用。它们也在 torch.nn 中提供。当我们用损失函数将实际输出与理想值进行比较后，我们需要稍微推动模型，使其输出更接近目标值。如前所述，这就是 PyTorch autograd 引擎的作用；但我们还需要一个优化器来进行更新，这就是 torch.optim 中提供的优化器。我们将在第 5 章中开始研究使用损失函数和优化器的训练循环，然后在第 6 章到第 8 章中磨练我们的技能，然后开始我们的大项目，即第二部分。使用更复杂的硬件，如多个GPU或多台机器，为训练一个大型模型贡献自己的资源，越来越常见，如图1.2底部中心所示。在这些情况下，torch.nn. parallel。DistributedDataParallel和torch.distributed子模块可以被用来使用额外的硬件。训练循环可能是深度学习项目中最不精彩却最耗时的部分。在它结束时，我们得到了一个模型，它的参数已经在我们的任务上进行了优化：图中训练环路右侧描绘的训练模型。有一个模型来解决任务是很好的，但为了让它有用，我们必须把它放在需要工作的地方。如图1.2所示，这个部署部分可能涉及到将模型放在服务器上，或者将其导出加载到云引擎上，如图所示。或者我们可能会将它与一个更大的应用集成，或者在手机上运行。部署工作的一个特殊步骤可以是导出模型。如前所述，PyTorch默认为即时执行模式（eager mode）。每当Python解释器执行一条涉及PyTorch的指令时，相应的操作就会立即由底层的C++或CUDA实现执行。随着对 tensors 进行操作的指令增多，后端实现会执行更多的操作。PyTorch还提供了一种通过TorchScript提前编译模型的方法。使用TorchScript，PyTorch可以将模型序列化为一组指令，这些指令可以独立于Python:比如说，从C++程序或移动设备上调用。我们可以将其视为一个虚拟机，它有一个有限的指令集，特定于张量运算。这使得我们可以导出我们的模型，既可以作为TorchScript与PyTorch运行时一起使用，也可以以一种叫做ONNX的标准格式导出。这些功能是 PyTorch 生产部署能力的基础。我们将在第 15 章中介绍。硬件与软件要求本书需要对涉及大量数值计算的任务进行编码和运行，如大量矩阵的乘法。事实证明，在新的数据上运行一个预先训练好的网络，是任何一台最近的笔记本电脑或个人计算机都能做到的。即使是把一个预训练的网络，重新训练一小部分，使其在新的数据集上专业化，也不一定需要专门的硬件。你可以使用标准的个人计算机或笔记本电脑来跟进我们在本书部分内容中所做的一切。然而，我们预计，完成第2部分中更高级的例子的完整训练运行将需要支持CUDA的GPU。第二部分中使用的默认参数假定GPU的内存为8GB（我们建议使用NVIDIA GTX 1070或更高），但如果你的硬件的可用内存较少，这些参数可以调整。如果你愿意等待的话，这样的硬件不是必须的，但是在GPU上运行可以将训练时间缩短至少一个数量级（通常会快40-50倍）。 单独来看，计算参数更新所需的操作在现代硬件上是很快的（从几分之一秒到几秒），比如典型的笔记本电脑CPU。问题是，训练需要反复运行这些操作，很多很多次，逐步更新网络参数，以减少训练误差。最后一个考虑因素是操作系统（OS）。 PyTorch从第一个版本开始就支持Linux和macOS，并在2018年支持Windows。由于目前的苹果笔记本电脑不包含支持CUDA的GPU，因此PyTorch的macOS预编译包只支持CPU。在本书中，我们将尽量避免假设您正在运行特定的操作系统，尽管第2部分中的一些脚本显示为在Linux下从Bash提示符运行。这些脚本的命令行应该很容易转换为与Windows兼容的形式。为了方便起见，在可能的情况下，代码会以在Jupyter Notebook上运行的方式列出。
没想到居然还能整出第二篇，不过这一篇大多都是东抄西抄，博主进行整合而已，美化的首要原则仍然是不影响读者阅读体验，更不能有明显的卡顿现象（至少在我的PC环境中浏览我的博客没有出现卡顿）前台美化插件-AliceStyle这个插件来自@萌卜兔自带13个默认效果：首页文章列表获取焦点放大首页头像自动旋转首页文章版式阴影化首页文章图片获取焦点放大顶部彩色跑马灯特效文章内打赏处插入menhera酱求打赏图片文章内打赏图标跳动右侧列表导航栏图标颜色canvas动态背景页面背景透明主题盒子优化等效果评论框打字粒子特效博客信息标签和标签云彩色特效于是我就可以卸载掉折腾笔记01中安装的ActivatePowerMode和彩色标签云插件了。不喜欢某一效果？（比如我不喜欢顶部跑马灯，感觉加了之后有明显的卡顿）打开/usr/plugins/AliceStyle/static/css/custom.css，注释掉某一特效即可此外，该插件还带有看板娘、动态背景、鼠标样式功能（不过我都没有启用，具体效果请查看@萌卜兔的博客，个人觉得不加任何背景的透明样式最好看，可参见我的博客）如果你博客启用了pjax，那就要添加相应的代码。比如彩色标签云要在PJAX中添加以下代码 let tags = document.querySelectorAll("#tag_cloud-2 a"); let colorArr = ["#428BCA", "#AEDCAE", "#ECA9A7", "#DA99FF", "#FFB380", "#D9B999"]; tags.forEach(tag => { tagsColor = colorArr[Math.floor(Math.random() * colorArr.length)]; tag.style.backgroundColor = tagsColor; });博主介绍闪字效果将以下代码加入后台设置->博主介绍中，当然，介绍文字要改成你自己的。 右边侧栏加入每日pixiv热榜图片这是github上的一个小部件，理论上适用于任何平台（Wordpress、typecho等等）任何主题。我们仍以handsome为例，完成后的效果参见本博客右侧边栏。将以下代码加到后台设置->开发者设置->全局右侧广告位 然后修改handsome/component/sidebar.php找到 <?php _me("广告") ?> ，将广告修改为p站每日热门对，我这里是将原本广告位的位置替换为pixiv图片，如果你博客有展示广告的需求，请自行寻找其他可以放该部件的位置。当然，你也可以自己部署该服务，参见github。访客信息获取这是一个插件，原文地址，只适配handsome插件，效果可以去原博查看，或者在本文底部评论查看效果。使用方法首先下载插件。[button color="success" icon="glyphicon glyphicon-download-alt" url="https://doge.uk/usr/uploads/2019/10/4119419080.zip"]原博下载[/button][button color="success" icon="glyphicon glyphicon-download-alt" url="https://www.jianguoyun.com/p/DbESS2AQhsXvBxjI-NkD"]本地分流[/button]上传插件至plugins目录并解压，修改文件名为UserAgent。打开Handsome/component/comments.php代码文件，大概第60~80行左右，将代码 <?php echo $author; ?><?php echo $Identity; ?> 改为 <?php echo $author; ?><?php echo $Identity; ?><?php UserAgent_Plugin::get_useragent($comments->agent,$comments->ip); ?> 后台启用插件，进行相关设置。注意使用CDN的同学，需要在Typecho博客网站的根目录的config.inc.php插入下面的代码：//** 防止CDN造成无法获取客户真实IP地址 */ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $list[0]; }当然，仅仅是对静态资源做CDN加速（比如上篇博客中我的做法），是不需要这一步的。一言api古诗词版假如你是个古诗词爱好者，你可能希望将handsome自带的一言换为换成古诗词版的，刚好已经有人开发出这样的api了，我们直接调用即可。今日诗词官网地址我比较喜欢的一点是，它会自动获取访客ip，然后根据ip所在地、访问时间等信息来推荐相关的古诗词（比如如果你在上海的晚上打开网站，它就会推送有关江南、夜雨的古诗词），很妙。具体的推荐方式点我查看。主题根目录下打开index.php，找到以下代码：<?php if (@!in_array('hitokoto',$this->options->featuresetup)) { $this->options->Indexwords(); }else{ echo '加载中……'; echo ' '; } ?>更改为以下代码：正在加载今日诗词.... 当然，别忘了在主题后台启用主题增强功能->增强功能开关->启用一言接口标题栏title自动变化来自@友人C实现效果为离开网站页面和重新回到网站页面时动态显示不同文字，参见我的博客。[scode type="yellow"]我把代码中的ico注释掉了，感觉没有必要设置多个ico，如果你有需求可以去掉注释。[/scode]把下面的代码添加到开发者设置->自定义输出head 头部的HTML代码中即可。 时间轴来自@余生's Blog，准确来说，它只是一段随时可调用的html代码，但是我觉得它挺好看的，用在文章或者博客介绍中或许不错。首先下载timeline.css并放到你自己的服务器中[button color="success" icon="glyphicon glyphicon-download-alt" url="https://www.jianguoyun.com/p/DU05q94QhsXvBxjTk5MC"]timeline.css[/button]然后你可以在任何文章或页面内调用以下代码（自行修改css引用地址）!!! 时光轴 2019-11-07 截止 2019-11-07 号。总更新文章 38 篇 2019-10-12 域名更换为sitstars.com，决定认真做站！ 2019-10-01 历经大半年雁陎终于又更新了一次博客！ !!!显示效果 时光轴 2019-11-07 截止 2019-11-07 号。总更新文章 38 篇 2019-10-12 域名更换为sitstars.com，决定认真做站！ 2019-10-01 历经大半年雁陎终于又更新了一次博客！ [scode type="yellow"]typecho要想直接显示html效果，需要用!!!把html代码包裹住[/scode]右侧导航栏添加加载耗时与访客总数、文章总字数参考资料：https://slske.com/9.htmlhttps://www.baoshuo.ren/archives/479.html因为handsome6.0.0版本开启了functions.php加密，所以我们需要通过其他手段修改。首先打开/var/Widget/Archive.php，添加以下代码/** 初始化皮肤函数01 */ $functionsFile01 = $this->_themeDir . 'functions01.php'; if ((!$this->_invokeFromOutside || $this->parameter->type == 404) && file_exists($functionsFile01)) { require_once $functionsFile01; if (function_exists('themeInit')) { themeInit($this); } }接着在主题文件夹下，如我的是/usr/themes/handsome新建一个functions01.php，填入以下代码：//加载耗时 function timer_start() { global $timestart; $mtime = explode( ' ', microtime() ); $timestart = $mtime[1] + $mtime[0]; return true; } timer_start(); function timer_stop( $display = 0, $precision = 3 ) { global $timestart, $timeend; $mtime = explode( ' ', microtime() ); $timeend = $mtime[1] + $mtime[0]; $timetotal = number_format( $timeend - $timestart, $precision ); $r = $timetotal < 1 ? $timetotal * 1000 . " ms" : $timetotal . " s"; if ( $display ) { echo $r; } return $r; } //浏览总数 function theAllViews(){ $db = Typecho_Db::get(); $row = $db->fetchAll('SELECT SUM(VIEWS) FROM `typecho_contents`'); echo number_format($row[0]['SUM(VIEWS)']);} //字数统计 function allOfCharacters() { $chars = 0; $db = Typecho_Db::get(); $select = $db ->select('text')->from('table.contents'); $rows = $db->fetchAll($select); foreach ($rows as $row) { $chars += mb_strlen(trim($row['text']), 'UTF-8'); } $unit = ''; if($chars >= 10000) { $chars /= 10000; $unit = '万'; } else if($chars >= 1000) { $chars /= 1000; $unit = '千'; } $out = sprintf('%.2lf %s',$chars, $unit); return $out; }最后打开/usr/themes/handsome/component/sidebar.php，大概在86行之后的位置，添加以下代码： <?php echo allOfCharacters(); ?><?php _me("全站字数") ?> <?php echo theAllViews();?><?php _me("总浏览量") ?> <?php echo timer_stop();?><?php _me("加载耗时") ?> 添加百度已收录来自：https://wfblog.net/archives/baidu_check.html打开/usr/themes/handsome/post.php搜索分类，在相关代码下添加 加载中 在后面添加代码 注：我用的是自己的api，速度可能会比较慢，你可以自己搭建，详见作者原文：https://wfblog.net/archives/baidu_check.html另：如果你启用了PJAX，那么切换文章的时候不能正确显示百度收录情况，此时需要在后台添加一个回调函数：if((typeof baidu_check) !== "undefined"){ baidu_check(); }文章排序修改教程来自：http://jdeal.cn/archives/wzpx.htmltypecho默认排序为按发布时间排，如果想修改为按修改时间排，那么可以这样：打开网站根目录下/var/Widget/Archive.php文件，大概在1400-1406处，找到/** 仅输出文章 */ $this->_countSql = clone $select; $select->order('table.contents.created', Typecho_Db::SORT_DESC) ->page($this->_currentPage, $this->parameter->pageSize); $this->query($select); }把table.contents.created改为table.contents.modified即可
前言[scode type="red"]20191128更新：刚刚发现codingpage服务挂了，算了还是切换到github上吧[/scode]今天想打开我的wiki站看一些笔记，但是打开速度有点挑战我的耐心了，于是决定把wiki站同步到国内的git服务商一份，这样应该就快不少。因为我所用的主题的使用文档部署在coding，就决定是你了！本以为是个很简单的工作，没想到实际操作起来还是有点麻烦的，决定做个笔记。部署到coding上进入腾讯开发者平台，注册账号并登录。没错，coding已经被腾讯收购了，两个其实是一样的。（而且coding我一进去就是团队界面，都不知道代码在哪，更别说page服务了……）和github一样，在个人设置中添加SSH公钥，可以用之前github已经生成的，一般在C:\Users\用户名\.ssh\id_rsa.pub中，用记事本打开，复制进去即可。如果再生成一个公钥的话也不是不可以，但是容易把原来的公钥文件替换到，然后你就无法git到github了。然后添加一个项目（吐槽一句这个按钮真难找到） 其中，项目地址必须填用户名.coding.me，比如我的就是caly5144.coding.me然后修改站点配置文件_config.yml，拉倒最底下添加coding：deploy: type: git repo: github: git@github.com:caly5144/caly5144.github.io.git coding: git@git.dev.tencent.com:caly5144/caly5144.coding.me.git branch: master其中coding的git地址可以在项目右上角找到。 接下来就是喜闻乐见的hexo g -d刷新一下看看代码是否上传成功然后找到项目的pages服务，注意到右上角有个小螺丝钉标识，点击它。 最后一步就是部署master分支，部署完成后就可以通过caly5144.coding.me访问你的网站了 自定义域名如果你想要添加自己的域名的话，首先去域名服务商那里修改github的CHAME解析，解析线路为境外，这样所有境外的访问都会跳转到github 然后再添加个wiki的CHAME解析，记录值为caly5144.coding.me（它会提示你的），解析线路选默认，这样境内的访问会跳转到coding。如果你想加https，那么请注意！[scode type="yellow"]先把github的解析停掉！[/scode]我一开始也不知道，然后贸然申请SSL证书，结果提示申请失败，再次点击的时候就提示我30分钟后才能申请了。在其他文章中，有博主提到了这个问题，似乎coding不允许同时有多个相同的CHAME解析，只能先停掉github了。接下来就简单了，申请然后强制https访问，再把github的解析打开。需要注意的是coding的证书只有三个月有效期，三个月后你要再次申请。别忘了还是要先停掉github的解析再申请。 完工！测试一下？ping一下域名 挂个代理再ping一下 额……不明白为什么，但是网站还是能打开的，无伤大雅。
一个支持分发上传、私有云的图床程序-Hidove搭建教程
[scode type="lblue"]此教程中的图床https://nii.ink正式开放给网友使用，如有问题请联系博主，另：我不保证分发链接的永久有效性[/scode]介绍在之前的文章中我提到了一个令人满意的图床所需要的条件：安装简单颜值舒服可迁移支持api方便查看和管理图片后来又说公共图床接口不是必须的，不可否认我只是给自己一个心理安慰罢了，如果有那当然更好了，如果能实现分发上传，访问链接自动跳转至有效的图床，那岂不是速度和安全性都有了？幸运的是，我前几天还真发现了这样的图床，不仅支持20+公共图床（阿里、百度、搜狗、SMMS……），还支持常见的私有云存储（FTP、又拍、七牛、OSS、COS），最重要的是，支持分发上传！还可以在后台控制各图床的权重及同步到其他图床。试用了一下我表示非常满意，可以说是我用过的最好的图床程序了。 [scode type="yellow"]pro版本是收费的，售价￥88，我觉得挺值的，也请大家多支持一下正版，购买地址及介绍[/scode][scode type="lblue"]也有免费版本，无分发上传和后台。[/scode]部署首先感谢开发者@余生'Blog的耐心指导，让我这个小白成功配置好了CDN。配置环境PHP 7.0+thinkphp伪静态fileinfo扩展MySQL InnoDB引擎还是以宝塔为例，毕竟简单。安装好宝塔，进入宝塔管理后台部署LNMP系统。接着在php设置中安装fileinfo扩展 注意fileinfo需要1g以上内存，若安装失败可以尝试添加swap。在Linux工具箱中添加即可。 安装程序1.上传程序压缩包至网站根目录，解压2.将压缩包中的sql文件导入到数据库中3.编辑config/database.php，将数据库配置修改为你的，其中端口默认是3306。4.将网站运行目录更改为public 5.配置伪静态为thinkphp 打开你的网址，若能正常显示则说明成功了。默认管理员账号为admin，密码admin123登录地址为：http://yoursite/user/login（前台右上角有）后台管理地位为：http://yoursite/admin（前台无，只能手动输入访问）[scode type="yellow"]20200102更新：最新版本不再允许分发域名与主域名一样了，大家设置分发域名的时候可以选一个子域名[/scode]配置CDN[scode type="yellow"]如果你不需要对本地存储策略配置CDN，则可以跳过这一节[/scode]在前一篇文章里我也摸索了CDN到底怎么配置，但是和大佬请教了一番，才发现我配置的方法是错误的。这里记录一下正确的配置方式。首先，我们需要三个域名：加速域名、源站域名、中转域名（不知道官方名字叫啥，我就这样称呼了）。其中，源站域名就是你图床网站的域名，不需要备案；加速域名就是CDN的域名，必须备案；中转域名是用来标识服务器地址的域名，也即加速域名的回源host，通过它来确定图床源站的服务器地址，也无须备案。以我的图床为例，源站域名是nii.ink，加速域名是st.yanshu.work，中转域名是n.nii.ink，CDN放到百度云上，域名服务商是阿里云。那么在百度云中，我们就添加一个加速域名st.yanshu.work，并设置主源站为nii.ink，然后在阿里云中添加一个st.yanshu.work的CHAME记录，记录值就是刚刚百度云生成的。接着在百度云的CDN管理中，修改其回源配置为n.nii.ink 然后再服务器上创建两个站点，分别为st.yanshu.work和n.nii.ink，并绑定目录为/www/wwwroot/nii.ink/public/images。其实可以把这两个站放到一起，但是为了后面加SSL方便，就分开放了。[scode type="red"]切记不要忘了关闭防跨站攻击，三个站都要关掉！[/scode] 然后在阿里云上添加一个n.nii.ink的A解析，记录值为服务器的ip地址。最后，在图床后台添加CDN加速域名http://st.yanshu.work 听起来有点复杂，总结来说：在百度云（CDN服务商）中，你要做的就是添加加速域名并设置源站为源站域名，回源地址为中转域名；在阿里云（域名服务商）中，添加加速域名的CHAME记录（指向百度云CDN），中转域名的A记录（指向服务器）；在服务器上，一共有三个网站，源站、加速站、中转站，但后两者都是绑定的源站，本质上来说只有一个站配置完成后，输入你的加速域名st.yanshu.work或者中转域名n.nii.ink，如果显示下图就代表你配置成功了。 为什么非要有中转域名呢？想一下如果我现在要换个服务器，那么CDN该怎么调整？没错，不用改，只要我们把中转域名的A解析到新服务器ip上即可。也就是说中转域名其实起到的是方便我们更换服务器的作用。博主后续又尝试了免费的百度云加速，需要注意的是在我的网站->查看报表 ->开启安全加速这个选项一定要打开！这需要审核的，如果一直不通过直接私聊他们的客服（qq:4008768800）（和实名认证不是一回事）。另外打开实时同步这个选项不要打开！配置HTTPS如果你跳过了前一节，那么这一节也可以跳过了，因为在宝塔加个SSL没有难度，如果你也想给加速域名加SSL，那么往下看。在前一篇文章中我也提到了如何在百度云中给加速域名添加HTTPS证书，用这种方法后，你访问加速域名时自然就有小绿锁了。但是如果有一天CDN停了呢？此时你访问加速域名，得到的只是你的连接不是私密链接的提示，但是用http还是可以访问的，猜测是CDN停了之后自然绑定CDN的https服务也就访问不到了。 解决方法就是在服务器的加速站中添加HTTPS证书，这样CDN停了之后，回源到服务器也能找到证书。首先在百度云中找到SSL证书服务 点击查看证书 就可以下载PEM格式的证书了。下载到本地后解压会出现三个文件，分别是url_ca.crt，url.cer，url.key（url即加速域名），我们只需要用后两个。用记事本打开后，将.key中的内容复制到宝塔站点设置中其他证书的左边（即密匙），将.cer中的内容复制到右边 保存即可自动部署。最后就是在后台将CDN加速域名改为https://添加HTTPS证书的关键一点就是验证域名所有权，加了CDN后就不好验证了，所以宝塔中才会有这样的提示“若您的站点使用了CDN或301重定向会导致续签失败”后台设置大多数选项都很清晰，说一下应用里的图床Api ID、标题、唯一标识等都是可以改的。是否开启代表了是否在前台展示，是否选中代表了默认分发图床，开启的话默认会分发到这些图床中，当然也可以在前台手动更换分发图床。权重指的是访问分发链接时各图床的展现频率，但仅限于已经分发的图床。比如上图中阿里图床的权重是800，本地的权重是1，那么代表访问分发链接时最有可能显示阿里图床，最不可能显示本地图。另外小米图床虽然权重是1000，但是由于它不在分发名单上，所以和权重为0一样。理论上如果你会php语言的话，是可以自行添加api接口的，不过具体怎么操作我也不懂……设置里的Api设置，是指使用api时上传图片的限制大小，不影响前台的限制！至于如何修改前台的上传限制，下一节会说。 此外，该图床是不支持多个私有云分发的！，也就是说，本地、COS、OSS、七牛又拍等你只能选择一个。[scode type="green"]20200102更新：最新版本已经支持分发私有图床了[/scode]修改图片上传大小目前（1.3版本）并不能直接通过后台直接修改图片上传限制，只能通过源码来修改。[scode type="green"]20200102更新：最新版本已经可以直接在后台修改上传限制了[/scode]/public/static/index/js/upload.js，大约在21、22行位置maxFileSize: 5120, maxFileCount: 10,修改为你想要的配置（maxFileSize单位是kb，即现在图片限制5M）然后修改/application/index/view/index/index.html，大约是在23行 5 MB max per file. 10 files max per request. We have hosted {$Hidove.total} pictures. 这是前台的提示语。更新CDN节点也就是手动控制分发到其他图床，前台和后台的图片管理都可以做到这一点，但是后台没法全选图片，所以前台更方便一些。 在后台的图片管理中，可以选中一个图片，在编辑界面更新外链地址 但不知道为什么，大概率我会更新失败……API上传前台也有API菜单，里面给出了api使用方法，但是没有例子，我这里给出一个python示例吧。from requests import post url='http://nii.ink/api/upload' # 修改为你的请求地址 files = {'image': open(pic_path, 'rb')} para={"apitype":"this,ali","token":""} # apitype指的是图床接口，以唯一标识表示，用逗号分隔，token就是后台用户中的token data_result=post(url,files = files,data=para).json() print(data_result)返回成功示例：{'code': 200, 'msg': 'success', 'data': {'url': {'distribute': 'http://nii.ink/image/5dc0104408cb3', 'this': 'http://st.yanshu.work/2019/11/04/5dc0104408cb3.jpg', 'ali': 'https://ae01.alicdn.com/kf/U3ac42a397d2c486c9339ee5ced4917b3n.jpg'}}}问题私有节点分发分发图床有私有节点时，其权重计算方法是（最小权重+最大权重）/2如果你觉得太大或者太小，可以在application/index/controller/Image.php中修改。大概在282行，自行修改array_walk($imageUrl, function ($value, $key) use (&$result, $minWeight, $maxWeight) { if (strpos($key, 'Private') !== false) { $result[$key]['url'] = $value; $result[$key]['weight'] = ($minWeight + $maxWeight) / 2; }配置ufile前台Host填box.u-file.cn，用户名是FTP用户名后台：参考https://www.kancloud.cn/ivey/hidoveimage/1739323更新V2V2版全新安装：https://www.kancloud.cn/ivey/hidoveimage/1730027V1数据库导入V2：https://www.kancloud.cn/ivey/hidoveimage/1730940安装时可能会遇到以下问题：1、至少要删除两个函数：putenv和proc_open2、卡到composer Updating dependencies这一步不再动了原因：很有可能你用的是国内服务器，拉取国外源的时候自然就很慢解决方案：添加阿里源composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ # 取消全局配置 composer config -g --unset repos.packagist
github地址程序功能：你将私密的链接或者文字粘贴到我们项目产生一个一次性链接阅后即焚我们用宝塔来部署该程序。安装首先，在宝塔的软件商店里分别找到nginx、PM2管理器、Redis并安装。接着ssh连接到你的服务器，输入命令git clone https://github.com/kchown/naiveboom.git然后在PM2管理器的设置中添加新项目。根目录填写root/naiveboom，启动文件填写run.js，项目名随便填，我填了个naive 等待一段时间，成功后如下图所示： 接着去宝塔的安全里放行3000端口。这样就算安装成功了，在浏览器中输入ip:3000测试一下吧。 打开它生成的网址： 刷新一下： 成功了！反代域名用宝塔很简单，新建一个站点，并在域名商那里解析好。进入网站设置并添加反向代理，代理名称随便填，目标url填http://localhost:3000，发送域名自动生成，保存即可生效。 自定义修改它没有后台，我们只能手动修改它的配置了。各页面文件在root/naiveboom/views网站标题在root/naiveboom/routes/index.js中修改网站favicon在root/naiveboom/public中，替换成你的即可。另一个阅后即焚程序PasteBurngithub地址PasteBurn采用的是php+MySQL，相比于naiveboom来说安装更方便，而且项目中也给出了安装教程，我就不再重复了。我是安装成功了，但是提交文本没反应，不知道为什么……[scode type="red"]有小伙伴说PasteBurn有sql注入漏洞，慎用！[/scode]
区块链第二部分大概是要永远鸽掉了……原作者写得过于简略（我看不懂了），而且原作者用的python版本是2.7，尽管大部分报错我都已经修正了，但是还是无法输出正确结果。打算以后有时间找找别人的教程学一下，接下来还是以神经网络为主。不过一周两篇的目标是不能不完成的，所以写一篇其他类型的文章。webscraper是一款chrome插件，通过模拟人操作浏览器的行为来抓取数据，入门门槛低，简单爬一些数据还是非常舒服的。入门首先你要有一个Chrome浏览器（理论上支持Chrome插件的浏览器应该都可以，不过我没试过），然后下载webscraper插件（需要科学上网）。webscraper下载地址打开你的Chrome，按下F12（即开发者工具），你就会发现选项卡上多了一个Web Scraper，不过如果开发者工具控制台在左边或右边，它是不能正常显示的，必须要放到下边。如图所示，就按照它的提示点击右上角的三个竖点，再切换显示模式就可以啦。 现在能正常显示了，先分别介绍一下这些菜单都什么意思 Sitemaps可以理解为爬虫项目汇总，在这里列出了所有你所创建的项目。Create new sitemap是创建一个新爬虫项目，这个待会再详细说。Sitemap是只有点开了某个具体项目才能使用的，比如我们进入comic项目。Selectors就是当前页面，也就是各个选择器的列表。Selectors graph就是把这个项目所有选择器的层次按树形图表示出来。Edit metadata可以编辑项目的初始设置（id和url），Scrape就是运行该项目，Browse可以在浏览器中显示已经爬取的结果。Export Sitemap就是把这个项目导出为json格式，方便别人导入你的爬虫项目。Export data as CSV就是把你爬取的数据导出为CSV格式。 光介绍是没用的，必须实战才能掌握。我们以我的博客为例，看下如何用webscraper。爬取雁陎的自耕地网站入口假如我们想要爬取雁陎所创作的所有文章，该怎么做呢？首先要打开网站，获取首页及之后各页的标题超链接，然后进入超链接（也就是文章详情页），最后抓取正文。带着这个思路，开始写我们的操作。点开Create new sitemap下的Creat Sitemap Sitemap name可以随便填，但是不能和已有项目名重复，相当于一个id的作用吧，注意必须不能填中文，这里填yanshu就好了。Start URL就是爬虫的入口，在这个项目里入口就是https://www.sitstars.com/，webscraper会从这个url开始爬虫。但是光填首页的url是不够的，因为我们还想爬后面的文章。那么我们回到网站，点击第二页，地址栏变为https://www.sitstars.com/page/2/，这下我们就知道这个博客的页码变动规律了。web scraper 中提供了一种写法，可以设置页码范围及递增步长。写法是这样的： 开始值-结束值[:步长]，比如我们这个项目就是https://www.sitstars.com/page/[1-7]。有些网站的步长可能不是1，比如豆瓣小组，https://www.douban.com/group/juzimi/discussion，第二页就会多个参数?start=25，后面依次递增。那么这时候要爬取前10页，要这样写https://www.douban.com/group/juzimi/discussion?start=[1-250:25]填入这两个信息后，点击Creat Sitemap，跳转到“代码编写页面” 列表页这一块最重要的概念就是Selector，字面意思是选择器，一个页面上的任何元素，文本、超链接、div……都可以是选择器。爬虫，就是一个逐步筛选选择器的过程。点击Add new selector创建我们第一个选择器。 先介绍一下各个选项的含义：id随便填，它只是起到一个标识的作用。Type就是选择器的类型。常用的就这几个：TXT，文本Link，超链接Image，图片Element，元素Element scroll down，获取元素后向下滚动，对于ajax页面特别有效Element click，获取元素后点击，适用于评论展开等情况Selector，即你所选取的选择器。其中select可以选中页面元素，自动显示选择器，Element preview就是预览你所选中的选择器，Data preview预览选择器所包含的数据。Multiple，勾选之后可以批量选中选择器。Regex，即正则表达式，一般没必要填Parent Selector，即该选择器的父选择器是哪个。为了方便我们输入xpath，可以打开目标网站对照着写。id填article，Type选link，然后选中select，你就会发现鼠标移到页面上任何超链接上都会变绿，这是可以选中的信号。 选中后，绿色区域变为粉红，同时控制台上面的框里会显示选中元素的xpath 仅仅选中一个超链接是不够的，所以勾选上Multiple，同时尝试点下一篇文章标题 你会发现下面所有文章的超链接都变红了，也就是说这个xpath，.m-t-none a代表了我们所需要的所有链接。此刻可以点Done selecting!，它会把这个xpath填入右边的框中，如果你可以通过其他方式获得xpath，可以直接手动填，不需要select。接下来点击Save selector，第一个选择器就完成啦。你也可以验证一下这种写法是否正确，点击Data preview，如果显示下图说明数据能正常获取： 详情页 先点进去我们之前创建的article，在这里添加的selector会自动以article为parent selector，而且这里的selector会在article的结果基础之上进行选取，也就是说相当于实现了超链接跳转功能 和上一节类似，为了方便写xpath，你可以直接点进去某一篇文章，参照着写。假设我们想要获得作者、发表时间、字数、正文这几项数据，以作者为例，你可以这样写 一切都完成后，你可以测试了。点击sitemap yanshu下的Scrape，进入到时间设置界面。 字面意思，一个是请求间隔时间，一个是页面等待时间（如果页面不响应最多等待多久），这里我们就直接Start scraping。会自动跳出一个Chrome窗口，然后进行翻页、跳转……就和我们平时浏览网页一样。等待期间，你也可以点击Browse，看一下数据爬取情况。 下面还有很多，但是我的屏幕放不下了。看，是不是挺简单的？爬取虎嗅网虎嗅网和雁陎的自耕地，区别主要在于后者是分页模式，前者是ajax请求加载模式（即往下拉的时候自动显示最新文章），那么这种网站该怎么爬呢？对，你一定想到了我们之前介绍过的Element scroll down模式，试一试？ 别忘了勾选Multiple。测试一下： 可以看到它能自动向下滚动。接下来就简单了，按照上一章的流程再走一遍就行。福利作为一个死宅，二次元这块必须拿下！所以我为大家提供了一个爬取漫猫动漫某几季度所有番剧种子的相关代码{"_id":"comic2","startUrl":["http://www.comicat.org/addon.php?r=bangumi/table&bgm_id=2018q[1-4]"],"selectors":[{"id":"seaon","type":"SelectorText","parentSelectors":["_root"],"selector":".title span.left","multiple":false,"regex":"","delay":0},{"id":"jump","type":"SelectorLink","parentSelectors":["_root"],"selector":"dd a","multiple":true,"delay":0},{"id":"daxiao","type":"SelectorElementClick","parentSelectors":["jump"],"selector":"div.box:nth-of-type(2)","multiple":false,"delay":"0","clickElementSelector":"th.l4","clickType":"clickOnce","discardInitialElements":"do-not-discard","clickElementUniquenessType":"uniqueHTML"},{"id":"firstbig","type":"SelectorLink","parentSelectors":["jump"],"selector":"tr:nth-of-type(1) a[target]","multiple":false,"delay":0},{"id":"cili","type":"SelectorLink","parentSelectors":["firstbig"],"selector":"a#magnet","multiple":false,"delay":0},{"id":"detail","type":"SelectorText","parentSelectors":["firstbig"],"selector":"span.right.text_normal","multiple":false,"regex":"","delay":0}]}食用方法点击Creat new sitemap中的import Sitemap，把上面的代码复制到Sitemap JSON中，再点一下下面的Import Sitemap即可导入。 接着进入comic这个项目，点击Edit metadata 修改起始页，主要是id=之后的内容，其中2018代表2018年的番，q[1-4]代表第1到第4季度的番。 注意第一次使用漫猫，需要开启虫洞，就是在这个链接里，拉到最下面点击启用即可。不然的话你是看不到任何磁力链的！ 另外博主有收藏癖，而且越高清越大的资源越受博主喜欢，所以这个脚本爬下来的都是包含资源最大的磁力链。介意的话可以自行修改，把选择器cili和detail的父选择器改为jump，然后删掉fistbig选择器即可。 问题1、有时候我们想选择某个链接，但是鼠标点击就出触发页面跳转，如何处理?在我们选择页面元素的时候，勾选xpath框旁边的符合选择框，然后鼠标滑到要选择的元素上，按下 S 键。 按 S 就是选择当前元素，按 P 就是选择当前元素的父元素，按 C 就是选择当前元素的子元素，当前元素指的是鼠标所在的元素。2、抓取的数据顺序和网页上的顺序不一致？这是程序本身的缺陷，没办法解决，只能导出CSV之后手动排序了。
这一系列文章均来自Victor Zhou，他对神经网络的讲解，让我这个数学基础贼差的人也能够很容易地理解，所以决定进行翻译，作为我机器学习的入门教程吧。作者后续发表的相关文章均会汇总到这里。如果我在机器学习领域发现了其他能够补充的材料，也会放到这里。[scode type="red"]提醒：译者英语水平和机器学习水平都很有限，有能力的同学最好去看原文，如果您发现哪里有翻译错误，欢迎留言指出。[/scode] 这个四篇系列文章特别针对初学者，为理解神经网络提供了一种面向基本原理的方法。在深入研究两种流行的变体：递归神经网络（RNN）和卷积神经网络（CNN）之前，我们将为初学者提供经典神经网络的介绍。对于每种类型的网络，我们将：查看网络的结构。了解使用该类型网络的动机。介绍一个可以使用该网络解决的现实问题。手动推导训练我们特定问题的网络所需的梯度。在Python中完全从头开始（仅使用numpy）实现功能全面的网络。知识背景无需机器学习或神经网络知识基础，但是，以下知识背景可以帮助你更快入门：多元微积分，用于得出训练我们的网络所需的梯度时使用。如果您没有该知识背景，可以跳过这些梯度推导。线性代数，特别是矩阵，通常是表示神经网络权重的最佳方法。Python 3，仅需基础水平即可。译者注：虽然作者说仅要求基础，但是还是建议大家（1）掌握python序列、函数、类、循环、条件等相关概念，尤其是类，其实我觉得它已经超出了基础的范畴……（2）掌握numpy库，这个熟悉一遍了解各个方法的作用就行，我当时是专门学了一遍的，不过被秩轴位的概念搞疯了……（3）如上所述，需要你掌握多元微积分，不过这个好像高中就讲过了，至少我一个文科生都懂；线性代数，回去翻翻教材吧……译者在学python和numpy的时候做了笔记，你可以参考：[post url="https://wiki.sitstars.com//wiki//编程语言//python//01%20基础%20Python笔记//" title="python基础语法" intro="雁陎做的关于python语法的笔记"][post url="https://wiki.sitstars.com//wiki//编程语言//python//02%20numpy库//" title="numpy基础语法" intro="雁陎做的关于numpy语法的笔记"]系列文章基础-softmax[post cid="45" /]在正式入门神经网络之前，推荐大家先看一下上面这个关于softmax的简要介绍，因为从第二篇文章起就要开始用到，而且是CNN和RNN重要组成部分。阅读顺序如下，主要是根据一些概念出现的顺序来决定的，如果跳读的话很有可能遇到一些不明白的概念，又要回过头看前面的文章。[post cid="44" /][post cid="46" /][post cid="47" /][post cid="48" /]持续更新中……另外我专门为这篇文章写了一篇名词手册，包含了中英文对照，您可随时查阅：[post cid="49" /]更深入地学习想要更深入地学习？可以参考以下内容：使用Keras构建您的第一个神经网络。学习合适的机器学习库，例如更大/更好的神经网络Tensorflow，Keras和PyTorch。尝试使用神经网络来参与Kaggle数据科学竞赛。斯坦福大学CS231n（关于CNN）课程的笔记。Coursera上有许多优秀的神经网络。
介绍github社区：https://github.com/ipfs/ipfs#project-and-communityipfs应用项目：https://github.com/ipfs/awesome-ipfsIPFS：星际文件系统IPFS（InterPlanetary File System）是一个面向全球的、点对点的分布式版本文件系统。目标是为了补充（甚至是取代）目前统治互联网的超文本传输协议（HTTP），将所有具有相同文件系统的计算设备连接在一起。IPFS用基于内容的寻址替代传统的基于域名的寻址，用户不需要关心服务器的位置，不用考虑文件存储的名字和路径。我们将一个文件放到IPFS节点中，将会得到基于其内容计算出的唯一加密哈希值。哈希值直接反映文件的内容，哪怕只修改1比特，哈希值也会完全不同。当IPFS被请求一个文件哈希时，它会使用一个分布式哈希表找到文件所在的节点，取回文件并验证文件数据。IPFS是通用目的的基础架构，基本没有存储上的限制。大文件会被切分成小的分块，下载的时候可以从多个服务器同时获取。IPFS的网络是不固定的、细粒度的、分布式的网络，可以很好的适应内容分发网络的要求。这样的设计可以很好的共享各类数据，包括图像、视频流、分布式数据库、整个操作系统、模块链、8英寸软盘的备份，还有静态网站。简而言之，就是利用区块链技术存储数据的一种方式。根据我的理解，ipfs上传文件后，会自动加密分隔，传到各个Gateway（即网关或节点），同时生成一个64位hash值，用户知道hash值即可访问该文件，系统会自动寻找最近的节点并下载合并。不过你需要一个gateway来作为中转访问，比如https://ipfs.io/ipif/就是一个节点，在该节点域名后加上hash值即可访问。这个域名可能会被墙，但只要我们找到可用的节点，或者是直接搭一个，那就可以永久不用担心文件丢失的问题了。windows搭建安装包下载地址（需科学上网）：https://dist.ipfs.io/#go-ipfs找到适合你系统的版本，下载并解压至指定目录，如：D:\go-ipfs配置环境变量右键此电脑>高级系统设置>高级>环境变量>系统变量>Path>新建 输入ipfs文件目录即可配置成功，例如：D:\go-ipfs创建本地IPFS节点并初始化ctrl+R打开cmd输入ipfs init并回车。创建IPFS本地节点复制下图红圈内的代码，粘贴并执行。初始化本地节点 输入并执行命令ipfs daemon启动节点并链接至IPFS主网。注意：此窗口在之后的操作中不能关闭，关闭即断开主网链接使用1. 命令行操作新打开cmd窗口，输入ipfs.exe id即可查看本节点IDipfs.exe daemon启动节点ipfs add +文件路径\文件名，上传至IPFS网络，注意连接IPFS的cmd窗口不能关。/ip4/127.0.0.1/tcp/80802. 目录相关操作//创建目录feijian ipfs files mkdir /feijian //查看有几个目录 ipfs files ls //建立自定义目录下的文件与hash文件的映射 ipfs files cp /ipfs/QmYxnH77S4qk82JUu6m76kAnH4MRiVGL1sb9JBPQ6UWFqL /feijian/myfile.txt //查看目录下的文件 ipfs files ls /feijian //读取文件 ipfs files read /feijian/myfile.txt3. web图形界面操作在浏览器中输入： http://localhost:5001/webui，即可打开web窗口。在这里可以查看本节点信息，全球节点分布，文件上传，更改相关配置（如端口，StorageMax什么的）。输入:http://localhost:8080/ipfs+hash值即可查看文件。问题待发现