2021年12月27日 星期一

解決 CPU 待機溫度過高的問題

 解決 CPU 待機溫度過高的問題

前言

  在先前的解決電腦總是很吵的問題 裡透過重塗散熱膏的方式解決 CPU 的風扇總是很吵的問題,但之後發現 CPU 的待機溫度還是有點高,在此把解決的過程做個紀錄。


內容

  在先前的 解決電腦總是很吵的問題 之後,透過 [ www.alcpu.com ] Core Temp 這個軟體來看 CPU 的待機溫度,結果發現溫度會達到 60 度,所以我又拆開機殼後,過沒幾分後溫度就會降到 45 度左右,看一下機殼的狀況後發現機殼風扇沒再轉,本以為是電線鬆脫,所以重插電線,但發現還是不會動,摸了一下風扇的中心部位遽然異常的燙,沒錯,兇手就是機殼風扇,後來買了個新豐善後待機溫度就降到 45 度。


  機殼風扇本以為是個不太重要的存在,但沒想到它不轉動也就算了,還持續發熱,這個發熱遽然可以讓機殼的溫度相差 15 度,真是讓我改觀了。


相關文章與資料

解決電腦總是很吵的問題

[ www.alcpu.com ] Core Temp

2021年12月20日 星期一

解決電腦總是很吵的問題

 解決電腦總是很吵的問題

前言

  最近電腦總是不定時發出很吵的聲音,本想吵一陣子忍一下就過去了,結果發現問題越來越嚴重,這裡把解決的過程做個紀錄。


內容

  在發出很吵的聲音下拆開機殼,發現很多灰塵,所以就把整個機殼就個清潔,不過清潔完後還是會發生,本想就算了忍一下就過去了,但沒想到狀況越來越嚴重,在開機後會處在打開任何影片都會讓顯卡驅動程式 crash ,在反覆多次 crash 後會開始變穩定,想說只發生在開機的那段時間,忍一下就過去了,但過了一陣子狀況更差了,偶而開始跳小藍畫面,我終於決定不忍了。


  查了一下發現最有可能的是 CPU 的散熱膏可能乾了,需要作重塗的動作,所以就去買了散熱膏與酒精,CPU的散熱片我第一次拆,要先拔除風扇電源,再來是將固定的卡栓轉開,卡栓上面有標記旋轉的方向,照著旋轉即可,拆下來後就可以看到 CPU ,接著用酒精清理 CPU 上層與散熱片的接觸面,再來就把散熱膏塗上,塗完後再把散熱片裝回去就完成重塗的動作。


  重塗完後重新開啟電腦馬上有感,開機後觀看影片不再發生顯卡驅動程式 crash 的狀況,很吵的聲音也都不見了,以前一直認為重塗散熱膏是個麻煩的事,頂多只會造成程式跑慢一點而已,但實則不然,不重塗散熱膏可能會造成作業系統的行為異常(如顯卡驅動工作不正常),這次的經驗真是讓我大大的改觀了。

2021年12月13日 星期一

在 JavaScript 檢查空字串的方法

 在 JavaScript 檢查空字串的方法

前言

  最近在 [ www.itread01.com ] 如何檢查JavaScript中的空字串? 裡發現簡短的檢查空字串的方法,在此做個紀錄。


內容

  範例如下

const ar=[ null , undefined , '' , '0' , '123' ];
for( let i=0;i<ar.length;i++ ){
  //use !!
  console.log(`[${i}]:${ !!ar[i] }`);
  //use Boolean()
  console.log(`[${i}]:${ Boolean( ar[i] ) }`);
}


方法有兩個,一個是"!!",另一個是 Boolean() ,這兩個看起來都很簡短,要注意連字串長度是0也會被判為空字串,"!!"利用的是"!"運算的特性,可以理解 null 與 undefined ,但令我意外的是字串長度是0時也會有一樣的結果,第二個方法就真的是新發現,轉成布林值得結果剛好跟空字串的結果一致,這就只能用記的了。


參考資料

[ www.itread01.com ] 如何檢查JavaScript中的空字串?

2021年12月6日 星期一

讓 JavaScript 的 function 支援不同型別的輸入

 讓 JavaScript 的 function 支援不同型別的輸入

前言

  最近需要 讓 JavaScript 的 function 支援不同型別的輸入,結果發現遽然忘了怎麼做,這次把複習的過程做個紀錄。


內容

  範例如下

class MyClass{
  constructor(){
    this._buffer = [];
  }
  addNumber(ele){
    if( typeof ele === 'number')
      this._buffer.push(ele);
    else if( Array.isArray(ele) ){
      for(let i=0;i<ele.length;i++)
        this._buffer.push( ele[i] );
    }
    else
      console.log('unsupported type!');
  }
  showContant(){
    this._buffer.forEach( function(ele){
      console.log(ele);
    });
  }
}
let a=new MyClass();
a.addNumber(1);
a.addNumber([2,3,4,5]);
a.showContant();


範例的 addNumber() 可以同時支援 number 與 Array 型別,要注意的是檢查是否是 Array 是用 Array.isArray() ,而非使用 typeof ,還有要注意這裡推入資料時使用的是傳統迴圈,而非使用 forEach() ,這是因為 this 這個變數並不能直接在匿名函式中正常動作。


2021年11月29日 星期一

關於 JavaScript 的 使用負值當索引的注意事項

 關於 JavaScript 的 Array 使用負值當索引的注意事項

前言

  最近發現 JavaScript 的 2022 標準裡有新增 Array 可以使用負值當索引,實際用了以後發現一點問題,在此做個紀錄。


內容

  範例如下

let ar = [ 1 , 2 , 3, 4 , 5 ];
console.log( ar.at(-2) );//4
let ar1 = ar.slice(3,5);
console.log(ar1);//[4, 5]
//Follow code has trap...
let ar2 = ar.slice(-2,0);
console.log(ar2);//[]
//
let ar3 = ar.slice(-2);
console.log(ar3);//[4, 5]


使用負值當索引幾乎可以想成倒過來取得,就像範例的"ar1"的做法一樣,但如果用這個想法用在 slice() 時就發現有問題,在範例的"ar2"的用 0 當作結尾,結果會得到空陣列,如果要取到結尾要用"ar3"的作法才行,也就是說 0 不能當作負值的結尾,這點要注意。


參考資料

[developer.mozilla.org ] Array.prototype.at()

2021年11月22日 星期一

關於 JavaScript 的 arguments 變數

 關於 JavaScript 的 arguments 變數

前言

  最近使用 JavaScript 的 arguments 變數發現跟自己想的不太一樣,在此做個紀錄。


內容

  範例如下

function showAruguments(){
  //
  for(let i=0;i<arguments.length;i++){
    console.log(`Array[${i}]:${arguments[i]}`);
  }
  //arguments not suport forEach...
//   arguments.forEach(function(ele){
//     console.log(ele);
//   });
  let args = Array.from(arguments);
  args.forEach(function(ele){
    console.log(ele);
  });
}

showAruguments(1,2);


在 function 裡可以透過 arguments 來實現可變引數,這個變數用起來很像 Array ,但實驗一下則不然,新的 Array 標準的 forEach() 是不支援的!如果要優雅的提取 arguments ,可以透過 Array.from() 來創造一個新的 Array ,在用新的 Array 來使用 forEach()。


相關文章與資料

用佚代的方式瀏覽陣列

2021年11月15日 星期一

在 JavaScript 裡取數值的精度

 在 JavaScript 裡取數值的精度

前言

  最近需要過濾數值的精度時發現遽然沒有預設的 function ,所以就自己來寫一個,在此做個紀錄。


內容

  範例如下

function ExtraFloatValue(value, exp){
  if(exp === undefined || exp < 0 )
    return value;
  let baseValue = Math.pow(10 , exp);  
  return Math.floor(value * baseValue) / baseValue;
}
console.log( ExtraFloatValue(3.14159 , 4) );//3.1415


範例的用法很簡單 , exp 是要取的精度,所以範例的結果會取到小樹的第四位。

2021年11月8日 星期一

Javascript 的 function 寫法的問題

 Javascript 的 function 寫法的問題

前言

  最近在偶然間發現 JavaScript 的 function 有我不知道的寫法,在此做個紀錄。


內容

  範例如下

function myCall(){
  console.log('myCall()');
}
let myCall1 = function(){
  console.log('myCall1()');
}
//Not recommanded
let f = function myCall2(){
  console.log('myCall12()');
}
//Follow will be failed
//myCall12();
f();

  

前面兩種是常見的 function 寫法,第三種是新發現的寫法,當然也發現這寫法會讓我以為 myCall() 與 f() 都可以正確喚起,但是實則不然, myCall2() 是不可以喚起的!雖然這個寫法看不出有什麼優勢,但還是學習了。

2021年11月1日 星期一

使用 JavaScript 的 Array 的注意事項

 使用 JavaScript 的 Array 的注意事項

前言

  最近使用 JavaScript 的 Array 發現跟自己的觀念有不一樣的地方,在此把學習的過程做個紀錄。


內容

  範例如下

let a = [ 1  , 2 , 3 , 4 , 5];
let ar = new Array( 1 , 2 , 3 , 4 , 5 );
let ar1 = new Array( 10 );
console.log(`a length : ${ a.length }`);
console.log(`ar length : ${ ar.length }`);
//ar1 not equal ar1 = [ 10 ]
console.log(`ar1 length : ${ ar1.length }`);


//forEach() will ignored undefined value
//so,nothing to show
ar1.forEach(function(ele){
  console.log(ele);
});

//All value are undefined
for(let i = 0 ; i < ar1.length ; i++)
  console.log(`ar1[ ${ i } ] : ${ ar1[i] }`);


範例的'a'使用常見的手法建置陣列,'ar'使用的是 new Array() 來達成,但'ar1'看似建構一個只有一個元素的陣列,但其實不然,它建構的是擁有 10 個元素的陣列!內容全都是 undefined ,再來說一下最近才發現 forEach() 會過濾 undefined 數值,如果使用傳統的 for 來瀏覽就可以完整瀏覽。


相關文章與資料

用佚代的方式瀏覽陣列


2021年10月25日 星期一

關於 Python 的繼承問題

 關於 Python 的繼承問題

前言

  在之前的 Javascript 的 class 繼承的注意事項 實驗了 JavaScript 的 super 的用法,這次把相同的做法放在 Python 會有一樣的結果嗎?在此把學習的過程做個紀錄。


內容

  範例如下

class BaseClass:
    def __init__(self):
        pass
    def call(self):
        print('I am BaseClass.')
#
class ExClass(BaseClass):
    def __init__(self):
        pass
    def call(self):
        print('I am ExClass.')
#
class ExClass1(ExClass):
    def __init__(self):
        pass
    def call(self):
        #Follow  code will failed!
        #super().super().call()
        super().call()
        print('I am ExClass1.')
#
a = ExClass1()
a.call()


實驗的結果和 JavaScript 一樣, super 只能單次使用,不能連著用,看來這個特性和 JavaScript 是一致的!


相關文章與資料

Javascript 的 class 繼承的注意事項

2021年10月18日 星期一

JavaScript 的 Static initialize(靜態初始化) 語法

 JavaScript 的 Static initialize(靜態初始化) 語法

前言

  在之前的 初探 JavaScript 的 class 語法 介紹了 class 的語法,但無法使用 Static initialize(靜態初始化) ,最近發現新標準已經開始支援了,在此做個紀錄。


內容

  範例如下

class CMyClass{
  static __var = 'Hello static member';
  static{
    console.log(CMyClass.__var);
  }
}


用起來相當直覺,只要用 "static {}" 起來就可以直接包在 class 的區塊裡,以前必須要寫在 class 的區塊外。這次也發現 static variable 也支援了, 不知不覺 JavaScript 已經實現了常見的 class 語法了。


參考資料

[ juejin.cn ] 即将到来的ECMAScript 2022标准


 相關文章與資料

初探 JavaScript 的 class 語法

2021年10月11日 星期一

關於 Python 的 if in 語法

 關於 Python 的 if in 語法

前言

  以前我一直認為 for 、 if  與 in 是各自獨立的語法,所以不會在 if 的時候使用 in ,但最近發現這個觀念是錯的,應該是 for in 與 if in 這樣分才對,所以就做個學習,在此做個紀錄。

 

內容

  範例如下

str = 'Hello world'
if 'world' in str:
    print( 'True' )
else:
    print( 'False' )
#
res = 'True' if 'world' in str else 'False'
print( res )


範例的開頭使用 if in 來檢查 str 裡是否有'world',如果有就顯示'True',相反則是'False',接著是個人覺得很不直覺的語法,把 if else 一行解決的語法與 if in 搭配使用的範例,不直覺地點就是成立的結果要打在前方,語法就是覺得讀起來有些不舒服,不過卻看到語法教學網站推薦使用就是了。


參考資料

[ jarvus.dragonbeef.net ] Python技巧:新手提升效率的必學語法

2021年10月4日 星期一

JavaScript 的新語法"??"

  JavaScript 的新語法"??"

前言

  最近看到 JavaScript 的語法裡有"??",就抽空做個學習,在此做個紀錄。


內容

  範例如下

let a;
let b = a ?? 5;
console.log(b);//5
let x;
x ??= 12;
console.log(x);//12


第二行的意思可以解釋成"如果 a 是 null 或 undefined  , b 就等於 5 ",可以想成就是當某變數為空值時給予預設值,這個語法還有另一種用法"??=",第四行可以解釋成"如果 x 是 null 或 undefined  , x 就等於 12 "。


參考資料

[ dev.to ] New Features in ECMAScript 2021 (with code examples)

2021年9月27日 星期一

在 Obsidian 使用 Youtube 影片

 在 Obsidian 使用 Youtube 影片

前言

  在之前的 好用的筆記軟體 Obsidian 介紹了 Obsidian  ,但最近因為需要在筆記裡放上 Youtube 影片,如果使用超連結的做法會無法即時看到影片,所以就來研究如何即時看到的方法在此做個紀錄。


內容

  要即時看到 Youtube 影片的做法是先到要貼的  Youtube 影片頁面,如下圖

按下"分享"按鍵


按下頁面的"分享"按鍵可以得到下圖

按下"嵌入"按鍵

按下"嵌入"後可以得到下圖

複製右側的內容


複製右側的內容直接貼到 Obsidian 就可以直接看到 Youtube 影片,如下圖

結果


參考資料

[ www.reddit.com ] Obsidian Basics: iframe - Embed widgets, Tweets, Weather, YouTube, stock data, map, calendar, etc.


相關文章與資料

好用的筆記軟體 Obsidian


2021年9月20日 星期一

好用的筆記軟體 Obsidian

 好用的筆記軟體 Obsidian

前言

  常見的文書處理軟體像 Notepad++ 處理單一文件時很好用,但如果文件與文件之間有關連性的時候就不是很好用,尤其是文件很多又有關聯性,這時候就需要用筆記軟體,筆記軟體可以輕鬆地建立關聯性,這裡推薦使用 Obsidian ,在此做個紀錄。


內容

  軟體可以在 [ obsidian.md ] Obsidian 官網 取得,完全免費並且不用註冊帳號,軟體的使用介面如下

Obsidian 的操作介面


操作介面不太像傳統 Windows 的樣子,但其實不難懂,畫面"1" 的位置就是功能列,可以新增檔案與資料夾,畫面"2" 的地方會顯示工作資料夾下的文件,畫面"3"的部分會顯示文件與功能視窗,每個都是浮動式窗可以自己規劃。 Obsidian 的每個文件都是".md",不難想像他支援時下流行的 markdown 語法,如果要新增圖片可以用拖曳的方式新增, Obsidian 會自動把圖片複製一份到工作資料夾下,這功能很好用,接著是 Obsidian  特有的語法,這是為了建立關聯性而新增的,如下圖

關聯性語法


畫面"1" 的地方把要關聯的文件檔名用"[["與"]]"包起來就可以建立關聯性,如果點擊畫面"2"的地方就可以直接跳到該文件,這功能就像是網站的超連結一樣相當好用。


參考資料

[ obsidian.md ] Obsidian 官網

[ wcc723.github.io ] 十分鐘快速掌握 Markdown

2021年9月13日 星期一

關於JavaScript 的表達數值新語法

關於JavaScript 的表達數值新語法

前言

  最近發現 JavaScript 的表達數值新語法滿實用的,就來學習並做個紀錄。


內容

  先看範例

let num = 100_000;
console.log( num );
//
let bNum = 0b1_00;
console.log( bNum );
//
let hNum = 0xa0_ff;
console.log( hNum );


第一段就是單純的 Number ,但跟以往的表達不太一樣的是多了個"_",這個"_"可以自幾加,例如每三個 0 就加一個"_",這樣在視覺上會很方便看出要表達的數值,第二段式表達二進制,在數值前加"0b"後接數值即可,這裡也支援使用"_",第三段則是十六進制的表達,在數值前加"0x"後街數值即可,同樣也支援使用"_"來方便辨識數值。


參考資料

[ dev.to ] New Features in ECMAScript 2021 (with code examples)

2021年9月6日 星期一

使用繪圖板時要注意感測區比例的問題

 使用繪圖板時要注意感測區比例的問題

前言

  最近換了繪圖板,換成 Wacom intuos pro 中型款,但發現畫斜線時手感怪怪的,所以就來研究是什麼問題,這裡把解決的過程做個紀錄。


內容

  在發現手感怪怪後,我用尺排成 45 度,接著用筆沿著尺畫,看畫面上的現是否會是 45 度,結果發現遽然不是!研究一陣子後發現是感測區比例的問題,可以看下圖

Wacom intuos pro 的感測區規格

我的螢幕是 16:9 ,長寬比約為 1.77 ,但 Wacom intuos pro 中型款的感測區的長寬比約是 1.513 ,這就是造成明明畫了 45 度線,但畫面卻不會呈現 45 度的原因。要如何解決呢?可以在 Wacom 的軟體做調整,如下圖

調整"比例一定"


在 Wacom 軟體上選擇"鏡射"頁面後,再開啟"比例一定",如此設定後就可以得到畫幾度線畫面就呈現幾度線。


參考資料

[ www.wacom.com ] wacom-intuos-pro

2021年8月30日 星期一

關於 JavaScript 的 Enumerate

 關於 JavaScript 的 Enumerate

前言

  最近在寫的時候需要用到 Enumerate ,需要瀏覽 Enumerate 的數值,遽然突然間忘記要怎麼瀏覽數值(values),既然會忘記,就在此做個紀錄。


內容

  直接看範例

var Shape = {
  box : 0,
  circle : 1,
  triangle : 2
};
for(let ele in Shape) 
  console.log( `${ ele }:${ Shape[ele] }` );
//
for(const [key, value] of Object.entries(Shape) ) 
  console.log( `${ key }:${ value}`);


範例有兩個寫法,第一個寫法單純利用 for in 來取出每個 key ,在用 key 取值,雖然作法不優雅,但需要的 JavaScript 版本比較低,第二個寫法需要用到 for of ,整體看起來比較優雅,但要注意柳覽器是否有支援到  for of  語法。


參考資料

[ stackoverflow.com ] How do I enumerate the properties of a JavaScript object?

2021年8月23日 星期一

關於 JavaScript 的 eval() 的直接喚起與間接喚起

 關於 JavaScript 的 eval() 的直接喚起與間接喚起

前言

  最近發現 eval() 遽然有分直接喚起與間接喚起,雖然平常我不太用這個函式,但有時不得已還是要使用,所以就來做個學習,在此做個紀錄。


內容

  直接看範例,如下

var x = 'xxx';
function test(){
  var x = 'yyy';
  console.log( eval( 'x' ) );//'yyy'
  var f = eval;
  console.log( f( 'x' ) );//'xxx'
  console.log( ( 0 , eval )( 'x' ) );//'xxx'
  
}
test();


範例第一次和喚起 eval() 會顯示"yyy",這點跟認知的一樣,也被稱為"直接喚起",那間接喚起呢?

可以看到事先用一個變數賦值 eval 後,再透過該變數來喚起 eval() ,這樣的結果遽然不一樣!可以看到結果遽然顯示"xxx",也就是顯示的是 global 變數,而非 local 變數,間接喚起還有一個特殊的寫法,也就是"( 0 , eval )",這個語法可以在  [ developer.mozilla.org ] eval() 裡找到,和上述利用變數賦值 eval 的結果會一樣,這個語法可以不用再宣告變數,相當方便。請注意,範例的宣告都是用 var 來宣告,如果改成 let 的話就永遠只會顯示 local 變數,也就是如果程式碼已經習慣用 let 來宣告的話,那直接喚起與間接喚起沒差。


參考資料

[ developer.mozilla.org ] eval()

2021年8月16日 星期一

Javascript 的 class 繼承的注意事項

 Javascript 的 class 繼承的注意事項

前言

  在上一次的 完整的 JavaScript 使用 Class 的範例 沒提到繼承相關的語法,由於本身設計的習慣不太愛用繼承的特性,但最近抽空研究一下繼承,法現有的特性跟我想的不一樣,在此做個紀錄。


內容

  先看範例,如下

class BaseClass{
  call(){
    console.log('I am BaseClass' );
  }
}
class ExClass extends BaseClass{
  call(){
    console.log('I am ExClass' );
  }
}
class ExClass1 extends ExClass{
  call(){
    //Follow code will failed!
    //super.super.call();
    //
    super.call();
    console.log('I am ExClass1' );
  }
}
let a = new ExClass1();
a.call();


範例的繼承關係很簡單,BaseClass -> ExClass -> ExClass1 ,單純的喚起 call() ,因為繼承的關係會發生 override ,要喚起父類別可以透過 super ,但如果企圖從 ExClass1 喚起 BaseClass 的話這是不允許的!本以為可以透過 super.super 的方式來達成,但實際實驗卻是會有錯誤,這意思是 JavaScript 無法跨過兩次以上的繼承,雖然實務上應該不太會碰到,但還是要注意一下。


參考資料

[ developer.mozilla.org ] super


相關文章與資料

完整的 JavaScript 使用 Class 的範例

2021年8月9日 星期一

完整的 JavaScript 使用 Class 的範例

完整的 JavaScript 使用 Class 的範例

前言

  在之前的 Javascript 開始在 Class 裡支援 private method 講述了 private method 的使用,但由於我個人不常用 class 語法,所以就想要留一個範例寫法,在此做個紀錄。


內容

  直接看範例

class MyClass{
  static #staticVariable = 'I am static variable.';
  constructor(){
      this._name = 'I am MyClass';
  }
  //property
  get name(){
    return this._name;
  }
  set name(name){
    this._name = name;
  }
  //public method
  publicMethod(){
    console.log('I am public method.');
  }
  //private method
  #privateMethod(){
    console.log('I am private method.');
  }
  //static method
  static staticMethod(){
    console.log('I am static method.');
  }
}


先看到 static variable 的寫法,這裡有用到 private 的語法,意外的遽然可以用,在 class 裡可以給預設值,再透過 static method 來提取或操作,這是常見的用法,如果不需要唯讀屬性的話可以移除"#"。 getter 與 setter 的語法相當簡單好懂,但不知為什麼並不能搭配 static 來使用,所以static variable 還是要透過 static method 來提取。public method 與 private method 在 Javascript 開始在 Class 裡支援 private method 已經提過了就不再講述。static method 語法簡單,只需加"static "即可。


參考資料

[ developer.mozilla.org ] getter

[ developer.mozilla.org ] setter


相關文章與資料

Javascript 開始在 Class 裡支援 private method

2021年8月2日 星期一

Javascript 開始在 Class 裡支援 private method

 Javascript 開始在 Class 裡支援 private method 

前言

  最近查找資料時發現 Javascript 開始在 Class 裡支援 private method ,實驗了一下發現 Chrome 與 Firefox 更新到最新的版本都可以支援,之前對 Class 的語法很介意它不支援 private method ,所以就不怎麼愛用,現在這個問題沒了,就順便鎮這個機會做個學習,在此做個紀錄。


內容

  先看以下範例

class MyClass {
  publicMethod() {
    console.log("I am public method.");
  }
  #privateMethod() {
    console.log("I am private method.");
  }
  callAllMethod() {
    this.publicMethod()
    this.#privateMethod();
  }
}

let people = new MyClass();
people.callAllMethod();


private method 的語法異常的簡單,只需在 method 的前面加上"#"來區隔,但要注意的是喚起時也需要"#"來喚起,不能直接打名稱,這樣以後就可以捨棄用閉包的做法來完成 private method 。


參考資料

[ dev.to ] New Features in ECMAScript 2021 (with code examples)

2021年7月26日 星期一

在 Krita 安裝新的筆刷

 在 Krita 安裝新的筆刷

前言

  常常在看 Krita 的教學影片時發現別人有很多一看就知道不是官方的預設筆刷,所以就想學一下如何安裝新的筆刷,在紫把學習的過程做個紀錄。


內容

  這次示範的筆刷可以在 [ www.davidrevoy.com ] Deevad 裡下載,如下圖

下載筆刷

下載後解壓縮可以得到 .bundle 檔,接著開啟 Krita ,如下圖操作
選取"管理資源"

操作後可以得到下圖
選取"匯入資源包"

操作候選取下載來的 .bundle 檔後,可以得到下圖
安裝成功的畫面

安裝完後就可以在筆刷視窗看到新增的筆刷,如下圖
安裝完後的筆刷視窗

2021年7月19日 星期一

修正 Krita 的直線工具異常對齊的問題

 修正 Krita 的直線工具異常對齊的問題

前言

  最近在使用 Krita 時發現直線工具怪怪的,明明沒有壓 shift 也會發生對齊的狀況,而且奇怪的是還會看地方,在不同的地方會有不一樣的對齊行為,這裡把解決的過程做個紀錄。


內容

  在發生直線工具異常的當下本以為是該版本的 Krita 的 Bug ,所以就去更新到最新版本,但不幸地狀況並沒有改變,異常的對齊行為依舊,拖動目的點時總是特定角度就發生對齊,由於異常對齊的地方剛好發生在對稱工具上,如下圖

Krita 的對稱工具

但我發現不論怎麼移動對稱工具的線,直線工具的對齊行為還是會異常,所以排除是對稱工具造成的異常,最後在 google 一陣子發現關鍵字"Snapping",中文翻譯是"吸附到",原來 Krita 有預設的 Snapping ,要如何關閉它呢?如下圖

關閉 Krita 的預設的吸附


Krita 預設會有"吸附到影像邊框"與"吸附到影像中心",這就是造成直線工具異常對齊的兇手,只要將這兩個關閉就不會再發生異常對齊了。


參考資料

[ docs.krita.org ] Snapping

2021年7月12日 星期一

關於 Aery pf1061 的使用心得

 關於 Aery pf1061 的使用心得

前言

   Aery pf1061 是一個平價繪圖板,價格親民又有 8192 階的力度感應,但最近它突然的就壞了,想想我只用了一年兩個月左右它遽然就壞了,這次就順便把使用心得做個紀錄。

 

內容

  Aery pf1061 繪圖板如下圖

Aery pf1061 繪圖板

筆與筆座如下圖

筆與筆座

外觀不知是不是為了省成本使用了看起來很廉價的塑膠,照片由於解析度不足所以看不出來,繪圖板的工作區域相當大( 25.40 cm X 15.24 cm),左側的快捷鍵由於我個人不太愛用繪圖板上的快捷鍵,所以不太清楚他到底好不好用,它是一個中間有個按鍵,並有左右旋轉的功能,最外圈的上下左右各有一個按鍵,可以在原廠的軟體設定這些按鍵與旋鈕的功能。


  原廠軟體的畫面如下

原廠軟體

這個軟體可以調整繪圖板與筆的快捷鍵,也可以調整工作區的大小,但我覺得比較實用的是可以調整壓力,如下圖
原廠軟體的調整壓力

在這裡調整的話就不用每進一個軟體都要調一次,而且提供用曲線的方式來調整,想當直觀


  整體上來用起來相當舒適,由於工作區域大加上 8192 階的力道,可以減少放大縮小的次數,筆的下方按鍵不知是不是我握筆姿勢不良,總是很容易誤按到,可以透過原廠軟體把他調成無作用來解決。原廠軟體本身可以用曲線的方式來調整力度,原廠設定對我來說力度太重了,所以我通常會調輕。


  不知是不是採到雷,這產品我只用了一年兩個月它就故障了,它故障的情形是繪製時會不定時發生自動放開的狀況,也就是劃線時有開頭也有結尾,但中間會不見!它是自動放開,可以透過 Ctrl + Z 來發現,還會不定時的發生卡頓,就是畫到一半會發現明明筆一直在動,但顯示出來卻是筆一直停留在原地,本想這是驅動程式的問題,就透過更新驅動程式的方式來解決,但發現無效,但我不死心又把繪圖板插到另外一台電腦才真正確認是繪圖板有問題。該如何維修呢?從故障的情形來看,繪圖板根筆都有可能有故障,這時我才發現一個有趣的問題,官方為什麼會有只賣"筆"的賣法,一隻筆大概 600 元,如果只是"筆"故障,這樣我就花  600 元,但問題是要如何確認只是"筆"故障?如果壞的是繪圖板,那就變成我多買了一支筆,這問題遽然困擾我一晚,最後我決定直接買 Wacom 的繪圖板,而不是在這決定要不要重買一塊 Aery pf1061 或是賭是不是只有"筆"壞掉,想想當初會選擇 Aery pf1061 就 是因為它 CP 值高,但沒想到它遽然不太耐用,所以最後就決定直接買 Wacom 的繪圖板,這次可真是學習的什麼較便宜沒好貨。

 

參考資料

[ www.aery.pro ] Aery 官網

2021年6月28日 星期一

在 Qt Creator 中修改 MSVC 的執行階段程式庫

 在 Qt Creator中修改 MSVC 的執行階段程式庫

前言

  由於最近需要用 Qt 來使用函示庫,但函示庫是使用 MTd(Multi-threaded Debug) 來建置的,如果要和 Qt 使用的話函示庫勢必要修改選項後重建,所以想說有沒有直接改 Qt 的執行階段程式庫,在此做個紀錄。

 

內容

  Qt 在預設的情形下使用 MDd(Multi-threaded DLL Debug) 作為執行階段程式庫,如果需要修改可以在 .pro 裡面新增以下

QMAKE_CFLAGS_DEBUG += /MTd
QMAKE_CXXFLAGS_DEBUG += /MTd


範例是修改成 MTd(Multi-threaded Debug),當然也可以修改成 MD(Multi-threaded DLL)與 MT(Multi-threaded),只要將最後的參數改成需要得即可,改完後一定"重建"才會生效要注意。


參考資料

[ forum.qt.io ] How do I change the Runtime Library setting in my project in QtCreator?


相關文章與資料

Qt 的專案檔

2021年6月27日 星期日

從 HWND 取得 HINSTANCE

 從 HWND 取得 HINSTANCE

前言

  最近需要透過 HWND 來取得 HINSTANCE ,但不知是不是太久沒接觸 Win32 API ,遽然卡在編譯,在此把學習的過程做個紀錄。


內容

  透過搜尋應該會找到 GetWindowLong() 來取得,所以使用以下

#include <winuser.h>
//
HINSTANCE hIns = (HINSTANCE)GetWindowLong( hWnd , GWL_HINSTANCE);


但編譯後發現"GWL_HINSTANCE"遽然未定義!但透過 Visual Standio 的 F12 可以找到定義,在一番查找後才知道 GetWindowLong() 是給 32 位元系統在用的舊 API ,新的 API 是 GetWindowLongPtr() ,用起來如下

#include <winuser.h>
//
HINSTANCE hIns = (HINSTANCE)GetWindowLongPtr( hWnd , GWLP_HINSTANCE);


這裡要注意後方的 Marco 名稱是有些微的差異的,GWLP_HINSTANCE 不論是 32 位元或 64 位元都會存在,但 GWL_HINSTANCE 僅存在於 32 位元,如果用 F12 去 wunuser.h  裡可以發現 64 位元時該 Marcro 會被 undef 掉,這就是為什麼會發生未定義錯誤的原因。


參考資料

[ docs.microsoft.com ] GetWindowLongPtrW function

2021年6月16日 星期三

Python 的鏈式比較

 Python 的鏈式比較

前言

  最近在 [ www.itread01.com ] 【python】簡化鏈式比較 發現 Python 的比較語法有個特別的寫法叫"鏈式比較",在此把學習的過程做個紀錄。


內容

  先來看看語法範例,如下

value = 60
#Old style
if 20 < value and value <100:
    print('True')
else:
    print('False')
#New style
if 20 < value < 100 :
    print('True')
else:
    print('False')


在一般的程式語言會需要做兩次比較的描述,但 Python 提供可以一次就比較且語法直觀,不過我進一步實驗以下

value = 60
if 20 < value != 100:
    print('True')


結果是會列印"True",也就是語法不限於小於或大於的比較運算,只要這個語法想成會拆開個別的比較運算後再用'and'來得到結果就不覺得這語法神奇了。


參考資料

[ www.itread01.com ] 【python】簡化鏈式比較

 


2021年6月8日 星期二

Blender 的 Shader 原始碼查詢

 Blender 的 Shader 原始碼查詢

前言

  Blender 從 2.8 以後開始使用 Shader node 的方式來編輯 Shader ,雖然編輯起來很方便,但有時會需要知道它實際的計算的方式如'MixRGB node',在此把查詢的方法做個紀錄。


內容

  原始碼的位址在 [ github.com ] Blender 的 Shader 原始碼 ,開啟後可看到以下

Blender 的 Shader 原始碼


圖中可以看到每個檔案都是 .glsl ,那如何查找 Shader node 對應的原始碼呢?以下以'MixRGB node'為例,透過檔名的字尾來查找對應的原始碼,如下圖

'MixRGB node'的原始碼

圖中可以看到檔名'gpu_shader_material_mix_rgb.glsl'就是'MixRGB node'的原始碼,點開可看到如下
'MixRGB node'的原始碼內容


'mix_blend'對應到"Mix",'mix_add'對應到"Add",其它都可以依此類推找到對應原始碼。


參考資料

[ github.com ] Blender 的 Shader 原始碼

2021年6月2日 星期三

另外一種漩渦紋理(Texture)

 另外一種漩渦紋理(Texture)

前言

  最近看到 [ www.youtube.com ] Make a Spiral in Under 5 Minutes Using Nodes || Blender 2.82 裡面的作法萃取後可以產生漩渦紋理(Texture),和之前的 產生漩渦的紋理(Texture) 方法有一些不同,這裡做個紀錄。


內容

  先來看 Shader node 的部分,如下圖

Shader node 的做法

結果如下

範例的結果

Shader node 裡被紅圈圈起來的地方可以控制漩渦的圈數,這是上一次 產生漩渦的紋理(Texture) 的做法辦不到的,把該數值調成"1",可以得到下圖

Multify node 的數值為"1"的結果


將該數值調成"10",可以得到下圖

Multify node 的數值為"10"的結果


參考資料

[ www.youtube.com ] Make a Spiral in Under 5 Minutes Using Nodes || Blender 2.82


相關文章與資料

產生漩渦的紋理(Texture)

2021年5月25日 星期二

修正漩渦紋理(Texture)的旋轉動畫單調的問題

 修正漩渦紋理(Texture)的旋轉動畫單調的問題

前言

  先前的  產生漩渦的紋理(Texture) 能產生簡單產生旋轉動畫,但轉起來相當單調,有辦法轉起來自然點嗎?個人想到的解法,在此做個紀錄。


內容

  按照之前的  產生漩渦的紋理(Texture) 作法的旋轉動畫如下

單調的旋轉動畫


先看修正後的結果如下

修正後的旋轉動畫


修正後的旋轉的動畫會一邊旋轉一邊改變漩渦,舊的只是單純旋轉,所以漩渦不會改變,如何改變呢?如下圖

修正後的做法



修正後的做法看起來很複雜,但其實就是用兩張漩渦圖在最後 Mix 輸出,但有一點要注意的是要讓上下兩張圖不一樣,範例的做法是控制旋轉角,上面初始是"0",下面則是"-180",還有在兩張圖的"MixRGB Node"的數值也不同,接著讓兩張圖的轉速(每秒轉的"Z"角度)是一樣,這樣就可以修正轉起來太單調的問題。

2021年5月23日 星期日

產生漩渦的紋理(Texture)

 產生漩渦的紋理(Texture)

前言

  最近看到一個教學 [ www.youtube.com ] Create a Black Hole in Blender - Iridesium ,影片裡有個步驟是用程式產生漩渦的紋理(Texture),覺得做法很有趣在此作紀錄。


內容

  用程式產生漩渦的紋理(Texture)的做法如下

用程式產生漩渦的紋理(Texture)的做法


圖中被紅圈圈起來的地方是要注意的地方,"Texture Coodinate Node"要使用"Object"作為輸入,"Gradent Texture Node"要使用"Spherical",最後的"MixRGB Node"是我覺得整個作法裡面最神奇的地方,當"Fac"的數值是"1"的時候會是一個有著整齊一環一環的圓圈,當數值是"0"時就單純變成Noise Texture ,數值保持在"0.5~0.8"會很像漩渦,如果要漩渦動起來可以透過"Mapping Node"的"Rotation"的"Z"就可以做出簡單的漩渦動畫。


參考資料

[ www.youtube.com ] Create a Black Hole in Blender - Iridesium

2021年5月12日 星期三

在 Blender 裡使用透射(Transmission)

 在 Blender 裡使用透射(Transmission)

前言

  如果只是單純在 Shader editor 裡將透射(Transmission)調成"1",會看到如下

將透射(Transmission)調成"1"

只是單純將透射(Transmission)調成"1"並不能得到透射(Transmission)的結果,而是變成黑色,顯然這不是透射(Transmission),如果需要透射(Transmission)必須要作一些調整才能得到結果,這裡把學習的過程做個紀錄。


內容

  要開啟透射(Transmission)不只是調成"1",還要在 Material Properties 作如下調整

調整 Material Properties

在  Material Properties 裡將"Screen Space Refraction"開啟,接著到 Render Properties 作如下調整
調整 Render Properties

在 Render Properties 裡將"Screen Space Refractions"開啟,並把子選項"Refraction"也一併開啟,接著就可以看到如下
設定完透射(Transmission)的結果


如果需要在 Material Preview 裡看到結果還需要作如下設定
設定 Material Preview

在 Material Preview 裡將"Scene Lights"與"Scene World"都開啟就可以看到透射(Transmission)的結果。

2021年5月4日 星期二

在 Blender 使用環境貼圖(Environment map)

 在 Blender 使用環境貼圖(Environment map)

前言

  Blender 本身有自帶一些環境貼圖(Environment map),但如果不夠用怎麼辦?這次會介紹如何取得環境貼圖(Environment map)並在 Blender 使用,在此做個紀錄。


內容

  如果覺得 Blender 自帶的環境貼圖(Environment map)不夠用可以到 [ hdrihaven.com ] HDRI Haven 下載,如下圖

在 HDRI Haven 下載環境貼圖(Environment map)

該網站相當貼心,在下載頁面可以選擇解析度來下載,下載的格式為 EXR。


  如何在 Blender 使用環境貼圖(Environment map)呢?在 Shader editor 作如下操作

編輯 Shader

在編輯視窗的上方將"Shader Type"切換為"World",接著新增 Environment texture node ,指定圖片後將"Color"連到 Background node 的"Color"。這樣就可以在 Rendered 下看到結果,但如果要在 Material preview 下看到結果需要做以下操作

在 Material priview 下看到結果


在 Material preview 下的設定將"Scene world"啟動就可以看到結果。


參考資料

[ hdrihaven.com ] HDRI Haven

2021年4月27日 星期二

補強 Blender 的 Shader node

 補強 Blender 的 Shader node

前言

  Blender 的 Shader node 提供的預設節點(node)種類有點少,少到有時一些基本的功能也必須用組合的,這裡開一篇來記錄相關的應用。


內容

Switch color:

  Shader node 並沒有提供 switch node ,但如果需要時該如何做呢?如下圖

switch node 的替代方案

範例的結果為當"Value"小於等於1時會是"紅色",大於且小於等於2時會是"綠色",大於2會是"藍色",要注意的是因為用"Greater Than"來完成,所以剛好等於1時還會是"紅色"。


Not equal:

  Shader node 有提供"=="也就是"Compare",但如果需要"!="(Not equal)呢?如下圖

實現"!="(Not equal)

Greater equal or Less equal:

  Shader node 僅提供"Greater Than"和"Less Than",如下圖

實現">="(Greater equal)

實現"<="(Less equal)

Not:

  Not 的運算是跟輸入相反,如下圖
實現"!"(Not)


Not 的運算必須考慮輸入型態是 float ,所以要先確認是否為"0",接著就可以去確定是否為"1",第二次的檢查可以確定輸入不是"0"就是"1",結果就會產生只有在輸入是"0"時結果為"1"。

And:

  And 的實現如下
實現"&"(And)

每個輸入都要經過兩次"Compare",目的是要將輸入是"0"時輸出"0",輸入是非零值時輸出"1",最後經過"Multiply"即為結果。


Or:

  Or 的實現如下
實現"|"(Or)

與 And 類似,但最後的運算改成"Add",並記得需要"Clamp",因為當輸入都是"1"時,輸出必須還是"1"。

Nand:

  Nand 的實現如下
實現 Nand

在 And 的結尾加上 Not 即為所求。


Nor:

  Nor 的實現如下
實現 Nor

在 Or 的結尾加上 Not 即為所求。

Xor:

  Xor 的實現如下
實現 Xor

將兩個輸入拿來"Compare"後再過 Not 即為所求。

Xnor:

  Xnor 的實現如下
實現 Xnor

移除 Xor 最後的 Not 即為所求。

2021年4月20日 星期二

在 Blender 匯入 Blend 檔裡的資料

在 Blender 匯入 Blend 檔裡的資料

前言

  由於 Blender 2.8 以後改採 Shader node 的方式來調整材質(Material),材質(Material)的內容可能變得相當複雜,要複製一個材質(Material)總不能從新編輯一個一樣的,能匯入嗎?這是很自然的想法,答案是可以的,在此把學習的過程做個紀錄。


內容

  在開始解說如何匯入前先來看到 Blender 是如何儲存資料的,如下圖操作

顯示 Blend 檔的結構

接著如下圖

Blend 檔的結構


可以在上圖發現 Blend 檔儲存相當多的資料,如 Mesh 、 Material ... Object 等,這些並不是全部的種類,有些種類會在有的時候才儲存,如 Shader node,上圖不過是預設的場景(Scene)所儲存的內容。


  在了解到 Blender 檔有儲存那些資料後接著就是如何匯入,如下圖操作

操作匯入 Blender 檔的資料

接著選擇要從哪個 Blender 檔匯入,如下圖
在要匯入的 Blender 檔上雙擊滑鼠

這個操作介面有個特別之處,在 Blender 檔上雙擊滑鼠並非選取該檔,而是把該檔像是資料夾一樣打開,範例使用 myMaterialDepot.blend 是一個示範用的檔案,並不具有特別意義。雙擊後可以看到以下
欲匯入的 Blend 檔的資料結構


這個會跟在觀看 Blend 檔的視窗顯示一樣的結構,接著選取要匯入的資料(Material、Mesh ... Object 等)用雙擊滑鼠或用右下的"Apend"按鈕就可以完成匯入。