2024年11月11日星期一

Clone Github with personal access token

Github doesn't support cloning with username password.

With personal access token (PAT):

git clone https://<PAT>@github.com/path/repo.git

Implementing Push Notification in iOS apps using Firebase Cloud Messaging

This article shows example codes in both iOS side and server side to let you know how to make use of Firebase Cloud Messaging (FCM) to implement push notification for your iOS app.

You need to use the Firebase for your iOS app.

Not in this article

I will not go into detail on how to setup in Xcode side nor the certification issues. There are tons of articles on the web for those. The steps for this part are same for any platforms.

Basic concept about iOS push notification

Almost every iOS app needs push notification. And you don’t want to deal with complicated details.

Here is the basic components you need to know.

  1. Your iOS app. This faces to human users.
  2. The Apple push notification service. This service, or server, belongs to Apple. It sends the notification to every iOS device upon it receives requests from your application server.
  3. A server application. This server, or a server application, will send requests to the Apple push notification service when it wants to notify users.

If you want to implement the server side logic, it is possible. However, for most of us, we want to get rid of the trouble and here the FCM comes.

Setup in Firebase

We need to do these steps.

  1. Firebase project setup. This is to put the key file of your project to the Firebase project setup for cloud messaging. So the Apple server will recognize the FCM server and allow it talks to the Apple server on behalf of your app.
  2. Firebase functions. To send notifications you need backend logic. Firebase functions is the place you write your backend logic for FCM. To write this code you need to setup the Google Cloud command line tool. Then you write at your local computer and use the tool to deploy it to the Firebase server. Note that you cannot view the code on Firebase console. All you can review is to your source code. So please do some backend or version control for your source.

iOS App setup

On the iOS app, we have several ways to receive messages from the FCM. In this case, for the simplicity, we choose “subscription by topic” approach. The Topic is actually a string, and our app subscribe it via a call:

Messaging.messaging().subscribe(toTopic: topicString)

Please note that the topic string can only accept certain characters as shown in this regular expression:

[a-zA-Z0-9-_.~%]+

Backend logic example

Let me use an example to show how we trigger the push notification.

In this example project, it uses the Realtime database of Firebase. This is a JSON-like structure database and we refer data using path. In this use case, we want to send out a push notification whenever there is a new node (data object) is inserted to the node “/messages”. This is actually a new message is sent by some user to another.

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();
exports.sendPush = functions.database.ref('/messages/{pushId}')
.onCreate((snapshot, context) => {
const msgid = context.params.pushId;
const msg = snapshot.val();
const peer = msg.peer ;
const room = msg.chatroomid;
const text = msg.text ;
const sender = msg.userid;
const sendername = msg.username ;
// just in case. old version of messages may not have this field.
if (!peer) {
  return 0;
}
// room id has colon, but it is not valid for firebase topic name.
// this matches what the app subscribes for each room.
const topic = peer + "-" + room.replace(":","-");
const message = {
  notification: {
    title: sendername,
    body: text
  },
  data: {
    to: peer ,
    sender: sender ,
    room: room,
    sendername: sendername,
    text: text
  },
  topic: topic
};
admin.messaging().send(message)
.then((response) => {
  // Response is a message ID string.
  functions.logger.log('Successfully sent message:', response);
})
.catch((error) => {
  functions.logger.log('Error sending message:', error);
});
});

As you see, the key point here is to construct a JSON structure to represent your message to send to your iOS app. Please look at the message variable. It consists of 3 parts.

The notification: This is what displays in the push notification banner on the iOS device.

The data: This is the data you want to send to the iOS app to process with. The name of the fields seem could be any string but please try to avoid using strange ones and be simple, and avoid symbols.

The topic: This is the FCM topic string that your iOS app subscribes to.

Conclusion

We hope this is helpful. Please let me know in comments that you have any doubts. We try to make this writing short. So you would still need to check Firebase documentations to know how it really works.

How to sync swiftdata with iCloud

How to sync swiftdata with iCloud

If you want to sync your app's data to iCloud, go to the Signing & Capabilities settings for your app's target, then:

  • Add the iCloud capability.
  • Select CloudKit from its options.
  • Press + to add a new CloudKit container, or select one of your existing ones.
  • Add the Background Modes capability.
  • Check the box "Remote Notifications" checkbox from its options.

…and that's it: your app is now configured to sync all its data with iCloud.

Tip: Although you can attempt to test iCloud support in the simulator, I've found it rarely works well – it's much better to test on a real device.

Although the configuration is complete, you might need to make some changes to your SwiftData models because CloudKit has a few very specific requirements. Annoyingly, if you don't follow these requirements your iCloud sync will silently fail, so here they are:

  • You cannot use @Attribute(.unique) on any property you want to sync to CloudKit.
  • All properties must either have default values or be marked as optional, alongside their initializer.
  • All relationships must be marked optional. This is Particularly Annoying™, but it's a requirement so there's not much we can do.

additional

  • if you see error saying "cannot modify" something, go iCloud dashboard, create a custom zone in Private database.

source

https://www.hackingwithswift.com/quick-start/swiftdata/how-to-sync-swiftdata-with-icloud

几十亿年前,第一个纳米机器是谁制造的?

2024年11月6日星期三

Apple CEO Tim Cook on How Steve Jobs Recruited Him and More | The Job In...


一件有趣事實是,Steve樂於被說服,只要你真的有好主意。
而且,他喜歡產品,產品,產品。

聽到 Tim 說犧牲了睡眠,我不爭氣地笑了。我去玩耍了,人家在工作。

2024年11月5日星期二

結婚的意義



今天看到一段話,
說婚姻是你這輩子,
唯一一次親自選擇家人。

你想和什麼樣的人,牽手走完這一生,
就找什麼樣的人。

終有一天你會明白,經濟基礎固然重要,
但更重要的是,一個人的教養,擔當,責任心,控制情緒的能力,
以及說話方式和處事態度。

結婚的意義就是,
萬家燈火,有一盞燈為你而留,
而不是雞飛狗跳有你一個。

伴侶真的很重要,
晚一點沒關係,
但一定得是對的人。

因為他是你後半輩子裡的光。

(摘自網路)

餐肉和垃圾郵件


餐肉和垃圾郵件都叫 spam 。

原來根據 Wikipedia, 垃圾郵件的英語和午餐肉同為「Spam」。語源來自英國搞笑節目《蒙提·派森》中以午餐肉為題的搞笑短劇,說一間餐廳供應的餐點全是午餐肉,而且還有一群維京人打扮的食客唱著不斷重覆「Spam」這歌詞的讚歌,令人煩厭。

有趣 。

2024年10月14日星期一

威脅的五個標準作業程序

威脅的五個標準作業程序:
(by 張榮豐)

1. 營造傷害對手的力量。

2. 視情況故意或技巧地讓對手知悉。

3. 提出要求,構成威脅。

4. 讓對方相信此項威脅是可信的,不是吹牛、空話,這有以下三種做法:

(1) 利用過去的口碑(言必信、行必果;人若犯我,我必犯人)
(2) 限制自己行動的自由(拆掉方向盤,破釜沉舟)。
(3) 邊緣策略(Brinkmanship)

5. 讓對方了解,如回應威脅,傷害可以停止。

2024年8月22日星期四

書法家,傳承,愛國

同朋友討論這問題,生出一些想法。

自古以來書法家本身都不會只係寫字的, 一般都有厚重文化傳承, 自然也有家國意義在. 所以書法家心中自然擔起對文化(即文化意義的祖國)傳承的使命, 這就是愛國精神的體現.

粗言之:

文化=國家
愛文化=愛國家
文化傳承=愛國精神的傳承


當你喜愛呢種文化, 你自然就愛上承載此文化的國度
呢種情感, 自然就會傳畀你下一代(血統上/徒弟)
他們也會傳下去,

同時呢種傳承本身, 也成為我國文化的一部分.
再也分不開

呢個係發源於純樸感情上的喜愛
why likes?
因為佢靚咯

人接觸書法,多是因為父母帶回家。
這已經係傳承。

這就是愛國情懷和它的傳承。

2024年8月21日星期三

占星考

太陽星座

在占星學中,太陽星座代表了個人的核心特質和基本性格

月亮星座

月亮星座代表著一個人出生時月亮所處的星座位置。 在占星學中,月亮星座被認為代表了個人的情感、內在情感需求和直覺反應,它揭示了一個人內在的情感世界和心理特質。 月亮星座通常被視為個人的情感和內在反應的象徵,它反映了一個人在內心深處的真實感受和情緒需要。

水星星座

水星象徵著個人的心智活動及思維邏輯。本命盤中水星所在的星座,代表著個人的思維運作方式,水星所在的宮位,則代表個人常思考的生活領域。

金星星座

在占星學中,金星在你的星座命盤中扮演著舉足輕重的角色,影響著你的親密關係,無論是浪漫或是柏拉圖式的,性慾、自尊,以及金錢與物質世界的關係。特別重要的是你的金星星座,也就是你出生時金星所在的星座,透過理解這一點,你會找到該如何與你所愛的人互動的關鍵。

火星星座

火星掌管了行動力、事物的實踐、衝動、暴力行為,火星星座代表一個人以何種方式完成他們的慾望、他們的脾氣如何、以什麼樣的方式與他人競爭、如何展現他們的精力。本命盤中火星所在的星座,常代表著個人的慾望表達方式與發脾氣的樣子,火星所在的宮位,代表著個人所渴望的生活領域。在六親方面,火星是兄姐的自然象徵星。在男命中,火星代表其對性愛的態度,在女命中,火星則代表著其喜歡的男性類型。

木星星座

木星被視為幸運之星 ,掌管幸運、擴張、機會、高等教育,代表一個人向外發展的能力。在個人星盤中的木星落入的宮位代表一個人的幸運點,感到自信的地方及將知識內化為智慧的能力;落入的星座表現出一個人如何表現自己樂觀的一面,及如何向外發展的能力。

土星星座

土星是太陽系中運行最緩慢的一顆星,象徵著限制與耐力。

天王星星座

在占星學上,天王星象徵著變革、與眾不同、反覆無常、出乎意料及破裂分手,行進天王星時常會以突然、劇烈的變革方式推動社會變化或遭逢意外劇變。

海王星星座

在現代占星中,海王星是雙魚座的守護星,屬於凶星,象徵著朦朧、無邊界、弱化、模糊、幻想、犧牲與救贖等。

冥王星星座

在現代占星中,冥王星是天蠍座的守護星,屬於凶星,象徵著摧毀、重生、慾望、死亡、極端、無意識等。

上升星座

(象徵生命) 出生時東方地平線升起的那個星座。上升星座是十二宮位中的第一宮,因此對我們的個性來說具有極大的影響。第一宮是所有宮位的基礎,因此上升星座可說是奠定了一個人的性格。在占星學中,上升星座可以解釋一個人的外在表現與舉止,像是你給別人的第一印象以及帶給周圍環境的影響。

下降星座

(象徵愛情) 下降星座代表的就是「與你最親密的人」,換句話說就是適合你的愛情和婚姻的伴侶類型。可以從下降星座找到你的最佳婚姻伴侶。

天頂星座

(象徵事業) 人生追求的目標。

天底星座

(象徵家庭) 主宰個人的根源,代表著家庭、父親、家世背景與晚年生活,而錢財方面則代表著房屋與不動產。

***** 

北交點/南交點

占星的時候,會將南北交點解讀為生命的課題;南交點是過去早期的習性、感覺舒適的地方,而北交點是未來我們要走的方向,今生的學習課題。

“北交點”也稱為“龍頭”,印度稱為Rahu,中國稱之為“羅睺”,代表獲得、增加擴展信心的點,這是你必須爭取或競爭的領域。“北交點”出現於星盤中的宮位,是你應該奮力實現的領域。

“南交點”也稱為“龍尾”,印度稱為Ketu,中國人稱為“計都”,代表放鬆、解放的點,這是你必須給予或捨棄的領域。“南交點”出現於星盤中的宮位,表示你可能放鬆渡過的領域。

這交點在各宮的意義另查.


幸運點
宿命點

2024年8月20日星期二

月供投資的問題

月供問題是,雖可不斷買入,但假設股升,每月定額供只會買少咗。 平均價也變高。所以利潤變少。

這也正常,因為月供之重點是抹平價格上下風險。咁風險少了,利潤必然少了。

2024年8月9日星期五

書法考試

突發奇想。書法可以如 PIANO考試咁,要製訂書法考試標準。要一個組織來舉行。

考試可以是:出一個文章畀你,要你在規定時間內完成作品設計和書寫。比如李白將進酒,文字稿畀你,2小時內,寫一張作品。

其實,同 PIANO 演奏差不多。就是把一個有記錄的作品(曲譜/文章)用藝術形式演繹出來。

不知可行否?

2024年3月25日星期一

如何找對人

技術上講,我們需要:

先遇到足夠多的人。

所以要:

由小學起(直到中學,大學)就注意交異性朋友,和他們保持聯絡。多聊天,能聊的要留住。不能聊的就算了,不要浪費時間。

學校時期的朋友很重要,因為大家沒太多利害衝突。

保持聯絡:

不管怎麼換電話,永遠留著重要朋友的最新聯絡方式。時常主動交換話題和情況。最好可以間中見面。

那個人,應該是你很好的朋友,最好是最好的朋友(之一)。

怎麼判斷?他應該和你很好聊啦。天南地北,一聊就可以幾小時。

希望你在朋友圈裡,可以找到他。

我始終相信,長久堅固的友情,是愛情的保證。

精選

Clone Github with personal access token

Github doesn't support cloning with username password. With personal access token (PAT): git clone https:// <PAT> @ github.com/pa...