<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on 静静的安全笔记</title><link>https://ruajingjing.top/tags/python/</link><description>Recent content in Python on 静静的安全笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><lastBuildDate>Sun, 02 Feb 2025 14:46:25 +0000</lastBuildDate><atom:link href="https://ruajingjing.top/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>纯动嘴让DeepSeek给自己写一个壳</title><link>https://ruajingjing.top/post/%E7%BA%AF%E5%8A%A8%E5%98%B4%E8%AE%A9deepseek%E7%BB%99%E8%87%AA%E5%B7%B1%E5%86%99%E4%B8%80%E4%B8%AA%E5%A3%B3/</link><pubDate>Sun, 02 Feb 2025 14:46:25 +0000</pubDate><guid>https://ruajingjing.top/post/%E7%BA%AF%E5%8A%A8%E5%98%B4%E8%AE%A9deepseek%E7%BB%99%E8%87%AA%E5%B7%B1%E5%86%99%E4%B8%80%E4%B8%AA%E5%A3%B3/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post 纯动嘴让DeepSeek给自己写一个壳" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;关注 &lt;strong&gt;泷羽Sec-静安&lt;/strong&gt; 公众号，后台回复“找工具+20250201”获取本文的GUI工具&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="调用示例"&gt;调用示例
&lt;/h2&gt;&lt;p&gt;ollama模型刚建好是可以在终端用的，但是终端界面太丑了，想着怎么写个界面。好在这玩意是有API调用的，下面这个就是终端调用api的示范。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c++" data-lang="c++"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="nl"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//localhost:11434/api/generate -d &amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;model&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;deepseek-r1:1.5b&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;prompt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;你好&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="image-20250201233716154" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201233716154.png"&gt;&lt;/p&gt;
&lt;p&gt;让后把这个代码丢给AI，让他生成一个简单的python程序。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201233923216" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201233923216.png"&gt;&lt;/p&gt;
&lt;p&gt;然后在这个程序基础上写个界面，实现基本的输入输出功能就好。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201234129164" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201234129164.png"&gt;&lt;/p&gt;
&lt;h2 id="开始动嘴"&gt;开始动嘴
&lt;/h2&gt;&lt;p&gt;几次输入后发现不会转行。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201171858563" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201171858563.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201171925315" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201171925315.png"&gt;&lt;/p&gt;
&lt;p&gt;输出的内容对了，但是回答完成后不会转行，这样用户和AI助手的内容都在一行里不方便看。这里调试的时候用的Copilot，只有大的改动用DeepSeek，在网页上搞，本地的1.5b还是有点傻，简单的回答还行，Copilot目前还不支持DeepSeek。类似的AI辅助编程的也可以使用&lt;a class="link" href="https://www.cursor.com/" target="_blank" rel="noopener"
 &gt;Cusor&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201174143817" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201174143817.png"&gt;&lt;/p&gt;
&lt;p&gt;修改后会换行了，但是把窗口点大了这个界面就很难看，而且目前还没有markdown渲染，think的部分也不会折叠，如果有代码输出也不能一键复制。继续发挥只会动嘴的产品经理技能。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201182225415" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201182225415.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201182635577" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201182635577.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201182817522" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201182817522.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201182944187" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201182944187.png"&gt;&lt;/p&gt;
&lt;p&gt;基本实现要求，但是有点丑。我想把输入栏调高一点。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201183249652" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201183249652.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201183523342" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201183523342.png"&gt;&lt;/p&gt;
&lt;p&gt;有点效果，但是左边没有保存对话的那个栏目。继续发挥动嘴技能。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201183903326" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201183903326.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201184044191" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201184044191.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201185320530" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201185320530.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201185307523" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201185307523.png"&gt;&lt;/p&gt;
&lt;p&gt;基本可行，但是有bug，点新对话后所有的对话都不见了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201190439257" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201190439257.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201191320138" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201191320138.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201191554614" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201191554614.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201191856145" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201191856145.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201193359678" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201193359678.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201193458882" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201193458882.png"&gt;&lt;/p&gt;
&lt;p&gt;调教完成，只是历史对话的界面不会再次渲染，有点丑。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201193654266" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201193654266.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201194132595" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201194132595.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201194116464" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201194116464.png"&gt;&lt;/p&gt;
&lt;p&gt;加点渲染。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201195558242" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201195558242.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201195528387" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201195528387.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201200939772" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201200939772.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201201321696" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201201321696.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201201903039" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201201903039.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201201853564" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201201853564.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201204516616" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201204516616.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201220133247" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201220133247.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201221817947" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201221817947.png"&gt;&lt;/p&gt;
&lt;p&gt;这个界面还是有点丑怎么办？动嘴使唤一下AI美工。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201222931854" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201222931854.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201225008446" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201225008446.png"&gt;&lt;/p&gt;
&lt;p&gt;怎么说呢，微整形，美了一点但不多。先让AI把颜色单独写成一个&lt;code&gt;style.py&lt;/code&gt;文件，然后让左边两个对齐。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201232315480" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201232315480.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201232249536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201232249536.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201232152121" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201232152121.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201232723193" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201232723193.png"&gt;&lt;/p&gt;
&lt;p&gt;这里用的是硅基流动的DeepSeek写的，DS本体又被DDOS了。而本地的模型1.5b的太菜。搞了点颜色就好看很多了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201232951132" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201232951132.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250201234351059" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250201234351059.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202000008072" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202000008072.png"&gt;&lt;/p&gt;
&lt;p&gt;微调一些细节，最后的成品如图。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202010100330" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202010100330.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202010127855" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202010127855.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202010148047" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202010148047.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202010201804" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202010201804.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202010218280" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202010218280.png"&gt;&lt;/p&gt;
&lt;p&gt;再更新几个新主题颜色，把觉得好看的图片，截图丢给http://colrd.com/create/image-dna/ 这个网站会提取主调色。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202101355039" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202101355039.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202101606528" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202101606528.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202101411194" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202101411194.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20250202101548866" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202101548866.png"&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;关注 &lt;strong&gt;泷羽Sec-静安&lt;/strong&gt; 公众号，后台回复“找工具+20250201”获取本文的工具&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="image-20250202010638261" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/image-20250202010638261.png"&gt;&lt;/p&gt;
&lt;p&gt;最后懒到README也是AI写的。完整项目已经丢Gitee和Github了，欢迎fork。也可以回复公众号关键字“找工具+20250201”获取本文的GUI工具&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://gitee.com/bugatti100Peagle/deep-seek-gui" target="_blank" rel="noopener"
 &gt;https://gitee.com/bugatti100Peagle/deep-seek-gui&lt;/a&gt;
&lt;a class="link" href="https://github.com/Bugatti100Peagle/DeepSeekGUI" target="_blank" rel="noopener"
 &gt;https://github.com/Bugatti100Peagle/DeepSeekGUI&lt;/a&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;🔔 &lt;strong&gt;想要获取更多网络安全与编程技术干货？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;关注 &lt;strong&gt;泷羽Sec-静安&lt;/strong&gt; 公众号，与你一起探索前沿技术，分享实用的学习资源与工具。我们专注于深入分析，拒绝浮躁，只做最实用的技术分享！💻&lt;/p&gt;
&lt;p&gt;扫描下方二维码，马上加入我们，共同成长！🌟&lt;/p&gt;
&lt;p&gt;👉 &lt;strong&gt;长按或扫描二维码关注公众号&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250115101708.jpg"&gt;&lt;/p&gt;
&lt;p&gt;或者直接回复文章中的关键词，获取更多技术资料与书单推荐！📚&lt;/p&gt;</description></item><item><title>如何用和鲸heywhale加速数据研究工作和撰写论文</title><link>https://ruajingjing.top/post/%E5%A6%82%E4%BD%95%E7%94%A8%E5%92%8C%E9%B2%B8heywhale%E5%8A%A0%E9%80%9F%E6%95%B0%E6%8D%AE%E7%A0%94%E7%A9%B6%E5%B7%A5%E4%BD%9C%E5%92%8C%E6%92%B0%E5%86%99%E8%AE%BA%E6%96%87/</link><pubDate>Mon, 19 Aug 2024 17:43:45 +0000</pubDate><guid>https://ruajingjing.top/post/%E5%A6%82%E4%BD%95%E7%94%A8%E5%92%8C%E9%B2%B8heywhale%E5%8A%A0%E9%80%9F%E6%95%B0%E6%8D%AE%E7%A0%94%E7%A9%B6%E5%B7%A5%E4%BD%9C%E5%92%8C%E6%92%B0%E5%86%99%E8%AE%BA%E6%96%87/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post 如何用和鲸heywhale加速数据研究工作和撰写论文" /&gt;&lt;p&gt;想学Python无从下手？数据太大拷贝使用麻烦？安装Python环境让人困扰？数据写论文来回转移平台麻烦？这些问题都可以用和鲸解决。&lt;/p&gt;
&lt;p&gt;官网：&lt;a class="link" href="https://www.heywhale.com/home" target="_blank" rel="noopener"
 &gt;https://www.heywhale.com/home&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="免安装开箱即用的python环境"&gt;免安装、开箱即用的python环境
&lt;/h2&gt;&lt;p&gt;很多新手学Python经常卡在第一步环境安装。完整的Python环境需要下载Python本体，Python2，7或者Python3.6，目前常用的是Python3.6 很多学习教程也是这个版本，最新的是Python3.9，下载Python-installer.exe 安装程序点击安装后，通常会自带几个常用的库，但是这几个库对于数据分析来说不够用。所以，对于学习数据分析的新手而言，通常还需要安装额外的库，比如basemap，cartopy，pandoc，scipy等。在安装库的环节又会遇到墙的问题导致&lt;strong&gt;下载很慢&lt;/strong&gt;，这时要么换源，要么下载离线的&lt;code&gt;.whl&lt;/code&gt;包安装。某些库安装要求前置依赖，并且并不是都支持默认的最新版本号，此时还需要&lt;strong&gt;指定版本号安装&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;终于都安装完成了，或许你已经用Ipython的界面运行了几个简单的Python代码，此时你会发现这个编辑器保存修改都不方便，你需要一款支持python语言的IDE编辑器，一般的选择有Spyder或者Pycharm，也可以用VScode。一些教程可能会推荐你用Anaconda全家桶，一次安装，啥都配好从库到IDE，安装依赖库也只需要勾选即可，前置依赖conda会自动帮你解决。但是慢慢的你会发现，conda下载依赖库并不是全都能自己解决前置和相互之间的依赖。有些需要第三方软件链接的库，并不能自动安装，如GEO，而且Anaconda整体显得十分笨重，每次&lt;strong&gt;启动都十分缓慢&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;现在使用和鲸就可以解决。打开&lt;a class="link" href="https://www.heywhale.com/home" target="_blank" rel="noopener"
 &gt;和鲸官网&lt;/a&gt;，注册一个账户就能开始编程。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724044571284" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724044571284.png"&gt;&lt;/p&gt;
&lt;p&gt;点击工作台，选择基础版。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724044641345" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724044641345.png"&gt;&lt;/p&gt;
&lt;p&gt;新建一个Notebook。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724044669144" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724044669144.png"&gt;&lt;/p&gt;
&lt;p&gt;选择运行环境和镜像（不知道选什么就默认），点击运行。等待页面跳转到比工作台界面。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724044844157" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724044844157.png"&gt;&lt;/p&gt;
&lt;p&gt;使用过Jupyter的同学应该很熟悉这个界面，在灰蓝色框内双击进入编辑状态，输入python代码，比如 &lt;code&gt;print(&amp;quot;Hello World&amp;quot;)&lt;/code&gt;，然后点击左边的播放按钮或者键盘快捷键 &lt;code&gt;shift+enter&lt;/code&gt; 即可运行当前框内的代码。&lt;/p&gt;
&lt;p&gt;&lt;img alt="和鲸print" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/和鲸print.gif"&gt;&lt;/p&gt;
&lt;p&gt;是的，就这么简单，啥都不用管，你手上的《Python从入门到精通》《一周速成Python》这样的书可以直接跳过 第一章-python的安装 这一环节了。从变量环境直接开始吧。&lt;/p&gt;
&lt;h2 id="学习路径"&gt;学习路径
&lt;/h2&gt;&lt;p&gt;我一般学习编程语言主要依靠在线文档而不是纸质书。互联网上Python的教程很多，有免费的也有收费的，我最开始是在上大二的时候，照着菜鸟教程网站的Python入门篇学习，然后一边学一边试着写数学分析课的作业，不懂的地方就东找找西找找，浪费了很多时间，吃了很多亏。中间因为安装依赖库把电脑环境搞崩溃的，重装电脑不下10次，还有因为看了错误的教程一直用错误的代码读数据，最后出图是错误的。现在和鲸有专业的学习路径，不用再在网上浪费时间找教程了。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.heywhale.com/landing/qixiang?from=home" target="_blank" rel="noopener"
 &gt;&lt;img alt="1724048206786" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724048206786.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;和鲸有针对气象，经管，数据分析行业的路径图，直接照着地图走就行，点击图片就能打开路径图，直达专项训练营。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724049887904" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724049887904.png"&gt;&lt;/p&gt;
&lt;p&gt;可以根据自己的需要，选择训练营学习。&lt;/p&gt;
&lt;h2 id="镜像更换快速"&gt;镜像更换快速
&lt;/h2&gt;&lt;p&gt;当你学习了一段时间的Python编程后，你要用Python解决实际科研问题的时候，你发现你的笔记本读取数据，运行代码很慢，你的笔记本没有配备高性能显卡，在一些图像领域的研究，小小的笔记本严重拖满了你的工作效率。&lt;/p&gt;
&lt;p&gt;还记得一开始的运行界面，可以选择系统和镜像吗？鼠标悬停在右上角的Python3 Kernel信息这里，可以选择切换系统和镜像。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724050312103" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724050312103.png"&gt;&lt;/p&gt;
&lt;p&gt;我在工作后经常需要绘制一些大图展示数据或者作为海报，单位配置的电脑是政采的清华同方。懂得都懂，清华同方的含金量啊。那基本上就只能写写word而已，即便是标着&amp;quot;工作站&amp;quot;字样的清华同方，依旧用着GTX960的显卡。这样的垃圾货还能用掉政采全年预算的三分之一。如果想要采购一台有高性能显卡和计算能力的个人电脑，集采市场压根没有供货商。想要采购一台小型超算，政采中供货商的价格也直接让一些小的单位无法接受。如果不走集采，那么就需要动用单位本级的自有资金，对于一些本就经费紧张的单位而言，这些资金还要留着发工资，支付各种税金和保险，维持单位日常运转。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724050877187" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724050877187.png"&gt;&lt;/p&gt;
&lt;p&gt;对于GPU这样的资源，一些项目研究使用该资源的需求只是爆发式的和结果式的。研究人员需要GPU运行一段时间，用得到的结果进一步研究和发表。在和鲸中就可以临时选择GPU资源，在设定好的时间内把结果跑出来，然后释放GPT资源，停止计费。&lt;strong&gt;不需要真的购买4个显卡&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Tips: 每周首页打卡可以白嫖3个鲸币。完成任务也可以获得鲸币。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;我在制作射界图的时候就是采用了这样的方式，先选择基础资源调试代码，最后选择T4 GPU渲染单个文件大小2-3G的高清地理图。下载结果图直接发给广告公司打印即可粘贴到办公室、作业点指导实际人员作业。只需要支付打印海报的费用，不用支付设计费和图纸费了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724051751988" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724051751988.png"&gt;&lt;/p&gt;
&lt;p&gt;我还喜欢镜像更换这个功能。在分析气象数据时我通常会选择&lt;code&gt;气象分析镜像Python3.7&lt;/code&gt; 这个镜像。可以点击详情查看镜像都安装了什么库。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724052088585" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724052088585.png"&gt;&lt;/p&gt;
&lt;p&gt;3.7这个镜像已经安装了atmos-算LNP图常用的一个库；basemap好用的一批，但&lt;strong&gt;难装的要死的地图库&lt;/strong&gt;，画大气环流地图什么的相当漂亮；Catopys，另一个地图库，Basemap的替代品但是我不喜欢用；cinrad，雷达数据读取画图的库，&lt;strong&gt;简单到令人发指&lt;/strong&gt;，&lt;code&gt;a=read(&amp;quot;雷达数据.bin&amp;quot;);plot(a)&lt;/code&gt; 就完事，不用管什么波段什么格式，只要是中国常用的雷达数据，这个库自己会判断。GDAL和gmpy2两个地理数据库，&lt;strong&gt;极难安装&lt;/strong&gt;；mayavi，3D动画库，也是&lt;strong&gt;极难安装需要有maya&lt;/strong&gt;，想要出图高级一点可以用这个整成3D的动图，别再傻傻的用matplotlib，那只是个基本库；Metpy气象相关计算库；siphon，研究国外一些探空站下载数据用得到，库本身似乎停止更新，也&lt;strong&gt;不在公开资源中提供下载&lt;/strong&gt;了；pandas，数据读取处理软件，在没有学会pandas之前，我只是把python当Fortran的高级版用，读写数据还是用f90那一套习惯，笑死。没有学过pandas的一定要报名&lt;a class="link" href="https://www.heywhale.com/home/activity/detail/632a8f2a0354869bacd2c8e9" target="_blank" rel="noopener"
 &gt;龙清老师的GP1训练营&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724052677914" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724052677914.png"&gt;&lt;/p&gt;
&lt;p&gt;顺便秀一下，我是第九名，这个训练营十分酸爽，建议学好python基础和画图的课程后在挑战。&lt;/p&gt;
&lt;h2 id="数据拷贝"&gt;数据拷贝
&lt;/h2&gt;&lt;p&gt;科研最重要的基石就是数据，没有数据就做不了分析，发不了Paper。和鲸平台免费版可以托管20GB的数据，但是你从本地上传20GB的数据也很慢不是，和鲸还有直接挂在数据库和OSS对象储存和NAS的功能（需要付费）。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724052918537" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724052918537.png"&gt;&lt;/p&gt;
&lt;p&gt;对于医疗行业和某些可以开放共享的数据库，你可以直接链接数据库，不需要下载数据，直接读取数据库做分析。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724053138389" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724053138389.png"&gt;&lt;/p&gt;
&lt;p&gt;如果你们实验室搭建了NAS，或者你个人搭建了NAS，那你可以链接到你的NAS，直接访问你NAS中的数据做分析。你可以用另一台服务器，写个脚本，每天爬取NASA，天擎的数据和其他你需要的站点的数据，下载NAS中。不用管他，让脚本自动运行。当你需要研究的时候，只需要读取本地NAS的数据即可。&lt;/p&gt;
&lt;p&gt;除了Python，和鲸还可以写R，julia和执行shell代码。和Jupyter Lab的界面相似，使用方法也相似。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724053499582" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724053499582.png"&gt;&lt;/p&gt;
&lt;h2 id="用gpt与和鲸写论文"&gt;用GPT与和鲸写论文
&lt;/h2&gt;&lt;p&gt;.ipynb可以同时包含代码和markdown字符，只需要设置每个小块cell的属性即可。首先在GPT上输入要写的论文内容和题目，字数，投放的期刊级别，让GPT生成论文大纲，粘贴到和鲸的markdonw中，用&lt;code&gt;ctrl shift -&lt;/code&gt; 三个键按段落分割cell，就可以很清爽的写论文了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="分割" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/和鲸论文.gif"&gt;&lt;/p&gt;
&lt;p&gt;当论文需要计算数据时直接选择新增代码cell，编写python代码计算出图，然后点击右上角的隐藏按钮就可以隐藏代码，只显示出图结果，继续研究分析。&lt;/p&gt;
&lt;p&gt;&lt;img alt="出图隐藏" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/和鲸隐藏.gif"&gt;&lt;/p&gt;
&lt;p&gt;在写好所有论文内容后，点击下载导出，选择下载.ipynb文件。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724056758893" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724056758893.png"&gt;&lt;/p&gt;
&lt;p&gt;下载到本地的.ipynb文件用pandoc工具导出为docx文件，方便根据投稿的期刊格式编辑修改。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724057114031" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724057114031.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724057144557" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724057144557.png"&gt;&lt;/p&gt;
&lt;p&gt;在WPS中还有论文一键排版的功能，只要你的段落按照## ###的规律递进，WPS可以根据公开的几个知名大学的论文格式或者根据你上传的范文格式一键重排版。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724057257043" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724057257043.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724057370971" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724057370971.png"&gt;&lt;/p&gt;
&lt;p&gt;到这一步只需要把论文投出去就行，等待期刊编辑的改稿和录用。如果投了学会年会交流的稿子，那么必然是要做一个PPT的，做PPT多麻烦能照着论文直接将多好。和鲸可以。右上角这个按钮就能按照cell直接播放幻灯片。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724057879921" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724057879921.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="1724057980209" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724057980209.png"&gt;&lt;/p&gt;
&lt;p&gt;当然如果可以的话还是好好做个PPT好，这个偷懒的方法只能应付一下小组会，报告会之类的小场面。由于和鲸运行在浏览器上，只要有网的地方就能随时随地打开和鲸网页，进入自己的工作台，编程或者补一补论文。所以用平板或者大的折叠屏手机甚至是可以联网的电纸书就能编程和写论文。对于硬件条件不好的研究者和需要出差办公不方便携带太重的笔记本的研究者来说，非常方便。我这篇论文就是在出差途中，工作摸鱼时，还有家里床上躺着用平板和家里的台式电脑写的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="pingban" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/微信图片_20240819170537.jpg"&gt;&lt;/p&gt;
&lt;p&gt;最后投了一个学会，获得了一个小奖，嘿嘿嘿。祝看到这里的各位今年论文都能发发发。在学术会议交流的时候，别的老师现场没有带电脑，只能光凭一张嘴讲，要么就是截图照片够多，专家提问的时候才不至于捉襟见肘。而我可以拿着平板演示，直接在大屏幕上现场跑代码，让专家们直接审查论文数据和结果，真实数据不怕检验。这样现场跑代码的行为也给专家们留下了深刻印象。我获得了年会论文评比的特等奖。&lt;/p&gt;
&lt;h2 id="待改进的点"&gt;待改进的点
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;组织不能个人退出。加入过多组织就会很烦，如下图。
&lt;img alt="1724050214009" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2024/2024070809/1724050214009.png"&gt;&lt;/li&gt;
&lt;li&gt;希望增加AI接口，可以接入GPT或者其他辅助编程的Ai。更好的编程和水论文。&lt;/li&gt;
&lt;li&gt;希望增加移动端的适配。&lt;/li&gt;
&lt;li&gt;怎加多种导出格式，内置pandoc直接导出docx，方便修改论文。&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Jupyterlab 配置 Latex 环境</title><link>https://ruajingjing.top/post/jupyterlab%E9%85%8D%E7%BD%AElatex%E7%8E%AF%E5%A2%83/</link><pubDate>Sat, 29 Feb 2020 14:34:55 +0000</pubDate><guid>https://ruajingjing.top/post/jupyterlab%E9%85%8D%E7%BD%AElatex%E7%8E%AF%E5%A2%83/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post Jupyterlab 配置 Latex 环境" /&gt;&lt;p&gt;参考&lt;a class="link" href="https://zhuanlan.zhihu.com/p/56299460" target="_blank" rel="noopener"
 &gt;利用JupyterLab的扩展实现LaTex文件的编译&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it jupytercgmsabefcn bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;apt install texlive-full
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;pip install jupyterlab_latex
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;jupyter serverextension &lt;span class="nb"&gt;enable&lt;/span&gt; --sys-prefix jupyterlab_latex
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;jupyter labextension install @jupyterlab/latex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在jupyter_notebook_config.py文件里添加一句话实现PdfLaTex模式编译：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LatexConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;latex_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pdflatex&amp;#39;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自定义LaTex的编译模式，默认是XeLaTex模式。效果如图，不过只能编译简单的一些包，还有字体缺失的问题存在。&lt;/p&gt;
&lt;p&gt;&lt;img alt="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/29/98e39066a042e.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/29/98e39066a042e.png"&gt;&lt;/p&gt;
&lt;p&gt;完整 jupyter 镜像已上传至阿里云，拉取命令如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgmsabefcnlatex:v1.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;full 包是默认安装中文 cjk 包的，如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;After this operation, 3,546 MB of additional disk space will be used.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; The following additional packages will be installed:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; aglfn asymptote asymptote-doc biber blt chktex cm-super cm-super-minimal context context-modules dvidvi dvipng feynmf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; fonts-adf-accanthis fonts-adf-berenis fonts-adf-gillius fonts-adf-universalis fonts-arphic-bkai00mp fonts-arphic-bsmi00lp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; fonts-arphic-gbsn00lp fonts-arphic-gkai00mp fonts-baekmuk fonts-cabin fonts-comfortaa fonts-croscore
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; fonts-crosextra-caladea fonts-crosextra-carlito fonts-ebgaramond fonts-ebgaramond-extra fonts-font-awesome
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; fonts-freefont-otf fonts-freefont-ttf fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; fonts-gfs-complutum fonts-gfs-didot fonts-gfs-didot-classic fonts-gfs-gazis fonts-gfs-neohellenic fonts-gfs-olga
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 10&lt;/span&gt;&lt;span class="cl"&gt; fonts-gfs-porson fonts-gfs-solomos fonts-gfs-theokritos fonts-go fonts-hosny-amiri fonts-ipaexfont-gothic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 11&lt;/span&gt;&lt;span class="cl"&gt; fonts-ipaexfont-mincho fonts-ipafont-gothic fonts-ipafont-mincho fonts-junicode fonts-lato fonts-linuxlibertine
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 12&lt;/span&gt;&lt;span class="cl"&gt; fonts-lobster fonts-lobstertwo fonts-noto-hinted fonts-noto-mono fonts-oflb-asana-math fonts-open-sans fonts-roboto-hinted
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 13&lt;/span&gt;&lt;span class="cl"&gt; fonts-sil-gentium fonts-sil-gentium-basic fonts-sil-gentiumplus fonts-sil-gentiumplus-compact fonts-sil-padauk fonts-stix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 14&lt;/span&gt;&lt;span class="cl"&gt; fonts-texgyre fonts-unfonts-core fonts-unfonts-extra fragmaster freeglut3 ghostscript gsfonts imagemagick imagemagick-6.q16
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 15&lt;/span&gt;&lt;span class="cl"&gt; info javascript-common lacheck latex-cjk-all latex-cjk-chinese latex-cjk-chinese-arphic-bkai00mp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 16&lt;/span&gt;&lt;span class="cl"&gt; latex-cjk-chinese-arphic-bsmi00lp latex-cjk-chinese-arphic-gbsn00lp latex-cjk-chinese-arphic-gkai00mp latex-cjk-common
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 17&lt;/span&gt;&lt;span class="cl"&gt; latex-cjk-japanese latex-cjk-japanese-wadalab latex-cjk-korean latex-cjk-thai latexdiff latexmk lcdf-typetools
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 18&lt;/span&gt;&lt;span class="cl"&gt; libalgorithm-c3-perl libauthen-sasl-perl libautovivification-perl libb-hooks-endofscope-perl libb-hooks-op-check-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 19&lt;/span&gt;&lt;span class="cl"&gt; libbtparse1 libbusiness-isbn-data-perl libbusiness-isbn-perl libbusiness-ismn-perl libbusiness-issn-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 20&lt;/span&gt;&lt;span class="cl"&gt; libclass-accessor-perl libclass-c3-perl libclass-c3-xs-perl libclass-data-inheritable-perl libclass-factory-util-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 21&lt;/span&gt;&lt;span class="cl"&gt; libclass-inspector-perl libclass-method-modifiers-perl libclass-singleton-perl libdata-compare-perl libdata-dump-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 22&lt;/span&gt;&lt;span class="cl"&gt; libdata-optlist-perl libdata-uniqid-perl libdate-simple-perl libdatetime-calendar-julian-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 23&lt;/span&gt;&lt;span class="cl"&gt; libdatetime-format-builder-perl libdatetime-format-strptime-perl libdatetime-locale-perl libdatetime-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 24&lt;/span&gt;&lt;span class="cl"&gt; libdatetime-timezone-perl libdevel-callchecker-perl libdevel-caller-perl libdevel-globaldestruction-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 25&lt;/span&gt;&lt;span class="cl"&gt; libdevel-lexalias-perl libdevel-stacktrace-perl libdist-checkconflicts-perl libdjvulibre-text libdjvulibre21
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 26&lt;/span&gt;&lt;span class="cl"&gt; libdouble-conversion1 libdynaloader-functions-perl libegl-mesa0 libegl1 libemail-date-format-perl libemf1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 27&lt;/span&gt;&lt;span class="cl"&gt; libencode-eucjpms-perl libencode-hanextra-perl libencode-jis2k-perl libencode-locale-perl libeval-closure-perl libevdev2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 28&lt;/span&gt;&lt;span class="cl"&gt; libexception-class-perl libexporter-tiny-perl libfile-find-rule-perl libfile-homedir-perl libfile-listing-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 29&lt;/span&gt;&lt;span class="cl"&gt; libfile-sharedir-perl libfile-slurper-perl libfile-which-perl libfont-afm-perl libfontenc1 libgbm1 libgirara-gtk3-3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 30&lt;/span&gt;&lt;span class="cl"&gt; libglapi-mesa libglu1-mesa libglx-mesa0 libgs9 libgs9-common libgudev-1.0-0 libhtml-form-perl libhtml-format-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 31&lt;/span&gt;&lt;span class="cl"&gt; libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 32&lt;/span&gt;&lt;span class="cl"&gt; libhttp-message-perl libhttp-negotiate-perl libilmbase12 libinput-bin libinput10 libio-html-perl libio-socket-ssl-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 33&lt;/span&gt;&lt;span class="cl"&gt; libipc-run3-perl libipc-shareable-perl libjs-jquery libjson-c3 liblingua-translit-perl liblist-allutils-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 34&lt;/span&gt;&lt;span class="cl"&gt; liblist-moreutils-perl liblist-someutils-perl liblist-utilsby-perl libllvm9 liblog-dispatch-perl liblog-log4perl-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 35&lt;/span&gt;&lt;span class="cl"&gt; liblwp-mediatypes-perl liblwp-protocol-https-perl libmagic-mgc libmagic1 libmagickcore-6.q16-3-extra libmail-sendmail-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 36&lt;/span&gt;&lt;span class="cl"&gt; libmailtools-perl libmime-charset-perl libmime-lite-perl libmime-types-perl libmodule-implementation-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 37&lt;/span&gt;&lt;span class="cl"&gt; libmodule-runtime-perl libmro-compat-perl libmtdev1 libnamespace-autoclean-perl libnamespace-clean-perl libnet-http-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 38&lt;/span&gt;&lt;span class="cl"&gt; libnet-libidn-perl libnet-smtp-ssl-perl libnet-ssleay-perl libnetpbm10 libnotify4 libnumber-compare-perl libopenexr22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 39&lt;/span&gt;&lt;span class="cl"&gt; libosmesa6 libosp5 libostyle1c2 libpackage-deprecationmanager-perl libpackage-stash-perl libpackage-stash-xs-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 40&lt;/span&gt;&lt;span class="cl"&gt; libpadwalker-perl libparams-classify-perl libparams-util-perl libparams-validate-perl libparams-validationcompiler-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 41&lt;/span&gt;&lt;span class="cl"&gt; libperlio-utf8-strict-perl libplot2c2 libpoppler-qt5-1 libpstoedit0c2a libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 42&lt;/span&gt;&lt;span class="cl"&gt; libqt5svg5 libqt5widgets5 libqt5xml5 libreadonly-perl libref-util-perl libref-util-xs-perl libregexp-common-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 43&lt;/span&gt;&lt;span class="cl"&gt; librole-tiny-perl libruby2.5 libscalar-list-utils-perl libsigsegv2 libsombok3 libsort-key-perl libspecio-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 44&lt;/span&gt;&lt;span class="cl"&gt; libsub-exporter-perl libsub-exporter-progressive-perl libsub-identify-perl libsub-install-perl libsub-name-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 45&lt;/span&gt;&lt;span class="cl"&gt; libsub-quote-perl libsys-hostname-long-perl libtcl8.6 libtext-bibtex-perl libtext-csv-perl libtext-csv-xs-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 46&lt;/span&gt;&lt;span class="cl"&gt; libtext-glob-perl libtext-roman-perl libtext-unidecode-perl libtie-cycle-perl libtimedate-perl libtk8.6 libtry-tiny-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 47&lt;/span&gt;&lt;span class="cl"&gt; libunicode-collate-perl libunicode-linebreak-perl liburi-perl libutempter0 libvariable-magic-perl libwacom-bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 48&lt;/span&gt;&lt;span class="cl"&gt; libwacom-common libwacom2 libwayland-server0 libwebpdemux2 libwmf0.2-7 libwww-perl libwww-robotrules-perl libxcb-icccm4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 49&lt;/span&gt;&lt;span class="cl"&gt; libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-util1 libxcb-xinerama0 libxcb-xkb1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 50&lt;/span&gt;&lt;span class="cl"&gt; libxkbcommon-x11-0 libxml-libxml-perl libxml-libxml-simple-perl libxml-libxslt-perl libxml-namespacesupport-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 51&lt;/span&gt;&lt;span class="cl"&gt; libxml-parser-perl libxml-sax-base-perl libxml-sax-expat-perl libxml-sax-perl libxml-writer-perl libxmuu1 libxtst6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 52&lt;/span&gt;&lt;span class="cl"&gt; libxxf86dga1 libyaml-tiny-perl libzip4 netbase netpbm notification-daemon openjade perl-openssl-defaults pfb2t1c2pfb prerex
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 53&lt;/span&gt;&lt;span class="cl"&gt; ps2eps pstoedit psutils purifyeps python3-olefile python3-pil python3-pil.imagetk python3-tk qt5-gtk-platformtheme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 54&lt;/span&gt;&lt;span class="cl"&gt; qttranslations5-l10n rake ruby ruby-did-you-mean ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby2.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 55&lt;/span&gt;&lt;span class="cl"&gt; rubygems-integration sgml-base tex-gyre texinfo texlive-bibtex-extra texlive-extra-utils texlive-font-utils
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 56&lt;/span&gt;&lt;span class="cl"&gt; texlive-fonts-extra-doc texlive-fonts-extra-links texlive-fonts-recommended-doc texlive-formats-extra texlive-games
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 57&lt;/span&gt;&lt;span class="cl"&gt; texlive-humanities texlive-humanities-doc texlive-lang-arabic texlive-lang-chinese texlive-lang-cjk texlive-lang-cyrillic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 58&lt;/span&gt;&lt;span class="cl"&gt; texlive-lang-czechslovak texlive-lang-english texlive-lang-european texlive-lang-french texlive-lang-german
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 59&lt;/span&gt;&lt;span class="cl"&gt; texlive-lang-greek texlive-lang-italian texlive-lang-japanese texlive-lang-korean texlive-lang-other texlive-lang-polish
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 60&lt;/span&gt;&lt;span class="cl"&gt; texlive-lang-portuguese texlive-lang-spanish texlive-latex-base-doc texlive-latex-extra-doc texlive-latex-recommended-doc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 61&lt;/span&gt;&lt;span class="cl"&gt; texlive-luatex texlive-metapost texlive-metapost-doc texlive-music texlive-pictures-doc texlive-pstricks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 62&lt;/span&gt;&lt;span class="cl"&gt; texlive-pstricks-doc texlive-publishers texlive-publishers-doc texlive-science texlive-science-doc tk8.6-blt2.5 vprerex
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 63&lt;/span&gt;&lt;span class="cl"&gt; x11-utils xbitmaps xterm zathura zathura-pdf-poppler zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 64&lt;/span&gt;&lt;span class="cl"&gt;Suggested packages:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 65&lt;/span&gt;&lt;span class="cl"&gt; gv blt-demo perl-tk fontforge context-nonfree context-doc-nonfree ghostscript-x imagemagick-doc autotrace cups-bsd &lt;span class="p"&gt;|&lt;/span&gt; lpr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 66&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; lprng curl enscript gimp gnuplot graphviz groff-base hp2xx html2ps libwmf-bin mplayer povray radiance sane-utils transfig
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 67&lt;/span&gt;&lt;span class="cl"&gt; ufraw-batch texinfo-doc-nonfree apache2 &lt;span class="p"&gt;|&lt;/span&gt; lighttpd &lt;span class="p"&gt;|&lt;/span&gt; httpd auctex hbf-cns40-b5 hbf-jfs56 hbf-kanji48 libdigest-hmac-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 68&lt;/span&gt;&lt;span class="cl"&gt; libgssapi-perl libgd-barcode-perl libscalar-properties-perl libdbd-csv-perl liblog-dispatch-filerotate-perl librrds-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 69&lt;/span&gt;&lt;span class="cl"&gt; libxml-dom-perl libcrypt-ssleay-perl file libjxr-tools libpod2-base-perl default-mta &lt;span class="p"&gt;|&lt;/span&gt; mail-transport-agent
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 70&lt;/span&gt;&lt;span class="cl"&gt; libmojolicious-perl libscalar-number-perl qt5-image-formats-plugins qtwayland5 libtest-fatal-perl tcl8.6 tk8.6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 71&lt;/span&gt;&lt;span class="cl"&gt; libwmf0.2-7-gtk libauthen-ntlm-perl doc-base sgml-data xfig &lt;span class="p"&gt;|&lt;/span&gt; ivtools-bin &lt;span class="p"&gt;|&lt;/span&gt; tgif &lt;span class="p"&gt;|&lt;/span&gt; transfig python-pil-doc python3-pil-dbg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 72&lt;/span&gt;&lt;span class="cl"&gt; python3-pil.imagetk-dbg tix python3-tk-dbg ri ruby-dev bundler sgml-base-doc xindy mesa-utils xfonts-cyrillic www-browser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 73&lt;/span&gt;&lt;span class="cl"&gt; zathura-ps zathura-djvu zathura-cb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 74&lt;/span&gt;&lt;span class="cl"&gt;Recommended packages:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 75&lt;/span&gt;&lt;span class="cl"&gt; fonts-freefont fonts-droid-fallback
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 76&lt;/span&gt;&lt;span class="cl"&gt;The following NEW packages will be installed:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 77&lt;/span&gt;&lt;span class="cl"&gt; aglfn asymptote asymptote-doc biber blt chktex cm-super cm-super-minimal context context-modules dvidvi dvipng feynmf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 78&lt;/span&gt;&lt;span class="cl"&gt; fonts-adf-accanthis fonts-adf-berenis fonts-adf-gillius fonts-adf-universalis fonts-arphic-bkai00mp fonts-arphic-bsmi00lp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 79&lt;/span&gt;&lt;span class="cl"&gt; fonts-arphic-gbsn00lp fonts-arphic-gkai00mp fonts-baekmuk fonts-cabin fonts-comfortaa fonts-croscore
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 80&lt;/span&gt;&lt;span class="cl"&gt; fonts-crosextra-caladea fonts-crosextra-carlito fonts-ebgaramond fonts-ebgaramond-extra fonts-font-awesome
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 81&lt;/span&gt;&lt;span class="cl"&gt; fonts-freefont-otf fonts-freefont-ttf fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 82&lt;/span&gt;&lt;span class="cl"&gt; fonts-gfs-complutum fonts-gfs-didot fonts-gfs-didot-classic fonts-gfs-gazis fonts-gfs-neohellenic fonts-gfs-olga
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 83&lt;/span&gt;&lt;span class="cl"&gt; fonts-gfs-porson fonts-gfs-solomos fonts-gfs-theokritos fonts-go fonts-hosny-amiri fonts-ipaexfont-gothic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 84&lt;/span&gt;&lt;span class="cl"&gt; fonts-ipaexfont-mincho fonts-ipafont-gothic fonts-ipafont-mincho fonts-junicode fonts-lato fonts-linuxlibertine
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 85&lt;/span&gt;&lt;span class="cl"&gt; fonts-lobster fonts-lobstertwo fonts-noto-hinted fonts-noto-mono fonts-oflb-asana-math fonts-open-sans fonts-roboto-hinted
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 86&lt;/span&gt;&lt;span class="cl"&gt; fonts-sil-gentium fonts-sil-gentium-basic fonts-sil-gentiumplus fonts-sil-gentiumplus-compact fonts-sil-padauk fonts-stix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 87&lt;/span&gt;&lt;span class="cl"&gt; fonts-texgyre fonts-unfonts-core fonts-unfonts-extra fragmaster freeglut3 ghostscript gsfonts imagemagick imagemagick-6.q16
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 88&lt;/span&gt;&lt;span class="cl"&gt; info javascript-common lacheck latex-cjk-all latex-cjk-chinese latex-cjk-chinese-arphic-bkai00mp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 89&lt;/span&gt;&lt;span class="cl"&gt; latex-cjk-chinese-arphic-bsmi00lp latex-cjk-chinese-arphic-gbsn00lp latex-cjk-chinese-arphic-gkai00mp latex-cjk-common
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 90&lt;/span&gt;&lt;span class="cl"&gt; latex-cjk-japanese latex-cjk-japanese-wadalab latex-cjk-korean latex-cjk-thai latexdiff latexmk lcdf-typetools
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 91&lt;/span&gt;&lt;span class="cl"&gt; libalgorithm-c3-perl libauthen-sasl-perl libautovivification-perl libb-hooks-endofscope-perl libb-hooks-op-check-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 92&lt;/span&gt;&lt;span class="cl"&gt; libbtparse1 libbusiness-isbn-data-perl libbusiness-isbn-perl libbusiness-ismn-perl libbusiness-issn-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 93&lt;/span&gt;&lt;span class="cl"&gt; libclass-accessor-perl libclass-c3-perl libclass-c3-xs-perl libclass-data-inheritable-perl libclass-factory-util-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 94&lt;/span&gt;&lt;span class="cl"&gt; libclass-inspector-perl libclass-method-modifiers-perl libclass-singleton-perl libdata-compare-perl libdata-dump-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 95&lt;/span&gt;&lt;span class="cl"&gt; libdata-optlist-perl libdata-uniqid-perl libdate-simple-perl libdatetime-calendar-julian-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 96&lt;/span&gt;&lt;span class="cl"&gt; libdatetime-format-builder-perl libdatetime-format-strptime-perl libdatetime-locale-perl libdatetime-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 97&lt;/span&gt;&lt;span class="cl"&gt; libdatetime-timezone-perl libdevel-callchecker-perl libdevel-caller-perl libdevel-globaldestruction-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 98&lt;/span&gt;&lt;span class="cl"&gt; libdevel-lexalias-perl libdevel-stacktrace-perl libdist-checkconflicts-perl libdjvulibre-text libdjvulibre21
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 99&lt;/span&gt;&lt;span class="cl"&gt; libdouble-conversion1 libdynaloader-functions-perl libegl-mesa0 libegl1 libemail-date-format-perl libemf1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;100&lt;/span&gt;&lt;span class="cl"&gt; libencode-eucjpms-perl libencode-hanextra-perl libencode-jis2k-perl libencode-locale-perl libeval-closure-perl libevdev2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;101&lt;/span&gt;&lt;span class="cl"&gt; libexception-class-perl libexporter-tiny-perl libfile-find-rule-perl libfile-homedir-perl libfile-listing-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;102&lt;/span&gt;&lt;span class="cl"&gt; libfile-sharedir-perl libfile-slurper-perl libfile-which-perl libfont-afm-perl libfontenc1 libgbm1 libgirara-gtk3-3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;103&lt;/span&gt;&lt;span class="cl"&gt; libglu1-mesa libgudev-1.0-0 libhtml-form-perl libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;104&lt;/span&gt;&lt;span class="cl"&gt; libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl libhttp-message-perl libhttp-negotiate-perl libilmbase12
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;105&lt;/span&gt;&lt;span class="cl"&gt; libinput-bin libinput10 libio-html-perl libio-socket-ssl-perl libipc-run3-perl libipc-shareable-perl libjs-jquery
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;106&lt;/span&gt;&lt;span class="cl"&gt; libjson-c3 liblingua-translit-perl liblist-allutils-perl liblist-moreutils-perl liblist-someutils-perl liblist-utilsby-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;107&lt;/span&gt;&lt;span class="cl"&gt; libllvm9 liblog-dispatch-perl liblog-log4perl-perl liblwp-mediatypes-perl liblwp-protocol-https-perl libmagic-mgc libmagic1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;108&lt;/span&gt;&lt;span class="cl"&gt; libmagickcore-6.q16-3-extra libmail-sendmail-perl libmailtools-perl libmime-charset-perl libmime-lite-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;109&lt;/span&gt;&lt;span class="cl"&gt; libmime-types-perl libmodule-implementation-perl libmodule-runtime-perl libmro-compat-perl libmtdev1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;110&lt;/span&gt;&lt;span class="cl"&gt; libnamespace-autoclean-perl libnamespace-clean-perl libnet-http-perl libnet-libidn-perl libnet-smtp-ssl-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;111&lt;/span&gt;&lt;span class="cl"&gt; libnet-ssleay-perl libnetpbm10 libnotify4 libnumber-compare-perl libopenexr22 libosmesa6 libosp5 libostyle1c2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;112&lt;/span&gt;&lt;span class="cl"&gt; libpackage-deprecationmanager-perl libpackage-stash-perl libpackage-stash-xs-perl libpadwalker-perl libparams-classify-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;113&lt;/span&gt;&lt;span class="cl"&gt; libparams-util-perl libparams-validate-perl libparams-validationcompiler-perl libperlio-utf8-strict-perl libplot2c2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;114&lt;/span&gt;&lt;span class="cl"&gt; libpoppler-qt5-1 libpstoedit0c2a libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5 libqt5svg5 libqt5widgets5 libqt5xml5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;115&lt;/span&gt;&lt;span class="cl"&gt; libreadonly-perl libref-util-perl libref-util-xs-perl libregexp-common-perl librole-tiny-perl libruby2.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;116&lt;/span&gt;&lt;span class="cl"&gt; libscalar-list-utils-perl libsigsegv2 libsombok3 libsort-key-perl libspecio-perl libsub-exporter-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;117&lt;/span&gt;&lt;span class="cl"&gt; libsub-exporter-progressive-perl libsub-identify-perl libsub-install-perl libsub-name-perl libsub-quote-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;118&lt;/span&gt;&lt;span class="cl"&gt; libsys-hostname-long-perl libtcl8.6 libtext-bibtex-perl libtext-csv-perl libtext-csv-xs-perl libtext-glob-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;119&lt;/span&gt;&lt;span class="cl"&gt; libtext-roman-perl libtext-unidecode-perl libtie-cycle-perl libtimedate-perl libtk8.6 libtry-tiny-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;120&lt;/span&gt;&lt;span class="cl"&gt; libunicode-collate-perl libunicode-linebreak-perl liburi-perl libutempter0 libvariable-magic-perl libwacom-bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;121&lt;/span&gt;&lt;span class="cl"&gt; libwacom-common libwacom2 libwayland-server0 libwebpdemux2 libwmf0.2-7 libwww-perl libwww-robotrules-perl libxcb-icccm4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;122&lt;/span&gt;&lt;span class="cl"&gt; libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-util1 libxcb-xinerama0 libxcb-xkb1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;123&lt;/span&gt;&lt;span class="cl"&gt; libxkbcommon-x11-0 libxml-libxml-perl libxml-libxml-simple-perl libxml-libxslt-perl libxml-namespacesupport-perl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;124&lt;/span&gt;&lt;span class="cl"&gt; libxml-parser-perl libxml-sax-base-perl libxml-sax-expat-perl libxml-sax-perl libxml-writer-perl libxmuu1 libxtst6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;125&lt;/span&gt;&lt;span class="cl"&gt; libxxf86dga1 libyaml-tiny-perl libzip4 netbase netpbm notification-daemon openjade perl-openssl-defaults pfb2t1c2pfb prerex
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;126&lt;/span&gt;&lt;span class="cl"&gt; ps2eps pstoedit psutils purifyeps python3-olefile python3-pil python3-pil.imagetk python3-tk qt5-gtk-platformtheme
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;127&lt;/span&gt;&lt;span class="cl"&gt; qttranslations5-l10n rake ruby ruby-did-you-mean ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby2.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;128&lt;/span&gt;&lt;span class="cl"&gt; rubygems-integration sgml-base tex-gyre texinfo texlive-bibtex-extra texlive-extra-utils texlive-font-utils
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;129&lt;/span&gt;&lt;span class="cl"&gt; texlive-fonts-extra-doc texlive-fonts-extra-links texlive-fonts-recommended-doc texlive-formats-extra texlive-full
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;130&lt;/span&gt;&lt;span class="cl"&gt; texlive-games texlive-humanities texlive-humanities-doc texlive-lang-arabic texlive-lang-chinese texlive-lang-cjk
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;131&lt;/span&gt;&lt;span class="cl"&gt; texlive-lang-cyrillic texlive-lang-czechslovak texlive-lang-english texlive-lang-european texlive-lang-french
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;132&lt;/span&gt;&lt;span class="cl"&gt; texlive-lang-german texlive-lang-greek texlive-lang-italian texlive-lang-japanese texlive-lang-korean texlive-lang-other
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;133&lt;/span&gt;&lt;span class="cl"&gt; texlive-lang-polish texlive-lang-portuguese texlive-lang-spanish texlive-latex-base-doc texlive-latex-extra-doc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;134&lt;/span&gt;&lt;span class="cl"&gt; texlive-latex-recommended-doc texlive-luatex texlive-metapost texlive-metapost-doc texlive-music texlive-pictures-doc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;135&lt;/span&gt;&lt;span class="cl"&gt; texlive-pstricks texlive-pstricks-doc texlive-publishers texlive-publishers-doc texlive-science texlive-science-doc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;136&lt;/span&gt;&lt;span class="cl"&gt; tk8.6-blt2.5 vprerex x11-utils xbitmaps xterm zathura zathura-pdf-poppler zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>气象人的JupyterLab</title><link>https://ruajingjing.top/post/%E6%B0%94%E8%B1%A1%E4%BA%BA%E7%9A%84jupyterlab/</link><pubDate>Mon, 17 Feb 2020 15:37:26 +0000</pubDate><guid>https://ruajingjing.top/post/%E6%B0%94%E8%B1%A1%E4%BA%BA%E7%9A%84jupyterlab/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post 气象人的JupyterLab" /&gt;&lt;p&gt;上两篇文章&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.bugatii100peagle.cn/2020/02/13/jupyterLab%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B/" target="_blank" rel="noopener"
 &gt;Jupyterlab安装配置教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.bugatii100peagle.cn/2020/02/16/jupyterLab%E5%A4%9A%E7%94%A8%E6%88%B7%E9%85%8D%E7%BD%AE/" target="_blank" rel="noopener"
 &gt;Jupyter多用户配置&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;中讲了Jupyter的主要部署方法，老实说，对新手很不友好，我也不想再经历一次这样的过程，尤其是Basemap的安装。所以，咱直接打包个镜像吧。不得不说Docker真是个拯救了无数程序猿秀发的好工具。&lt;/p&gt;
&lt;h2 id="使用截图"&gt;使用截图
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;img alt="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/44d5d10d73152.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/44d5d10d73152.png"&gt;&lt;/th&gt;
 &lt;th&gt;&lt;img alt="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/362d47fcfb311.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/362d47fcfb311.png"&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;img alt="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/36c7dd118359b.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/36c7dd118359b.png"&gt;&lt;/td&gt;
 &lt;td&gt;&lt;img alt="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/ec9bbcf04edf9.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/ec9bbcf04edf9.png"&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;简单来说，这就是一个部署在服务器上的Anaconda，用的的Jupyterlab的界面，您可以随时随地在任意电脑上打开一个浏览器（IE除外），输入服务器的网址，用户密码就能打开，还能下载数据，计算，绘图，整合了常用的Grads，Fortran的内核，安装了Basemap，Metpy，Siphon，Atmos，ecmwf_api，NCL_to_Python等Python常用气象工具包。&lt;/p&gt;
&lt;h2 id="quick-start"&gt;Quick Start
&lt;/h2&gt;&lt;p&gt;如果你想快速部署，而没有时间看完教程的话，看这里就好。或者看&lt;a class="link" href="https://gitee.com/bugatti100Peagle/jupyter-For-Atmospheric-Scientists" target="_blank" rel="noopener"
 &gt;Gitee上本项目的主页&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;首先安装Docker，方法见&lt;a class="link" href="https://blog.bugatii100peagle.cn/2020/02/13/Docker%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/" target="_blank" rel="noopener"
 &gt;Docker常用命令总结&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgmsabefcn:v1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;mkdir jupyterlab
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;mkdir jupyterlab/workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;docker run --name jupytercgmsabefcn -d -p 8000:8888 -v &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;:/workspace -w /workspace -e &lt;span class="nv"&gt;GRANT_SUDO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes --user root registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgmsabefcn:v1 jupyter-lab --no-browser --port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8888&lt;/span&gt; --ip&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0 --allow-root
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;预计安装时间4小时（博主使用家用WiFi，视网络环境时间可能有延长），其中安装Docker用 1~2 小时，拖取&lt;code&gt;jupytercgmsabefcn&lt;/code&gt;镜像用2小时。&lt;code&gt;run&lt;/code&gt;起来之后，浏览器打开&lt;code&gt;http://IP:8080&lt;/code&gt;，密码是空密码，直接回车即可。&lt;/p&gt;
&lt;h3 id="tips"&gt;Tips
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;不要在jupyterlab直接挂在阿里云OSS，OSS擅长存储不擅长访问。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jupyterlab/workspace&lt;/code&gt;是用于暂存的工作空间，在此文件夹下读写数据和作图都比较快速。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jupyterlab&lt;/code&gt;下另建一个新文件夹用于挂载阿里云OSS或FTP，&lt;code&gt;workspace&lt;/code&gt;下文件编写完成再归档至此OSS文件夹。既能保证数据不丢失，又能保证读写速度。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="c-和-grads-的插件"&gt;C 和 Grads 的插件
&lt;/h2&gt;&lt;p&gt;我的镜像是很久以前我就装好了的，拖取的是官方的 jupyter-science 已经预装好了&lt;code&gt;python3&lt;/code&gt; &lt;code&gt;julia&lt;/code&gt; &lt;code&gt;R&lt;/code&gt; 我后来又装了&lt;code&gt;C&lt;/code&gt; &lt;code&gt;Grads&lt;/code&gt;，至于怎么装的我忘了，不过机智的我打包了镜像。直接拖下来用就行。&lt;/p&gt;
&lt;p&gt;【 2020-02-20 14:26:59】我想起来了，好像是在&lt;a class="link" href="https://github.com/jupyter/docker-stacks" target="_blank" rel="noopener"
 &gt;Jupyter-Docker-stacks&lt;/a&gt;上找的&lt;a class="link" href="https://jupyter-docker-stacks.readthedocs.io/en/latest/using/selecting.html#jupyter-datascience-notebook" target="_blank" rel="noopener"
 &gt;jupyter-datascience-notebook&lt;/a&gt;，我好像还把Scipy删掉了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/20/1c6123f723cfb.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/20/1c6123f723cfb.png"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgrads
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;docker run --name jupyter -d -p 8000:8888 --restart&lt;span class="o"&gt;=&lt;/span&gt;always -v &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;/jupyterlab/workspace:/workspace -w /workspace -e &lt;span class="nv"&gt;GRANT_SUDO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes --user root 127.0.0.1:5000/jupytercgrads jupyter-lab --no-browser --port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8888&lt;/span&gt; --ip&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0 --allow-root
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装运行参考我之前写的&lt;a class="link" href="https://blog.bugatii100peagle.cn/2020/02/13/jupyterLab%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B/" target="_blank" rel="noopener"
 &gt;jupyterLab安装配置教程&lt;/a&gt;，运行界面如下&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snipaste_2020-02-17_18-28-10.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/17/2611c9f776515.png"&gt;&lt;/p&gt;
&lt;h2 id="气象绘图工具包-metpy-siphon-atmos"&gt;气象绘图工具包 &lt;a class="link" href="https://www.unidata.ucar.edu/software/metpy/#help" target="_blank" rel="noopener"
 &gt;Metpy&lt;/a&gt; &lt;a class="link" href="https://unidata.github.io/siphon/latest/installguide.html" target="_blank" rel="noopener"
 &gt;Siphon&lt;/a&gt; &lt;a class="link" href="https://pypi.org/project/atmos/0.2.5/#description" target="_blank" rel="noopener"
 &gt;atmos&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;参考&lt;a class="link" href="https://unidata.github.io/MetPy/latest/installguide.html" target="_blank" rel="noopener"
 &gt;Meetpy Installation Guide&lt;/a&gt;和&lt;a class="link" href="https://www.jianshu.com/p/c71325fc4239" target="_blank" rel="noopener"
 &gt;在Jupyter中安装Python包&lt;/a&gt;，&lt;code&gt;docker exec -it jupyter bash&lt;/code&gt;进入镜像后，输入如下代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;python -m pip install metpy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;python -m pip install siphon
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;atoms要手动安装，下载代码后再install&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;wget https://files.pythonhosted.org/packages/65/1b/9e08dbd6979877cb1d24b5b3ee607c91ece212b010b49715ca7443999e24/atmos-0.2.5.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;tar -xvf atmos-0.2.5.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; atmos-0.2.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;nano setup.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改片段&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;setuptools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pip..req&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;parse_requirements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#修改片段，不然会发生报错 ModuleNotFoundError: No module named &amp;#39;pip.req&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;setuptools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pip._internal.req&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;parse_requirements&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;保存退出再执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;python setup.py install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考&lt;a class="link" href="https://blog.csdn.net/weixin_43055882/article/details/100581001" target="_blank" rel="noopener"
 &gt;install quantopian时出现No module named pip.req的解决办法&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="地图支持包basemap"&gt;地图支持包&lt;a class="link" href="https://matplotlib.org/basemap/index.html" target="_blank" rel="noopener"
 &gt;Basemap&lt;/a&gt;
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;conda update -n base conda
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;conda update -n base conda &lt;span class="c1"&gt;# 对，更新两次，直到不会再提示更新&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;更新这步都很费时间，保守估计两小时。为什么说是估计呢，因为后面我没熬住，睡着了。然后参考&lt;a class="link" href="https://blog.csdn.net/weixin_43971405/article/details/101714371" target="_blank" rel="noopener"
 &gt;解决conda的“Solving environment: failed”问题&lt;/a&gt;和&lt;a class="link" href="https://blog.csdn.net/wyhjia/article/details/82386948" target="_blank" rel="noopener"
 &gt;anaconda安装basemap&lt;/a&gt;运行如下代码。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;conda config --set channel_priority flexible
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;conda install basemap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;弹出如下信息即表示，已经找到basemap安装包，&lt;code&gt;conda install basemap&lt;/code&gt;反而安装挺快，快到让我怀疑昨晚熬夜的两小时还失败了是不是幻觉。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;The following NEW packages will be INSTALLED:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; basemap conda-forge/linux-64::basemap-1.2.1-py37hd1be537_2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt; geos conda-forge/linux-64::geos-3.8.0-he1b5a44_0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt; proj4 conda-forge/linux-64::proj4-5.2.0-he1b5a44_1006
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt; pyproj conda-forge/linux-64::pyproj-1.9.6-py37h516909a_1002
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt; pyshp conda-forge/noarch::pyshp-2.1.0-py_0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试运行，会遇到&lt;a class="link" href="https://blog.csdn.net/runtuandme/article/details/103899726" target="_blank" rel="noopener"
 &gt;basemap KeyError &amp;lsquo;PROJ_LIB&amp;rsquo;解决办法&lt;/a&gt;，解决办法就是代码中指定目录运行。终端输入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;whereis proj
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出：proj: /usr/share/proj /opt/conda/bin/proj&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;浏览器打开jupyter,新建&lt;code&gt;.ipynb&lt;/code&gt;文件，输入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;matplotlib&lt;/span&gt; &lt;span class="n"&gt;inline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;PROJ_LIB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/usr/share/proj&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;mpl_toolkits.basemap&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Basemap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Basemap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ortho&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resolution&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lat_0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lon_0&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bluemarble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考&lt;a class="link" href="https://www.jianshu.com/p/fe431fa6b0a2" target="_blank" rel="noopener"
 &gt;数据科学 IPython 笔记本 8.16 地理数据和 Basemap&lt;/a&gt;无报错，并出现一个地球，即表示安装成功。
&lt;img alt="Snipaste_2020-02-18_08-10-53.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/362d47fcfb311.png"&gt;&lt;/p&gt;
&lt;p&gt;basemap还挺大，装了2G左右吧。
&lt;img alt="Snipaste_2020-02-18_08-21-46.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/bc4d088e96993.png"&gt;&lt;/p&gt;
&lt;h2 id="basemap-的继承者-cartopy"&gt;Basemap 的继承者 Cartopy
&lt;/h2&gt;&lt;p&gt;Basemap 自2020年开始停止维护，所以，新的项目还是用新工具吧。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;wget https://files.pythonhosted.org/packages/e5/92/fe8838fa8158931906dfc4f16c5c1436b3dd2daf83592645b179581403ad/Cartopy-0.17.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;tar zxvf Cartopy-0.17.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; Cartopy-0.17.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;python setup.py install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;网不好的也可以尝试从百度网盘下载&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;链接：https://pan.baidu.com/s/1EOofzd9VcFgYTbpRhDf5pg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;提取码：c60e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试，浏览器打开jupyter输入以下代码,能出土没报错即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;import cartopy.crs as ccrs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;import matplotlib.pyplot as plt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; plt.axes&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;projection&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ccrs.PlateCarree&lt;span class="o"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;ax.coastlines&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Save the plot by calling plt.savefig() BEFORE plt.show()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# plt.savefig(&amp;#39;coastlines.pdf&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# plt.savefig(&amp;#39;coastlines.png&amp;#39;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;plt.show&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="https://scitools.org.uk/cartopy/docs/latest/_images/intro-1.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://scitools.org.uk/cartopy/docs/latest/_images/intro-1.png"&gt;&lt;/p&gt;
&lt;h2 id="ncar的ncl_to_python"&gt;Ncar的NCL_to_Python
&lt;/h2&gt;&lt;p&gt;参考&lt;a class="link" href="http://www.ncl.ucar.edu/open_letter_to_ncl_users.shtml" target="_blank" rel="noopener"
 &gt;Important letter regarding the future of NCL&lt;/a&gt;和&lt;a class="link" href="http://www.pyngl.ucar.edu/Download/" target="_blank" rel="noopener"
 &gt;PyNIO和PyNGL&lt;/a&gt;。但是PyNIO和PyNGL与basemap冲突，&lt;a class="link" href="http://mail-archives.apache.org/mod_mbox/climate-dev/201306.mbox/%3C20130611165725.3611.60259@reviews.apache.org%3E" target="_blank" rel="noopener"
 &gt;climate-dev mailing list archives&lt;/a&gt;，也提到对代码做了修改，反正这两货不能在一起，那就打包两个，幸好之前docker了镜像。
&lt;img alt="Snipaste_2020-02-18_09-31-00.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/70f1855f07960.png"&gt;&lt;/p&gt;
&lt;p&gt;从刚安装号&lt;code&gt;atmos&lt;/code&gt;的那个镜像开始，运行并进入镜像。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;conda config --set channel_priority flexible
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;conda install xarray netcdf4 scipy pyngl pynio ncl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试，浏览器打开jupyterlab，上传下面这个包，解压，打开,运行其中的文件，没报错，出图即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;链接：https://pan.baidu.com/s/1lpBJTJHp466zbru9cKtoTg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;提取码：8q3y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="Snipaste_2020-02-18_10-33-24.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/ec9bbcf04edf9.png"&gt;&lt;/p&gt;
&lt;h2 id="欧洲中心数据下载ecmwf-api"&gt;欧洲中心数据下载ecmwf-api
&lt;/h2&gt;&lt;p&gt;参考&lt;a class="link" href="https://blog.csdn.net/zhanglinqi_007/article/details/79056682" target="_blank" rel="noopener"
 &gt;利用Python调用ECMWF欧洲中心API批量下载数据&lt;/a&gt;，&lt;a class="link" href="https://blog.csdn.net/ginynu/article/details/54990330" target="_blank" rel="noopener"
 &gt;python调用ECMWF欧洲中心api下载数据&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;python -m pip install ecmwf-api-client
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试，打开ipython，输入下方代码，没报错即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;ecmwfapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ECMWFDataServer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fortran支持jupyter-fortran-kernel"&gt;Fortran支持&lt;a class="link" href="https://devhub.io/repos/ZedThree-jupyter-fortran-kernel" target="_blank" rel="noopener"
 &gt;jupyter-fortran-kernel&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;下载插件包上传之服务器解压安装。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;链接：https://pan.baidu.com/s/1EAkEEVtmuOyB_VtzEAMqrQ
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;提取码：d4l6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;复制这段内容后打开百度网盘手机App，操作更方便哦
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;apt install gfortran
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;unzip jupyter-fortran-kernel-master.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; jupyter-fortran-kernel-master
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;python setup.py install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;jupyter-kernelspec install fortran_spec/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开浏览器，就可以看到Fortran的选项
&lt;img alt="Snipaste_2020-02-18_11-07-39.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/44d5d10d73152.png"&gt;&lt;/p&gt;
&lt;p&gt;点击打开，输入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fortran" data-lang="fortran"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;program&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;aa&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;implicit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;none&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Hello World&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="Snipaste_2020-02-18_11-07-29.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/18/36c7dd118359b.png"&gt;&lt;/p&gt;
&lt;h2 id="镜像包信息"&gt;镜像包信息
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://gitee.com/bugatti100Peagle/jupyter-For-Atmospheric-Scientists/blob/master/jupytercgrads_metpy_siphon_atmos_basemap_ecmwf_fortran_cartopy.md" target="_blank" rel="noopener"
 &gt;jupytercgrads_metpy_siphon_atmos_basemap_ecmwf_fortran_cartopy&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://gitee.com/bugatti100Peagle/jupyter-For-Atmospheric-Scientists/blob/master/jupytercgrads_metpy_siphon_atmos_ncl_ecmwf_fortran.md" target="_blank" rel="noopener"
 &gt;jupytercgrads_metpy_siphon_atmos_ncl_ecmwf_fortran&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="失败的方法安装地图支持包basemap"&gt;失败的方法安装地图支持包&lt;a class="link" href="https://matplotlib.org/basemap/index.html" target="_blank" rel="noopener"
 &gt;BaseMap&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;首先安装依赖包&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;python -m pip install geos
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;python -m pip install pip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;python -m pip install Pillow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考&lt;a class="link" href="https://blog.csdn.net/Yshihui/article/details/83280534" target="_blank" rel="noopener"
 &gt;basemap安装教程&lt;/a&gt;，&lt;a class="link" href="https://blog.csdn.net/yanlisuo/article/details/79820550" target="_blank" rel="noopener"
 &gt;linux python 安装basemap&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;pip install pyproj
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;测试，&lt;code&gt;bash&lt;/code&gt;输入以下命令没报错即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;python -c &lt;span class="s1"&gt;&amp;#39;import pyproj&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;basemap的包真的好难下，我这里存了个百度网盘，需要的自行下载。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;链接：https://pan.baidu.com/s/1hMhdVfVb1n709bxnSJCECg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;提取码：a1cw
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考&lt;a class="link" href="https://blog.csdn.net/u010456562/article/details/52192586" target="_blank" rel="noopener"
 &gt;python番外（2）——Basemap安装&lt;/a&gt;
上传服务器到Docker环境，这里可以用&lt;code&gt;workspace&lt;/code&gt;目录，反正装完删掉就可以。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;tar zxvf basemap-1.1.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; basemap-1.0.7/geos-3.3.3/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;GEOS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;./configure --prefix&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$GEOS_DIR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;能解压个二十分钟左右吧，慢慢等着，然后make报错。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;ISNAN&lt;span class="o"&gt;(&lt;/span&gt;x&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ISNAN&lt;span class="o"&gt;(&lt;/span&gt;y&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ISNAN&lt;span class="o"&gt;(&lt;/span&gt;z&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt; ^~~~~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;../../../include/geos/geom/Coordinate.inl:39:10: note: suggested alternative: ‘SN AN’
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;ISNAN&lt;span class="o"&gt;(&lt;/span&gt;x&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ISNAN&lt;span class="o"&gt;(&lt;/span&gt;y&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ISNAN&lt;span class="o"&gt;(&lt;/span&gt;z&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; ^~~~~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; SNAN
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;../../../include/geos/geom/Coordinate.inl: In member &lt;span class="k"&gt;function&lt;/span&gt; ‘bool geos::geom::C oordinate::equals3D&lt;span class="o"&gt;(&lt;/span&gt;const geos::geom::Coordinate&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; const’:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;../../../include/geos/geom/Coordinate.inl:83:21: error: ‘ISNAN’ was not declared in this scope
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;z&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; other.z&lt;span class="o"&gt;)||(&lt;/span&gt;ISNAN&lt;span class="o"&gt;(&lt;/span&gt;z&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ISNAN&lt;span class="o"&gt;(&lt;/span&gt;other.z&lt;span class="o"&gt;)))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; ^~~~~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;../../../include/geos/geom/Coordinate.inl:83:21: note: suggested alternative: ‘SN AN’
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;z&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; other.z&lt;span class="o"&gt;)||(&lt;/span&gt;ISNAN&lt;span class="o"&gt;(&lt;/span&gt;z&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ISNAN&lt;span class="o"&gt;(&lt;/span&gt;other.z&lt;span class="o"&gt;)))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; ^~~~~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; SNAN
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;make&lt;span class="o"&gt;[&lt;/span&gt;4&lt;span class="o"&gt;]&lt;/span&gt;: *** &lt;span class="o"&gt;[&lt;/span&gt;Makefile:373: IndexedPointInAreaLocator.lo&lt;span class="o"&gt;]&lt;/span&gt; Error &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;make&lt;span class="o"&gt;[&lt;/span&gt;4&lt;span class="o"&gt;]&lt;/span&gt;: Leaving directory &lt;span class="s1"&gt;&amp;#39;/workspace/basemap-1.1.0/geos-3.3.3/src/algorithm/loc ate&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;make&lt;span class="o"&gt;[&lt;/span&gt;3&lt;span class="o"&gt;]&lt;/span&gt;: *** &lt;span class="o"&gt;[&lt;/span&gt;Makefile:392: all-recursive&lt;span class="o"&gt;]&lt;/span&gt; Error &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;make&lt;span class="o"&gt;[&lt;/span&gt;3&lt;span class="o"&gt;]&lt;/span&gt;: Leaving directory &lt;span class="s1"&gt;&amp;#39;/workspace/basemap-1.1.0/geos-3.3.3/src/algorithm/loc ate&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;make&lt;span class="o"&gt;[&lt;/span&gt;2&lt;span class="o"&gt;]&lt;/span&gt;: *** &lt;span class="o"&gt;[&lt;/span&gt;Makefile:444: all-recursive&lt;span class="o"&gt;]&lt;/span&gt; Error &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;make&lt;span class="o"&gt;[&lt;/span&gt;2&lt;span class="o"&gt;]&lt;/span&gt;: Leaving directory &lt;span class="s1"&gt;&amp;#39;/workspace/basemap-1.1.0/geos-3.3.3/src/algorithm&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;make&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: *** &lt;span class="o"&gt;[&lt;/span&gt;Makefile:476: all-recursive&lt;span class="o"&gt;]&lt;/span&gt; Error &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt;make&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Leaving directory &lt;span class="s1"&gt;&amp;#39;/workspace/basemap-1.1.0/geos-3.3.3/src&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt;make: *** &lt;span class="o"&gt;[&lt;/span&gt;Makefile:368: all-recursive&lt;span class="o"&gt;]&lt;/span&gt; Error
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解决办法参考&lt;a class="link" href="https://blog.csdn.net/pyml_kdl/article/details/103289683" target="_blank" rel="noopener"
 &gt;GEOS安装出错&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; include/geos/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;nano platform.h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改24行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/* Has isnan */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/* #undef HAVE_ISNAN */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改为&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/* Has isnan */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define HAVE_ISNAN 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后 不要&lt;code&gt;configure&lt;/code&gt; 直接 &lt;code&gt;make&lt;/code&gt; 然后 &lt;code&gt;make install&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;make 也要个40多分钟吧&lt;/p&gt;
&lt;p&gt;【 2020-02-18 0:23:56】 一个小时，反正也就只有等着。&lt;/p&gt;
&lt;p&gt;【 2020-02-18 1:08:34】 又一个小时，我好想睡觉，但是不看他装完我睡不着。&lt;/p&gt;
&lt;p&gt;【 2020-02-18 1:28:23】我好像想起来我折腾这玩意这么慢了，这是在OSS下，为了方便管理代码，我挂载了OSS盘做储存，OSS擅长存而不擅长高频访问，而编译&lt;code&gt;make&lt;/code&gt;就是个高频的活动。&lt;/p&gt;
&lt;p&gt;【 2020-02-18 1:39:44】脱离OSS目录重新&lt;code&gt;configure&lt;/code&gt; &lt;code&gt;nano platform.h&lt;/code&gt; &lt;code&gt;make&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;【2020-02-18 1:44:01 】make 完毕，make install 不到30秒完毕。2/100*60=1.2，也就是说我花了两小时等一个1分20秒就能出的东西，还傻等了两小时。&lt;/p&gt;
&lt;p&gt;但是我回到&lt;code&gt;basemap&lt;/code&gt;文件夹下&lt;code&gt;python setup.py install&lt;/code&gt; 时报错&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;In file included from src/_geoslib.c:248:0:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;/usr/local/include/geos_c.h:149:22: note: expected ‘GEOSMessageHandler &lt;span class="o"&gt;{&lt;/span&gt;aka void &lt;span class="o"&gt;(&lt;/span&gt;*&lt;span class="o"&gt;)(&lt;/span&gt;const char *&lt;span class="o"&gt;)}&lt;/span&gt;’ but argument is of &lt;span class="nb"&gt;type&lt;/span&gt; ‘void &lt;span class="o"&gt;(&lt;/span&gt;*&lt;span class="o"&gt;)(&lt;/span&gt;char *, char *&lt;span class="o"&gt;)&lt;/span&gt;’
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt; extern void GEOS_DLL initGEOS&lt;span class="o"&gt;(&lt;/span&gt;GEOSMessageHandler notice_function,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;···
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;src/_geoslib.c:5619:13: error: ‘PyThreadState &lt;span class="o"&gt;{&lt;/span&gt;aka struct _ts&lt;span class="o"&gt;}&lt;/span&gt;’ has no member named ‘exc_traceback’&lt;span class="p"&gt;;&lt;/span&gt; did you mean ‘curexc_traceback’?
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt; tstate-&amp;gt;exc_traceback &lt;span class="o"&gt;=&lt;/span&gt; local_tb&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt; ^~~~~~~~~~~~~
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt; curexc_traceback
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;9&lt;/span&gt;&lt;span class="cl"&gt;error: Command &lt;span class="s2"&gt;&amp;#34;gcc -pthread -B /opt/conda/compiler_compat -Wl,--sysroot=/ -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -I/usr/local/include -I[&amp;#39;/opt/conda/lib/python3.7/site-packages/numpy/core/include&amp;#39;] -I/opt/conda/lib/python3.7/site-packages/numpy/core/include -I/opt/conda/include/python3.7m -c src/_geoslib.c -o build/temp.linux-x86_64-3.7/src/_geoslib.o -MMD -MF build/temp.linux-x86_64-3.7/src/_geoslib.o.d&amp;#34;&lt;/span&gt; failed with &lt;span class="nb"&gt;exit&lt;/span&gt; status &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考 &lt;a class="link" href="https://www.cnblogs.com/gerrydeng/p/7159021.html" target="_blank" rel="noopener"
 &gt;Python踩坑之路&lt;/a&gt;，
&lt;a class="link" href="https://github.com/mcfletch/pyopengl/issues/11" target="_blank" rel="noopener"
 &gt;Python 3.7 Build failure: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘exc_type’; did you mean ‘curexc_type’? #11&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;pip install PyOpenGL PyOpenGL_accelerate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;apt-get install python3-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;apt-get install libevent-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然都没有解决。&lt;/p&gt;</description></item><item><title>JupyterLab多用户配置</title><link>https://ruajingjing.top/post/jupyterlab%E5%A4%9A%E7%94%A8%E6%88%B7%E9%85%8D%E7%BD%AE/</link><pubDate>Sun, 16 Feb 2020 23:59:58 +0000</pubDate><guid>https://ruajingjing.top/post/jupyterlab%E5%A4%9A%E7%94%A8%E6%88%B7%E9%85%8D%E7%BD%AE/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post JupyterLab多用户配置" /&gt;&lt;p&gt;上一篇初步安装了JupyterLab，但是这个不能多用户真的让人难过。&lt;/p&gt;
&lt;h2 id="拉取镜像运行"&gt;拉取镜像运行
&lt;/h2&gt;&lt;p&gt;在阿里云镜像市场上找到一个&lt;a class="link" href="https://cr.console.aliyun.com/images/cn-shanghai/stormstone/juplab/detail" target="_blank" rel="noopener"
 &gt;配置好Ananoconda和JupyterLab的镜像&lt;/a&gt;，使用如下代码直接拉取&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker pull registry.cn-shanghai.aliyuncs.com/stormstone/juplab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;带端口号运行，其中8000是本机主要用户端口，7777是第二个用户的端口，要多少用户就用多少端口。Docker的&lt;code&gt;/home&lt;/code&gt;下新建用户并设置密码，密码多少无所谓，Docker的&lt;code&gt;work&lt;/code&gt;目录也挂过来，你可以用OSS在本机挂载。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker run -p 8000:8888 -p 7777:7777 -d --name jupyterlabofstormstone -v &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;/新建一个宿主机Jupyter目录/home:/home -v &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;/新建一个宿主机Jupyter目录/work:/work --restart&lt;span class="o"&gt;=&lt;/span&gt;always registry.cn-shanghai.aliyuncs.com/stormstone/juplab:v2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="进入镜像新建用户"&gt;进入镜像，新建用户
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it jupyterlabofstormstone bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;adduser share &lt;span class="c1"&gt;# share 是我新建的用户&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;passwd share
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;切换用户，生成配置文件，其实这个文件在哪里大概不重要，后面带绝对路径运行即可，不过咱还是规范点。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;su share
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;jupyter notebook --generate-config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;修改&lt;code&gt;/home/share/.jupyter/jupyter_notebook_config.py&lt;/code&gt;加入如下字段，密码是空密码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sha1:840438352003:10c0d77ee275c741e22e6929cb7822e61ab5c256&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open_browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7777&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notebook_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/work/share&amp;#39;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PAMAuthenticator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/lab&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;allow_remote_access&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="修改root配置"&gt;修改root配置
&lt;/h2&gt;&lt;p&gt;切换回&lt;code&gt;root&lt;/code&gt;,重复上述动作。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;su root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;jupyter notebook --generate-config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="生成密码"&gt;生成密码
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;ipython
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;notebook.auth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在跳出的框内输入密码，两次，得到一个Token值。复制一下一会要用。&lt;/p&gt;
&lt;p&gt;修改&lt;code&gt;/root/.jupyter/jupyter_notebook_config.py&lt;/code&gt;加入如下字段&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;你自己生成Token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open_browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8888&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notebook_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/work&amp;#39;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PAMAuthenticator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;保存，退出镜像&lt;/p&gt;
&lt;h2 id="重启镜像"&gt;重启镜像
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker stop jupyterlabofstormstone
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;docker restart jupyterlabofstormstone
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; jupyterlabofstormstone nohup jupyter notebook --config /home/share/.jupyter/jupyter_notebook_config.py --allow-root &lt;span class="c1"&gt;# 给新用户的端口也跑起来，会输出一些信息，不用管，ctrl-c也没有影响&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在可以在&lt;code&gt;http://IP:8000&lt;/code&gt;和&lt;code&gt;http://IP:7777&lt;/code&gt;两个端口打开了，为两个端口绑定域名，设置操作权限等。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;参考&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-jupyterhub-administer.html" target="_blank" rel="noopener"
 &gt;JupyterHub 配置和管理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.cnblogs.com/xieldy/p/11664476.html" target="_blank" rel="noopener"
 &gt;实验室工作站jupyterhub安装笔记&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://jupyterlab.readthedocs.io/en/stable/user/jupyterhub.html" target="_blank" rel="noopener"
 &gt;JupyterLab on JupyterHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.csdn.net/weixin_42493346/article/details/82226740" target="_blank" rel="noopener"
 &gt;jupyter notebook 权限控制，实现多个用户工作空间不同，同时使用&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.csdn.net/JJwho/article/details/75102045" target="_blank" rel="noopener"
 &gt;如何用一台服务器给多个 Jupyter 用户提供服务&lt;/a&gt;&lt;/p&gt;</description></item><item><title>jupyterLab安装配置教程</title><link>https://ruajingjing.top/post/jupyterlab%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B/</link><pubDate>Thu, 13 Feb 2020 16:43:59 +0000</pubDate><guid>https://ruajingjing.top/post/jupyterlab%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E6%95%99%E7%A8%8B/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post jupyterLab安装配置教程" /&gt;&lt;p&gt;服务器信息：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;Distributor ID: Ubuntu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;Description: Ubuntu 18.04 LTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;Release: 18.04
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;Codename: bionic
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="准备工作"&gt;准备工作
&lt;/h2&gt;&lt;h3 id="更新服务器软件列表"&gt;更新服务器软件列表
&lt;/h3&gt;&lt;p&gt;首先，更新下列表，装一下依赖&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;sudo apt-get upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;sudo apt-get -y install git gcc g++ make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev python-dev libmysqlclient-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装docker"&gt;安装Docker
&lt;/h3&gt;&lt;p&gt;参考&lt;a class="link" href="https://blog.bugatii100peagle.cn/2020/02/13/Docker%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%80%BB%E7%BB%93/" target="_blank" rel="noopener"
 &gt;Docker常用命令总结&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="安装jupyterlab"&gt;安装JupyterLab
&lt;/h3&gt;&lt;p&gt;下面是我自己用registry搭建的仓库，已经有一个安装好C内核与Grads的jupyterLab，你可以用官网的jupyterlab。搭建私有仓库的方法参考：&lt;a class="link" href="https://developer.aliyun.com/article/66478" target="_blank" rel="noopener"
 &gt;搭建私有docker仓库并使用OSS作为存储&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;docker pull registry
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;docker run -d -p 443:5000 --restart&lt;span class="o"&gt;=&lt;/span&gt;always --name registry &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; -v &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;/config:/config &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="s2"&gt;&amp;#34;REGISTRY_AUTH=htpasswd&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="s2"&gt;&amp;#34;REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REGISTRY_AUTH_HTPASSWD_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/config/htpasswd &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REGISTRY_HTTP_TLS_CERTIFICATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/config/chained.pem &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REGISTRY_HTTP_TLS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/config/domain.key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REGISTRY_STORAGE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;oss &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REGISTRY_STORAGE_OSS_ACCESSKEYID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;********** &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REGISTRY_STORAGE_OSS_ACCESSKEYSECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;***************** &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REGISTRY_STORAGE_OSS_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;oss-cn-qingdao &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;REGISTRY_STORAGE_OSS_BUCKET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;******* &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt; registry:2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;拉取jupyter镜像，这里我使用的&lt;code&gt;jupytercgrads&lt;/code&gt;是我自己自建仓库的带C内核和Grads内核的，以后搞个&lt;a class="link" href="https://blog.csdn.net/aixiaoyang168/article/details/73549898" target="_blank" rel="noopener"
 &gt;Docker镜像仓库Harbor之搭建及配置&lt;/a&gt;，然后我把镜像传上来吧。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker pull 127.0.0.1:5000/jupytercgrads
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;mkdir jupyterlabjupyterlab
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;docker run --name jupyter -d -p 8000:8888 --restart&lt;span class="o"&gt;=&lt;/span&gt;always -v &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;/jupyterlab/workspace:/workspace -w /workspace -e &lt;span class="nv"&gt;GRANT_SUDO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes --user root 127.0.0.1:5000/jupytercgrads jupyter-lab --no-browser --port&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8888&lt;/span&gt; --ip&lt;span class="o"&gt;=&lt;/span&gt;0.0.0.0 --allow-root 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;【 2020-02-17 12:58:00 更新】
我把镜像上传到阿里云仓库了，可以通过一下代码拉取。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker pull registry.cn-shanghai.aliyuncs.com/bugatii100peagle/jupytercgrads
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="配置登录密码"&gt;配置登录密码
&lt;/h3&gt;&lt;p&gt;进入Docker镜像中，启动&lt;code&gt;Ipython&lt;/code&gt;交互端&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it jupyter bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;ipython
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;notebook.auth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;会要求你输入密码，不会显示，输两遍就行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;Enter password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;Verify password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;Out&lt;span class="o"&gt;[&lt;/span&gt;3&lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="s1"&gt;&amp;#39;sha1:记下这串数字&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;新建配置文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;jupyter lab --generate-config
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者在已有的配置文件&lt;code&gt;/home/jovyan/.jupyter/jupyter_notebook_config.py&lt;/code&gt;中添加&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sha1:刚刚那串串数字&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotebookApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;allow_remote_access&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;保存，退出镜像，重启镜像&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker restart jupyter
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开浏览器，输入&lt;code&gt;http://IP:8000&lt;/code&gt;就能看到下图输密码，而不是输Token，这样只要用密码登录就行了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snipaste_2020-02-16_00-12-30.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/16/22e0729ced66d.png"&gt;&lt;/p&gt;
&lt;h3 id="多用户配置"&gt;多用户配置
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;配置jupyterlab的参考&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.csdn.net/JJwho/article/details/75102045" target="_blank" rel="noopener"
 &gt;如何用一台服务器给多个 Jupyter 用户提供服务&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.cnblogs.com/ratels/p/11387740.html" target="_blank" rel="noopener"
 &gt;JupyterLab远程访问配置方法（CentOS7）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.csdn.net/ds19991999/article/details/83663349" target="_blank" rel="noopener"
 &gt;云服务器搭建神器JupyterLab（多图）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;docker stop jupyter
&lt;a class="link" href="https://qiita.com/ao_log/items/5438f2aaf5c2b46d2ccb" target="_blank" rel="noopener"
 &gt;Docker で JupyterLab を起動し、token 入力なしでアクセスする&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://zhuanlan.zhihu.com/p/82025119" target="_blank" rel="noopener"
 &gt;jupyter notebook 安装 C/C++ kernel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.jianshu.com/p/03324450c9e8" target="_blank" rel="noopener"
 &gt;jupyter-kernel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://lyric.im/c/the-craft-of-selfteaching/T-appendix.jupyter-installation-and-setup" target="_blank" rel="noopener"
 &gt;Jupyterlab 的安装与配置&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/jupyter/docker-stacks/issues/949" target="_blank" rel="noopener"
 &gt;What is the password for using &amp;ldquo;sudo apt-get install&amp;rdquo; command? #949&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/jupyterlab/jupyterlab-latex" target="_blank" rel="noopener"
 &gt; jupyterlab /jupyterlab-latex &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://zhuanlan.zhihu.com/p/67959768" target="_blank" rel="noopener"
 &gt;利器|JupyterLab 数据分析必备IDE完全指南&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/ykatsu111/jupyter-grads-kernel" target="_blank" rel="noopener"
 &gt; ykatsu111 /jupyter-grads-kernel &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/brendan-rius/jupyter-c-kernel" target="_blank" rel="noopener"
 &gt; brendan-rius /jupyter-c-kernel &lt;/a&gt;&lt;/p&gt;
&lt;h2 id="jupyterhub安装"&gt;Jupyterhub安装
&lt;/h2&gt;&lt;p&gt;其实安装JupyterLab已经够个人使用了，如果要多用户管理可以试试JupyterHub。但是我除了用Docker安装成功外，另外用pip和conda都安装失败了。
参考&lt;a class="link" href="https://www.cnblogs.com/xieldy/p/11664476.html" target="_blank" rel="noopener"
 &gt; 实验室工作站jupyterhub安装笔记&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="docker安装jupyterhub"&gt;Docker安装JupyterHub
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://jupyterhub.readthedocs.io/en/stable/quickstart-docker.html#alternate-installation-using-docker" target="_blank" rel="noopener"
 &gt;Using Docker&lt;/a&gt;，&lt;a class="link" href="https://blog.51cto.com/536410/2333974" target="_blank" rel="noopener"
 &gt;docker 安装jupyterhub支持R语言&lt;/a&gt;中看起来也不难，没有烦人的配置。&lt;/p&gt;
&lt;p&gt;下载好后让它跑起来，然后进入镜像。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker run -p 8000:8000 -d --name jupyterhub --restart&lt;span class="o"&gt;=&lt;/span&gt;always jupyterhub/jupyterhub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it jupyterhub bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;带路径文件的启动，首先在宿主机上新建文件夹&lt;code&gt;/root/jupyterhub/jupyterhub/&lt;/code&gt;和&lt;code&gt;/root/jupyterhub/home/&lt;/code&gt;，然后用如下命令启动。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;docker run -p 8000:8000 -d --name jupyterhub -v /root/jupyterhub/jupyterhub/:/srv/jupyterhub -v /root/jupyterhub/home/:/home --restart&lt;span class="o"&gt;=&lt;/span&gt;always jupyterhub/jupyterhub_build jupyterhub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在镜像中新建用户，默认不能用 &lt;code&gt;root&lt;/code&gt;登录。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;useradd admin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;passwd admin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;会要求你输入密码，你看不见，输入两次一样的就行。&lt;/p&gt;
&lt;p&gt;更新pip,更新jupyterhub&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;pip install --upgrade pip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;pip install --upgrade jupyterhub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;pip install notebook --upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后就可以从浏览器通过&lt;code&gt;http://IP:8000&lt;/code&gt;访问了，输入刚刚新建的用户名和密码。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snipaste_2020-02-15_16-51-41.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/15/c1b5879bf9355.png"&gt;&lt;/p&gt;
&lt;h3 id="失败的方法参考"&gt;失败的方法参考
&lt;/h3&gt;&lt;h4 id="下载anaconda"&gt;下载Anaconda
&lt;/h4&gt;&lt;p&gt;手动从清华anaconda源下载anaconda-5.3.0的安装包，加执行权限然后bash执行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.3.1-Linux-x86_64.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;chmod +x Anaconda3-5.3.1-Linux-x86_64.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;bash Anaconda3-5.3.1-Linux-x86_64.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;说一下这个安装过程中的问题，别一路憨憨就过去了。首先是&lt;code&gt;回车&lt;/code&gt;继续安装&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snipaste_2020-02-14_16-57-42.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/14/a1287db256dad.png"&gt;&lt;/p&gt;
&lt;p&gt;然后会给你看一堆文件，问你接受条款么？不用管，直接&lt;code&gt;yes&lt;/code&gt;完事。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snipaste_2020-02-14_16-58-18.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/14/7b6901ca34272.png"&gt;&lt;/p&gt;
&lt;p&gt;接着问你启动命令要不要加到&lt;code&gt;bashrc&lt;/code&gt;里，填&lt;code&gt;yes&lt;/code&gt;，错过了的同学也可以参考&lt;a class="link" href="https://blog.51cto.com/m51cto/2370679" target="_blank" rel="noopener"
 &gt;Jupyterhub安装配置及心得&lt;/a&gt;手动加上。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snipaste_2020-02-14_16-58-59.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/14/000cdc7fe5197.png"&gt;&lt;/p&gt;
&lt;p&gt;最后问你要不要VSCode编辑器，咱在服务器上配置不用装，填&lt;code&gt;no&lt;/code&gt;，在笔记本上装，可以&lt;code&gt;yes&lt;/code&gt;。其实jupyter自带的Spyder编辑器也不错，VSCode编辑器使用起来也不错，看个人喜好。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snipaste_2020-02-14_16-59-42.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/14/ddc53f7c3ca05.png"&gt;&lt;/p&gt;
&lt;p&gt;装完记得重载一下配置&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="conda安装jupyterhub"&gt;conda安装Jupyterhub
&lt;/h4&gt;&lt;p&gt;添加清华源，然后升级一下，再安装。卡死请参考&lt;a class="link" href="https://www.jianshu.com/p/85cfbfdc88f3" target="_blank" rel="noopener"
 &gt;使用conda命令下载jupyter时一直在Solving environment卡死&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;conda config --set show_channel_urls yes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;conda upgrade --all &lt;span class="c1"&gt;# 先升级一下，不然会很慢&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;conda install -c conda-forge jupyterhub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;conda install jupyterlab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="用pip安装jupyterhub"&gt;用pip安装Jupyterhub
&lt;/h4&gt;&lt;p&gt;使用pip，速度杠杠滴。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;python3 -m pip install jupyterhub -i https://pypi.douban.com/simple/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;npm install -g configurable-http-proxy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;python3 -m pip install --upgrade notebook -i https://pypi.douban.com/simple/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是我参考&lt;a class="link" href="https://blog.51cto.com/m51cto/2370679" target="_blank" rel="noopener"
 &gt;Jupyterhub安装配置及心得&lt;/a&gt;设置后的jupyterHub，页面打不开，显示&lt;code&gt;Not Found&lt;/code&gt;,终端也报错。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Snipaste_2020-02-14_20-46-34.png" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://newblogimg.oss-cn-beijing.aliyuncs.com/2020/02/14/e5f1ec0f915e3.png"&gt;&lt;/p&gt;</description></item><item><title>Siphon使用IGRA2为数据源画探空图</title><link>https://ruajingjing.top/post/siphon%E4%BD%BF%E7%94%A8igra2%E4%B8%BA%E6%95%B0%E6%8D%AE%E6%BA%90%E7%94%BB%E6%8E%A2%E7%A9%BA%E5%9B%BE/</link><pubDate>Sat, 12 Oct 2019 00:05:29 +0000</pubDate><guid>https://ruajingjing.top/post/siphon%E4%BD%BF%E7%94%A8igra2%E4%B8%BA%E6%95%B0%E6%8D%AE%E6%BA%90%E7%94%BB%E6%8E%A2%E7%A9%BA%E5%9B%BE/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post Siphon使用IGRA2为数据源画探空图" /&gt;&lt;p&gt;Siphon 还提供了 Integrated Global Radiosonde Archive （IGRA2）为数据源的数据管道。在修改完uwyo的代码后，顺便来看看另一个数据集的。使用的话我感觉还是怀俄明哪个比较好，它更新快，基本上国际时间00,12时一过半小时就可以访问最新的数据；而且国内访问也快（不翻墙也能使用）；绘图代码简单易懂，也便于气象工作者根据自己的需要再次修改。IGRA2的更新比较慢，反正是3月份这回的中国区基本都是提示无数据；访问也很慢，不清楚是墙的原因还是网站本身技术的原因，和Matlab启动速度有的一拼；代码比怀俄明的那个稍微复杂些，因为他提供的数据参量更多，像位温，假位温这样的都有，怀俄明的只有一个露点。需要精细化比对探空数据的可能需要IGRA2的数据，需要快速分析天气的更喜欢怀俄明。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://unidata.github.io/siphon/latest/examples/upperair/IGRA2_Request.html#sphx-glr-examples-upperair-igra2-request-py" target="_blank" rel="noopener"
 &gt;IGRA2 Upper Air Data Request&lt;/a&gt; 官网文档给出了具体用法，和怀俄明的那个模块很相似&lt;/p&gt;
&lt;h2 id="带入模块"&gt;带入模块
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;from datetime import datetime
from siphon.simplewebservice.igra2 import IGRAUpperAir
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="设置站好和时间"&gt;设置站好和时间
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;date = datetime(2014, 9, 10, 0)
station = &amp;#39;USM00070026&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="发送请求获取数据"&gt;发送请求，获取数据
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;df, header = IGRAUpperAir.request_data(date, station)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里有两点需要注意&lt;/p&gt;
&lt;p&gt;&lt;img alt="sites" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.ncdc.noaa.gov/sites/default/files/styles/full_page_width/public/igra_stationmap.jpg?itok=j0biEjcy"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;站点编号。IGRA2目前收录了2700多个站点的数据（如上图密密麻麻的红点），为了便于管理，给各个站点都做了统一编号，这个编号的组成大约是’国家代码‘+’000‘+’原站点编号‘。这里的原站点编号就是怀俄明网站上各个站点的5位数编号，像青岛原本用ZSQD表示的就是54857，四位字母编号一般是省市级的站点才有。而IGRA2官方也提供了一份详细的&lt;a class="link" href="https://www1.ncdc.noaa.gov/pub/data/igra/igra2-station-list.txt" target="_blank" rel="noopener"
 &gt;全球站点统一编号列表&lt;/a&gt;,包含每个站点的编号，位置（经纬度），网络关联，站点名称和记录周期。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取格式中的header。header表示的相当于nc文件的头文件，用于描述这段数据的一些特征。而df才是爬到的数据。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而IGRA2的数据也与怀俄明的不一样&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;dfIGRA2.keys()
---
Out[26]:
Index([&amp;#39;pressure&amp;#39;, &amp;#39;reported_height&amp;#39;, &amp;#39;calculated_height&amp;#39;, &amp;#39;temperature&amp;#39;,
 &amp;#39;temperature_gradient&amp;#39;, &amp;#39;potential_temperature&amp;#39;,
 &amp;#39;potential_temperature_gradient&amp;#39;, &amp;#39;virtual_temperature&amp;#39;,
 &amp;#39;virtual_potential_temperature&amp;#39;, &amp;#39;vapor_pressure&amp;#39;,
 &amp;#39;saturation_vapor_pressure&amp;#39;, &amp;#39;reported_relative_humidity&amp;#39;,
 &amp;#39;calculated_relative_humidity&amp;#39;, &amp;#39;u_wind&amp;#39;, &amp;#39;u_wind_gradient&amp;#39;, &amp;#39;v_wind&amp;#39;,
 &amp;#39;v_wind_gradient&amp;#39;, &amp;#39;refractive_index&amp;#39;, &amp;#39;date&amp;#39;],
 dtype=&amp;#39;object&amp;#39;)
==========================
dfuwyo.keys()
---
Out[27]:
Index([&amp;#39;pressure&amp;#39;, &amp;#39;height&amp;#39;, &amp;#39;temperature&amp;#39;, &amp;#39;dewpoint&amp;#39;, &amp;#39;direction&amp;#39;, &amp;#39;speed&amp;#39;,
 &amp;#39;u_wind&amp;#39;, &amp;#39;v_wind&amp;#39;, &amp;#39;station&amp;#39;, &amp;#39;station_number&amp;#39;, &amp;#39;time&amp;#39;, &amp;#39;latitude&amp;#39;,
 &amp;#39;longitude&amp;#39;, &amp;#39;elevation&amp;#39;],
 dtype=&amp;#39;object&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;比较麻烦的是IGRA2的数据没有露点的数据，而这个数据有是绘图必须的。好在Metpy库提供了calc的计算模块，专门处理大气科学上的这些乱七八糟的计算。这里用&lt;a class="link" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.dewpoint.html#metpy.calc.dewpoint" target="_blank" rel="noopener"
 &gt;metpy.calc.dewpoint&lt;/a&gt;这个功能实现从水汽分压计算露点。官方也给出了一个&lt;a class="link" href="https://unidata.github.io/MetPy/latest/examples/calculations/Dewpoint_and_Mixing_Ratio.html#sphx-glr-examples-calculations-dewpoint-and-mixing-ratio-py" target="_blank" rel="noopener"
 &gt;示例&lt;/a&gt;，可以直接用。虽然功能上说是用水汽分压计算，但是只要有表面压强就可以计算了。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mixing = 10 * units(&amp;#39;g/kg&amp;#39;)
e = mpcalc.vapor_pressure(list(df[&amp;#39;pressure&amp;#39;])* units.mbar, mixing)
df[&amp;#39;dewpoint&amp;#39;] = mpcalc.dewpoint(e)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最后还有风速和风向这两个参数没有解决，calc也提供了模块搞定这个问题。怀俄明的代码是用风速和风向算u,v分矢量，而IGRA2恰好反过来。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;df[&amp;#39;u_wind&amp;#39;], df[&amp;#39;v_wind&amp;#39;] = mpcalc.wind_components(df[&amp;#39;speed&amp;#39;],np.deg2rad(df[&amp;#39;direction&amp;#39;]))
---
df[&amp;#39;speed&amp;#39;]=mpcalc.wind_speed(df[&amp;#39;u_wind&amp;#39;], df[&amp;#39;v_wind&amp;#39;])
df[&amp;#39;direction&amp;#39;]=mpcalc.wind_direction(df[&amp;#39;u_wind&amp;#39;], df[&amp;#39;v_wind&amp;#39;])
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;calc还有其他功能，可以查阅&lt;a class="link" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.html" target="_blank" rel="noopener"
 &gt;官方文档&lt;/a&gt;了解。&lt;/p&gt;
&lt;p&gt;添加如下代码：可以使程序运行，但是风向的转换似乎有问题，而官方的calc的包也总是报错，暂时不管了，先这么滴吧，还是用怀俄明的数据吧。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;f, header= IGRAUpperAir.request_data(date, station, derived=True)
df[&amp;#39;speed&amp;#39;]=mpcalc.wind_speed(df[&amp;#39;u_wind&amp;#39;], df[&amp;#39;v_wind&amp;#39;])

def mydirection(u,v):
 theta=np.arctan2(u, v)
 mydirection=np.rad2deg(theta)+180
 return mydirection

df[&amp;#39;direction&amp;#39;]=mydirection(df[&amp;#39;u_wind&amp;#39;], df[&amp;#39;v_wind&amp;#39;])

mixing = 10 * units(&amp;#39;g/kg&amp;#39;)
e = mpcalc.vapor_pressure(list(df[&amp;#39;pressure&amp;#39;])* units.mbar, mixing)
df[&amp;#39;dewpoint&amp;#39;] = mpcalc.dewpoint(e)
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Metpy新版功能下载TLnP图设置</title><link>https://ruajingjing.top/post/metpy%E6%96%B0%E7%89%88%E5%8A%9F%E8%83%BD%E4%B8%8B%E8%BD%BDtlnp%E5%9B%BE%E8%AE%BE%E7%BD%AE/</link><pubDate>Fri, 11 Oct 2019 23:53:28 +0000</pubDate><guid>https://ruajingjing.top/post/metpy%E6%96%B0%E7%89%88%E5%8A%9F%E8%83%BD%E4%B8%8B%E8%BD%BDtlnp%E5%9B%BE%E8%AE%BE%E7%BD%AE/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post Metpy新版功能下载TLnP图设置" /&gt;&lt;p&gt;文章很长，可以直接看末尾的用法总结。&lt;/p&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://unidata.github.io/MetPy/latest/index.html" target="_blank" rel="noopener"
 &gt;Metpy官方文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://unidata.github.io/MetPy/latest/tutorials/upperair_soundings.html#sphx-glr-tutorials-upperair-soundings-py" target="_blank" rel="noopener"
 &gt;Metpy Skew-T Tutorials&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://unidata.github.io/MetPy/latest/examples/plots/Skew-T_Layout.html" target="_blank" rel="noopener"
 &gt;Metpy Skew-T Complex Layout&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://unidata.github.io/siphon/latest/examples/upperair/Wyoming_Request.html#sphx-glr-examples-upperair-wyoming-request-py" target="_blank" rel="noopener"
 &gt;Siphon Wyoming Upper Air Data Request&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;用于天气绘图的Metpy包更新（0.8版本）了，他们要逐渐抛弃Python2.X，转到Python&amp;gt;=3.6的版本上。所以，之前（越2018年6月以前，0.7版本）的一些脚本就无法使用了。在大气科学专业，我们主要使用 Metpy 绘制以怀俄明大学高空探测数据为基础的斜-T图(Skew-T)。受更新影响，原本的 upperair_sounding.py脚本也有改动。&lt;/p&gt;
&lt;h2 id="新旧metoy的改动"&gt;新旧MEtoy的改动
&lt;/h2&gt;&lt;p&gt;老版本的第17~41行为：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from datetime import datetime

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import numpy as np

import metpy.calc as mpcalc
from metpy.io import get_upper_air_data
from metpy.plots import Hodograph, SkewT

#########################################################################
# Getting Data
# ------------
#
# We will download data from the
# `University of Wyoming sounding data page &amp;lt;http://weather.uwyo.edu/upperair/sounding.html&amp;gt;`_
# , which has an extensive archive of data available, as well as current data.
#
# In this case, we will download the sounding data from the Veterans Day
# tornado outbreak in 2002 by passing a ``datetime`` object and station name to the
# ``get_upper_air_data`` function.

dataset = get_upper_air_data(datetime(2018, 5, 7, 0), &amp;#39;ZSQD&amp;#39;)

##########################################################################
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;而新版本的第18～47行为：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
import numpy as np
import pandas as pd

import metpy.calc as mpcalc
from metpy.cbook import get_test_data
from metpy.plots import Hodograph, SkewT
from metpy.units import units

#########################################################################
# Getting Data
# ------------
#
# Upper air data can be obtained using the siphon package, but for this tutorial we will use
# some of MetPy&amp;#39;s sample data. This event is the Veterans Day tornado outbreak in 2002.

col_names = [&amp;#39;pressure&amp;#39;, &amp;#39;height&amp;#39;, &amp;#39;temperature&amp;#39;, &amp;#39;dewpoint&amp;#39;, &amp;#39;direction&amp;#39;, &amp;#39;speed&amp;#39;]

df = pd.read_fwf(get_test_data(&amp;#39;nov11_sounding.txt&amp;#39;, as_file_obj=False),
 skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)

df[&amp;#39;u_wind&amp;#39;], df[&amp;#39;v_wind&amp;#39;] = mpcalc.wind_components(df[&amp;#39;speed&amp;#39;],
 np.deg2rad(df[&amp;#39;direction&amp;#39;]))

# Drop any rows with all NaN values for T, Td, winds
df = df.dropna(subset=(&amp;#39;temperature&amp;#39;, &amp;#39;dewpoint&amp;#39;, &amp;#39;direction&amp;#39;, &amp;#39;speed&amp;#39;,
 &amp;#39;u_wind&amp;#39;, &amp;#39;v_wind&amp;#39;), how=&amp;#39;all&amp;#39;).reset_index(drop=True)

##########################################################################
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;对比可以发现，用于绘图的模块基本没变，而是用于读取数据的模块变了，无论是库还是代码调用方法。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from metpy.io import get_upper_air_data
---
from metpy.cbook import get_test_data

dataset = get_upper_air_data(datetime(2018, 5, 7, 0), &amp;#39;ZSQD&amp;#39;)
---
df = pd.read_fwf(get_test_data(&amp;#39;nov11_sounding.txt&amp;#39;, as_file_obj=False),
 skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img alt="Metpy DOC Siphoon" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/MetpyDocToSiphoon.png"&gt;&lt;/p&gt;
&lt;p&gt;而从官方说明文档中得知，获取数据这个功能被独立出来，用Siphon这个库实现。让我们来看看Siphon时何方神圣？搜索Siphon文档得知，这货就是个专门爬气象数据的包。他提供&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;netCDF 格式的NCSS的数据&lt;/li&gt;
&lt;li&gt;NDBC 的浮标数据(海洋人的最爱)&lt;/li&gt;
&lt;li&gt;高空探测数据，怀俄明大学数据源(Wyoming data)和IGRA2数据源（Integrated Global Radiosonde Archive）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之前我喜欢用怀俄明大学的数据，所以这次就来看看要怎么用怀俄明大学的数据画Skew-T图。&lt;/p&gt;
&lt;p&gt;分析新版本的数据读取的语句&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;df = pd.read_fwf(get_test_data(&amp;#39;nov11_sounding.txt&amp;#39;, as_file_obj=False),
 skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;得知，nov11_sounding.txt 是官方内置的一个示例数据文件，这行代码主要是用pandos的功能读取一个列表数据。&lt;/p&gt;
&lt;p&gt;如果能用Siphon下载同格式的数据的话，那么只要改改读取的文件名就可以了。
我们看一下这个神奇的txt文件在哪里
运行一下脚本&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;python3 upperair_soundings.py 
---
/home/bugatti/anaconda3/lib/python3.6/site-packages/pooch/core.py:260: UserWarning: Downloading data file &amp;#39;nov11_sounding.txt&amp;#39; from remote data store &amp;#39;https://github.com/Unidata/MetPy/raw/v0.10.0/staticdata/&amp;#39; to &amp;#39;/home/bugatti/.cache/metpy/v0.10.0&amp;#39;.
 action, fname, self.base_url, str(self.path)
923.0963220202037 hectopascal 15.595422727825456 degC
/home/bugatti/anaconda3/lib/python3.6/site-packages/pint/quantity.py:1377: UnitStrippedWarning: The unit of the quantity is stripped.
 warnings.warn(&amp;#34;The unit of the quantity is stripped.&amp;#34;, UnitStrippedWarning)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;能够成功出图，然后看到命令行窗口的第二行显示这个文件在&amp;rsquo;/home/bugatti/.cache/metpy/v0.10.0&amp;rsquo; 这个目录里，bugatti是我的用户名，换在你的电脑中应该也是类似的路径。
打开这个文件格式如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;-----------------------------------------------------------------------------
 PRES HGHT TEMP DWPT RELH MIXR DRCT SKNT THTA THTE THTV
 hPa m C C % g/kg deg knot K K K
-----------------------------------------------------------------------------
 1000.0 -12
 978.0 180 20.4 16.5 78 12.22 180 16 295.4 330.7 297.6
 964.1 305 22.2 17.1 73 12.92 185 29 298.5 336.3 300.8
 954.0 397 23.6 17.6 69 13.45 188 35 300.8 340.5 303.2
 931.0 610 22.5 16.5 69 12.84 195 49 301.7 339.8 304.1
 925.0 667 22.2 16.2 69 12.68 200 48 302.0 339.7 304.3
 898.9 914 20.2 14.5 70 11.68 205 49 302.4 337.2 304.5
 867.6 1219 17.7 12.4 71 10.54 215 52 302.9 334.4 304.8
 850.0 1396 16.2 11.2 72 9.92 220 55 303.1 332.9 304.9
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个和在&lt;a class="link" href="http://weather.uwyo.edu/upperair/sounding.html" target="_blank" rel="noopener"
 &gt;怀俄明无线电探空数据网站&lt;/a&gt; 的数据格式一模一样（毕竟就是从这爬取的数据嘛）&lt;/p&gt;
&lt;p&gt;&lt;img alt="UWYO DATA" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/WoymData.png"&gt;&lt;/p&gt;
&lt;h2 id="siphon的文档的说明"&gt;Siphon的文档的说明
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;导入读取怀俄明大学数据读取模块&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;from datetime import datetime

from metpy.units import units

from siphon.simplewebservice.wyoming import WyomingUpperAir
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;设置要获取的地点和时间&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;date = datetime(2017, 9, 10, 6)
station = &amp;#39;MFL&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;发送请求，拉取数据&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;df = WyomingUpperAir.request_data(date, station)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;就是这么简单粗暴！&lt;/p&gt;
&lt;h2 id="唯一需要注意的是时间格式的设置"&gt;唯一需要注意的是时间格式的设置
&lt;/h2&gt;&lt;p&gt;在Spyder中运行上述代码，获取数据，在变量窗口查看数据值&lt;/p&gt;
&lt;p&gt;&lt;img alt="Spydervalue" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/SpyderValue.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="SpderValue2" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/SpyderValue2.png"&gt;&lt;/p&gt;
&lt;p&gt;与怀俄明大学网站的数据列表作对比
&lt;img alt="uwyodata" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/WoymData.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="dadtaheml" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/uwyoDatahtml.png"&gt;&lt;/p&gt;
&lt;p&gt;发现 (2017, 9, 10, 6)表示的就是2017年9月10日6时。6所在位置的参数只有(0, 6, 12)三个数字可选。这里使用的是世界时，0和12也就是中国地区早八晚八时放气球，美国迈阿密(站号MFL，时区西五区)大概是晚七早七，6属于补测的时间，一般是由于天气过程复杂，或者早上的数据没测好才会有补测的6时。&lt;/p&gt;
&lt;p&gt;回到数据读取问题上来，示例文件中的语句是把一个写好的txt文件读取为类似nc文件那样带变量描述的值的一个东西。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;df = pd.read_fwf(get_test_data(&amp;#39;nov11_sounding.txt&amp;#39;, as_file_obj=False),
 skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;而siphon爬去网络数据就直接是这样的格式，所以如果要改为自己想要的某天日期也十分简单。就是把示例文件中的语句注释掉，然后添加如下代码：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#df = pd.read_fwf(get_test_data(&amp;#39;nov11_sounding.txt&amp;#39;, as_file_obj=False),
# skiprows=5, usecols=[0, 1, 2, 3, 6, 7], names=col_names)

from datetime import datetime
from siphon.simplewebservice.wyoming import WyomingUpperAir

date = datetime(2019, 3, 25, 0)
station = &amp;#39;MFL&amp;#39;
df = WyomingUpperAir.request_data(date, station)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行得到本文写作当天早八点的探空图。嗯，看样子多云天还得持续几天。&lt;/p&gt;
&lt;p&gt;&lt;img alt="SkewT2019032500" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/SkewT2019032500.png"&gt;&lt;/p&gt;
&lt;h2 id="最后添加一些使代码更容易使用的语句"&gt;最后添加一些使代码更容易使用的语句：
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;print(&amp;#39;欢迎使用 Metpy 和 Siphon 获取怀俄明大学无线电探空数据，使用方法如下：&amp;#39;)
print(&amp;#39;1.输入’年月日时‘和站号，如‘2019032500ZSQD’，中间无间隔。&amp;#39;)
print(&amp;#39;2.输入图片保存路径，回车默认脚本所在文件夹。&amp;#39;)
print(&amp;#39;提示：探空时段采用世界时，一般为00或12,06为补测数据，请自行换算时区。&amp;#39;)
print(&amp;#39; 中国区常用站号：北京-ZBAA，青岛-ZSQD，昆明-ZPPP，南京-ZSNJ&amp;#39;)
dateNum=input(&amp;#39;请输入日期和站号&amp;#39;)
figpath=input(&amp;#39;请输入保存路径&amp;#39;)
print(&amp;#39;正在获取探空图&amp;#39;,dateNum[:4], dateNum[4:6], dateNum[6:8], dateNum[8:10],dateNum[10:])
print(&amp;#39;保存路径为&amp;#39;,figpath)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="使用截图"&gt;使用截图
&lt;/h2&gt;&lt;p&gt;：
&lt;img alt="How To use" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/HowtouseMeypySiphon.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/MetpyNotes/upperair_soundings_wiithSinphon.py" target="_blank" rel="noopener"
 &gt;点击下载代码&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(PS:Siphon的意思是‘虹吸管’，很适合它，吸数据的虹吸管)&lt;/p&gt;</description></item><item><title>Scratch初体验</title><link>https://ruajingjing.top/post/scratch%E5%88%9D%E4%BD%93%E9%AA%8C/</link><pubDate>Fri, 12 Apr 2019 00:01:52 +0000</pubDate><guid>https://ruajingjing.top/post/scratch%E5%88%9D%E4%BD%93%E9%AA%8C/</guid><description>&lt;img src="https://ruajingjing.top/" alt="Featured image of post Scratch初体验" /&gt;&lt;p&gt;3月23日这天我参加了学校的招聘会，顺利拿到一个实习。简单来说我的工作就是教小孩子编程，最近Python火得一塌糊涂，连浙江小学都在学。我所在的机构提供小学这个阶段的编程教育，我很有幸能把自己的知识分享出去，尤其是分享给未来的AI一代。MIT(麻省理工大学)搞了一个叫Scratch的东西，是专门给小朋友设计的可视化编程工具。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://scratch.mit.edu/" target="_blank" rel="noopener"
 &gt;Scratch - Imagine, Program, Share&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可视化我很熟悉，我上大学三年以来基本都在把各种数据用各种颜色各种图标画出来。不过这编程可视化与数据可视化有所不同。编程可视化或者叫可视化编程，是不需要在编辑器界面打代码的，它用‘积木’来‘搭建’程序。我在第二天去公司面试，当场给老板上手撸了个程序——&lt;a class="link" href="https://scratch.mit.edu/projects/296746286/" target="_blank" rel="noopener"
 &gt;辛德瑞拉的字符串&lt;/a&gt;，就顺利通过了。点击链接可以看到我在Scratch社区发布的项目，还可以在线运行一下试试，按“A”键开始。&lt;/p&gt;
&lt;p&gt;打开Scratch3.0的编辑界面就是这样的，他还提供了中文版的，对国内用户十分友好，翻译通俗易懂，我觉得这个简单到真的不需要太多说明了，只要识字就会了。即使零编程基础，随便拖几个积木玩玩，玩着玩着就会了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Editor" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/ScratchNotes/ScratchEditor.png"&gt;&lt;/p&gt;
&lt;p&gt;而且官方也附带入门教程，还有中文社区，也提供一些优秀作品以供学习。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Example" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/ScratchNotes/ScratchExample.png"&gt;&lt;/p&gt;
&lt;p&gt;我的项目就是用了很多的角色控制的模块，核心功能就是那只鸽子做的字符串对比处理的工作，然后加了《灰姑娘》这个故事中的一些情节。字符串处理算是编程的一项基本功了，几乎每一门语言的新手入门教程都会有字符串的内容，当然找素数也是。
好像现代童话的《灰姑娘》删掉了一些情节，我记得我小时候读的《灰姑娘》有继母不让她参加舞会让他捡豆子的情节。现在大概觉得继母这样做有点神经质就取消掉了。哎，多好的教学素材。&lt;/p&gt;
&lt;p&gt;&lt;img alt="HGN" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/ScratchNotes/HGN.gif"&gt;&lt;/p&gt;
&lt;p&gt;假设用字符“X”代表豆子，其他字符代表灰，那么继母的工作就是打乱一碗豆子（“XXXX”）与一堆灰（“SDhjdjgdwebdkwefe”）的排列顺序，这个豆-灰混合物就可以用“XsdadassXadasXXssdad”来表示，而仙女教母派来的鸽子就是把这个豆-灰混合物用经典算法冒泡排序中的方法，比较字符的值，挑出豆子（“XXXX”）。&lt;/p&gt;
&lt;p&gt;&lt;img alt="HGN_Value" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://bugatii100peaglepics.oss-cn-qingdao.aliyuncs.com/2019-3/ScratchNotes/HGN_Value.gif"&gt;&lt;/p&gt;
&lt;p&gt;一开始，我的继母用的是官方的巫婆的那个形象，与目前这个版本比起来，那个后妈比较惊悚。给老板看了以后，她非常喜欢我做的这个项目，然后建议我换一个形象柔和一点，色彩明亮的人物，再加一个漂亮的背景，这样小孩子会比较喜欢。我努力回忆了一下童年看过的动画片，最后还是锁定了迪士尼版本的灰姑娘形象。童话梦工厂真的很梦幻。&lt;/p&gt;
&lt;p&gt;目前，这个项目还只不成熟。当时时间紧迫，我暂时随便抠了个图，人物有的地方缺了一大块。而且动画还没有配音，如果加上声音应该会很有喜感。&lt;/p&gt;</description></item></channel></rss>