透過azure openai / openai api with vision功能,讓人工智慧看懂圖片

做了個小玩具  網址: https://shoushan.happyweb.com.tw

上傳圖片後,可以做出

一、依照圖片內容生成商品文案給社群小編行銷

二、人工智慧ai 描述辨識圖片

三、上傳餐廳、飲料店等菜單,透過ai辨識回傳json

四、行為偵測,例如上傳照片 讓ai看看有沒有犯法或違法

五、上傳一張網頁的圖片/手繪的prototyp,然後生成規格書與欄位內容,最後搞出一個前端的prototype

c# 即時錄音送至openai whisper 翻譯/逐字稿

最近試著做即時翻譯這件事,透過安裝naudio。把麥克風聲音錄下後,每10秒轉成一個檔案上傳至open AI whisper做即時翻譯或逐字稿:


private const string API_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
private const string API_URL = "https://api.openai.com/v1/audio/transcriptions";
var waveIn = new WaveInEvent();
waveIn.WaveFormat = new WaveFormat(16000, 1);

var buffer = new MemoryStream();
var writer = new WaveFileWriter(buffer, waveIn.WaveFormat);

//var writer = new WaveFileWriter(new DisposeStream(buffer), waveIn.WaveFormat);

waveIn.DataAvailable += async (sender, e) =>
{
writer.Write(e.Buffer, 0, e.BytesRecorded);
if (buffer.Length > 16000 * 2 * 10) // 每10秒
{
var audioData = buffer.ToArray();
buffer.SetLength(0);
buffer.Position = 0;
await SaveAudioChunkAsMp3(audioData, waveIn.WaveFormat);
await SendAudioChunk(audioData);
}
};

Console.WriteLine(“開始錄音。按任意鍵停止…”);
waveIn.StartRecording();
Console.ReadKey();

waveIn.StopRecording();
writer.Dispose();
buffer.Dispose();

static async Task SendAudioChunk(byte[] audioData)
{
using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add(“Authorization”, $”Bearer {API_KEY}”);

using var content = new MultipartFormDataContent();
content.Add(new ByteArrayContent(audioData), “file”, “audio.wav”);
content.Add(new StringContent(“whisper-1”), “model”);
content.Add(new StringContent(“language”), “zh-hant”);

var response = await httpClient.PostAsync(API_URL, content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine($”Transcription: {result}”);
}

理解c# 程式非同步async 跟await

隨著軟體開發的進步,以及硬體效能不斷增加,非同步程式設計是現代程式開發很重要的技術。在c# 主要以async 與await 二個關鍵字,讓非同步更直觀與容易管理。

非同步程式設計是允許程式在等待其他非阻塞任務操作完成時,能繼續執行其他任務的一個技術。能提高系統的回應性以及性能,尤其在處理高併發請求或者是耗時間的操作上。

async關鍵字

這個關鍵字主要用宣告這個方法是非同步的,但它不會去啟動一個新的執行緒,而是告訴compiler該下來的方法會有await的關鍵字,compiler需要為這個方法支持非同步的操作。

而async主要是宣告方法,而且只能回傳Task、Task<TResult>、void一起使用,但不建議void。

await關鍵字

awiat 是用來等待非同步操作完成用的關鍵字,只能在有宣告asyncASYNC的方法內部,compliler遇到await ,會將方法中其他部門註冊為等待任務延續,然後立既返回user。


using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args) // Main也可以非同步的
{
try
{
string content = await DownloadContentAsync(“https://example.com”);
Console.WriteLine(content.Substring(0, 100));
}
catch (Exception ex)
{
Console.WriteLine($”An error occurred: {ex.Message}”);
}
}

static async Task DownloadContentAsync(string url)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = await client.GetAsync(url); // 透過非同步取得
response.EnsureSuccessStatusCode(); // 確定回應碼是是正確
return await response.Content.ReadAsStringAsync(); // 透過非同步取得回傳內容作回應
}
}
}

上面的例子中,透過await 關鍵字 donwloadcontentasync 的方法,不會阻塞主執行緒,而是允許程式在等網路回應時繼續執行其他任務

非同步的異常處理

在處理非同步的異常,可以用try catch 來await 。而非同步方法在拋出異常時,會封裝在回傳的Task 裡。

注意的事

避免在非同步用.Result 跟 wait() 會導致死結與效能問題

非同步方法會盡可能快速回傳,避免在非同步的方法裡執行需長時間運行的同步程式,會造成執行緖阻塞。
確實處理非同步中會發生的異常,避免程式崩潰與資料損毀

聊架構 – 大型網站設計中多人上線指標Transactions Per Second(TPS)定義

大型網站的架構設計中,主要都是以同一時間系統能處理大量網頁請求或處理任務的能力當標準值。假設說,五月天的演唱會訂票系統瞬間會有大量搶票、支付,或是系統同時會有幾十萬客戶上線,這種有機會讓系統癱瘓掉的都屬於「高併發」。
而高併發衡量的指標主要是以”Transactions Per Second(TPS)”就是每秒處理交易數量,就如同剛才說的五月天演唱會搶票,以2024年6月統計7-11有12000家同時有人搶票,就算是高併發的一個場景。
一般而言TPS 落在1000-5000 屬於具有一定程度的併發,而5000以上就算高併發,像50000以上就屬於超大型網站會遇到的超高併發了。
要支撐這樣的場景,需要採用許多高併發的技術方案。
一、分散式架構
將系統的負載分散到多個伺服器的節點,提高擴展與可靠性。例如:增加伺服器的數量

二、微服務架構

把系統從單體拆分成相互獨立的服務,系統各自有自己的業務功能,彼此間透過RPC HTTP 做通訊。而每個微服務可以根據流量/負載做水平擴增。微服務的好處還可以獨立部署或擴增,減少耦合。

三、Cche機制

透過減少直接連接資料庫來提高回應速度,降低伺服器與資料庫的壓力。而用最多的莫過於使用redis 集群方式來擴展性能。把會頻繁查詢的資料,像商品、會員等放在記憶體中,提高併發量。

四、Load Balance 負載平衡

把客戶端的請求分配到不同伺服器,避免單一台伺服器過載,例如像nginx、HAProxy、F5等技術。而負載平衡有三種主要的策略來做分配

  • 輪詢:依順序把請求配到每一台伺服器
  • 權重:根據伺服器效能設定不同權重,能者多勞(不是過勞喔)的意思
  • IP Hash:透過請求的IP來分配,把同一個IP分配到同一台,這樣可以讓Session保持

五、流量的削峰

這是常用到的方式,避免瞬間大量沖垮服務過載。常用的方法是透過佇列的排隊來處理,比方說放到MQ這種訊息佇列來做承受大流量。

六、限流

透過限制請求的速率,主要有Token Bucket、Leaky bucket或計數器三種演算法

可參考:[Architecture] 架構設計 – 限流策略 Rate Limiting Strategies

七、熔斷

當某服務故障、過慢,熔斷機制可臨時中斷請求,避免影響

八、降級

關閉一些非核心的服務,降低系統壓力。

C# 進階概念釐清


一、瞭解IEnumerable 以及 ICollection
不允許資料被修改操作用前者,後者可以

二、要寫低耦合可測試的程式,使用DI
透過依賴注入可以簡單管理class間的依賴關係
三、參數使用ref 與out 的差別
ref 傳給方法的參數要先初始化,方法可修改值;out不需初始,但一定要回傳值
四、透過async await 來提高程式的效能
async允許非同步執行;await透過不阻塞主thread來update ui
五、錯誤處理機制
一般使用try catch 。全局時可以透過app.UseExceptionHandler統一處理

六、appsettings.json 搭配環境來劃分

七、task與thread
thread單執行緒;taskTA是非同步的抽象,與async/await一起服用

資安相關 – 檢查ad 帳號密碼180天到期

因為資安規定,公司網域密碼需180天更新一次。用c#檢查

Console.Write("請輸入域名: ");
string domain = Console.ReadLine();

Console.Write("請輸入有權限查詢 AD 的用戶名: ");
string username = Console.ReadLine();

Console.Write("請輸入密碼: ");
string password = Console.ReadLine();
try
{
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domain, username, password))
{
if (!context.ValidateCredentials(username, password))
{
throw new Exception("提供的憑證無效。請檢查用戶名和密碼。");
}

UserPrincipal userPrincipal = new UserPrincipal(context);
PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal);

Console.WriteLine("\n用戶帳號\t\t用戶名稱\t\t最後密碼更新日期\t預計密碼到期日期");
Console.WriteLine("--------------------------------------------------------------------------------");

foreach (UserPrincipal user in searcher.FindAll().Cast())
{
DateTime? lastPasswordSet = user.LastPasswordSet;
DateTime? estimatedPasswordExpiry = lastPasswordSet?.AddDays(180);
Console.WriteLine($"{user.SamAccountName,-20}" +
$"{user.DisplayName,-20}" +
$"{(lastPasswordSet?.ToString("yyyy-MM-dd") ?? "N/A"),-20}" +
$"{(estimatedPasswordExpiry?.ToString("yyyy-MM-dd") ?? "N/A"),-20}");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"發生錯誤: {ex.Message}");
if (ex.InnerException != null)
{
Console.WriteLine($"內部錯誤: {ex.InnerException.Message}");
}
}

Console.WriteLine("\n按任意鍵退出...");
Console.ReadKey();

Meta 剛剛發布了 Llama 3.1 405B

00:00 介紹

00:38 Meta’s Llama 3.1 概要

03:44 Llama 3.1 的真實世界使用案例

06:15 教育開發者關於開源 AI 工具

09:43 開源 AI 的社會影響

13:00 平衡權力和管理惡意行為者

14:40 開源和全域競爭

16:59 加速創新和經濟增長

20:04 Zuck 談 Apple 和過去的教訓

24:22 AI 的未來: Llama 3 及其後

26:43 預測: 數十億個個人化的 AI 代理

31:32 個改變反 AI 情緒的因素

匿名函式&委派

// 壽山測試
var f = () => Console.WriteLine(“哈囉 國興”); // 註解: 定義一個匿名函式
f += () => Console.WriteLine(“哈囉 後端”); // 註解: 加入一個匿名函式
f += () => Console.WriteLine(“哈囉 全端”); // 註解: 加入一個匿名函式
f(); // 註解: 呼叫匿名函式

原文: David Fowler

團購、直播下單使用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