pretty code

2023年3月14日 星期二

產生 GIF 最簡單的方式

有時候想用 gif 動畫表示實驗結果,又不確定那些線上網站工具是否會有問題?

最簡單的方式就是使用 ImageMagick,還可以指定置中好解決圖片大小不一的問題(-background rgb(0,0,0) -gravity center -extent 640x480),extent 就是圖片裡面最大張的規格,如果小於此規格的圖片背景就會填上黑色。

convert -background rgb(0,0,0) -gravity center -extent 640x480 -delay 70 -loop 0 test\*.jpg test\case_g.gif

2023年3月7日 星期二

numpy 一些操作記錄

>>> np.zeros(1)
array([0.])
>>> np.zeros(5)
array([0., 0., 0., 0., 0.])

-------------------------------
>>> np.zeros((1,5))
array([[0., 0., 0., 0., 0.]])
>>> np.zeros((2,5))
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

-------------------------------
>>> a = np.zeros((2,5))

>>> a[:, 0:2] = 3
array([[3., 3., 0., 0., 0.],
       [3., 3., 0., 0., 0.]])

>>> a[0:1, 0:2] = 5
array([[5., 5., 0., 0., 0.],
       [3., 3., 0., 0., 0.]])

-------------------------------
>>> a.ravel()
array([5., 5., 0., 0., 0., 3., 3., 0., 0., 0.])
>>> a.reshape(2, 5)
array([[5., 5., 0., 0., 0.],
       [3., 3., 0., 0., 0.]])

-------------------------------
>>> np.arange(5)
array([0, 1, 2, 3, 4])
>>> np.arange(6).reshape((2, 3))
array([[0, 1, 2],
       [3, 4, 5]])

-------------------------------
Multidimensional arrays can have one index per axis. These indices are given in a tuple separated by commas:

之前一直很少用 Python,趁此機會把 numpy 搞懂,numpy 的邏輯還是從 Python 的切片運算子來的,只是 numpy 的目的是為了科學或者說數學運算,故常用它來表示矩陣運算。在一些論文中,常常可能會有讓 A 矩陣的某行向量等於 B 矩陣的某行向量,如果是直接使用一個一個元素來指派數值,看來就不專業也很煩瑣。

結論就是上句英文就是操作多維陣列的技巧,故在操作時要先掌握住一個原則,這個陣列或是說矩陣是多少的維度,我想改變的又是那個維度上的資料,是整個向量還是向量裡的某一個元素,這時就可以清楚知道 [xx, xx, ...] 裡面要如何下了,正常來說 3 維就應該有 3 個索引,但要改的是某個特定維度的整個元素,這時後免的索引就可以省略。

>>> A = np.zeros((3, 2, 5))
array([[[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]],

       [[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]],

       [[0., 0., 0., 0., 0.],
        [0., 0., 0., 0., 0.]]])

>>> A[:, 0] = 1
array([[[1., 1., 1., 1., 1.],
        [0., 0., 0., 0., 0.]],

       [[1., 1., 1., 1., 1.],
        [0., 0., 0., 0., 0.]],

       [[1., 1., 1., 1., 1.],
        [0., 0., 0., 0., 0.]]])

>>> A[:, 1, -1] = 999
array([[[  1.,   1.,   1.,   1.,   1.],
        [  0.,   0.,   0.,   0., 999.]],

       [[  1.,   1.,   1.,   1.,   1.],
        [  0.,   0.,   0.,   0., 999.]],

       [[  1.,   1.,   1.,   1.,   1.],
        [  0.,   0.,   0.,   0., 999.]]])

2023年1月13日 星期五

nest2D on Windows

nest2D 是一個解決 2D 裝箱問題的 Python module,PrusaSlicer 或是 Cura 在擺放模型位置時似乎都有用到?

官方雖然說使用 pip insall 方式就可以順利安裝,但在 Windows 上似乎還有些相依性的問題要先解決,如果是 Linux 或是 Mac 可以去 github issue 列表就會看到解決方式,這裡就不多說了。

首先來說明一下 nest2D 的工作原理,它底層會使用 C++ 的 libnest2D,而 libnest2D 又有用到 Clipper 的裁剪功能、Boost 的 Geometry 等,因此我們也需要編譯這些函式庫。另外,nest2D 是使用 pybind11 的方式來跟 C++ 的 libnest2D 做介接。

如果一開始這些相關的函式庫沒有先準備好,可能在 cmake 過程中就會失敗,另外,如果是透過 pip install 過程中 setup.py 的觸發方式,其程式碼裡面有用到 pypandoc.convert 去讀取 README.md 的內容,因為 pypandoc 有改版,官方已經不建議使用 convert,故還是要下載 nest2D 程式碼來修改,才能避開這個問題,其實不只改這個,還要改 setup.py 裡面的 cmake 參數,由於不知還有多少要改,我這裡不採這個方式編譯。

這裡 nest2D 的編譯方式是直接使用 cmake 而沒透過 setup.py 來觸發 cmake,如果那些相依性的函式庫沒有先準備好的話,過程中大概會遇到一些問題。

底下是我建議的編譯方式,細節我就不說了,但是原則有把握住應該不會有太多問題。

使用 vcpkg 配合 VC 來安裝這些相依性 library,Clipper 在 vcpkg 的名字為 PolyClipping,第一次我不知道,是自己另外下載 code 來編譯,寫此文章的同時,才發現這個方式更快。

另外,從 github 下載 nest2D 時,記得要包含 submodule,才能順便下載 libnest2D 和 pybind11 的原始碼。

假設是指定 Release 編譯(cmake 在產生專案檔時也要指定 Release  -DCMAKE_BUILD_TYPE=Release,否則 link 時也會出錯),在 Release 資料夾便會有 build 好的 pyd 檔案及相關的 DLL,直接在 Python import 使用即可。

2023年1月11日 星期三

JSON array with array value in Go

太久沒寫 Golang 了,今天幫一個同事轉資料,資料格式類似 array 裡面又是 array,以 C 語言來類比就是 2 維陣列(真實例子比較複雜,維度有到 3 維,但概念是一樣的)。

一開始只想到用 struct 來定義格式並忽略欄位名稱,但這方式其實是錯的,還好後來有找回記憶,簡單記錄一下避免忘記。

簡單來說,Golang 的 struct 對應的是 JSON object,slice 對應的才是 JSON array,把握這個原則,JSON 應該就難不倒你了。

當然相比 Javascript 或是 Python,Go 內建的 encoding/json 模組確實沒那麼好用,網路上有很多人另外寫了 encoder/decoder 或是 parser,可以去 github 挑一個順眼的來用。

網路上也有神人寫好對應的 tool,可以來這裡測試。

另外,JSON 第一層一定要是 Object,不能是 Array。

想要的格式

{
    "array1": [
        [
            1,
            2,
            3
        ],
        [
            4,
            5,
            6
        ]
    ],
    "array2": [
        [
            1,
            2,
            3
        ],
        [
            4,
            5,
            6
        ]
    ]
}

程式碼

func main() {
array1 := [][]int{
{1, 2, 3},
{4, 5, 6},
}

array2 := [][]int{
{1, 2, 3},
{4, 5, 6},
}

arrays := make(map[string][][]int)

arrays["array1"] = array1
arrays["array2"] = array2

jsonStr, _ := json.MarshalIndent(arrays, "", "    ")

fmt.Println(string(jsonStr))
}

2022年12月13日 星期二

聖騎士的感恩畢業之旅

玩暗黑2 也半年多了,從 90 級開始便嘗試使用聖騎士打紅門,未通關前因為沒有破物免手段,83 級還卡在 A2 召喚者,無法突破擋路的鬼魂,最後怎麼過的我也忘了,應該是用幻化誓約硬打過去的?

之後每升一級至少打一次紅門,前幾次一直沒打到自己職業的火炬,高符也只掉過一顆貝和一顆羅,橡樹之心的伐克斯還是用兩顆古爾合的,一顆是敲靈魂石掉的,一顆沒有什麼印象,對於 20 年前只玩過非資料片的我來說,喬貝羅都是看 Youtube 知道的,所以對其他符文都沒概念,只對拓荒容易拿到的靈光和精神有感覺!玩到後來,心真的是有點累了XD

若不是看了 Youtube 玩家的影片,我還沒發現只要兩顆古爾就可以合成伐克斯!後來橡樹之心組完沒多久打鑰匙的過程中便在召喚者打到一顆羅,也順利組出人生中第一把悔恨!但在這之後高符進度便一直停滯不前。

其實不只高符,一些日常暗金我也都沒拿到,直到現在我都還沒有一雙蝕肉騎士!下面是我有印象在沒有聖騎士火炬之前,這一段時間農裝備、農鑰匙、練等級所拿到的東西及高符,一次單機版換難度重開地圖後,大莫傳送站出來左轉不到十步便是第三層入口,故花了很長一段時間收集不少裝備,不過真正能用的不多!雖然不到非酋,但離歐洲人應該還有段距離?

德古拉之手(地獄大莫,第一次打紅門前農出來的,另外還有哥布林腳趾)
死喪(地獄大莫,鬼頭、盜賊皇冠、骨隨行走、沙織等都是差不多時間農到的)
貝(暴皮,死靈召喚小弟收集鑰匙時意外掉落)
飾金盾(地獄大莫)
羅(地獄召喚者,第 5 次打紅門前收集鑰匙時意外掉落)
蜘蛛之網(地獄大莫)
安頭(地獄大莫)
滅絕小符(貢獻很久之前死靈打到的喬丹得來,也是看影片才知道單機可以這樣搞)
大君、旭日、腐肉之風(忘記哪邊打到的,不是尼拉就是三王?)
伐克斯(超市小怪,第 6 次打紅門後)
馬爾(超市小怪)
烏姆(超市小怪)
伊司特(超市小怪,另外還有一顆忘記是那掉的)
古爾(超市小怪)
撕裂者(督軍旁小怪)
馬拉(尼拉塞克)
薩拉森(尼拉塞克)
歐姆(世界之石第二層小怪,當機被回收)
奇拉(地獄暗黑吧?)
亞面(地獄暗黑)
聖騎士火炬(第七次打紅門,前六次分別為德魯伊、死靈、亞法遜、死靈、法師、法師)

持續利用時間好不容易升到 93 級後,連打兩次紅門都拿到法師火矩,此時也來到第 6 次挑戰紅門過後不久,覺得繼續這樣下去不是辦法,於是便給自己訂下畢業條件:

1. 升級到 94 再打最後一次紅門。
2. 拿到喬組謎團。
3. 再拿一顆羅組剛毅。

在緩慢的 94 級升級過程中,雖然在超市打到不少 20 號以上的符文,但離我想要的還有很大的距離,於是後來也放棄 2 跟 3 了。

就在上星期五回家前,我跟我老婆說,這週應該可以打紅門(缺 3 把鑰匙),如果沒打到聖火我就畢業了,如果有打到我就要來規劃一場畢業之旅,把地獄的每一關跟每張圖都再走一次?

果然皇天不負苦心人,終於在第 7 次挑戰紅門順利拿到聖火XD

為了替這趟旅程作個完美 Ending,我還特別放棄了地獄大墨那完美的打寶地圖,想說去惡夢打三王試試運氣,看看會不會比較容易掉出我要的蝕肉騎士?沒想到一樣的打寶率(MF 33X),暗金都沒掉幾件,掉的還都是一些很低階的暗金?沒關係,人生總不能事事如意!於是便果斷的回去地獄開始畢業之旅,沒想到卻讓我遇到這該死的複製 Bug?

回地獄第一件事便是脫下打寶裝及 MF 小符(打洞鑲完美黃寶軍帽、打洞鑲完美黃寶斯寇德、升級後的打寶腰帶以及 8 個 MF 小符,其中有些小符還帶有雙屬性,雖然都是沒人要的,但已經是我單機打了很久才有的),換上我的戰鬥畢業裝(打洞 15 攻速 CB 頭、強制、悔恨、打洞完鑚滿變飾金盾、德古拉、吸血鬼腰帶,鴉霜,雙吸手工戒、全抗傳送項鍊),為了順便統計畢業之旅時數,換完畢業裝後還特別關掉遊戲並清除遊玩記錄好做一次乾淨統計。

大概在 A1 打完血烏沒多久,沉淪魔便掉了一顆伐克斯給我,感覺似乎要轉運了?殊不知在一次回城整頓物品時,赫然發現共享倉庫怎麼多了一條吸血鬼腰帶?一開始還沒想太多,以為是自己以前打到沒注意,後來又看到一件跟身上一模一樣數值的強制甲,我就知道糟了,感覺就是共享倉庫回到換裝之前狀態?

稍微想了一下,大概知道發生什麼事了,這應該就是傳說中複製東西 Bug,巴哈有人有分享過,但以前只有看過就算,因為自己打寶還是比較有趣?

雖然我們有按下存檔離開,但因為 Switch 暗黑2 沒有退出遊戲選項,故雖然有存檔,但可能為了同步仍然需要時間,當你回到 Switch 主頁,在遊戲圖示上按下 X 離開遊戲,如果該存檔同步還沒做完,共享倉庫就會回到存檔前狀態,但我猜不影響背包?

我唯一一套的打寶裝就這樣沒了,為了懲處暴雪,我決定在畢業之旅後,拿我身上的兩顆伐克斯合歐姆,並利用此 Bug 複製兩顆甌姆來合成一顆羅,算是拿回我之前當機失去的歐姆以及彌補我消失的打寶裝和花在兩次打洞任務的時間。

也許有人有疑問為何不甘脆複製貝來得到喬組謎團?但我認為雖然我最後是利用此 Bug 多拿到一顆歐姆及一顆塔爾(畢業之旅後要組戰召才發現為了做手工拉爾都用完了,故需要一顆複製塔爾配身上兩顆塔爾組拉爾XD),勉強來說我有點小虧?但失去的東西和時間似乎也不值一顆喬?

總之,做人還是要有原則,暴血雖不仁,但我不能不義XD

事情發生都發生了,組戰召和懲處暴雪是完成畢業之旅後的事,我還是繼續我的感恩之旅,雖說我為了節省時間,一路上都在趕路XD

一路都在趕路的狀態下,直到打完古代人任務後才有時間好好看看風景,順便讓自己跟 A5 傭兵好好回顧一下這幾個月玩遊戲的點點滴滴,雖然不捨,但人生總是要繼續,一生中難得有這樣的時間玩了半年的遊戲,雖然很多時候都是半夜失眠起來玩遊戲的時間XD


終於要邁向最後關卡世界之石了,一路上遇到成群電鬼和女妖還是一路勇往直前,有一次甚至遇到 10 幾個女妖卡在下去王座入口前的道路,一個一個引來打都還看不到世界的盡頭?雖說有悔恨在手,好幾次都是透過傳送避免被扣到沒血(經驗值很難賺不想太冒險XD),最後還是窩囊的透過傳送下去王座,真的是有損我正義之師聖騎士的顏面XD

當然還是順利的解決掉巴爾,也清完之前偷懶沒去的尼拉塞克,還順便去牛關聽牛哞哞叫?這趟感恩的畢業之旅也終於劃下了句點!

統計一下畢業之旅收穫:

伐克斯(A1 沉淪魔)
烏姆(A2 小怪)
馬爾(A3 小怪)
幾件低階到想不起名字的暗金及綠裝
暗金次元刃(牛關)

花了應該有超過 10 個小時,坦白說東西真的很難掉,鑰匙跟粉也沒看到半個XD

當然也不是說就從此不玩了,但真的要很有空才會再開啟遊戲,人生總是要有取捨!

最後,抓些圖留個記念。

聖騎士畢業服裝

最後等級

19/20 聖火

CB 頭 + 15 攻速, 23 冰抗

唯一一個戰鬥技能版,還是之前死靈打到的!

強制甲

悔教夫婿覓封侯之悔恨本人

滿變飾金盾,農了非常久,那時連烏姆都沒有,只能鑲顆完鑽!

獻祭很久之前死靈打寶打到的喬丹得來,數值真爛!但也打不到第二顆喬丹了。

通關後兼職古慕奇兵拿到的第一顆藍姆組成執法者,也虧有了它才能打牛關,不然每次都只能落荒而逃!

從死靈那強奪來的傳送項鍊,沒辦法,後來比較喜歡聖騎士,雖然聖騎的打洞任務有兩個都用在死靈身上的打寶裝。

死靈打寶時就拿到的。

手工藝品做了很久後才勉強能看的雙 C 戒,有了它之後從此不用喝藍水!

死靈畢業武器


A5 傭兵




33X MF,農地獄大墨,3pp 所有收穫,只有少數裝備是其他時候練等打別的怪掉的

A2 傭兵專用

A5 傭兵專用

阿瑪的裝備,已經丟掉一堆弓了,不然放不下。

聖騎士通關時用的武器(A3 ~ A5),這支是後來掉的,原來用的數值更差XD

只差雷神之力的腰帶群。

阿蠻的裝備。

阿蠻的雙手武器。

一堆衣服,後來放不下,綠裝又開了一個號放。

後來開的綠裝人物倉庫。

一些頭盔。

法師的暗金裝備。


差一件的不朽套裝。

一些手套,法拳打了快 10 雙有。

一些盾牌。

一些鞋子,但沒有蝕肉騎士,哭哭。

第三個創號人物,原本只是想放寶石,後來也打了幾個刺客暗金武器。

看別人平民聖騎士過關時拿的,一直很想要,但拿到已經是好久以後的事,升級它又是更久之後的事,結果升級沒多久又拿到一支比原來好的,但已經沒有符文可升級了。

一些武器,其實不只這些,已經丟掉不少,包括可能有用的冰鋼之眼,搞不好擊頭者及沙薩比劍都有打過被丟了?

動物園園長的裝備。

最後組的戰召和剛毅,不得不說,真的很爛XD



2023/01/03 更新

趁著元旦連假,把之前還在普通難度 A2 的野蠻人練通關,靠著遺產,惡夢 8pp 大部份情況下都還算順暢,到了打巴爾前就開始感受到不足,借了聖騎士的悔恨、剛毅以及傳送項鍊,惡夢還是打過了,但到了地獄後明顯不行,我想這也合理,我的聖騎士要輕鬆打 8pp 也是要改靠 A2 力量傭兵加上死喪才有流暢的感覺,故只好改 1pp 難度練通關!

練通關後,因為之前已經有 4 把鑰匙了,想說趕快利用死靈配傳送項鍊加解謎杖來快速收集鑰匙,看是否能在上班前拿到野蠻火炬?


由於沒有共用空間交換加上懶得拔來拔去,只把剛毅和傳送項鍊從野蠻人身上脫掉,聖騎士只拿把無形彎月斧誓約就要挑戰紅門了,沒想到卻在莉莉絲那關吃盡苦頭,只有一萬的準確率在打紅色女長槍兵時常 miss,雖然還是可以打得動,但效率確實變差,就在小心翼翼的尋找莉莉絲時,經過一個棺木順手點了一下,居然掉下了我夢寐以求的喬,一開始我也是會意不過來,過了 10 秒才意會到這是傳說中的喬,於是我的謎團就誕生了XD



還是老樣子,差 2 就觸底的防禦率,除了悔恨以外,我果然跟高等符文裝備不合XD

雖然該次紅門最後還是順利過關,但又拿到法師的火炬?沒關係,現在有謎團了,就在隔天最後一天收假前,死靈使用謎團迅速的收集齊鑰匙,再交由拿無形彎月斧誓約的聖騎挑戰紅門?終於我的野火也到齊了XD


2023/01/09 更新

昨天晚上想說不再開遊戲了,拿了古爾及伐克斯想來組死亡呼吸,一時沒注意到鑲材種類,於是得到了一把鑲滿寶石的斬鐮XD


今天下班時老婆說,反正等她洗澡的空檔時也不方便看書,不如還是照常玩遊戲?於是我又把遊戲開啟了XD

就在測試 8pp 雙熱聖騎士怎樣打才有效率的時候(應該說怎樣才不會被冥河娃娃搞死,如果不用傳送逛大莫地下二層時,結論還是帶執法者,靠傭兵擋XD),在地獄大莫那翻箱子又翻出一個貝XD


2023/01/22 更新

今天是大年初一,早上在等待回父母家的空檔,使用祝福之槌聖騎士在 5pp 牛關中終於打到第一雙蝕肉騎士,晚上回家後又打到第一條雷神之力,真是一個好的開始XD

2023/01/26  更新

今天直接使用 11K 祝槌傷害的聖騎士挑戰 8pp,雖然不到無腦打,但也是比我的悔恨雙熱聖騎快上很多,在刷某場避難所使用傳送要打大菠蘿時,途中看到一個沒打開過的隱藏物品,順手點了一下,又掉了一顆羅,一時之間還真不知道要拿來做什麼XD

2023/01/27 更新

一樣是祝槌聖騎,但把帥氣的 CB 頭換掉後,傷害來到 12K,一樣在 8pp 避難所,在封印幽魂怪那掉了第一顆 33 號薩德XD

這下我這隻聖騎士就只剩 29 和 32 沒掉過了XD

題外話,祝槌傷害強歸強,8pp 還是得視情況更換傭兵武器,例如牛關不帶死喪,我的聖騎士只能落荒而逃,如果沒有謎團我應該會被一群牛圍死XD

2023/01/28 更新

第三顆羅入手,這次換大菠蘿掉的XD


2023/01/29 更新

玩祝槌玩到有點乏味,再度換上 CB 頭和蝕肉騎士,雖然雙熱相關技能只能點一點,但配上悔恨在 A1 虐菜還是沒問題,由於 8pp 難度常掉歐特,沉浸在雙熱的打擊感中順手撿了一顆歐特也是很正常的,直到過了 10 分鐘後點開物品欄才發現是歐姆扮歐特XD

這次考慮了許久才決定使用幻化來組,反正給聖騎用的一定拿得起來XD

2022年12月1日 星期四

致我失去的歐姆

從 6 月份買 switch 到現在,都只有玩暗黑 2 重製版這款遊戲,雖然說我也只有多買了另一套什麼七龍珠的遊戲而已XD

在這紛紛擾擾亂風雲的幾個月當中,只能在有限的時間內玩遊戲,大多是下班等老婆洗好澡的空檔以及半夜失眠睡不著覺的漫漫長夜,但我也陸續用了死靈和聖騎士在單機版順利通關。

昨天快睡覺前在世界之石第二層傳送站入口沒多遠的地方,使用正義之師聖騎士打一堆小矮人後掉了我人生中的第一顆歐姆,一開始還想說不會是歐特扮歐姆吧XD

就在不敢相信開門準備回城組戰召的進傳送門當下,單機版遊戲又來個無預警當機,這已經不知道是第幾次了!

於是我的歐姆也就這樣 GG 了,再見了我的歐姆﹍

不知道下次打到高符時先存檔會不會好一點?真是去你的暴雪呀!


2022/12/12 更新

先存檔看來沒有比較好,尤其在我無意中試出複製大法後,即使已按下存檔離開,還是有機會被還原到存檔前,這樣的程式是不被允許的XD

2022年11月30日 星期三

PCL - coefficients detail information

RANSAC 是 PCL 裡面蠻常用的一種演算法,我們常利用它來偵測平面或是一些幾何圖案的模型。

我們會利用 setModelType 來偵測不同的模型,由於 PCL 是用 C++ 開發,裡面用到大量的 Template,再加上又有一些 class 的繼承,故有時候一樣的語法,但取到的值有不同的意義。

pcl::ModelCoefficients 在不同的模型下,就有不同的意義,故裡面的 values 的型別才會是 vector,其數量也不同。

舉例來說,SACMODEL_NORMAL_SPHERE 要偵測的是球體,故 values 共有 4 個值,分別代表 center.x,、center.y、center.z、radidus。

昨天到現在一直找不到官方的說明文件在哪?剛好現在看到,馬上留個記錄先。