Select Page
WordWall – PRO、學校教育版、嵌入式網頁之大家來團購篇

WordWall – PRO、學校教育版、嵌入式網頁之大家來團購篇

WordWall 在疫情期間內瘋迷了半個台灣小學,老師們都用心地在思考如何讓小朋友更有興趣的學習,更有效率的練習,也讓自己更有效率的出考題和改考卷,我想 WordWall 是個很好的解決方案,他的基礎用法已經有太多的文章和影片可以參考了,我這邊就不多描述,這篇文章專注再提供進階功能說明。

進階第一問,PRO有那些功能

基本版共18種小遊戲
Pro 專家進階版再給你18種小遊戲

其中 Flash cards 閃卡就很適合練習你的記憶,跟Anki暗記是一樣的功能

進階再一問,我們是學校單位,要怎麼採購

個人方案
  • 標準版本,一年費用960元,用月繳來算,用年繳計算,可以打九折,每年繳864元
  • Pro版本,一年費用1,440元,用月繳來算,用年繳計算,可以打九折,每年繳1,296元
學校機構版本

這個價格等於是買4各送一個(8折),買6各送4各(6折),買越多送越多,所以才說應該要團購起來

進階再進階,我們有自己的線上教學平台,可以是我們平台上的一個課後測驗遊戲呢?

很多教學平台,已經有了很專業的內容,但就缺少了Quiz測驗的這段,真的要出考題,勞心費時,改考題時候,更是需要出動許多小助理才能完成,不然一個老師要對30-40個學生,甚至於我們在大學教學的時候,常常會超過100人,沒各3-5個助教,老師恐怕就會浪費太多時間在改考卷身上,既然只是缺少測驗,我們可以把 WordWall 內嵌在我們的網站中,使用的過程不用跳到別的網頁

作法也很簡單,因為他支援 oEmbed API ,只要是下面兩種資源,都可以 LINK 到你的網頁中

URL scheme

https://wordwall.net/resource/*

https://wordwall.net/play/*

下面我用 CodePen 示範給大家看一次

1.首先選擇你要遷入的網頁,例如我找了猜台灣地名的遊戲,網址是 https://wordwall.net/resource/31725039/taiwan

2. WordWall 的 API EndPoint 是 https://wordwall.net/api/oembed ,所以你要做的事情是把 https://wordwall.net/api/oembed?url= + https://wordwall.net/resource/31725039/taiwan + &format=json ,整合成一個網址,並且貼到連覽器上,這個網址分別由三個部分所組成(Api 位置,資源網址、回傳格式為json)

組合完畢後會是 https://wordwall.net/api/oembed?url=https://wordwall.net/resource/31725039/taiwan&format=json ,當你將上面這個網址打開後,你會取得 json 的回傳,這時候可以用程式取解析他,並且放在你自己的網站中,如果不太會程式的,也可以找到 html tag 後面的資訊

{"version":"1.0","type":"rich","width":500,"height":380,"title":"TAIWAN",
"html":"<iframe src=\"https://wordwall.net/embed/e1d7f7dee34d4db3b06cfdfd399782bf?themeId=0&ref=oembed\" width=\"500\" height=\"380\" frameborder=\"0\" allowfullscreen></iframe>",
"thumbnail_url":"https://az779572.vo.msecnd.net/screens-800/e1d7f7dee34d4db3b06cfdfd399782bf_0","thumbnail_width":800,"thumbnail_height":600,"author_name":"fish077311168",
"author_url":"https://wordwall.net/teacher/8247144/fish077311168",
"provider_name":"Wordwall","provider_url":"https://wordwall.net"}

以上面的 json 檔案為例子,你可以取出下面的 iframe 區塊

<iframe src="https://wordwall.net/embed/e1d7f7dee34d4db3b06cfdfd399782bf?themeId=0&ref=oembed" width="500" height="380" frameborder="0" allowfullscreen></iframe>

之後把這區塊填到你的網頁中即可

可以到我的 codepen 看看

https://codepen.io/gwoyju/pen/ExQZogR

LMS 深度結合

在 WP 的 LMS 系統中,可以插入新的單元,並且透過 Short Code – [iframe][/iframe] ,將 <iframe>…</ifame> 區段包起來就可以無縫整合在你的課程中。

新增課程
編輯課程單元,並且插入 iframe
最後呈現的課程
wordpress 優化 PHP : WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)

wordpress 優化 PHP : WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)

我的系統是 Ubuntu 20 + Nginx + Php7.4-fpm ,遇到不能安裝程式,安裝到一半都會停掉,去檢查 /var/log/php7.4fpm.log ,發現出現 warning message

warning : [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 15 total children

我的解決方法是去到 /etc/php/7.4/fpm/pool.d 下打開 www.conf

sudo nano /etc/php/7.4/fpm/pool.d/www.conf

然後改善 pm 的相關設定值,以我的機器為例,16GB RAM,CPU 4 顆,我的設定值參考公式為

pm.start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2

所以我修改的參數如下

pm = dynamic
pm.max_children = 30 # 10-30 間是常見的設定
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 10
pm.max_requests = 5000

修改完畢之後,重啟就不會看到問題了

pm.max_children 的合理配置方法

要合理的評估一個數字,要先考量以下幾點

  1. 伺服器可用的記憶體(RAM):確認伺服器總共有多少記憶體可供 PHP-FPM 使用。
  2. 每個 PHP 進程的平均記憶體消耗量:觀察或測試你的應用,以確定每個 PHP 進程大概需要多少記憶體。
  3. 保留記憶體:為作業系統和其他服務保留一部分記憶體,以確保系統穩定運行。

步驟 1:測量 PHP 進程的平均記憶體消耗

ps -ylC php-fpm8.2 --sort:rss

找到 RSS 列的值(常駐集大小),將它們加起來,然後除以 PHP-FPM 進程的數量,得到平均記憶體消耗量(單位是 KB)。

步驟 2:計算可用記憶體

確定伺服器上為 PHP-FPM 分配的記憶體總量。如果伺服器僅運行 PHP-FPM(例如,沒有資料庫等其他服務),則可以減去為作業系統和其他必要服務保留的記憶體量。一個常見的保留量是 512MB 到 1GB。

步驟 3:計算 pm.max_children

利用以下公式

pm.max_children = (伺服器可用記憶體 – 保留記憶體) / 平均每個 PHP 進程的記憶體消耗

假設:

  • 伺服器有 6GB(6144MB)的 RAM。
  • 作業系統和其他服務保留了 1GB(1024MB)。
  • 通過測量,你發現每個 PHP 進程平均消耗 50MB 記憶體

pm.max_children = (6144MB – 1024MB) / 50MB = 102.4

在這個例子中,你可以將 pm.max_children 設置為大約 100。

注意:始終留有足夠的餘地來處理意外的高峰,不要將所有資源都分配給 PHP-FPM,以避免伺服器過載。此外,實際部署後,應監控伺服器性能,並根據需要調整 pm.max_children 的值。

參考資料如下

https://www.gushiciku.cn/pl/p9Vf/zh-tw

Ubuntu 20 用 Speedtest 測網速

Ubuntu 20 用 Speedtest 測網速

如果OS有圖形化的介面,可以透過瀏覽器瀏覽 speedtest.net 去測試網速,但來到了 Linux base 的 Ubuntu command line 上頭,就需要安裝 SpeedTest 的 Script 腳本,透過腳本來檢查網速。

安裝 Python

因為 SpeedTest 是用 Python 寫的,所以先打開終端機,先把 Python3 pip 裝起來

sudo apt-get install python3-pip

安裝 SpeedTest

透過 pip3 安裝 SpeedTest

sudo pip3 install speedtest-cli

用 SpeedTest 測試網速

speedtest-cli

用 SpeedTest 測試網速並且分享

speedtest-cli --share

結果會是

https://www.speedtest.net/result/13144792277.png

4G兒童智慧手錶有 Line FB Skype 視訊通話 定位 課表

幼兒園到國小的小朋友,沒辦法帶手機去學校,但父母要接送小朋友,或是在商場走失時候沒法連絡,一值是我們的痛點,這時候我們可以使用可通訊的智能手錶來給小朋友配戴,我所需要的功能是讓他上課的時候不要亂玩,下課得時候可以找的到他,找不到他時候可以通訊即可。

痛點說明

1.上課時不能用

2.控管小朋友的交友和下載

3.要能找的到小朋友,防走失

4.可以語音通訊和視訊通訊

5.價格不要過高,包含通訊費

6.一般手錶防水、防摔功能要有

7.要養電信門號,小朋友使用的很少,感覺划不來

解決方案

  • 可以下載軟體
  • 有鏡頭,可以視訊
  • 有麥克風,可以通話
  • 防水功能,IP67以上
  • 有GPS定位功能
  • 通訊有4G SIM卡
  • 軟體可以定義上課時間
  • 防滑、防過敏、防汗手錶帶

建議附加硬體

  • 藍芽
  • WIFI
  • 保護套
  • SOS按鍵
  • 大電池,最少要一天

建議附加軟體

  • 課表
  • 遠端拍照
  • 安全區域,離開電子圍籬會警報
  • 語言翻譯
  • 學習軟體
  • APP STORE
  • 計算機
  • 手機錢包
  • 導航軟體
  • 常用通訊軟體,LINE、FB Messager等

搭配電信解決方案

  • 預付卡,第一次費用300元,其他用多少算多少
  • 吃到飽方案,每個月付299-799元間,超過的就不要用了,效益不高
  • 漫遊卡、物連網卡,這也是我採用的方案,買卡費用150元內,其他每個月上網費用約70元

最划算適合小朋友的電信解決方案

初始費用100元、每個月50元

推薦的高CP值的兒童智慧手錶

HeroWatch | Hero 4G Smartwatch for kids| NFC payment (abouttime-tech.com)

https://www.fennec.me/tw/index

最便宜的兒童智慧手錶

蝦皮商場請輸入關鍵字「兒童智慧手錶」搜尋,例如這一篇

https://shopee.tw/%E5%8F%B0%E7%81%A324h%E5%87%BA%E8%B2%A8-%E5%85%92%E7%AB%A5%E6%99%BA%E6%85%A7%E6%89%8B%E9%8C%B6-%E6%9C%89Line-FB-WhatsApp%E7%B9%81%E9%AB%94-%E8%A6%96%E8%A8%8A%E9%80%9A%E8%A9%B1-%E5%AE%9A%E4%BD%8D4G%E5%85%92%E7%AB%A5%E6%89%8B%E9%8C%B6-%E9%9B%BB%E8%A9%B1%E6%89%8B%E9%8C%B6-%E5%85%92%E7%AB%A5%E6%99%BA%E8%83%BD%E6%89%8B%E9%8C%B6-i.274166228.16356700757

使用 Openzeppelin 和 Remix 發幣,可以擴充、投票、分潤、管理

使用 Openzeppelin 和 Remix 發幣,可以擴充、投票、分潤、管理

之前推薦過一鍵發幣,那是懶人作法,適合快速且只想要簡單發幣的人,給點錢就能快速地解決問題,但真實的社會是不是這麼簡單的,真正的發幣行為應該是撰寫智能合約,通過第三方驗證,證明無漏洞後,並且發佈在區塊鏈上,聽起來很難,但看過這篇文章後,整個過程也是5分鐘內而已。

OpenZeppeLin 智能合約範本

首先要使用 OpenZeppeLin 來產生你發幣用智能合約,在 OpenZeppeLin 上面可以找到很多範本,可以直接引入即可,但更簡單的方法是使用 OpenZeppeLine精靈 來快速產生智能合約程式碼。

https://wizard.openzeppelin.com/

在這個畫面中如果要簡單發幣的話,可以填入 Name (代幣名稱), Symbol(代幣的代號), Premint (欲鑄的貨幣數量)的資料就可以了,常用的進階功能則有 Burnable, Votes, Pausable, 如果你是為了公司發行,可以在 Access Control 中選擇 Roles 然後建立自己的控制規則,可以多人控管開發行的貨幣

Remix 上發行貨幣

在 OpenZeppeLin 畫面上按下 Open in Remix 按鈕,就可以直接將合約範本直接帶入到 Remix

1.先連結你的 MetaMask 小狐狸錢包

2.選擇對應的編譯器,然後按下編譯,以本例是 0.8.4 版本的編譯器,Solidity 語法

3.將代幣發佈到區塊鏈上,環境選擇 Injected Web3, 並且注意你的 MetaMask 連結的網路是那哩,以我的圖片例子是選在 Ploygon 的測試鏈上,然後發佈的合約要選擇倒剛剛寫好的 ShaneToken, 設定無誤後按下 Deploy 即可發行

5.在 MetaMask 中確認合約正確性,注意發行到的網路是否正確,以及看一下 Gas Fee 多少錢,本例是發行在 Ploygon 上,所以使用的代幣是 MATIC ,自己的錢包有沒有對應的代幣可以支付,檢查完畢按下確認後就可以發行成功了

最後要將代幣匯入到 MetaMask 中

可以在 Polygonscan 中找到你得合約網址

將合約地址填回 MetaMask 就大功告成囉

可以在自己的錢包中看到自己發行的代幣,當個有錢人

延伸閱讀,利用 OpenZeppelin 來發NFT

https://www.frank.hk/blog/nft-smart-contract/

https://wizard.openzeppelin.com/#erc721

測試鏈做測試

測試時,需要去水龍頭那邊取得手續費用

NameLink
polygon-mumbaiPolygon Faucet
harmonyFaucet || Harmony Testnet
Cronoshttps://cronos.crypto.org/faucet
iotexIoTeX Faucet – Getting IoTeX for development
BscBinance Smart Chain: Faucet
HecoHuobi ECO Chain
常用測試鏈

SOL原始程式碼

如果不能用精靈產生程式碼,可以直接複製下面的程式碼

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

contract TestToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20SnapshotUpgradeable, OwnableUpgradeable, PausableUpgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable {
    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor() {
        _disableInitializers();
    }

    function initialize() initializer public {
        __ERC20_init("Test Token", TST");
        __ERC20Burnable_init();
        __ERC20Snapshot_init();
        __Ownable_init();
        __Pausable_init();
        __ERC20Permit_init("Shane Token");
        __ERC20Votes_init();
        __ERC20FlashMint_init();

        _mint(msg.sender, 100000000 * 10 ** decimals());
    }

    function snapshot() public onlyOwner {
        _snapshot();
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override(ERC20Upgradeable, ERC20SnapshotUpgradeable)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // The following functions are overrides required by Solidity.

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20Upgradeable, ERC20VotesUpgradeable)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
        internal
        override(ERC20Upgradeable, ERC20VotesUpgradeable)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
        internal
        override(ERC20Upgradeable, ERC20VotesUpgradeable)
    {
        super._burn(account, amount);
    }
}

基本的發幣程式碼,支持可以維護以及可以銷毀

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/// @custom:security-contact 
contract TestTokenMintableBurnable is ERC20, ERC20Burnable, Ownable {
    constructor() ERC20("Test Token Mintable Burnable", "TTMB") {
        _mint(msg.sender, 100000000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
}

發幣之後,驗證合約的安全性

發幣前後都要利用 CoinTool ,來驗證的你合約安全,才會讓大眾們信任