-
Notifications
You must be signed in to change notification settings - Fork 1
/
atom.xml
2165 lines (1729 loc) · 312 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
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"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>E.K TechThinking</title>
<subtitle>Tech & Thinking & DevOps & Azure & VSTS</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://edwardkuo.imas.tw/"/>
<updated>2017-12-13T08:20:41.116Z</updated>
<id>http://edwardkuo.imas.tw/</id>
<author>
<name>Edward kuo</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>查詢Microsoft Teams群組中儲存檔案的容量</title>
<link href="http://edwardkuo.imas.tw/paper/2017/12/13/Devops/TeamsFileSize/"/>
<id>http://edwardkuo.imas.tw/paper/2017/12/13/Devops/TeamsFileSize/</id>
<published>2017-12-12T16:00:00.000Z</published>
<updated>2017-12-13T08:20:41.116Z</updated>
<content type="html"><![CDATA[<img src="https://docs.microsoft.com/zh-tw/media/hubs/microsoftteamshome/teams-skype-to-teams.svg">
<blockquote>
<blockquote>
<p>首先感謝微軟技術團隊提供支援,協同解決</p>
</blockquote>
</blockquote>
<p>當大家開始習慣使用<code>Microsoft Teams</code>時候,就會開始把習慣透過群組方式分享檔案給團隊成員, Office 365雖然有提供每個帳號1TB的Onedrive空間,但是,對於公用的空間卻是有限制的,其計算方式<code>1TB+Account個數x0.5G</code>,換句話說如果公司人數1000人,共用的空間大小則是<code>1.5G</code>。而這<code>1.5G</code>會被SharePoint和Microsoft Teams所儲存的檔案大小給瓜分。所以,感覺很多,但其實也不太夠用。</p>
<p>此外,Microsoft Teams是一個很獨特的工具,因為前端看見是Teams,但其實背後隱藏技術卻是被架構在SharePoint、Skype for Buinsess…等Office 365內的服務之上,所以,Microsoft Teams的檔案管理背後其實是被SharePoint管理,所以,當我們建立一個新的群組,等於是在Office 365上面建立一個SharePoint Web Site,只是在SharePoint Admin管理介面中看不到這些群組<br><img src="/blogimage/MicrosoftTeamsFile/B1.jpg" width="800"></p>
<p>這時候,就必須Teams的管理上真的還不夠人性化,在SharePoint Admin看不到,且在Office 365後台也沒有相關資訊,對於管理者來說真的不夠方便,不過,目前最差狀況就是還可以透過<code>PowerShell</code>管理,至少是還是有解決方式</p>
<h2 id="安裝SharePoint-Powershell模組"><a href="#安裝SharePoint-Powershell模組" class="headerlink" title="安裝SharePoint Powershell模組"></a>安裝SharePoint Powershell模組</h2><hr>
<p>既然要透過<code>PowerShell</code>管理,就必須先安裝相關管理模組,才能與Office 365連線溝通,首先必須下載<code>SharePoint Online 管理命令介面</code>,下載套件網址<br><a href="https://www.microsoft.com/zh-tw/download/details.aspx?id=35588" target="_blank" rel="external">https://www.microsoft.com/zh-tw/download/details.aspx?id=35588</a></p>
<h2 id="查詢Teams空間使用狀況"><a href="#查詢Teams空間使用狀況" class="headerlink" title="查詢Teams空間使用狀況"></a>查詢Teams空間使用狀況</h2><hr>
<p>這邊使用的<code>PowerShell</code>語法,基本上就是管理Office 365用的語法,如前面所說,Teams群組其實背後是SharePoint,所以,語法上等同於查詢SharePoint使用檔案空間狀況,下面逐步撰寫相關查詢語法</p>
<ol>
<li>建立Office 365連線,執行後會跳出帳號密碼輸入框,輸入密碼即可<figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#Format :[email protected]"</span></div><div class="line"><span class="variable">$AdminName</span> =<span class="string">"Office 365管理者帳號"</span></div><div class="line"><span class="variable">$O365Connection</span> = Get-Credential -UserName <span class="variable">$AdminName</span> -Message <span class="string">"Enter Office 365 Admin Credentials"</span></div><div class="line"><span class="variable">$O365Session</span> = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential <span class="variable">$O365Connection</span> -Authentication Basic -AllowRedirection</div><div class="line">Import-PSSession <span class="variable">$o365Session</span></div></pre></td></tr></table></figure>
</li>
</ol>
<img src="/blogimage/MicrosoftTeamsFile/B2.jpg" width="800">
<p>2.連線到SharePoint Admin Portal<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="variable">$SPAdminUrl</span> =<span class="string">"https://BBB-admin.sharepoint.com/"</span></div><div class="line">Connect-SPOService -Url <span class="variable">$SPAdminUrl</span> -Credential <span class="variable">$O365Connection</span></div><div class="line"><span class="variable">$TeamsGroups</span> = Get-UnifiedGroup -ResultSize Unlimited</div></pre></td></tr></table></figure></p>
<p><code>Get-UnifiedGroup</code>主要是列出所有群組列表,可以再放其他參數了解該群組的細節</p>
<p>3.列出群組使用的檔案大小<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="variable">$TeamsResult</span>=@() </div><div class="line">ForEach (<span class="variable">$TeamsGroups</span> <span class="keyword">in</span> <span class="variable">$TeamsGroups</span>)</div><div class="line">{</div><div class="line"> If(<span class="variable">$TeamsGroups</span>.SharePointSiteUrl <span class="_">-ne</span> <span class="variable">$null</span>) </div><div class="line"> {</div><div class="line"> <span class="variable">$TeamsGroupSite</span>=Get-SPOSite -Identity <span class="variable">$TeamsGroups</span>.SharePointSiteUrl </div><div class="line"> <span class="variable">$TeamsResult</span> += [PSCustomObject] @{ </div><div class="line"> GroupName = <span class="variable">$TeamsGroups</span>.DisplayName</div><div class="line"> SiteUrl = <span class="variable">$TeamsGroupSite</span>.Url </div><div class="line"> StorageUsed_inMB = <span class="variable">$TeamsGroupSite</span>.StorageUsageCurrent</div><div class="line"> StorageUsed_inGB=<span class="variable">$TeamsGroupSite</span>.StorageUsageCurrent/1024</div><div class="line"> StorageQuota_inGB = <span class="variable">$TeamsGroupSite</span>.StorageQuota/1024</div><div class="line"> WarningSize_inGB = <span class="variable">$TeamsGroupSite</span>.StorageQuotaWarningLevel/1024</div><div class="line"> }</div><div class="line"> <span class="variable">$Sum</span> +=<span class="variable">$TeamsGroupSite</span>.StorageUsageCurrent </div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>群組的SharePoint網址格式都會是<code>https://BBB.sharepoint.com/sites/Name</code><br><img src="/blogimage/MicrosoftTeamsFile/B3.jpg" width="800"></p>
<h2 id="限制Teams群組空間大小"><a href="#限制Teams群組空間大小" class="headerlink" title="限制Teams群組空間大小"></a>限制Teams群組空間大小</h2><hr>
<p>限制群組空間大小,是採用<code>MB</code>計算,空間計量設定有兩個地方,一個是警示容量大小,一個是可用容量大小,警示容量顧名思義就是當使用到警示容量會有提示功用,所以,設定容量限制時候,可用容量不可以小於警示容量,不然會出現錯誤,如果要自行設定容量大小,必須先在SharePoint的設定功能去變更<code>網站集合儲存空間管理</code>,必須改為手動<br><img src="/blogimage/MicrosoftTeamsFile/B4.jpg" width="800"></p>
<p>1.變更警示容量大小<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Set-SPOSite -Identity https://BBB.sharepoint.com/sites/groupname -StorageQuotaWarningLevel 5120</div></pre></td></tr></table></figure></p>
<p>2.變更容量大小<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Set-SPOSite -Identity https://BBB.sharepoint.com/sites/groupname -StorageQuota 6000</div></pre></td></tr></table></figure></p>
<p>使用上面兩行指令就可以變更容量大小了,如果想知道每個群組的設定值,也可以使用下面方式<br><figure class="highlight ps"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Get-SPOSite -Identity https://BBB.sharepoint.com/sites/groupname |fl StorageUsageCurrent, StorageQuota,StorageQuotaWarningLevel</div></pre></td></tr></table></figure></p>
<p>以上方式是<strong>目前</strong>唯一可以去管理Teams方式,希望之後可以把這些指令併入到原本O365平台內管理,此外,這邊另一個不好地方,就是用戶如果自行建立群組,是會被設定預設大小,所以,管理者必須定期掃描哪些是新建立群組,那些群組還沒有被限制空間大小,不然,哪邊某一個群組放上大量檔案,把共用空間用光,就會讓其他群組無法上傳檔案了</p>
<h2 id="參考資料"><a href="#參考資料" class="headerlink" title="參考資料"></a>參考資料</h2><hr>
<p>1.<a href="https://support.office.com/zh-tw/article/管理網站集合的儲存限制-77389c2c-8e7e-4b16-ab97-1c7103784b08" target="_blank" rel="external">管理網站集合的儲存限制</a><br>2.<a href="https://goo.gl/MgYf65" target="_blank" rel="external">https://technet.microsoft.com/zh-tw/library/mt238272(v=exchg.160).aspx</a></p>
]]></content>
<summary type="html">
<img src="https://docs.microsoft.com/zh-tw/media/hubs/microsoftteamshome/teams-skype-to-teams.svg">
<blockquote>
<blockquote>
<p>首先感謝微軟技術團隊提
</summary>
<category term="Microsoft Teams" scheme="http://edwardkuo.imas.tw/categories/Microsoft-Teams/"/>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
</entry>
<entry>
<title>VSTS整合資安工具Fortify達成自動化</title>
<link href="http://edwardkuo.imas.tw/paper/2017/12/04/Devops/VSTSFority/"/>
<id>http://edwardkuo.imas.tw/paper/2017/12/04/Devops/VSTSFority/</id>
<published>2017-12-03T16:00:00.000Z</published>
<updated>2017-12-05T16:17:20.681Z</updated>
<content type="html"><![CDATA[<img src="https://bright-side-of-life.com/wp-content/uploads/2017/05/post-fortify-fb.jpg">
<p>在資安逐步被重視的年代,企業會導入更多資安相關工具,除了本身伺服器或網路層的工具外,近年也針對程式碼進行安全性的掃瞄,目前其中市面上比較熱門的工具之一就是HPE Fortify,他本身可掃描的程式碼種類很多。在開發者端,可以透過Visual Studio的Plug in方式,安裝在Visual Studio,如果你又有Fortify Center的登入權限,便可以從Center將資安團隊設定好的規則下載下來,透過企業訂好的資安政策去掃描自己的程式碼,完畢之後,可以選擇把報告上傳到Center或是在本地自己觀看,掃描後的結果,不過,這邊我建議是上傳到Center中,可讀性會比較高,報表內容比較好看得懂</p>
<p>既然要走<code>DevOps</code>,當然除了在開發工具安裝外,也會希望在<code>CI</code>時候,也可以把資訊安全檢測的這一段給自動化,目前,VSTS可以透過外掛套件將Fortify整合進來,其套件名稱為<strong>Micro Focus Fortify</strong>,在 <a href="'https://marketplace.visualstudio.com/items?itemName=fortifyvsts.hpe-security-fortify-vsts'">點我</a> 來下載安裝</p>
<img src="/blogimage/VSTS/fority.jpg" width="700">
<h2 id="安裝Fortify"><a href="#安裝Fortify" class="headerlink" title="安裝Fortify"></a>安裝Fortify</h2><hr>
<p>這邊為什麼要多安裝Fortify這步驟,因為,雖然說套件可以幫忙做到自動化,但是它底層其實是必須先有Fortify核心,然後再透過PowerShell指令驅動它,然後進行程式碼的靜態掃描。今天如果是透過地端VSTS Agent來建置,建議是手動先把它安裝好,雖然,這個Plug in有提供<code>Fortify Static Code Analyzer Installation</code>,其中有些設定必須要有Admin權限,所以為了省掉這中間的麻煩,還是先手動安裝好</p>
<p>安裝HPE Fortify SCA其實不難,主要在於必須設定裡面的資訊。</p>
<h4 id="第一步"><a href="#第一步" class="headerlink" title="第一步"></a>第一步</h4><p>找到<code>HPE_Security_Fortify_SCA_and_Apps_17.10_windows_x64.exe</code>進行安裝,有買這產品的人,因該都會有這一個檔案,不過,這一個版本目前不支援掃描ASP.NET Core,必須等到<code>HPE_Security_Fortify_SCA_and_Apps_17.20_windows_x64.exe</code>才可以針對ASP.NET Core掃描。另外,會自動幫你安裝IDE的Plug in,不過,目前似乎不支援Visual Studio 2017版本,2017必須額外安裝Plug in。</p>
<h3 id="第二步"><a href="#第二步" class="headerlink" title="第二步"></a>第二步</h3><p>安裝過程到了一半,會請你輸入Software Security Center的URL,就看自己企業內部架設的Software Security Center網址填入進去就可以,SSC網址會類似這樣: <a href="https://XXX.XX.XX.XX/SSC,到這邊看似已經完成,不過,會建議先用Command方式測試是否可以上傳fpr檔案,如果,無法上傳檔案,就必須找出哪邊出問題,不然,到時候VSTS也沒有辦法自動化完成上傳檔案,當然,如果不需要上傳檔案到SSC,就可以不用管它" target="_blank" rel="external">https://XXX.XX.XX.XX/SSC,到這邊看似已經完成,不過,會建議先用Command方式測試是否可以上傳fpr檔案,如果,無法上傳檔案,就必須找出哪邊出問題,不然,到時候VSTS也沒有辦法自動化完成上傳檔案,當然,如果不需要上傳檔案到SSC,就可以不用管它</a></p>
<p>如果遇到憑證問題,必須執行下面指令,必須先跟SSC管理員取得<code>.cer</code>檔案,並匯入到環境中,才不會發生憑證問題,造成無法連線<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">set "FORTIFY_HOME=C:\Program Files\HPE_Security\Fortify_SCA_and_Apps_17.10"</div><div class="line">set "JAVA_HOME=%FORTIFY_HOME%\jre"</div><div class="line">"%JAVA_HOME%\bin\keytool" -importcert -trustcacerts -alias ussca -file "C:\yourSCAInstallLocation\ussca.cer" -keystore "%JAVA_HOME%\lib\security\cacerts" -storetype JKS -storepass changeit</div></pre></td></tr></table></figure></p>
<p>如果單機上測試都沒有問題,接下來就可以進行自動化部分,另外,在fortify中有一個<code>fortify.license</code>的SCA檔案,也要一併放到可以被VSTS Agent讀到的位置,因為在設定後續的Fortify Task會使用到這個檔案</p>
<p>在fortify安裝資料夾中找到<code>fortifyclient.bat</code>,用這個測試上傳fpr是否有問題</p>
<h2 id="設定VSTS內Fortify-Task"><a href="#設定VSTS內Fortify-Task" class="headerlink" title="設定VSTS內Fortify Task"></a>設定VSTS內Fortify Task</h2><hr>
<p>安裝完畢Micro Focus Fortify套件後,可以看到這些相關的TASK<br><img src="/blogimage/VSTS/fority2.jpg" width="600"></p>
<p>要掃描程式碼,選<code>Fortify Static Code Analyzer Assessment</code>這個來用就可以,主要設定可以分三大塊</p>
<h5 id="基本參數設定"><a href="#基本參數設定" class="headerlink" title="基本參數設定"></a>基本參數設定</h5><img src="/blogimage/VSTS/fority3.jpg" width="700">
<p>主要設定SCA License檔案位置,和每次產生fpr檔案的命名規則</p>
<h5 id="Build設定"><a href="#Build設定" class="headerlink" title="Build設定"></a>Build設定</h5><img src="/blogimage/VSTS/fority4.jpg" width="700">
<p>這邊設定是要編譯程式的類型,在17.1版只有分<code>.NET</code> & ‘Java’版本兩種,且還不能編譯.NET Core,不過,據說下一個版本會擴充更多可編譯的類型,然後,在選擇專案位置,這邊有一個比較奇怪地方,就是如果上面有一個TASK已經做過Build,在這裡把<code>Run Build</code>取消,就會發生失敗狀況,所以,這邊還是必須把<code>Run Build</code>打勾,才可以順利進行下去。在17.1版如果是.NET程式,還是仰賴<code>MSBuild</code>進行,所以,編譯那一台機器上必須可以執行<code>MSBuild</code></p>
<h5 id="Scan"><a href="#Scan" class="headerlink" title="Scan"></a>Scan</h5><img src="/blogimage/VSTS/fority5.jpg" width="700">
<p>掃描類型可以分成Cloud和Local,在企業端大部分都是選擇<code>Local</code> Scan,就可以開始進行掃描的動作,這部分會執行時間相當長,所以,建議可以用定時執行Definitons方式</p>
<h5 id="上傳fpr設定"><a href="#上傳fpr設定" class="headerlink" title="上傳fpr設定"></a>上傳fpr設定</h5><img src="/blogimage/VSTS/fority6.jpg" width="700">
<p>當掃描完畢之後,就會產生<code>.fpr</code>檔案,這時候就必須上傳到SSC Server。此時必須先設定SSC的End Point位置,設定主機屬性如下</p>
<ul>
<li>Connection Name : 給定這服務一個名稱</li>
<li>Server URL : 格式會是<a href="https://XXXX.XXX.XXX.XXX/ssc" target="_blank" rel="external">https://XXXX.XXX.XXX.XXX/ssc</a></li>
<li>User Name : 登入SSC的帳號</li>
<li>Password : 登入SSC的密碼<br>再來設定對應到SSC的Application Name和Version,這邊的<code>Application Name</code>和<code>Version</code>必須和SSC上面註冊是一致的才可以,換句話說,必須在SSC註冊一個Application和它的版本</li>
</ul>
<p>完成以上步驟,就可以自動化的SCAN,同時上傳掃描後的檔案了</p>
]]></content>
<summary type="html">
<img src="https://bright-side-of-life.com/wp-content/uploads/2017/05/post-fortify-fb.jpg">
<p>在資安逐步被重視的年代,企業會導入更多資安相關工具,除了本身伺服器或網路層的工具外,近年也針
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
<category term="VSTS" scheme="http://edwardkuo.imas.tw/tags/VSTS/"/>
</entry>
<entry>
<title>Study4.TW Study4Love - 與大師對談 活動</title>
<link href="http://edwardkuo.imas.tw/paper/2017/11/21/Other/StudyLove/"/>
<id>http://edwardkuo.imas.tw/paper/2017/11/21/Other/StudyLove/</id>
<published>2017-11-21T14:59:31.000Z</published>
<updated>2017-11-21T16:48:02.087Z</updated>
<content type="html"><![CDATA[<img src="https://distudio.blob.core.windows.net/study4tw/1510761314.63796.png">
<p>活動時間: 1/06/2018 9:00:00 AM<br>活動地點: 台大管理學院1號館/台北市大安區基隆路四段144巷 No. 52 </p>
<p>邀請了高達 15 位講師,分享他們的專業知識和經驗,在一整天的議程中,您將可以盡情地享受 IT Infrastructure、Dev、Agile、DevOps、Azure、Database、AI…等相關的議題,無論您是初學者、轉換跑道者還是資深的技術人員,這裡皆有適合您的議程。共同學習,提出問題與講師交流,藉此精進您的開發技能。</p>
<p>技能範圍從容器開發、DevOps到MR都有,重量級講師盡出,不來太可惜了</p>
<p>活動頁面 <a href="'http://study4.tw/Activity/Details/12'">http://study4.tw/Activity/Details/12</a></p>
]]></content>
<summary type="html">
<img src="https://distudio.blob.core.windows.net/study4tw/1510761314.63796.png">
<p>活動時間: 1/06/2018 9:00:00 AM<br>活動地點: 台大管理學院1號館/台北市大安區基隆路四
</summary>
<category term="LifeStyle" scheme="http://edwardkuo.imas.tw/tags/LifeStyle/"/>
</entry>
<entry>
<title>有參照外部元件如何在VSTS建立.Net Core Package</title>
<link href="http://edwardkuo.imas.tw/paper/2017/11/10/Devops/VSTSCore/"/>
<id>http://edwardkuo.imas.tw/paper/2017/11/10/Devops/VSTSCore/</id>
<published>2017-11-09T16:00:00.000Z</published>
<updated>2017-11-10T03:16:48.067Z</updated>
<content type="html"><![CDATA[<img src="https://core.ac.uk/resources/corelogo_hires.png">
<p>在先前一篇的[<a href="'http://edwardkuo.imas.tw/paper/2017/10/12/Devops/donetVSTS/'">用VSTS建立.Net Core的Package</a>],建立屬於.Net Core的Nuget Package,其中在<code>Path to csproj or nuspec file(s) to pack</code>是沒有辦法放<code>.nuspec</code>檔案的,但是,原本在<code>.nuspec</code>有一個標籤可以把外部dll包進Package<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">files</span>></span></div><div class="line"> <span class="tag"><<span class="name">file</span> <span class="attr">src</span>=<span class="string">"lib\XXX.dll"</span> <span class="attr">target</span>=<span class="string">"lib\netstandard2.0"</span> /></span></div><div class="line"><span class="tag"></<span class="name">files</span>></span></div></pre></td></tr></table></figure></p>
<p>不過,目前VSTS上面那個Dotnet Task無法讀取<code>.nuspec</code>檔案,就導致無法把外部參考的dll一起打包,而在介面上也找不到可以加入的地方。其實,在頁簽上面設定,都會被記錄到<code>csproj</code>檔案中<br><img src="/blogimage/VSTS/15.jpg" width="700"><br>在<code>csproj</code>有下面tag包住的資訊就跟在Package頁簽上面看到是相同的資訊<br><figure class="highlight cs"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><PropertyGroup></div><div class="line">....</div><div class="line"></PropertyGroup></div></pre></td></tr></table></figure></p>
<p>既然這樣,那樣也是因該可以在這邊加入我想要的打包外部dll設定才對,畢竟,在這裏面的屬性其實是對應到<code>.nuspec</code>的標籤的,找了半天,最後可以下面語法加入到<code>csproj</code>中<br><figure class="highlight cs"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><ItemGroup></div><div class="line"> <_PackageFiles Include=<span class="string">"lib\XXX.dll"</span>></div><div class="line"> <BuildAction>None</BuildAction></div><div class="line"> <PackagePath>lib\netstandard2<span class="number">.0</span>\</PackagePath></div><div class="line"> </_PackageFiles></div><div class="line"></ItemGroup></div></pre></td></tr></table></figure></p>
<p>第一行<code>_PackageFiles</code>是說在專案資料夾中,你把外部的dll放在那個地方,需要去那邊抓到這個dll,第三行<code>PackagePath</code>是把dll放到package內那個地方,就.Net Core來說目前必須放到<code>netstandard2.0</code>資料夾內,所以,就必須設定把dll搬移到這邊</p>
<p>這樣設定好之後,再重新跑一次CI,就可以完美的把外部dll也打包進去了,雖然可以解決目前這問題,最好方法還是可以正常讀取<code>.nuspec</code>檔案</p>
]]></content>
<summary type="html">
<img src="https://core.ac.uk/resources/corelogo_hires.png">
<p>在先前一篇的[<a href="&#39;http://edwardkuo.imas.tw/paper/2017/10/12/Devops/donetVS
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
<category term="VSTS" scheme="http://edwardkuo.imas.tw/tags/VSTS/"/>
</entry>
<entry>
<title>Application Insights + Logic App + Microsoft Teams 整合</title>
<link href="http://edwardkuo.imas.tw/paper/2017/10/16/Azure/AIappTeams/"/>
<id>http://edwardkuo.imas.tw/paper/2017/10/16/Azure/AIappTeams/</id>
<published>2017-10-15T16:00:00.000Z</published>
<updated>2017-10-16T14:04:01.949Z</updated>
<content type="html"><![CDATA[<img src="https://datadog-prod.imgix.net/img/blog/monitor-azure-logic-app-workflows-datadog/azure-logic-apps-hero.png?ch=Width&fit=max&fm=png&auto=format&lossless=1">
<p>Application Insights可以讓我們去設定監控某些指標,當這些指標有發生異常時候,就會發送Alert通知,讓我們隨時知道發生的狀況或是是否有異常發生<br><img src="/blogimage/Azure/31.jpg" width="400"></p>
<p>我們通常會設定是屬於Exception類的訊息,且這對於開發或是維運人員來說才可以立即進行處理,同時也是屬於DevOps環節的一塊,不過,透過Mail方式收到資訊內容就會像下圖這樣呈現方式,就這樣內容來說只知道有發生問題,但是無法知道問題點是甚麼,是否要做立即性的的處理,且若想要知道更細節的資訊,還必須回到Azure內查詢,才可以知道是到底是發生甚麼錯誤<br><img src="/blogimage/Azure/29.jpg" width="500"></p>
<p>若是使用手機去查看時候,更就會感到不方便。先前有實作一篇<strong><a href="http://edwardkuo.imas.tw/paper/2016/09/25/Azure/2016-09-26/">Azure Application Insights發Alert訊息到Slack</a></strong>,可以透過Logice App利用Application Insights的Webhook作為發送管道,雖然,可以放入比”Mail”還多的資訊,但明顯還是不夠,這時候就可以利用Logice App屬於Application insights的功能,這目前還在<strong>Preview</strong>版本,透過這個的Application insights Task就可以在訂定更多細節的資訊</p>
<h2 id="Logic-App流程設計"><a href="#Logic-App流程設計" class="headerlink" title="Logic App流程設計"></a>Logic App流程設計</h2><hr>
<p>在這次設計上,只需要三個步驟就可以讓Application Insights蒐集到Exception送到Microsoft Teams Channel,算是很簡單了</p>
<h3 id="Recurrence"><a href="#Recurrence" class="headerlink" title="Recurrence"></a>Recurrence</h3><p>Recurrence主要是設定間隔一段時間確認Application Insights內的資料,可以依照需求決定時間點<br><img src="/blogimage/Azure/30.jpg" width="500"></p>
<h3 id="Run-Analytics-Query"><a href="#Run-Analytics-Query" class="headerlink" title="Run Analytics Query"></a>Run Analytics Query</h3><p>在Logice App的Application Insights Task共有兩種<code>Application insights Query</code> & <code>Application insights for Visualize</code><br><img src="/blogimage/Azure/32.jpg" width="500"></p>
<ul>
<li>Application insights Query : 透過分析語法取得想要的資料,呈現方式是表格型態</li>
<li>Application insights for Visualize : 意思如同上面一樣,只是採用圖表方式呈現</li>
</ul>
<p>因為Logice App會與Application Insights做資料串接,所以,我們必須讓Logic App可以與Application Insights溝通,因此,要設定Connection Info<br><img src="/blogimage/Azure/33.jpg" width="600"></p>
<ul>
<li>Connection Name : 定義連線資訊名稱</li>
<li>Application ID : Application Insights的Application Key,可以在下圖找到<img src="/blogimage/Azure/34.jpg" width="600"></li>
<li>API Key:在同一個畫面中,選擇<code>建立API金鑰</code>,就可以得到</li>
</ul>
<p>設定完以上資訊,就可以讀取到Application Insights資料,之後,就採用<code>Application insights Query</code>這個Task,要使用語法可以先在Application Insights Analytics去跑跑看自己寫的語法是否可以運作,下面為這次實作的語法,主要是抓取資訊類型是屬於<code>exception</code>的</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">exceptions</div><div class="line">| where timestamp>ago(180s)</div><div class="line">| where (itemType == 'exception' )</div><div class="line">| project timestamp=timestamp+8h,</div><div class="line">s=now()+8h,</div><div class="line">client_Type ,</div><div class="line">outerType ,</div><div class="line">outerMethod ,</div><div class="line">outerMessage ,</div><div class="line">outerAssembly,</div><div class="line">operation_Name ,</div><div class="line">details ,</div><div class="line">customDimensions,</div><div class="line">ApplicationName=tostring(customDimensions["ApplicationName"]),</div><div class="line">user_Id</div></pre></td></tr></table></figure>
<img src="/blogimage/Azure/35.jpg" width="600">
<p>上面查詢語法的每個欄位,之後都可以當作傳送的資訊欄位</p>
<h3 id="Microsoft-Teams"><a href="#Microsoft-Teams" class="headerlink" title="Microsoft Teams"></a>Microsoft Teams</h3><p>設定好取得Application Insights資料後,再來就是設定綁定到Microsoft Teams,在Task中找到Microsoft Teams<br><img src="/blogimage/Azure/36.jpg" width="600"></p>
<p>要將資訊POST到Teams的Channel,所以選擇Post Message<br><img src="/blogimage/Azure/37.jpg" width="600"></p>
<p>前面有提到,透過Application Insights Query的資料欄位,都可以作為傳遞訊息的欄位,所以,可以看見Parameter都是剛剛查詢出來的欄位,然後,就可以在Message組合自己想要收到的資訊,因為是Application Insights Query查詢到的資料,所以,可以完整呈現出Application Insights蒐集的資訊<br><img src="/blogimage/Azure/38.jpg" width="600"></p>
<ul>
<li>Team ID : 就是在Teams上的群組</li>
<li>Channel ID : 就是Teams群組中的頻道<br>基本上只要跟Teams綁定後,這兩個資訊可以用選的,不需要人工Key,希望在Teams中的訊息有html格式,可以用Html的Tag去編排,如下圖<img src="/blogimage/Azure/40.jpg" width="600">
</li>
</ul>
<p>另外,在發送資料時候,Logic App會用迴圈方式一筆一筆將資料推送到Teams<br><img src="/blogimage/Azure/39.jpg" width="600"></p>
<p>整個流程如下<br><img src="/blogimage/Azure/41.jpg" width="600"></p>
<h2 id="總結"><a href="#總結" class="headerlink" title="總結"></a>總結</h2><hr>
<p>Logic App功能越來越強大,整合越來越Microsoft SaaS的服務,對於企業來說可以省掉整合的成本與時間,但是,採用排程方式並不是最好的,最好的方式還是用觸發會比較好,又因為觸發沒有辦法找到詳細資訊,所以,目前怎樣運用就自行評估,不過,也許後續有可以透過參數方式丟給Application Insights Query,這樣就可以透過觸發方式去運作</p>
]]></content>
<summary type="html">
<img src="https://datadog-prod.imgix.net/img/blog/monitor-azure-logic-app-workflows-datadog/azure-logic-apps-hero.png?ch=Width&fit=max&fm=pn
</summary>
<category term="Azure Application Insights" scheme="http://edwardkuo.imas.tw/categories/Azure-Application-Insights/"/>
<category term="Azure" scheme="http://edwardkuo.imas.tw/tags/Azure/"/>
</entry>
<entry>
<title>用VSTS建立.Net Core的Package</title>
<link href="http://edwardkuo.imas.tw/paper/2017/10/13/Devops/donetVSTS/"/>
<id>http://edwardkuo.imas.tw/paper/2017/10/13/Devops/donetVSTS/</id>
<published>2017-10-12T16:00:00.000Z</published>
<updated>2017-10-13T16:19:08.650Z</updated>
<content type="html"><![CDATA[<img src="https://stackify.com/wp-content/uploads/2017/03/dotnetwidowsserv-793x397.jpg">
<p>我們知道使用VSTS中的Packages Manager可以建立企業或是私有的Nuget Server,在一般.Net Framework下,可以用下面幾個步驟建立Nuget的Package,其中使用到的是<code>MSBuild</code>做編譯,再用Nuget指令打包成Package</p>
<img src="/blogimage/VSTS/12.jpg" width="600">
<p>不過,今天若是也這樣對<code>.Net Core</code>專案進行封裝,雖然會成功,但是,當在<code>.Net Core</code>專案下載來用時候,就會出現<strong>你使用了.Net Framework,不能使用在.Net Core專案中,請使用XXXXX</strong>字樣,主要原因是在編譯時候,單純使用MSbuild的Task,會被使用.Net Framework進行編譯封裝所造成的問題,網路上有人說可以採用<code>/t:package</code>方式克服,不過,既然使用了<code>.Net Core</code>,就改用<code>.Net Core</code>方式做CI & CD吧</p>
<h2 id="Net-Core專案檔設定"><a href="#Net-Core專案檔設定" class="headerlink" title=".Net Core專案檔設定"></a>.Net Core專案檔設定</h2><hr>
<p>首先啟用的專案類型是<code>.Net Core Libray</code><br><img src="/blogimage/VSTS/13.jpg" width="600"></p>
<p>之前在<code>.Net Framework</code>時期專案,因為封裝成Nuget Package,必須透過<code>.nuspec</code>檔案把元件資訊填入,這樣別人才可以知道這個元件用途以及相關資訊,在.Net Core專案底下,已經可以省略這個檔案了,因為,要把這些需要填入資訊已經納入專案檔中了,在專案按右鍵找到屬性設定<br><img src="/blogimage/VSTS/14.jpg" width="500"></p>
<p>針對整個專案設定部分,會多出一個<code>Package</code>頁簽,會發現填入的資訊跟<code>.nuspec</code>檔案內容是大同小異,只是這邊已經被限定好欄位了,上面有兩個需要打勾的,基本上是不需要去勾選<br><img src="/blogimage/VSTS/15.jpg" width="700"></p>
<h2 id="VSTS-Build設定"><a href="#VSTS-Build設定" class="headerlink" title="VSTS Build設定"></a>VSTS Build設定</h2><hr>
<p>在Build設定中,基本的完整流程如下:<br><img src="/blogimage/VSTS/16.jpg" width="600"></p>
<h4 id="Nuget-Restore"><a href="#Nuget-Restore" class="headerlink" title="Nuget Restore"></a>Nuget Restore</h4><p>在Nuget Task,要注意的就是它的Task Version,記得一定要選到最新版本,若是有<code>Nuget.config</code>檔案,也記得要放上去</p>
<img src="/blogimage/VSTS/17.jpg" width="500">
<h4 id="donet-Build"><a href="#donet-Build" class="headerlink" title="donet Build"></a>donet Build</h4><p>donet Task這裡如果只是單純Build .Net Core專案倒是不需要注意Task版本,但是,如果要封裝Package,記得選到最新版本,目前版本最新是<code>2 Preview</code>,因為在最新版本才會有<code>Pack</code>的指令,這裡的<code>Path to project</code>專案路徑,不能用選的,必須要用手敲入,記得不能打錯路徑,不然會失敗<br><img src="/blogimage/VSTS/18.jpg" width="500"></p>
<h4 id="donet-pack"><a href="#donet-pack" class="headerlink" title="donet pack"></a>donet pack</h4><p>重頭戲是在這邊,搞定這個搞超久,再提一次,記得選到最新版本,不然會找不到<code>Pack</code>指令</p>
<img src="/blogimage/VSTS/19.jpg" width="500">
<p>此外,這邊有一個小坑,就是在<code>Path to csproj or nuspec file(s) to pack</code>提到可以使用<code>.nuspec</code>檔案作為Package的資訊檔案,但是,當我指定<code>.nuspec</code>檔案時候,就會出現不支援<package>標籤,不知道這是preview造成還是其他問題,唯一可以確定是<code>.nuspec</code>檔案格式是沒問題的,所以,就指定<code>.csproj</code>,前面有提到,在.Net Core已經可以把封裝資訊放入專案檔,用處就是在這裡要被使用的。此外,我喜歡用Buil Number來作為Package版本號,也在<code>Automatic package versioning</code>中選用使用<code>環境變數</code>作為版號,而環境變數就是使用<code>Build.BuildNumber</code></package></p>
<p>另一個要提醒的是這邊先不要把<code>Do Not Build</code>打勾,話說前面不是已經有Build過嗎?因該不需要再Build,這裡的Build主要是要做封裝用,所以還是必須要Build一次。</p>
<p>到這裡基本上就大功告成,後面兩個Task,主要是把封裝檔案上傳到發布區域,等待後面的發行</p>
<h2 id="VSTS-Release"><a href="#VSTS-Release" class="headerlink" title="VSTS Release"></a>VSTS Release</h2><hr>
<p>到這裡只需要用一個Task就可以進行發佈到團隊的Packages中<br><img src="/blogimage/VSTS/20.jpg" width="700"></p>
<p>只要選擇Nuget Publish,把相關資訊田入就可以,唯一要注意是要選擇4.0版本的Nuget指令<br><img src="/blogimage/VSTS/21.jpg" width="600"></p>
<p>以上就能完成在VSTS針對.Net Core的CI / CD 了,有一些眉眉角角必須多踏過,不然還真的跑不出來,所以,不管是.Net Framework或是.Net Core都可以自動化封裝成Nuget Package</p>
]]></content>
<summary type="html">
<img src="https://stackify.com/wp-content/uploads/2017/03/dotnetwidowsserv-793x397.jpg">
<p>我們知道使用VSTS中的Packages Manager可以建立企業或是私有的Nuget Ser
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
<category term="VSTS" scheme="http://edwardkuo.imas.tw/tags/VSTS/"/>
</entry>
<entry>
<title>VSTS新版Agent要多.proxy設定檔</title>
<link href="http://edwardkuo.imas.tw/paper/2017/10/03/Devops/VSTSAgent2/"/>
<id>http://edwardkuo.imas.tw/paper/2017/10/03/Devops/VSTSAgent2/</id>
<published>2017-10-02T16:00:00.000Z</published>
<updated>2017-10-13T15:14:13.982Z</updated>
<content type="html"><![CDATA[<img src="http://4.bp.blogspot.com/-um9fpZrF5hA/U4SCkUT1EuI/AAAAAAAAA08/cy9elvop6XY/s1600/Proxy_Logo3.gif">
<p>在使用VSTS Agent 2.115版本時候,在企業內部使用是沒甚麼問題,不過,最近升級到2.123版後,地端與雲端就失聯,就無法進行連線,到<code>_diag</code>資料查看Log,發現會卡在最後連線驗證地端權限時候,一直發生<code>Timeout</code>然後Agent就發生Exception,導致怎樣都無法與雲端溝通,如果再倒回2.115版又可以連線,真是太神奇</p>
<p>仔細研究一下,因為企業內部必須透過<code>Proxy</code>才能連線,在舊版的Agent,因為會自動去吃在<strong>IE</strong>內的Proxy設定值,所以,沒有問題,但是,到新版的Agent,似乎就不是這樣,它在對外連線,基本上就不走Proxy,直接對外連線,就會導致無法連線,就發生了TimeOut,要解決這個辦法,就是在Agent目錄下新增一個<code>.proxy</code>的檔案,用Powershell執行下列指令</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">echo http://proxy server name:80 | Out-File .proxy</div></pre></td></tr></table></figure>
<img src="/blogimage/VSTS/12.png" width="700">
<p>這樣Agent在執行時候,就會透過Proxy連線到外面,如果,你的Proxy需要設定帳號密碼,就必須在環境變數中加入下面資訊</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$env:VSTS_HTTP_PROXY_USERNAME = "proxyuser" </div><div class="line">$env:VSTS_HTTP_PROXY_PASSWORD = "proxypassword"</div></pre></td></tr></table></figure>
<p>就可以解決了</p>
]]></content>
<summary type="html">
<img src="http://4.bp.blogspot.com/-um9fpZrF5hA/U4SCkUT1EuI/AAAAAAAAA08/cy9elvop6XY/s1600/Proxy_Logo3.gif">
<p>在使用VSTS Agent 2.115版本時候,在企業內部
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
<category term="VSTS" scheme="http://edwardkuo.imas.tw/tags/VSTS/"/>
</entry>
<entry>
<title>讓訪客也加入到你的Microsoft Teams團隊中,但...</title>
<link href="http://edwardkuo.imas.tw/paper/2017/09/12/Devops/TeamsGuest/"/>
<id>http://edwardkuo.imas.tw/paper/2017/09/12/Devops/TeamsGuest/</id>
<published>2017-09-11T16:00:00.000Z</published>
<updated>2017-09-13T01:31:11.643Z</updated>
<content type="html"><![CDATA[<img src="https://www.devicedaily.com/wp-content/uploads/2016/05/3058781-poster-p-1-five-ways-to-keep-small-teams-efficient.jpg">
<p>Microsoft Teams一個值得高興的更新,就是Microsoft Teams可以支援外部訪客加入Teams團隊中了,原先,要使用Teams的成員,必須具備O365帳號且還必須同一個組織或是公司下的O365帳號才可以一起使用Teams,現在這些非原本在同個組織下的O365帳號或,都會被當作訪客登入到Teams,首先,先來看用訪客身分登入後,訪客會具備那些權限<br><img src="/blogimage/MicrosoftTeamsFile/20.jpg" width="600"></p>
<p>不過,雖然可以邀請訪客登入,但是,這邊有一個前提就是邀請者本身必須是O365管理員或是該群組的管理員,可以邀請訪客登入。不然,無法邀請訪客的加入。現在只是讓帳號本身是其他O365才可以,未來據說可以連Windows live ID也可以用</p>
<h2 id="Office-365設定"><a href="#Office-365設定" class="headerlink" title="Office 365設定"></a>Office 365設定</h2><hr>
<p>Microsoft Teams預設沒有開放給訪客使用,如果要啟動這功能,必須到Office 365管理者平台去設定Microsoft Teams的功能</p>
<img src="/blogimage/MicrosoftTeamsFile/21.jpg" width="700">
<p>在Teams設定中找到<strong>Settings by user/license type</strong>,找到選項是<code>來賓</code>,從這邊可以看出來,這設定預設是無法被授權給外來訪客的,所以,我們必須要開啟它<br><img src="/blogimage/MicrosoftTeamsFile/22.jpg" width="400"></p>
<p>一旦打開之後,就可以指定的群組中,加入你想要邀請的人的Email,不過,目前這邊設定有一點奇怪,就是先設定好要被邀請方的Mail,就會送邀請信給被邀請方,但是,有時候會消失,必須等被邀請方認證過後,再去加一次才會成功<br><img src="/blogimage/MicrosoftTeamsFile/23.jpg" width="400"></p>
<p>這時候我們可以在被邀請方的Email看到<em>作為訪客</em>字樣,被邀請方就可以用這Email當作帳號登入Teams了,當然,在O365的使用者管理中,就可以看到這組Mail被歸納到<code>來賓使用者</code>了</p>
<h2 id="被邀請方"><a href="#被邀請方" class="headerlink" title="被邀請方"></a>被邀請方</h2><hr>
<p>訪客部分,不要以為對方把你邀請加入Teams後,就可以直接打開Teams,輸入Email就可以登入唷。這樣會收到你沒有權限登入的畫面,必須先到你收到邀請的那封Email中,點擊裡面的連結<br><img src="/blogimage/MicrosoftTeamsFile/24.jpg" width="500"></p>
<p>就會開啟Teams網頁版,第一次登入時候,會要求你建立你的登入密碼。這些手續完成後,才可以進入到Microsoft Teams。另外,作為訪客身分登入是無法改動自己暱稱的。</p>
<p>現階段測試不知道是哪邊權限整合上問題,基本上無論使用Desktop程式登入或是透過<code>https://teams.microsoft.com</code>網站登入都會收到下面訊息<br><img src="/blogimage/MicrosoftTeamsFile/25.jpg" width="600"></p>
<p>但是透過邀請信的link就可以登入,我想邀請信中連結中的變數因該是會把資訊帶入到登入認證中,但是,目前Desktop程式這部分似乎還有問題,沒有辦法很順利登入</p>
]]></content>
<summary type="html">
<img src="https://www.devicedaily.com/wp-content/uploads/2016/05/3058781-poster-p-1-five-ways-to-keep-small-teams-efficient.jpg">
<p>Microso
</summary>
<category term="Microsoft Teams" scheme="http://edwardkuo.imas.tw/categories/Microsoft-Teams/"/>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
</entry>
<entry>
<title>解決json檔案放在Azure Storage導致發生CORS</title>
<link href="http://edwardkuo.imas.tw/paper/2017/09/08/Azure/StorageCORS/"/>
<id>http://edwardkuo.imas.tw/paper/2017/09/08/Azure/StorageCORS/</id>
<published>2017-09-07T16:00:00.000Z</published>
<updated>2017-09-08T01:04:04.404Z</updated>
<content type="html"><![CDATA[<img src="https://www.visualstudio.com/wp-content/uploads/2017/06/azure_cloud_image.png">
<p>把前端的一些靜態檔案像是<code>css</code>、<code>js</code>…之類的放到Azure Storage,然後,讓網站去參照Storage路徑下載靜態檔案,基本上這樣並無太大問題,不過,做多國語系時候,使用到<code>i18n</code>這個套件,裡面會利用<code>translation.json</code>檔案做多國語系,誰知道這樣使用下卻發生了這個錯誤訊息</p>
<blockquote>
<p> CORS not enabled or no matching rule found for this request</p>
</blockquote>
<p>通常遇到這問題,我們會去<code>web.config</code>去設定CORS的屬性,來避開這錯誤,不過,針對這個檔案似乎無效,它依然出現這樣錯誤資訊</p>
<img src="/blogimage/Azure/25.jpg" width="700">
<p>因此,發現在Storage有一個設定,叫做<code>CORS</code>,看名字就知道顧名思義,因該是針對CORS進行處理,進入這個設定功能後,我們只要設定好CORS規範,基本上就可以解決CORS問題(基本上因該是連Web.config都可以不用設定)<br><img src="/blogimage/Azure/26.jpg" width="400"></p>
<h2 id="設定CORS-Rule"><a href="#設定CORS-Rule" class="headerlink" title="設定CORS Rule"></a>設定CORS Rule</h2><hr>
<p>設定這規範其實很簡單的,它是針對每個Host Name去做設定,只要按下Add,就可以看到旁邊設定畫面<br><img src="/blogimage/Azure/27.jpg" width="700"></p>
<p>看到這畫面要怎樣設定呢,其實最簡單方法就是利用<code>F12</code>取得原本失敗檔案的Header資訊,分別填入就可以,參考資訊如下圖藍色框的欄位<br><img src="/blogimage/Azure/28.jpg" width="500"></p>
<ul>
<li>Allowed Origins=Origin</li>
<li>Allowed Verbs=Access-Control-Request-Method</li>
<li>Allowed Headers=x-requested-with</li>
<li>Exposed Headers=x-requested-with</li>
</ul>
<p>透過以上對應關係,只要把資訊放入就可以,若是要更進階一點,針對<strong>Allowed Header</strong> & <strong>Exposed Headers</strong>,若是要包括更多的資訊,可以用星號省略後面的資訊,只要符合前面字樣就可以,設定會像是這樣<code>x-requested*</code>,只要是<code>x-requested</code>開頭的,都是符合這規則。</p>
<p>這樣設定完畢後,就輕鬆解決CORS問題了</p>
]]></content>
<summary type="html">
<img src="https://www.visualstudio.com/wp-content/uploads/2017/06/azure_cloud_image.png">
<p>把前端的一些靜態檔案像是<code>css</code>、<code>js</code>…之類
</summary>
<category term="Azure" scheme="http://edwardkuo.imas.tw/tags/Azure/"/>
</entry>
<entry>
<title>解決註冊VSTS的npm平台無法下載npmjs.com套件</title>
<link href="http://edwardkuo.imas.tw/paper/2017/09/02/Devops/VSTSNPM2/"/>
<id>http://edwardkuo.imas.tw/paper/2017/09/02/Devops/VSTSNPM2/</id>
<published>2017-09-01T16:00:00.000Z</published>
<updated>2017-09-02T15:40:55.953Z</updated>
<content type="html"><![CDATA[<img src="https://partners.npmjs.com/weekly/weekly32/weekly-header-grace-hopper.png">
<p>在前一篇的<strong>[<a href="http://edwardkuo.imas.tw/paper/2017/08/09/Devops/VSTSNpm/">在VSTS中建立npm套件管理平台</a>]</strong>介紹說可以在VSTS內建立<code>NPM</code>套件平台,因為,VSTS建立的NPM套件管理平台是屬於私人的,所以,會有註冊憑證的動作,不過,這樣做下去之後,卻發生一個問題,如果今日我們是要從原本NPM官網下載套件,就會發生這樣錯誤<br><img src="/blogimage/VSTSnpm/8.jpg" width="700"></p>
<p>其實這錯誤就是因為在.npmrc設定檔中註冊是VSTS NPM套件路徑,而原本NPM平台上套件又不在VSTS,導致會發生失敗,如果不是上面錯誤,也會發生找不到Package路徑問題。要解決這問題,可以去開啟VSTS Package中的<code>Upstream sources</code>功能,下圖這個要把它Enable起來<br><img src="/blogimage/VSTSnpm/9.jpg" width="700"></p>
<p>它的原理其實就是安裝時候,會先到VSTS Package裡面去找是否有符合你要安裝的Package,如果沒有,就會自動往<code>npmjs.com</code>再去找<br><img src="/blogimage/VSTSnpm/10.jpg" width="500"></p>
<p>這樣就可以安裝好在<code>npmjs.com</code>上面的套件了,這時候,會發現在VSTS的NPM套件平台上可以看到團隊套件有來自<code>npmjs.com</code>的都會被Cache在這上面<br><img src="/blogimage/VSTSnpm/11.jpg" width="700"></p>
<p>如果擔心找不到自己建立的Source,可以透過filter去搜尋<code>this feed</code>,就可以找到自記建立的套件列表</p>
]]></content>
<summary type="html">
<img src="https://partners.npmjs.com/weekly/weekly32/weekly-header-grace-hopper.png">
<p>在前一篇的<strong>[<a href="http://edwardkuo.imas.tw/pap
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
<category term="VSTS" scheme="http://edwardkuo.imas.tw/tags/VSTS/"/>
</entry>
<entry>
<title>用Chocolatey安裝Docker CLI</title>
<link href="http://edwardkuo.imas.tw/paper/2017/08/11/Docker/DockerCLI/"/>
<id>http://edwardkuo.imas.tw/paper/2017/08/11/Docker/DockerCLI/</id>
<published>2017-08-11T14:59:31.000Z</published>
<updated>2017-08-11T15:26:06.542Z</updated>
<content type="html"><![CDATA[<img src="https://store.docker.com/dist/fde255842a0008cf599d244e3a63a1f7.png">
<p>一般想要在個人電腦或是Windows Server 2016玩Docker,前者可以安裝Docker for Windows,後者啟用Window Server的Container,這樣就可以開始使用Docker指令,不過,今日只是想在某台電腦透過<code>Docker -H</code>去執行Remote具有Container的機器,是否還需要完整安裝上述所提的功能才能使用Docker Command呢?</p>
<p>答案是可以不需要在電腦上安裝Docker for Windows或是啟用Container,就可以執行Docker了,只需要安裝Docker CLI就可以。Docker CLI網路上版本還不少,但我目前使用<strong>Chocolatey</strong> Package Manager來安裝Docker CLI,感覺上還不錯,且安裝又方便簡單</p>
<p>1.首先用PowerShell來安裝Chocolatey,PowerShell需要用Admin執行<br><figure class="highlight ps"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">iex ((<span class="built_in">new-object</span> net.webclient).DownloadString(<span class="string">'https://chocolatey.org/install.ps1'</span>))</div></pre></td></tr></table></figure></p>
<p>2.安裝好Chocolatey,就透過它幫我們安裝docker CLI吧,通常這個步驟也是使用Powershell執行,不過,我發現執行後會卡住,改用Command Line就沒問題,如果有問題可以改用<code>cmd</code>試試看<br><figure class="highlight ps"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">choco install docker</div></pre></td></tr></table></figure></p>
<p>因為目的是想要透過本身的機器去操作遠端的Docker,所以,前提必須記得去改遠端Docker的<code>daemon.json</code>檔案,要加入下面這行<br><figure class="highlight js"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="string">"hosts"</span>: [<span class="string">"tcp://0.0.0.0:2375"</span>, <span class="string">"npipe://"</span>]</div></pre></td></tr></table></figure></p>
<p>這行目的主要是說我們可以透過Port<code>2375</code>進行連線,當然雙邊的防火牆記得要開啟Port<code>2375</code><br>3.完畢後就下達重啟動指令就可以<br><figure class="highlight ps"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="built_in">Restart-Service</span> docker</div></pre></td></tr></table></figure></p>
<p>這樣就可以讓這台機器具有Docker指令了</p>
]]></content>
<summary type="html">
<img src="https://store.docker.com/dist/fde255842a0008cf599d244e3a63a1f7.png">
<p>一般想要在個人電腦或是Windows Server 2016玩Docker,前者可以安裝Docker for Win
</summary>
<category term="Docker" scheme="http://edwardkuo.imas.tw/tags/Docker/"/>
</entry>
<entry>
<title>在VSTS中建立npm套件管理平台</title>
<link href="http://edwardkuo.imas.tw/paper/2017/08/10/Devops/VSTSNpm/"/>
<id>http://edwardkuo.imas.tw/paper/2017/08/10/Devops/VSTSNpm/</id>
<published>2017-08-09T16:00:00.000Z</published>
<updated>2017-09-02T12:14:23.279Z</updated>
<content type="html"><![CDATA[<img src="https://cs.fit.edu/code/projects/nothing_works/repository/revisions/b488be127a8cf1e59eb257db3f8eaf6efdb0f275/entry/deps/npm/html/npm-large.png">
<p>在之前有介紹透過VSTS的<code>Packages</code>可以自建團隊的Nuget套件管理平台,在<code>Packages</code>中不只是可以建立Nuget套件的管理平台,如果,今日是前端人員或是非.NET人員,想要用<code>npm</code>指令來裝前端套件,VSTS是否可以做<code>npm</code>套件的管理平台呢?答案是可以,VSTS的Packages同時支援<strong>Nuget</strong>和<strong>npm</strong>套件管理,就讓我們來建立一個npm packages管理平台吧。</p>
<h2 id="自動化建立npm-package"><a href="#自動化建立npm-package" class="headerlink" title="自動化建立npm package"></a>自動化建立npm package</h2><hr>
<p>在VSTS的Feed本身就同時支援Nuget和npm,換句話說可以在同一個Feed URL同時存在兩種套件管理,不過,並不建議這樣混合使用,畢竟這樣使用會造成套件本身管理的混亂。還是建議把兩種不同屬性的Package分別建立不同的Feed。要建立Feed只需要選擇建立就可以,很簡單的<br><img src="/blogimage/VSTSnpm/1.jpg" width="500"></p>
<p>只需要填入Feed名稱就可以建立成功,建立成功後去點選<em>Connect to Feed</em>,可以看到裡面有<strong>Nuget</strong>和<strong>npm</strong>兩種設定方式<br><img src="/blogimage/VSTSnpm/2.jpg" width="600"></p>
<p>透過VSTS自動化建置npm package的流程比建置Nuget package簡單許多了,今日若是要透過VSTS自動化建置,上圖中的設定可以暫時不需要管它,後續如果是在Clinet進行,則必須要做一些相關設定才有辦法,先來說講最簡單的,使用VSTS建置npm package。</p>
<p>因為npm主要是封裝前端的元件,基本上都不太需要做到編譯的動作,當然如果今天是用<code>SCSS</code>需要編譯成<code>CSS</code>才給人家用,這樣就需要增加編譯動作,不然,只要將整個專案進行封裝就可以。在封裝的前提必須在專案檔加入<code>package.json</code>檔案,這檔案主要是針對Package做說明,與<code>Package.config</code>有異曲同工之妙</p>
<p>關於<code>package.json</code>說明</p>
<blockquote>
<p>The most important things in your package.json are the name and version fields. Those are actually required, and your package won’t install without them. The name and version together form an identifier that is assumed to be completely unique. Changes to the package should come along with changes to the version.</p>
</blockquote>
<p>關於<code>package.json</code>格式,可以透過<code>npm init</code>建立<br><figure class="highlight json"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line">{</div><div class="line"> <span class="attr">"name"</span>: <span class="string">"my_package"</span>,</div><div class="line"> <span class="attr">"description"</span>: <span class="string">""</span>,</div><div class="line"> <span class="attr">"version"</span>: <span class="string">"1.0.0"</span>,</div><div class="line"> <span class="attr">"description"</span>: <span class="string">""</span>,</div><div class="line"> <span class="attr">"main"</span>: <span class="string">"index.js"</span>,</div><div class="line"> <span class="attr">"scripts"</span>: {</div><div class="line"> <span class="attr">"test"</span>: <span class="string">"echo \"Error: no test specified\" && exit 1"</span></div><div class="line"> },</div><div class="line"> <span class="attr">"repository"</span>: {</div><div class="line"> <span class="attr">"type"</span>: <span class="string">"git"</span>,</div><div class="line"> <span class="attr">"url"</span>: <span class="string">"https://github.com/ashleygwilliams/my_package.git"</span></div><div class="line"> },</div><div class="line"> <span class="attr">"keywords"</span>: [],</div><div class="line"> <span class="attr">"author"</span>: <span class="string">""</span>,</div><div class="line"> <span class="attr">"license"</span>: <span class="string">"ISC"</span>,</div><div class="line"> <span class="attr">"bugs"</span>: {</div><div class="line"> <span class="attr">"url"</span>: <span class="string">"https://github.com/ashleygwilliams/my_package/issues"</span></div><div class="line"> },</div><div class="line"> <span class="attr">"homepage"</span>: <span class="string">"https://github.com/ashleygwilliams/my_package"</span></div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>有了這檔案,只需要去VSTS進行設定就可以,因為,沒有Build的動作,基本上在VSTS Build就等於Release了。所以,這邊只需要添加一個<code>npm</code> Task即可<br><img src="/blogimage/VSTSnpm/3.jpg" width="600"></p>
<h2 id="設定npm-Task"><a href="#設定npm-Task" class="headerlink" title="設定npm Task"></a>設定npm Task</h2><hr>
<p>建立好Task後,就是把相關設定設定完畢就可以<br><img src="/blogimage/VSTSnpm/4.jpg" width="600"></p>
<ul>
<li>Command : 可以選擇<code>install</code>,<code>publish</code>和<code>Custom</code>,這邊選擇<code>publish</code></li>
<li>Working folder with package.json : 如果<code>package.json</code>在Root就不用填寫,不然就選擇該檔案所在的資料夾</li>
<li>Registry location : 註冊你的npm package在哪個地方,如果是在VSTS內,則選用<code>Registry I Select here</code>,一但選用這個,下面的<code>target</code>就可以選擇在你VSTS上面的Feed URL了</li>
</ul>
<p>以上屬性設定完成後,就可以讓她自動化去封裝了,同時也會自動化佈署到我們自己的Feed內,建置完成後就可以看到Feed那邊多出了npm package了<br><img src="/blogimage/VSTSnpm/5.jpg" width="600"><br>另外,如果每次要佈署時候,沒有去更改<code>package.json</code>中的version號碼,會發生佈署失敗,主要原因是它不會去覆蓋原本舊版本,必須要進版才可以,不然會發生錯誤,如果不想這樣麻煩,也可以使用<code>Version Assemblies</code>套件做自動化進版<br><img src="/blogimage/VSTSnpm/6.jpg" width="7" height="00"></p>
<h2 id="安裝VSTS中的npm-package"><a href="#安裝VSTS中的npm-package" class="headerlink" title="安裝VSTS中的npm package"></a>安裝VSTS中的npm package</h2><hr>
<p>既然我們已經可以用npm封裝好了,再來就是要能去使用它,因為,VSTS上的是屬於私人或是團隊的,並不像<code>npm</code>網站一樣是被公開可以用。所以,這邊我們需要增加一些設定才可以抓取VSTS上的npm,不然直接下<code>npm install xxxx</code>是沒有用的,主要是要把VSTS Auth驗證資訊會透過<code>.npmrc</code>內資訊被設定在專案中</p>
<blockquote>
<p>.npmrc : npm gets its config settings from the command line, environment variables, and npmrc files.</p>
</blockquote>
<p>預設你可能沒有<code>vsts-npm-auth</code>套件,所以,需透過npm安裝這個套件<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">npm install -g vsts-npm-auth --registry https://registry.npmjs.com --always-auth false</div></pre></td></tr></table></figure></p>
<p>然後,在專案手動加入空白的<code>.npmrc</code>檔案,目前還不知道怎樣自動加入此檔案,有了這個檔案後,根據本文上面第二張圖,有一段<strong>Add this feed to your project .npmrc</strong>,把裡面的資訊<code>registry=XXX</code>放入.npmrc檔案中。到了這一步完成後,就可以執行下面語法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">vsts-npm-auth -config .npmrc</div></pre></td></tr></table></figure></p>
<p>成功後會得到下面訊息</p>
<blockquote>
<p>Getting new credentials for source:<a href="https://XXXXXXregistry/" target="_blank" rel="external">https://XXXXXXregistry/</a>, scope:vso.packaging_write vso.drop_write</p>
</blockquote>
<p>如果在Visual Studio中想要安裝VSTS上面的npm的套件,可以用<em>package manager console</em>工具或是安裝*Flatten Packages`工具,協助我們安裝npm套件,如果使用Visual Studio Code就更簡單了</p>
]]></content>
<summary type="html">
<img src="https://cs.fit.edu/code/projects/nothing_works/repository/revisions/b488be127a8cf1e59eb257db3f8eaf6efdb0f275/entry/deps/npm/html/n
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
<category term="VSTS" scheme="http://edwardkuo.imas.tw/tags/VSTS/"/>
</entry>
<entry>
<title>Application Insights自訂過濾收集的訊息內容</title>
<link href="http://edwardkuo.imas.tw/paper/2017/08/07/Azure/ApplicationInsightsFilter/"/>
<id>http://edwardkuo.imas.tw/paper/2017/08/07/Azure/ApplicationInsightsFilter/</id>
<published>2017-08-06T16:00:00.000Z</published>
<updated>2017-08-07T12:23:13.642Z</updated>
<content type="html"><![CDATA[<img src="https://blogmedia.avanade.com/avanade-insights/2017/04/Mapping-Digital-Workplace-Insights-to-Business-Value-Context.jpg">
<p>Application Insights越做越強大,基本上程式內部怎樣運作,Application Insights都可以蒐集到相關資訊,不過,有時候這樣會帶來一種困惱就是在某些情境下的資訊,並不想被蒐集到Application Insights內進行分析,因為有可能造成分析錯誤或是統計資訊的誤差,舉例來說,目前發現如果在IIS中針對Web Site設定<code>Preload</code>功能,在Application Insights就會多一筆Request,帶出來的資訊是<code>localhost/XXX</code>,這樣資訊對目前數據分析並不重要,但是,又會被多記一筆Request的Count。</p>
<p>因此,像這種資訊就會希望不要被記錄到Application Insights中,目前,在Application Insights的Portal中似乎不能設定過濾訊息,所以,就必須從程式面著手</p>
<h2 id="自訂Filter"><a href="#自訂Filter" class="headerlink" title="自訂Filter"></a>自訂Filter</h2><hr>
<p>從程式面就是需要自己訂定Filter功能,首先自己建立一個叫做<code>TelemetryFilter</code>的Class,並繼承<code>ITelemetryProcessor</code>,從官方解釋<code>ITelemetryProcessor</code>為</p>
<blockquote>
<p>讓您更直接地控制包含在遙測串流中或排除於遙測串流外的內容</p>
</blockquote>
<p>所以,透過它可以獲取要送到Application Insights的檢測資訊,進而做一些篩檢或是變更等動作,繼承<code>ITelemetryProcessor</code>會變成如下<br><figure class="highlight cs"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Process</span>(<span class="params">ITelemetry item</span>)</span></div><div class="line">{</div><div class="line"> ....</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>在這個Process中,針對遙測資訊進行處理,以剛剛案例來說,希望排除到<code>http://localhost/XXX</code>資訊。就可以在這處理器這樣寫<br><figure class="highlight cs"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Process</span>(<span class="params">ITelemetry item</span>)</span></div><div class="line">{</div><div class="line"> <span class="keyword">var</span> request = item <span class="keyword">as</span> RequestTelemetry;</div><div class="line"> <span class="keyword">if</span> (request != <span class="literal">null</span> && request.Url != <span class="literal">null</span> &&</div><div class="line"> request.Url.Host.IndexOf(<span class="string">"localhost"</span>, StringComparison.InvariantCultureIgnoreCase) >= <span class="number">0</span>)</div><div class="line"> {</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> }</div><div class="line"> <span class="keyword">else</span></div><div class="line"> {</div><div class="line"> <span class="keyword">this</span>._next.Process(item);</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>把Item轉型為Request Type,並抓取資料中的<code>Url</code>進行過濾。如果,有符合過濾條件的,就拋棄掉這個訊息不做上報的動作,如果不是,則透過<code>Process</code>處理收集的資訊項目。完整的寫法如下<br><figure class="highlight cs"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">TelemetryFilter</span> : <span class="title">ITelemetryProcessor</span></div><div class="line">{</div><div class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> ITelemetryProcessor _next;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">TelemetryFilter</span>(<span class="params">ITelemetryProcessor next</span>)</span></div><div class="line"> {</div><div class="line"> <span class="keyword">this</span>._next = next;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Process</span>(<span class="params">ITelemetry item</span>)</span></div><div class="line"> {</div><div class="line"></div><div class="line"> <span class="keyword">var</span> request = item <span class="keyword">as</span> RequestTelemetry;</div><div class="line"> <span class="keyword">if</span> (request != <span class="literal">null</span> && request.Url != <span class="literal">null</span> &&</div><div class="line"> request.Url.Host.IndexOf(<span class="string">"localhost"</span>, StringComparison.InvariantCultureIgnoreCase) >= <span class="number">0</span>)</div><div class="line"> {</div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> }</div><div class="line"> <span class="keyword">else</span></div><div class="line"> {</div><div class="line"> <span class="keyword">this</span>._next.Process(item);</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>有這樣方式,想要過濾甚麼就可自己去定義了</p>
<h2 id="註冊過濾器"><a href="#註冊過濾器" class="headerlink" title="註冊過濾器"></a>註冊過濾器</h2><hr>
<p>開發完畢後,還必須把過濾器註冊,這樣才有辦法當Application Insights啟動後,自動掛載這個過濾器。要註冊過濾器,只要在<code>ApplicationInsights.config</code>中設定就可以<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">TelemetryProcessors</span>></span></div><div class="line"> <span class="tag"><<span class="name">Add</span> <span class="attr">Type</span>=<span class="string">"WebApplication1.ApplicationInsights.TelemetryFilter, WebApplication1"</span>/></span></div><div class="line"><span class="tag"></<span class="name">TelemetryProcessors</span>></span></div></pre></td></tr></table></figure></p>
<p>這樣就可以一個簡單的Application Insights資訊過濾器就可以運作,簡單說,這個就是AP & Application Insights訊息的中繼站,所有資訊都會先到這邊再往Azure送,換句話說要在這邊做置換資訊動作也是可以的</p>
]]></content>
<summary type="html">
<img src="https://blogmedia.avanade.com/avanade-insights/2017/04/Mapping-Digital-Workplace-Insights-to-Business-Value-Context.jpg">
<p>Appli
</summary>
<category term="Azure Application Insights" scheme="http://edwardkuo.imas.tw/categories/Azure-Application-Insights/"/>
<category term="Azure" scheme="http://edwardkuo.imas.tw/tags/Azure/"/>
</entry>
<entry>
<title>2017 第12屆 五金杯 中國五金產品工業設計大賽徵集</title>
<link href="http://edwardkuo.imas.tw/paper/2017/08/06/LifeStyle/Chinadesign/"/>
<id>http://edwardkuo.imas.tw/paper/2017/08/06/LifeStyle/Chinadesign/</id>
<published>2017-08-05T16:00:00.000Z</published>
<updated>2017-08-06T15:16:39.031Z</updated>
<content type="html"><![CDATA[<img src="/blogimage/WeChat.jpg">
<p>2015年有幸到中國參加此大會評審,發現雖然名為五金產品比賽,當時不乏有些不錯的<strong>IoT</strong>產品出線,不過那時候只限於中國內作品參賽,這次也可以有台灣作品參賽,工業設計高手可以去挑戰看看</p>
<h2 id="何謂五金杯大賽"><a href="#何謂五金杯大賽" class="headerlink" title="何謂五金杯大賽"></a>何謂五金杯大賽</h2><hr>
<p>“五金杯”中國五金產品工業設計大賽自2006年創辦以來已成功舉辦11屆,大賽在各主辦單位和協作單位的支持下,歷屆參賽作品的數量和質量都在不斷的進步。大賽以創新和務實的特點和國內外知名的專家評委陣容,吸引了全國幾十所高校、幾十家設計公司以及眾多獨立設計師的參與和支持。為了繼續提高五金產品創新設計能力,展現產品創新的新思路、新概念、新主張</p>
<p>詳細內容網址 :<a href="http://www.ykwjdesign.com/notice/3387.html'" target="_blank" rel="external">http://www.ykwjdesign.com/notice/3387.html</a></p>
]]></content>
<summary type="html">
<img src="/blogimage/WeChat.jpg">
<p>2015年有幸到中國參加此大會評審,發現雖然名為五金產品比賽,當時不乏有些不錯的<strong>IoT</strong>產品出線,不過那時候只限於中國內作品參賽,這次也可以有台灣作品參賽,工業設計高手可以去
</summary>
<category term="LifeStyle" scheme="http://edwardkuo.imas.tw/tags/LifeStyle/"/>
</entry>
<entry>
<title>Mobile Center讓App有自動更新功能</title>
<link href="http://edwardkuo.imas.tw/paper/2017/07/25/Devops/MCin-apps/"/>
<id>http://edwardkuo.imas.tw/paper/2017/07/25/Devops/MCin-apps/</id>
<published>2017-07-24T16:00:00.000Z</published>
<updated>2017-07-25T11:35:58.355Z</updated>
<content type="html"><![CDATA[<img src="https://adtmag.com/articles/2017/04/14/~/media/ECG/adtmag/Images/2017/03/mobile_center.png">
<p>微軟在Mobile的解決方案,原先是建構Hockey App上面,不過,從今年五月開始就慢慢轉移到<code>Mobile Center</code>上面,無論是<code>Build</code>還是<code>Test</code>,甚至到發布,都可以透過Mobile Center幫忙完成,先前的一篇文章[<a href="http://edwardkuo.imas.tw/paper/2017/05/23/Devops/MobileCenter/">VSTS 整合Visual Studio Mobile Center </a>]中有介紹把VSTS的Repositories與Mobile Center結合,現在<code>Mobile Center</code>的SDK除了原本的收集Crash Report和Analytics外,還可以讓你的APP自動檢查Mobile Center上面是否有新的版本,如果有新版本則是跳出下載提示,讓使用者可以直接更新App</p>
<p>在先前的Mobile Center有新版本發布時候,只能透過Mail通知用戶,還必須讓用戶點擊Mail中的連結後,再登入Portal去下載新版的App,整個體驗就很不好,也不夠直覺</p>
<h2 id="使用In-app-update前提"><a href="#使用In-app-update前提" class="headerlink" title="使用In-app update前提"></a>使用In-app update前提</h2><hr>
<p>在自己App加入In-app update功能前,有幾個前提必須先知道,不然,就算把Code加入,也不會有動作</p>
<ul>
<li>第一次下載APP,須用通知Mail內的連結下載,不能直接用Group的Public URL下載APP<img src="/blogimage/MobileCenter/15.jpg" width="600"></li>
<li>Build的Configuration必須是<code>Release</code>,不然不會有做用</li>
<li>每次更新必須手動把<code>CFBundleShortVersionString</code>和<code>CFBundleVersion</code>版本號更新</li>
<li>一定要透過Mobile Center的Distribute安裝APP</li>
</ul>
<h2 id="加入In-app-update-SDK"><a href="#加入In-app-update-SDK" class="headerlink" title="加入In-app update SDK"></a>加入In-app update SDK</h2><hr>
<p>加入Mobile Center的Distribution SDK到程式中,以下使用的範例為<code>Xamarin.Form</code>,找到<code>Microsoft.Azure.Mobile.Distribute</code>並安裝<br><img src="/blogimage/MobileCenter/16.jpg" width="600"></p>
<p>安裝好之後,可以在Mobile Center要發布App的<code>Get Started</code>或是<code>Setting</code>地方找到App Secret<br><img src="/blogimage/MobileCenter/17.jpg" width="600"></p>
<p>準備好以上條件後,先到<code>App.Xml.cs</code>的<code>OnStart()</code>加入啟動In-app update,在這邊可以發現,同時有加入<code>typeof(Analytics)</code> & <code>typeof(Crashes)</code>和<code>typeof(Distribute)</code>,表示同時啟用<code>收集Crash</code> & <code>資料分析</code>和<code>In-app update</code>功能,因為這三個功能都是共用同一個App Secret</p>
<figure class="highlight cs"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">protected</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">OnStart</span>(<span class="params"></span>)</span></div><div class="line">{</div><div class="line"><span class="meta">#<span class="meta-keyword">if</span> AppRelease</span></div><div class="line"> Distribute.ReleaseAvailable = OnReleaseAvailable;</div><div class="line"> MobileCenter.Start(<span class="string">$"ios=<span class="subst">{ConfigurationManager.AppSettings[<span class="string">"MobileCenterAppSecret"</span>]}</span>;"</span>,</div><div class="line"> <span class="keyword">typeof</span>(Analytics), <span class="keyword">typeof</span>(Crashes), <span class="keyword">typeof</span>(Distribute));</div><div class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></div><div class="line">}</div></pre></td></tr></table></figure>
<p>裡面有一行是<code>Distribute.ReleaseAvailable</code>,這是自訂當有APP版本更新時候,會跳出的提示訊息,基本上,如果不做,預設因該還是會有提示方塊,不過,測試一陣子似乎還是不會出現提示訊息,導致沒有辦法更新APP,因此,如果是自訂一個提示訊息就可以進行App更新。</p>
<figure class="highlight cs"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">bool</span> <span class="title">OnReleaseAvailable</span>(<span class="params">ReleaseDetails releaseDetails</span>)</span></div><div class="line">{</div><div class="line"> <span class="keyword">string</span> versionName = releaseDetails.ShortVersion;</div><div class="line"> <span class="keyword">string</span> versionCodeOrBuildNumber = releaseDetails.Version;</div><div class="line"> <span class="keyword">string</span> releaseNotes = releaseDetails.ReleaseNotes;</div><div class="line"> Uri releaseNotesUrl = releaseDetails.ReleaseNotesUrl;</div><div class="line"></div><div class="line"> <span class="keyword">var</span> title = <span class="string">"Version "</span> + versionName + <span class="string">" available!"</span>;</div><div class="line"> Task answer;</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (releaseDetails.MandatoryUpdate)</div><div class="line"> {</div><div class="line"> answer = Current.MainPage.DisplayAlert(title, releaseNotes, <span class="string">"Update Version"</span>);</div><div class="line"> }</div><div class="line"> <span class="keyword">else</span></div><div class="line"> {</div><div class="line"> answer = Current.MainPage.DisplayAlert(title, releaseNotes, <span class="string">"Update Version"</span>, <span class="string">"Next Time"</span>);</div><div class="line"> }</div><div class="line"> answer.ContinueWith((task) =></div><div class="line"> {</div><div class="line"> <span class="keyword">if</span> (releaseDetails.MandatoryUpdate || (task <span class="keyword">as</span> Task<<span class="keyword">bool</span>>).Result)</div><div class="line"> {</div><div class="line"> Distribute.NotifyUpdateAction(UpdateAction.Update);</div><div class="line"> }</div><div class="line"> <span class="keyword">else</span></div><div class="line"> {</div><div class="line"> Distribute.NotifyUpdateAction(UpdateAction.Postpone);</div><div class="line"> }</div><div class="line"> });</div><div class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</div><div class="line">}</div></pre></td></tr></table></figure>
<p>改好這邊後,還必須到Xamarin.app.ios的<code>AppDelegate.cs</code>加入app啟動時候就檢查版本功能,不管程式怎樣寫檢查更新的程式一定不能在<code>LoadApplication(new App())</code>之前,不過呢,又經過一番測試後,發現把這一行放在<code>Xamarin.Forms.Forms.Init()</code>之後是最穩的</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">public override bool FinishedLaunching(UIApplication app, NSDictionary options)</div><div class="line">{</div><div class="line"> global::Xamarin.Forms.Forms.Init();</div><div class="line">#if AppRelease</div><div class="line"> //檢查有無更新版本</div><div class="line"> Distribute.DontCheckForUpdatesInDebug();</div><div class="line">#endif</div><div class="line"> LoadApplication(new App());</div><div class="line">}</div></pre></td></tr></table></figure>
<p>另外,還必須到<code>info.plist</code>加入一個屬性,不過,因為在iOS中,測試App和Release的App是無法共用同一個<code>Bundle Identifier</code>,就如之前所說,Mobile Center中的Build Task是Mobile Center做好的,我們並無法在裡面做其他更改設定,這也導致無法在自動化時候去更新Bundle Identifier Name,所以,必須額外做一個Release用的plist檔案,讓在Release Build時候,置換原本的<code>info.plist</code>。因此,加入一個叫做<code>InfoRelease.plist</code>的檔案,並在這檔案中加入CFBundleURLTypes,這邊須至換掉裡面的<code>{App secret}</code>,其值是跟<code>ConfigurationManager.AppSettings["MobileCenterAppSecret"]}</code>相同的<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">key</span>></span>CFBundleVersion<span class="tag"></<span class="name">key</span>></span></div><div class="line"><span class="tag"><<span class="name">string</span>></span>1.1.4<span class="tag"></<span class="name">string</span>></span></div><div class="line">//加入下面內容</div><div class="line"><span class="tag"><<span class="name">key</span>></span>CFBundleURLTypes<span class="tag"></<span class="name">key</span>></span></div><div class="line"> <span class="tag"><<span class="name">array</span>></span></div><div class="line"> <span class="tag"><<span class="name">dict</span>></span></div><div class="line"> <span class="tag"><<span class="name">key</span>></span>CFBundleURLSchemes<span class="tag"></<span class="name">key</span>></span></div><div class="line"> <span class="tag"><<span class="name">array</span>></span></div><div class="line"> <span class="tag"><<span class="name">string</span>></span>mobilecenter-{App Secret}<span class="tag"></<span class="name">string</span>></span></div><div class="line"> <span class="tag"></<span class="name">array</span>></span></div><div class="line"> <span class="tag"></<span class="name">dict</span>></span></div><div class="line"> <span class="tag"></<span class="name">array</span>></span></div></pre></td></tr></table></figure></p>
<p>到這一步,基本上就已經讓App有了In-app update功能,剩下就是要把InfoRelease.plist置換成info.plist。</p>
<h2 id="置換info-plist"><a href="#置換info-plist" class="headerlink" title="置換info.plist"></a>置換info.plist</h2><hr>
<p>做到這一點,就只能在專案檔中加入以下設定,先在Xamarin.App.ios的專案檔找到<code>Info.plist</code>關鍵字,基本上未修改前是這樣<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">None</span> <span class="attr">Include</span>=<span class="string">"Info.plist"</span> /></span></div></pre></td></tr></table></figure></p>
<p>修改後為這樣<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">None</span> <span class="attr">Include</span>=<span class="string">"Info.plist"</span> <span class="attr">Condition</span>=<span class="string">"'$(Configuration)' != 'Release'"</span>></span></div><div class="line"> <span class="tag"><<span class="name">SubType</span>></span>Designer<span class="tag"></<span class="name">SubType</span>></span></div><div class="line"><span class="tag"></<span class="name">None</span>></span></div><div class="line"><span class="tag"><<span class="name">None</span> <span class="attr">Include</span>=<span class="string">"InfoRelease.plist"</span> <span class="attr">Condition</span>=<span class="string">"'$(Configuration)' == 'Release'"</span>></span></div><div class="line"> <span class="tag"><<span class="name">LogicalName</span>></span>Info.plist<span class="tag"></<span class="name">LogicalName</span>></span></div><div class="line"> <span class="tag"><<span class="name">SubType</span>></span>Designer<span class="tag"></<span class="name">SubType</span>></span></div><div class="line"><span class="tag"></<span class="name">None</span>></span></div></pre></td></tr></table></figure></p>
<p>這樣就可以在Release時候,將Release階段需要的資訊轉換成Info.plist給iOS App用了</p>
<p>確定功能沒問題話,在第一次安裝App後,會跳出一個網頁畫面,內容會有一段是<code>Enable in-app Update</code>,有這一段話,基本這個App就具有自動更新的機制了</p>
]]></content>
<summary type="html">
<img src="https://adtmag.com/articles/2017/04/14/~/media/ECG/adtmag/Images/2017/03/mobile_center.png">
<p>微軟在Mobile的解決方案,原先是建構Hockey App上面,不
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
</entry>
<entry>
<title>Windows Server 2016 Containers初體驗</title>
<link href="http://edwardkuo.imas.tw/paper/2017/07/21/Docker/DockerCon/"/>
<id>http://edwardkuo.imas.tw/paper/2017/07/21/Docker/DockerCon/</id>
<published>2017-07-21T14:59:31.000Z</published>
<updated>2017-08-21T03:31:03.296Z</updated>
<content type="html"><![CDATA[<img src="https://www.docker.com/sites/default/files/group_5622_0.png">
<p>當Windows Server 2016開始有支援Containers後,認為只要把Windows Server 2016內的Container服務啟動後,就可以立馬來使用Docker這項技術,殊不知這是錯誤的,因為,這樣做法只是讓Windows Server 2016有了Container功能,但是,要讓它可以用Docker,還必須額外安裝<code>Docker</code>模組才可以有辦法開始使用Docker的技術,而在Windows Server 2016支援的Containers有分成<strong>Windows Server Containers</strong>和<strong>Hyper-V Containers</strong>,下面採用的是<strong>Windows Server Containers</strong>。</p>
<h2 id="安裝Docker"><a href="#安裝Docker" class="headerlink" title="安裝Docker"></a>安裝Docker</h2><hr>
<p>建議在安裝Docker之前,要把Windows Server 2016所有更新檔都必須要更新,才不會有問題,然後,用Admin權限啟動<code>PowerShell</code>,而第一個必須先安裝<code>Docker-Microsoft PackageManagement</code>套件,有了這個套件,才能去安裝Docker的Package</p>
<p>安裝<code>Docker-Microsoft PackageManagement</code><br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Install-Module -Name DockerMsftProvider -Repository PSGallery -Force</div></pre></td></tr></table></figure></p>
<p>安裝Docker Package<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Install-Package -Name docker -ProviderName DockerMsftProvidere</div></pre></td></tr></table></figure></p>
<p>都安裝完畢後,必須重新啟動電腦,讓Docker服務啟動,若是後續想要更新Docker,只要輸入更新指令就可以<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Install-Package -Name Docker -ProviderName DockerMsftProvider -Update -Force</div></pre></td></tr></table></figure></p>
<p>以上三步驟就可以在Windows Server 2016用Docker功能,若不確定是否可以用,只要輸入<code>docker info</code>能查看Docker相關訊息就沒問題了</p>
<h2 id="安裝Docker-Compose"><a href="#安裝Docker-Compose" class="headerlink" title="安裝Docker-Compose"></a>安裝Docker-Compose</h2><hr>
<p>Docker-Compose是讓你可以快速佈署或是啟動Container的設定檔,如果是透過<code>VS.Code</code>去編輯Docker-Compose的yml檔案,必須先在VS.Code內安裝相關Docker-Compose套件,才可以開始編輯,但按照先前作法,已經可以在Windows Server 2016使用Docker,不過,卻沒有Docker-Compose指令,因為,必須額外安裝Docker-Compose套件,才有辦法使用Docker-Compose指令,安裝套件位置[<a href="'https://github.com/docker/compose/releases'">https://github.com/docker/compose/releases</a>],下載的檔案名稱是會是這樣<code>docker-compose-Windows-x86_64.exe</code>,也可以直接用PowserShell的指令安裝套件<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Invoke-WebRequest <span class="string">"https://github.com/docker/compose/releases/download/1.14.0/docker-compose-Windows-x86_64.exe"</span> -UseBasicParsing -OutFile <span class="variable">$Env</span>:ProgramFiles\docker\docker-compose.exe</div></pre></td></tr></table></figure></p>
<p>不過,若公司防火牆關係無法安裝化,就是必須先把檔案下載下來,並且,透過上面指令取代掉原本URL位置改成<code>docker-compose-Windows-x86_64.exe</code>檔案的路徑,就可以安裝了,或是更改檔名為<code>docker-compose</code>後放自訂一個目錄中,只是必須設定系統的Path指定到這個目錄中</p>
<h2 id="製作自己的Docekr-Image"><a href="#製作自己的Docekr-Image" class="headerlink" title="製作自己的Docekr Image"></a>製作自己的Docekr Image</h2><hr>
<p>我們會從Docker Store下載自己所需要的image建立Container,不過,從Store下載來的image只是原始的Source,有時候並不能符合我們實際需求,所以,還會額外把設定加入進去,但是,若是每次從Image建立Container,都還要重複設定一次,也很費工。如果這時候想要每次都直接用自己加工過的image,而不是原始的Source,必須花一點小方法來製作屬於自己的image,在原本Docker指令中,是有支援Export功能,但是,在Windows Server 2016 Containers目前沒有辦法用這個指令。所以,我們必須利用Commit方式進行。</p>
<p>以SQL Server Container為例,我們可以先把Containers建立起來後,並放入自己系統的DB<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">docker run -it --name SQLTest <span class="_">-d</span> -p 14331:1433 <span class="_">-e</span> sa_password=XXXXX <span class="_">-e</span> ACCEPT_EULA=Y -v c:\DB\:C:\DB\ microsoft/mssql-server-windows-express:2016-sp1</div></pre></td></tr></table></figure></p>
<p>這時候建立的DB Container就不會是原始的Source,且每次啟動DB Container也不想要再還原一次DB到新的Container,這時候要把這個Container變成自己的image,以後只要啟動自己的image就可以</p>
<p>第一就是要先停掉Container,這個Container已經加入自己的DB<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">docker stop SQLTest</div></pre></td></tr></table></figure></p>
<p>停掉Container後,用Commit方式建立新的image,這步驟通常會一點點時間<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">docker commit Container_ID microsoft/mssql-server-windows-express:SQLTest</div></pre></td></tr></table></figure></p>
<p>如下圖,這樣在image List中,就多出剛剛建立的<em>客製化</em>image source了<br><img src="/blogimage/Docker/5.jpg" width="800"></p>
<p>如果想要把這image搬到其他地方使用呢?一種就是放入registry中,若現實不允許,就只能自己把image匯出檔案囉<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">docker save -o <span class="string">"c:\image\SQLTest.tar"</span> microsoft/mssql-server-windows-express:SQLTest</div></pre></td></tr></table></figure></p>
<p>通常這一步又要花費更久時間,反之要把檔案匯入,則使用<code>docker load</code>,就可以建立一個自己情境的docker image</p>
<h2 id="讓Remote-Container執行Docker-Compose"><a href="#讓Remote-Container執行Docker-Compose" class="headerlink" title="讓Remote Container執行Docker-Compose"></a>讓Remote Container執行Docker-Compose</h2><hr>
<p>上面執行Docker方式,都是在Windows Server中下達Docker指令,但是,如果要透過另一台VM或是機器去呼叫遠端的VM的Container,必須先做幾個設定,首先,要更改遠端機器的<code>daemon.json</code>檔案,加入下面參數,並重啟Docker(<strong>Restart-Service docker</strong>)<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">"hosts": ["tcp://0.0.0.0:2375", "npipe://"]</div></pre></td></tr></table></figure></p>
<p>須注意就是遠端機器的防火牆必須要開啟<code>2375</code> Port,然後執行<code>docker -H Remote IP:2375 info</code>,就可以確認是否有通了,到了這部表示遠端機器已經開放Port讓你可以遠距執行Docker指令,接下來就是執行<code>.yml</code>檔案去建立Container,這次案例是建立好一個要啟動SQL Container,在<code>yaml</code>的描述檔的內容如下:<br><figure class="highlight yaml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="attr">version:</span> <span class="string">'2.1'</span></div><div class="line"><span class="attr">services:</span></div><div class="line"><span class="attr"> SQLDB:</span></div><div class="line"><span class="attr"> container_name:</span> SQLTest2016</div><div class="line"><span class="attr"> environment:</span></div><div class="line"><span class="attr"> ACCEPT_EULA:</span> <span class="string">"Y"</span></div><div class="line"><span class="attr"> SA_PASSWORD:</span> <span class="string">"XXXX"</span></div><div class="line"><span class="attr"> image:</span> microsoft/mssql-server-windows-express:SQLTest</div><div class="line"><span class="attr"> ports:</span></div><div class="line"><span class="bullet"> -</span> <span class="number">14331</span>:<span class="number">1433</span></div><div class="line"><span class="attr"> volumes:</span></div><div class="line"><span class="attr"> - C:</span>\DB\:C:\DB\</div><div class="line"></div><div class="line"><span class="attr">networks:</span></div><div class="line"><span class="attr"> default:</span></div><div class="line"><span class="attr"> external:</span></div><div class="line"><span class="attr"> name:</span> nat</div></pre></td></tr></table></figure></p>
<p>通常要執行這個<code>yaml</code>檔案會是放在要執行Container機器上,而這次是要透過自己電腦去啟動遠端的Container,所以,必須把<code>yaml</code>檔案放在自己電腦端,然後透過下面指令執行它<br><figure class="highlight sh"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">docker-compose -H Remote_IP <span class="_">-f</span> docker-compose.yml up</div></pre></td></tr></table></figure></p>
<p>就可以讓啟動遠端的Container了</p>
<h3 id="參考來源"><a href="#參考來源" class="headerlink" title="參考來源"></a>參考來源</h3><hr>
<p><a href="https://blog.yowko.com/2017/05/docker-command-in-windows.html" target="_blank" rel="external">https://blog.yowko.com/2017/05/docker-command-in-windows.html</a><br><a href="https://philipzheng.gitbooks.io/docker_practice/content/introduction/what.html" target="_blank" rel="external">https://philipzheng.gitbooks.io/docker_practice/content/introduction/what.html</a></p>
]]></content>
<summary type="html">
<img src="https://www.docker.com/sites/default/files/group_5622_0.png">
<p>當Windows Server 2016開始有支援Containers後,認為只要把Windows Server 2016內的Co
</summary>
<category term="Docker" scheme="http://edwardkuo.imas.tw/tags/Docker/"/>
</entry>
<entry>
<title>用Azure Conditional Access限制公司以外地區不可以連入VSTS</title>
<link href="http://edwardkuo.imas.tw/paper/2017/07/14/Devops/VSTSSE/"/>
<id>http://edwardkuo.imas.tw/paper/2017/07/14/Devops/VSTSSE/</id>
<published>2017-07-13T16:00:00.000Z</published>
<updated>2017-07-14T07:04:16.950Z</updated>
<content type="html"><![CDATA[<img src="http://sierraws.com/wp-content/uploads/2013/11/Sierra-Workforce-Solutions-Workplance-Security-AccessControl-e1389048310112.jpg">
<p>就目前微軟以雲端服務為優先情況,VSTS的功能是越來越強大,再加上本身VSTS也可以與地端整合,所以,使用VSTS來做為版控工具是一個不錯選擇,不過,很多人知道好處,但畢竟是雲端服務又會很擔心,如果在公司外部讓公司有心人進入後,把所有程式碼都拿走就慘了,安全性的管理一直想用VSTS的一個。</p>
<p>其實只要透過Azure Conditional Access就可以解決這問題。畢竟,在整個微軟雲端服務中,無論是Office 365或是VSTS都是在Azure上面的一個SaaS服務,換句話說其帳號是在Azure AD中被管理,透過下圖可以知道就可以知道</p>
<img src="/blogimage/Azure/VS1.png" width="700">
<p>因此,就來看看Conditional Access機制可以幫忙做到那些事情</p>
<h2 id="進入Azure-Conditional-Access"><a href="#進入Azure-Conditional-Access" class="headerlink" title="進入Azure Conditional Access"></a>進入Azure Conditional Access</h2><hr>
<p>使用VSTS時候,記得要讓Azure與VSTS綁定,可以到<code>Team Services accounts</code>看是否有被綁定進來,此外,還必須注意就是Azure AD的<code>Subscription</code>與VSTS被指定的<code>Subscription</code>是否有相同,如果是沒有多個<code>Subscription</code>基本就不會有問題,不然會發生怎樣設定都無法成功,因為被設定在不同的<code>Subscription</code>上面,如果是從<code>Team Services accounts</code>建立的VSTS問題是最少的</p>
<p>前置作業都確定差不多,就可以去Azure AD的Conditional Access功能<br><img src="/blogimage/Azure/VS2.png" width="500"> </p>
<p>一進去就可以看到Conditional Access說明<br><img src="/blogimage/Azure/VS3.png" width="500"> </p>
<h2 id="開始新增規則"><a href="#開始新增規則" class="headerlink" title="開始新增規則"></a>開始新增規則</h2><hr>
<p>這裡可以設定多個規則,我們來設定一組規則試試看,按下新增規則,可以看到有下面幾點可以設定<br><img src="/blogimage/Azure/VS4.png" width="300"> </p>
<p>分成<em>工作指派</em>和<em>存取控制</em>,前者是設定相對應的條件,後者是規範在前者條件下是否可以有存取權限,看似似乎不太難設定</p>
<h3 id="使用者和群組"><a href="#使用者和群組" class="headerlink" title="使用者和群組"></a>使用者和群組</h3><p>有哪些人員要被規範,原則上都是全部人員,可以設定要包括人員或是排除那些人員不被限制</p>
<img src="/blogimage/Azure/VS5.png" width="500">
<h3 id="雲端應用程式"><a href="#雲端應用程式" class="headerlink" title="雲端應用程式"></a>雲端應用程式</h3><p>這裡則是設定有被Azure AD管理的服務,就這組測試用的案例來說,只有VSTS有被Azure AD管理,只會出現VSTS,當然如果想要所有雲端應用程式都套用,就直接選定全部吧</p>
<img src="/blogimage/Azure/VS6.png" width="600">
<p>像是正式環境,又有使用O365,所以,這邊列表的APP又多了Office 365,且基本上有用到微軟雲端服務的產品,都會被歸納進來,如Hockeyapp</p>
<img src="/blogimage/Azure/VS7.png" width="600">
<h3 id="條件設定"><a href="#條件設定" class="headerlink" title="條件設定"></a>條件設定</h3><p>在條件設定可以設定分別有</p>
<ul>
<li>登入風險</li>
<li>裝置平台 : 可以套用那些平台上面</li>
<li>位置 : 主要設定白名單,有列在名單中才可以存取,這是最重要設定選項之一</li>
<li>用戶端應用程式</li>
</ul>
<img src="/blogimage/Azure/VS8.png" width="600">
<p>其中位置設定,若是公司網路,可以把公司網路範圍區域設定為白名單,這邊必須採用<code>CIDR</code>標示法,如果不知道要怎樣標示,也可以透過工具<a href="'http://www.ipaddressguide.com/cidr">www.ipaddressguide.com/cidr</a>幫忙</p>
<img src="/blogimage/Azure/VS9.png" width="500">
<p>這邊情境我們設定如下<br><img src="/blogimage/Azure/VS10.png" width="500"> </p>
<h3 id="存取控制"><a href="#存取控制" class="headerlink" title="存取控制"></a>存取控制</h3><p>上面條件設定完成後,就是設定若是符合這些條件,需要進行那些動作,可以設定鎖定或是有條件的進入,先來設定全部<code>封鎖存取</code><br><img src="/blogimage/Azure/VS11.png" width="500"> </p>
<p>設定完成後,就可以多一個條件原則,這時候我們再去VSTS測試看看<br><img src="/blogimage/Azure/VS12.png" width="500"> </p>
<p>用網頁登入後,就會出現這提示,表示你現在可能不在公司或是已經你現在網路位置是不被允許登入的,當然用Visual Studio也沒辦法連入了<br><img src="/blogimage/Azure/VS13.png" width="500"> </p>
<p>如果這時候想要某些IP可以連入情況,就去排除選項把信任IP放入就可以,除了IP還可以設定被授予裝置,只是這部分需要與Intune整合就是</p>
<hr>
<p>透過這樣條件組合,就可以在增強VSTS使用上的安全性,也可以符合每家企業對於安全性的不同定義。</p>
<h3 id="參考資料"><a href="#參考資料" class="headerlink" title="參考資料"></a>參考資料</h3><p><a href="`https://docs.microsoft.com/en-us/azure/active-directory/active-directory-conditional-access`">https://docs.microsoft.com/en-us/azure/active-directory/active-directory-conditional-access</a></p>
]]></content>
<summary type="html">
<img src="http://sierraws.com/wp-content/uploads/2013/11/Sierra-Workforce-Solutions-Workplance-Security-AccessControl-e1389048310112.jpg">
<
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
<category term="VSTS" scheme="http://edwardkuo.imas.tw/tags/VSTS/"/>
</entry>
<entry>
<title>自動化建置取得不同VSTS平台內的Packages Manager套件</title>
<link href="http://edwardkuo.imas.tw/paper/2017/07/07/Devops/VSTSPackage/"/>
<id>http://edwardkuo.imas.tw/paper/2017/07/07/Devops/VSTSPackage/</id>
<published>2017-07-06T16:00:00.000Z</published>
<updated>2017-07-07T00:23:53.726Z</updated>
<content type="html"><![CDATA[<img src="https://www.geekhive.com/wp-content/uploads/2017/05/ship-1920x1080.jpg">
<p>自從VSTS有了<strong>Packages</strong>的功能,可以讓我們自建團隊私有的Nuget後,就習慣把大量可以Re-Use套件放上去,可以讓整個團隊共同使用這些套件。不過,如果給自己團隊是沒有甚麼問題,今天要跨團隊使用呢?就是給在不同專案成員也用你開發的Package,在同一個VSTS URL下,只要去設定Feed權限也就可以,如下圖,在<code>BestFeed</code>下設定給予要讀取此Package的人員那些權限<br><img src="/blogimage/VSTS/11.jpg" width="700"></p>
<p>但是,如果今天是不同VSTS呢,例如 <code>BBB.visualstud.com</code> 要去讀取 <code>AAA.visualstud.com</code> Packages內的套件,又或是其他版控平台要來讀取<code>AAA.visualstud.com</code> Packages內的套件。當然第一前提依舊必須本身你有在AAA.visualstud.com內有帳號,如果沒有帳號一切就別談囉</p>
<p>以為有帳號就可以嗎?如果在Visual Studio內是沒問題,是可以正常把套件裝起來,不過,這時候你會發現必須先輸入<code>AAA.visualstud.com</code>帳號密碼,一旦做了自動化建置,並不會跳出這樣需求視窗,這時候就會發生找不到這個在<code>AAA.visualstud.com</code>內套件問題,想當然而就會build失敗了。要解決這問題採用一個最簡單方式,就是把驗證資訊設定在<code>Nuget.config</code>中</p>
<p>假設原本的<code>Nuget.config</code>是這樣設定<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><?xml version="1.0" encoding="utf-8"?></div><div class="line"><span class="tag"><<span class="name">configuration</span>></span></div><div class="line"> <span class="tag"><<span class="name">apikeys</span>></span></div><div class="line"> <span class="tag"></<span class="name">apikeys</span>></span></div><div class="line"> <span class="tag"><<span class="name">packageSources</span>></span></div><div class="line"> <span class="tag"><<span class="name">clear</span> /></span></div><div class="line"> <span class="tag"><<span class="name">add</span> <span class="attr">key</span>=<span class="string">"AAA"</span> <span class="attr">value</span>=<span class="string">"https://AAA.pkgs.visualstudio.com/_packaging/BestFeed/nuget/v3/index.json"</span> /></span></div><div class="line"> <span class="tag"><<span class="name">add</span> <span class="attr">key</span>=<span class="string">"nuget.org"</span> <span class="attr">value</span>=<span class="string">"https://www.nuget.org/api/v2/"</span> /></span></div><div class="line"> <span class="tag"></<span class="name">packageSources</span>></span></div><div class="line"> <span class="tag"><<span class="name">activePackageSource</span>></span></div><div class="line"> <span class="tag"><<span class="name">add</span> <span class="attr">key</span>=<span class="string">"All"</span> <span class="attr">value</span>=<span class="string">"(Aggregate source)"</span> /></span></div><div class="line"> <span class="tag"></<span class="name">activePackageSource</span>></span></div><div class="line"><span class="tag"></<span class="name">configuration</span>></span></div></pre></td></tr></table></figure></p>
<p>這時候需要加入<code><packageSourceCredentials></code>屬性,剛剛提到需要可以驗證通過除了帳號還需要密碼,但密碼不是使用這組帳號的密碼,而是必須產生一組PAT密碼,要建立PAT密碼可以參考這篇文章[<a href="'http://edwardkuo.imas.tw/paper/2016/08/10/Devops/2016-08-11/'">打通自動化雲端部署到地端-安裝VSTS Agent
</a>]</p>
<p>有了PAT密碼就把帳號與密碼資訊放入<code>Nuget.config</code>中,在<code><packageSourceCredentials></code>內要加一組跟PackageSources的Key Name一樣名稱的tag<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">packageSourceCredentials</span>></span></div><div class="line"> <span class="tag"><<span class="name">AAA</span>></span></div><div class="line"> <span class="tag"><<span class="name">add</span> <span class="attr">key</span>=<span class="string">"Username"</span> <span class="attr">value</span>=<span class="string">"XXX"</span> /></span></div><div class="line"> <span class="tag"><<span class="name">add</span> <span class="attr">key</span>=<span class="string">"ClearTextPassword"</span> <span class="attr">value</span>=<span class="string">"123123123123123"</span> /></span></div><div class="line"> <span class="tag"></<span class="name">AAA</span>></span></div><div class="line"><span class="tag"></<span class="name">packageSourceCredentials</span>></span></div></pre></td></tr></table></figure></p>
<p>並添加<code>Username</code>和<code>ClearTextPassword</code>,前者就是登入到<code>AAA.visualstud.com</code>,後者就是<code>PAT</code>密碼。完成後,在自動化建置中就可以去抓去對方的Package了</p>
]]></content>
<summary type="html">
<img src="https://www.geekhive.com/wp-content/uploads/2017/05/ship-1920x1080.jpg">
<p>自從VSTS有了<strong>Packages</strong>的功能,可以讓我們自建團隊私有的Nuget
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
<category term="VSTS" scheme="http://edwardkuo.imas.tw/tags/VSTS/"/>
</entry>
<entry>
<title>Microsoft Teams整合VSTS Story Board</title>
<link href="http://edwardkuo.imas.tw/paper/2017/06/23/Devops/TEAMSVSTS/"/>
<id>http://edwardkuo.imas.tw/paper/2017/06/23/Devops/TEAMSVSTS/</id>
<published>2017-06-22T16:00:00.000Z</published>
<updated>2017-06-23T05:32:13.698Z</updated>
<content type="html"><![CDATA[<img src="https://www.mindmeister.com/blog/wp-content/uploads/Brainstorming-1024x536.png">
<p>先前在VSTS使用Story Board時候,又用Teams,想說是否可以不要兩邊切換看和討論Story,早期作法就只是把VSTS Story的Link address抓下來,利用Teams的<strong>Tab</strong>內的Web Site功能建立,不過,這個月更新,整合度就更好了,只需要透過幾個步驟,就可以把兩邊給串起來,且比我之前用link來做好多了</p>
<h2 id="選VSTS-Tab"><a href="#選VSTS-Tab" class="headerlink" title="選VSTS Tab"></a>選VSTS Tab</h2><hr>
<p>到Teams的Tab功能列表中,找到VSTS的Function,並點選啟動它</p>
<img src="/blogimage/MicrosoftTeamsFile/A.jpg" width="500">
<h2 id="開始設定連接參數"><a href="#開始設定連接參數" class="headerlink" title="開始設定連接參數"></a>開始設定連接參數</h2><hr>
<p>點選Function後,就可以開始設定,目前Teams帳號與VSTS帳號並沒有統一,所以,這邊會要你輸入VSTS的登入帳號</p>
<img src="/blogimage/MicrosoftTeamsFile/A1.jpg" width="500">
<p>登入之後,就可以選訂要連結的VSTS位置,如果你有多個,就只能選擇一個來做綁定</p>
<img src="/blogimage/MicrosoftTeamsFile/A2.jpg" width="500">
<p>就Teams是以團隊為主,所以,套用到VSTS時候,也必須選定<em>團隊專案</em>和<em>團隊名稱</em>,如果今日有一個團隊是跨多個專案,就必須設定多次了,沒有辦法在一次就可以全部看到的<br><img src="/blogimage/MicrosoftTeamsFile/A3.jpg" width="500"></p>
<p>在Backlog level中,只能選定<code>Features</code>,<code>Stories</code> 和<code>Epics</code>三種,設定好之後就按確定,就可以囉<br><img src="/blogimage/MicrosoftTeamsFile/A4.jpg" width="500"></p>
<h2 id="開始使用"><a href="#開始使用" class="headerlink" title="開始使用"></a>開始使用</h2><hr>
<p>設定完成後,就可以在Teams的Tab上面就會出VSTS Story,也可以透過Teams聊天功能去討論Story了<br><img src="/blogimage/MicrosoftTeamsFile/A5.jpg" width="500"></p>
]]></content>
<summary type="html">
<img src="https://www.mindmeister.com/blog/wp-content/uploads/Brainstorming-1024x536.png">
<p>先前在VSTS使用Story Board時候,又用Teams,想說是否可以不要兩邊切換看和討
</summary>
<category term="Microsoft Teams" scheme="http://edwardkuo.imas.tw/categories/Microsoft-Teams/"/>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
</entry>
<entry>
<title>還原DB發生Cannot execute as the database principal because the principal "dbo" does not exist...</title>
<link href="http://edwardkuo.imas.tw/paper/2017/06/03/SQL/SQLAA/"/>
<id>http://edwardkuo.imas.tw/paper/2017/06/03/SQL/SQLAA/</id>
<published>2017-06-02T16:00:00.000Z</published>
<updated>2017-06-03T09:53:26.569Z</updated>
<content type="html"><![CDATA[<img src="http://www.conceptinfoway.net/wp-content/uploads/2010/03/SQL-1.png">
<p>今天把某台的DB Server中的資料庫還原到另一台DB Server時候,發生這樣的訊息</p>
<blockquote>
<p>Cannot execute as the database principal because the principal “dbo” does not exist, this type of principal cannot be impersonated, or you do not have permission</p>
</blockquote>
<p>想說平常做備份還原都沒有遇到這問題,怎這次會遇到這樣問題,查了一下還原DB Log,並未發現甚麼錯誤,那樣到底是哪邊出問題<br><img src="/blogimage/DB1.jpg"></p>
<p>原來是DB Owner不見了,會發生這問題我猜想因該是因為不同台的DB Server內的帳號是不一致,導致還原DB到這台主機時候,找不到原先DB Owner,這時候只要重新給一個DB Owner帳號就可以囉<br><img src="/blogimage/DB2.jpg"></p>
]]></content>
<summary type="html">
<img src="http://www.conceptinfoway.net/wp-content/uploads/2010/03/SQL-1.png">
<p>今天把某台的DB Server中的資料庫還原到另一台DB Server時候,發生這樣的訊息</p>
<blockqu
</summary>
<category term="T-SQL" scheme="http://edwardkuo.imas.tw/tags/T-SQL/"/>
</entry>
<entry>
<title>用Excel產生Json格式的資料</title>
<link href="http://edwardkuo.imas.tw/paper/2017/05/25/Other/EXCELJson/"/>
<id>http://edwardkuo.imas.tw/paper/2017/05/25/Other/EXCELJson/</id>
<published>2017-05-24T16:00:00.000Z</published>
<updated>2017-06-03T01:56:35.270Z</updated>
<content type="html"><![CDATA[<img src="https://cdn1.pcadvisor.co.uk/cmsdata/features/3656625/how-to-create-pivottables-main_thumb800.png">
<p><code>Json</code>做為資料傳遞格式傳遞是越來越普遍,就連把SQL也支援JSON資料傳入做<code>Insert</code>資料用。不過,雖然JSON資料普遍使用,但是,有一個比較大缺點,就是要產生JSON格式的資料並不容易,尤其要多筆資料時候,往往不是缺了<code>[</code>就是少了甚麼,造成格式錯誤。</p>
<p>尤其最近是把Json資料當作參數傳入SQL中,每每要組合這些資料,就快被搞死,因此,找到一個套件叫做<code>Office with Excel to JSON</code>,可以讓你把資料透過EXCEL設計好,然後轉成JSON字串,這樣就方便多。</p>
<p>使用這個套件必須是EXCEL 2016或是O365上的EXCEL版本才可以,<code>Office with Excel to JSON</code>下載點:<br><a href="https://store.office.com/addinstemplateinstallpage.aspx?rs=en-ZA&assetid=WA104380263" target="_blank" rel="external">https://store.office.com/addinstemplateinstallpage.aspx?rs=en-ZA&assetid=WA104380263</a></p>
<p>會彈出這個視窗,但是點下去就對<br><img src="/blogimage/Excel/1.jpg" width="500"></p>
<p>在Excel上要啟用編輯,就可以啟用這個增益集<br><img src="/blogimage/Excel/2.jpg" width="700"></p>
<p>啟用後的畫面如下<br><img src="/blogimage/Excel/3.jpg" width="300"></p>
<p>在這邊可以透過上傳EXCEL檔案產生Json,也可以直接在EXCEL表格上設計好數據,然後去產生<code>Json</code>資料,例如我們設計下面這樣數據格式<br><img src="/blogimage/Excel/4.jpg" width="400"></p>
<p>然後,在剛剛增益集上直接選擇<code>Row</code>,然後,按下<code>Go</code>,下面就會把資料Convert為Json囉<br><figure class="highlight json"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">[</div><div class="line"> {<span class="attr">"Name"</span>:<span class="string">"AAAA"</span>,<span class="attr">"TEL"</span>:<span class="string">"0933932"</span>,<span class="attr">"Status"</span>:<span class="string">"A"</span>,<span class="attr">"Value"</span>:<span class="number">1</span>},</div><div class="line"> {<span class="attr">"Name"</span>:<span class="string">"BBBB"</span>,<span class="attr">"TEL"</span>:<span class="string">"9012312"</span>,<span class="attr">"Status"</span>:<span class="string">"B"</span>,<span class="attr">"Value"</span>:<span class="number">2</span>},</div><div class="line"> {<span class="attr">"Name"</span>:<span class="string">"CCCC"</span>,<span class="attr">"TEL"</span>:<span class="string">"123123"</span>,<span class="attr">"Status"</span>:<span class="string">"V"</span>,<span class="attr">"Value"</span>:<span class="number">3</span>}</div><div class="line">]</div></pre></td></tr></table></figure></p>
<p>這樣是不是很方便呢?不然,每次要搞定這些資料就讓人頭痛了</p>
]]></content>
<summary type="html">
<img src="https://cdn1.pcadvisor.co.uk/cmsdata/features/3656625/how-to-create-pivottables-main_thumb800.png">
<p><code>Json</code>做為資料傳遞格式傳遞
</summary>
<category term="Other" scheme="http://edwardkuo.imas.tw/tags/Other/"/>
</entry>
<entry>
<title>VSTS 整合Visual Studio Mobile Center</title>
<link href="http://edwardkuo.imas.tw/paper/2017/05/24/Devops/MobileCenter/"/>
<id>http://edwardkuo.imas.tw/paper/2017/05/24/Devops/MobileCenter/</id>
<published>2017-05-23T16:00:00.000Z</published>
<updated>2017-07-20T16:17:30.516Z</updated>
<content type="html"><![CDATA[<img src="https://www.visualstudio.com/wp-content/uploads/2016/11/[email protected]">
<p>要在VSTS建置一個Xamarin開發出來的App,只要在Build Process將相關要建置的Task設定好基本上就可以產生出一個APP,若是要建置出iOS用的APP,就必須要在建置的Agent下一番功夫,例如使用Local agent或是第三方的Agent像是MacinCloud幫忙建置Xamarin專案,用Local agent則還是必須準備一台MAC在上面安裝Build Agent,似乎也不是很方便,第三方服務在付費方式上會有些”麻煩”。</p>
<p>去年就在關注Visual Studio Mobile Center發展(雖然現在依舊是Preview),當時它只能綁定Github或是其他開源的版控平台上面的程式,對於愛用VSTS的人來會是一個遺憾,不過,在2017 Build大會前一個月,Mobile Center宣布可以綁定VSTS上Repositories,讓建置直接透過Mobile Center做建置APP,讓整個CI又更方便了,因此,來把VSTS + Mobile Center串起來吧</p>
<h2 id="準備事項"><a href="#準備事項" class="headerlink" title="準備事項"></a>準備事項</h2><hr>
<p>使用Mobile Center前,須注意下面幾點事項,這樣才會會讓整個<code>Build</code>流程順暢一點</p>
<ul>
<li>安裝<code>Mobile Center Analytics</code> 和 <code>Mobile Center Crashes</code></li>
<li>更新<code>Xamarin</code>套件到最新版本</li>
<li>移除Hockeyapp套件</li>
<li>Nuget.config要放在專案的Root位置,就是跟<code>.sln</code>同一層<br>另外一個重要事情,就是記住要自己先在Local端可以Build成功阿,不然放上去也不會成功的</li>
</ul>
<h2 id="Visual-Studio-Mobile-Center-Build"><a href="#Visual-Studio-Mobile-Center-Build" class="headerlink" title="Visual Studio Mobile Center Build"></a>Visual Studio Mobile Center Build</h2><hr>
<p>話說在前頭,因為在VSTS中習慣自己在Build時候,去組合自己想要的<code>Task</code>流程和設定,但是,若是使用Mobile Center時候,這一部分是完全被省掉,講好聽一點就是省掉設定的麻煩,不好聽就是沒有控制權,若是中間有甚麼意外或是非標準化流程,我們自己也無法做更改。所以,目前建議還是依照自己情境來決定,是否要透過Mobile Center座建置這件事情</p>
<h4 id="建立一個平台的APP專案"><a href="#建立一個平台的APP專案" class="headerlink" title="建立一個平台的APP專案"></a>建立一個平台的APP專案</h4><p>進入Mobile Center時候,選擇<code>Add New app</code>,建立一個新的App,這部分感覺有點類似VSTS的Repositories,一開始會要你設定要產生哪一個平台的App,和你開發App用的語言,這裡就選擇<code>iOS</code>和<code>Xamarin</code>,所以說,如果你要產生不同平台的App,就要建立多個APP,這部分還算合理,畢竟不是所有人都是用Xamarin開發,可以跨平台的<br><img src="/blogimage/MobileCenter/1.jpg" width="400"></p>
<p>建立完成之後,就會進入下面的管理介面<br><img src="/blogimage/MobileCenter/2.jpg" width="600"></p>
<p>一進入後,會請你在Xamarin Project安裝相關套件,官網說是找到<code>Mobile Center Analytics</code>和<code>Mobile Center Crashes</code>這兩個套件,不過,實際上卻是找到是這兩名稱的套件<br><img src="/blogimage/MobileCenter/3.jpg" width="600"></p>
<p>找到後安裝起來,說明文件上面有分<code>Xamarin</code>和<code>Xamarin.Form</code>兩種設定SDK用法,不過,雖然本身是使用<code>Xamarin.Form</code>開發,但是,還是可以使用<code>Xamarin</code>方式在Xamarin.ios中加入SDK,而這樣做法只是針對單一平台加入SDK,相關程式碼加入之後,就是開始設定Mobile Center的Build,因為要讓Mobile Center和VSTS的Repositories結合,所以,這裡當然只能選VSTS囉<br><img src="/blogimage/MobileCenter/4.jpg" width="700"></p>
<p>一般來說會希望你Mobile Center的帳號與登入VSTS帳號的登入帳號是相同,這樣會比較單純,如果是這樣情境,會看到下面資訊,Mobile Center會要VSTS授權給它讀取VSTS的Repositories<br><img src="/blogimage/MobileCenter/5.jpg" width="700"></p>
<p>綁定之後,就可以看到VSTS所有的Repositories,此時,只要選定你要的Build的Repositorie進行綁定就可以,而且一旦綁定後,就可以看到Repositorie內所有的Branch,在Mobile Center設定Definition方式是選定你要Build的Branch,然後,再做下一步的設定<br><img src="/blogimage/MobileCenter/6.jpg" width="700"></p>
<h4 id="來Build一個Branch"><a href="#來Build一個Branch" class="headerlink" title="來Build一個Branch"></a>來Build一個Branch</h4><p>這邊設定我只能說,真是走極簡風格阿,跟VSTS比較起來,Mobile Center所需要的設定基本都是<strong>可辨識的</strong><br><img src="/blogimage/MobileCenter/7.jpg" width="700"></p>
<p>如果要設定<code>Device Build</code>就必須上傳該App的<code>Provisioning Profile</code>和<code>.P12 File</code>,當然這是要建置iOS APP的憑證,若是沒有上傳這些憑證,只能使用<code>Simulator build</code>建置APP,而使用此模式,就不能發布到手機上使用</p>
<p>設定好之後或是每次修改設定後,只要一儲存,它就會開始Build了,除非這邊選擇手動觸發,另外,若是選定自動Build,當Code被Check in到VSTS後,也會開始自動建置。這介面上則是列出每次Build的狀況,以及要手動觸發建置的按鈕<br><img src="/blogimage/MobileCenter/8.jpg" width="700"></p>
<p>每個狀態內,會顯示詳細的build資訊,還有每次Build的時間,不過,這邊有一點就是關於Build時間,Mobile Center背後其實是會啟動一個VM去做建置,所以,如果今天碰到是資源比較<strong>缺乏</strong>的,就會向下圖一樣,發生非常長的建置時間<br><img src="/blogimage/MobileCenter/9.jpg" width="700"></p>
<p>當建置完成時候,會出現<code>Download</code>按鈕,若是建置失敗,只能建置過程的Log<br><img src="/blogimage/MobileCenter/10.jpg" width="700"></p>
<p>如果建置失敗是不會有<code>Distribute</code>功能的<br><img src="/blogimage/MobileCenter/11.jpg" width="700"></p>
<p>建置成功則在下載地方,還可以下載三種類型分別是<code>build</code>、<code>symbols</code>和<code>logs</code>的檔案,其中,Build裡面就是編譯好的<code>ipa</code>檔案<br><img src="/blogimage/MobileCenter/12.jpg" width="300"></p>
<p>另外,從下載的Log還可以看得出來,Mobile Center在簡單的背後它設定了那些Task流程,如果想要知道Mobile Center背後怎樣建置你的APP,可以直接看log就可以清楚了解<br><img src="/blogimage/MobileCenter/13.jpg" width="500"></p>
<h2 id="Distribute-APP"><a href="#Distribute-APP" class="headerlink" title="Distribute APP"></a>Distribute APP</h2><hr>
<p>當你Build好之後,到<code>Distribute</code>就看到你剛剛Build的APP,還有建置版本號,也可以在這邊下載APP使用<br><img src="/blogimage/MobileCenter/14.jpg" width="700"></p>
<h2 id="結論"><a href="#結論" class="headerlink" title="結論"></a>結論</h2><hr>
<p>Mobile Center把Build程序簡單化,也讓微軟開發人員不一定要有MAC才可以建置iOS APP,不過,不知道是不是還在Preview,所以,很多機制都尚未完善,要真正導入到企業上用可能還有一段路要走,就拿現在還在運行的HockeyApp來說(未來可能就消失),個人覺得不足地方有幾點:</p>
<ul>
<li>沒有類似HockeyApp一樣的Store,列出可以下載的APP,這樣可以減省企業自行建置Store的時間</li>
<li>因為是自動設定好Task,如果要切換Bundle Identifier Name,沒有辦法透過Merage Branch方式進行</li>
</ul>
]]></content>
<summary type="html">
<img src="https://www.visualstudio.com/wp-content/uploads/2016/11/[email protected]">
<p>要在VSTS建置一個Xamarin開發出來的App,只要在Build Process將相關要建置的Task設
</summary>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
<category term="VSTS" scheme="http://edwardkuo.imas.tw/tags/VSTS/"/>
</entry>
<entry>
<title>修復RansomWin32WannaCrypt勒索病毒方式</title>
<link href="http://edwardkuo.imas.tw/paper/2017/05/15/LifeStyle/SaveRansomWin32WannaCrypt/"/>
<id>http://edwardkuo.imas.tw/paper/2017/05/15/LifeStyle/SaveRansomWin32WannaCrypt/</id>
<published>2017-05-14T16:00:00.000Z</published>
<updated>2017-05-28T15:40:28.174Z</updated>
<content type="html"><![CDATA[<img src="https://pcsolution99.files.wordpress.com/2017/03/wp-1489212561284.jpg">
<p>這一波病毒我想最累因該是企業內部MIS人員,有些朋友公司又有遇到遭情,整個節日就泡湯,這次大部分都是微軟作業系統(聽說MAC也會有)遭殃,但不可避免就是,已經不只是從原本被動模式中毒,就算放著連上網也會中毒,雖然,微軟早在之前就有發布更新,我相信很多人也是沒更新的 XD</p>
<blockquote>
<p>根據微軟的安全報告指出,這個勒索軟體是屬於WannaCryptor病毒的其中一隻變種。為了協助Windows用戶共同面對這個大規模<br>的惡意勒索病毒的威脅,MSRC已公布相關的建議措施,請參閱連結,<a href="'https://blogs.technet.microsoft.com/MSRC/2017/05/12/CUSTOMER-GUIDANCE-FOR-WANNACRYPT-ATTACKS/'">MSRC blog - Customer Guidance for WannaCrypt Attacks</a></p>
</blockquote>
<p>關於修復RansomWin32WannaCrypt勒索病毒,可以透過微軟提供方式來進行</p>
<ul>
<li>安裝微軟於三月釋出的安全性更新中的<a href="'https://technet.microsoft.com/ZH-TW/LIBRARY/SECURITY/MS17-010.ASPX'">MS17-010</a></li>
</ul>
<p>但這次罕見的微軟會替Phase Out產品也做修補</p>
<ul>
<li><a href="'http://catalog.update.microsoft.com/v7/site/ScopedViewInline.aspx?updateid=6e52528b-7754-49ba-b39e-2a2a2b7c8c3a'">Windows Server 2003 SP2 x64</a></li>
<li><a href="'http://catalog.update.microsoft.com/v7/site/ScopedViewInline.aspx?updateid=fdb0df5f-8994-4e43-a37b-82544a1eff68'">Windows Server 2003 SP2 x86</a></li>
<li><a href="'http://catalog.update.microsoft.com/v7/site/ScopedViewInline.aspx?updateid=a679cafc-d8da-4c2a-9709-17a6e6a93f4f'">Windows XP SP2 x64</a></li>
<li><a href="'http://catalog.update.microsoft.com/v7/site/ScopedViewInline.aspx?updateid=9e189800-f354-4dc8-8170-7bd0ad7ca09a'">Windows XP SP3 x86</a></li>
<li><a href="'http://catalog.update.microsoft.com/v7/site/ScopedViewInline.aspx?updateid=d4d15d30-e775-4f6f-b838-d3caca05a5e9'">Windows XP Embedded SP3 x86,Windows 8 x86</a> </li>
<li><a href="'http://catalog.update.microsoft.com/v7/site/ScopedViewInline.aspx?updateid=22699699-94c3-4677-99e5-38cb4fb66401'">Windows 8 x64</a></li>
</ul>
<p>沒中毒也別太高興,還是快點修補吧,畢竟,變種的已經又來了</p>
]]></content>
<summary type="html">
<img src="https://pcsolution99.files.wordpress.com/2017/03/wp-1489212561284.jpg">
<p>這一波病毒我想最累因該是企業內部MIS人員,有些朋友公司又有遇到遭情,整個節日就泡湯,這次大部分都是微軟作業系
</summary>
<category term="LifeStyle" scheme="http://edwardkuo.imas.tw/tags/LifeStyle/"/>
</entry>
<entry>
<title>在Application Insights標註VSTS Release的版本戳記</title>
<link href="http://edwardkuo.imas.tw/paper/2017/05/15/Devops/VSTSAI/"/>
<id>http://edwardkuo.imas.tw/paper/2017/05/15/Devops/VSTSAI/</id>
<published>2017-05-14T16:00:00.000Z</published>
<updated>2017-05-15T15:37:27.280Z</updated>
<content type="html"><![CDATA[<img src="http://www.merv.io/images/whatis2.gif">
<p>常用Application Insighs的人,可以了解Application Insighs能監控的資訊有多強大,不過,在這些資訊中往往會Miss掉一個訊息,就是現在運行的系統版本所得到資訊,跟之前的資訊是否是同一個版本呢?雖然,我們可以在Application Insights內用客製化屬性標記系統版本,但是,不過在統計圖表中卻無法得知這份資訊。在資料的判讀上就會出現問題</p>
<p>因此,為了解決這問題,其實Application Insights是可以<strong>主動</strong>紀錄每次發布的時間點,並標記在圖表上,尤其對於<code>DevOps</code>的團隊來說是很重要(責怪人亂發錯誤版本 =.=),可以確認問題點發生原因</p>
<h3 id="取得Application-Insights-ID-和-Key"><a href="#取得Application-Insights-ID-和-Key" class="headerlink" title="取得Application Insights ID 和 Key"></a>取得Application Insights ID 和 Key</h3><hr>
<p>要能做到這點,必須使用Application Insights Enterprice版本,主要是必須使用到Application Insights API的功能,如果定價策略設定好之後,就到<code>API 存取</code>地方,先找到Application Insights API 的ID<br><img src="/blogimage/Azure/18.jpg" width="500"></p>
<p>有了ID之後,就是建立API Key,選擇<code>建立API 金鑰</code><br><img src="/blogimage/Azure/19.jpg" width="500"></p>
<p>有了這兩組資訊,就可以到VSTS去做設定</p>
<h3 id="設定VSTS的Release-Application-Insights"><a href="#設定VSTS的Release-Application-Insights" class="headerlink" title="設定VSTS的Release Application Insights"></a>設定VSTS的Release Application Insights</h3><hr>
<p>預設在VSTS並沒有Application Insights for Release的Task,必須到Marketplace下載安裝,從安裝說明看來,因該是TFS也可以使用,不過,這邊還是採用VSTS作範例<br><img src="/blogimage/Azure/20.jpg" width="500"></p>
<p>下載安裝後,就可以在VSTS的Deploy看到這個Task<br><img src="/blogimage/Azure/21.jpg" width="500"></p>
<p>把這個Task加入在整個流程最後一個,並填入剛剛取得Application ID & Application Key<br><img src="/blogimage/Azure/22.jpg" width="500"></p>
<p>完畢後,跑一次Release,再去Application Insights看發生怎樣變化,圖表上方多了戳記的圖案<br><img src="/blogimage/Azure/23.jpg" width="500"></p>
<p>點開戳記的內容,就可以看到這次Release相關版本資訊<br><img src="/blogimage/Azure/24.jpg" width="300"></p>
<p>藉由這樣方式,讓整個資訊就會更完整,對於監控Application來說又更方便了</p>
]]></content>
<summary type="html">
<img src="http://www.merv.io/images/whatis2.gif">
<p>常用Application Insighs的人,可以了解Application Insighs能監控的資訊有多強大,不過,在這些資訊中往往會Miss掉一個訊息,就是現在運行的
</summary>
<category term="Azure Application Insights" scheme="http://edwardkuo.imas.tw/categories/Azure-Application-Insights/"/>
<category term="Azure" scheme="http://edwardkuo.imas.tw/tags/Azure/"/>
<category term="DevOps" scheme="http://edwardkuo.imas.tw/tags/DevOps/"/>
</entry>
<entry>
<title>(Docker Swarm)Azure Container Service中建立MS SQL Server for linux</title>
<link href="http://edwardkuo.imas.tw/paper/2017/05/13/Azure/AzurelinuxSQL/"/>
<id>http://edwardkuo.imas.tw/paper/2017/05/13/Azure/AzurelinuxSQL/</id>
<published>2017-05-12T16:00:00.000Z</published>
<updated>2017-05-28T08:13:36.446Z</updated>
<content type="html"><![CDATA[<img src="http://edumuch.com/wp-content/uploads/2016/01/fe0cb49c-fc42-487f-8e68-e247b4278174_orig.png">
<p>繼上一篇的<strong><a href="'http://edwardkuo.imas.tw/paper/2017/05/06/Azure/AzureDocker/'">Azure Container Service初體驗</a></strong>之後,就在想要如何去應用ACS(Azure Container Service的簡稱)的功能,有什麼場景是在對於系統開發或是企業應用方面有幫助的方案,突然,想到其中一個方式,就是建立開發測試的資料庫,在開發時期拿來使用,所以,用ACS建立一個臨時要用的資料庫來做測試用,或許也是一個不錯的選擇,其實,也是可以做為微服務中的資料庫區塊</p>
<p>不過,說這樣多,還是先在ACS中建立一個可外部連線的資料庫吧</p>
<h2 id="ACS的Docker-Swarm"><a href="#ACS的Docker-Swarm" class="headerlink" title="ACS的Docker Swarm"></a>ACS的Docker Swarm</h2><hr>
<p>如果要使用Docker Swarm模式,就必須先了解這張圖架構圖,這張圖是說明了ACS中的Docker Swarm架構,這是非常重要的,在這之中包含了<code>Master</code> & <code>Agent</code>,與網路結構<br><img src="/blogimage/AzureDocker/acs-swarm2.png" width="700"></p>
<p>不過,有一點不解的是這張圖的<code>Master</code>對應到的<code>NAT</code>,但是實際上建置起來後,是對應到<code>Load Balance</code>,也就是說是跟<code>Agent</code>相同,在Agent的<code>Load Balance</code>是<br><code>80</code>,<code>443</code> & <code>8080</code>的Port有被設定對外開放,如果今日你需要的服務對應的Port沒有被開啟,必須要在Loader Balance控制器做開起設定,就如等下做的SQL Server,必須要去開起<code>1433</code>,不然,外部系統是無法連線的到內部Container,如果是在Master,所有Port預設都是沒有被開放,必須自己去做設定<br>輸入<code>docker info</code>得到的資訊,如下<br><img src="/blogimage/AzureDocker/12.jpg" width="700"></p>