Skip to content

zh

在Adobe Experience Manager中註冊Sling Servlets

在Adobe Experience Manager (AEM) 中,Sling servlet可以被用來處理某些RESTful的請求-回應的AJAX調用。寫在Java編程語言中的Servlets可以被註冊為OSGi(開放服務網關協議)服務。在AEM中註冊servlet有兩種方法:1) 通過路徑,和 2) 通過資源類型。以下是兩種方法的詳細說明:

1. 通過路徑註冊

例如,如果您希望從客戶端發送一個表單POST請求到路徑/bin/payment 到Sling servlet類,您可以使用以下的註解:

@SlingServlet(
    metatype = true,
    methods = { "POST" },
    paths = "/bin/payment"
)
public class YourServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException {
        // 在這裡執行你的任務
    }
}

當有一個POST請求到 http://localhost:4502/bin/payment 時,servlet將被觸發,並調用 doPost 方法。

前提條件包括在端口4502上運行本地AEM實例,並通過Maven Bundle插件安裝bundle模組。您可以通過導航到 http://localhost:4502/system/console/bundles來驗證bundle的安裝。如果沒有安裝,您可以手動上傳JAR文件。

如果您遭遇“禁止”的錯誤,無法服務 /bin/payment 的請求,請按照以下步驟操作:

  1. 轉到 http://localhost:4502/system/console/configMgr
  2. 搜索 'Apache Sling Referrer Filter'。
  3. 從篩選器中刪除POST方法。這將允許您從任何來源觸發POST方法。
  4. 搜索Adobe Granite CSRF Filter。
  5. 從篩選方法中刪除POST。
  6. 保存更改並再次測試servlet。

Servlet現在應該按預期觸發。

2. 通過資源類型註冊

為了避免上述問題,更好的方法是通過資源類型註冊servlet。重構servlet如下:

@SlingServlet(
    metatype = true,
    methods = { "POST" },
    resourceTypes = "services/payment"
)
public class YourServlet extends SlingSafeMethodsServlet {

    @Override
    protected void doPost(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException {
        // 在這裡執行你的任務
    }
}

接下來,您需要創建一個頁面來觸發此資源:

  1. 轉到 http://localhost:4502/crx/de/index.jsp的CRXDE Lite。
  2. /content資料夾內,創建一個頁面(例如,http://localhost:4502/content/submitPage.html)。
  3. 在resourceType屬性中,輸入 services/payment 或其他匹配您上述的servlet。
  4. 保存更改並測試POST請求到 http://localhost:4502/content/submitPage.html。 應該可以按预期工作。

額外提示: 您也可以使用Apache Sling Resource Resolver來驗證servlet是否已成功註冊在http://localhost:4502/system/console/jcrresolver

如果有任何問題,可以在下面的評論中留言。

在AWS EC2上安裝Nextcloud,並使用S3儲存空間

為了提高我的隱私,我決定減少使用Google產品。我用Firefox取代了Chrome,從Gmail轉到ProtonMail,現在正在使用Nextcloud而非Google Drive。Nextcloud允許自託管雲存儲並對我的數據進行控制。以下是在AWS EC2上安裝Nextcloud並配置它以使用S3存儲的步驟。

  1. 使用Snap套件管理器安裝Nextcloud:

bash sudo snap install nextcloud

  1. 創建一個管理員用戶賬號:

bash sudo nextcloud.manual-install <admin_username> <admin_password>

  1. 添加你的信任域:

bash sudo nextcloud.occ config:system:set trusted_domains 1 --value=<your-domain>

  1. 使用AWS Route 53,創建一個指向您的Nextcloud服務器的IP地址的A記錄。

  2. 設置Let's Encrypt的SSL證書:

bash sudo nextcloud.enable-https lets-encrypt

  1. 導航到您的域名,您現在應該能夠登錄到您的Nextcloud實例。

  1. 點擊“Apps”並啟用“Default encryption module”和“External storage support”。

  2. 打開AWS IAM(Identity and Access Management)並創建一個具有程序化訪問的新用戶。

  3. 使用下面的JSON代碼創建一個新的策略,將NAMEOFYOURBUCKET替換為您的S3桶的名稱。將此策略附加到新創建的用戶。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetBucketLocation", "s3:ListAllMyBuckets"],
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::NAMEOFYOURBUCKET",
        "arn:aws:s3:::NAMEOFYOURBUCKET/*"
      ]
    }
  ]
}
  1. 在Nextcloud設置中,選擇“External Storage”。在“Bucket”字段中填入NAMEOFYOURBUCKET。選中“Enable SSL”和“Enable Path Style”,然後使用您創建的用戶的憑證填入所需的信息。

  2. 你已經完成了!導航到你的d3文件夾,你現在應該能夠上傳文件了。

在瀏覽器中調試PHP代碼

在JavaScript中,你可以直接在瀏覽器中使用console.log('whatever')進行故障排查。然而,當使用PHP時,需要一些小技巧才能達到同樣的效果。以下是操作步驟:

  1. 創建一個名為debug_to_console的函數來處理輸出到控制台的內容。將此代碼添加到你的PHP文件中:

```php function debug_to_console($data) { $output = $data; if (is_array($output)) { $output = implode(',', $output); }

   echo "<script>console.log('Debug Objects: " . $output . "');</script>";

} ```

  1. 在你需要輸出到控制台的行處,插入以下程式碼:

php debug_to_console("Test");

  1. 如果你需要偵錯一個物件,您可以這樣記錄它:

php debug_to_console(json_encode($foo));

按照這些步驟操作後,打開你的瀏覽器的開發者工具。您應該能夠看到在控制台使用console.log顯示的PHP物件。

在 MacBook Pro 13,1 上安裝 Ubuntu 19.10

我對 macOS Catalina 感到挫折,因此決定將 Ubuntu 設為我 13 英寸的 MacBook Pro(不帶觸控條)的主要操作系統。作為一名軟件開發者,我發現 macOS 會與 Xcode 一同打包許多工具,這將佔用多達10GB的磁碟空間。雖然磁碟空間並非我主要的憂慮,但有時候網路下載的速度會很慢,而更新也可能會卡住。在試圖完成工作時流失一小時是不必要的障礙。

我起初擔心專有硬體是否能與開源的 Linux 分佈版兼容。令我驚訝的是,許多功能在初次安裝後就可以立即使用,感謝社區的努力。這包括了螢幕、鍵盤、觸控板,以及 Wi-Fi。唯一不適用的功能是音訊,但我可以使用我的 USB Type-C 耳機或帶有喇叭的 HDMI 外接顯示器來解決這個問題。這個 GitHub 頁面提供了關於各種 MacBook 硬體與 Linux 兼容性的詳細文檔:MacBook 在 Linux 上的硬體支援

如果你對在 MacBook Pro 上試用 Ubuntu 感興趣,請按照以下幾個簡單的步驟操作:

  1. Ubuntu 官方網站 下載 Ubuntu 19.10。
  2. 按照此指南的步驟,使用 Etcher 製作可開機的 USB 隨身碟:在 macOS 上製作 USB 隨身碟
  3. 重新啟動你的 MacBook,並按下 Option 鍵,選擇 USB 隨身碟作為開機設備。
  4. 嘗試使用 Ubuntu,如果你覺得合適,就繼續進行安裝。

就是這樣!作為開發者,你可以透過執行 sudo apt install git 來快速設定這類必要工具。這比在 macOS 上更簡單,macOS會以各種方式來限制你的自由。不應該對任何一個平台過於依賴,因為不能一直相信大公司會為了你的最佳利益行事,例如保護你的個人資料不受政府監視。擁抱開源社區,欣賞選擇替代操作系統的自由。

附註 1: 若要讓藍牙運作,請在這個儲存庫中執行找到的腳本:

MacBook 藍牙驅動

附註 2: 若要讓相機運作,請按照這份指南來安裝驅動:

相機驅動指南

設置 MongoDB 與 Koa.js

我正在建設一個 Koa.js 服務器,並需要將其連接到 MongoDB 以儲存和檢索數據。以下是如何在幾個簡單的步驟中實現這一點:

步驟1:初始化 Koa 應用程序之前連接到數據庫

const initDB = require("./database")

initDB()

const app = new Koa()

database.js 中,導入 mongoose。同時確保使用 npm install --save mongoose 進行安裝。Mongoose 是一個物件數據建模(ODM)庫。

const mongoose = require("mongoose")
import { connectionString } from "./conf/app-config"

const initDB = () => {
  mongoose.connect(connectionString)

  mongoose.connection.once("open", () => {
    console.log("Connected to the database")
  })

  mongoose.connection.on("error", console.error)
}

module.exports = initDB

接下來,為您的連接字符串創建配置:

export const connectionString =
  "mongodb+srv://" +
  secret.mongodb.username +
  ":" +
  secret.mongodb.password +
  "@xxxxxx.mongodb.net/test?retryWrites=true&w=majority"

您可以運行本地 MongoDB 實例,或者使用 MongoDB Atlas 並將其託管在 AWS 雲上。您會在那裡找到包含在配置文件中的連接字符串。

步驟2:在 Koa 中創建一個 Schema

例如,讓我們在 /models/users.js 中創建一個用戶模式。

const mongoose = require("mongoose")
const Schema = mongoose.Schema

const UserSchema = new Schema({
  username: String,
  email: String,
  picture: String,
})

module.exports = mongoose.model("User", UserSchema)

步驟3:創建一個服務來查詢數據

假設我們有一個 /service/user.service.js

import User from "../models/users"

export const getUserFromDb = async username => {
  const data = await User.findOne({ username })
  return data
}

export const createUserInDb = async user => {
  const newUser = new User(user)
  await newUser.save()
  return user
}

步驟4:在 Koa 控制器中調用服務

例如,假設我們有一個 /controller/user.controller.js

    import { getUserFromDb, createUserInDb } from '../service/user.service';

    static async getUser(ctx) {
      const user = await getUserFromDb(ctx.query.username);
      ctx.body = user;
    }

    static async registerUser(ctx) {
      const user = await createUserInDb(ctx.request.body);
      ctx.body = user;
    }

最後,您可以使用控制器註冊路由。現在,您應該能夠看到數據被存儲在數據庫中。如果您有任何問題,請隨時聯繫我。

將您的部落格從Medium遷移到Ghost 3.0

Ghost 3.0剛剛被發佈 (https://ghost.org/3/)。我對Ghost比WordPress有強烈的偏好,因為它使用Node.js而不是PHP。Ghost不僅是開源的,還提供了非常酷的黑色主題。所以,我決定將我的部落格從Medium遷移出去。然而,該過程並不直接,也有一些相關的成本。下面是一些步驟幫助你導航遷移並重新控制你的內容:

步驟一:從Medium導出帖子

在Medium上導航到設置並找到允許您下載您的數據的部分:

步驟二:導入至WordPress.com並導出文件

在WordPress.com上創建一個免費帳戶。在導入部分,您會找到一個可以從Medium導入內容的選項:

成功從Medium導入內容後,你可以從WordPress.com導出文件:

步驟三:通過插件將文件導入至WordPress.org並導出文件

http://wordpress.org/ 下載開源的WordPress軟件並使用MAMP (https://www.mamp.info/en/) 在本地運行。複製所有的WordPress文件並將它們放在MAMP內的/ htdocs資料夾中。啟動服務器,您應該能夠運行安裝了MySQL的本地WordPress實例。

導航至導入部分,並選擇從WordPress導入的選項:

然後,從https://wordpress.org/plugins/ghost/ 安裝官方的Ghost插件,並使用此插件導出你的部落格文章:

雖然有一個下載Ghost文件的選項,但對我來說並未奏效。嘗試點選下載.json檔案。

步驟四:導入至Ghost博客

轉到設置,然後轉到Ghost中的實驗室部分,並導入您的文件:

交叉手指!如果一切順利,您應該能看到所有您從Medium導出的文章現已遷移到Ghost 3.0。祝你寫博愉快 :)

在企業網路中設置npm代理

在企業網路下工作可能相當有挑戰性,因為許多東西不會即刻就能運作正常。像是 npm install 等簡易指令可能都無法正常運作。以下為如何跨過代理進行工作的方法:

假設你已經成功在你所使用的企業筆記本電腦中安裝 node.js,找出 .npmrc 檔案。在Windows系統中,該檔案通常位於 C:\Users\<your_user_id>\.npmrc,而在Mac機上,該檔案則位於 Users/<your_user_id>/.npmrc

打開該檔案並加入下列行數:

    https-proxy=http://yourcompanyproxy.com:80
    proxy=http://yourcompanyproxy.com:80
    strict-ssl=false
    registry=http://registry.npmjs.org/

再試執行 npm install,它應該現在可以運作了!

附帶一提的小提示:如果你在企業內部的 Nexus npm 倉庫有一些依賴關係,例如在 @npmcorp 範疇中,運行以下標令以指定正確的倉庫 URL:

    npm config set @npmcorp:registry https://your-company-nexus:80/nexus/content/repository/npm-internal

這樣做應該就能解決任何 "依賴性未找到" 的錯誤。試試看吧!

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

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