2023年1月30日 星期一

教育版雲端硬碟設定或解除容量上限的步驟

        感恩大成國小黃俊凱組長分享。
        根據共用雲端硬碟當前的預設設定,機構中的所有人都能建立數量不限的共用雲端硬碟,而且可存放的內容量也沒有上限,因此可能會占用太多儲存空間。為因應上述情況,我們將於 2023 年 1 月逐步推行下列異動措施:

        如果管理員尚未在頂層機構單位 (OU) 中設定共用雲端硬碟儲存空間上限,該機構單位的每個共用雲端硬碟都會套用 100 GB 的上限。
設定方式請參考附圖:



2023年1月29日 星期日

Xoops 網站從原先sslforfree憑證改用公用憑證的安裝步驟


壹、第一次設定:
自縣網中心取得檔案,其檔案內容如下圖:


一、下載與解壓縮eCA1_GTLSCA.zip,取得eCA1_GTLSCA.crt
$wget https://gtlsca.nat.gov.tw/download/eCA1_GTLSCA.zip
$unzip eCA1_GTLSCA.zip

二、變更已下載簽發之 SSL 伺服器軟體憑證(*.cer)檔名為server.cer
$mv 3E0F555985B24E84092C96C1762173B4.cer server.cer

三、將SSL伺服軟體憑證由DER編碼格式轉換成PEM編碼格式
$openssl x509 -in server.cer -inform DER -out server.crt

四、整合server.crt eCA1_GTLSCA.crt 為 server-chain.crt,再更名為server.crt
$cat server.crt eCA1_GTLSCA.crt > server-chain.crt
$mv server-chain.crt server.crt

五、server.crt  與 myserver.key 分別複製到 /etc/ssl 與 /etc/ssl/private
目前只需要兩個檔案,分別是server.crt  與 myserver.key
server.crt  與 myserver.key 分別複製到 /etc/ssl 與 /etc/ssl/private。即
server.crt         --->    /etc/ssl
myserver.key  --->    /etc/ssl/private
其指令如下:
$mv server.crt  /etc/ssl
$mv myserver.key  /etc/ssl/private

六、修改default-ssl.conf 與 000-default.conf
檔案名稱default-ssl.conf
檔案修改內容:
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite EECDH+AES128:EECDH+AES256:EECDH+CAMELLIA:!ECDSA:!MD5
SSLHonorCipherOrder on
SSLCertificateFile  /etc/ssl/server.crt
SSLCertificateKeyFile  /etc/ssl/private/myserver.key
將原先的設定作註解
                # SSLCertificateFile /etc/ssl/certificate.crt
                # SSLCertificateKeyFile /etc/ssl/private/private.key
                # SSLCertificateChainFile  /etc/ssl/ca_bundle.crt
整個狀況如下圖:

檔案名稱000-default.conf
檔案修改內容:
將原先的設定作註解
# Redirect permanent / https://abc.def.ghi.tw
其內容如下:

七、重啟Apache2
$sudo service apache2 restart

貳、日後處理
一、將縣網中心取得的檔案送至 /home/webadmin/PublicCert
二、修改CertReplacement.sh 黃色部分名稱
三、執行CertReplacement.sh

檔案名稱:CertReplacement.sh
檔案內容:
#!/bin/bash
wget https://gtlsca.nat.gov.tw/download/eCA1_GTLSCA.zip
unzip eCA1_GTLSCA.zip
mv 3E0F555985B24E84092C96C1762173B4.cer server.cer
openssl x509 -in server.cer -inform DER -out server.crt
cat server.crt eCA1_GTLSCA.crt > server-chain.crt
mv server-chain.crt server.crt
mv server.crt  /etc/ssl
mv myserver.key  /etc/ssl/private
service apache2 restart

資料來源:


2023年1月16日 星期一

只要點兩下,就能寄送全校教職員薪資單 for Windows 7 x64


        由於先前開發的程式在Windows 10 x64 與 Python 3.9.0 環境中編譯,適用Win 10 x64。但還是無法在出納組電腦執行,換句話說,原先的案主依舊無法享受便利--點兩下,就可以寄送寄送全校教職員薪資單。因此,必須想法子來處理。

 最後重新編譯程式:
下載檔案。解壓密碼:demo1234
教學影片:


1.在出納組電腦點兩下後,為何無法寄出全校教職員薪資單?
   原因在出納組電腦作業系統為 Windows 7 x64 SP1,需改用Python 3.8.6 以前的版本重新編譯。
2. 目前實作,Python編譯環境如下:
(1)虛擬機:VMware Player 6.0
(2)作業系統:Windows 7 x64 SP1
(3)更新套件:KB4457144
(4)Python版本:3.8.01.
(5)Python編輯程式:Visual Studio Code  版本:1.50.1

        編譯PyGmail.py,需事先安裝Python 套件如下:
(1)Pyinstaller
    安裝指令: pip install pyinstaller
(2)Openpyxl
    安裝指令: pip install openpyxl

        編譯PyGmail.py
    編譯指令:pyinstaller -F PyGmail.py




資料來源:





        

2023年1月15日 星期日

找到原因了,在出納組電腦點兩下後,為何無法寄出全校教職員薪資單!


        總務處出納組每月都會在薪資入帳的當日,寄發全校教職員的薪資單。讓教職員可以核對入帳金額與薪資單金額。今天突然不能使用原本的一鍵寄送全校教職薪資單程式,而我也忘了該怎麼處理。就想到原本寫的1.只要點兩下,就能寄送全班個人成績單,可以用Python + Gmail 來批次寄送全校教職員薪資單。
        當開心地將程式放置在總務處出納組,執行該程式卻出現這樣的畫面

該畫面告訴我的訊息是 無法啟動程式,因為您的電腦遺失 api-ms-win-core-path-l1-1-0.dll請嘗試重新安裝已修正此問題。
        個性很直的我,決定針對遺失 api-ms-win-core-path-l1-1-0.dll,上網找大神處理。大神給我資料來源1.下載api-ms-win-core-path-l1-1-0.dll 。開心的是資料來源1的網頁底下,還有教學-如何安裝api-ms-win-core-path-l1-1-0.dll 文件? 只要在命令列環境下,打上 
                              regsvr32 api-ms-win-core-path-l1-1-0.dll
然後按Enter 後,大功告成。開心地按照說明執行,結果卻......
該畫面告訴我的訊息是 模組 api-ms-win-core-path-l1-1-0.dll 已經載入,但是卻找不到進入點 DllRegisterServer 。 請確定"api-ms-win-core-path-l1-1-0.dll" 為有效的DLL 或 OCX檔,然後再試一次。然不成我眼花了,再檢查資料來源1的網頁,明明適用於Windows 7   。該畫面如下:


        這下花了三個小時糾結在此,我學乖了。星期五下班時候到了,我決定先下班。
        禮拜一早上上班時,突然意識到該不會是 Python 版本問題。於是找大神問了Win7 可以下載python最高什麼版本?」。獲得的答案竟是 Python 3.8.6 版,3.9.0版就不支援 Win 7。而我用的版本剛好是 3.9.0 。於是,決定重新改用 Windows 7 x64 與 Python 3.8.0 來重新編譯。 
        接下來就開始將Windows 7 x64 安裝在VMware Player 6.0(舊版),接下來安裝Python 3.8.0  。到 https://www.python.org/downloads/release/python-380/   下載,

卻發現Python 3.8.0 無法安裝在Windows 7 x64 SP1。檢查安裝log,發現需要更新套件KB2533625。

 
因為這個套件(KB2533625)無法單獨下載,被整理在微軟彙編的更新KB4457144,其名稱為2018-09 適用於 Windows 7,x64 架構系統的每月安全性品質彙總套件 (KB4457144)。其網址如下:https://www.catalog.update.microsoft.com/Search.aspx?q=KB4457144

接下來,程式編輯器 Visual Studio Code 也需要舊版。我採用 1.50.1。在官網https://code.visualstudio.com/docs/supporting/faq#_previous-release-versions ,可以發現下載舊版的語法:
將上述語法複製貼上到網頁瀏覽器,就可以直接下載。


結語:
1.在出納組電腦點兩下後,為何無法寄出全校教職員薪資單?
   原因在出納組電腦作業系統為 Windows 7 x64 SP1,需改用Python 3.8.6 以前的版本重新編譯。
2. 目前實作,Python編譯環境如下:
(1)虛擬機:VMware Player 6.0
(2)作業系統:Windows 7 x64 SP1
(3)更新套件:KB4457144
(4)Python版本:3.8.01.
(5)Python編輯程式:Visual Studio Code  版本:1.50.1


資料來源:


2023年1月12日 星期四

只要點兩下,就能寄送全校教職員薪資單 for Windows 10 x64



        總務處出納組每月都會在薪資入帳的當日,寄發全校教職員的薪資單。讓教職員可以核對入帳金額與薪資單金額。今天突然不能使用原本的一鍵寄送全校教職薪資單程式,而我也忘了該怎麼處理。就想到原本寫的1.只要點兩下,就能寄送全班個人成績單,可以用Python + Gmail 來批次寄送全校教職員薪資單。

        目前的狀況說明與解決方案如下:
1.薪資單不用另外製作,由原本的程式就可以批次產生。
但批次產生的資料夾名稱為Mail,在Mail資料夾內的批次產生的檔案名稱規則為PayList+入賬當日+"-"+員工編號,例如員工編號11003的人員在2023年01月12日當日入帳的薪資單名稱為PayList20230112-11003。
解決方案:
(1).在專案內,建立資料夾名稱Mail,Mail內有
PayList20230112-11003.txt、PayList20230112-11005.txt、PayList20230112-11007.txt、PayList20230112-11019.txt、PayList20230112-11021.txt、PayList20230112-11022.txt等6筆測試資料。
(2).針對資料夾Mail,讓Python讀取Mail內檔案名稱。

2.需整理出一個Excel檔案,其架構為 員工編號、員工姓名、員工電郵。
那設定該Excel檔案名稱為收件者資料.xlsx。
解決方案:
(1).在專案內,內建收件者資料.xlsx,內有如上圖等6筆資料。
(2).讓Python 讀取收件者資料.xlsx。

3.由於員工請育嬰留職停薪、侍親留職停薪、進修留職停薪等不發薪水情況。
換言之,不可依收件者資料來寄信,而要依薪資單檔案的有無,來決定是否寄發。
解決方案:
(1)刪除Mail內一筆資料,設定不發薪之情況。
(2)以Mail內檔案檔名為準,來核對收件者資料.xlsx

4.要保留信件標題與內文修改的權限。
換言之,要讓承辦人員可以依需要來修改信件標題與信件內文。
解決方案:
(1).內建信件標題.txt,讓Python讀取信件標題.txt。
(2).內建信件內文.txt,讓Python讀取信件內文.txt。

5.要考慮承辦人員的異動。
換言之,要讓承辦人員可以依需要來修改寄件者的電郵與密碼。
解決方案:
(1).內建寄件者電郵與密碼.txt,讓Python讀取寄件者電郵與密碼.txt。

6.最後要知道誰的電郵沒寄。
換言之,要讓承辦人員可以檢核未寄件者的資料。
解決方案:
(1).以Mail內檔案檔名為準,來核對收件者資料.xlsx。
(2).產出未寄信者資料.txt

       現在整理目前的狀況,以一張圖來呈現:

        最後完成程式:
下載檔案。解壓密碼:demo1234
教學影片:



        以下是使用教學,共有五個步驟:
一.若沒有Gmail,請先建立自己的Gmail
二.下載程式與解壓縮
三.設定寄件者電郵與密碼
四.對著01批次寄電郵給教職員_PythonGmail.exe點兩下
        
依序如下:
一.若沒有Gmail,請先建立自己的Gmail
        一次設定





二.下載程式與解壓縮
      解壓縮時,要注意:不能破壞資料夾結構。





.設定寄件者電郵與密碼
        一次設定
        程式預設使用Gmail。若沒有Gmail,請建立Gmail。
        設定兩步驟驗證


        設定 應用程式密碼




檔案名稱:PythonGmail.py
檔案內容:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
from email.mime.image import MIMEImage
from pathlib import Path
from email.mime.application import MIMEApplication
import os
import openpyxl as opxl

class EmailOpenFiles():
    #開啟檔案
   
    def __init__(self,DirectoryName,FileName):
        self.DirectoryName = DirectoryName
        self.FileName = FileName

    def AttachFiles(self):
        #取得附件資料夾內所有檔案名稱並回傳List
        AttachDirPath=str(os.path.abspath(os.getcwd()))+'\\'+self.DirectoryName+'\\'
        AttachFileNameList = os.listdir(AttachDirPath)
        return AttachFileNameList
   
    def EmailFileContent(self):
        #設定信件內容檔名並取得檔案內容並回傳List
        EmailContentFileName = str(os.path.abspath(os.getcwd()))+"\\"+self.FileName
        EmailContentFile = open(EmailContentFileName,'r')
        EmailContentList = EmailContentFile.readlines()
        EmailContentFile.close()
        return EmailContentList
   
    def AttachDirPath(self):
        #取得附件資料夾路徑
        AttachDirPath=str(os.path.abspath(os.getcwd()))+'\\'+self.DirectoryName+'\\'
        return AttachDirPath
   
    def AttachExcelOpen(self):
        #打開附件為Excel檔案並回傳List
        AttachExcelFileName = str(os.path.abspath(os.getcwd()))+"\\"+self.FileName
        TempExcelWorkBook = opxl.load_workbook(AttachExcelFileName)
        TempMax_Row = TempExcelWorkBook.worksheets[0].max_row
        TempMax_Column = TempExcelWorkBook.worksheets[0].max_column
        TempReturnList = []
        for i in range(1,TempMax_Row+1):
            TempList = []
            for j in range(1,TempMax_Column+1):
                TempList.append(TempExcelWorkBook.worksheets[0].cell(i,j).value)
            TempReturnList.append(TempList)
        return TempReturnList

class PythonGmail():
    def __init__(self,EmailSubject,EmailFrom,EmailTo,EmailContent,EmailAttachments,EmailSender,EmailPass):
        self.EmailSubject = EmailSubject
        self.EmailFrom = EmailFrom
        self.EmailTo = EmailTo
        self.EmailContent = EmailContent
        self.EmailAttachments = EmailAttachments
        self.EmailSender = EmailSender
        self.EmailPass = EmailPass
   
    def PythonGmail(self):
        #建立MIMEMMultipart物件
        content = MIMEMultipart()
        #郵件標題
        content["subject"] = self.EmailSubject
        #寄件者Email
        content["from"] = self.EmailFrom
        #收件者Email
        content["to"] = self.EmailTo
        #郵件內容
        content.attach(MIMEText(self.EmailContent))
       
        #附件寄送檔案
        AttachFileName = self.EmailAttachments
        AttachFileload = MIMEApplication(open(AttachFileName,'rb').read())
        AttachFileload.add_header('Content-Disposition','attachment',filename=AttachFileName)
        content.attach(AttachFileload)
       
        #設定SMTP伺服器
        with smtplib.SMTP(host="smtp.gmail.com",port="587") as smtp:
            try:
                #驗證SMTP伺服器
                smtp.ehlo()
                #建立加密傳輸
                smtp.starttls()
                #登入寄件者Gmail
                #smtp.login("寄件者信箱","寄件者密碼")
                smtp.login(self.EmailSender,self.EmailPass)
                #寄送郵件
                smtp.send_message(content)
                #顯示訊息
                return "Success! Send OK!"
            except Exception as e:
                return "Error message:"+str(e)

#取得附件資料夾內所有檔案名稱
EmailAttachments = EmailOpenFiles('Mail','').AttachFiles()
#取得附件資料夾的絕對路徑
EmailAttachDirPath = EmailOpenFiles('Mail','').AttachDirPath()

#取得信件標題檔案內容並存成信件標題list
EmailSubjectlist = EmailOpenFiles('','信件標題.txt').EmailFileContent()
#從信件標題list取得信件標題字串
EmailSubject = EmailSubjectlist[0]

#取得信件內容檔案內容並存成信件內容list
EmailContentlist = EmailOpenFiles('','信件內文.txt').EmailFileContent()
#從信件內容list取得信件內容字串
EmailContent = ""
for i in EmailContentlist:
    EmailContent = EmailContent + i

#從寄件者電郵與密碼.txt取得List
EmailSenderAddrList = EmailOpenFiles('','寄件者電郵與密碼.txt').EmailFileContent()
#去除List[0]標題
EmailSenderAddrList.pop(0)
#取得寄信者email與密碼
EmailSender,EmailPass = EmailSenderAddrList[0].split(',')

#從收件者資料.xlsx 取得List
EmailToList = EmailOpenFiles('','收件者資料.xlsx').AttachExcelOpen()
#去除List[0]標題
EmailToList.pop(0)
 
#未寄信者集合 tempSet
tempSet = set()
#依現有附件資料比對收件者資料,比對成功者逐一寄信
for i in EmailToList:
    A1,A2,A3 = i
    #將該員工編號加入未寄信者集合 tempSet
    tempSet.add(int(A1))
    for j in EmailAttachments:
        if int(A1) == int(j[-9:-4]):
            #EmailTest=PythonGmail(EmailSubject,EmailSender,A3,EmailContent,EmailAttachDirPath+j,EmailSender,EmailPass).PythonGmail()
            #print(str(A1)+" "+str(A2)+" Email "+ EmailTest)
            #將未寄信者集合tempSet移除該員工編號
            tempSet.remove(int(A1))

# 將未寄信者資料寫入 未寄信者資料.txt
OutFileName = '未寄信者資料.txt'
f = open(OutFileName,'w')
for i in tempSet:
    for j in EmailToList:
        A1,A2,A3 = j
        if int(i) == int(A1):
            print(str(A1)+"  "+str(A2)+"  "+str(A3),file=f)
f.close()

os.system("pause")
os.system("exit")




資料來源:





        

Laravel 12 Model 資料庫中的資料表,並提供與資料庫互動的介面

相關系列文章: 1. 在 windows 10 安裝 laravel 12 studentManagement環境與設定 2. laravel 12 route 路由 3. laravel 12 Blade Templates 網頁模版 4. laravel 12 Control...