<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel><title>山城止境</title>
<description>儘管目前是自己亂七八糟的筆記</description>
<generator>Miniblog.Core</generator>
<link>https://soon.azurewebsites.net/</link>
<item>
  <title>長草長出了機器人</title>
  <link>https://soon.azurewebsites.net/blog/comment_bot/</link>
  <description>&lt;p&gt;下午工作時突然看到手機不停跳通知&lt;br&gt;這個一向只有我自己在自言自語的部落格，居然有人留言！&lt;/p&gt;
&lt;p&gt;...... 瞟了一眼，嗯，果然是機器人😂😂😂&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/iMrw2VP.png" alt="comment from bot" style="padding: 5px; border: 3px dashed lightgray;border-radius:15px;" /&gt;&lt;/p&gt;
&lt;p&gt;這個機器人幾乎在我的每一篇舊文下都留了 3～6 則毫無意義的留言&lt;br&gt;本來想說要不要留下來做紀念，後來覺得還是&lt;br&gt;我寂寞寂寞就好，就全部刪掉了&lt;/p&gt;
&lt;p&gt;　&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;P.S. 有空來做個簡單的留言驗證好了&lt;ul&gt;
&lt;li&gt;P.S. 雖然這麼說，但我前面文章也數次許下類似的承諾&lt;ul&gt;
&lt;li&gt;P.S. 剛好趁著刪機器人留言稍微又 review 了一下自己以前的廢文&lt;ul&gt;
&lt;li&gt;P.S. 現在沒人在用 P.S. 這種方式寫文章了吧 (老&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>Soon Yang</author>
  <category>閒聊</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/comment_bot/</guid>
  <pubDate>Thu, 07 Sep 2023 20:12:47 GMT</pubDate>
</item>
<item>
  <title>[Python] Miniconda</title>
  <link>https://soon.azurewebsites.net/blog/miniconda/</link>
  <description>&lt;p&gt;剛接觸 miniconda，先開一篇預留點筆記位置~&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.conda.io/projects/conda/en/stable/commands/index.html"&gt;https://docs.conda.io/projects/conda/en/stable/commands/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/42309333/explanation-of-different-conda-channels"&gt;https://stackoverflow.com/questions/42309333/explanation-of-different-conda-channels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Python virtualenv and venv dos and don’ts&lt;br&gt;&lt;a href="https://www.infoworld.com/article/3306656/python-virtualenv-and-venv-dos-and-donts.html"&gt;https://www.infoworld.com/article/3306656/python-virtualenv-and-venv-dos-and-donts.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>Soon Yang</author>
  <category>miniconda</category>
  <category>python</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/miniconda/</guid>
  <pubDate>Wed, 16 Aug 2023 19:37:21 GMT</pubDate>
</item>
<item>
  <title>[Godot] Your first 3D game 練習</title>
  <link>https://soon.azurewebsites.net/blog/godot_first_3d_game/</link>
  <description>&lt;p&gt;前一個 2D Game 初步照著教學 step by step 完成了&lt;/p&gt;
&lt;p&gt;儘管其中還有許多不明所以的地方&lt;br&gt;例如一些計算速率的&lt;strong&gt;數學問題&lt;/strong&gt; &lt;del&gt;不會就是不會&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;因為幾乎還沒啃過官方文件就直接進入了新手範例教學&lt;br&gt;整體編輯器、Godot 元件都還有大量未知的部分&lt;/p&gt;
&lt;p&gt;嘗試了匯出 Windows、Html5 平台檔案出來執行&lt;br&gt;也看到 Build 功能中仍有許多水很深的設定需要了解&lt;/p&gt;
&lt;p&gt;無論如何，先繼續往下一個 3D 教學前進 ...&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;教學網址&lt;br&gt;&lt;a href="https://docs.godotengine.org/en/stable/getting_started/first_3d_game/index.html"&gt;https://docs.godotengine.org/en/stable/getting_started/first_3d_game/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;這次學乖了先切換了一下 en 語系，不幸的是上面明確地寫了這份文件是 outdated，還沒有針對 4.1 版做更新。&lt;/p&gt;
&lt;p&gt;沒關係我們還是先照著試試看：&lt;/p&gt;
&lt;h3 id="20230813-"&gt;20230813 補充:&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;後來實作時有比對了一下 en / zh-CN 文件，發現英文版應該還是有更新成 4 版的語法，
可能只是沒有經過完整校對，還是寫了警語在上面，所以後來我就直接看英文版了。

因此這篇筆記主要就不是針對 3 / 4 版之間的差異，而是我個人覺得想記錄的一些要點
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="setting-up-the-game-area"&gt;Setting up the game area&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;第一步是下載相關 Assets&lt;br&gt;與《My First 2D Game》不同的是，這份教學 Assets 內包含了一個現成的 Project。&lt;br&gt;2D 範例則是從自己 New 一個 Proect 開始&lt;/li&gt;
&lt;li&gt;Import Project 直接選 .zip (不需解壓縮)，匯入時會提示這是一份 Godot 3 專案&lt;br&gt;接下來會有一些選項要你決定是否嘗試轉換成 Godot 4 專案、轉換不能反悔要記得備份等警語&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="player-scene-and-input-actions"&gt;Player scene and input actions&lt;/h2&gt;
&lt;h2 id="moving-the-player-with-code"&gt;Moving the player with code&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Vector 的 Normalize&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;這裡有段程式碼在處理收到玩家移動指令 =&amp;gt; 改變角色的位移&lt;br&gt;其中呼叫了 &lt;code&gt;Vector3.normalized()&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; Input.is_action_pressed(&lt;span class="hljs-string"&gt;"move_right"&lt;/span&gt;):
    direction.x += &lt;span class="hljs-number"&gt;1&lt;/span&gt;    &lt;span class="hljs-comment"&gt;// 按右的話 x 軸 +1&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; Input.is_action_pressed(&lt;span class="hljs-string"&gt;"move_left"&lt;/span&gt;):
    direction.x -= &lt;span class="hljs-number"&gt;1&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; Input.is_action_pressed(&lt;span class="hljs-string"&gt;"move_back"&lt;/span&gt;):
    direction.z += &lt;span class="hljs-number"&gt;1&lt;/span&gt;    &lt;span class="hljs-comment"&gt;// 按下的話 z 軸 +1&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; Input.is_action_pressed(&lt;span class="hljs-string"&gt;"move_forward"&lt;/span&gt;):
    direction.z -= &lt;span class="hljs-number"&gt;1&lt;/span&gt;

&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; direction != Vector3.ZERO:
    direction = direction.normalized()
    $Pivot.look_at(position + direction, Vector3.UP)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;並有一段 Tip 說：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In case the player presses, say, both W and D simultaneously, the vector will have a length of about 1.4. But if they press a single key, it will have a length of 1. We want the vector&amp;#39;s length to be consistent, and not move faster diagonally. To do so, we can call its normalize() method.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;查了一下似乎是遊戲中很常見的移動速率控制 (不論 2D、3D)。&lt;/p&gt;
&lt;p&gt;大概意思是當玩家只按了「上」或「右」時，角色往「上」或「右」移動速度都是 1，&lt;br&gt;但如果玩家同時壓了「上 + 右」，會產生一個往右上約 1.4 的速率，&lt;br&gt;(想像一個邊長 1 的正方形，中間斜對角線是根號 2，大約是 1.4)&lt;/p&gt;
&lt;p&gt;結果就是玩家斜向移動的話會比較快，而這可能不是我們要的結果。&lt;br&gt;因此一般會提供一個 Normalize 方法，讓往任何方向移動的速率都固定是 1&lt;/p&gt;
&lt;p&gt;像剛剛說的往右上移動，Normalize 後 Vector 大約是 (0.7, 0.7)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;從 &lt;a href="https://www.gamedev.net/tutorials/programming/math-and-physics/practical-use-of-vector-math-in-games-r2968/"&gt;gamedev.net&lt;/a&gt; 偷的圖&lt;br&gt;&lt;img src="https://uploads.gamedev.net/monthly_03_2013/ccs-208401-0-87770400-1363385231.png" alt=""&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;分割 Viewport&lt;ul&gt;
&lt;li&gt;Godot 在 3D View 提供最多分割成 4 個畫面，方便從不同視角觀察世界&lt;/li&gt;
&lt;li&gt;按畫面右上的 View 選擇，或是快速鍵 Ctrl + (Alt) + 1~4&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="designing-the-mob-scene"&gt;Designing the mob scene&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在處理例如 Mob 物件的銷毀 (離開畫面可視範圍後就可以刪除物件、釋放相關記憶體及資源)。為了避免系統在執行垃圾回收時造成畫面卡頓，可以採用所謂 pooling 的方式&lt;br&gt;具體上是建立一個 array 並預先產生裡面的物件，以及一些 reuse 機制&lt;ul&gt;
&lt;li&gt;但在用 C#、Lua 等有垃圾回收機制的語言才需要，GDScript 處理方式不同不需要&lt;ul&gt;
&lt;li&gt;詳細以後有機會再研究&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="spawning-monsters"&gt;Spawning monsters&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一些 3D View 的操作 Tips&lt;ul&gt;
&lt;li&gt;可以用鍵盤右邊數字鍵切換視角 (類似 Blender)&lt;/li&gt;
&lt;li&gt;移動物件時可以按 y 切換 snap 依附模式，讓物件在 Grid 上對齊格線&lt;/li&gt;
&lt;li&gt;ctrl + D 可以複製物件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jumping-and-squashing-monsters"&gt;Jumping and squashing monsters&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;To be continued ...&lt;/code&gt;&lt;/p&gt;</description>
  <author>Soon Yang</author>
  <category>godot</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/godot_first_3d_game/</guid>
  <pubDate>Tue, 01 Aug 2023 16:29:17 GMT</pubDate>
</item>
<item>
  <title>[Godot] Your first 2D game 練習</title>
  <link>https://soon.azurewebsites.net/blog/godot_first_2d_game/</link>
  <description>&lt;p&gt;Godot 是一個年紀很輕的開源遊戲引擎，最近試著接觸看看，查詢資料時發現前幾個月 Godot 做了一次大版本更新 Godot 4，整個引擎重寫過。&lt;/p&gt;
&lt;p&gt;但原本打算做為 LTS 版本的 3.X 版，可能因為使用者眾多，聽說後續又從 4.X 移植了些新功能回去，變成了雙版本同時發展。&lt;/p&gt;
&lt;p&gt;以上資訊沒有經過很嚴謹的查核 XD&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;因為初學想練習，不疑有它就選了 4 版，&lt;br&gt;引擎本體非常精巧，只有一個 113 MB 的 .exe 執行檔，免安裝！&lt;/p&gt;
&lt;p&gt;不過在按照官網文件《您的第一個 2D 遊戲》實作時，遇到了一些語法、build-in 物件找不到的問題，後來發現是 3.X 版與 4.X 版的語法有落差。&lt;/p&gt;
&lt;p&gt;比對了一下官網教學文件，zh-TW / zh-CN 版沒更新，en 版則有註明已更新至 for Godot 4.1。&lt;/p&gt;
&lt;p&gt;所以這篇是稍微記錄一下，如果一步步照著中文教學走可能會卡住的地方。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="setting-up-the-project"&gt;Setting up the project&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Project Setting&lt;ul&gt;
&lt;li&gt;要調整畫面寬高，到 Display =&amp;gt; Window&lt;ul&gt;
&lt;li&gt;3版參數名稱 Size: &lt;code&gt;Width / Height&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;4版參數名稱 Size: &lt;code&gt;Viewport Width / Viewport Height&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Stretch 調整畫面拉伸設定&lt;ul&gt;
&lt;li&gt;3版 Mode 選項下拉選單要選 &lt;code&gt;2d&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;4版 Mode 選項下拉選單要選 &lt;code&gt;canvas_items&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="creating-the-player-scene"&gt;Creating the player scene&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;對 Player Node 新增子 Node &lt;code&gt;AnimatedSprite&lt;/code&gt; (3版) =&amp;gt; &lt;code&gt;AnimatedSprite2D&lt;/code&gt; (4版)&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;AnimatedSprite2D&lt;/code&gt; 的 Inspector (屬性檢視器) 找到 &lt;code&gt;Frames&lt;/code&gt; (3版) =&amp;gt; &lt;code&gt;Sprite Frames&lt;/code&gt; (4版)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="coding-the-player"&gt;Coding the player&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;要將 script 中的變數「匯出」(能在 inspector 面板設定) 的語法有差異&lt;ul&gt;
&lt;li&gt;&lt;code&gt;export var speed = 400&lt;/code&gt; (3版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@export var speed = 400&lt;/code&gt; (4版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在 inspector 面板設定 Player 被敵人碰撞的 Signal&lt;ul&gt;
&lt;li&gt;&lt;code&gt;body_entered(body: Node)&lt;/code&gt; (3版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;body_entered(body: Node2D)&lt;/code&gt; (4版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在 body_entered 內要觸發 hit Signal 的語法有變，但 3 版寫法也還能用&lt;ul&gt;
&lt;li&gt;&lt;code&gt;emit_signal(&amp;quot;hit&amp;quot;)&lt;/code&gt; (3版, 但4版也可用)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hit.emit()&lt;/code&gt; (4版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="creating-the-enemy"&gt;Creating the enemy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;新增 Mob 的子 Node &lt;code&gt;VisibilityNotifier2D&lt;/code&gt; (3版) =&amp;gt; &lt;code&gt;VisibleOnScreenNotifier2D&lt;/code&gt; (4版)&lt;/li&gt;
&lt;li&gt;設定 Mob 移動動畫隨機三選一播放的語法不同 (要取得 sprite 的所有 frames name 後播放)&lt;ul&gt;
&lt;li&gt;3版&lt;pre&gt;&lt;code class="lang-script"&gt;$AnimatedSprite.playing = &lt;span class="hljs-keyword"&gt;true&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;var&lt;/span&gt; mob_types = $AnimatedSprite.frames.get_animation_names()
$AnimatedSprite.animation = mob_types[randi() % mob_types.size()]
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;4版&lt;pre&gt;&lt;code&gt;&lt;span class="hljs-attribute"&gt;var&lt;/span&gt; mob_types = &lt;span class="hljs-variable"&gt;$AnimatedSprite2D&lt;/span&gt;.sprite_frames.get_animation_names()
&lt;span class="hljs-variable"&gt;$AnimatedSprite2D&lt;/span&gt;.play(mob_types[randi() % mob_types.size()])
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-main-game-scene"&gt;The main game scene&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在 Main 場景下新增子 Node &lt;code&gt;Position2D&lt;/code&gt; (3版) =&amp;gt; &lt;code&gt;Marker2D&lt;/code&gt; (4版)&lt;/li&gt;
&lt;li&gt;在 Main 場景的 script 頂部要 export Mob 場景的語法不同&lt;ul&gt;
&lt;li&gt;&lt;code&gt;export(PackedScene) var mob_scene&lt;/code&gt; (3版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@export var mob_scene: PackedScene&lt;/code&gt; (4版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在 _on_mob_timer_timeout 事件中 new 一個 Mob，要在 MobPath(Path2D) 指定隨機出生點的語法不同&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mob_spawn_location.offset = randi()&lt;/code&gt; (3版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mob_spawn_location.progress_ratio = randf()&lt;/code&gt; (4版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TIP 中說在計算角度時，如果需要在弧度 radians 跟角度 degrees 做轉換，方法名稱不同&lt;ul&gt;
&lt;li&gt;&lt;code&gt;deg2rad()、rad2deg()&lt;/code&gt; (3版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deg_to_rad()、rad_to_deg()&lt;/code&gt; (4版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3版在 Main._ready() 時有加上 &lt;code&gt;randomize()&lt;/code&gt;，說才能確保每次 random 產生的隨機值都不同，但4版文件沒提醒要加這句了&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="heads-up-display"&gt;Heads up display&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;要更換 Label 的字體，在 Inspector 的 Theme Overrides 區塊內&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;Fonts&lt;/code&gt; 選 &lt;code&gt;New DynamicFont&lt;/code&gt; 後再對 &lt;code&gt;Font Data&lt;/code&gt; 選 &lt;code&gt;Load&lt;/code&gt; 再選擇字型檔 (3版)&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;Fonts&lt;/code&gt; 選 &lt;code&gt;Load&lt;/code&gt; 再選擇字型檔 (4版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;設定好 Fonts 後，3版有教學可以在 Font 下拉選單選 copy，再直接到另一個 Control 的 Font 屬性選 paste。4版教學沒提到這點&lt;/li&gt;
&lt;li&gt;設定 Layout 時 3／4版介面不同 (4版: Anchors Preset)&lt;/li&gt;
&lt;li&gt;Label 的文字對齊 (align) 3版只能設定 &lt;code&gt;Align&lt;/code&gt;=Center，4版再細分成 &lt;code&gt;Horizontal Alignment&lt;/code&gt; 及 &lt;code&gt;Vertical Alignment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文字換行 &lt;code&gt;Autowrap&lt;/code&gt; 3版只能選啟用，4版有更多 mode 可選: &lt;code&gt;Off&lt;/code&gt;, &lt;code&gt;Arbitrary&lt;/code&gt;, &lt;code&gt;Word&lt;/code&gt;, &lt;code&gt;Word(Smart)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yield&lt;/code&gt; 語法在 4版已被 &lt;code&gt;await&lt;/code&gt; 取代&lt;ul&gt;
&lt;li&gt;&lt;code&gt;yield($MessageTimer, &amp;quot;timeout&amp;quot;)&lt;/code&gt; (3版)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;await $MessageTimer.timeout&lt;/code&gt; (4版)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="finishing-up"&gt;Finishing up&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;加入音效檔，3版沒有這段補充，4版有:&lt;ul&gt;
&lt;li&gt;audio 檔在 import 時預設 Loop 都是 disabled 的，想要不間斷持續播放，在 Stream 下拉選單點選 &lt;code&gt;Make Unique&lt;/code&gt;，然後再點一次 Stream 檔、勾選 Loop&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>Soon Yang</author>
  <category>godot</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/godot_first_2d_game/</guid>
  <pubDate>Mon, 31 Jul 2023 12:24:47 GMT</pubDate>
</item>
<item>
  <title>興沖沖買了個網域，但...</title>
  <link>https://soon.azurewebsites.net/blog/20210419_buy_a_domain/</link>
  <description>&lt;h2 id="-"&gt;因為&lt;/h2&gt;
&lt;p&gt;這個 (沒人看) 的 Blog 因為是用 Azure Web App 架設的&lt;br&gt;網址一直是預設的 soon.azurewebsites.net&lt;/p&gt;
&lt;p&gt;這幾天剛好看到 Godaddy 有優惠活動&lt;/p&gt;
&lt;h3 id="-tw-nt99"&gt;.tw 域名特價第一年只要 NT99&lt;/h3&gt;
&lt;p&gt;心想給這個玩票性質的站台一個名份也不錯&lt;br&gt;(第二年恢復原價了再說 ... )&lt;/p&gt;
&lt;p&gt;而且自從幾個月前註冊了 Godaddy 帳號後&lt;br&gt;也一直還沒下手，買一個專屬於自己的域名&lt;/p&gt;
&lt;p&gt;心想一個工程師總是要有一二次這種經驗 (哪種?&lt;br&gt;就興沖沖跑去 Godaddy 下訂了一個喜歡的域名&lt;/p&gt;
&lt;h3 id="soon-tw-"&gt;soon.tw 這麼熱門的當然是早就被買走了&lt;/h3&gt;
&lt;p&gt;不過這裡就不特別說明最後買了哪個域名&lt;br&gt;因為暫時用不到了...QQ&lt;/p&gt;
&lt;p&gt;另外也稍微看了一下網路討論，Godaddy 是美國公司&lt;br&gt;所以跟他們買算是海外消費&lt;/p&gt;
&lt;p&gt;可以的話&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;請挑選海外消費回饋較高的信用/簽帳卡&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;網路上很多促銷代碼，可以稍微 Google 找 Godaddy promo code 輸入看看有沒有能用的&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我這次購買好像是因為 .tw 優惠方案的關係&lt;br&gt;輸入網路上找到的一些 30% discount code 都沒效&lt;br&gt;可能方案本身已經計算為最優惠了&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="-"&gt;買域名的部分&lt;/h2&gt;
&lt;p&gt;沒什麼特別好說的，就是&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;註冊 Godaddy 帳號&lt;/li&gt;
&lt;li&gt;搜尋想要、而且沒有被買走的域名，加入購物車&lt;/li&gt;
&lt;li&gt;結帳刷卡&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;結帳前會有些步驟，詢問你要不要順便購買一些加值服務，會比較便宜&lt;br&gt;這些就看個人需求&lt;/p&gt;
&lt;p&gt;另外有一點可能稍微要注意&lt;br&gt;域名購買者的&lt;strong&gt;部分資訊&lt;/strong&gt;會被揭露在 &lt;a href="https://www.google.com/search?q=WHOIS"&gt;WHOIS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;至少我在 Godaddy 買完域名後，&lt;strong&gt;預設基本隱私權保護開啟&lt;/strong&gt;的狀態下&lt;br&gt;&lt;img src="https://i.imgur.com/QGzQSTP.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;WHOIS 查詢這個域名，還是顯示了我在 Godaddy 註冊的英文姓名 + Email&lt;br&gt;如果很在意自己隱私的人請再自己斟酌&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-"&gt;接著要設定域名&lt;/h3&gt;
&lt;p&gt;這裡我 &lt;strong&gt;&lt;del&gt;大意了沒有閃&lt;/del&gt;&lt;/strong&gt; 出了個包&lt;br&gt;心想買好了域名，當然先來查一下網路教學看怎麼設定&lt;/p&gt;
&lt;p&gt;&lt;img src="https://i.imgur.com/RtyJ1tH.png" style="border:1px solid grey"&gt;&lt;/p&gt;
&lt;h3 id="-"&gt;讚喔！微軟有官方教學文件&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.microsoft.com/zh-tw/azure/app-service/app-service-web-tutorial-custom-domain"&gt;Tutorial: Map an existing custom DNS name to Azure App Service&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;繼續往下讀&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The app&amp;#39;s current tier is highlighted by a blue border. Check to make sure that the app isn&amp;#39;t in the F1 tier. Custom DNS isn&amp;#39;t supported in the F1 tier.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="-"&gt;重點&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;div style="color:red"&gt;Custom DNS isn&amp;#39;t supported in the F1 tier.&lt;/div&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;.......................&lt;/p&gt;
&lt;p&gt;對不起孩子 ... 我是個蹭免費仔，到現在還在用 F1 (Free) Tier&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="-tier"&gt;看了一下如果要升級最便宜的付費 Tier&lt;/h3&gt;
&lt;p&gt;應該就是這個 &lt;strong&gt;D1&lt;/strong&gt; 了&lt;br&gt;&lt;img src="https://i.imgur.com/TR32Gv0.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;預估每月 NT 285，一年大概 NT 3420&lt;/p&gt;
&lt;p&gt;這...也不能說是很貴&lt;br&gt;如果想認真經營一個自己的技術部落格(非營利)，應該還算是滿合理的價位&lt;/p&gt;
&lt;p&gt;只是&lt;/p&gt;
&lt;p&gt;這裡目前單純就是自己閒暇之餘，用來練習寫網站、跟自己自言自語的地方&lt;br&gt;這筆花費還是決定先省著吧 😅&lt;/p&gt;
&lt;p&gt;孩子，當為父有一日財富自由了&lt;br&gt;會回來給你一個名份的 (抱)&lt;/p&gt;
&lt;h2 id="-"&gt;對了我還得記得明年取消那個域名的自動續約&lt;/h2&gt;
&lt;p&gt;不然第二年起好像也要扣 NT 1000 多 ...&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ref: 有朝一日會用到的 Azure Web App Custom Domain 設定教學&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tutorial: Map an existing custom DNS name to Azure App Service&lt;br&gt;&lt;a href="https://docs.microsoft.com/zh-tw/azure/app-service/app-service-web-tutorial-custom-domain"&gt;https://docs.microsoft.com/zh-tw/azure/app-service/app-service-web-tutorial-custom-domain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;替 Azure 的 App Service 網站設定自訂網域&lt;br&gt;&lt;a href="https://dotblogs.com.tw/jamestsai/2019/08/17/How-to-Bind-Self-Domain-to-Azure-Web-App-Service"&gt;https://dotblogs.com.tw/jamestsai/2019/08/17/How-to-Bind-Self-Domain-to-Azure-Web-App-Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[Azure]Web App自訂網域與憑證申請&lt;br&gt;&lt;a href="https://www.dotblogs.com.tw/jamesfu/2020/02/05/custom_domain_ssl"&gt;https://www.dotblogs.com.tw/jamesfu/2020/02/05/custom_domain_ssl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>Soon Yang</author>
  <category>blog</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/20210419_buy_a_domain/</guid>
  <pubDate>Mon, 19 Apr 2021 16:25:31 GMT</pubDate>
</item>
<item>
  <title>TinyMCE 到 SimpleMDE (中？)</title>
  <link>https://soon.azurewebsites.net/blog/20210218_tinymce_to_simplemde_inprogress/</link>
  <description>&lt;p&gt;距離 &lt;a href="https://soon.azurewebsites.net/blog/20200317_tinymce_to_simplemde_before/"&gt;上一次&lt;/a&gt; 說要把編輯器換成 &lt;a href="https://simplemde.com/"&gt;SimpleMDE&lt;/a&gt; 已經是&lt;strong&gt;去年3月&lt;/strong&gt;的事情了&lt;/p&gt;
&lt;p&gt;趁著這次春節，終於鼓起勇氣來動手了&lt;/p&gt;
&lt;h2 id="1-simplemde"&gt;1. 更換 SimpleMde&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;如同上次所說，我參考了&lt;a href="https://ithelp.ithome.com.tw/articles/10200039"&gt;這篇&lt;/a&gt; IT 鐵人賽這位暐翰大大的系列文章&lt;/li&gt;
&lt;li&gt;不過雖然有參考文章，可能因為我自己也&lt;del&gt;亂改&lt;/del&gt;客製了 MiniBlog.Core 不少東西&lt;br&gt;  在修改過程中還是遭遇到了許多不明問題，所以後來直接去爬這位大大放在 Github 的 &lt;a href="https://github.com/shps951023/Miniblog.Core.W3C"&gt;Demo&lt;/a&gt;&lt;br&gt;  依序看過幾個相關的 Commits，才知道實際上的修改步驟，以及幾個關鍵的 html 元素與 editor 之間的互動&lt;br&gt;最後才終於把編輯器從 TinyMCE 換成 SimpleMDE&lt;/li&gt;
&lt;li&gt;實際存到後端的文章，本來有一個 Content 欄位會儲存 Html 原始碼&lt;br&gt;  現在會多一個 MarkDownContent，儲存了 markdown 語法的文章內容&lt;br&gt;  在 &lt;strong&gt;顯示&lt;/strong&gt; 與 &lt;strong&gt;更新&lt;/strong&gt; 內容時，會由 SimpleMde 做轉換&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-css-"&gt;2. CSS 樣式走鐘&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;換成 markdown 編輯文章後，發現在編輯器中 preview 的結果很正常&lt;br&gt;  或者說，是比較接近 Github 等網站上看到的樣式&lt;br&gt;  但在存檔後，實際檢視文章時，卻發現原本 Miniblog.Core 預設的樣式，&lt;strong&gt;非常&lt;/strong&gt;不符合預期 XD&lt;/li&gt;
&lt;li&gt;但本人算是前端智障，所以在&lt;br&gt;  &lt;code&gt;1. 找出預設 css 檔所在位置&lt;/code&gt;、&lt;code&gt;2. 註解部分 css&lt;/code&gt;、&lt;code&gt;3. 引入 Github Markdown CSS 檔&lt;/code&gt;、&lt;code&gt;4. &amp;lt;code&amp;gt;的顯示改用 highlight.js&lt;/code&gt;&lt;br&gt;  過程中又花了不少的時間&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-"&gt;3. 上傳圖片&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;換了 SimpleMDE 之後，發現它內建的 &lt;strong&gt;Insert Image&lt;/strong&gt; 按鈕，作用只是幫你插入這段文字而已&lt;pre&gt;&lt;code&gt;![](https:&lt;span class="hljs-comment"&gt;// )&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;這樣我原本串 imgur API，去上傳圖片的動作就失去意義了&lt;br&gt;  (要手動開 imgur 網站上傳，再把網址貼過來)&lt;/li&gt;
&lt;li&gt;幸好 SimpleMDE 除了&lt;a href="https://github.com/sparksuite/simplemde-markdown-editor#toolbar-icons"&gt;內建的22個按鈕&lt;/a&gt;&lt;br&gt;  也允許我們自己另外新增新的按鈕，並自訂要觸發的事件&lt;br&gt;  &lt;img src="https://i.imgur.com/kSUXCyk.png" alt=""&gt;&lt;/li&gt;
&lt;li&gt;只不過前端智障如我本人在下，又花了很多時間才處理好這段&lt;ul&gt;
&lt;li&gt;自訂 toolbar action 觸發自訂事件&lt;/li&gt;
&lt;li&gt;用 js 產生 input 元素然後 click 它，並監聽 change event，在選擇檔案後會得到 files 物件&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;FormData&lt;/code&gt; 及 &lt;code&gt;XMLHttpRequest&lt;/code&gt; 的處理方式向後端上傳圖檔&lt;/li&gt;
&lt;li&gt;在 xhr.onreadystatechange event 中處理&lt;br&gt;  當 xhr.readyState == XMLHttpRequest.DONE 時&lt;br&gt;  取出向後端 upload image 的 response (成功時會是一個 imgur 圖檔 url)&lt;/li&gt;
&lt;li&gt;把檔名組合成 &lt;code&gt;![](https://xxxxxx.ooo)&lt;/code&gt; 的格式，然後再更新回編輯器的 TextArea&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;好不容易處理完上傳圖片按鈕，但又想到，應該要順便支援&lt;br&gt;  &lt;strong&gt;拖曳圖檔 &amp;amp; Ctrl+V 貼上&lt;/strong&gt; 兩種上傳方式&lt;ul&gt;
&lt;li&gt;等我大概搞清楚怎麼處理 &lt;strong&gt;paste&lt;/strong&gt;、&lt;strong&gt;drop&lt;/strong&gt; 事件&lt;br&gt;以及發現瀏覽器有沙盒相關限制，不能 &lt;strong&gt;直接對本機檔案 Ctrl+C 後，直接 Ctrl+V&lt;/strong&gt;&lt;br&gt;然後從 ClipBoardData 取得 Files，又是幾個時辰過去了 ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-"&gt;4. 其他修正&lt;/h2&gt;
&lt;p&gt;修改過程中也有陸續改一些之前發現的 bug，或是臨時想到的調整&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;從首頁檢視文章，畫面最下方會有 &lt;code&gt;&amp;lt;&amp;lt;更舊&lt;/code&gt;、&lt;code&gt;更新&amp;gt;&amp;gt;&lt;/code&gt; 兩個按鈕&lt;br&gt; &lt;img src="https://i.imgur.com/aItIH56.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt; MiniBlog.Core 的分頁邏輯是，最新(最後)一頁是 page = 0&lt;br&gt; 然後往前一頁 (較舊的) 是 page = 1，依此類推&lt;/p&gt;
&lt;p&gt; [更新] 按鈕的顯示條件是&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; @&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (currentPage &amp;gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;)
 {
     &lt;span class="hljs-comment"&gt;// 顯示 [更新] 按鈕&lt;/span&gt;
 }
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt; 這沒有問題&lt;/p&gt;
&lt;p&gt; 但是之前有發現一直按 [更舊] 到了第一頁，畫面上還是會顯示 [更舊] 按鈕&lt;br&gt; 而再按下去後，畫面上卻沒有文章了&lt;/p&gt;
&lt;p&gt; 看了一下原本 prev button 的顯示邏輯是&lt;/p&gt;
&lt;pre&gt;&lt;code class="lang-cs"&gt; &lt;span class="hljs-meta"&gt;@model&lt;/span&gt; IEnumerable&amp;lt;Post&amp;gt;
 &lt;span class="hljs-meta"&gt;@if&lt;/span&gt; (Model.Any())
 {
     &lt;span class="hljs-comment"&gt;// 顯示 [更舊] 按鈕&lt;/span&gt;
 }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; 意思大概是，只要目前這頁有文章，就還是要顯示 [較舊] 按鈕&lt;br&gt; 這怪怪的，所以我的調整方式是，後端在取該頁 posts 時，順便多取出下一頁的 posts&lt;br&gt; (目前設定一頁是 5 篇)&lt;br&gt; 然後把下一頁的 posts.Any() 作為要不要顯示 [更舊] 按鈕的條件，放進 ViewBag 給前端判斷&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;網頁字體換了 &lt;a href="https://fonts.google.com/specimen/Noto+Sans+TC"&gt;思源黑體 Noto Sans TC&lt;/a&gt;&lt;br&gt; 目前還不確定這是不是一個好的決定，需要觀察看看效果&lt;br&gt; &lt;img src="https://i.imgur.com/UJvQLBH.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt; 其實還想把網站的樣式做一些比較大的調整，但是......前端智障心有餘而力不足&lt;br&gt; 接著又已經春節結束開工啦！下一次更新不知道是什麼時候了 (&lt;del&gt;&lt;strong&gt;Flag&lt;/strong&gt;&lt;/del&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
  <author>Soon Yang</author>
  <category>blog</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/20210218_tinymce_to_simplemde_inprogress/</guid>
  <pubDate>Wed, 17 Feb 2021 18:15:31 GMT</pubDate>
</item>
<item>
  <title>翻新舊專案是不人道的行為</title>
  <link>https://soon.azurewebsites.net/blog/20200710_upgrade_is_inhuman/</link>
  <description>&lt;p&gt;最近有個工作上的需求，是要將舊的 ASP.NET MVC 5 + AngularJS (一代) 的 Web 專案&lt;/p&gt;
&lt;p&gt;升級到 .NET Core 3.1 + Linux Docker 環境上可以運作的狀態&lt;/p&gt;
&lt;p&gt;真的必須說相關的雷實在太多太多了 ... 。&lt;/p&gt;
&lt;p&gt;這個血尿過程仍在進行式中，如果我活下去了改天再來更新相關心得 ... 。&lt;/p&gt;
&lt;p&gt;下面暫存一些參考過的文章，還有很多在解決過程中沒有留下的，等想起來再補上，
或是就 ... 算了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;官方升級指南：&lt;a href="https://docs.microsoft.com/zh-tw/aspnet/core/migration/mvc?view=aspnetcore-3.1"&gt;Migrate from ASP.NET MVC to ASP.NET Core MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/zh-tw/ef/ef6/what-is-new/"&gt;Entity Framework 從 6.3 開始支援 .NET Core (目前最新是 6.4.4)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SignalR 相關&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/zh-tw/aspnet/core/signalr/version-differences?view=aspnetcore-3.1"&gt;Differences between ASP.NET SignalR and ASP.NET Core SignalR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/49152486/signalr-version-compatability-statuscode-405-method-not-allowed"&gt;ASP.NET Core SignalR 不相容舊版的 SignalR javascript client 套件&lt;/a&gt;
(client 會收到 405 method not allowed)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/41798814/asp-net-core-api-post-parameter-is-always-null"&gt;前端用 Ajax POST 過來的參數都是 null (或 default，看 type 是什麼)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;樂活武士：&lt;a href="https://dotblogs.com.tw/bda605/2020/02/26/162931"&gt;[ASP.NET Core]Net Core 3.1 API 回傳小寫問題&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bundle &amp;amp; Minify 相關&lt;ul&gt;
&lt;li&gt;官方文章：&lt;a href="https://docs.microsoft.com/zh-tw/aspnet/core/client-side/bundling-and-minification?view=aspnetcore-3.1"&gt;Bundle and minify static assets in ASP.NET Core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;軟體主廚：&lt;a href="https://dotblogs.com.tw/supershowwei/2017/07/26/164153"&gt;[食譜好菜] BundleConfig 在 ASP.NET Core 還存在嗎？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Form 表單驗證登入相關&lt;ul&gt;
&lt;li&gt;高級打字員的技術雲：&lt;a href="https://dotblogs.com.tw/shadow/2019/01/16/105615"&gt;[ASP.net Core 3.0] 實作 Cookie based 登入機制(CookieAuthentication) 取代ASP.Net Framework的表單驗證(FormsAuthentication)登入&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Will 保哥：&lt;a href="https://blog.miniasp.com/post/2019/12/25/asp-net-core-3-cookie-based-authentication"&gt;如何實作沒有 ASP.NET Core Identity 的 Cookie-based 身分驗證機制&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>Soon Yang</author>
  <category>asp.net mvc</category>
  <category>.net core</category>
  <category>asp.net core</category>
  <category>angularjs</category>
  <category>signalr</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/20200710_upgrade_is_inhuman/</guid>
  <pubDate>Thu, 09 Jul 2020 16:51:54 GMT</pubDate>
</item>
<item>
  <title>網站升級 .net core 3.1 過程的慘劇</title>
  <link>https://soon.azurewebsites.net/blog/20200615_upgrade_tragedy/</link>
  <description>&lt;p&gt;簡而言之就是遺失資料了 QQ &lt;/p&gt;
&lt;p&gt;這裡用的 Miniblog 原本是 .Net Core 2.1 版， 前陣子想照著網路上的 migration 教學升到 3.1 版&lt;/p&gt;
&lt;p&gt;修改完後在 local 可以順利 run 起來 &lt;/p&gt;
&lt;p&gt;但透過 azure devops deploy 上 azure web app 後，卻出現 500.30 error&lt;/p&gt;
&lt;p&gt;最近比較忙所以一直放著它沒修 &lt;/p&gt;
&lt;p&gt;今天又抽了點時間來查看，懷疑過各種可能性，包括&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;azure app service 上的 .net core 版本&lt;/li&gt;
&lt;li&gt;azure devops CICD 的設定&lt;/li&gt;
&lt;li&gt;project 裡面的 config &lt;/li&gt;
&lt;li&gt;也試過不透過 CICD，而是由 visual studio 直接進行 web deploy 來 publish，&lt;strong&gt;but &lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-but-"&gt;人生最重要的就是這個 but (?)&lt;/h3&gt;
&lt;p&gt;因為這個 blog 文章是存放在 server 上的 Lite DB 檔案，並在版控上加入 .gitignore 排除來避免覆蓋&lt;/p&gt;
&lt;p&gt;再偶爾人工上去 server 備份 ...... &lt;/p&gt;
&lt;p&gt;然而我剛剛卻直接用 VS 去 deploy，本地的 DB 就覆蓋掉 server 上面的啦 Q__Q &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;Startup.cs 中的 UseKestrel 要拿掉，並改用 UseIISIntegration &lt;/p&gt;
&lt;p&gt;因為我的 azure web app 當初是開 windows 系統跑 IIS 的&lt;/p&gt;
&lt;p&gt;deploy 上去就會出現這行錯誤&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Application is running inside IIS process but is not configured to use IIS server&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;話說，要看到這行錯誤也不容易&lt;/p&gt;
&lt;p&gt;因為不熟悉 azure portal 操作，翻了好多功能才找到如何看 error log 的地方 &lt;/p&gt;
&lt;p&gt;唉唉又欠了一項債務得還&lt;/p&gt;
&lt;p&gt;想個自動化備份 DB 的方式吧 &lt;/p&gt;</description>
  <author>Soon Yang</author>
  <category>blog</category>
  <category>miniblog</category>
  <category>.net core</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/20200615_upgrade_tragedy/</guid>
  <pubDate>Sun, 14 Jun 2020 19:33:54 GMT</pubDate>
</item>
<item>
  <title>TinyMCE 到 SimpleMDE (前)</title>
  <link>https://soon.azurewebsites.net/blog/20200317_tinymce_to_simplemde_before/</link>
  <description>&lt;p&gt;MiniBlog 的預設編輯器是使用 &lt;a href="https://github.com/tinymce/tinymce"&gt;TinyMCE&lt;/a&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;我都懶得檢查產出的 html 所以都直接全選 &amp;rarr; clear formatting 來解決&lt;/p&gt;
&lt;p&gt;之前架設這個 Blog 參考的&lt;a href="https://ithelp.ithome.com.tw/articles/10199488"&gt;鐵人賽文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;他是自行改成用 SimpleMDE 這套編輯器，可支援 markdown 語法&lt;/p&gt;
&lt;p&gt;其實 TinyMCE 也有支援類似 markdown 語法的功能叫 &lt;a href="https://www.tiny.cloud/docs/plugins/textpattern/"&gt;text pattern&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以在你輸入特定文字時自動幫你轉換成指定內容&lt;/p&gt;
&lt;p&gt;例如兩個星號 ** 變成粗體，這種 markdown-like 的方式&lt;/p&gt;
&lt;p&gt;但試用了一下還是相當不順手，於是決定找機會也換成 SimpleMDE 來試試&lt;/p&gt;
&lt;p&gt;更換編輯器我自己預想了幾個步驟：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安裝 (npm install 或直接用網路上 cdn 的?)&lt;/li&gt;
&lt;li&gt;修改前端頁面引入套件&lt;/li&gt;
&lt;li&gt;轉換舊文章格式&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="" alt="這張圖片遺失了"&gt;&lt;/p&gt;</description>
  <author>Soon Yang</author>
  <category>miniblog</category>
  <category>blog</category>
  <category>simplemde</category>
  <category>tinymce</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/20200317_tinymce_to_simplemde_before/</guid>
  <pubDate>Tue, 17 Mar 2020 04:04:54 GMT</pubDate>
</item>
<item>
  <title>新電腦記得裝的軟體</title>
  <link>https://soon.azurewebsites.net/blog/20200213_newpcsoftware/</link>
  <description>&lt;p&gt;&lt;em&gt;last updated: 20210420&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="-"&gt;工作用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Chocolatey&lt;ul&gt;
&lt;li&gt;cmd command&lt;pre&gt;&lt;code class="lang-cmd"&gt;@"%&lt;span class="hljs-keyword"&gt;SystemRoot&lt;/span&gt;%\&lt;span class="hljs-keyword"&gt;System32&lt;/span&gt;\&lt;span class="hljs-keyword"&gt;WindowsPowerShell&lt;/span&gt;\&lt;span class="hljs-keyword"&gt;v1&lt;/span&gt;.&lt;span class="hljs-keyword"&gt;0&lt;/span&gt;\&lt;span class="hljs-keyword"&gt;powershell&lt;/span&gt;.&lt;span class="hljs-keyword"&gt;exe&lt;/span&gt;" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command &lt;span class="hljs-string"&gt;" [System.Net.ServicePointManager]::SecurityProtocol = 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))"&lt;/span&gt; &amp;amp;&amp;amp; SET &lt;span class="hljs-string"&gt;"PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;GitCredential Manager for Windows (裝Git for Windows 會預設安裝)&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.miniasp.com/post/2018/05/28/Git-Credential-Howto"&gt;如何透過GitCredential管理透過HTTP通訊協定存取儲存庫的帳號密碼&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VS&lt;ul&gt;
&lt;li&gt;ReSharper&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SSMS&lt;/li&gt;
&lt;li&gt;VS Code (可登入微軟或 Github 帳號同步設定，我用微軟帳號)&lt;/li&gt;
&lt;li&gt;SourceTree&lt;/li&gt;
&lt;li&gt;Cmder&lt;/li&gt;
&lt;li&gt;Docker Desktop for Windows&lt;/li&gt;
&lt;li&gt;Redis Desktop Manager 0.9.3.817&lt;/li&gt;
&lt;li&gt;WSL&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-"&gt;雜類&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Vimium (Chrome extension, 登入會自動同步)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://punklabs.com"&gt;Rocket Dock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OneNote&lt;/li&gt;
&lt;li&gt;Joplin (資料加密同步在 dropbox)&lt;/li&gt;
&lt;li&gt;Wox&lt;/li&gt;
&lt;li&gt;PicPick&lt;/li&gt;
&lt;li&gt;Paint.Net&lt;/li&gt;
&lt;li&gt;HoneyView&lt;/li&gt;
&lt;li&gt;7-Zip&lt;/li&gt;
&lt;li&gt;mpc-hc&lt;/li&gt;
&lt;li&gt;&lt;h2 id="-"&gt;通訊軟體&lt;/h2&gt;
&lt;/li&gt;
&lt;li&gt;Line&lt;/li&gt;
&lt;li&gt;Telegram&lt;/li&gt;
&lt;li&gt;Skype&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;DIscord&lt;/li&gt;
&lt;/ul&gt;</description>
  <author>Soon Yang</author>
  <category>軟體</category>
  <category>閒聊</category>
  <guid isPermaLink="false">https://soon.azurewebsites.net/blog/20200213_newpcsoftware/</guid>
  <pubDate>Thu, 13 Feb 2020 02:43:13 GMT</pubDate>
</item></channel>
</rss>