-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
917 lines (583 loc) · 75.7 KB
/
index.html
File metadata and controls
917 lines (583 loc) · 75.7 KB
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
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
<title>even</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="description">
<meta property="og:type" content="website">
<meta property="og:title" content="even">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="even">
<meta property="og:description">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="even">
<meta name="twitter:description">
<link rel="alternative" href="/atom.xml" title="even" type="application/atom+xml">
<link rel="icon" href="/favicon.png">
<link rel="stylesheet" href="/css/style.css">
<script type="text/javascript">
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "//hm.baidu.com/hm.js?ca3b8898098a8ba37b08cd091aae42bb";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</head>
<body>
<div id="container">
<div class="left-col">
<div class="overlay"></div>
<div class="intrude-less">
<header id="header" class="inner">
<a href="/" class="profilepic">
<img lazy-src="https://avatars0.githubusercontent.com/u/1442247?v=3&s=460" class="js-avatar">
</a>
<hgroup>
<h1 class="header-author"><a href="/">evenluo</a></h1>
</hgroup>
<div class="switch-btn">
<div class="icon">
<div class="icon-ctn">
<div class="icon-wrap icon-house" data-idx="0">
<div class="birdhouse"></div>
<div class="birdhouse_holes"></div>
</div>
<div class="icon-wrap icon-ribbon hide" data-idx="1">
<div class="ribbon"></div>
</div>
<div class="icon-wrap icon-me hide" data-idx="3">
<div class="user"></div>
<div class="shoulder"></div>
</div>
</div>
</div>
<div class="tips-box hide">
<div class="tips-arrow"></div>
<ul class="tips-inner">
<li>菜单</li>
<li>标签</li>
<li>关于我</li>
</ul>
</div>
</div>
<div class="switch-area">
<div class="switch-wrap">
<section class="switch-part switch-part1">
<nav class="header-menu">
<ul>
<li><a href="/">主页</a></li>
<li><a href="/archives">所有文章</a></li>
</ul>
</nav>
<nav class="header-nav">
<div class="social">
<a class="github" target="_blank" href="https://github.com/evenluo" title="github">github</a>
<a class="zhihu" target="_blank" href="https://www.zhihu.com/people/luoyiwen" title="zhihu">zhihu</a>
<a class="mail" target="_blank" href="mailto:yiwenhuster@gmail.com" title="mail">mail</a>
</div>
</nav>
</section>
<section class="switch-part switch-part2">
<div class="widget tagcloud" id="js-tagcloud">
<a href="/tags/Rails/" style="font-size: 10px;">Rails</a> <a href="/tags/Sidekiq/" style="font-size: 10px;">Sidekiq</a> <a href="/tags/Ubuntu/" style="font-size: 10px;">Ubuntu</a> <a href="/tags/deploy/" style="font-size: 10px;">deploy</a> <a href="/tags/git/" style="font-size: 15px;">git</a> <a href="/tags/github/" style="font-size: 10px;">github</a> <a href="/tags/iOS/" style="font-size: 20px;">iOS</a> <a href="/tags/locale/" style="font-size: 10px;">locale</a> <a href="/tags/rails/" style="font-size: 10px;">rails</a> <a href="/tags/国际化/" style="font-size: 15px;">国际化</a> <a href="/tags/图像/" style="font-size: 10px;">图像</a>
</div>
</section>
<section class="switch-part switch-part3">
<div id="js-aboutme">我志愿做一个欢乐的小马驹</div>
</section>
</div>
</div>
</header>
</div>
</div>
<div class="mid-col">
<nav id="mobile-nav">
<div class="overlay">
<div class="slider-trigger"></div>
<h1 class="header-author js-mobile-header hide">evenluo</h1>
</div>
<div class="intrude-less">
<header id="header" class="inner">
<div class="profilepic">
<img lazy-src="https://avatars0.githubusercontent.com/u/1442247?v=3&s=460" class="js-avatar">
</div>
<hgroup>
<h1 class="header-author">evenluo</h1>
</hgroup>
<nav class="header-menu">
<ul>
<li><a href="/">主页</a></li>
<li><a href="/archives">所有文章</a></li>
<div class="clearfix"></div>
</ul>
</nav>
<nav class="header-nav">
<div class="social">
<a class="github" target="_blank" href="https://github.com/evenluo" title="github">github</a>
<a class="zhihu" target="_blank" href="https://www.zhihu.com/people/luoyiwen" title="zhihu">zhihu</a>
<a class="mail" target="_blank" href="mailto:yiwenhuster@gmail.com" title="mail">mail</a>
</div>
</nav>
</header>
</div>
</nav>
<div class="body-wrap">
<article id="post-一个大小写引发的血案" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/04/27/一个大小写引发的血案/" class="article-date">
<time datetime="2016-04-27T04:12:17.000Z" itemprop="datePublished">2016-04-27</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/04/27/一个大小写引发的血案/">一个大小写引发的血案</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>在我刚开始写ruby的时候,完全不知道ruby里面的命名规则是个什么鬼,在最开始的时候,有一些文件还是按照自己的习惯给文件名大写开头。这个在本机跑的时候没有任何问题,但是一旦开始要与其他类库交叉使用的时候,问题就来了。</p>
<p>首先是sidekiq, 总是提示<code>Cannot define multiple 'included' blocks for a Concern</code>,搜索了很多,一直解决不了,后来不得不提了个issue <a href="https://github.com/mperham/sidekiq/issues/2942" target="_blank" rel="external">sidekiq#2942</a>,大家在最后也可以看到得到了解答,去把大写开头的文件改成了小写。</p>
<p>我以为这就结束了,然而并没有。。我还是太naive了!这个问题之后遇到了一些问题,比如:<a href="http://evenluo.github.io/2016/04/26/%E5%A6%82%E4%BD%95%EF%BC%9A%E4%B8%80%E4%B8%AAserver%E4%B8%8A%E9%85%8D%E7%BD%AE%E5%A4%9A%E4%B8%AAgithub-deploy-key/" target="_blank" rel="external">如何:一个server上配置多个github-deploy-key</a>。这个问题的后半部分关于ssh-agent和代号使用问题也是我血肉之躯趟过的呀,最后的最后我仍然还有一个疑问,我甚至还给了github support发了邮件。下面是我的一个阐述:</p>
<blockquote>
<p>Hi John,</p>
<p>Thanks for the response. I realized that I may have made some mistake. I ran the ‘git clone git@github.com:LinkFirms/Apollo.git’ instead of ‘git clone git@apollo:LinkFirms/Apollo.git’. If I use the latter, It both work.</p>
<p>But I use <code>git clone git@github.com:LinkFirms/Apollo.git</code> because It seem to be the way my automatic deployment tool did. In the settings file:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">set :repository, 'git@github.com:LinkFirms/Apollo.git'</span><br><span class="line">set :branch, 'release'</span><br><span class="line">set :forward_agent, true</span><br></pre></td></tr></table></figure>
<p>and here is the <a href="https://github.com/mina-deploy/mina/blob/master/lib/mina/git.rb" target="_blank" rel="external">mina code</a> . As the code run , I think It goes ‘git clone git@github.com:LinkFirms/Apollo.git’ finally, But what confused me is that the deployment did work!</p>
<p>So What caused the difference?<br>(If I don’t make myself clear, please let me know.)</p>
<p>Thanks,<br>even</p>
</blockquote>
<p>github的ssh配置解决之后,万事大吉,只欠东风!但是,又碰到了一个问题</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">! Unable to load application: NameError: uninitialized constant Api::V1::BaseController::Authenticatable</span><br></pre></td></tr></table></figure>
<p>后来为了搞清楚到底是为什么,我把自己的mac环境也换成了puma来跑,一切都很正常,那到底什么为什么呢,是运行环境的问题,那行,我也用production环境跑,也没问题呀!这到底是为什么?!</p>
<p>于是,我又去打扰大神去提了个issue <a href="https://github.com/puma/puma/issues/972" target="_blank" rel="external">puma#972</a> 正如你们所见,他们说不关puma的事情。</p>
<p>我自己继续琢磨,觉得应该是部署环境的文件问题,导致了跟sidekiq同样的加载问题。所以我去查看了github上的release分支上这个对应的文件。事实证明:<strong>文件名还是大写!文件名还是大写!文件名还是大写!</strong>这不是坑爹呐!摔!请自行脑补我的反应。。</p>
<p>原来文件系统对大小写并不做区分,所以这个改动并没有push到github,参照 <a href="http://stackoverflow.com/questions/8904327/case-sensitivity-in-git" target="_blank" rel="external">Case sensitivity in Git</a> 之后,我终于完成了此次在一台服务器上部署多个项目的进程。大概都要崩溃了。。</p>
<p>多么痛的领悟</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/rails/">rails</a></li></ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-如何:一个server上配置多个github-deploy-key" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/04/26/如何:一个server上配置多个github-deploy-key/" class="article-date">
<time datetime="2016-04-26T09:19:04.000Z" itemprop="datePublished">2016-04-26</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/04/26/如何:一个server上配置多个github-deploy-key/">如何:一个server上配置多个github deploy key</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>如果您是一个github的使用者,那么你一定会接触到deploy key这个概念。deploy key基本就是github的权限控制了,被授予的机器才能有读或读写的能力。</p>
<p>如果你的server上只部署一个app的话,那用起来就很简单:</p>
<ol>
<li>通过ssh-keygen命令生成rsa凭证到 .ssh/ 文件夹下</li>
<li>拷贝对应的公钥文件内容</li>
<li>进入github的项目Settings中,选择左边栏Deploy keys</li>
<li>点击Add deploy keys,复制即可</li>
</ol>
<p>理论上以上四个步骤就足够,不过你还可以运行以下命令来测试ssh连接</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure>
<p>如果一切顺利,你将会得到:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Hi LinkFirms/Apollo! You've successfully authenticated, but GitHub does not provide shell access.</span><br></pre></td></tr></table></figure>
<p>在大多数情况下以上就够用了,<strong>但是</strong> …(是的,总是会有一个但是的)</p>
<p>如果当你碰到某种情景(比如不能土豪到一个app装在一个server上,同一个github组织下的两个项目等),需要将多个app在同一个server上host,那么你可能遇到一个麻烦:如何让命令知道我的另外一个项目的存在。事实上如果不做任何事情的话,你将总会遇到repo不存在或者检查权限的提示。经过一些搜索之后,借鉴 <a href="http://snipe.net/2013/04/multiple-github-deploy-keys-single-server/" target="_blank" rel="external">USING MULTIPLE GITHUB DEPLOY KEYS FOR A SINGLE USER ON A SINGLE LINUX SERVER</a> 这篇文章大概找到了解决方案。方法是通过ssh config的方式,来指定对应的请求,感兴趣的可以了解一下什么是ssh config:<a href="http://www.cyberciti.biz/faq/create-ssh-config-file-on-linux-unix/" target="_blank" rel="external">OpenSSH Config File Examples</a>。经试验,最终的解决方案与文中提供的答案略有出入。</p>
<p>步骤如下:</p>
<ol>
<li>按照之前的步骤为项目B再单独进行一遍,这样你就有了两对ssh key和秘钥,并均已添加到对应github项目的设定中。</li>
<li>在 .ssh/ 文件夹下创建 config 文件。</li>
<li>编辑config文件。</li>
</ol>
<p>示例config文件如下;</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">Host manhattan</span><br><span class="line"> HostName github.com</span><br><span class="line"> User git</span><br><span class="line"> IdentityFile /home/deploy/.ssh/id_rsa_manhattan</span><br><span class="line"></span><br><span class="line">Host apollo</span><br><span class="line"> HostName github.com</span><br><span class="line"> User git</span><br><span class="line"> IdentityFile /home/deploy/.ssh/id_rsa_apollo</span><br></pre></td></tr></table></figure>
<p>其中manhattan和apollo是两个项目配置的代号,在测试ssh连接的时候可以用这两个代号。比如:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">deploy@iZ28lie0h28Z:~$ ssh -T apollo</span><br><span class="line">Hi LinkFirms/Apollo! You've successfully authenticated, but GitHub does not provide shell access.</span><br><span class="line">deploy@iZ28lie0h28Z:~$ ssh -T manhattan</span><br><span class="line">Hi LinkFirms/Manhatton! You've successfully authenticated, but GitHub does not provide shell access.</span><br></pre></td></tr></table></figure>
<p>如此!便大功告成!</p>
<hr>
<p>可是还是有很多无辜的人说:为神马还是不行。解决方案来啦:首先请确定不是 <a href="http://sshkeychain.sourceforge.net/mirrors/SSH-with-Keys-HOWTO/SSH-with-Keys-HOWTO-6.html" target="_blank" rel="external">ssh-agent</a> 的问题,然后请不要再使用</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone git@github.com:LinkFirms/Apollo.git</span><br></pre></td></tr></table></figure>
<p>而是使用</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone git@apollo:LinkFirms/Apollo.git</span><br></pre></td></tr></table></figure>
<p>使用原来的方式的话,如果多个项目在同一个域名下(比如github.com),那么你只能连接到最先出现的那个项目。所以你需要以代号的方式,那样就能正确解析到其他的项目了。其实如果在测试连接的时候,打开详细说明的话就能看出一些问题,运行以下命令:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -vT apollo</span><br></pre></td></tr></table></figure>
<p>这样的话,就会把详细的流程打印出来,就会发现ssh在找到第一个匹配之后就不会再找了。</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/deploy/">deploy</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/git/">git</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/github/">github</a></li></ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-locale-Cannot-set-LC-CTYPE-to-default-locale-No-such-file-or-directory" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/04/25/locale-Cannot-set-LC-CTYPE-to-default-locale-No-such-file-or-directory/" class="article-date">
<time datetime="2016-04-25T03:27:49.000Z" itemprop="datePublished">2016-04-25</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/04/25/locale-Cannot-set-LC-CTYPE-to-default-locale-No-such-file-or-directory/">locale: Cannot set LC_CTYPE to default locale: No such file or directory</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>我们的阿里云机器是Ubuntu 11.04,经常会遇到这个问题:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">perl: warning: Setting locale failed.</span><br><span class="line">perl: warning: Please check that your locale settings:</span><br><span class="line"> LANGUAGE = "en_US:",</span><br><span class="line"> LC_ALL = (unset),</span><br><span class="line"> LC_CTYPE = "zh_CN.UTF-8",</span><br><span class="line"> LANG = "en_US.UTF-8"</span><br><span class="line"> are supported and installed on your system.</span><br><span class="line">perl: warning: Falling back to the standard locale ("C").</span><br></pre></td></tr></table></figure>
<p>输入命令:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">locale</span><br></pre></td></tr></table></figure>
<p>输出结果是:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">locale: Cannot set LC_CTYPE to default locale: No such file or directory</span><br><span class="line">locale: Cannot set LC_ALL to default locale: No such file or directory</span><br><span class="line">LANG=en_US.UTF-8</span><br><span class="line">LANGUAGE=en_US:</span><br><span class="line">LC_CTYPE=zh_CN.UTF-8</span><br><span class="line">LC_NUMERIC="en_US.UTF-8"</span><br><span class="line">LC_TIME="en_US.UTF-8"</span><br><span class="line">LC_COLLATE="en_US.UTF-8"</span><br><span class="line">LC_MONETARY="en_US.UTF-8"</span><br><span class="line">LC_MESSAGES="en_US.UTF-8"</span><br><span class="line">LC_PAPER="en_US.UTF-8"</span><br><span class="line">LC_NAME="en_US.UTF-8"</span><br><span class="line">LC_ADDRESS="en_US.UTF-8"</span><br><span class="line">LC_TELEPHONE="en_US.UTF-8"</span><br><span class="line">LC_MEASUREMENT="en_US.UTF-8"</span><br><span class="line">LC_IDENTIFICATION="en_US.UTF-8"</span><br><span class="line">LC_ALL=</span><br></pre></td></tr></table></figure>
<p>我们看到的确有两个找不到的warning,但是也不知道是为啥。最后对我真正起作用的是这个答案:<a href="http://stackoverflow.com/questions/21816121/ubuntu-server-strange-locale-issue" target="_blank" rel="external">Ubuntu server strange locale issue [closed]</a></p>
<p>看起来我们缺少了LC_ALL,所以我只运行了以下命令:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">export LC_ALL=en_US.UTF-8</span><br></pre></td></tr></table></figure>
<p>最后解决了问题。给大家以供参考</p>
<h3 id="后注"><a href="#后注" class="headerlink" title="后注"></a>后注</h3><p>以上也未能解决以上问题,大家可以参考这个链接 <a href="http://daker.me/2014/10/how-to-fix-perl-warning-setting-locale-failed-in-raspbian.html" target="_blank" rel="external">How to fix Perl warning setting locale failed on Raspbian</a></p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Ubuntu/">Ubuntu</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/locale/">locale</a></li></ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-Sidekiq-Cannot-define-multiple-included-blocks-for-a-Concern" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/04/21/Sidekiq-Cannot-define-multiple-included-blocks-for-a-Concern/" class="article-date">
<time datetime="2016-04-21T10:24:54.000Z" itemprop="datePublished">2016-04-21</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/04/21/Sidekiq-Cannot-define-multiple-included-blocks-for-a-Concern/">Sidekiq: Cannot define multiple 'included' blocks for a Concern</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>在了解了Sidekiq的强大之后,开始着手使用,谁知道一开始就碰上了问题:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><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">2016-04-21T10:23:40.101Z 16720 TID-oum74s8io INFO: Booting Sidekiq 4.1.1 with redis options {:namespace=>"sidekiq", :url=>"redis://127.0.0.1:6379/0"}</span><br><span class="line">Cannot define multiple 'included' blocks for a Concern</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/concern.rb:126:in `included'</span><br><span class="line">/Users/evenluo/Develop/Link Firms/Apollo/app/controllers/concerns/Authenticatable.rb:4:in `<module:Authenticatable>'</span><br><span class="line">/Users/evenluo/Develop/Link Firms/Apollo/app/controllers/concerns/Authenticatable.rb:1:in `<top (required)>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:457:in `load'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:457:in `block in load_file'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:647:in `new_constants_in'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:456:in `load_file'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:354:in `require_or_load'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:317:in `depend_on'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:233:in `require_dependency'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:472:in `block (2 levels) in eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:471:in `each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:471:in `block in eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:469:in `each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:469:in `eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:346:in `eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/application/finisher.rb:56:in `each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/application/finisher.rb:56:in `block in <module:Finisher>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `instance_exec'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `run'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:55:in `block in run_initializers'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:228:in `block in tsort_each'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:431:in `each_strongly_connected_component_from'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:349:in `block in each_strongly_connected_component'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `call'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each_strongly_connected_component'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:226:in `tsort_each'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:205:in `tsort_each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:54:in `run_initializers'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/application.rb:352:in `initialize!'</span><br><span class="line">/Users/evenluo/Develop/Link Firms/Apollo/config/environment.rb:5:in `<top (required)>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/sidekiq-4.1.1/lib/sidekiq/cli.rb:233:in `boot_system'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/sidekiq-4.1.1/lib/sidekiq/cli.rb:49:in `run'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/sidekiq-4.1.1/bin/sidekiq:12:in `<top (required)>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/sidekiq:22:in `load'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/sidekiq:22:in `<main>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `eval'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `<main>'</span><br></pre></td></tr></table></figure>
<p>这是多么地让人心痛啊。。</p>
<p>Ok, Let’s google this. And find one possible solution: <a href="https://www.stefanwienert.de/blog/2015/11/02/fix-sidekiq-loading-problem-cannot-define-multiple-included-blocks-for-a-concern/" target="_blank" rel="external">Fix Sidekiq loading problem: Cannot define multiple included blocks for a Concern</a></p>
<p>不过不幸的是,两个都未能解决了问题。所以我尝试打印一下是谁调用了这个文件,得到了这个:</p>
<p>调用方1:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><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></pre></td><td class="code"><pre><span class="line">FILE /Users/evenluo/Develop/Link Firms/Apollo/app/controllers/concerns/authenticatable.rb LOADED BY:</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:360:in `require_or_load'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:494:in `load_missing_constant'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:184:in `const_missing'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:526:in `load_missing_constant'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:184:in `const_missing'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:526:in `load_missing_constant'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:184:in `const_missing'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:526:in `load_missing_constant'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:184:in `const_missing'</span><br><span class="line">/Users/evenluo/Develop/Link Firms/Apollo/app/controllers/api/v1/base_controller.rb:2:in `<class:BaseController>'</span><br><span class="line">/Users/evenluo/Develop/Link Firms/Apollo/app/controllers/api/v1/base_controller.rb:1:in `<top (required)>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:360:in `require_or_load'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:317:in `depend_on'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:233:in `require_dependency'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:472:in `block (2 levels) in eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:471:in `each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:471:in `block in eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:469:in `each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:469:in `eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:346:in `eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/application/finisher.rb:56:in `each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/application/finisher.rb:56:in `block in <module:Finisher>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `instance_exec'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `run'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:55:in `block in run_initializers'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:228:in `block in tsort_each'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:431:in `each_strongly_connected_component_from'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:349:in `block in each_strongly_connected_component'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `call'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each_strongly_connected_component'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:226:in `tsort_each'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:205:in `tsort_each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:54:in `run_initializers'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/application.rb:352:in `initialize!'</span><br><span class="line">/Users/evenluo/Develop/Link Firms/Apollo/config/environment.rb:5:in `<top (required)>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/sidekiq-4.1.1/lib/sidekiq/cli.rb:233:in `boot_system'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/sidekiq-4.1.1/lib/sidekiq/cli.rb:49:in `run'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/sidekiq-4.1.1/bin/sidekiq:12:in `<top (required)>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/sidekiq:22:in `load'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/sidekiq:22:in `<main>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `eval'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `<main>'</span><br></pre></td></tr></table></figure>
<p>调用方2</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><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></pre></td><td class="code"><pre><span class="line">FILE /Users/evenluo/Develop/Link Firms/Apollo/app/controllers/concerns/Authenticatable.rb LOADED BY:</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:360:in `require_or_load'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:317:in `depend_on'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:233:in `require_dependency'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:472:in `block (2 levels) in eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:471:in `each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:471:in `block in eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:469:in `each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:469:in `eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/engine.rb:346:in `eager_load!'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/application/finisher.rb:56:in `each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/application/finisher.rb:56:in `block in <module:Finisher>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `instance_exec'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:30:in `run'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:55:in `block in run_initializers'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:228:in `block in tsort_each'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:431:in `each_strongly_connected_component_from'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:349:in `block in each_strongly_connected_component'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `call'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:347:in `each_strongly_connected_component'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:226:in `tsort_each'</span><br><span class="line">/Users/evenluo/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/tsort.rb:205:in `tsort_each'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/initializable.rb:54:in `run_initializers'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/railties-4.2.6/lib/rails/application.rb:352:in `initialize!'</span><br><span class="line">/Users/evenluo/Develop/Link Firms/Apollo/config/environment.rb:5:in `<top (required)>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/sidekiq-4.1.1/lib/sidekiq/cli.rb:233:in `boot_system'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/sidekiq-4.1.1/lib/sidekiq/cli.rb:49:in `run'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/gems/sidekiq-4.1.1/bin/sidekiq:12:in `<top (required)>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/sidekiq:22:in `load'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/sidekiq:22:in `<main>'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `eval'</span><br><span class="line">/Users/evenluo/.rvm/gems/ruby-2.3.0/bin/ruby_executable_hooks:15:in `<main>'</span><br></pre></td></tr></table></figure>
<p>很明显二者的调用方的确不是同一个。但是仍然没有什么用。于是我去sidekiq提了issue: <a href="https://github.com/mperham/sidekiq/issues/2942" target="_blank" rel="external">sidekiq#2942</a>,不知道会有怎样的结果,只能自求多福等待看看吧。</p>
<hr>
<p>后来问题得到了解决,大家可以从issue里看到这个问题的原因,大家最好还是遵从文件命名的规范呐,不然会出这种小屁问题</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Rails/">Rails</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Sidekiq/">Sidekiq</a></li></ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-文件加入gitignore之后为什么没有作用" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/04/20/文件加入gitignore之后为什么没有作用/" class="article-date">
<time datetime="2016-04-20T03:25:10.000Z" itemprop="datePublished">2016-04-20</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/04/20/文件加入gitignore之后为什么没有作用/">文件加入gitignore之后为什么没有作用</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>在使用git的时候,会经常用到gitignore文件,但是如果将文件路径添加到gitignore之后并没有立刻显示出效果,其实是因为一个缓存问题。可以运行如下代码:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git rm -rf --cached .</span><br><span class="line">git add .</span><br></pre></td></tr></table></figure>
<p>详细的解释参见<a href="http://stackoverflow.com/questions/25436312/gitignore-not-working" target="_blank" rel="external">Gitignore not working</a></p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/git/">git</a></li></ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-Image-Resizing-Techniques" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/02/09/Image-Resizing-Techniques/" class="article-date">
<time datetime="2016-02-09T08:43:44.000Z" itemprop="datePublished">2016-02-09</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/02/09/Image-Resizing-Techniques/">Image Resizing Techniques</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h3 id="图片尺寸调整技术"><a href="#图片尺寸调整技术" class="headerlink" title="图片尺寸调整技术"></a>图片尺寸调整技术</h3><blockquote>
<p>原文链接: <a href="http://nshipster.com/image-resizing/" target="_blank" rel="external">Image Resizing Techniques</a></p>
</blockquote>
<p>自有历史以来,iOS的开发者一直面临着一个困惑:“我要怎么调整一个图片的尺寸呢?”这个问题甚至导致了开发者与开发平台了相互不信任。网页搜索结果有数以千计,都声称自己才是真正的解决方案。</p>
<p>其实这个局面挺尴尬的。</p>
<p>本周的文章将试图基于经验深入了解各种实现方案的性能特性,而不是简单地认为谁是最佳方案。 最终在各种iOS平台上调整图片尺寸的方案中提供一个清晰的解释(对于OS X,适当地将UIImage变成NSImage)。</p>
<p>在继续阅读之前,请注意<br>在使用UIImageView时,大部分情况下手动调整图片的大小并不是很必要。我们可以通过给contentMode属性来实现大部分的需求,例举一下两个值:</p>
<ul>
<li>.ScaleAspectFit 以等比例的形式将图片的frame都显示在UIImageView中。</li>
<li>.ScaleAspectFill 以等比例的形式将图片充满整个:</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">imageView.contentMode = .ScaleAspectFit</span><br><span class="line">imageView.image = image</span><br></pre></td></tr></table></figure>
<h4 id="确定最终的尺寸"><a href="#确定最终的尺寸" class="headerlink" title="确定最终的尺寸"></a>确定最终的尺寸</h4><p>在所有工作之前,我们要先确定图片调整的目标大小。</p>
<p>以常量缩放</p>
<p>缩放一个图片最简单的方法就是设置一个常量。多数情况下,是希望通过除以一个整数来减少原来的尺寸(通过乘以整数来放大图片的需求比较少)。<br>单独为长宽分别计算最后得到一个新的CGSize:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let size = CGSizeMake(image.size.width / 2.0, image.size.height / 2.0)</span><br></pre></td></tr></table></figure>
<p>或者使用一个CGAffineTransform:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.5, 0.5))</span><br></pre></td></tr></table></figure>
<p>等比例缩放</p>
<p>等比例缩放在很多场景下都非常有用。AVMakeRectWithAspectRatioInsideRect是一个AVFoundation框架中很有用的一个方法,它会帮你解决计算方面的问题</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">import AVFoundation</span><br><span class="line">let rect = AVMakeRectWithAspectRatioInsideRect(image.size, imageView.bounds)</span><br></pre></td></tr></table></figure>
<h4 id="调整尺寸"><a href="#调整尺寸" class="headerlink" title="调整尺寸"></a>调整尺寸</h4><p>iOS有一系列的方法来实现图片的尺寸调整,当然他们也有着不同的能力和性能特性。</p>
<p>UIGraphicsBeginImageContextWithOptions & UIImage -drawInRect:</p>
<p>这是我们在UIKit框架中能够找到的最高级别封装的API。指定一个UIImage,配合一个临时的图形上下文(graphics context)就可以用UIGraphicsBeginImageContextWithOptions()和UIGraphicsGetImageFromCurrentImageContext()来渲染一个缩放后的版本:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">let image = UIImage(contentsOfFile: self.URL.absoluteString!)</span><br><span class="line">let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(0.5, 0.5))</span><br><span class="line">let hasAlpha = false</span><br><span class="line">let scale: CGFloat = 0.0 // Automatically use scale factor of main screen</span><br><span class="line"></span><br><span class="line">UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)</span><br><span class="line">image.drawInRect(CGRect(origin: CGPointZero, size: size))</span><br><span class="line"></span><br><span class="line">let scaledImage = UIGraphicsGetImageFromCurrentImageContext()</span><br></pre></td></tr></table></figure>
<p>UIGraphicsBeginImageContextWithOptions()创建了一个临时的渲染上下文(rendering context)到原始图片。第一个参数size是要调整到的尺寸。第二个参数isOpaque用来决定是否需要渲染alpha通道。如果将false赋给它然后作用于没有透明属性的图片可能会导致图片看起来有一种粉色色调的感觉。第三个参数scale是用于显示的缩放比例。如果设置为0.0,则会使用主屏幕的scale属性,对于Retina屏幕来说就是2.0或更高(iPhone 6 Plus则是3.0)</p>
<p>CGBitmapContextCreate & CGContextDrawImage</p>
<p>Core Graphics / Quartz 2D 提供了一个底层的API集合,它允许更多的高级设置。给定一个CGImage ,创建一个临时的位图上下文(bitmap context)用CGBitmapContextCreate()和CGBitmapContextCreateImage()来渲染缩放后的图片:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">let image = UIImage(contentsOfFile: self.URL.absoluteString!).CGImage</span><br><span class="line"></span><br><span class="line">let width = CGImageGetWidth(image) / 2.0</span><br><span class="line">let height = CGImageGetHeight(image) / 2.0</span><br><span class="line">let bitsPerComponent = CGImageGetBitsPerComponent(image)</span><br><span class="line">let bytesPerRow = CGImageGetBytesPerRow(image)</span><br><span class="line">let colorSpace = CGImageGetColorSpace(image)</span><br><span class="line">let bitmapInfo = CGImageGetBitmapInfo(image)</span><br><span class="line"></span><br><span class="line">let context = CGBitmapContextCreate(nil, width, height, bitsPerComponent, bytesPerRow, colorSpace, bitmapInfo)</span><br><span class="line"></span><br><span class="line">CGContextSetInterpolationQuality(context, kCGInterpolationHigh)</span><br><span class="line"></span><br><span class="line">CGContextDrawImage(context, CGRect(origin: CGPointZero, size: CGSize(width: CGFloat(width), height: CGFloat(height))), image)</span><br><span class="line"></span><br><span class="line">let scaledImage = UIImage(CGImage: CGBitmapContextCreateImage(context))</span><br></pre></td></tr></table></figure>
<p>CGBitmapContextCreate需要几个参数来构造一个上下文,它定义了需求的尺寸和每一个给定色彩空间通道的内存大小。在示例中,这些值都是从CGImage获取到的。接着,CGContextSetInterpolationQuality允许上下文插入像素以实现不同程度的保真结果。在这个情况下,’kCGInterpolationHigh’会返回最好的结果。CGContextDrawImage允许在给定的大小和位置绘制图片,允许为图片裁切特定的边,或者是符合一些特性集合,例如脸部检测等等。最后CGBitmapContextCreateImage从上下文中创建一个CGImage</p>
<p>CGImageSourceCreateThumbnailAtIndex</p>
<p>Image I/O框架很强大,但是相对比较少人了解。它独立于Core Graphics,可以在许多不同格式间读和写,获取照片元数据,执行一些常见的图片处理操作。这个框架提供了平台上最快的图片编码和解码速度,还提供高级的缓存机制,甚至能够增量地加载图片。<br>相比于同等效果的Core Graphics代码,CGImageSourceCreateThumbnailAtIndex提供了不同选项的简洁API</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">import ImageIO</span><br><span class="line"></span><br><span class="line">if let imageSource = CGImageSourceCreateWithURL(self.URL, nil) {</span><br><span class="line"> let options = [</span><br><span class="line"> kCGImageSourceThumbnailMaxPixelSize: max(size.width, size.height) / 2.0,</span><br><span class="line"> kCGImageSourceCreateThumbnailFromImageIfAbsent: true</span><br><span class="line"> ]</span><br><span class="line"></span><br><span class="line"> let scaledImage = UIImage(CGImage: CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options))</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>指定一个CGImageSource并设置选项,CGImageSourceCreateThumbnaiAtIndex就能创建了一个缩略图。尺寸调整由kCGImageSourceThumbnailMaxPixelSize决定。通过除以一个常量来以原图等比例指定一个最大的尺寸。通过指定kCGImageSourceCreateThumbnailFromImageIfAbsent或者kCGImageSourceCreateThumbnailFromImageAlways,Image I/O 能够自动为随后的调用缓存缩放结果。</p>
<h4 id="用Core-Image兰索斯重取样(Lanczos-Resampling)"><a href="#用Core-Image兰索斯重取样(Lanczos-Resampling)" class="headerlink" title="用Core Image兰索斯重取样(Lanczos Resampling)"></a>用Core Image兰索斯重取样(Lanczos Resampling)</h4><p>Core Image提供了一个内建的通过CILanczosScaleTranform实现的Lanczos Resampling功能。尽管是一个比UIKit更高级的API,但是Core Image中普遍使用的键值对编程使得他很笨重。<br>也就是说,至少模式是和其他Core Image工作流是一样的:创建一个变换滤镜,配置好,然后渲染输出一个图片。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">let image = CIImage(contentsOfURL: self.URL)</span><br><span class="line"></span><br><span class="line">let filter = CIFilter(name: "CILanczosScaleTransform")</span><br><span class="line">filter.setValue(image, forKey: "inputImage")</span><br><span class="line">filter.setValue(0.5, forKey: "inputScale")</span><br><span class="line">filter.setValue(1.0, forKey: "inputAspectRatio")</span><br><span class="line">let outputImage = filter.valueForKey("outputImage") as CIImage</span><br><span class="line"></span><br><span class="line">let context = CIContext(options: nil)</span><br><span class="line">let scaledImage = UIImage(CGImage: self.context.createCGImage(outputImage, fromRect: outputImage.extent()))</span><br></pre></td></tr></table></figure>
<p>CILanczosScaleTransform接受一个inputImage, inputScale和inputAspectRatio,从变量名字上就能知道他们是干什么的。CIContext用来通过一个CGImageRef来生成UIImage,因为UIImage(CIImage:)经常不能按照期望的那样。</p>
<h3 id="性能衡量"><a href="#性能衡量" class="headerlink" title="性能衡量"></a>性能衡量</h3><p>那么这些不同方法的性能如何呢?</p>
<p>以下是在一个运行iOS 8 GM版本的iPod Touch 5上,使用XCTestCase.measureBlock()得到了性能衡量结果:</p>
<h4 id="JPEG"><a href="#JPEG" class="headerlink" title="JPEG"></a>JPEG</h4><p>从NASA Visible Earth拿到一个12000*12000像素的图片,大约20MB,将其缩小到大约十分之一的大小。</p>
<table>
<thead>
<tr>
<th>Operation</th>
<th>Time(sec)</th>
<th>σ</th>
</tr>
</thead>
<tbody>
<tr>
<td>UIKit</td>
<td>0.002</td>
<td>22%</td>
</tr>
<tr>
<td>Core Graphics<sup>1</sup></td>
<td>0.006</td>
<td>9%</td>
</tr>
<tr>
<td>Image I/O2</td>
<td>0.001</td>
<td>121%</td>
</tr>
<tr>
<td>Core Image<sup>3, 4</sup></td>
<td>0.011</td>
<td>7%</td>
</tr>
</tbody>
</table>
<h4 id="PNG"><a href="#PNG" class="headerlink" title="PNG"></a>PNG</h4><p>缩放Postgres.app图标至十分之一的大小,1024*1024像素,大约1MB大小。</p>
<table>
<thead>
<tr>
<th>Operation</th>
<th>Time</th>
<th>(sec) σ</th>
</tr>
</thead>
<tbody>
<tr>
<td>UIKit</td>
<td>0.001</td>
<td>25%</td>
</tr>
<tr>
<td>Core Graphics<sup>5</sup></td>
<td>0.005</td>
<td>12%</td>
</tr>
<tr>
<td>Image I/O<sup>6</sup></td>
<td>0.001</td>
<td>82%</td>
</tr>
<tr>
<td>Core Image</td>
<td>0.234</td>
<td>43%</td>
</tr>
</tbody>
</table>
<ul>
<li>1, 5使用了不同的CGInterpolationQuality,对于性能的影响几乎可以忽略不计。</li>
<li>2相比同等Core Graphics函数的性能,一定程度的高度偏离的结果说明缓存缩略图的代价不菲。</li>
<li>3创建一个CIContext是一个异常消耗资源的操作。在测试中使用的时间最多。使用一个缓存了的实例会减少平均运行时时间至UIGraphicsBeginImageContextWithOptions的水准。</li>
<li>4, 7创建CIContext将参数kCIContextUseSoftwareRenderer设置为true使得相比于其他结果慢了许多。</li>
</ul>
<h2 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h2><ul>
<li>UIkit, Core Graphics 和 Image I/O 对大多数图片的缩放表现都良好</li>
<li>Core Image 在图片缩放的表现上并不佳。事实上,在官方的Core Image Programming Guide中的性能最佳实践这部分特别推荐使用Core Graphics或者Image I/O函数来裁切或事先降低取样图片。</li>
<li>对于大部分的缩放图片,UIGraphicsBeginImageContextWithOptions应该是最佳选择。</li>
<li>如果图片质量在考量范围之内,考虑使用CGBitmapContextCreate结合使用CGContextSetInterpolationQuality。</li>
<li>当想缩放图片以显示缩略图的时候,CGImageSourceCreateThumbnailAtIndex提供了一个渲染和缓存的一站式解决方案</li>
</ul>
<h2 id="NSmutableHipster"><a href="#NSmutableHipster" class="headerlink" title="NSmutableHipster"></a>NSmutableHipster</h2><p>在这里我想提醒大家,NSHipster的文章已经发布在了GitHub上,如果你想更正文章的错误或者有别的高见,请开启一个issue或是提交一个pull request。</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/iOS/">iOS</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/图像/">图像</a></li></ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-基于Xcode-6的国际化" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2015/12/13/基于Xcode-6的国际化/" class="article-date">
<time datetime="2015-12-13T05:41:40.000Z" itemprop="datePublished">2015-12-13</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2015/12/13/基于Xcode-6的国际化/">基于Xcode 6的国际化</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h3 id="过去的国际化"><a href="#过去的国际化" class="headerlink" title="过去的国际化"></a>过去的国际化</h3><p>app的国际化一直是很重要的环节,但是在Xcode 6以前,需要国际化的文件散落在不同的地方,例如Localizable.strings,InfoPlist.strings, storyboard.strings … 很多文件中,在国际化的过程中,往往是国际化团队翻译完成,然后移交给开发人员。开发人员在核对并填写入的过程中,难免有疏漏或错误,很是麻烦,直到Xcode 6</p>
<h4 id="优点"><a href="#优点" class="headerlink" title="优点"></a>优点</h4><ul>
<li>与开发人员分离,开发人员只需要导出与导入。</li>
<li>对非开发人员友好,容易理解和操作。</li>
<li>一个文件便可以解决所有的国际化工作。</li>
</ul>
<h4 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h4><ul>
<li>确保development language是不需要翻译的语言。更改方式:进入项目的pbproject文件,然后以编辑器打开,搜索developmentRegion,把它的值改为你不需要翻译的语言,如果是简体中文就是zh-Hans,英文就是Enligsh,这里我也不是很明白,为什么其他语言使用的都是标准缩写,而英语确是用的English而不是en</li>
<li>使用Xcode 6.3.2及以上版本。已知之前的版本在导出时做的不足够好,经常会失败。</li>
</ul>
<h4 id="导入与导出"><a href="#导入与导出" class="headerlink" title="导入与导出"></a>导入与导出</h4><p>在项目导航栏中点选项目,单击Editor,就可以执行导入与导出工作</p>
<h4 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h4><p>Xcode导出xliff文件的时候可能会遭遇各种问题,有的问题有错误信息提示有的没有,对于没有提示的错误,可以使用终端命令导出的方式,会遭遇到同样的错误,但是会有明确的提示告诉你问题出在哪里。</p>
<p>命令格式</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xcodebuild -exportLocalizations -localizationPath <dirpath> -project <projectname> [[-exportLanguage <targetlanguage>]]</span><br></pre></td></tr></table></figure>
<p>其中dirpath projectname targetlanguage是变量,记得去掉所有的尖括号和方括号</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/iOS/">iOS</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/国际化/">国际化</a></li></ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-iOS-app的默认语言" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2015/07/19/iOS-app的默认语言/" class="article-date">
<time datetime="2015-07-19T04:36:20.000Z" itemprop="datePublished">2015-07-19</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2015/07/19/iOS-app的默认语言/">iOS app的默认语言</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>上个月尝试为团队的标准国际化进程建立一套可遵循的指导方针,然后高高兴兴上了架,但是问题来了:</p>
<blockquote>
<p>我是一个韩国人,我的系统语言是韩文,为什么今天我更新app之后语言变成了中文?</p>
</blockquote>
<p>当然,这是我翻译过后的用户反馈。我马上测试了一下,发现当我在选择系统语言为日文的时候,app仍然是简体中文。那么问题出在哪里呢?</p>
<p>在我的脑海里,一直又一个这样的假设:当所有本地化语言都与iOS系统语言不符合的时候,Base Internationlization就应该起作用了,现在看起来并不是这么一回事儿。</p>
<p>在上一个版本中,我有更新了两个跟语言有关的地方:一个是pbproject中的developmentRegion和项目info.Plist文件中的Localization native development region,我起初一度以为这两者是一个东西,后来发现完全不是。那么问题来了:到底是谁在作怪呢?</p>
<p>事实证明:developmentRegion并不会影响到app默认语言的显示,他只是影响到了Project > Info > Localizations,在导出xliff文件中才会有作用。</p>
<p>在我把Localization native development region从China改到United States之后,这个问题就不再存在了。非美式英文,简体中文,台湾繁体的用户将会使用英文,并且国际化文件会使用Base文件。</p>
<h3 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h3><p>另外值得注意的是,在用户侧,iOS保有一个叫做『首选语言顺序』的东西。它可以在设置,通用,语言和的确分类下设置。这样的一个顺序干了这么一件事情:当app并未提供当前iOS系统的语言时,iOS会对比是否提供了『首选序言序列』中的其他语言,如果仍然没有才会显示默认语言。</p>
<p>而这个最终的默认语言,是由Localization native development region决定的。</p>
</div>
<div class="article-info article-info-index">
<div class="article-tag tagcloud">
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/iOS/">iOS</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/国际化/">国际化</a></li></ul>
</div>
<div class="clearfix"></div>
</div>
</div>
</article>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info">
<div class="footer-left">
© 2016 evenluo
</div>
<div class="footer-right">
<a href="http://hexo.io/" target="_blank">Hexo</a> Theme <a href="https://github.com/litten/hexo-theme-yilia" target="_blank">Yilia</a> by Litten
</div>
</div>
</div>
</footer>
</div>
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
<script>
var yiliaConfig = {
fancybox: true,
mathjax: true,
animate: true,
isHome: true,
isPost: false,
isArchive: false,
isTag: false,
isCategory: false,
open_in_new: false
}
</script>
<script src="http://7.url.cn/edu/jslib/comb/require-2.1.6,jquery-1.9.1.min.js"></script>
<script src="/js/main.js"></script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
processEscapes: true,
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
}
});
MathJax.Hub.Queue(function() {
var all = MathJax.Hub.getAllJax(), i;
for(i=0; i < all.length; i += 1) {
all[i].SourceElement().parentNode.className += ' has-jax';
}
});
</script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
</div>
</body>
</html>