-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
205 lines (121 loc) · 49.2 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>寒夏汢</title>
<link href="/atom.xml" rel="self"/>
<link href="https://hanxiatu.com/"/>
<updated>2019-07-22T15:29:01.114Z</updated>
<id>https://hanxiatu.com/</id>
<author>
<name>寒夏汢</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Conan(五):Uploading Packages</title>
<link href="https://hanxiatu.com/post/201907/Conan_Uploading_Packages.html"/>
<id>https://hanxiatu.com/post/201907/Conan_Uploading_Packages.html</id>
<published>2019-07-22T15:28:56.000Z</published>
<updated>2019-07-22T15:29:01.114Z</updated>
<content type="html"><![CDATA[<h2 id="0x0-Remotes"><a href="#0x0-Remotes" class="headerlink" title="0x0 Remotes"></a>0x0 Remotes</h2><p><strong>可供选择的server</strong><br>For private develepment</p><ul><li>Artifactory Community Edition for C/C++ (详见<a href="http://hanxiatu.com/post/201907/Conan_localrepo.html">Conan(二):使用Artifactory搭建私仓</a>)</li><li>Artifactory Pro</li><li>Conan server</li></ul><p>For distribution</p><ul><li><a href="https://docs.conan.io/en/latest/uploading_packages/using_bintray.html#using-bintray" target="_blank" rel="noopener">Bintray</a></li></ul><h2 id="0x1-上传包到-Remotes"><a href="#0x1-上传包到-Remotes" class="headerlink" title="0x1 上传包到 Remotes"></a>0x1 上传包到 Remotes</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">conan remote list</span><br><span class="line"></span><br><span class="line">conan remote add my_local_server http://localhost:9300</span><br><span class="line"></span><br><span class="line">conan search [xxx] -r=my_local_server</span><br><span class="line"></span><br><span class="line">conan upload xxx --all -r=my_local_server</span><br></pre></td></tr></table></figure><h2 id="0x2-参考链接"><a href="#0x2-参考链接" class="headerlink" title="0x2 参考链接"></a>0x2 参考链接</h2><ol><li><a href="https://docs.conan.io/en/latest/uploading_packages.html" target="_blank" rel="noopener">Conan:Uploading Packages</a></li></ol>]]></content>
<summary type="html">
Conan
</summary>
<category term="Conan" scheme="https://hanxiatu.com/categories/Conan/"/>
<category term="C/C++" scheme="https://hanxiatu.com/tags/C-C/"/>
<category term="包管理" scheme="https://hanxiatu.com/tags/%E5%8C%85%E7%AE%A1%E7%90%86/"/>
</entry>
<entry>
<title>Conan(四):Creating Packages</title>
<link href="https://hanxiatu.com/post/201907/Conan_Creating_Packages.html"/>
<id>https://hanxiatu.com/post/201907/Conan_Creating_Packages.html</id>
<published>2019-07-21T15:27:39.000Z</published>
<updated>2019-07-21T15:32:29.347Z</updated>
<content type="html"><![CDATA[<h2 id="0x0-Creating-Packaging"><a href="#0x0-Creating-Packaging" class="headerlink" title="0x0 Creating Packaging"></a>0x0 Creating Packaging</h2><h3 id="创建recipe"><a href="#创建recipe" class="headerlink" title="创建recipe"></a>创建recipe</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ conan new xx</span><br><span class="line">$ 编辑 conanfile.py</span><br></pre></td></tr></table></figure><p><a href="https://docs.conan.io/en/latest/reference/conanfile.html#conanfile-reference" target="_blank" rel="noopener">conanfile.py 语法</a></p><p><strong>源码和recipe的组织方式</strong><br>||方式1|方式2|<br>|—|—|—|<br>|同仓|<a href="https://docs.conan.io/en/latest/reference/conanfile/attributes.html#exports-sources" target="_blank" rel="noopener">exports_sources</a>=’src/*’ |<a href="https://docs.conan.io/en/latest/reference/conanfile/attributes.html#scm-attribute" target="_blank" rel="noopener">scm attribute</a>||不同仓|<a href="https://docs.conan.io/en/latest/reference/conanfile/methods.html#source" target="_blank" rel="noopener">source()</a>|<a href="https://docs.conan.io/en/latest/reference/conanfile/attributes.html#scm-attribute" target="_blank" rel="noopener">scm attribute</a>|</p><p><strong>Packaging Existing Binaries</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conan export-pkg xx</span><br></pre></td></tr></table></figure><h3 id="创建和测试Packages"><a href="#创建和测试Packages" class="headerlink" title="创建和测试Packages"></a>创建和测试Packages</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ conan create . demo/testing</span><br></pre></td></tr></table></figure><p><strong>如上命令相当于执行(一个完整的测试过程)</strong></p><ul><li>将 <code>conanfile.py</code> 拷贝到本地缓存</li><li>从源码构建并安装包</li><li>进入test_package目录,创建一个临时的构建目录</li><li>执行 <code>conan install ..</code>, 安装 <code>test_package/conanfile.py</code>的依赖(就是我们要测试的包)</li><li>构建和执行,即调用 <code>test_package/conanfile.py</code> 的 <code>build()</code> 和 <code>test()</code> </li></ul><p><em>注:这里的测试只是测试package是否被正确创建</em></p><h2 id="0x1-Understanding-Packaging"><a href="#0x1-Understanding-Packaging" class="headerlink" title="0x1 Understanding Packaging"></a>0x1 Understanding Packaging</h2><p><strong>每个recipe在本地缓存定义了5个重要目录</strong></p><ul><li><code>export</code>: 存放recipe的目录.</li><li><code>export_source</code>: 存放由属性<code>exports_sources</code>定义的源码</li><li><code>source</code>: 存放由函数<code>source()</code>定义的源码.</li><li><code>build</code>: 编译目录,为不同的配置创建不同的子目录</li><li><code>package</code>: 存放最终二进制的目录,为不同的配置创建不同的子目录</li></ul><p><strong>执行流程</strong><br><img src="Conan_Creating_Packages/package_create_flow.jpg" alt="package_create_flow"></p><ul><li>将<code>exports_sources</code>,<code>export</code>,<code>source()</code>定义的源码均copy到本地缓存的<code>source/</code>目录下。(注意源码一般只有一套,如果需要为不同的配置定制资源,则应该将源码收集的逻辑从source()函数挪到build()函数)</li><li>根据配置信息(settings、options)生成package-id(SHA-1 hash),创建对应子目录并执行build()函数</li><li>执行package()函数,将<code>build/hashXXX</code>中生成的二进制拷贝到<code>package/hashXXX</code></li><li>执行package_info()函数,收集待使用的信息,如<code>conanbuildinfo.cmake</code></li><li><code>imports</code> feature触发将二进制从本地换成拷贝到使用者的目录 </li></ul><h2 id="0x2-ABI"><a href="#0x2-ABI" class="headerlink" title="0x2 ABI"></a>0x2 ABI</h2><p><strong>One recipe -> N binary packages</strong><br>依赖于如下三个因素:</p><ul><li>settings</li><li>options</li><li>requires 默认遵从<a href="https://semver.org/" target="_blank" rel="noopener">Semantic Versioning</a> 的设定</li></ul><p><strong>self.info.xx</strong><br>通过 <code>self.info.xx</code> 定制settings、options、requires信息,来控制 <code>package_id()</code> 返回的Package ID。例如:</p><ul><li>self.info.settings.xx</li><li>self.info.options.xx</li><li>self.info.requires or self.info.requires[xx],其中可配置的模式如下表</li></ul><table><thead><tr><th>Modes/Variables</th><th>name</th><th>version</th><th>user</th><th>channel</th><th>package_id</th><th>RREV</th><th>PREV</th></tr></thead><tbody><tr><td>semver_direct_mode()</td><td>Yes</td><td>Yes, only > 1.0.0 (e.g., 1.2.Z+b102)</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>semver_mode()</td><td>Yes</td><td>Yes, only > 1.0.0 (e.g., 1.2.Z+b102)</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>major_mode()</td><td>Yes</td><td>Yes (e.g., 1.2.Z+b102)</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>minor_mode()</td><td>Yes</td><td>Yes (e.g., 1.2.Z+b102)</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>patch_mode()</td><td>Yes</td><td>Yes (e.g., 1.2.3+b102)</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>base_mode()</td><td>Yes</td><td>Yes (e.g., 1.7+b102)</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>full_version_mode()</td><td>Yes</td><td>Yes (e.g., 1.2.3+b102)</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>full_recipe_mode()</td><td>Yes</td><td>Yes (e.g., 1.2.3+b102)</td><td>Yes</td><td>Yes</td><td>No</td><td>No</td><td>No</td></tr><tr><td>full_package_mode()</td><td>Yes</td><td>Yes (e.g., 1.2.3+b102)</td><td>Yes</td><td>Yes</td><td>Yes</td><td>No</td><td>No</td></tr><tr><td>unrelated_mode()</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td>recipe_revision_mode()</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>No</td></tr><tr><td>package_revision_mode()</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td>## 0x3 参考链接</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>1. <a href="https://docs.conan.io/en/latest/creating_packages.html" target="_blank" rel="noopener">Conan:Creating Packages</a></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></tbody></table>]]></content>
<summary type="html">
Conan
</summary>
<category term="Conan" scheme="https://hanxiatu.com/categories/Conan/"/>
<category term="C/C++" scheme="https://hanxiatu.com/tags/C-C/"/>
<category term="包管理" scheme="https://hanxiatu.com/tags/%E5%8C%85%E7%AE%A1%E7%90%86/"/>
</entry>
<entry>
<title>Conan(三):Using packages</title>
<link href="https://hanxiatu.com/post/201907/Conan_using_packages.html"/>
<id>https://hanxiatu.com/post/201907/Conan_using_packages.html</id>
<published>2019-07-06T15:04:11.000Z</published>
<updated>2019-07-20T05:23:03.236Z</updated>
<content type="html"><![CDATA[<h2 id="0x0-Installing-dependencies"><a href="#0x0-Installing-dependencies" class="headerlink" title="0x0 Installing dependencies"></a>0x0 Installing dependencies</h2><h3 id="在conanfile-txt中定义"><a href="#在conanfile-txt中定义" class="headerlink" title="在conanfile.txt中定义"></a>在conanfile.txt中定义</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"># <NAME>/<VERSION>@<USER>/<CHANNEL></span><br><span class="line">[requires]</span><br><span class="line">Poco/1.9.0@pocoproject/stable</span><br></pre></td></tr></table></figure><h3 id="执行-canan-install"><a href="#执行-canan-install" class="headerlink" title="执行 canan install"></a>执行 canan install</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conan install [path of conanfile.txt]</span><br></pre></td></tr></table></figure><p><img src="Conan_using_packages/install_flow.png" alt="install_flow"></p><p><strong>install的过程</strong></p><ul><li>检查本地cache中是否有该package recipe。</li><li>如果在本地cache中未找到该pacakge recipe,则到定义的remotes中查找该package recipe(默认是conan-center,在前面的文章中还添加了一个本地的remote : conan-local)</li><li>如果找到对应的recipe,客户端则下载recipe,并存储到本地cache</li><li>依据 <code>recipe + input settings (Linux, GCC)</code>, 在本地cache查找对应的binary.</li><li>如果在本地cache中未找到对应binary,则到remotes中查找并下载。</li><li>最后,使用定义 generators 为build system生成适当的文件,例如<code>conanbuildinfo.cmake</code></li></ul><p><strong>conan install 从conan-center下载</strong></p><p><img src="Conan_using_packages/download.png" alt="download"></p><p><strong>conan install 生成的文件</strong></p><p><img src="Conan_using_packages/generate_file.png" alt="generate_file"></p><ul><li>conanbuildinfo.cmake<br>由Generator(本例使用的是cmake)产生,定义一些变量及方法,可供user的CMakeLists.txt使用</li><li>conanbuildinfo.txt<br>描述性信息,方便程序员查看</li><li><a href="https://docs.conan.io/en/latest/reference/conanfile_txt.html" target="_blank" rel="noopener">conaninfo.txt</a><br>Reference for <code>conanfile.txt</code> sections: requires, generators, etc.</li><li>graph_info.json</li></ul><p><strong>已cache后,执行conan install的效果</strong></p><p><img src="Conan_using_packages/already_installed.png" alt="already_installed"></p><h3 id="transitive-dependencies的处理"><a href="#transitive-dependencies的处理" class="headerlink" title="transitive dependencies的处理"></a>transitive dependencies的处理</h3><ul><li>demo工程显示依赖Poco</li><li>Poco依赖OpenSSL</li><li>OpenSSL依赖zlib<br>在执行canon install的过程中所以依赖都被处理<br><img src="Conan_using_packages/trasitive_dependencies.png" alt="transitive dependencies"></li></ul><p><strong>override dependencies</strong></p><ol><li><p>修改conanfile.txt,显示依赖: OpenSSL/1.0.2p@conan/stable</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[requires]</span><br><span class="line">Poco/1.9.0@pocoproject/stable</span><br><span class="line">OpenSSL/1.0.2p@conan/stable</span><br></pre></td></tr></table></figure></li><li><p>使用 conan info [path of conanfile.txt] –graph=file.html 查看变化</p></li></ol><ul><li><p>log</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">WARN: Poco/1.9.0@pocoproject/stable requirement OpenSSL/1.0.2o@conan/stable overridden by your conanfile to OpenSSL/1.0.2p@conan/stable</span><br></pre></td></tr></table></figure></li><li><p>dependencies<br><img src="Conan_using_packages/trasitive_dependencies_override.png" alt="transitive dependencies_override"></p></li></ul><h2 id="0x1-更多定制化选择"><a href="#0x1-更多定制化选择" class="headerlink" title="0x1 更多定制化选择"></a>0x1 更多定制化选择</h2><h3 id="settings-vs-options"><a href="#settings-vs-options" class="headerlink" title="settings vs options"></a>settings vs options</h3><p><strong>二者的区别</strong></p><ul><li>settings 是project-wide configuration</li><li>options 是package specific configuration</li></ul><p><strong>settings的使用</strong></p><p>可配置settings属性定义在 <code>.conan/settings.yml</code></p><p>一般可以在.conan/profiles/default中编辑默认的settings信息</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[settings]</span><br><span class="line">os=Linux</span><br><span class="line">os_build=Linux</span><br><span class="line">arch=x86_64</span><br><span class="line">arch_build=x86_64</span><br><span class="line">compiler=gcc</span><br><span class="line">compiler.version=7</span><br><span class="line">compiler.libcxx=libstdc++11</span><br><span class="line">build_type=Release</span><br></pre></td></tr></table></figure><p>也可以在命令中指定</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ conan install . --settings arch=x86</span><br></pre></td></tr></table></figure><p><strong>options的使用</strong></p><p>一般可以在recipe中配置</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[requires]</span><br><span class="line">Poco/1.9.0@pocoproject/stable</span><br><span class="line"></span><br><span class="line">[generators]</span><br><span class="line">cmake</span><br><span class="line"></span><br><span class="line">[options]</span><br><span class="line">Poco:shared=True # PACKAGE:OPTION=VALUE</span><br><span class="line">OpenSSL:shared=True</span><br></pre></td></tr></table></figure><p>也可以在命令中指定</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ conan install .. -o Poco:shared=True -o OpenSSL:shared=True</span><br><span class="line"># or even with wildcards, to apply to many packages</span><br><span class="line">$ conan install .. -o *:shared=True</span><br></pre></td></tr></table></figure><h3 id="profiles"><a href="#profiles" class="headerlink" title="profiles"></a>profiles</h3><p><strong>用途</strong><br>profile可用来定制 <code>settings</code>, <code>options</code>, <code>environment variables</code>, 和 <code>build_requires</code>,例如:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[settings]</span><br><span class="line">setting=value</span><br><span class="line"></span><br><span class="line">[options]</span><br><span class="line">MyLib:shared=True</span><br><span class="line"></span><br><span class="line">[env]</span><br><span class="line">env_var=value</span><br><span class="line"></span><br><span class="line">[build_requires]</span><br><span class="line">Tool1/0.1@user/channel</span><br><span class="line">Tool2/0.1@user/channel, Tool3/0.1@user/channel</span><br><span class="line">*: Tool4/0.1@user/channel</span><br></pre></td></tr></table></figure><p><strong>编辑和定制</strong><br>一般有一个默认的profile : <code>~/.conan/profiles/default</code><br>也可以通过命令指定自定义的profile文件:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ conan install . -pr=debug_shared</span><br></pre></td></tr></table></figure><p>而且可以同时指定多个profile文件:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ conan install . -pr=./poco_clang_3.5 -pr=my_build_tool1 -pr=my_build_tool2</span><br></pre></td></tr></table></figure><h3 id="workflow"><a href="#workflow" class="headerlink" title="workflow"></a>workflow</h3><p>可以通过 <code>--install-folder</code> 或 <code>-if</code> 指定build(放输出的地方)目录。这样不同配置的build之间可以做到隔离。官网给的例子:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ git clone https://github.com/memsharded/example-poco-timer</span><br><span class="line">$ conan install example-poco-timer -s build_type=Debug -if example-poco-build/debug</span><br><span class="line">$ conan install example-poco-timer -s build_type=Release -if example-poco-build/release</span><br></pre></td></tr></table></figure><p>生成的目录结构</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">example-poco-build</span><br><span class="line"> debug</span><br><span class="line"> conaninfo.txt</span><br><span class="line"> conanbuildinfo.txt</span><br><span class="line"> conanbuildinfo.cmake</span><br><span class="line"> CMakeCache.txt # and other cmake files</span><br><span class="line"> release</span><br><span class="line"> conaninfo.txt</span><br><span class="line"> conanbuildinfo.txt</span><br><span class="line"> conanbuildinfo.cmake</span><br><span class="line"> CMakeCache.txt # and other cmake files</span><br><span class="line">example-poco-timer</span><br><span class="line"> CMakeLists.txt # If using cmake, but can be Makefile, sln...</span><br><span class="line"> LICENSE</span><br><span class="line"> README.md</span><br><span class="line"> conanfile.txt</span><br><span class="line"> timer.cpp</span><br></pre></td></tr></table></figure><p>debug 和 release的输出文件是隔离的,不会形成冲突,另外clean也很方便。</p><h2 id="0x2-参考链接"><a href="#0x2-参考链接" class="headerlink" title="0x2 参考链接"></a>0x2 参考链接</h2><ol><li><p><a href="https://docs.conan.io/en/latest/getting_started.html#installing-dependencies" target="_blank" rel="noopener">Conan: Get Started / installing-dependencies</a></p></li><li><p><a href="https://docs.conan.io/en/latest/using_packages.html" target="_blank" rel="noopener">Conan: Using packages</a></p></li></ol>]]></content>
<summary type="html">
Conan
</summary>
<category term="Conan" scheme="https://hanxiatu.com/categories/Conan/"/>
<category term="C/C++" scheme="https://hanxiatu.com/tags/C-C/"/>
<category term="包管理" scheme="https://hanxiatu.com/tags/%E5%8C%85%E7%AE%A1%E7%90%86/"/>
</entry>
<entry>
<title>Conan(二):使用Artifactory搭建私仓</title>
<link href="https://hanxiatu.com/post/201907/Conan_localrepo.html"/>
<id>https://hanxiatu.com/post/201907/Conan_localrepo.html</id>
<published>2019-07-04T17:17:11.000Z</published>
<updated>2019-07-20T05:23:25.436Z</updated>
<content type="html"><![CDATA[<h2 id="0x0-安装本地Artifactory服务"><a href="#0x0-安装本地Artifactory服务" class="headerlink" title="0x0 安装本地Artifactory服务"></a>0x0 安装本地Artifactory服务</h2><ol><li><p>下载jfrog-artifactory-cpp-ce-6.8.15.zip<br><a href="https://bintray.com/jfrog/product/JFrog-Artifactory-Cpp-CE/view" target="_blank" rel="noopener">https://bintray.com/jfrog/product/JFrog-Artifactory-Cpp-CE/view</a></p></li><li><p>启动服务</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">(win)</span><br><span class="line">$ 解压 jfrog-artifactory-cpp-ce-6.8.15.zip</span><br><span class="line">$ cd artifactory-cpp-ce-6.8.15/bin</span><br><span class="line">$ artifactory.bat</span><br><span class="line"></span><br><span class="line">(linux)</span><br><span class="line">$ 解压 jfrog-artifactory-cpp-ce-6.8.15.zip</span><br><span class="line">$ cd artifactory-cpp-ce-6.8.15/bin</span><br><span class="line">$ ./artifactory.sh</span><br></pre></td></tr></table></figure></li></ol><p><em>注:<br>需要配置JAVA_HOME、JRE_HOME, 否则可以启动失败,如报错“java执行失败”。注意,在windows如果自己安装了java,可将系统默认安装的卸载掉,这样方便设置 JAVA_HOME和JRE_HOME</em></p><ol start="3"><li>登陆查看 <a href="http://localhost:8081/artifactory" target="_blank" rel="noopener">http://localhost:8081/artifactory</a></li></ol><h2 id="0x1-配置"><a href="#0x1-配置" class="headerlink" title="0x1 配置"></a>0x1 配置</h2><ul><li><p>默认账户<br>账号:<code>admin</code><br>密码:<code>password</code></p></li><li><p>配置conan仓库(服务启动之后,按照网页提示操作)<br><img src="Conan_localrepo/conan_create_repo.png" alt="create conan仓库"></p></li></ul><ul><li><p>To add the repository to your conan CLI</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">conan remote add <REMOTE> http://localhost:8081/artifactory/api/conan/conan-local</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">例如:</span><br><span class="line">conan remote add connan_linux http://localhost:8081/artifactory/api/conan/conan-local</span><br></pre></td></tr></table></figure></li><li><p>To login use the conan user command</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">conan user -p <PASSWORD> -r <REMOTE> <USERNAME></span><br><span class="line"></span><br><span class="line">例如:</span><br><span class="line">conan user -p password -r connan_linux admin</span><br></pre></td></tr></table></figure></li></ul><h2 id="0x2-创建demo-amp-构建-amp-上传"><a href="#0x2-创建demo-amp-构建-amp-上传" class="headerlink" title="0x2 创建demo & 构建 & 上传"></a>0x2 创建demo & 构建 & 上传</h2><ul><li><p>创建demo&构建</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">conan new <NAME>/<VERSION> -t</span><br><span class="line">例如:</span><br><span class="line">conan new Hello/0.1 -t</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">conan create . <USER>/<CHANNEL></span><br><span class="line">例如:</span><br><span class="line">conan create . demo/testing</span><br></pre></td></tr></table></figure></li><li><p>deploy</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">conan upload <recipe> -r <REMOTE> --all</span><br><span class="line"></span><br><span class="line"><recipe> 格式: <NAME>/<VERSION>@<USER>/<CHANNEL></span><br><span class="line"></span><br><span class="line">例如:</span><br><span class="line">conan upload Hello/0.1@demo/testing --all -r=connan_linux</span><br></pre></td></tr></table></figure></li></ul><h3 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h3><p><img src="Conan_localrepo/conan_create_upload_result.png" alt="提交效果"></p><h2 id="0x3-参考链接"><a href="#0x3-参考链接" class="headerlink" title="0x3 参考链接"></a>0x3 参考链接</h2><ol><li><p><a href="https://jfrog.com/blog/announcing-jfrog-artifactory-community-edition-c-c/" target="_blank" rel="noopener">https://jfrog.com/blog/announcing-jfrog-artifactory-community-edition-c-c/</a></p></li><li><p><a href="https://www.cnblogs.com/rongfengliang/p/9229462.html" target="_blank" rel="noopener">https://www.cnblogs.com/rongfengliang/p/9229462.html</a></p></li></ol>]]></content>
<summary type="html">
Conan
</summary>
<category term="Conan" scheme="https://hanxiatu.com/categories/Conan/"/>
<category term="C/C++" scheme="https://hanxiatu.com/tags/C-C/"/>
<category term="包管理" scheme="https://hanxiatu.com/tags/%E5%8C%85%E7%AE%A1%E7%90%86/"/>
</entry>
<entry>
<title>Conan(一):初识Conan(C/C++包管理器)</title>
<link href="https://hanxiatu.com/post/201907/Conan_overview.html"/>
<id>https://hanxiatu.com/post/201907/Conan_overview.html</id>
<published>2019-07-04T14:49:11.000Z</published>
<updated>2019-07-22T15:05:52.212Z</updated>
<content type="html"><![CDATA[<h2 id="0x0-Introduction-amp-Install"><a href="#0x0-Introduction-amp-Install" class="headerlink" title="0x0 Introduction & Install"></a>0x0 Introduction & Install</h2><p>Conan is OSS, with an MIT license.</p><p>Conan项目有如下几个值得关注的地方:</p><ol><li>分布式包管理(Decentralized package manager)</li></ol><p><img src="Conan_overview/conan_decentralized_pm.png" alt="Decentralized package manager"></p><table><thead><tr><th>Server</th><th>场景</th><th>特点</th></tr></thead><tbody><tr><td>Conan server</td><td>private</td><td>Conan client&server都是OSS, MIT license,可随意修改使用</td></tr><tr><td>JFrog Artifactory</td><td>private</td><td>更好的服务</td></tr><tr><td>JFrog Bintray</td><td>public</td><td>共享</td></tr></tbody></table><ol start="2"><li>二进制的管理方法(Binary Manage)</li></ol><ul><li>服务端是一对多的模式:<code>recipe + binaries</code></li><li>使用者获取 “recipe + 适合的binary”<br><img src="Conan_overview/conan_binary_manage.png" alt="Binary Manage"></li></ul><ol start="3"><li>跨平台&支持多种构建系统(Cross platform, build system agnostic)</li></ol><ul><li>os(compiler) + arch</li><li>Conan可以和任意一种build system配合使用。常用的如Cmake</li></ul><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install conan</span><br></pre></td></tr></table></figure><h2 id="0x1-Get-Started-以Cmake为例"><a href="#0x1-Get-Started-以Cmake为例" class="headerlink" title="0x1 Get Started (以Cmake为例)"></a>0x1 Get Started (以Cmake为例)</h2><ol><li><p>准备一个基本的工程</p></li><li><p>准备conanfile.txt¶</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[requires]</span><br><span class="line">Poco/1.9.0@pocoproject/stable</span><br><span class="line"></span><br><span class="line">[generators]</span><br><span class="line">cmake</span><br></pre></td></tr></table></figure></li><li><p>conna install <conanfile.txt path></p></li><li><p>CMakeLists.txt 集成上一步的输出 : conanbuildinfo.cmake</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)</span><br><span class="line">conan_basic_setup()</span><br></pre></td></tr></table></figure></li><li><p>Cmake config & build</p></li></ol><h2 id="0x2-参考链接"><a href="#0x2-参考链接" class="headerlink" title="0x2 参考链接"></a>0x2 参考链接</h2><ol><li><a href="https://docs.conan.io/en/latest/introduction.html" target="_blank" rel="noopener">Conan : Introduction</a></li><li><a href="https://docs.conan.io/en/latest/installation.html" target="_blank" rel="noopener">Conan : Install</a></li><li><a href="https://docs.conan.io/en/latest/getting_started.html" target="_blank" rel="noopener">Conan : Get Started</a></li><li><a href="https://jenkins.io/blog/2017/07/07/jenkins-conan/" target="_blank" rel="noopener">Continuous Integration for C/C++ Projects with Jenkins and Conan</a></li></ol>]]></content>
<summary type="html">
Conan
</summary>
<category term="Conan" scheme="https://hanxiatu.com/categories/Conan/"/>
<category term="C/C++" scheme="https://hanxiatu.com/tags/C-C/"/>
<category term="包管理" scheme="https://hanxiatu.com/tags/%E5%8C%85%E7%AE%A1%E7%90%86/"/>
</entry>
<entry>
<title>MeshView</title>
<link href="https://hanxiatu.com/post/201906/MeshView.html"/>
<id>https://hanxiatu.com/post/201906/MeshView.html</id>
<published>2019-06-19T13:11:00.000Z</published>
<updated>2019-07-20T05:24:03.912Z</updated>
<content type="html"><![CDATA[<h2 id="0x0-必备知识"><a href="#0x0-必备知识" class="headerlink" title="0x0 必备知识"></a>0x0 必备知识</h2><p> 阅读本文之前,读者最好具备一定的OpenGL的开发背景,并了解OpenGL渲染流程。学习资源可以参考:</p><ul><li><a href="https://learnopengl.com/" target="_blank" rel="noopener">Learn OpenGL</a></li><li><a href="http://www.songho.ca/opengl/index.html" target="_blank" rel="noopener">OpenGL - Song Ho Ahn</a></li></ul><h2 id="0x1-背景介绍"><a href="#0x1-背景介绍" class="headerlink" title="0x1 背景介绍"></a>0x1 背景介绍</h2><p> 在项目开发中,经常需要开发一些炫酷的3D效果。在Android系统上,通常来说可以通过系统提供的OpenGL的java接口来实现(如GLES20.java)。android系统并提供了GLSurfaceView等一套框架机制,直接帮助开发者将gl环境准备好,开发者剩下的工作就是建立模型(model)、设计着色算法(shader)。但是GLSurfaceView整套机制相对来说还是比较重型(独立的gl渲染线程),功耗也比较大。然而有这么一些非常简单的3D特效,直接嵌入在用户交互界面里,对功耗的要求尽量要低,这个时候采用GLSrufaceView那套机制并不合适。</p><p> 经过一些调研,发现android原生的接口Canvas.drawBitmapMesh提供的能力可以帮助实现在任意view上的3D效果。本文介绍的内容就是:如果将OpengGL中建模以及渲染流程的知识和接口Canvas.drawBitmapMesh结合起来,并开发一个小的“渲染引擎”,将这种能力基线化。</p><p> <strong>示例</strong> </p><p><img src="MeshView/face_guide.gif" alt="face_guide"> <img src="MeshView/num_picker.gif" alt="num_picker"></p><h2 id="0x2-原理介绍"><a href="#0x2-原理介绍" class="headerlink" title="0x2 原理介绍"></a>0x2 原理介绍</h2><h3 id="Mesh原理"><a href="#Mesh原理" class="headerlink" title="Mesh原理"></a>Mesh原理</h3><p><img src="MeshView/mesh_example.png" alt="mesh"></p><h3 id="Canvas-drawBitmapMesh"><a href="#Canvas-drawBitmapMesh" class="headerlink" title="Canvas.drawBitmapMesh"></a>Canvas.drawBitmapMesh</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"> /**</span><br><span class="line"> * Draw the bitmap through the mesh, where mesh vertices are evenly distributed across the</span><br><span class="line"> * bitmap. There are meshWidth+1 vertices across, and meshHeight+1 vertices down. The verts</span><br><span class="line"> * array is accessed in row-major order, so that the first meshWidth+1 vertices are distributed</span><br><span class="line"> * across the top of the bitmap from left to right. A more general version of this method is</span><br><span class="line"> * drawVertices().</span><br><span class="line"> *</span><br><span class="line"> * Prior to API level {@value Build.VERSION_CODES#P} vertOffset and colorOffset were ignored,</span><br><span class="line"> * effectively treating them as zeros. In API level {@value Build.VERSION_CODES#P} and above</span><br><span class="line"> * these parameters will be respected.</span><br><span class="line"> *</span><br><span class="line"> * @param bitmap The bitmap to draw using the mesh</span><br><span class="line"> * @param meshWidth The number of columns in the mesh. Nothing is drawn if this is 0</span><br><span class="line"> * @param meshHeight The number of rows in the mesh. Nothing is drawn if this is 0</span><br><span class="line"> * @param verts Array of x,y pairs, specifying where the mesh should be drawn. There must be at</span><br><span class="line"> * least (meshWidth+1) * (meshHeight+1) * 2 + vertOffset values in the array</span><br><span class="line"> * @param vertOffset Number of verts elements to skip before drawing</span><br><span class="line"> * @param colors May be null. Specifies a color at each vertex, which is interpolated across the</span><br><span class="line"> * cell, and whose values are multiplied by the corresponding bitmap colors. If not</span><br><span class="line"> * null, there must be at least (meshWidth+1) * (meshHeight+1) + colorOffset values</span><br><span class="line"> * in the array.</span><br><span class="line"> * @param colorOffset Number of color elements to skip before drawing</span><br><span class="line"> * @param paint May be null. The paint used to draw the bitmap</span><br><span class="line"> */</span><br><span class="line">public void drawBitmapMesh(@NonNull Bitmap bitmap, int meshWidth, int meshHeight,</span><br><span class="line"> @NonNull float[] verts, int vertOffset, @Nullable int[] colors, int colorOffset,</span><br><span class="line"> @Nullable Paint paint) {</span><br><span class="line"> super.drawBitmapMesh(bitmap, meshWidth, meshHeight, verts, vertOffset, colors, colorOffset,</span><br><span class="line"> paint);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li><code>bitmap</code>:类似于gl中的texture</li><li><code>meshWidth</code>:网格纵切的数目</li><li><code>meshHeight</code>:网格横切的数目</li><li><code>verts</code>:类似于gl中的vertex array</li><li><code>vertOffset</code></li><li><code>colors</code>:可用来模拟mask(未demo测试)</li><li><code>colorOffset</code></li><li><code>paint</code></li></ul><h3 id="OpenGl的建模和渲染过程"><a href="#OpenGl的建模和渲染过程" class="headerlink" title="OpenGl的建模和渲染过程"></a>OpenGl的建模和渲染过程</h3><p>OpenGL中vertex transformation:</p><p><img src="MeshView/vertex_render_process.png" alt="vertex_render_process"></p><p>对应的计算过程:</p><p><img src="MeshView/vertex_render_calculate.png" alt="vertex_render_calculate"></p><p>通常来讲,通过OpenGL开放的接口,实现3D效果(不考虑着色),需要提供:</p><ul><li>local space建模数据:即vertex array in local space</li><li>MVP matrix:Model matrix, View matrix, Project matrix</li><li>视窗:即viewport</li></ul><h2 id="0x3-工程实践简介"><a href="#0x3-工程实践简介" class="headerlink" title="0x3 工程实践简介"></a>0x3 工程实践简介</h2><p><strong>OpenGL流程和MeshiView实践对比</strong></p><ol><li>OpengGL的流程<br><img src="MeshView/gl_render_outline.png" alt="gl_render_outline"><br>可以看到在android的OpenGL开发过程中,数据的处理过程是黑盒的(即Not visible to developer),开发人员只需要传入这个几方面的数据:</li></ol><ul><li>Vertex Model : Local space 对3D物体建模之后的顶点数据 & modle matrix</li><li>viewport :通过GLES.glviewport设置</li><li>view matrix: 通过Matrix - GLES20系列接口传递(setLookAtM)</li><li>projection matrix: 通过Matrix - GLES20系列接口传递(orthoM、frustumM、perspectiveM)</li></ul><ol start="2"><li>MeshView实践<br><img src="MeshView/meshview_render_outline.png" alt="meshview_render_outline"><br>因为Mesh并不走传统的android的OpenGL的流程,所以GLES20的接口都不会被使用,所以需要做如下工作</li></ol><ul><li>Vertex Model:同OpenGL</li><li>viewport、setLookAt、ortho、frustum、perspective 等接口</li><li>使用内部私有方法@Method:mesh实现 vertex * MVP(其实在OpenGL中一般实在vertex shader中实现,可以灵活实现,但基本上就是vertex * MVP)</li><li>将准备好的verts传递给Canvas.drawBitmapMesh处理</li></ul><p><strong>模拟接口对比</strong></p><table><thead><tr><th>提供的接口</th><th>对应模拟的android系统接口</th></tr></thead><tbody><tr><td>MeshObject.viewport</td><td>android.opengl.GLES20.glviewport</td></tr><tr><td>MeshObject.ortho</td><td>android.opengl.Matrix.orthoM</td></tr><tr><td>MeshObject.frustum</td><td>android.opengl.Matrix.frustumM</td></tr><tr><td>MeshObject.perspective</td><td>android.opengl.Matrix.perspectiveM</td></tr><tr><td>MeshObject.setLookAt</td><td>android.opengl.Matrix.setLookAtM</td></tr></tbody></table><p><strong>核心计算方法</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">private Vec3 mesh(Vec4 vert, float[] mvpMatrix) {</span><br><span class="line"> float[] from = new float[] {vert.x, vert.y, vert.z, vert.w};</span><br><span class="line"> float[] to = new float[4];</span><br><span class="line"> Matrix.multiplyMV(to,0, mvpMatrix,0, from,0);</span><br><span class="line"></span><br><span class="line"> Vec4 clip = new Vec4(to[0], to[1], to[2], to[3]);</span><br><span class="line"></span><br><span class="line"> Vec4 ndc = new Vec4(clip.x/clip.w, clip.y/clip.w, clip.z/clip.w, 1.0f);</span><br><span class="line"></span><br><span class="line"> ViewPort viewPort = getViewPort();</span><br><span class="line"> float x = viewPort.x;</span><br><span class="line"> float y = viewPort.y;</span><br><span class="line"> float w = viewPort.w;</span><br><span class="line"> float h = viewPort.h;</span><br><span class="line"> float n = viewPort.n;</span><br><span class="line"> float f = viewPort.f;</span><br><span class="line"></span><br><span class="line"> float wx = w/2 * (ndc.x + 1) + x;</span><br><span class="line"> float wy = h/2 * (ndc.y + 1) + y;</span><br><span class="line"> float wz = (f - n)/2 * ndc.z + (f + n)/2;</span><br><span class="line"></span><br><span class="line"> return new Vec3(wx, wy, wz);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><em><code>注:抱歉,完整的工程因个人原因已从github删除。只保留如上最核心的函数。</code></em></p><h2 id="0x4-遗留问题"><a href="#0x4-遗留问题" class="headerlink" title="0x4 遗留问题"></a>0x4 遗留问题</h2><ul><li><p>目前只是简单的模拟了OpenGL背后的渲染流程,一些高级特性不具备。例如利用深度信息判断点的前后关系并裁剪的能力不具备。这样就要求使用者精确建模,避免出现有不同深度信息的点,否者绘制顺序无法保证最前面的点被后绘制(看到的现象就是物体背后的信息发生了穿透)</p><p>例如下图中,右边的示例底部发生了穿透现象。</p></li></ul><p><img src="MeshView/calendar_3d_ok.png" alt="ok"> <img src="MeshView/calendar_3d_error.png" alt="error"></p><ul><li>目前本篇博客细节介绍的并不详细,待完善</li></ul>]]></content>
<summary type="html">
\[android\] use drawBitmapMesh to get 3D effect
</summary>
<category term="Graphic" scheme="https://hanxiatu.com/categories/Graphic/"/>
<category term="Android" scheme="https://hanxiatu.com/tags/Android/"/>
<category term="OpengGL" scheme="https://hanxiatu.com/tags/OpengGL/"/>
<category term="Graphic" scheme="https://hanxiatu.com/tags/Graphic/"/>
</entry>
<entry>
<title>友情链接</title>
<link href="https://hanxiatu.com/post/link.html"/>
<id>https://hanxiatu.com/post/link.html</id>
<published>2019-06-18T03:30:24.000Z</published>
<updated>2019-07-22T14:49:34.809Z</updated>
<content type="html"><![CDATA[<h2 id="互粉"><a href="#互粉" class="headerlink" title="互粉"></a>互粉</h2><table><thead><tr><th>名称</th><th>描述</th></tr></thead><tbody><tr><td><a href="https://geektutu.com" target="_blank" rel="noopener">极客兔兔</a></td><td>geek,本站所使用的主题的作者</td></tr><tr><td><a href="https://hutusi.com" target="_blank" rel="noopener">hutusi</a></td><td>文艺青年和技术男的完美结合</td></tr></tbody></table>]]></content>
<summary type="html">
寒夏汢的友情链接
</summary>
<category term="友链" scheme="https://hanxiatu.com/tags/%E5%8F%8B%E9%93%BE/"/>
</entry>
<entry>
<title>关于我</title>
<link href="https://hanxiatu.com/post/about.html"/>
<id>https://hanxiatu.com/post/about.html</id>
<published>2019-06-18T03:18:24.000Z</published>
<updated>2019-07-07T03:36:38.171Z</updated>
<content type="html"><![CDATA[<h2 id="个人介绍"><a href="#个人介绍" class="headerlink" title="个人介绍"></a>个人介绍</h2><p>博主网名寒夏汢,毕业于中科大计算机系(0711),就职于华为上海研究所。</p><p>对本站的任何问题都可以直接在文章下进行评论。</p><p>也可以通过<code>[email protected]</code> 或 <code>[email protected]</code> 联系我。</p><p>为了节省双方的宝贵时间,作如下几点声明:</p><ul><li>邮件会尽量回复,不能做到有问必答。</li><li>请尽量在邮件中将需求或问题叙述清楚。</li></ul><h2 id="版权说明"><a href="#版权说明" class="headerlink" title="版权说明"></a>版权说明</h2><p>若无特别声明,本站文章欢迎链接分享,但禁止全文转载,本站保留一切权利。</p><h2 id="支持本站"><a href="#支持本站" class="headerlink" title="支持本站"></a>支持本站</h2><p>坚持探索、尝试新技术,并作总结并不是一件容易的事情,如能对您有所帮助,我感到非常高兴。</p><p>如果觉得本站文章还不错,欢迎收藏&分享给小伙伴。</p><p>本站使用主题<a href="https://github.com/geektutu/hexo-theme-geektutu" target="_blank" rel="noopener">hexo-theme-geektutu</a>,为<a href="https://geektutu.com/" target="_blank" rel="noopener">极客兔兔</a>开发并开源,请不要吝惜您的Star!</p>]]></content>
<summary type="html">
寒夏汢的小站,致力于分享一些技术教程和有趣的技术实践。
</summary>
<category term="关于我" scheme="https://hanxiatu.com/tags/%E5%85%B3%E4%BA%8E%E6%88%91/"/>
</entry>
</feed>