Jekyll2023-11-14T13:55:57+08:00https://mengalong.github.io/feed.xmlMengalongMengAlong的个人博客Along Mengshell 脚本不同变量截取方法2023-10-23T00:00:00+08:002023-10-23T00:00:00+08:00https://mengalong.github.io/2023/10/23/shell-parser-variables<h1 id="背景">背景</h1>
<p>在 shell 脚本中,经常有变量截取的各种处理需求,下面给出一些常见的字符串截取操作办法。</p>
<h1 id="举例">举例</h1>
<ol>
<li>从头截取指定某几个字符
<pre><code class="language-commandline">variable="Hello, World"
result="${variable:0:5}"
echo $result
</code></pre>
<blockquote>
<p>输出结果: Hello<br />
作用: 截取的是 [0,5) 对应的字符</p>
</blockquote>
</li>
<li>从指定位置截取到字符串末尾
<pre><code class="language-commandline">variable="Hello, World"
result="${variable:7}"
echo $result
</code></pre>
<blockquote>
<p>输出结果:World
作用: 截取 [7,] 的字符,从下标为7的字符开始到末尾</p>
</blockquote>
</li>
<li>从末尾截取最后 5 个字符
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">variable</span><span class="o">=</span><span class="s">"Hello, World"</span>
<span class="n">result</span><span class="o">=</span><span class="s">"${variable: -5}"</span>
<span class="n">echo</span> <span class="err">$</span><span class="n">result</span>
</code></pre></div> </div>
<blockquote>
<p>输出结果: World
作用: 注意 -5 的前边有一个空格,代表从后往前截取5个字符</p>
</blockquote>
</li>
<li>从末尾截取并指定长度
<pre><code class="language-commandline">variable="Hello, World"
result="${variable: -5:2}"
echo $result
</code></pre>
<blockquote>
<p>输出结果: Wo <br />
作用:先用 -5 从末尾截取出最后的5个字符,然后用 2 截取前一步结果的前两个字符</p>
</blockquote>
</li>
<li>从第一个指定字符开始往后截取
<pre><code class="language-commandline">variable="Hello-World-Test"
result="${variable#*-}"
echo $result
</code></pre>
<blockquote>
<p>输出:World-Test
作用:从第一个中划线开始截取到字符串末尾, 注意这里 <em>- ,</em>在中划线前边,代表把第一个中划线之前的内容全部删掉</p>
</blockquote>
</li>
<li>从最后一个指定字符开始往前截取
<pre><code class="language-commandline">variable="Hello-World-Test"
result="${variable%-*}"
echo $result
</code></pre>
<blockquote>
<p>输出: Hello-World
作用:从最后一个中划线开始截取到字符串的开头,注意这里 -* , * 在中划线后边,代表把最后一个中划线往后的内容全部删除</p>
</blockquote>
</li>
</ol>Along Meng背景棘轮效应2023-10-08T00:00:00+08:002023-10-08T00:00:00+08:00https://mengalong.github.io/2023/10/08/ratchet-effect<p>2023年9月29日,有号称‘中国巴菲特’ 的关善祥跳楼自杀,据传是他管理的基金重仓了融创、万科、保利、平安。
2020年地产调控,国家出台三道红线之后,导致地产股价值大幅缩水,关善祥管理的基金也从浮盈30%变成亏损60%以上。
关善祥本人则是在20岁开始投资,到29岁完成资本积累,实现财务自由。
关善祥之所以选择自杀的一个原因猜测就是棘轮效应的影响。一个原本有上亿财富的人,突然一夜之间缩水到几百万,这种感觉对其心态的影响,我们无法想象。</p>
<p>简单介绍下棘轮效应。棘轮效应,是指人的<font color="#dd000">消费习惯</font>形成之后有<font color="#dd000">不可逆性</font>,即易于向上调整,而难于向下调整。
尤其是在短期内消费是不可逆的,其习惯效应较大。这种习惯效应,使消费取决于相对收入,即相对于自己过去的高峰收入。
消费者易于随收入的提高增加消费,但不易于收入降低而减少消费这种特点被称为棘轮效应。这也是宋代文学家司马光给自己
儿子的一封家书中写到的:<font color="#dd000">由俭入奢易,由奢入俭难。</font> 这一效应是经济学家杜森贝利提出的。经济学家凯恩斯主张消费是可逆的,
即<font color="#dd000">绝对收入水平</font>变动必然立即引起<font color="#dd000">消费水平</font>的变化。针对这一观点,杜森贝利认为这实际上是不可能的,因为<font color="#dd000">消费决策</font>不可能是一种理想的计划,
它还取决于<font color="#dd000">消费习惯</font>。这种消费习惯受许多因素影响,如<font color="#dd000">生理和社会需要、个人的经历、个人经历的后果</font>等。
特别是个人在收入最高期所达到的消费标准对消费习惯的形成有很重要的作用。</p>
<p>个人的警示:在我们年轻可以赚钱的时候,一定要给自己留有足够的<font color="#dd000">安全边际</font>,比如可以赚100万的时候,选择10万的生活水平,
不要过度追求享乐和高级的生活,让自己维持在一个安全边际范围之内的生活水平即可,这种也可以感受到生活的快乐。防止未来收入水平下降带来的各种不适。</p>Along Meng2023年9月29日,有号称‘中国巴菲特’ 的关善祥跳楼自杀,据传是他管理的基金重仓了融创、万科、保利、平安。 2020年地产调控,国家出台三道红线之后,导致地产股价值大幅缩水,关善祥管理的基金也从浮盈30%变成亏损60%以上。 关善祥本人则是在20岁开始投资,到29岁完成资本积累,实现财务自由。 关善祥之所以选择自杀的一个原因猜测就是棘轮效应的影响。一个原本有上亿财富的人,突然一夜之间缩水到几百万,这种感觉对其心态的影响,我们无法想象。Python fire 库介绍2023-09-15T00:00:00+08:002023-09-15T00:00:00+08:00https://mengalong.github.io/2023/09/15/python-fire<h1 id="介绍">介绍</h1>
<p>Python fire 是一个Python库,只需要一行简单的命令,就可以将python的函数或者组件变成一个命令行调用。
并且提供了通用的方法增加命令行参数的解析,从此你将不需要自己写argparse</p>
<h1 id="安装">安装</h1>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pip</span> <span class="n">install</span> <span class="n">fire</span>
</code></pre></div></div>
<h1 id="实例">实例</h1>
<h2 id="场景一-firefire">场景一: fire.Fire()</h2>
<p>在代码最后调用,可以将整个代码都加入到命令行</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">fire</span>
<span class="k">def</span> <span class="nf">hello</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"Hello, {name}!"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">say</span><span class="p">(</span><span class="n">message</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"message: {message}"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
<span class="n">fire</span><span class="p">.</span><span class="n">Fire</span><span class="p">()</span>
</code></pre></div></div>
<p>运行方法:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire</span><span class="p">.</span><span class="n">py</span> <span class="o">--</span><span class="n">help</span>
<span class="n">NAME</span>
<span class="n">test</span><span class="o">-</span><span class="n">fire</span><span class="p">.</span><span class="n">py</span>
<span class="n">SYNOPSIS</span>
<span class="n">test</span><span class="o">-</span><span class="n">fire</span><span class="p">.</span><span class="n">py</span> <span class="n">GROUP</span> <span class="o">|</span> <span class="n">COMMAND</span>
<span class="n">GROUPS</span>
<span class="n">GROUP</span> <span class="ow">is</span> <span class="n">one</span> <span class="n">of</span> <span class="n">the</span> <span class="n">following</span><span class="p">:</span>
<span class="n">fire</span>
<span class="n">The</span> <span class="n">Python</span> <span class="n">Fire</span> <span class="n">module</span><span class="p">.</span>
<span class="n">COMMANDS</span>
<span class="n">COMMAND</span> <span class="ow">is</span> <span class="n">one</span> <span class="n">of</span> <span class="n">the</span> <span class="n">following</span><span class="p">:</span>
<span class="n">hello</span>
<span class="n">say</span>
<span class="p">(</span><span class="n">venv</span><span class="p">)</span> <span class="n">mengalong</span><span class="o">@</span><span class="n">B000000416727Y</span> <span class="n">fire</span><span class="o">-</span><span class="n">module</span><span class="o">-</span><span class="n">test</span> <span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire</span><span class="p">.</span><span class="n">py</span> <span class="n">say</span> <span class="s">'hello everyone'</span>
<span class="n">message</span><span class="p">:</span> <span class="n">hello</span> <span class="n">everyone</span>
<span class="p">(</span><span class="n">venv</span><span class="p">)</span> <span class="n">mengalong</span><span class="o">@</span><span class="n">B000000416727Y</span> <span class="n">fire</span><span class="o">-</span><span class="n">module</span><span class="o">-</span><span class="n">test</span> <span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire</span><span class="p">.</span><span class="n">py</span> <span class="n">hello</span> <span class="s">"mengalong"</span>
<span class="n">Hello</span><span class="p">,</span> <span class="n">mengalong</span><span class="err">!</span>
</code></pre></div></div>
<h2 id="场景二-firefilre">场景二: fire.Filre(<fn>)</fn></h2>
<p>指定某个函数作为入口,加入到命令行,函数的参数作为命令行的参数</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">fire</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="s">'Hello {name}'</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
<span class="n">fire</span><span class="p">.</span><span class="n">Fire</span><span class="p">(</span><span class="n">main</span><span class="p">)</span>
</code></pre></div></div>
<p>运行效果:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire2</span><span class="p">.</span><span class="n">py</span> <span class="n">mengalong</span>
<span class="n">Hello</span> <span class="n">mengalong</span>
</code></pre></div></div>
<p>这种情况下,我们不需要在运行的时候指定main方法,因为在fire.Fire(main)已经默认指定了</p>
<h2 id="场景三指定一个main函数作为统一入口">场景三:指定一个main函数作为统一入口</h2>
<p>另一种场景,可以使用main函数作为入口来写</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">fire</span>
<span class="k">def</span> <span class="nf">hello</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"Hello {name}"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="n">fire</span><span class="p">.</span><span class="n">Fire</span><span class="p">(</span><span class="n">hello</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</code></pre></div></div>
<p>运行效果</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire3</span><span class="p">.</span><span class="n">py</span> <span class="n">mengalong</span>
<span class="n">Hello</span> <span class="n">mengalong</span>
</code></pre></div></div>
<h2 id="场景四不修改代码的情况下使用fire">场景四:不修改代码的情况下使用fire</h2>
<p>假设有一个 example.py 没有引入fire库</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">hello</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"Hello {name}!"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">)</span>
</code></pre></div></div>
<p>运行效果:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="err">$</span> <span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">fire</span> <span class="n">example</span><span class="p">.</span><span class="n">py</span> <span class="n">hello</span> <span class="o">--</span><span class="n">name</span><span class="o">=</span><span class="s">"mengalong"</span>
<span class="n">Hello</span> <span class="n">mengalong</span><span class="err">!</span>
</code></pre></div></div>
<h2 id="场景五多参数模式">场景五:多参数模式</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">fire</span>
<span class="k">def</span> <span class="nf">hello</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">age</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"hello {name} you are {age} years old"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">age</span><span class="o">=</span><span class="n">age</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">fire</span><span class="p">.</span><span class="n">Fire</span><span class="p">(</span><span class="n">hello</span><span class="p">)</span>
</code></pre></div></div>
<p>运行效果:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire5</span><span class="p">.</span><span class="n">py</span> <span class="o">--</span><span class="n">name</span> <span class="n">mengalong</span> <span class="o">--</span><span class="n">age</span> <span class="mi">14</span>
<span class="n">hello</span> <span class="n">mengalong</span> <span class="n">you</span> <span class="n">are</span> <span class="mi">14</span> <span class="n">years</span> <span class="n">old</span>
</code></pre></div></div>
<h1 id="实例二-多命令行">实例二: 多命令行</h1>
<h2 id="场景一多函数入口">场景一:多函数入口</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">fire</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span>
<span class="k">def</span> <span class="nf">multiply</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">fire</span><span class="p">.</span><span class="n">Fire</span><span class="p">()</span>
</code></pre></div></div>
<p>运行效果</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire6</span><span class="p">.</span><span class="n">py</span> <span class="n">add</span> <span class="mi">1</span> <span class="mi">5</span>
<span class="mi">6</span>
<span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire6</span><span class="p">.</span><span class="n">py</span> <span class="n">multiply</span> <span class="mi">1</span> <span class="mi">5</span>
<span class="mi">5</span>
</code></pre></div></div>
<h2 id="场景二-dict形式指定入口">场景二: dict形式指定入口</h2>
<p>使用dict形式指定两个函数的入口</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">fire</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span>
<span class="k">def</span> <span class="nf">multiply</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">fire</span><span class="p">.</span><span class="n">Fire</span><span class="p">({</span>
<span class="s">'add'</span><span class="p">:</span> <span class="n">add</span><span class="p">,</span>
<span class="s">'multiply'</span><span class="p">:</span> <span class="n">multiply</span>
<span class="p">})</span>
</code></pre></div></div>
<p>运行效果:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire7</span><span class="p">.</span><span class="n">py</span> <span class="n">multiply</span> <span class="mi">3</span> <span class="mi">4</span>
<span class="mi">12</span>
<span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire7</span><span class="p">.</span><span class="n">py</span> <span class="n">add</span> <span class="mi">3</span> <span class="mi">4</span>
<span class="mi">7</span>
</code></pre></div></div>
<h2 id="场景三-指定一个对象作为入口">场景三: 指定一个对象作为入口</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">fire</span>
<span class="k">class</span> <span class="nc">Calculator</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span>
<span class="k">def</span> <span class="nf">multiply</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
<span class="k">return</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">calculator</span> <span class="o">=</span> <span class="n">Calculator</span><span class="p">()</span>
<span class="n">fire</span><span class="p">.</span><span class="n">Fire</span><span class="p">(</span><span class="n">calculator</span><span class="p">)</span>
</code></pre></div></div>
<p>运行效果:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire8</span><span class="p">.</span><span class="n">py</span> <span class="n">add</span> <span class="mi">5</span> <span class="mi">6</span>
<span class="mi">11</span>
<span class="err">$</span> <span class="n">python</span> <span class="n">test</span><span class="o">-</span><span class="n">fire8</span><span class="p">.</span><span class="n">py</span> <span class="n">multiply</span> <span class="mi">5</span> <span class="mi">6</span>
<span class="mi">30</span>
</code></pre></div></div>
<p>未完待续,这个库还有更多有意思的用法</p>Along Meng介绍共读英语的五年-读后思考2023-02-26T00:00:00+08:002023-02-26T00:00:00+08:00https://mengalong.github.io/2023/02/26/Read-english<p><img src="/images/posts/english_read/english-read.jpeg" alt="" height="400px" width="300px" /></p>
<p>这是一本介绍英语共读的书,最近在读书群里看到有人推荐,从介绍上来看应该可以解决我如何学习英语以及如何帮助孩子学习
英文的疑问。</p>
<h1 id="作者简介">作者简介:</h1>
<p>艾玛,美国TESOL中国区项目培训师、K12 英语课程设计师。 大学是学习中文的,后来转行教学生英文。</p>
<h1 id="读书感受">读书感受</h1>
<p> 以前学习英语的思路大部分时候都是死记硬背单词、语法、句子,一直都是感觉英语很难学,无聊又枯燥。最近上一年级的萌萌也时常会说自己英语不好,感觉英语很难学习。
希望能有一种办法可以帮助孩子学习,也帮助自己成长。读完之后,几个直观感受:</p>
<pre><code class="language-commandline"> 1. 这本书的语言很流畅,基本可以花几个小时一口气读完
2. 作者在书中讲讲了一些如何共读的方法,但更多的是一种自己如何一步步带领孩子进入共读的世界
3. 英文原版书籍也并非是需要学习到很深入的阶段才能读,普通人甚至小学生也可以慢慢入手
</code></pre>
<p> 读这本书的过程中,我就在脑子里想象《夏洛的网》的故事情节,以及和孩子共读的场景。过去我在家也经常会和孩子一起读绘本和
故事书,孩子往往会喜欢看图画更多的书,有时候文字多了不光孩子会没有耐心,我自己也会觉得读的累。在艾玛老师的书中帮我解
决了类似这样的问题:之所以会觉得读书枯燥,实际是缺少思考和引导,从故事中找到做事的方法,引导孩子更多的思考。艾玛老师
的书 也帮我更好地认识了过去听说读写的方法有什么样的问题,未来如何引导孩子读书和学习。看书的过程中我就下单了《夏洛的网》
和《戴帽子的猫》,期待新书到了之后能开启新的读书体验。</p>
<p> 读完书之后,依然存在一些疑惑,期待自己读的时候能够慢慢找到方法:</p>
<pre><code class="language-commandline">1. 孩子对英文不了解,单词不认识,如何让他可以理解书中的意思。艾玛老师讲到的一个概念是读书百遍,其义自见。
2. 一本书,应该从哪些方面入手,在家里可以自己陪孩子共读并且成长?面向6岁的孩子,如何让她能对学习英文有发自内心的兴趣
</code></pre>Along MengDocker安装wordpress2022-11-23T00:00:00+08:002022-11-23T00:00:00+08:00https://mengalong.github.io/2022/11/23/docker-install-wordpress<p>背景:使用docker镜像启动wordpress,并进行基本的配置和初始化</p>
<ol>
<li>下载镜像:
<pre><code class="language-commandline">docker pull mysql
docker pull wordpress
</code></pre>
</li>
<li>启动mysql容器:
<pre><code class="language-commandline">docker run -d --privileged=true --name mysql-wp -v /Users/mengalong/soft/wp/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3206:3306 mysql
</code></pre>
</li>
<li>启动wordpress容器:
<pre><code class="language-commandline">docker run -d --name wordpress \
-v /Users/mengalong/soft/wp/data/wp/html:/var/www/html \
--link mysql-wp:mysql \
-p 8080:80 wordpress
</code></pre>
</li>
<li>查看mysql容器的ip:
<pre><code class="language-commandline">docker inspect mysql-wp | grep -i ipaddr
</code></pre>
</li>
<li>mysql容器启动之后,根据上文指定的root账户和密码连接到mysql,手动创建wordpress数据库</li>
</ol>
<pre><code class="language-commandline">docker exec -it mysql-wp bash
mysql -u root -p${mysqlpassword}
create database wordpress;
</code></pre>
<ol>
<li>浏览器访问:localhost:8080 , 根据指导步骤进行配置即可,其中需要填写mysql的ip地址和端口号、数据库名、用户名和密码</li>
</ol>Along Meng背景:使用docker镜像启动wordpress,并进行基本的配置和初始化侯世达定律2022-11-11T00:00:00+08:002022-11-11T00:00:00+08:00https://mengalong.github.io/2022/11/11/Houshida-s-law<h1 id="概念">概念:</h1>
<p>侯世达在自己的神书《哥德尔、埃舍尔、巴赫》中提出:做复杂任务需要花费的时间总是很难预计的。</p>
<p>我们日常工作和项目管理中,也经常遇到类似问题:预估一个项目或者需求的开发时间,往往是非常困难的。</p>
<p>个人思考困难的原因包括:</p>
<ol>
<li>项目需求的不明确(我们往往在讨论排期的时候都是只出了一个简单的PRD,甚至有时就是一句话需求)</li>
<li>做项目的人可能是1个或者多个需要配合起来的,每个人的能力和理解力是不一样的</li>
<li>项目过程中可能会有各种刚插入的事情也是不可控的</li>
</ol>
<p>最后,看到的结果要么是项目延期了,要么是为了按期交付,过程中大量加班或者新增人力投入。
最后项目负责人、参与者都可能会感到非常疲惫。 最后会留下一句话:下次一定要多加点儿buffer。</p>
<p>工作中也遇到过另外一种情况,对于一些重复性比较多的工作,往往可以预估的比较准确。</p>
<p>这些工作经过大量的重复,相关路径、步骤、依赖都有了一定的规范和预期。</p>
<p>在项目推进过程中会有很多经验沉淀,即使遇到一些非预期的问题,由于前人已经做过很多次,可能很快也能找到解决方案。</p>
<h1 id="如何避免">如何避免</h1>
<p>项目中,如何避免侯世达定律对我们的影响呢?</p>
<ol>
<li>项目文档:通过文档来充分描述清楚项目需求和相关设计,写文档的时间一定是要投入的,甚至文档的时间比软件开发的时间要更长。</li>
<li>项目计划:尽可能细致的列出相关计划和工作,中间及时做好取舍</li>
<li>及时沟通:需要沟通协调的事情,提前进行,及时调整</li>
</ol>Along Meng概念: 侯世达在自己的神书《哥德尔、埃舍尔、巴赫》中提出:做复杂任务需要花费的时间总是很难预计的。Mac终端输入换行问题解决2021-11-19T00:00:00+08:002021-11-19T00:00:00+08:00https://mengalong.github.io/2021/11/19/mac-command-over-line<h1 id="问题现象">问题现象</h1>
<p>Mac终端下输入命令行过长时,首行不能自动换行,超长后会将第一行前面的内容覆盖,直到最后再换行</p>
<p><img src="/images/posts/linux/command-over-line.png" alt="" /></p>
<h1 id="问题原因">问题原因</h1>
<p>问题原因是因为设置了终端命令行格式的 PS1 字段中有不显示的字符。这类字符在终端计算字符长度时,会出现计算错误。导致无法正确的换行。比如我的 ~/.bash_profile 中关于 PS1 的配置如下:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#sets up theprompt color (currently a green similar to Linux terminal)
export PS1='\033[01;32m\u@\h\033[00m:\033[01;36m\w\033[00m\$ '
</code></pre></div></div>
<h1 id="问题解决">问题解决:</h1>
<p>对PS1中的不可见字符,需要用 \[\] 将其包裹起来,重新加载 ~/.bash_profile 配置文件即可。修改后的结果如下:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>export PS1='\[\033[01;32m\]\u@\h\[\033[00m:\033[01;36m\]\w\[\033[00m\]\$ '
</code></pre></div></div>Along Meng问题现象Linux 和 mac 下date时间戳转换2021-11-17T00:00:00+08:002021-11-17T00:00:00+08:00https://mengalong.github.io/2021/11/17/linux-date-mac-date<h1 id="获取当前时间戳">获取当前时间戳</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mac:
$ date +%s
1637149454
linux:
$ date +%s
1637149454
</code></pre></div></div>
<h1 id="查看指定时间的时间戳">查看指定时间的时间戳</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mac:
$ date -j -f "%Y-%m-%d %H:%M:%S" "2021-11-17 19:44:14" +%s
1637149454
linux:
$ date -d "2021-11-17 19:44:14" +%s
1637149454
</code></pre></div></div>
<h1 id="时间戳转换为指定的格式">时间戳转换为指定的格式</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mac:
$ date -r 1637149454 +"%F %T"
2021-11-17 19:44:14
linux:
$ date -d @1637149454 +"%F %T"
2021-11-17 19:44:14
</code></pre></div></div>Along Meng获取当前时间戳 ``` mac: $ date +%s 1637149454俄狄浦斯在科罗诺斯2021-11-04T00:00:00+08:002021-11-04T00:00:00+08:00https://mengalong.github.io/2021/11/04/oedipus-in-keronose<p>索福克勒斯悲剧 - 俄狄浦斯在科罗诺斯</p>
<p><img src="/images/posts/geek_mythology/oedipus-in-coronus.jpeg" alt="" /></p>
<h1 id="故事背景">故事背景</h1>
<p> 俄狄浦斯因为在无意中犯下了弑父娶母的罪行,他选择刺瞎双眼之后自我放逐,之后他的大儿子波吕涅克斯继承了王位。后来波吕涅克斯认为自己的父亲犯下了罪恶,认为他会亵渎忒拜城,就将自己的父亲驱逐出了自己的国家。俄狄浦斯的大女儿安提戈涅不忍眼瞎的父亲独自流浪,就陪着父亲一同离开了自己的国家,开始外出流浪。经过了大概20年左右的流浪,俄狄浦斯来到了雅典,便有了下文的故事了。</p>
<h1 id="主要人物">主要人物</h1>
<ul>
<li>克瑞翁:俄狄浦斯妻子伊俄卡斯忒的兄弟,也就是俄狄浦斯的大舅哥</li>
<li>波吕涅克斯:俄狄浦斯的长子</li>
<li>厄忒俄克勒斯:俄狄浦斯的次子</li>
<li>安提戈涅:俄狄浦斯的大女儿</li>
<li>伊斯墨涅:俄狄浦斯的小女儿</li>
<li>忒修斯:雅典城的国王</li>
</ul>
<h1 id="故事梗概">故事梗概</h1>
<p> 俄狄浦斯和安提戈涅流浪来到的雅典的科罗诺斯,这里有一片神圣的树林,树林里供奉了复仇女神。浑身邋遢的俄狄浦斯坐在复仇女神祭祀的石板上休息时,让女儿安提戈涅打听到:这里是复仇女神所在地科罗诺斯,正是自己之前获得的神谕里说到的地方。神谕显示:他将在此老去,最终死在这里,死后会为这里带来福祉。当地人看到脏兮兮的俄狄浦斯坐在复仇女神的树林中时,担心他亵渎神灵,要求他离开这里。俄狄浦斯对众人说到:去找你们的国王来见我吧,我虽然是瞎子,但根据神谕,我终将老死在这里,并为这里带来福祉,而只需要国王给我提供微薄的帮助。</p>
<p> 就在报信人去向国王忒修斯报告的时候,从远处来了一个骑马的女人。走进一看,原来是俄狄浦斯的小女儿伊斯墨涅,她从忒拜城赶来,带来了家乡的最新消息。原来当年俄狄浦斯被赶出忒拜城之后,他的两个儿子担心受到诅咒,因此选择让自己的舅舅克瑞翁代理国政。后来过了几年,他们两个又想要享受国王的待遇,老大顺理成章的登基为王了。做了几年国王之后,老二厄忒俄克勒斯也心有不甘,便和克瑞翁合谋发起了政变,赶走了王位上的波吕涅克斯。波吕涅克斯逃亡到了珀罗奔尼撒的阿尔戈斯。他在那里娶了国王阿德拉斯托斯的女儿,得到了盟国的援助。现如今他正要兴兵报复,以武力夺回王位。同时一个新的神谕显示:国王俄狄浦斯的儿子们如果没有自己的父亲,就会毫无作为。如果他们想要获胜,就要找回自己的父亲。因此不久之后,克瑞翁和波吕涅克斯都会来找俄狄浦斯加入自己的大军。不过,据说克瑞翁会选择把俄狄浦斯带回到忒拜的边界,软禁在那里。这样就不会因为俄狄浦斯以前的罪行亵渎忒拜城,也能满足新的神谕的要求。听到这里,俄狄浦斯悲愤的说到:他们永远也不会得到我。假使我的两个孩子贪求政权更甚于爱我,神祗便会使他们永久成为死敌。假使他们要我裁判他们的争端,那么,现在执持王杖的人便应让出王位,被逐出的人也不应当回归故土。只有我两个女儿是我忠实的孩子。让我的罪过不要连累她们吧!我为她们祈请神祗降福,我为她们请求保护。给我和她们以援助,都将得到报酬和光荣!</p>
<p> 不久,雅典国王忒修斯来到了俄狄浦斯身旁,听了俄狄浦斯叙说自己的身世之后,非常同情他,也愿意提供帮助,保护他和女儿的安全。随后,克瑞翁带了一队人马找到了俄狄浦斯,要求他会到忒拜城。任由克瑞翁如何狡辩,俄狄浦斯也没有答应他的要求.随后克瑞翁选择使用暴力胁迫手段,让士兵先掳走了俄狄浦斯的女儿,这样瞎子俄狄浦斯一个人就无法行动了。俄狄浦斯愤怒异常,并求助于忒修斯。最终,在忒修斯的强力干预下,赶走了克瑞翁,救回了安提戈涅。俄狄浦斯非常感谢忒修斯的帮助。</p>
<p> 不出意外,过了不久波吕涅克斯也找到了俄狄浦斯,希望他帮助自己一起夺回忒拜城的王位。俄狄浦斯痛斥了了波吕涅克斯:当年我选择刺瞎双眼,自我放逐,期望能自己去流浪。而你作为国王,为了自己的脸面,怎么也不放我走,要求我留在自己的国家。而在我逐渐心情平静,接受了自己的罪行,并且选择留在国家生活的时候,你又担心我过去的罪行亵渎忒拜城,将我逐出自己的国家。为了权势、王位,你是多么的狠心,像你这种人是不配拥有王位的。最后俄狄浦斯也没有选择随着波吕涅克斯回去。俄狄浦斯痛恨这两个忘恩负义的儿子。</p>
<p> 后来,俄狄浦斯感觉到自己要走向死亡了,神灵也在召唤他,他选择了自己走向了死亡。他起身开始走向自己的埋葬之地,这次居然不需要其他人给自己领路了,他可以自己找到目的地。在路上褪去了身上的脏衣服,让两个女儿给他打来了清澈的泉水,沐浴更衣,穿上了寿衣。在一个三岔路口,他让女儿留了下来,只留忒修斯陪着自己继续往前走。并且和忒修斯祈求希望忒修斯能善待自己的女儿。只要她们提的不算过分的要求,希望都能尽量满足,保障自己女儿的安全。忒修斯一一答应了。最后俄狄浦斯安静的躺在了自己的死亡之所,没有任何病痛和痛苦,当时的具体的情形也只有忒修斯目睹了。</p>
<p> 俄狄浦斯死后,他的女儿感谢了忒修斯的帮助,并恳求忒修斯将自己送回忒拜城。因为那里自己的两个哥哥的正在战斗,她们希望可以赶回去劝说自己的哥哥放下武器,避免冲突。忒修斯也尊重她们的选择,同意送她们回到忒拜城去。</p>
<h1 id="思考">思考</h1>
<p> 这个故事说明了什么道理呢?认命、尊重神谕的重要性吗?当年俄狄浦斯的父母不遵从神谕,为了打破神谕选择扔掉俄狄浦斯,不成想最终还是导致了俄狄浦斯的弑父娶母。</p>
<p> 而在这个故事中,俄狄浦斯遵从了神谕,选择安静的死亡,直到最后也没有尝试去打破神谕。相反的,克瑞翁、波吕涅克斯、厄忒俄克勒斯却在尝试打破神谕想要逆天改命,可想而知最后他们也不会有好的结局的。最后的结果,可以看下一篇:《安提戈涅》</p>Along Meng索福克勒斯悲剧 - 俄狄浦斯在科罗诺斯俄狄浦斯王2021-10-31T00:00:00+08:002021-10-31T00:00:00+08:00https://mengalong.github.io/2021/10/31/oedipus<p>索福克勒斯悲剧 - 俄狄浦斯王</p>
<p><img src="/images/posts/geek_mythology/edipus.png" alt="" /></p>
<p>剧照,约1869年,荷兰演员路易斯-布曼斯特饰演俄狄浦斯</p>
<p>阿尔贝特-格莱纳摄</p>
<h1 id="故事背景">故事背景</h1>
<p> 拉伊俄斯原本是忒拜国王拉布达科斯的儿子,他幼年丧父之后被夺去了作为忒拜国王的一切权利。之后投奔了珀罗普斯,为珀罗普斯的儿子克律西波斯做家庭教师。可是拉伊俄斯居然爱上了克律西波斯,但是克律西波斯对拉伊俄斯毫无感觉。后来拉伊俄斯将其诱拐到忒拜,并用暴力胁迫虐待,最后克律西波斯忍受不了羞辱,自杀而亡。珀罗普斯认为拉伊俄斯杀死了自己的儿子,因此就诅咒拉伊俄斯 ‘你害死了我儿子,将来会死在自己的儿子手中’。</p>
<p> 拉伊俄斯后来重新成为了忒拜城的国王,并与伊俄卡斯忒结婚成为夫妻。为了避免 ‘将来会被自己的儿子杀死’ 这个神谕的印证,拉伊俄斯避免一直和伊俄卡斯忒同房。后来有一天醉酒之后,和伊俄卡斯忒生下了儿子,俄狄浦斯。</p>
<h1 id="主要人物">主要人物</h1>
<ul>
<li>拉伊俄斯:俄狄浦斯的生父,当年忒拜城的国王</li>
<li>伊俄卡斯忒:俄狄浦斯的母亲、妻子</li>
<li>波吕珀(音:破)斯:俄狄浦斯的养父,柯林斯城国王</li>
<li>斯芬克斯:人面狮身的怪兽</li>
<li>珀罗普斯:收留过拉伊俄斯</li>
<li>克律西波斯:珀罗普斯的儿子,拉伊俄斯曾做过他的家庭教师,因为爱上了克律西波斯诱拐了他,最后导致克律西波斯死亡。</li>
<li>克瑞翁:伊俄卡斯忒的兄弟</li>
<li>波吕涅克斯:俄狄浦斯的长子</li>
<li>厄忒俄克勒斯:俄狄浦斯的次子</li>
<li>忒瑞西阿斯:忒拜城的先知</li>
</ul>
<h1 id="故事梗概">故事梗概</h1>
<p> 俄狄浦斯王,是古希腊作家索福克勒斯创作的剧本,取材于希腊古老的传说。</p>
<p> 相传俄狄浦斯出生之后,他的父亲拉伊俄斯担心当年的神谕(自己将死在自己儿子的手里)应验,就在俄狄浦斯的脚后跟订上了钉子,并把他的手脚捆起来,交给自己的仆人,让仆人把他扔在到咯泰戎的荒山中,任其自生自灭。仆人不忍心杀死一个婴儿,把俄狄浦斯带到山上后,送给了科林斯国的一个牧羊人。当年科林斯的国王波吕珀斯一直没有儿子,得知牧羊人这里有一个弃婴之后,就收养了他。因为脚后跟被订了钉子而受伤,就给他取名为俄狄浦斯(意为脚后跟肿胀的人)。波吕珀斯后来将俄狄浦斯立为王子,作为自己的接班人。</p>
<p> 俄狄浦斯逐渐长大了,一直不知道波吕珀斯是自己的养父。有一天,从神明那里得知自己必将杀父娶母的神谕。俄狄浦斯为了避免悲剧的发生,从此远离了科林斯,到处流浪。他漂泊了很久,一直没有找到合适的落脚点。</p>
<p> 一天,俄狄浦斯在一个森林的三岔路口遇到了一队人马,领头的是一个老者。因为路比较窄,老者粗暴的要求俄狄浦斯给他让路,继而发生了冲突。最后,俄狄浦斯杀死了领头的老者,老者的仆人逃之夭夭。俄狄浦斯继续往前走,最后来到忒拜城外。在城外遇到了狮身人面的怪兽–斯芬克斯。一段时间以来,为了惩罚拉伊俄斯对克律西波斯犯下的罪行,希腊神界女王赫拉送来了怪兽斯芬克斯。斯芬克斯在忒拜城外问路过的人一个谜语,如果猜不出来答案,就将这个人吃掉,为此忒拜城的人都不敢出门,一直生活在恐惧中。</p>
<p> 面对怪兽斯芬克斯,俄狄浦斯一点也不害怕,上前挑战。斯芬克斯说出了她的谜语:什么动物早晨用四条腿走路,中午用两条腿走路,晚上用三条腿走路,腿最多的时候,也正是他走路最慢,体力最弱的时候。俄狄浦斯猜出了这个谜底: 人。因为人刚出生的时候最柔弱,用两只手和两条腿在地上爬行,相当于四条腿走路;长大之后用两条腿直立行走;年老的时候,拄上拐杖就相当于是三条腿了。猜中谜语之后,俄狄浦斯和斯芬克斯发生了战斗,杀死了斯芬克斯,解救了忒拜城的人民。拯救了忒拜城的俄狄浦斯受到人民的拥戴,将他推举为新的国王。按照习俗,失去了丈夫的伊俄卡斯忒就成了俄狄浦斯的王后。这也应验了神谕:俄狄浦斯将会弑父娶母。</p>
<p> 俄狄浦斯和伊俄卡斯忒成婚后生下了两个儿子:波吕尼刻斯和厄忒俄克勒斯;以及两个女儿:安提戈涅和伊斯墨涅。由于俄狄浦斯在不知不觉中犯下了弑父娶母的罪行,忒拜城遭受了瘟疫和饥荒。为了平息国内的瘟疫,俄狄浦斯来到神山,祈求神明怎样才能解除忒拜城的灾难,神谕示下:需要找出杀死拉伊俄斯的凶手方可解除。俄狄浦斯回城后,就开始大力寻找凶手,并承诺他绝不会饶恕凶手的罪恶。最后在先知忒瑞西阿斯的揭示以及当年的仆人、科林斯牧羊人的证明之下,终于找出凶手原来是俄狄浦斯,而他居然是弑父娶母的罪人。得知真相的伊俄卡斯忒羞愧难当,在王宫内上吊自杀。俄狄浦斯也因此悲痛不已,刺瞎了自己的双眼,自我放逐,后来离开了忒拜城在外流浪。</p>
<p> 俄狄浦斯刺瞎双眼之后,忒拜城的城邦由克瑞翁辅佐着俄狄浦斯的儿子波吕涅克斯治理。</p>
<h1 id="思考">思考</h1>
<p> 自始至终,俄狄浦斯的命运仿佛已经被神明安排的明明白白,无论他怎样挣扎也无济于事。他的出生可能就是一个错误,而自己却全然不知也无法选择。为了避免杀父娶母,俄狄浦斯青年时期就开始在外流浪,好不容易找到了栖身之所,却不知自己已经娶了自己的母亲为妻,还生下了四个孩子。</p>
<p> 死亡或许是最好的救赎,但是俄狄浦斯没有选择死亡,而是选择了比死亡更残酷的惩罚:刺瞎自己的双眼,自我放逐。</p>
<p> 索福克勒斯的这出悲剧向人们揭示了命运是如此的残酷,在命运面前,人是如此的无力和渺小。
而我看到的是主宰这一切的神明,希腊人们所信奉的宙斯、阿波罗们,是如此的荒唐,既然他们有如此大的神力,为何还要在世间制造如此荒唐的悲剧呢。或许在当年的希腊,这种故事是为了让人民相信命运,接受现实吧。</p>
<p> 这个故事也是我们现在心理学上所说的‘俄狄浦斯情结’的来源,即为恋母情结。</p>Along Meng索福克勒斯悲剧 - 俄狄浦斯王