Javascript 如何比對Object是否相同(Equal)

在沒有Key或者Id的情況下,比對Object真的是世界上最噁心的一件事情了。

最簡單的方法是這個:

const object1 = {"Name": "Hello"};
const object2 = {"Name": "Hello"};

if(JSON.stringify(object1) === JSON.stringify(object2)){
  return true;
}

很簡單對吧?然而世界沒有那麼美好。更多時侯你會遇到這種情況:

const object1 = {"Sex": "Girl", "Name": "Hello"};
const object2 = {"Name": "Hello", "Sex": "Girl"};

這種時侯用上一種方法是會Return False,失敗的。手寫排序Function是一種處理方法,但工時不足的情況下可以考慮用Sort Object這個模組解決問題:

https://github.com/doowb/sort-object
const sortObj = require('sort-object');
const object1 = sortObj({"Sex": "Girl", "Name": "Hello"});
const object2 = sortObj({"Name": "Hello", "Sex": "Girl"});

if(JSON.stringify(object1) === JSON.stringify(object2)){
  return true;
}

好了,輕鬆搞定。如果遇到更複雜的情況,需要深度比對的話,那就需要另一個名為Deep Equal的模組了。

https://github.com/substack/node-deep-equal
const sortObj = require('sort-object');
const equal = require('deep-equal');
const object1 = sortObj({"Sex": "Girl", "Name": "Hello"});
const object2 = sortObj({"Name": "Hello", "Sex": "Girl"});

if(equal(object1) === equal(object2)){
  return true;
}

過於依靠他人的模組是不好的事,但這是最簡單和最快的方法了。有空的時侯再研究一下怎麼手寫出同樣的功能吧!

◢▆▅▄▃崩╰(〒皿〒)╯潰▃▄▅▇◣

Mastodon Docker 更新版本教簡易教學

要用Docker架設Mastodon並不困難,要升級更加不難,但當初官方寫的教學文檔好像已經很久沒更新了,所以還是寫一寫吧。

要升級Docker版Mastodon,首先要進入你的Mastodon資料夾,運行以下指令:

cd <你的Mastodon資料夾路徑>
git fetch && git checkout <目前最新版本,例如v2.7.3>

Git Checkout能讓你的Mastodon代碼馬上更新到指定版本。但Docker裡的代碼並不會隨之更新,所以我們還需要用Docker Compose重建Image,最後重啟Container即可:

docker-compose build
docker-compose up -d

一般來說,到了這個步驟一切就已經大公告成。可是某些比較大型的更新需要更新資料庫或其他額外步驟,建議參閱Mastodon更新日誌裡的Upgrade notes。

https://github.com/tootsuite/mastodon/releases

WordPress get_posts() Function 排除特定分類的方法

WordPress 的get_posts() Function 對於Plugin或者Theme 開發者來說都很有用:相對上沒有WP_Query那麼複雜,但同樣支援WP_Query應有的功能。但是,Wordpress 的API文檔上好像沒有提到這點哪?

事實上,get_posts的參數是跟WP_Query共用的。也就是說,如果你想在使用get_posts()搜尋文章時排除特定分類,只要這樣就好了:

  $posts = get_posts(array(
    'category__not_in' => array(76), //此處必須為分類ID(TAG ID),不可使用SLUG
  ));

看,很簡單對吧?

不過,果然我還是比較喜歡Drupal …..

參考資料:

exclude category from get_posts?

停止Cisco AnyConnect Secure Mobility Client 開機時自動啟動的方法

Cisco AnyConnect Client每次當我打開Mac的時侯總會自己跳出來,偏偏因為工作因素又非裝不可,只好找點方法取消它了。

在網絡上查到的方法如下:

cd /Library/LaunchAgents
sudo rm com.cisco.anyconnect.*

原理是在LaunchAgents資料夾裡把Anyconnect的部份刪掉,理論上之後重新開機的時侯就不會再讓它跳出來了。

好一個令人頭疼的軟體。

參考資料:

Stop Cisco AnyConnect Secure Mobility Client from starting up automatically

Liquidsky倒了怎麼辦?來自架雲端遊戲PC吧

之前我曾經寫過一篇文章教大家怎樣用LiquidSky來在Mac上玩遊戲,但非常不幸地Liquidsky突然宣告關閉,從此我們就失去了如今世上唯一支援亞洲地區的雲端遊戲服務,只剩下貴得嚇死人的Parsec + AWS方案可以用。

但真的這樣就完了嗎?不!為了節省開支的同時維持原來的雲端遊戲習慣,我做了非常多研究,到最後得出的結論是--只要用Google Cloud,一切還是有可能的!為什麼偏偏是它呢?

使用Google Cloud有以下幾個優點:

  1. 註冊後會贈送為期1年的300美元免費限額,在這段期間可以無限任玩。

2.   允許自訂虛擬機器的配置。你可以按照自己的遊戲需求訂制雲端電腦,不必像AWS那樣必須使用它準備好的機器,增加開支。

3. 顯卡效能比AWS好。(畢竟可是Tesla P100啊)

4. 支援台灣地區(這個最重要!)

玩雲端遊戲時如果伺服器跟客戶端不處於同一/鄰近地區,延遲將會讓遊戲體驗大打折扣,這樣一點都無法體驗到好處。所以Google Cloud支援台灣地區這點,可是說是它最大的優勢。

關於如何註冊Google Cloud Platform將不多解釋,詳情可以參考以下文章:

谷歌免费一年vps:Google Cloud Platform

首先,打開Google Cloud Compute Engine,建立虛擬機器,區域選擇asia-east1(台灣)的asia-east1-a或asia-east1-c,因為a區的GPU只有K80可以選擇。以下是我的雲端遊戲機器規格,各位可以按照自己需要作出調整,但筆者推薦使用Windows Data Center 2016,最少有100GB SSD,4 vCPU和8GB 記憶體的機器,否則遊玩時容易出現卡頓情況,影響遊戲體驗。另外Tesla P100是GPU的最低配備,K80雖然便宜但並不適合遊戲。

設定虛擬機完畢後,點擊管理並勾選先佔狀態。先佔伺服器只能維持24小時,但我們一般不需要長時間運行遊戲伺服器,只要每次關機前建立快照保存狀態即可,因此使用先佔能為我們減省不少開支。

完成後,我們還需要設定防火牆規則。Google Cloud預設的網絡支持透過RDP連線至Windows伺服器,但那並不能滿足我們的遊戲需求,只能作系統管理之用。之前在介紹Liquidsky時提過的Parsec遙控軟體,才足以應付一切。所以,我們要在選單=>VPC網絡=>防火牆規則裡新增一條規則:允許所有UDP輸入。詳細參照以下圖片:

如此一來,你的VM就基本設定完成了。但是等一等!這麼簡單就解決了嗎?答案當然是「NO」!

我們必須透過RDP連接至伺服器,安裝顯示卡驅動程式,音效驅動程式,Parsec,建立登入帳戶才算得上是完成一切。Mac可以在App Store取得Windows Remote Desktop Client,Windows的話本身已經自帶客戶端,無需額外安裝。

RDP的使用方法請參照微軟官方的Remote Desktop教學:

https://support.microsoft.com/zh-tw/help/17463/windows-7-connect-to-another-computer-remote-desktop-connection

各種驅動程式可至此處取得:

Nvidia GRID video driver: http://zuikaku.me/onlineDisk/downfile.php?id=a3d854f66c1b58865f6767ee834638b1d60ea878

Parsec: https://s3.amazonaws.com/parsec-build/package/parsec-windows.exe

VB-Cable virtual audio driver: http://vincent.burel.free.fr/VirtualAudioApps/VBCABLE_Driver_Pack43.zip

重新啟動後,右鍵工具列上的開始按鈕,選擇Computer Management ,選擇 Local Users & Groups ,右鍵User新增用於Parsec的Windows帳號,輸入帳號及密碼後選擇Password never expires,建立後到Group雙擊Administrators,將剛才新增的帳號加入到Administrators即可。

最後跟Liquidsky時一樣,在伺服器上啟動Parsec,再透過客戶端連線,登入,一切大公告成!

為什麼不能使用Google Cloud預設的帳號,要額外設置呢?原因是因為我們每次開始使用雲端機器前,必須先用RDP連接預設帳號並打開Parsec,這樣我們才能透過後者連接到伺服器。但由於Windows帳號不能被同時登入,一但預設帳號登出Parsec將無法運作,因此我們需要準備兩個帳號,新建立的帳號用來在Parsec上登入,才能避免這個情況發生。

最後的最後,記得設置RDP Session時間上限避免被自動登出喔!

Disable remote session timeout on Win Server 2012 R2

PhpSpreadsheet各種疑難排解

筆記一下。

問題1:Error: Call to undefined function PhpOffice\PhpSpreadsheet\Shared\mb_strlen()

安裝php-mbstring並啟用即可解決。

問題2:輸出檔案至php://output,卻遇到404 not found找不到檔案

安裝以下PHP Plugin即可解決:

php-zip, php-xml, php-md

使用之前要安裝的東西很多呢,這玩意兒。之後說不定還會繼續更新這篇文章的。

在專案裡局部運行Webpack的方法

webpack-cli是個好文明,但有時侯我們不想把它裝在系統裡,或者想要多個專案用不同版本的Webpack,這種時侯就需要讓它局部運行了。

方法非常簡單,只要直接呼叫webpack-cli的bin檔案即可。路徑如下:
./node_modules/webpack-cli/bin/cli.js

如果想方便一點,可以直接寫進scripts裡:

  "scripts": {
    "dev": "./node_modules/webpack-cli/bin/cli.js --mode development --env.NODE_ENV=development",
    "build": "./node_modules/webpack-cli/bin/cli.js --mode production --env.NODE_ENV=PRODUCTION"
  }```
  
  搞定。package.json萬歲。

Instgram API PHP Curl 出現SSL23 Error解決方法

其實再過沒多久Instgram API就不能再像現在這樣使用了,不過考慮到可能還會有些人像我這樣因為工作原因非用不可,分享一下這個的解決方法:

在用Setopt設定Curl的時侯,將CURLOPT_SSL_VERIFYPEER設定為FALSE:

    $curl = curl_init();
    curl_setopt_array($curl, array(
      CURLOPT_RETURNTRANSFER => 1,
      CURLOPT_URL => $api_url,
      CURLOPT_POST => 1,
      CURLOPT_SSL_VERIFYPEER => FALSE,
      CURLOPT_POSTFIELDS => $query,
    ));
    
    $result = curl_exec($curl);

如此一來,問題就應該解決了。意外地簡單,也意想不到啊……

IE 11下Fetch API無法使用的解決方法

不多說,總之就是Fuxx you IE 11.

首先透過NPM安裝以下套件:

npm install isomorphic-fetch
//或者
yarn add isomorphic-fetch

npm install isomorphic-fetch
//或者
yarn add isomorphic-fetch

再Import已經安裝的套件:

require('es6-promise').polyfill();
require('isomorphic-fetch');
//或者
import 'es6-promise/auto';
import 'isomorphic-fetch';
	
require('es6-promise').polyfill();
require('isomorphic-fetch');
//或者
import 'es6-promise/auto';
import 'isomorphic-fetch';

如果需要在Vue或者React,甚至搭配Babel使用,建議請使用Webpack.

備註:本篇文章曾發佈於舊網誌上。

免去管理伺服器的煩惱,Heroku一鍵安裝Mastodon

從Facebook搬家到Mastodon,已經差不多一個月的時間了。在這段期間,我發現很多人因為擔心自己的私隱而不知道應該選擇相信哪個伺服器,或者只待在mastodon.soical就算了。
但事實上保護私隱最好的方法,那就是自己建一個伺服器了!

但是對於不熟悉伺服器架設的人來說,使用甚至是管理VPS肯定是一件非常困難的事。如果選擇坊間的Mastodon架設服務,也少了一份自己架設伺服器帶來的安全感。
這種時侯,選用Heroku可能就是比較好的方法了。

使用Heroku有以下優缺點:

優點:

  1. Mastodon本身已經提供了一鍵Deploy功能,只要申請Heroku帳號後跟著指示進行設定即可。
  2. 省去管理伺服器的麻煩,駭客入侵的機會也大幅降低
  3. 可免費試用

缺點:

  1. 只有英文介面
  2. 價格偏貴,要架設正式的Mastodon最少需要每個月25美元
  3. 免費版試用限制很大
  4. 部份功能在Heroku可能會出現問題

但整體來說還是相當好用的。

以下是使用Heroku架設Mastodon的簡單教學:

首先點擊以下連結前往Heroku的Dashboard(建立Mastodon):
https://dashboard.heroku.com/new?button-url=https://github.com/tootsuite/mastodon&template=https://github.com/tootsuite/mastodon

然後Heroku會要求你先進行登入。如果沒有帳號的話,先點擊Sign up進行登記。
-----2018-04-22---10.42.32

註冊後回到剛才的頁面,你就會看到一個表格,只要填寫好所有的資料即可。
-----2018-04-22---11.08.19

App name:
你的Mastodon在Heroku上的名字。Heroku會為你提供一個專屬網址,例如如果你的APP NAME為mastodon,網址則會是mastodon-herokuapp.com。不可與其他人重覆。

HEROKU:
預設值為TRUE。不需要修改

LOCAL_HTTPS:
預設值為FALSE,如果你有個人網址,請設定為TRUE。

SINGLE_USER_MODE:
如果你的Mastodon只供個人使用,請設定為TRUE。

S3_ENABLED:
設定是否使用Amazon S3儲存圖片等檔案。由於Heroku沒有永久性的儲存空間,所以建議設定為TRUE。
關於如何使用S3,請參考以下文章:
新手也能輕鬆學會Amazon S3(http://streamer-forest.com/amazon-s3-tutorial-p1.html)

S3_BUCKET:
S3儲存桶名稱。請參考上面的文章。

S3_REGION:
S3儲存桶所在地區。同樣請參考上面的文章。

AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY:
Mastodon連接到S3需要帳號的ACCESS KEY及ACCESS SECRET,在進入AWS Dashboard後選擇Account,Security Credentials裡的Access Key即可取得。注意要小心保管,不然其他人便可以隨意取用你的S3了!

要使用Mastodon,一般會需要經過SMTP Server發送確認郵件以供註冊。
這邊推薦使用Mailgun,一個好用又簡單的SMTP服務。

註冊後將SMTP_SERVER,SMTP_PORT,SMTP_LOGIN,SMTP_PASSWORD 按照Mailgun提供的資料填寫即可。詳情請參考:
Mailgun免費10000封大量發送郵件主機申請與cURL教學

SMTP_DOMAIN:
設定你的SMTP伺服器網址。不需要修改。

SMTP_FROM_ADDRESS:
設定網站郵件信箱地址,例如admin@你的域名。

SMTP_AUTH_METHOD,SMTP_OPENSSL_VERIFY_MODE,SMTP_ENABLE_STARTTLS_AUTO
設定SMTP加密。如果使用Mailgun,可以不用理會這些設定。否則請根據SMTP伺服器服務商提供的資料進行設定。

以上全部資料都填好之後,按下Deploy App就會開始自動部署Mastodon了。趁著這個時間你可以做別的事,不過在這之前Heroku可能會要求你輸入信用卡資料進行確認,要注意喔。

完成後輸入你的Mastodon網址,大公告成!記得要註冊你的帳號,並設定為Admin喔。
-----2018-04-22---11.08.50

祝你在Mastodon上過得愉快!