<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.8.5">Jekyll</generator><link href="http://rinkky.xyz/feed.xml" rel="self" type="application/atom+xml" /><link href="http://rinkky.xyz/" rel="alternate" type="text/html" /><updated>2020-04-17T15:09:13+00:00</updated><id>http://rinkky.xyz/feed.xml</id><title type="html">笔记</title><subtitle>笔记 python, appium, xbox</subtitle><entry><title type="html">热评生成器</title><link href="http://rinkky.xyz/tools/hot-comment.html" rel="alternate" type="text/html" title="热评生成器" /><published>2020-04-15T00:00:00+00:00</published><updated>2020-04-15T00:00:00+00:00</updated><id>http://rinkky.xyz/tools/hot-comments</id><content type="html" xml:base="http://rinkky.xyz/tools/hot-comment.html"></content><author><name></name></author><category term="tools" /><summary type="html"></summary></entry><entry><title type="html">python requests如何一边下载一边保存文件</title><link href="http://rinkky.xyz/2020/python-requests-stream.html" rel="alternate" type="text/html" title="python requests如何一边下载一边保存文件" /><published>2020-03-27T00:00:00+00:00</published><updated>2020-03-27T00:00:00+00:00</updated><id>http://rinkky.xyz/2020/python-requests-stream</id><content type="html" xml:base="http://rinkky.xyz/2020/python-requests-stream.html">&lt;h2 id=&quot;问题&quot;&gt;问题&lt;/h2&gt;

&lt;p&gt;使用python requests, 如何下载较大文件，且一边下载一边保存&lt;/p&gt;

&lt;h2 id=&quot;解决方法&quot;&gt;解决方法&lt;/h2&gt;

&lt;p&gt;设定&lt;code class=&quot;highlighter-rouge&quot;&gt;stream=True&lt;/code&gt;并使用&lt;code class=&quot;highlighter-rouge&quot;&gt;response.iter_content()&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;download_and_save&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;save_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;requests&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;save_to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'wb'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;iter_content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk_size&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# 可自行调整chunk_size大小，其单位为bytes
&lt;/span&gt;            &lt;span class=&quot;nb&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</content><author><name></name></author><category term="python" /><category term="requests" /><category term="download" /><summary type="html">问题</summary></entry><entry><title type="html">grep/sed/awk中正则表达式的区别</title><link href="http://rinkky.xyz/2019/grep-sed-awk-re.html" rel="alternate" type="text/html" title="grep/sed/awk中正则表达式的区别" /><published>2019-09-08T00:00:00+00:00</published><updated>2019-09-08T00:00:00+00:00</updated><id>http://rinkky.xyz/2019/grep-sed-awk-re</id><content type="html" xml:base="http://rinkky.xyz/2019/grep-sed-awk-re.html">&lt;p&gt;本文默认你对正则表达式有基本的了解。&lt;/p&gt;

&lt;p&gt;本文试图让你以后使用grep/sed/awk时，不需要为他们的差异而头疼。&lt;/p&gt;

&lt;p&gt;本文试图解释两个概念：基础正则表达式和扩展正则表达式（这两个概念的名字简直就是瞎起的，太容易让人误解了）。&lt;/p&gt;

&lt;h3 id=&quot;grepsedawk中正则表达式的区别&quot;&gt;grep/sed/awk中正则表达式的区别&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;5个通用匹配符：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.&lt;/code&gt; 任意字符&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;*&lt;/code&gt; 匹配任意次数&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;^&lt;/code&gt; 行开头&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$&lt;/code&gt; 行结尾&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;[]&lt;/code&gt; 其中一个&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5个特殊匹配符：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;()&lt;/code&gt; 子表达式&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;+&lt;/code&gt; 匹配1次或多次&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;?&lt;/code&gt; 匹配0次或1次&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;{}&lt;/code&gt; 匹配m到n次&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;|&lt;/code&gt; 或&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;awk可以直接使用以上所有匹配符。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;grep和sed加上-E参数后可以直接使用以上所有匹配符。若无-E参数，需在特殊匹配符前加转义符&lt;code class=&quot;highlighter-rouge&quot;&gt;\&lt;/code&gt;。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;事实上，所谓扩展正则表达式(ERE)，&lt;strong&gt;并不是对正则表达式进行了扩展&lt;/strong&gt;。扩展正则表达式(ERE)能做的事，基础正则表达式(BRE)一样能做，只是加不加转义符的区别。如，想要匹配&lt;code class=&quot;highlighter-rouge&quot;&gt;aa&lt;/code&gt;或&lt;code class=&quot;highlighter-rouge&quot;&gt;aaa&lt;/code&gt;：&lt;/p&gt;

&lt;p&gt;BRE写法：&lt;code class=&quot;highlighter-rouge&quot;&gt;grep 'a\{2,3\}'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ERE写法：&lt;code class=&quot;highlighter-rouge&quot;&gt;grep -E 'a{2,3}'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;又如，对于以下文件：&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;a+
aaa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;grep '^a+$'&lt;/code&gt; 匹配第一行。 等价于&lt;code class=&quot;highlighter-rouge&quot;&gt;grep -E '^a\+$'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;grep '^a\+$'&lt;/code&gt; 匹配第二行。 等价于 &lt;code class=&quot;highlighter-rouge&quot;&gt;grep -E '^a+$'&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;建议&quot;&gt;建议&lt;/h3&gt;

&lt;p&gt;在三剑客中，以下5个匹配符也非常有用。&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;空格&lt;/code&gt; 空格&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;\&amp;lt;&lt;/code&gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;\&amp;gt;&lt;/code&gt; 单词左右边界&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;[[:blank:]]&lt;/code&gt; 空白字符（空格和制表符）&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;[[:graph:]]&lt;/code&gt; 非空白字符&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;[[:punct:]]&lt;/code&gt; 标点符号&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;个人建议，在grep/sed/awk中只使用本文列出的15个匹配符，未列出的其他匹配符，有的支持有的不支持，容易记错(如: awk不支持&lt;code class=&quot;highlighter-rouge&quot;&gt;\b&lt;/code&gt;)。&lt;/p&gt;

&lt;h3 id=&quot;参考&quot;&gt;参考&lt;/h3&gt;

&lt;p&gt;https://www.gnu.org/software/sed/manual/html_node/BRE-vs-ERE.html&lt;/p&gt;</content><author><name></name></author><summary type="html">本文默认你对正则表达式有基本的了解。</summary></entry><entry><title type="html">在ubuntu中开启sftp服务，并在windows中通过winscp访问ubuntu中的文件</title><link href="http://rinkky.xyz/2019/sftp-ubuntu.html" rel="alternate" type="text/html" title="在ubuntu中开启sftp服务，并在windows中通过winscp访问ubuntu中的文件" /><published>2019-07-27T00:00:00+00:00</published><updated>2019-07-27T00:00:00+00:00</updated><id>http://rinkky.xyz/2019/sftp-ubuntu</id><content type="html" xml:base="http://rinkky.xyz/2019/sftp-ubuntu.html">&lt;h2 id=&quot;问题&quot;&gt;问题&lt;/h2&gt;

&lt;p&gt;如何在ubuntu中开启sftp服务，并在windows中通过winscp访问ubuntu上的文件？&lt;/p&gt;

&lt;p&gt;或&lt;/p&gt;

&lt;p&gt;win10如何访问wsl linux子系统中的文件？&lt;/p&gt;

&lt;h2 id=&quot;前提&quot;&gt;前提&lt;/h2&gt;

&lt;p&gt;windows中已有密钥对。如没有请查找相关资料。&lt;/p&gt;

&lt;h2 id=&quot;方案&quot;&gt;方案&lt;/h2&gt;

&lt;h3 id=&quot;1在windows中安装winscp&quot;&gt;1.在windows中安装winscp&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://winscp.net/eng/download.php&quot;&gt;winscp&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;2-检查ubuntu中的相关服务&quot;&gt;2. 检查ubuntu中的相关服务&lt;/h3&gt;

&lt;p&gt;运行命令&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dpkg --get-selections | grep openssh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;如果结果中有&lt;code class=&quot;highlighter-rouge&quot;&gt;openssh-client&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;openssh-server&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;openssh-sftp-server&lt;/code&gt;, 说明相关服务已安装，可直接跳到下一步。如果没有安装，则运行以下命令进行安装&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo apt-get install openssh-client
sudo apt-get install openssh-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;3-启动sftp-server&quot;&gt;3. 启动sftp server&lt;/h3&gt;

&lt;p&gt;运行以下命令启动服务&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;service ssh start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果启动成功，直接跳到下一步。&lt;/p&gt;

&lt;p&gt;如果未启动成功，且返回结果中有以下错误信息：&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;error: could not load host key /etc/ssh/ssh_host_rsa_key
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;解决方法如下：&lt;/p&gt;

&lt;p&gt;运行&lt;code class=&quot;highlighter-rouge&quot;&gt;ls -al /etc/ssh/ssh_*key&lt;/code&gt;查看该目录下是否包含错误提示中的文件，如果没有这些文件或者文件大小为0, 说明这些key初始化失败，请运行以下命令重新配置&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo rm -r /etc/ssh/ssh*key
sudo dpkg-reconfigure openssh-server
service ssh start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;4-在ubuntu中添加可信任公钥&quot;&gt;4. 在ubuntu中添加可信任公钥&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;~/.ssh/authorized_keys&lt;/code&gt;查看ubuntu上是否有该文件，如果没有请创建该文件。(.ssh目录权限为700, authorized_keys文件权限为600.)&lt;/p&gt;

&lt;p&gt;把windows公钥的内容复制到上述文件中。&lt;/p&gt;

&lt;h3 id=&quot;5-通过winscp访问ubuntu&quot;&gt;5. 通过winscp访问ubuntu&lt;/h3&gt;

&lt;p&gt;打开winscp，配置如下：&lt;/p&gt;
&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;File protocol: SFTP
Host name: 你服务器的地址. (如果是本机上的linux子系统，则为127.0.0.1)
Port number: 22
User name: 你在ubuntu系统中的用户名
Password: 留空
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;填写以上配置后，找到Advanced -&amp;gt; Authentication -&amp;gt; Private key file配置项，点击浏览(…)进入Select private key file窗口，找到&lt;code class=&quot;highlighter-rouge&quot;&gt;C:\Users\你的windows用户名\.ssh&lt;/code&gt;目录，如果有ppk格式的密钥，选择即可。&lt;/p&gt;

&lt;p&gt;如果没有ppk格式密钥，则在右下角文件过滤下拉框中找到All private Key Files选项, 然后选择你的密钥文件，一般为&lt;code class=&quot;highlighter-rouge&quot;&gt;id_rsa&lt;/code&gt;, 选中后winscp会帮助你生成ppk格式的密钥。&lt;/p&gt;

&lt;p&gt;保存设置，点击Login即可访问ubuntu中的文件。&lt;/p&gt;</content><author><name></name></author><summary type="html">问题</summary></entry><entry><title type="html">后台静默运行批处理(不显示窗口)</title><link href="http://rinkky.xyz/2019/bat-without-window.html" rel="alternate" type="text/html" title="后台静默运行批处理(不显示窗口)" /><published>2019-07-12T00:00:00+00:00</published><updated>2019-07-12T00:00:00+00:00</updated><id>http://rinkky.xyz/2019/bat-without-window</id><content type="html" xml:base="http://rinkky.xyz/2019/bat-without-window.html">&lt;p&gt;&lt;strong&gt;问题：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;如何运行批处理(bat)文件同时不显示其窗口。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;场景1：手动调用&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;为其创建快捷方式，快捷方式属性中选择”最小化”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;场景2：在其他批处理中调用&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;使用命令&lt;code class=&quot;highlighter-rouge&quot;&gt;start /min xxx.bat&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;场景3：如果在任务计划中调用&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;找到对应计划任务，打开”常规”选项卡，选中”隐藏”复选框&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.microwin10.com/wenzhang/jiaocheng/2018-05-05/10047.html&quot;&gt;参考&lt;/a&gt;&lt;/p&gt;</content><author><name></name></author><category term="windows" /><summary type="html">问题：</summary></entry><entry><title type="html">Jekyll 笔记</title><link href="http://rinkky.xyz/2019/jekyll.html" rel="alternate" type="text/html" title="Jekyll 笔记" /><published>2019-06-29T00:00:00+00:00</published><updated>2019-06-29T00:00:00+00:00</updated><id>http://rinkky.xyz/2019/jekyll</id><content type="html" xml:base="http://rinkky.xyz/2019/jekyll.html">&lt;p&gt;Jekyll是用来构建静态网站的利器。Github Pages就是基于Jekyll的。&lt;/p&gt;

&lt;h3 id=&quot;部分命令&quot;&gt;部分命令&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll new mysite&lt;/code&gt;: 新建&lt;code class=&quot;highlighter-rouge&quot;&gt;./mysite&lt;/code&gt;目录，并在其中创建Jekyll网站&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll build&lt;/code&gt;: 构建网站，构建生成的网站在&lt;code class=&quot;highlighter-rouge&quot;&gt;_site&lt;/code&gt;目录下&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll serve&lt;/code&gt;: 构建网站并开启本地服务，一般可通过&lt;code class=&quot;highlighter-rouge&quot;&gt;localhost:4000&lt;/code&gt;访问网站&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bundle install&lt;/code&gt;: 安装Gemfile中指定的依赖包&lt;/p&gt;

&lt;h3 id=&quot;文件结构&quot;&gt;文件结构&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;_posts/&lt;/code&gt;: 存储markdown文件，每个文件是一篇文章&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;_site/&lt;/code&gt;: 构建生成的网站&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;: 一些全局配置项，如theme/网站名/邮箱等&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;*.md/*.html&lt;/code&gt;: 网站根目录的文件，构建之后会生成&lt;code class=&quot;highlighter-rouge&quot;&gt;_site/*.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;: 存储了构建网站所需的依赖包&lt;/p&gt;

&lt;p&gt;一个最简单的Jekyll结构只有这些文件/目录。完整的结构还应该有_layouts/, _includes/, _sass/, assets/等目录，下面称之为&lt;code class=&quot;highlighter-rouge&quot;&gt;主题目录&lt;/code&gt;。如果应用了theme, 构建时会使用theme中的主题目录。如Jekyll默认应用了minima样式，构建时会使用minima的主题目录。&lt;/p&gt;

&lt;p&gt;自己创建的主题文件可以覆盖theme中的主题文件，如：你可以创建一个文件&lt;code class=&quot;highlighter-rouge&quot;&gt;_layouts/post.html&lt;/code&gt;, 则构建时会使用你创建的&lt;code class=&quot;highlighter-rouge&quot;&gt;_layout/post.html&lt;/code&gt;文件，而不会去theme中寻找该文件.&lt;/p&gt;

&lt;h3 id=&quot;liquid模板&quot;&gt;Liquid模板&lt;/h3&gt;

&lt;p&gt;可以在页面中使用Liquid模板，&lt;code class=&quot;highlighter-rouge&quot;&gt;.html&lt;/code&gt;和&lt;code class=&quot;highlighter-rouge&quot;&gt;.md&lt;/code&gt;中都可以使用，参考：&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jekyllrb.com/docs/liquid/&quot;&gt;Jekyll liquid&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://shopify.github.io/liquid/&quot;&gt;liquid&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://help.shopify.com/en/themes/liquid/basics&quot;&gt;liquid basics&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><author><name></name></author><summary type="html">Jekyll是用来构建静态网站的利器。Github Pages就是基于Jekyll的。</summary></entry><entry><title type="html">padavan固件路由器改hosts并重启dnsmasq</title><link href="http://rinkky.xyz/2019/padavan-hosts.html" rel="alternate" type="text/html" title="padavan固件路由器改hosts并重启dnsmasq" /><published>2019-06-29T00:00:00+00:00</published><updated>2019-06-29T00:00:00+00:00</updated><id>http://rinkky.xyz/2019/padavan-hosts</id><content type="html" xml:base="http://rinkky.xyz/2019/padavan-hosts.html">&lt;h3 id=&quot;问题&quot;&gt;问题&lt;/h3&gt;

&lt;p&gt;padavan固件，即老毛子固件/pdcn固件/华硕固件，如何修改hosts？如何重启dnsmasq使其立即生效?&lt;/p&gt;

&lt;h3 id=&quot;注意&quot;&gt;注意&lt;/h3&gt;

&lt;p&gt;padavan固件直接修改&lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/hosts&lt;/code&gt;的话，重启路由器之后会被覆盖，无法生效。&lt;/p&gt;

&lt;h3 id=&quot;方案&quot;&gt;方案&lt;/h3&gt;

&lt;p&gt;padavan固件使用了dnsmasq, 可以修改dnsmasq配置目录中的hosts文件，该文件位于&lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/storage/dnsmasq/hosts&lt;/code&gt;，重启路由器之后可以生效且不会被覆盖。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-hosts&quot;&gt;# hosts
127.0.0.1    example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果不想重启路由器，也可以输入shell命令&lt;code class=&quot;highlighter-rouge&quot;&gt;restart_dns&lt;/code&gt;使其立即生效。&lt;/p&gt;</content><author><name></name></author><summary type="html">问题</summary></entry><entry><title type="html">找到使xbox下载最快的IP</title><link href="http://rinkky.xyz/2019/06/29/xbox-download-hosts.html" rel="alternate" type="text/html" title="找到使xbox下载最快的IP" /><published>2019-06-29T00:00:00+00:00</published><updated>2019-06-29T00:00:00+00:00</updated><id>http://rinkky.xyz/2019/06/29/xbox-download-hosts</id><content type="html" xml:base="http://rinkky.xyz/2019/06/29/xbox-download-hosts.html">&lt;p&gt;最近吐槽xbox下载问题的人很多。
其实微软在国内是有服务器的，但是最近下载域名大概率会解析到国外，
一旦解析到国外，就会引起下载慢甚至无法下载的问题。因此，要解决下载问题，只需2步：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;找到最快的下载IP&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;将下载域名解析到该IP（修改hosts或dnsmasq等）&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这里只解决第1步，如何找到最佳下载IP.&lt;/p&gt;

&lt;p&gt;至于第2步，网上教程比较多，可根据自己的路由器型号自行搜索
（关键词：&lt;code class=&quot;highlighter-rouge&quot;&gt;路由器改hosts&lt;/code&gt;或&lt;code class=&quot;highlighter-rouge&quot;&gt;路由器 dnsmasq&lt;/code&gt;）。之后如果发现有必要，可能会单独写个教程。&lt;/p&gt;

&lt;p&gt;因为每个人的地理位置和运营商不同，所以最佳下载IP因人而异。
我也是最近才解决了下载问题，顺便写了个工具，找到最佳下载IP，所有网络运营商通用。&lt;/p&gt;

&lt;h3 id=&quot;工具下载地址&quot;&gt;工具下载地址：&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;github: &lt;a href=&quot;https://github.com/rinkky/xbox-download-host/releases/download/1.0/xbox.hosts.china.windows.v1.0.zip&quot;&gt;下载地址&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;百度网盘：&lt;a href=&quot;https://pan.baidu.com/s/14pMtEQY3Mrs-Lq_xn0fBzA&quot;&gt;下载地址&lt;/a&gt;  提取码： 8nww&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;使用方法&quot;&gt;使用方法：&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;下载之后，解压&lt;/li&gt;
  &lt;li&gt;运行“查找最快hosts.bat”&lt;/li&gt;
  &lt;li&gt;测速完成后，会在log目录生成最佳hosts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;log/hosts.txt文件保存了速度最快的hosts，文件格式如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-hosts&quot;&gt;###########Sun Jun 23 19:57:57 2019###########

60.210.22.168    assets1.xboxlive.com
111.161.120.228    assets2.xboxlive.com
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;log/speed.log文件保存了测速日志，文件格式如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-log&quot;&gt;###########Sun Jun 23 19:57:57 2019###########

42.81.100.252	0.0 MB/s
111.161.120.228	3.98 MB/s
61.240.136.46	0.0 MB/s
110.242.21.94	1.51 MB/s
60.210.22.168	11.15 MB/s

&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;至此，已经完成了第1步，找到了最佳下载IP.&lt;/p&gt;

&lt;p&gt;接下来的第2步，可以选择修改路由器hosts，或修改路由器dnsmasq（梅林或pdcn等路由器系统），或自建dns服务器。&lt;/p&gt;

&lt;h3 id=&quot;源码&quot;&gt;源码&lt;/h3&gt;

&lt;p&gt;源码在GitHub上，懂python的同学可以自行获取：
&lt;a href=&quot;https://github.com/rinkky/xbox-download-host&quot;&gt;github: xbox-download-host&lt;/a&gt;&lt;/p&gt;</content><author><name></name></author><summary type="html">最近吐槽xbox下载问题的人很多。 其实微软在国内是有服务器的，但是最近下载域名大概率会解析到国外， 一旦解析到国外，就会引起下载慢甚至无法下载的问题。因此，要解决下载问题，只需2步：</summary></entry><entry><title type="html">appium对于Android中浮窗PopupWindow的定位</title><link href="http://rinkky.xyz/2018/appium-popupwindow.html" rel="alternate" type="text/html" title="appium对于Android中浮窗PopupWindow的定位" /><published>2018-06-24T00:00:00+00:00</published><updated>2018-06-24T00:00:00+00:00</updated><id>http://rinkky.xyz/2018/appium-popupwindow</id><content type="html" xml:base="http://rinkky.xyz/2018/appium-popupwindow.html">&lt;p&gt;自动化测试时发现，安卓中某些浮窗无法通过uiautomator定位。在uiautomatorviewer中查看时，鼠标放置在相应位置会自动穿透过去，定位到下层窗口中的元素。这种情况下就算知道元素id，在自动化脚本中也无法查找到浮窗中的元素。&lt;/p&gt;

&lt;h3 id=&quot;原因&quot;&gt;原因&lt;/h3&gt;

&lt;p&gt;上述提到的浮窗类型是&lt;code class=&quot;highlighter-rouge&quot;&gt;PopupWindow&lt;/code&gt;，后来发现并不是所有的&lt;code class=&quot;highlighter-rouge&quot;&gt;PopupWindow&lt;/code&gt;都无法定位，只有在其&lt;code class=&quot;highlighter-rouge&quot;&gt;focusable&lt;/code&gt;属性设定为&lt;code class=&quot;highlighter-rouge&quot;&gt;false&lt;/code&gt;时才会定位不到。&lt;/p&gt;

&lt;h3 id=&quot;解决办法&quot;&gt;解决办法&lt;/h3&gt;

&lt;h4 id=&quot;办法1&quot;&gt;办法1：&lt;/h4&gt;
&lt;p&gt;既然只要&lt;code class=&quot;highlighter-rouge&quot;&gt;focusable&lt;/code&gt;设定为&lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt;就可以定位，最好的办法当然是让开发把用到的&lt;code class=&quot;highlighter-rouge&quot;&gt;PopupWindow&lt;/code&gt;的&lt;code class=&quot;highlighter-rouge&quot;&gt;focusable&lt;/code&gt;设定为&lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;办法2&quot;&gt;办法2：&lt;/h4&gt;
&lt;p&gt;但是某些情况下由于一些特殊的原因无法修改&lt;code class=&quot;highlighter-rouge&quot;&gt;PopupWindow.focusable&lt;/code&gt;，比如我们的APP中有一个&lt;code class=&quot;highlighter-rouge&quot;&gt;PopupWindow&lt;/code&gt;的&lt;code class=&quot;highlighter-rouge&quot;&gt;focusable&lt;/code&gt;设定为&lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt;之后会导致无法通过点击空白处关闭浮窗。这种情况下只能通过UI设计时的位置来确定想要操作的元素的坐标，通过&lt;code class=&quot;highlighter-rouge&quot;&gt;TouchAction&lt;/code&gt;对该坐标点进行相应操作。&lt;/p&gt;</content><author><name></name></author><category term="appium" /><summary type="html">自动化测试时发现，安卓中某些浮窗无法通过uiautomator定位。在uiautomatorviewer中查看时，鼠标放置在相应位置会自动穿透过去，定位到下层窗口中的元素。这种情况下就算知道元素id，在自动化脚本中也无法查找到浮窗中的元素。</summary></entry><entry><title type="html">appium中的点击、长按、滑动等屏幕操作</title><link href="http://rinkky.xyz/2018/appium-touchaction.html" rel="alternate" type="text/html" title="appium中的点击、长按、滑动等屏幕操作" /><published>2018-06-24T00:00:00+00:00</published><updated>2018-06-24T00:00:00+00:00</updated><id>http://rinkky.xyz/2018/appium-touchaction</id><content type="html" xml:base="http://rinkky.xyz/2018/appium-touchaction.html">&lt;h3 id=&quot;简述&quot;&gt;简述&lt;/h3&gt;

&lt;p&gt;appium中的屏幕操作是通过&lt;code class=&quot;highlighter-rouge&quot;&gt;TouchAction&lt;/code&gt;类来实现的，屏幕操作包括以下几种：&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;（以Python为例。其他语言的方法名不尽相同，但原理一样)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;主要：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;tap()&lt;/code&gt;：轻击，就是普通的点击操作。&lt;/p&gt;

  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;press()&lt;/code&gt;：按压，可以实现点击效果，但与&lt;code class=&quot;highlighter-rouge&quot;&gt;tap&lt;/code&gt;相比，&lt;code class=&quot;highlighter-rouge&quot;&gt;press&lt;/code&gt;可以实现一些后续操作。&lt;/p&gt;

  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;long_press()&lt;/code&gt;：长按。&lt;/p&gt;

  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;move_to()&lt;/code&gt;：移动。与我们实际用手指操作手机一样，移动之前需要先通过按压定位。所以移动一般是跟在按压或长按操作之后。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;其他：&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;release()&lt;/code&gt;结束操作。&lt;/p&gt;

  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;wait()&lt;/code&gt;等待，设定等待时间/操作时间。&lt;/p&gt;

  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;perform()&lt;/code&gt;执行操作，见下面例子。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;操作链&quot;&gt;操作链&lt;/h3&gt;

&lt;p&gt;通过把以上操作串联起来，形成一个操作链，如滑动需要先&lt;code class=&quot;highlighter-rouge&quot;&gt;press&lt;/code&gt;再&lt;code class=&quot;highlighter-rouge&quot;&gt;move_to&lt;/code&gt;然后&lt;code class=&quot;highlighter-rouge&quot;&gt;release&lt;/code&gt;. 例：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-Python&quot;&gt;from appium.webdriver.common.touch_action import TouchAction

def touch_test():
    actions = TouchAction()
    actions.press(x=100, y=300) # 类似手指按压屏幕的(100, 300)位置
    actions.move_to(x=100, y=100) # 移动手指到达(100, 100)位置
    actions.release() # 放开手指
    actions.perform() # 将上面3个操作串联起来，依次执行
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的例子所执行的操作为：&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;将手指放到(100, 300)位置&lt;/li&gt;
  &lt;li&gt;移动手指到(100, 100)位置&lt;/li&gt;
  &lt;li&gt;放开手指&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;注意&lt;code class=&quot;highlighter-rouge&quot;&gt;perform()&lt;/code&gt;，只有在&lt;code class=&quot;highlighter-rouge&quot;&gt;perform()&lt;/code&gt;的时候，上面的操作链才会真正执行。&lt;/p&gt;

&lt;p&gt;另外，由于&lt;code class=&quot;highlighter-rouge&quot;&gt;TouchAction&lt;/code&gt;中每个操作都会返回对象本身，所以上面的操作链也可以直接写成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Python&quot;&gt;    actions.press(x=100, y=300).move_to(x=100, y=100).release().perform()
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;定位&quot;&gt;定位&lt;/h3&gt;

&lt;p&gt;上面的例子使用的是坐标定位，也可以使用元素定位。如：&lt;/p&gt;

&lt;p&gt;手指从元素&lt;code class=&quot;highlighter-rouge&quot;&gt;el_0&lt;/code&gt;的位置滑动到元素&lt;code class=&quot;highlighter-rouge&quot;&gt;el_1&lt;/code&gt;的位置。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Python&quot;&gt;    actions.press(el_0).move_to(el_1).release().perform()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：这里的位置指的是&lt;strong&gt;滑动之前&lt;/strong&gt;元素的位置。&lt;/p&gt;

&lt;h3 id=&quot;控制滑动速度&quot;&gt;控制滑动速度&lt;/h3&gt;

&lt;p&gt;我们在操作触屏设备的时候有快速滑动和慢速滑动两种。快速滑动在快速翻页时用到，滑动行为结束后页面会根据惯性继续滑动一段距离；大多数情况下我们使用的都是慢速滑动。&lt;/p&gt;

&lt;p&gt;但是上述操作链只能实现快速滑动，无法控制滑动的速度。想要控制滑动速度，需要在操作链中加入&lt;code class=&quot;highlighter-rouge&quot;&gt;wait()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;通过实际测试，得出了下面的结论：&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;move_to的速度是根据其之前的操作时间来定的&lt;/li&gt;
  &lt;li&gt;press的时间是根据press之后的wait时间来定的&lt;/li&gt;
  &lt;li&gt;操作链&lt;code class=&quot;highlighter-rouge&quot;&gt;press().wait().move_to()&lt;/code&gt;中的move_to操作会在press后立即执行，不需要等待wait结束&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;不知道这几个结论说的清不清楚，不清楚也不用在这纠结，直接看例子：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-Python&quot;&gt;    actions.press(el_0).wait(1000).move_to(el_1).release().perform()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个操作链的意思是，手指触摸&lt;code class=&quot;highlighter-rouge&quot;&gt;el_0&lt;/code&gt;，然后从&lt;code class=&quot;highlighter-rouge&quot;&gt;el_0&lt;/code&gt;的位置滑动到&lt;code class=&quot;highlighter-rouge&quot;&gt;el_1&lt;/code&gt;的位置，整个过程用时1000ms. 这样就实现了慢速滑动。&lt;/p&gt;

&lt;p&gt;另外，也可以通过&lt;code class=&quot;highlighter-rouge&quot;&gt;long_press&lt;/code&gt;实现慢速滑动&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Python&quot;&gt;    actions.long_press(el_0).wait(1000).move_to(el_1).release().perform()
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;appium-python-client的内置方法&quot;&gt;appium python client的内置方法&lt;/h3&gt;

&lt;p&gt;appium的python客户端的driver中内置了几个方法，可以直接使用：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;scroll(el0, el1)&lt;/code&gt;：快速滑动；通过元素定位滑动的起点和终点。&lt;/p&gt;

  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;drag_and_drop(el0, el1)&lt;/code&gt;：慢速滑动，通过元素定位滑动的起点和终点。&lt;/p&gt;

  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;swipe(x, y, time)&lt;/code&gt;：滑动，可设定滑动的时间；通过坐标定位滑动的起点和终点。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Python&quot;&gt;import appium
#...
    driver = appium.webdriver.Remote(url, opts)
    el0 = driver.find_element_by_id(id0)
    el0 = driver.find_element_by_id(id1)
    driver.drag_and_drop(el0, el1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;drag_and_drop&lt;/code&gt;字面意思是拖拽和释放，触摸操作中的拖拽和释放操作，其实就是慢速滑动(或许叫做定位滑动更合适，总之，就是在滑动结束后不让页面根据惯性继续移动)。&lt;/p&gt;</content><author><name></name></author><category term="appium" /><summary type="html">简述</summary></entry></feed>