Skip to content

zh

我的MBA德國學習之旅

旅行總是充滿了不確定性和偶然性。儘管我的航班在芬蘭赫爾辛基延誤,加上時差引起的壓力讓我在演講中感到壓力,但是此次旅程旅行最終還是讓我得到寶貴的經驗,讓我的專業管理技能得到了課堂以外的提升。

這次的旅程充滿了各種引人深思並且具有教育意義的講座,涵蓋了德國的宏觀經濟、歐洲聯盟、隱形冠軍、工業4.0、以及人工智能等各種主題。我們參觀了深度科技公司Wattx以及生產BMW汽車的Daimler AG工廠,開闊了視野。這次旅程中最重要的個人體會就是,德國具有反脆弱性。儘管德國在二戰期間脆弱不堪,但是它現在的財富狀況證明了它的反脆弱性。

這次旅程讓我明白,德國擁有最多的隱形冠軍公司——這些公司要么在全球排名前三,要么在歐洲排名第一,年收入超過500萬歐元,並且公眾認知度相對較低。許多中小企業專注於深度科技,德國經濟靠的是出口和創新。這些家族企業分布在德國各地,而不是只集中在柏林,在這1,307家隱形冠軍中。

從我的角度來看,由於其充滿活力的初創企業和分權化的特點,德國具有反脆弱性。大企業可能有強勢的等級結構和眾多的規定,但由於更高的人員流動率以及比較低的適應性和靈活性,它們更容易受到傷害。相比之下,中小企業擁有簡單的結構,這樣不僅能夠激發高效的工作文化,提高員工的參與度,還能更加以人為本。這種反脆弱性也體現在員工在公司內部各個職能間更加頻繁的轉換職位。中小企業的員工通常更能直接接觸客戶,這使他們能更好地理解客戶並更快地應對市場變化。

為了理解這些隱形冠軍如何保持競爭力,我們必須認識到它們在特定市場類別中的專業化。他們非常擅長在利基市場創造優質的產品,並且具有全球影響力。這些公司投入重金進行研發,他們持續創新的文化同時由客戶和最高管理層推動。所有這些元素共同為它們的反脆弱性做出了貢獻,使它們能夠在全球市場的不穩定和未知中生存並發展。

我注意到德國和香港的心態有明顯的區別。在香港,大多數學生都傾向於在金融和銀行業找工作,而德國提供更多的行業選擇,比如鋼鐵、鐵礦、機械、化學品、火車、汽車和電子產品等。德國不再將大學教育視為唯一的職業道路,而是為技術技能提供更多的職業培訓。這個多樣化的就業機會和對製造業和科技創新的重視使得這些國家更少受到風險的影響。

德國的經濟非常穩定,特點是低通脹、經濟穩步增長、貿易順差和強大的勞動力。有效的國家管理有助於避免經濟危機的重演,例如大蕭條和在二戰中導致納粹主義興起和政治不穩定的超通脹。理解歷史對於理解我們的起源、現在的挑戰以及在混亂局勢中改善風險管理至關重要。

我攻讀MBA的主要原因之一就是要在全球市場上提高自己的管理技能。我對不同國家之間的財富差異感到好奇。例如,我的學習之旅結束後,我去了瑞士,發現自己吃了迄今為止最貴的麥當勞大麥克套餐,花了12瑞士法郎(大約相當於93港元)。相比之下,在德國,同樣的餐點只需要7歐元,或者在香港約62元。如果你出生在經濟較弱的歐元區國家,例如羅馬尼亞的農村地區,那麼世界可能會讓你感到不公。這次旅程讓我看到了德國成功和反脆弱性的元素,無論是在我參觀柏林、漢堡、慕尼黑還是法蘭克福期間。

我學到的這些經驗將在我致力於在管理層創造反脆弱性工作環境的任務中起到重要的作用。在當今快速變化的數字環境中,建立一個能夠在不可預知性和不確定性中茁壯的公司比僅僅具有恢復力或堅韌性更為重要。如我在德國所觀察到的,規模較小、組織結構平坦的團隊能達到反脆弱性,而大型的層次結構則處於不穩定狀態。反脆弱性的組織擁抱實驗文化,並且避免"太大而不能倒"的心態。在這種環境下,管理者謹慎對待權力集中,領導者們對他們的團隊有信心,可以通過分權化的決策處理複雜的挑戰。

生活在人工智能和自動化的時代是令人充滿洋溢興奮。我們的行業正經歷著深刻的變革,面臨著擴大的未開發機會、越來越多的連接裝置以及更多的實際數據。在完成我的MBA學習後,我繼續努力以期在這個變化迅速的世界中獲得更大的反脆弱性,並且透過我在德國的國際經驗獲得獨特的視角。

案例研究:利豐家族企業

在這篇文章中,我們將討論從利豐家族企業中可以學習到的經驗。該公司存在已經超過一千年,其壽命之長的關鍵在於其為了生存而不斷地自我改造的能力。

不多的中國家族企業能夠成功地運營如此長的時間。利豐於1906年在廣州成立,是中國第一家貿易出口公司。今日,它已擴展到40個不同的國家,並雇用了超過20,000名員工。

家族企業的繼承帶來了重大挑戰。一句中國古語警告說,“富不過三代。”即使在美國,布魯克林學院的一項研究也顯示,70%的家族企業並未能從第一代過渡到第二代,88%則未能過渡到第三代。只有3%的家族企業能夠達到第四代。然而,利豐家族企業已經進入到了第四代。是什麼讓它脫穎而出?有哪些因素促成了它的成功?

答案在於創始人和繼承者之間的全球視野和開放思維。這種方法使家族企業能夠利用大規模經濟趨勢和變化。例如,當清朝末期中國開放貿易時,利豐將自己定位為第一個中國中間人,充分利用了他們對西方和中國市場的理解。通過與說英語的外國人的交往,他們擴大了他們比中國大陸其他商人更廣闊的視野。他們的適應能力使他們得以與香港作為製造業和服裝出口中心的崛起一同成長。他們同時也從中國的經濟改革中獲利,中國業務為他們的整體採購業務貢獻了超過51%。

然而,家族企業在第四代中面臨著挑戰,尤其是由於他們未能預見數字化趨勢。這一點在利豐拒絕了三次投資阿里巴巴的機會、堅持他們的傳統業務模式時尤其明顯。結果,他們在適應電子商務環境方面遇到了困難。這導致了利潤和收入的下降,因為全球品牌正在改變他們的供應鏈管理方式,往往繞過像利豐這樣的中間人。2017年,該公司被剔除出恒生成分股,這表明了它面臨的挑戰的規模。

儘管在其歷史上面臨過眾多挑戰,家族企業通過不斷自我重塑,並將這種精神傳遞給下一代,得以生存。例如,在朝鮮戰爭期間,美國對中國實行了禁運,影響了香港的再出口業務。然後家族從專注於再出口轉向出口香港本地商品。

等 第三代,受過哈佛商學院的教育,將新的現代管理理論帶入了傳統的家族企業中。這使得公司能夠上市,這要歸功於企業所有權與經營管理的劃分,以及良好治理實踐的建立。

利豐從“一個老闆/員工們”制度過渡到適當的管理階層制度,並更換由擁有大學學位的專業經理人員取代家族成員。儘管面臨了像1997年香港回歸中國這樣的歷史性挑戰,企業通過改變其與宏觀經濟趨勢相一致的策略進行了適應。

代表第四代的Spencer Fung也秉承了這些重要的家族價值觀。他在美國接受了MBA的教育,是個具有創業精神的人,並在矽谷共同創辦了個網路的行銷平台。儘管美國和中國之間的貿易戰爭,家族企業已經從中國轉向了越南和其他亞太國家。

下一個重要趨勢聚焦在速度、創新和數字化。第四代已經戰略性地投資於新技術,以減少供應鏈的交期並使3D虛擬設計快速成型。他們還使用進階的分析來改善各種業務指數。

總之,利豐家族企業成功地將西方在管理和科技的現代化與東方在關係和家庭價值觀方面的智慧相融合。他們不斷實施革命性的想法以推動變革和持續改進。他們在保持西式的系統管理方式的同時,加入了更多東方的,更具人情味的元素。雖然在美國,效率至上,但是利豐家族認識到了情商的重要性,對於企業的長期生存及其對於第四代面臨的挑戰的適應力至關重要。


MiFID II - 對於投資者來說,其影響及存在的機會是什麼?

MiFID II旨在為各種金融市場的投資者帶來更大的透明度和保護。對所有類型的投資者,從零售到專業的,都引入了增強的保護,並擴大了涵蓋的金融工具範圍。

歐洲以外的影響

直接受影響的市場包括法國、希臘、馬爾他和英國。儘管MiFID II是歐元區的法律,但其新規則具有遠大的全球影響。該法規適用於整個歐盟,並且對於不是歐盟一部分的歐洲經濟區(EEA)國家也有關。這意味著在EEA內進行金融工具投資活動或服務的任何公司都將受到新規則的約束。

該法規也間接影響了歐洲以外的地區,如亞太地區。MiFID II並不直接適用於非EEA公司,但主要在員工參與起源於EEA的MiFID II產品和服務,如債務和權益保險时,其規定才具有相關性。

MiFID II通常并无领土外效力,但有以下兩個情況需要注意:

  1. 如果一個非EEA實體在EEA內進行MiFID投資服務,對於MiFID產品而言,該法規將適用。
  2. 特定規定有明確的领土外影響,例如,交易報告要求適用於所有EEA實體的分支機構。

主要有四個影響領域:

  1. 研究  - 在MiFID II下,獲取免費研究被視為誘使行為,因此被禁止。
  2. 報告 - 現在的交易報告必須包括額外的交易細節,包括成本元素。所有定期報告必須至少每季度發行一次。如果有在一個自由投資組合,外匯操作,或跨期外匯交易中出現10%的資產減少,投資者將會收到通知。

  3. 最佳執行 - 現在,投資者將能夠看到他們們收到的執行質量和所使用的交易場所。

  4. 生產和發行 - 必須為投資者指定目標市場屬性。也必須分析產品的目標市場以防止對不適合的投資者進行銷售。

1. 解偶研究

MiFID II对投资组合经理和独立投资顾问引入了更多的限制。他们只能在以下两种情况下获得研究和销售服务:

  • 直接用他們自己的資金支付,或者
  • 通过一個客戶出資的研究支付賬戶 (RPA)。

這避免了可能的利益衝突。一些銀行分析師對這些改變感到擔憂,擔心失去工作,而在較小或獨立公司的分析師認為這是一個公平報酬的機會。

2. 報告

MiFID II會引入与持有和自由投资组合管理相關的季度报告。新的要求规定,持有杠杆金融工具(LFI)或其他或有负债交易(CLT)的公司必须在工具的初值贬低10%,然后是10%的倍数时,向投资者报告。

现在必须报告更广泛的财务交易。双方(投资公司)都必须向监管机构报告交易数据,这包括投资者的详细信息。

3. 最佳執行

最佳執行指的是公司有法规責任采取所有必要的步骤,以考虑價格、成本、速度及執行和結算的可能性等因素,為客戶獲得最佳可能的結果。

4. 生產和發行

在進行投資活动或提供投资服务时,需要对投资者进行分类。这个分类会影响公司的法规义务。

MiFID II還引入了對生產商和分銷商的要求,需要為他們創建或分銷的產品確定一個目標市場。這項分析還必須考慮任何負面的目標市場,即不應將產品銷給何種客戶。

如果您有進一步的問題,請在下方留言!

從網路檢索實時數據到Excel

一位本科生最近問我如何將網站上的實時數據導入Excel來完成作業。許多金融數據來源都需要收費,因此我提供了一個簡單的、免費的解決方案。現在,我也將這個解決方案分享給您。

首先,打開Microsoft Excel 365並轉到數據選項卡。找到從其他來源獲取數據的選項,然後選擇網絡

數據選項卡

接下來,輸入包含所需數據的URL

輸入網址

然後導航器將顯示各種可選表格。對於這個例子,我們選擇表格8。

選擇表格

當這個完成后,數據將導入您的Excel表格。但是,它需要手動刷新。要自動化這個過程,請右鍵點擊查詢,然後將屬性更改為每1分鐘刷新一次

自動刷新

這對於每分鐘更新一次很有用。但是如果你希望每秒鐘幾乎實時更新怎麼辦?在那種情況下,您需要編寫一些代碼。

導航到文件 -> 選項 -> 自定義功能區。在主選項卡下,啟用開發者選項卡

開發人員選項卡

然後,在開發者選項卡中,選擇Visual Basic

Visual Basic

選擇插入 -> 模塊,然後復制並粘貼下面的代碼片段:

Sub refresh_data()
    Sheets("Sheet2").Select
    Range("B2").Select
    Selection.Copy

    Sheets("Sheet1").Select
    Dim xCell As Range
    For Each xCell In ActiveSheet.Columns(1).Cells
        If Len(xCell.Value) = 0 Then
            xCell.Select
            Exit For
        End If
    Next
    ActiveSheet.Paste

    Sheets("Sheet2").Select
    ActiveWorkbook.RefreshAll
    Application.OnTime DateAdd("s", 1, Now), "refresh_data"
End Sub

粘貼代碼

點擊運行,然後就全部設定完成了!這段代碼可以翻譯為簡單的步驟:選擇Sheet 2,複制當前值,去到Sheet 1,找到第一列的最後一行並將值粘貼在那裡,然後回到Sheet 2並刷新所有數據。最後,該代碼將每秒觸發一次,使您能夠在Excel中實現幾乎實時的數據更新。

如果您有任何進一步的問題,隨時在下面留言。:)

在Ubuntu伺服器上使用Node.js和Nginx,為AWS EC2實例啟用HTTPS

我有一個在Ubuntu 16.04伺服器上運行Node.js和Nginx的AWS EC2實例。在這篇教程中,我將向你展示如何使用Let's Encrypt將你的網站從HTTP轉換為HTTPS。HTTPS防止未經授權的篡改你的網站與用戶瀏覽器之間的通信。它使用傳輸層安全性(TLS)認證對這種通信進行加密。Let’s Encrypt是一個提供免費X.509證書的證書頒發機構。

首先,SSH 連接到你的 EC2 實例:

ssh -i <keyfile.pem> ubuntu@<public-ip-address>

接著,將Let’s Encrypt的儲存庫複製到/opt/letsencrypt路徑:

sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

然後,透過運行以下指令來檢查是否有任何應用程式正在監聽80端口:

netstat -na | grep ':80.*LISTEN'

如果返回任何進程,終止它們。例如,如果你已經有一個Nginx伺服器在80端口運行,你可能需要如下停止它:

sudo systemctl stop nginx

之後,導航到你的儲存庫cd /opt/letsencrypt,並運行以下命令以獲得證書:

./letsencrypt-auto certonly --standalone --email <your@email.com> -d <domain.com> -d <subdomain.domain.com>

如果你遇到像這樣的錯誤:

OSError: Command /opt/eff.org/certbot/venv/bin/python2.7 - setuptools pkg_resources pip wheel failed with error code 1

然後在重新運行腳本之前設置以下環境變數:

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"

遵循屏幕上的指示,您應該在路徑/etc/letsencrypt/live/<domain.com>處獲得您的證書。

接下來,配置Nginx設置以將HTTP流量重新導向到HTTPS。使用以下命令編輯文件:

sudo vi /etc/nginx/sites-available/default

內容應該像這樣(記得替換<YourDomain.com> 和你的網站的根路徑):

server {
  listen 443 ssl;
  server_name <YourDomain.com>;
  ssl_certificate /etc/letsencrypt/live/<YourDomain.com>/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/<YourDomain.com>/privkey.pem;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

  root /var/www/yourPath;
  index index.html index.htm;

  location / {
    proxy_pass http://localhost:3000/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto http;
    proxy_set_header X-Nginx-Proxy true;
    proxy_redirect off;
  }
}
server {
  listen 80;
  server_name <domain.com>;
  return 301 https://$host$request_uri;
}

為了測試你的配置是否有任何錯誤,運行:

sudo nginx -t

如果一切正常,重啟Nginx:

sudo service nginx stop
sudo service nginx start

最後但並非最不重要的,前往 AWS 控制台,確保你的安全群組已打開 443 端口,開放 HTTPS 連接。

AWS Console Screenshot

完成!導航至HTTPS版本的你的網域,驗證它是否正常工作。如果您遇到像502 Bad Gateway這種錯誤,確保你的Node.js應用程式正確運行。我使用PM2來保持它運行。讓我們使網路更安全!🙂

使用PowerShell替換XML文件中的文本

昨天,我在一個客戶現場工作,那裏有一個與外部網絡隔離的Windows伺服器。不允許在該機器上安裝任何第三方軟件。

PowerShell腳本

然而,我被交付了一項任務,要將所有XML文件名從“我的報告”換成“我的報告(新)”。原始文件,temp.xml,是這樣的:

    <ReportList>
      <Report Name="My Report">
      </Report>
    </ReportList>

預期的輸出文件,temp-new.xml,應有這樣的結構:

    <ReportList>
      <Report Name="My Report (New)">
      </Report>
    </ReportList>

沒有專門工具的訪問權限,並面對手動編輯數百個文件的前景,我轉向了PowerShell來編寫腳本。以下是完成此任務的幾行代碼:

步驟1:從我的測試文件夾中加載所有XML文件

    $files = Get-ChildItem C:\Users\victorleung\tw\Desktop\Test -Recurse -Include *.xml

步驟2:通過在原始名稱後添加"(新)"來修改所有報告名稱

    $xmldata = [xml](Get-Content $file);
    $name = $xmldata.ReportList.Report.GetAttribute("Name");
    $name = $name + " (New)";
    $xmldata.ReportList.Report.SetAttribute("Name", $name);
    $xmldata.Save($file)

步驟3:將文件名從temp.xml 改成 temp-new.xml

    Get-ChildItem *.xml | Rename-Item -NewName { $_.Name -Replace '.xml$','-new.xml' }

就是這樣!所有文件都已被更改。開心編碼!😃

使用批次腳本替換檔案中的文字

昨天,我在客戶的地點工作。該地點有一台Windows伺服器,該伺服器已與外部互聯網隔離,並禁止安裝新的軟體。

我被委託將YAML文件中的所有id值刪除,將它們設置為null。例如,輸入文件temp.yaml如下所示:

    something
      id: 4
    something else
      id: 64
    next one
      id: 231
    another one
      id: 34

我想要的目標文件(result.yaml)應該如下所示:

    something
      id:
    something else
      id:
    next one
      id:
    another one
      id:

該文件很大,因此手動刪除每個id值將非常耗時。該Windows伺服器上可訪問的唯一工具是CMD命令提示符。因此,我寫了一個簡單的批次腳本來完成這項任務。在文本編輯器中創建一個名為convert.bat的文件,其內容如下:

    @echo off
    for /f "tokens=1* delims=:" %%a in (temp.yaml) do (
      if "%%b"=="" (
        echo %%a
      ) else (
        echo %%a | find " id" > null && echo %%a: || echo %%a: %%b
      )
    ) > result.yaml

你可以在腳本中替換文本temp.yamlresult.yaml,分別代表你的目標輸入和輸出文件。雙擊執行腳本,你就完成了!

對於不熟悉批次腳本的人,這裡有一些基本解釋:

  • @echo off表示要抑制命令提示符的顯示,有效地將其隱藏。
  • for循環有一些選項。tokens=參數指定從每行讀取哪些編號項目(默認為1),delims=指定分隔符字符(默認為空格)。

  • %%a%%b變量與批次文件中的參數類似。

最後一行將結果輸出到所需的文件。與手動做這項工作相比,這個簡單的腳本節省了很多時間。:)

深入探討智利的創業生態系統

回顧過去,我對智利的旅行感到非常滿意。雖然從香港飛行超過30小時,並且要應對時差讓人感到有挑戰性,但這次冒險確實值得。我學到了很多東西,不僅在正式的環境中,也通過聰明和教育性的討論。這次旅行豐富了我對創業生態系統、B類公司和創業精神的理解。

智利的創業生態系統確實令人矚目。在我的訪問中,我了解到聖地亞哥是以籌集到的資金規模來看的第六大風險資本中心。其與巴西的鄰近,這個重要的市場,使它成為在拉丁美洲啟動業務的理想地點。巴西和阿根廷共同占該區域生態系統的82%的總價值,並代表超過80%的區域生態系統。許多成功的創業公司,如Mercado Libre、Despegar.com和Arch Daily,要么模仿來自其他國家的成功業務模式,要么是世界首創。儘管地理位置偏遠,像Lunna、Bluesmart、Poliglota、Recorrido.cl和Destacama這樣的智利公司在國際間有強烈的存在感。"Chilecon Valley"的增長,得到了政府的支援,給我留下了深刻的印象。

其中一個特別打動我的討論圍繞著B類公司。我非常認同社會影響力和可持續性的理念。當我有機會與一家風險資本公司的總經理交談時,我發現他更優先考慮快速的盈利能力和商業的可行性。他對B類公司有一種有趣的視角,認為在社會("B")和公司("corp")兩個方面之間找到平衡是有挑戰性的。我同意他的觀點,因為這與我自己對於開發長期商業模式的複雜性的經驗相吻合。

回顧我的旅程,我注意到智利與香港的主要文化差異在於居民的創業精神。在香港,大多數畢業生都希望找到一份有著良好收入和穩定工資的安全工作。相比之下,2008年只有12%的智利人自己創業。香港政府對創業場景的支持有限,因為其大部分GDP都集中在金融服務和房地產上,而且幾乎沒有多元化。相反,智利政府對Startup Chile計劃投入了大量資金,該計劃支持每十家企業中的兩家。

儘管智利的經濟主要基於銅礦產業,但政府進行了大量投資以進口創業者,以多元化經濟並改善人們長期的生活品質。與在智利視失敗為學習機會的文化相比,香港的文化更加地風險規避。

我有興趣在智利開業,並已經在Startup Chile計劃下申請了一年的簽證。在接觸Fundacion Mi Parque後,我考慮創建一家專業為非營利組織(NGOs)提供技術諮詢的公司。我們生活在一個數位的世界,技術被用於革新傳統行業。但是,許多NGO可能沒有資源來聘請IT人員來構建他們的網站、手機應用程式或者客戶關係管理(CRM)工具。如果我可以獲得政府的資金和捐款,我計劃幫助這些NGO建立在線存在感,從而降低他們每筆捐款的成本並增加他們對社會的影響力。

我追求MBA的主要原因之一是找到平衡技術和業務的解決方案。我相信技術本身只是一種工具,並不足以獨立解決問題。它需要項目管理、跨部門技能和能力來擴展業務操作的混合。根據演講者的說法,智利在服務出口方面排名第37,其中IT佔服務出口行業的28%。此外,智利在數位化方面位於世界第7,擁有一些最好的程式員。我看到在智利建立IT諮詢公司並與香港的創業社區創造協同效應的巨大機會。我在智利的國際經驗給了我新的視角,我繼續尋找答案。

將 AppMon 從版本 6.5 升級到 7.1

我正在將Dynatrace AppMon從版本6.5升級到7.1。AppMon是許多客戶信任的效能數據收集工具;它幫助開發者在應用系統中解決問題。此版本升級包括新功能和新的UI儀表板。以下是指導你完成此過程的步驟:

首先,重要的是要諮詢硬體和作業系統的系統需求2018年4月系統需求。例如,如果你在運行一個過時的Java虛擬機(JVM),幫助台可能無法協助你解決問題。確保你有一個64位的客戶端和足夠的磁盤空間。

此外,在開始之前,將會話存儲位置移出安裝目錄。建議備份會話存儲和配置數據。務必在此之前諮詢元件兼容性矩陣元件兼容性

其次,安裝新的AppMon 7.1版本。對於Linux,運行命令:

java -jar dynatrace-full-7.1.0.1803-linux-x86–64.jar

然後停用並升級許可證。這將在關閉它之前把你的服務器放在一個寬限期內。

點擊許可證的“升級”按鈕。

以及優惠券的升級按鈕:

第三,關閉舊版6.5的收集器、服務器和前端服務器。這將是創建備份的理想時機,包括性能倉庫數據庫和會話存儲的備份。

第四,使用這裡下載的移植工具。

運行命令:

java -jar dynatrace-migration.jar -migration -sourceDTHome "<DT_HOME_OLD>" -targetArchiveDir "<ARCHIVE_DIR>"

此處,DT_HOME_OLD是舊版AppMon的安裝路徑,ARCHIVE_DIR是備份目錄。請注意,在Windows機器上,需要管理員權限才能執行此步驟。

接著,使用以下的命令將備份檔案移動到新的7.1安裝版:

java -jar dynatrace-migration.jar -migration -sourceArchive "<ARCHIVE_DIR>/<MIGRATION_ARCHIVE>" -targetDTHome "<DT_HOME_NEW>"

其中,ARCHIVE_DIR/MIGRATION_ARCHIVE./dtma檔案的位置,DT_HOME_NEW則是新Dynatrace 7.1安裝的路徑。

然後註冊並自動啟動任何額外的收集器實例。

第五,啟動新的元件,例如收集器和前端服務器。

客戶端移植步驟通常可以跳過,並且您可以為新的伺服器啟動許可證:

最後,再次檢查伺服器上的設定以確保性能倉庫和會話存儲已被遷移並連接。

還建議重新啟動並更新代理。最後但並非最不重要的,檢查並確認所有的東西都按預期運行。

如有任何問題,請告訴我。

使用自訂挑戰的AWS Cognito用戶池與iOS的Mobile SDK

我最近將一個AWS Cognito用戶池整合到一個iOS應用程式中。登入功能使用自訂挑戰進行認證。然而,關於如何使用iOS SDK達到此目的的文件資料很有限。在多次嘗試和失敗後,我終於成功登入。以下是達成此目的的步驟:

步驟1:建立一個CognitoUserPool

AppDelegate中,完成didFinishLaunchingWithOptions後,用戶池如下所示初始化:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  // Set up service configuration
  let serviceConfiguration = AWSServiceConfiguration(region: CognitoIdentityUserPoolRegion, credentialsProvider: nil)

  // Create pool configuration
  let poolConfiguration = AWSCognitoIdentityUserPoolConfiguration(clientId: CognitoIdentityUserPoolAppClientId, clientSecret: nil, poolId: CognitoIdentityUserPoolId)

  // Initialize user pool client
  AWSCognitoIdentityUserPool.register(with: serviceConfiguration, userPoolConfiguration: poolConfiguration, forKey: AWSCognitoUserPoolsSignInProviderKey)

  // Fetch the user pool client we initialized in the above step
  let pool = AWSCognitoIdentityUserPool(forKey: AWSCognitoUserPoolsSignInProviderKey)

  self.storyboard = UIStoryboard(name: "Main", bundle: nil)

  pool.delegate = self

  return true
}

步驟2:執行協定代表

extension AppDelegate: AWSCognitoIdentityCustomAuthentication {

  func didCompleteStepWithError(_ error: Error?) {

  }

  func getCustomChallengeDetails(_ authenticationInput: AWSCognitoIdentityCustomAuthenticationInput, customAuthCompletionSource: AWSTaskCompletionSource<AWSCognitoIdentityCustomChallengeDetails>) {

  }

  func startCustomAuthentication() -> AWSCognitoIdentityCustomAuthentication {
    if self.navigationController == nil {
      self.navigationController = self.storyboard?.instantiateViewController(withIdentifier: "signinController") as? UINavigationController
    }

    if self.signInViewController == nil {
      self.signInViewController = self.navigationController?.viewControllers[0] as? SignInViewController
    }

    DispatchQueue.main.async {
      self.navigationController!.popToRootViewController(animated: true)

      if !self.navigationController!.isViewLoaded || self.navigationController!.view.window == nil {
        self.window?.rootViewController?.present(self.navigationController!, animated: true, completion: nil)
      }
    }

    return self.signInViewController!
  }
}

步驟3:在登入視圖控制器中處理自訂挑戰

extension SignInViewController: AWSCognitoIdentityCustomAuthentication {

  func getCustomChallengeDetails(_ authenticationInput: AWSCognitoIdentityCustomAuthenticationInput, customAuthCompletionSource: AWSTaskCompletionSource<AWSCognitoIdentityCustomChallengeDetails>) {

    let authDetails = AWSCognitoIdentityCustomChallengeDetails(challengeResponses: ["USERNAME": "YourUserName", "ANSWER": "123456"])
    customAuthCompletionSource.set(result: authDetails)
  }

  public func didCompleteStepWithError(_ error: Error?) {
    DispatchQueue.main.async {
      if let error = error as? NSError {
        print("error")
      } else {
        print("success")
        self.dismiss(animated: true, completion: nil)
      }
    }
  }
}

步驟4:成功登入後存取用戶屬性

self.user?.getDetails().continueOnSuccessWith { (task) -> AnyObject? in
  DispatchQueue.main.async(execute: {
    self.response = task.result

    // Display user details
    print(response)
  })

  return nil
}

如果你有任何問題,請隨時提問。我希望AWS能更新文檔,並提供範例代碼,以便在不需要透過試驗和錯誤的情況下理解SDK。