標籤

bat (54) 作品 (41) python (24) shell (17) windows (11) 虛擬機 (11) php (10) CPP (6) KMS (6) 程式設計 (6) docker (5) 使用教學 (5) xoops (4) 公文 (4) Apache2 (3) Excel (3) juniper (3) 資料庫 (3) 轉檔 (3) mysql (2) 免動手 (2) 資料結構 (2) 軟體廣播 (2) 電腦維修 (2) Android Studio (1) Apple IPAD管理 (1) Arduino (1) CSS (1) LAMP (1) NAS (1) Ubuntu (1) VHD (1) Windows Server (1) 原因 (1) 程式應用 (1) 程式積木 (1) 編輯器 (1) 雲端硬碟 (1)

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")




資料來源:





        

只要點兩下,就能夠將InputAndOutput資料夾底下的子子孫孫資料夾內所有Word通通轉成PDF

  系列文章: 1. 只要點兩下,就能將一堆的Doc與Docx 轉成 PDF 1. https://skjhcreator.blogspot.com/2023/05/docdocx-pdf.html 2. 只要點兩下,就能將一堆的JPG轉成一個PDF,並以JPG所在的資料夾名稱為...