-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
234 lines (135 loc) · 63.4 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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>自留地</title>
<subtitle>瞎哔哔.....</subtitle>
<link href="https://nsdont.tech/atom.xml" rel="self"/>
<link href="https://nsdont.tech/"/>
<updated>2024-04-26T07:37:03.883Z</updated>
<id>https://nsdont.tech/</id>
<author>
<name>NSDont</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>Spring Boot @Valid 未生效排查清单</title>
<link href="https://nsdont.tech/2024/04/26/SpringBoot-Valid-%E6%9C%AA%E7%94%9F%E6%95%88%E6%8E%92%E6%9F%A5/"/>
<id>https://nsdont.tech/2024/04/26/SpringBoot-Valid-%E6%9C%AA%E7%94%9F%E6%95%88%E6%8E%92%E6%9F%A5/</id>
<published>2024-04-26T07:18:00.000Z</published>
<updated>2024-04-26T07:37:03.883Z</updated>
<content type="html"><![CDATA[<h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><p>这篇文章主要给大家介绍了关于 Spring Boot 中 @Valid 注解不生效的排查清单。</p><span id="more"></span><h1 id="可能一:依赖配置"><a href="#可能一:依赖配置" class="headerlink" title="可能一:依赖配置"></a>可能一:依赖配置</h1><p>一开始使用了 <code>spring-boot-starter-validation</code>,升级之后无效了,可能是缺少了 <code>hibernate-validator</code> 依赖。原因是 <code>Spring Boot</code> 2.3 之后,官方就移除了其中包含的 <code>hibernate-validator</code> 依赖。</p><p>需要手动增加下面的依赖</p><figure class="highlight xml"><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"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.hibernate.validator<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>hibernate-validator<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>6.1.5.Final<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><h1 id="可能二:嵌套对象"><a href="#可能二:嵌套对象" class="headerlink" title="可能二:嵌套对象"></a>可能二:嵌套对象</h1><p>如果是嵌套对象的话,里面的对象还要添加 @Valid注解,有问题的代码案例如下:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><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"><span class="meta">@Operation(summary = "我是 swagger api 接口说明")</span></span><br><span class="line"><span class="meta">@PostMapping("/frontapi/v1/foo")</span></span><br><span class="line"><span class="keyword">public</span> StandardHttpResponse<String> <span class="title function_">update</span><span class="params">(</span></span><br><span class="line"><span class="params"> <span class="meta">@Valid</span> <span class="meta">@RequestBody</span> CommonListRequest<UpdateRequest> request)</span> {</span><br><span class="line"> ...</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CommonListRequest</span><T> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@NotEmpty</span></span><br><span class="line"> <span class="meta">@Schema(description = "业务数据")</span></span><br><span class="line"> <span class="meta">@Size(min = 1, max = 1000)</span></span><br><span class="line"> <span class="keyword">private</span> List<T> data;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">UpdateRequest</span> {</span><br><span class="line"> <span class="meta">@NotEmpty</span></span><br><span class="line"> <span class="meta">@Schema(description = "配置", example = "{}")</span></span><br><span class="line"> <span class="keyword">private</span> String flowConfigWithNode;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>验证命令</p><figure class="highlight bash"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 模拟 flowConfigWithNode key 填错,无报错</span></span><br><span class="line">curl -X <span class="string">"POST"</span> <span class="string">"http://127.0.0.1:8080/frontapi/v1/foo"</span> \</span><br><span class="line"> -H <span class="string">'Content-Type: application/json'</span> \</span><br><span class="line"> -d $<span class="string">'{</span></span><br><span class="line"><span class="string"> "data": [</span></span><br><span class="line"><span class="string"> {</span></span><br><span class="line"><span class="string"> "flowConfigWithNodes": "{}"</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string"> ]</span></span><br><span class="line"><span class="string">}'</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 模拟 data key 填错,有报错</span></span><br><span class="line">curl -X <span class="string">"POST"</span> <span class="string">"http://127.0.0.1:8080/frontapi/v1/foo"</span> \</span><br><span class="line"> -H <span class="string">'Content-Type: application/json'</span> \</span><br><span class="line"> -d $<span class="string">'{</span></span><br><span class="line"><span class="string"> "dataa: [</span></span><br><span class="line"><span class="string"> {</span></span><br><span class="line"><span class="string"> "flowConfigWithNode": "{}"</span></span><br><span class="line"><span class="string"> }</span></span><br><span class="line"><span class="string"> ]</span></span><br><span class="line"><span class="string">}'</span></span><br></pre></td></tr></table></figure><p>正确的代码, 调整 <code>CommonListRequest</code> 即可,在 data 属性上增加 <code>@Valid</code> 注解即可。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CommonListRequest</span><T> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Valid</span></span><br><span class="line"> <span class="meta">@NotNull</span></span><br><span class="line"> <span class="meta">@Schema(description = "业务数据")</span></span><br><span class="line"> <span class="meta">@Size(min = 1, max = 1000)</span></span><br><span class="line"> <span class="keyword">private</span> List<T> data;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><p>这篇文章主要给大家介绍了关于 Spring Boot 中 @Valid 注解不生效的排查清单。</p></summary>
<category term="Java" scheme="https://nsdont.tech/categories/Java/"/>
<category term="SpringBoot" scheme="https://nsdont.tech/tags/SpringBoot/"/>
<category term="Validator" scheme="https://nsdont.tech/tags/Validator/"/>
</entry>
<entry>
<title>Wireshark 如何抓取数据并分析</title>
<link href="https://nsdont.tech/2019/09/17/Wireshark_%E6%8A%93%E5%8F%96%E6%95%B0%E6%8D%AE/"/>
<id>https://nsdont.tech/2019/09/17/Wireshark_%E6%8A%93%E5%8F%96%E6%95%B0%E6%8D%AE/</id>
<published>2019-09-17T13:53:23.000Z</published>
<updated>2024-04-26T07:09:05.920Z</updated>
<content type="html"><![CDATA[<h2 id="一、如何使用-tcpdump-抓取数据"><a href="#一、如何使用-tcpdump-抓取数据" class="headerlink" title="一、如何使用 tcpdump 抓取数据"></a>一、如何使用 tcpdump 抓取数据</h2><p>我们使用 <code>tcpdump</code> 来进行抓取数据。<br>下面是一个命令案例:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tcpdump -i <net_name> host <ip> -w <ip>.pcap</span><br></pre></td></tr></table></figure><span id="more"></span><p>首先,net_name 是执行命令所在机器的网卡名称,一般来说使用 ip a, ifconfig 之类的命令获取,如下图就是使用 ifconfig 的返回结果,我们可以看到 <code>10.1.1.14</code> 对应的网卡名称是 <code>eth0</code>。<br><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/15687291476608.jpg"></p><p>接着就是 <code>ip</code>,<code>ip</code> 就是与当前机器有网络交互的机器<code>ip</code>。比如有一台机器 <code>10.1.1.15</code> 开放了 <code>80</code> 端口的服务,我们想要抓取 <code>10.1.1.14</code> 访问 <code>10.1.1.15</code> 的 80 所产生的数据,就执行下面的命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tcpdump -i eth0 host 10.1.1.14 -w 10.1.1.14.pcap</span><br></pre></td></tr></table></figure><h2 id="二、使用-Wireshark-进行数据分析"><a href="#二、使用-Wireshark-进行数据分析" class="headerlink" title="二、使用 Wireshark 进行数据分析"></a>二、使用 Wireshark 进行数据分析</h2><p>使用 Wireshark 打开上面得到 10.1.1.14.pcap 文件</p><h3 id="通过-url-来过滤"><a href="#通过-url-来过滤" class="headerlink" title="通过 url 来过滤"></a>通过 url 来过滤</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http.request.full_uri contains "users"</span><br></pre></td></tr></table></figure><h3 id="通过-http-body-来过滤"><a href="#通过-http-body-来过滤" class="headerlink" title="通过 http body 来过滤"></a>通过 http body 来过滤</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tcp contains "username"</span><br></pre></td></tr></table></figure><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ol><li><a href="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/Wireshark_Display_Filters.pdf">过滤器案例手册</a></li></ol>]]></content>
<summary type="html"><h2 id="一、如何使用-tcpdump-抓取数据"><a href="#一、如何使用-tcpdump-抓取数据" class="headerlink" title="一、如何使用 tcpdump 抓取数据"></a>一、如何使用 tcpdump 抓取数据</h2><p>我们使用 <code>tcpdump</code> 来进行抓取数据。<br>下面是一个命令案例:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tcpdump -i &lt;net_name&gt; host &lt;ip&gt; -w &lt;ip&gt;.pcap</span><br></pre></td></tr></table></figure></summary>
<category term="Network" scheme="https://nsdont.tech/categories/Network/"/>
<category term="Wireshark" scheme="https://nsdont.tech/tags/Wireshark/"/>
</entry>
<entry>
<title>Python 3 拯救 python</title>
<link href="https://nsdont.tech/2016/07/19/Python-3-%E6%8B%AF%E6%95%91-python/"/>
<id>https://nsdont.tech/2016/07/19/Python-3-%E6%8B%AF%E6%95%91-python/</id>
<published>2016-07-19T01:35:11.000Z</published>
<updated>2024-04-26T07:10:11.025Z</updated>
<content type="html"><![CDATA[<blockquote><p>翻译自:<a href="https://medium.com/@opinionbreaker/python-3-can-revive-python-2a7af4788b10#.2a0ao5xj6">https://medium.com/@opinionbreaker/python-3-can-revive-python-2a7af4788b10#.2a0ao5xj6</a></p></blockquote><p>我阅读了 certain Stephen A 的一篇<a href="http://blog.thezerobit.com/2014/05/25/python-3-is-killing-python.html">文章</a>. 讲解了 “Python 3 是如何杀死 Python”.</p><p>他有一些可信的理由,但是我不同意 Python 3 会杀死 Python, 尽管现在 Python 的局面并不好.</p><hr><span id="more"></span><p>“但也许每一次的危机都是一次机会”,一段用烂的座右铭.</p><p><strong>也许 Python 3 能使 Python 浴火重生.</strong></p><p>你看,这不仅仅是 Python 2 向 Python 3 迁移的问题. 我们现在并不是 2005 年, 并且新的程序员并没有与任一个版本的 Python 留下深刻印象. 当然, 有很多 Python 功能,但话又说回来, Java 的工作机会更多. 还有以前有许多 Perl 工作, 现在我并没有听到他们做的很好. 我不是在讨论工作的数量或者 GitHub 的仓库数量. 我想说的是占有率和激情, 我知道这些都有点主观, 但是我感觉 Python 在这两个方面有所缺乏但为时未晚.</p><p>比如,我们看到很多人从 Python 转向 Go.</p><p>同样,他们也不是很多, 但他们相当直接 (包括创业公司开发团队在博客上面发布更换整个技术栈), 还有人有一定的影响力 (令人惊讶的有罗勃·派克, 谁能预估有多少人从 C/C++ 转向 Go).</p><hr><p>Python 面临着来自各方面的竞争. 有些竞争出现在 Python 的热门领域 (例如新的异步项目, 更喜欢使用 Go 而不是 Twisted, Rails 依旧统治着 Web 框架), 与效仿者竞争特定领域 (例如 Julia 在科学计算), 还有综合力竞争(Clojure, Groovy, Javascript, Dart, 等等).</p><hr><p>因此,这是我关于 Python 3 的看法. 一个简单的方法:</p><p><strong>让它引人注目.</strong></p><p>Python 3 已经不兼容 Python2 了. 不喜欢 Python 3 都成群结队的迁移走了, 所以新增一些不兼容的修改不仅不会伤害到它, 还会使它更好.</p><p>认真的说,如果 Python3 有足够诱人的新特性, 更多的用户会迁移到这里 (至少对于新的项目来说), 还有更多的人会将 Python 2 的项目或库移植过来. 最后, 据我看来, Python 3 足以吸引那些目前未使用 Python 的人.</p><hr><p>在你看来, Python 3 是一个无聊的更新.</p><p>当然, 它使语言更加连贯和修复了一些长期存在的问题和苦恼. 但它并没有做好充足的准备. 话又说回来, Python3 的横向兼容和路线图做的更好和严禁. 哎, Javascript 如果没有在那个时候流行起来. YouTube 就不会存在了. 这是很早以前的事情了.</p><p>现在比如合适的闭包, 变量不变性, 好的异步构思, 等等, 这些是现在的黑客优先考虑的功能.</p><hr><p>不提将来, 长话短说; 这里有一些事情可能让今天的黑客对 Python 3 感兴趣。拿我来<br>说,这些事情引起了我的兴趣:</p><hr><ol><li><p>移除GIL. 或者提供一个更好的异步构思. 也许有可能 Guido 提出 PEP 3156. 类似 Go 的 Channel 这种原语也不错.</p></li><li><p>加速 Python. 认真的说, 如果 Javascript 可能变得更快, CPython 也可以变得更快. 或者 PyPy 成熟到可以成熟到替换它 (应该只有这一个). 如果需要花大价钱或 Lars Bak 可以这么做, 开始动起来把 — 我会作出贡献. 各个大公司也将做出贡献. 会不会是 Dropbox 将会花大代价将 Python 在 LLVM 上面重构?</p></li><li><p>添加更多类型. 那么, 新加入的类型. 让你可以用它来加速一些代码的运行 (就像 Cython), 或提供注解和帮助类型检查(就像 Dart). 给标准库的每一个方法、类都加上类型注解.</p></li><li><p>修改标准库. 让一个团队一起去修改长期的问题, 提高修改速度和修复错误. 提高自己的 API, 然后提供简单、漂亮、常用的接口 (比如 requests vs urllib) 一起加入到标准库里面, 使用命名空间区别. 可以很容易地切换(也许还包括一些自动化工具)。</p></li><li><p>重构 REPL. 现在已经是 2014 年了. 将 REPL 以现代的方式重做. 添加一些颜色. 从 IPython 学习. 做成 Client/Server 的形式, 让 IDE 和编辑器更好的嵌入它.</p></li></ol><hr><p>因此, Python 3 的开发人员, 利用好你们的时间. 好了, 没有太多的时间. 也许, 3 - 4年. 我们已经等了 10 年的 ES6, 我们等它花一半的时间, 然后为你服务.</p><p>它现在并没有让任何人将 Python 3 用到各种地方, 所以需要一定的机会, 打破现在的局面, 尽早发布和交付. 让社区热闹起来.</p><p>你看,Python 3 不是真的杀了 Python. 但是有可能从现在把它拯救出来。</p><hr><p>附:你怎么看?你能想到的东西,另外,你有想到额外的事情可以使 Python 3 中更诱人吗?或者有什么新的特性让你饥渴难耐?</p>]]></content>
<summary type="html"><blockquote>
<p>翻译自:<a href="https://medium.com/@opinionbreaker/python-3-can-revive-python-2a7af4788b10#.2a0ao5xj6">https://medium.com/@opinionbreaker/python-3-can-revive-python-2a7af4788b10#.2a0ao5xj6</a></p>
</blockquote>
<p>我阅读了 certain Stephen A 的一篇<a href="http://blog.thezerobit.com/2014/05/25/python-3-is-killing-python.html">文章</a>. 讲解了 “Python 3 是如何杀死 Python”.</p>
<p>他有一些可信的理由,但是我不同意 Python 3 会杀死 Python, 尽管现在 Python 的局面并不好.</p>
<hr></summary>
<category term="Python" scheme="https://nsdont.tech/categories/Python/"/>
</entry>
<entry>
<title>[Tips] Git 忽略目录里的文件但不忽略目录的办法</title>
<link href="https://nsdont.tech/2016/05/06/Tips-Git-%E5%BF%BD%E7%95%A5%E7%9B%AE%E5%BD%95%E9%87%8C%E7%9A%84%E6%96%87%E4%BB%B6%E4%BD%86%E4%B8%8D%E5%BF%BD%E7%95%A5%E7%9B%AE%E5%BD%95%E7%9A%84%E5%8A%9E%E6%B3%95/"/>
<id>https://nsdont.tech/2016/05/06/Tips-Git-%E5%BF%BD%E7%95%A5%E7%9B%AE%E5%BD%95%E9%87%8C%E7%9A%84%E6%96%87%E4%BB%B6%E4%BD%86%E4%B8%8D%E5%BF%BD%E7%95%A5%E7%9B%AE%E5%BD%95%E7%9A%84%E5%8A%9E%E6%B3%95/</id>
<published>2016-05-06T09:15:15.000Z</published>
<updated>2024-04-26T07:09:20.874Z</updated>
<content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>我在开发时候遇到一个问题,关于图片上传接口, 默认情况下,Python 代码是不会自动创建文件的,如果想要把图片保存到某个目录下面,需要事先检查是否有这个目录结构,否则就会报错。<br>但是纠结的那颗心,我😭拒绝写检查文件夹是否存在的代码。</p><p>所以有了这篇文章。</p><span id="more"></span><h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><p>长话短说,我发现了简单两个方法来达到我的目的。</p><h3 id="方法一:巧妙的修改配置文件"><a href="#方法一:巧妙的修改配置文件" class="headerlink" title="方法一:巧妙的修改配置文件"></a>方法一:巧妙的修改配置文件</h3><p>gitignore 的用法可以看下面的链接,放出我的 gitignore 配置文件。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">media/*.*</span><br><span class="line">media/images/*.*</span><br><span class="line">media/avatar/*.*</span><br></pre></td></tr></table></figure><p><code>*.*</code> 代表要忽略 <code>a.b</code> 这种形式的文件,然后我们在 media,media/images, media/avatar 下面都加上 .gitkeep 这个文件,这样子我们就可以把这个三个文件夹都添加到 git 里面了。</p><p>注:这里的 .gitkeep 也可以是别的文件名,比如 .iwantit、.iloveyou, 我使用 gitkeep, 纯属个人喜好。 </p><h3 id="方法二:强制提交"><a href="#方法二:强制提交" class="headerlink" title="方法二:强制提交"></a>方法二:强制提交</h3><p>这个就比较狂野了,先放配置文件。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">media/</span><br></pre></td></tr></table></figure><p>代表忽略 <code>media</code> 下面所有的文件。</p><p>然后开始强制提交:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git add -f media/.gitkeep</span><br><span class="line">git add -f media/images/.gitkeep</span><br><span class="line">git add -f media/avatar/.gitkeep</span><br></pre></td></tr></table></figure><p>done.</p><p>记得 commit。</p><h2 id="相关链接"><a href="#相关链接" class="headerlink" title="相关链接"></a>相关链接</h2><p><a href="http://www.jianshu.com/p/a078cf2fd9b0">【git】.gitignore用法 - 简书</a></p>]]></content>
<summary type="html"><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>我在开发时候遇到一个问题,关于图片上传接口, 默认情况下,Python 代码是不会自动创建文件的,如果想要把图片保存到某个目录下面,需要事先检查是否有这个目录结构,否则就会报错。<br>但是纠结的那颗心,我😭拒绝写检查文件夹是否存在的代码。</p>
<p>所以有了这篇文章。</p></summary>
<category term="Cheat" scheme="https://nsdont.tech/categories/Cheat/"/>
<category term="Git" scheme="https://nsdont.tech/tags/Git/"/>
</entry>
<entry>
<title>Select2 如何实现多选</title>
<link href="https://nsdont.tech/2016/05/06/select2-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E9%80%89/"/>
<id>https://nsdont.tech/2016/05/06/select2-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%A4%9A%E9%80%89/</id>
<published>2016-05-06T08:41:22.000Z</published>
<updated>2024-04-26T07:09:26.458Z</updated>
<content type="html"><![CDATA[<blockquote><p>Selete2 默认不支持多选。</p></blockquote><h2 id="先看成果:"><a href="#先看成果:" class="headerlink" title="先看成果:"></a>先看成果:</h2><p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/select2mulitchoicedemo.gif" alt="演示图"></p><span id="more"></span><h2 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h2><p>监控两个事件( select, unselect),覆写显示结果 ( templateResult )。</p><ol><li>选中某个元素,就会创建一个同样内容的 option。<figure class="highlight javascript"><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">$eventSelect.<span class="title function_">on</span>(<span class="string">"select2:select"</span>, <span class="keyword">function</span> (<span class="params">e</span>) { </span><br><span class="line"> $eventSelect.<span class="title function_">append</span>(<span class="string">'<option value="'</span>+e.<span class="property">params</span>.<span class="property">data</span>.<span class="property">text</span>+<span class="string">'">'</span> +e.<span class="property">params</span>.<span class="property">data</span>.<span class="property">text</span> + <span class="string">'</option>'</span>);</span><br><span class="line">});</span><br></pre></td></tr></table></figure></li><li>在 templateResult 显示具体的元素时,检查 <code>obj.element.selected</code>, 如果为 true, 就直接不显示。<figure class="highlight javascript"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">formatResultData</span> (data) {</span><br><span class="line"> <span class="keyword">if</span> (!data.<span class="property">id</span>) <span class="keyword">return</span> data.<span class="property">text</span>;</span><br><span class="line"> <span class="keyword">if</span> (data.<span class="property">element</span>.<span class="property">selected</span>) <span class="keyword">return</span></span><br><span class="line"> <span class="keyword">return</span> data.<span class="property">text</span>;</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line">$eventSelect.<span class="title function_">select2</span>({</span><br><span class="line"> <span class="attr">templateResult</span>: formatResultData,</span><br><span class="line"> <span class="attr">tags</span>: <span class="literal">true</span>}</span><br><span class="line">);</span><br></pre></td></tr></table></figure></li><li>取消选中某个元素时,就直接删除该 option。<figure class="highlight javascript"><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">$eventSelect.<span class="title function_">on</span>(<span class="string">"select2:unselect"</span>, <span class="keyword">function</span> (<span class="params">e</span>) { </span><br><span class="line"> e.<span class="property">params</span>.<span class="property">data</span>.<span class="property">element</span>.<span class="title function_">remove</span>();</span><br><span class="line">});</span><br></pre></td></tr></table></figure></li></ol><h2 id="最终的代码"><a href="#最终的代码" class="headerlink" title="最终的代码"></a>最终的代码</h2><p><a href="https://jsfiddle.net/nsdont/pu6yhbxy/4/">jsfiddle 代码</a></p><h2 id="相关链接"><a href="#相关链接" class="headerlink" title="相关链接"></a>相关链接</h2><p><a href="https://select2.github.io/examples.html#events">官方 event 事件文档</a><br><a href="https://github.com/select2/select2/issues/3341">how to allow duplicate selections · Issue #3341 · select2/select2</a></p>]]></content>
<summary type="html"><blockquote>
<p>Selete2 默认不支持多选。</p>
</blockquote>
<h2 id="先看成果:"><a href="#先看成果:" class="headerlink" title="先看成果:"></a>先看成果:</h2><p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/select2mulitchoicedemo.gif" alt="演示图"></p></summary>
<category term="FrontEnd" scheme="https://nsdont.tech/categories/FrontEnd/"/>
<category term="Select2" scheme="https://nsdont.tech/tags/Select2/"/>
</entry>
<entry>
<title>[译] 如何在 Hacker News 上发布文章</title>
<link href="https://nsdont.tech/2016/03/29/%E8%AF%91-%E5%A6%82%E4%BD%95%E5%9C%A8-Hacker-News-%E4%B8%8A%E5%8F%91%E5%B8%83%E6%96%87%E7%AB%A0/"/>
<id>https://nsdont.tech/2016/03/29/%E8%AF%91-%E5%A6%82%E4%BD%95%E5%9C%A8-Hacker-News-%E4%B8%8A%E5%8F%91%E5%B8%83%E6%96%87%E7%AB%A0/</id>
<published>2016-03-29T07:48:50.000Z</published>
<updated>2024-04-26T07:09:14.397Z</updated>
<content type="html"><![CDATA[<blockquote><p>翻译自: <a href="https://wiredcraft.com/blog/how-to-post-on-hacker-news/">https://wiredcraft.com/blog/how-to-post-on-hacker-news/</a></p></blockquote><p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/hackernews.png" alt="hacker-news"></p><p>当我们为 <a href="http://devo.ps/">devo.ps</a> 和 <a href="https://wiredcraft.com/">Wiredcraft</a> 的部分产品工作时, 我创建了一份内部的市场营销指南(我们现在公开了)。指南里面的某一条建议被我们发布到 Hacker News 上。有几个朋友让我把整篇指南分享出来,所以我决定要把它发布在博客里。<br> <span id="more"></span><br>请注意这些都是我们在18月以前做的,我们现在已经改变了。不管怎么说,请看这里:</p><ul><li><strong>在美国时间早上 8 点钟发布</strong>。如果错过了这个机会(最晚 8点20分),那就等一天或者一周时间。</li><li><strong>每周三发布</strong>。周末发布更容易上头条,但那是周三是 HN 的流量高峰(更容易被更多人看到)。</li><li><strong>有一个好的标题</strong>。这意味更容易被人记住,使用大写和尽可能的使用俚语(举个例子,’sh*t’ 如果出现在标题里,能让话题保持更好活跃度。)</li><li><strong>有观点输出</strong>。对某事强烈的意见将有足于增加读者的阅读量和讨论量,更容易被赞。</li><li><strong>与 HN 主题 相关联</strong>。HN 是黑客和企业家组成的社区,所以无论是一篇关于创业、技术或者与其相关联的生活信息都会引起这群人的兴趣。</li><li>现在有一对规则关于 HN 上点赞的规则:<ul><li><strong>一个 IP 地址只能点一次赞</strong>。这意味者我们在一个 IP 地址下面点赞(比如同一个办公室,同一家咖啡厅), 将不被统计。我们应该使用不同的 IP 来进行点赞。</li><li><strong>直接用链接打开文章是不能点赞的</strong>。比如后面的这个链接(<a href="http://news.ycombinator.com/item?id=5200847%EF%BC%89">http://news.ycombinator.com/item?id=5200847)</a>, 直接用这个链接打开页面,将不能点赞。只能从<a href="http://news.ycombinator.com/newest">最新信息页</a>和<a href="http://news.ycombinator.com/">首页</a>找到相应文章进入,才能点赞。</li></ul></li><li>了解下面几个规则,你就知道如何在 HN 上进行有准备的文章发布了:<ul><li>准备标题和原始链接,不要使用短链接。</li><li>在提交完成,就分享要 HN 的最新文章页面(<a href="http://news.ycombinator.com/newest%EF%BC%89%E5%88%86%E4%BA%AB%E5%88%B0%E7%A4%BE%E4%BA%A4%E7%BD%91%E7%BB%9C">http://news.ycombinator.com/newest)分享到社交网络</a>(Twitter, GTalk), 使用聊天工具呼叫你的朋友来点赞。<code>修改</code>:多次实践后,我不推荐这样做了。HN 会识别出这种行为(如果你的朋友都给你点赞)从而禁止点赞.</li><li>如果你上了头条,修改你之前分享出去的链接,改为首页(<a href="http://news.ycombinator.com/%EF%BC%89">http://news.ycombinator.com/)</a>.</li><li>如果你的团队要集体点赞,就要使用无关联的设备或者网络。(比如使用手机或者在家里点赞)</li></ul></li></ul><p>HN 并不关心你的文档来自哪里或者你是谁,它只关心你被点赞的速度。如果头条上面其它的文章点赞数不高,那你并不需要拿到很多点赞数就能上头条。从这里开始,就会像滚雪球一样快速积累起来。</p><p>但是,要注意,这只是一个<code>临时的提升</code>, 您可能会在一天内看到成干上万的游客浏览这篇文章。但是,很会就会消失,转化率也非常糟糕。</p><h2 id="相关资源"><a href="#相关资源" class="headerlink" title="相关资源"></a>相关资源</h2><ul><li><a href="https://wiredcraft.com/blog/how-to-post-on-hacker-news/">如何上 Hacker News 的头条(1 天 4 条链接)</a></li><li><a href="http://alexstechthoughts.com/post/29406022580/how-to-get-on-the-frontpage-of-hacker-news">如何获得 Hacker News 的头条</a></li><li><a href="http://hnpickup.appspot.com/">HNPickup</a> 提供了一些 HN 的活跃指标以及如何获得推荐,</li></ul>]]></content>
<summary type="html"><blockquote>
<p>翻译自: <a href="https://wiredcraft.com/blog/how-to-post-on-hacker-news/">https://wiredcraft.com/blog/how-to-post-on-hacker-news/</a></p>
</blockquote>
<p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/hackernews.png" alt="hacker-news"></p>
<p>当我们为 <a href="http://devo.ps/">devo.ps</a> 和 <a href="https://wiredcraft.com/">Wiredcraft</a> 的部分产品工作时, 我创建了一份内部的市场营销指南(我们现在公开了)。指南里面的某一条建议被我们发布到 Hacker News 上。有几个朋友让我把整篇指南分享出来,所以我决定要把它发布在博客里。<br></summary>
<category term="Translate" scheme="https://nsdont.tech/categories/Translate/"/>
<category term="Hacker News" scheme="https://nsdont.tech/tags/Hacker-News/"/>
</entry>
<entry>
<title>Gitlab Runner Register</title>
<link href="https://nsdont.tech/2016/01/10/Gitlab-Runner-Register/"/>
<id>https://nsdont.tech/2016/01/10/Gitlab-Runner-Register/</id>
<published>2016-01-10T08:06:01.000Z</published>
<updated>2024-04-26T07:09:52.124Z</updated>
<content type="html"><![CDATA[<blockquote><p>背景描述:适用于自建https证书,GitLab Runner 在注册基于自建 https 证书的 GitLab server 时会遇到一些证书问题,这里提供了一种解决方案。</p></blockquote><span id="more"></span><h2 id="生成证书"><a href="#生成证书" class="headerlink" title="生成证书"></a>生成证书</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo openssl genrsa -out "/etc/gitlab/ssl/gitlab.key" 2048</span><br><span class="line">sudo openssl req -new -key "/etc/gitlab/ssl/gitlab.key" -out "/etc/gitlab/ssl/gitlab.csr"</span><br><span class="line">sudo openssl x509 -req -days 3650 -in "/etc/gitlab/ssl/gitlab.csr" -signkey "/etc/gitlab/ssl/gitlab.key" -out "/etc/gitlab/ssl/gitlab.crt"</span><br></pre></td></tr></table></figure><p><code>注意:填写证书信息的时候,一定要填写域名!!!</code></p><h2 id="配置-GitLab-runner-服务器"><a href="#配置-GitLab-runner-服务器" class="headerlink" title="配置 GitLab runner 服务器"></a>配置 GitLab runner 服务器</h2><p>如何安装 GitLab runner ,我就不进行相关介绍了,请看<a href="https://gitlab.com/gitlab-org/gitlab-ci-multi-runner#installation">官方文档</a>。</p><p>详细步骤:</p><ol><li>修改 <code>/etc/hosts</code>, 如果已经给 GitLab server 配置了域名,这一步可以跳过,没有配置的话,就需要将ip映射到相应的域名(注:这里的域名就是上一段<code>生成证书</code>里面提到的填写证书信息时域名)</li><li>将之前生成的 gitlab.crt 填充到 /etc/ssl/certs/ca-bundle.crt 文件底部。(注:不同发行版的crt文件可能不一样)</li></ol><h2 id="案例"><a href="#案例" class="headerlink" title="案例"></a>案例</h2><p><img src="https://static-1252708783.cos.ap-shanghai.myqcloud.com/blogs/2019/09/17/14523953683977.jpg" alt="案例"></p>]]></content>
<summary type="html"><blockquote>
<p>背景描述:适用于自建https证书,GitLab Runner 在注册基于自建 https 证书的 GitLab server 时会遇到一些证书问题,这里提供了一种解决方案。</p>
</blockquote></summary>
<category term="DevOps" scheme="https://nsdont.tech/categories/DevOps/"/>
<category term="GitLab" scheme="https://nsdont.tech/tags/GitLab/"/>
<category term="CI" scheme="https://nsdont.tech/tags/CI/"/>
</entry>
<entry>
<title>Nginx and Php 最小化安装(CentOS)</title>
<link href="https://nsdont.tech/2013/11/26/Nginx-and-Php-%E6%9C%80%E5%B0%8F%E5%8C%96%E5%AE%89%E8%A3%85-CentOS/"/>
<id>https://nsdont.tech/2013/11/26/Nginx-and-Php-%E6%9C%80%E5%B0%8F%E5%8C%96%E5%AE%89%E8%A3%85-CentOS/</id>
<published>2013-11-26T08:33:12.000Z</published>
<updated>2024-04-26T07:10:36.231Z</updated>
<content type="html"><![CDATA[<h2 id="下载相关的文件"><a href="#下载相关的文件" class="headerlink" title="下载相关的文件"></a>下载相关的文件</h2><ol><li><a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/">pcre-8.21.tar.bz2</a></li><li><a href="http://nginx.org/">nginx-1.4.1.tar.gz</a></li><li><a href="http://php.net/downloads.php">php-5.3.27</a><span id="more"></span></li></ol><h2 id="PCRE"><a href="#PCRE" class="headerlink" title="PCRE"></a>PCRE</h2><p>系统自带的PCRE版本太低了.所以需要卸载重装。<br>第一步:查看PCRE的版本</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ rpm -qa | grep pcre</span><br></pre></td></tr></table></figure><p>第二步:保留以前的libpcre.so.0,没有这个无法重装PCRE的</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo cp /lib/libpcre.so.0 /lib/libpcre.so.0.back</span><br></pre></td></tr></table></figure><p>第三步:卸载PCRE</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo rpm -e --nodeps pcre-7.8-4.el6.i686 #这里的这个7.8-4.el6.i686-是我这里版本,要根据自己电脑修改</span><br></pre></td></tr></table></figure><p>第四步:安装新的PCRE</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">$ tar -xj -f pcre-8.21.tar.gz</span><br><span class="line">$ cd pcre-8.21</span><br><span class="line">$ sudo mv /lib/libpcre.so.0.back /lib/libpcre.so.0</span><br><span class="line">$ ./configure</span><br><span class="line">$ make</span><br><span class="line">$ sudo make install</span><br></pre></td></tr></table></figure><h2 id="Nginx"><a href="#Nginx" class="headerlink" title="Nginx"></a>Nginx</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ ./configure --prefix=/usr/local/nginx</span><br><span class="line">$ make</span><br><span class="line">$ sudo make install</span><br><span class="line">$ sudo /usr/local/nginx/sbin/nginx</span><br></pre></td></tr></table></figure><h3 id="配置-开启PHP支持"><a href="#配置-开启PHP支持" class="headerlink" title="配置, 开启PHP支持"></a>配置, 开启PHP支持</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo vim /usr/local/nginx/conf/nginx.conf</span><br></pre></td></tr></table></figure><p>增加PHP主页</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">location / {</span><br><span class="line">root html;</span><br><span class="line">index index.html index.php index.htm;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>开启PHP支持</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">location ~ \.php$ {</span><br><span class="line">root html;</span><br><span class="line">fastcgi_pass 127.0.0.1:9000;</span><br><span class="line">fastcgi_index index.php;</span><br><span class="line">fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;</span><br><span class="line">include fastcgi_params;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>注意这里的fastcgi_pass 和 fastcgi_param的”/var/www”, fastcgi_pass是nginx请求到php的端口,而”/var/www”就是项目的存放路径</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo /usr/local/nginx/sbin/nginx</span><br></pre></td></tr></table></figure><p>在浏览器输入<a href="https://127.0.0.1就可以查看nginx的欢迎信息了/">https://127.0.0.1就可以查看Nginx的欢迎信息了</a></p><h2 id="PHP"><a href="#PHP" class="headerlink" title="PHP"></a>PHP</h2><p>这里是最小化安装,所以就不配置什么插件了<br>Nginx 与 PHP的通信需要使用 PHP-FPM,在php5.3.3以后,PHP-FPM以及集成到了php,如果要使用的话,在编译的时候,加一句–enable-fpm</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ sudo ./configure --prefix=/usr/local/php --enable-fpm</span><br><span class="line">$ sudo make</span><br><span class="line">$ sudo make test</span><br><span class="line">$ sudo make install</span><br></pre></td></tr></table></figure><h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ sudo cd /usr/local/php</span><br><span class="line">$ cp etc/php-fpm.conf.default etc/php-fpm.conf</span><br><span class="line">$ sudo vim etc/php-fpm.conf</span><br><span class="line">$ 找到[global],去掉";pid = run/php-fpm.pid"的注释</span><br></pre></td></tr></table></figure><h2 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h2><p>我们之前提到了”/var/www”,我们在这里新建一个php文件,来测试环境是否搭建成功</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ sudo vim /var/www/info.php</span><br></pre></td></tr></table></figure><p>info.php</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?</span> <span class="keyword">echo</span> <span class="title function_ invoke__">phpinfo</span>(); <span class="meta">?></span></span><br></pre></td></tr></table></figure><p>如果之前已经开启nginx服务器,现在就不用开了</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ sudo /usr/local/nginx/sbin/nginx</span><br><span class="line">$ sudo /usr/local/php/sbin/php-fpm</span><br></pre></td></tr></table></figure><h2 id="编写快速启动和关闭的nginx与php脚本"><a href="#编写快速启动和关闭的nginx与php脚本" class="headerlink" title="编写快速启动和关闭的nginx与php脚本"></a>编写快速启动和关闭的nginx与php脚本</h2><p>示例:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ sudo vim /etc/init.d/php-fpm</span><br><span class="line">$ sudo chmod +x /etc/init.d/php-fpm</span><br><span class="line">$ sudo /sbin/chkconfig php-fpm on</span><br><span class="line">$ sudo /sbin/chkconfig --list php-fpm</span><br></pre></td></tr></table></figure><p>成功的话<br>就可以看到好几个 on<br>测试</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ sudo /etc/init.d/php-fpm stop</span><br><span class="line">$ sudo /etc/init.d/php-fpm start</span><br><span class="line">$ sudo /etc/init.d/php-fpm restart</span><br></pre></td></tr></table></figure><p>php-fpm 脚本</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line">#</span><br><span class="line"># Startup script for the PHP-FPM server.</span><br><span class="line">#</span><br><span class="line"># chkconfig: 345 85 15</span><br><span class="line"># description: PHP is an HTML-embedded scripting language</span><br><span class="line"># processname: php-fpm</span><br><span class="line"># config: /usr/local/php/etc/php.ini</span><br><span class="line"></span><br><span class="line"># Source function library.</span><br><span class="line">. /etc/rc.d/init.d/functions</span><br><span class="line"></span><br><span class="line">PHP_PATH=/usr/local</span><br><span class="line">DESC="php-fpm daemon"</span><br><span class="line">NAME=php-fpm</span><br><span class="line"># php-fpm路径</span><br><span class="line">DAEMON=$PHP_PATH/php/sbin/$NAME</span><br><span class="line"># 配置文件路径</span><br><span class="line">CONFIGFILE=$PHP_PATH/php/etc/php-fpm.conf</span><br><span class="line"># PID文件路径(在php-fpm.conf设置)</span><br><span class="line">PIDFILE=$PHP_PATH/php/var/run/$NAME.pid</span><br><span class="line">SCRIPTNAME=/etc/init.d/$NAME</span><br><span class="line"></span><br><span class="line"># Gracefully exit if the package has been removed.</span><br><span class="line">test -x $DAEMON || exit 0</span><br><span class="line"></span><br><span class="line">rh_start() {</span><br><span class="line">$DAEMON -y $CONFIGFILE || echo -n " already running"</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">rh_stop() {</span><br><span class="line">kill -QUIT `cat $PIDFILE` || echo -n " not running"</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">rh_reload() {</span><br><span class="line">kill -HUP `cat $PIDFILE` || echo -n " can't reload"</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">case "$1" in</span><br><span class="line">start)</span><br><span class="line">echo -n "Starting $DESC: $NAME"</span><br><span class="line">rh_start</span><br><span class="line">echo "."</span><br><span class="line">;;</span><br><span class="line">stop)</span><br><span class="line">echo -n "Stopping $DESC: $NAME"</span><br><span class="line">rh_stop</span><br><span class="line">echo "."</span><br><span class="line">;;</span><br><span class="line">reload)</span><br><span class="line">echo -n "Reloading $DESC configuration..."</span><br><span class="line">rh_reload</span><br><span class="line">echo "reloaded."</span><br><span class="line">;;</span><br><span class="line">restart)</span><br><span class="line">echo -n "Restarting $DESC: $NAME"</span><br><span class="line">rh_stop</span><br><span class="line">sleep 1</span><br><span class="line">rh_start</span><br><span class="line">echo "."</span><br><span class="line">;;</span><br><span class="line">*)</span><br><span class="line">echo "Usage: $SCRIPTNAME {start|stop|restart|reload}" >&2</span><br><span class="line">exit 3</span><br><span class="line">;;</span><br><span class="line">esac</span><br><span class="line">exit 0</span><br></pre></td></tr></table></figure><p>nginx 脚本</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line">#</span><br><span class="line">#chkconfig: - 85 15</span><br><span class="line">#description: Nginx is a World Wide Web server.</span><br><span class="line">#processname: nginx</span><br><span class="line"></span><br><span class="line">nginx=/usr/local/nginx/sbin/nginx</span><br><span class="line">conf=/usr/local/nginx/conf/nginx.conf</span><br><span class="line"></span><br><span class="line">case $1 in</span><br><span class="line">start)</span><br><span class="line">echo -n "Starting Nginx"</span><br><span class="line">$nginx -c $conf</span><br><span class="line">echo " done"</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">stop)</span><br><span class="line">echo -n "Stopping Nginx"</span><br><span class="line">killall -9 nginx</span><br><span class="line">echo " done"</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">test)</span><br><span class="line">$nginx -t -c $conf</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">reload)</span><br><span class="line">echo -n "Reloading Nginx"</span><br><span class="line">ps auxww | grep nginx | grep master | awk '{print $2}' | xargs kill -HUP</span><br><span class="line">echo " done"</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">restart)</span><br><span class="line">$0 stop</span><br><span class="line">$0 start</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">show)</span><br><span class="line">ps -aux|grep nginx</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">*)</span><br><span class="line">echo -n "Usage: $0 {start|restart|reload|stop|test|show}"</span><br><span class="line">;;</span><br><span class="line"></span><br><span class="line">esac</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h2 id="下载相关的文件"><a href="#下载相关的文件" class="headerlink" title="下载相关的文件"></a>下载相关的文件</h2><ol>
<li><a href="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/">pcre-8.21.tar.bz2</a></li>
<li><a href="http://nginx.org/">nginx-1.4.1.tar.gz</a></li>
<li><a href="http://php.net/downloads.php">php-5.3.27</a></summary>
<category term="Linux" scheme="https://nsdont.tech/categories/Linux/"/>
<category term="Nginx" scheme="https://nsdont.tech/tags/Nginx/"/>
<category term="CentOS" scheme="https://nsdont.tech/tags/CentOS/"/>
</entry>
<entry>
<title>Django 本地化</title>
<link href="https://nsdont.tech/2013/09/12/django-%E6%9C%AC%E5%9C%B0%E5%8C%96/"/>
<id>https://nsdont.tech/2013/09/12/django-%E6%9C%AC%E5%9C%B0%E5%8C%96/</id>
<published>2013-09-12T06:00:21.000Z</published>
<updated>2024-04-26T07:09:55.809Z</updated>
<content type="html"><![CDATA[<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>简单的说,就是三步走。<br>1.在 Python 代码和模板中插入待翻译的字符串。<br>2.建立并修改语言文件<br>3.激活</p><p>在这里,使用 autocomplete_light 来进行案例讲解,拿我们上次遇见的问题来讲解。</p><span id="more"></span><h2 id="如何指定待翻译字符串"><a href="#如何指定待翻译字符串" class="headerlink" title="如何指定待翻译字符串"></a>如何指定待翻译字符串</h2><h3 id="在-Python-代码中"><a href="#在-Python-代码中" class="headerlink" title="在 Python 代码中:"></a>在 Python 代码中:</h3><p>代码详见 <a href="https://github.com/yourlabs/django-autocomplete-light/blob/00b3a1d6ff3fea55b55962d13eb86563220b5a7a/autocomplete_light%2Fautocomplete%2Fbase.py#L107">autocomplete_light/autocomplete/base.py 107行</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">html = self.empty_html_format % _(<span class="string">'no matches found'</span>).capitalize()</span><br></pre></td></tr></table></figure><p>在这里的 _ 就表示这国际化的意思<br>见 该文件第3行</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> django.utils.translation <span class="keyword">import</span> ugettext_lazy <span class="keyword">as</span> _)</span><br></pre></td></tr></table></figure><p>使用函数 <code>ugettext()</code> 来指定一个翻译字符串。<br>作为惯例,使用短别名 <code>_</code> 来引入这个函数以节省键入时间.<br>使用 <code>django.utils.translation.gettext_lazy()</code> 函数,<br>使得其中的值只有在访问时才会被翻译,而不是在 <code>gettext_lazy()</code> 被调用时翻译。</p><h3 id="在模板中"><a href="#在模板中" class="headerlink" title="在模板中:"></a>在模板中:</h3><p>Django 模板使用两种模板标签,且语法格式与 Python 代码有些许不同。<br>为了使得模板访问到标签,需要将下列代码放在模板最前面。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% load i18n %}</span><br></pre></td></tr></table></figure><p>然后使用下列代码</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><title>{% trans "This is the title." %}</title></span><br><span class="line"><title>{% trans myvar %}</title></span><br></pre></td></tr></table></figure><p>在一个带 <code>trans</code> 的字符串中,混进一个模板变量是不可能的。如<br>果你的译文要求字符串带有变量(占位符 placeholders),请使用 blocktrans :</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{% blocktrans %}This string will have {{ value }} inside.{% endblocktrans %}</span><br></pre></td></tr></table></figure><h2 id="如何创建语言文件"><a href="#如何创建语言文件" class="headerlink" title="如何创建语言文件"></a>如何创建语言文件</h2><p>你需要建立一个 <code>locale</code> 文件夹来放置语言文件.<br>如果没有这个文件夹,使用创建命令就会报错<br>locale 可以放在子 app 的文件里(如 autocomplete), 也可以放在总的文件夹(project)下面,<br>两者有着不同意义,就是查询的先后顺序,优先查询 app 里的 locale 文件夹</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">django-admin.py makemessages -l zh\_CN</span><br></pre></td></tr></table></figure><p>这个命令就是建立语言文件,有一个条件,就是当前目录有 locale 文件夹</p><p>在这里看下这个文件 autocomplete_light/locale/zh_CN/LC_MESSAGES/django.po</p><h3 id="激活"><a href="#激活" class="headerlink" title="激活"></a>激活</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">django-admin.py compilemessages</span><br></pre></td></tr></table></figure><p>当你编辑完语言文件后,要使用这条命令,让语言文件生效</p>]]></content>
<summary type="html"><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>简单的说,就是三步走。<br>1.在 Python 代码和模板中插入待翻译的字符串。<br>2.建立并修改语言文件<br>3.激活</p>
<p>在这里,使用 autocomplete_light 来进行案例讲解,拿我们上次遇见的问题来讲解。</p></summary>
<category term="Python" scheme="https://nsdont.tech/categories/Python/"/>
<category term="Django" scheme="https://nsdont.tech/tags/Django/"/>
<category term="I18N" scheme="https://nsdont.tech/tags/I18N/"/>
</entry>
</feed>