最近終於有新專案可以碰了,但是碰新專案之前,會需要經歷幾個步驟,要先install在把專案run起來,有時候就有可能會遇到node-sass版本不對的問題。排除node-sass版本不符問題實作情境在clone新專案後,正常的進行install程序後,要把專案跑起來時跳以下的錯誤。(已經切換到應該要使用的node版本,仍然會跳錯)問題解決方式可以透過以下方排除這個狀況。1. 確認已經切換到該使用的node版本。
2. 切換到node module資料夾李。
3. 透過以下指令讓node-sass重新rebuild
npm rebuild node-sass
4. 跳出以下內容時,就代表有順利完成這個動作。
貼心小提醒!!因為是亂亂寫筆記,真的就是純紀錄之前實作時,如何解決曾經卡住過的問題,所以主要都是解決問題的方式為主,不會有太多詳細說明。 文科少女寫程式 發表在 痞客邦 留言(0) 人氣(14)
前陣子突然被問到,「你說你有碰過Nginx,那你知道什麼是Nginx嗎?」,這麼突然被一問,老實說我只回的出「它是一個伺服器」,如果要往更細節的問,我其實真的就回答不好了QQ
既然發現到自己好像對碰過的東西有些模糊地帶,不如就花點時間,把模糊的地方給清晰化(?)吧!什麼是Nginx?Nginx是一種web server,除了Nginx外,還有一個也很有名的web server叫做Apache,不過今天的主角是Nginx,就只以Nginx為主了。
接下來直接看一下官方的介紹吧!官方的介紹:
nginxX是一個HTTP和反向代理伺服器,也是一個信件代理伺服器,以及一個通用的TCP/UDP代理伺服器。
更白話的去理解什麼是Nginx的話,就是一台當我們連進網頁時,接收我們request,再發送response給我們的機器,那台機器裡面會存放一些網頁的資料(例如:前端相關的靜態資源),也會有其他附加的用途可以應用。Nginx的用途有哪些?大概了解Nginx是什麼之後,再更進一步來看看幾個Nginx比較常會拿來應用的用途。反向代理在剛接觸Nginx的時候,第一個接觸到的概念就是proxy(代理),其中又區分成反向代理和正向代理。
在使用Nginx時,可以透過proxy_pass來設定反向代理,接著也來快速看一下反向代理和正向代理的概念各是什麼。

- 正向代理:
在正向代理的情境下,當client,也就是我們使用瀏覽器輸入網址,發送request的時候,會先連到proxy server,再轉連到我實際上真正要連到的web server。這個時候真正的目的地並不會知道更早之前發生什麼事,都只知道proxy server對他發送request,所以會不知道實際發送request的人是client,而不是proxy serve。這個情境通常都會應用在VPN上,沒錯!就是大家最近常聽到的surfshark VPN的VPN,有在玩遊戲或是跨到國外追劇的人應該都對這種VPN不陌生,而他的應用概念就是正向代理,白話一點來說的話,也就是先連到VPN提供的proxy,再用那個proxy去騙實際上要連到的目的地你的真實身份,因為他只會知道是VPN的proxy對他發送request。
- 反向代理:
正向代理隱藏的是client的身份,那反過來看的話,反向代理也就是隱藏真實目的地。在反向代理的情境下,client端,也就是我們使用瀏覽器輸入網址,發送request時,我們會以為proxy server是我們的目的地,但是實際上proxy server還會繼續往下導到真正的目的地。這個概念的應用情境通常都會應用在負載平衡上和與安全相關的防火牆上。負載平衡這邊應用到的概念也就是前面有提到的反向代理,透過設定upstream 搭配 proxy_pass來達成。當負載太高時,就會被分配連到其他伺服器。口語化來解說的話,也就是雖然連的網址是一樣的,但會依照當下的負載狀況,去分配實際上連到的伺服器.緩存Nginx還可以拿來做一些緩存的動作,可以透過設定proxy_cache來進行緩存的動作,如果是已經有取得過的資源,就不會再重新拉一次資料。靜態HTTP伺服器如果有一些靜態資源,也可以放到Nginx裡面,透過發送指定的request,下去取得要的資源。這個也是我之前實務上有用過的用法,前端的一些靜態資源會被放到指定的Nginx裡面,當request path有對到對應的設定,就會到指定的位置取得靜態資源。總結Nginx是一個伺服器,但不只單純可以接收request和發送response的伺服器,還附帶多種用途可以應用,也是因為這樣,有很多人在使用Nginx。我自己碰過的寫法是用consul template下去寫,但這篇單純簡單地認識Nginx的部分,就不談詳細的內容怎麼寫了。
最後再來個接觸Nginx的心得總結!雖然自己目前還不是什麼Nginx專家,但是前端如果有去了解這部分,的確對於開發業務上有一定的幫助,也比較知道在發送request和接收response的這個過程,到底都發生了什麼事情。而且等到有理解到一些部分後,腦海中就比較好把這些偏抽象的概念轉成畫面。所以如果跟我一樣原本只專注在純前端的技術,對於偏向伺服器的這部分內容不是很了解的朋友們,就非常推薦去玩玩看Nginx,一定能讓打開自己的視野喔!XD好啦!這次小小的學習筆記就到這裡囉!掰掰~
文科少女寫程式 發表在 痞客邦 留言(0) 人氣(84)
這幾天接受了白板題的小測驗,解了一道題,其中提出這題測驗題的大大也分享了他的解法,回到家後,自己也嘗試了一下他給的更好的解法,這邊也來稍微紀錄一下。
首先,一樣先看題目內容題目需求從陣列中取出加總起來的合可以等於第二個參數的兩個數字,並返回它們在陣列中的index。解題過程在現場我想到的方向如下:第一個方向 - 先排序陣列,讓他可以從小至大排列,用兩個個pointer,一個從頭開始移動,一個從尾開始移動+ 迴圈來檢查哪兩個數字的總合等於第二個參數。但是!!回家重新復盤檢討後,才發現這麼做並不是正解!!
發現到的問題是「因為我有重新排序,所以出來的index會是錯的。」
雖然這個做法的確可以找出可以加總出正解的兩個數字,但是最終回傳的index並不是正確的。
我自己檢討的時候還有針對這個方向做修改,修改方式就是複製出一個陣列做排序。但是!!這樣做還是有問題,因為如果陣列內對應到正確整合的兩個數字是同一個數字的話,用indexOf回找數字的index只會找到排序第一的數字,也就無法return出正確的答案。第二個方向 - 不做排序,透過數字差下去找另一個數字的位置。這個方式是當天出題大大給我一些小提示後,又想到的方式,但是因為一樣有用indexOf去找數字的index,所以一樣會有方向一檢討後調整解法的問題。
第三個方向 - 效率比較差的雙迴圈的方式。這是另一個我自己在家檢討的時候
,想到的方式。雖然因為跑了兩個迴圈,時間複雜度變成O(n^2)了,整體效率比較差,但至少有先達成這道題的目標答案。外圈從頭開始跑迴圈到倒數第二個數字,內圈從第二個數字跑到最後一個數字。
第四個方向 - 只跑一次迴圈,並且用查找效率較好的物件儲存扣掉當前遍歷到數字後,還剩餘多少的數字和當前遍歷到的數字index。詳細把程式碼實作出來後,只需要跑一個迴圈,整體效率比較好,且可以達到這題需求的解法其實還是當天出題大大最後提點我的解法。
這裡也將完整的程式碼實作出來如下:
每個小步驟的說明1. 準備一個拿來存[target - 當前遍歷數字]剩餘數值和當前遍歷數字index的空物件。
2. 跑一個for迴圈,每跑一次都會去計算遍歷到的當前數值還差多少可以達到target數字。
3. 如果temp裡面沒有對應到的剩餘數值的話,意即如果去查找temp物件,返回undefined的話,就把當前數字差多少的數值和當前數字的index放進temp物件裡面。
4. 如果從temp中查有查找到對應的剩餘數值,而且存儲數字的index和當前跑到的數字index不相同的話(因為不能自己跟自己加總),就返回自己的index,儲存當時數字的index。這樣就完成了!感謝那位大大當天最後的提點,讓我學到一個很不錯的解法。
文科少女寫程式 發表在 痞客邦 留言(0) 人氣(40)
JavaScript的hoisting這個特性在初學時期可能會偶爾不小心碰到,但不太會有什麼深刻的感受,或是不知道原來這就是hoisting。但是近期參與重構主題的讀書會,有討論到一些寫法和hoisting這個特性有關,才發現其實這個特性其實真的很需要好好認識,加上前陣子因為一些面談的過程,發現自己其實對這個概念有些錯誤的理解,所以就想說來好好地再幫自己釐清和整理一些這部分的必懂常識囉!什麼是hoisting首先,不免俗地要來說文解字一下!直接看字面的話,沒有什麼花俏的說明,hoisting的字面意思就是「提升」。再深入一點理解,就會是「提升」某些東西,某些東西被「提升」了。看起來好像很廢話,總之就是「提升」。
進到MDN看一下更詳細的說明吧!

從上述這段說明可以看到關於「提升」的關鍵句子,也就是"move the declaration of functions, variables or classes to the top of their scope",大致上的意思就是是「函式、變數的宣告會被提升到作用域頂部」。如何產生hoisting雖然前面的那句話已經解釋了何謂hoisting,但是老實說如果還沒有深刻透過實作來理解的話,可能還是很難單單透過這句的說明就掌握到什麼是hoisting。在進一步看宣告會被hoisting的對象之前,先來從另一個角度了解hoisting是如何產生的吧!
這部分要回到最根本去理解JavaScript建立執行環境的過程,JavaScript在建立執行環境(Execution context)時,主要會分為兩個階段:創建階段(Creation Phase)、執行階段(Execute Phase)
第一個階段、創造階段
在這個階段主要會做以下幾件事情:
- 在記憶體中幫變數、函式建立一個空間,這就是和這次提到的hoisting有關的部分。
- 將全域物件(Global Object)、this設定到記憶體中
- 建立外部環境(Outer Environment)
第二階段、執行階段
在這個階段會逐行執行程式碼,並編譯成電腦懂的內容,如果在執行程式碼的時候,找不到當下程式碼中要使用的變數,就會往一層一層往外找。 文科少女寫程式 發表在 痞客邦 留言(0) 人氣(46)

許久未寫LeetCode刷題筆記了,趁著這次參加一個小考試的機會,來自己回顧檢討一下自己的寫的這道題。
看一下題目內容
題目需求要將陣列中的數字0全部都排到陣列最後面。解題過程我總共想了兩個方向的作法:第一個方向 - 用一個pointer + 迴圈來檢查是不是0,並且進行splice和push的動作。用while迴圈逐一去比對陣列每個數字,當發現是0的時候,就把這個數字拿出來往後放。但是!!又把它拿出來檢討後,才發現這麼做其實會有一個問題!!(思慮不周的我,還以為這樣就完美完成,然後就這樣把答案交出去了QQ)
發現到的問題是「因為陣列的排序有變動,如果在這個狀況下跑迴圈,會有漏檢查的數字。」
例如:
目標排序陣列為[0, 0, 1, 0]
index會在第一次排成[0, 1, 0, 0]後,被+1,但是這樣就檢查不到原本index為1的數字,如果原本index為1的數字又剛好是0的話,就無法達成這題的需求。
為了解決這個問題,我又改了一個寫法。但是!!又發現一個問題,這個做法會造成太多多餘的迴圈檢查步驟,讓時間限制超過。第二個方向 - 用insertion sort(有兩個pointer)的方式進行排序。因為上面的方向都沒有找到比較完美的解法,所以就又回頭去複習一下之前學的演算法內容,找到了一個比較合適的方法「insertion sort」,整體的實作方向用文字來解釋的話,就是「往後找出不等於0的數字,與數字0交換位置」。
每個小步驟的說明
1. 準備兩個pointer(我這邊命名為leftIndex和rightIndex),兩個都是從陣列的index 0為起點。
2. 一開始pointer還在相同起點時,如果指到的數字為0,rightIndex會被+1,目的是繼續往後查找不為0的數字;如果數字不為0的話,就存下rightIndex的數字,與leftIndex的數字做交換,目的是將不為0的數字往前排,排定過後需要把rightIndex和leftIndex都+1,目的是要能繼續往後檢查還沒排定的數字。
3. 整體步驟以迴圈來進行,當rightIndex等於array長度就不要再繼續做檢查的動作,也代表每個數字都檢查過一次了。完整程式碼內容
方向二初版方向二優化版文科少女寫程式 發表在 痞客邦 留言(0) 人氣(72)
map這個陣列的操作方式,只要從超級新手升級到初階新手,基本上都知道。但是說到Map這個東東,可能就有些人本來沒看過了。沒錯!!就是我!!!這邊說的就是我!!!!學藝不精的我本來沒看QQ不過本來沒看過沒關係,現在看過了,那就花點時間把他是什麼給搞懂吧!Map是什麼?
文科少女寫程式 發表在 痞客邦 留言(0) 人氣(32)
這禮拜四(9/29)又參加了一場ALPHA Camp主辦的線下的活動,比較不一樣的是這場活動主題是企業參訪,還結合一些交流討論的環節。另外,最令人矚目的就是這場企業參訪的合作企業是大家應該都聽過的AmazingTalker,並請來了創辦人和CTO跟大家分享!身為使用者的我,當然不能錯過這次的機會,手刀給他報名起來了。
除了參與這次的活動外,還收到了一個特別的任務,就是擔任討論環節其中一組的Group Leader,這個角色是主要任務是帶領大家進行討論。雖然我是一個極度內向的人(咦?),但是喜歡挑戰的我還是接下這個任務了XD活動參與對象ALPHA Camp學生、校友、助教活動內容除了聽創辦人以及CTO分享一些關於AmazingTalker的介紹外,還有參與這場活動的AC學生、校友、助教,以及AmazingTalker工程師們的交流討論,另外,剩下的時間就是企業參訪,參觀AmazingTalker的辦公室。實際活動流程文科少女寫程式 發表在 痞客邦 留言(0) 人氣(40)
在學習React的時候,有發現一個hook跟Vue3世界裡面一個很重要的api的名字很類似,那就是useRef。雖然React的useRef因為名字的關係,看起來好像跟Vue3的ref是一樣的東西,但是仔細了解之後,才發現並不是這樣的呀!Vue3 vs ReactVue3 - ref其實Vue3的ref會比較像是React的useState,因為主要是在處理state,讓state的更新變得更方便,使用上跟data有關。不過除了這個主要的用法外,還有儲存DOM元素來操控的使用情境,這部分就稍微和React的useRef有點相似。另外,一個比較需要提的部分是「Vue3世界中,被用ref宣告的state如果使用在畫面上,當這個state有變化時,會讓畫面重新render」。
使用方式
宣告一個帶響應式的state,只要用以下的方式即可。
ref()可以帶入預設值,下圖預設值為"text"。

文科少女寫程式 發表在 痞客邦 留言(0) 人氣(36)