<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Scofieldyu</title>
  
  <subtitle>高筑墙-广积粮-缓称王</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://Scofieldsu.github.io/"/>
  <updated>2022-01-19T02:48:00.185Z</updated>
  <id>http://Scofieldsu.github.io/</id>
  
  <author>
    <name>俞 元</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>59条编程语录</title>
    <link href="http://Scofieldsu.github.io/2022/01/18/59%E6%9D%A1%E7%BC%96%E7%A8%8B%E8%AF%AD%E5%BD%95/"/>
    <id>http://Scofieldsu.github.io/2022/01/18/59条编程语录/</id>
    <published>2022-01-18T12:56:40.000Z</published>
    <updated>2022-01-19T02:48:00.185Z</updated>
    
    <content type="html"><![CDATA[<h2 id="59条搞笑但却真实无比的编程语录"><a class="markdownIt-Anchor" href="#59条搞笑但却真实无比的编程语录"></a> 59条搞笑但却真实无比的编程语录</h2><blockquote><p>英文原文：59 Hilarious but True Programming Quotes for Software Developers</p></blockquote><p>收集了很多编程语录，这些语录涉及软件开发，代码维护，调试纠错，软件bug，系统设计、文档，代码质量，测试和软件开发团队管理等方面。</p><p>下面的这59条语录虽然很搞笑，但却真实无比。只有牛逼的程序员才能理解这些编程语句里的真正内涵。</p><hr /><h3 id="软件开发人员和程序员语录"><a class="markdownIt-Anchor" href="#软件开发人员和程序员语录"></a> 软件开发人员和程序员语录</h3><ol><li>A good programmer is someone who always looks both ways before crossing a one-way street.(Doug Linder)</li></ol><blockquote><p>好的程序员即使在过单行道时也总是会环顾两边。</p></blockquote><ol start="2"><li>Don’t worry if it doesn’t work right. If everything did, you’d be out of a job.(Mosher’s Law of Software Engineering)</li></ol><blockquote><p>不要担心它能否正常工作。如果一切正常，那么你就会失去工作。</p></blockquote><ol start="3"><li>The trouble with programmers is that you can never tell what a programmer is doing until it’s too late. (Seymour Cray)</li></ol><blockquote><p>程序员的烦恼是，你永远无法知道一个程序员在做什么，直到为时已晚。</p></blockquote><ol start="4"><li>Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris. (Larry Wall)</li></ol><blockquote><p>程序员的美德：懒惰，没有耐心以及老子天下第一。</p></blockquote><ol start="5"><li>Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. (Martin Golding)</li></ol><blockquote><p>写代码的时候总是想象维护你代码的家伙是一个知道你住在哪里的暴力精神病患者。</p></blockquote><ol start="6"><li>One man’s crappy software is another man’s full time job. (Jessica Gaston)</li></ol><blockquote><p>一个人写的烂软件将会给另一个人带来一份全职工作。</p></blockquote><ol start="7"><li>If builders built buildings the way programmers wrote programs, then the first woodpecker that came along wound destroy civilization. (Gerald Weinberg)</li></ol><blockquote><p>如果建筑工人用程序员写程序的方式建造建筑物，那么来的第一只啄木鸟（找bug）就将摧毁文明。</p></blockquote><ol start="8"><li>The most likely way for the world to be destroyed, most experts agree, is by accident. That’s where we come in; we’re computer professionals. We cause accidents. (Nathaniel Borenstein)</li></ol><blockquote><p>大多数专家认为，世界被破坏的最有可能的方式是，是因为偶然。那就是我们所要进入的领域：我们是计算机专家。我们制造偶然。</p></blockquote><ol start="9"><li>It’s a curious thing about our industry: not only do we not learn from our mistakes, we also don’t learn from our successes. (Keith Braithwaite)</li></ol><blockquote><p>这是我们这个行业的一件咄咄怪事：我们不仅不从错误中学习，我们也不从成功中学习。</p></blockquote><ol start="10"><li>Once a new technology starts rolling, if you’re not part of the steamroller, you’re part of the road. (Stewart Brand)</li></ol><blockquote><p>一旦一种新技术开始滚动碾压道路，如果你不能成为压路机的一部分，那么你就只能成为道路的一部分。</p></blockquote><ol start="11"><li>If at first you don’t succeed, call it version 1.0 (unknown)</li></ol><blockquote><p>如果第一次你没有成功，那么称之为1.0版，继续加油。</p></blockquote><ol start="12"><li>All programmers are playwrights and all computers are lousy actors. (Anonymous Hack Actor)</li></ol><blockquote><p>所有的程序员都剧作家，而所有计算机都是糟糕的演员。</p></blockquote><ol start="13"><li>The sooner you get behind in your work, the more time you have to catch up. (Anonymous Scheduler)</li></ol><blockquote><p>工作拉下得越早，赶上去所需要的时间越多。</p></blockquote><ol start="14"><li>When a programming language is created that allows programmers to program in simple English, it will be discovered that programmers cannot speak English. (Anonymous Linguist)</li></ol><blockquote><p>当创建一种编程语言允许程序员使用简单英语编程的时候，那么新问题又来了，你会发现程序员不说英语。</p></blockquote><ol start="15"><li>Why do we never have time to do it right, but always have time to do it over? (Anonymous)</li></ol><blockquote><p>为什么我们总是没有时间把事情做对，却有时间做完它？</p></blockquote><ol start="16"><li>Any fool can write code that a computer can understand. Good programmers write code that humans can understand.</li></ol><blockquote><p>傻瓜写计算机能理解的代码。优秀的程序员写人类能读懂的代码。</p></blockquote><ol start="17"><li>Any code of your own that you haven’t looked at for six or more months might as well have been written by someone else. (Eagleson’s law)</li></ol><blockquote><p>自己的代码六个月或更久不见，还不如别人写的代码。</p></blockquote><hr /><h3 id="编程软件开发语录"><a class="markdownIt-Anchor" href="#编程软件开发语录"></a> 编程/软件开发语录</h3><ol><li>Measuring programming progress by lines of code is like measuring aircraft building progress by weight. (Bill Gates)</li></ol><blockquote><p>通过代码行数衡量开发进程就好比用重量来衡量飞机制造进度。</p></blockquote><ol start="2"><li>Programming is like sex. One mistake and you have to support it for the rest of your life. (Michael Sinz)</li></ol><blockquote><p>编程就像性爱一样。一个错误就能绑住你的余生。</p></blockquote><ol start="3"><li>Walking on water and developing software from a specification are easy if both are frozen. (Edward V Berard)</li></ol><blockquote><p>在目的明确的基础上开发软件就像在结冰的水上行走一样简单。</p></blockquote><ol start="4"><li>The first 90 percent of the code accounts for the first 90 percent of the development time…The remaining 10 percent of the code accounts for the other 90 percent of the development time.(Tom Cargill)</li></ol><blockquote><p>开始90％的代码占开始90％的开发时间……剩下10％的代码还是占90％的开发时间。</p></blockquote><ol start="5"><li>Commenting your code is like cleaning your bathroom — you never want to do it, but it really does create a more pleasant experience for you and your guests. (Ryan Campbell)</li></ol><blockquote><p>注释代码就像是清洁浴室——尽管你满心不情愿，但它确实可以为你和你的客人创造一种更舒适的体验。</p></blockquote><ol start="6"><li>Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. (Rick Cook)</li></ol><blockquote><p>当今的编程是软件工程师——努力建设更大多更好的傻瓜式程序，和上帝——试图产出更大多更好的傻瓜之间的竞争。到目前为止，世上帝是获胜者。</p></blockquote><ol start="7"><li>The hardest part of design … is keeping features out. (Donald Norman)</li></ol><blockquote><p>设计中最难的部分……是阻止功能。</p></blockquote><ol start="8"><li>In order to understand recursion, one must first understand recursion. (Anonymous)</li></ol><blockquote><p>要想了解递归，首先必须理解递归。</p></blockquote><ol start="9"><li>There are only two kinds of programming languages: those people always bitch about and those nobody uses. (Bjarne Stroustrup)</li></ol><blockquote><p>只有两种编程语言：一种是天天挨骂的，另一种是没人用的。</p></blockquote><ol start="10"><li>The best thing about a boolean is even if you are wrong, you are only off by a bit. (Anonymous)</li></ol><blockquote><p>关于布尔值最妙的一点是，就算你错了，你也只是错了这一处而已。</p></blockquote><ol start="11"><li>If Java had true garbage collection, most programs would delete themselves upon execution. (Robert Swell)</li></ol><blockquote><p>如果Java真的有垃圾收集，那么大多数程序会执行自我删除。</p></blockquote><ol start="12"><li>In theory, there is no difference between theory and practice. But, in practice, there is. (Jan L. A. van de Snepscheut)</li></ol><blockquote><p>理论上看，理论和实践之间是没有差别的。但是，在实践中，有。</p></blockquote><ol start="13"><li>Ready, fire, aim: the fast approach to software development. Ready, aim, aim, aim, aim: the slow approach to software development. (Anonymous)</li></ol><blockquote><p>准备，开火，瞄准：快速的软件开发方法。准备，瞄准，瞄准，瞄准，瞄准：缓慢的软件开发方法。</p></blockquote><ol start="14"><li>Programming is 10% science, 20% ingenuity, and 70% getting the ingenuity to work with the science. (Anonymous)</li></ol><blockquote><p>编程就是10％的科学，20％得的独创性，再加70％和这门科学的灵巧合作。</p></blockquote><ol start="15"><li>It is easier to measure something than to understand what you have measured. (Anonymous)</li></ol><blockquote><p>衡量比理解你衡量了什么容易。</p></blockquote><ol start="16"><li>Benchmarks don’t lie, but liars do benchmarks. (Anonymous)</li></ol><blockquote><p>基准不会撒谎，但制定基准的人会撒谎。</p></blockquote><ol start="17"><li>Better train people and risk they leave – than do nothing and risk they stay. (Anonymous)</li></ol><blockquote><p>就算是培训好的员工离开——也好过他们什么也不做却留下来。</p></blockquote><ol start="18"><li>The goal of Computer Science is to build something that will last at least until we’ve finished building it. (Anonymous)</li></ol><blockquote><p>计算机科学的目标是构建一个至少能持续到我们构建完成的东西。</p></blockquote><ol start="19"><li>Java is to JavaScript what Car is to Carpet. (Chris Heilmann)</li></ol><blockquote><p>Java之于JavaScript就像car之于carpet（地毯）。后者看上去像是前者的衍生物，实则是完全不同的两个东西。</p></blockquote><ol start="20"><li>It’s not at all important to get it right the first time. It’s vitally important to get it right the last time. (Andrew Hunt and David Thomas)</li></ol><blockquote><p>第一次是否正确完成一点也不重要。最后一次正确完成才至关重要。</p></blockquote><ol start="21"><li>Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration. (Stan Kelly-Bootle)</li></ol><blockquote><p>数组的下标一定要从0或1开始吗？我认为，我采取的中间值0.5没有经过适当考虑就被驳回了。</p></blockquote><ol start="22"><li>Programs must be written for people to read, and only incidentally for machines to execute. (Abelson / Sussman)</li></ol><blockquote><p>程序必须写得能供人阅读，机器执行只是附带。</p></blockquote><ol start="23"><li>Programming can be fun, so can cryptography; however they should not be combined. (Kreitzberg and Shneiderman)</li></ol><blockquote><p>编程可以很有趣，密码学也是如此；但是两者不应该搅和在一起。</p></blockquote><ol start="24"><li>Copy and paste is a design error. (David Parnas)</li></ol><blockquote><p>复制粘贴是一个设计错误。</p></blockquote><ol start="25"><li>Computers are good at following instructions, but not at reading your mind. (Donald Knuth)</li></ol><blockquote><p>计算机善于遵循指令，不善于读取你的想法。</p></blockquote><hr /><h3 id="软件调试语录"><a class="markdownIt-Anchor" href="#软件调试语录"></a> 软件调试语录</h3><ol><li>Deleted code is debugged code. (Jeff Sickel)</li></ol><blockquote><p>删除的代码是经过调试的代码。</p></blockquote><ol start="2"><li>If debugging is the process of removing software bugs, then programming must be the process of putting them in. (Edsger Dijkstra)</li></ol><blockquote><p>如果调试是消除软件bug的过程，那么编程就是产出bug的过程。</p></blockquote><ol start="3"><li>Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are–by definition–not smart enough to debug it.</li></ol><blockquote><p>调试一段程序的难度是写出这段程序的难度的两倍，因此，如果你的代码尽可能清楚的话，那么你就不用费力地调试它。</p></blockquote><ol start="4"><li>It’s hard enough to find an error in your code when you’re looking for it; it’s even harder when you’ve assumed your code is error-free. (Steve McConnel)</li></ol><blockquote><p>你的目的是找bug的时候，bug已经很难找了；更不要说当你认为自己的代码中没有错误的时候。</p></blockquote><hr /><h3 id="软件bug语录"><a class="markdownIt-Anchor" href="#软件bug语录"></a> 软件bug语录</h3><ol><li>It’s not a bug – it’s an undocumented feature. (Anonymous)</li></ol><blockquote><p>这不是bug——这是没有被证明的功能。</p></blockquote><ol start="2"><li>Without requirements or design, programming is the art of adding bugs to an empty text file. (Louis Srygley)</li></ol><blockquote><p>如果没有需求和设计，那么编程就是添加bug到空的文本文件的艺术。</p></blockquote><ol start="3"><li>Bad code isn’t bad, its just misunderstood. (Anonymous Code Behaviorist)</li></ol><blockquote><p>所谓坏的代码并不坏，它只是被误解了。</p></blockquote><ol start="4"><li>There are two ways to write error-free programs; only the third one works. (Alan J. Perlis)</li></ol><blockquote><p>写没有错误的程序有两种方式；但第三种才有效。</p></blockquote><ol start="5"><li>Beware of bugs in the above code; I have only proved it correct, not tried it. (Donald Knuth)</li></ol><blockquote><p>小心上面代码中的bug；我只证明了它是正确的，还没有尝试过。</p></blockquote><hr /><h3 id="软件终端产品语录"><a class="markdownIt-Anchor" href="#软件终端产品语录"></a> 软件/终端产品语录</h3><ol><li>Before software can be reusable it first has to be usable. (Ralph Johnson)</li></ol><blockquote><p>在软件可以被可重复使用前，它首先必须是可用的。</p></blockquote><ol start="2"><li>Software undergoes beta testing shortly before it’s released. Beta is Latin for “still doesn’t work”. (Anonymous)</li></ol><blockquote><p>软件在发布前要经过beta测试。beta即拉丁语“仍然无法正常工作”的意思。</p></blockquote><ol start="3"><li>The best performance improvement is the transition from the nonworking state to the working state. (J. Osterhout)</li></ol><blockquote><p>最佳性能改进是指从不可工作状态向工作状态的转变。</p></blockquote><ol start="4"><li>The cheapest, fastest, and most reliable components are those that aren’t there. (Gordon Bell)</li></ol><blockquote><p>最便宜，最快和最可靠的组件是不存在的。</p></blockquote><ol start="5"><li>I think Microsoft named .Net so it wouldn’t show up in a Unix directory listing. (Oktal)</li></ol><blockquote><p><a href="http://xn--siqv5luj359ai1csy4gjtf.Net">我认为微软命名.Net</a>，它就不会在Unix目录列表显示出来。</p></blockquote><ol start="6"><li>Software and cathedrals are much the same – first we build them, then we pray. (Sam Redwine)</li></ol><blockquote><p>软件和教堂非常相似——首先，我们建造它们，然后我们祈祷。</p></blockquote><ol start="7"><li>The software isn’t finished until the last user is dead. (Anonymous)</li></ol><blockquote><p>直到最后一个用户死去，软件才算完成。</p></blockquote><ol start="8"><li>Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves. (Alan Kay)</li></ol><blockquote><p>现在的大多数软件非常像埃及金字塔，在彼此之间堆建了成千上万的砖块，缺乏结构完整性，只是靠蛮力和成千上万的奴隶完成。</p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;59条搞笑但却真实无比的编程语录&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#59条搞笑但却真实无比的编程语录&quot;&gt;&lt;/a&gt; 59条搞笑但却真实无比的编程语录&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;英文原文：59 Hilarious
      
    
    </summary>
    
      <category term="编程" scheme="http://Scofieldsu.github.io/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
  </entry>
  
  <entry>
    <title>Python测试框架</title>
    <link href="http://Scofieldsu.github.io/2021/12/08/Python%E6%B5%8B%E8%AF%95%E6%A1%86%E6%9E%B6/"/>
    <id>http://Scofieldsu.github.io/2021/12/08/Python测试框架/</id>
    <published>2021-12-08T13:13:45.000Z</published>
    <updated>2022-01-19T02:55:44.941Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/categories/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
      <category term="Python" scheme="http://Scofieldsu.github.io/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>App自动化测试</title>
    <link href="http://Scofieldsu.github.io/2021/11/08/App%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    <id>http://Scofieldsu.github.io/2021/11/08/App自动化测试/</id>
    <published>2021-11-08T13:13:45.000Z</published>
    <updated>2022-01-19T02:57:28.998Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/categories/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
      <category term="Appium" scheme="http://Scofieldsu.github.io/tags/Appium/"/>
    
  </entry>
  
  <entry>
    <title>Web自动化测试</title>
    <link href="http://Scofieldsu.github.io/2021/11/08/Web%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    <id>http://Scofieldsu.github.io/2021/11/08/Web自动化测试/</id>
    <published>2021-11-08T13:13:45.000Z</published>
    <updated>2022-01-19T02:56:48.941Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/categories/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
      <category term="Selenium" scheme="http://Scofieldsu.github.io/tags/Selenium/"/>
    
  </entry>
  
  <entry>
    <title>服务端接口测试</title>
    <link href="http://Scofieldsu.github.io/2021/11/08/%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%8E%A5%E5%8F%A3%E6%B5%8B%E8%AF%95/"/>
    <id>http://Scofieldsu.github.io/2021/11/08/服务端接口测试/</id>
    <published>2021-11-08T13:13:45.000Z</published>
    <updated>2022-01-19T03:04:16.841Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/categories/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
      <category term="Mock" scheme="http://Scofieldsu.github.io/tags/Mock/"/>
    
  </entry>
  
  <entry>
    <title>自动遍历测试</title>
    <link href="http://Scofieldsu.github.io/2021/11/08/%E8%87%AA%E5%8A%A8%E9%81%8D%E5%8E%86%E6%B5%8B%E8%AF%95/"/>
    <id>http://Scofieldsu.github.io/2021/11/08/自动遍历测试/</id>
    <published>2021-11-08T13:13:45.000Z</published>
    <updated>2022-01-19T02:59:56.478Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/categories/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
      <category term="Monkey" scheme="http://Scofieldsu.github.io/tags/Monkey/"/>
    
  </entry>
  
  <entry>
    <title>OpenSTF 远程控制设备</title>
    <link href="http://Scofieldsu.github.io/2021/10/08/OpenSTF%E8%BF%9C%E7%A8%8B%E6%8E%A7%E5%88%B6%E8%AE%BE%E5%A4%87/"/>
    <id>http://Scofieldsu.github.io/2021/10/08/OpenSTF远程控制设备/</id>
    <published>2021-10-08T13:13:45.000Z</published>
    <updated>2022-01-19T03:01:34.084Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/categories/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
      <category term="OpenSTF" scheme="http://Scofieldsu.github.io/tags/OpenSTF/"/>
    
  </entry>
  
  <entry>
    <title>客户端专项测试</title>
    <link href="http://Scofieldsu.github.io/2021/09/08/%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%93%E9%A1%B9%E6%B5%8B%E8%AF%95/"/>
    <id>http://Scofieldsu.github.io/2021/09/08/客户端专项测试/</id>
    <published>2021-09-08T13:13:45.000Z</published>
    <updated>2022-01-19T03:02:24.471Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/categories/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
    
      <category term="自动化测试" scheme="http://Scofieldsu.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
      <category term="性能测试" scheme="http://Scofieldsu.github.io/tags/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/"/>
    
  </entry>
  
  <entry>
    <title>画图工具推荐</title>
    <link href="http://Scofieldsu.github.io/2018/11/02/%E7%94%BB%E5%9B%BE%E5%B7%A5%E5%85%B7%E6%8E%A8%E8%8D%90/"/>
    <id>http://Scofieldsu.github.io/2018/11/02/画图工具推荐/</id>
    <published>2018-11-01T19:09:23.000Z</published>
    <updated>2022-01-19T02:50:53.598Z</updated>
    
    <content type="html"><![CDATA[<p>作为一个程序员要画啥图？UML类图？时序图？流程图？系统架构图？<br />不仅仅如此，有时候我还会用思维导图记录一些东西</p><ul><li>大学时期画的一个类图😷</li></ul><p><img src="https://github.com/Scofieldsu/blog-source/blob/main/source/images/psb.jpeg?raw=true" alt="不知道是什么系统的类图" /></p><p>画图工具千千万，在此分享我常用的几个画图工具，大家有更好的工具分享可以留言补充。</p><ul><li><p><a href="https://www.processon.com/">processon</a> 是一个可以在线画图的网站,包括但不限于流程图/时序图/架构图。</p></li><li><p><a href="https://www.draw.io/">draw.io</a> 也可以在线画图。</p><ul><li><p>代码开源：<a href="https://github.com/jgraph/drawio">github-drawio</a></p></li><li><p>客户端下载：<a href="https://github.com/jgraph/drawio-desktop/releases">drawio-desktop</a></p></li><li><p>drawio默认没有aliyun的icon，但可以在<a href="http://iconfont.cn/home/index">iconfont</a>找到aliyun的icon，先和icon版权作者联系。这个<a href="https://github.com/jgraph/drawio/issues/326">issue</a>里有提到。</p></li></ul></li><li><p>xmind 思维导图客户端。</p><ul><li><p>思维导图用于整理需求功能点比较方便。</p></li><li><p>xmind个人版只能导出图片和svg file。 pro版本可以导出pdf，excel，word，而且pro版本风格更多。</p></li></ul></li><li><p><a href="https://coggle.it/">coggle</a> 在线思维导图</p><p>示例：<br /><img src="https://github.com/Scofieldsu/blog-source/blob/main/source/images/coggle.png?raw=true" alt="coggle" /></p></li><li><p>visio使用过，但不习惯。 axure试用了一下，临时想画原型图，但因素材组件不合适放弃，改用xmind描述功能点。</p></li></ul><hr /><h3 id="搭建你自己的在线画图应用"><a class="markdownIt-Anchor" href="#搭建你自己的在线画图应用"></a> 搭建你自己的在线画图应用</h3><ul><li>出于收费软件还是开源软件，在线还是离线，个人还是办公，安全规定等等因素,我们选用了开源的drawio,两种方式搭建任选。</li></ul><h4 id="1-编译部署-在此不介绍有兴趣网上查询"><a class="markdownIt-Anchor" href="#1-编译部署-在此不介绍有兴趣网上查询"></a> 1. 编译部署 在此不介绍，有兴趣网上查询</h4><h4 id="2-docker部署"><a class="markdownIt-Anchor" href="#2-docker部署"></a> 2. docker部署</h4><p>关于docker环境安装 参考我的另一篇<a href="https://scofieldsu.github.io/2017/05/08/%E7%8E%A9%E4%B8%80%E7%8E%A9docker/">玩一玩docker</a></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">1</span><br><span class="line">git clone https://github.com/jgraph/drawio.git</span><br><span class="line"></span><br><span class="line">2</span><br><span class="line">cd drawio</span><br><span class="line">docker build -t drawio -f etc/docker/Dockerfile .</span><br><span class="line"></span><br><span class="line">3</span><br><span class="line">docker run -d -p 8080:8080 --restart=always --hostname=drawio --name drawio drawio</span><br><span class="line"></span><br><span class="line">即可访问http://xxxx:8080/draw</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;作为一个程序员要画啥图？UML类图？时序图？流程图？系统架构图？&lt;br /&gt;
不仅仅如此，有时候我还会用思维导图记录一些东西&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大学时期画的一个类图😷&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/Scofi
      
    
    </summary>
    
      <category term="编程" scheme="http://Scofieldsu.github.io/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
  </entry>
  
  <entry>
    <title>关于黎曼猜想&amp;哥德巴赫猜想&amp;质数的神秘</title>
    <link href="http://Scofieldsu.github.io/2018/11/01/%E5%85%B3%E4%BA%8E%E9%BB%8E%E6%9B%BC%E7%8C%9C%E6%83%B3&amp;%E5%93%A5%E5%BE%B7%E5%B7%B4%E8%B5%AB%E7%8C%9C%E6%83%B3&amp;%E8%B4%A8%E6%95%B0%E7%9A%84%E7%A5%9E%E7%A7%98/"/>
    <id>http://Scofieldsu.github.io/2018/11/01/关于黎曼猜想&amp;哥德巴赫猜想&amp;质数的神秘/</id>
    <published>2018-10-31T17:00:29.000Z</published>
    <updated>2022-01-19T02:49:15.336Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">黎曼猜想</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="-code1-"><a class="markdownIt-Anchor" href="#-code1-"></a> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">哥德巴赫猜想</span><br><span class="line"></span><br><span class="line">任一大于2的偶数，都可表示成两个素数之和。</span><br><span class="line"></span><br></pre></td></tr></table></figure></h2><p>从欧拉乘积<br />到调和级数<br />再到黎曼函数。</p><p>为什么<br />当s=-1时，</p><p>当s=2时，</p><hr /><ul><li><p>欧式几何</p></li><li><p>罗氏几何</p></li><li><p>黎曼几何</p></li></ul> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">23条定义</span><br><span class="line">1. 点是没有部分的东西</span><br><span class="line">2.线只有长度而没有宽度</span><br><span class="line">3.一线的两端是点</span><br><span class="line">4.直线是它上面的点一样地平放着的线</span><br><span class="line">5.面只有长度和宽度</span><br><span class="line">6.面的边缘是线</span><br><span class="line">7.平面是它上面的线一样地平放着的面</span><br><span class="line">8. 平面角是在一平面内但不在一条直线上的两条相交线相互的倾斜度.</span><br><span class="line">9. 当包含角的两条线都是直线时，这个角叫做直线角.</span><br><span class="line">10. 当一条直线和另一条直线交成邻角彼此相等时，这些角每一个被叫做直角，而且称这一条直线垂直于另一条直线。</span><br><span class="line">11. 大于直角的角称为钝角。</span><br><span class="line">12. 小于直角的角称为锐角</span><br><span class="line">13. 边界是物体的边缘</span><br><span class="line">14. 图形是一个边界或者几个边界所围成的</span><br><span class="line">15. 圆：由一条线包围着的平面图形，其内有一点与这条线上任何一个点所连成的线段都相等。</span><br><span class="line">16. 这个点（指定义15中提到的那个点）叫做圆心。</span><br><span class="line">17. 圆的直径是任意一条经过圆心的直线在两个方向被圆截得的线段，且把圆二等分。</span><br><span class="line">18.半圆是直径与被它切割的圆弧所围成的图形，半圆的圆心与原圆心相同。（暂无注释）</span><br><span class="line">19.直线形是由直线围成的.三边形是由三条直线围成的,四边形是由四条直线围成的,多边形是由四条以上直线围成的.</span><br><span class="line">20.在三边形中,三条边相等的,叫做等边三角形;只有两条边相等的,叫做等腰三角形;各边不等的,叫做不等边三角形.</span><br><span class="line">21.此外,在三边形中,有一个角是直角的,叫做直角三角形;有一个角是钝角的,叫做钝角三角形;各边不等的,叫做不等边三角形.</span><br><span class="line">22.在四边形中,四边相等且四个角是直角的,叫做正方形;角是直角,但四边不全相等的,叫做长方形;四边相等,但角不是直角的,叫做菱形;对角相等且对边相等,但边不全相等且角不是直角的,叫做斜方形;其余的四边形叫做不规则四边形.</span><br><span class="line">23.平行直线是在同一个平面内向两端无限延长不能相交的直线.</span><br><span class="line">五条公理</span><br><span class="line">1.等于同量的量彼此相等；</span><br><span class="line">2.等量加等量，其和相等；</span><br><span class="line">3.等量减等量，其差相等；</span><br><span class="line">4.彼此能重合的物体是全等的；</span><br><span class="line">5.整体大于部分。</span><br><span class="line">五条公设　　</span><br><span class="line">1.过两点能作且只能作一直线；</span><br><span class="line">2.线段(有限直线)可以无限地延长；</span><br><span class="line">3.以任一点为圆心,任意长为半径,可作一圆；</span><br><span class="line">4.凡是直角都相等；</span><br><span class="line">5.同平面内一条直线和另外两条直线相交，若在直线同侧的两个内角之和小于180°，则这两条直线经无限延长后在这一侧一定相交。（近代数学不区分公设，公理，统一称为公理）</span><br><span class="line">最后一条公设就是著名的平行公设，或者叫做第五公设。它引发了几何史上最著名的长达两千多年的关于“平行线理论”的讨论，并最终诞生了非欧几何。值得注意的是，第五公设既不能说是正确也不能说是错误，它所概括的是一种情况。非欧几何则在推翻第五公设的前提下进行了另外情况的讨论。</span><br><span class="line">——以上选自《几何原本》 第一卷《几何基础》</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span c
      
    
    </summary>
    
      <category term="探索" scheme="http://Scofieldsu.github.io/categories/%E6%8E%A2%E7%B4%A2/"/>
    
    
  </entry>
  
  <entry>
    <title>感同身受的造梦空间</title>
    <link href="http://Scofieldsu.github.io/2018/10/23/%E6%84%9F%E5%90%8C%E8%BA%AB%E5%8F%97%E7%9A%84%E9%80%A0%E6%A2%A6%E7%A9%BA%E9%97%B4/"/>
    <id>http://Scofieldsu.github.io/2018/10/23/感同身受的造梦空间/</id>
    <published>2018-10-22T16:01:40.000Z</published>
    <updated>2022-01-17T07:04:40.578Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">把所有的懒于写作都归咎于那件事 --《我最好的朋友死了》。</span><br><span class="line"></span><br><span class="line">对曾经的我来说，写作是一件让我快乐的事情，不同于现在记笔记的快乐，</span><br><span class="line">笔记在于记录，写作在于创作。</span><br><span class="line">从某种意义上来说，写作也属于记录，记录你的思想和属于你的那一瞬间的灵感。</span><br><span class="line"></span><br><span class="line">大学的时候写过几万字的流水账随笔，那时很迷畅销文学读物，</span><br><span class="line">比如光线传媒刘同的《你的孤独虽败犹荣》，《谁的青春不迷茫》。</span><br><span class="line">那时候觉得他写的很多话都戳中我心里的相同的感受。</span><br><span class="line">也是从他书中了解到一本书的几十万字是从他长年累月的几百万字的写作中挑选出来的。</span><br><span class="line"></span><br><span class="line">我不写了，因为纠结和愤怒。</span><br><span class="line">我看辩论赛会觉得双方都对，自己说出的话会经常被自己从另一个方面切入的观点反驳，</span><br><span class="line">该如何把一些想表述的观点说清楚呢。</span><br><span class="line">显然能力不够的我连把一个观点阐述清楚都不能，索性不写。</span><br><span class="line">因为“最好的朋友死了”，我带着一种天然的愤怒，</span><br><span class="line">在看待一些事情时，已经先入为主的有了想法，</span><br><span class="line">有失公正，也索性不写，甚至不要发表任何观点，自带反驳自己的这种被动技能，</span><br><span class="line">再加上愤怒的不公正，会无限循环下去。</span><br><span class="line">一但发表不公正的观点，就会被自己抓到把柄进行反驳自己。</span><br><span class="line"></span><br><span class="line">只是不写而已，但火花还是会时不时的冒出来。该如何保存呢？文字有时是乏力的。</span><br><span class="line">虽然有时你听到一句歌词而感动，因为它写出了你的感受；</span><br><span class="line">有时候看一本小说而开心，因为它带给你前所未有的震撼的体验。</span><br><span class="line">但有时你也会因为与人沟通不合而头疼。</span><br><span class="line">每个人都有自己的沟通频率，但日常生活中的沟通不需要完全匹配。</span><br><span class="line">知己则是频率完全匹配的人。</span><br><span class="line"></span><br><span class="line">但我仍然觉得不够。我很贪婪，我希望有一种造梦的技能。</span><br><span class="line">我用这种技能生产一个个的梦，是我的不同感受。</span><br><span class="line">再让接受者直接身临其境的体验梦中的情景，亲身经历，感同身受。</span><br><span class="line">这不同于所谓的“意识交流”，如果意识交流真的普遍存在的话。</span><br><span class="line">这似乎比意识交流低级一点，</span><br><span class="line">需要一个中间产物（你用自身感受造出的梦）来传递，但能够完全保真。</span><br><span class="line"></span><br><span class="line">如果真有感同身受的造梦能力，是不是可以少一些沟通障碍，</span><br><span class="line">对于频率不匹配的人，你要清楚的描述一个东西，一个想法，立刻造一个梦给他。</span><br><span class="line">又或是洗澡时迸发出来的一个灵感，不用纸笔文字记录，造一个梦保存。</span><br><span class="line">这样你在看自己曾经的日记时就不会觉得幼稚了，因为日记只是文字记录，</span><br><span class="line">但如果当时保存了一个梦，你再次回顾时，是以那个年龄和经历去感同身受的。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;figure class=&quot;highlight python&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span clas
      
    
    </summary>
    
      <category term="写作" scheme="http://Scofieldsu.github.io/categories/%E5%86%99%E4%BD%9C/"/>
    
    
  </entry>
  
  <entry>
    <title>字节序的大小端模式-字节与基础类型的转换</title>
    <link href="http://Scofieldsu.github.io/2018/10/20/%E5%85%B3%E4%BA%8E%E5%AD%97%E8%8A%82%E5%BA%8F%E7%9A%84%E5%A4%A7%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F-%E5%AD%97%E8%8A%82%E4%B8%8E%E5%9F%BA%E7%A1%80%E7%B1%BB%E5%9E%8B%E7%9A%84%E8%BD%AC%E6%8D%A2/"/>
    <id>http://Scofieldsu.github.io/2018/10/20/关于字节序的大小端模式-字节与基础类型的转换/</id>
    <published>2018-10-19T18:13:45.000Z</published>
    <updated>2022-01-17T06:47:20.452Z</updated>
    
    <content type="html"><![CDATA[<ol><li><p>字节序 与 字节对齐</p></li><li><p>java基础类型与字节类型转换</p><ul><li><p>2.1 struct ==》 字节类型</p></li><li><p>2.2 基础类型  ==》 字节类型</p></li><li><p>2.3 字节类型  ==》 基础类型</p></li></ul></li><li><p>python使用ctypes调用c处理字节</p></li></ol><hr /><p>1.1  字节序</p><ul><li><p><strong>大端字节序(Big-Endian)</strong>：高位字节在内存的低地址，低位字节在内存的高地址，这是人类读写数值的方法。</p></li><li><p><strong>小端字节序(Little-Endian)</strong>：低位字节在内存的低地址，高位字节在内存的高地址，计算机的内部处理大部分是小端字节序。计算机电路先处理低位字节，效率比较高，因为计算都是从低位开始的。</p></li></ul>   <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">示例： 0x01234567</span><br><span class="line"></span><br><span class="line"> 大端模式：</span><br><span class="line">    地址： 0x0001    0x0002   0x0003   0x0004</span><br><span class="line">    数据： 01         23        45       67</span><br><span class="line"></span><br><span class="line"> 小端模式：</span><br><span class="line">    地址： 0x0001    0x0002   0x0003   0x0004</span><br><span class="line">    数据： 67         45        23       01</span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote><p>在C语言中，默认是小端（但在一些对于单片机的实现中却是基于大端，比如Keil 51C），Java是平台无关的，默认是大端。在网络上传输数据普遍采用的都是大端。</p></blockquote><p>1.2 字节对齐</p><blockquote><p>对于char型数据，其自身对齐值为1，对于short型为2，对于int,float类型，其自身对齐值为4，对于double型，其自身对齐值为8，单位字节。</p></blockquote><blockquote><p>需要字节对齐的根本原因在于CPU访问数据的效率问题.</p></blockquote><blockquote><p>gcc中结构体默认是4个字节对齐，即为32的倍数</p></blockquote><p>先看个简单的例子(32位，X86处理器，GCC编译器)：</p>  <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">A</span>&#123;</span></span><br><span class="line">    <span class="keyword">int</span>    a;</span><br><span class="line">    <span class="keyword">char</span>   b;</span><br><span class="line">    <span class="keyword">short</span>  c;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">B</span>&#123;</span></span><br><span class="line">    <span class="keyword">char</span>   b;</span><br><span class="line">    <span class="keyword">int</span>    a;</span><br><span class="line">    <span class="keyword">short</span>  c;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>结果是：sizeof(strcut A)值为8；sizeof(struct B)的值却是12。</p><p>结构体A中包含一个4字节的int数据，一个1字节char数据和一个2字节short数据；B也一样。按理说A和B大小应该都是7字节。之所以出现上述结果，就是因为编译器要对数据成员在空间上进行对齐。</p><p>对于标准数据类型，它的地址只要是它的长度的整数倍就行了，而非标准数据类型按下面的原则对齐：</p><ul><li><p>数组 ：按照基本数据类型对齐，第一个对齐了后面的自然也就对齐了。</p></li><li><p>联合 ：按其包含的长度最大的数据类型对齐。</p></li><li><p>结构体： 结构体中每个数据类型都要对齐。</p></li></ul><pre><code>__attribute((aligned (n)))，让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n，则按照最大成员的长度来对齐。__attribute__ ((packed))，取消结构在编译过程中的优化对齐，按照实际占用字节数进行对齐。</code></pre><hr /><p>2.1  java 使用struct的ByteBuffer转换为字节</p><h2 id="-code2-这里使用struct的无符号类型unsigned然后用bytebuffer获取对应位置的字节存储到byte-中-但对于需要动态生成struct的地方不太适合于是使用下面的方法依次获取数据的字节数组然后按照顺序连接为一个byte"><a class="markdownIt-Anchor" href="#-code2-这里使用struct的无符号类型unsigned然后用bytebuffer获取对应位置的字节存储到byte-中-但对于需要动态生成struct的地方不太适合于是使用下面的方法依次获取数据的字节数组然后按照顺序连接为一个byte"></a> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">  <span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DemoStruct</span> <span class="keyword">extends</span> <span class="title">Struct</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    Unsigned8 a = <span class="keyword">new</span> Unsigned8();</span><br><span class="line">    Unsigned16 b = <span class="keyword">new</span> Unsigned16();</span><br><span class="line">    Unsigned32 c = <span class="keyword">new</span> Unsigned32();</span><br><span class="line">    UTF8String d = <span class="keyword">new</span> UTF8String(<span class="number">12</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 取消优化对齐</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isPacked</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 设置为小端数据</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> ByteOrder <span class="title">byteOrder</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> ByteOrder.LITTLE_ENDIAN;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">byte</span>[] getBytes()&#123;</span><br><span class="line">        <span class="keyword">this</span>.isPacked();</span><br><span class="line">        ByteBuffer buff = <span class="keyword">this</span>.getByteBuffer();</span><br><span class="line">        buff.order(<span class="keyword">this</span>.byteOrder());</span><br><span class="line">        <span class="keyword">byte</span>[] bytes = <span class="keyword">new</span> <span class="keyword">byte</span>[buff.capacity()];</span><br><span class="line">        IntStream.range(<span class="number">0</span>, buff.capacity()).forEach(i -&gt; bytes[i] = buff.get(i));</span><br><span class="line">        <span class="comment">// Base64.getEncoder().encodeToString(bytes)</span></span><br><span class="line">        <span class="keyword">return</span> bytes;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><br />- 这里使用struct的无符号类型(unsigned)，然后用ByteBuffer获取对应位置的字节，存储到byte[] 中。<br />- 但对于需要动态生成struct的地方不太适合，于是使用下面的方法依次获取数据的字节数组，然后按照顺序连接为一个byte[]。</h2><p>2.2  基础类型 转换 byte[]</p><ul><li>String 转换byte[]，可以使用String的getBytes()</li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">byte</span>[] getStringBytes(String data,<span class="keyword">int</span> length)&#123;</span><br><span class="line">    <span class="keyword">byte</span>[] bytes = <span class="keyword">new</span> <span class="keyword">byte</span>[length];</span><br><span class="line">    <span class="keyword">byte</span>[] srcByte = data.getBytes();</span><br><span class="line">    byteCopy(srcByte,bytes);</span><br><span class="line">    <span class="keyword">return</span> bytes;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>对于其他没有getBytes()方法的基本数据类型，例如：大端序 int转换byte[]</li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">byte</span>[] getIntBytes(<span class="keyword">int</span> data) &#123;</span><br><span class="line">ByteBuffer buffer = ByteBuffer.allocate(<span class="number">4</span>);</span><br><span class="line">buffer.order(ByteOrder.BIG_ENDIAN);</span><br><span class="line">buffer.putInt(data);</span><br><span class="line"><span class="keyword">byte</span>[] bytes = buffer.array();</span><br><span class="line"><span class="keyword">return</span> bytes;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li>java文档中java.nio.ByteBuffer 有putInt,putChar,putShort,putFloat,putDouble,putLong等方法，但在使用过程中遇到问题:</li></ul><blockquote><p>对于定义的unsigned32的数据，需要获取4个字节的byte[]. unsigned32最大值(2^32)-1 =4294967295大于int的取值范围(-(2^31 ),(2^31 )-1)，于是转换为Long使用putLong.但putLong默认写入8个byte. 当ByteBuffer.allocate(4)，再putLong时报错 buffer overflow exception。</p></blockquote><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">abstract</span> ByteBuffer <span class="title">putLong</span><span class="params">(<span class="keyword">long</span> value)</span></span></span><br><span class="line"><span class="function">Relative put method <span class="keyword">for</span> writing a <span class="keyword">long</span> <span class="title">value</span>  <span class="params">(optional operation)</span>.</span></span><br><span class="line"><span class="function">Writes eight bytes containing the given <span class="keyword">long</span> value, in the current <span class="keyword">byte</span> order,</span></span><br><span class="line"><span class="function">into <span class="keyword">this</span> buffer at the current position, and then increments the position by eight.</span></span><br><span class="line"><span class="function"></span></span><br><span class="line"><span class="function">Parameters:</span></span><br><span class="line"><span class="function">value - The <span class="keyword">long</span> value to be written</span></span><br><span class="line"><span class="function">Returns:</span></span><br><span class="line"><span class="function">This buffer</span></span><br><span class="line"><span class="function">Throws:</span></span><br><span class="line"><span class="function">BufferOverflowException - If there are fewer than eight bytes remaining in <span class="keyword">this</span> buffer</span></span><br><span class="line"><span class="function">ReadOnlyBufferException - If <span class="keyword">this</span> buffer is read-only</span></span><br></pre></td></tr></table></figure><p>于是采用二进制移位运算：</p><h2 id="-code6-"><a class="markdownIt-Anchor" href="#-code6-"></a> <figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 小端序</span></span><br><span class="line"><span class="comment">//内存的低地址 存储 数据的低位字节</span></span><br><span class="line"><span class="comment">// 则bytes[0] 存储 data &amp; (1111 1111)</span></span><br><span class="line"><span class="comment">// bytes[1]  存储  data 右移8位 再 &amp;1111 1111</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">byte</span>[] getLongBytesBig(<span class="keyword">long</span> data,<span class="keyword">int</span> length) &#123;</span><br><span class="line">   <span class="comment">// 设置length=4</span></span><br><span class="line">    <span class="keyword">byte</span>[] bytes = <span class="keyword">new</span> <span class="keyword">byte</span>[length];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; length; i++) &#123;</span><br><span class="line">        bytes[i] = (<span class="keyword">byte</span>) ((data &gt;&gt; (i*<span class="number">8</span>)) &amp; <span class="number">0xff</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> bytes;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//大端序</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">byte</span>[] getLongBytesLittle(<span class="keyword">long</span> data,<span class="keyword">int</span> length) &#123;</span><br><span class="line">   <span class="comment">// 设置length=4</span></span><br><span class="line">    <span class="keyword">byte</span>[] bytes = <span class="keyword">new</span> <span class="keyword">byte</span>[length];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; length; i++) &#123;</span><br><span class="line">        bytes[i] = (<span class="keyword">byte</span>) ((data &gt;&gt; ((length-<span class="number">1</span>-i)*<span class="number">8</span>)) &amp; <span class="number">0xff</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> bytes;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure></h2><p>2.3  字节流 转换java 基本数据类型</p><p>2.3.1  使用ByteBuffer自带的方法</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">getInt</span><span class="params">(<span class="keyword">byte</span>[] bytes)</span> </span>&#123;</span><br><span class="line">ByteBuffer buffer = ByteBuffer.allocate(bytes.length);</span><br><span class="line">buffer.order(ByteOrder.BIG_ENDIAN);</span><br><span class="line">buffer.put(bytes);</span><br><span class="line"><span class="keyword">int</span> result = buffer.getInt(<span class="number">0</span>);</span><br><span class="line"><span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>2.3.2 移位运算</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">getInt</span><span class="params">(<span class="keyword">byte</span>[] bytes)</span> </span>&#123;</span><br><span class="line"><span class="keyword">int</span> result = (<span class="keyword">int</span>) ((<span class="number">0xff</span> &amp; bytes[<span class="number">0</span>])</span><br><span class="line">| ((<span class="number">0xff</span> &amp; bytes[<span class="number">1</span>]) &lt;&lt; <span class="number">8</span>)</span><br><span class="line">| ((<span class="number">0xff</span> &amp; bytes[<span class="number">2</span>]) &lt;&lt; <span class="number">16</span>)</span><br><span class="line">| ((<span class="number">0xff</span> &amp; bytes[<span class="number">3</span>]) &lt;&lt; <span class="number">24</span>));</span><br><span class="line"><span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr /><ol start="3"><li>python 使用ctypes 调用c 处理字节</li></ol><ul><li>demodata.c</li></ul><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdint.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> __<span class="title">attribute__</span>((<span class="title">packed</span>)) <span class="title">DemoData</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">  <span class="keyword">uint8_t</span> a;        </span><br><span class="line"><span class="keyword">uint16_t</span> b;    </span><br><span class="line"><span class="keyword">uint32_t</span> c;      </span><br><span class="line"><span class="keyword">char</span> d[<span class="number">12</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">char</span> * <span class="title">get_data</span><span class="params">(<span class="keyword">int</span> int_param[<span class="number">3</span>],<span class="keyword">char</span> * str_param[<span class="number">1</span>])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">char</span> * data_result;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">DemoData</span> *<span class="title">t</span> =</span> (struct DemoData*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(struct DemoData));</span><br><span class="line">bzero(t, <span class="keyword">sizeof</span>(struct DemoData));</span><br><span class="line"></span><br><span class="line"><span class="comment">//init</span></span><br><span class="line">t-&gt;a = int_param[<span class="number">0</span>];</span><br><span class="line">t-&gt;b = int_param[<span class="number">1</span>];</span><br><span class="line">t-&gt;c = int_param[<span class="number">2</span>];</span><br><span class="line"><span class="built_in">strncpy</span>(t-&gt;d, str_param[<span class="number">0</span>],<span class="number">12</span>);</span><br><span class="line"><span class="keyword">unsigned</span> <span class="keyword">char</span> bindata[<span class="number">4096</span>];</span><br><span class="line"><span class="keyword">char</span> base64[<span class="number">4096</span>];</span><br><span class="line"><span class="built_in">memcpy</span>(bindata, t, <span class="keyword">sizeof</span>(struct DemoData));</span><br><span class="line"><span class="keyword">return</span> bindata;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">freeme</span><span class="params">(<span class="keyword">char</span> *ptr)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">free</span>(ptr);</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在linux上编译，gcc -shared -Wl,-soname,demodata -o <a href="http://demodata.so">demodata.so</a> -fPIC demodata.c</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># coding=utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> ctypes <span class="keyword">import</span> *</span><br><span class="line">demo = CDLL(<span class="string">&#x27;./demodata.so&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取base64</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_data</span>(<span class="params">demo</span>):</span></span><br><span class="line">    <span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">      int_param：</span></span><br><span class="line"><span class="string">      0   a</span></span><br><span class="line"><span class="string">    1   b</span></span><br><span class="line"><span class="string">    2   c</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">      str_param:</span></span><br><span class="line"><span class="string">      0  d  12</span></span><br><span class="line"><span class="string">    &#x27;&#x27;&#x27;</span></span><br><span class="line">    INT_PARAMS = c_int*<span class="number">3</span></span><br><span class="line">    STR_PARAMS = c_char_p*<span class="number">1</span></span><br><span class="line">    int_param = INT_PARAMS(<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>)</span><br><span class="line">    str_param = STR_PARAMS(<span class="string">&quot;demo&quot;</span>)</span><br><span class="line">    demo.freeme.argtypes = c_void_p,</span><br><span class="line">    demo.freeme.restype = <span class="literal">None</span></span><br><span class="line">    demo.get_data.restype = c_char_p</span><br><span class="line">    result = demo.get_data(int_param,str_param)</span><br><span class="line">    <span class="built_in">print</span> result</span><br><span class="line">    <span class="keyword">return</span> result</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;ol&gt;
&lt;li&gt;
&lt;p&gt;字节序 与 字节对齐&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;java基础类型与字节类型转换&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;2.1 struct ==》 字节类型&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2.2 基础类型  ==》 字节类型&lt;/p&gt;
&lt;/li
      
    
    </summary>
    
      <category term="编程" scheme="http://Scofieldsu.github.io/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="字节序" scheme="http://Scofieldsu.github.io/tags/%E5%AD%97%E8%8A%82%E5%BA%8F/"/>
    
  </entry>
  
  <entry>
    <title>我们仍未知道那天所看见的花的名字(未闻花名)</title>
    <link href="http://Scofieldsu.github.io/2018/10/10/%E6%88%91%E4%BB%AC%E4%BB%8D%E6%9C%AA%E7%9F%A5%E9%81%93%E9%82%A3%E5%A4%A9%E6%89%80%E7%9C%8B%E8%A7%81%E7%9A%84%E8%8A%B1%E7%9A%84%E5%90%8D%E5%AD%97(%E6%9C%AA%E9%97%BB%E8%8A%B1%E5%90%8D)/"/>
    <id>http://Scofieldsu.github.io/2018/10/10/我们仍未知道那天所看见的花的名字(未闻花名)/</id>
    <published>2018-10-10T13:44:23.000Z</published>
    <updated>2022-01-17T05:43:27.594Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line">Secret Base ~君がくれたもの~（秘密基地~你给的东西~）</span><br><span class="line"></span><br><span class="line">  --动漫《我们仍未知道那天所看见的花的名字》ED</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">  君と夏の終わり 将来の夢</span><br><span class="line">  这个与你共度的夏天完结 将来的梦想</span><br><span class="line"></span><br><span class="line">  大きな希望 忘れない</span><br><span class="line">  满满的希望 我永远难忘</span><br><span class="line"></span><br><span class="line">  10年後の8月 また出会えるのを 信じて</span><br><span class="line">  十年后的八月 请相信我们一定能再见</span><br><span class="line"></span><br><span class="line">  最高の思い出を…</span><br><span class="line">  将这最美好的回忆追念</span><br><span class="line"></span><br><span class="line">  出会いは ふっとした 瞬間</span><br><span class="line">  初次邂逅 是个不经意的瞬间</span><br><span class="line"></span><br><span class="line">  帰り道の交差点で</span><br><span class="line">  在放学归途的十字路边</span><br><span class="line"></span><br><span class="line">  声をかけてくれたね 「一緒に帰ろう」</span><br><span class="line">  听见你的一声「一起回家吧」</span><br><span class="line"></span><br><span class="line">  僕は 照れくさそうに カバンで顔を隠しながら</span><br><span class="line">  我害羞得手忙脚乱 把脸藏在书包后面</span><br><span class="line"></span><br><span class="line">  本当は とても とても 嬉しかったよ</span><br><span class="line">  其实心理 从未如此雀跃欣欢</span><br><span class="line"></span><br><span class="line">  あぁ 花火が夜空 きれいに咲いて ちょっとセツナク</span><br><span class="line">  啊 烟花在夜空绽放 几许感伤</span><br><span class="line"></span><br><span class="line">  あぁ 風が時間とともに 流れる</span><br><span class="line">  啊 时间像风儿一样 静静流淌</span><br><span class="line"></span><br><span class="line">  嬉しくって 楽しくって 冒険も いろいろしたね</span><br><span class="line">  多少开心的相伴 多少欢快的冒险</span><br><span class="line"></span><br><span class="line">  二人の 秘密の 基地の中</span><br><span class="line">  都在属于你我的 秘密的基地乐园</span><br><span class="line"></span><br><span class="line">  君と夏の終わり 将来の夢</span><br><span class="line">  这个与你共度的夏天完结 将来的梦想</span><br><span class="line"></span><br><span class="line">  大きな希望 忘れない</span><br><span class="line">  满满的希望 我永远难忘</span><br><span class="line"></span><br><span class="line">  10年後の8月 また出会えるのを 信じて</span><br><span class="line">  十年后的八月 请相信我们一定能再见</span><br><span class="line"></span><br><span class="line">  君が最後まで 心から 「ありがとう」叫んでいたこと 知っていたよ</span><br><span class="line">  我知道 直到最后 你都由衷地在心底喊着「谢谢」</span><br><span class="line"></span><br><span class="line">  涙をこらえて 笑顔でさようなら せつないよね</span><br><span class="line">  强忍着泪滴 微笑着告别 多么伤心</span><br><span class="line"></span><br><span class="line">  最高の思い出を…</span><br><span class="line">  这是我们最美好的回忆</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;figure class=&quot;highlight plaintext&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span c
      
    
    </summary>
    
      <category term="分享" scheme="http://Scofieldsu.github.io/categories/%E5%88%86%E4%BA%AB/"/>
    
    
      <category term="诗词文章" scheme="http://Scofieldsu.github.io/tags/%E8%AF%97%E8%AF%8D%E6%96%87%E7%AB%A0/"/>
    
  </entry>
  
  <entry>
    <title>装机App备忘</title>
    <link href="http://Scofieldsu.github.io/2018/09/08/%E8%A3%85%E6%9C%BAApp%E5%A4%87%E5%BF%98/"/>
    <id>http://Scofieldsu.github.io/2018/09/08/装机App备忘/</id>
    <published>2018-09-08T13:13:45.000Z</published>
    <updated>2022-01-19T02:52:53.275Z</updated>
    
    <content type="html"><![CDATA[<p>windows系统重装之后整理需要安装软件和环境：</p><ol><li>环境</li></ol><ul><li><p>python2.7  目前暂不用virtualenv管理多版本python环境，安装python2.7时勾选add to path省去配置环境变量过程。</p></li><li><p>java1.8    下载jdk安装后，配置环境变量</p></li></ul>  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">JAVA_HOME = C:\Program Files\Java\jdk1.8.0_91  #实际路径</span><br><span class="line">PATH = %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;</span><br><span class="line">CLASSPATH = .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;</span><br></pre></td></tr></table></figure><ul><li><p>nodejs 安装时默认勾选add to path</p></li><li><p>git</p></li></ul><ol start="2"><li><p>代码器</p><ul><li>IDEA，Pycharm，notepad++，Atom</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">atom 插件列表：</span><br><span class="line">主题：atom-monkai</span><br><span class="line">扩展：</span><br><span class="line">active-power-mode</span><br><span class="line">markdown-preview-plus</span><br><span class="line">platformio-ide-terminal</span><br><span class="line">simplified-chinese-menu</span><br><span class="line">file-icons</span><br><span class="line">edit-background</span><br></pre></td></tr></table></figure></li><li><p>其他工具</p></li></ol><h2 id="-code2-"><a class="markdownIt-Anchor" href="#-code2-"></a> <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">- heidiSQL （数据库客户端）</span><br><span class="line"></span><br><span class="line">- mobaXterm （终端工具）</span><br><span class="line"></span><br><span class="line">- PDman （数据库建模工具）</span><br></pre></td></tr></table></figure></h2><ol start="4"><li>mac app推荐</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">- Termius  （ssh client）</span><br><span class="line"></span><br><span class="line">- Viper FTP （sftp client）</span><br><span class="line"></span><br><span class="line">- PAW （http client）</span><br><span class="line"></span><br><span class="line">- postico （postgresql client）</span><br><span class="line"></span><br><span class="line">- tickeys （键盘音效）</span><br><span class="line"></span><br><span class="line">- LiceCap （gif tool）</span><br><span class="line"></span><br><span class="line">- snip （截图）</span><br><span class="line"></span><br><span class="line">- pap.er (壁纸)</span><br></pre></td></tr></table></figure><ol start="5"><li>chrome插件推荐</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">- Tampermonkey（脚本扩展）</span><br><span class="line"></span><br><span class="line">- fireshot （截图）</span><br><span class="line"></span><br><span class="line">- xPath finder， chropath  （xpath选择器）</span><br><span class="line"></span><br><span class="line">- octotree （github代码在线树状结构）</span><br><span class="line"></span><br><span class="line">- onetab （tab收集器）</span><br></pre></td></tr></table></figure><ol start="6"><li>一些好玩的</li></ol> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">- 在线协作画板  https://witeboard.com/</span><br><span class="line"></span><br></pre></td></tr></table></figure><hr />]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;windows系统重装之后整理需要安装软件和环境：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;环境&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;python2.7  目前暂不用virtualenv管理多版本python环境，安装python2.7时勾选add to path省去配置环境
      
    
    </summary>
    
      <category term="编程" scheme="http://Scofieldsu.github.io/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="Python" scheme="http://Scofieldsu.github.io/tags/Python/"/>
    
      <category term="工具" scheme="http://Scofieldsu.github.io/tags/%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>关于特斯拉线圈</title>
    <link href="http://Scofieldsu.github.io/2018/09/02/%E5%85%B3%E4%BA%8E%E7%89%B9%E6%96%AF%E6%8B%89%E7%BA%BF%E5%9C%88/"/>
    <id>http://Scofieldsu.github.io/2018/09/02/关于特斯拉线圈/</id>
    <published>2018-09-02T15:08:58.000Z</published>
    <updated>2022-01-19T02:49:04.886Z</updated>
    
    <summary type="html">
    
    </summary>
    
      <category term="探索" scheme="http://Scofieldsu.github.io/categories/%E6%8E%A2%E7%B4%A2/"/>
    
    
  </entry>
  
  <entry>
    <title>初试 Selenium</title>
    <link href="http://Scofieldsu.github.io/2018/05/09/%E5%88%9D%E8%AF%95Selenium/"/>
    <id>http://Scofieldsu.github.io/2018/05/09/初试Selenium/</id>
    <published>2018-05-09T12:47:23.000Z</published>
    <updated>2022-01-18T18:22:00.849Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Selenium是一个开源的和便携式的自动化软件测试工具，</span><br><span class="line">用于测试Web应用程序有能力在不同的浏览器和操作系统运行。</span><br><span class="line">Selenium真的不是一个单一的工具，而是一套工具，</span><br><span class="line">帮助测试者更有效地基于Web的应用程序的自动化。</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id=""><a class="markdownIt-Anchor" href="#"></a> </h2>]]></content>
    
    <summary type="html">
    
      
      
        &lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class
      
    
    </summary>
    
      <category term="编程" scheme="http://Scofieldsu.github.io/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="Selenium" scheme="http://Scofieldsu.github.io/tags/Selenium/"/>
    
      <category term="自动化" scheme="http://Scofieldsu.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>醒来啊，麦克白</title>
    <link href="http://Scofieldsu.github.io/2018/05/08/%E9%86%92%E6%9D%A5%E5%95%8A%EF%BC%8C%E9%BA%A6%E5%85%8B%E7%99%BD/"/>
    <id>http://Scofieldsu.github.io/2018/05/08/醒来啊，麦克白/</id>
    <published>2018-05-08T15:02:10.000Z</published>
    <updated>2022-01-17T06:08:45.463Z</updated>
    
    <content type="html"><![CDATA[<h2 id="有幸在见字如面中看到王耀庆和张国立-来朗读-这两封信大赞"><a class="markdownIt-Anchor" href="#有幸在见字如面中看到王耀庆和张国立-来朗读-这两封信大赞"></a> 有幸在《见字如面》中看到王耀庆和张国立 来朗读 这两封信，大赞。</h2><h2 id="-code0-"><a class="markdownIt-Anchor" href="#-code0-"></a> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">家宝公：</span><br><span class="line">     来信收到。我们从故乡回京刚十天，过一周左右又得去香港两个月，约莫６月间才能转得来。</span><br><span class="line">     事情倒不俗，只可惜空耗了时光。</span><br><span class="line"></span><br><span class="line">     奉上拙诗一首，是类乎劳改的那三年的第一年写的。</span><br><span class="line">     诗刊朋友向我要近作，而目下毫无诗意抒发，将信将疑从匣中取出这首给他看，却说好。</span><br><span class="line">     人受称赞总是高兴。但这诗不是好，是公开的私事满足了人的好奇心而已。</span><br><span class="line">     不过我老婆是衷心快意的，等于手臂上刺着牢不可破的对她的忠贞，</span><br><span class="line">     让所有的朋友了解我当了36年的俘虏的确是心甘情愿。</span><br><span class="line">     歌颂老婆的诗我大概可以出一个厚厚的集子了，只可惜世界上还没有这么一个经得起肉麻的出版社。</span><br><span class="line">     说老实话，真正地道的情诗、情书、情话，怎么能见得人？</span><br><span class="line">     伟大的鲁迅特精熟此道，说是“两地书”，买的人图希奇，打开看来却都是正儿八经，缺乏爱情的香馥之感。</span><br><span class="line">     全世界若认真出点这种东西，且规定人人必读的话，公安局当会省掉许多麻烦，人到底太少接触纯真的感情了。</span><br><span class="line"></span><br><span class="line">     曹公曹公！你的书法照麻衣神相看，气势雄强，间架缜密，且肯定是个长寿的老头，所以你还应该工作。</span><br><span class="line">     工作，这两个字几十年来被污染成为低级的习俗。</span><br><span class="line">     在你的生涯中，工作是充满实实在在的光耀，别去理那些琐碎人情、小敲小打吧！</span><br><span class="line">     在你，应该：“全或无”；应该：“良工不示人以朴”。</span><br><span class="line">     像伯纳·萧，像伏尔泰那样，到老还那么精确，那么不饶点滴，不饶自己。</span><br><span class="line"></span><br><span class="line">     在纽约，我在阿瑟·米勒家住过几天，他刚写一个新戏：《美国时间》，</span><br><span class="line">     我跟他上拍练场去看他边拍边改剧本，那种活跃，那种严肃，简直像鸡汤那么养人。</span><br><span class="line">     他和他老婆，一位了不起的摄影家，轮流开车走很远的公路回到家里，然后一起在他们的森林中伐木，斫成劈柴，</span><br><span class="line">     米勒开拖拉机把我们跟劈柴一起拉回来。两三吨的柴啊！</span><br><span class="line">     我们坐在米勒自己做的木凳饭桌边吃饭。我觉得他全身心的细胞都在活跃，因此，他的戏不管成败，都充满生命力。</span><br><span class="line">     你说怪不怪；那时我想到你，挂念你，如果写成台词，那就是：“我们也有个曹禺！”</span><br><span class="line">     但我的潜台词却是你多么需要他那点草莽精神。</span><br><span class="line">     你是我的极尊敬的前辈，所以我对你要严！我不喜欢你解放后的戏。一个也不喜欢。</span><br><span class="line">     你心不在戏里，你失去伟大的灵通宝玉，你为势位所误！</span><br><span class="line">     从一个海洋萎缩为一条小溪流，你泥溷在不情愿的艺术创作中，像晚上喝了浓茶清醒于混沌之中。</span><br><span class="line">     命题不巩固，不缜密，演绎、分析得也不透彻。</span><br><span class="line">     过去数不尽的精妙的休止符、节拍、冷热、快慢的安排，那一箩一筐的隽语都消失了。</span><br><span class="line">     谁也说不好。总是“高！”“好！”这些称颂虽迷惑不了你，但混乱了你，作践了你。</span><br><span class="line">     写到这里，不禁想起莎翁《马克白》中的一句话：“醒来啊马克白，把沉睡赶走！”</span><br><span class="line"></span><br><span class="line">     你知道，我爱祖国，所以爱你。你是我那一时代现实极了的高山，我不对你说老实话，就不配你给予我的友谊。</span><br><span class="line">     如果能使你再写出20个剧本需要出点力气的话，你差遣就是！</span><br><span class="line">     艾侣霞有两句诗，诗曰：“心在树上，你摘就是！”信，快写完了，回头一看，好像在毁谤你，有点不安了。</span><br><span class="line">     放两天，想想看该不该寄上给你。</span><br><span class="line">     祝你和夫人一切都好！</span><br><span class="line"></span><br><span class="line">                                                                    晚 黄永玉谨上</span><br><span class="line">                                                                         3月2日</span><br><span class="line"></span><br><span class="line">     我还想到，有一天为你的新作设计舞台。</span><br><span class="line">                                                                        永玉又及</span><br><span class="line">     我还想贡献给你一些杂七杂八的故事，看能不能弄出点什么来！</span><br><span class="line">                                                                        永玉又及</span><br><span class="line"></span><br></pre></td></tr></table></figure></h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">永玉大师：  </span><br><span class="line">       收到你的信。好像一个一无所有的穷人，突然从神女手里，得到不可数量的珍宝。</span><br><span class="line">       我反复地看，唤出我的妻女一同看，一块儿惊奇上天会毫无预感地给了我这样丰满、美好、深挚、诚厚的感情。</span><br><span class="line">       我的确没有想到，你会写给我这样一封长信。</span><br><span class="line">       你鼓励了我，你指责我近三十余年的空洞，“泥溷[hùn]在不情愿的艺术创作中”。</span><br><span class="line">       这句话射中了要害，我浪费了成熟的中年，到了今日这个年纪，才开始明白。</span><br><span class="line">       你提到我那几年的剧本，“命题不巩固、不缜密，演释、分析得也不透彻”。</span><br><span class="line">       是你这样理解心灵的大艺术家，才说得这样准确，这样精到。</span><br><span class="line">       我现在正在写一个剧本，它还泥陷于几十年的旧烂坑里，写得太实也陈腐，</span><br><span class="line">       仿佛只知沿着老道跋涉，不知回头是岸，岸上有多少新鲜的大路可走。你叫我：“醒来啊，把沉睡赶走！”</span><br><span class="line">       我一定！但我仍在矇眬半醒中，心里又很清楚我迷了路。但愿迷途未远，我还有时间能追回已逝的光阴。</span><br><span class="line">       天下没有比到了暮年才发现走了太多的弯道更痛心的了。</span><br><span class="line">       然而，指出来了就明白了，便也宽了心，觉得还有一段长路要赶，只有振作起来，</span><br><span class="line">       再写多少年，报答你和许多真诚的朋友对我指点的恩德。</span><br><span class="line">       永玉，你是一个突出的朋友，我们相慕甚久，但真见面谈心，不过两次。</span><br><span class="line">       我能得你这般坦率、真诚的言语是我的幸福，更使我快乐的是，</span><br><span class="line">       我竟然在如此仓促的机遇中，得到你这样真诚见人的友人。</span><br><span class="line">       你说我需要阿瑟•密勒的草莽精神，你说得对。他坚实，沉肃，亲切，</span><br><span class="line">       又在他深厚的文化修养中又时时透出一种倔强，不失在尘俗中屈服的豪迈气概。</span><br><span class="line">       我时常觉得我顾虑太多，又难抛去，这已成了痼习。</span><br><span class="line">       但是如果不下决心改变，所谓自小溪再汇为沧海是不可能的。</span><br><span class="line">       你像个火山，正在突突喷出白热的火岩。我在你身边，是不会变冷的。</span><br><span class="line">       你说要写二十个剧本，如果我真像你举出的那种巨人，我是会如数写出的。</span><br><span class="line">       不过，有你在身旁督促我，经常提醒我，我将如你所说“不饶点滴，不饶自己”。</span><br><span class="line">       你的画，世间有多少人在颂扬，用各种语言来赞美，我再添什么是多余的。</span><br><span class="line">       我更敬重的、我更喜欢的是你的人性，你的为人，你的聪敏才智、幽默感，你的艺术与文章是少见的。</span><br><span class="line">       但真使我惊服的，是你经过多少年来的磨难与世俗的试探，你保持下你的纯朴与直率。我终将有所求于你的。</span><br><span class="line">       你的长信已经一页一页端正地放在照相簿里。现在我可以随时翻。</span><br><span class="line">       在我疲乏时，在我偶尔失去信心时，我将在你的信里看见了火辣辣的词句，</span><br><span class="line">       它将促我拿起笔再写下去。在我想入歪道，又进入魔道，“为势位所误”时，我将清醒再写下去！</span><br><span class="line">       请问候你的夫人，感谢你，我的朋友。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">                                                                            曹禺</span><br><span class="line">                                                                 一九八三年四月二日</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;有幸在见字如面中看到王耀庆和张国立-来朗读-这两封信大赞&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#有幸在见字如面中看到王耀庆和张国立-来朗读-这两封信大赞&quot;&gt;&lt;/a&gt; 有幸在《见字如面》中看到王耀庆和张国立 来朗读 这两封信，大赞
      
    
    </summary>
    
      <category term="分享" scheme="http://Scofieldsu.github.io/categories/%E5%88%86%E4%BA%AB/"/>
    
    
      <category term="诗词文章" scheme="http://Scofieldsu.github.io/tags/%E8%AF%97%E8%AF%8D%E6%96%87%E7%AB%A0/"/>
    
  </entry>
  
  <entry>
    <title>初试 Locust</title>
    <link href="http://Scofieldsu.github.io/2018/04/08/%E5%88%9D%E8%AF%95Locust/"/>
    <id>http://Scofieldsu.github.io/2018/04/08/初试Locust/</id>
    <published>2018-04-08T12:47:23.000Z</published>
    <updated>2022-01-18T18:21:57.337Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Locust是开源、使用Python开发、基于事件、支持分布式</span><br><span class="line">并且提供Web UI进行测试执行和结果展示的性能测试工具。</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;figure class=&quot;highlight shell&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class
      
    
    </summary>
    
      <category term="编程" scheme="http://Scofieldsu.github.io/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="Python" scheme="http://Scofieldsu.github.io/tags/Python/"/>
    
      <category term="Locust" scheme="http://Scofieldsu.github.io/tags/Locust/"/>
    
      <category term="性能测试" scheme="http://Scofieldsu.github.io/tags/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/"/>
    
  </entry>
  
  <entry>
    <title>linux命令&amp;shell使用</title>
    <link href="http://Scofieldsu.github.io/2017/12/18/linux%E5%91%BD%E4%BB%A4&amp;shell%E4%BD%BF%E7%94%A8/"/>
    <id>http://Scofieldsu.github.io/2017/12/18/linux命令&amp;shell使用/</id>
    <published>2017-12-18T12:13:45.000Z</published>
    <updated>2022-01-17T07:04:25.025Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-nohup-no-hang-up"><a class="markdownIt-Anchor" href="#1-nohup-no-hang-up"></a> 1. nohup （no hang up）</h2><ul><li>当你在运行一个进程，想要让其后台运行，不占用当前终端，关闭终端或者合上电脑或者退出账号时程序仍然在运行。nohup 了解一下。</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">nohup java -jar -server -Xms512m a.jar abc &gt;&gt; logs/nohup.log 2&gt;&amp;1 &amp;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">---命令详解</span><br><span class="line">(1) 执行jar包，可以带上你需要的启动参数，例如以server模式运行，初始堆大小512m -server -Xms512m</span><br><span class="line">(2) abc 为主程序接收的参数</span><br><span class="line">(3)  &gt;&gt; logs/nohup.log  </span><br><span class="line">      其中&gt;&gt;表示追加，如果改为 &gt; 则每次启动都会覆盖原log文件。</span><br><span class="line">      指定到特定路径下的文件，如果不指定，则默认输出到当前目录的nohup.out</span><br><span class="line">(4) 2&gt;&amp;1 将错误信息重定向到标准输出</span><br><span class="line">(5) &amp; 作业被提交到后台运行，当前控制台没有被占用</span><br><span class="line"></span><br><span class="line">---其他相关</span><br><span class="line">(1) 执行python程序时需要加上-u参数（不使用python print 的缓冲）把print的内容输出到文件。</span><br><span class="line">    例如： nohup python -u run.py &gt;&gt; logs/nohup.log 2&gt;&amp;1 &amp;</span><br><span class="line"></span><br><span class="line">(2) 可以使用jobs -l  查看当前 shell 终端的后台运行任务进程信息,根据进程pid 进行kill来退出任务。</span><br><span class="line">(3) fg %n ,置为前端运行,然后ctrl + c 退出任务。其中%n 为job id</span><br><span class="line">(4) bg %n 让进程n到后台运行</span><br><span class="line">(5) 文件很大的话，nohup.out就会不停的增大，可以利用Linux下一个特殊的文件/dev/null来解决这个问题，</span><br><span class="line">    这个文件就相当于一个黑洞,任何输出到这个文件的东西都将消失</span><br><span class="line">      只保留输出错误信息 nohup command &gt;/dev/null 2&gt;log &amp;</span><br><span class="line">      所有信息都不要 nohup command &gt;/dev/null 2&gt;&amp;1 &amp;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="2-awk-和xargs"><a class="markdownIt-Anchor" href="#2-awk-和xargs"></a> 2. awk 和xargs</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;1-nohup-no-hang-up&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#1-nohup-no-hang-up&quot;&gt;&lt;/a&gt; 1. nohup （no hang up）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;当你在运行一个进程，想要让其后
      
    
    </summary>
    
      <category term="编程" scheme="http://Scofieldsu.github.io/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
      <category term="Linux" scheme="http://Scofieldsu.github.io/tags/Linux/"/>
    
      <category term="Shell" scheme="http://Scofieldsu.github.io/tags/Shell/"/>
    
  </entry>
  
  <entry>
    <title>设备MAC地址随机化与WiFi探针</title>
    <link href="http://Scofieldsu.github.io/2017/12/15/%E8%AE%BE%E5%A4%87MAC%E5%9C%B0%E5%9D%80%E9%9A%8F%E6%9C%BA%E5%8C%96%E4%B8%8EWiFi%E6%8E%A2%E9%92%88/"/>
    <id>http://Scofieldsu.github.io/2017/12/15/设备MAC地址随机化与WiFi探针/</id>
    <published>2017-12-15T12:47:23.000Z</published>
    <updated>2022-01-19T02:53:03.689Z</updated>
    
    <content type="html"><![CDATA[<h1 id="关于mac-地址media-access-control-address"><a class="markdownIt-Anchor" href="#关于mac-地址media-access-control-address"></a> 关于MAC 地址（Media Access Control Address）</h1><hr /><h2 id="1-mac地址共48位6个字节以十六进制表示-前24位由ieee决定如何分配后24位由实际生产该网络设备的厂商自行指定"><a class="markdownIt-Anchor" href="#1-mac地址共48位6个字节以十六进制表示-前24位由ieee决定如何分配后24位由实际生产该网络设备的厂商自行指定"></a> 1. MAC地址共48位（6个字节），以十六进制表示。前24位由IEEE决定如何分配，后24位由实际生产该网络设备的厂商自行指定。</h2><p><img src="https://github.com/Scofieldsu/blog-source/blob/main/source/images/MACadress.png?raw=true" alt="mac" /></p><p>图片来源  wikipedia链接：<a href="https://en.wikipedia.org/wiki/MAC_address">https://en.wikipedia.org/wiki/MAC_address</a></p><hr /><h2 id="区分方法"><a class="markdownIt-Anchor" href="#区分方法"></a> 区分方法</h2><h4 id="通过b1位区分一些修改过的mac地址"><a class="markdownIt-Anchor" href="#通过b1位区分一些修改过的mac地址"></a> 通过B1位区分一些修改过的MAC地址</h4><p>这个6个字节中的最高有效字节中的最低有效位（b0）用来标识 unicast,和mulcast，即单播 和多播  而<strong>次最低有效位（b1）则用来标识 universally administered address 和  locally administered address</strong>  其中：universally administered address 是指烧录在固件中由厂商指定的地址，也也即大家通常所理解的MAC地址，  而 locally administered address 则是指由网络管理员为了加强自己对网络管理而指定的地址，由定义可知， locally administered address的U/L位要设置成1.所以 要表示 locally administered address的话，那 MAC 地址的第一个字节应该是 0x02, 因此不能够把MAC地址改成其它已经被厂商占用的 universally administered address了。</p><p>但是通常情况下，很多人都不会遵守上面的约定。因为 MAC地址通常只能在局域网里发挥作用，因为在网络上传输，MAC地址是会被不断的替换掉的。所以即使你用了 已经被厂商占用的 universally administered address也不用担心会产生冲突。  说到着就更清楚了吧。说到底， <strong>locally administered address 和 universally administered address的区别在于是直接由生产的时候确定的还是由你自己修改过的。</strong></p><p>原文链接：<a href="http://blog.sina.com.cn/s/blog_9950926401019kzx.html">http://blog.sina.com.cn/s/blog_9950926401019kzx.html</a></p><h4 id="通过前3个字节查询对应注册厂商"><a class="markdownIt-Anchor" href="#通过前3个字节查询对应注册厂商"></a> 通过前3个字节查询对应注册厂商</h4><p>IEEE注册厂商查询，通过匹配MAC的前3个字节查找对应厂商，如无对应则可认为是一些低级的伪MAC地址。但这个注册厂商列表是公开的，一般的模拟MAC地址时，前3个字节从列表中取即可，而且这样伪造的MAC地址也不存在上面通过B2位判断的问题。</p><p>IEEE官网查询地址（可以下载oui.csv）：<a href="https://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries">https://regauth.standards.ieee.org/standards-ra-web/pub/view.html#registries</a></p><p>在线oui对应列表：<a href="http://standards-oui.ieee.org/oui/oui.txt">http://standards-oui.ieee.org/oui/oui.txt</a></p><h4 id="通过流量判断"><a class="markdownIt-Anchor" href="#通过流量判断"></a> 通过流量判断</h4><p>CSNA网络分析论坛有一种说法是 通过流量判断：伪造的IP或MAC地址，一般都只有单向流量，而且你可以看到其接收或发送的数据包都非常的少。</p><p>原文链接：<a href="http://www.csna.cn/archiver/tid-2040.html">http://www.csna.cn/archiver/tid-2040.html</a></p><h4 id="通过mac地址前3字节后3字节"><a class="markdownIt-Anchor" href="#通过mac地址前3字节后3字节"></a> 通过MAC地址前3字节+后3字节</h4><p>这种整体判断MAC真伪方式暂时还没找到。</p><hr /><h5 id="其他相关链接"><a class="markdownIt-Anchor" href="#其他相关链接"></a> 其他相关链接</h5><ul><li>知乎问题《iOS 8 设备随机 MAC 地址躲避 Wi-Fi 热点的记录追踪，技术上是怎么实现，有何影响？》<a href="https://www.zhihu.com/question/24094236">https://www.zhihu.com/question/24094236</a></li></ul><h1 id="ios8-mac随机化分析"><a class="markdownIt-Anchor" href="#ios8-mac随机化分析"></a> ios8 MAC随机化分析</h1><p>在iPhone 5s中发现了MAC随机化（细节如下），但在iPhone 5和iPad Mini中却没有。我怀疑这与新一代iPhone的操作系统架构差异有关。</p><h4 id="在iphone-5s中mac随机化仅在以下情况下发生"><a class="markdownIt-Anchor" href="#在iphone-5s中mac随机化仅在以下情况下发生"></a> <em>在iPhone 5s中，MAC随机化仅在以下情况下发生：</em></h4><ul><li>手机处于睡眠模式（显示关闭，未被使用）</li><li>Wi-Fi应该打开但不关联</li><li>位置服务应在隐私设置中关闭</li></ul><h4 id="在上述条件下iphone5s将在探测请求中使用随机mac具有以下特征"><a class="markdownIt-Anchor" href="#在上述条件下iphone5s将在探测请求中使用随机mac具有以下特征"></a> <em>在上述条件下，iPhone5s将在探测请求中使用随机MAC，具有以下特征：</em></h4><ul><li><p>随机化的MAC是本地管理的MAC。</p></li><li><p><strong>在电话显示屏关闭后大约120-150秒钟，手机将传送第一批具有随机MAC的探测请求</strong>。</p></li><li><p>在2.4 GHz和5 GHz频段内，批次内和所有通道内的所有探测请求都使用相同的随机MAC地址。</p></li><li><p><strong>下一批次的探测请求会随着批次之间的升级间隔而增加，最大间隔约为385秒，然后下一批次再次以大约120-150秒作为初始时间。跟踪时间为1小时</strong>。</p></li><li><p>所有这些探测请求都使用相同的随机MAC地址。</p></li><li><p><strong>探测请求中使用的随机MAC地址在每次手机被激活并随后进入睡眠模式时都会更改。意味着每个新的睡眠周期都使用一个新的随机MAC</strong>。</p></li><li><p>处于睡眠模式的探测请求不要求特定的SSID（称为空探测）。这似乎是一个额外的隐私功能，以防止在手机的无线配置文件中的SSID显示在睡眠模式。</p></li><li><p>无论手机是否在充电，MAC随机化都会发生。</p></li></ul><h2 id="结论"><a class="markdownIt-Anchor" href="#结论"></a> 结论</h2><p><strong>测请求中使用的随机MAC地址在每次手机被激活并随后进入睡眠模式时都会更改。意味着每个新的睡眠周期都使用一个新的随机MAC</strong>。</p><p>原文地址：<a href="https://blog.mojonetworks.com/ios8-mac-randomization-analyzed/">https://blog.mojonetworks.com/ios8-mac-randomization-analyzed/</a></p><hr /><p>相关：<a href="https://blog.mojonetworks.com/ios8-mac-randomgate/">https://blog.mojonetworks.com/ios8-mac-randomgate/</a></p><p>专利《一种获取WiFi终端真实MAC地址的装置及方法》：   <a href="https://www.google.com/patents/CN107094293A?cl=zh">https://www.google.com/patents/CN107094293A?cl=zh</a></p><hr /><h1 id="关于探针"><a class="markdownIt-Anchor" href="#关于探针"></a> 关于探针</h1><h3 id="wifi使用的网络协议wifi采用的是ieee80211协议集此协议集包含许多子协议-其中按照时间顺序发展主要有"><a class="markdownIt-Anchor" href="#wifi使用的网络协议wifi采用的是ieee80211协议集此协议集包含许多子协议-其中按照时间顺序发展主要有"></a> WiFi使用的网络协议，WiFi采用的是IEEE802.11协议集，此协议集包含许多子协议。其中按照时间顺序发展，主要有：</h3><p>（1）802.11a，</p><p>（2）802.11b，</p><p>（3）802.11g</p><p>（4）802.11n，。</p><p>在网络通信中，数据被封装成了帧，帧就是指通信中的一个数据块。但是帧在数据链路层传输的时候是有固定格式的，不是随便的封装和打包就可以传输，大小有限制，最小46字节，最大1500字节所以我们必须按照这个规则来封装。</p><p>下面802.11的帧结构：</p><p>| 前导码 | 前定界符 | 目的地址 | 源目的地址 | 长度字段 | 数据字段 | 校验字段 |<br />| - - - -|- - - - -| - - - - | - - - - - | - - - - | - - - - -| - - - - |<br />| 7B     |  1B     |   6B    |    6B     |    2B   |  46-1500 |   4B    |</p><p>在802.11中的帧有三种类型：管理帧（Management Frame，例如Beacon帧、Probe Request帧）、控制帧（Control Frame，例如RTS帧、CTS帧、ACK帧）、数据帧（Data Frame，承载数据的载体，其中的DS字段用来标识方向很重要）。帧头部中的类型字段中会标识出该帧属于哪个字段。</p><p>我们主要介绍下WiFi探针技术相关的几种帧：</p><p><strong>1.管理帧：</strong></p><ul><li><p><em>BeaconFrame</em>：信标帧，是相当重要的维护机制，主要来宣告某个AP网络的存在。定期发送的信标，可让移动WiFi设备得知该网络的存在，从而调整加入该网络所必要的参数。在基础网络里，AP必须负责发送Beacon帧，Beacon帧所及范围即为基本服务区域。  在基础型网络里，所有沟通都必须通过接入点，因此WiFi设备不能距离太远，否则无法接收到信标。</p><p>下图是帧格式：</p><p><img src="https://github.com/Scofieldsu/blog-source/blob/main/source/images/beaconframe.png?raw=true" alt="BeaconFrame" /></p></li><li><p><em>Probe Request</em>：探测请求帧，WiFi设备将会利用Probe Request帧，扫描所在区域内目前有哪些802.11网络。</p><p>下图是帧格式：<br /><img src="https://github.com/Scofieldsu/blog-source/blob/main/source/images/probe.png?raw=true" alt="probe" /></p></li></ul><p><strong>2.数据帧</strong>：</p><ul><li><em>Data</em>：数据帧，当接入点要送出一个帧给WiFi设备但是不必确认之前所传送的信息时，就会使用标准的数据帧。标准的数据帧并不会征询对方是否有数据待传，因此不允许接收端传送任何数据。无竞争周期所使用的纯数据（Data-Only)帧和无竞争周期所使用的数据帧完全相同。</li></ul><p><img src="https://github.com/Scofieldsu/blog-source/blob/main/source/images/wifi-run.png?raw=true" alt="wifi-run" /></p><p>就像图中描述的一样，我们的WiFi探针其实就是一个AP，它定时的向自己的四周广播发送Beacon帧，用来通知附近的WiFi设备，AP是存在的，（好比它一直在向周围喊着，我在这里，大家快来连接我啊）。</p><p>我们的WiFi设备，手机，平板电脑等，也不停的发送着probe帧，去寻找附近可用的AP。在probe帧的介绍中就我们可以看到probe帧包含了设备的mac地址，当我们的AP接收到probe帧之后就获取了这个设备的MAC地址，而这个AP就是我们的WIFI探针。因此只要在WiFi探针覆盖区域内的设备打开着WiFi，探针就能收集到他的MAC地址。</p><hr /><p>关于探针安全</p><ul><li><p>探针所收集的数据内容</p><blockquote><p>我们来看看WiFi探针设备究竟会收集什么信息？前面我们已经看到了，在不连接WiFi的情况下，移动设备只会发送probe帧，此时我们并不能通过探针访问网络进行数据传输，探针仅仅只能接收到WiFi设备发送的probe帧，收集probe帧携带的MAC地址，所以此时我们收集到信息是绝对无关用户个人信息和设备上其他信息的。</p></blockquote></li><li><p>探针不提供上网功能，WiFi提供上网功能</p><blockquote><p>探针不提供上网功能，所以用户与探针之间的数据流量仅限在探针发送广播，移动设备发送一次连接请求，而手机号码，用户姓名，性别等等个人信息和设备的详细信息都不包含在里面。但是WiFi就不一样了。因为用户可以用它来上网，可以说用户所有流量都是WiFi可以看到的。而流量的内容里面有很多是关于用户个人信息的。比如用户在网上填写市场调查问卷，可能就有一些用户信息，比如性别，年龄，手机号码等。甚至那种别有用心的人提供的WiFi会估计记录用户的一些敏感信息，比如用户上网时输入的密码等等。这也是安全相关人士经常提到的不要随便上别人的WiFi的原因。</p></blockquote></li><li><p>探针的数据处理</p><blockquote><p>由于探针本身设计仅仅是探测周边有些什么设备，因此并不产生大量数据，设计的时候就不会将收集到的数据存储在本身，而是通过有线连接直接发送到中心服务器上，这样即使有恶意的人将探针取走，也不能获得探针收集到的信息。同时有线连接也保证数据传输过程不容易通过电磁波的形式被监听和窃取。中心服务器一般都是在IDC机房里，而要进入IDC机房是需要经过IDC层层许可的。因而不论是数据的传输还是存储，探针的数据都是安全的。</p></blockquote></li></ul><p>原文链接：<a href="http://blog.51cto.com/11926581/1834693">http://blog.51cto.com/11926581/1834693</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;关于mac-地址media-access-control-address&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#关于mac-地址media-access-control-address&quot;&gt;&lt;/a&gt; 关于MAC 地址（Media 
      
    
    </summary>
    
      <category term="探索" scheme="http://Scofieldsu.github.io/categories/%E6%8E%A2%E7%B4%A2/"/>
    
    
      <category term="伪MAC" scheme="http://Scofieldsu.github.io/tags/%E4%BC%AAMAC/"/>
    
      <category term="探针" scheme="http://Scofieldsu.github.io/tags/%E6%8E%A2%E9%92%88/"/>
    
  </entry>
  
</feed>
