-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
697 lines (607 loc) · 88.8 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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[Wu Yongfeng - Blog]]></title>
<link href="/atom.xml" rel="self"/>
<link href="https://wuyf.me/"/>
<updated>2017-01-12T14:30:31.000Z</updated>
<id>https://wuyf.me/</id>
<author>
<name><![CDATA[Wu Yongfeng]]></name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title><![CDATA[Apache Nifi 定义和开发流式数据处理应用]]></title>
<link href="https://wuyf.me/2017/01/11/basic-introduction-to-apache-nifi/"/>
<id>https://wuyf.me/2017/01/11/basic-introduction-to-apache-nifi/</id>
<published>2017-01-11T13:34:10.000Z</published>
<updated>2017-01-12T14:30:31.000Z</updated>
<content type="html"><![CDATA[<h2 id="什么是Apache_Nifi">什么是Apache Nifi</h2><p>Apache Nifi 是一个定义流数据处理作业的平台服务,它提供直观的界面供开发者进行业务逻辑定制,能够方便地使用原生组件(Processor)也可以自己开发组件来构建流式数据处理应用。</p>
<p>在使用过Apache Nifi 进行一些简单业务逻辑处理之后发现它功能强大,且入手难度不是很高,因此这里解释一下我对它里面的一些内容的理解。有些是翻译<a href="https://nifi.apache.org" target="_blank" rel="external">官网</a>上的,有一些是我自己总结的内容。</p>
<h2 id="Apache_Nifi_使用及简单实例">Apache Nifi 使用及简单实例</h2><p>首先,通过安装并以一个简单的实例来介绍一下Nifi的使用。</p>
<h4 id="安装">安装</h4><p>nifi<a href="https://nifi.apache.org/download.html" target="_blank" rel="external">下载页面</a>提供zip和tarball下载,下载后解压,在配置好java环境(Java 8 以上)后可以直接通过进入<code>bin</code>目录运行<code>./nifi.sh start</code>即可。</p>
<p>对于安装了Homebrew的macOS用户可以直接通过<code>brew install nifi</code>进行安装</p>
<blockquote>
<p>运行时日志打印在logs目录下,一般我喜欢<code>./nifi.sh start && tail -f logs/nifi-app.log</code>直接看启动信息</p>
</blockquote>
<h4 id="启动界面">启动界面</h4><p>(待补充)</p>
<h4 id="简单实例运行">简单实例运行</h4><p>Nifi为了增加复用性,有一个模板的概念,即构建完成的应用或者部分模块能够导出为模板文件(xml描述文件)之后可以通过导入直接生成一个可以运行的应用。<a href="https://cwiki.apache.org/confluence/display/NIFI/Example+Dataflow+Templates" target="_blank" rel="external">这个链接</a>里面有几个例子,可以下载后导入到项目中使用。</p>
<p>比如simple-httpget-route.template.xml这个模板:<br><img src="simple-httpget-route-template.png" alt="simple httpget route template screenshot"><br>配置好putFile的Directory属性以及,把Automatically Terminate Relationships的Success和Failure都设置中断后,即可点击运行按钮启动这个应用。<br><img src="simple-httpget-route-template-config.png" alt="simple httpget route template config screenshot"></p>
<p>这个应用处理的逻辑是:</p>
<ol>
<li>获取localhost:8080/nifi页面内容,并以 temp.txt的名字发给ExtractText这个处理器</li>
<li>抽取<code><title></title></code>内文字</li>
<li>检查是不是<code>Nifi</code></li>
<li>如果是的话,将该文件temp.txt存到目标地址</li>
</ol>
<h4 id="基本概念介绍">基本概念介绍</h4><p>在Nifi里面有几个<a href="http://nifi.apache.org/docs/nifi-docs/html/overview.html#the-core-concepts-of-nifi" target="_blank" rel="external">基本的概念</a>需要介绍一下:</p>
<ol>
<li>FlowFile:它是在处理器(Processor)之间流转的对象,伴随它的还有一组key/value表示的属性(attributes)</li>
<li>FlowFile Processor: 处理器,它是实际处理业务的逻辑单元。通过将FlowFile内容及其属性进行一定操作后,交由后续处理器处理。</li>
<li>Connection: 它表示Processor之间的顺序关系,也是FlowFile的内容流向,它的内部实现是基于Java的<a href="https://nifi.apache.org/docs/nifi-docs/html/nifi-in-depth.html#DeeperView" target="_blank" rel="external">队列</a>,</li>
<li>FlowFile Controller, 它充当调度器的作用。</li>
<li>Process Group: 在Nifi中,一个Process Group是一个具体业务的组,它内部是一系列Processor组成的具体处理逻辑的应用。它可以通过Input port 和output port 来指定输入和输出。通过它的分离,每个Process Group处理不同业务逻辑,能够减少耦合,使逻辑更清楚。</li>
</ol>
<h4 id="架构(这部分没深入了解)"><a href="http://nifi.apache.org/docs/nifi-docs/html/overview.html#nifi-architecture" target="_blank" rel="external">架构</a>(这部分没深入了解)</h4><p><img src="nifi-architecture-overview.png" alt="Nifi Architecture Overview"></p>
<p>整个架构如上图所示,整个项目是跑在JVM上的,</p>
<p>Web Server即默认在<code>http://localhost:8080/nifi</code>提供的界面,以及<code>http://localhost:8080/nifi-api/resources</code>下提供的一系列接口。它基于Jetty,前端由JQuery等插件实现。</p>
<p>Flow Controller, 提供管理和调度资源的功能(感觉它是个调度器)</p>
<p>FlowFile/Content/Provenance Repository 这些是为了保证Failover机制而作的一些Write ahead 日志,详细介绍在<a href="https://cwiki.apache.org/confluence/display/NIFI/NiFi's+Write-Ahead+Log+Implementation" target="_blank" rel="external">这里</a>,它主要介绍了这个write-ahead log的实现细节和算法,包括如何写、校验、回滚write-ahead log</p>
<h4 id="后面更新的内容">后面更新的内容</h4><ol>
<li>Processor的实现细节</li>
<li>如何动手写一个Processor</li>
<li>Cluster的搭建(我还没做过,目前都是单机的)</li>
</ol>
<p><img src="/assets/images/nifi-logo.png" alt="Apache Nifi Logl"></p>
]]></content>
<summary type="html">
<![CDATA[<h2 id="什么是Apache_Nifi">什么是Apache Nifi</h2><p>Apache Nifi 是一个定义流数据处理作业的平台服务,它提供直观的界面供开发者进行业务逻辑定制,能够方便地使用原生组件(Processor)也可以自己开发组件来构建流式数据处理应用。]]>
</summary>
<category term="Tech" scheme="https://wuyf.me/categories/Tech/"/>
<category term="Apache" scheme="https://wuyf.me/categories/Tech/Apache/"/>
</entry>
<entry>
<title><![CDATA[近期活动小结]]></title>
<link href="https://wuyf.me/2016/05/16/recent-activities/"/>
<id>https://wuyf.me/2016/05/16/recent-activities/</id>
<published>2016-05-16T13:17:43.000Z</published>
<updated>2016-05-16T13:42:58.000Z</updated>
<content type="html"><![CDATA[<p>好久没更新了,最近在忙一些事情,主要是暑假实习面了几家,想着攒攒面试经验和实习经历。</p>
<ol>
<li>Ant FinaXXX</li>
</ol>
<p>内推的java工程师面试整个过程持续了得有两个月吧,陆续接到电话面试,共计五轮,最后一面HR.</p>
<p>前四轮技术面试涉及到的内容比较杂,大致分为算法和项目经历两块,算法的话面了一些基础的,感觉口头回答没啥难度。然后是java相关的一些东西和项目经历,包括java多线程、我参加的Hackathon、<a href="http://sui.me" target="_blank" rel="external">随米</a> 的后台实现上的一些问题。</p>
<p>整个过程下来就是感觉废话太多,像是在聊天而不是面试(可能面试就是聊天吧。。。)</p>
<p>最后面完HR后过了好久收到几封邮件:</p>
<p>XXXX实习生录用喜报, XXXX实习生手册等。。。过程还算顺利</p>
<ol>
<li>TenXXXX</li>
</ol>
<p>网申的,由于我只会java而不懂c++(学习过而日常项目等都没使用) 所以投了一个java相关的岗位:Android工程师,目标城市是上海。</p>
<p>结果,我居然收到了北京office打来的面试电话。</p>
<p>Android 面试我没准备多少(仗着我懂些Android的皮毛,我就敢投,我想想也觉得胆大)所以面试基础的内容比如ListView怎么自己重写等问题的时候我也没答上来。</p>
<p>后面又被问到一道算法题,我现在已经回忆不起来了,是一道数据量很大的题目。。。</p>
<p>结果可想而知,GG了。。</p>
<ol>
<li>MicroXXXX</li>
</ol>
<p>成功过了在线评测后感觉算法还是有待加强,所以期间刷了几题,也总结了一些面试题目,比如<a href="http://wuchong.me/blog/2014/03/25/interview-link-questions/" target="_blank" rel="external">链表相关的题目</a>(感谢这篇总结)</p>
<p>on site 共有三轮,前两轮算是技术面,最后看表现决定是否有三面。</p>
<p>技术面了k路链表合并、反转链表等问题,经过了上面的准备,我手写代码终于一遍过了!所以意外地进入了最后一轮面试。第三轮面试也比较顺利,算是聊一些项目和自己的思路,整个过程更像是在聊天。</p>
<p>最后也收到了一封邮件:</p>
<p>XXXX 赶紧加入我们吧</p>
<p>面试经历的总结是:</p>
<ol>
<li>要刷题,至少要过在线评测一关</li>
<li>追过代码质量,要细致写代码</li>
<li>要沉下心来研究一些技术底层的内容,而不仅停留在应用层面。</li>
</ol>
<hr>
<p>另外一件事情就是我在开题,做spark streaming在容器云上相关的内容,涉及内容比较多,既要了解流式计算相关框架,也要去看docker 和kubernetes相关内容。开题报告写得我很头疼。</p>
<hr>
<p>另外一件事情就是恭喜Bryan的项目拿到天使投资。</p>
]]></content>
<summary type="html">
<![CDATA[<p>好久没更新了,最近在忙一些事情,主要是暑假实习面了几家,想着攒攒面试经验和实习经历。</p>
<ol>
<li>Ant FinaXXX</li>
</ol>
<p>内推的java工程师面试整个过程持续了得有两个月吧,陆续接到电话面试,共计五轮,最后一面HR.</p>
<p>]]>
</summary>
<category term="activities" scheme="https://wuyf.me/tags/activities/"/>
<category term="books" scheme="https://wuyf.me/tags/books/"/>
<category term="interview" scheme="https://wuyf.me/tags/interview/"/>
<category term="Diary" scheme="https://wuyf.me/categories/Diary/"/>
</entry>
<entry>
<title><![CDATA[替换图片中的二维码]]></title>
<link href="https://wuyf.me/2016/04/05/python-replace-qr-code-in-image/"/>
<id>https://wuyf.me/2016/04/05/python-replace-qr-code-in-image/</id>
<published>2016-04-05T14:26:05.000Z</published>
<updated>2017-01-13T05:13:20.000Z</updated>
<content type="html"><![CDATA[<p>遇到一个 task,需要监控二维码被扫码的次数,但无奈二维码被画在上面了,想替换原来的二维码。<br>找到 <a href="https://pypi.python.org/pypi/zbar" target="_blank" rel="external">zbar</a> 这个好用的库就搞定了大部分了,下面直接贴代码</p>
<script src="//gist.github.com/4b194ae91f43aff4883f82b8bebd9419.js?file=replaceqr.py"></script>
<p>效果如下:</p>
<div class="figure nocaption fig-50"><a class="fancybox" href="" title="origin"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/v1459866549/from_hw4ei4.png" width="" height="" alt="origin"></a></div>
<div class="figure nocaption fig-50"><a class="fancybox" href="" title="after"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/v1459866907/to_gd20vr.png" width="" height="" alt="after"></a></div>
<h3 id="References">References</h3><ol>
<li><a href="https://automatetheboringstuff.com/chapter17/" target="_blank" rel="external">https://automatetheboringstuff.com/chapter17/</a></li>
<li><a href="http://stackoverflow.com/q/23796025/2428562" target="_blank" rel="external">http://stackoverflow.com/q/23796025/2428562</a></li>
</ol>
]]></content>
<summary type="html">
<![CDATA[<p>遇到一个 task,需要监控二维码被扫码的次数,但无奈二维码被画在上面了,想替换原来的二维码。<br>找到 <a href="https://pypi.python.org/pypi/zbar" target="_blank" rel="external">zbar</a>]]>
</summary>
<category term="python" scheme="https://wuyf.me/tags/python/"/>
<category term="qrtools" scheme="https://wuyf.me/tags/qrtools/"/>
<category term="zbar" scheme="https://wuyf.me/tags/zbar/"/>
<category term="Tech" scheme="https://wuyf.me/categories/Tech/"/>
</entry>
<entry>
<title><![CDATA[mysql event scheduler 用法]]></title>
<link href="https://wuyf.me/2016/03/11/mysql-event-scheduler-usage/"/>
<id>https://wuyf.me/2016/03/11/mysql-event-scheduler-usage/</id>
<published>2016-03-11T07:10:50.000Z</published>
<updated>2017-01-13T05:13:21.000Z</updated>
<content type="html"><![CDATA[<p>想要定时根据条件更新数据库,但又不想写脚本定时去跑任务。这两天发现一个好用的东西<a href="https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html" target="_blank" rel="external">event scheduler</a></p>
<p>整理了一下 Event Scheduler 的主要用法 </p>
<h6 id="打开">打开</h6><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="operator"><span class="keyword">SET</span> <span class="keyword">GLOBAL</span> event_scheduler = <span class="keyword">ON</span>;</span></span><br></pre></td></tr></table></figure>
<h6 id="关闭">关闭</h6><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="operator"><span class="keyword">SET</span> <span class="keyword">GLOBAL</span> event_scheduler = <span class="keyword">OFF</span>;</span></span><br></pre></td></tr></table></figure>
<h6 id="创建一个_Event">创建一个 Event</h6><figure class="highlight sql"><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="operator"><span class="keyword">CREATE</span></span><br><span class="line"> [DEFINER = { <span class="keyword">user</span> | <span class="keyword">CURRENT_USER</span> }]</span><br><span class="line"> <span class="keyword">EVENT</span></span><br><span class="line"> [<span class="keyword">IF</span> <span class="keyword">NOT</span> <span class="keyword">EXISTS</span>]</span><br><span class="line"> event_name</span><br><span class="line"> <span class="keyword">ON</span> SCHEDULE schedule</span><br><span class="line"> [<span class="keyword">ON</span> COMPLETION [<span class="keyword">NOT</span>] <span class="keyword">PRESERVE</span>]</span><br><span class="line"> [<span class="keyword">ENABLE</span> | <span class="keyword">DISABLE</span> | <span class="keyword">DISABLE</span> <span class="keyword">ON</span> <span class="keyword">SLAVE</span>]</span><br><span class="line"> [<span class="keyword">COMMENT</span> <span class="string">'comment'</span>]</span><br><span class="line"> <span class="keyword">DO</span> event_body;</span></span><br><span class="line"></span><br><span class="line">schedule:</span><br><span class="line"> AT timestamp [+ INTERVAL interval] ...</span><br><span class="line"> | EVERY interval</span><br><span class="line"> [STARTS timestamp [+ INTERVAL interval] ...]</span><br><span class="line"> [ENDS timestamp [+ INTERVAL interval] ...]</span><br><span class="line"></span><br><span class="line">interval:</span><br><span class="line"> quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |</span><br><span class="line"> WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |</span><br><span class="line"> DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}</span><br></pre></td></tr></table></figure>
<p>例子:</p>
<ol>
<li><p>每一分钟往数据库里插入一条数据(仅id 和 time 字段)</p>
<figure class="highlight sql"><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"><span class="operator"><span class="keyword">CREATE</span> <span class="keyword">EVENT</span> <span class="keyword">IF</span> <span class="keyword">NOT</span> <span class="keyword">EXISTS</span></span><br><span class="line"> insert_every_minute</span><br><span class="line"><span class="keyword">ON</span> SCHEDULE</span><br><span class="line"> EVERY <span class="number">1</span> <span class="keyword">MINUTE</span></span><br><span class="line"><span class="keyword">DO</span></span><br><span class="line"> <span class="keyword">insert</span> <span class="keyword">into</span> time_interval (<span class="keyword">time</span>) <span class="keyword">values</span>(<span class="keyword">CURRENT_TIMESTAMP</span>);</span></span><br></pre></td></tr></table></figure>
</li>
<li><p>一周后开始每天凌晨1点插入一条数据,两周后结束执行</p>
<figure class="highlight sql"><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"><span class="operator"><span class="keyword">CREATE</span> <span class="keyword">EVENT</span> <span class="keyword">IF</span> <span class="keyword">NOT</span> <span class="keyword">EXISTS</span></span><br><span class="line"> insert_every_1am_after_one_week</span><br><span class="line"><span class="keyword">ON</span> SCHEDULE</span><br><span class="line"> EVERY <span class="number">1</span> <span class="keyword">DAY</span> </span><br><span class="line"> STARTS (<span class="keyword">TIMESTAMP</span>(<span class="keyword">CURRENT_DATE</span>) + <span class="built_in">INTERVAL</span> <span class="number">1</span> <span class="keyword">WEEK</span> + <span class="built_in">INTERVAL</span> <span class="number">1</span> <span class="keyword">HOUR</span>)</span><br><span class="line"> ENDS (<span class="keyword">TIMESTAMP</span>(<span class="keyword">CURRENT_DATE</span>) + <span class="built_in">INTERVAL</span> <span class="number">2</span> <span class="keyword">WEEK</span> + <span class="built_in">INTERVAL</span> <span class="number">1</span> <span class="keyword">HOUR</span>)</span><br><span class="line"><span class="keyword">DO</span></span><br><span class="line"> <span class="keyword">insert</span> <span class="keyword">into</span> time_interval(<span class="keyword">time</span>) <span class="keyword">values</span>(<span class="keyword">CURRENT_TIMESTAMP</span>);</span></span><br></pre></td></tr></table></figure>
</li>
</ol>
<h6 id="查看现在所有的_Events">查看现在所有的 Events</h6><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">events</span>;</span></span><br></pre></td></tr></table></figure>
<p>以下是我测试的 event<br><img src="https://res.cloudinary.com/denrcs4mp/image/upload/v1458020346/1.pic_vymgmv.jpg" alt="所有 event"></p>
<p><em>图中Status 为 disable 是我手动停止的</em></p>
<h6 id="停止一个_Event,修改它">停止一个 Event,修改它</h6><figure class="highlight sql"><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="operator"><span class="keyword">ALTER</span></span><br><span class="line"> [DEFINER = { <span class="keyword">user</span> | <span class="keyword">CURRENT_USER</span> }]</span><br><span class="line"> <span class="keyword">EVENT</span> event_name</span><br><span class="line"> [<span class="keyword">ON</span> SCHEDULE schedule]</span><br><span class="line"> [<span class="keyword">ON</span> COMPLETION [<span class="keyword">NOT</span>] <span class="keyword">PRESERVE</span>]</span><br><span class="line"> [RENAME <span class="keyword">TO</span> new_event_name]</span><br><span class="line"> [<span class="keyword">ENABLE</span> | <span class="keyword">DISABLE</span> | <span class="keyword">DISABLE</span> <span class="keyword">ON</span> <span class="keyword">SLAVE</span>]</span><br><span class="line"> [<span class="keyword">COMMENT</span> <span class="string">'comment'</span>]</span><br><span class="line"> [<span class="keyword">DO</span> event_body]</span></span><br></pre></td></tr></table></figure>
<p>例子:</p>
<ol>
<li>停止刚才的 insert_every_second<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="operator"><span class="keyword">ALTER</span> <span class="keyword">EVENT</span> insert_every_second <span class="keyword">DISABLE</span></span></span><br></pre></td></tr></table></figure>
</li>
</ol>
<h6 id="查看一个_event_创建的语法">查看一个 event 创建的语法</h6><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="operator"><span class="keyword">SHOW</span> <span class="keyword">CREATE</span> <span class="keyword">EVENT</span> event_name;</span></span><br></pre></td></tr></table></figure>
<p>例子:</p>
<ol>
<li>查看刚才的insert_every_1am_after_one_week<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="operator"><span class="keyword">show</span> <span class="keyword">create</span> <span class="keyword">event</span> insert_every_1am_after_one_week</span></span><br></pre></td></tr></table></figure>
</li>
</ol>
<p><img src="https://res.cloudinary.com/denrcs4mp/image/upload/v1458020757/2.pic_ml0ssr.jpg" alt="show create event"></p>
<h6 id="删除一个_event">删除一个 event</h6><p>上次遇到一个因为 definer 不对的 event 报错:</p>
<blockquote>
<p>[ERROR] Event Scheduler: [USER@%][MY_DB.recalcSortWeight] The user specified as a definer (‘USER’@’%’) does not exist 2016-03-11 00:04:34<br>查看了一下,这个 event 并不是我需要的,也不知道谁写的,所以删了算了<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="operator"><span class="keyword">DROP</span> <span class="keyword">EVENT</span> [<span class="keyword">IF</span> <span class="keyword">EXISTS</span>] event_name</span></span><br></pre></td></tr></table></figure></p>
</blockquote>
]]></content>
<summary type="html">
<![CDATA[<p>想要定时根据条件更新数据库,但又不想写脚本定时去跑任务。这两天发现一个好用的东西<a href="https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html" target="_blank" rel="exter]]>
</summary>
<category term="event scheduler" scheme="https://wuyf.me/tags/event-scheduler/"/>
<category term="mysql" scheme="https://wuyf.me/tags/mysql/"/>
<category term="show create event" scheme="https://wuyf.me/tags/show-create-event/"/>
<category term="Tech" scheme="https://wuyf.me/categories/Tech/"/>
</entry>
<entry>
<title><![CDATA[spring parameter validation in json]]></title>
<link href="https://wuyf.me/2016/01/19/spring-parameter-validation/"/>
<id>https://wuyf.me/2016/01/19/spring-parameter-validation/</id>
<published>2016-01-19T10:46:48.000Z</published>
<updated>2017-01-13T05:13:22.000Z</updated>
<content type="html"><![CDATA[<p>参考先摆在前面<a href="http://fruzenshtein.com/spring-mvc-validator-initbinder/" target="_blank" rel="external">Reference</a></p>
<p>这两天写代码遇到一个问题:如果是直接通过 <code>@RequestBody</code>来创建一个 Java 对象的方式,虽然可以直接 map 一个 json 对象到 Java 对象。为了对该对象的参数做一些验证,但又不想自己来组装这个对象写成很长的一段参数列表 :<br><figure class="highlight less"><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"><span class="variable">@RequestMapping</span>(value=<span class="string">"/yourapi"</span>, method=RequestMethod.POST)</span><br><span class="line">public ModelAndView <span class="function">createNewShop</span>(<span class="variable">@RequestParam</span> Value1 value1,</span><br><span class="line"> <span class="variable">@RequestParam</span> Value2 value2</span><br><span class="line"> <span class="comment">//, ...长长的一串</span></span><br><span class="line"> ) {</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>这时实现一些必要参数的验证,就可以用 Validator 来进行验证,步骤分以下几个</p>
<ol>
<li>创建一个Validator 并实现其 validate 方法:<figure class="highlight aspectj"><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></pre></td><td class="code"><pre><span class="line"><span class="annotation">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SomeValidator</span> <span class="keyword">implements</span> <span class="title">Validator</span> </span>{</span><br><span class="line"> </span><br><span class="line"> <span class="annotation">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">boolean</span> <span class="title">supports</span><span class="params">(Class<?> clazz)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> Some.class.isAssignableFrom(clazz);</span><br><span class="line"> <span class="comment">//或写成 return Some.class.equals(clazz);</span></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="annotation">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">void</span> <span class="title">validate</span><span class="params">(Object <span class="keyword">target</span>, Errors errors)</span> </span>{</span><br><span class="line"> <span class="comment">//这里对 target 进行验证</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
</ol>
<p>在 validate 方法中,target 即json 转换成的 POJO,可强转为该对象 <code>Some some = (Some)target;</code>,可对其进行空判断、范围检查等验证:</p>
<ul>
<li>ValidationUtils.rejectIfEmpty(errors, “name”, “message.name_cant_be_empty”);</li>
<li><code>some.getSomeValue();</code> 做一些验证 然后 <code>errors.rejectValue("someValue","reason");</code></li>
</ul>
<ol>
<li><p>在 controller 中加入 Validator</p>
<figure class="highlight aspectj"><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"><span class="annotation">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> SomeValidator someValidator;</span><br><span class="line"> </span><br><span class="line"><span class="annotation">@InitBinder</span></span><br><span class="line"><span class="keyword">private</span> <span class="function"><span class="keyword">void</span> <span class="title">initBinder</span><span class="params">(WebDataBinder binder)</span> </span>{</span><br><span class="line"> binder.setValidator(someValidator);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
<li><p>最后在参数上添加@Valid接口</p>
<figure class="highlight less"><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"><span class="variable">@RequestMapping</span>(value=<span class="string">"/yourapi"</span>, method=RequestMethod.POST)</span><br><span class="line">public ModelAndView <span class="function">createNewShop</span>(<span class="variable">@Valid</span> Some some) {</span><br><span class="line"> <span class="comment">//这里拿到的 some 对象就是已经是验证之后的了 </span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
</ol>
]]></content>
<summary type="html">
<![CDATA[<p>参考先摆在前面<a href="http://fruzenshtein.com/spring-mvc-validator-initbinder/" target="_blank" rel="external">Reference</a></p>
<p>这两天写代码遇到一个问]]>
</summary>
<category term="Spring Validator" scheme="https://wuyf.me/tags/Spring-Validator/"/>
<category term="Tech" scheme="https://wuyf.me/categories/Tech/"/>
</entry>
<entry>
<title><![CDATA[Filco 圣手二代87键 Mac 键对应]]></title>
<link href="https://wuyf.me/2015/12/30/filco-majestouch-seriesFKBN87ML-EFB2-KEY-MAP-FOR-MAC/"/>
<id>https://wuyf.me/2015/12/30/filco-majestouch-seriesFKBN87ML-EFB2-KEY-MAP-FOR-MAC/</id>
<published>2015-12-30T03:01:53.000Z</published>
<updated>2017-01-13T05:13:23.000Z</updated>
<content type="html"><![CDATA[<p>Filco <a href="https://detail.tmall.com/item.htm?id=19332346616&spm=a1z0k.7385961.1997985097.d4918997.6cQPe0&_u=s41e7ioec03&sku_properties=5919063:6536025" target="_blank" rel="external">这款键盘</a>我已经盯上好久了,室友有一块 Filco 蓝牙 mini 的感觉太小,手比较大的我不是很适合,而且听说蓝牙经常会有连接问题,逐决定买 87键的。最近听说朋友马上要回上海了,所以托朋友从<a href="http://www.amazon.co.jp/FILCO-US%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E9%85%8D%E5%88%9787%E3%82%AD%E3%83%BC%E3%83%BB%E5%89%8D%E9%9D%A2%E5%8D%B0%E5%88%B7-%E7%8B%ACCherryMX%E9%BB%92%E8%BB%B8%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%A1%E3%82%AB%E3%83%8B%E3%82%AB%E3%83%AB%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-FKBN87ML-EFB2/dp/B0050ODQEI/ref=sr_1_1?ie=UTF8&qid=1453962563&sr=8-1&keywords=FKBN87ML%2FEFB2" target="_blank" rel="external">日亚</a>上面买了一块(型号号为<code>FKBN87ML/EFB2</code>)。 比较中意侧刻的键盘,87键大小也正好合适,还有<a href="http://www.amazon.co.jp/Majestouch-2-Tenkeyless-Linear-Keyboard-FKBN87ML/dp/B01AN0JUKM/ref=sr_1_2?ie=UTF8&qid=1453962515&sr=8-2&keywords=FKBN87ML%2FEB2" target="_blank" rel="external">正刻的</a>(型号为<code>FKBN87ML/EB2</code>)。11940 JPY 折合约 650 RMB ,比 X 宝便宜了200块。</p>
<h3 id="Map_command_键">Map command 键</h3><p>Mac 和 win的键盘不一样,但使用 Mac 一年时间感觉 Mac 键盘部局还是比较好用的。为了按键匹配把 Alt 和 Win 键换一下,可以直接在 Mac的设置中设置:</p>
<p>Setting -> Keyboard -> Modifier Keys… -> Select Keyboard (choose USB Keyboard) -> switch Option Key and Command Key </p>
<div class="figure fig-25"><a class="fancybox" href="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_500/v1453963918/3.pic_hqmqaz.jpg" title="" target="_blank" rel="external"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_500/v1453963918/3.pic_hqmqaz.jpg" width="" height="" alt=""></a></div> <div class="figure fig-25"><a class="fancybox" href="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_500/v1453963916/4.pic_dn5dmd.jpg" title="" target="_blank" rel="external"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_500/v1453963916/4.pic_dn5dmd.jpg" width="" height="" alt=""></a></div> <div class="figure fig-25"><a class="fancybox" href="https://res.cloudinary.com/denrcs4mp/image/upload/v1453963917/5.pic_yejata.jpg" title="" target="_blank" rel="external"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/v1453963917/5.pic_yejata.jpg" width="" height="" alt=""></a></div> <div class="figure fig-25"><a class="fancybox" href="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_500/v1453963917/6.pic_vhtsmm.jpg" title="" target="_blank" rel="external"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_500/v1453963917/6.pic_vhtsmm.jpg" width="" height="" alt=""></a></div>
<p>这样设置完之后 Win键就和 Command 对应了,<code>Command + C</code>, <code>Command + V</code> 用起来习惯多了。</p>
<h3 id="设置多媒体键">设置多媒体键</h3><p>经常听音乐,所以常需要调节音量,但 F1-F12已经被我改为普通功能了,所以不能直接改过来用作多媒体控制(我主要用来控制音量)在 zhihu 上找到有人推荐<a href="https://pqrs.org/osx/karabiner/" target="_blank" rel="external">Karabiner</a> 下载了一个来玩,感觉还是蛮好用的。</p>
<p>这里我将87键键盘的右上角三个键 Ps/SR, ScLk, Pa/Br 键对应到音量静音、减、增三个键,这个功能有预置,可以直接搜索到并 enable 即可:</p>
<div class="figure fig-100"><a class="fancybox" href="https://res.cloudinary.com/denrcs4mp/image/upload/v1453965115/10.pic_hd_fksqoi.jpg" title="" target="_blank" rel="external"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/v1453965115/10.pic_hd_fksqoi.jpg" width="" height="" alt=""></a></div>
<p>另外也可以自定义按键对应:</p>
<div class="figure fig-100"><a class="fancybox" href="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_800/v1453964892/8.pic_hd_fcosmz.jpg" title="" target="_blank" rel="external"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_800/v1453964892/8.pic_hd_fcosmz.jpg" width="" height="" alt=""></a></div>
<p>打开 <code>private.xml</code> 输入需要定制的内容</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><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="pi"><?xml version="1.0"?></span></span><br><span class="line"><span class="comment"><!-- 这里我把 Insert 键换成 Launchpad 键--></span></span><br><span class="line"><span class="tag"><<span class="title">root</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">item</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">name</span>></span>Insert Key Launchpad<span class="tag"></<span class="title">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">identifier</span>></span>private_pc_insert_to_launchpad<span class="tag"></<span class="title">identifier</span>></span></span><br><span class="line"> <span class="tag"><<span class="title">autogen</span>></span>__KeyToKey__ KeyCode::PC_INSERT,KeyCode::LAUNCHPAD<span class="tag"></<span class="title">autogen</span>></span></span><br><span class="line"> <span class="tag"></<span class="title">item</span>></span></span><br><span class="line"><span class="tag"></<span class="title">root</span>></span></span><br></pre></td></tr></table></figure>
<p>保存后 reload 即可。</p>
<p>更多例子参考<a href="https://github.com/tekezo/Karabiner/tree/master/src/core/server/Resources/include/checkbox" target="_blank" rel="external">官方样例中的代码</a></p>
<h3 id="有了高效的工具就剩下好好工作了~">有了高效的工具就剩下好好工作了~</h3>]]></content>
<summary type="html">
<![CDATA[<p>Filco <a href="https://detail.tmall.com/item.htm?id=19332346616&spm=a1z0k.7385961.1997985097.d4918997.6cQPe0&_u=s41e7ioec03&s]]>
</summary>
<category term="Filco" scheme="https://wuyf.me/tags/Filco/"/>
<category term="Mac" scheme="https://wuyf.me/tags/Mac/"/>
<category term="Tools" scheme="https://wuyf.me/categories/Tools/"/>
</entry>
<entry>
<title><![CDATA[Works Applications 实习经历]]></title>
<link href="https://wuyf.me/2015/12/22/internship-at-works-applications/"/>
<id>https://wuyf.me/2015/12/22/internship-at-works-applications/</id>
<published>2015-12-22T08:17:57.000Z</published>
<updated>2017-01-13T05:13:24.000Z</updated>
<content type="html"><![CDATA[<h2 id="Works_Appliations">Works Appliations</h2><h3 id="面试经过">面试经过</h3><p>关于这家公司的印象大致也就是给的工资比较多,比一般应届毕业生高出不少,其他就没有多少了。</p>
<p>后面通宣讲会知道是做ERP的,但没SAP和ORACLE这样的规模,抱着试试的态度参加了面试。过程是:</p>
<ol>
<li>线下题,给两天做</li>
<li>线下题目过了之后on site面试</li>
<li>onsite 面试过了之后有两种情况<ol>
<li>如果是非常优秀,直接发offer(小伙伴泡泡算是这种,他因为有事没法去实习,加了一轮技术面直接拿Offer)</li>
<li>如果是需要评估,去实习几天然后给offer(多数人是这种情况)</li>
</ol>
</li>
</ol>
<p>线下题目好像基本上没变过(和八月份的好像是一样的)一题递归,一题深搜。我水过。</p>
<p>onsite出的结果也比较迟,时间定在周末。onsite的过程也比较简单,全程英语面试,题目是字符串处理的题目,比如找最长子串…整体反馈是比较简单,然而我也没怎么做好,大概面试官看我是交大的放我一马进了实习…</p>
<p>实习地点有两个,一个北京、一个广州。北京正好由于时间不巧没去成,所以选了广州去实习。</p>
<h3 id="实习经过">实习经过</h3><p>印象最深的就是这段时间了,虽然只有五天时间,实际也就2天改文档加编程。在实习期之前我们被分配了一个document task的任务,题目是作为主要用户是酒店经理的管理软件,你怎么帮助酒店创收。对于酒店管理了解也不是很多,咨询了我学酒店管理的兄弟,了解了一些Oracle的产品,然后就开始随便写了。</p>
<p>一开始我写的都是一些比较基础的功能,交了初版之后得到的反馈也是如此,没有创新也是比较普通的功能。后来想了几个觉得还不错的主意,比如有一个统计分析模块,可以根据这个模块进行实习分析并做出决策。还有客户关系管理模块等。然后第二版递交之后就过了这个task得到广州实习的机会(这个task应该没刷人我觉得)</p>
<ul>
<li><p>12号下午的飞机,晚上10点到的雅乐轩酒店。</p>
</li>
<li><p>13号开始orientation和Catalog refine,这个过程极其无聊,我们又没得到具体的开发任务,所以只能继续think think think</p>
</li>
<li><p>14号有个review, 这个review比较关键,首先是知道了mentor对你的要求,其次是了解了开发主要的任务。完事之后得到一个反馈大概是应该开发些什么。基础的功能根本每个人都有,所以真没什么用。直接面向演示编程一个核心功能即可。</p>
</li>
<li><p>15号,吐槽一下网络比较慢,所以基本上下不了node dependency包,只能刷刷微博,继续 refine一下文档。晚上回到宾馆开始着手写代码,基本上是怎么好看怎么来,怎么快怎么写。</p>
</li>
<li><p>16号是final demonstration 我选了最后一个,一早睡了个懒觉再到会议中心。面试过程是40分钟,大概是想介绍什么就说什么。我说了软件的比较创新的地方以及为什么需要这样来。针对面试官提出的问题也做了一些反馈。这里我的一个条目被反驳了,我想写一个酒店数据API让第三方销售来接入,但事实应该是酒店去求第三方销售平台来接入,所以这个主次关系有些不对。但还好有惊无险的40分钟很快过去。 晚上说是有一个PARTY,其实就是一顿聚餐,有几个学长学姐一起陪着聊天。所以基本上也没有什么特别的地方。</p>
</li>
<li><p>17号去广州城里逛了一圈,由于每个人等面试的时间都是不一样的,等待比较辛苦…想着挂了也无所谓,反正来玩一圈~ 最后在下午三点多接到电话说过了,最后有一个HR面试~ 基本上这里只要没有人品问题都可以过。</p>
</li>
<li><p>18号上午11点半愉快地进行了HR面试,和TOM聊天甚欢,并成功拿到一个<code>录用通知书</code></p>
</li>
</ul>
<p>实习过程中每天有200块的transportation fee领着还是蛮愉快的,毕竟也没干什么事情。另外酒店属于比较高级的,非常舒服。</p>
<h3 id="实习的小结">实习的小结</h3><p>整个过程比较长,尤其是写文档的时间太长了。 据说最后的录用完全看面试官的心情,所以基本上也算是运气比较重要的。最后HR送了我们一句话,我觉得非常有意思,虽然他用一长串英语翻译之后我们根本不知道是什么,翻译成中文是“塞翁失马,焉知非福”,我想对于这次实习,不仅收获了一个offer,更多的是认识的这么多有趣的朋友。大家都是从各处来的,有西安、杭州、南京、香港,还有一个香港来的韩国妹子,说的一口好中文,虽然多数时间她是用英语在讲。另外还有WAP的work staff~</p>
<p>这次经历收获是蛮多的,最近要开题了,还不知道做什么呢 0.0 </p>
]]></content>
<summary type="html">
<![CDATA[<h2 id="Works_Appliations">Works Appliations</h2><h3 id="面试经过">面试经过</h3><p>关于这家公司的印象大致也就是给的工资比较多,比一般应届毕业生高出不少,其他就没有多少了。</p>
<p>后面通宣讲会知道是做ERP]]>
</summary>
<category term="Internship" scheme="https://wuyf.me/tags/Internship/"/>
<category term="Works Applications" scheme="https://wuyf.me/tags/Works-Applications/"/>
<category term="Diary" scheme="https://wuyf.me/categories/Diary/"/>
</entry>
<entry>
<title><![CDATA[基于token验证的web应用jAccount登录]]></title>
<link href="https://wuyf.me/2015/11/13/jaccount-login-for-token-based-webapp/"/>
<id>https://wuyf.me/2015/11/13/jaccount-login-for-token-based-webapp/</id>
<published>2015-11-13T15:01:19.000Z</published>
<updated>2017-01-13T05:13:24.000Z</updated>
<content type="html"><![CDATA[<p>最近在做一个学校的项目,需要提供给上海交通大学学生和老师使用,所以需要使用<a href="http://developer.sjtu.edu.cn/wiki/JAccount" target="_blank" rel="external">jAccount登录</a></p>
<h3 id="jAccount简介">jAccount简介</h3><p><a href="https://jaccount.sjtu.edu.cn/jaccount/index.jsp" target="_blank" rel="external">【详情看这里】</a></p>
<blockquote>
<p>jAccount认证体系是上海交通大学网络信息中心开发的用户认证体系。网络信息中心为每个注册的交大校园网用户提供了一个统一的网络账户,称为 jAccount</p>
</blockquote>
<p>然后jAccount里面包含的<a href="http://developer.sjtu.edu.cn/wiki/JAccount#.E8.BF.94.E5.9B.9E.E7.9A.84Hashtable" target="_blank" rel="external">信息如下</a>:</p>
<h3 id="checkLogin_返回的Hashtable中包含了该用户的一些属性,包括:">checkLogin 返回的Hashtable中包含了该用户的一些属性,包括:</h3><table>
<thead>
<tr>
<th style="text-align:center">属性名</th>
<th style="text-align:center">属性值</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">uid</td>
<td style="text-align:center">账号名(指jAccount)</td>
</tr>
<tr>
<td style="text-align:center">student</td>
<td style="text-align:center">yes:学生/no:教职员工/team:集体帐号/outside:校外用户/postphd:博士后/alumni:校友</td>
</tr>
<tr>
<td style="text-align:center">id</td>
<td style="text-align:center">工号/学号</td>
</tr>
<tr>
<td style="text-align:center">dept</td>
<td style="text-align:center">部门/院系</td>
</tr>
<tr>
<td style="text-align:center">chinesename</td>
<td style="text-align:center">姓名</td>
</tr>
</tbody>
</table>
<hr>
<p><strong>吐槽</strong>:这些属性我也是醉了,用户的身份居然用student用 yes/no…来表示。然后dept字段是院系以及部门信息,但这些数据居然是文字信息直接是人手动改的!</p>
<p>后来,我发现更让我震惊的事情就是堂堂交大,所有学生信息居然没有一个准确可靠的来源!比较准确的来源也有这么多信息未更新或者已经错误了。</p>
<hr>
<h3 id="回到正题">回到正题</h3><ol>
<li><p>jAccount基于Base64进行加密和解密,所以需要先导入相关依赖</p>
</li>
<li><p>想要使用jAccount来做认证,首先需要去一些部门盖章,步骤相当繁琐,此处省略1W字。申请完成之后会有一些资料包括jaccount key 和 secret当然还有一个开发包<strong>jaman.jar</strong></p>
</li>
<li><p>把key文件放在webapp/jakey文件夹下(可放置在别处)</p>
</li>
<li><p>好像这样就可以了。。。</p>
</li>
</ol>
<h3 id="jaccount的原理简单分析">jaccount的原理简单分析</h3><p>参考文档中有这样的示例代码:<br><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></pre></td><td class="code"><pre><span class="line">JAccountManager jam = <span class="keyword">new</span> JAccountManager(<span class="string">"jacw110330"</span>, getServletContext().getRealPath(<span class="string">"/"</span>));<span class="comment">// 创建JAccountManager对象</span></span><br><span class="line">Hashtable ht = jam.checkLogin(request, response, session, request.getRequestURI());<span class="comment">//checkLogin时做一些重定向</span></span><br><span class="line"><span class="keyword">if</span> (ht !=<span class="keyword">null</span> && jam.hasTicketInURL) {</span><br><span class="line"> jam.redirectWithoutTicket(response);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>
<p>JAccountManager.checkLogin里面做三个步骤的check</p>
<ol>
<li>hasValidTicket,检查url参数 jatkt(其中含userProfile的hashtable)</li>
<li>isSiteCookieValid,检查JASiteCookie 是否存在 (其中也含userProfile的hashtable)</li>
<li>重定向到jaccount登录页面</li>
<li>登录后返回到 <code>jam.checkLogin()</code> 提供的returnUrl上</li>
</ol>
<p>如果是基于token验证的应用,这里拿到学生信息之后可以进行匹配并生成token返回。</p>
<h3 id="登出">登出</h3><p>jam提供一个<code>logout</code>函数,但调用之后还是有点儿问题,cookie清除不对,研究了几天了还是没结果… 下次如果记得会补上,这个问题必须修的。</p>
]]></content>
<summary type="html">
<![CDATA[<p>最近在做一个学校的项目,需要提供给上海交通大学学生和老师使用,所以需要使用<a href="http://developer.sjtu.edu.cn/wiki/JAccount" target="_blank" rel="external">jAccount登录</a></]]>
</summary>
<category term="jAccount" scheme="https://wuyf.me/tags/jAccount/"/>
<category term="sjtu" scheme="https://wuyf.me/tags/sjtu/"/>
<category term="spring" scheme="https://wuyf.me/tags/spring/"/>
<category term="token based auth" scheme="https://wuyf.me/tags/token-based-auth/"/>
<category term="Tech" scheme="https://wuyf.me/categories/Tech/"/>
</entry>
<entry>
<title><![CDATA[HackShanghai 2015小记]]></title>
<link href="https://wuyf.me/2015/11/11/hackshanghai2015/"/>
<id>https://wuyf.me/2015/11/11/hackshanghai2015/</id>
<published>2015-11-10T16:13:21.000Z</published>
<updated>2017-01-13T05:13:25.000Z</updated>
<content type="html"><![CDATA[<p>上周末(2015.11.07-08)两天去上海纽约大学(一所很土豪的学校,据说学费是4.5万刀一年)参加了黑客马拉松比赛。</p>
<p>这是我第二次参加此活动,去年由畅哥带领着做了一次。上次参赛的项目大概的idea是用pepple watch发送简单的自定义消息。比如亲人间的示爱或者老年人危急时的求助消息。</p>
<p>这一次我们的想法也是结合硬件去做一些事情,但参赛前并没有非常具体,只是想看比赛方提供什么再决定做。当得知提供的硬件包括:Arduino/ Leap Motion/ Pebble/ Nao/ Google Cardboard 后,我就打算玩一下Nao机器人,再结合Leap Motion什么的做点儿有意思的东西~</p>
<p>(周六的时候先去报道注册,中午实验室聚餐还去吃了蟹王府,人均420应该是我自己掏钱吃过最贵的餐了TAT。 在eBay实习时去的和平饭店一直是我的巅峰)</p>
<h3 id="关于Nao机器人">关于Nao机器人</h3><p>下午3点多吃完饭到NYU Shanghai 参加比赛才得知<strong>图灵机器人</strong>只提供一台Nao机器人给大家用,而那个叫<strong>图灵机器人</strong>的家伙是一个人工智能的API。我们就把我们的参赛想法提交给他们之后等消息。。。</p>
<p>以下是我们一开始的想法:</p>
<blockquote>
<p>中国在过去的几十年里度过了一个很漫长的独生子女阶段,父母在忙碌时往往会给幼儿带来孤独的生长环境,所以幼儿更需要一个智慧的可以互相交互的有趣玩伴,我们想创造一个和幼儿互动玩乐的新方式,通过leap motion输入指令,云端传输数据,无论家长远在公司,还是近在家里,都可以将自己的动作转化成nao的乐趣行为,为孩子带来一个更美好有趣的童年。</p>
</blockquote>
<p>最终我们组的idea过了一关,拿到Nao机器人的玩耍权。</p>
<p>哈,听上去确实有点儿远大。我们也知道怎么实现。拿到机器人才知道问题挺多的。</p>
<h3 id="首先,我们不知道怎么让机器人动起来。">首先,我们不知道怎么让机器人动起来。</h3><p>图灵机器人只给了一个email,大概讲述了一下资料怎么来。我们需要在第一次使用的时候登录Nao机器人(用网线连接。。。)我们都没有带 ,只能问工作人员。申请了好久,大概5点多才拿到线…</p>
<p>用网线连接Nao机器人,按一下按钮,Nao自动读出IP地址“大家好,我是Nao,我的互联网地址是十、两百零九…” 连接好之后再安装了<strong>choregraphe</strong> 一个IDE。这个IDE比较方便地让我们操作Nao机器人,并且提供了一些预置的功能比如说话、做动作、语音识别。</p>
<div class="figure nocaption fig-50"><a class="fancybox" href="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_3004/v1447221082/Choregraphe2_qu26yt.jpg" title="" target="_blank" rel="external"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,h_500/v1447221082/Choregraphe2_qu26yt.jpg" ui1""="" width="" height="" alt=""></a></div>
<div class="figure nocaption fig-50"><a class="fancybox" href="https://res.cloudinary.com/denrcs4mp/image/upload/v1447221074/Choregraphe_exgbhc.jpg" title="" target="_blank" rel="external"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,h_500/v1447221074/Choregraphe_exgbhc.jpg" ui2""="" width="" height="" alt=""></a></div>
<p>感谢辛博提供的大力支持,王东老师实验室在前阵子无锡展会的时候用过Nao机器人,所以辛博在这方面有一些经验。原来Nao机器人内置一个Linux,所以可以运行Python。Python可以用来做为服务器处理socket请求或者做一个http服务器。所以我们改变了计划,转用python来做。</p>
<p>组员都不是很擅长Python,个人只是写过一个小小的爬虫,也是边查边写的… 所以在黑马24小时中我们怒学python!</p>
<p>Nao 提供了一系列SDK,其中包括C++, JAVA 和python(这些都是后面才慢慢发现的)但PythonSDK(pynaoqi-python-2.7)并不支持EI CAPTAIN… RLGL</p>
<h3 id="一开始进度非常慢">一开始进度非常慢</h3><p>第一天晚上12点之前 ,我们还只会拖动几个框框去让机器人自己做动作。但之后迅速找到方法,包括建立socket服务器之后建立http服务器来接收指令。 </p>
<p>所以我们凭借已经掌握的基本技术,做了一个如下的应用:</p>
<blockquote>
<p>家长可以通过远程操作(我们做的一个简单的Android应用程序)来操作机器人<br>机器人可以说话,做动作,背三字经,拍照并发回手机</p>
</blockquote>
<h3 id="演讲总是那么令我担心">演讲总是那么令我担心</h3><p>一开始在小赛场我们组进行演示的时候还是蛮顺利的,除了我因为紧张语速太快… (全程英语,语法应该有点乱) 不过评委也觉得挺新鲜,并没有提太多问题。所以我们也以为机器人就这样表演结束了。 把它关机并放在行李箱里准备还回去呢。结果在吃麦当劳的时候听到咱们的队伍名”Play with me”!进了TOP 9!</p>
<h3 id="总决赛有惊">总决赛有惊</h3><p>我们的操作基本上是可以进行的,但由于场地网络原因以及中间有一次“小六子”休眠了。。。我们跑出去调试了好久,最后有一阵居然连不上无线网,确实想吐槽。</p>
<p>不过还好我们发现了一段 江南Style的舞蹈,在一次次无法控制的最后放了出来 ,缓解了现场紧张的气氛。</p>
<p>视频放送如下:</p>
<div class="video-container"><iframe src="//player.vimeo.com/video/145360488" frameborder="0" allowfullscreen></iframe></div>
<h3 id="小结">小结</h3><p>HackShanghai比赛还是比较不错的黑客马拉松(号称全中国最大的黑客马拉松) 但本次活动在饮食、网络上都有一些槽点。参加比赛玩硬件的组还是比较多的,第一名是一个交互的游戏,看着也挺有意思。但我感觉做搜索引擎视频广告的创意比较厉害,甚至之后可能会成为一个广告投放的方向。 其他一些组的idea由于在外面调试小六子,所以没来得及看。</p>
<p>我发现我还是蛮有激情的,一晚上只睡了两三个小时,却依然精力旺盛!希望以后投入更多的精力到棒棒的idea上来, DO GREAT THINGS!</p>
]]></content>
<summary type="html">
<![CDATA[<p>上周末(2015.11.07-08)两天去上海纽约大学(一所很土豪的学校,据说学费是4.5万刀一年)参加了黑客马拉松比赛。</p>
<p>这是我第二次参加此活动,去年由畅哥带领着做了一次。上次参赛的项目大概的idea是用pepple watch发送简单的自定义消息。比如亲人]]>
</summary>
<category term="Android" scheme="https://wuyf.me/tags/Android/"/>
<category term="Nao Robot" scheme="https://wuyf.me/tags/Nao-Robot/"/>
<category term="Python" scheme="https://wuyf.me/tags/Python/"/>
<category term="hackshanghai" scheme="https://wuyf.me/tags/hackshanghai/"/>
<category term="Diary" scheme="https://wuyf.me/categories/Diary/"/>
</entry>
<entry>
<title><![CDATA[Sequel Pro 导出表结构图]]></title>
<link href="https://wuyf.me/2015/10/12/Sequel-Pro-export-table-schema-diagram/"/>
<id>https://wuyf.me/2015/10/12/Sequel-Pro-export-table-schema-diagram/</id>
<published>2015-10-11T16:52:28.000Z</published>
<updated>2017-01-13T05:13:26.000Z</updated>
<content type="html"><![CDATA[<h1 id="步骤">步骤</h1><ol>
<li>用Sequel Pro导出<a href="https://en.wikipedia.org/wiki/DOT_(graph_description_language" target="_blank" rel="external">Dot</a>)文件<figure class="highlight lasso"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">File<span class="subst">-> </span>Export<span class="attribute">...</span> <span class="subst">-> </span>Dot</span><br></pre></td></tr></table></figure>
</li>
</ol>
<p><img src="https://res.cloudinary.com/denrcs4mp/image/upload/c_scale,w_976/v1447171688/undefined_rbvm4m.png" alt="导出"></p>
<ol>
<li>用dot命令(需要先安装graphviz)将dot转为图片<figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">dot</span> <span class="tag">-Tjpg</span> <span class="tag">test</span><span class="class">.dot</span> > <span class="tag">test</span><span class="class">.jpg</span></span><br></pre></td></tr></table></figure>
</li>
</ol>
<p>最后导出的图如下:<br><img src="https://res.cloudinary.com/denrcs4mp/image/upload/v1447171824/undefined_euzdji.png" alt="图片"></p>
]]></content>
<summary type="html">
<![CDATA[<h1 id="步骤">步骤</h1><ol>
<li>用Sequel Pro导出<a href="https://en.wikipedia.org/wiki/DOT_(graph_description_language" target="_blank" rel="extern]]>
</summary>
<category term="Mac" scheme="https://wuyf.me/tags/Mac/"/>
<category term="Sequel Pro" scheme="https://wuyf.me/tags/Sequel-Pro/"/>
<category term="mysql" scheme="https://wuyf.me/tags/mysql/"/>
<category term="table schema" scheme="https://wuyf.me/tags/table-schema/"/>
<category term="Tools" scheme="https://wuyf.me/categories/Tools/"/>
</entry>
<entry>
<title><![CDATA[Error Could not symlink share/man/man7/]]></title>
<link href="https://wuyf.me/2015/10/12/brew-priviledge/"/>
<id>https://wuyf.me/2015/10/12/brew-priviledge/</id>
<published>2015-10-11T16:43:49.000Z</published>
<updated>2017-01-13T05:13:27.000Z</updated>
<content type="html"><![CDATA[<p>用brew安装包的时候出现<br><figure class="highlight inform7"><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">Error: Could not symlink share/<span class="keyword">man</span>/man7/graphviz.7 </span><br><span class="line">/usr/local/share/<span class="keyword">man</span>/man7 <span class="keyword">is</span> not writable.</span><br><span class="line">错误。</span><br></pre></td></tr></table></figure></p>
<p>原因是brew link的时候没有root权限,但又不建议用sudo。所以简单粗暴的方法是将/usr/local的owner改为当前用户</p>
<figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="keyword">chown</span> -R <span class="string">`whoami`</span> /usr/<span class="keyword">local</span></span><br></pre></td></tr></table></figure>
<hr>
<p>参考<a href="http://superuser.com/a/450207" target="_blank" rel="external">这里</a></p>
]]></content>
<summary type="html">
<![CDATA[<p>用brew安装包的时候出现<br><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2]]>
</summary>
<category term="Tech" scheme="https://wuyf.me/categories/Tech/"/>
</entry>
<entry>
<title><![CDATA[小A、小B和小C同学的外包项目]]></title>
<link href="https://wuyf.me/2015/10/02/B/"/>
<id>https://wuyf.me/2015/10/02/B/</id>
<published>2015-10-01T16:00:00.000Z</published>
<updated>2017-01-13T05:13:28.000Z</updated>
<content type="html"><![CDATA[<h1 id="小A的项目">小A的项目</h1><p>小A最近在谈一个项目,对方是个品牌策划公司(N),负责帮一些知名企业如欧莱雅等策划线上推广方案。公司规划不大,但和欧方关系不错,所以承接了个在微信平台做一款新产品的宣传的项目。由于N公司技术方面没有储备,所以希望找到小A这样的几个同学把项目做下来。对于小A这样的学生来说N公司开价还算不错,所以小A和几个同学商量了一下准备这个项目。项目初期还和欧公司有详细的需求讨论和商议。</p>
<p>过了几天,N公司在明确了需求后打算和小A签署一份外包合同。由于缺乏经验,小A只是随便看了一眼。但马上发现合同上除了明确需求之外并无小A同学希望的有部分预付款。于是小A和N进行了协商。但N公司非常坚持一定要项目顺利完成并上线后才肯付全款。小A在咨询了一些同学的意见之后觉得存在一定风险,并和N公司协商放弃了本次活动的承接。</p>
<h1 id="小B的项目">小B的项目</h1><p>小B也在不久前和一家公司(M)协商做一个兰蔻产品的推广活动。由于是朋友介绍,所以小B没有细看需求,只是关于对方提供的价格。他在觉得OK之后打算和另外一个同学一起做这个项目。在细化了所有需求并提供了完整的报价之后,M公司提出不与小B合作。原因是<strong>担心小B没有这方面的项目经验</strong>。所以M用更高的价格找了一家专门负责做类似产品的公司来做这个东西。</p>
<h1 id="小C的项目">小C的项目</h1><p>小C很开心地和小伙伴们说,他最近要承接一个“大”项目。项目大致是做一个国外一个线上销售平台。该项目需要做一个手机客户端和网页的管理系统。项目金额大概在20W左右。他说他们基本上拟好了合同,就等合同一签,资金到位马上开工。</p>
<p>可第二天见到小C的时候他似乎不怎么开心。听说对方找到的投资人改变了投资策略,打算不和他们合作了。需要重新做一个产品。</p>
<h1 id="讲讲软件工程学生外包">讲讲软件工程学生外包</h1><p>目前我听闻的计算机相关专业同学在做外包的人数非常多。在黄渡理工的苹果俱乐部同学们都挑着做项目(钱多,活少)。我也承接过一两个应用开发的项目,规模不算很大。在几个项目中我明显的感觉就是非常乱和不规范。比如</p>
<pre><code><span class="number">1.</span> 项目不签合同,或者只是非常简单的几句,不够明确。到最后交付的时候总是出现客户不满意,资金无法全额支付的情况。
<span class="number">2.</span> 由于<span class="number">1</span>的存在,许多项目过程中会出现非常多的意见分歧。学生报怨返工量大,客户报怨学生不负责
<span class="number">3.</span> 项目金额差异巨大。有时同学<span class="number">2</span>K就敢把一个做APP的项目承接下来,有时候随便做一个模块就是好几万。。。
...
当然,第<span class="number">3</span>条可能是由于客户的身份不同和学生实力不同导致
</code></pre><p>目前猪八戒这样的网站似乎对于软件工程项目的一些外包估价不准,导致并没有很流行。而类似平台上面的人员水平也各异,真实水平信息很难评估。而学生多数只靠朋友介绍来获取一些这样的资讯。</p>
<h1 id="问题就是这么多。">问题就是这么多。</h1>]]></content>
<summary type="html">
<![CDATA[<h1 id="小A的项目">小A的项目</h1><p>小A最近在谈一个项目,对方是个品牌策划公司(N),负责帮一些知名企业如欧莱雅等策划线上推广方案。公司规划不大,但和欧方关系不错,所以承接了个在微信平台做一款新产品的宣传的项目。由于N公司技术方面没有储备,所以希望找到小A这样]]>
</summary>
<category term="碎碎" scheme="https://wuyf.me/tags/%E7%A2%8E%E7%A2%8E/"/>
<category term="Diary" scheme="https://wuyf.me/categories/Diary/"/>
</entry>
<entry>
<title><![CDATA[新域名wuyongfeng.win]]></title>
<link href="https://wuyf.me/2015/09/29/Happy-Birthday/"/>
<id>https://wuyf.me/2015/09/29/Happy-Birthday/</id>
<published>2015-09-29T08:53:33.000Z</published>
<updated>2017-01-13T05:13:29.000Z</updated>
<content type="html"><![CDATA[<p>生日当天注册了个新的域名~</p>
]]></content>
<summary type="html">
<![CDATA[<p>生日当天注册了个新的域名~</p>
]]>
</summary>
<category term="Diary" scheme="https://wuyf.me/categories/Diary/"/>
</entry>
<entry>
<title><![CDATA[真不好意思说我学过sql]]></title>
<link href="https://wuyf.me/2015/09/08/mysql-calendar-table-usage/"/>
<id>https://wuyf.me/2015/09/08/mysql-calendar-table-usage/</id>
<published>2015-09-07T16:31:09.000Z</published>
<updated>2017-01-13T05:13:29.000Z</updated>
<content type="html"><![CDATA[<p>最近写查询遇到这样一个情况。我需要查到一段时间(比如2015-06-15到2015-07-01)内每一天的总价格。<br>可当我写sql查询的时候,发现如果一天没有内容,那么这一天的数据将不会被sql查出来,意味着从开始到结束的日期中可能会有中断。</p>
<figure class="highlight sql"><figcaption><span>查询.sql</span></figcaption><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"><span class="operator">select <span class="keyword">DATE_FORMAT</span>( <span class="keyword">cast</span>(created_at <span class="keyword">as</span> <span class="built_in">date</span>), <span class="string">'%Y-%m-%d'</span>) <span class="keyword">as</span> <span class="built_in">date</span>, <span class="keyword">count</span>(*) <span class="keyword">as</span> <span class="keyword">num</span> <span class="keyword">from</span> </span><br><span class="line"><span class="string">`order`</span> <span class="keyword">where</span> <span class="string">`id`</span> = <span class="number">3</span> <span class="keyword">and</span> <span class="string">`created_at`</span> <span class="keyword">between</span> <span class="string">'2015-06-15'</span> <span class="keyword">and</span> <span class="string">'2015-07-01'</span> </span><br><span class="line"><span class="keyword">group</span> <span class="keyword">by</span> <span class="keyword">cast</span>(created_at <span class="keyword">as</span> <span class="built_in">date</span>)</span></span><br></pre></td></tr></table></figure>
<p>这样的查询结果如下:<br><figure class="highlight cpp"><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="number">2015</span>-<span class="number">06</span>-<span class="number">22</span> <span class="number">2</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">23</span> <span class="number">25</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">24</span> <span class="number">60</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">25</span> <span class="number">41</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">26</span> <span class="number">65</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">27</span> <span class="number">72</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">28</span> <span class="number">81</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">29</span> <span class="number">87</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">30</span> <span class="number">59</span></span><br></pre></td></tr></table></figure></p>
<p>发现中间没有数据的日期没被正确填充。</p>
<p>在经过一番了解之后找到了一个比较靠谱的做法,如下:<br>首先根据这个 <a href="http://stackoverflow.com/questions/10132024/how-to-populate-a-table-with-a-range-of-dates/19587992#19587992" target="_blank" rel="external">PROCEDURE</a> 创建一个PROCEDURE 并插入数据</p>
<figure class="highlight oxygene"><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">DROP <span class="function"><span class="keyword">PROCEDURE</span> <span class="title">IF</span> <span class="title">EXISTS</span> <span class="title">FillCalendar</span>;</span></span><br><span class="line">DROP TABLE <span class="keyword">IF</span> EXISTS calendar;</span><br><span class="line"><span class="keyword">CREATE</span> TABLE <span class="keyword">IF</span> <span class="keyword">NOT</span> EXISTS calendar(date DATE <span class="keyword">NOT</span> NULL PRIMARY KEY);</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"> <span class="keyword">CREATE</span> <span class="function"><span class="keyword">PROCEDURE</span> <span class="title">FillCalendar</span><span class="params">(start_date DATE, end_date DATE)</span></span><br><span class="line"> <span class="title">BEGIN</span></span><br><span class="line"> <span class="title">DECLARE</span> <span class="title">crt_date</span> <span class="title">DATE</span>;</span></span><br><span class="line"> <span class="keyword">SET</span> crt_date = start_date;</span><br><span class="line"> <span class="keyword">WHILE</span> crt_date <= end_date <span class="keyword">DO</span></span><br><span class="line"> INSERT IGNORE <span class="keyword">INTO</span> calendar VALUES(crt_date);</span><br><span class="line"> <span class="keyword">SET</span> crt_date = ADDDATE(crt_date, INTERVAL <span class="number">1</span> DAY);</span><br><span class="line"> <span class="keyword">END</span> <span class="keyword">WHILE</span>;</span><br><span class="line"> <span class="keyword">END</span>$$</span><br><span class="line">DELIMITER ;</span><br><span class="line"></span><br><span class="line">CALL FillCalendar(<span class="string">'2000-01-01'</span>, <span class="string">'2050-12-31'</span>);<span class="comment">// 这里插入的是需要用的时间段,我在calendar表中插入了2000~2050年的数据</span></span><br></pre></td></tr></table></figure>
<p>插入完成之后就可以将<code>calendar</code>表和<code>order</code>表进行连接,在order表中缺少的字段,默认取0。这里应用了一个SQL的函数 <a href="http://stackoverflow.com/questions/13366488/coalesce-function-in-tsql" target="_blank" rel="external"><code>COALESCE</code></a></p>
<p>插入完后calendar表内容:<br><figure class="highlight cpp"><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">date</span><br><span class="line">----------</span><br><span class="line"><span class="number">2000</span>-<span class="number">01</span>-<span class="number">01</span></span><br><span class="line"><span class="number">2000</span>-<span class="number">01</span>-<span class="number">02</span></span><br><span class="line">...</span><br><span class="line"><span class="number">2015</span>-<span class="number">12</span>-<span class="number">30</span></span><br><span class="line"><span class="number">2050</span>-<span class="number">12</span>-<span class="number">31</span></span><br></pre></td></tr></table></figure></p>
<h4 id="COALESCE函数的作用">COALESCE函数的作用</h4><p><strong>返回其参数中第一个非空表达式</strong></p>
<figure class="highlight sql"><figcaption><span>更新后的sql</span></figcaption><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"><span class="operator">select a.<span class="built_in">date</span> ,<span class="keyword">COALESCE</span>(b.<span class="keyword">num</span>, <span class="number">0</span>) <span class="keyword">num</span> <span class="keyword">from</span> calendar a </span><br><span class="line"><span class="keyword">left</span> <span class="keyword">join</span></span><br><span class="line">(</span><br><span class="line">select <span class="keyword">DATE_FORMAT</span>( <span class="keyword">cast</span>(created_at <span class="keyword">as</span> <span class="built_in">date</span>), <span class="string">'%Y-%m-%d'</span>) <span class="keyword">as</span> <span class="built_in">date</span>, <span class="keyword">count</span>(*) <span class="keyword">as</span> <span class="string">`num`</span> <span class="keyword">from</span> <span class="string">`order`</span> <span class="keyword">where</span> <span class="string">`id`</span> = <span class="number">3</span> <span class="keyword">and</span> <span class="string">`created_at`</span> <span class="keyword">between</span> <span class="string">'2015-06-15'</span> <span class="keyword">and</span> <span class="string">'2015-07-01'</span> <span class="keyword">group</span> <span class="keyword">by</span> <span class="keyword">cast</span>(created_at <span class="keyword">as</span> <span class="built_in">date</span>)</span><br><span class="line">) b</span><br><span class="line"><span class="keyword">on</span> b.<span class="built_in">date</span>=a.<span class="built_in">date</span></span><br><span class="line"><span class="keyword">where</span> a.<span class="string">`date`</span> <span class="keyword">between</span> <span class="string">'2015-06-15'</span> <span class="keyword">and</span> <span class="string">'2015-07-01'</span></span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> a.<span class="string">`date`</span> <span class="keyword">asc</span></span></span><br></pre></td></tr></table></figure>
<p>这样得到的输出:<br><figure class="highlight cpp"><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"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">15</span> <span class="number">0</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">16</span> <span class="number">0</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">17</span> <span class="number">0</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">18</span> <span class="number">0</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">19</span> <span class="number">0</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">20</span> <span class="number">0</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">21</span> <span class="number">0</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">22</span> <span class="number">2</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">23</span> <span class="number">25</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">24</span> <span class="number">60</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">25</span> <span class="number">41</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">26</span> <span class="number">65</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">27</span> <span class="number">72</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">28</span> <span class="number">81</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">29</span> <span class="number">87</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">06</span>-<span class="number">30</span> <span class="number">59</span></span><br><span class="line"><span class="number">2015</span>-<span class="number">07</span>-<span class="number">01</span> <span class="number">0</span></span><br></pre></td></tr></table></figure></p>
<hr>
<p>这个问题一开始纠结了比较久,原因是在找有没有不加calendar表能做到同样的效果。还有那个COALESCE函数的用法。</p>
]]></content>
<summary type="html">
<![CDATA[<p>最近写查询遇到这样一个情况。我需要查到一段时间(比如2015-06-15到2015-07-01)内每一天的总价格。<br>可当我写sql查询的时候,发现如果一天没有内容,那么这一天的数据将不会被sql查出来,意味着从开始到结束的日期中可能会有中断。</p>
<figure ]]>
</summary>
<category term="calendar table" scheme="https://wuyf.me/tags/calendar-table/"/>
<category term="mysql" scheme="https://wuyf.me/tags/mysql/"/>
<category term="sql" scheme="https://wuyf.me/tags/sql/"/>
<category term="Diary" scheme="https://wuyf.me/categories/Diary/"/>
</entry>
<entry>
<title><![CDATA[前端,我只懂个皮毛]]></title>
<link href="https://wuyf.me/2015/09/02/my-ability-in-front-end/"/>
<id>https://wuyf.me/2015/09/02/my-ability-in-front-end/</id>
<published>2015-09-02T14:06:48.000Z</published>
<updated>2017-01-13T05:13:30.000Z</updated>
<content type="html"><![CDATA[<h1 id="从今天电面M家实习开始">从今天电面M家实习开始</h1><p>M家在北京招Intern,看到信息说是招Data Mining方面的实习生。想着挺高大上的,然后就抱着试一试,涨涨经验的心态发了一份自己的简历过去。</p>
<p>结果倒是挺快,第二天(今天,2015.09.02)应收到了电话面试。接到电话我略激动,想着一定要好好表现,争取留下好印象。激动得我把正在厨房煮汤这件事情都忘了…结果锅给烧焦了!</p>
<p>言归正传。这个电话面试是我经历最轻松,闲谈,扯淡的一次。</p>
<h1 id="面试过程">面试过程</h1><p>其实没有面试过程,整个过程就是在问我“你觉得你技术水平怎么样?”,“你觉得你在你同学中码代码能力怎样?”,”你希不希望参加到工程项目中,还是说要来做Research发一些文章?”。。。</p>
<p>前几个问题我真的不知道怎么回答。想到自己<code>可怜</code>的代码经验,基本上没有维护的github,以及一些简单的实习经历,一下子不知道怎么评价自己的代码能力。</p>
<p>我只能含糊其词地说,我能力应该还可以,但也不是同学中能力最突出的。毕竟我同学中还是有参加过ACM比赛,拿到过奖的人。至于算法啥的,他一概没问,然后问题直接就到了我做过的一些项目。我本来以为在SAP做的关于HANA和UI5的项目已经是比较不错,拿得出手的。结果人家好像一点儿也不care。反而问到我是不是会前端,于是故事开始了。</p>
<div class="figure center nocaption"><img class="fig-img" src="https://res.cloudinary.com/denrcs4mp/image/upload/v1441205040/frontend-backend_rkt1ex.jpg" width="" height="" alt=""></div>
<h1 id="我对于前端的想法">我对于前端的想法</h1><p>我做过一些前端的工作,包括给一个初创公司写一些网店功能模块,自己用 nodejs写毕业设计的时候都有涉及到。但要说我是不是对这方面感兴趣或者愿意到M家公司去实习。我的回答是否定的。原因很简单,我对前端只有敬畏之情,不像有个<a href="www.zhangwenli.com">学姐</a>确实是个牛人,前端大神。</p>
<p>而我的水平只是会用,懂些基本部局,会用bootstrap等框架写个界面,会两行javascript代码,用用jQuery什么的。要真说到前端的学问,我确实知道的太少了。最近加入到随米团队,团队采用的是前后端项目分离的架构。当我看到前端代码库的时候,第一反应是:”原来前端还可以这么写啊!”。从那一刻起,我就觉得我自己不是很会写前端了。</p>
<p>而至于以后就业,我就更加不会选择做一个前端工程师了。</p>
<hr>
<p>所以面试就这样结束了…</p>
<h2 id="然后就没有然后了。">然后就没有然后了。</h2><p>接下来,我打算做一份html版的简历。最近压力蛮大的…</p>
]]></content>
<summary type="html">
<![CDATA[<h1 id="从今天电面M家实习开始">从今天电面M家实习开始</h1><p>M家在北京招Intern,看到信息说是招Data Mining方面的实习生。想着挺高大上的,然后就抱着试一试,涨涨经验的心态发了一份自己的简历过去。</p>
<p>结果倒是挺快,第二天(今天,2015]]>
</summary>
<category term="front end" scheme="https://wuyf.me/tags/front-end/"/>
<category term="web" scheme="https://wuyf.me/tags/web/"/>
<category term="Diary" scheme="https://wuyf.me/categories/Diary/"/>
</entry>
<entry>
<title><![CDATA[hexo installation note]]></title>
<link href="https://wuyf.me/2015/09/02/hexo-install-note/"/>
<id>https://wuyf.me/2015/09/02/hexo-install-note/</id>
<published>2015-09-02T06:38:11.000Z</published>
<updated>2017-01-13T05:13:31.000Z</updated>
<content type="html"><![CDATA[<h2 id="Hexo">Hexo</h2><p>无意中参观了<a href="http://blog.guoyiliang.com/" target="_blank" rel="external">郭老板的博客</a> 发现powered by <a href="http://hexo.io" target="_blank" rel="external">Hexo</a> 终于找到一个比较不错的写博客的工具,里面的<a href="https://github.com/LouisBarranqueiro/tranquilpeak-hexo-theme" target="_blank" rel="external">主题</a>我也比较喜欢。</p>
<h2 id="Hexo_安装">Hexo 安装</h2><p>安装过程比较简单,按照<a href="https://hexo.io/docs/index.html" target="_blank" rel="external">官网步骤</a>就可以了。使用主题也参考官网步骤。<br>这个是我使用的主题<a href="https://github.com/LouisBarranqueiro/tranquilpeak-hexo-theme#quick-start" target="_blank" rel="external">tranquilpeak</a></p>
<p><a href="https://github.com/LouisBarranqueiro/tranquilpeak-hexo-theme/blob/master/docs/user.md#installation" target="_blank" rel="external">安装过程</a><br><em>下载安装</em></p>
<ol>
<li>下载最新版的<a href="https://github.com/LouisBarranqueiro/tranquilpeak-hexo-theme/releases/download/v1.3.0/tranquilpeak-hexo-theme-built-for-production-1.3.0.zip" target="_blank" rel="external">tranquilpeak,当时是1.3.0</a></li>
<li>解压后放到Hexo项目的themes中,并改名为tranquilpeak<br><em>Hexo 配置</em></li>
<li>更改<code>_config.yml</code> 文件中的<code>theme: tranquilpeak</code></li>
<li>如果想使用缩略图(thumbnail image)和背景大图(cover image)功能,设置:<code>post_asset_folder</code> 为<code>true</code></li>
<li>设置<code>relative_link</code>为<code>false</code></li>
<li>其他设置语言,左侧菜单栏等请移步<a href="https://github.com/LouisBarranqueiro/tranquilpeak-hexo-theme/blob/master/docs/user.md#tranquilpeak-configuration" target="_blank" rel="external">详细说明</a></li>
</ol>
<h2 id="为啥打算写博客">为啥打算写博客</h2><p>以前我也去玩过一些博客,比如新浪,百度空间。但时间久了发现没几个朋友来玩,所以也就放弃了。最近听说百度空间下线了…我在里面写的文章都被存到了百度云上面…这真让我难以接受。</p>
<p>github我一直关注,经常来上面寻找一些好的项目参考。同时,也会关注一些大牛小伙伴的动态。比如:</p>
<blockquote>
<p><a href="https://github.com/euyuil" target="_blank" rel="external">Euyuil</a><br><a href="https://github.com/guoylyy" target="_blank" rel="external">GYL</a><br><a href="https://github.com/sbhhbs" target="_blank" rel="external">sbhhbs</a><br>…</p>
</blockquote>
<p>写博客算是一种经验的积累,也让我不用再经常把一些笔记写在Evernote上面了,Evernote的免费账户60M/月确实不是很够用(但它适合即时记录一些笔记)</p>
<h2 id="以后的计划">以后的计划</h2><p>计划是打算有时间就来写写,多看代码,写心得。 尤其是一些踩过的坑,记录在这里让其他人可以参考,以便不受同样的苦。</p>
<p>最近心情不太好,但代码还是在写,博客的使用方法,Front-matters还在学习,继续努力吧~</p>
]]></content>
<summary type="html">
<![CDATA[<h2 id="Hexo">Hexo</h2><p>无意中参观了<a href="http://blog.guoyiliang.com/" target="_blank" rel="external">郭老板的博客</a> 发现powered by <a href="http:/]]>
</summary>
<category term="trivial" scheme="https://wuyf.me/tags/trivial/"/>
<category term="Diary" scheme="https://wuyf.me/categories/Diary/"/>
</entry>
<entry>
<title><![CDATA[xiaoji]]></title>
<link href="https://wuyf.me/2015/09/02/2015-09-02-xiaoji/"/>
<id>https://wuyf.me/2015/09/02/2015-09-02-xiaoji/</id>
<published>2015-09-01T16:07:13.000Z</published>
<updated>2015-09-01T16:07:13.000Z</updated>
<content type="html"></content>
<summary type="html">
</summary>
</entry>
</feed>