團購、直播下單使用google 表單並即時mail/SMS通知

google 有一個apps script的服務,可以結合表單 。

 

function sendEmailOnNewEntry(e) {
var sheet = e.source.getActiveSheet();
var range = e.range;
var row = range.getRow();

var emailAddress = sheet.getRange(row, 2).getValue();
var ordername =sheet.getRange(row, 3).getValue();
var ordernum = sheet.getRange(row,5).getValue();
var ordergetdate = sheet.getRange(row,6).getValue();
var mobileNumber = sheet.getRange(row, 4).getValue();

var subject = '【豐原團購】甲竹園玫瑰檸檬塔訂購成功';
var message = ordername+'您好:提醒您玫瑰檸檬塔訂購成功. 訂購數量為'+ordernum+'盒,預計取貨日為:'+ordergetdate;

if (emailAddress) {
MailApp.sendEmail(emailAddress, subject, message);
}
// 發送簡訊
if (mobileNumber) {
var smsMessage = ordername+'您好,玫瑰檸檬塔訂購成功。數量為' + ordernum + '盒,取貨日為:' + ordergetdate;
sendSMS(mobileNumber, smsMessage);
}
var lineMessage= ordername+'您好,玫瑰檸檬塔訂購成功。數量為' + ordernum + '盒,取貨日為:' + ordergetdate;
sendLineNotify(lineMessage);
}

function sendLineNotify(message) {

var lineNotifyToken = 'xxxxxxxxxxxx';
var url = 'https://notify-api.line.me/api/notify';
var options = {
'method': 'post',
'payload': 'message=' + message,
'headers': {
'Authorization': 'Bearer ' + lineNotifyToken
}
};
UrlFetchApp.fetch(url, options);
}

function sendSMS(mobile, message) {
var url = 'http://api.twsms.com/json/sms_send.php';
var username = 'xxxxxxxx'; // 替換為你的用戶名
var password = 'xxxxxxxxxx'; // 替換為你的密碼

var payload = {
username: username,
password: password,
mobile: mobile,
message: encodeURIComponent(message)
};

var options = {
method: 'post',
payload: payload
};

UrlFetchApp.fetch(url, options);
}

有趣的.net core 後端人員AI面試

昨天晚上,wil 保哥發了一則貼文。就是用gpt4訓練了一個.net core 後端工程師的面試line。主要是透過問答方式,瞭解像.net core與.net framework的異同、restful api的設計原則、非同步、DI、memorycache、middleware、entity framework。

wil保哥徵才原貼

gpt 多奇 AI 面試官 ( .NET )

line官方帳號  @290quxfz

地震使用業務型無線電防災

2017年辦市集時,前小編建議的無線電
用的時間不多,但為了怕電池問題 三不五時都帶出來
這次地震,剛好就拿到公司做防震的一個宣導
在地震當下會有停電,這時候依靠基地台的手機通訊僅能撐一小時
而一般無線電1800毫安(mah),以接收的耗電量100ma來計算。可以待機18小時(電池續航力 = 電池容量 (mAh) / 負載電流 (mA)),以救難整點呼救的慣例,可以有至少一週的電量。
而這種免考照的UHF業務型無線電,依台灣發給的FRS從467.5125~467.6750共14頻道以及38組CTCSS (Continuous Tone-Coded Squelch System),也是很容易找得到。缺點是聽不到收音機而已~ 但這頻率對於室內的穿透性是很高的

讓MS SQL與Redis資料同步的幾種作法

首先,ms sql是資料庫,是永久儲存資料用,保證了資料的可靠性;而redis是拿來做暫存,主要提昇資料存取的性能。

而讓資料庫與暫存達到一致是相當經典的問題。

首先先探討不一致的發生原因,通常是發生在資料有變動的時候,因為資料變更需要同時操作資料庫以及暫存,因為不同系統,無法同時操作瞭解成功與失敗,且有時間差。就導致不一致~

提出幾個作法:

一、先刪暫存,再更新資料庫(在高併發讀寫時會不一致,不建議)

二、先更新資料庫,再刪除暫存【Cache Aside Pattern】(會出現一小段不一致)

三、只更新暫存,讓暫存同步更新資料庫【Read/Write Through Pattern】(不一致的機會很低)

四、只更新暫存,讓暫存非同步更新資料庫【Write Behind Cache Pattern】(性能最高,但如果暫存更新回資料庫時暫存掛了,資料會遺

redis 的key 過期通知設定

Redis - Wikipedia

redis有expire機制,且同時有redis keyspace notification。不過預設默認的通知是關閉的~需要透過redis.conf或config set啟用。

config set notify-keyspace-events KEA

接著在c# 使用StackExchange.Redis

然後訂閱__keyevent@0__:expired 這個頻道就可以了

var redisConnection = ConnectionMultiplexer.Connect(“localhost”);
var db = redisConnection.GetDatabase();

var subscriber = redisConnection.GetSubscriber();
// 訂閱過期事件通知頻道
subscriber.Subscribe(“__keyevent@0__:expired”, (channel, key1) =>
{
// 在這裡進行過期事件的處理邏輯
// key 是過期的 Redis 鍵名
Console.WriteLine($”Key {key1} has expired.”);
});

Console.WriteLine(“Press any key to exit.”);
Console.ReadKey();

// 斷開與 Redis 的連線
redisConnection.Close();