-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsearch.xml
6161 lines (5251 loc) · 320 KB
/
search.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
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
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Alcatraz 的安装与使用</title>
<url>/2016/04/22/Alcatraz/</url>
<content><![CDATA[<h3 id="什么是-Alcatraz-?"><a href="#什么是-Alcatraz-?" class="headerlink" title="什么是 Alcatraz ?"></a>什么是 Alcatraz ?</h3><blockquote>
<p>Alcatraz is an open-source package manager for Xcode 7+. It lets you discover and install plugins, templates and color schemes without the need for manually cloning or copying files. It installs itself as a part of Xcode and it feels like home.<br><a href="https://github.com/alcatraz/Alcatraz">Alcatraz</a> 是一款在 Xcode 7+ 以上用于管理开源包的工具。它可以帮你查找或安装 Xcode 插件、模板、颜色主题,不需要认为的克隆或拷贝文件,它就像是 Xcode 的一部分。</p>
</blockquote>
<span id="more"></span>
<p><strong>(注:Alcatraz 要求 Xcode 版本号为 7 以上)</strong></p>
<h3 id="Alcatraz-的安装"><a href="#Alcatraz-的安装" class="headerlink" title="Alcatraz 的安装"></a>Alcatraz 的安装</h3><ul>
<li>打开终端,在终端中输入:<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ curl -fsSL https://raw.github.com/alcatraz/Alcatraz/master/Scripts/install.sh | sh</code></pre></li>
<li>安装成功后显示如下,并重启 Xcode<br><img src="http://ww3.sinaimg.cn/large/006tNc79gw1f784eek7d0j30iy0dajue.jpg" alt="安装"></li>
<li>重启Xcode会提示你是否加载 Bundle,选择 <em><strong>Load Bundle</strong></em></li>
<li>按 <code>shift + command + 9</code> 或者 <code>Windows --> Package Manager</code> ,便可打开 Alcatraz 的图形界面</li>
</ul>
<p><img src="http://ww1.sinaimg.cn/large/006tNc79gw1f784ewdyxmj30i90hvq4y.jpg" alt="图形界面"></p>
<h3 id="Alcatraz-的卸载"><a href="#Alcatraz-的卸载" class="headerlink" title="Alcatraz 的卸载"></a>Alcatraz 的卸载</h3><ul>
<li>打开终端,在终端中输入:<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin</code></pre></li>
</ul>
<h3 id="Alcatraz-的使用"><a href="#Alcatraz-的使用" class="headerlink" title="Alcatraz 的使用"></a>Alcatraz 的使用</h3><ul>
<li>输入想要使用的插件,以 <code>KSImagedNamed</code> 为例,点击 <strong>INSTALL</strong> 便可安装<br><img src="http://ww4.sinaimg.cn/large/006tNc79gw1f784f87k07j30i90j3dh7.jpg" alt="install"></li>
<li>在项目中输入 <code>[UIImage imageNamed:]</code> 验证:<br><img src="http://ww1.sinaimg.cn/large/006tNc79gw1f784fo10mej30cj04kwfe.jpg" alt="KSImagedNamed"></li>
<li>Alcatraz 安装的插件都会下载到 <code>~/Library/Application Support/Alcatraz/Plug-ins</code> 文件夹下<br><img src="http://ww1.sinaimg.cn/large/006tNc79gw1f784g01elmj305k0313yn.jpg" alt="插件"></li>
<li>因此若要删除不使用的插件,可直接在该文件夹下删除,或者在图形界面点击 <strong>REMOVE</strong> ,删除所有插件:<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ rm -rf ~/Library/Application\ Support/Alcatraz/</code></pre></li>
</ul>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>工具使用</category>
</categories>
<tags>
<tag>Alcatraz</tag>
</tags>
</entry>
<entry>
<title>[Python] ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed</title>
<url>/2021/07/22/CERTIFICATE-VERIFY-FAILED/</url>
<content><![CDATA[<p>解决通过官网安装包安装 Python,执行 <code>pip install</code> 时报 ssl 证书验证失败错误:</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed</code></pre>
<span id="more"></span>
<p>按安装目录下 <code>ReadMe.rtf</code> 中说明双击执行同目录下 <code>Install Certificates.command</code> 文件:</p>
<img src="https://image.jqz3.tech/blog/20210722091112.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:50%;" />
<img src="https://image.jqz3.tech/blog/20210722095536.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:50%;" />
<p>参考资料:<a href="https://stackoverflow.com/questions/42098126/mac-osx-python-ssl-sslerror-ssl-certificate-verify-failed-certificate-verify/42098127#42098127">https://stackoverflow.com/questions/42098126/mac-osx-python-ssl-sslerror-ssl-certificate-verify-failed-certificate-verify/42098127#42098127</a></p>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>问题解决</category>
</categories>
<tags>
<tag>python</tag>
</tags>
</entry>
<entry>
<title>让 NS&UICollectionView 对齐</title>
<url>/2020/05/20/JQCollectionViewAlignLayout/</url>
<content><![CDATA[<h1 id="JQCollectionViewAlignLayout"><a href="#JQCollectionViewAlignLayout" class="headerlink" title="JQCollectionViewAlignLayout"></a>JQCollectionViewAlignLayout</h1><p>一个基于流式布局 (flow layout) 的自定义布局对象。支持设置 <code>NS&UICollectionView</code> 水平及竖直方向的对齐方式,以及从右到左及从左到右的排列顺序。</p>
<span id="more"></span>
<h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><p>可以通过 <code>git clone</code> 仓库,并在 <code>Examples</code> 文件夹下执行 <code>pod install</code>,然后用 Xcode 打开 <code>JQCollectionViewAlignLayout.xcworkspace</code> 并选择下列中的一个 scheme 运行对应的示例项目。</p>
<p><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/schemes.png?raw=true"></p>
<h3 id="iOS"><a href="#iOS" class="headerlink" title="iOS"></a>iOS</h3><p><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/eg-ios.png?raw=true"></p>
<h3 id="macOS"><a href="#macOS" class="headerlink" title="macOS"></a>macOS</h3><p><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/eg-osx.png?raw=true"></p>
<h3 id="tvOS"><a href="#tvOS" class="headerlink" title="tvOS"></a>tvOS</h3><p><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/eg-tvos.png?raw=true"></p>
<h2 id="对齐方式及排列方向"><a href="#对齐方式及排列方向" class="headerlink" title="对齐方式及排列方向"></a>对齐方式及排列方向</h2><table>
<thead>
<tr>
<th align="center">水平方向</th>
<th align="center">示例图片</th>
</tr>
</thead>
<tbody><tr>
<td align="center">默认流式<br />(<code>JQCollectionViewItemsHorizontalAlignmentFlow</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/h-flow.png?raw=true"></td>
</tr>
<tr>
<td align="center">居左<br />(<code>JQCollectionViewItemsHorizontalAlignmentLeft</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/h-left.png?raw=true"></td>
</tr>
<tr>
<td align="center">居中<br />(<code>JQCollectionViewItemsHorizontalAlignmentCenter</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/h-center.png?raw=true"></td>
</tr>
<tr>
<td align="center">居右<br />(<code>JQCollectionViewItemsHorizontalAlignmentRight</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/h-right.png?raw=true"></td>
</tr>
<tr>
<td align="center">平铺填充<br />(<code>JQCollectionViewItemsHorizontalAlignmentFlowFilled</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/h-flowfilled.png?raw=true"></td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th align="center">竖直方向</th>
<th align="center">示例图片</th>
</tr>
</thead>
<tbody><tr>
<td align="center">默认居中<br />(<code>JQCollectionViewItemsVerticalAlignmentCenter</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/v-center.png?raw=true"></td>
</tr>
<tr>
<td align="center">顶部对齐<br />(<code>JQCollectionViewItemsVerticalAlignmentTop</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/v-top.png?raw=true"></td>
</tr>
<tr>
<td align="center">底部对齐<br />(<code>JQCollectionViewItemsVerticalAlignmentBottom</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/v-bottom.png?raw=true"></td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th align="center">排列方向</th>
<th align="center">示例图片</th>
</tr>
</thead>
<tbody><tr>
<td align="center">默认从左到右<br />(<code>JQCollectionViewItemsDirectionLTR</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/d-ltr.png?raw=true"></td>
</tr>
<tr>
<td align="center">从右到左<br />(<code>JQCollectionViewItemsDirectionRTL</code>)</td>
<td align="center"><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/d-rtl.png?raw=true"></td>
</tr>
</tbody></table>
<h2 id="系统要求"><a href="#系统要求" class="headerlink" title="系统要求"></a>系统要求</h2><p>iOS 6.0 +</p>
<p>macOS 10.11 +</p>
<p>tvOS 9.0 +</p>
<h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p><code>JQCollectionViewAlignLayout </code> 可以通过 <a href="http://cocoapods.org/">CocoaPods</a> 安装,只需在你的 Podfile 里加上下面这行:</p>
<pre class="line-numbers language-ruby" data-language="ruby"><code class="language-ruby">pod 'JQCollectionViewAlignLayout'</code></pre>
<h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><h4 id="第一步:使用-JQCollectionViewAlignLayout-初始化-collection-view"><a href="#第一步:使用-JQCollectionViewAlignLayout-初始化-collection-view" class="headerlink" title="第一步:使用 JQCollectionViewAlignLayout 初始化 collection view"></a>第一步:使用 <code>JQCollectionViewAlignLayout</code> 初始化 collection view</h4><ul>
<li>可以像下面通过代码的方式:</li>
</ul>
<pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">// UICollectionView
JQCollectionViewAlignLayout *layout = [[JQCollectionViewAlignLayout alloc] init];
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
// NSCollectionView
JQCollectionViewAlignLayout *layout = [[JQCollectionViewAlignLayout alloc] init];
NSCollectionView *collectionView = ...;
collectionView.layout = layout;</code></pre>
<ul>
<li>也可以像下面通过在 Interface Builder 中设置:</li>
</ul>
<p><img src="https://github.com/Coder-ZJQ/JQCollectionViewAlignLayout/blob/master/images/ib-setup.png?raw=true"></p>
<h4 id="第二步:设置对齐方式及排列方向"><a href="#第二步:设置对齐方式及排列方向" class="headerlink" title="第二步:设置对齐方式及排列方向"></a>第二步:设置对齐方式及排列方向</h4><ul>
<li>可以像下面通过 property 为所有 section 设置:</li>
</ul>
<pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">layout.itemsHorizontalAlignment = JQCollectionViewItemsHorizontalAlignmentLeft;
layout.itemsVerticalAlignment = JQCollectionViewItemsVerticalAlignmentCenter;
layout.itemsDirection = JQCollectionViewItemsDirectionLTR;</code></pre>
<ul>
<li>也可以像下面通过 protocol 为每个 section设置:</li>
</ul>
<pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">// 1. 遵循 JQCollectionViewAlignLayoutDelegate 协议
@interface JQViewController () < UICollectionViewDataSource, JQCollectionViewAlignLayoutDelegate>
@end
@implementation JQViewController
// 2. 实现对应协议方法
- (JQCollectionViewItemsHorizontalAlignment)collectionView:(UICollectionView *)collectionView layout:(JQCollectionViewAlignLayout *)layout itemsHorizontalAlignmentInSection:(NSInteger)section {
// 返回 JQCollectionViewItemsHorizontalAlignment 枚举以设置水平对齐方式
}
- (JQCollectionViewItemsVerticalAlignment)collectionView:(UICollectionView *)collectionView layout:(JQCollectionViewAlignLayout *)layout itemsVerticalAlignmentInSection:(NSInteger)section {
// 返回 JQCollectionViewItemsVerticalAlignment 枚举以设置竖直对齐方式
}
- (JQCollectionViewItemsDirection)collectionView:(UICollectionView *)collectionView layout:(JQCollectionViewAlignLayout *)layout itemsDirectionInSection:(NSInteger)section {
// 返回 JQCollectionViewItemsDirection 枚举以设置排列方向
}
@end</code></pre>
<p><em>(剩下的使用与 <code>NS&UICollectionViewFlowLayout</code> 一致,也可打开<a href="./Examples">示例项目</a>查看更多细节)</em></p>
<h2 id="作者"><a href="#作者" class="headerlink" title="作者"></a>作者</h2><p>coder-zjq, <a href="mailto:zjq_joker@163.com">zjq_joker@163.com</a></p>
<h2 id="协议"><a href="#协议" class="headerlink" title="协议"></a>协议</h2><p>JQCollectionViewAlignLayout 遵循 MIT 协议,可以查看 LICENSE 文件获取更多信息。</p>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>编程相关</category>
<category>Objective-C</category>
</categories>
<tags>
<tag>UICollectionView</tag>
<tag>NSCollectionView</tag>
</tags>
</entry>
<entry>
<title>SVN 的简单使用</title>
<url>/2016/09/08/SVN/</url>
<content><![CDATA[<h3 id="创建代码库"><a href="#创建代码库" class="headerlink" title="创建代码库"></a>创建代码库</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ svnadmin create /Users/Joker/svn/MyRepo</code></pre>
<span id="more"></span>
<h3 id="设置代码库权限以及相关配置"><a href="#设置代码库权限以及相关配置" class="headerlink" title="设置代码库权限以及相关配置"></a>设置代码库权限以及相关配置</h3><p>修改代码库文件夹下的 <code>conf/svnserve.conf</code> 文件</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ vi /Users/Joker/svn/MyRepo/conf/svnserve.conf</code></pre>
<p>删除以下几项前的 <code>#</code> 号,表示代码库可读可写,用户密码等配置在 <code>passwd</code> 文件,授权信息在 <code>authz</code> 文件</p>
<pre class="line-numbers language-none"><code class="language-none"># anon-access = read
# auth-access = write
# password-db = passwd
# authz-db = authz </code></pre>
<h3 id="配置用户密码等信息"><a href="#配置用户密码等信息" class="headerlink" title="配置用户密码等信息"></a>配置用户密码等信息</h3><p>编辑代码库文件夹下的 <code>conf/passwd</code> 文件</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ vi /Users/Joker/svn/MyRepo/conf/passwd</code></pre>
<p>在 <code>[users]</code> 标签下添加用户信息,表示账号为:zjq,密码为:123</p>
<pre class="line-numbers language-none"><code class="language-none">[users]
zjq = 123</code></pre>
<h3 id="配置用户组或用户权限"><a href="#配置用户组或用户权限" class="headerlink" title="配置用户组或用户权限"></a>配置用户组或用户权限</h3><p>编辑代码库文件夹下的 <code>conf/authz</code> 文件</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ vi /Users/Joker/svn/MyRepo/conf/authz</code></pre>
<p>可以将若干用户分为一组,统一配置权限,<code>[/]</code> 表示代码库下所有文件,<code>rw</code> 表示可读可写</p>
<pre class="line-numbers language-none"><code class="language-none">[groups]
group1 = zjq, joker
[/]
@group1 = rw</code></pre>
<p>也可以单独给用户配置权限,注意给用户单独配置权限不需要 <code>@</code></p>
<pre class="line-numbers language-none"><code class="language-none">[/]
zjq = rw</code></pre>
<h3 id="启动-SVN-服务器"><a href="#启动-SVN-服务器" class="headerlink" title="启动 SVN 服务器"></a>启动 SVN 服务器</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ svnserve -d -r /Users/Joker/svn/MyRepo</code></pre>
<h3 id="使用-SVN"><a href="#使用-SVN" class="headerlink" title="使用 SVN"></a>使用 SVN</h3><h4 id="从本地导入代码至服务器"><a href="#从本地导入代码至服务器" class="headerlink" title="从本地导入代码至服务器"></a>从本地导入代码至服务器</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ svn import [file-path] [server-path] --username=zjq --password=123 -m "initialize"</code></pre>
<h4 id="从服务器下载代码至本地代码库"><a href="#从服务器下载代码至本地代码库" class="headerlink" title="从服务器下载代码至本地代码库"></a>从服务器下载代码至本地代码库</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ svn checkout [server-path] --username=zjq --password=123 [repo-path] </code></pre>
<h4 id="提交修改至服务器"><a href="#提交修改至服务器" class="headerlink" title="提交修改至服务器"></a>提交修改至服务器</h4><pre class="line-numbers language-bahs" data-language="bahs"><code class="language-bahs">$ svn commit -m "modified the file"</code></pre>
<h4 id="更新服务器代码至本地代码库"><a href="#更新服务器代码至本地代码库" class="headerlink" title="更新服务器代码至本地代码库"></a>更新服务器代码至本地代码库</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ svn update</code></pre>
<h4 id="查看帮助信息"><a href="#查看帮助信息" class="headerlink" title="查看帮助信息"></a>查看帮助信息</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ svn help</code></pre>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>工具使用</category>
<category>SVN</category>
</categories>
<tags>
<tag>SVN</tag>
</tags>
</entry>
<entry>
<title>block 的使用</title>
<url>/2016/08/27/block-usage/</url>
<content><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><ul>
<li><code>ReturnType</code>:你所想要返回的数据类型;</li>
<li><code>ParameterType</code>:你所要传递的参数类型;</li>
<li><code>parameterName</code>:你所要传递的参数名;</li>
<li><code>blockName</code>:你所构造的 block 名。</li>
</ul>
<span id="more"></span>
<p>(另外参数可以传入多个)</p>
<h3 id="作为变量"><a href="#作为变量" class="headerlink" title="作为变量"></a>作为变量</h3><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">ReturnType (^blockName)(ParameterType) = ^ReturnType (ParameterType parameterName) {
// Your code here...
};</code></pre>
<h3 id="作为属性"><a href="#作为属性" class="headerlink" title="作为属性"></a>作为属性</h3><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">@property (copy) ReturnType (^blockName) (ParameterType);</code></pre>
<h3 id="作为方法定义参数"><a href="#作为方法定义参数" class="headerlink" title="作为方法定义参数"></a>作为方法定义参数</h3><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">- (void)yourMethod:(ReturnType (^)(ParameterType))blockName;</code></pre>
<h3 id="作为方法传入参数"><a href="#作为方法传入参数" class="headerlink" title="作为方法传入参数"></a>作为方法传入参数</h3><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">[someObject doSomethingWithBlock: ^ReturnType (ParameterType parameterName) {
// Your code here...
}];</code></pre>
<h3 id="匿名-Block"><a href="#匿名-Block" class="headerlink" title="匿名 Block"></a>匿名 Block</h3><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">^ReturnType (ParameterType parameterName) {
// Your code here...
};</code></pre>
<h3 id="使用-typedef"><a href="#使用-typedef" class="headerlink" title="使用 typedef"></a>使用 <code>typedef</code></h3><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">typedef ReturnType (^blockName)(ParameterType);</code></pre>
<h3 id="内联-Block"><a href="#内联-Block" class="headerlink" title="内联 Block"></a>内联 Block</h3><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">^ReturnType (ParameterType parameterName) {
// Your code here...
}(parameterValue);</code></pre>
<h3 id="递归-Block"><a href="#递归-Block" class="headerlink" title="递归 Block"></a>递归 Block</h3><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">__block ReturnType (^blockName)(ParameterType) = [^ReturnType (ParameterType parameterName) {
if (returnCondition) {
blockName = nil;
return;
}
// Your code here...
} copy];
blockName(parameterValue);</code></pre>
<h3 id="作为返回值"><a href="#作为返回值" class="headerlink" title="作为返回值"></a>作为返回值</h3><pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">- (ReturnType(^)(ParameterType))methodName {
// Your code here...
}</code></pre>
<h3 id="在-swift-中(闭包)"><a href="#在-swift-中(闭包)" class="headerlink" title="在 swift 中(闭包)"></a>在 swift 中(闭包)</h3><pre class="line-numbers language-swift" data-language="swift"><code class="language-swift">var blockName = { (parameterName: ParameterType) -> ReturnType in
return returnValue;
}</code></pre>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>编程相关</category>
<category>Objective-C</category>
</categories>
</entry>
<entry>
<title>【面试题】block 相关</title>
<url>/2019/08/29/block/</url>
<content><![CDATA[<h2 id="block-的本质"><a href="#block-的本质" class="headerlink" title="block 的本质"></a>block 的本质</h2><blockquote>
<p>block 的本质是封装了函数调用及函数调用环境的 OC 对象。</p>
</blockquote>
<span id="more"></span>
<p>可以执行如下代码验证:</p>
<pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">#import <Foundation/Foundation.h>
/*
终端执行:
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m
获取的 block 相关结构体
*/
// impl 结构体
struct __block_impl {
void *isa;
int Flags;
int Reserved;
void *FuncPtr;
};
// block 描述信息
struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
};
// block 结构体
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
int a;
};
//__main_block_impl_0 结构体初始化
//((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, a))();
// 函数定义(需传入 __main_block_impl_0 结构体指针)
//static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
// int a = __cself->a; // bound by copy
// NSLog((NSString *)&__NSConstantStringImpl__var_folders_vz_ktjs0_fn5dg59rp_kggzsch80000gn_T_main_995593_mi_0, a);
//}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 声明变量供 block 捕获
int a = 10;
// 声明 block
void (^block)(void) = ^{
NSLog(@"%s:a: %d", __func__, a);
};
// 强转为 __main_block_impl_0 结构体指针
struct __main_block_impl_0 *blockImpl = (__bridge struct __main_block_impl_0 *)block;
// 打印变量,证明变量是否捕获成功
NSLog(@"__main_block_impl_0->a: %d", blockImpl->a);
// 获取函数指针
void (*func)(struct __main_block_impl_0 *) = blockImpl->impl.FuncPtr;
// 直接通过函数指针调用,证明是否执行 block 内部的代码
func(blockImpl);
}
return 0;
}</code></pre>
<p>打印输出:</p>
<img src="https://image.jqz3.tech/blog/20210829102657.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:50%;" />
<h2 id="外部变量的访问"><a href="#外部变量的访问" class="headerlink" title="外部变量的访问"></a>外部变量的访问</h2><table>
<thead>
<tr>
<th align="center">变量类型</th>
<th align="center">是否捕获到 block 内部</th>
<th align="center">访问方式</th>
</tr>
</thead>
<tbody><tr>
<td align="center">局部 auto 变量</td>
<td align="center">捕获</td>
<td align="center">值传递</td>
</tr>
<tr>
<td align="center">局部 static 变量</td>
<td align="center">捕获</td>
<td align="center">指针传递</td>
</tr>
<tr>
<td align="center">全局变量</td>
<td align="center">不捕获</td>
<td align="center">直接访问</td>
</tr>
</tbody></table>
<pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">#import <Foundation/Foundation.h>
int c = 30;
static int d = 40;
void blockCapture(void) {
int a = 10;
static int b = 20;
void (^block)(void) = ^{
NSLog(@"%d---%d---%d---%d", a, b, c, d);
};
a = 100;
b = 200;
c = 300;
d = 400;
block();
}</code></pre>
<pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">int c = 30;
static int d = 40;
struct __blockCapture_block_impl_0 {
struct __block_impl impl;
struct __blockCapture_block_desc_0* Desc;
int a;
int *b;
};
static void __blockCapture_block_func_0(struct __blockCapture_block_impl_0 *__cself) {
int a = __cself->a; // bound by copy
int *b = __cself->b; // bound by copy
NSLog((NSString *)&__NSConstantStringImpl__var_folders_vz_ktjs0_fn5dg59rp_kggzsch80000gn_T_main_426782_mi_2, a, (*b), c, d);
}</code></pre>
<h2 id="block-的类型"><a href="#block-的类型" class="headerlink" title="block 的类型"></a>block 的类型</h2><table>
<thead>
<tr>
<th>block 的类型</th>
<th>环境</th>
<th>副本源的配置存储域</th>
<th>复制效果</th>
</tr>
</thead>
<tbody><tr>
<td>__NSGlobalBlock__(_NSConcreteGlobalBlock)</td>
<td>没有访问 auto 变量</td>
<td>程序的数据区域(.data 区)</td>
<td>什么也不做</td>
</tr>
<tr>
<td>__NSStackBlock__(_NSConcreteStackBlock)</td>
<td>访问了 auto 变量</td>
<td>栈</td>
<td>从栈复制到堆</td>
</tr>
<tr>
<td>__NSMallocBlock__(_NSConcreteMallocBlock)</td>
<td>__NSStackBlock__ 调用了 copy</td>
<td>堆</td>
<td>引用计数增加</td>
</tr>
</tbody></table>
<img src="https://image.jqz3.tech/blog/block.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:33%;" />
<h2 id="block-的-copy"><a href="#block-的-copy" class="headerlink" title="block 的 copy"></a>block 的 copy</h2><blockquote>
<p>在 ARC 环境下,编译器会根据情况自动将栈上的 block 复制到堆上,比如以下情况</p>
<ul>
<li>block 作为函数返回值时</li>
<li>将 block 赋值给 __strong 指针时</li>
<li>block 作为 Cocoa API 中方法名含有 usingBlock 的方法参数时</li>
<li>block 作为 GCD API 的方法参数时</li>
</ul>
<p>MRC 下 block 属性的建议写法</p>
<ul>
<li><code>@property (copy, nonatomic) void (^block)(void);</code></li>
</ul>
<p>ARC 下 block 属性的建议写法</p>
<ul>
<li><p><code>@property (strong, nonatomic) void (^block)(void);</code></p>
</li>
<li><p><code>@property (copy, nonatomic) void (^block)(void);</code></p>
</li>
</ul>
</blockquote>
<h2 id="block-访问对象类型的-auto-变量"><a href="#block-访问对象类型的-auto-变量" class="headerlink" title="block 访问对象类型的 auto 变量"></a>block 访问对象类型的 auto 变量</h2><blockquote>
<p>当 block 内部访问了对象类型的 auto 变量时</p>
<ul>
<li>如果 block 是在栈上,将不会对 auto 变量产生强引用</li>
<li>如果 block 被拷贝到堆上<ul>
<li>会调用 block 内部的 copy 函数</li>
<li>copy 函数内部会调用 _Block_object_assign 函数</li>
<li>_Block_object_assign 函数会根据 auto 变量的修饰符(__strong、__weak、__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用</li>
</ul>
</li>
<li>如果 block 从堆上移除<ul>
<li>会调用 block 内部的 dispose 函数</li>
<li>dispose 函数内部会调用 _Block_object_dispose 函数</li>
<li>_Block_object_dispose 函数会自动释放引用的 auto 变量 (release)</li>
</ul>
</li>
</ul>
</blockquote>
<pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">#import <Foundation/Foundation.h>
@interface JQPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end
@implementation JQPerson
- (void)dealloc {
NSLog(@"%@: dealloc", self.name);
}
@end
typedef void(^JQBlock)(void);
void blockCopy(void) {
JQBlock block;
{
JQPerson *strongPerson = [[JQPerson alloc] init];
strongPerson.name = @"strong person";
JQPerson *person = [[JQPerson alloc] init];
person.name = @"weak person";
__weak JQPerson *weakPerson = person;
block = ^{
NSLog(@"-->%@", strongPerson.name);
NSLog(@"-->%@", weakPerson.name);
};
}
block();
NSLog(@"-------");
}</code></pre>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc -fobjc-arc -fobjc-runtime=ios-8.0.0 main.m</code></pre>
<pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">struct __blockCopy_block_impl_0 {
struct __block_impl impl;
struct __blockCopy_block_desc_0* Desc;
JQPerson *__strong strongPerson;
JQPerson *__weak weakPerson;
__blockCopy_block_impl_0(void *fp, struct __blockCopy_block_desc_0 *desc, JQPerson *__strong _strongPerson, JQPerson *__weak _weakPerson, int flags=0) : strongPerson(_strongPerson), weakPerson(_weakPerson) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __blockCopy_block_copy_0(struct __blockCopy_block_impl_0*dst, struct __blockCopy_block_impl_0*src) {
_Block_object_assign((void*)&dst->strongPerson, (void*)src->strongPerson, 3/*BLOCK_FIELD_IS_OBJECT*/);
_Block_object_assign((void*)&dst->weakPerson, (void*)src->weakPerson, 3/*BLOCK_FIELD_IS_OBJECT*/);
}
static void __blockCopy_block_dispose_0(struct __blockCopy_block_impl_0*src) {
_Block_object_dispose((void*)src->strongPerson, 3/*BLOCK_FIELD_IS_OBJECT*/);
_Block_object_dispose((void*)src->weakPerson, 3/*BLOCK_FIELD_IS_OBJECT*/);
}
static struct __blockCopy_block_desc_0 {
size_t reserved;
size_t Block_size;
void (*copy)(struct __blockCopy_block_impl_0*, struct __blockCopy_block_impl_0*);
void (*dispose)(struct __blockCopy_block_impl_0*);
} __blockCopy_block_desc_0_DATA = { 0, sizeof(struct __blockCopy_block_impl_0), __blockCopy_block_copy_0, __blockCopy_block_dispose_0};</code></pre>
<h2 id="block-修饰符"><a href="#block-修饰符" class="headerlink" title="__block 修饰符"></a>__block 修饰符</h2><blockquote>
<ul>
<li>__block 可以用于解决 block 内部无法修改 auto 变量值的问题</li>
<li>__block 不能修饰全局变量、静态变量 (static)</li>
<li>编译器会将 __block 修饰的变量包装成一个对象</li>
</ul>
</blockquote>
<pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
__block int a = 10;
void (^block)(void) = ^{
a = 20;
};
block();
}
return 0;
}</code></pre>
<pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp">struct __Block_byref_a_0 {
void *__isa;
__Block_byref_a_0 *__forwarding;
int __flags;
int __size;
int a;
};
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__Block_byref_a_0 *a; // by ref
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_a_0 *_a, int flags=0) : a(_a->__forwarding) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
__Block_byref_a_0 *a = __cself->a; // bound by ref
(a->__forwarding->a) = 20;
}
static void __main_block_copy_0(struct __main_block_impl_0*dst, struct __main_block_impl_0*src) {_Block_object_assign((void*)&dst->a, (void*)src->a, 8/*BLOCK_FIELD_IS_BYREF*/);}
static void __main_block_dispose_0(struct __main_block_impl_0*src) {_Block_object_dispose((void*)src->a, 8/*BLOCK_FIELD_IS_BYREF*/);}
static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
void (*copy)(struct __main_block_impl_0*, struct __main_block_impl_0*);
void (*dispose)(struct __main_block_impl_0*);
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0), __main_block_copy_0, __main_block_dispose_0};
int main(int argc, const char * argv[]) {
/* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;
__attribute__((__blocks__(byref))) __Block_byref_a_0 a = {(void*)0,(__Block_byref_a_0 *)&a, 0, sizeof(__Block_byref_a_0), 10};
void (*block)(void) = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, (__Block_byref_a_0 *)&a, 570425344));
((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);
}
return 0;
}</code></pre>
<h2 id="block-的内存管理"><a href="#block-的内存管理" class="headerlink" title="__block 的内存管理"></a>__block 的内存管理</h2><blockquote>
<ul>
<li>当 block 在栈上时,并不会对 __block 变量产生强引用</li>
<li>当 block 被 copy 到堆时<ul>
<li>会调用 block 内部的 copy 函数</li>
<li>copy 函数内部会调用 _Block_object_assign 函数</li>
<li>_Block_object_assign 函数会对 __block 变量形成强引用(retain)</li>
</ul>
</li>
<li>当block从堆中移除时<ul>
<li>会调用 block 内部的 dispose 函数</li>
<li>dispose 函数内部会调用 _Block_object_dispose 函数</li>
<li>_Block_object_dispose 函数会自动释放引用的 __block 变量(release)</li>
</ul>
</li>
</ul>
</blockquote>
<p><img src="https://image.jqz3.tech/blog/20210829155637.png?imageView2/0/q/75%7Cwatermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10"></p>
<p><img src="https://image.jqz3.tech/blog/20210829155710.png?imageView2/0/q/75%7Cwatermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10"></p>
<h2 id="block-的-forwarding-指针"><a href="#block-的-forwarding-指针" class="headerlink" title="__block 的 __forwarding 指针"></a>__block 的 __forwarding 指针</h2><img src="https://image.jqz3.tech/blog/20210829155412.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:50%;" />
<h2 id="block-的循环引用"><a href="#block-的循环引用" class="headerlink" title="block 的循环引用"></a>block 的循环引用</h2><blockquote>
<ul>
<li>__weak</li>
</ul>
<pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">__weak typeof(self) weakSelf = self;
self.block = ^{
NSLog(@"%@", weakSelf);
};</code></pre>
<img src="https://image.jqz3.tech/blog/20210829162447.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom: 25%;" />
<ul>
<li>__block 修饰,并在 block 内手动去除引用(必须要调用 block)</li>
</ul>
<pre class="line-numbers language-objectivec" data-language="objectivec"><code class="language-objectivec">__block id blockSelf = self;
self.block = ^{
NSLog(@"%@", blockSelf);
blockSelf = nil;
};
self.block();</code></pre>
<img src="https://image.jqz3.tech/blog/20210829162448.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:25%;" />
</blockquote>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>编程相关</category>
<category>Objective-C</category>
<category>面试相关</category>
<category>runtime</category>
</categories>
<tags>
<tag>block</tag>
</tags>
</entry>
<entry>
<title>Mac 上将 iPhone 备份存储至移动硬盘</title>
<url>/2023/02/16/change-iphone-backup-directory/</url>
<content><![CDATA[<p>Mac 上 iPhone 备份的存储路径默认为: <code>/Library/Application Support/MobileSync/Backup</code>,所以可以通过软连接指向其它目录的方式来欺骗系统,将备份文件存储至移动硬盘等其他外部介质。具体操作如下:</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"># 跳转到备份目录
cd ~/Library/Application\ Support/MobileSync/
# 移动备份文件至你想要保存的位置(这里我是移动到“Backup(iPhone)”移动硬盘下)
mv Backup /Volumes/'Backup(iPhone)'
# 生成移动位置软连接以替换原本的 Backup 目录
ln -s /Volumes/'Backup(iPhone)'/Backup/ ~/Library/Application\ Support/MobileSync/Backup</code></pre>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
</entry>
<entry>
<title>用 yarn 代替 npm 管理 React-Native 包依赖</title>
<url>/2016/11/22/change-npm-to-yarn/</url>
<content><![CDATA[<h3 id="首先得安装-yarn,可参考Yarn-Installation-on-macOS"><a href="#首先得安装-yarn,可参考Yarn-Installation-on-macOS" class="headerlink" title="首先得安装 yarn,可参考Yarn Installation on macOS"></a>首先得安装 yarn,可参考<a href="http://jqz3.tech/2016/10/13/yarn-installation/">Yarn Installation on macOS</a></h3><h3 id="在命令行中输入:"><a href="#在命令行中输入:" class="headerlink" title="在命令行中输入:"></a>在命令行中输入:</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ yarn global add react-native-cli</code></pre>
<p><img src="https://image.jqz3.tech/blog/2016-11-22-143436.jpg?imageView2/0/q/75%7Cwatermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10"></p>
<h3 id="之后使用-react-native-init-就是用-yarn-来下载包:"><a href="#之后使用-react-native-init-就是用-yarn-来下载包:" class="headerlink" title="之后使用 react-native init 就是用 yarn 来下载包:"></a>之后使用 react-native init 就是用 yarn 来下载包:</h3><p><img src="https://image.jqz3.tech/blog/2016-11-22-143004.jpg?imageView2/0/q/75%7Cwatermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10"></p>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>工具使用</category>
<category>yarn</category>
</categories>
<tags>
<tag>yarn</tag>
<tag>npm</tag>
</tags>
</entry>
<entry>
<title>处理 Chrome 浏览器打不开不安全的 https 链接</title>
<url>/2019/10/21/chrome-ssl-certificate-issue/</url>
<content><![CDATA[<ol>
<li>点击页面空白处</li>
<li>键盘输入 <code>thisisunsafe</code></li>
</ol>
<p><img src="https://image.jqz3.tech/blog/20211021104531.png?imageView2/0/q/75%7Cwatermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10"></p>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>问题解决</category>
</categories>
</entry>
<entry>
<title>利用 U 盘制作 macOS 系统盘</title>
<url>/2021/06/09/create-macos-install-media/</url>
<content><![CDATA[<h2 id="下载"><a href="#下载" class="headerlink" title="下载"></a>下载</h2><p><a href="macappstores://apps.apple.com/cn/app/macos-monterey/id1576738294?mt=12">macOS Monterey</a>、<a href="macappstores://apps.apple.com/cn/app/macos-big-sur/id1526878132?mt=12">macOS Big Sur</a>、<a href="macappstores://apps.apple.com/cn/app/macos-catalina/id1466841314?mt=12">macOS Catalina</a>、<a href="macappstores://apps.apple.com/cn/app/macos-mojave/id1398502828?mt=12">macOS Mojave</a> 或 <a href="macappstores://apps.apple.com/cn/app/macos-high-sierra/id1246284741?mt=12">macOS High Sierra</a> 的安装器会以 App 的形式下载到应用程序”文件夹,名称为“安装 macOS [版本名称]”。如果安装器在下载后打开,退出不要继续安装。</p>
<h2 id="创建可引导安装器"><a href="#创建可引导安装器" class="headerlink" title="创建可引导安装器"></a>创建可引导安装器</h2><p>打开命令行执行,以 macOS Big Sur 为例:</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ sudo /Applications/Install\ macOS\ Big\ Sur.app/Contents/Resources/createinstallmedia --volume /Volumes/YourVolume</code></pre>
<p><img src="https://image.jqz3.tech/blog/20210610013539.png?imageView2/0/q/75%7Cwatermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10"></p>
<p>参考链接:<a href="https://support.apple.com/zh-cn/HT201372">如何创建可引导的 macOS 安装器</a></p>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>工具使用</category>
</categories>
<tags>
<tag>macOS</tag>
</tags>
</entry>
<entry>
<title>Cycript 简单使用</title>
<url>/2020/08/06/cycript/</url>
<content><![CDATA[<h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>Cydia 里安装 Cycript:</p>
<img src="https://image.jqz3.tech/blog/20210806140902.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom: 25%;" />
<span id="more"></span>
<h3 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h3><p>连接 iPhone 并登陆,在终端执行:</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"># 查看需要 cycript 进程,以 AppStore 为例
ps -A | grep AppStore
# 通过进程 ID 启动 cycript
cycript -p 9514
# 或者通过进程名启动 cycript
cycript -p AppStore</code></pre>
<h3 id="常用指令"><a href="#常用指令" class="headerlink" title="常用指令"></a>常用指令</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"># [UIApplication sharedApplication]
UIApp
# 定义变量:var 变量名 = 变量值
var window = UIApp.keyWindow
window.rootViewController
# #+内存地址获取对象
#0x148027a00.rootViewController
# 已加载的所有 OC 类
ObjectiveC.classes
# 查看对象的所有成员变量
*window
# 递归打印view的所有子控件(跟LLDB一样的函数)
view.recursiveDescription().toString()
# 筛选出某种类型的对象
choose(UIViewController)</code></pre>
<h3 id="封装方法"><a href="#封装方法" class="headerlink" title="封装方法"></a>封装方法</h3><p>新建 <code>JQ.cy</code> 文件:</p>
<pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript">(function(exports) {
RootVC = function() {
return UIApp.keyWindow.rootViewController;
};
})(exports);</code></pre>
<p>将 <code>JQ.cy</code> 放置 <code>/usr/lib/cycript0.9/</code> 文件夹下:</p>
<img src="https://image.jqz3.tech/blog/20210806144521.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom: 50%;" />
<p>启动 cycript 导入 <code>JQ.cy</code> 并调用其中定义的方法:</p>
<img src="https://image.jqz3.tech/blog/20210806144853.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:50%;" />
<h3 id="常用操作"><a href="#常用操作" class="headerlink" title="常用操作"></a>常用操作</h3><p><code>ctrl</code> + <code>c</code>: 取消输入</p>
<p><code>ctrl</code> + <code>d</code>: 退出 cycript</p>
<p><code>command</code> + <code>r</code>: 清空屏幕</p>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>工具使用</category>
<category>逆向安全</category>
</categories>
<tags>
<tag>Cycript</tag>
</tags>
</entry>
<entry>
<title>Cydia 安装 Frida 16.0.8 版本时报错</title>
<url>/2023/02/02/cydia-install-frida-16-0-8-error/</url>
<content><![CDATA[<p>Cydia 在安装 Frida 16.0.8 版本时会有如下报错:</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">dpkg-deb --control subprocess returned error exit status 2
Sub-process /usr/libexec/cydia/cydo returned an error code (1)</code></pre>
<span id="more"></span>
<h3 id="解决:"><a href="#解决:" class="headerlink" title="解决:"></a>解决:</h3><p>第一种:安装旧版本</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"># 在 GitHub release 页下载旧版本,比如 frida_16.0.6_iphoneos-arm.deb
# 利用 scp 或者 iFunBox 等工具传输到手机
# 在手机对应目录下执行安装指令
dpkg -i frida_16.0.6_iphoneos-arm.deb</code></pre>
<p>第二种:在电脑上重新打包再传输到手机上安装</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"># 在电脑上
FRIDA_VERSION="16.0.8"
wget https://github.com/frida/frida/releases/download/"${FRIDA_VERSION}"/frida_"${FRIDA_VERSION}"_iphoneos-arm.deb frida_"${FRIDA_VERSION}"_iphoneos-arm.deb
mkdir frida_"${FRIDA_VERSION}"_iphoneos-arm
cd frida_"${FRIDA_VERSION}"_iphoneos-arm
ar -x ../frida_"${FRIDA_VERSION}"_iphoneos-arm.deb
zstd -d *.zst
xz *.tar
ar r frida_"${FRIDA_VERSION}"_iphoneos-arm-repacked.deb debian-binary control.tar.xz data.tar.xz
# 利用 scp 或者 iFunBox 等工具传输到手机
# 在手机对应目录下执行安装指令
FRIDA_VERSION="16.0.8"
dpkg -i "${FRIDA_VERSION}"_iphoneos-arm-repacked.deb</code></pre>
<p>参考链接:<a href="https://github.com/frida/frida/issues/2355">Error when installing Frida 16.0.8 on Cydia · Issue #2355 · frida/frida (github.com)</a></p>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>问题解决</category>
<category>逆向安全</category>
</categories>
<tags>
<tag>jailbreak</tag>
</tags>
</entry>
<entry>
<title>Flutter 安装</title>
<url>/2020/10/17/flutter-install/</url>
<content><![CDATA[<h3 id="下载-SDK"><a href="#下载-SDK" class="headerlink" title="下载 SDK"></a>下载 SDK</h3><ul>
<li>可以通过下载压缩包来获取最新的 <a href="https://storage.flutter-io.cn/flutter_infra_release/releases/stable/macos/flutter_macos_2.5.3-stable.zip">stable Flutter SDK</a>,然后将压缩包解压至目标路径,例如:</li>
</ul>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"># 将下载的压缩包解压
unzip ~/Downloads/flutter_macos_2.5.3-stable.zip
# 移动至 ~/.flutter 目录
mv flutter ~/.flutter</code></pre>
<span id="more"></span>
<ul>
<li>或者通过 git,例如:</li>
</ul>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"># 可指定分支 clone 对应版本 SDK
git clone -b stable https://github.com/flutter/flutter.git .flutter</code></pre>
<h3 id="环境变量配置"><a href="#环境变量配置" class="headerlink" title="环境变量配置"></a>环境变量配置</h3><p>下载完成后将 flutter 的可执行文件路径添加至配置文件(<code>.bash_profile</code>, <code>.zshrc</code> 等)中的 PATH 环境变量,例如将 Flutter SDK 下载至 <code>.flutter</code> 目录,则为:</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">export PATH="$PATH:~/.flutter/bin"</code></pre>
<h3 id="设置镜像地址(国内)"><a href="#设置镜像地址(国内)" class="headerlink" title="设置镜像地址(国内)"></a>设置镜像地址(国内)</h3><p>如果是在国内访问可在配置文件(<code>.bash_profile</code>, <code>.zshrc</code> 等)中加入以下环境变量,设置国内镜像地址:</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn</code></pre>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>编程相关</category>
<category>Flutter</category>
</categories>
<tags>
<tag>flutter</tag>
</tags>
</entry>
<entry>
<title>记录一些 flutter 相关资源</title>
<url>/2021/10/17/flutter-resource/</url>
<content><![CDATA[<h3 id="Website"><a href="#Website" class="headerlink" title="Website"></a>Website</h3><ul>
<li>Official: <a href="https://flutter.dev/">https://flutter.dev</a></li>
<li>GitHub: <a href="https://github.com/flutter">https://github.com/flutter</a><ul>
<li>Repo: <a href="https://github.com/flutter/flutter">https://github.com/flutter/flutter</a></li>
<li>Gallery: <a href="https://github.com/flutter/gallery">https://github.com/flutter/gallery</a><span id="more"></span></li>
</ul>
</li>
<li>Documentation: <a href="https://docs.flutter.dev/">https://docs.flutter.dev/</a><ul>
<li>Tutorials: <a href="https://docs.flutter.dev/reference/tutorials">https://docs.flutter.dev/reference/tutorials</a></li>
<li>Cookbook: <a href="https://docs.flutter.dev/cookbook">https://docs.flutter.dev/cookbook</a></li>
<li>Codelabs: <a href="https://docs.flutter.dev/codelabs">https://docs.flutter.dev/codelabs</a></li>
<li>Widget Index: <a href="https://docs.flutter.dev/reference/widgets">https://docs.flutter.dev/reference/widgets</a></li>
</ul>
</li>
<li>API reference documentation: <a href="https://api.flutter.dev/">https://api.flutter.dev/</a></li>
<li>Samples: <a href="https://flutter.github.io/samples/#">https://flutter.github.io/samples</a></li>
<li>Packages: <a href="https://pub.dev/flutter/packages">https://pub.dev/flutter/packages</a></li>
<li>Awesome Flutter:<ul>
<li>en: <a href="https://github.com/Solido/awesome-flutter">https://github.com/Solido/awesome-flutter</a></li>
<li>cn: <a href="https://github.com/crazycodeboy/awesome-flutter-cn">https://github.com/crazycodeboy/awesome-flutter-cn</a></li>
<li>tips: <a href="https://github.com/erluxman/awesomefluttertips">https://github.com/erluxman/awesomefluttertips</a></li>
</ul>
</li>
<li>Stack Overflow: <a href="https://stackoverflow.com/questions/tagged/flutter">https://stackoverflow.com/questions/tagged/flutter</a></li>
<li>Twitter: <a href="https://twitter.com/FlutterDev">https://twitter.com/FlutterDev</a></li>
<li>中文网: <a href="https://flutter.cn/">https://flutter.cn</a></li>
</ul>
<h3 id="Video"><a href="#Video" class="headerlink" title="Video"></a>Video</h3><ul>
<li>YouTube: <a href="https://www.youtube.com/flutterdev">https://www.youtube.com/flutterdev</a></li>
<li>Bilibili: <a href="https://space.bilibili.com/344928717">https://space.bilibili.com/344928717</a></li>
</ul>
<h3 id="Book"><a href="#Book" class="headerlink" title="Book"></a>Book</h3><ul>
<li> Flutter Apprentice: <a href="https://store.raywenderlich.com/products/flutter-apprentice-google">https://store.raywenderlich.com/products/flutter-apprentice-google</a></li>
</ul>
<script>
var style = document.createElement("style");
style.type = "text/css";
style.innerHTML = 'p{margin:0;}';
window.document.head.appendChild(style);
</script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>编程相关</category>
<category>Flutter</category>
</categories>
<tags>
<tag>flutter</tag>
</tags>
</entry>
<entry>
<title>通过 Apple Configurator 2 获取 ipa</title>
<url>/2021/06/10/get-ipa/</url>
<content><![CDATA[<h4 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h4><ul>
<li>手机已安装该应用</li>
<li>电脑安装 <a href="https://apps.apple.com/cn/app/apple-configurator-2/id1037126344?l=en&mt=12">Apple Configurator 2</a></li>
</ul>
<span id="more"></span>
<h4 id="操作"><a href="#操作" class="headerlink" title="操作"></a>操作</h4><p><strong>1. 手机连接电脑并信任,打开 Apple Configurator 2;</strong></p>
<p><strong>2. 选中设备点击添加应用:</strong></p>
<img src="https://image.jqz3.tech/blog/Screen%20Shot%202021-06-10%20at%2018.09.11.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:40%;" />
<p><strong>3. 选择需要获取的应用添加:</strong></p>
<img src="https://image.jqz3.tech/blog/20210610181040.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:33%;" />
<p><strong>4. 等待下载:</strong></p>
<img src="https://image.jqz3.tech/blog/20210610181138.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom: 50%;" />
<p><strong>5. 下载成功提示已安装,不要操作:</strong></p>
<img src="https://image.jqz3.tech/blog/20210610181232.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:50%;" />
<p><strong>6. 打开下列文件夹:</strong></p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">$ open ~/Library/Group\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets</code></pre>
<p>即可看到下载的 ipa:</p>
<img src="https://image.jqz3.tech/blog/20210610181336.png?imageView2/0/q/75|watermark/2/text/aHR0cHM6Ly9qcXozLnRlY2g=/font/bWljcm9zb2Z0IHlhaGVp/fontsize/360/fill/I0ZGRkZGRg==/dissolve/100/gravity/SouthEast/dx/10/dy/10" style="zoom:50%;" /><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kity.min.js"></script><script type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/kityminder.core.min.js"></script><script defer="true" type="text/javascript" src="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.js"></script><link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/mindmap.min.css">]]></content>
<categories>
<category>工具使用</category>
</categories>
<tags>
<tag>ipa</tag>
</tags>
</entry>
<entry>
<title>git cherry-pick</title>
<url>/2020/05/14/git-cherry-pick/</url>