oops: runhttps://doobom.me/2021-04-03T16:53:08+08:00keep running...锐捷交换机的配置命令大全2021-04-03T16:52:52+08:002021-04-03T16:53:08+08:00doobomtag:doobom.me,2021-04-03:/ruijie-switch-config-command<p>锐捷交换机的配置命令大全</p>
<blockquote>
<p>原文: <a href="http://mepconsultants.net/nd.jsp?id=2475">锐捷交换机的配置命令大全</a></p>
</blockquote>
<h2 id="_1">一、基础配置命令<a class="headerlink" href="#_1" title="Permanent link"> </a></h2>
<ol>
<li>准备命令</li>
</ol>
<p><code>>Enable</code> 进入特权模式</p>
<p><code>#Exit</code> 返回上一级操作模式</p>
<p><code>#End</code> 返回到特权模式</p>
<p><code>#write memory</code> 或 <code>copy running-config startup-config</code> 保存配置文件</p>
<p><code>#del flash:config.text</code> 删除配置文件(交换机及1700系列路由器)</p>
<p><code>#erase startup-config</code> 删除配置文件(2500系列路由器)</p>
<p><code>#del flash:vlan.dat</code> 删除Vlan配置信息(交换机)</p>
<p><code>#Configure terminal</code> 进入全局配置模式</p>
<p><code>(config)# hostname switchA</code> 配置设备名称为 <code>switchA</code></p>
<p><code>(config)#banner motd &</code> 配置每日提示信息 &为终止符</p>
<p><code>(config)#enable secret level 1 0 star</code> 配置远程登陆密码为star</p>
<p><code>(config)#enable secret level 15 0 star</code> 配置特权密码为star</p>
<p><code>Level 1</code> 为普通用户级别,可选为 <code>1~15</code>,<code>15</code> 为最高权限级别;<code>0</code> 表示密码不加密</p>
<p><code>(config)#enable services web-server</code> 开启交换机WEB管理功能</p>
<p><code>Services</code> 可选以下:<code>web-server</code> (WEB管理)、<code>telnet-server</code> (远程登陆)等</p>
<ol>
<li>查看信息</li>
</ol>
<p><code>#show running-config</code> //查看当前生效的配置信息</p>
<p><code>#show interface fastethernet 0/3</code> //查看 <code>F0/3</code> 端口信息</p>
<p><code>#show interface serial 1/2</code> //查看S1/2端口信息</p>
<p><code>#show interface</code> //查看所有端口信息</p>
<p><code>#show ip interface brief</code> //以简洁方式汇总查看所有端口信息</p>
<p><code>#show ip interface</code> //查看所有端口信息</p>
<p><code>#show version</code> //查看版本信息</p>
<p><code>#show mac-address-table</code> //查看交换机当前MAC地址表信息</p>
<p><code>#show running-config</code> //查看当前生效的配置信息</p>
<p><code>#show vlan</code> //查看所有VLAN信息</p>
<p><code>#show vlan id 10</code> //查看某一VLAN (如VLAN10)的信息</p>
<p><code>#show interface fastethernet 0/1</code> //查看某一端口模式(如 <code>F 0/1</code>)</p>
<p><code>#show aggregateport 1 summary</code> //查看聚合端口AG1的信息</p>
<p><code>#show spanning-tree</code> //查看生成树配置信息</p>
<p><code>#show spanning-tree interface fastethernet 0/1</code> //查看该端口的生成树状态</p>
<p><code>#show port-security</code> //查看交换机的端口安全配置信息</p>
<p><code>#show port-security address</code> //查看地址安全绑定配置信息</p>
<p><code>#show ip access-lists listname</code> //查看名为 <code>listname</code> 的列表的配置信息
</p>
<ol>
<li>端口的基本配置</li>
</ol>
<p><code>(config)#Interface fastethernet 0/3</code> //进入 <code>F0/3</code> 的端口配置模式</p>
<p><code>(config)#interface range fa 0/1-2,0/5,0/7-9</code> //进入 <code>F0/1</code>、<code>F0/2</code>、<code>F0/5</code>、<code>F0/7</code>、<code>F0/8</code>、<code>F0/9</code> 的端口配置模式</p>
<p><code>(config-if)#speed 10</code> //配置端口速率为 <code>10M</code>, 可选 <code>10</code>, <code>100</code>, <code>auto</code></p>
<p><code>(config-if)#duplex full</code> //配置端口为全双工模式,可选 <code>full</code>(全双工),<code>half</code>(半双式),<code>auto</code>(自适应)</p>
<p><code>(config-if)#no shutdown</code> //开启该端口</p>
<p><code>(config-if)#switchport access vlan 10</code> //将该端口划入 <span class="caps">VLAN10</span> 中,用于 <span class="caps">VLAN</span></p>
<p><code>(config-if)#switchport mode trunk</code> //将该端口设为 <code>trunk</code> 模式,可选模式为<code>access</code> , <code>trunk</code></p>
<p><code>(config-if)#port-group 1</code> //将该端口划入聚合端口 <code>AG1</code> 中,用于聚合端口</p>
<ol>
<li>聚合端口的创建</li>
</ol>
<p><code>(config)# interface aggregateport 1</code> //创建聚合接口 <code>AG1</code></p>
<p><code>(config-if)# switchport mode trunk</code> //配置并保证AG1为 <code>trunk</code> 模式</p>
<p><code>(config)#int f0/23-24</code></p>
<p><code>(config-if-range)#port-group 1</code> //将端口(端口组)划入聚合端口 <code>AG1</code> 中</p>
<ol>
<li>生成树</li>
</ol>
<p>配置多生成树协议:</p>
<p><code>switch(config)#spanning-tree</code> //开启生成树协议</p>
<p><code>switch(config)#spanning-tree mst configuration</code> //建立多生成树协议</p>
<p><code>switch(config-mst)#name ruijie</code> //命名为 <code>ruijie</code></p>
<p><code>switch(config-mst)#revision 1</code> //设定校订本为 <code>1</code></p>
<p><code>switch(config-mst)#instance 0 vlan 10,20</code> //建立实例 <code>0</code></p>
<p><code>switch(config-mst)#instance 1 vlan 30,40</code> //建立实例 <code>1</code></p>
<p><code>switch(config)#spanning-tree mst 0 priority 4096</code> //设置优先级为 <code>4096</code></p>
<p><code>switch(config)#spanning-tree mst 1 priority 8192</code> //设置优先级为 <code>8192</code></p>
<p><code>switch(config)#interface vlan 10</code></p>
<p><code>switch(config-if)#vrrp 1 ip 192.168.10.1</code> //此为 <code>vlan 10</code> 的 <span class="caps">IP</span> 地址</p>
<p><code>switch(config)#interface vlan 20</code></p>
<p><code>switch(config-if)#vrrp 1 ip 192.168.20.1</code> //此为 <code>vlan 20</code> 的 <span class="caps">IP</span> 地址</p>
<p><code>switch(config)#interface vlan 30</code></p>
<p><code>switch(config-if)#vrrp 2 ip 192.168.30.1</code> //此为 <code>vlan 30</code> 的 <span class="caps">IP</span> 地址(另一三层交换机)</p>
<p><code>switch(config)#interface vlan 40</code></p>
<p><code>switch(config-if)#vrrp 2 ip 192.168.40.1</code> //此为 <code>vlan 40</code> 的 <span class="caps">IP</span> 地址(另一三层交换机)</p>
<ol>
<li>VLAN的基本配置</li>
</ol>
<p><code>(config)#vlan 10</code> //创建 <code>VLAN10</code></p>
<p><code>(config-vlan)#name vlanname</code> // 命名 <span class="caps">VLAN</span> 为 <code>vlanname</code></p>
<p><code>(config-if)#switchport access vlan 10</code> //将该端口划入 <span class="caps">VLAN10</span> 中</p>
<p>某端口的接口配置模式下进行</p>
<p><code>(config)#interface vlan 10</code> //进入 <code>VLAN 10</code> 的虚拟端口配置模式</p>
<p><code>(config-if)# ip address 192.168.1.1 255.255.255.0</code> //为 <code>VLAN10</code> 的虚拟端口配置 <span class="caps">IP</span> 及掩码,二层交换机只能配置一个 <span class="caps">IP</span> ,此 <span class="caps">IP</span> 是作为管理 <span class="caps">IP</span> 使用,例如,使用 Telnet 的方式登录的 <span class="caps">IP</span> 地址</p>
<p><code>(config-if)# no shutdown</code> //启用该端口</p>
<ol>
<li>端口安全</li>
</ol>
<p><code>(config)# interface fastethernet 0/1</code> //进入一个端口</p>
<p><code>(config-if)# switchport port-security</code> //开启该端口的安全功能</p>
<p>*. 配置最大连接数限制</p>
<p><code>(config-if)# switchport port-secruity maxmum 1</code> //配置端口的最大连接数为 <code>1</code>,最大连接数为 <code>128</code></p>
<p><code>(config-if)# switchport port-secruity violation shutdown</code> //配置安全违例的处理方式为 <code>shutdown</code>,可选为 <code>protect</code> (当安全地址数满后,将未知名地址丢弃)、<code>restrict</code> (当违例时,发送一个 Trap 通知)、<code>shutdown</code> (当违例时将端口关闭,并发送 Trap 通知,可在全局模式下用 <code>errdisable recovery</code> 来恢复)</p>
<p>*. <span class="caps">IP</span> 和 <span class="caps">MAC</span> 地址绑定</p>
<p><code>(config-if)#switchport port-security mac-address xxxx.xxxx.xxxx ip-address 172.16.1.1</code> //接口配置模式下配置 <span class="caps">MAC</span> 地址 <code>xxxx.xxxx.xxxx</code> 和 <span class="caps">IP</span> <code>172.16.1.1</code> 进行绑定( <span class="caps">MAC</span> 地址注意用小写)</p>
<ol>
<li>三层路由功能(针对三层交换机)</li>
</ol>
<p><code>(config)# ip routing</code> //开启三层交换机的路由功能</p>
<p><code>(config)# interface fastethernet 0/1</code></p>
<p><code>(config-if)# no switchport</code> //开启端口的三层路由功能(这样就可以为某一端口配置 <span class="caps">IP</span> )</p>
<p><code>(config-if)# ip address 192.168.1.1 255.255.255.0</code></p>
<p><code>(config-if)# no shutdown</code>
</p>
<ol>
<li>三层交换机路由协议</li>
</ol>
<p><code>(config)# ip route 172.16.1.0 255.255.255.0 172.16.2.1</code> //配置静态路由</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>注: <code>172.16.1.0 255.255.255.0</code> 为目标网络的网络号及子网掩码</p>
</div>
<p><code>172.16.2.1</code> 为下一跳的地址,也可用接口表示,如 <code>ip route 172.16.1.0 255.255.255.0 serial 1/2</code> ( <code>172.16.2.0</code> 所接的端口)</p>
<p><code>(config)# router rip</code> //开启 <span class="caps">RIP</span> 协议进程</p>
<p><code>(config-router)# network 172.16.1.0</code> //申明本设备的直连网段信息</p>
<p><code>(config-router)# version 2</code> //开启 <span class="caps">RIP</span> V2,可选为 <code>version 1</code> (<span class="caps">RIPV1</span>)、<code>version 2</code> (<span class="caps">RIPV2</span>)</p>
<p><code>(config-router)# no auto-summary</code> //关闭路由信息的自动汇总功能(只有在 <span class="caps">RIPV2</span> 支持)</p>
<p><code>(config)# router ospf</code> //开启 <span class="caps">OSPF</span> 路由协议进程(针对 1762,无需使用进程 <span class="caps">ID</span>)</p>
<p><code>(config)# router ospf 1</code> //开启 <span class="caps">OSPF</span> 路由协议进程(针对 2501,需要加 <span class="caps">OSPF</span> 进程 <span class="caps">ID</span>)</p>
<p><code>(config-router)# network 192.168.1.0 0.0.0.255 area 0</code> //申明直连网段信息,并分配区域号( area0 为骨干区域)</p>
<ol>
<li><span class="caps">IP</span> <span class="caps">ACL</span>:</li>
</ol>
<p>交换机采用命名的访问控制列表;分标准( stand )和扩展( extended )两种</p>
<p>*. 标准 <span class="caps">ACL</span></p>
<p><code>(config)#ip access-list stand listname</code> //定义命名标准列表,命名为 <code>listname</code>,<code>stand</code> 为标准列表</p>
<p><code>(config-std-nacl)#deny 192.168.30.0 0.0.0.255</code> //拒绝来 <code>自192.168.30.0</code> 网段的 <span class="caps">IP</span> 流量通过</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>注:<code>deny</code>:拒绝通过;可选:<code>deny</code> (拒绝通过)、<code>permit</code> (允许通过)</p>
</div>
<p><code>192.168.30.0 0.0.0.255</code>:源地址及源地址通配符;可使用 <code>any</code> 表示任何 <span class="caps">IP</span></p>
<p><code>(config-std-nacl)#permit any</code></p>
<p><code>(config-std-nacl)#end</code> //返回</p>
<p>*. 扩展 <span class="caps">ACL</span></p>
<p><code>(config)#ip access-list extended listname</code> //定义命名扩展列表,命名为 <code>listname</code> ,<code>extended</code> 为扩展</p>
<p><code>(config-ext-nacl)#deny tcp 192.168.30.0 0.0.0.255 192.168.10.0 0.0.0.255 eq www</code> //拒绝源地址为 <code>192.168.30.0</code> 网段的 <span class="caps">IP</span> 访问目的地址为 <code>192.168.10.0</code> 网段的 <span class="caps">WWW</span> 服务</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p><code>deny</code>:拒绝通过,可选:<code>deny</code>(拒绝通过)、<code>permit</code>(允许通过)</p>
<p><code>tcp</code>: 协议名称,协议可以是 <code>udp</code>, <code>ip</code>,<code>eigrp</code>, <code>gre</code>, <code>icmp</code>, <code>igmp</code>, <code>igrp</code> 等等。</p>
<p><code>192.168.10.0 0.0.0.255</code>:源地址及源地址通配符</p>
<p><code>192.168.30.0 0.0.0.255</code>:目的地址及目的地址通配符</p>
<p><code>eq</code>:操作符( <code>lt</code> - 小于,<code>eq</code> - 等于,<code>gt</code> - 大于,<code>neg</code> - 不等于,<code>range</code> - 包含)</p>
<p><code>www</code>:端口号,可使用名称或具体编号</p>
<p>可以使用的协议名称(或编号)和端口名称(或编号)请打 <code>?</code> 查询。</p>
</div>
<p><code>(config-ext-nacl)#permit ip any any</code> //允许其它通过</p>
<p><code>(config-ext-nacl)#end</code> //返回</p>
<p><code>(config)#interface vlan 10</code> //进入端口配置模式</p>
<p><code>(config-if)# ip access-group listname in</code> //访问控制列表在端口下 <code>in</code> 方向应用;可选: <code>in</code>(入栈)、<code>out</code>(出栈)</p>
<p><code>(config-if)#end</code> //返回</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>注:配置ACL时,若只想对其中部分IP进行限制访问时,必须配置允许其流量通过,否则设备只会对限制IP进行处理,不会对非限制IP进行允许通过处理。</p>
</div>
<h2 id="_2">二、功能配置命令示例<a class="headerlink" href="#_2" title="Permanent link"> </a></h2>
<ol>
<li>交换机密码</li>
</ol>
<p><code>(config)#enable secret level 1 0 100</code></p>
<p><code>(config)#enable secret level 15 0 100</code></p>
<ol>
<li>远程登入密码</li>
</ol>
<p><code>(config)#line vty 0 4</code></p>
<p><code>(config-line)#password 100</code></p>
<p><code>(config-line)#end</code></p>
<ol>
<li>交换机管理 <span class="caps">IP</span></li>
</ol>
<p><code>(config)#interface vlan 1</code></p>
<p><code>(config-if)#ip address 192.168.1.10 255.255.255.0</code></p>
<p><code>(config-if)#no shutdown</code></p>
<ol>
<li>修改交换机老化时间</li>
</ol>
<p><code>(config)#mac-address-table aging-time 20</code></p>
<p><code>(config)#end</code></p>
<ol>
<li>添删 vlan</li>
</ol>
<p><code>(config)#vlan 888</code></p>
<p><code>(config-vlan)#name a888</code></p>
<p><code>(config)#no vlan 888</code></p>
<ol>
<li>添加 access 口</li>
</ol>
<p><code>(config)#interface gigabitEthernet 0/10</code></p>
<p><code>(config-if)#switchport mode access</code></p>
<p><code>(config-if)#switchport access vlan 10</code></p>
<ol>
<li>切换 assess trunk</li>
</ol>
<p><code>(config-if)#switchport mode access</code></p>
<p><code>(config-if)#switchport mode trunk</code></p>
<ol>
<li>指定特定一个 native vlan</li>
</ol>
<p><code>(config-if)#switchport trunk native vlan 10</code></p>
<ol>
<li>配置网关</li>
</ol>
<p><code>switch(config)#ip default-gateway 192.168.1.254</code></p>
<ol>
<li>显示接口详细信息的命令</li>
</ol>
<p><code>show interfaces gigabitEthernet 4/1 counters</code></p>
<ol>
<li>接口配置</li>
</ol>
<p><code>Switch(config)#interface gigabitethernet 0/1</code></p>
<ol>
<li>把接口工作模式改为光口。</li>
</ol>
<p><code>Switch(config-if)#medium-type fiber</code></p>
<ol>
<li>把接口工作模式改为电口。</li>
</ol>
<p><code>Switch(config-if)#medium-type copper</code></p>
<ol>
<li>VLAN配置</li>
</ol>
<p>建立 <span class="caps">VLAN</span> 100
<code>Switch (config)#vlan 100</code></p>
<p>该VLAN名称为 <code>ruijie</code></p>
<p><code>Switch (config)#name ruijie</code></p>
<p>将交换机接口划入 <span class="caps">VLAN</span> 中:</p>
<p><code>range</code> 表示选取了系列端口 <code>1-48</code>,这个对多个端口进行相同配置时非常有用。</p>
<p><code>Switch (config)#interface range f 0/1-48</code></p>
<p>将接口划到 <span class="caps">VLAN</span> 100 中。</p>
<p><code>Switch (config-if-range)#switchport access vlan 100</code></p>
<p>将接口划回到默认 <span class="caps">VLAN</span> 1 中,即端口初始配置。</p>
<p><code>Switch (config-if-range)#no switchport access vlan</code></p>
<p><code>Switch(config)#interface fastEthernet 0/1</code></p>
<p>该端口工作在 <code>access</code> 模式下</p>
<p><code>Switch(config-if)#switchport mode access</code></p>
<p>该端口工作在 <code>trunk</code> 模式下</p>
<p><code>Switch(config-if)#switchport mode trunk</code></p>
<p><code>Switch(config)#interface fastEthernet 0/2</code></p>
<p>路由配置:添加一条路由。</p>
<p><code>switch (config)#ip route 目的地址 掩码 下一跳</code></p>
<p><code>switch (config)#ip route 210.10.10.0 255.255.255.0 218.8.8.8</code></p>
<h2 id="_3">附:<a class="headerlink" href="#_3" title="Permanent link"> </a></h2>
<ul>
<li><a href="https://kerwin.gitbook.io/ruijie/" target:_blank="target:_blank">锐捷产品手册</a></li>
<li><a href="http://bbs.ruijie.com.cn/thread-34794-1-1.html" target:_blank="target:_blank">Web登录密码修改方法</a></li>
</ul>shell 生成指定范围随机数与随机字符串2021-02-04T10:56:37+08:002021-02-04T10:56:37+08:00doobomtag:doobom.me,2021-02-04:/random-string-number-in-shell<p>shell 生成随机数</p><blockquote>
<p>原文 <a href="https://blog.csdn.net/fdipzone/article/details/24329523">shell 生成指定范围随机数与随机字符串</a></p>
</blockquote>
<h2 id="1-random">1.使用系统的 $<span class="caps">RANDOM</span> 变量<a class="headerlink" href="#1-random" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code>fdipzone@ubuntu:~$ <span class="nb">echo</span> <span class="nv">$RANDOM</span></span>
<span class="code-line"><span class="m">17617</span></span>
<span class="code-line"></code></pre></div>
<p><code>$RANDOM</code> 的范围是 [0, 32767]</p>
<p>如需要生成超过32767的随机数,可以用以下方法实现。</p>
<p>例:生成400000~500000的随机数</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="ch">#!/bin/bash</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">function</span> rand<span class="o">(){</span></span>
<span class="code-line"> <span class="nv">min</span><span class="o">=</span><span class="nv">$1</span></span>
<span class="code-line"> <span class="nv">max</span><span class="o">=</span><span class="k">$((</span><span class="nv">$2</span><span class="o">-</span><span class="nv">$min</span><span class="o">+</span><span class="m">1</span><span class="k">))</span></span>
<span class="code-line"> <span class="nv">num</span><span class="o">=</span><span class="k">$((</span><span class="nv">$RANDOM</span><span class="o">+</span><span class="m">1000000000</span><span class="k">))</span> <span class="c1">#增加一个10位的数再求余</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="k">$((</span><span class="nv">$num</span><span class="o">%</span><span class="nv">$max</span><span class="o">+</span><span class="nv">$min</span><span class="k">))</span></span>
<span class="code-line"><span class="o">}</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nv">rnd</span><span class="o">=</span><span class="k">$(</span>rand <span class="m">400000</span> <span class="m">500000</span><span class="k">)</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="nv">$rnd</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">exit</span> <span class="m">0</span></span>
<span class="code-line"></code></pre></div>
<h2 id="2-date-sn">2.使用 <code>date +%s%N</code><a class="headerlink" href="#2-date-sn" title="Permanent link"> </a></h2>
<p>例:生成 1~50 的随机数</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="ch">#!/bin/bash</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">function</span> rand<span class="o">(){</span></span>
<span class="code-line"> <span class="nv">min</span><span class="o">=</span><span class="nv">$1</span></span>
<span class="code-line"> <span class="nv">max</span><span class="o">=</span><span class="k">$((</span><span class="nv">$2</span><span class="o">-</span><span class="nv">$min</span><span class="o">+</span><span class="m">1</span><span class="k">))</span></span>
<span class="code-line"> <span class="nv">num</span><span class="o">=</span><span class="k">$(</span>date +%s%N<span class="k">)</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="k">$((</span><span class="nv">$num</span><span class="o">%</span><span class="nv">$max</span><span class="o">+</span><span class="nv">$min</span><span class="k">))</span></span>
<span class="code-line"><span class="o">}</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nv">rnd</span><span class="o">=</span><span class="k">$(</span>rand <span class="m">1</span> <span class="m">50</span><span class="k">)</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="nv">$rnd</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">exit</span> <span class="m">0</span></span>
<span class="code-line"></code></pre></div>
<h2 id="3-devrandom-devurandom">3.使用 <code>/dev/random</code> 和 <code>/dev/urandom</code><a class="headerlink" href="#3-devrandom-devurandom" title="Permanent link"> </a></h2>
<p><code>/dev/random</code> 存储着系统当前运行环境的实时数据,是阻塞的随机数发生器,读取有时需要等待。</p>
<p><code>/dev/urandom</code> 非阻塞随机数发生器,读取操作不会产生阻塞。</p>
<p>例:使用<code>/dev/urandom</code>生成 100~500 的随机数,使用<code>urandom</code>避免阻塞。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="ch">#!/bin/bash</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">function</span> rand<span class="o">(){</span></span>
<span class="code-line"> <span class="nv">min</span><span class="o">=</span><span class="nv">$1</span></span>
<span class="code-line"> <span class="nv">max</span><span class="o">=</span><span class="k">$((</span><span class="nv">$2</span><span class="o">-</span><span class="nv">$min</span><span class="o">+</span><span class="m">1</span><span class="k">))</span></span>
<span class="code-line"> <span class="nv">num</span><span class="o">=</span><span class="k">$(</span>cat /dev/urandom <span class="p">|</span> head -n <span class="m">10</span> <span class="p">|</span> cksum <span class="p">|</span> awk -F <span class="s1">' '</span> <span class="s1">'{print $1}'</span><span class="k">)</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="k">$((</span><span class="nv">$num</span><span class="o">%</span><span class="nv">$max</span><span class="o">+</span><span class="nv">$min</span><span class="k">))</span></span>
<span class="code-line"><span class="o">}</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nv">rnd</span><span class="o">=</span><span class="k">$(</span>rand <span class="m">100</span> <span class="m">500</span><span class="k">)</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="nv">$rnd</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">exit</span> <span class="m">0</span></span>
<span class="code-line"></code></pre></div>
<h2 id="4linux-uuid">4.使用linux <code>uuid</code><a class="headerlink" href="#4linux-uuid" title="Permanent link"> </a></h2>
<p><code>uuid</code> 全称是通用唯一识别码,格式包含 32 个 16 进制数字,以 ‘-‘ 连接号分为5段。形式为 8-4-4-4-12 的 32 个字符。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>fdipzone@ubuntu:~/shell$ cat /proc/sys/kernel/random/uuid</span>
<span class="code-line">fd496199-372a-403e-8ec9-bf4c52cbd9cd</span>
<span class="code-line"></code></pre></div>
<p>例:使用linux <code>uuid</code> 生成 100~500 随机数</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="ch">#!/bin/bash</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">function</span> rand<span class="o">(){</span></span>
<span class="code-line"> <span class="nv">min</span><span class="o">=</span><span class="nv">$1</span></span>
<span class="code-line"> <span class="nv">max</span><span class="o">=</span><span class="k">$((</span><span class="nv">$2</span><span class="o">-</span><span class="nv">$min</span><span class="o">+</span><span class="m">1</span><span class="k">))</span></span>
<span class="code-line"> <span class="nv">num</span><span class="o">=</span><span class="k">$(</span>cat /proc/sys/kernel/random/uuid <span class="p">|</span> cksum <span class="p">|</span> awk -F <span class="s1">' '</span> <span class="s1">'{print $1}'</span><span class="k">)</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="k">$((</span><span class="nv">$num</span><span class="o">%</span><span class="nv">$max</span><span class="o">+</span><span class="nv">$min</span><span class="k">))</span></span>
<span class="code-line"><span class="o">}</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nv">rnd</span><span class="o">=</span><span class="k">$(</span>rand <span class="m">100</span> <span class="m">500</span><span class="k">)</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="nv">$rnd</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">exit</span> <span class="m">0</span></span>
<span class="code-line"></code></pre></div>
<h2 id="5">5.生成随机字符串<a class="headerlink" href="#5" title="Permanent link"> </a></h2>
<p>例:生成 10 位随机字符串</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1">#使用date 生成随机字符串</span></span>
<span class="code-line">date +%s%N <span class="p">|</span> md5sum <span class="p">|</span> head -c <span class="m">10</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">#使用 /dev/urandom 生成随机字符串</span></span>
<span class="code-line">cat /dev/urandom <span class="p">|</span> head -n <span class="m">10</span> <span class="p">|</span> md5sum <span class="p">|</span> head -c <span class="m">10</span></span>
<span class="code-line"></code></pre></div>How To Use Crontab In Android?2021-01-22T21:45:30+08:002021-01-22T21:45:30+08:00doobomtag:doobom.me,2021-01-22:/how-to-use-crontab-in-android<p>在安卓(android) 上打开 计划任务 的功能,就是 crontab</p><p>首先,你得 root , 如果没有,那没戏了。</p>
<blockquote>
<p>以下原文: <a href="https://stackoverflow.com/questions/16747880/how-to-use-crontab-in-android">How to use crontab in Android?</a></p>
</blockquote>
<p><strong>Requirements</strong></p>
<ul>
<li>
<p>Root access: for superuser commads like reboot, or init.d config. Crond can still run under normal user privs.</p>
</li>
<li>
<p>Busybox: for ‘crond’ service</p>
</li>
<li>
<p>(Optional) init.d support: to start ‘crond’ service at boot. Or start via Magisk post-fs-data.d script.</p>
</li>
</ul>
<p><strong>Creating cronjob</strong></p>
<p>Create the cronjob file in directory <code>/data/crontab/</code> (it could be any accessible directory even in sdcard) with filename ‘<code>root</code><span class="quo">‘</span>. Write your cronjob inside the file ‘root’.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">echo</span> <span class="s1">'53 * * * * reboot'</span> >> /data/crontab/root</span>
<span class="code-line"></code></pre></div>
<p><strong>Test without rebooting</strong></p>
<p>Now open any terminal emulator in device and run the following commands..</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>su -</span>
<span class="code-line">crond -b -c /data/crontab</span>
<span class="code-line"></code></pre></div>
<p>Now the crond service will start, to check type <code>pgrep -l crond</code> or <code>ps | grep crond</code></p>
<p><strong>Start crond at boot</strong></p>
<p>create a file at <code>/system/etc/init.d</code> with executable permission:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">echo</span> <span class="s1">'crond -b -c /data/crontab'</span> > /system/etc/init.d/crond</span>
<span class="code-line"></span>
<span class="code-line">chmod +x /system/etc/init.d/crond</span>
<span class="code-line"></code></pre></div>
<p><strong>Example cronjobs</strong></p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="m">53</span> * * * * reboot</span>
<span class="code-line"></code></pre></div>
<p>Will reboot your device on 53rd minute of every hour.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<ol>
<li>
<p>If you modify crontab, remember to restart crond daemon after killing the existing one.</p>
</li>
<li>
<p>If the crond is not obeying your timezone, you might need to update the tzdata in your device.</p>
</li>
<li>
<p>Better to test with <code>*/1 * * * *</code> to see if it is working.</p>
</li>
</ol>
</div>
<hr />
<p>因为我没在 <code>/system/etc</code> 目录下找到 <code>init.d</code> , 因此我是这么着的:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">echo</span> <span class="s1">'crond -b -c /data/crontab'</span> > /data/adb/service.d/crond</span>
<span class="code-line"></span>
<span class="code-line">chmod +x /data/adb/service.d/crond</span>
<span class="code-line"></code></pre></div>
<p>本来吧,我是准备把 <code>crontab</code> 目录放到 <span class="caps">SD</span> 卡上的,试了一下,启动的时候识别不到,因此放弃了。</p>
<p>所以,如果你有什么需要在启动的时候运行的话,可以把脚本放在 <code>/data/adb/service.d</code> 或是 <code>/data/adb/post-fs-data.d</code> 目录里面就可以了。</p>
<p>具体可以参考: <a href="https://github.com/topjohnwu/Magisk/blob/master/docs/guides.md#boot-scripts">Magisk: Developer Guides</a></p>
<p>还有一个详细介绍 Crond 的: <a href="https://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/">How To Add Jobs To cron Under Linux or <span class="caps">UNIX</span></a></p>
<p>用 <code>termux</code> 实现应该也是可以的,具体没有试,可以参考: <a href="https://www.reddit.com/r/termux/comments/i27szk/how_do_i_crontab_on_termux/">How do I Crontab on Termux..</a></p>小米 9se 手机自定义启动画面 splash/logo2021-01-20T21:12:54+08:002021-01-20T21:12:54+08:00doobomtag:doobom.me,2021-01-20:/mi9se-splash-logo-image-modify<p>折腾一下 小米 9se 的 splash, 就是刚启动开机时显示的那个 logo 画面</p><p>网上一直找不到 mi9se 的 splash 的做法,找了好一会儿找到红米4 的 splash 脚本,毕竟太老估计没参考价值,然后在 <span class="caps">XDA</span> 上找到了 mi9 的: <a href="https://forum.xda-developers.com/t/mi-9-splash-boot-image-creation-script.3952572/">Mi 9 Splash / Boot Image creation script.</a> , 嗯,看来有戏。</p>
<p>首先</p>
<p>把 <code>logo</code> 分区 <code>dd</code> 下来,毕竟我是有 root 的人,我记得以前都是在 <code>splash</code> 分区的,我也一起 <code>dd</code> 了,根据上面 <span class="caps">XDA</span> 的文,不在 <code>splash</code> 分区,我也看了 <code>splash.img</code>, 都是填充的 <code>00</code> :</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>su</span>
<span class="code-line">dd <span class="k">if</span><span class="o">=</span>/dev/block/bootdevice/by-name/logo <span class="nv">of</span><span class="o">=</span>/sdcard/logo.img</span>
<span class="code-line"></code></pre></div>
<p>根据 <span class="caps">XDA</span> 上所说在偏移量 <code>0x4000</code> 位置定义了 <code>logo</code> 相关图片的信息,look:</p>
<p><img alt="" src="images/a002-1.jpg" /></p>
<p>折腾了一下,还是跟 mi9 有些差别,其中:</p>
<ul>
<li><code>0x5000</code>: 第一张图片位置</li>
<li><code>0x740000</code>: 第二张图片位置</li>
<li><code>0xe7b000</code>: 第三张图片位置</li>
<li><code>0x15b6000</code>: 第四张图片位置</li>
<li><code>0x1cf1000</code>: 第五张图片位置</li>
</ul>
<p>前四张图片大小均为 <code>0x73b000</code>, 第五张图片大小 <code>0x26a000</code>, 为了知道每张图的作用,我得把图导出来看看,所以 WinHEX 是个神器啊:</p>
<p>首先 <code>编辑</code> > <code>定义选块</code>:</p>
<p><img alt="" src="images/a002-2.jpg" /></p>
<p>接首 <code>编辑</code> > <code>复制选块</code> > <code>至新文件</code> , 保存为 <code>bmp</code> 就是图片了。图片全导出后就知道每张图的作用了。</p>
<p>图片定义:</p>
<ul>
<li><code>pic1.bmp</code> : 启动画面</li>
<li><code>pic2.bmp</code> : fastboot 画面</li>
<li><code>pic3.bmp</code> : 未解锁画面</li>
<li><code>pic4.bmp</code> : 已经解锁画面</li>
<li><code>pic5.bmp</code> : 系统损坏</li>
</ul>
<p>最后能看出 1~4 的图片一样大小,所以我就在想是不是参数一样的 位图 都是一样大小的,经我这菜鸡 ps 高手确认过眼神,是的。所以最后一张是 8 位的,ps 导不出 8 位的 位图。也许是我操作不对。</p>
<p>最后我最后一图也是用的 24 位的,修改了最后一图的 文件大小。试一下嘛。</p>
<p>拿了 <span class="caps">XDA</span> 上找到的 <code>mi9_logo-1080-2340.py</code> 修改了一下, 我把它取名 <code>mi9se_logo-1080-2340.py</code>:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kn">import</span> <span class="nn">io</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">offset0</span> <span class="o">=</span> <span class="mh">0x4000</span></span>
<span class="code-line"><span class="n">offset1</span> <span class="o">=</span> <span class="mh">0x5000</span></span>
<span class="code-line"><span class="n">offset2</span> <span class="o">=</span> <span class="mh">0x740000</span></span>
<span class="code-line"><span class="n">offset3</span> <span class="o">=</span> <span class="mh">0xE7B000</span></span>
<span class="code-line"><span class="n">offset4</span> <span class="o">=</span> <span class="mh">0x15B6000</span></span>
<span class="code-line"><span class="n">offset5</span> <span class="o">=</span> <span class="mh">0x1CF1000</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">outpt</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"logo_new_mi9se.img"</span><span class="p">,</span> <span class="s2">"wb"</span><span class="p">)</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 8bit @pic5.bmp</span></span>
<span class="code-line"><span class="n">emptyContent0</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mh">0x1F5B000</span><span class="p">)]</span></span>
<span class="code-line"><span class="c1"># 24bit @pic5.bmp</span></span>
<span class="code-line"><span class="n">emptyContent1</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mh">0x242C000</span><span class="p">)]</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 8bit @pic5.bmp</span></span>
<span class="code-line"><span class="n">mi9seOffset0</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x4C</span><span class="p">,</span> <span class="mh">0x4F</span><span class="p">,</span> <span class="mh">0x47</span><span class="p">,</span> <span class="mh">0x4F</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span></span>
<span class="code-line"> <span class="mh">0x7B</span><span class="p">,</span> <span class="mh">0x0E</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xB6</span><span class="p">,</span> <span class="mh">0x15</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xF1</span><span class="p">,</span> <span class="mh">0x1C</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span></span>
<span class="code-line"> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x6A</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">]</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 24bit @pic5.bmp</span></span>
<span class="code-line"><span class="n">mi9seOffset1</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x4C</span><span class="p">,</span> <span class="mh">0x4F</span><span class="p">,</span> <span class="mh">0x47</span><span class="p">,</span> <span class="mh">0x4F</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span></span>
<span class="code-line"> <span class="mh">0x7B</span><span class="p">,</span> <span class="mh">0x0E</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xB6</span><span class="p">,</span> <span class="mh">0x15</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xF1</span><span class="p">,</span> <span class="mh">0x1C</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span></span>
<span class="code-line"> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x3B</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">]</span></span>
<span class="code-line"></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">bytearray</span><span class="p">(</span><span class="n">emptyContent1</span><span class="p">))</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">offset0</span><span class="p">)</span></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">bytearray</span><span class="p">(</span><span class="n">mi9seOffset1</span><span class="p">))</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">offset1</span><span class="p">)</span></span>
<span class="code-line"><span class="n">img</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"pic1.bmp"</span><span class="p">,</span> <span class="s2">"rb"</span><span class="p">)</span></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">img</span><span class="o">.</span><span class="n">read</span><span class="p">())</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">offset2</span><span class="p">)</span></span>
<span class="code-line"><span class="n">img</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"pic2.bmp"</span><span class="p">,</span> <span class="s2">"rb"</span><span class="p">)</span></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">img</span><span class="o">.</span><span class="n">read</span><span class="p">())</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">offset3</span><span class="p">)</span></span>
<span class="code-line"><span class="n">img</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"pic3.bmp"</span><span class="p">,</span> <span class="s2">"rb"</span><span class="p">)</span></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">img</span><span class="o">.</span><span class="n">read</span><span class="p">())</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">offset4</span><span class="p">)</span></span>
<span class="code-line"><span class="n">img</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"pic4.bmp"</span><span class="p">,</span> <span class="s2">"rb"</span><span class="p">)</span></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">img</span><span class="o">.</span><span class="n">read</span><span class="p">())</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">offset5</span><span class="p">)</span></span>
<span class="code-line"><span class="n">img</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"pic5.bmp"</span><span class="p">,</span> <span class="s2">"rb"</span><span class="p">)</span></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">img</span><span class="o">.</span><span class="n">read</span><span class="p">())</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">outpt</span><span class="o">.</span><span class="n">close</span><span class="p">()</span></span>
<span class="code-line"></code></pre></div>
<p>找了几张帅气的照片转成 <code>bmp</code> ,激动的运行 <code>python mi9se_logo-1080-2340.py</code>, 就有了 <code>logo_new_mi9se.img</code>.</p>
<p>然后</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>fastboot flash logo logo_new_mi9se.img</span>
<span class="code-line">fastboot reboot</span>
<span class="code-line"></code></pre></div>
<p>结果出来了,就是我那帅气的照片。</p>
<p>另外根据 github 上的 <a href="https://github.com/Danct12/Xiaomi_Splash_Creator">Xiaomi_Splash_Creator</a> 源码,我就把 <code>dd</code> 出来的 <code>logo.img</code> 从 <code>0x00</code> 到 <code>0x5000</code> 导出做为头文件,然后:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>cat mi9se/header1.img pic1.bmp pic2.bmp pic3.bmp pic4.bmp pic5.bmp > logo_new_mi9se.img</span>
<span class="code-line"></code></pre></div>
<p>刷了进去,效果一毛一样的。</p>
<p>到此结束。</p>
<p>稍等一下,我把这些放 github 上了: <a href="https://github.com/doobom/mi9-mi9se-logo-image-creation-script">mi9-mi9se-logo-image-creation-script</a>.</p>
<p>参考的文中都有提了,就不另列出来了。</p>Reading And Creating Text Files Using Jquery And Html5 File Api2021-01-14T22:05:12+08:002021-01-14T22:05:12+08:00doobomtag:doobom.me,2021-01-14:/reading-and-creating-text-files-using-jquery-and-html5-file-api<p>Reading And Creating Text Files Using Jquery And Html5 File Api</p><blockquote>
<p>原文: <a href="https://stacktips.com/tutorials/html5/reading-and-creating-text-files-using-jquery-and-html5-file-api" target="_blank">Reading and Creating Text Files Using jQuery and <span class="caps">HTML5</span> File <span class="caps">API</span></a></p>
</blockquote>
<p>The following code snippet demonstrate how to read and create a text files using the jQuery and <span class="caps">HTML5</span> file <span class="caps">API</span>. For the sake of simplicity, in this example I am using Bootstrap <span class="caps">CSS</span> framework for building the page.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="cp"><!DOCTYPE html></span></span>
<span class="code-line"><span class="p"><</span><span class="nt">html</span> <span class="na">lang</span><span class="o">=</span><span class="s">"en"</span><span class="p">></span></span>
<span class="code-line"><span class="p"><</span><span class="nt">head</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">meta</span> <span class="na">charset</span><span class="o">=</span><span class="s">"utf-8"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">meta</span> <span class="na">name</span><span class="o">=</span><span class="s">"description"</span> <span class="na">content</span><span class="o">=</span><span class="s">"Your HTML, CSS, and JavaScript playground."</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">title</span><span class="p">></span>HTML, CSS, JS Playground<span class="p"></</span><span class="nt">title</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">meta</span> <span class="na">content</span><span class="o">=</span><span class="s">"width=device-width, initialscale=1"</span> <span class="na">name</span><span class="o">=</span><span class="s">"viewport"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">link</span> <span class="na">href</span><span class="o">=</span><span class="s">"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css"</span> <span class="na">rel</span><span class="o">=</span><span class="s">"stylesheet"</span><span class="p">></span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="p"><</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">"https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/javascript"</span><span class="p">></</span><span class="nt">script</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">script</span> <span class="na">src</span><span class="o">=</span><span class="s">"https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"</span> <span class="na">type</span><span class="o">=</span><span class="s">"text/javascript"</span><span class="p">></</span><span class="nt">script</span><span class="p">></span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="p"><</span><span class="nt">script</span><span class="p">></span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="nb">document</span> <span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span></span>
<span class="code-line"> <span class="c1">//Put your java script here</span></span>
<span class="code-line"> <span class="p">});</span></span>
<span class="code-line"> <span class="p"></</span><span class="nt">script</span><span class="p">></span></span>
<span class="code-line"><span class="p"></</span><span class="nt">head</span><span class="p">></span></span>
<span class="code-line"><span class="p"><</span><span class="nt">body</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"container"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">h1</span><span class="p">></span>Reading and Creating Text Files Using the HTML5 File API and jQuery<span class="p"></</span><span class="nt">h1</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"form-group"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">"button"</span> <span class="na">class</span><span class="o">=</span><span class="s">"btn btn-default"</span> <span class="na">id</span><span class="o">=</span><span class="s">"btnOpen"</span><span class="p">></span>Open...<span class="p"></</span><span class="nt">button</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">button</span> <span class="na">type</span><span class="o">=</span><span class="s">"button"</span> <span class="na">class</span><span class="o">=</span><span class="s">"btn btn-default"</span> <span class="na">id</span><span class="o">=</span><span class="s">"btnSave"</span><span class="p">></span>Save<span class="p"></</span><span class="nt">button</span><span class="p">></span></span>
<span class="code-line"> <span class="p"></</span><span class="nt">div</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">input</span> <span class="na">type</span><span class="o">=</span><span class="s">"file"</span> <span class="na">id</span><span class="o">=</span><span class="s">"exampleInputFile"</span> <span class="na">accept</span><span class="o">=</span><span class="s">".txt,.csv,.xml"</span> <span class="na">class</span><span class="o">=</span><span class="s">"hidden"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">div</span> <span class="na">class</span><span class="o">=</span><span class="s">"form-group"</span><span class="p">></span></span>
<span class="code-line"> <span class="p"><</span><span class="nt">textarea</span> <span class="na">class</span><span class="o">=</span><span class="s">"form-control"</span> <span class="na">rows</span><span class="o">=</span><span class="s">"15"</span> <span class="na">id</span><span class="o">=</span><span class="s">"exampleTextarea"</span><span class="p">></</span><span class="nt">textarea</span><span class="p">></span></span>
<span class="code-line"> <span class="p"></</span><span class="nt">div</span><span class="p">></span></span>
<span class="code-line"> <span class="p"></</span><span class="nt">div</span><span class="p">></span></span>
<span class="code-line"><span class="p"></</span><span class="nt">body</span><span class="p">></span></span>
<span class="code-line"></code></pre></div>
<p>Reading text file</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nx">$</span><span class="p">(</span><span class="s1">'#btnOpen'</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="s1">'FileReader'</span> <span class="k">in</span> <span class="nb">window</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s1">'#exampleInputFile'</span><span class="p">).</span><span class="nx">click</span><span class="p">();</span></span>
<span class="code-line"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">alert</span><span class="p">(</span><span class="s1">'Your browser does not support the HTML5 FileReader.'</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"><span class="p">});</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nx">$</span><span class="p">(</span><span class="s1">'#exampleInputFile'</span><span class="p">).</span><span class="nx">change</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">fileToLoad</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">files</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="nx">fileToLoad</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">reader</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FileReader</span><span class="p">();</span></span>
<span class="code-line"> <span class="nx">reader</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">fileLoadedEvent</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">textFromFileLoaded</span> <span class="o">=</span> <span class="nx">fileLoadedEvent</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">result</span><span class="p">;</span></span>
<span class="code-line"> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"loaded "</span> <span class="o">+</span> <span class="nx">textFromFileLoaded</span><span class="p">);</span></span>
<span class="code-line"> <span class="nx">$</span><span class="p">(</span><span class="s1">'#exampleTextarea'</span><span class="p">).</span><span class="nx">val</span><span class="p">(</span><span class="nx">textFromFileLoaded</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">};</span></span>
<span class="code-line"> <span class="nx">reader</span><span class="p">.</span><span class="nx">readAsText</span><span class="p">(</span><span class="nx">fileToLoad</span><span class="p">,</span> <span class="s1">'UTF-8'</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"><span class="p">});</span></span>
<span class="code-line"></code></pre></div>
<p>Creating text file</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nx">$</span><span class="p">(</span><span class="s1">'#btnSave'</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="s1">'Blob'</span> <span class="k">in</span> <span class="nb">window</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">fileName</span> <span class="o">=</span> <span class="nx">prompt</span><span class="p">(</span><span class="s1">'Please enter file name to save'</span><span class="p">,</span> <span class="s1">'Untitled.txt'</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="nx">fileName</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">textToWrite</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">'#exampleTextarea'</span><span class="p">).</span><span class="nx">val</span><span class="p">().</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/n/g</span><span class="p">,</span> <span class="s1">'rn'</span><span class="p">);</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">textFileAsBlob</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Blob</span><span class="p">([</span><span class="nx">textToWrite</span><span class="p">],</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="s1">'text/plain'</span> <span class="p">});</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="s1">'msSaveOrOpenBlob'</span> <span class="k">in</span> <span class="nx">navigator</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">navigator</span><span class="p">.</span><span class="nx">msSaveOrOpenBlob</span><span class="p">(</span><span class="nx">textFileAsBlob</span><span class="p">,</span> <span class="nx">fileName</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">downloadLink</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">'a'</span><span class="p">);</span></span>
<span class="code-line"> <span class="nx">downloadLink</span><span class="p">.</span><span class="nx">download</span> <span class="o">=</span> <span class="nx">fileName</span><span class="p">;</span></span>
<span class="code-line"> <span class="nx">downloadLink</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s1">'Download File'</span><span class="p">;</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="s1">'webkitURL'</span> <span class="k">in</span> <span class="nb">window</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="c1">// Chrome allows the link to be clicked without actually adding it to the DOM.</span></span>
<span class="code-line"> <span class="nx">downloadLink</span><span class="p">.</span><span class="nx">href</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">webkitURL</span><span class="p">.</span><span class="nx">createObjectURL</span><span class="p">(</span><span class="nx">textFileAsBlob</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></span>
<span class="code-line"> <span class="c1">// Firefox requires the link to be added to the DOM before it can be clicked.</span></span>
<span class="code-line"> <span class="nx">downloadLink</span><span class="p">.</span><span class="nx">href</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">URL</span><span class="p">.</span><span class="nx">createObjectURL</span><span class="p">(</span><span class="nx">textFileAsBlob</span><span class="p">);</span></span>
<span class="code-line"> <span class="nx">downloadLink</span><span class="p">.</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span></span>
<span class="code-line"> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">removeChild</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">});</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="nx">downloadLink</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="s1">'none'</span><span class="p">;</span></span>
<span class="code-line"> <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">downloadLink</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="nx">downloadLink</span><span class="p">.</span><span class="nx">click</span><span class="p">();</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">alert</span><span class="p">(</span><span class="s1">'Your browser does not support the HTML5 Blob.'</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"><span class="p">});</span></span>
<span class="code-line"></code></pre></div>小米9se 刷机并解锁 Google Now2021-01-13T22:45:05+08:002021-01-13T22:45:05+08:00doobomtag:doobom.me,2021-01-13:/mi9se-flash-miui12-enable-google-now<p>小米 9se 刷最新的 miui12,并刷入 谷歌全家桶,再打开 Google Now 的折腾经历</p><p>事情起因是这样子的,本来吧,我只是想重置一下手机的,当然并不是在设置菜单里面点击恢复出产设置,或是清除数据什么的,做为~资深玩家~的菜鸡,当然是去到 Recovery 里面清,所以不小心勾上了 System,行吧,没了。</p>
<p>即然都这样子了,那。。。那就来一发吧。</p>
<p>首先下载了国际版的 9se 的线刷固件,然后下了最新版的 <a href="https://twrp.me">twrp</a> ,不过吧,<a href="https://xiaomi.eu">xiaomi.eu</a> 发布的固件呼声也很高嘛,所以一起下了个最新版的周更版固件,当然还下了其它的一些,最新周更版的是 miui12,android11 的,gapps 也是必不可少的嘛,刷了安卓,没有刷 gapp 是没有灵魂的,没有 root 也是没有灵魂的,所以下了 magisk v21,没有 google now 怎么行?</p>
<h2 id="1">折腾 1:<a class="headerlink" href="#1" title="Permanent link"> </a></h2>
<p>我目前用的是苹果电脑,所以得安装 <span class="caps">ADB</span> 吧,根据 <a href="https://stackoverflow.com/questions/31374085/installing-adb-on-macos">Installing <span class="caps">ADB</span> on macOS</a> 所说的也就完事了:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1">#Install the homebrew package manager</span></span>
<span class="code-line">/bin/bash -c <span class="s2">"</span><span class="k">$(</span>curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh<span class="k">)</span><span class="s2">"</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">#Install adb</span></span>
<span class="code-line">brew install android-platform-tools</span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">#Start using adb</span></span>
<span class="code-line">adb devices</span>
<span class="code-line"></code></pre></div>
<p>用小米工具线刷 rom ,这个吧就是等他一会儿就好了,然后重启,因为刷了原版 rom , 所以 recovery 必定是回到了自带了,必须干掉是吧。</p>
<p>然后刷 twrp:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>fastboot flash recovery twrp-3.5.0.img</span>
<span class="code-line"></code></pre></div>
<p>网上说的各种姿势防止回到 原厂 recovery:</p>
<ol>
<li>用上面的命令完了后再用下面命令重启</li>
</ol>
<div class="highlight"><pre><span class="code-line"><span></span><code>fastboot boot twrp-3.5.0.img</span>
<span class="code-line"></code></pre></div>
<p>然而,我的手机会重启到系统,并不会重启到 recovery,所以失败了</p>
<ol>
<li>
<p>刷完 twrp 用 音量+ 和 电源键 长按进入 recovery,然后用 twrp 的安装功能再刷一次 <code>twrp-3.5.0.img</code> 然而我重启了之后依然是回到了原产。</p>
</li>
<li>
<p>我改一下刷机包,线刷的时候直接刷 twrp 试试,然而还是失败了。</p>
</li>
</ol>
<p>所以一度想要放弃 android 11 ,我以为吧,是固件的锅,最后想起以前下载的旧版,针对 mi9se 做的 twrp , 刷了之后发现里面有一个 boot 签名的功能,果断运行一下,还真给固定了,所以是 boot 没有重签,导致系统验证恢复到 原厂 recovery, 然后再刷 3.5.0 的 twrp 就好了。</p>
<h2 id="2">折腾 2<a class="headerlink" href="#2" title="Permanent link"> </a></h2>
<p>当然是把 <span class="caps">GAPPS</span> 给刷进去,我下载的是 <a href="https://www.cyanogenmods.org/android-11-gapps-download/">NikGApps</a> 完整版的,<a href="https://opengapps.org/">opengapps</a> 没有 android 11 的,嗯,刷不进去,提示空间不足,首先我想到的是不安装一些吧。但是失败了,行吧,那就删 system 里面的我觉得不要的软件吧。</p>
<p>为此我还整的一个 shell 脚本用来删不要的软件,过程很是酸爽啊。</p>
<p>以下:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="ch">#!/sbin/sh</span></span>
<span class="code-line"><span class="nb">echo</span> <span class="s2">"********* Starting REMOVE"</span></span>
<span class="code-line"><span class="c1"># 要删除的软件列表</span></span>
<span class="code-line"><span class="nv">appsList</span><span class="o">=(</span><span class="s2">"Browser"</span> <span class="s2">"Calculator"</span> <span class="s2">"Calendar"</span> <span class="s2">"CleanMaster"</span> <span class="s2">"DeskClock"</span> <span class="s2">"DocumentsUIGoogle"</span> <span class="s2">"Email"</span> <span class="s2">"FileExplorer"</span> <span class="s2">"Health"</span> <span class="s2">"InCallUI"</span> <span class="s2">"MiDrive"</span> <span class="s2">"MiGalleryLockscreen"</span> <span class="s2">"MiMover"</span> <span class="s2">"MiuiBugReport"</span> <span class="s2">"MiuiCompass"</span> <span class="s2">"MiuiGallery"</span> <span class="s2">"MiuiScanner"</span> <span class="s2">"MiuiScreenRecorder"</span> <span class="s2">"MiuiVideoGlobal"</span> <span class="s2">"Music"</span> <span class="s2">"NextPay"</span> <span class="s2">"Notes"</span> <span class="s2">"PeelMiRemote"</span> <span class="s2">"PersonalAssistant"</span> <span class="s2">"QuickSearchBox"</span> <span class="s2">"SoundRecorder"</span> <span class="s2">"SuperWallpaperEarth"</span> <span class="s2">"SuperWallpaperGeometry"</span> <span class="s2">"SuperWallpaperMars"</span> <span class="s2">"SuperWallpaperSaturn"</span> <span class="s2">"SuperWallpaperSnowmountain"</span> <span class="s2">"MiService"</span> <span class="s2">"Weather"</span> <span class="s2">"wps-lite"</span> <span class="s2">"MiuiWallpaper"</span> <span class="s2">"LiveWallpapersPicker"</span> <span class="s2">"WallpaperBackup"</span><span class="o">)</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># 这几个软件如果删了就没有壁纸功能了,设置了也没有用</span></span>
<span class="code-line"><span class="c1">#"MiuiWallpaper" "LiveWallpapersPicker" "WallpaperBackup")</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">for</span> i in <span class="s2">"</span><span class="si">${</span><span class="nv">appsList</span><span class="p">[@]</span><span class="si">}</span><span class="s2">"</span></span>
<span class="code-line"><span class="k">do</span></span>
<span class="code-line"> <span class="k">if</span> <span class="o">[</span> -d <span class="s2">"/system/priv-app/</span><span class="nv">$i</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"* Remove App: /system/priv-app/</span><span class="nv">$i</span><span class="s2">"</span></span>
<span class="code-line"> rm -rf /system/priv-app/<span class="nv">$i</span></span>
<span class="code-line"> <span class="k">elif</span> <span class="o">[</span> -d <span class="s2">"/system/app/</span><span class="nv">$i</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"* Remove App: /system/app/</span><span class="nv">$i</span><span class="s2">"</span></span>
<span class="code-line"> rm -rf /system/app/<span class="nv">$i</span></span>
<span class="code-line"> <span class="k">elif</span> <span class="o">[</span> -d <span class="s2">"/data/app/</span><span class="nv">$i</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"* Remove App: /data/app/</span><span class="nv">$i</span><span class="s2">"</span></span>
<span class="code-line"> rm -rf /data/app/<span class="nv">$i</span></span>
<span class="code-line"> <span class="k">else</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"- Not Found </span><span class="nv">$i</span><span class="s2"> in /system/app/ or /system/priv-app/ or /data/app/"</span></span>
<span class="code-line"> <span class="k">fi</span></span>
<span class="code-line"><span class="k">done</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">if</span> <span class="o">[</span> -d <span class="s2">"/system/media/wallpaper/wallpaper_group"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"* Remove Wallpaper"</span></span>
<span class="code-line"> rm -rf /system/media/wallpaper/wallpaper_group</span>
<span class="code-line"><span class="k">fi</span></span>
<span class="code-line"><span class="k">if</span> <span class="o">[</span> -d <span class="s2">"/system/media/audio/ringtones/"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"* Remove ringtones"</span></span>
<span class="code-line"> rm -rf /system/media/audio/ringtones/*</span>
<span class="code-line"><span class="k">fi</span></span>
<span class="code-line"><span class="k">if</span> <span class="o">[</span> -d <span class="s2">"/data/preloads/"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"* Remove Preload Apps"</span></span>
<span class="code-line"> rm -rf /data/preloads/*</span>
<span class="code-line"><span class="k">fi</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">echo</span> <span class="s2">"********* REMOVE DONE"</span></span>
<span class="code-line"></code></pre></div>
<p>最后看了一下这些我不要的软件,1.2+G 啊。这下就可以轻松的上全家桶了。</p>
<h2 id="3">折腾 3<a class="headerlink" href="#3" title="Permanent link"> </a></h2>
<p>来点有 灵魂 的 root 吧,magisk 还是很轻松的就刷进去了,并且运行良好,没啥毛病。</p>
<p>没插卡的时候 google now 正常,记得以前看过,只要禁用 google play service 的电话权限就可以了,但是吧,设置里面找不到。行吧,以前旧版 安卓 似乎修改 <code>build.prop</code> 也是可以的。</p>
<p>android 11 的 <code>build.prop</code> 好几个位置都有,<code>system</code>, <code>product</code>, <code>vendor</code>, <code>system_ext</code> 里面都有。所以我全都把下面几个改了:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">echo</span> <span class="s2">"********* Modify Build.prop"</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">echo</span> <span class="s2">"* modify build.prop"</span></span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.system\.model.*/ro\.product\.system\.model\=Pixel\ 5\ XL/g'</span> /system/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.opa.eligible_device.*//g'</span> /system/build.prop</span>
<span class="code-line"><span class="nb">echo</span> <span class="s1">'ro.opa.eligible_device=true'</span> >> /system/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.system\.brand.*/ro\.product\.system\.brand\=google/g'</span> /system/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.system\.manufacturer.*/ro\.product\.system\.manufacturer\=Google/g'</span> /system/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.manufacturer.*/ro\.product\.manufacturer\=Google/g'</span> /system/build.prop</span>
<span class="code-line"></span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.product\.model.*/ro\.product\.product\.model\=Pixel\ 5\ XL/g'</span> /system/product/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.product\.manufacturer.*/ro\.product\.product\.manufacturer\=Google/g'</span> /system/product/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.product\.brand.*/ro\.product\.product\.brand\=google/g'</span> /system/product/build.prop</span>
<span class="code-line"></span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.system_ext\.model.*/ro\.product\.system_ext\.model\=Pixel\ 5\ XL/g'</span> /system/system_ext/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.system_ext\.manufacturer.*/ro\.product\.system_ext\.manufacturer\=Google/g'</span> /system/system_ext/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.system_ext\.brand.*/ro\.product\.system_ext\.brand\=google/g'</span> /system/system_ext/build.prop</span>
<span class="code-line"></span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.odm\.model.*/ro\.product\.odm\.model\=Pixel\ 5\ XL/g'</span> /vendor/odm/etc/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.odm\.manufacturer.*/ro\.product\.odm\.manufacturer\=Google/g'</span> /vendor/odm/etc/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.odm\.brand.*/ro\.product\.odm\.brand\=google/g'</span> /vendor/odm/etc/build.prop</span>
<span class="code-line"></span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.vendor\.model.*/ro\.product\.vendor\.model\=Pixel\ 5\ XL/g'</span> /vendor/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.vendor\.manufacturer.*/ro\.product\.vendor\.manufacturer\=Google/g'</span> /vendor/build.prop</span>
<span class="code-line">sed -ie <span class="s1">'s/^ro\.product\.vendor\.brand.*/ro\.product\.vendor\.brand\=google/g'</span> /vendor/build.prop</span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">echo</span> <span class="s2">"********* DONE"</span></span>
<span class="code-line"></code></pre></div>
<p>重启了以后似乎并不起作用,好吧,换一个,毕竟我们是有 root 的人。</p>
<p>钛备份,幸运破解器 都只能查权限并不能修改,另一软件 <span class="caps">APP</span> <span class="caps">OPS</span> 可以改,但是也没起作用,重启一下权限又回去了。</p>
<p>用 <span class="caps">ADB</span> 修改应用权限提示出错了。</p>
<p>然后就开始浏览一下系统目录看看能不能发现什么猫腻,果然发现了 <code>premissions</code> 的目录,打开一看还真是应用权限的描述文件,下手试试吧。</p>
<p>依然是 shell:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">echo</span> <span class="s2">"********* Modify Product Premissions"</span></span>
<span class="code-line"><span class="nv">permDir</span><span class="o">=</span><span class="s2">"/system/product/etc/permissions"</span></span>
<span class="code-line"><span class="nv">permFile</span><span class="o">=(</span><span class="s2">"com.google.android.gms.xml"</span> <span class="s2">"com.google.android.googlequicksearchbox.xml"</span> <span class="s2">"com.android.vending.xml"</span><span class="o">)</span></span>
<span class="code-line"><span class="k">for</span> i in <span class="s2">"</span><span class="si">${</span><span class="nv">permFile</span><span class="p">[@]</span><span class="si">}</span><span class="s2">"</span></span>
<span class="code-line"><span class="k">do</span></span>
<span class="code-line"> <span class="k">if</span> <span class="o">[</span> -f <span class="s2">"</span><span class="nv">$permDir</span><span class="s2">/</span><span class="nv">$i</span><span class="s2">"</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"* modify: </span><span class="nv">$i</span><span class="s2">"</span></span>
<span class="code-line"> sed -ie <span class="s1">'s/<permission name="android.permission.READ_PHONE_STATE" \/>/<deny-permission name="android.permission.READ_PHONE_STATE" \/>/g'</span> <span class="nv">$permDir</span>/<span class="nv">$i</span></span>
<span class="code-line"> sed -ie <span class="s1">'s/<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE" \/>/<deny-permission name="android.permission.READ_PRIVILEGED_PHONE_STATE" \/>/g'</span> <span class="nv">$permDir</span>/<span class="nv">$i</span></span>
<span class="code-line"> <span class="k">else</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"- Not Found file: </span><span class="nv">$permDir</span><span class="s2">/</span><span class="nv">$i</span><span class="s2">"</span></span>
<span class="code-line"> <span class="k">fi</span></span>
<span class="code-line"><span class="k">done</span></span>
<span class="code-line"></code></pre></div>
<p>重启一下,居然出来了,但是 google 这应用没显示,行吧,我清除数据,出来了。</p>
<p>今天下午开了一下又来了,这下我不敢清数据了,万一又不行了。所以我又加了下面的,还没用就是了。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="n">perFile</span><span class="o">=</span><span class="ss">"/system/product/etc/default-permissions/nikgapps-permissions.xml"</span></span>
<span class="code-line"><span class="k">if</span> <span class="p">[</span> <span class="o">-</span><span class="n">f</span> <span class="ss">"$perFile"</span> <span class="p">];</span> <span class="k">then</span></span>
<span class="code-line"> <span class="n">echo</span> <span class="ss">"* modify: $perFile"</span></span>
<span class="code-line"> <span class="n">sed</span> <span class="o">-</span><span class="n">ie</span> <span class="s1">'18,45s/<permission name="android.permission.READ_PHONE_STATE"/<deny-permission name="android.permission.READ_PHONE_STATE"/g'</span> <span class="err">$</span><span class="n">perFile</span></span>
<span class="code-line"> <span class="n">sed</span> <span class="o">-</span><span class="n">ie</span> <span class="s1">'18,45s/<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/<deny-permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/g'</span> <span class="err">$</span><span class="n">perFile</span></span>
<span class="code-line"> <span class="n">sed</span> <span class="o">-</span><span class="n">ie</span> <span class="s1">'185,259s/<permission name="android.permission.READ_PHONE_STATE"/<deny-permission name="android.permission.READ_PHONE_STATE"/g'</span> <span class="err">$</span><span class="n">perFile</span></span>
<span class="code-line"> <span class="n">sed</span> <span class="o">-</span><span class="n">ie</span> <span class="s1">'185,259s/<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/<deny-permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/g'</span> <span class="err">$</span><span class="n">perFile</span></span>
<span class="code-line"><span class="k">else</span></span>
<span class="code-line"> <span class="n">echo</span> <span class="ss">"- Not Found file: $perFile"</span></span>
<span class="code-line"><span class="n">fi</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="n">echo</span> <span class="ss">"********* DONE"</span></span>
<span class="code-line"></code></pre></div>
<p>希望是有用的吧。</p>
<p>附一张截图:</p>
<p>提示截图应用中止了,算了不管了。</p>
<p>毕竟现在天冷。</p>
<hr />
<p>2021-01-20</p>
<p>补上图:</p>
<p><img alt="" src="images/a001-1.jpeg" /></p>
<p>另外,如果 google now 不显示,确认一下梯子 google 搜的时候是不是要人机验证。(我就碰到了,我还以为失败了,换一梯子就可以了。</p>Loop Through An Array Of Strings And Parse Json In Bash2021-01-06T22:24:42+08:002021-01-06T22:24:42+08:00doobomtag:doobom.me,2021-01-06:/loop-through-an-array-of-strings-and-parse-json-in-bash<p>Loop through an array of strings in Bash? Parse json with default bash only?</p><h2 id="loop-through-an-array-of-strings-in-bash">Loop through an array of strings in Bash?<a class="headerlink" href="#loop-through-an-array-of-strings-in-bash" title="Permanent link"> </a></h2>
<blockquote>
<p>来自: <a href="https://stackoverflow.com/questions/8880603/loop-through-an-array-of-strings-in-bash">Stack Overflow</a></p>
</blockquote>
<p>You can use it like this:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1">## declare an array variable</span></span>
<span class="code-line"><span class="nb">declare</span> -a <span class="nv">arr</span><span class="o">=(</span><span class="s2">"element1"</span> <span class="s2">"element2"</span> <span class="s2">"element3"</span><span class="o">)</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">## now loop through the above array</span></span>
<span class="code-line"><span class="k">for</span> i in <span class="s2">"</span><span class="si">${</span><span class="nv">arr</span><span class="p">[@]</span><span class="si">}</span><span class="s2">"</span></span>
<span class="code-line"><span class="k">do</span></span>
<span class="code-line"> <span class="nb">echo</span> <span class="s2">"</span><span class="nv">$i</span><span class="s2">"</span></span>
<span class="code-line"> <span class="c1"># or do whatever with individual element of the array</span></span>
<span class="code-line"><span class="k">done</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1"># You can access them using echo "${arr[0]}", "${arr[1]}" also</span></span>
<span class="code-line"></code></pre></div>
<p>Also works for multi-line array declaration</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">declare</span> -a <span class="nv">arr</span><span class="o">=(</span><span class="s2">"element1"</span></span>
<span class="code-line"> <span class="s2">"element2"</span> <span class="s2">"element3"</span></span>
<span class="code-line"> <span class="s2">"element4"</span></span>
<span class="code-line"> <span class="o">)</span></span>
<span class="code-line"></code></pre></div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Note that the double quotes around <code>"${arr[@]}"</code> are really important. Without them, the for loop will break up the array by substrings separated by any spaces within the strings instead of by whole string elements within the array. ie: if you had <code>declare -a arr=("element 1" "element 2" "element 3")</code>, then <code>for i in ${arr[@]}</code> would mistakenly iterate 6 times since each string becomes 2 substrings separated by the space in the string, whereas <code>for i in "${arr[@]}"</code> would iterate 3 times, correctly, as desired, maintaining each string as a single unit despite having a space in it.</p>
</div>
<h2 id="parse-json-with-default-bash-only">Parse json with default bash only?<a class="headerlink" href="#parse-json-with-default-bash-only" title="Permanent link"> </a></h2>
<blockquote>
<p>来自: <a href="https://askubuntu.com/questions/1167287/parse-json-with-default-bash-only">ask ubuntu</a></p>
</blockquote>
<p>A: …an example json:-</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">{</span></span>
<span class="code-line"> <span class="nt">"people"</span><span class="p">:[</span></span>
<span class="code-line"> <span class="p">{</span></span>
<span class="code-line"> <span class="nt">"id"</span><span class="p">:</span><span class="s2">"4568734"</span><span class="p">,</span></span>
<span class="code-line"> <span class="nt">"name"</span><span class="p">:</span><span class="s2">"suneel"</span></span>
<span class="code-line"> <span class="p">},</span></span>
<span class="code-line"> <span class="p">{</span></span>
<span class="code-line"> <span class="nt">"id"</span><span class="p">:</span><span class="s2">"3678976"</span><span class="p">,</span></span>
<span class="code-line"> <span class="nt">"name"</span><span class="p">:</span><span class="s2">"adi"</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="p">]</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"></code></pre></div>
<p>if say ‘name’ then i want array(“suneel” “adi”)</p>
<p>Note: No use of external tool and with just bash commands.</p>
<p>Q: A bash function like below can be used:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="k">function</span> jsonValue<span class="o">()</span> <span class="o">{</span></span>
<span class="code-line"> <span class="nv">KEY</span><span class="o">=</span><span class="nv">$1</span></span>
<span class="code-line"> <span class="nv">num</span><span class="o">=</span><span class="nv">$2</span></span>
<span class="code-line"> awk -F<span class="s2">"[,:}]"</span> <span class="s1">'{for(i=1;i<=NF;i++){if($i~/'</span><span class="nv">$KEY</span><span class="s1">'\042/){print $(i+1)}}}'</span> <span class="p">|</span> tr -d <span class="s1">'"'</span> <span class="p">|</span> sed -n <span class="si">${</span><span class="nv">num</span><span class="si">}</span>p</span>
<span class="code-line"><span class="o">}</span></span>
<span class="code-line"></code></pre></div>
<p>I’ve saved this function as <code>jsonVal</code> and then sourced this file using <code>source jsonVal</code>. You can very well use it within your script.</p>
<p>It expects two arguments. First argument is the property name. If you need all values, skip second argument. If specific value is needed, you can add the second argument as shown below.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="o">[</span>root@localhost Desktop<span class="o">]</span><span class="c1"># cat data.json | jsonValue id</span></span>
<span class="code-line"><span class="m">4568734</span></span>
<span class="code-line"><span class="m">3678976</span></span>
<span class="code-line"><span class="o">[</span>root@localhost Desktop<span class="o">]</span><span class="c1"># cat data.json | jsonValue id 1</span></span>
<span class="code-line"><span class="m">4568734</span></span>
<span class="code-line"><span class="o">[</span>root@localhost Desktop<span class="o">]</span><span class="c1"># cat data.json | jsonValue id 2</span></span>
<span class="code-line"><span class="m">3678976</span></span>
<span class="code-line"><span class="o">[</span>root@localhost Desktop<span class="o">]</span><span class="c1"># cat data.json | jsonValue name</span></span>
<span class="code-line">suneel</span>
<span class="code-line">adi</span>
<span class="code-line"><span class="o">[</span>root@localhost Desktop<span class="o">]</span><span class="c1"># cat data.json | jsonValue name 1</span></span>
<span class="code-line">suneel</span>
<span class="code-line"><span class="o">[</span>root@localhost Desktop<span class="o">]</span><span class="c1"># cat data.json | jsonValue name 2</span></span>
<span class="code-line">adi</span>
<span class="code-line"><span class="o">[</span>root@localhost Desktop<span class="o">]</span><span class="c1">#</span></span>
<span class="code-line"></code></pre></div>
<p>Hope this helps.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>If a value contains <code>:</code> <code>,</code> <code>}</code> this seems to break :( — @Phill 有中文似乎也会出问题。</p>
</div>用类名启动应用 Google Assistant2021-01-05T21:52:27+08:002021-01-05T21:52:27+08:00doobomtag:doobom.me,2021-01-05:/android-shell-launch-with-activity<p>怎么用类名启动 Google 助理,因为一个 Google 已经包含了</p><p>今天坐动车的时候,无意间看到一个 安卓 手机上的类 linux 的启动器,各种炫吧,然后看了介绍,有广告,就这样拾起了很久没用的 <a href="https://github.com/fAndreuzzi/TUI-ConsoleLauncher">T-<span class="caps">UI</span></a>,看到了以前设置的快捷键有个 google assistant 。</p>
<p>怎么折腾就是启动不起来,因为现在是一个 google 应用,包含了 助理 的功能,google 包名是 <code>com.google.android.googlequicksearchbox</code>, 直接包名只能启动 google 搜索,试了一下类名 <code>com.google.android.apps.gsa.assistant.handoff.AssistantHandoffActivity</code>,当然是失败了。</p>
<p>google 了一下,这里给出了答案: <a href="https://automagic4android.com/forum/viewtopic.php?t=7082#p19629">How to launch Google assistant</a></p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1">#Try one of this actions:</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">#Execute Root command > Command</span></span>
<span class="code-line">am start -n <span class="s2">"com.google.android.googlequicksearchbox/com.google.android.apps.gsa.staticplugins.opa.OpaActivity"</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">#or:</span></span>
<span class="code-line"><span class="c1">#Execute Root command > Command</span></span>
<span class="code-line">input keyevent <span class="m">219</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">#or:</span></span>
<span class="code-line"><span class="c1">#Start Activity > Action</span></span>
<span class="code-line">android.intent.action.VOICE_COMMAND</span>
<span class="code-line"></code></pre></div>
<p>关键的是要 <span class="caps">ROOT</span> ,然尔我的手机并没有,如果运行会提示没有用户权限 <code>android.permission.INTERACT_ACROSS_USERS_FULL</code>。</p>
<p>这边有说明 <a href="https://bugjia.net/200213/161125.html">Bug+: 拒绝权限:这需要android.permission.INTERACT_ACROSS_USERS_FULL</a> ,文中说最佳答案 <a href="https://stackoverflow.com/a/19756762/713354">android.permission.INTERACT_ACROSS_USERS_FULL is a signature level permission</a> .</p>
<blockquote>
<p>您的应用程序将无法使用它,除非它具有与系统相同的签名.</p>
<p>除非您是创建者或系统构建者,或者与他们合作以使他们愿意用其证书签署apk,否则您将无法实现.换句话说,对于大多数开发人员来说这是不可行的.
</p>
</blockquote>
<p>所以我放弃了,安装了单独的 <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.googleassistant&hl=en&gl=US">Google Assistant</a> 应用.</p>
<p>毕竟还要折腾其它的。</p>How To Migrate Or Export All Gpg Public And Private Keys From One User To Another2021-01-05T00:00:49+08:002021-01-05T00:00:49+08:00doobomtag:doobom.me,2021-01-05:/how-to-migrate-or-export-all-gpg-public-and-private-keys-from-one-user-to-another<p>How to migrate or export all GnuPG (gpg) public and private keys from one user to another, Telling Git about your signing key.</p><h2 id="how-to-migrate-or-export-all-gnupg-gpg-public-and-private-keys-from-one-user-to-another">How to migrate or export all GnuPG (gpg) public and private keys from one user to another<a class="headerlink" href="#how-to-migrate-or-export-all-gnupg-gpg-public-and-private-keys-from-one-user-to-another" title="Permanent link"> </a></h2>
<blockquote>
<p>原文:</p>
<p><a href="https://access.redhat.com/solutions/2115511">https://access.redhat.com/solutions/2115511</a>
</p>
</blockquote>
<p>*. As the original user, use the following command to export all public keys to a base64-encoded text file:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>gpg -a --export >mypubkeys.asc</span>
<span class="code-line"></code></pre></div>
<p>Use the following command to export all encrypted private keys (which will also include corresponding public keys) to a text file:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>gpg -a --export-secret-keys >myprivatekeys.asc</span>
<span class="code-line"></code></pre></div>
<p>Optionally export gpg’s trustdb to a text file:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>gpg --export-ownertrust >otrust.txt</span>
<span class="code-line"></code></pre></div>
<p>*. Transfer those files to a place that the new user can read, keeping in mind that it’s bad practice to share private keys (e.g., via email or in a world-readable directory like <code>/tmp</code>), despite the fact that they are encrypted and require the passphrase to be used</p>
<p>*. As the new user, execute gpg —import commands against the two asc files and then check for the new keys with gpg -k and gpg -K, e.g.:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>gpg --import myprivatekeys.asc</span>
<span class="code-line">gpg --import mypubkeys.asc</span>
<span class="code-line">gpg -K</span>
<span class="code-line">gpg -k</span>
<span class="code-line"></code></pre></div>
<p>Optionally import the trustdb file as well:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>gpg --import-ownertrust otrust.txt</span>
<span class="code-line"></code></pre></div>
<p>*. As the new user, test encryption and decryption with <code>gpg -er USERID</code> and <code>gpg -d</code> commands
Keep in mind that decryption and signing will likely fail unless the user running <code>gpg</code> owns the terminal it is running on
(Translation: don’t <code>su</code> over to the new user; login directly via ssh or console)</p>
<h2 id="telling-git-about-your-gpg-key">Telling Git about your <span class="caps">GPG</span> key<a class="headerlink" href="#telling-git-about-your-gpg-key" title="Permanent link"> </a></h2>
<blockquote>
<p>原文:
<a href="https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/telling-git-about-your-signing-key">Github Docs: Telling Git about your <span class="caps">GPG</span> key</a></p>
</blockquote>
<p>*. Use the <code>gpg --list-secret-keys --keyid-format LONG</code> command to list <span class="caps">GPG</span> keys for which you have both a public and private key. A private key is required for signing commits or tags.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>$ gpg --list-secret-keys --keyid-format LONG</span>
<span class="code-line"></code></pre></div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Note: Some <span class="caps">GPG</span> installations on Linux may require you to use <code>gpg2 --list-keys --keyid-format LONG</code> to view a list of your existing keys instead. In this case you will also need to configure Git to use <code>gpg2 by running git config --global gpg.program gpg2</code>.</p>
</div>
<p>*. From the list of <span class="caps">GPG</span> keys, copy the <span class="caps">GPG</span> key <span class="caps">ID</span> you’d like to use. In this example, the <span class="caps">GPG</span> key <span class="caps">ID</span> is <code>3AA5C34371567BD2</code>:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>$ gpg --list-secret-keys --keyid-format LONG</span>
<span class="code-line">/Users/hubot/.gnupg/secring.gpg</span>
<span class="code-line">------------------------------------</span>
<span class="code-line">sec 4096R/3AA5C34371567BD2 <span class="m">2016</span>-03-10 <span class="o">[</span>expires:2017-03-10<span class="o">]</span></span>
<span class="code-line">uid Hubot</span>
<span class="code-line">ssb 4096R/42B317FD4BA89E7A <span class="m">2016</span>-03-10</span>
<span class="code-line"></code></pre></div>
<p>*. To set your <span class="caps">GPG</span> signing key in Git, paste the text below, substituting in the <span class="caps">GPG</span> key <span class="caps">ID</span> you’d like to use. In this example, the <span class="caps">GPG</span> key <span class="caps">ID</span> is <code>3AA5C34371567BD2</code>:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>$ git config --global user.signingkey 3AA5C34371567BD2</span>
<span class="code-line"></code></pre></div>用 Github Actions 生成 Pelican2020-12-25T19:40:19+08:002020-12-25T19:40:19+08:00doobomtag:doobom.me,2020-12-25:/pelican-with-github-actions<p>Pelican 利用 github 的 Actions 自动生成并提交到 github</p><p>Github Actions 功能很强大,网上各种能玩出花的,我有这个想法,是因为折腾某个不可描述的网站的签到,那啥就不说了。</p>
<p><a href="http://getpelican.com/">Pelican</a> 是个用 Python 写的一个静态网站生成工具,本站就是用这个生成的。毕竟在自己电脑上生成再提交 github 还是挺麻烦的,要装 好一些 软件呢。</p>
<p>Github Actions 能自动去处理,节省了好多步骤,现在只要负责写写,转转,然后提交到源仓库就好了,其它就交给 Github 吧。</p>
<p>其实也很简单,源仓库建一个 <code>.github/workflows</code> 目录,里面放上 <code>xxx.yml</code> 文件,比如: <code>site_generator.yml</code>。贴上下面的内容:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1"># This workflow will install Python dependencies, run tests and lint with a single version of Python</span></span>
<span class="code-line"><span class="c1"># For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">name</span><span class="p">:</span> <span class="no">Pelican</span> <span class="n">site</span> <span class="n">generator</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="ss">on</span><span class="p">:</span></span>
<span class="code-line"> <span class="ss">push</span><span class="p">:</span></span>
<span class="code-line"> <span class="ss">branches</span><span class="p">:</span> <span class="o">[</span> <span class="n">master</span> <span class="o">]</span></span>
<span class="code-line"> <span class="ss">pull_request</span><span class="p">:</span></span>
<span class="code-line"> <span class="ss">branches</span><span class="p">:</span> <span class="o">[</span> <span class="n">master</span> <span class="o">]</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="ss">jobs</span><span class="p">:</span></span>
<span class="code-line"> <span class="ss">build</span><span class="p">:</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="n">runs</span><span class="o">-</span><span class="ss">on</span><span class="p">:</span> <span class="n">ubuntu</span><span class="o">-</span><span class="n">latest</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="ss">steps</span><span class="p">:</span></span>
<span class="code-line"> <span class="o">-</span> <span class="ss">uses</span><span class="p">:</span> <span class="n">actions</span><span class="o">/</span><span class="n">checkout</span><span class="vi">@v2</span></span>
<span class="code-line"> <span class="o">-</span> <span class="nb">name</span><span class="p">:</span> <span class="no">Set</span> <span class="n">up</span> <span class="no">Python</span> <span class="mi">3</span><span class="o">.</span><span class="mi">9</span></span>
<span class="code-line"> <span class="ss">uses</span><span class="p">:</span> <span class="n">actions</span><span class="o">/</span><span class="n">setup</span><span class="o">-</span><span class="n">python</span><span class="vi">@v2</span></span>
<span class="code-line"> <span class="ss">with</span><span class="p">:</span></span>
<span class="code-line"> <span class="n">python</span><span class="o">-</span><span class="ss">version</span><span class="p">:</span> <span class="mi">3</span><span class="o">.</span><span class="mi">9</span></span>
<span class="code-line"> <span class="o">-</span> <span class="nb">name</span><span class="p">:</span> <span class="no">Install</span> <span class="n">dependencies</span></span>
<span class="code-line"> <span class="ss">run</span><span class="p">:</span> <span class="o">|</span></span>
<span class="code-line"> <span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">--</span><span class="n">upgrade</span> <span class="n">pip</span></span>
<span class="code-line"> <span class="n">pip</span> <span class="n">install</span> <span class="n">flake8</span> <span class="n">pytest</span></span>
<span class="code-line"> <span class="k">if</span> <span class="o">[</span> <span class="o">-</span><span class="n">f</span> <span class="n">requirements</span><span class="o">.</span><span class="n">txt</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> <span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">r</span> <span class="n">requirements</span><span class="o">.</span><span class="n">txt</span><span class="p">;</span> <span class="n">fi</span></span>
<span class="code-line"> <span class="o">-</span> <span class="nb">name</span><span class="p">:</span> <span class="no">Lint</span> <span class="n">with</span> <span class="n">flake8</span></span>
<span class="code-line"> <span class="ss">run</span><span class="p">:</span> <span class="o">|</span></span>
<span class="code-line"> <span class="c1"># stop the build if there are Python syntax errors or undefined names</span></span>
<span class="code-line"> <span class="n">flake8</span> <span class="o">.</span> <span class="o">--</span><span class="n">count</span> <span class="o">--</span><span class="nb">select</span><span class="o">=</span><span class="no">E9</span><span class="p">,</span><span class="no">F63</span><span class="p">,</span><span class="no">F7</span><span class="p">,</span><span class="no">F82</span> <span class="o">--</span><span class="n">show</span><span class="o">-</span><span class="n">source</span> <span class="o">--</span><span class="n">statistics</span></span>
<span class="code-line"> <span class="c1"># exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide</span></span>
<span class="code-line"> <span class="n">flake8</span> <span class="o">.</span> <span class="o">--</span><span class="n">count</span> <span class="o">--</span><span class="nb">exit</span><span class="o">-</span><span class="n">zero</span> <span class="o">--</span><span class="n">max</span><span class="o">-</span><span class="n">complexity</span><span class="o">=</span><span class="mi">10</span> <span class="o">--</span><span class="n">max</span><span class="o">-</span><span class="n">line</span><span class="o">-</span><span class="n">length</span><span class="o">=</span><span class="mi">127</span> <span class="o">--</span><span class="n">statistics</span></span>
<span class="code-line"> <span class="o">-</span> <span class="nb">name</span><span class="p">:</span> <span class="n">config</span> <span class="n">git</span> <span class="ow">and</span> <span class="nb">clone</span> <span class="n">repo</span></span>
<span class="code-line"> <span class="ss">run</span><span class="p">:</span> <span class="o">|</span></span>
<span class="code-line"> <span class="c1"># 设置 git</span></span>
<span class="code-line"> <span class="n">git</span> <span class="n">config</span> <span class="o">--</span><span class="n">global</span> <span class="n">user</span><span class="o">.</span><span class="n">email</span> <span class="s2">"rovecat@gmail.com"</span><span class="o">&&</span><span class="n">git</span> <span class="n">config</span> <span class="o">--</span><span class="n">global</span> <span class="n">user</span><span class="o">.</span><span class="n">name</span> <span class="s2">"doobom"</span></span>
<span class="code-line"> <span class="c1"># 获取 pelican 插件</span></span>
<span class="code-line"> <span class="n">git</span> <span class="nb">clone</span> <span class="o">--</span><span class="n">recursive</span> <span class="ss">https</span><span class="p">:</span><span class="sr">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">getpelican</span><span class="o">/</span><span class="n">pelican</span><span class="o">-</span><span class="n">plugins</span></span>
<span class="code-line"> <span class="c1"># 获取本站的皮</span></span>
<span class="code-line"> <span class="n">git</span> <span class="nb">clone</span> <span class="ss">https</span><span class="p">:</span><span class="sr">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">doobom</span><span class="o">/</span><span class="n">elegant</span><span class="o">.</span><span class="n">git</span></span>
<span class="code-line"> <span class="o">-</span> <span class="nb">name</span><span class="p">:</span> <span class="n">setup</span> <span class="no">SSH</span> <span class="n">keys</span> <span class="ow">and</span> <span class="n">known_hosts</span></span>
<span class="code-line"> <span class="ss">run</span><span class="p">:</span> <span class="o">|</span></span>
<span class="code-line"> <span class="c1"># 设置 SSH 环境</span></span>
<span class="code-line"> <span class="n">mkdir</span> <span class="o">-</span><span class="nb">p</span> <span class="o">~</span><span class="sr">/.ssh</span></span>
<span class="code-line"><span class="sr"> ssh-keyscan github.com >> ~/</span><span class="o">.</span><span class="n">ssh</span><span class="o">/</span><span class="n">known_hosts</span></span>
<span class="code-line"> <span class="n">ssh</span><span class="o">-</span><span class="n">agent</span> <span class="o">-</span><span class="n">a</span> <span class="vg">$SSH_AUTH_SOCK</span> <span class="o">></span> <span class="sr">/dev/nu</span><span class="n">ll</span></span>
<span class="code-line"> <span class="n">ssh</span><span class="o">-</span><span class="n">add</span> <span class="o">-</span> <span class="o"><<<</span> <span class="s2">"${{ secrets.ID_RSA }}"</span></span>
<span class="code-line"> <span class="ss">env</span><span class="p">:</span></span>
<span class="code-line"> <span class="ss">SSH_AUTH_SOCK</span><span class="p">:</span> <span class="sr">/tmp/ss</span><span class="n">h_agent</span><span class="o">.</span><span class="n">sock</span></span>
<span class="code-line"> <span class="o">-</span> <span class="nb">name</span><span class="p">:</span> <span class="nb">clone</span> <span class="n">doobom</span><span class="o">.</span><span class="n">github</span><span class="o">.</span><span class="n">io</span></span>
<span class="code-line"> <span class="ss">run</span><span class="p">:</span> <span class="o">|</span></span>
<span class="code-line"> <span class="c1"># 获取网站保存的 repo 到 githubpage 目录,因为我的配置文件里面设置的生成目标目录是 githubpage</span></span>
<span class="code-line"> <span class="n">git</span> <span class="nb">clone</span> <span class="n">git</span><span class="vi">@github</span><span class="o">.</span><span class="n">com</span><span class="ss">:doobom</span><span class="o">/</span><span class="n">doobom</span><span class="o">.</span><span class="n">github</span><span class="o">.</span><span class="n">io</span><span class="o">.</span><span class="n">git</span> <span class="n">githubpage</span></span>
<span class="code-line"> <span class="ss">env</span><span class="p">:</span></span>
<span class="code-line"> <span class="ss">SSH_AUTH_SOCK</span><span class="p">:</span> <span class="sr">/tmp/ss</span><span class="n">h_agent</span><span class="o">.</span><span class="n">sock</span></span>
<span class="code-line"> <span class="o">-</span> <span class="nb">name</span><span class="p">:</span> <span class="n">pelican</span> <span class="n">make</span> <span class="n">html</span></span>
<span class="code-line"> <span class="ss">run</span><span class="p">:</span> <span class="o">|</span></span>
<span class="code-line"> <span class="c1"># 用 make 命令生成</span></span>
<span class="code-line"> <span class="n">make</span> <span class="n">publish</span></span>
<span class="code-line"> <span class="o">-</span> <span class="nb">name</span><span class="p">:</span> <span class="n">publish</span> <span class="n">to</span> <span class="n">gitpage</span></span>
<span class="code-line"> <span class="ss">run</span><span class="p">:</span> <span class="o">|</span></span>
<span class="code-line"> <span class="c1"># 提交</span></span>
<span class="code-line"> <span class="n">cd</span> <span class="n">githubpage</span></span>
<span class="code-line"> <span class="n">git</span> <span class="n">status</span></span>
<span class="code-line"> <span class="n">git</span> <span class="n">add</span> <span class="o">.</span></span>
<span class="code-line"> <span class="n">git</span> <span class="n">commit</span> <span class="o">-</span><span class="n">m</span> <span class="s2">"auto build and update by github actions."</span></span>
<span class="code-line"> <span class="n">git</span> <span class="n">push</span> <span class="n">origin</span> <span class="n">master</span></span>
<span class="code-line"> <span class="ss">env</span><span class="p">:</span></span>
<span class="code-line"> <span class="ss">SSH_AUTH_SOCK</span><span class="p">:</span> <span class="sr">/tmp/ss</span><span class="n">h_agent</span><span class="o">.</span><span class="n">sock</span></span>
<span class="code-line"></code></pre></div>
<p>在源仓库 <code>settings > secrets</code> 添加一个 <code>ID_RSA</code> 的环境变量,参考: <a href="https://docs.github.com/articles/generating-an-ssh-key/">Github Documents</a>
因为 Pelican 要装挺多东西的,所以放到 <code>requirements.txt</code> 文件里面:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>beautifulsoup4>=4.9.3</span>
<span class="code-line">bs4>=0.0.1</span>
<span class="code-line">blinker>=1.4</span>
<span class="code-line">cssmin>=0.2.0</span>
<span class="code-line">ddt>=1.4.1</span>
<span class="code-line">docutils>=0.16</span>
<span class="code-line">feedgenerator>=1.9.1</span>
<span class="code-line">gitdb2>=4.0.2</span>
<span class="code-line">GitPython>=3.1.11</span>
<span class="code-line">invoke>=1.4.1</span>
<span class="code-line">jinja2>=2.11</span>
<span class="code-line">livereload>=2.6.3</span>
<span class="code-line">Markdown>=3.3.3</span>
<span class="code-line">MarkupSafe>=1.1.1</span>
<span class="code-line">pelican>=4.5.3</span>
<span class="code-line">Pygments<2.7.0,>=2.6.1</span>
<span class="code-line">python-dateutil>=2.8.1</span>
<span class="code-line">pytz>=2020.4</span>
<span class="code-line">six>=1.15.0</span>
<span class="code-line">smartypants>=2.0.1</span>
<span class="code-line">smmap>=3.0.4</span>
<span class="code-line">soupsieve>=2.1</span>
<span class="code-line">tornado>=6.1</span>
<span class="code-line">typogrify>=2.0.7</span>
<span class="code-line">Unidecode>=1.1.1</span>
<span class="code-line">webassets>=2.0</span>
<span class="code-line"></code></pre></div>
<p>也并不是全部要用的就是了。</p>
<p>另外就是本身 Pelican 的配置文件。</p>
<p>Push 源仓库就可以看到日志了。</p>
<hr />
<p>参考:</p>
<ul>
<li>
<p><a href="https://www.mdeditor.tw/pl/p30L/zh-tw">GitHub Actions 實用參考</a></p>
</li>
<li>
<p><a href="https://docs.github.com/articles/generating-an-ssh-key/">Github Documents</a></p>
</li>
</ul>Switch Case statement for Regex matching in JavaScript2020-12-12T16:58:00+08:002020-12-12T16:58:00+08:00doobomtag:doobom.me,2020-12-12:/switch-case-statement-for-regex-matching-in-javascript<p>Switch Case statement for Regex matching in JavaScript.</p><blockquote>
<p>原文:
<a href="https://stackoverflow.com/questions/47281147/switch-case-statement-for-regex-matching-in-javascript">https://stackoverflow.com/questions/47281147/switch-case-statement-for-regex-matching-in-javascript</a>
</p>
</blockquote>
<p>You need to use a different check, not with <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match">String#match</a>, that returns an array or <code>null</code> which is not usable with strict comparison like in a <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch">switch statement</a>.</p>
<p>You may use <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test">RegExp#test</a> and check with true:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">var</span> <span class="nx">regex1</span> <span class="o">=</span> <span class="sr">/a/</span><span class="p">,</span></span>
<span class="code-line"> <span class="nx">regex2</span> <span class="o">=</span> <span class="sr">/b/</span><span class="p">,</span></span>
<span class="code-line"> <span class="nx">regex3</span> <span class="o">=</span> <span class="sr">/c/</span><span class="p">,</span></span>
<span class="code-line"> <span class="nx">samplestring</span> <span class="o">=</span> <span class="s1">'b'</span><span class="p">;</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="k">switch</span> <span class="p">(</span><span class="kc">true</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="k">case</span> <span class="nx">regex1</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">samplestring</span><span class="p">)</span><span class="o">:</span></span>
<span class="code-line"> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"regex1"</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">break</span><span class="p">;</span></span>
<span class="code-line"> <span class="k">case</span> <span class="nx">regex2</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">samplestring</span><span class="p">)</span><span class="o">:</span></span>
<span class="code-line"> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"regex2"</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">break</span><span class="p">;</span></span>
<span class="code-line"> <span class="k">case</span> <span class="nx">regex3</span><span class="p">.</span><span class="nx">test</span><span class="p">(</span><span class="nx">samplestring</span><span class="p">)</span><span class="o">:</span></span>
<span class="code-line"> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"regex3"</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">break</span><span class="p">;</span></span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"></code></pre></div>正则表达式匹配数字范围2020-12-11T09:58:00+08:002020-12-11T09:58:00+08:00doobomtag:doobom.me,2020-12-11:/regular-expressions-match-numeric-ranges<p>正则表达式匹配数字范围,匹配单个数字的方式很简单,<code>[0-9]</code>是<code>[0123456789]</code>的简写形式,可以用来匹配任何一个数字。如果要匹配 <code>0</code> 到 <code>255</code> 中的所有数字,该怎么办呢?表达式<code>[0-255]</code>并不能达到目的。</p><blockquote>
<p>原文:
<a href="https://geek-docs.com/regexp/regexp-tutorials/regular-expressions-match-numeric-ranges.html">https://geek-docs.com/regexp/regexp-tutorials/regular-expressions-match-numeric-ranges.html</a>
</p>
</blockquote>
<p>正则表达式匹配数字范围,匹配单个数字的方式很简单,<code>[0-9]</code>是<code>[0123456789]</code>的简写形式,可以用来匹配任何一个数字。如果要匹配 0 到 255 中的所有数字,该怎么办呢?表达式<code>[0-255]</code>并不能达到目的。</p>
<p>下表所示为数字元字符</p>
<table>
<thead>
<tr>
<th align="left">元字符</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><code>\d</code></td>
<td align="left">任何一个数字字符(等价于<code>[0-9]</code>)</td>
</tr>
<tr>
<td align="left"><code>\D</code></td>
<td align="left">任何一个非数字字符(等价于<code>[^0-9]</code>)</td>
</tr>
</tbody>
</table>
<p>正则表达式是为了匹配字符而设计的,而并不是为了匹配数字,所以当你使用正则匹配指定范围内的数字的时候你需要额外小心。表达式<code>[0-255]</code>并不能匹配 0 至 255 之间的数字。表达式<code>[0-255]</code>是一个字符集,它的含义是匹配 0,1,2,5 中任意一个字符,这个表达式等同于<code>[0125]</code>。</p>
<p>正则引擎真正处理的是字符,所以数字 0 对于引擎来说是一个字符,而 255 对于引擎来说是长度为 3 的字符。所以如何要匹配 0 至 255 中的所有数字,我们需要让引擎匹配长度为一到三之间的字符。</p>
<ul>
<li><code>[0-9]</code> 可以匹配 0~9 之间的数字。</li>
<li><code>[1-9][0-9]</code> 可以匹配 10~99 之间的数字。</li>
<li><code>[1-9][0-9][0-9]</code> 可以匹配 100~999 之间的数字</li>
</ul>
<p>但是匹配 0~255 略微复杂一点,因为我们要排除256至999之间的整数。</p>
<ul>
<li><code>1[0-9][0-9]</code>可以匹配 100 至 199 。</li>
<li><code>2[0-4][0-9]</code>可以匹配 200 至 249 。</li>
<li><code>25[0-5]</code>可以匹配 250 至 255 。</li>
</ul>
<p>你可以发现当我们匹配 0 到 255 之间的整数时,我们需要按照字符的长度来分割这个范围。在匹配三位整数的时候,如果百位是 1 ,那么十位和个位允许出现 0 至 9 之间的 10 个字符,如果百位是 2 ,那么十位和个位的字符将进一步做限制。</p>
<p>把前面三个部分用选择符连接起来,我们就得到了 0 至 255 之间所有的整数:<code>[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]</code>。</p>
<blockquote>
<p>但是这个方法还存在一个缺陷:正则表达式通常允许部分匹配,所以这个表达式可以匹配到 12345 中的 123。</p>
</blockquote>
<p>如下两种方法可以解决问题:</p>
<p>(1)词语边界
如果你在一个文档中所搜数字,你可以使用词语边界锁定数字的范围:<code>\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b</code>。因为选择符的优先级是最低的,所以我们要在选择外加上括号。这样引擎会先匹配第一个边界符<code>\b</code>,然后匹配整个选择符,最后匹配最后一个<code>\b</code>。</p>
<p>(2)位置字符
如果你想验证用户输入内容,那么或许你想验证的是用户输入的完整内容,而不是其中的部分。你可以使用位置字符:<code>^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$。</code></p>
<p><strong>以下一些常用的数字匹配:</strong></p>
<ul>
<li>000..255: <code>^([01][0-9][0-9]|2[0-4][0-9]|25[0-5])$</code></li>
<li>0 or 000..255: <code>^([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])$</code></li>
<li>0 or 000..127: <code>^(0?[0-9]?[0-9]|1[01][0-9]|12[0-7])$</code></li>
<li>0..999: <code>^([0-9]|[1-9][0-9]|[1-9][0-9][0-9])$</code></li>
<li>000..999: <code>^[0-9]{3}$</code></li>
<li>0 or 000..999: <code>^[0-9]{1,3}$</code></li>
<li>1..999: <code>^([1-9]|[1-9][0-9]|[1-9][0-9][0-9])$</code></li>
<li>001..999: <code>^(00[1-9]|0[1-9][0-9]|[1-9][0-9][0-9])$</code></li>
<li>1 or 001..999: <code>^(0{0,2}[1-9]|0?[1-9][0-9]|[1-9][0-9][0-9])$</code></li>
<li>0 or 00..59: <code>^[0-5]?[0-9]$</code></li>
<li>0 or 000..366: <code>^(0?[0-9]?[0-9]|[1-2][0-9][0-9]|3[0-5][0-9]|36[0-6])$</code></li>
<li>正整数: <code>^[0-9]*[1-9][0-9]*$</code></li>
<li>负整数: <code>^-[0-9]*[1-9][0-9]*$</code></li>
<li>整数: <code>^-?d $</code></li>
<li>浮点数: <code>^(-?d )(.d )?$</code></li>
<li>正浮点数: <code>^(([0-9] .[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9] )|([0-9]*[1-9][0-9]*))$</code></li>
<li>复浮点数: <code>^(-(([0-9] .[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9] )|([0-9]*[1-9][0-9]*)))$</code></li>
</ul>Checking if jquery is loaded using Javascript2020-12-08T23:58:00+08:002020-12-08T23:58:00+08:00doobomtag:doobom.me,2020-12-08:/checking-if-jquery-is-loaded<p>If jQuery isn’t loaded then \<span class="math">\(() won't even run at all and your callback won't execute, unless you're using another library and that library happens to share the same \\)</span>() syntax.</p>
<script type="text/javascript">if (!document.getElementById('mathjaxscript_pelican_#%@#$@#')) {
var align = "center",
indent = "0em",
linebreak = "false";
if (false) {
align = (screen.width < 768) ? "left" : align;
indent = (screen.width < 768) ? "0em" : indent;
linebreak = (screen.width < 768) ? 'true' : linebreak;
}
var mathjaxscript = document.createElement('script');
mathjaxscript.id = 'mathjaxscript_pelican_#%@#$@#';
mathjaxscript.type = 'text/javascript';
mathjaxscript.src = 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.3/latest.js?config=TeX-AMS-MML_HTMLorMML';
var configscript = document.createElement('script');
configscript.type = 'text/x-mathjax-config';
configscript[(window.opera ? "innerHTML" : "text")] =
"MathJax.Hub.Config({" +
" config: ['MMLorHTML.js']," +
" TeX: { extensions: ['AMSmath.js','AMSsymbols.js','noErrors.js','noUndefined.js'], equationNumbers: { autoNumber: 'none' } }," +
" jax: ['input/TeX','input/MathML','output/HTML-CSS']," +
" extensions: ['tex2jax.js','mml2jax.js','MathMenu.js','MathZoom.js']," +
" displayAlign: '"+ align +"'," +
" displayIndent: '"+ indent +"'," +
" showMathMenu: true," +
" messageStyle: 'normal'," +
" tex2jax: { " +
" inlineMath: [ ['\\\\(','\\\\)'] ], " +
" displayMath: [ ['$$','$$'] ]," +
" processEscapes: true," +
" preview: 'TeX'," +
" }, " +
" 'HTML-CSS': { " +
" availableFonts: ['STIX', 'TeX']," +
" preferredFont: 'STIX'," +
" styles: { '.MathJax_Display, .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'inherit ! important'} }," +
" linebreaks: { automatic: "+ linebreak +", width: '90% container' }," +
" }, " +
"}); " +
"if ('default' !== 'default') {" +
"MathJax.Hub.Register.StartupHook('HTML-CSS Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax['HTML-CSS'].FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"MathJax.Hub.Register.StartupHook('SVG Jax Ready',function () {" +
"var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;" +
"VARIANT['normal'].fonts.unshift('MathJax_default');" +
"VARIANT['bold'].fonts.unshift('MathJax_default-bold');" +
"VARIANT['italic'].fonts.unshift('MathJax_default-italic');" +
"VARIANT['-tex-mathit'].fonts.unshift('MathJax_default-italic');" +
"});" +
"}";
(document.body || document.getElementsByTagName('head')[0]).appendChild(configscript);
(document.body || document.getElementsByTagName('head')[0]).appendChild(mathjaxscript);
}
</script><blockquote>
<p>原文: <a href="https://stackoverflow.com/questions/7341865/checking-if-jquery-is-loaded-using-javascript">https://stackoverflow.com/questions/7341865/checking-if-jquery-is-loaded-using-javascript</a>
</p>
</blockquote>
<p>Well, you are using jQuery to check for the presence of jQuery. If jQuery isn’t loaded then <code>$()</code> won’t even run at all and your callback won’t execute, unless you’re using another library and that library happens to share the same <code>$()</code> syntax.</p>
<p>Remove your <code>$(document).ready()</code> (use something like <code>window.onload</code> instead):</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">window</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">jQuery</span><span class="p">)</span> <span class="p">{</span> </span>
<span class="code-line"> <span class="c1">// jQuery is loaded </span></span>
<span class="code-line"> <span class="nx">alert</span><span class="p">(</span><span class="s2">"Yeah!"</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span></span>
<span class="code-line"> <span class="c1">// jQuery is not loaded</span></span>
<span class="code-line"> <span class="nx">alert</span><span class="p">(</span><span class="s2">"Doesn't Work"</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"></code></pre></div>Run jQuery in Chrome Console2020-12-08T09:58:00+08:002020-12-08T09:58:00+08:00doobomtag:doobom.me,2020-12-08:/run-jquery-in-chrome-console<p>Many a times we run into the need to testing some elements in some webpages which we don’t own. May be to do some reverse engineering or just to test something.</p><blockquote>
<p>原文: <a href="https://blog.wplauncher.com/run-jquery-in-chrome-console/">https://blog.wplauncher.com/run-jquery-in-chrome-console/</a>
</p>
</blockquote>
<p>I’ve run into numerous situations where I need to loop through data on a website that I do not own (typically <span class="caps">API</span> documentation) so that I can reformat it and make it usable. For example, <span class="caps">AWS</span> Route 53 includes a list of top-level domains (TLDs) in a page with related data for each <span class="caps">TLD</span> but it’s in an <span class="caps">HTML</span> format. You can use JavaScript by default in the chrome console but jQuery allows me to create these one-off scripts more quickly.</p>
<h2 id="step-1-copy-the-code-below">Step 1: Copy the code below<a class="headerlink" href="#step-1-copy-the-code-below" title="Permanent link"> </a></h2>
<p>Load jQuery into your current page by copying and pasting the following code into your Chrome Console.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">var</span> <span class="nx">jqry</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">'script'</span><span class="p">);</span></span>
<span class="code-line"><span class="nx">jqry</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="s2">"https://code.jquery.com/jquery-3.3.1.min.js"</span><span class="p">;</span></span>
<span class="code-line"><span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s1">'head'</span><span class="p">)[</span><span class="mi">0</span><span class="p">].</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">jqry</span><span class="p">);</span></span>
<span class="code-line"><span class="nx">jQuery</span><span class="p">.</span><span class="nx">noConflict</span><span class="p">();</span></span>
<span class="code-line"></code></pre></div>
<p>It may take a bit of time for jQuery to load. But, once jQuery is loaded, you can run your custom jQuery functions in chrome console. There may be some conflicts with other jQuery versions that may have been loaded on the page.</p>
<h2 id="step-2-paste-the-code-in-your-browsers-console">Step 2: Paste the code in your Browser’s Console<a class="headerlink" href="#step-2-paste-the-code-in-your-browsers-console" title="Permanent link"> </a></h2>
<p>If you don’t know how to get to your browser’s console, make sure you right click on the page that you want to scrape and click on Inspect.</p>
<p><img alt="get console" src="images/4004-1.png" /></p>
<p>Then, click on the Console tab, paste the code that you copied above it into the console, and click enter to run the code. It’ll look like the picture below:</p>
<p><img alt="paste the code" src="images/4004-2.png" /></p>
<hr />
<blockquote>
<p>以下来自: <a href="https://www.voidcanvas.com/how-to-insert-run-jquery-in-chrome-console/">https://www.voidcanvas.com/how-to-insert-run-jquery-in-chrome-console/</a></p>
</blockquote>
<h2 id="better-way-for-regular-users">Better way for regular users<a class="headerlink" href="#better-way-for-regular-users" title="Permanent link"> </a></h2>
<p>If you often come across this situation and have to insert jQuery in multiple pages, you can probably save it as a bookmarklet and include it in the page just by clicking on that bookmarklet. Follow the steps below to create a bookmarklet.</p>
<p>Step 1: Open an empty tab in your browser.
Step 2: Bookmark that empty tab with a name.
Step 3: Now edit that saved bookmark and save the following code in the place of url or location.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nx">javascript</span><span class="o">:</span><span class="kd">var</span> <span class="nx">jqry</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">'script'</span><span class="p">);</span><span class="nx">jqry</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="s2">"https://code.jquery.com/jquery-3.3.1.min.js"</span><span class="p">;</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s1">'head'</span><span class="p">)[</span><span class="mi">0</span><span class="p">].</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">jqry</span><span class="p">);</span><span class="nx">jQuery</span><span class="p">.</span><span class="nx">noConflict</span><span class="p">();</span></span>
<span class="code-line"></code></pre></div>
<p>Step 4: Save the bookmark.
Step 5: Now you can include jQuery in any of the webpages you want, just by clicking on the bookmarklet after the required webpage is loaded.</p>
<h2 id="caution">Caution<a class="headerlink" href="#caution" title="Permanent link"> </a></h2>
<p>There are some webpages (Eg: gmail) who strictly doesn’t allow loading of external scripts. On those pages the approach mentioned above will not work.</p>How to Install EPEL and REMI Repository on CentOS/RedHat 7/62020-03-17T12:01:00+08:002020-03-17T16:01:00+08:00doobomtag:doobom.me,2020-03-17:/how-to-install-epel-and-remi-repository-on-centos<p>How to Install <span class="caps">EPEL</span> and <span class="caps">REMI</span> Repository on CentOS/RedHat 7/6</p><blockquote>
<p>原文: <a href="https://tecadmin.net/install-epel-and-remi-repository-on-centos-and-redhat/">How to Install <span class="caps">EPEL</span> and <span class="caps">REMI</span> Repository on CentOS/RedHat 7/6</a></p>
</blockquote>
<p><strong><span class="caps">EPEL</span></strong> is known as <strong>Extra Packages for Enterprise Linux</strong> repository having lots of extra packages which is not added in official repositories. <strong><span class="caps">REMI</span></strong> is a third party repository provides latest version of packages which is already included in official repositories of CentOS and Red Hat.</p>
<p>This article will help you to install <strong><span class="caps">EPEL</span></strong> and <strong><span class="caps">REMI</span></strong> repository on CentOS and Red Hat 7/6/5 systems.</p>
<h1 id="install-epel-repository">Install <span class="caps">EPEL</span> Repository<a class="headerlink" href="#install-epel-repository" title="Permanent link"> </a></h1>
<p><span class="caps">EPEL</span> release package is available under default CentOS repositories. So use the following command to install <span class="caps">EPEL</span> yum repository on your CentOS/<span class="caps">RHEL</span> 7/6/5 systems.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>yum install epel-release</span>
<span class="code-line"></code></pre></div>
<p>In the case of command doesn’t work for you, use one of below commands.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1">### For CentOS/RHEL 7 ###</span></span>
<span class="code-line">rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm</span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">### For CentOS/RHEL 6 ###</span></span>
<span class="code-line">rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm</span>
<span class="code-line"></code></pre></div>
<h1 id="install-remi-repository">Install <span class="caps">REMI</span> Repository<a class="headerlink" href="#install-remi-repository" title="Permanent link"> </a></h1>
<p>Use following commands to install <span class="caps">REMI</span> yum repository on your CentOS/<span class="caps">RHEL</span> 7/6/5 systems. Make sure you already have installed <span class="caps">EPEL</span> repository before installing <span class="caps">REMI</span>.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1">### For CentOS/RHEL 7 ###</span></span>
<span class="code-line">rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm</span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">### For CentOS/RHEL 6 ###</span></span>
<span class="code-line">rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm</span>
<span class="code-line"></code></pre></div>
<h1 id="list-all-installed-repository">List all Installed Repository<a class="headerlink" href="#list-all-installed-repository" title="Permanent link"> </a></h1>
<p>Use following command to list all installed yum repositories in your system.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>yum repolist</span>
<span class="code-line"></code></pre></div>
<p>Sample Output</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Loaded plugins: fastestmirror</span>
<span class="code-line">Loading mirror speeds from cached hostfile</span>
<span class="code-line"> * base: pubmirrors.dal.corespace.com</span>
<span class="code-line"> * epel: linux.mirrors.es.net</span>
<span class="code-line"> * extras: mirrors.easynews.com</span>
<span class="code-line"> * remi: mirrors.mediatemple.net</span>
<span class="code-line"> * updates: mirrors.easynews.com</span>
<span class="code-line">repo id repo name status</span>
<span class="code-line">base CentOS-6 - Base <span class="m">6</span>,518</span>
<span class="code-line">epel Extra Packages <span class="k">for</span> Enterprise Linux <span class="m">6</span> - x86_64 <span class="m">11</span>,153</span>
<span class="code-line">extras CentOS-6 - Extras <span class="m">37</span></span>
<span class="code-line">pgdg91 PostgreSQL <span class="m">9</span>.1 <span class="m">6</span> - x86_64 <span class="m">279</span></span>
<span class="code-line">pgdg93 PostgreSQL <span class="m">9</span>.3 <span class="m">6</span> - x86_64 <span class="m">307</span></span>
<span class="code-line">puppetlabs-deps Puppet Labs Dependencies El <span class="m">6</span> - x86_64 <span class="m">77</span></span>
<span class="code-line">puppetlabs-products Puppet Labs Products El <span class="m">6</span> - x86_64 <span class="m">475</span></span>
<span class="code-line">remi Les RPM de remi pour Enterprise Linux <span class="m">6</span> - x86_64 <span class="m">2</span>,407</span>
<span class="code-line">updates CentOS-6 - Updates <span class="m">748</span></span>
<span class="code-line">repolist: <span class="m">22</span>,001</span>
<span class="code-line"></code></pre></div>wsl centos7: Failed to get D-Bus connection Operation not permitted2020-02-19T14:06:00+08:002020-02-19T14:06:00+08:00doobomtag:doobom.me,2020-02-19:/wsl-centos7-failed-to-get-d-bus-connection-Operation-not-permitted<p>wsl 方式运行的 CentOS 7 无法运行 service/systemctl 命令的解决办法.</p><p>即然是 CentOS 那如果不能运行 <code>service</code> <code>systemctl</code> 那不是等于是残了嘛.</p>
<p>用的是 <a href="https://github.com/yuk7/CentWSL">yuk7/CentWSL</a> 这个 CentOS 7 装完感觉挺好的, 心里暗爽, 然后就开始折腾了.</p>
<p>安装 PostgreSQL 配置完了以后就准备 <code>service postgresql start</code> 的时候就提示了错误:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Failed to get D-Bus connection Operation not permitted</span>
<span class="code-line"></code></pre></div>
<p>查了一下,意思就是 wsl 并不支持。</p>
<p>不过 github 上有人解决了, <a href="https://github.com/DDoSolitary/LxRunOffline/issues/88">这里</a></p>
<p>大概就是这样:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>mv /usr/bin/systemctl /usr/bin/systemctl.old</span>
<span class="code-line">curl https://raw.githubusercontent.com/gdraheim/docker-systemctl-replacement/master/files/docker/systemctl.py > /usr/bin/systemctl</span>
<span class="code-line">chmod +x /usr/bin/systemctl</span>
<span class="code-line"></code></pre></div>
<p>有一个介绍 wsl 的写的很详细,推友 塔Q 分享的 <a href="https://dowww.spencerwoo.com/1.0/1-preparations/1-0-intro.html">Dev on Windows with <span class="caps">WSL</span></a>,值得一读.</p>
<p>另一个设置自动运行一文章: <a href="https://dev.to/ironfroggy/wsl-tips-starting-linux-background-services-on-windows-login-3o98"><span class="caps">WSL</span> Tips: Starting Linux Background Services on Windows Login</a></p>
<p>还有一个 repo: <a href="https://github.com/troytse/wsl-autostart">troytse/wsl-autostart</a></p>How to enable the Windows subsystem for linux feature2020-02-18T16:02:00+08:002020-02-18T16:02:00+08:00doobomtag:doobom.me,2020-02-18:/enable-windows-subsystem-linux-feature<p>The Windows Subsystem for Linux (<span class="caps">WSL</span>) is an efficient way to get the benefits of different Linux operating systems on Windows 10 <span class="caps">PC</span> and laptops. <span class="caps">WSL</span> allows running of Linux apps directly on Windows 10 system without using any virtualization software like VirtualBox or VMware. The <span class="caps">WSL</span> is available for Windows 10 and Windows server 2019.</p>
<blockquote>
<p>原文: <a href="https://www.how2shout.com/how-to/enable-windows-subsystem-linux-feature.html">How to enable the Windows subsystem for linux feature</a>
</p>
</blockquote>
<p>The Windows Subsystem for Linux (<span class="caps">WSL</span>) is an efficient way to get the benefits of different Linux operating systems on Windows 10 <span class="caps">PC</span> and laptops. <span class="caps">WSL</span> allows running of Linux apps directly on Windows 10 system without using any virtualization software like VirtualBox or VMware. The <span class="caps">WSL</span> is available for Windows 10 and Windows server 2019.</p>
<p>Windows Subsystem for Linux (<span class="caps">WSL</span>) basically a compatibility layer developed by Microsoft for running Linux binaries. It doesn’t contain any kind of Linux kernel code rather it uses a Linux compatible kernel interface. The disadvantage of the <span class="caps">WSL</span> it is not capable of running all Linux software especially those requires the Linux kernel services.</p>
<p>We can run Linux apps in graphical mode by installing the opensource X11 server on the Windows 10 (hosts), however, the performance would be poor due to lack of audio or hardware acceleration.</p>
<p>There are lots of advantages of <span class="caps">WSL</span> too, such as the user don’t need to install any Virtual machine to test out Linux application; one can install and create Apache (<span class="caps">LAMP</span> stack), Nginx kind of web server natively on Windows 10; different types of Linux distributions systems available as apps such as Debian, Ubuntu, Kali Linux and OpenSuse; Consume low resources as compared to Virtual machines; navigate around the file system; use of command line Linux apps via Bash and more… Now let’s see how to install Windows subsystem for Linux on Windows 10 or Windows server 2019. The <span class="caps">WSL</span> is not available for older versions of Windows.</p>
<h1 id="enable-windows-subsystem-for-linux-wsl-on-windows-10">Enable Windows Subsystem for Linux (<span class="caps">WSL</span>) on Windows 10<a class="headerlink" href="#enable-windows-subsystem-for-linux-wsl-on-windows-10" title="Permanent link"> </a></h1>
<ul>
<li>Open <strong>Control Panel</strong></li>
<li>Click on <strong>Programs</strong> option</li>
<li>Select the <strong>Turn Windows features Turn on or off</strong></li>
<li>Scroll down and find <strong>Windows SubSystem for Linux</strong></li>
<li>When it appears to select its <strong>checkbox</strong> and click on the <strong><span class="caps">OK</span></strong> button.</li>
<li>In a few minutes, the <strong>Windows Subsystem for Linux (<span class="caps">WSL</span>)</strong> will automatically get installed on the system.</li>
<li>After installation, click the <strong>Restart Now</strong> button.</li>
<li>Now open <strong>Microsoft Windows store</strong> and search for <strong>Linux</strong></li>
<li>Install any of the available open-source Linux apps on Windows 10</li>
</ul>
<h1 id="step-by-step-installation-with-screenshots">Step by step installation with screenshots<a class="headerlink" href="#step-by-step-installation-with-screenshots" title="Permanent link"> </a></h1>
<p><strong>Step 1</strong>: Click on the Start menu of Windows and navigate to open the control panel.</p>
<p><strong>Step 2</strong>: From the Control Panel, first click on the “Turn Windows features on or off” option. One can also search directly for it from the Search box of Windows.</p>
<p><img alt="Turns windows features turn on or off from control panel" src="images/8001-1.jpg"/></p>
<p><strong>Step 3</strong>: Scroll down and you will find an option Windows Subsystem for Linux. A box is given in front of that click on that to check and then the <span class="caps">OK</span> button to install the <span class="caps">WSL</span> on Windows 10.</p>
<p><img alt="subsystem for Linux" src="images/8001-2.jpg"/></p>
<p><strong>Step 4</strong>: When it asks to restart the system do that.</p>
<p><strong>Step 5</strong>: After the installation, go to the Microsoft store and download the Linux app to play with.</p>
<p><strong>Step 6</strong>: When you search for the term Linux: Run Linux of Windows, Debian, Ubuntu, OpenSuse enterprise server, Kali Linux environments will appear. Choose the one you want to work with to download and install. Here we are installing Ubuntu 18.04.</p>
<p><img alt="Run linux on WIndows" src="images/8001-3.jpg"/></p>
<p><strong>Step 7</strong>: Once we installed Ubuntu or other Linux apps on Windows then just go to search box and type its name. For example, we have installed Ubuntu, so we typed Ubuntu.</p>
<p><img alt="Ubuntu 18.04 on windows WSL" src="images/8001-4.jpg"/></p>
<p><strong>Step 8</strong>: As soon as you open the bash of Ubuntu on Windows you can run the native Linux commands directly on Windows 10 systems. You can now setup Apache (<span class="caps">LAMP</span>) web server without the need of <span class="caps">WAMP</span> or <span class="caps">XAMPP</span> like servers. All the files of the Linux apps will save on your C Drive without any contradiction with Windows files.</p>
<p>We tried to set up Apache and <span class="caps">PHP</span> on Ubuntu on Windows 10 subsystem for Linux and it worked perfectly. It was smooth and performed better than installing a virtual machine using VirtualBox or other Virtualization software.</p>
<p><img alt="Installing PHP on Windows subsystem Linux" src="images/8001-5.jpg"/></p>
<p>So, in this way, anyone can enable the subsystem for Linux on Windows to test different Linux commands without compromising much on hardware resources.</p>
<hr/>
<h1 id="use-powershell-command-to-install-wsl">Use PowerShell command to Install <span class="caps">WSL</span><a class="headerlink" href="#use-powershell-command-to-install-wsl" title="Permanent link"> </a></h1>
<blockquote>
<p>原文: <a href="https://docs.microsoft.com/en-us/windows/wsl/install-win10">Windows Subsystem for Linux Installation Guide for Windows 10</a></p>
</blockquote>
<p><strong>Install the Windows Subsystem for Linux</strong></p>
<p>Before installing any Linux distros for <span class="caps">WSL</span>, you must ensure that the “Windows Subsystem for Linux” optional feature is enabled:</p>
<ul>
<li>Open PowerShell as Administrator and run:</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><code>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux</span>
<span class="code-line"></code></pre></div>
<ul>
<li>Restart your computer when prompted.</li>
</ul>How to Install and Configure Askbot with Nginx on CentOS 72020-02-10T10:56:00+08:002020-02-10T10:56:00+08:00doobomtag:doobom.me,2020-02-10:/how-to-install-and-configure-askbot-with-nginx-on-centos-7<p>Askbot is an open source software for creating Q&A forums based on Python Django Framework. It’s basically a Q&A system like StackOverflow, Yahoo Answers, and others. Created by Mike Chan and Sailing Cai on 2009, and it’s easy to install and configure on Linux systems like Ubuntu and CentOS. Many large open source software projects like Fedora and LibreOffice are using it.</p>
<blockquote>
<p>原文: <a href="https://www.howtoforge.com/tutorial/how-to-install-and-configure-askbot-with-nginx-on-centos-7/">How to Install and Configure Askbot with Nginx on CentOS 7</a>
</p>
</blockquote>
<p>Askbot is an open source software for creating Q&A forums based on Python Django Framework. It’s basically a Q&A system like StackOverflow, Yahoo Answers, and others. Created by Mike Chan and Sailing Cai on 2009, and it’s easy to install and configure on Linux systems like Ubuntu and CentOS. Many large open source software projects like Fedora and LibreOffice are using it.</p>
<p>In this tutorial, we will show you how to install Askbot Python Django application using uWSGI and Nginx web server on CentOS 7 system. As for database, we will be using PostgreSQL for Askbot installation.</p>
<h1 id="what-we-will-do">What we will do<a class="headerlink" href="#what-we-will-do" title="Permanent link"> </a></h1>
<ul>
<li>Install dependencies</li>
<li>Install and configure PostgreSQL</li>
<li>Install and configure Askbot</li>
<li>Install and configure uWSGI</li>
<li>Install and configure Nginx Webserver</li>
<li>Test the setup</li>
</ul>
<h1 id="prerequisites">Prerequisites<a class="headerlink" href="#prerequisites" title="Permanent link"> </a></h1>
<ul>
<li>CentOS 7 Server</li>
<li>Root privileges</li>
</ul>
<h1 id="step-1-install-dependencies">Step 1 - Install dependencies<a class="headerlink" href="#step-1-install-dependencies" title="Permanent link"> </a></h1>
<p>In this step, we will install some packages that are needed for successful Askbot installation. These include ‘Development Tools’, Epel repository, and some python-related tools (for managing Python packages). So let’s begin.</p>
<p>First, install CentOS ‘Development Tools’ with yum group command below.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>yum group install <span class="s1">'Development Tools'</span></span>
<span class="code-line"></code></pre></div>
<p>Then install the Epel repository.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>yum -y install epel-release</span>
<span class="code-line"></code></pre></div>
<p>And finally install the python packages, including python pip, python-devel and python six.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>yum -y install python-pip python-devel python-six</span>
<span class="code-line"></code></pre></div>
<p><img alt="Installing python" src="images/7002-1.png"/></p>
<h1 id="step-2-install-and-configure-postgresql">Step 2 - Install and configure PostgreSQL<a class="headerlink" href="#step-2-install-and-configure-postgresql" title="Permanent link"> </a></h1>
<p>Now we need PostgreSQL database, which is available in the CentOS repository. In this section, we will discuss how you can install PostgreSQL database, change the postgres password user, create a new user and database for the Askbot installation, and finally, change the postgres authentication config.</p>
<p>So let’s start with installing PostgreSQL from the repository using the yum command below.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>yum -y install postgresql-server postgresql-devel postgresql-contrib</span>
<span class="code-line"></code></pre></div>
<p>Once the installation is complete, we need to initialize the database, which you can do using the command below.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>postgresql-setup initdb</span>
<span class="code-line"></code></pre></div>
<p>Moving on, start postgres and enable it to launch automatically at the boot time.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>systemctl start postgresql</span>
<span class="code-line">systemctl <span class="nb">enable</span> postgresql</span>
<span class="code-line"></code></pre></div>
<p>At this point, the PostgreSQL database should be installed. Next, we need to reset the postgres user password. For this, first login as ‘postgres’ user and access the psql command line tool.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>su - postgres</span>
<span class="code-line">psql</span>
<span class="code-line"></code></pre></div>
<p>And then give the postgres user a new password.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="se">\p</span>assword postgres</span>
<span class="code-line"></code></pre></div>
<p>Now, create a new database and user for Askbot. For example, we want to create a new user ‘<strong>hakaselabs</strong>‘ with password ‘<strong>hakase123</strong>‘, and the database named ‘<strong>askbotdb</strong>‘. The following postgres queries will help us create all of these.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>create database askbotdb<span class="p">;</span></span>
<span class="code-line">create user hakaselabs with password <span class="s1">'hakase123'</span><span class="p">;</span></span>
<span class="code-line">grant all privileges on database askbotdb to hakaselabs<span class="p">;</span></span>
<span class="code-line"></code></pre></div>
<p><img alt="Install PostgreSQL" src="images/7002-2.png"/></p>
<p>So now, a database and user for Askbot installation have been created. The next step is to edit the postgres configuration for authentication setup, which you can do by heading to the ‘pgsql/data’ directory and editing the ‘pg_hba.conf’ file with vim.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">cd</span> /var/lib/pgsql/data/</span>
<span class="code-line">vim pg_hba.conf</span>
<span class="code-line"></code></pre></div>
<p>Once inside the file, change all authentication to md5, as shown below.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err">local all all md5</span></span>
<span class="code-line"><span class="err"> # IPv4 local connections:</span></span>
<span class="code-line"><span class="err"> host all all 127.0.0.1/32 md5</span></span>
<span class="code-line"><span class="err"> # IPv6 local connections:</span></span>
<span class="code-line"><span class="err"> host all all ::1/128 md5</span></span>
<span class="code-line"></code></pre></div>
<p><img alt="Configure PostgreSQL" src="images/7002-3.png"/></p>
<p>Now, save and exit the file, and then restart the postgres service.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>systemctl restart postgresql</span>
<span class="code-line"></code></pre></div>
<p>So by now, the PostgreSQL database has been installed; database for the Askbot installation has been created; and the postgres user authentication method has been changed to md5.</p>
<h1 id="step-3-install-and-configure-askbot">Step 3 - Install and configure Askbot<a class="headerlink" href="#step-3-install-and-configure-askbot" title="Permanent link"> </a></h1>
<p>In this step, we will discuss the installation and configuration of Askbot. We will install Askbot under a user named ‘askbot’, and using the virtualenv python. So let’s begin.</p>
<p>Firstly, create a new user ‘askbot’ and give the user a new password.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>useradd -m -s /bin/bash askbot</span>
<span class="code-line">passwd askbot</span>
<span class="code-line"></code></pre></div>
<p>Then add the ‘askbot’ user to the ‘wheel’ group for sudo command access (not sure what ‘sudo’ is? Learn more about it <a href="https://www.howtoforge.com/tutorial/sudo-beginners-guide/">here</a>).</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>usermod -a -G wheel askbot</span>
<span class="code-line"></code></pre></div>
<p><img alt="Install AskBot" src="images/7002-4.png"/></p>
<p>Now upgrade pip to the latest version and install the python virtualenv package.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>pip install --upgrade pip</span>
<span class="code-line">pip install virtualenv six</span>
<span class="code-line"></code></pre></div>
<p><img alt="Install pip" src="images/7002-5.png"/></p>
<p>Next. log in as ‘askbot’ user and create new python virtual environment ‘hakase-labs’ with virtualenv.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>su - askbot</span>
<span class="code-line">virtualenv hakase-labs/</span>
<span class="code-line"></code></pre></div>
<p>Go to the ‘hakase-labs’ directory and activate the virtual environment for Askbot installation.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">cd</span> hakase-labs/</span>
<span class="code-line"><span class="nb">source</span> bin/activate</span>
<span class="code-line"></code></pre></div>
<p>Now install askbot and other python packages with pip command on ‘hakase-labs’ virtual environment.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>pip install six </span>
<span class="code-line">pip install askbot psycopg2</span>
<span class="code-line"></code></pre></div>
<p><img alt="installing askbot" src="images/7002-6.png"/></p>
<p>Next, create a new directory for the ‘Askbot’ project. Please make sure you don’t use ‘askbot’ as the directory name. In our case, for example, we created a new directory named ‘myapp’</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>mkdir myapp/</span>
<span class="code-line"></code></pre></div>
<p>Go to the myapp directory and run the ‘askbot-setup’ command.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">cd</span> myapp/</span>
<span class="code-line">askbot-setup</span>
<span class="code-line"></code></pre></div>
<p>The ‘askbot-setup’ command will ask you certain things. For example, you will be asked about directory path to deploy Askbot - you can type ‘.’ and press Enter to continue. Similarly, when asked about database engine, type ‘1’ to use postgresql and press Enter. For database-related details, enter databasename as ‘askbotdb’, database user as ‘hakaselabs’, and password as ‘hakase123’.</p>
<p><img alt="configure the application" src="images/7002-7.png"/></p>
<p>So Askbot is now installed on the ‘myapp’ directory. Now we need to generate Askbot Django static files and the database.</p>
<p>Run the command below to generate Askbot Django static files.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>python manage.py collectstatic</span>
<span class="code-line"></code></pre></div>
<p>When asked for confirmation, type ‘yes’ and press Enter.</p>
<p><img alt="python manage.py" src="images/7002-8.png"/></p>
<p>Now, to generate the database, run syncdb as below.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>python manage.py syncdb</span>
<span class="code-line"></code></pre></div>
<p>You will be asked about creating the admin user and password. So when asked, type the username, email, and password for admin configuration.</p>
<p><img alt="Create admin user" src="images/7002-9.png"/></p>
<p>So by now, Askbot has been installed, static files have been generated, and the database configuration has been completed.</p>
<p>You can test the Askbot installation with runserver command below.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>python manage.py runserver <span class="m">0</span>.0.0.0:8080</span>
<span class="code-line"></code></pre></div>
<p>Open your Web browser and type the server <span class="caps">IP</span> address, and you should see a page similar to the following:</p>
<p><img alt="Result in web browser" src="images/7002-10.png"/></p>
<h1 id="step-4-install-and-configure-uwsgi">Step 4 - Install and configure uWSGI<a class="headerlink" href="#step-4-install-and-configure-uwsgi" title="Permanent link"> </a></h1>
<p>We will be using uWSGI as service for the Askbot Django project. Specifically, we will be using uWSGI with Nginx web server for the Askbot installation. So let’s begin.</p>
<p>Firstly, install uWSGI using the pip command, as shown below.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>sudo pip install uwsgi</span>
<span class="code-line"></code></pre></div>
<p>After the installation is complete, create a new directory for the uWSGI virtual host files. For example, in our case, we created ‘/etc/uwsgi/sites’.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>mkdir -p /etc/uwsgi/sites</span>
<span class="code-line"></code></pre></div>
<p>Go to the newly-created directory and create new askbot uWSGI configuration with vim.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">cd</span> /etc/uwsgi/sites</span>
<span class="code-line">vim askbot.ini</span>
<span class="code-line"></code></pre></div>
<p>Paste the following configuration in the file.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="k">[uwsgi]</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1"># Project directory, Python directory</span></span>
<span class="code-line"> <span class="na">chdir</span> <span class="o">=</span> <span class="s">/home/askbot/hakase-labs/myapp</span></span>
<span class="code-line"><span class="s"> home = /home/askbot/hakase-labs/</span></span>
<span class="code-line"><span class="s"> static-map = /m=/home/askbot/hakase-labs/myapp/static</span></span>
<span class="code-line"><span class="s"> wsgi-file = /home/askbot/hakase-labs/myapp/django.wsgi</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="na">master</span> <span class="o">=</span> <span class="s">true</span></span>
<span class="code-line"><span class="s"> processes = 5</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1"># Askbot will running under the sock file</span></span>
<span class="code-line"> <span class="na">socket</span> <span class="o">=</span> <span class="s">/run/uwsgi/askbot.sock</span></span>
<span class="code-line"><span class="s"> chmod-socket = 664</span></span>
<span class="code-line"><span class="s"> uid = askbot</span></span>
<span class="code-line"><span class="s"> gid = nginx</span></span>
<span class="code-line"><span class="s"> vacuum = true</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="c1"># uWSGI Log file</span></span>
<span class="code-line"> <span class="na">logto</span> <span class="o">=</span> <span class="s">/var/log/uwsgi.log</span></span>
<span class="code-line"></code></pre></div>
<p>That’s it. Save the file and exit from the editor.</p>
<p>Next, add new uWSGI service script file to the ‘/etc/systemd/system’ directory. Go to the directory and create the ‘uwsgi.service’ file with vim.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">cd</span> /etc/systemd/system/</span>
<span class="code-line">vim uwsgi.service</span>
<span class="code-line"></code></pre></div>
<p>Paste the following uWSGI service configuration in the file.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="k">[Unit]</span></span>
<span class="code-line"> <span class="na">Description</span><span class="o">=</span><span class="s">uWSGI Emperor service</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="k">[Service]</span></span>
<span class="code-line"> <span class="na">ExecStartPre</span><span class="o">=</span><span class="s">/bin/bash -c 'mkdir -p /run/uwsgi; chown askbot:nginx /run/uwsgi'</span></span>
<span class="code-line"><span class="s"> ExecStart=/bin/uwsgi --emperor /etc/uwsgi/sites</span></span>
<span class="code-line"><span class="s"> Restart=always</span></span>
<span class="code-line"><span class="s"> KillSignal=SIGQUIT</span></span>
<span class="code-line"><span class="s"> Type=notify</span></span>
<span class="code-line"><span class="s"> NotifyAccess=all</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="k">[Install]</span></span>
<span class="code-line"> <span class="na">WantedBy</span><span class="o">=</span><span class="s">multi-user.target</span></span>
<span class="code-line"></code></pre></div>
<p>Save and exit.</p>
<p>Now, reload systemd services and enable uWSGI to start automatically at the boot time.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>systemctl daemon-reload</span>
<span class="code-line">systemctl <span class="nb">enable</span> uwsgi</span>
<span class="code-line"></code></pre></div>
<p><img alt="Reload services" src="images/7002-11.png"/></p>
<p>So with this, uWSGI has been installed, and you should see it running as a service.</p>
<h1 id="step-5-install-and-configure-nginx-webserver">Step 5 - Install and configure Nginx webserver<a class="headerlink" href="#step-5-install-and-configure-nginx-webserver" title="Permanent link"> </a></h1>
<p>So, Askbot is now installed, and it’s running under uWSGI sock file ‘askbot.sock’. In this step, we will be using Nginx web server as a reverse proxy for uWSGI application ‘Askbot’.</p>
<p>To begin with, install Nginx with the yum command.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>yum -y install nginx</span>
<span class="code-line"></code></pre></div>
<p>Now go to the Nginx ‘conf.d’ directory and create new virtual host file ‘askbot.conf’ with the vim editor.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">cd</span> /etc/nginx/conf.d/</span>
<span class="code-line">vim askbot.conf</span>
<span class="code-line"></code></pre></div>
<p><img alt="install nginx" src="images/7002-12.png"/></p>
<p>Paste the following Askbot Nginx configuration in the file.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err">server {</span></span>
<span class="code-line"><span class="err"> listen 80;</span></span>
<span class="code-line"><span class="err"> server_name askbot.me www.askbot.me;</span></span>
<span class="code-line"><span class="err"> location / {</span></span>
<span class="code-line"><span class="err"> include uwsgi_params;</span></span>
<span class="code-line"><span class="err"> uwsgi_pass unix:/run/uwsgi/askbot.sock;</span></span>
<span class="code-line"><span class="err"> }</span></span>
<span class="code-line"><span class="err"> }</span></span>
<span class="code-line"></code></pre></div>
<p>Save the file and exit from the editor. Now, test the configuration to make sure there is no error.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>nginx -t</span>
<span class="code-line"></code></pre></div>
<p>Next, start Nginx and uWSGI services.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>systemctl start nginx</span>
<span class="code-line">systemctl start uwsgi</span>
<span class="code-line"></code></pre></div>
<p>And enable them to start automatically at the boot time.</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>systemctl <span class="nb">enable</span> nginx</span>
<span class="code-line">systemctl <span class="nb">enable</span> uwsgi</span>
<span class="code-line"></code></pre></div>
<p><img alt="test nginx config and restart nginx" src="images/7002-13.png"/></p>
<p>So Nginx is now installed as a reverse proxy for uWSGI application ‘Askbot’.</p>
<h1 id="step-6-test-the-setup">Step 6 - Test the setup<a class="headerlink" href="#step-6-test-the-setup" title="Permanent link"> </a></h1>
<p>Open your web browser and visit the Askbot domain name: askbot.me, and you will get to see the home page, as shown below.</p>
<p><img alt="askbot domain" src="images/7002-14.png"/></p>
<p>Here’s the Askbot user login page:</p>
<p><img alt="askbot login" src="images/7002-15.png"/></p>
<p>Askbot user dashboard:</p>
<p><img alt="askbot dashboard" src="images/7002-16.png"/></p>
<p>Askbot admin setting:</p>
<p><img alt="askbot admin dashboard" src="images/7002-17.png"/></p>
<p>Askbot Django admin login:</p>
<p><img alt="Django admin login" src="images/7002-18.png"/></p>
<p>Askbot Django admin dashboard:</p>
<p><img alt="Django admin dashboard" src="images/7002-19.png"/></p>
<p>So the Q&A system application ‘Askbot’ has been successfully installed with uWSGI and Nginx web server on CentOS 7 server.</p>
<h1 id="reference">Reference<a class="headerlink" href="#reference" title="Permanent link"> </a></h1>
<ul>
<li><a href="https://askbot.org/en/">https://askbot.org/en/</a></li>
</ul>git ssh 配置2020-02-06T15:09:00+08:002020-02-06T15:09:00+08:00doobomtag:doobom.me,2020-02-06:/git-auth-via-ssh-key<p>用 ssh 私钥登录 github 配置记录</p><h3 id="git">添加用户名及邮箱到 git 的全局配置<a class="headerlink" href="#git" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code>git config --global user.name <span class="s2">"Your Name Here"</span></span>
<span class="code-line"><span class="c1"># Sets the default name for git to use when you commit</span></span>
<span class="code-line"></span>
<span class="code-line">git config --global user.email <span class="s2">"your_email@example.com"</span></span>
<span class="code-line"><span class="c1"># Sets the default email for git to use when you commit</span></span>
<span class="code-line"></code></pre></div>
<h3 id="ssh">生成 ssh 密钥文件(已有证书就忽略<a class="headerlink" href="#ssh" title="Permanent link"> </a></h3>
<p><strong>1. 邮箱改成你的 github 邮件,根据提示操作创建密钥</strong></p>
<div class="highlight"><pre><span class="code-line"><span></span><code>ssh-keygen -t rsa -b <span class="m">4096</span> -C <span class="s2">"your_email@example.com"</span></span>
<span class="code-line"></code></pre></div>
<p><strong>2. 提示 <code>nter a file in which to save the key,</code> 输入文件保存的路径,直接回车就保存到提示的目录</strong></p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Enter a file in which to save the key <span class="o">(</span>/c/Users/you/.ssh/id_rsa<span class="o">)</span>:<span class="o">[</span>Press enter<span class="o">]</span></span>
<span class="code-line"></code></pre></div>
<p><strong>3. 如果需要添加密码就在出现下面提示时输入</strong></p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Enter passphrase <span class="o">(</span>empty <span class="k">for</span> no passphrase<span class="o">)</span>: <span class="o">[</span>Type a passphrase<span class="o">]</span></span>
<span class="code-line">Enter same passphrase again: <span class="o">[</span>Type passphrase again<span class="o">]</span></span>
<span class="code-line"></code></pre></div>
<h3 id="ssh_1">设置 ssh<a class="headerlink" href="#ssh_1" title="Permanent link"> </a></h3>
<p><strong>1. 修改 <code>/etc/ssh/ssh_config</code>, 在文件末尾添加</strong></p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err">Host github.com</span></span>
<span class="code-line"><span class="err"> User git</span></span>
<span class="code-line"><span class="err"> Hostname github.com</span></span>
<span class="code-line"><span class="err"> IdentityFile /etc/ssh/github-ecdsa-521</span></span>
<span class="code-line"></code></pre></div>
<p><strong>2. 将公钥添加到 github 帐户</strong></p>
<ul>
<li>复制公钥文件到剪贴板</li>
</ul>
<div class="highlight"><pre><span class="code-line"><span></span><code>clip < /etc/ssh/github-ecdsa-521.pub</span>
<span class="code-line"><span class="c1"># Copies the contents of the id_rsa.pub file to your clipboard</span></span>
<span class="code-line"></code></pre></div>
<ul>
<li>然后点击 你的头像 -> <code>Setting</code> -> <code>SSH and GPG keys</code> -> <code>New SSH key</code> -> 取个名字,粘贴上公钥 -> <code>Add SSH key</code></li>
</ul>
<p><strong>3. 用命令测试一下</strong></p>
<div class="highlight"><pre><span class="code-line"><span></span><code>ssh -T git@github.com</span>
<span class="code-line"></code></pre></div>
<p>如果提示信息里面能看到你的用户名就说明成功了</p>
<h3 id="_1">参考<a class="headerlink" href="#_1" title="Permanent link"> </a></h3>
<ul>
<li><a href="https://help.github.com/en/github/authenticating-to-github">GitHub Help</a></li>
</ul>
<p>-= 完 =-</p>Nginx 配置跨域请求 Access-Control-Allow-Origin *2020-01-28T16:36:00+08:002020-01-28T16:36:00+08:00doobomtag:doobom.me,2020-01-28:/nginx-access-control-allow-origin<p>nginx 跨域请求</p><blockquote>
<p>原文: <a href="https://segmentfault.com/a/1190000012550346">https://segmentfault.com/a/1190000012550346</a></p>
<p>作者: Developer</p>
<p>本作品系 原作者原创 , 采用<a href="https://creativecommons.org/licenses/by-nc-nd/4.0/">《署名-非商业性使用-禁止演绎 4.0 国际》许可协议</a></p>
</blockquote>
<p>当出现 <code>403</code> 跨域错误的时候 <code>No 'Access-Control-Allow-Origin' header is present on the requested resource</code>,需要给 Nginx 服务器配置响应的 <code>header</code>参数:</p>
<h2 id="_1">一、 解决方案<a class="headerlink" href="#_1" title="Permanent link"> </a></h2>
<p>只需要在Nginx的配置文件中配置以下参数:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="k">location</span> <span class="o">/</span> <span class="err">{</span> </span>
<span class="code-line"> <span class="n">add_header</span> <span class="k">Access</span><span class="o">-</span><span class="n">Control</span><span class="o">-</span><span class="n">Allow</span><span class="o">-</span><span class="n">Origin</span> <span class="o">*</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">add_header</span> <span class="k">Access</span><span class="o">-</span><span class="n">Control</span><span class="o">-</span><span class="n">Allow</span><span class="o">-</span><span class="n">Methods</span> <span class="s1">'GET, POST, OPTIONS'</span><span class="p">;</span></span>
<span class="code-line"> <span class="n">add_header</span> <span class="k">Access</span><span class="o">-</span><span class="n">Control</span><span class="o">-</span><span class="n">Allow</span><span class="o">-</span><span class="n">Headers</span> <span class="s1">'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'</span><span class="p">;</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="err">$</span><span class="n">request_method</span> <span class="o">=</span> <span class="s1">'OPTIONS'</span><span class="p">)</span> <span class="err">{</span></span>
<span class="code-line"> <span class="k">return</span> <span class="mi">204</span><span class="p">;</span></span>
<span class="code-line"> <span class="err">}</span></span>
<span class="code-line"><span class="err">}</span> </span>
<span class="code-line"></code></pre></div>
<p>上面配置代码即可解决问题了,不想深入研究的,看到这里就可以啦=-=</p>
<h2 id="_2">二、 解释<a class="headerlink" href="#_2" title="Permanent link"> </a></h2>
<p><strong>1. Access-Control-Allow-Origin</strong></p>
<p>服务器默认是不被允许跨域的。给 Nginx 服务器配置<code>Access-Control-Allow-Origin *</code>后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。</p>
<p><strong>2. Access-Control-Allow-Headers 是为了防止出现以下错误:</strong></p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.</span>
<span class="code-line"></code></pre></div>
<p>这个错误表示当前请求 <code>Content-Type</code> 的值不被支持。其实是我们发起了 <code>application/json</code> 的类型请求导致的。这里涉及到一个概念:预检请求(preflight request),请看下面”预检请求”的介绍。</p>
<p><strong>3. Access-Control-Allow-Methods 是为了防止出现以下错误:</strong></p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.</span>
<span class="code-line"></code></pre></div>
<p><strong>4.给 <code>OPTIONS</code> 添加 <code>204</code> 的返回,是为了处理在发送 <span class="caps">POST</span> 请求时 Nginx 依然拒绝访问的错误</strong></p>
<p>发送”预检请求”时,需要用到方法 <code>OPTIONS</code> ,所以服务器需要允许该方法。</p>
<h2 id="preflight-request">三、 预检请求(preflight request)<a class="headerlink" href="#preflight-request" title="Permanent link"> </a></h2>
<p>其实上面的配置涉及到了一个 <span class="caps">W3C</span> 标准: <code>CROS</code>,全称是跨域资源共享 (Cross-origin resource sharing),它的提出就是为了解决跨域请求的。</p>
<blockquote>
<p>跨域资源共享(<span class="caps">CORS</span>)标准新增了一组 <span class="caps">HTTP</span> 首部字段,允许服务器声明哪些源站有权限访问哪些资源。另外,规范要求,<strong>对那些可能对服务器数据产生副作用的HTTP 请求方法(特别是 <span class="caps">GET</span> 以外的 <span class="caps">HTTP</span> 请求,或者搭配某些 <span class="caps">MIME</span> 类型的 <span class="caps">POST</span> 请求)</strong>,浏览器必须首先使用 <span class="caps">OPTIONS</span> 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的 <span class="caps">HTTP</span> 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 <span class="caps">HTTP</span> 认证相关数据)。</p>
</blockquote>
<p>其实 <code>Content-Type</code> 字段的类型为 <code>application/json</code> 的请求就是上面所说的搭配某些 <code>MIME</code> 类型的 <code>POST</code> 请求,<span class="caps">CORS</span> 规定,<code>Content-Type</code> 不属于以下 <code>MIME</code> 类型的,都属于预检请求:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>application/x-www-form-urlencoded</span>
<span class="code-line">multipart/form-data</span>
<span class="code-line">text/plain</span>
<span class="code-line"></code></pre></div>
<p>所以 <code>application/json</code> 的请求 会在正式通信之前,增加一次”预检”请求,这次”预检”请求会带上头部信息 <code>Access-Control-Request-Headers: Content-Type</code>:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>OPTIONS /api/test HTTP/1.1</span>
<span class="code-line">Origin: http://foo.example</span>
<span class="code-line">Access-Control-Request-Method: POST</span>
<span class="code-line">Access-Control-Request-Headers: Content-Type</span>
<span class="code-line">... 省略了一些</span>
<span class="code-line"></code></pre></div>
<p>服务器回应时,返回的头部信息如果不包含 <code>Access-Control-Allow-Headers: Content-Type</code> 则表示不接受非默认的的 <code>Content-Type</code>。即出现以下错误:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response.</span>
<span class="code-line"></code></pre></div>
<h2 id="_3">参考文章:<a class="headerlink" href="#_3" title="Permanent link"> </a></h2>
<ul>
<li><a href="http://www.ruanyifeng.com/blog/2016/04/cors.html">阮一峰【跨域资源共享 <span class="caps">CORS</span> 详解】</a></li>
<li><a href="https://developer.mozilla.org/zh-CN/"><span class="caps">MDN</span> web docs【HTTP访问控制(<span class="caps">CORS</span>)】</a></li>
</ul>MariaDB 主从数据库同步2020-01-15T16:15:00+08:002020-01-15T16:15:00+08:00doobomtag:doobom.me,2020-01-15:/mariadb-master-slave-server-sync<p>MariaDB 主从数据库同步</p><h2 id="_1">环境:<a class="headerlink" href="#_1" title="Permanent link"> </a></h2>
<ul>
<li><span class="caps">OS</span>: CentOS 7.4 x64</li>
<li><span class="caps">DB</span>: MariaDB 5.5.56</li>
</ul>
<h2 id="_2">服务端新建一个用于同步的用户:<a class="headerlink" href="#_2" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code>MariaDB <span class="o">[(</span>none<span class="o">)]</span>> GRANT FILE, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO <span class="s1">'sync_account'</span>@<span class="s1">'%'</span> IDENTIFIED BY <span class="s1">'123456'</span><span class="p">;</span></span>
<span class="code-line"></code></pre></div>
<h2 id="mycnf">修改服务端 my.cnf 配置文件:<a class="headerlink" href="#mycnf" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err">server-id = 1 #Server标识, 不能重复</span></span>
<span class="code-line"><span class="err">log-bin = mysql-bin #日志文件名</span></span>
<span class="code-line"><span class="err">auto_increment_increment=2 #自动增长的步长 解决多个主机自动增长出现重复问题 这个主机使用奇数值 另外一个主机使用偶数值 </span></span>
<span class="code-line"><span class="err">auto_increment_offset=1 #自动增长的起始数值</span></span>
<span class="code-line"><span class="err">binlog-do-db=testdb #指定需要日志的数据库,多个加一行,不需要就注释</span></span>
<span class="code-line"><span class="err">binlog-ignore-db = db_name #指定不需要日志的数据库,多个加一行,不需要就注释</span></span>
<span class="code-line"><span class="err">replicate-do-db = testdb #指定从端需要同步的数据库,多个加一行,不需要就注释</span></span>
<span class="code-line"></code></pre></div>
<h2 id="mariadb">重启 MariaDB:<a class="headerlink" href="#mariadb" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code>service mariadb restart</span>
<span class="code-line"></code></pre></div>
<p>配置过程中为了防止突然的主机数据写入 导致配置主从失败 可以将机器锁定只允许读 注意千万不要将从机配成锁定 否则无法同步数据了</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>MariaDB <span class="o">[(</span>none<span class="o">)]</span>> FLUSH TABLES WITH READ LOCK<span class="p">;</span></span>
<span class="code-line"></code></pre></div>
<p>配置完从端解锁:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>MariaDB <span class="o">[(</span>none<span class="o">)]</span>> UNLOCK TABLES<span class="p">;</span></span>
<span class="code-line"></code></pre></div>
<h2 id="_3">备份数据库:<a class="headerlink" href="#_3" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code>mysql -u root -p --quick --all-databases --flush-logs --delete-master-logs --single-transaction > sync.sql</span>
<span class="code-line"></code></pre></div>
<h2 id="_4">查看服务端状态<a class="headerlink" href="#_4" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code>MariaDB <span class="o">[(</span>none<span class="o">)]</span>> SHOW MASTER STATUS<span class="p">;</span></span>
<span class="code-line"></code></pre></div>
<p>显示类似如下:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>+------------------+----------+-------------------------------------+------------------+</span>
<span class="code-line"><span class="p">|</span> File <span class="p">|</span> Position <span class="p">|</span> Binlog_Do_DB <span class="p">|</span> Binlog_Ignore_DB <span class="p">|</span></span>
<span class="code-line">+------------------+----------+-------------------------------------+------------------+</span>
<span class="code-line"><span class="p">|</span> mysql-bin.000013 <span class="p">|</span> <span class="m">1714336</span> <span class="p">|</span> testdb <span class="p">|</span> <span class="p">|</span></span>
<span class="code-line">+------------------+----------+-------------------------------------+------------------+</span>
<span class="code-line"><span class="m">1</span> row in <span class="nb">set</span> <span class="o">(</span><span class="m">0</span>.00 sec<span class="o">)</span></span>
<span class="code-line"></code></pre></div>
<h2 id="_5">从端导入数据库<a class="headerlink" href="#_5" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code>mysql -u root -p < sync.sql</span>
<span class="code-line"></code></pre></div>
<h2 id="mycnf_1">修改从端 my.cnf 配置文件:<a class="headerlink" href="#mycnf_1" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err">server-id = 2</span></span>
<span class="code-line"><span class="err">auto_increment_increment=3 </span></span>
<span class="code-line"><span class="err">auto_increment_offset=1</span></span>
<span class="code-line"><span class="err">#其余项目与服务端一致就可以了, 完了重启 MariaDB</span></span>
<span class="code-line"></code></pre></div>
<h2 id="_6">配置从端主服务器信息:<a class="headerlink" href="#_6" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code>MariaDB <span class="o">[(</span>none<span class="o">)]</span>> CHANGE MASTER TO <span class="nv">MASTER_HOST</span><span class="o">=</span><span class="s1">'master.host.name'</span>,<span class="se">\ </span> <span class="c1">#主服务器主机名称</span></span>
<span class="code-line"> -> <span class="nv">MASTER_USER</span><span class="o">=</span><span class="s1">'sync_account'</span>,<span class="se">\ </span> <span class="c1">#用于复制的用户</span></span>
<span class="code-line"> -> <span class="nv">MASTER_PASSWORD</span><span class="o">=</span><span class="s1">'12345'</span>,<span class="se">\ </span> <span class="c1">#复制用户的密码</span></span>
<span class="code-line"> -> <span class="nv">MASTER_PORT</span><span class="o">=</span><span class="m">3306</span>,<span class="se">\ </span> <span class="c1">#连接使用的端口</span></span>
<span class="code-line"> -> <span class="nv">MASTER_LOG_FILE</span><span class="o">=</span><span class="s1">'mysql-bin.000013'</span>,<span class="se">\ </span> <span class="c1">#起点日志文件</span></span>
<span class="code-line"> -> <span class="nv">MASTER_LOG_POS</span><span class="o">=</span><span class="m">1714336</span>,<span class="se">\ </span> <span class="c1">#起点位置</span></span>
<span class="code-line"> -> <span class="nv">MASTER_CONNECT_RETRY</span><span class="o">=</span><span class="m">10</span>,<span class="se">\ </span> <span class="c1">#连接重试间隔</span></span>
<span class="code-line"> -> <span class="nv">MASTER_HEARTBEAT_PERIOD</span><span class="o">=</span><span class="m">2</span><span class="p">;</span> <span class="c1">#心跳间隔时间</span></span>
<span class="code-line"></code></pre></div>
<h2 id="_7">启动从端数据库同步<a class="headerlink" href="#_7" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code>MariaDB <span class="o">[(</span>none<span class="o">)]</span>> START SLAVE<span class="p">;</span> <span class="c1">#启动同步进程</span></span>
<span class="code-line"></code></pre></div>
<h2 id="_8">查看同步信息<a class="headerlink" href="#_8" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code>MariaDB <span class="o">[(</span>none<span class="o">)]</span>> SHOW SLAVE STATUS<span class="se">\G</span> <span class="c1">#查看从服务器线程的关键参数的信息</span></span>
<span class="code-line">*************************** <span class="m">1</span>. row ***************************</span>
<span class="code-line"> Slave_IO_State: Waiting <span class="k">for</span> master to send event</span>
<span class="code-line"> Master_Host: master</span>
<span class="code-line"> Master_User: backup1 <span class="c1">#被用于连接主服务器的当前用户</span></span>
<span class="code-line"> Master_Port: <span class="m">3306</span></span>
<span class="code-line"> Connect_Retry: <span class="m">10</span> <span class="c1">#连接重试间隔</span></span>
<span class="code-line"> Master_Log_File: mysql-bin.000003 <span class="c1">#I/O线程当前正在读取的主服务器二进制日志文件的名称</span></span>
<span class="code-line"> Read_Master_Log_Pos: <span class="m">1832</span> <span class="c1">#在当前的主服务器二进制日志中,I/O线程已经读取的位置</span></span>
<span class="code-line"> Relay_Log_File: relay-bin.000003 <span class="c1">#SQL线程当前正在读取和执行的中继日志文件的名称</span></span>
<span class="code-line"> Relay_Log_Pos: <span class="m">529</span> <span class="c1">#在当前的中继日志中,SQL线程已读取和执行的位置</span></span>
<span class="code-line"> Relay_Master_Log_File: mysql-bin.000003 <span class="c1">#由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称</span></span>
<span class="code-line"> Slave_IO_Running: Yes <span class="c1">#I/O线程是否被启动并成功地连接到主服务器上</span></span>
<span class="code-line"> Slave_SQL_Running: Yes <span class="c1">#SQL线程是否被启动</span></span>
<span class="code-line"> ...</span>
<span class="code-line"> Master_Server_Id: <span class="m">2</span></span>
<span class="code-line"></code></pre></div>
<p>查看从端 <code>MASTER</code> 状态,然后在主端启动服务器同步就可以实现相互同步了。</p>
<h2 id="_9">参考:<a class="headerlink" href="#_9" title="Permanent link"> </a></h2>
<ul>
<li><a href="http://blog.csdn.net/mycwq/article/details/17136001">MySQL数据库设置主从同步</a></li>
<li><a href="http://blog.csdn.net/guoguo1980/article/details/2343722">实现两个Mysql数据库之间的主从同步</a></li>
<li><a href="http://blog.csdn.net/liaomin416100569/article/details/78580382">mariadb配置双主多从</a></li>
<li><a href="http://www.cnblogs.com/xyhome/p/6892631.html">MariaDB主从同步</a></li>
<li><a href="https://dev.mysql.com/doc/refman/5.7/en/change-master-to.html">MySQL Documentation</a></li>
</ul>使用 grep/sed/awk 提取字符串2019-07-17T10:23:00+08:002019-07-17T10:23:00+08:00doobomtag:doobom.me,2019-07-17:/get-string-in-shell-via-grep-sed-awk<p>使用 grep/sed/awk 提取字符串</p><blockquote>
<p>原文: <a href="http://curryhuang.com/2015/07/18/extract-string-by-grep-sed-awk/">http://curryhuang.com/2015/07/18/extract-string-by-grep-sed-awk/</a></p>
</blockquote>
<p>最近需要对日志进行分析,顺便学习了一下以前一直都没弄得太明白的awk和sed。</p>
<h2 id="_1">任务描述<a class="headerlink" href="#_1" title="Permanent link"> </a></h2>
<p>日志是一个 tsv 文件,这里以 sample.log 为例,每一行大致长成下面这样,需要查看某个 api 的最长 10 次查询时间。根据记录格式,需要提取最后一个字段 <code>ts=</code> 之后的字符串,然后进行排序,排序和求 <code>top</code> 比较容易,<code>sort -nr | head -n 10</code> 即可,比较麻烦的是从字符串中提取数字。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="o">[</span><span class="m">2015</span>-07-18 <span class="m">11</span>:00:01,807<span class="o">]</span><span class="se">\t</span><span class="o">[</span>service_name<span class="o">]</span><span class="se">\t</span><span class="o">[</span>INFO<span class="o">]</span><span class="se">\t</span><span class="o">[</span><span class="m">172</span>.0.0.1<span class="o">]</span><span class="se">\t</span><span class="o">[</span>api/mock_api1<span class="o">]</span><span class="se">\t</span><span class="o">[</span><span class="nv">ts</span><span class="o">=</span><span class="m">239</span><span class="o">]</span></span>
<span class="code-line"></code></pre></div>
<h2 id="_2">解决方案<a class="headerlink" href="#_2" title="Permanent link"> </a></h2>
<p>Google 了一番以后,发现 grep/sed/awk 均可以,下面分别说一下每一种方案。</p>
<p><em>以下方案均在CentOS6上测试通过</em></p>
<h3 id="grep">grep<a class="headerlink" href="#grep" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code>grep <span class="s2">"api/mock_api1"</span> sample.log <span class="p">|</span><span class="se">\</span></span>
<span class="code-line">grep -Eo <span class="s1">'\[ts=[0-9]+\]'</span> <span class="p">|</span><span class="se">\</span></span>
<span class="code-line">grep -Eo <span class="s1">'[0-9]+'</span></span>
<span class="code-line"></code></pre></div>
<p>grep 参数说明:
<code>E</code> 使用正则表达式
<code>o</code> 只返回匹配的部分</p>
<p>分两部匹配,第一步提取出<code>[ts=xxxx]</code>,第二步提取出数字</p>
<h3 id="sed">sed<a class="headerlink" href="#sed" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code>grep <span class="s2">"api/mock_api1"</span> sample.log <span class="p">|</span><span class="se">\</span></span>
<span class="code-line">grep -Eo <span class="s1">'\[ts=[0-9]+\]'</span> <span class="p">|</span><span class="se">\</span></span>
<span class="code-line">sed -r <span class="s1">'s/\[ts=([0-9]+)\]/\1/g'</span></span>
<span class="code-line"></code></pre></div>
<p>sed参数说明:
<code>r</code> 使用正则表达式</p>
<p>使用 <code>sed</code> 也需要通过 <code>grep</code> 先匹配出最后一个字段,再使用 <code>sed</code> 提取数字部分,<code>\1</code>表示正则表达式中的分组1</p>
<h3 id="gawk">gawk<a class="headerlink" href="#gawk" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code>grep <span class="s2">"api/mock_api1"</span> sample.log <span class="p">|</span><span class="se">\</span></span>
<span class="code-line">gawk -F<span class="s1">'\t'</span> <span class="s1">'match($6, /\[ts=([0-9]+)\]/, arr) { print arr[1] }'</span></span>
<span class="code-line"></code></pre></div>
<p>gawk 参数说明:
<code>F</code> 指定分隔符,这里指定为tab
<code>match</code> 的函数参数分别为:待匹配字符串,模式,匹配后的字符串分组</p>
<p><code>awk</code> 比较强大,可以直接提取出字段信息,这里使用的是 <code>gawk</code>,<code>gawk</code> 兼容 <code>awk</code> 语法,经测试,同样的语法 <code>awk</code> 无法满足需求,应该是 <code>gawk</code> 和 <code>awk</code> 实现有细微区别。</p>
<h2 id="_3">总结<a class="headerlink" href="#_3" title="Permanent link"> </a></h2>
<p>如果仅仅是提取一个字段信息,三个工具都可以满足需求,相比起来,awk的功能更强大,完成字符串提取,<code>grep</code> 和 <code>sed</code> 的能力更多依赖正则表达式,如果需要同时处理一行记录中的多个字段,比如找出访问请求最长的 10 个 ip,<code>grep</code> 和 <code>sed</code> 就需要很复杂的正则表达式去匹配。</p>如何用 js 准确获取当前页面url网址信息2019-05-16T09:58:00+08:002019-05-16T09:58:00+08:00doobomtag:doobom.me,2019-05-16:/get-url-info-via-javascript<p>在 <span class="caps">WEB</span> 开发中,时常会用到 javascript 来获取当前页面的 url 网址信息,在这里是我的一些获取 url 信息的小总结。</p><blockquote>
<p>原文: <a href="https://blog.csdn.net/voke_/article/details/78293076">https://blog.csdn.net/voke_/article/details/78293076</a></p>
</blockquote>
<p>在 <span class="caps">WEB</span> 开发中,时常会用到 javascript 来获取当前页面的 url 网址信息,在这里是我的一些获取 url 信息的小总结。
下面我们举例一个 <span class="caps">URL</span>,然后获得它的各个组成部分:http://i.cnblogs.com/EditPosts.aspx?opt=1</p>
<h2 id="1windowlocationhref-url">1、window.location.href(设置或获取整个 <span class="caps">URL</span> 为字符串)<a class="headerlink" href="#1windowlocationhref-url" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">var</span> <span class="nx">test</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">href</span><span class="p">;</span> </span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">test</span><span class="p">);</span> </span>
<span class="code-line"><span class="c1">//返回:http://i.cnblogs.com/EditPosts.aspx?opt=1</span></span>
<span class="code-line"></code></pre></div>
<h2 id="2windowlocationprotocol-url">2、window.location.protocol(设置或获取 <span class="caps">URL</span> 的协议部分)<a class="headerlink" href="#2windowlocationprotocol-url" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">var</span> <span class="nx">test</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">protocol</span><span class="p">;</span> </span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">test</span><span class="p">);</span> </span>
<span class="code-line"><span class="c1">//返回:http:</span></span>
<span class="code-line"></code></pre></div>
<h2 id="3windowlocationhost-url">3、window.location.host(设置或获取 <span class="caps">URL</span> 的主机部分)<a class="headerlink" href="#3windowlocationhost-url" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">var</span> <span class="nx">test</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">host</span><span class="p">;</span> </span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">test</span><span class="p">);</span> </span>
<span class="code-line"><span class="c1">//返回:i.cnblogs.com</span></span>
<span class="code-line"></code></pre></div>
<h2 id="4windowlocationport-url">4、window.location.port(设置或获取与 <span class="caps">URL</span> 关联的端口号码)<a class="headerlink" href="#4windowlocationport-url" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">var</span> <span class="nx">test</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">port</span><span class="p">;</span> </span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">test</span><span class="p">);</span> </span>
<span class="code-line"><span class="c1">//返回:空字符(如果采用默认的80端口(update:即使添加了:80),那么返回值并不是默认的80而是空字符)</span></span>
<span class="code-line"></code></pre></div>
<h2 id="5windowlocationpathname-url">5、window.location.pathname(设置或获取与 <span class="caps">URL</span> 的路径部分(就是文件地址))<a class="headerlink" href="#5windowlocationpathname-url" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">var</span> <span class="nx">test</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">pathname</span><span class="p">;</span> </span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">test</span><span class="p">);</span> </span>
<span class="code-line"><span class="c1">//返回:/EditPosts.aspx</span></span>
<span class="code-line"></code></pre></div>
<h2 id="6windowlocationsearch-href">6、window.location.search(设置或获取 href 属性中跟在问号后面的部分)<a class="headerlink" href="#6windowlocationsearch-href" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">var</span> <span class="nx">test</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">search</span><span class="p">;</span> </span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">test</span><span class="p">);</span> </span>
<span class="code-line"><span class="c1">//返回:?opt=1</span></span>
<span class="code-line"></code></pre></div>
<p><span class="caps">PS</span>:获得查询(参数)部分,除了给动态语言赋值以外,我们同样可以给静态页面,并使用 javascript 来获得相信应的参数值。</p>
<h2 id="7windowlocationhash-href">7、window.location.hash(设置或获取 href 属性中在井号“#”后面的分段)<a class="headerlink" href="#7windowlocationhash-href" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">var</span> <span class="nx">test</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">hash</span><span class="p">;</span> </span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">test</span><span class="p">);</span> </span>
<span class="code-line"><span class="c1">//返回:空字符(因为url中没有)</span></span>
<span class="code-line"></code></pre></div>
<h2 id="8jsurl">8、js获取url中的参数值<a class="headerlink" href="#8jsurl" title="Permanent link"> </a></h2>
<h3 id="_1">一、正则法<a class="headerlink" href="#_1" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">function</span> <span class="nx">getQueryString</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">reg</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s1">'(^|&)'</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="s1">'=([^&]*)(&|$)'</span><span class="p">,</span> <span class="s1">'i'</span><span class="p">);</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">r</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">search</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="nx">match</span><span class="p">(</span><span class="nx">reg</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="nx">r</span> <span class="o">!=</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="k">return</span> <span class="nx">unescape</span><span class="p">(</span><span class="nx">r</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="k">return</span> <span class="kc">null</span><span class="p">;</span></span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"><span class="c1">// 这样调用:</span></span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">GetQueryString</span><span class="p">(</span><span class="s2">"参数名1"</span><span class="p">));</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">GetQueryString</span><span class="p">(</span><span class="s2">"参数名2"</span><span class="p">));</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">GetQueryString</span><span class="p">(</span><span class="s2">"参数名3"</span><span class="p">));</span></span>
<span class="code-line"></code></pre></div>
<h3 id="split">二、split拆分法<a class="headerlink" href="#split" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">function</span> <span class="nx">GetRequest</span><span class="p">()</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">location</span><span class="p">.</span><span class="nx">search</span><span class="p">;</span> <span class="c1">//获取url中"?"符后的字串</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">theRequest</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Object</span><span class="p">();</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="nx">url</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="s2">"?"</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">str</span> <span class="o">=</span> <span class="nx">url</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span></span>
<span class="code-line"> <span class="nx">strs</span> <span class="o">=</span> <span class="nx">str</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s2">"&"</span><span class="p">);</span></span>
<span class="code-line"> <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">strs</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o">++</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="nx">theRequest</span><span class="p">[</span><span class="nx">strs</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">split</span><span class="p">(</span><span class="s2">"="</span><span class="p">)[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="nx">unescape</span><span class="p">(</span><span class="nx">strs</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">split</span><span class="p">(</span><span class="s2">"="</span><span class="p">)[</span><span class="mi">1</span><span class="p">]);</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="k">return</span> <span class="nx">theRequest</span><span class="p">;</span></span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"><span class="kd">var</span> <span class="nx">Request</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Object</span><span class="p">();</span></span>
<span class="code-line"><span class="nx">Request</span> <span class="o">=</span> <span class="nx">GetRequest</span><span class="p">();</span><span class="o"><</span><span class="nx">br</span><span class="o">></span><span class="c1">// var id=Request["id"]; </span></span>
<span class="code-line"><span class="c1">// var 参数1,参数2,参数3,参数N;</span></span>
<span class="code-line"><span class="c1">// 参数1 = Request['参数1'];</span></span>
<span class="code-line"><span class="c1">// 参数2 = Request['参数2'];</span></span>
<span class="code-line"><span class="c1">// 参数3 = Request['参数3'];</span></span>
<span class="code-line"><span class="c1">// 参数N = Request['参数N'];</span></span>
<span class="code-line"></code></pre></div>
<h3 id="_2">三、指定取<a class="headerlink" href="#_2" title="Permanent link"> </a></h3>
<p>比如说一个 url:http://i.cnblogs.com/?j=js ,我们想得到参数j的值,可以通过以下函数调用。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">function</span> <span class="nx">GetQueryString</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span> </span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">reg</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">RegExp</span><span class="p">(</span><span class="s2">"(^|&)"</span> <span class="o">+</span> <span class="nx">name</span> <span class="o">+</span> <span class="s2">"=([^&]*)(&|$)"</span><span class="p">,</span> <span class="s2">"i"</span><span class="p">);</span> </span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">r</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">location</span><span class="p">.</span><span class="nx">search</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="nx">match</span><span class="p">(</span><span class="nx">reg</span><span class="p">);</span> <span class="c1">//获取url中"?"符后的字符串并正则匹配</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="s2">""</span><span class="p">;</span> </span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="nx">r</span> <span class="o">!=</span> <span class="kc">null</span><span class="p">)</span> </span>
<span class="code-line"> <span class="nx">context</span> <span class="o">=</span> <span class="nx">r</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span> </span>
<span class="code-line"> <span class="nx">reg</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> </span>
<span class="code-line"> <span class="nx">r</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span> </span>
<span class="code-line"> <span class="k">return</span> <span class="nx">context</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">||</span> <span class="nx">context</span> <span class="o">==</span> <span class="s2">""</span> <span class="o">||</span> <span class="nx">context</span> <span class="o">==</span> <span class="s2">"undefined"</span> <span class="o">?</span> <span class="s2">""</span> <span class="o">:</span> <span class="nx">context</span><span class="p">;</span> </span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"><span class="nx">alert</span><span class="p">(</span><span class="nx">GetQueryString</span><span class="p">(</span><span class="s2">"j"</span><span class="p">));</span></span>
<span class="code-line"></code></pre></div>
<h3 id="_3">四、单个参数的获取方法<a class="headerlink" href="#_3" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">function</span> <span class="nx">GetRequest</span><span class="p">()</span> <span class="p">{</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">url</span> <span class="o">=</span> <span class="nx">location</span><span class="p">.</span><span class="nx">search</span><span class="p">;</span> <span class="c1">//获取url中"?"符后的字串</span></span>
<span class="code-line"> <span class="k">if</span> <span class="p">(</span><span class="nx">url</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="s2">"?"</span><span class="p">)</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="c1">//判断是否有参数</span></span>
<span class="code-line"> <span class="kd">var</span> <span class="nx">str</span> <span class="o">=</span> <span class="nx">url</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="c1">//从第一个字符开始 因为第0个是?号 获取所有除问号的所有符串</span></span>
<span class="code-line"> <span class="nx">strs</span> <span class="o">=</span> <span class="nx">str</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s2">"="</span><span class="p">);</span> <span class="c1">//用等号进行分隔 (因为知道只有一个参数 所以直接用等号进分隔 如果有多个参数 要用&号分隔 再用等号进行分隔)</span></span>
<span class="code-line"> <span class="nx">alert</span><span class="p">(</span><span class="nx">strs</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="c1">//直接弹出第一个参数 (如果有多个参数 还要进行循环的)</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"></code></pre></div>
<p>以上就是本文的全部内容,希望对大家理解如何获取当前页面 url 网址信息有所帮助。</p>
<p>-= <span class="caps">END</span> =-</p>LINUX 暂停、继续进程2019-05-09T16:01:00+08:002019-05-09T16:01:00+08:00doobomtag:doobom.me,2019-05-09:/linux-stop-cont-ps<p><span class="caps">LINUX</span> 如何暂停、继续进程</p><blockquote>
<p>原文: <a href="https://www.cnblogs.com/mfryf/archive/2012/09/24/2700042.html">https://www.cnblogs.com/mfryf/archive/2012/09/24/2700042.html</a></p>
</blockquote>
<p><code>kill -STOP 1234</code> 将该进程暂停。</p>
<p>如果要让它恢复到后台,用 <code>kill -CONT 1234</code> (很多在前台运行的程序这样是不行的)</p>
<p>如果要恢复到前台,请在当时运行该进程的那个终端用 <code>jobs</code> 命令查询暂停的进程。</p>
<p>然后用 <code>fg 〔job号〕</code> 把进程恢复到前台。</p>
<p>如果 <code>jobs</code> 只查询到一个进程,只用 <code>fg</code> 即可。</p>
<p>例:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>root@dWorks:~# bc -q</span>
<span class="code-line"><span class="o">[</span><span class="m">1</span><span class="o">]</span>+ Stopped bc -q</span>
<span class="code-line"></span>
<span class="code-line">root@dWorks:~# bc -q</span>
<span class="code-line"><span class="o">[</span><span class="m">2</span><span class="o">]</span>+ Stopped bc -q</span>
<span class="code-line"></span>
<span class="code-line">root@dWorks:~# <span class="nb">jobs</span></span>
<span class="code-line"><span class="o">[</span><span class="m">1</span><span class="o">]</span>- Stopped bc -q</span>
<span class="code-line"><span class="o">[</span><span class="m">2</span><span class="o">]</span>+ Stopped bc -q</span>
<span class="code-line"></span>
<span class="code-line">root@dWorks:~# <span class="nb">fg</span> <span class="m">2</span></span>
<span class="code-line">bc -q</span>
<span class="code-line"><span class="m">1</span>+1</span>
<span class="code-line"><span class="m">2</span></span>
<span class="code-line"></code></pre></div>
<p>A. Shell 支持作用控制,有以下命令:</p>
<ol>
<li>
<p><code>command&</code> 让进程在后台运行</p>
</li>
<li>
<p><code>jobs</code> 查看后台运行的进程</p>
</li>
<li>
<p><code>fg %n</code> 让后台运行的进程n到前台来</p>
</li>
<li>
<p><code>bg %n</code> 让进程 n 到后台去; </p>
</li>
</ol>
<p><span class="caps">PS</span>:”n”为 jobs 查看到的进程编号.</p>
<p>B.下列转:http://blog.chinaunix.net/u/1604/showart_1079559.html</p>
<p><code>fg</code>、<code>bg</code>、<code>jobs</code>、&、<code>ctrl + z</code> 都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的</p>
<p>一。 <code>&</code> 最经常被用到</p>
<p>这个用在一个命令的最后,可以把这个命令放到后台执行</p>
<p>二。<code>ctrl + z</code></p>
<p>可以将一个正在前台执行的命令放到后台,并且暂停</p>
<p>三。<code>jobs</code></p>
<p>查看当前有多少在后台运行的命令</p>
<p>四。<code>fg</code></p>
<p>将后台中的命令调至前台继续运行</p>
<p>如果后台中有多个命令,可以用 <code>fg %jobnumber</code> 将选中的命令调出,<code>%jobnumber</code> 是通过 <code>jobs</code> 命令查到的后台正在执行的命令的序号(不是pid)</p>
<p>五。<code>bg</code></p>
<p>将一个在后台暂停的命令,变成继续执行</p>
<p>如果后台中有多个命令,可以用 <code>bg %jobnumber</code> 将选中的命令调出,<code>%jobnumber</code> 是通过 <code>jobs</code> 命令查到的后台正在执行的命令的序号(不是pid)</p>
<h2 id="linuxshelljobs">Linux下使用Shell命令控制任务Jobs执行<a class="headerlink" href="#linuxshelljobs" title="Permanent link"> </a></h2>
<hr />
<p>下列命令可以用来操纵进程任务:</p>
<p><code>ps</code> 列出系统中正在运行的进程;</p>
<p><code>kill</code> 发送信号给一个或多个进程(经常用来杀死一个进程);</p>
<p><code>jobs</code> 列出当前 shell 环境中已启动的任务状态,若未指定 jobsid,则显示所有活动的任务状态信息;如果报告了一个任务的终止(即任务的状态被标记为 Terminated),shell 从当前的 shell 环境已知的列表中删除任务的进程标识;</p>
<p><code>bg</code> 将进程搬到后台运行(Background);</p>
<p><code>fg</code> 将进程搬到前台运行(Foreground);</p>
<p>将 job 转移到后台运行</p>
<p>如果你经常在X图形下工作,你可能有这样的经历:通过终端命令运行一个 <span class="caps">GUI</span> 程序,<span class="caps">GUI</span> 界面出来了,但是你的终端还停留在原地,你不能在 shell 中继续执行其他命令了,除非将 <span class="caps">GUI</span> 程序关掉。
为了使程序执行后终端还能继续接受命令,你可以将进程移到后台运行,使用如下命令运行程序: #假设要运行xmms</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nv">$xmms</span> <span class="p">&</span></span>
<span class="code-line"></code></pre></div>
<p>这样打开 xmms 后,终端的提示又回来了。现在 xmms 在后台运行着呢;但万一你运行程序时忘记使用 “&” 了,又不想重新执行;你可以先使用 <code>ctrl+z</code> 挂起程序,然后敲入 <code>bg</code> 命令,这样程序就在后台继续运行了。</p>
<h3 id="_1">概念:当前任务<a class="headerlink" href="#_1" title="Permanent link"> </a></h3>
<hr />
<p>如果后台的任务号有2个,[1],[2];如果当第一个后台任务顺利执行完毕,第二个后台任务还在执行中时,当前任务便会自动变成后台任务号码“[2]”的后台任务。所以可以得出一点,即当前任务是会变动的。当用户输入 <code>fg</code>、<code>bg</code> 和 <code>stop</code> 等命令时,如果不加任何引号,则所变动的均是当前任务。</p>
<h3 id="jobs">察看 jobs<a class="headerlink" href="#jobs" title="Permanent link"> </a></h3>
<hr />
<p>使用 <code>jobs</code> 或 <code>ps</code> 命令可以察看正在执行的 jobs。</p>
<p>jobs 命令执行的结果,<code>+</code> 表示是一个当前的作业,<code>-</code> 表是是一个当前作业之后的一个作业,<code>jobs -l</code> 选项可显示所有任务的 <span class="caps">PID</span>, jobs 的状态可以是 running, stopped, Terminated,但是如果任务被终止了(kill),shell 从当前的 shell 环境已知的列表中删除任务的进程标识;也就是说,jobs 命令显示的是当前shell环境中所起的后台正在运行或者被挂起的任务信息;</p>
<h3 id="_2">进程的挂起<a class="headerlink" href="#_2" title="Permanent link"> </a></h3>
<hr />
<h4 id="_3">后台进程的挂起:<a class="headerlink" href="#_3" title="Permanent link"> </a></h4>
<p>在 solaris 中通过 <code>stop</code> 命令执行,通过 <code>jobs</code> 命令查看 job 号(假设为 num),然后执行<code>stop %num</code>;</p>
<p>在 redhat 中,不存在 <code>stop</code> 命令,可通过执行命令 <code>kill -stop PID</code>,将进程挂起;</p>
<p>当要重新执行当前被挂起的任务时,通过 <code>bg %num</code> 即可将挂起的 job 的状态由 stopped 改为running,仍在后台执行;当需要改为在前台执行时,执行命令 <code>fg %num</code> 即可;</p>
<h4 id="_4">前台进程的挂起:<a class="headerlink" href="#_4" title="Permanent link"> </a></h4>
<p><code>ctrl+Z</code> 进程的终止</p>
<h4 id="_5">后台进程的终止:<a class="headerlink" href="#_5" title="Permanent link"> </a></h4>
<p>方法一:
通过 <code>jobs</code> 命令查看 job 号(假设为 num ),然后执行 <code>kill %num</code></p>
<p>方法二:
通过 <code>ps</code> 命令查看 job 的进程号(<span class="caps">PID</span>,假设为pid),然后执行 <code>kill pid</code></p>
<h4 id="_6">前台进程的终止:<a class="headerlink" href="#_6" title="Permanent link"> </a></h4>
<p><code>ctrl+c</code></p>
<p><strong>kill的其他作用</strong></p>
<p><code>kill</code> 除了可以终止进程,还能给进程发送其它信号,使用 <code>kill -l</code> 可以察看 <code>kill</code> 支持的信号。</p>
<p><span class="caps">SIGTERM</span> 是不带参数时 <code>kill</code> 发送的信号,意思是要进程终止运行,但执行与否还得看进程是否支持。如果进程还没有终止,可以使用 <code>kill -SIGKILL pid</code> ,这是由内核来终止进程,进程不能监听这个信号。</p>
<hr />
<p>Unix/Linux 下一般想让某个程序在后台运行,很多都是使用 <span class="amp">&</span> 在程序结尾来让程序自动运行。比如我们要运行mysql在后台:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>/usr/local/mysql/bin/mysqld_safe --user<span class="o">=</span>mysql <span class="p">&</span></span>
<span class="code-line"></code></pre></div>
<p>但是我们很多程序并不象 mysqld 一样可以做成守护进程,可能我们的程序只是普通程序而已,一般这种程序即使使用 <code>&</code> 结尾,如果终端关闭,那么程序也会被关闭。为了能够后台运行,我们需要使用<code>nohup</code> 这个命令,比如我们有个 <code>start.sh</code> 需要在后台运行,并且希望在后台能够一直运行,那么就使用 <code>nohup</code>:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>nohup /root/start.sh <span class="p">&</span></span>
<span class="code-line"></code></pre></div>
<p>在 shell 中回车后提示:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="o">[</span>~<span class="o">]</span>$ appending output to nohup.out</span>
<span class="code-line"></code></pre></div>
<p>原程序的的标准输出被自动改向到当前目录下的 <code>nohup.out</code> 文件,起到了 log 的作用。</p>
<p>但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看 <code>nohup.out</code> 可以看到在关闭终端瞬间服务自动关闭。</p>
<p>咨询红旗 Linux 工程师后,他也不得其解,在我的终端上执行后,他启动的进程竟然在关闭终端后依然运行。</p>
<p>在第二遍给我演示时,我才发现我和他操作终端时的一个细节不同:他是在当 shell 中提示了 <code>nohup</code> 成功后还需要按终端上键盘任意键退回到 shell 输入命令窗口,然后通过在 shell 中输入 <code>exit</code> 来退出终端;而我是每次在 <code>nohup</code> 执行成功后直接点关闭程序按钮关闭终端.。所以这时候会断掉该命令所对应的 session,导致 <code>nohup</code> 对应的进程被通知需要一起 shutdown。</p>
<p>这个细节有人和我一样没注意到,所以在这儿记录一下了。</p>
<h2 id="nohup">附:nohup命令参考<a class="headerlink" href="#nohup" title="Permanent link"> </a></h2>
<hr />
<p>nohup 命令</p>
<p>用途:不挂断地运行命令。</p>
<p>语法:<code>nohup Command [ Arg ... ] [ & ]</code></p>
<p>描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(<span class="caps">SIGHUP</span>)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 <span class="amp">&</span> (表示”and”的符号)到命令的尾部。</p>
<p>无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 <code>nohup.out</code> 文件中。如果当前目录的 <code>nohup.out</code> 文件不可写,输出重定向到 <code>$HOME/nohup.out</code> 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。</p>
<p>退出状态:该命令返回下列出口值:</p>
<p>126 可以查找但不能调用 Command 参数指定的命令。</p>
<p>127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。</p>
<p>否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。</p>
<p>nohup命令及其输出文件</p>
<p>nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。</p>
<p>该命令的一般形式为:<code>nohup command &</code></p>
<p>使用nohup命令提交作业</p>
<p>如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为 <code>nohup.out</code> 的文件中,除非另外指定了输出文件:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>nohup <span class="nb">command</span> > myout.file <span class="m">2</span>><span class="p">&</span><span class="m">1</span> <span class="p">&</span></span>
<span class="code-line"></code></pre></div>
<p>在上面的例子中,输出被重定向到 <code>myout.file</code> 文件中。</p>
<p>使用 jobs 查看任务。</p>
<p>使用 <code>fg %n</code> 关闭。</p>
<p>另外有两个常用的 ftp 工具 <code>ncftpget</code> 和 <code>ncftpput</code>,可以实现后台的 ftp 上传和下载,这样就可以利用这些命令在后台上传和下载文件了。</p>
<p>简单而有用的 <code>nohup</code> 命令在 <span class="caps">UNIX</span>/<span class="caps">LINUX</span> 中,普通进程用&符号放到后台运行,如果启动该程序的控制台 logout,则该进程随即终止。</p>
<p>要实现守护进程,一种方法是按守护进程的规则去编程(本站有文章介绍过),比较麻烦;另一种方法是仍然用普通方法编程,然后用nohup命令启动程序:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>nohup<程序名><span class="p">&</span></span>
<span class="code-line"></code></pre></div>
<p>则控制台logout后,进程仍然继续运行,起到守护进程的作用(虽然它不是严格意义上的守护进程)。</p>
<p>使用nohup命令后,原程序的的标准输出被自动改向到当前目录下的 <code>nohup.out</code> 文件,起到了 log 的作用,实现了完整的守护进程功能。</p>
<blockquote>
<p><strong>ygwu @ 2005年04月18日 上午10:03</strong></p>
<p>For example:</p>
<p>如何远程启动 WebLogic 服务?</p>
<p>用 telnet 远程控制服务器,远程启动 <span class="caps">WEBLOGIC</span> 服务,启动后关闭 telnet,WebLogic 服务也跟着停止,这是因为使用 telnet 启动的进程会随着 telnet 进程的关闭而关闭。所以我们可以使用一些 <span class="caps">UNIX</span> 下的命令来做到不关闭。</p>
<p>使用如下命令:</p>
<p><code>nohup startWeblogic.sh&</code></p>
<p>如果想要监控标准输出可以使用:</p>
<p><code>tail -f nohup.out</code></p>
<p>当在后台运行了程序的时候,可以用 <code>jobs</code> 命令来查看后台作业的状态。在有多个后台程序时,要使用来参数的 <code>fg</code> 命令将不同序号的后台作业切换到前台上运行。</p>
<p>当用户启动一个进程的时候,这个进程是运行在前台,使用与相应控制终端相联系的标准输入、输出进行输入和输出。即使将进程的输入输出重定向,并将进程放在后台执行,进程仍然和当前终端设备有关系。正因为如此,在当前的登录会话结束时,控制终端设备将和登录进程相脱离,那么系统就向所有与这个终端相联系的进程发送 <span class="caps">SIGHUP</span> 的信号,通知进程线路已经挂起了,如果程序没有接管这个信号的处理,那么缺省的反应是进程结束。因此普通的程序并不能真正脱离登录会话而运行进程,为了使得在系统登录后还可以正常执行,只有使用命令 <code>nohup</code> 来启动相应程序。</p>
<p>使用命令 <code>nohup</code> 当然可以启动这样的程序,但 <code>nohup</code> 启动的程序在进程执行完毕就退出,而常见的一些服务进程通常永久的运行在后台,不向屏幕输出结果。在 Unix 中这些永久的后台进程称为守护进程(daemon)。守护进程通常从系统启动时自动开始执行,系统关闭时才停止。</p>
</blockquote>
<p>-=- <span class="caps">END</span> -=-</p>Telnet 中使用 smtp 发送邮件2019-04-15T16:01:00+08:002019-04-15T16:01:00+08:00doobomtag:doobom.me,2019-04-15:/send-mail-via-smtp-in-telnet<p>Telnet 中使用 smtp 发送邮件</p><blockquote>
<p>原文作者:litreily</p>
<p>原文链接:<a href="https://www.litreily.top/2017/08/17/telnet-smtp/">https://www.litreily.top/2017/08/17/telnet-smtp/</a></p>
<p>这两天在折腾 javascript 发送邮件的事情, 然后就看到了这个.</p>
</blockquote>
<p>Telnet是远程登录服务的标准协议和主要方式,工作于TCP/IP协议族的应用层,常用于远程登录web服务器,其中便包括SMTP,POP3等邮件服务器。</p>
<p>这几天参考书籍《计算机网络-自顶向下方法》学习计算机网络知识,顺便尝试了如何使用Telnet登录smtp发送邮件,下面通过一个简单示例介绍具体的发送过程。</p>
<h2 id="telnet-smtp163com-25">Telnet smtp.163.com 25<a class="headerlink" href="#telnet-smtp163com-25" title="Permanent link"> </a></h2>
<p>smtp对应的端口号为25,以163邮箱为例,下面是邮件发送过程。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>→ ~ telnet smtp.163.com <span class="m">25</span></span>
<span class="code-line">Trying <span class="m">220</span>.181.12.15...</span>
<span class="code-line">Connected to smtp.163.com.</span>
<span class="code-line">Escape character is ^<span class="o">]</span>.</span>
<span class="code-line"><span class="m">220</span> <span class="m">163</span>.com Anti-spam GT <span class="k">for</span> Coremail System <span class="o">(</span>163com<span class="o">[</span><span class="m">20141201</span><span class="o">])</span></span>
<span class="code-line">helo <span class="m">163</span>.com</span>
<span class="code-line"><span class="m">250</span> OK</span>
<span class="code-line">auth login</span>
<span class="code-line"><span class="m">334</span> dXNlcm5hbWU6</span>
<span class="code-line"><span class="nv">MTgyNjY2MzI4NzJAMTYzLmNvbQ</span><span class="o">==</span></span>
<span class="code-line"><span class="m">334</span> UGFzc3dvcmQ6</span>
<span class="code-line">****************</span>
<span class="code-line"><span class="m">235</span> Authentication successful</span>
<span class="code-line">mail from:<<span class="m">182</span>****2872@163.com></span>
<span class="code-line"><span class="m">250</span> Mail OK</span>
<span class="code-line">rcpt to:<<span class="m">707</span>***098@qq.com></span>
<span class="code-line"><span class="m">250</span> Mail OK</span>
<span class="code-line">data</span>
<span class="code-line"><span class="m">354</span> End data with <CR><LF>.<CR><LF></span>
<span class="code-line">From: <span class="m">182</span>****2872@163.com</span>
<span class="code-line">To: <span class="m">707</span>***098@qq.com</span>
<span class="code-line">Subject: Test the use of smtp</span>
<span class="code-line"></span>
<span class="code-line"> Hello, litreily. </span>
<span class="code-line"> This is a message edit with telnet.</span>
<span class="code-line"></span>
<span class="code-line">Best wish to you.</span>
<span class="code-line">Litreily</span>
<span class="code-line">.</span>
<span class="code-line"><span class="m">250</span> Mail OK queued as smtp11,D8CowAAnjlqKlZVZXa4QAQ--.18342S2 <span class="m">1502975693</span></span>
<span class="code-line">quit</span>
<span class="code-line">Connection closed by foreign host.</span>
<span class="code-line">→ ~</span>
<span class="code-line"></code></pre></div>
<p>下面分开对每个过程进行解析,C代表客户端,即本机,S代表远程服务器端。整个过程分为以下几步:
* 打招呼
* 账户认证
* 声明邮箱地址
* 书写邮件内容
* 退出Telnet</p>
<h3 id="_1">招呼语<a class="headerlink" href="#_1" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code>S <span class="m">220</span> <span class="m">163</span>.com Anti-spam GT <span class="k">for</span> Coremail System <span class="o">(</span>163com<span class="o">[</span><span class="m">20141201</span><span class="o">])</span></span>
<span class="code-line">C helo <span class="m">163</span>.com</span>
<span class="code-line">S <span class="m">250</span> OK</span>
<span class="code-line"></code></pre></div>
<p><code>220</code>代表服务器已准备好,客户端首先向服务器打一声招呼<code>helo</code>,服务器接收到后返回一个<code>250</code>应答信号,代表打招呼成功,下面可以进行账户的密码认证。</p>
<h3 id="_2">账户认证<a class="headerlink" href="#_2" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code>C auth login</span>
<span class="code-line">S <span class="m">334</span> dXNlcm5hbWU6</span>
<span class="code-line">C <span class="nv">MTgyNjY2MzI4NzJAMTYzLmNvbQ</span><span class="o">==</span></span>
<span class="code-line">S <span class="m">334</span> UGFzc3dvcmQ6</span>
<span class="code-line">C ****************</span>
<span class="code-line">S <span class="m">235</span> Authentication successful</span>
<span class="code-line"></code></pre></div>
<p>客户端发送<code>auth login</code>声明自己将进行邮箱账户的用户名认证和密码认证。服务器端返回一个以<code>334</code>代码开头的提示信息,不必追究其语义,而后用户依次输入通过Base64加密的邮箱名和密码,加密网址见后续参考资料。当输入的账号密码无误时,服务端将返回认证成功的提示语。</p>
<h3 id="_3">声明邮箱地址<a class="headerlink" href="#_3" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code>C mail from:<<span class="m">182</span>****2872@163.com></span>
<span class="code-line">S <span class="m">250</span> Mail OK</span>
<span class="code-line">C rcpt to:<<span class="m">707</span>***098@qq.com></span>
<span class="code-line">S <span class="m">250</span> Mail OK</span>
<span class="code-line"></code></pre></div>
<p>账户密码认证结束后,客户端通过<code>mail from:<emailName></code>以及<code>rcpt to:<nameEmail></code>声明邮箱的源地址和目的地址。</p>
<h3 id="_4">书写邮件内容<a class="headerlink" href="#_4" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code>C data</span>
<span class="code-line">S <span class="m">354</span> End data with <CR><LF>.<CR><LF></span>
<span class="code-line">C From: <span class="m">182</span>****2872@163.com</span>
<span class="code-line">C To: <span class="m">707</span>***098@qq.com</span>
<span class="code-line">C Subject: Test the use of smtp</span>
<span class="code-line">C </span>
<span class="code-line">C Hello, litreily. </span>
<span class="code-line">C This is a message edit with telnet.</span>
<span class="code-line">C </span>
<span class="code-line">C Best wish to you.</span>
<span class="code-line">C Litreily</span>
<span class="code-line">C .</span>
<span class="code-line">S <span class="m">250</span> Mail OK queued as smtp11,D8CowAAnjlqKlZVZXa4QAQ--.18342S2 <span class="m">1502975693</span></span>
<span class="code-line"></code></pre></div>
<p>写明邮件地址后,使用指令<code>data</code>进入邮件编辑状态,服务器端会提示当输入<code><CR><LF>.<CR><LF></code>时退出编辑状态。</p>
<p>邮件内容有一定的格式要求,不按要求随意书写有可能被当成垃圾邮件或不合法邮件而退信。通常需要指定邮件主题 <strong>Subject</strong>,其它相关信息包括时间 <strong>Date</strong>,邮件地址 <strong>From</strong>,<strong>To</strong> 等,然后再书写邮件主体内容,更详细的格式可以参考文档【<span class="caps">RFC</span> 821】。编辑结束后,以单行的点号<code>.</code>结束。如果一切正常,服务器端将返回以<code>250</code>开头的应答信息,并提示邮件以进入smtp的发送队列。此时便可以查收邮件予以验证了。</p>
<h3 id="telnet">退出Telnet<a class="headerlink" href="#telnet" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code>C quit</span>
<span class="code-line">S Connection closed by foreign host.</span>
<span class="code-line"></code></pre></div>
<p>当邮件发送结束后,客户端通过<code>quit</code>退出Telnet。</p>
<h2 id="smtp-code"><span class="caps">SMTP</span> Code<a class="headerlink" href="#smtp-code" title="Permanent link"> </a></h2>
<ul>
<li>211 系统状态或系统帮助响应</li>
<li>214 帮助信息</li>
<li>220 服务就绪</li>
<li>221 服务关闭传输信道</li>
<li>235 用户验证成功</li>
<li>250 要求的邮件操作完成</li>
<li>251 用户非本地,将转发向</li>
<li>334 等待用户输入验证信息</li>
<li>354 开始邮件输入,以单行.结束</li>
<li>421 服务未就绪,关闭传输信道(当必须关闭时,此应答可以作为对任何命令的响应)</li>
<li>450 要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)</li>
<li>451 放弃要求的操作;处理过程中出错</li>
<li>452 系统存储不足,要求的操作未执行</li>
<li>500 格式错误,命令不可识别(此错误也包括命令行过长)</li>
<li>501 参数格式错误</li>
<li>502 命令不可实现</li>
<li>503 错误的命令序列</li>
<li>504 命令参数不可实现</li>
<li>535 用户验证失败</li>
<li>550 要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)</li>
<li>551 用户非本地,请尝试</li>
<li>552 过量的存储分配,要求的操作未执行</li>
<li>553 邮箱名不可用,要求的操作未执行(例如邮箱格式错误)</li>
<li>554 操作失败</li>
</ul>
<h2 id="_5">参考资料<a class="headerlink" href="#_5" title="Permanent link"> </a></h2>
<blockquote>
<p>SMTP文档(<span class="caps">RFC</span> 821) : <a href="https://tools.ietf.org/pdf/rfc821.pdf">https://tools.ietf.org/pdf/rfc821.pdf</a></p>
<p><span class="caps">SMTP</span> Code : <a href="http://bbs.csdn.net/topics/80275246">http://bbs.csdn.net/topics/80275246</a></p>
<p>163.com 邮件退信代码 : <a href="http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html">http://help.163.com/09/1224/17/<span class="caps">5RAJ4LMH00753VB8</span>.html</a></p>
</blockquote>JS 数字指定长度不足前补零的实现2019-04-15T16:01:00+08:002019-04-15T16:01:00+08:00doobomtag:doobom.me,2019-04-15:/string-number-to-define-length<p><span class="caps">JS</span> 数字指定长度不足前补零的实现</p><blockquote>
<p>原文: <a href="https://wsj123.iteye.com/blog/2412696">https://wsj123.iteye.com/blog/2412696</a></p>
</blockquote>
<h3 id="_1">问题描述:<a class="headerlink" href="#_1" title="Permanent link"> </a></h3>
<p>要求输出的数字长度是固定的,如长度为2,数字为1,则输出01,即不够位数就在之前补足0。 </p>
<h3 id="_2">解决方法:<a class="headerlink" href="#_2" title="Permanent link"> </a></h3>
<h4 id="1">方法1<a class="headerlink" href="#1" title="Permanent link"> </a></h4>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">function</span> <span class="nx">fn1</span><span class="p">(</span><span class="nx">num</span><span class="p">,</span> <span class="nx">length</span><span class="p">)</span> <span class="p">{</span> </span>
<span class="code-line"> <span class="k">return</span> <span class="p">(</span><span class="nx">num</span><span class="o">/</span><span class="nb">Math</span><span class="p">.</span><span class="nx">pow</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="nx">length</span><span class="p">)).</span><span class="nx">toFixed</span><span class="p">(</span><span class="nx">length</span><span class="p">).</span><span class="nx">substr</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span> </span>
<span class="code-line"><span class="p">}</span> </span>
<span class="code-line"></code></pre></div>
<h4 id="2">方法2<a class="headerlink" href="#2" title="Permanent link"> </a></h4>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">function</span> <span class="nx">fn2</span><span class="p">(</span><span class="nx">num</span><span class="p">,</span> <span class="nx">length</span><span class="p">)</span> <span class="p">{</span> </span>
<span class="code-line"> <span class="k">return</span> <span class="p">(</span> <span class="s2">"0000000000000000"</span> <span class="o">+</span> <span class="nx">num</span> <span class="p">).</span><span class="nx">substr</span><span class="p">(</span> <span class="o">-</span><span class="nx">length</span> <span class="p">);</span> </span>
<span class="code-line"><span class="p">}</span> </span>
<span class="code-line"></code></pre></div>
<h4 id="3">方法3<a class="headerlink" href="#3" title="Permanent link"> </a></h4>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="kd">function</span> <span class="nx">fn3</span><span class="p">(</span><span class="nx">num</span><span class="p">,</span> <span class="nx">length</span><span class="p">)</span> <span class="p">{</span> </span>
<span class="code-line"> <span class="k">return</span> <span class="p">(</span><span class="nb">Array</span><span class="p">(</span><span class="nx">length</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">'0'</span><span class="p">)</span> <span class="o">+</span> <span class="nx">num</span><span class="p">).</span><span class="nx">slice</span><span class="p">(</span><span class="o">-</span><span class="nx">length</span><span class="p">);</span> </span>
<span class="code-line"><span class="p">}</span> </span>
<span class="code-line"></code></pre></div>
<h3 id="_3">上述三种方法的效率如下:<a class="headerlink" href="#_3" title="Permanent link"> </a></h3>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nx">console</span><span class="p">.</span><span class="nx">time</span><span class="p">(</span><span class="s1">'time1'</span><span class="p">);</span> </span>
<span class="code-line"><span class="nx">fn1</span><span class="p">();</span> </span>
<span class="code-line"><span class="nx">console</span><span class="p">.</span><span class="nx">timeEnd</span><span class="p">(</span><span class="s1">'time1'</span><span class="p">);</span><span class="c1">//chrome返回值:time1: 0.126953125ms </span></span>
<span class="code-line"></code></pre></div>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nx">console</span><span class="p">.</span><span class="nx">time</span><span class="p">(</span><span class="s1">'time2'</span><span class="p">);</span> </span>
<span class="code-line"><span class="nx">fn2</span><span class="p">();</span> </span>
<span class="code-line"><span class="nx">console</span><span class="p">.</span><span class="nx">timeEnd</span><span class="p">(</span><span class="s1">'time2'</span><span class="p">);</span> <span class="c1">//chrome返回值:time2: 0.0810546875ms </span></span>
<span class="code-line"></code></pre></div>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nx">console</span><span class="p">.</span><span class="nx">time</span><span class="p">(</span><span class="s1">'3'</span><span class="p">);</span> </span>
<span class="code-line"><span class="nx">fn3</span><span class="p">();</span> </span>
<span class="code-line"><span class="nx">console</span><span class="p">.</span><span class="nx">timeEnd</span><span class="p">(</span><span class="s1">'time3'</span><span class="p">);</span> <span class="c1">//chrome返回值:time3: 0ms </span></span>
<span class="code-line"></code></pre></div>
<p>-=- <span class="caps">END</span> -=-</p>JavaScript 字符串/数字左补位,右补位,取固定长度,截位扩展函数代码2019-04-15T16:01:00+08:002019-04-15T16:01:00+08:00doobomtag:doobom.me,2019-04-15:/string-number-to-define-length-foo<p>JavaScript 字符串/数字左补位,右补位,取固定长度,截位扩展函数代码</p><blockquote>
<p>原文: <a href="https://www.jb51.net/article/109523.htm">https://www.jb51.net/article/109523.htm</a></p>
</blockquote>
<p>有时候我们的日期等不足两位的补一个0等,都可以使用这个。</p>
<p>这个大家应该都很明白了,就不废话了,代码如下:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">String</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">padLeft</span> <span class="o">=</span></span>
<span class="code-line"><span class="nb">Number</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">padLeft</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">total</span><span class="p">,</span> <span class="nx">pad</span><span class="p">)</span> <span class="p">{</span></span>
<span class="code-line"> <span class="k">return</span> <span class="p">(</span><span class="nb">Array</span><span class="p">(</span><span class="nx">total</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="nx">pad</span> <span class="o">||</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="k">this</span><span class="p">).</span><span class="nx">slice</span><span class="p">(</span><span class="o">-</span><span class="nx">total</span><span class="p">);</span></span>
<span class="code-line"><span class="p">}</span></span>
<span class="code-line"></code></pre></div>
<p>测试代码:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1">//补位</span></span>
<span class="code-line"><span class="s2">"X"</span><span class="p">.</span><span class="nx">padLeft</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="s2">"Y"</span><span class="p">);</span> <span class="c1">//返回:YYYYX</span></span>
<span class="code-line"><span class="p">(</span><span class="mi">50</span><span class="p">).</span><span class="nx">padLeft</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span> <span class="c1">//返回:00050</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span></span>
<span class="code-line"><span class="nx">x</span><span class="p">.</span><span class="nx">padLeft</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span> <span class="c1">//返回:01</span></span>
<span class="code-line"></span>
<span class="code-line"><span class="c1">//截位</span></span>
<span class="code-line"><span class="p">(</span><span class="mi">123</span><span class="p">).</span><span class="nx">padLeft</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span> <span class="c1">//返回:23</span></span>
<span class="code-line"></code></pre></div>
<p>更多代码</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="cm">/**</span></span>
<span class="code-line"><span class="cm"> * 取子字符串</span></span>
<span class="code-line"><span class="cm"> * @param oriStr 原字符串</span></span>
<span class="code-line"><span class="cm"> * @param beginIndex 取子串的起始位置</span></span>
<span class="code-line"><span class="cm"> * @param len 取子串的长度</span></span>
<span class="code-line"><span class="cm"> * @return 子字符串</span></span>
<span class="code-line"><span class="cm"> */</span></span>
<span class="code-line"> <span class="kr">public</span> <span class="nb">String</span> <span class="nx">subString</span><span class="p">(</span><span class="nb">String</span> <span class="nx">oriStr</span><span class="p">,</span><span class="kr">int</span> <span class="nx">beginIndex</span><span class="p">,</span><span class="kr">int</span> <span class="nx">len</span><span class="p">){</span></span>
<span class="code-line"> <span class="kr">int</span> <span class="nx">strlen</span> <span class="o">=</span> <span class="nx">oriStr</span><span class="p">.</span><span class="nx">length</span><span class="p">();</span></span>
<span class="code-line"> <span class="nx">beginIndex</span> <span class="o">=</span> <span class="nx">beginIndex</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span></span>
<span class="code-line"> <span class="k">if</span><span class="p">(</span><span class="nx">strlen</span> <span class="o"><=</span> <span class="nx">beginIndex</span><span class="p">){</span></span>
<span class="code-line"> <span class="nx">System</span><span class="p">.</span><span class="nx">out</span><span class="p">.</span><span class="nx">println</span><span class="p">(</span><span class="s2">"out of "</span> <span class="o">+</span> <span class="nx">oriStr</span> <span class="o">+</span> <span class="s2">"'s length, please recheck!"</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span><span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="nx">strlen</span> <span class="o"><=</span> <span class="nx">beginIndex</span><span class="o">+</span><span class="nx">len</span><span class="p">){</span></span>
<span class="code-line"> <span class="nx">str</span> <span class="o">=</span> <span class="nx">oriStr</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="nx">beginIndex</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span><span class="k">else</span><span class="p">{</span></span>
<span class="code-line"> <span class="nx">str</span> <span class="o">=</span> <span class="nx">oriStr</span><span class="p">.</span><span class="nx">substring</span><span class="p">(</span><span class="nx">beginIndex</span><span class="p">,</span> <span class="nx">beginIndex</span><span class="o">+</span><span class="nx">len</span><span class="p">);</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="k">return</span> <span class="nx">str</span><span class="p">;</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="cm">/**</span></span>
<span class="code-line"><span class="cm"> * 右补位,左对齐</span></span>
<span class="code-line"><span class="cm"> * @param oriStr 原字符串</span></span>
<span class="code-line"><span class="cm"> * @param len 目标字符串长度</span></span>
<span class="code-line"><span class="cm"> * @param alexin 补位字符</span></span>
<span class="code-line"><span class="cm"> * @return 目标字符串</span></span>
<span class="code-line"><span class="cm"> */</span></span>
<span class="code-line"> <span class="kr">public</span> <span class="nb">String</span> <span class="nx">padRight</span><span class="p">(</span><span class="nb">String</span> <span class="nx">oriStr</span><span class="p">,</span><span class="kr">int</span> <span class="nx">len</span><span class="p">,</span><span class="kr">char</span> <span class="nx">alexin</span><span class="p">){</span></span>
<span class="code-line"> <span class="kr">int</span> <span class="nx">strlen</span> <span class="o">=</span> <span class="nx">oriStr</span><span class="p">.</span><span class="nx">length</span><span class="p">();</span></span>
<span class="code-line"> <span class="k">if</span><span class="p">(</span><span class="nx">strlen</span> <span class="o"><</span> <span class="nx">len</span><span class="p">){</span></span>
<span class="code-line"> <span class="k">for</span><span class="p">(</span><span class="kr">int</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="o"><</span><span class="nx">len</span><span class="o">-</span><span class="nx">strlen</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">){</span></span>
<span class="code-line"> <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span><span class="o">+</span><span class="nx">alexin</span><span class="p">;</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span> <span class="o">+</span> <span class="nx">oriStr</span><span class="p">;</span></span>
<span class="code-line"> <span class="k">return</span> <span class="nx">str</span><span class="p">;</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"></span>
<span class="code-line"> <span class="cm">/**</span></span>
<span class="code-line"><span class="cm"> * 左补位,右对齐</span></span>
<span class="code-line"><span class="cm"> * @param oriStr 原字符串</span></span>
<span class="code-line"><span class="cm"> * @param len 目标字符串长度</span></span>
<span class="code-line"><span class="cm"> * @param alexin 补位字符</span></span>
<span class="code-line"><span class="cm"> * @return 目标字符串</span></span>
<span class="code-line"><span class="cm"> */</span></span>
<span class="code-line"> <span class="kr">public</span> <span class="nb">String</span> <span class="nx">padLeft</span><span class="p">(</span><span class="nb">String</span> <span class="nx">oriStr</span><span class="p">,</span><span class="kr">int</span> <span class="nx">len</span><span class="p">,</span><span class="kr">char</span> <span class="nx">alexin</span><span class="p">){</span></span>
<span class="code-line"> <span class="kr">int</span> <span class="nx">strlen</span> <span class="o">=</span> <span class="nx">oriStr</span><span class="p">.</span><span class="nx">length</span><span class="p">();</span></span>
<span class="code-line"> <span class="k">if</span><span class="p">(</span><span class="nx">strlen</span> <span class="o"><</span> <span class="nx">len</span><span class="p">){</span></span>
<span class="code-line"> <span class="k">for</span><span class="p">(</span><span class="kr">int</span> <span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="nx">i</span><span class="o"><</span><span class="nx">len</span><span class="o">-</span><span class="nx">strlen</span><span class="p">;</span><span class="nx">i</span><span class="o">++</span><span class="p">){</span></span>
<span class="code-line"> <span class="nx">str</span> <span class="o">=</span> <span class="nx">str</span><span class="o">+</span><span class="nx">alexin</span><span class="p">;</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"> <span class="nx">str</span> <span class="o">=</span> <span class="nx">oriStr</span> <span class="o">+</span> <span class="nx">str</span><span class="p">;</span></span>
<span class="code-line"> <span class="k">return</span> <span class="nx">str</span><span class="p">;</span></span>
<span class="code-line"> <span class="p">}</span></span>
<span class="code-line"></code></pre></div>
<p>-=- <span class="caps">END</span> -=-</p>.gitignore 设置 git 忽略跟踪文件和文件夹2019-02-13T19:01:00+08:002019-02-13T19:01:00+08:00doobomtag:doobom.me,2019-02-13:/git-set-gitignore<p>.gitignore 设置 git 忽略跟踪文件和文件夹</p><p><strong>在项目的根目录(跟 <code>.git</code> 文件夹所在目录同层)建立 <code>.gitignore</code> 文件,在里面声明即可。 </strong></p>
<h3 id="_1">配置语法<a class="headerlink" href="#_1" title="Permanent link"> </a></h3>
<ol>
<li>以斜杠“/”开头表示目录;</li>
<li>以星号“*”通配多个字符;</li>
<li>以问号“?”通配单个字符</li>
<li>以方括号“[]”包含单个字符的匹配列表;</li>
<li>以叹号“!”表示不忽略(跟踪)匹配到的文件或目录。</li>
</ol>
<blockquote>
<p>git 对于 <code>.gitignore</code> 配置文件是按行从上到下进行规则匹配的</p>
<p>如果之前文件已提交过,则需要先清除原文件: <code>git rm *.dll</code> 这样. </p>
</blockquote>
<h3 id="_2">另一种方法<a class="headerlink" href="#_2" title="Permanent link"> </a></h3>
<p>修改git的全局设置,把忽略名单用于所有项目:
首先,建立一个<code>.gitignore_global</code>文件; </p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err">git config --global core.excludesfile .gitignore_global </span></span>
<span class="code-line"></code></pre></div>
<h3 id="_3">栗子<a class="headerlink" href="#_3" title="Permanent link"> </a></h3>
<p>Github 给出的 Android 开发中使用的<code>.gitignore</code>模板</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c1"># Built application files</span></span>
<span class="code-line"><span class="err">*</span><span class="na">.apk</span></span>
<span class="code-line"><span class="err">*</span><span class="na">.ap_</span></span>
<span class="code-line"><span class="c1"># Files for the Dalvik VM</span></span>
<span class="code-line"><span class="err">*</span><span class="na">.dex</span></span>
<span class="code-line"><span class="c1"># Java class files</span></span>
<span class="code-line"><span class="err">*</span><span class="na">.class</span></span>
<span class="code-line"><span class="c1"># Generated files</span></span>
<span class="code-line"><span class="nf">bin</span><span class="err">/</span></span>
<span class="code-line"><span class="nf">gen</span><span class="err">/</span></span>
<span class="code-line"><span class="nf">out</span><span class="err">/</span></span>
<span class="code-line"><span class="c1"># Gradle files</span></span>
<span class="code-line"><span class="na">.gradle</span><span class="err">/</span></span>
<span class="code-line"><span class="nf">build</span><span class="err">/</span></span>
<span class="code-line"><span class="c1"># Local configuration file (sdk path, etc)</span></span>
<span class="code-line"><span class="nf">local.properties</span></span>
<span class="code-line"><span class="c1"># Proguard folder generated by Eclipse</span></span>
<span class="code-line"><span class="nf">proguard</span><span class="err">/</span></span>
<span class="code-line"><span class="c1"># Log Files</span></span>
<span class="code-line"><span class="err">*</span><span class="na">.log</span></span>
<span class="code-line"><span class="c1"># Android Studio Navigation editor temp files</span></span>
<span class="code-line"><span class="na">.navigation</span><span class="err">/</span></span>
<span class="code-line"><span class="c1"># Android Studio captures folder</span></span>
<span class="code-line"><span class="nf">captures</span><span class="err">/</span></span>
<span class="code-line"><span class="c1"># Intellij</span></span>
<span class="code-line"><span class="err">*</span><span class="na">.iml</span></span>
<span class="code-line"><span class="c1"># Keystore files</span></span>
<span class="code-line"><span class="err">*</span><span class="na">.jks</span></span>
<span class="code-line"></code></pre></div>
<h3 id="_4">参考<a class="headerlink" href="#_4" title="Permanent link"> </a></h3>
<blockquote>
<p><a href="https://github.com/github/gitignore/blob/master/Android.gitignore">https://github.com/github/gitignore/blob/master/Android.gitignore</a></p>
<p><a href="https://git-scm.com/docs/gitignore">https://git-scm.com/docs/gitignore</a></p>
<p><a href="https://www.jianshu.com/p/ea6341224e89">https://www.jianshu.com/p/ea6341224e89</a></p>
<p><a href="https://blog.csdn.net/u011475134/article/details/71521725">https://blog.csdn.net/u011475134/article/details/71521725</a></p>
</blockquote>
<p>-= 完 =-</p>Vim 多文件编辑:缓冲区2019-02-08T23:01:00+08:002019-02-08T23:01:00+08:00doobomtag:doobom.me,2019-02-08:/use-buffer-edit-multi-files-in-vim<p>Vim 多文件编辑:缓冲区.</p><blockquote>
<p>原文链接: <a href="https://harttle.land/2015/11/17/vim-buffer.html">https://harttle.land/2015/11/17/vim-buffer.html</a></p>
</blockquote>
<p>本文介绍Vim下 <strong>缓冲区(Buffer)</strong> 的使用.</p>
<p>引用Vim官方解释,<strong>缓冲区</strong> 是一个文件的内容占用的那部分Vim内存:</p>
<blockquote>
<p>A buffer is an area of Vim’s memory used to hold text read from a file. In addition, an empty buffer with no associated file can be created to allow the entry of text. –vim.wikia</p>
</blockquote>
<p>先来回顾一下Tab,Window,Buffer的关系吧!</p>
<p><img alt="tabs-windows-buffers" src="/images/tabs-windows-buffers.png" /></p>
<p>基于缓冲区的多文件编辑是Vim最为推荐的做法,Vim维护着你在当前打开的这些Buffer里的所有跳转, <code>Ctrl+o</code>和<code>Ctrl+i</code>可以遍历这些光标位置(参考:<a href="https://harttle.land/2015/11/07/vim-cursor.html">在Vim中进行快速光标移动</a>)。 但一个窗口内只有一个Buffer是处于可见状态的,所以Buffer的用法最不直观。</p>
<p>学习Vim就要克服那些不直观的操作!因为Vim本身就是基于CLI的,而我们相信CLI就是效率。本文便来总结一下Buffer相关的命令与操作。</p>
<h3 id="_1">打开与关闭<a class="headerlink" href="#_1" title="Permanent link"> </a></h3>
<hr />
<p>不带任何参数打开多个文件便可以把它们都放入缓冲区(Buffer):</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="k">vim</span> <span class="k">a</span>.txt <span class="k">b</span>.txt</span>
<span class="code-line"></code></pre></div>
<blockquote>
<p>当你使用<code>:q</code>关闭文件时?是否看到过<code>1 more file to edit</code>的警告?那就是缓冲区中的文件。</p>
</blockquote>
<p>进入Vim后,通过<code>:e[dit]</code>命令即可打开某个文件到缓冲区。还记得吗?使用<code>:new</code>可以<a href="/use-windows-edit-multi-files-in-vim.html">打开一个新窗口</a>。 关闭一个文件可以用<code>:q</code>,移出缓冲区用<code>:bd[elete]</code>(占用缓冲区的文件对你毫无影响,多数情况下不需要这样做)。</p>
<blockquote>
<p>如果Buffer未保存<code>:bd</code>会失败,如果强制删除可以<code>:bd!</code>。</p>
</blockquote>
<h3 id="_2">缓冲区跳转<a class="headerlink" href="#_2" title="Permanent link"> </a></h3>
<hr />
<p>缓冲区之间跳转最常用的方式便是 <code>Ctrl+^</code>(不需要按下Shift)来切换当前缓冲区和上一个缓冲区。 另外,还提供了很多跳转命令:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span><span class="k">ls</span><span class="p">,</span> :<span class="k">buffers</span> 列出所有缓冲区</span>
<span class="code-line"><span class="p">:</span><span class="k">bn</span>[ext] 下一个缓冲区</span>
<span class="code-line"><span class="p">:</span><span class="k">bp</span>[revious] 上一个缓冲区</span>
<span class="code-line"><span class="p">:</span><span class="k">b</span> {<span class="k">number</span><span class="p">,</span> expression} 跳转到指定缓冲区</span>
<span class="code-line"></code></pre></div>
<p><code>:b</code>接受缓冲区编号,或者部分文件名。例如:
* <code>:b2</code>将会跳转到编号为2的缓冲区,如果你正在用<code>:ls</code>列出缓冲区,这时只需要输入编号回车即可。
* <code>:b exa</code>将会跳转到最匹配<code>exa</code>的文件名,比如<code>example.html</code>,<strong>模糊匹配打开文件正是Vim缓冲区的强大之处</strong> 。</p>
<h3 id="_3">分屏<a class="headerlink" href="#_3" title="Permanent link"> </a></h3>
<hr />
<p>在<a href="/use-windows-edit-multi-files-in-vim.html">Vim 多文件编辑:窗口</a>中已经介绍了Vim中分割屏幕的操作。 其实分屏时还可以指定一个Buffer在新的Window中打开。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span><span class="k">sb</span> <span class="m">3</span> 分屏并打开编号为3的Buffer</span>
<span class="code-line"><span class="p">:</span><span class="k">vertical</span> <span class="k">sb</span> <span class="m">3</span> 同上,垂直分屏</span>
<span class="code-line"><span class="p">:</span><span class="k">vertical</span> <span class="k">rightbelow</span> <span class="k">sfind</span> <span class="k">file</span>.txt</span>
<span class="code-line"></code></pre></div>
<p>注意<code>sfind</code>可以打开在Vim PATH中的任何文件。这当然需要我们设置PATH,一个通用的做法是在<code>~/.vimrc</code>中添加:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c">" 将当前工作路径设为Vim PATH</span></span>
<span class="code-line"><span class="k">set</span> <span class="nb">path</span><span class="p">=</span>$PWD/**</span>
<span class="code-line"></code></pre></div>
<h3 id="_4">利用通配符进行缓冲区跳转<a class="headerlink" href="#_4" title="Permanent link"> </a></h3>
<hr />
<p>这是缓冲区最强大的功能之一。我们可以使用通配符来指定要跳转到的缓冲区文件名。 在此之前,我们启动<code>wildmenu</code>并设置匹配后文件选择模式为<code>full</code>。 <code>wildchar</code>为选择下一个备选文件的快捷键, 而<code>wildcharm</code>用于宏定义中(语义同<code>wildchar</code>),比如后面的<code>noremap</code>。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="k">set</span> <span class="nb">wildmenu</span> <span class="nb">wildmode</span><span class="p">=</span>full </span>
<span class="code-line"><span class="k">set</span> <span class="nb">wildchar</span><span class="p">=<</span>Tab<span class="p">></span> <span class="nb">wildcharm</span><span class="p">=<</span>C<span class="p">-</span>Z<span class="p">></span></span>
<span class="code-line"></code></pre></div>
<p>比如现在按下打开这些文件:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>vehicle.<span class="k">c</span> vehicle.<span class="k">h</span> car.<span class="k">c</span> car.<span class="k">h</span> jet.<span class="k">c</span> jet.<span class="k">h</span> jetcar.<span class="k">c</span> jetcar.<span class="k">h</span></span>
<span class="code-line"></code></pre></div>
<p>然后按下<code>:b <Tab></code>便可看到Vim提供的备选文件列表了, 按下<code><Tab></code>选择下一个,按下回车打开当前文件。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span><span class="k">b</span> <span class="p"><</span>Tab<span class="p">></span> <span class="c">" 显示所有Buffer中的文件</span></span>
<span class="code-line"><span class="p">:</span><span class="k">b</span> car<span class="p"><</span>Tab<span class="p">></span> <span class="c">" 显示 car.c car.h</span></span>
<span class="code-line"><span class="p">:</span><span class="k">b</span> *car<span class="p"><</span>Tab<span class="p">></span> <span class="c">" 显示 car.c jetcar.c car.h jetcar.h</span></span>
<span class="code-line"><span class="p">:</span><span class="k">b</span> .<span class="k">h</span><span class="p"><</span>Tab<span class="p">></span> <span class="c">" 显示 vehicle.h car.h jet.h jetcar.h</span></span>
<span class="code-line"><span class="p">:</span><span class="k">b</span> .<span class="k">c</span><span class="p"><</span>Tab<span class="p">></span> <span class="c">" 显示 vehicle.c car.c jet.c jetcar.c</span></span>
<span class="code-line"><span class="p">:</span><span class="k">b</span> <span class="k">ar</span>.<span class="k">c</span><span class="p"><</span>Tab<span class="p">></span> <span class="c">" 显示 car.c jetcar.c</span></span>
<span class="code-line"><span class="p">:</span><span class="k">b</span> <span class="k">j</span>*<span class="k">c</span><span class="p"><</span>Tab<span class="p">></span> <span class="c">" 显示 jet.c jetcar.c jetcar.h</span></span>
<span class="code-line"></code></pre></div>
<p>我们可以为<code>:b <Tab></code>设置一个快捷键<code><c-n></code>,这时便用到上文中设置的<code>wildcharm</code>了:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">noremap</span> <span class="p"><</span><span class="k">c</span><span class="p">-</span><span class="k">n</span><span class="p">></span> :<span class="k">b</span> <span class="p"><</span><span class="k">c</span><span class="p">-</span>z<span class="p">></span></span>
<span class="code-line"></code></pre></div>
<p>-= 完 =-</p>Vim 多文件编辑:标签页2019-02-08T23:01:00+08:002019-02-08T23:01:00+08:00doobomtag:doobom.me,2019-02-08:/use-tagpages-edit-multi-files-in-vim<p>Vim 多文件编辑:标签页.</p><blockquote>
<p>原文链接: <a href="https://harttle.land/2015/11/12/vim-tabpage.html">https://harttle.land/2015/11/12/vim-tabpage.html</a></p>
</blockquote>
<p>多文件编辑的场景太常见了:代码比对、项目重构、模块构建… 最初harttle在碰到这些问题时直接转向IDE了,其实Vim不仅支持多文件编辑,而且支持多种风格:标签页(tab)、窗口(window)、缓冲区(buffer)等。 今天harttle就来介绍一下Vim强大的多文件编辑!本文介绍Vim标签页的使用.</p>
<blockquote>
<p>要做一个强大的IDE,除了多文件编辑技巧,你可能还需要终端复用和目录树。</p>
</blockquote>
<h3 id="_1">打开与关闭<a class="headerlink" href="#_1" title="Permanent link"> </a></h3>
<hr />
<p><a href="http://vim.wikia.com/wiki/Using_tab_pages">标签页</a>是最常见的多文件编辑方式吧,熟悉IDE的小伙伴一定能很快上手! 使用<code>-p</code>参数来用多个标签页启动Vim:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="k">vim</span> <span class="p">-</span><span class="k">p</span> main.cpp my<span class="p">-</span>oj<span class="p">-</span>toolkit.<span class="k">h</span> <span class="sr">/private/</span>etc/hosts</span>
<span class="code-line"></code></pre></div>
<p><img alt="vim-tab" src="images/vim-tab@2x.png" /></p>
<p>在Vim中也可以打开和关闭标签:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span><span class="k">tabe</span>[dit] {<span class="k">file</span>} edit specified <span class="k">file</span> <span class="k">in</span> <span class="k">a</span> <span class="k">new</span> <span class="k">tab</span></span>
<span class="code-line"><span class="p">:</span><span class="k">tabf</span>[ind] {<span class="k">file</span>} open <span class="k">a</span> <span class="k">new</span> <span class="k">tab</span> with filename given<span class="p">,</span> searching the <span class="s1">'path'</span> <span class="k">to</span> find it</span>
<span class="code-line"><span class="p">:</span><span class="k">tabc</span>[lose] <span class="k">close</span> current <span class="k">tab</span></span>
<span class="code-line"><span class="p">:</span><span class="k">tabc</span>[lose] {<span class="k">i</span>} <span class="k">close</span> <span class="k">i</span><span class="p">-</span><span class="k">th</span> <span class="k">tab</span></span>
<span class="code-line"><span class="p">:</span><span class="k">tabo</span>[nly] <span class="k">close</span> <span class="k">all</span> other <span class="k">tabs</span> <span class="p">(</span>show <span class="k">only</span> the current <span class="k">tab</span><span class="p">)</span></span>
<span class="code-line"></code></pre></div>
<blockquote>
<p>中括号中的部分可以省略,在Vim中<code>:h tabedit</code>可以查看命令帮助。</p>
</blockquote>
<h3 id="_2">移动标签<a class="headerlink" href="#_2" title="Permanent link"> </a></h3>
<hr />
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span><span class="k">tabs</span> <span class="nb">list</span> <span class="k">all</span> <span class="k">tabs</span> including their displayed <span class="nb">window</span></span>
<span class="code-line"><span class="p">:</span><span class="k">tabm</span> <span class="m">0</span> move current <span class="k">tab</span> <span class="k">to</span> <span class="k">first</span></span>
<span class="code-line"><span class="p">:</span><span class="k">tabm</span> move current <span class="k">tab</span> <span class="k">to</span> last</span>
<span class="code-line"><span class="p">:</span><span class="k">tabm</span> {<span class="k">i</span>} move current <span class="k">tab</span> <span class="k">to</span> position <span class="k">i</span><span class="p">+</span><span class="m">1</span></span>
<span class="code-line"></code></pre></div>
<h3 id="_3">标签跳转<a class="headerlink" href="#_3" title="Permanent link"> </a></h3>
<hr />
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span><span class="k">tabn</span> <span class="k">go</span> <span class="k">to</span> next <span class="k">tab</span></span>
<span class="code-line"><span class="p">:</span><span class="k">tabp</span> <span class="k">go</span> <span class="k">to</span> <span class="k">previous</span> <span class="k">tab</span></span>
<span class="code-line"><span class="p">:</span><span class="k">tabfirst</span> <span class="k">go</span> <span class="k">to</span> <span class="k">first</span> <span class="k">tab</span></span>
<span class="code-line"><span class="p">:</span><span class="k">tablast</span> <span class="k">go</span> <span class="k">to</span> last <span class="k">tab</span></span>
<span class="code-line"></code></pre></div>
<p>在正常模式(normal)下,还可以使用快捷键:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>gt <span class="k">go</span> <span class="k">to</span> next <span class="k">tab</span></span>
<span class="code-line">gT <span class="k">go</span> <span class="k">to</span> <span class="k">previous</span> <span class="k">tab</span></span>
<span class="code-line">{<span class="k">i</span>}gt <span class="k">go</span> <span class="k">to</span> <span class="k">tab</span> <span class="k">in</span> position <span class="k">i</span> </span>
<span class="code-line"></code></pre></div>
<p>可以设置更通用的切换标签页快捷键,比如我的<code>~/.vimrc</code>是这样设置的:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">noremap</span> <span class="p"><</span>C<span class="p">-</span>L<span class="p">></span> <span class="p"><</span>Esc<span class="p">></span>:tabnext<span class="p"><</span>CR<span class="p">></span></span>
<span class="code-line"><span class="nb">noremap</span> <span class="p"><</span>C<span class="p">-</span>H<span class="p">></span> <span class="p"><</span>Esc<span class="p">></span>:<span class="k">tabprevious</span><span class="p"><</span>CR<span class="p">></span></span>
<span class="code-line"></code></pre></div>
<p>-= 完 =-</p>Vim 多文件编辑:窗口2019-02-08T23:01:00+08:002019-02-08T23:01:00+08:00doobomtag:doobom.me,2019-02-08:/use-windows-edit-multi-files-in-vim<p>Vim 多文件编辑:窗口.</p><blockquote>
<p>原文链接: <a href="https://harttle.land/2015/11/14/vim-window.html">https://harttle.land/2015/11/14/vim-window.html</a></p>
</blockquote>
<p>标签页(tab)、窗口(window)、缓冲区(buffer)是Vim多文件编辑的三种方式,它们可以单独使用,也可以同时使用。 它们的关系是这样的:</p>
<blockquote>
<p>A buffer is the in-memory text of a file. A window is a viewport on a buffer. A tab page is a collection of windows. –<a href="http://vimdoc.sourceforge.net/htmldoc/windows.html">vimdoc</a></p>
</blockquote>
<p>本文主要介绍Vim窗口的创建与维护, 先上图:</p>
<p><img alt="vim-window" src="images/vim-window@2x.png" /></p>
<h3 id="_1">分屏打开多个文件<a class="headerlink" href="#_1" title="Permanent link"> </a></h3>
<hr />
<p>使用<code>-O</code>参数可以让Vim以分屏的方式打开多个文件:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="k">vim</span> <span class="p">-</span>O main.cpp my<span class="p">-</span>oj<span class="p">-</span>toolkit.<span class="k">h</span></span>
<span class="code-line"></code></pre></div>
<blockquote>
<p>使用小写的-o可以水平分屏。</p>
</blockquote>
<h3 id="_2">打开关闭命令<a class="headerlink" href="#_2" title="Permanent link"> </a></h3>
<hr />
<p>在进入Vim后,可以使用这些命令来打开/关闭窗口:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span><span class="k">sp</span>[lit] {<span class="k">file</span>} 水平分屏</span>
<span class="code-line"><span class="p">:</span><span class="k">new</span> {<span class="k">file</span>} 水平分屏</span>
<span class="code-line"><span class="p">:</span><span class="k">sv</span>[iew] {<span class="k">file</span>} 水平分屏,以只读方式打开</span>
<span class="code-line"><span class="p">:</span><span class="k">vs</span>[plit] {<span class="k">file</span>} 垂直分屏</span>
<span class="code-line"><span class="p">:</span><span class="k">clo</span>[<span class="k">se</span>] 关闭当前窗口</span>
<span class="code-line"></code></pre></div>
<blockquote>
<p>上述命令中,如未指定file则打开当前文件。</p>
</blockquote>
<h3 id="_3">打开关闭快捷键<a class="headerlink" href="#_3" title="Permanent link"> </a></h3>
<hr />
<p>上述命令都有相应的快捷键,它们有共同的前缀:<code>Ctrl+w</code>。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Ctrl<span class="p">+</span><span class="k">w</span> s 水平分割当前窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="k">v</span> 垂直分割当前窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="k">q</span> 关闭当前窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="k">n</span> 打开一个新窗口(空文件)</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="k">o</span> 关闭出当前窗口之外的所有窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> T 当前窗口移动到新标签页</span>
<span class="code-line"></code></pre></div>
<h3 id="_4">切换窗口<a class="headerlink" href="#_4" title="Permanent link"> </a></h3>
<hr />
<p>切换窗口的快捷键就是<code>Ctrl+w</code>前缀 + <code>hjkl</code>:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Ctrl<span class="p">+</span><span class="k">w</span> <span class="k">h</span> 切换到左边窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="k">j</span> 切换到下边窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="k">k</span> 切换到上边窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="k">l</span> 切换到右边窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="k">w</span> 遍历切换窗口</span>
<span class="code-line"></code></pre></div>
<blockquote>
<p>还有<code>t</code>切换到最上方的窗口,<code>b</code>切换到最下方的窗口。</p>
</blockquote>
<h3 id="_5">移动窗口<a class="headerlink" href="#_5" title="Permanent link"> </a></h3>
<hr />
<p>分屏后还可以把当前窗口向任何方向移动,只需要将上述快捷键中的<code>hjkl</code>大写:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Ctrl<span class="p">+</span><span class="k">w</span> H 向左移动当前窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> J 向下移动当前窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> K 向上移动当前窗口</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> L 向右移动当前窗口</span>
<span class="code-line"></code></pre></div>
<h3 id="_6">调整大小<a class="headerlink" href="#_6" title="Permanent link"> </a></h3>
<hr />
<p>调整窗口大小的快捷键仍然有<code>Ctrl+W</code>前缀:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>Ctrl<span class="p">+</span><span class="k">w</span> <span class="p">+</span> 增加窗口高度</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="p">-</span> 减小窗口高度</span>
<span class="code-line">Ctrl<span class="p">+</span><span class="k">w</span> <span class="p">=</span> 统一窗口高度</span>
<span class="code-line"></code></pre></div>
<p>-= 完 =-</p>在 Vim 中优雅地查找和替换2019-02-05T23:01:00+08:002019-02-05T23:01:00+08:00doobomtag:doobom.me,2019-02-05:/search-and-replace-in-vim<p><span class="caps">VIM</span> 中的查找及替换, 可以用正则式进行.</p><blockquote>
<p>本文来源: https://harttle.land/2016/08/08/vim-search-in-file.html</p>
</blockquote>
<p>总有人问我 Vim 中能不能查找,当然能!而且是超级强的查找! 这篇文章来详细介绍 Vim 中查找相关的设置和使用方法。 包括查找与替换、查找光标所在词、高亮前景/背景色、切换高亮状态、大小写敏感查找等。</p>
<h2 id="_1">查找<a class="headerlink" href="#_1" title="Permanent link"> </a></h2>
<hr />
<p>在<code>normal</code>模式下按下<code>/</code>即可进入查找模式,输入要查找的字符串并按下回车。 Vim会跳转到第一个匹配。按下<code>n</code>查找下一个,按下<code>N</code>查找上一个。</p>
<p>Vim查找支持正则表达式,例如<code>/vim$</code>匹配行尾的”<code>vim</code><span class="dquo">“</span>。 需要查找特殊字符需要转义,例如<code>/vim\$</code>匹配”<code>vim$</code><span class="dquo">“</span>。</p>
<blockquote>
<p>注意查找回车应当用<code>\n</code>,而替换为回车应当用<code>\r</code>(相当于<code><CR></code>)。</p>
</blockquote>
<h2 id="_2">大小写敏感查找<a class="headerlink" href="#_2" title="Permanent link"> </a></h2>
<hr />
<p>在查找模式中加入<code>\c</code>表示大小写不敏感查找,<code>\C</code>表示大小写敏感查找。例如:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>/foo\<span class="k">c</span></span>
<span class="code-line"></code></pre></div>
<p>将会查找所有的”<code>foo</code><span class="dquo">“</span>,”<code>FOO</code><span class="dquo">“</span>,”<code>Foo</code><span class="dquo">“</span>等字符串。</p>
<h2 id="_3">大小写敏感配置<a class="headerlink" href="#_3" title="Permanent link"> </a></h2>
<hr />
<p>Vim 默认采用大小写敏感的查找,为了方便我们常常将其配置为大小写不敏感:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c">" 设置默认进行大小写不敏感查找</span></span>
<span class="code-line"><span class="k">set</span> <span class="nb">ignorecase</span></span>
<span class="code-line"><span class="c">" 如果有一个大写字母,则切换到大小写敏感查找</span></span>
<span class="code-line"><span class="k">set</span> <span class="nb">smartcase</span> </span>
<span class="code-line"></code></pre></div>
<blockquote>
<p>将上述设置粘贴到你的<code>~/.vimrc</code>,重新打开Vim即可生效。</p>
</blockquote>
<h2 id="_4">查找当前单词<a class="headerlink" href="#_4" title="Permanent link"> </a></h2>
<hr />
<p>在<code>normal</code>模式下按下<code>*</code>即可查找光标所在单词(word), 要求每次出现的前后为空白字符或标点符号。例如当前为<code>foo</code>, 可以匹配<code>foo bar</code>中的<code>foo</code>,但不可匹配<code>foobar</code>中的<code>foo</code>。 这在查找函数名、变量名时非常有用。</p>
<p>按下<code>g*</code>即可查找光标所在单词的字符序列,每次出现前后字符无要求。 即<code>foo bar</code>和<code>foobar</code>中的<code>foo</code>均可被匹配到。</p>
<h2 id="_5">查找与替换<a class="headerlink" href="#_5" title="Permanent link"> </a></h2>
<hr />
<p><code>:s</code>(substitute)命令用来查找和替换字符串。语法如下:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span>{作用范围}s<span class="sr">/{目标}/</span>{替换}/{替换标志}</span>
<span class="code-line"></code></pre></div>
<p>例如<code>:%s/foo/bar/g</code>会在全局范围(<code>%</code>)查找<code>foo</code>并替换为<code>bar</code>,所有出现都会被替换(<code>g</code>)。</p>
<h2 id="_6">作用范围<a class="headerlink" href="#_6" title="Permanent link"> </a></h2>
<hr />
<p>作用范围分为当前行、全文、选区等等。</p>
<p>当前行:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span>s<span class="sr">/foo/</span>bar/<span class="k">g</span></span>
<span class="code-line"></code></pre></div>
<p>全文:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span>%s<span class="sr">/foo/</span>bar/<span class="k">g</span></span>
<span class="code-line"></code></pre></div>
<p>选区,在Visual模式下选择区域后输入<code>:</code>,Vim即可自动补全为 <code>:'<,'></code>。</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span><span class="s1">'<,'</span><span class="p">></span>s<span class="sr">/foo/</span>bar/<span class="k">g</span></span>
<span class="code-line"></code></pre></div>
<p>2-11行:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span><span class="m">5</span><span class="p">,</span><span class="m">12</span>s<span class="sr">/foo/</span>bar/<span class="k">g</span></span>
<span class="code-line"></code></pre></div>
<p>当前行.与接下来两行+2:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span>.<span class="p">,+</span><span class="m">2</span>s<span class="sr">/foo/</span>bar/<span class="k">g</span></span>
<span class="code-line"></code></pre></div>
<h2 id="_7">替换标志<a class="headerlink" href="#_7" title="Permanent link"> </a></h2>
<hr />
<p>上文中命令结尾的<code>g</code>即是替换标志之一,表示全局<code>global</code>替换(即替换目标的所有出现)。 还有很多其他有用的替换标志:</p>
<p>空替换标志表示只替换从光标位置开始,目标的第一次出现:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span>%s<span class="sr">/foo/</span>bar</span>
<span class="code-line"></code></pre></div>
<p><code>i</code>表示大小写不敏感查找,<code>I</code>表示大小写敏感:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span>%s<span class="sr">/foo/</span>bar/<span class="k">i</span></span>
<span class="code-line"># 等效于模式中的\<span class="k">c</span>(不敏感)或\C(敏感)</span>
<span class="code-line"><span class="p">:</span>%s<span class="sr">/foo\c/</span>bar</span>
<span class="code-line"></code></pre></div>
<p><code>c</code>表示需要确认,例如全局查找”<code>foo</code><span class="dquo">“</span>替换为”<code>bar</code><span class="dquo">“</span>并且需要确认:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span>%s<span class="sr">/foo/</span>bar/gc</span>
<span class="code-line"></code></pre></div>
<p>回车后Vim会将光标移动到每一次”<code>foo</code><span class="dquo">“</span>出现的位置,并提示</p>
<div class="highlight"><pre><span class="code-line"><span></span><code>replace with bar <span class="p">(</span><span class="k">y</span><span class="sr">/n/</span><span class="k">a</span><span class="sr">/q/</span><span class="k">l</span><span class="sr">/^E/</span>^Y<span class="p">)</span>?</span>
<span class="code-line"></code></pre></div>
<p>按下<code>y</code>表示替换,<code>n</code>表示不替换,<code>a</code>表示替换所有,<code>q</code>表示退出查找模式, <code>l</code>表示替换当前位置并退出。<code>^E</code>与<code>^Y</code>是光标移动快捷键,参考: <a href="https://harttle.land/2015/11/07/vim-cursor.html">Vim中如何快速进行光标移动</a>。</p>
<h2 id="_8">高亮设置<a class="headerlink" href="#_8" title="Permanent link"> </a></h2>
<hr />
<h3 id="_9">高亮颜色设置<a class="headerlink" href="#_9" title="Permanent link"> </a></h3>
<hr />
<p>如果你像我一样觉得高亮的颜色不太舒服,可以在 <code>~/.vimrc</code> 中进行设置:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">highlight</span> Search ctermbg<span class="p">=</span>yellow ctermfg<span class="p">=</span>black </span>
<span class="code-line"><span class="nb">highlight</span> IncSearch ctermbg<span class="p">=</span>black ctermfg<span class="p">=</span>yellow </span>
<span class="code-line"><span class="nb">highlight</span> MatchParen cterm<span class="p">=</span><span class="nb">underline</span> ctermbg<span class="p">=</span><span class="nb">NONE</span> ctermfg<span class="p">=</span><span class="nb">NONE</span></span>
<span class="code-line"></code></pre></div>
<p>上述配置指定 Search 结果的前景色(foreground)为黑色,背景色(background)为灰色; 渐进搜索的前景色为黑色,背景色为黄色;光标处的字符加下划线。</p>
<blockquote>
<p>更多的CTERM颜色可以查阅:<a href="http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim">http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim</a></p>
</blockquote>
<h3 id="_10">禁用/启用高亮<a class="headerlink" href="#_10" title="Permanent link"> </a></h3>
<hr />
<p>有木有觉得每次查找替换后 Vim 仍然高亮着搜索结果? 可以手动让它停止高亮,在normal模式下输入:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="p">:</span>nohighlight</span>
<span class="code-line"><span class="c">" 等效于</span></span>
<span class="code-line"><span class="p">:</span><span class="k">nohl</span></span>
<span class="code-line"></code></pre></div>
<p>其实上述命令禁用了所有高亮,只禁用搜索高亮的命令是<code>:set nohlsearch</code>。 下次搜索时需要<code>:set hlsearch</code>再次启动搜索高亮。</p>
<h4 id="_11"><em>延时禁用</em><a class="headerlink" href="#_11" title="Permanent link"> </a></h4>
<hr />
<p>怎么能够让Vim查找/替换后一段时间自动取消高亮,发生查找时自动开启呢?</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="c">" 当光标一段时间保持不动了,就禁用高亮</span></span>
<span class="code-line">autocmd cursorhold * <span class="k">set</span> <span class="k">nohlsearch</span></span>
<span class="code-line"><span class="c">" 当输入查找命令时,再启用高亮</span></span>
<span class="code-line"><span class="nb">noremap</span> <span class="k">n</span> :<span class="k">set</span> <span class="nb">hlsearch</span><span class="p"><</span><span class="k">cr</span><span class="p">></span><span class="k">n</span></span>
<span class="code-line"><span class="nb">noremap</span> N :<span class="k">set</span> <span class="nb">hlsearch</span><span class="p"><</span><span class="k">cr</span><span class="p">></span>N</span>
<span class="code-line"><span class="nb">noremap</span> <span class="sr">/ :set hlsearch<cr>/</span></span>
<span class="code-line"><span class="nb">noremap</span> ? :<span class="k">set</span> <span class="nb">hlsearch</span><span class="p"><</span><span class="k">cr</span><span class="p">></span>?</span>
<span class="code-line"><span class="nb">noremap</span> * *:<span class="k">set</span> <span class="nb">hlsearch</span><span class="p"><</span><span class="k">cr</span><span class="p">></span></span>
<span class="code-line"></code></pre></div>
<blockquote>
<p>将上述配置粘贴到<code>~/.vimrc</code>,重新打开vim即可生效。</p>
</blockquote>
<h4 id="_12"><em>一键禁用</em><a class="headerlink" href="#_12" title="Permanent link"> </a></h4>
<hr />
<p>如果延时禁用搜索高亮仍然不够舒服,可以设置快捷键来一键禁用/开启搜索高亮:</p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="nb">noremap</span> <span class="k">n</span> :<span class="k">set</span> <span class="nb">hlsearch</span><span class="p"><</span><span class="k">cr</span><span class="p">></span><span class="k">n</span></span>
<span class="code-line"><span class="nb">noremap</span> N :<span class="k">set</span> <span class="nb">hlsearch</span><span class="p"><</span><span class="k">cr</span><span class="p">></span>N</span>
<span class="code-line"><span class="nb">noremap</span> <span class="sr">/ :set hlsearch<cr>/</span></span>
<span class="code-line"><span class="nb">noremap</span> ? :<span class="k">set</span> <span class="nb">hlsearch</span><span class="p"><</span><span class="k">cr</span><span class="p">></span>?</span>
<span class="code-line"><span class="nb">noremap</span> * *:<span class="k">set</span> <span class="nb">hlsearch</span><span class="p"><</span><span class="k">cr</span><span class="p">></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="nb">nnoremap</span> <span class="p"><</span><span class="k">c</span><span class="p">-</span><span class="k">h</span><span class="p">></span> :<span class="k">call</span> DisableHighlight<span class="p">()<</span><span class="k">cr</span><span class="p">></span></span>
<span class="code-line"><span class="k">function</span><span class="p">!</span> DisableHighlight<span class="p">()</span></span>
<span class="code-line"> <span class="k">set</span> <span class="k">nohlsearch</span></span>
<span class="code-line">endfunc</span>
<span class="code-line"></code></pre></div>
<p>希望关闭高亮时只需要按下 <code>Ctrl+H</code>,当发生下次搜索时又会自动启用。</p>
<h2 id="_13">参考阅读<a class="headerlink" href="#_13" title="Permanent link"> </a></h2>
<hr />
<blockquote>
<ul>
<li><span class="caps">XTERM</span> 256色:<a href="http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim">http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim</a></li>
<li>Vim Wikia - 查找与替换:<a href="http://vim.wikia.com/wiki/Search_and_replace">http://vim.wikia.com/wiki/Search_and_replace</a></li>
<li>用 Vim 打造 <span class="caps">IDE</span> 环境:<a href="https://harttle.land/2015/11/04/vim-ide.html">https://harttle.land/2015/11/04/vim-ide.html</a></li>
</ul>
</blockquote>
<p>-= 完 =-</p>How To Used Git2017-03-05T19:01:00+08:002017-03-05T19:01:00+08:00doobomtag:doobom.me,2017-03-05:/how-to-used-git<p>How To Used Git</p><h2 id="1git-bash">1.使用git bash创建一个文件夹<a class="headerlink" href="#1git-bash" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"> cd g:</span></span>
<span class="code-line"><span class="err"> cd GitLearning</span></span>
<span class="code-line"><span class="err"> mkdir LearningPythonDiary</span></span>
<span class="code-line"></code></pre></div>
<h2 id="2">2.初始化代码仓库<a class="headerlink" href="#2" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"> git init</span></span>
<span class="code-line"></code></pre></div>
<h2 id="3">3.添加一个文件到仓库的缓存区(从工作目录添加到缓存区)<a class="headerlink" href="#3" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"> git add filename</span></span>
<span class="code-line"></code></pre></div>
<h2 id="4head">4.将添加的文件从缓存区提交到HEAD(最近一次提交后的结果)<a class="headerlink" href="#4head" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"> git commit -m "代码提交信息"</span></span>
<span class="code-line"></code></pre></div>
<h2 id="5pushgithub">5.将本地代码仓库中代码push到gitHub上<a class="headerlink" href="#5pushgithub" title="Permanent link"> </a></h2>
<ul>
<li>首先需要用我们在gitHub上的邮箱与用户名生成一个.ssh(id_rsa.pub) <div class="highlight"><pre><span class="code-line"><span></span><code><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="c1">--global user.name "Your Name Here" </span></span>
<span class="code-line"><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="k">Sets</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="k">default</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="k">use</span><span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">you</span><span class="w"> </span><span class="k">commit</span><span class="w"></span></span>
<span class="code-line"></span>
<span class="code-line"><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">config</span><span class="w"> </span><span class="c1">--global user.email "your_email@example.com" </span></span>
<span class="code-line"><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="k">Sets</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="k">default</span><span class="w"> </span><span class="n">email</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="k">use</span><span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">you</span><span class="w"> </span><span class="k">commit</span><span class="w"></span></span>
<span class="code-line"></code></pre></div>
</li>
</ul>
<p>然后将生成的id_rsa.pub 中最后== 添加上自己在gitHub上的邮箱地址,全选一起拷贝到在gitHub上同样项目的 domay key中。 </p>
<ul>
<li>
<p>然后在git中创建主干线(ssh方式) </p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"> git remote add origin git@github.com:username/LearningPythonDiary.git</span></span>
<span class="code-line"></code></pre></div>
<p>也可以这样创建(https方式): </p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"> git remote add origin https://github.com/username/LearningPythonDiary.git</span></span>
<span class="code-line"></code></pre></div>
<p>不过这样创建就是每次提交的时候都要输入用户名与密码,比较繁琐。 </p>
</li>
<li>
<p>push到github中的同名项目中 </p>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"> git push origin master</span></span>
<span class="code-line"></code></pre></div>
</li>
</ul>
<h2 id="6github">6.将gitHub上的代码更新到本地<a class="headerlink" href="#6github" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"> git pull origin master</span></span>
<span class="code-line"></code></pre></div>
<h2 id="7githublocalhost">7.从gitHub上复制项目到本地localhost<a class="headerlink" href="#7githublocalhost" title="Permanent link"> </a></h2>
<div class="highlight"><pre><span class="code-line"><span></span><code><span class="err"> git clone https://github.com/username/LearningPythonDiary.git master</span></span>
<span class="code-line"></code></pre></div>
<p><em><em>转自https://github.com/peterluo/LearningPythonDiary</em></em></p>Hello World2017-03-02T02:01:00+08:002017-03-02T02:01:00+08:00Pelicantag:doobom.me,2017-03-02:/hello-world<p>The first post for Pelican.</p><p>Hello World, Hello Pelican.</p>
<p>and ~oops.run~ doobom.me</p>