杭州校区切换校区

新闻资讯

  • news

    为什么人们不足够信任云计算?

    发布时间:2019-01-15

    <p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">试想在一家没有云数据的大公司上班,处理器本身效率也低,不可避免地影响我们的工作质量。再者,如果您负责开发或营销云软件,那么对云计算的不够信任就会导致顾客对您的产品失去兴趣。那么,为什么会有很多人不相信“云”呢?</p><p style="color:#3E3E3E;font-family:&quot;font-size:15px;text-align:center;background-color:#FFFFFF;"><img src="http://115.29.210.249/tggPic/content/2019-01/1547521497676.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2019-01/1547521497676.jpg" alt=""><br></p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">现如今有成千上万的应用程序依赖云计算来存储客户的重要信息和文件,但人们仍然不完全相信“云”的本质。例如,拥有iPhone的消费者可能不愿意使用苹果的云备份服务来备份他们最重要的信息;甚至企业所有者可能会抵制在工作中采用基于云的解决方案。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">表面上来看,这似乎并不会影响什么,就像处理个人的数据,是否采用云方案就看个人的选择和效率了。但随着企业和消费者越来越多的依赖数据信息,以及各种数字化服务,那么定期使用便捷的、成本低、效益高的工具就显得越来越重要了。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">试想在一家没有云数据的大公司上班,处理器本身效率也低,不可避免地影响我们的工作质量。再者,如果您负责开发或营销云软件,那么对云计算的不够信任就会导致顾客对您的产品失去兴趣。那么,为什么会有很多人不相信“云”呢?</p><h4 style="font-size:1.2em;font-family:&quot;text-align:justify;color:#37474F;background-color:#FFFFFF;"><span style="font-size:inherit;color:inherit;line-height:inherit;">缺乏对“云”的深入理解</span></h4><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">首先最明显的原因是,人们通常对“云”的真正含义理解不足。它成为一个流行词,描述了这种从任何设备都能访问所有产品和服务的模式。从而给人的错误印象是,他们的数据以“云”的方式被处理并存储的到处都是,任何拥有访问权限的人都可以获取这些数据。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">实际上,云是指使用互联网运行的服务,而不是依赖于设备上的本地软件。比如您的文件存储在“云”端,这意味着它们存在专业服务(付费服务)的数据中心,也只有您有权限。您可以随时随地访问文件,表面看起来像在本地访问这些文件,其实是调用云端的数据中心的信息。</p><h4 style="font-size:1.2em;font-family:&quot;text-align:justify;color:#37474F;background-color:#FFFFFF;"><span style="font-size:inherit;color:inherit;line-height:inherit;">加密和黑客攻击</span></h4><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">如果把文件存储在“云”上——别人的硬盘上,人们可能会担心文件的安全性,担心其他人也会访问这些文件。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">这种担忧不无道理,云存储确实面临着一些潜在的安全问题。大多数云服务公司,如谷歌为云存储的数据进行了一些基本的加密和保护措施。他们会用坚固的防火墙对数据中心进行物理保护,并对存储的数据进行加密,以减少攻击破坏的可能性。尽管如此,数据泄露还是防不胜防,而且没有一种系统能够保证绝对安全,完全御防黑客攻击的。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">除此之外,一旦用户的授权受到威胁,即使是最安全的云服务也可能受到威胁。例如,您存储的文件服务器本身无法被黑客入侵和攻破,但黑客非法获得您的用户名和密码,就可以轻而易举的访问文件了。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">其实我们很清楚,每个系统都有固有的一些弱点。您保存在云存储中的文件可以被访问,就像本地硬盘上的文件一样,也同样存在用户名和密码被盗用的风险。或许您可以通过云服务的云端额外一层加密来保护数据,并确保在密码设置、更改或校验时遵循最佳逻辑和规定。</p><h4 style="font-size:1.2em;font-family:&quot;text-align:justify;color:#37474F;background-color:#FFFFFF;"><span style="font-size:inherit;color:inherit;line-height:inherit;">文件完整性和可访问性</span></h4><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">数据变得越来越重要,而且数据的存储或展现形式也更加多样化。它可能是记录公司财务状况的电子表格,也可能是包含商业秘密的word文档,也可能是包含所有重要客户详细信息的CRM平台。在任何情况下,这都是至关重要的信息,一旦泄露后果不堪设想。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">除了担心这些文件可能会被黑客攻击或假冒访问之外,人们还想占有控制这些文件。总觉得把文件存在自己的U盘上,比存在“云”上访问更安心。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">要消除这种成见并不容易,但是对于忧心忡忡的企业所有者来说,除了存储在云上之外,还可以将文件存储在本地的物理硬盘上,这种冗余备份是一种有效可行的方法,以确保文件不会丢失。</p><h4 style="font-size:1.2em;font-family:&quot;text-align:justify;color:#37474F;background-color:#FFFFFF;"><span style="font-size:inherit;color:inherit;line-height:inherit;">云服务的普适性</span></h4><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">之前有些人讨厌依赖云来访问他们最重要的服务,因为这需要互联网连接。如今互联网应用已经相当广泛。即使在家里工作时遇到网络连接中断,你可以用智能手机作为热点,或者开车去咖啡馆或图书馆,使用他们的热点。但是也有突发状况,小区附近都停电了,这可能会让你无法访问云端服务。即便如此,大多数云平台现在也提供离线版本,当在线版本无法访问时,这些离线版本可以暂时使用。</p><h4 style="font-size:1.2em;font-family:&quot;text-align:justify;color:#37474F;background-color:#FFFFFF;"><span style="font-size:inherit;color:inherit;line-height:inherit;">价值观念</span></h4><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">公众的价值观念往往会影响技术的发展趋势和应用范围。如果客户看到产品和服务的价值,超出他们愿意支付的价格,就很可能会购买更多,从而增加需求,并刺激更多的企业致力于该项技术/新产品的研发。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">云计算一开始便以时髦的名字产生了足够的吸引力,足以支持成千上万种不同应用和服务的开发。然而,仍有数百万消费者不理解云计算与本地存储文件之间的真正区别。改变这一观念的最佳途径就是,重申云服务的真正优势,包括冗余性、安全性、可访问性,还有更低的成本。如果综合考虑这些因素,应该能客观地解释为什么基于云的应用程序比本地程序更好。</p><p style="color:inherit;font-family:&quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">在未来几年,虽然我们还没有完全解决云计算中的信任问题,但是用户对云服务的接受度正逐步提升,特别是在大数据时代,人们也不得不正确面对它。如果您愿意为云计算做点什么——无论是说服公司老板转向云服务,还是推广云软件——请参考上述几点分析,并帮助人们客观的、正确的看待云计算。</p>
  • news

    dbxfs:在 Linux 中本地挂载 Dropbox 文件夹

    发布时间:2019-01-04

    虽然在 Linux 中很容易安装 Dropbox 客户端,但这种方法与官方方法略有不同。它是一个命令行 dropbox 客户端,且无需磁盘空间即可访问。-- Sk<br class=""><br><p>不久前,我们总结了所有&nbsp;<span style="color:#4D8AD8;">在本地挂载 Google Drive</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[1]</span>&nbsp;作为虚拟文件系统,并从 Linux 系统访问存储在 Google Drive 中的文件的方法。今天,我们将学习使用&nbsp;dbxfs&nbsp;将 Dropbox 文件夹挂载到本地文件系统中。dbxfs&nbsp;用于在类 Unix 操作系统中本地挂载 Dropbox 文件夹作为虚拟文件系统。虽然在 Linux 中很容易<span style="color:#4D8AD8;">安装 Dropbox 客户端</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[2]</span>,但这种方法与官方方法略有不同。它是一个命令行 dropbox 客户端,且无需磁盘空间即可访问。dbxfs&nbsp;是自由开源的,并且是用 Python 3.5+ 编写的。</p><p class="" style="color:#FFFFFF;font-size:1.4em;background-color:#3F51B5;">安装 dbxfs</p><p>dbxfs&nbsp;官方支持 Linux 和 Mac OS。但是,它应该适用于任何提供&nbsp;<span style="color:#C40F0F;">FUSE 兼容库</span>或能够挂载 SMB 共享的 POSIX 系统。由于它是用 Python 3.5 编写的,因此可以使用 pip3 包管理器进行安装。如果尚未安装 pip,请参阅以下指南。</p>◈&nbsp;<span style="color:#4D8AD8;">如何使用 pip 管理 Python 包</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[3]</span><p>并且也要安装 FUSE 库。</p><p>在基于 Debian 的系统上,运行以下命令以安装 FUSE:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;">$ </span><span class="" style="color:#E28964;">sudo</span><span class="" style="color:#B8FFB8;"> apt install libfuse2</span></p></li></ol></pre> <p>在 Fedora 上:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;">$ </span><span class="" style="color:#E28964;">sudo</span><span class="" style="color:#B8FFB8;"> dnf install fuse</span></p></li></ol></pre> <p>安装完所有必需的依赖项后,运行以下命令以安装&nbsp;dbxfs:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;">$ pip3 install dbxfs</span></p></li></ol></pre> <p class="" style="color:#FFFFFF;font-size:1.4em;background-color:#3F51B5;">在本地挂载 Dropbox 文件夹</p><p>创建一个挂载点以将 Dropbox 文件夹挂载到本地文件系统中。</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;">$ </span><span class="" style="color:#E28964;">mkdir</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#B8FFB8;">~/</span><span class="" style="color:#B8FFB8;">mydropbox</span></p></li></ol></pre> <p>然后,使用&nbsp;dbxfs&nbsp;在本地挂载 dropbox 文件夹,如下所示:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;">$ dbxfs </span><span class="" style="color:#B8FFB8;">~/</span><span class="" style="color:#B8FFB8;">mydropbox</span></p></li></ol></pre> <p>你将被要求生成一个访问令牌:</p><p class="" style="text-align:center;"><img src="http://115.29.210.249/tggPic/content/2019-01/1546595280273.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2019-01/1546595280273.jpg" alt=""><br></p><p>要生成访问令牌,只需在 Web 浏览器中输入上面输出的 URL,然后单击&nbsp;<span style="color:#C40F0F;">允许</span>&nbsp;以授权 Dropbox 访问。你需要登录 Dropbox 帐户才能完成授权过程。</p><p>下一个页面将生成新的授权码。复制代码并返回终端将其粘贴到 cli-dbxfs 提示符中以完成该过程。</p><p>然后,系统会要求你保存凭据以供将来访问。根据你是要保存还是拒绝,输入&nbsp;Y&nbsp;或&nbsp;N。然后,你需要为新的访问令牌输入两次密码。</p><p>最后,输入&nbsp;Y&nbsp;接受&nbsp;/home/username/mydropbox&nbsp;作为默认挂载点。如果你要设置不同的路径,输入&nbsp;N&nbsp;并输入你选择的位置。</p><p class="" style="text-align:center;"><img src="http://115.29.210.249/tggPic/content/2019-01/1546595291599.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2019-01/1546595291599.jpg" alt=""><br></p><p class="" style="text-align:center;"><em>Generate access token 2</em></p><p>完成了!从现在开始,你可以看到你的 Dropbox 文件夹已挂载到本地文件系统中。</p><p class="" style="text-align:center;"><img src="http://115.29.210.249/tggPic/content/2019-01/1546595301766.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2019-01/1546595301766.jpg" alt=""><br></p><p class="" style="color:#FFFFFF;font-size:1.4em;background-color:#3F51B5;">更改访问令牌存储路径</p><p>默认情况下,dbxfs&nbsp;会将 Dropbox 访问令牌存储在系统密钥环或加密文件中。但是,你可能希望将其存储在 gpg 加密文件或其他地方。如果是这样,请在&nbsp;<span style="color:#4D8AD8;">Dropbox 开发者应用控制台</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[4]</span>上创建个人应用来获取访问令牌。</p><p class="" style="text-align:center;"><img src="http://115.29.210.249/tggPic/content/2019-01/1546595313902.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2019-01/1546595313902.jpg" alt=""><br></p><p>创建应用后,单击下一步中的<span style="color:#C40F0F;">生成</span>按钮。此令牌可用于通过 API 访问你的 Dropbox 帐户。不要与任何人共享你的访问令牌。</p><p class="" style="text-align:center;"><img src="http://115.29.210.249/tggPic/content/2019-01/1546595328318.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2019-01/1546595328318.jpg" alt=""><br></p><p>创建访问令牌后,使用任何你选择的加密工具对其进行加密,例如&nbsp;<span style="color:#4D8AD8;">Cryptomater</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[5]</span>、<span style="color:#4D8AD8;">Cryptkeeper</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[6]</span>、<span style="color:#4D8AD8;">CryptGo</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[7]</span>、<span style="color:#4D8AD8;">Cryptr</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[8]</span>、<span style="color:#4D8AD8;">Tomb</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[9]</span>、<span style="color:#4D8AD8;">Toplip</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[10]</span>&nbsp;和&nbsp;<span style="color:#4D8AD8;">**GnuPG</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[11]</span>等,并在你喜欢的位置保存。</p><p>接下来编辑 dbxfs 配置文件并添加以下行:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#65B042;">"access_token_command"</span><span class="" style="color:#B8FFB8;">:</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#B8FFB8;">[</span><span class="" style="color:#65B042;">"gpg"</span><span class="" style="color:#B8FFB8;">,</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#65B042;">"--decrypt"</span><span class="" style="color:#B8FFB8;">,</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#65B042;">"/path/to/access/token/file.gpg"</span><span class="" style="color:#B8FFB8;">]</span></p></li></ol></pre> <p>你可以通过运行以下命令找到 dbxfs 配置文件:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;">$ dbxfs </span><span class="" style="color:#B8FFB8;">--</span><span class="" style="color:#E28964;">print</span><span class="" style="color:#B8FFB8;">-</span><span class="" style="color:#E28964;">default</span><span class="" style="color:#B8FFB8;">-</span><span class="" style="color:#B8FFB8;">config</span><span class="" style="color:#B8FFB8;">-</span><span class="" style="color:#E28964;">file</span></p></li></ol></pre> <p>有关更多详细信息,请参阅 dbxfs 帮助:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;">$ dbxfs </span><span class="" style="color:#B8FFB8;">-</span><span class="" style="color:#B8FFB8;">h</span></p></li></ol></pre> <p>如你所见,使用&nbsp;dbxfs&nbsp;在你的文件系统中本地挂载 Dropfox 文件夹并不复杂。经过测试,dbxfs&nbsp;如常工作。如果你有兴趣了解它是如何工作的,请尝试一下,并在下面的评论栏告诉我们你的体验。</p>
  • news

    Linux系统的命令应该如何记?

    发布时间:2018-12-07

    <p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;">如果你问我,学习掌握Linux最快的方式是什么?我认为是背Linux常用命令,因为你在服务器上面操作的时候,无论你想做什么,都是在使用命令。比如:当服务器的应用有问题的时候,你想查看日志使用cat或者tail –f;比如你需要批量替换一个文件里面的指定字符串的时候,你会使用sed;当你要使用docker的时候,依然是使用docker下面的对应的命令,不过很多命令你看名字,就会知道这个命令是干什么的。</p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;">因而,假如你是一名学生,那么在进入互联网行业之前,想快速打下一个比较好的根底,那么可以采用背重要命令的方式来进行学习,就可以快速掌握Linux了。当然,并不是说你背了越多的Linux下面的命令,你会使用了,你就更精通了,还是需要了解一些Linux的系统知识、原理、理论的内容,比如Linux下面的FHS是怎么样的?文件系统有些什么格式?磁盘的常见分区技术等。还是必须理解了一些必要的理论知识,才能更加明白命令使用的原理,对命令有更深入的认识。</p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:center;background-color:#FFFFFF;color:#3E3E3E;"><img src="http://115.29.210.249/tggPic/content/2018-12/1544162431451.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2018-12/1544162431451.jpg" alt=""></p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;"><strong>Linux入门篇:</strong><br>很多刚入门的同学,就像无头的苍蝇一样,到处找视频、书籍、网站帖子之类的学习方式,视频虽然讲得详细,但是时间的投入也是巨大的,播放时间,练习时间,加起来很吓人,其实啊很少有人能坚持把一套视频看完;技术帖子之类的,一般都比较散乱,不成学习系统,学起来没有一个系统的框架,随意翻翻也还好;推荐一本书《Linux就该这么学》,感觉还不错,建议新手入手。书籍从目录来看就非常有条理,看书可以系统化的学习、循序渐进,不会初学者不知道从哪儿开始的感觉。建议使用我上面的那本,如果有更好的,也你可以,但是一定要坚持,前期可以安装一个VMware或者virtualbox虚拟机,重复练习为主要手段,把一本书好好吃透,重点是吃透,那么你也就入门了。</p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;">那么具体需要掌握哪些命令呢?这里罗列一些必须掌握的命令:<br>目录类的命令是我们需要得最多的:<br><strong><span style="color:#666666;line-height:26px;font-size:13px;">cd [24] &nbsp; &nbsp;改变工作目录<br>chmod [25] &nbsp; &nbsp;改变文件或目录的文件权限<br>dirs [24] &nbsp; &nbsp;显示/清除目录栈中的内容<br>du [24] &nbsp; &nbsp;显示文件使用的磁盘空间量<br>file [24] &nbsp; &nbsp;分析文件的类型<br>ls [24/25] &nbsp; &nbsp;显示文件的各种类型的信息<br>mkdir [24] &nbsp; &nbsp;创建目录<br>mv [24/25] &nbsp; &nbsp;移动或重命名文件或目录<br>popd [24] &nbsp; &nbsp;改变工作目录,将名称从目录栈中弹出<br>pushd [24] &nbsp; &nbsp;改变工作目录,将名称压入到目录栈中<br>pwd [24] &nbsp; &nbsp;显示工作目录的路径名<br>rm [25] &nbsp; &nbsp;删除文件或目录<br>rmdir [24] &nbsp; &nbsp;删除空目录<br>tree [24] &nbsp; &nbsp;显示目录树的图表</span></strong></p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;"><strong>构建块</strong><br><span style="font-family:&quot;color:#666666;line-height:26px;font-size:13px;"><strong>cat [16] &nbsp; &nbsp;组合文件,将标准输入复制到标准输出<br>tee [15] &nbsp; &nbsp;将标准输入复制到文件和标准输出<br>xargs [25] &nbsp; &nbsp;使用来自标准输入的参数运行命令<br>当你不知道需要查找命令的相关信息的时候,可能就需要下面的命令工具了:<br>alias [13] &nbsp; &nbsp;创建/显示别名<br>type [8] &nbsp; &nbsp;定位命令:显示命令的路径名或别名<br>unalias [25] &nbsp; &nbsp;删除别名<br>whence [8] &nbsp; &nbsp;定位命令:显示命令的路径名或别名<br>which [8] &nbsp; &nbsp;定位命令:显示命令的路径名或别名</strong></span></p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;">当我们需要显示内容的时候,需要我们的显示输出命令,非常重要:<br><span style="font-family:&quot;color:#666666;line-height:26px;font-size:13px;"><strong>cat [16] &nbsp; &nbsp;组合文件,将标准输入复制到标准输出<br>echo [12] &nbsp; &nbsp;将参数写到标准输出<br>head [16/21] &nbsp; &nbsp;从数据的开头选择行<br>hexdump [21] &nbsp; &nbsp;显示二进制(非文本)文件<br>less [21] &nbsp; &nbsp;分页程序:每次一屏地显示数据<br>more [21] &nbsp; &nbsp;分布程序:每次一屏地显示数据<br>od [21] &nbsp; &nbsp;显示二进制(非文本)文件<br>print [12] &nbsp; &nbsp;将参数写到标准输出<br>tail [21] &nbsp; &nbsp;在数据的末尾选择行</strong></span></p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;">当我们需要对服务器配置的时候,那么编辑命令就非常重要了:<br><strong><span style="color:#666666;line-height:26px;font-size:13px;">sed [19] &nbsp; &nbsp;非交互式文本编辑<br>vi [22] &nbsp; &nbsp;vi文本编辑器<br>view [22] &nbsp; &nbsp;以只读模式启动vi文本编辑器<br>vim [22] &nbsp; &nbsp;vim文本编辑器</span></strong></p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;">当我们需要对文件的权限,搜索,操作之类的,那么就需要下面的命令了:<br><strong><span style="color:#666666;line-height:26px;font-size:13px;">chmod [25] &nbsp; &nbsp;改变文件或目录的文件权限<br>cp [25] &nbsp; &nbsp;复制文件;复制目录<br>du [24] &nbsp; &nbsp;显示文件使用的磁盘空间量<br>find [25] &nbsp; &nbsp;在目录树中搜索文件,处理结果<br>ln [25] &nbsp; &nbsp;创建文件的一个新链接<br>locate [25] &nbsp; &nbsp;搜索文件<br>ls [24/25] &nbsp; &nbsp;显示文件的各种类型的信息<br>mkfifo [23] &nbsp; &nbsp;创建命名管道<br>mv [24/25] &nbsp; &nbsp;移动或重命名文件或目录<br>rm [25] &nbsp; &nbsp;删除文件或目录<br>shred [25] &nbsp; &nbsp;安全删除文件<br>stat [25] &nbsp; &nbsp;显示i节点的信息<br>touch [25] &nbsp; &nbsp;更新文件的访问/修改时间;创建文件<br>umask [25] &nbsp; &nbsp;在文件创建过程中设置文件模式掩码<br>whence [8] &nbsp; &nbsp;定位命令:显示命令的路径名或别名<br>whereis [25] &nbsp; &nbsp;查看与命令关联的文件</span></strong></p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;">那么我们知道了这么多命令,或者忘记了命令的参数和使用那万一忘记了,如何找到呢?下面就教大家几个必备命令:<br><strong>神器一:man命令 &nbsp; &nbsp;格式:man[空格][需要查看的命令]<span class="Apple-converted-space" style="color:#666666;line-height:28px;">&nbsp;</span></strong><br>比如我们输入:man ls &nbsp; 就会看到man page 如下图</p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:center;background-color:#FFFFFF;color:#3E3E3E;"><img src="http://115.29.210.249/tggPic/content/2018-12/1544162447143.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2018-12/1544162447143.jpg" alt=""></p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:justify;background-color:#FFFFFF;color:inherit;"><strong>神器二:info命令 格式:info [需要查看的命令] &nbsp;</strong><br>比如我们输入info ls 回车,就会看到下图:</p><p style="font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:14px;text-align:center;background-color:#FFFFFF;color:#3E3E3E;"><img src="http://115.29.210.249/tggPic/content/2018-12/1544162458236.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2018-12/1544162458236.jpg" alt=""></p>
  • news

    2018 重温 Unix 哲学

    发布时间:2018-11-27

    <p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">1984 年,Rob Pike 和 Brian W. Kernighan 在 AT&amp;T 贝尔实验室技术期刊上发表了名为 “<span style="color:#4D8AD8;">Unix 环境编程</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[1]</span>” 的文章,其中他们使用 BSD 的&nbsp;cat -v&nbsp;例子来认证 Unix 哲学。简而言之,Unix 哲学是:构建小型、单一的应用程序 —— 不管用什么语言 —— 只做一件小而美的事情,用&nbsp;stdin&nbsp;/&nbsp;stdout&nbsp;进行通信,并通过管道进行连接。</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">听起来是不是有点耳熟?</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">是的,我也这么认为。这就是 James Lewis 和 Martin Fowler 给出的&nbsp;<span style="color:#4D8AD8;">微服务的定义</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[2]</span>&nbsp;。</p><blockquote style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;"><p>简单来说,微服务架构的风格是将单个 应用程序开发为一套小型服务的方法,每个服务都运行在它的进程中,并用轻量级机制进行通信,通常是 HTTP 资源 API 。</p></blockquote><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">虽然一个 *nix 程序或者是一个微服务本身可能非常局限甚至不是很有用,但是当这些独立工作的单元组合在一起的时候就显示出了它们真正的好处和强大。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.4em;background-color:#3F51B5;">*nix程序 vs 微服务</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">下面的表格对比了 *nix 环境中的程序(例如&nbsp;cat&nbsp;或&nbsp;lsof)与微服务环境中的程序。</p>&lt; 如显示不全,请左右滑动 &gt;<table cellpadding="4" width="694" style="margin:0px 0px 10px;padding:0px;width:378px;"><tbody><tr><th style="text-align:left;font-weight:400;background:#F7F7F7;">&nbsp;</th><th style="text-align:left;font-weight:400;background:#F7F7F7;">*nix 程序</th><th style="text-align:left;font-weight:400;background:#F7F7F7;">微服务</th></tr></tbody><tbody><tr><td style="border:1px solid #DDDDDD;">执行单元</td><td style="border:1px solid #DDDDDD;">程序使用&nbsp;stdin/stdout</td><td style="border:1px solid #DDDDDD;">使用 HTTP 或 gRPC API</td></tr><tr><td style="border:1px solid #DDDDDD;">数据流</td><td style="border:1px solid #DDDDDD;">管道</td><td style="border:1px solid #DDDDDD;">?</td></tr><tr><td style="border:1px solid #DDDDDD;">可配置和参数化</td><td style="border:1px solid #DDDDDD;">命令行参数、环境变量和配置文件</td><td style="border:1px solid #DDDDDD;">JSON/YAML 文档</td></tr><tr><td style="border:1px solid #DDDDDD;">发现</td><td style="border:1px solid #DDDDDD;">包管理器、man、make</td><td style="border:1px solid #DDDDDD;">DNS、环境变量、OpenAPI</td></tr></tbody></table><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">让我们详细的看看每一行。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.2em;background-color:#3F51B5;">执行单元</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">*nix 系统(如 Linux)中的执行单元是一个可执行的文件(二进制或者是脚本),理想情况下,它们从&nbsp;stdin&nbsp;读取输入并将输出写入&nbsp;stdout。而微服务通过暴露一个或多个通信接口来提供服务,比如 HTTP 和 gRPC API。在这两种情况下,你都会发现无状态示例(本质上是纯函数行为)和有状态示例,除了输入之外,还有一些内部(持久)状态决定发生了什么。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.2em;background-color:#3F51B5;">数据流</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">传统的,*nix 程序能够通过管道进行通信。换句话说,我们要感谢&nbsp;<span style="color:#4D8AD8;">Doug McIlroy</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[3]</span>,你不需要创建临时文件来传递,而可以在每个进程之间处理无穷无尽的数据流。据我所知,除了我在&nbsp;<span style="color:#4D8AD8;">2017 年做的基于 Apache Kafka 小实验</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[4]</span>,没有什么能比得上管道化的微服务了。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.2em;background-color:#3F51B5;">可配置和参数化</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">你是如何配置程序或者服务的,无论是永久性的服务还是即时的服务?是的,在 *nix 系统上,你通常有三种方法:命令行参数、环境变量,或全面的配置文件。在微服务架构中,典型的做法是用 YAML(或者甚至是 JSON)文档,定制好一个服务的布局和配置以及依赖的组件和通信、存储和运行时配置。例如&nbsp;<span style="color:#4D8AD8;">Kubernetes 资源定义</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[5]</span>、<span style="color:#4D8AD8;">Nomad 工作规范</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[6]</span>&nbsp;或&nbsp;<span style="color:#4D8AD8;">Docker 编排</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[7]</span>&nbsp;文档。这些可能参数化也可能不参数化;也就是说,除非你知道一些模板语言,像 Kubernetes 中的&nbsp;<span style="color:#4D8AD8;">Helm</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[8]</span>,否则你会发现你使用了很多&nbsp;sed -i&nbsp;这样的命令。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.2em;background-color:#3F51B5;">发现</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">你怎么知道有哪些程序和服务可用,以及如何使用它们?在 *nix 系统中通常都有一个包管理器和一个很好用的 man 页面;使用它们,应该能够回答你所有的问题。在微服务的设置中,在寻找一个服务的时候会相对更自动化一些。除了像&nbsp;<span style="color:#4D8AD8;">Airbnb 的 SmartStack</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[9]</span>&nbsp;或&nbsp;<span style="color:#4D8AD8;">Netflix 的 Eureka</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[10]</span>&nbsp;等可以定制以外,通常还有基于环境变量或基于 DNS 的<span style="color:#4D8AD8;">方法</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[11]</span>,允许您动态的发现服务。同样重要的是,事实上&nbsp;<span style="color:#4D8AD8;">OpenAPI</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[12]</span>&nbsp;为 HTTP API 提供了一套标准文档和设计模式,<span style="color:#4D8AD8;">gRPC</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[13]</span>&nbsp;为一些耦合性强的高性能项目也做了同样的事情。最后非常重要的一点是,考虑到开发者经验(DX),应该从写一份好的&nbsp;<span style="color:#4D8AD8;">Makefile</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[14]</span>&nbsp;开始,并以编写符合&nbsp;<span style="color:#4D8AD8;">风格</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[15]</span>&nbsp;的文档结束。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.4em;background-color:#3F51B5;">优点和缺点</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">*nix 系统和微服务都提供了许多挑战和机遇。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.2em;background-color:#3F51B5;">模块性</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">要设计一个简洁、有清晰的目的,并且能够很好地和其它模块配合的某个东西是很困难的。甚至是在不同版本中实现并引入相应的异常处理流程都很困难的。在微服务中,这意味着重试逻辑和超时机制,或者将这些功能外包到服务网格service mesh是不是一个更好的选择呢?这确实比较难,可如果你做好了,那它的可重用性是巨大的。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.2em;background-color:#3F51B5;">可观测性</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">在一个独石monolith(2018 年)或是一个试图做任何事情的大型程序(1984 年),当情况恶化的时候,应当能够直接的找到问题的根源。但是在一个</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#E28964;">yes</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#B8FFB8;">|</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#E28964;">tr</span><span class="" style="color:#B8FFB8;"> \\n x </span><span class="" style="color:#B8FFB8;">|</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#E28964;">head</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#B8FFB8;">-</span><span class="" style="color:#B8FFB8;">c </span><span class="" style="color:#3387CC;">450m</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#B8FFB8;">|</span><span class="" style="color:#B8FFB8;"> </span><span class="" style="color:#E28964;">grep</span><span class="" style="color:#B8FFB8;"> n</span></p></li></ol></pre> <p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">或者在一个微服务设置中请求一个路径,例如,涉及 20 个服务,你怎么弄清楚是哪个服务的问题?幸运的是,我们有很多标准,特别是&nbsp;<span style="color:#4D8AD8;">OpenCensus</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[16]</span>&nbsp;和&nbsp;<span style="color:#4D8AD8;">OpenTracing</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[17]</span>。如果您希望转向微服务,可预测性仍然可能是较大的问题。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.2em;background-color:#3F51B5;">全局状态</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">对于 *nix 程序来说可能不是一个大问题,但在微服务中,全局状态仍然是一个需要讨论的问题。也就是说,如何确保有效的管理本地化(持久性)的状态以及尽可能在少做变更的情况下使全局保持一致。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;text-align:justify;color:#FFFFFF;font-size:1.4em;background-color:#3F51B5;">总结一下</p><p style="color:#333333;font-family:Optima-Regular, PingFangTC-light;font-size:14px;text-align:justify;">最后,问题仍然是:你是否在使用合适的工具来完成特定的工作?也就是说,以同样的方式实现一个特定的 *nix 程序在某些时候或者阶段会是一个更好的选择,它是可能在你的组织或工作过程中的一个<span style="color:#4D8AD8;">最好的选择</span><span class="" style="font-size:9px;vertical-align:super;color:#FFFFFF;line-height:1em;background-color:#666666;">[18]</span>。无论如何,我希望这篇文章可以让你看到 Unix 哲学和微服务之间许多强有力的相似之处。也许我们可以从前者那里学到一些东西使后者受益。</p>
  • news

    写直白的代码

    发布时间:2018-11-20

    <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">为开源项目作贡献最好的方式是为它减少代码,我们应致力于写出让新手程序员无需注释就容易理解的代码,让维护者也无需花费太多精力就能着手维护。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">在学生时代,我们会更多地用复杂巧妙的技术去挑战新的难题。首先我们会学习循环,然后是函数啊,类啊,等等。当我们到达一定高的程度,能用更高级的技术写更长的程序,我们会因此受到称赞。此刻我们发现老司机们用 monads 而新手们用 loop 作循环。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">之后我们毕业找了工作,或者和他人合作开源项目。我们用在学校里学到的各种炫技寻求并骄傲地给出解决方案的代码实现。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;"><br></p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">我们实现了某个小的功能,并以充分的理由觉得自己做到了。现实项目中的编程却不是针对某某部分的功能而言。以我个人的经验而言,以前我很开心的去写代码,并骄傲地向世界展示我所知道的事情。有例为证,作为对某种编程技术的偏爱,这是用另一种元编程语言构建的一个&nbsp;<span style="font-family:&quot;color:#4D8AD8;line-height:28px;">线性代数语言</span><span class="" style="font-family:&quot;color:#FFFFFF;line-height:1em;font-size:9px;vertical-align:super;background-color:#666666;">[1]</span>,注意,这么多年以来一直没人愿意碰它。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">在维护了更多的代码后,我的观点发生了变化。</p><span style="color:#666666;font-family:&quot;font-size:14px;background-color:#FFFFFF;">1.&nbsp;我们不应去刻意探求如何构建软件。软件是我们为解决问题所付出的代价,那才是我们真实的目的。我们应努力为了解决问题而构建较小的软件。2.&nbsp;我们应使用尽可能简单的技术,那么更多的人就越可能会使用,并且无需理解我们所知的高级技术就能扩展软件的功能。当然,在我们不知道如何使用简单技术去实现时,我们也可以使用高级技术。</span><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">所有的这些例子都不是听来的故事。我遇到的大部分人会认同某些部分,但不知为什么,当我们向一个新项目贡献代码时又会忘掉这个初衷。直觉里用复杂技术去构建的念头往往会占据上风。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">软件是种投入</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">你写的每行代码都要花费人力。写代码当然是需要时间的,也许你会认为只是你个人在奉献,然而这些代码在被审阅的时候也需要花时间理解,对于未来维护和开发人员来说,他们在维护和修改代码时同样要花费时间。否则他们完全可以用这时间出去晒晒太阳,或者陪伴家人。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">所以,当你向某个项目贡献代码时,请心怀谦恭。就像是,你正和你的家人进餐时,餐桌上却没有足够的食物,你只索取你所需的部分,别人对你的自我约束将肃然起敬。以更少的代码去解决问题是很难的,你肩负重任的同时自然减轻了别人的重负。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">技术越复杂越难维护</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">作为学生,逐渐使用技术证明了自己的价值。这体现在,首先我们有能力在开源项目中使用函数,接着是类,然后是高阶函数,monads 等等。我们向同行显示自己的解决方案时,常因自己所用技术高低而感到自豪或卑微。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">而在现实中,和团队去解决问题时,情况发生了逆转。现在,我们致力于尽可能使用简单的代码去解决问题。简单方式解决问题使新手程序员能够以此扩展并解决其他问题。简单的代码让别人容易上手,效果立竿见影。我们藉以只用简单的技术去解决难题,从而展示自己的价值。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;"><br></p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">如果你是个好的程序员,你不需要证明你知道很多炫技。相应的,你可以通过用一个简单的方法解决一个问题来显示你的价值,并激发你的团队在未来的时间里去完善它。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">当然,也请保持节制</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">话虽如此,过于遵循 “用简单的工具去构建” 的教条也会降低生产力。通常用递归会比用循环解决问题更简单,用类或 monad 才是正确的途径。还有两种情况另当别论,一是只是只为满足自我而创建的系统,或者是别人毫无构建经验的系统。</p>
在线咨询 ×

您好,请问有什么可以帮您?我们将竭诚提供最优质服务!