<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AC</title>
    <description>The latest articles on DEV Community by AC (@aryung).</description>
    <link>https://dev.to/aryung</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F456559%2F8e85f340-7a07-4340-8a67-c8c2aaf7fd3d.jpeg</url>
      <title>DEV Community: AC</title>
      <link>https://dev.to/aryung</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aryung"/>
    <language>en</language>
    <item>
      <title>為什麼我決定自己寫一個投資策略通知工具</title>
      <dc:creator>AC</dc:creator>
      <pubDate>Wed, 25 Jun 2025 07:18:11 +0000</pubDate>
      <link>https://dev.to/aryung/wei-shi-mo-wo-jue-ding-zi-ji-xie-ge-tou-zi-ce-lue-tong-zhi-gong-ju-49n3</link>
      <guid>https://dev.to/aryung/wei-shi-mo-wo-jue-ding-zi-ji-xie-ge-tou-zi-ce-lue-tong-zhi-gong-ju-49n3</guid>
      <description>&lt;p&gt;當一個身兼工程師與普通投資人的雙重身份時，我逐漸發現一個共同的痛點：市面上的工具雖然功能強大，但對於小額投資者或長期策略愛好者來說，卻往往充滿了不必要的複雜功能。尤其當我身處於繁忙的工作日常中，時間有限，我只想找個簡單實用的工具，能有效提醒我關心的價格與策略。&lt;/p&gt;

&lt;h2&gt;
  
  
  TradingView 等工具的吸引力與限制
&lt;/h2&gt;

&lt;p&gt;大部分投資工具都會提到像是 TradingView 這種強大的多功能平台，它確實令人驚豔，無論是技術指標還是圖表自訂，它幾乎都能滿足每個投資高手的需求。的確，對專業投資者來說，這工具提供了所有可能的選項，讓他們掌握每一分數據的變化。&lt;/p&gt;

&lt;p&gt;然而，當我試著從一般投資人的角度使用這類工具時，我發現了兩個問題：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;設定通知功能需要付費，對於只需要訂閱「單項服務」的用戶來說並不經濟。
工具有過多高階功能，設置時操作繁瑣。&lt;/li&gt;
&lt;li&gt;對於我這樣非專業、僅希望使用核心功能而避免不必要支出的人來說，這是一個重大挑戰。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  為什麼免費選項還是不足夠？
&lt;/h2&gt;

&lt;p&gt;在探索免費的工具選項時，我當然嘗試過 Yahoo Finance、Google Finance，甚至券商自己推出的 APP。不可否認，它們確實提供了基礎的證券價格查詢與技術分析能力。但，這些工具的通知功能要不是完全沒有，就是條件設定極為限制，難以進一步提升使用效率。&lt;/p&gt;

&lt;p&gt;與其將時間浪費在平台之間切換，當我思考這些缺失時，我想到了一個簡單的解決方式，既然我是工程師，為什麼我不自己設計一個呢？&lt;/p&gt;

&lt;h2&gt;
  
  
  我的理想工具
&lt;/h2&gt;

&lt;p&gt;在動手打造自己的投資策略通知工具之前，我列出了幾個需求重點：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;條件定制化：可以簡單設置各種價格條件。&lt;/li&gt;
&lt;li&gt;主動觸發通知：讓使用者在條件達成時收到通知，例如透過 Email 或是 Line。&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;h2&gt;
  
  
  開發過程中的挑戰
&lt;/h2&gt;

&lt;p&gt;在實際執行時，我最初面臨的困難之一是如何收集即時數據並保持系統的穩定性。例如，如何從金融市場的 API 獲取可靠資料，並在觸發條件時保證通知的即時性，是一項技術上的挑戰。此外，簡單設計用戶端界面，確保普通用戶也能快速上手，也需要花費不少精力。&lt;/p&gt;

&lt;h2&gt;
  
  
  結語
&lt;/h2&gt;

&lt;p&gt;現在的我，雖然每日依舊忙碌，但有了這個小工具後，投資生活中的煩惱少了許多。不僅如此，我還因此建立了社群與其他使用者交流，我發現也許我們追求的並不是投資大賺，而是一份效率帶來的從容與自由。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>TradingView 平替版的想法</title>
      <dc:creator>AC</dc:creator>
      <pubDate>Mon, 02 Jun 2025 14:53:31 +0000</pubDate>
      <link>https://dev.to/aryung/tradingview-ping-ti-ban-de-xiang-fa-j7</link>
      <guid>https://dev.to/aryung/tradingview-ping-ti-ban-de-xiang-fa-j7</guid>
      <description>&lt;h2&gt;
  
  
  楔子
&lt;/h2&gt;

&lt;p&gt;為什麼我決定自己寫一個投資策略通知工具&lt;/p&gt;

&lt;p&gt;身為一個工程師，我一直都很喜歡 TradingView 這個平台。說真的，它的功能實在太完整了——各種技術指標、自訂腳本、回測功能、社群分享，幾乎你想得到的投資分析工具它都有。介面設計也很直觀，用起來真的很順手。&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;p&gt;其實現在免費的看線圖工具也不少，Yahoo Finance、Google Finance，甚至券商自己的APP，基本的技術分析功能都有。真正缺的就是那個「主動通知」的功能。&lt;/p&gt;

&lt;p&gt;於是我開始思考：既然我是工程師，為什麼不自己寫一個呢？&lt;/p&gt;

&lt;p&gt;需求很明確：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;可以設定簡單的價格或技術指標條件&lt;/li&gt;
&lt;li&gt;達成條件時自動發送通知（Email或LINE都行）&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;所以，就這樣決定了。就來動手寫一個屬於自己的投資策略通知工具吧！&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>software</category>
      <category>notifications</category>
    </item>
    <item>
      <title>寫給想跳坑的 JS 新手(Part II): coding style</title>
      <dc:creator>AC</dc:creator>
      <pubDate>Tue, 22 Feb 2022 04:03:45 +0000</pubDate>
      <link>https://dev.to/aryung/xie-gei-xiang-tiao-keng-de-js-xin-shou-part-ii-19on</link>
      <guid>https://dev.to/aryung/xie-gei-xiang-tiao-keng-de-js-xin-shou-part-ii-19on</guid>
      <description>&lt;p&gt;&lt;a href="https://betterprogramming.pub/why-i-fell-in-love-with-ramda-and-functional-programming-in-javascript-797c070133b0" rel="noopener noreferrer"&gt;圖片來源&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  楔子
&lt;/h1&gt;

&lt;p&gt;上一篇提到了 map filter reduce，這三個是最常見的也是最常用的使用方法，為了讓「程式碼」易讀，可以改造一下長相方便讓人看的懂在做什麼，至於怎做的就交給專業的人去優化改善就好。&lt;/p&gt;

&lt;p&gt;所以先至少讓別人看的懂自已在寫的東西優先，試想看看，如果你是看 code 的人，「看的懂」vs 「要花一點點時間去細看」這二種，哪一種比較好讀? 先做到至少菜端出來看起來想吃，至於好不好吃就再說囉。嘿嘿嘿&lt;/p&gt;

&lt;h1&gt;
  
  
  程式碼的味道
&lt;/h1&gt;

&lt;p&gt;用個最簡單的例子，把一個數字 x3 之後再 +1，但當數字是 5時就返回原值&lt;/p&gt;

&lt;p&gt;f(1) = 1 * 3 + 1&lt;/p&gt;

&lt;p&gt;f(5) = 5&lt;br&gt;
來寫出這個 f 但我們用不同的長相來看看&lt;/p&gt;
&lt;h2&gt;
  
  
  撒尿牛丸全部攪在一起
&lt;/h2&gt;

&lt;p&gt;這個應該是大部份的程式羅輯，就是把資料拆開來一個一個處理。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function f(x) {
   if(x !== 5) {
      return 3 * x + 1
   } else {
      return x
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  點點點到天邊
&lt;/h2&gt;

&lt;p&gt;這個 coding-style 就像你打開一個箱子把東西拿出來，「動作」後再放回去，依序處理。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let box = x =&amp;gt; ({f: f =&amp;gt; box(f(x)), x})
box(1)
  .f(multi3)
  .f(add1) // {f: ƒ f(), x: 4}
box(5)
  .f(multi3)
  .f(add1) // {f: ƒ f(), x: 6}

// 運算的 function 參考用
function multi3(x) {
  if(x !== 5) {
    return 3 * x
  } else {
    return x
  }
}

function add1(x) {return x+1}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  按造步驟一步一步寫
&lt;/h2&gt;

&lt;p&gt;這個版本和上面的版本意思差不多，就是把資料塞進去，接下來塞一堆要處理的功能。(不過也有另一派是把資料放最後，這個以後有空再討論囉)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let box = x =&amp;gt; f =&amp;gt; g =&amp;gt; f(g(x))
box(1)(multi3)(add1) // 4
box(5)(multi3)(add1) // 6

// 運算的 function 參考用
function multi3(x) {
  if(x !== 5) {
    return 3 * x
  } else {
    return x
  }
}

function add1(x) {return x+1}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>functional</category>
      <category>javascript</category>
      <category>beginners</category>
      <category>ramda</category>
    </item>
    <item>
      <title>寫給想跳坑的 JS 新手(Part I): map filter reduce</title>
      <dc:creator>AC</dc:creator>
      <pubDate>Mon, 21 Feb 2022 04:00:46 +0000</pubDate>
      <link>https://dev.to/aryung/xie-gei-xiang-tiao-keng-de-js-xin-shou-part-i-22pn</link>
      <guid>https://dev.to/aryung/xie-gei-xiang-tiao-keng-de-js-xin-shou-part-i-22pn</guid>
      <description>&lt;h1&gt;
  
  
  楔子
&lt;/h1&gt;

&lt;p&gt;身邊有些朋友有不少會想試著寫寫程式，常常坊間書翻一翻看到物件的東西，很快的就把書放下了，慢慢的也就失去興趣了。&lt;/p&gt;

&lt;p&gt;但其實怎讓這些朋友開始可以有些動手做也能跑出一些結果，那種成就感會讓人慢慢的親近寫程式(coding)，不可否認物件導向語言統治了軟體界，但光要先學會這個觀念可能就讓人却步了。&lt;/p&gt;

&lt;p&gt;以前有部電影「張三峰」有句台詞，怎「張無忌」問，怎學會這部武功?「張三峰」說:「忘掉就好了」。&lt;/p&gt;

&lt;p&gt;其實函數式語言的「入門」蠻簡單的，就像小時候的數學，函數吃一些變數，跑出來一個結果，用這個方式寫寫東西就可以做一些小實務的作品，也很有成就感。&lt;/p&gt;

&lt;p&gt;就讓我們試試吧..&lt;/p&gt;

&lt;h1&gt;
  
  
  Declarative 宣告式 vs. Imperative 命令式
&lt;/h1&gt;

&lt;p&gt;命令式(Imperative)白話文就是要用電腦的角度去思考，怎把答案做出來。&lt;/p&gt;

&lt;p&gt;如果相要把一連串的資料去掉一些特定值(前提條件就要知道何謂 for-loop)，示範的程式碼大概會長成下面的樣子&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function filter(array) {
  let newArray = []
  for (let index = 0; index &amp;lt; array.length; index++) {
    const element = array[index]
    if (element !== null &amp;amp;&amp;amp; element !== undefined) {
      newArray[newArray.length] = element
    }
  }
  return newArray
}
// use case:
filter([0, 1, undefined, 2, null, 3, 'four', ''])
// [0, 1, 2, 3, 'four', '']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;但如果是所謂的宣告(Declarative)式，就是使用 filter 函數(知道 map/filter/reduce..)，知道 filter 是吃一個「判斷(predicate)」的方法，細部的執行不太需要去了解，程式碼大概就會長的像下面的例子&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function predicate(element) {
  // 判斷示 回傳 true or false
  return (element !== 3)
}

[0,1,2,3,4,5].filter(predicate)
// [0,1,2,4,5]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;也可以用 map 來解決這個問題，map 的觀念就是每個東西拿出來檢查，檢查完再放回去(要看做記號或處理之類的)，map 也是吃一個函數(要做的事)，比較特別的是當條件 3 時要回傳 0，它不像 filter 是過濾完的結果，map 是檢查完都有回傳值。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function predicate(element) {
  // 判斷示 要做什事 要回傳什麼
  if(element !== 3) {
    return element
  } else { 
    return 0
  }
}

[0,1,2,3,4,5].map(predicate)
// [0,1,2,0,4,5]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;那如果想要把所有的資料加總呢?就使用 reduce，這個方法有點像捍麵一樣，隨著每個數值桿，再和前面上次「桿完」的數值做處理。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// 0 為初始值，acc 為上次運算的結果，cur 為這次的運算值
[1,2,3,4].reduce((acc, cur) =&amp;gt; {
  return acc + cur
}, 0)
// 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上面的三種方式可以用一張圖來表示&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1lu2b5k4k9pd9oq93z6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd1lu2b5k4k9pd9oq93z6.jpeg" alt="Image description" width="785" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>functional</category>
      <category>ramda</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
