<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Chiffoncake's Blog</title><link>https://blog.chichichichichiffoncake.work/</link><description>Recent content on Chiffoncake's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Tue, 02 Jun 2026 11:53:09 +0800</lastBuildDate><atom:link href="https://blog.chichichichichiffoncake.work/index.xml" rel="self" type="application/rss+xml"/><item><title>Nori 筆記 (3) Assignment 2 - Rendering Algorithm</title><link>https://blog.chichichichichiffoncake.work/posts/20260602-nori-3/</link><pubDate>Tue, 02 Jun 2026 11:53:09 +0800</pubDate><guid>https://blog.chichichichichiffoncake.work/posts/20260602-nori-3/</guid><description>&lt;h2 id="assignment-2-monte-carlo-sampling-and-ambient-occlusion"&gt;Assignment 2: Monte Carlo Sampling and Ambient Occlusion&lt;/h2&gt;
&lt;h3 id="part-2-two-simple-rendering-algorithms"&gt;Part 2: Two Simple Rendering Algorithms&lt;/h3&gt;
&lt;p&gt;作業 2 的後半部很明顯感受到比前一篇 &lt;a href="../20260530-nori-2/"&gt;warping function&lt;/a&gt; 還要簡單，畢竟這邊只要寫 code 就好，之前是一堆微積分跟機率。&lt;/p&gt;
&lt;h4 id="part-21-point-lights"&gt;Part 2.1 Point Lights&lt;/h4&gt;
&lt;p&gt;總之就是把題目敘述給的公式寫成程式碼。&lt;/p&gt;
&lt;p&gt;值得注意的幾個部份，第一個是 $\cos\theta$ 的計算，可以使用 &lt;code&gt;Frame::cosTheta()&lt;/code&gt; 和 &lt;code&gt;Frame::toLocal()&lt;/code&gt; 來方便求得。第二個是題目敘述有提到的用 shadow ray query 來計算 visibility。&lt;/p&gt;
&lt;p&gt;記錄一下踩到的雷。&lt;code&gt;Ray3f&lt;/code&gt; 這個 class，我原先以為他只有 ray origin 跟 ray direction，結果後來才發現他有 &lt;code&gt;mint&lt;/code&gt; 跟 &lt;code&gt;maxt&lt;/code&gt; 兩個參數來決定 ray 的延伸區段。可以在 &lt;code&gt;include/nori/ray.h&lt;/code&gt; 裡面看到 &lt;code&gt;struct TRay&lt;/code&gt; 的 constructor。要用 shadow ray query 的話，&lt;code&gt;mint&lt;/code&gt; 不能設定成 0，否則若起始點有 mesh，就有可能因為浮點數誤差而讓 ray 跟起始點的 mesh 相交；而 &lt;code&gt;maxt&lt;/code&gt; 也不能單純設光源到物體的距離，原理相同。兩者都要有一個 epsilon 的誤差。&lt;/p&gt;</description></item><item><title>Nori 筆記 (2) Assignment 2 - Warping Functions</title><link>https://blog.chichichichichiffoncake.work/posts/20260530-nori-2/</link><pubDate>Sat, 30 May 2026 21:39:21 +0800</pubDate><guid>https://blog.chichichichichiffoncake.work/posts/20260530-nori-2/</guid><description>&lt;h2 id="assignment-2-monte-carlo-sampling-and-ambient-occlusion"&gt;Assignment 2: Monte Carlo Sampling and Ambient Occlusion&lt;/h2&gt;
&lt;p&gt;傳送門：&lt;a href="https://wjakob.github.io/nori/#pa2"&gt;https://wjakob.github.io/nori/#pa2&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="part-1-monte-carlo-sampling"&gt;Part 1: Monte Carlo Sampling&lt;/h3&gt;
&lt;p&gt;對電腦而言，產生一個 0 到 1 之間的 random number 是很常見的操作，但 computer graphics 的領域中，我們經常會需要從各種形狀中做 uniform sampling，或甚至是做 non-uniform sampling。這時我們就需要 warping function 的幫忙，把一個（或一些）random variable 轉換成另一個（或一些）我們想要的 distribution。&lt;/p&gt;
&lt;p&gt;這個部份的作業是要寫 warping function，但是大一微積分、大二機率與統計這些必修課都已離我太遠，因此在寫這份作業時我經常透過數學的直覺與 AI 的輔助來亂搞數學符號。如果有明顯錯誤或數學上不嚴謹的地方，歡迎寫信或傳訊息與我討論。&lt;/p&gt;
&lt;h4 id="warpsquaretouniformdisk"&gt;&lt;code&gt;Warp::squareToUniformDisk&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;這個 subtask 是要用 uniform square 來轉換成 uniform disk。也就是說，uniform random 產生 $x, y$ 兩個值，並透過 $f(x, y), g(x, y)$ 兩個函數進行 warping，所產生的值要相當於在 disk 上進行 uniform random sampling。&lt;/p&gt;
&lt;figure&gt;
&lt;img src="./warp-disk-points.png"&gt;
&lt;figcaption&gt;作業說明中的 uniform disk 示意圖&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h5 id="source-distribution"&gt;Source distribution&lt;/h5&gt;
&lt;p&gt;$$
\begin{gather*}
x \leftarrow U(0, 1) \\
y \leftarrow U(0, 1)
\end{gather*}
$$&lt;/p&gt;</description></item><item><title>Nori 筆記 (1) Introduction &amp; Assignment 1</title><link>https://blog.chichichichichiffoncake.work/posts/20260527-nori-1/</link><pubDate>Wed, 27 May 2026 13:45:52 +0800</pubDate><guid>https://blog.chichichichichiffoncake.work/posts/20260527-nori-1/</guid><description>&lt;h2 id="nori---an-educational-ray-tracer"&gt;Nori - an educational ray tracer&lt;/h2&gt;
&lt;p&gt;前幾天看到友人 @anj226 的 IG 限時動態，他發了一張看起來是 ray tracing 產生的圖。由於我一直很嚮往電腦圖學的知識，因此忍不住回覆他的限時動態進一步詢詢問。他說，這是 EPFL 的 &lt;a href="https://wjakob.github.io/nori/"&gt;Nori&lt;/a&gt;，是一個教學用的 project。&lt;/p&gt;
&lt;figure&gt;
&lt;img src="./nori-homepage.png"&gt;
&lt;figcaption&gt;Nori 的網站&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;這讓我想起大二的寒假在 Coursera 上自學機器學習基石，以及大三旁聽作業系統時自我練習 xv6 作業。總之，希望我能複製同樣的模式自學 Nori，但實際上究竟能走多遠，我也不知道。就看這個標題能更新幾篇文章吧。&lt;/p&gt;
&lt;h2 id="assignment-1-downloading-and-compiling-nori"&gt;Assignment 1: Downloading and Compiling Nori&lt;/h2&gt;
&lt;h3 id="compilation"&gt;Compilation&lt;/h3&gt;
&lt;p&gt;第一份作業是環境準備。作業說明中提及了 Git 的使用，然後是說明怎麼編譯程式碼。&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;錯誤嘗試（已折疊）&lt;/summary&gt;
&lt;p&gt;下載 repo：&lt;a href="https://github.com/wjakob/nori"&gt;https://github.com/wjakob/nori&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我的電腦系統使用 Arch Linux，安裝了 &lt;code&gt;cmake&lt;/code&gt; 後，照著作業說明來編譯程式碼，但因為 Nori 的 dependency 有許多陳舊的 library，裡面的 cmake 檔案使用了舊的格式，因此需要手動加上 &lt;code&gt;-DCMAKE_POLICY_VERSION_MINIMUM=3.5&lt;/code&gt; 的 flag 才能順利編譯。另外，&lt;code&gt;tbb&lt;/code&gt; 這個 extension 因為 C++ 版本過舊，編譯時也需要加上 &lt;code&gt;-DCMAKE_CXX_FLAGS=&amp;quot;-Wno-error=changes-meaning&amp;quot;&lt;/code&gt; 的 flag 才能順利編譯。最終使用的 command 如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cmake -DCMAKE_POLICY_VERSION_MINIMUM&lt;span class="o"&gt;=&lt;/span&gt;3.5 -DCMAKE_CXX_FLAGS&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-Wno-error=changes-meaning&amp;#34;&lt;/span&gt; ..
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make -j
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;/details&gt;
&lt;p&gt;Fork repo：&lt;a href="https://github.com/cs440-epfl/nori-base-2026"&gt;https://github.com/cs440-epfl/nori-base-2026&lt;/a&gt;&lt;/p&gt;</description></item><item><title>更新 Hugo Theme</title><link>https://blog.chichichichichiffoncake.work/posts/20260516-new-theme/</link><pubDate>Sat, 16 May 2026 22:23:17 +0800</pubDate><guid>https://blog.chichichichichiffoncake.work/posts/20260516-new-theme/</guid><description>&lt;p&gt;就像期中考前的大學生會開始整理宿舍一樣，我好像差不多也到了整理這個部落格的時間了。&lt;/p&gt;
&lt;p&gt;老實說，多年前老友架設他的 &lt;a href="https://blog.jameshsu.csie.org/"&gt;個人部落格&lt;/a&gt; 時，我就想效法他這樣不時寫點文章記錄自己的想法與生活，或是一些經過淬煉的思想結晶。然而萬事起頭難，尤其我又想要做完充足的研究後把網站架構一次搞定，所以究竟該選擇哪個框架，選了框架之後又該選擇哪個 theme，這些問題都使我遲遲沒有著手搞網站。終於，在兩年前替實驗室的 Overleaf 開發新功能時，覺得真的該動手了，於是隨便選了 Hugo 和 ananke theme，也沒做任何的 customization，目的純粹只是為了搞出一個網站，把那兩篇 Overleaf 相關的文章 &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; 寫了。&lt;/p&gt;
&lt;p&gt;接著的兩年間，雖然也累積了不少可以寫文章的題材，但一直都沒有真的動手寫第三篇。&lt;/p&gt;
&lt;p&gt;最近因為一些緣故，閒到終於又有空回顧這些 TODO，所以就回來好好挑了一個 theme 並認真整理網站。我想，這樣我將沒有藉口再拿「網站施工中」來允許自己懶得寫文章了吧。應該🥲&lt;/p&gt;
&lt;h2 id="隨手筆記"&gt;隨手筆記&lt;/h2&gt;
&lt;p&gt;隨手筆記一下。在評估是否要使用 Hugo 時，最大的心理壓力來自於每個 theme 的設定檔，甚至是資料夾結構都可能不同。選擇了一個 theme 之後，假如不滿意而想要換 theme，即面臨學習新 theme 的設定檔和手動 migrate 文章格式的成本。這樣的性質，讓我想要一次挑到外觀及功能最滿意的 theme，避免未來想要更換 theme 的可能性。&lt;/p&gt;
&lt;p&gt;選定了 theme 後，學習該 theme 的使用方式也是一個小成本。主要原因是每個 theme 的文件都是該開發者自行撰寫，說明文件詳盡程度不一，也沒有統一的格式來確保想找查的功能一定找得到。但索幸現在是個 AI 發達的時代，點開 theme 的 GitHub 頁面，可以隨時從右上角點選 Ask Copilot 的功能來詢問任何問題。就算有想要的功能沒有被 theme 實作，也可以透過 AI 來輔助自己開發。隨便唱幾個 prompt，想要飛天遁地全部都做得到。&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="../20240212-overleaf/"&gt;第一篇&lt;/a&gt; &lt;a href="../20240213-overleaf-2/"&gt;第二篇&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>自架 Overleaf (2)</title><link>https://blog.chichichichichiffoncake.work/posts/20240213-overleaf-2/</link><pubDate>Tue, 13 Feb 2024 10:44:01 +0800</pubDate><guid>https://blog.chichichichichiffoncake.work/posts/20240213-overleaf-2/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;這篇是接續著前一篇「自架 Overleaf (1)」，要帶大家來幫自架的 Overleaf 加一些好料的。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;（這個部落格現在真的是很醜，反正未來的某個時間一定會改善的，請眾讀者原諒。）&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="正文"&gt;正文&lt;/h2&gt;
&lt;p&gt;先幫大家複習一下 Overleaf community edition 有哪些不方便的地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;註冊新使用者很不方便&lt;/li&gt;
&lt;li&gt;admin panel 資訊和功能很少&lt;/li&gt;
&lt;li&gt;project 新增協作者時不會顯示「接受邀請的連結」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下來將以這些不便之處為出發點，帶大家來 patch 這些功能。啊因為寫的當下有些東西我也還沒想過要怎麼改，所以沒有保證每個提出來的問題都會解決（不負責任的人）&lt;/p&gt;
&lt;p&gt;本篇我所修改過的 code 都可以在 &lt;a href="https://github.com/ktpss95112/overleaf-toolkit"&gt;我的 repo&lt;/a&gt; 找到。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="首次登入即自動註冊的功能"&gt;「首次登入即自動註冊」的功能&lt;/h3&gt;
&lt;p&gt;既然要加新功能，那我們就得要直接挖進 Overleaf server 的 source code 了。把 &lt;a href="https://github.com/overleaf/overleaf"&gt;Overleaf 的 repo&lt;/a&gt; clone 下來，發揮一點逆向工程的精神（其實就只是讀別人 source code 而已講那麼高級），可以發現幾個我們有興趣的檔案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;services/web/app/src/Features/Authentication/AuthenticationManager.js&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;authenticate()&lt;/code&gt; 函數負責處理使用者的登入請求，會呼叫 &lt;code&gt;_checkUserPassword()&lt;/code&gt; 來檢查帳密&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_checkUserPassword()&lt;/code&gt; 試圖從 mongodb 裡找到該使用者的登入資訊並比對&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;services/web/app/src/Features/User/UserRegistrationHandler.js&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;這個檔案提供了註冊新使用者的 &lt;code&gt;registerNewUser()&lt;/code&gt; 函數&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以看起來，我們只要在 &lt;code&gt;AuthenticationManager._checkUserPassword()&lt;/code&gt; 裡面加上「找不到使用者的話就呼叫 &lt;code&gt;UserRegistrationHandler.registerNewUser()&lt;/code&gt; 幫他註冊」的功能就解決了。&lt;/p&gt;
&lt;p&gt;仔細讀了一下 &lt;code&gt;AuthenticationManager.js&lt;/code&gt;，發現在這個檔案裡完全沒有 async/await 或 Promise 的存在，全部都是 &lt;a href="https://dev.to/jerrycode06/callback-hell-and-how-to-rescue-it-ggj"&gt;callback 地獄&lt;/a&gt;。我們要對 &lt;code&gt;AuthenticationManager.js&lt;/code&gt; 做的修改是「在一進 &lt;code&gt;_checkUserPassword()&lt;/code&gt; 就檢查使用者存不存在，不存在的話幫他註冊」，也就是說我們只想加一個註冊的邏輯，不想改他的驗證邏輯。這時我們遇到了幾個語法上的選擇：&lt;/p&gt;</description></item><item><title>自架 Overleaf (1)</title><link>https://blog.chichichichichiffoncake.work/posts/20240212-overleaf/</link><pubDate>Mon, 12 Feb 2024 16:19:04 +0800</pubDate><guid>https://blog.chichichichichiffoncake.work/posts/20240212-overleaf/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;感謝吾友 &lt;a href="https://jameshsu.csie.org/"&gt;James Hsu&lt;/a&gt; 頻頻 &lt;a href="https://github.com/ktpss95112/my-blog/issues/1#issue-2098927637"&gt;掛念&lt;/a&gt; 鄙人的部落格，期望以此文感謝他對我的重視。&lt;/p&gt;
&lt;p&gt;在此也先為了這施工中的醜醜部落格道歉。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="正文"&gt;正文&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.overleaf.com"&gt;Overleaf&lt;/a&gt; 是一個線上的 LaTeX 編輯器，不需要自己搞複雜的環境就可以寫 LaTeX，而且還支援像 HackMD 或是 Google Docs 那種多人同時連線編輯的功能，但 Overleaf 免費版的功能有一定的限制，我自己最明顯感受到的限制是同一個 project 只能加一位協作者，不然就是得要開啟 sharing link。試想大部分的課程 project 都要求 3 人一組，如果要用 overleaf 的話就只能開 sharing link，一想到如果連結不小心外流的話東西就有可能被刪光光，緊張到都睡不著了（才沒有）。自架的 overleaf 就沒有這種人數上限，有多少朋友就加多少協作者，沒問題的。&lt;/p&gt;
&lt;p&gt;本篇我所修改過的 code 都可以在 &lt;a href="https://github.com/ktpss95112/overleaf-toolkit"&gt;我的 repo&lt;/a&gt; 找到。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="做功課overleaf-community-edition"&gt;做功課：Overleaf Community Edition&lt;/h3&gt;
&lt;p&gt;Overleaf 的 GitHub 上有兩個 repo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/overleaf/overleaf"&gt;overleaf&lt;/a&gt;: Overleaf 整個服務的 source code&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/overleaf/toolkit/"&gt;overleaf-toolkit&lt;/a&gt;: 自架 Overleaf 的便利工具&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 Overleaf 的 &lt;a href="https://github.com/overleaf/overleaf/wiki/Hardware-Requirements"&gt;Wiki&lt;/a&gt; 上有關於硬體設備的建議：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最低要求 2 core 和 3 GB memory
&lt;ul&gt;
&lt;li&gt;&amp;hellip; 大約支援 5 個使用者同時在線&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;每 5~10 個使用者大約需要 1 core 和 1 GB memory，「大約」而已&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LaTeX 是一個 single threaded program，所以編譯 PDF 的速度取決於單一 cpu 的強度&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&amp;hellip; 還是存在著一種可能性是自架的 Overleaf 的編譯速度比 overleaf.com 還來得慢&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;總而言之，Overleaf 的 Wiki 上有很多重要的資訊可以仔細看。這邊不會全部介紹。&lt;/p&gt;</description></item><item><title>My First Post</title><link>https://blog.chichichichichiffoncake.work/posts/20231021-first-post/</link><pubDate>Sat, 21 Oct 2023 00:45:04 +0800</pubDate><guid>https://blog.chichichichichiffoncake.work/posts/20231021-first-post/</guid><description>&lt;h2 id="first-post"&gt;First Post&lt;/h2&gt;
&lt;p&gt;This website is still work in progress &amp;hellip;&lt;/p&gt;
&lt;p&gt;Big thanks to &lt;a href="https://blog.jameshsu.csie.org/"&gt;James Hsu&lt;/a&gt; for keeping pushing me to work on my personal website.&lt;/p&gt;</description></item><item><title>About</title><link>https://blog.chichichichichiffoncake.work/pages/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.chichichichichiffoncake.work/pages/about/</guid><description>&lt;p&gt;蔡奇夆，臺大資工系 B07，臺大資工所 R11。新竹人。&lt;/p&gt;
&lt;p&gt;熱愛電腦與程式的愛貓人士。偶爾做點蛋糕跟手工藝。&lt;/p&gt;
&lt;p&gt;希望能成為會寫文章的人，為世界留下些許正面的影響力。&lt;/p&gt;</description></item></channel></rss>