跳到主要內容

發表文章

【認證與授權】 你是否被一堆帳號密碼給搞瘋了? FIDO能夠成為救星嗎?

科技發展飛快的時代,人手一支手機,除此之外許多APP也如雨後春筍般的誕生,而每一款APP背後幾乎都是獨立的一間公司在提供服務,因此每個公司都會獨立維護客戶的資料,身為客戶的我們為了享受到各家大廠的服務,每使用一間公司服務的同時也隨之註冊一組帳號密碼,不知不覺就註冊了好幾十組帳密,每一組都一樣也不太安全,每一組都不一樣又很容易忘記,到底該怎麼辦呢? 相信這應該是大部分使用者的一大煩惱吧! 為了解決這個問題,過程中不斷推出一些策略,像是最早期的SSO到現在的OAuth都是解決太多組帳密的問題,作法上雖然有些差異,但最終想要解決的就是多組帳密的惱人場景,簡化到只要一組帳密,取得授權之後就能登入並享受服務。 舉例來說,像我們開始使用Notion這套筆記軟體時,會有三種註冊方式,除了從Notion本身的平台註冊以外,亦提供的Google及Apple帳密進行註冊及登入,讓我們在使用其他服務的同時就能夠透過不需要重新注冊的方式進來使用,看似非常方便對吧! 但其實背後隱藏著一些問題值得我們探討與省思…。 試想,我們畫面上只看到Google與Apple,其實無非就是在爭奪誰是市場上最大的應用廠,誰就能夠做為業界的唯一標準,假設今天又出了一間更大廠的服務,是不是又要依賴於該大廠並註冊一組帳密了呢? 對於用戶來說這就是目前SSO與OAuth仍遇到的問題之一。 基於過往的一些問題進而誕生出FIDO這套機制,由非營利組織 FIDO 聯盟所訂定的一套網路識別標準,目的在於保護伺服器與終端裝置的安全性,並秉持著三大原則,便於使用、隱私安全、標準化。 FIDO更為安全的原因是什麼? 背後又是怎麼運作的呢? 我們之前有介紹過什麼是公開金鑰加密,還不清楚這是什麼的朋友歡迎先行閱讀「 【開發智能合約 - 密碼學系列】編碼(Encode)、雜湊(Hash)、加密(Encrypt)傻傻分不清楚? 」,裡面最後一個章節有提到非對稱加密,這也是公開金鑰加密的一種別稱。 這種架構之下,伺服器不再需要保存密碼,只需要保有「公開金鑰」,而「私密金鑰」則保存在個人裝置中,因此個資只需要自己保管好,責任就由伺服端轉嫁到使用者端囉! 帶來的好處當然是「自己的東西自己管」,但風險就是「自己管不好就完蛋」,凡事總有一體兩面,並非十全十美,我們只能選擇一種更有優勢的方式來解決問題, FIDO UAF UAF(Un...

【AI技術新知】 ChatGPT - 與AI共筆的協作方法

  對於時常寫作的朋友們, 相信協助我們產生文案的主要工具莫過於Google搜尋吧! 早期的搜尋技術侷限於某些關鍵字, 而非真正理解我們的意圖, 舉例來說, 我們在搜尋「今天天氣很好」時, 通常會拆成「今天 + 天氣」兩種關鍵字組合去進行搜尋, 但現在的Google可以將「今天天氣很好」的所有可能羅列出來, 並以排名方式呈現給我們, 這樣看似美好, 卻會花費不少時間過濾資訊並決策。 假如有個貼心的AI能夠理解我們說的話該有多好, 又能夠幫助我們自動撰寫文章那就更棒了, 這些訴求都已經被OpenAI聽到了! 沒錯, 就是最近非常火紅的 ChatGPT , 出自美國舊金山的 Open AI 所開發的一套AI引擎, 早期常常出現答非所問的狀況, 但現在已經能夠很靈活的回答我們的問題了, 我們來試著玩玩看這個AI新寵兒到底有多厲害吧。 什麼是ChatGPT? 主要使用「GPT-3」的統計語言模型, 那什麼又是「GPT-3」呢? 作者也不是非常清楚, 這時候我們就讓ChatGPT來幫我們回答吧: GPT-3(Generative Pretrained Transformer 3)是一種大型語言模型, 由OpenAI訓練而成。它可以用於自然語言理解和生成任務, 例如文本生成、機器翻譯和問答系統。GPT-3擁有巨大的詞彙量和訓練數據, 因此它能夠高效地理解和生成人類語言。 簡單來說就是讓機器讀懂我們的語言, 並進行回應。 怎麼用? 動手來玩玩看吧! 首先我們可以到「 ChatGPT 」的官網先註冊一組帳密, 註冊完畢之後, 介面也相當直觀, 就像我們平常在使用的通訊軟體一樣, 以最自然的對話來詢問我們的問題吧! 這邊我們就先來問問「要怎麼寫好一份優質的文章?」, 可以看到AI回答的非常到位, 非常自然的對答, 如果我們事先不知道背後服務的其實是個AI的話, 甚至會誤以為是真人在回應呢! 什麼樣的難題是ChatGPT無法勝任的呢? 當然ChatGPT也不是萬能的智能客服, 由於它能理解的資料僅限於歷史資料(ChatGPT的資料庫目前僅更新至2021年), 流行語對它來說或許並不擅長, 再來是決策也不是它擅長的任務, 甚至假若訓練的資料是有害的, 回答出來不是我們能夠完全相信的資訊, 因此不能完全依賴於ChatGPT的回答, 目前仍需我們大腦進行進...

🖋 【Google Colab Python系列】 視覺化資料Matplotlib 如何繪製出中文?

  我們前篇有介紹到如何讓資料視覺化「 📈 【Google Colab Python系列】以Goodinfo為例,將資料視覺化吧!」,過程中雖然我們的報表呈現皆使用英文字眼,但假若欲繪製中文進行呈現時就會發生以下狀況: import matplotlib . pyplot as plt data = [ lYield , cYield , hYield ] # 這裡繪製出中文 labels = [ '中文' ] plt . boxplot ( data , labels = labels ) plt . show () /usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py:214: RuntimeWarning: Glyph 20013 missing from current font. font.set_text(s, 0.0, flags=flags) /usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py:214: RuntimeWarning: Glyph 25991 missing from current font. font.set_text(s, 0.0, flags=flags) /usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py:183: RuntimeWarning: Glyph 20013 missing from current font. font.set_text(s, 0, flags=flags) /usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py:183: RuntimeWarning: Glyph 25991 missing from current font. font.set_text(s, 0, flags=flags) 由上述的訊息可以推估可能是某些字型缺失,因此無法正常顯現,這時候我們就需...

📈【Google Colab Python系列】以Goodinfo為例,將資料視覺化吧!

  上一篇我們有介紹如何爬取Goodinfo的資訊並統計分析,還沒閱讀的朋友建議先行閱讀,再進入此篇章會比較容易上手唷,傳送門如下: 🚪 【Google Colab系列】以Goodinfo!為例,統計一段時間內的最高、最低殖利率 為什麼要做資料視覺化? 相信圖文甚至影音箱對於文字來說更為吸引我們進行知識的汲取,一張好的圖表讓我們一眼就能看出資料的趨勢、分布,提升整體效率,因此當資料、統計都準備好之後,下一步就是以圖表來進行分析並決策。 那這次的主題會使用到的套件為「 Matplotlib 提供了靜態、動態與互動式圖表,是python語言中資料視覺化的強大利器。 我們應該選用哪一種圖表呢? 不同的情境下選用不同的圖表,就像戰場上根據戰況選用不同的武器甚至策略,因此並沒有一個標準答案,不論是時序、量化...都有其擅長與短處,看看這篇今周刊的文章就有提到「 不同圖表不同使用時機,我的報表適合什麼圖形?你用對了嗎? 」。 而我們的情境是要分析目前股價屬於偏貴還是便宜,因此會有最高、最低以及目前錨定位置,那以這樣的情境我們可以選用了箱型圖來做表述: 因為我們並沒有時序上的需求,因此也不適用於折線圖、長條圖這種常見的圖表,反而是箱型圖可以表述目前的價格偏高還是低。 開始實作的旅程 上一篇」我們已經統計出最高/最低殖利率了,這次我們進行延伸,以最新成交價搭配圖表來評估目前股價的位階,因此會抓取最新成交價、計算目前殖利率、繪製圖表這幾個步驟,以下將逐步說明。 抓取最新成交價 我們一樣使用dom分析的工具來抓取指定表格,如何抓? 請參閱「 🚪 【Google Colab系列】以Goodinfo!為例,統計一段時間內的最高、最低殖利率 」,以下是主要抓取的部分: # 這一段是「成交價」區塊 price_data = bs . find ( class_ = 'b1 p4_2 r10' ) 接著我們試著取得成交價,並進行轉型為float以利後續計算。 import pandas dfs = pandas . read_html ( price_data . prettify ()) node = dfs [ 0 ] # 僅留下第一列 node . columns = node . columns . get_level_values ...