<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>👽 Pei&apos;s Blog</title><description/><link>https://peiwww-blog.netlify.app</link><item><title>六角學院 JS 直播班 完課心得</title><link>https://peiwww-blog.netlify.app/posts/hexschool-js-bootcamp-review</link><guid isPermaLink="true">https://peiwww-blog.netlify.app/posts/hexschool-js-bootcamp-review</guid><description>記錄完成六角學院 JavaScript 直播養成班的學習過程、時間投入與最大收穫，給還在猶豫是否加入的你。</description><pubDate>Thu, 15 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;先說結論，推拉哪次不推｜六角學院JS直播班 完課心得&lt;/h2&gt;
&lt;p&gt;開設medium以來，沒想到第一篇文章就會是六角的完課心得。剛結束JS直播養成班，寫下我的過程心得給還在猶豫是否加入的你~&lt;/p&gt;
&lt;p&gt;參考資源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hexschool.com/courses/js-training.html&quot;&gt;六角學院 JavaScript工程師養成直播班&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hexschool.com/&quot;&gt;六角學院官網&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;./image-1.png&quot; alt=&quot;終於結束啦！！！&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;當初為什麼報名這堂課？&lt;/h3&gt;
&lt;p&gt;曾買過六角的HTML/CSS網頁設計課程，但邊上班邊學習的進度真的是三天打漁兩天曬網，太高估自己的自律性，也發現自己尚未養成學習習慣，導致一門課要很長時間才可以完成。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-12.png&quot; alt=&quot;每天下班後&quot; /&gt;&lt;/p&gt;
&lt;p&gt;處於離職的轉換期，經過幾次面試後，下定決心在這段空窗期全職轉職前端工程師，而非上班自學斷斷續續。選擇直播班而非影音課程的原因，想&lt;strong&gt;逼迫自己在短期間內學好JS基礎&lt;/strong&gt;，真實感覺(線上)有同學跟你一起在拚同一份作業，而且線上課適合遠離都市(懶得奔波)的人 😅&lt;/p&gt;
&lt;h3&gt;第一週~第八週的學習過程&lt;/h3&gt;
&lt;h4&gt;充實的課內資源量&lt;/h4&gt;
&lt;p&gt;每個禮拜分別會有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;影音課程&lt;/li&gt;
&lt;li&gt;每週五晚上將近3小時的直播課&lt;/li&gt;
&lt;li&gt;助教加碼教學&lt;/li&gt;
&lt;li&gt;Slack上小組討論和大群的主線任務討論&lt;/li&gt;
&lt;li&gt;每天的每日任務&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;記得當初直播班的介紹是說FOR上班族想自我進修，每週至少10小時。&lt;/p&gt;
&lt;p&gt;但實際是，每週投入在這門課的時間遠遠超過10小時啊！單就零基礎的我來說，隨著進程難度漸高，&lt;strong&gt;每週投入逐漸超過30小時以上。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-3.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;抱著培養未來工作技能的心情，想完成每一項提供的作業和任務，並做到每個難度和等級都完成，每天也一定都會開Slack看討論串看大家的留言和程式碼討論，即使無法像吃記憶吐司一樣完全複製，但一定也可以從裡面學到幾個方便又神奇的新語法 (酷東西！)&lt;/p&gt;
&lt;p&gt;除了上課教的文法以外，有時也會邊寫作業，邊把直接把不懂的東西丟google，找找看MDN找原本結構、有沒有大神寫得更多範例、或是鐵人幫系列文，不僅會找到更多超補的內容，也可以加深和加廣基礎觀念。個人覺得這蠻重要的，如果時間允許的話，做筆記也很好！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-4.gif&quot; alt=&quot;每次寫完一個筆記的我&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-5.png&quot; alt=&quot;每日任務大概1HR內可以解決，每天的小練習&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;除了課程以外&lt;/h4&gt;
&lt;p&gt;六角影音課程也會有同學，可以從評論中找到同學分享的解法或資源，但通常不會每一頁都點來看，單純看留言數也無法一目了然馬上了解那些留言有乾貨&lt;/p&gt;
&lt;p&gt;這次直播班就有個同學在大群提供了codewar練習題，針對陣列篩選設計題目，做完15道題也真的讓我對這些工具更加熟悉，之後寫題目也方便快速許多~&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.codewars.com/kata/coding-meetup-number-1-higher-order-functions-series-count-the-number-of-javascript-developers-coming-from-europe&quot;&gt;Coding Meetup #1 — Higher-Order Functions Series — Count the number of JavaScript developers coming from Europe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;交作業的比例之高！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-6.png&quot; alt=&quot;每個助教都改超多作業XD&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-7.png&quot; alt=&quot;專門平台可以看到大家交作業的情況&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;最大的收獲是？&lt;/h3&gt;
&lt;p&gt;有了雙螢幕(歡呼)(欸？不是&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;培養學習習慣&lt;/li&gt;
&lt;li&gt;找到適合的筆記軟體與習慣&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;對於想要轉職的人來說，我認為上述兩項是在出發時必須具備的習慣，讓路途走得更遠更長 (但我也不是希望轉職過程拖太久QAQ&lt;/p&gt;
&lt;p&gt;很幸運的，在直播班中算是摸到了這些習慣的邊邊。&lt;/p&gt;
&lt;h4&gt;培養學習習慣&lt;/h4&gt;
&lt;p&gt;直播班有稱不上輕鬆的作業量，永遠比你更努力更認真的同學在寫作業，固定的上課時間，這三項原因會讓你想逼自己一定要在一個禮拜內完成所有任務(也可能是升學體制下的奴性基因?)，焦慮地想做完所有事，就算休息或睡覺也在焦慮，腦子在想code怎麼優化(希望我不是病了)，焦慮所以會挪出大量時間給資質駑鈍的自己，每天寫扣碰扣，時間長了，也真的可以感受到自己越來越熟悉鍵盤的字母位置、語法操作。&lt;/p&gt;
&lt;h4&gt;找到適合的筆記軟體與習慣&lt;/h4&gt;
&lt;p&gt;(好像偏離課程心得了&lt;/p&gt;
&lt;p&gt;初期用hackmd，後期全部轉移到Notion&lt;/p&gt;
&lt;p&gt;有了大量的筆記需求後，會更了解自己適合哪個筆記軟體&lt;/p&gt;
&lt;p&gt;喜歡hackmd左側的目錄查找，只要階層分類好，想要回頭複習筆記過的語法相當方便！如果熟悉Markdown語法，在編寫上也會快速很多。&lt;/p&gt;
&lt;p&gt;但筆記一多，想查找相同分類的文章，介面就不是那麼方便使用&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.notion.so/&quot;&gt;Notion&lt;/a&gt;則是從幾年前就知道，但一直沒有高度需求，也不會特別使用他去做管理，直到我累積了大量的程式筆記，需要依語言去管理時才了解到他原來多麼讚 😍&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;影音課程尤其需要筆記！&lt;/strong&gt;
相比較書籍、文章、實體課程講義，都會有目錄或文字可以快速翻找關鍵字，影音只有影片標題，裡面重點需要自己去抓和不斷練習程式碼，透過建立筆記，省下不斷重播影片花費的時間，也容易給自己小成就感和信心！(新手很容易被打擊啊&lt;/p&gt;
&lt;p&gt;Notion教學：https://sspai.com/post/57464&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;最喜歡直播班的哪些活動？&lt;/h3&gt;
&lt;h4&gt;24小時助教服務&lt;/h4&gt;
&lt;p&gt;雖然我很少利用，但我覺得真的排除了很多新手在寫扣的障礙感，包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不敢問怕被覺得蠢&lt;/li&gt;
&lt;li&gt;卡了一整天還是不知道錯在哪(真的很想哭)&lt;/li&gt;
&lt;li&gt;想進到下一階段但等了3天才得到回覆，都已經忘記昨天飲料喝哪間的金魚腦真的不知道那時候的自己在想甚麼&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我通常會google不到解答，或是都看不懂查到的文件，才會去求救。但更常的是看別人的問題，以及助教的回覆，很常有的情況是：你不會是第一個，也不會是最後一個卡關的人&lt;/p&gt;
&lt;p&gt;看助教回覆也可以看到同個地方更優、或不一樣的解法~每次看都覺得天靈蓋被打開了~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-9.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;如果時光能倒流，會希望自己再次注意哪些細節？&lt;/h3&gt;
&lt;p&gt;如果再來一次，我會想和這次一樣盡力完成每一樣作業，扎實打好基礎，有問題找不到答案，就丟Slack集思廣益，才不會卡關太久。&lt;/p&gt;
&lt;p&gt;花上更多心思和時間，在這段期間補完課外補充的語法，例如Kuro大的認識JS之路、六角的JS工具補帖、JS抓錯文等。可以運用在作業中，遇到不會的也可以抓助教問(抖&lt;/p&gt;
&lt;p&gt;再來一次，如果條件允許，還是會選擇投入大量時間在直播班學習技能&lt;/p&gt;
&lt;p&gt;因為絕對不會讓你後悔！只會覺得時間永遠不夠！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-10.png&quot; alt=&quot;每次都寫扣到半夜，才發現大家都睡了&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;身為學長姐，分享些想入坑的新同學一些勉勵的話&lt;/h3&gt;
&lt;p&gt;加入直播班，只有在推坑，沒有在棄坑的！&lt;/p&gt;
&lt;p&gt;但真的建議需要一個禮拜挪出相對多的時間來準備及預習，若是零基礎初心者，才不會因無法善用到所有提供的資源，跟不上進度，反而更增加挫折感。&lt;/p&gt;
&lt;p&gt;若已準備好，下定決心學好JS基礎的話，那還猶豫甚麼，就來報名直播班吧！資源絕對不會少，還可以聽到影音課程沒有的，在直播中超級真實幹話滿滿的校長XD&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/500/0*hXb1e0RZODklC4Ea&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如果你喜歡我的文章，歡迎拍手或留言！對課程有疑問，也可以問我或詢問六角學院粉專哦~&lt;/p&gt;
</content:encoded><author>Pei Wang</author></item><item><title>[筆記]slick.js做出商品照輪播</title><link>https://peiwww-blog.netlify.app/posts/slick-js-carousel</link><guid isPermaLink="true">https://peiwww-blog.netlify.app/posts/slick-js-carousel</guid><description>使用 slick.js 套件做出商品照垂直縮圖輪播效果的筆記，包含常用設定與事件說明。</description><pubDate>Sun, 16 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*SaGta1x8brX4Gx0KGr2S1g.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Slick.js http://kenwheeler.github.io/slick/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;投影片輪播的套件，之前都是使用六角介紹的 &lt;a href=&quot;https://swiperjs.com/demos&quot;&gt;swiper&lt;/a&gt;，官方文件和demo都很詳細，相當推薦&lt;/p&gt;
&lt;p&gt;為了做出其他商品照輪播的效果，又從codepen找到完全是我要的slick做的輪播效果，像下面這張圖，同樣類似效果也可以在uniqlo商品頁面看到&lt;/p&gt;
&lt;p&gt;玩出來的效果很實用，作為使用者體驗也不錯&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*wniohWmzHAJoh-R-o7bMJw.png&quot; alt=&quot;左側小圖會隨著點擊往上滑動一格&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*-nXsDvsIwIEOsL5C8o5sKQ.png&quot; alt=&quot;左下小圖可點擊，看到更多商品細節&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;安裝&lt;/h2&gt;
&lt;p&gt;CDN，需裝入 jquery&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- CSS --&amp;gt;
&amp;lt;link
  rel=&quot;stylesheet&quot;
  href=&quot;https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.css&quot;
/&amp;gt;
&amp;lt;link
  rel=&quot;stylesheet&quot;
  href=&quot;https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick-theme.min.css&quot;
/&amp;gt;

&amp;lt;!-- jQuery --&amp;gt;
&amp;lt;script
  src=&quot;https://code.jquery.com/jquery-3.6.0.min.js&quot;
  integrity=&quot;sha512-894YE6QWD5I59HgZOGReFYm4dnWc1Qt5NtvYSaNcOP+u1T9qYdvdihz0PPSiiqn/+/3e7Jo4EaG7TubfWGUrMQ==&quot;
  crossorigin=&quot;anonymous&quot;
&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;!-- JS --&amp;gt;
&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.8.1/slick.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;基本設定&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;your-class&quot;&amp;gt;
  &amp;lt;div&amp;gt;your content&amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;your content&amp;lt;/div&amp;gt;
  &amp;lt;div&amp;gt;your content&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
  $(document).ready(function () {
    $(&apos;.your-class&apos;).slick()
  })
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以用 &lt;code&gt;ul &amp;gt; li&lt;/code&gt; 排列，輪播設定以 JS 為主&lt;/p&gt;
&lt;h2&gt;DEMO&lt;/h2&gt;
&lt;p&gt;點擊左側照片，可以控制右側畫面所呈現的照片，同時左側照片也會隨著照片點擊方向，往上或往下滑動一張照片&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 右側主要照片
$(&apos;.slider-for&apos;).slick({
  slidesToShow: 1,
  slidesToScroll: 1,
  arrows: false,
  fade: true,
  asNavFor: &apos;.slider-nav&apos;,
})

// 左側點擊控制照片輪播
$(&apos;.slider-nav&apos;).slick({
  slidesToShow: 5,
  slidesToScroll: 1,
  asNavFor: &apos;.slider-for&apos;,
  dots: false,
  centerMode: true,
  focusOnSelect: true,
  vertical: true,
})
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;幾個常用到的設定&lt;/h2&gt;
&lt;h3&gt;slidesToShow: 1&lt;/h3&gt;
&lt;p&gt;呈現出來的照片數&lt;/p&gt;
&lt;h3&gt;slidesToScroll: 1&lt;/h3&gt;
&lt;p&gt;滑動一次的照片數，點擊左右的箭頭，一次會滑動的數量。若 &lt;strong&gt;slidesToShow&lt;/strong&gt; 和 &lt;strong&gt;slidesToScroll&lt;/strong&gt; 數字一樣，點一次滑動整排投影片都換一輪&lt;/p&gt;
&lt;h3&gt;asNavFor&lt;/h3&gt;
&lt;p&gt;讓投影片互相輪動，後面加入選擇器，型別字串&lt;/p&gt;
&lt;h3&gt;arrows&lt;/h3&gt;
&lt;p&gt;箭頭是否呈現，預設 &lt;code&gt;true&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;fade&lt;/h3&gt;
&lt;p&gt;淡入淡出，預設 &lt;code&gt;false&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;dots&lt;/h3&gt;
&lt;p&gt;現在輪到第幾個的點，預設 &lt;code&gt;true&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;centerMode&lt;/h3&gt;
&lt;p&gt;預設 &lt;code&gt;false&lt;/code&gt;，讓前一張和後一張投影片不會出現，使用於 &lt;code&gt;slidesToShow&lt;/code&gt; 是奇數時候。&lt;/p&gt;
&lt;p&gt;設定 &lt;code&gt;true&lt;/code&gt;，投影片會像 demo 所示，前一張與後一張出現一部分，但不是整張圖片。若沒有設定 &lt;code&gt;centerPadding&lt;/code&gt;，預設是出現 50px&lt;/p&gt;
&lt;h3&gt;centerPadding&lt;/h3&gt;
&lt;p&gt;預設 50px，型別字串。設定為 center mode 時，可設定 padding 值（px 或 %）&lt;/p&gt;
&lt;h3&gt;vertical&lt;/h3&gt;
&lt;p&gt;boolean，投影片為垂直，預設 &lt;code&gt;false&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;zIndex&lt;/h3&gt;
&lt;p&gt;預設值 1000&lt;/p&gt;
&lt;h3&gt;responsive&lt;/h3&gt;
&lt;p&gt;響應式斷點設定，也可一併在 JS 中設定。值為陣列包物件，&lt;code&gt;breakpoint&lt;/code&gt; 為斷點 pixel 值，&lt;code&gt;settings&lt;/code&gt; 內加入各斷點設定，取消 slider 效果用 &lt;code&gt;settings: &quot;unslick&quot;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;responsive: [
  {
    breakpoint: 1024,
    settings: {
      // ...
    },
  },
  {
    breakpoint: 600,
    settings: {
      // ...
    },
  },
  {
    breakpoint: 480,
    settings: &apos;unslick&apos;,
  },
]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;事件&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// On swipe event
$(&apos;.your-element&apos;).on(&apos;swipe&apos;, function (event, slick, direction) {
  console.log(direction) // left
})

// On edge hit
$(&apos;.your-element&apos;).on(&apos;edge&apos;, function (event, slick, direction) {
  console.log(&apos;edge was hit&apos;)
})

// On before slide change
$(&apos;.your-element&apos;).on(&apos;beforeChange&apos;, function (event, slick, currentSlide, nextSlide) {
  console.log(nextSlide)
})
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Pei Wang</author></item><item><title>[note] React 發佈到 Github pages 過程</title><link>https://peiwww-blog.netlify.app/posts/note-react-github-pages</link><guid isPermaLink="true">https://peiwww-blog.netlify.app/posts/note-react-github-pages</guid><description>紀錄將 React 專案部署至 GitHub Pages 的完整步驟，包含遇到的問題與解決方案。</description><pubDate>Mon, 24 May 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;./image-1.jpeg&quot; alt=&quot;等車&quot; /&gt;&lt;/p&gt;
&lt;p&gt;紀錄成功和失敗後找到解法的過程&lt;/p&gt;
&lt;p&gt;過程全都是在專案資料夾內進行&lt;/p&gt;
&lt;h2&gt;Github上新增專案&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;./image-2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;將專案推上github&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;//這段新增好專案後會出現:帳號名、檔名
git remote add origin git@github.com:username/檔名.git
git push -u origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;package.json&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;realtime-weather-app&quot;,
  &quot;homepage&quot;: &quot;https://myusername.github.io/my-app&quot;,
  // 這個檔案的pages網址:帳號名、檔名

  &quot;scripts&quot;: {
    &quot;predeploy&quot;: &quot;npm run build&quot;,
    &quot;deploy&quot;: &quot;gh-pages -d build&quot;,
    // 添加上面兩個指令
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安裝gh-pages&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;npm install --save gh-pages
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;發布&lt;/h2&gt;
&lt;p&gt;若檔案更新也需要重新發布&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;指向gh-pages&lt;/h2&gt;
&lt;p&gt;GitHub / Setting / Pages&lt;/p&gt;
&lt;p&gt;Source的地方，改成 Branch:gh-pages&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./image-3.png&quot; alt=&quot;等個10分鐘之後，網站就會發布&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;自己遇到的雷點&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;API網站限制：要注意是否有限定網址需再做設定，做專案時可能只有設定local:3000&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;fetch:A branch named &apos;gh-pages&apos; already exists&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;解法：win10&lt;/li&gt;
&lt;li&gt;討論：https://github.com/transitive-bullshit/react-modern-library-boilerplate/issues/15&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;pakege.json script加上指令，刪除gh-pages快取，再跑一次清除的指令&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;clean&quot; : &quot;gh-pages-clean&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;終端機&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run clean
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重新安裝gh-page並發布&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm run deploy
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;其他按讚數很高的解法&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;rm -rf node_modules/gh-pages/.cache
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;手動刪除：Go to your project&apos;s &lt;strong&gt;node_modules/gh-pages&lt;/strong&gt; and delete &lt;strong&gt;&apos;.cache&apos;&lt;/strong&gt; folder.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;deploy&quot;: &quot;gh-pages -d build&quot;
//這一行指令改成下面的指令

&quot;deploy&quot;: &quot;gh-pages -b master -d build&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;add a script in package.json like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;clean&quot; : &quot;gh-pages-clean&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So you&apos;ll just need to do npm run clean next time the cleaning is required.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 第一個改成這樣
rm -rf node_modules/.cache/gh-pages/
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Pei Wang</author></item><item><title>[note] json-server推到heroku遠端 脫離本地端限制</title><link>https://peiwww-blog.netlify.app/posts/note-json-server-heroku</link><guid isPermaLink="true">https://peiwww-blog.netlify.app/posts/note-json-server-heroku</guid><description>json-server 推到 heroku 遠端，脫離本地端限制，也記錄了自己遇到的坑和排錯過程。</description><pubDate>Sun, 27 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*ZZdf-KZtVmZOQcnepiVPUg.jpeg&quot; alt=&quot;沒膽站上去的攝影師(我)&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;緣由&lt;/h2&gt;
&lt;p&gt;project 使用 json-server 做簡易 api，為了在之後求職時面試也可以用，將 json 傳到網路上，例如六角學院示範的 heroku，或是 json-server 官方提供的 beta 版 My json server&lt;/p&gt;
&lt;p&gt;但推上 heroku 遇到一點困難，可能是 json-server 更新，或是影片是3年前比較舊也有可能。網路上找不到全中文的解法，所以將找到的資源簡單翻譯，並記錄這次排錯過程。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;分成以下三步驟，若已經建立好 json server，可以直接跳到 2. 準備部屬到 heroku&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;建立 api 資料夾&lt;/li&gt;
&lt;li&gt;部屬到 heroku 前的準備&lt;/li&gt;
&lt;li&gt;建立 heroku server&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2&gt;1. 建立 api 資料夾&lt;/h2&gt;
&lt;p&gt;假設須建立 fake server 的假 api：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;建立 fake server 資料夾，建立 node 環境&lt;/li&gt;
&lt;li&gt;安裝 json server&lt;/li&gt;
&lt;li&gt;新增 &lt;code&gt;db.json&lt;/code&gt; 將 api 資料放入&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;npm init
npm i json-server
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;package.json&lt;/code&gt; 加上並更改 script start 的指令，讓 port 指向 localhost:3004&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npm start&lt;/code&gt; 啟動 json server&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// package.json
{
  &quot;name&quot;: &quot;api&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;json-server -p 3004 -w db.json&quot;
  },
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;到這邊為止，就建立好本地端的 api 囉。此時可以用 postman 測試 &lt;code&gt;http://localhost:3000&lt;/code&gt; 是否連線成功&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;更改 port 的方式除了上述的更改 package.json，也可以輸入指令&lt;/p&gt;
&lt;p&gt;&lt;code&gt;json-server --watch db.json --port 3004&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2. 部屬到 heroku 前的準備&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;修改 &lt;code&gt;package.json&lt;/code&gt; 的 scripts 中的 start 指令&lt;/li&gt;
&lt;li&gt;main 屬性也改為 &lt;code&gt;server.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;加上 dependencies&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;fake-server&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;fake server with fake database&quot;,
  &quot;main&quot;: &quot;server.js&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;node server.js&quot;
  },
  &quot;dependencies&quot;: {
    &quot;json-server&quot;: &quot;0.16.3&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;新增 &lt;code&gt;server.js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;const jsonServer = require(&apos;json-server&apos;)
const server = jsonServer.create()
const router = jsonServer.router(&apos;db.json&apos;)
const middlewares = jsonServer.defaults()
const port = process.env.PORT || 3000

server.use(middlewares)
server.use(router)
server.listen(port)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 建立 heroku server&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;安裝 &lt;a href=&quot;https://devcenter.heroku.com/articles/heroku-cli&quot;&gt;Heroku CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;登入 heroku&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在 api 資料夾建立 heroku app&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;heroku create
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;git 推上 heroku&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;git init
git add .
git commit -m &quot;first commit&quot;
git push heroku master
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;開啟 app&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;heroku open
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*30CA8J6y6S3zSNy44T92Pg.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;遇到的坑&lt;/h2&gt;
&lt;h3&gt;error: src refspec master does not match any&lt;/h3&gt;
&lt;p&gt;推上 heroku 時遇到此錯誤，原因是 git 預設分支名稱已改為 &lt;code&gt;main&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git push heroku main
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Application error&lt;/h3&gt;
&lt;p&gt;推上去後打開網址出現 Application error，查看 log：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;heroku logs --tail
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常見原因：&lt;code&gt;server.js&lt;/code&gt; 中 port 沒有使用 &lt;code&gt;process.env.PORT&lt;/code&gt;，heroku 會動態分配 port，若寫死會造成錯誤&lt;/p&gt;
</content:encoded><author>Pei Wang</author></item><item><title>[note] JS變數宣告 let / var / const</title><link>https://peiwww-blog.netlify.app/posts/note-js-let-var-const</link><guid isPermaLink="true">https://peiwww-blog.netlify.app/posts/note-js-let-var-const</guid><description>整理 JavaScript 變數宣告 let、var、const 的作用域差異、TDZ 暫時性死區與常見面試考題。</description><pubDate>Fri, 16 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*pni7Ql1XM8wt02NgcXpmDA.jpeg&quot; alt=&quot;圖文不符：基隆海邊 好久沒拍底片了啊&quot; /&gt;&lt;/p&gt;
&lt;p&gt;看 &lt;a href=&quot;https://www.udemy.com/course/javascriptjs/&quot;&gt;JavaScript 全攻略：克服 JS 的奇怪部分&lt;/a&gt; 課程時，課程範例多為 var，但我自己是從 let、const 學起，習慣用後者來取代前者，卻發現出來的結果和課程不一樣，便是因為 var 和 let、const 有著天差地遠的差別！&lt;/p&gt;
&lt;p&gt;堪稱基礎中的基礎的變數宣告，也是常見面試考題&lt;/p&gt;
&lt;p&gt;以下取自 MDN 對 ES6 let const 的範例，以及參考網路上各位大大的文章後，整理出來的筆記&lt;/p&gt;
&lt;p&gt;參考資料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.udemy.com/course/javascriptjs/&quot;&gt;JavaScript 全攻略：克服 JS 的奇怪部分&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements/let&quot;&gt;MDN let - JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ithelp.ithome.com.tw/articles/10216834&quot;&gt;JavaScript基本功修練：Day5 - 宣告變數 - let、const、var&lt;/a&gt;（強烈推薦，舉例多且說明清楚）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;var 作用域是 function，let / const 作用域是區塊 block&lt;/h2&gt;
&lt;p&gt;差別在 scope 的不同&lt;/p&gt;
&lt;h3&gt;var（function）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;作用域是 function 函數，函數若有重複區塊，會產生變數衝突&lt;/li&gt;
&lt;li&gt;可以重複宣告&lt;/li&gt;
&lt;li&gt;往外層找 function，若外層沒有 function，則變成全域性&lt;/li&gt;
&lt;li&gt;會變成全域變數，用 window 物件呼叫&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⚠️ 在 if / else / for / while 中使用 var，會汙染全域變數，難以維護，而 let / const 解決了這個問題&lt;/p&gt;
&lt;h3&gt;let（block）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;作用域為區塊 block，一個 function 中若有區塊相隔，可以有 2 個同樣變數的 let&lt;/li&gt;
&lt;li&gt;區塊作用域（block scope），也就是 &lt;code&gt;{ }&lt;/code&gt; 包住的區域&lt;/li&gt;
&lt;li&gt;禁止同層重複宣告&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;const&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;作用域為區塊，一個 function 中若有區塊相隔，可以有 2 個同樣變數的 const&lt;/li&gt;
&lt;li&gt;let 加強版&lt;/li&gt;
&lt;li&gt;禁止同層重複宣告&lt;/li&gt;
&lt;li&gt;常數保護，不能修改（重新賦值）&lt;/li&gt;
&lt;li&gt;在宣告 const 時就必定要指定給值&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;作用域不同，可能會產生變數衝突&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;function varTest() {
  var x = 1
  {
    var x = 2 // 同樣是變數 x
    console.log(x) // 2
  }
  console.log(x) // 2 跟著上面一起被覆蓋
}
// var 的範圍是 function，第一個 x 和第二個 x 會互相衝突覆蓋
// 因此第一個 x 也被覆蓋為 2
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;function letTest() {
  let x = 1
  {
    let x = 2 // 雖然命名都是 x，但存在於不同記憶體，不同變數
    console.log(x) // 2
  }
  console.log(x) // 1
}
// 不同區塊間的變數不會互相影響
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;let 作用域為區塊，跳出 if 條件式後，變數 &lt;code&gt;b=22&lt;/code&gt; 便不存在，會取用在全域的 &lt;code&gt;b=2&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;var 作用域為 function，若往外層找沒有 function，則會做為全域變數，此時 if 條件式中的 &lt;code&gt;var a=11&lt;/code&gt; 就是全域變數。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var a = 1
var b = 2

if (a === 1) {
  var a = 11 // 全域變數
  let b = 22 // 只存在 if 區塊內

  console.log(a) // 11
  console.log(b) // 22
}

console.log(a) // 11
console.log(b) // 2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;let 無法在 global 物件下建立 property 屬性&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;var x = &apos;global&apos;
let y = &apos;global&apos;
console.log(this.x) // &quot;global&quot;
console.log(this.y) // undefined
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;let 不能重複宣告&lt;/h2&gt;
&lt;p&gt;重複宣告會產生 &lt;code&gt;SyntaxError&lt;/code&gt; 的警告&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (x) {
  let foo
  let foo // SyntaxError thrown.
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;switch 可以寫成一個區塊，但會發生重複宣告的情況。此時可以將 case 後的程式用區塊隔開，就可以避免重複宣告&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ❌ switch 是一個區塊，會重複宣告
let x = 1
switch (x) {
  case 0:
    let foo
    break
  case 1:
    let foo // SyntaxError for redeclaration.
    break
}

// ✅ 將 case 分別寫成不同區塊
let x = 1
switch (x) {
  case 0: {
    let foo
    break
  }
  case 1: {
    let foo
    break
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;TDZ 暫時性死區&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;let&lt;/code&gt; / &lt;code&gt;const&lt;/code&gt; / &lt;code&gt;var&lt;/code&gt; 宣告變數時，會提升到作用域的最高處（hoisting）。&lt;/p&gt;
&lt;p&gt;不同的是，如果沒宣告就使用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;var&lt;/code&gt; 會回傳 &lt;code&gt;undefined&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;let&lt;/code&gt; / &lt;code&gt;const&lt;/code&gt; 會&lt;strong&gt;報錯&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;var a = 10
function testVar() {
  console.log(a) // Uncaught ReferenceError: Cannot access &apos;a&apos; before initialization
  let a
}
testVar()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以為 &lt;code&gt;a&lt;/code&gt; 會回傳 10，但 &lt;code&gt;let&lt;/code&gt; 已經讓 &lt;code&gt;a&lt;/code&gt; 提升到 function 的最高處，因為變數 &lt;code&gt;a&lt;/code&gt; 是在後面才宣告，所以會報錯：不能在初始化變數前使用 a&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var a = 10
function test() {
  console.log(a) // Uncaught ReferenceError: Cannot access &apos;a&apos; before initialization
  const a = 5
}
test()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;const&lt;/code&gt; 也是一樣。&lt;/p&gt;
&lt;h3&gt;let 和 const 雖然和 var 一樣有提升的作用，但 let / const 不會有 undefined 的預設值&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Unlike variables declared with var, which will start with the value undefined, let variables are not initialized until their definition is evaluated. Accessing the variable before the initialization results in a ReferenceError. The variable is in a &quot;temporal dead zone&quot; from the start of the block until the initialization is processed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;只有當 &lt;code&gt;let&lt;/code&gt; 被宣告執行時，變數才可以被使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var a = 10
function testVar() {
  let a
  console.log(a) // undefined
}
testVar()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;const&lt;/code&gt; 則是一定要賦值，才可以被使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function test() {
  const a
  console.log(a) // Uncaught SyntaxError: Missing initializer in const declaration
}
test()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函數中的變數提升到作用域最高處時，還沒宣告變數的時間，稱為 &lt;strong&gt;TDZ 暫時性死區&lt;/strong&gt;，這個時間不能使用未宣告的變數&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function test() {
  // 提升變數 a
  // TDZ 開始，不能訪問變數 a
  console.log(a) // ReferenceError

  // 宣告變數，TDZ 結束
  let a = 10
}
test()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根據 Google 的 JavaScript Style Guide，應該默認用 &lt;code&gt;const&lt;/code&gt;，如果該變數需要重新被賦值才用 &lt;code&gt;let&lt;/code&gt;，永遠不用 &lt;code&gt;var&lt;/code&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Declare all local variables with either const or let. Use const by default, unless a variable needs to be reassigned. The var keyword must not be used.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;更改不是指值的更改，而是記憶體地址的更改&lt;/h2&gt;
&lt;p&gt;決定那個變數會變，還是不變，是指那個變數的&lt;strong&gt;記憶體地址&lt;/strong&gt;有沒有變，而不是它的值&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;基本型別值&lt;/strong&gt;（字串、數值、&lt;code&gt;undefined&lt;/code&gt;、&lt;code&gt;null&lt;/code&gt;、symbol）：不能更改它的值，只能重新賦值，重新賦值時會更改記憶體地址&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;引用值&lt;/strong&gt;（物件、陣列、函式）：能修改它裡面的值，這樣不會更改記憶體地址，但如果重新賦予一個新的值，就會更改記憶體地址&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以下兩個例子都是值的改變，但並沒有改變記憶體位置，所以 &lt;code&gt;const&lt;/code&gt; 不會報錯：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const x = []
x.push(1, 2, 3, 4) // ✅ 修改陣列內容，記憶體地址不變

const y = { name: &apos;Mary&apos;, age: 30 }
y.name = &apos;Peter&apos; // ✅ 修改物件屬性，記憶體地址不變
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><author>Pei Wang</author></item><item><title>轉職工程師，然後呢？</title><link>https://peiwww-blog.netlify.app/posts/career-change-engineer-then-what</link><guid isPermaLink="true">https://peiwww-blog.netlify.app/posts/career-change-engineer-then-what</guid><description>2021 年轉職前端工程師上工後，過了四年後的 murmur。</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2021 年轉職前端工程師上工後，過了四年後的 murmur&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*bPFeg0H6b6SV85ZAIZf35g.jpeg&quot; alt=&quot;位於上野的東京都美術館&quot; /&gt;&lt;/p&gt;
&lt;p&gt;自從找到工作後，就一直想紀錄「文組轉職工程師」後的故事，關於如何轉職網路上有無數篇教學和 roadmap，但實際上轉職後的故事卻甚少有文章分享。既上一篇文章是六角直播班心得，這次直接快轉四年，回顧我的短暫職涯。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;背景&lt;/h3&gt;
&lt;p&gt;標準的非本科轉職工程師，日文系畢業，2021年時在家自學前端所需的語言、框架等知識，幸運地在年中趕上轉職潮紅利上岸，獲得第一份工作，也不知不覺待四年。&lt;/p&gt;
&lt;p&gt;回顧當初，雖然準備了作品集，但後來問同事（當初的面試官）其實也沒有看。也不是技術特別強的人，只有照本宣科+自己做作品勤練習，離實戰還差得遠，但應徵職位也偏向 junior，剛好我那時的程度符合職位標準，才幸運找不到一個月就上岸。&lt;/p&gt;
&lt;p&gt;但如果當初的程度，會切版、JS、只有自己做過 React+redux，但完全不懂什麼是 clean code、SOLID，拉到現在應該會被大洗臉一波吧…&lt;/p&gt;
&lt;h3&gt;現況&lt;/h3&gt;
&lt;p&gt;中型公司做了四年的前端開發，起初負責小範圍 issue &amp;amp; bug，後來接觸到功能設計、開發、寫測試等，從小專案的從頭開發到多框架的大型專案維護等都有實戰經驗，在這份工作中接觸到很多不同專案也奠基前端工程師應該要有的扎實基本功。&lt;/p&gt;
&lt;p&gt;幸運地進入氛圍不錯的團隊，從一開始沒有實務經驗時有 mentor，後期接觸複雜專案架構時也有 senior 從旁協助，工作時間彈性，有需要也可以申請遠端在家。&lt;/p&gt;
&lt;p&gt;讓我也對於工作型態有更多想像，可以不受地點時間限制，了解自己的喜好和 comfort zone。也意外發現其實自己很喜歡進辦公室有同事的感覺，沒有那麼喜歡 full remote 的自由，Hybrid 反而剛剛好，保持適當的距離和彈性。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*BifL2VAkV4M_yXpf-Otozg.jpeg&quot; alt=&quot;前往小豆島的渡輪&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;真實工程師日常&lt;/h3&gt;
&lt;h4&gt;技術工作&lt;/h4&gt;
&lt;p&gt;想象中的工程師應該整天都在螢幕前敲鍵盤吧？&lt;/p&gt;
&lt;p&gt;實際上可以&lt;strong&gt;專心寫 code 的時間&lt;/strong&gt;佔整天工時比例 30%~20%，一天工作 8 小時寫 code 只有 2~3 小時，純粹個人經驗分享，如果是 senior 以上程度很可能除了吃飯時間以外，都被塞滿會議。&lt;/p&gt;
&lt;p&gt;其他時間呢？&lt;/p&gt;
&lt;p&gt;開會、討論專案、寫文件、code review、回覆訊息等意外地佔據不少時間，當這些事情佔據你大部分的工作時間後，逐漸覺得單純寫 code 寫邏輯真的好快樂…&lt;/p&gt;
&lt;p&gt;「持續學習」也是工程師必須面對的一門課題，持續磨練不夠利的技術，學習不同的框架、語言、工具，也會和同事辦讀書會共讀。&lt;/p&gt;
&lt;p&gt;這題也讓我想到**「資訊焦慮」**，如果不頻繁關注社群，很容易會因為深怕錯過社群趨勢，而感到焦慮，不停刷著社群儲存文章。同時，無力感油然而生，儘管下班總是疲憊，無法打起精神再學習。真的很好奇社群上的大神是如何持續保持動力？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*k-MSYNvYsKjIV5ipe5nwHg.jpeg&quot; alt=&quot;近期的我（不能逃！！！）&quot; /&gt;&lt;/p&gt;
&lt;p&gt;學著冥想、運動，重新找回身體的專注主控權是我近期的課題。&lt;/p&gt;
&lt;h4&gt;技術之外&lt;/h4&gt;
&lt;p&gt;技術之外的溝通和釐清整理問題的能力。&lt;/p&gt;
&lt;p&gt;正因為工作有一半以上比例不是寫扣，是由會議、文件撰寫、需求釐清等佔據，更需要溝通與釐清問題的能力。甚至我個人覺得在技術達到標準線的情境下，溝通遠比技術重要很多。&lt;/p&gt;
&lt;p&gt;舉反例來說，看過身邊不善於溝通的案例（包括我），反覆來回確認需求，結果最後開發完成到測試，才發現和 PM 預想中有落差，不僅心理內耗，也浪費不少時間。&lt;/p&gt;
&lt;p&gt;每當聽到同事精準溝通和釐清對話的過程，才發覺到自己多麼冗言贅字，雖然都是用中文溝通，卻發覺到自己詞彙量太少，總是無法準確表達意思。&lt;/p&gt;
&lt;h4&gt;預料之外&lt;/h4&gt;
&lt;p&gt;意外發現喜歡/不喜歡的部分&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*In0d5pM4OenPYWm_IynQpA.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Like&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;喜歡單純撰寫功能邏輯，因為有明確目標不會太大改變&lt;/li&gt;
&lt;li&gt;喜歡這份工作可以讓我在家工作，在喜歡的時區內工作，不會被制式上下班限制&lt;/li&gt;
&lt;li&gt;意外喜歡不斷有新東西出現，可能偏奴（？）一成不變的環境會讓我懷疑人生&lt;/li&gt;
&lt;li&gt;工作以外的時間有餘裕可以發展興趣&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Dislike&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;溝通的比例意外的高，很多時候容易精神耗弱&lt;/li&gt;
&lt;li&gt;在家工作不一定代表 WLB，有時會因為不想中斷心流而一路持續到半夜&lt;/li&gt;
&lt;li&gt;「學不動了」的感覺隨著年紀越來越強烈&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;後悔嗎？&lt;/h3&gt;
&lt;p&gt;「你覺得你除了工作以外還有什麼？」離職後朋友問了我&lt;/p&gt;
&lt;p&gt;剛開始工作的幾年，因為冒牌者症候群作祟，下班、休假日我總是在追技術，看開發文件，深怕自己跟不上拖累團隊。直到最近一兩年，習慣手頭上會接觸到的工作挑戰，也有自己應對壓力的方式，逼著自己下班後散步運動，減少資訊焦慮，才慢慢開始有餘裕去想更未來的事情。&lt;/p&gt;
&lt;p&gt;離開工作後的現在，我總忍不住想回去以前的工作，總覺得寫扣手感在逐漸消失，會不會敏感度也消失？彷彿被空虛感淹沒的我，對於這個問題我什麼也答不出來。&lt;/p&gt;
&lt;p&gt;是因為工程師才這樣嗎？（別瞎掰好嗎）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/0*W3zAqMV_0dvyY3gg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;不後悔當初的職涯選擇，儘管在 AI 浪潮下，他是受惠者，同時也是首當其衝的被取代者，但至少這技能帶著我去了很多地方看見更多可能性（g0v / daodaoedu …）&lt;/p&gt;
&lt;p&gt;沒有一輩子都持續 programming 的自信，在這之外我還有什麼？是我之後想要探索的課題，目前還沒有可以抬頭挺胸說出的答案，期望有天會找到。&lt;/p&gt;
&lt;h3&gt;給 2026 還想轉職的你&lt;/h3&gt;
&lt;p&gt;如果看了以上勸世文，你還有轉職的想法&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;現實面的建議&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;培訓班相較之前少了很多，意指市場無法供給這麼多 junior 生存，是否可以接受找工作可能沒想像中容易&lt;/li&gt;
&lt;li&gt;實務上與 AI 協同開發也會拉高對工程師產出的標準&lt;/li&gt;
&lt;li&gt;雖然上面沒提到，剛入行工程師薪水可能沒你想像中的高，天花板高，但需要累積經驗後跳槽才可能疊高薪資&lt;/li&gt;
&lt;li&gt;如果是抱著不想做「和人有關」的工作入行，那溝通佔比可能會讓你失望，需要更精準有效的溝通&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果看完網路上所有的經驗分享，還是想轉職的話，那就去嘗試吧！&lt;/p&gt;
&lt;p&gt;頂多花費一年的時間發現不適合，再轉換跑道也不遲，學到腦裡的東西不會跑，說不定在人生的某個場合會再度派上用場，更何況現在是人人都在 vibe coding 的時代。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*LLFotnbKGCBf5e4Tr3vq4Q.jpeg&quot; alt=&quot;廣島縣尾島市&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;結語&lt;/h3&gt;
&lt;p&gt;也是說給自己聽的話&lt;/p&gt;
&lt;p&gt;四年的總結心得來說，前份工作奠基我會未來公司、工作的理想標準，怎樣的工作型態是自己喜歡的、怎樣的產品開發模式相對舒服、理想工作的追求、role model 等，腦中有了雛形，工作判斷標準也明確許多，相比較剛畢業時不懂自己要什麼好太多。&lt;/p&gt;
&lt;p&gt;希望在這行業還可多待上幾年，可以持續保有二十多歲的動力和好奇。未來規劃上，希望有機會開啟海外職涯的可能性，現在也持續尋找台灣 / 日本的前端工程師機會，雖然過程沒有想像中順利，但還是期望可以盡快落腳！回來報佳音！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*DoRKlOnm3xAVuaA2r_D8EA.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><author>Pei Wang</author></item><item><title>來自 Behance 的 NFT 詐騙?!</title><link>https://peiwww-blog.netlify.app/posts/behance-nft-scam</link><guid isPermaLink="true">https://peiwww-blog.netlify.app/posts/behance-nft-scam</guid><description>純粹紀錄信件來回始末，沒有任何錢財和人類受傷害</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;來自 Behance 的 NFT 詐騙?!&lt;/h2&gt;
&lt;p&gt;純粹紀錄信件來回始末，沒有任何錢財和人類受傷害&lt;/p&gt;
&lt;p&gt;因為近期在求職，才開始注意起信箱裡非電銷的各式信件，難得有純文字、沒有任何花俏圖片的信件吸引我的目光，何況是全英文&lt;/p&gt;
&lt;p&gt;大意上是說喜歡我放在 Behanca 上的作品，希望可以和我購買收藏原檔。信件如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*A-L1r6HC2KmItbqOIKT7AQ.png&quot; alt=&quot;the first mail&quot; /&gt;&lt;/p&gt;
&lt;p&gt;這件事情很可疑，直覺是詐騙，但也讓我好奇&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Behance??? 我都忘記帳號是什麼&lt;/li&gt;
&lt;li&gt;自卑心理：第一時間覺得自己以前做的東西沒價值，不會真的有人想要&lt;/li&gt;
&lt;li&gt;名字很像印度人，有鬼（歧視言論）&lt;/li&gt;
&lt;li&gt;先假定是詐騙，那手法和流程是什麼？要怎麼騙錢？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基於以上幾點好奇，於是我繼續靠著 AI 翻譯和他往來信件&lt;/p&gt;
&lt;h3&gt;先講結論&lt;/h3&gt;
&lt;p&gt;如果你也有收到類似信件，也想知道這是詐騙，還是真的千里馬遇到伯樂？想知道結果，對過程不好奇的話，可以直接看這段結論&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;以我的案例來說，100% 典型 NFT 詐騙&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;詐騙手法則是誘導到他建立的拍賣網站，希望你將作品鑄造成 NFT 上架，上架過程中會需要消耗高額的 gas fee（等同手續費），gas fee 就會進入他的口袋！（收取 0.1~0.05 eth 換算等同 200USDT，熊市換好像很划算 🙃）&lt;/p&gt;
&lt;p&gt;也有其他可能，商品上架過程中點擊到惡意連結，透過 XSS 竊取瀏覽器中的冷錢包，或是透過錢包地址竊取裡面所有財產等&lt;/p&gt;
&lt;p&gt;如果仍抱有希望，還是可以試著聯絡。出現以下關鍵字時：&lt;strong&gt;NFT、auction、web3、需要先付錢上架作品&lt;/strong&gt;，就可以 &lt;strong&gt;99.9%&lt;/strong&gt; 確認是相同詐騙案例&lt;/p&gt;
&lt;h3&gt;Behance 科普&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.behance.net/&quot;&gt;Behance&lt;/a&gt; 是 Adobe 旗下一個創作類型作品集的平台，有很多雇主會在上面找創作者，創作者也可以將作品上傳獲得更多曝光&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*YZKpRvrxtGAeJfuAaU6jHQ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;behance 是我大學想轉行銷設計時放作品集的平台，包括學生時期接案的校園海報設計、社群小編文案等，不管是哪個現在回頭看都十分青澀&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.behance.net/gallery/60336015/2017&quot;&gt;https://www.behance.net/gallery/60336015/2017&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*LBvCU5sjRo0tMJxI__i4SQ.png&quot; alt=&quot;甚至只有34觀看 XD&quot; /&gt;&lt;/p&gt;
&lt;p&gt;八年沒有更新的用戶為何會突然被看上呢？詢問 ai 後似乎是沒有持續更新的用戶不清楚自己的價值，更容易受騙上當&lt;/p&gt;
&lt;h3&gt;後續信件來回&lt;/h3&gt;
&lt;p&gt;回信詢問欣賞的作品是哪些，因為我連我放作品的帳號是哪個都差點找不到&lt;/p&gt;
&lt;p&gt;結果還真的傳了連結給我！大學做的東西好令人懷念，現在被社會化的我可能做不出來那麼 pure 的圖&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*_cjn2Ly-_069U9-PTk6fzA.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;信件中傳送作品連結，證明他真的知道我是誰。表示他非常希望可以購買作品，願意花 2eth，並說明他的背景，正在經營NFT藝術品拍賣，提供&lt;a href=&quot;https://www.genesisgallery.org/creator/ARTLOVER&quot;&gt;官網連結&lt;/a&gt;，也有經營 &lt;a href=&quot;https://www.instagram.com/creativeart691&quot;&gt;instagram&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;抱著 0.00001%為真的可能性，我去翻遍所有原始檔案可能在的位置。結果翻遍雲端也找不到當初的原檔，只剩下網路截圖的破爛畫質，如果真要賣也不可能 QQ。抱著了勝於無的心態，繼續透過 ai 翻譯信件對話&lt;/p&gt;
&lt;p&gt;透過 ai 協助部分如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;貼上信件內容，分析對方目的&lt;/li&gt;
&lt;li&gt;如果是詐騙，下一步會是什麼，回信關鍵字極度可能會出現哪些&lt;/li&gt;
&lt;li&gt;裝作我已經上鉤的釣魚回覆&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*ScD2Ft_Q2gXCYxIWkWJb_Q.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;大意為，我找不到原檔只剩下你看到的作品集本身，如果這樣你也要的話，那再請提供更多資訊讓我判斷是否可作為商用授權&lt;/p&gt;
&lt;p&gt;到這邊，因為不知道「作品如何被賣出」無法判斷哪一步會被騙錢&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*LMDSBx3dOewFoDmLgKCg8w.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;來哦 畫重點時間！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Echelon: A Curated Evolution of Art &amp;amp; Expression 標題虛無標秒&lt;/li&gt;
&lt;li&gt;it will be held in Edinburgh, UK, this year. 沒有詳細活動時間&lt;/li&gt;
&lt;li&gt;That&apos;s the link to the marketplace where I trade NFTs and where I have my art collection hosted 網站有很多 bug，API 沒接好，bottom 也沒放連結&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我進一步詢問更多資訊，關於官網背後的合法機構、合約授權細節、確認作品上傳不會有額外費用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Please provide:
- The legal entity name behind Echelon / Genesis Gallery
- A basic written agreement outlining usage rights, duration, and resale terms
- Confirmation that no minting, listing, gas, or platform fees are required from me at any stage
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很快地，兩個小時後回覆我&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*P2PeIKY98u5L5Y_unhM9kw.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;🤩 不演了，說白需要鍛造費 0.1eth&lt;/p&gt;
&lt;p&gt;我也沒這麼多錢給你騙，這個年代也要有錢才有被騙的資格 QQ&lt;/p&gt;
&lt;p&gt;到這裡基本上可以 100% 確定是詐騙，但基於武德還是想把戲演好演滿。我回信又問他，我沒錢付手續費可以買家出嗎&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*31p1InGrNFzJ13ZSZ_ADTQ.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;對方回覆如下，居然還可以殺價砍半？！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn-images-1.medium.com/max/800/1*U5u9PF6oEtfuCIc1s40c1A.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Last&lt;/h2&gt;
&lt;p&gt;到這邊也差不多可預想到後續結果，便不繼續信件往來。應該會持續鬼打牆說服我上傳作品吧&lt;/p&gt;
&lt;p&gt;紀錄這段信件對話，希望可協助遇到同樣開頭信件的人提高警覺&lt;/p&gt;
</content:encoded><author>Pei Wang</author></item><item><title>想學日文的初學者歡迎找我</title><link>https://peiwww-blog.netlify.app/posts/pro360recommdation</link><guid isPermaLink="true">https://peiwww-blog.netlify.app/posts/pro360recommdation</guid><description>pro360自我推薦</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;想學日文嗎？&lt;/h2&gt;
&lt;p&gt;朋友推薦我試試 PRO360，沒想到找到這麼棒的家教平台！
最近身邊不少朋友都有日文學習需求，朋友推薦我使用 PRO360 達人網接案，使用起來真的很方便。我是東吳大學日文系畢業，持有 JLPT N1 證照，也有兩年與日本客戶合作的實戰經驗，還曾在日本打工度假一年。可以協助初學者、中級學習者，或是準備日檢的同學，也提供日文會話練習，歡迎依需求量身訂製學習計畫！
有日文家教需求的朋友，歡迎直接透過我的 PRO360 專家頁面聯繫我👇&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.pro360.com.tw/service/697054&quot;&gt;🔗 點我查看專家檔案&lt;/a&gt;&lt;/p&gt;
</content:encoded><author>Pei Wang</author></item></channel></rss>