簡介 <<
Previous Next >> 1a
Grouping
亂數分組:
evenGrouping.dart:
import 'dart:html';
InputElement studListUrl = querySelector("#studListUrl");
String studUrl;
// 將 Label 改為 Textarea, 避免產生過程結果嵌入所在頁面
TextAreaElement output = querySelector("#output");
main() {
querySelector("#submit").onClick.listen((e) => grouping());
}
grouping() {
output.innerHtml = "";
if (studListUrl.value != "") {
studUrl = studListUrl.value;
} else {
studUrl = 'https://mde.tw/group/downloads/2019fall_cp_1a_list.txt';
}
// 組序由 1 開始
int gth = 1;
// 迴圈序號變數
int i;
int j;
int total;
int inc;
// 每組學員暫存數列
var gpList = [];
// 全班分組數列
var group = [];
// 各組人數數列
var numList = [];
var courseTitle = 'wcm2020';
HttpRequest.getString(studUrl).then((String resp) {
// 利用 trim() 去除字串最後的跳行符號, 之後再利用 split() 根據 \n 轉為數列
var studList = resp.trim().split("\n");
// 數列利用 shuffle() 方法以隨機方法弄亂順序
studList.shuffle();
total = studList.length;
output.text += "全班總計" + total.toString() + " 人\n";
numList = getNumList(studList.length);
inc = 0;
for (i in numList){
// 列印區隔符號
output.text += '=' * 20 + "\n";
output.text += "group $gth 有 " + i.toString() + " 人: \n";
gpList = [];
for (j = 0; j < i; j++){
output.text += studList[j+inc] + "\n";
// 在各分組數列中加入將對應的學員學號
gpList.add(studList[j+inc]);
}
gth = gth + 1;
inc = inc + j;
//output.text += studList[j] + "\n";
// 逐步將各組暫存的分組數列加入全班分組數列中
gpList.sort();
group.add(gpList);
}
// 列出全班分組數列
output.text += group.toString() + "\n";
// 列出已經排序後的分組名單
output.text += '=' * 25 + "\n";
output.text += '以下為排序後的各組成員名單: \n';
gth = 1;
/*
404231
s4052
4062
s4072
4082
5072
5083
*/
// 先列出純文字以 \n 跳行組員資料
for (i=0; i < group.length; i++){
// 列印區隔符號
output.text += '=' * 20 + "\n";
output.text += "group $gth \n";
gpList = [];
for (j=0; j < group[i].length; j++){
output.text += group[i][j] + "\n";
}
gth = gth + 1;
}
gth = 1;
// 最後列出超文件以 <br\> 跳行組員資料, 包含倉儲與網站
for (i=0; i < group.length; i++){
// 列印區隔符號
output.text += '\n' + '=' * 30 + "
";
output.text += "group $gth
";
gpList = [];
for (j=0; j < group[i].length; j++){
if (group[i][j].startsWith('4052') || group[i][j].startsWith('4072')) {
output.text += "Repository: " + group[i][j] +
"" + " | Site: " + group[i][j] +
"
";
}
else {
output.text += "Repository: " + group[i][j] +
"" + " | Site: " + group[i][j] +
"
";
}
}
gth = gth + 1;
}
});
}
List getNumList(int total){
// total student number
// int total = 65;
// initial each group expect to be "eachGrp" number of people
int eachGrp = 10;
// may divide into "grpNum" number of group
int grpNum = total ~/ eachGrp;
// vacant list
var splits = [];
// find remainder when total number divid into "grpNum" number of group
int remainder = total % grpNum;
// number of people in one group by calculation
int calGrp = total ~/ grpNum;
for (int i = 0; i < grpNum; i++) {
splits.add(calGrp);
}
//print(splits);
for (int i = 0; i < remainder; i++) {
splits[i] += 1;
}
//print(splits);
return splits;
}
index.html:
URL:
style.css:
body {
color: white;
font-size: 20px;
}
input, select, textarea {
font-size: 100%;
}
get_student.py:
from flask import Flask, request
from flask_cors import CORS
import requests
import bs4
import ssl
'''
https://s1.mde.nfu.edu.tw:7443/?semester=1082&courseno=0767
cd
2a 1082/0767
2b 1082/0780
2a 1072/0777
2b 1072/0790
2a 1062/0788
2a 1062/0802
wcm
1082/0744
1072/0754
1062/0765
wcmj
1082/2418
'''
app = Flask(__name__)
CORS(app)
@app.route('/studlist')
@app.route('/')
def studlist():
semester = request.args.get('semester')
courseno = request.args.get('courseno')
if semester == None:
semester = '1082'
if courseno == None:
courseno = '0744'
url = 'https://osa.nfu.edu.tw/query/studlist_ajax.php'
post_var = {'pselyr': semester, 'pseqno': courseno}
result = requests.post(url, data = post_var)
soup = bs4.BeautifulSoup(result.content, 'lxml')
table = soup.find('table', {'class': 'tbcls'})
data = []
rows = table.find_all('tr')
for row in rows:
cols = row.find_all('td')
cols = [ele.text.strip() for ele in cols]
data.append([ele for ele in cols if ele]) # Get rid of empty values
output = ""
for i in data[2:]:
#print(i[0])
output +=i[0] + "\n"
return output
#return str(pselyr) + " + " +str(pseqno)
# 即使在近端仍希望以 https 模式下執行
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.load_cert_chain('localhost.crt', 'localhost.key')
# 取 flaskapp.py 中的 uwsgi 變數設定
uwsgi = False
if uwsgi:
# 表示程式在雲端執行
application = app
else:
# 表示在近端執行, 以 python3 wsgi.py 執行
app.run(host='127.0.0.1', port=5443, debug=True, ssl_context=context)
nginx sites-available/default settings:
server {
listen 8000;
server_name s1.mde.nfu.edu.tw;
charset utf-8;
listen 7443 ssl;
location /static {
alias /home/kmol2019/course_studlist/static/;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8087;
}
ssl_certificate /etc/stunnel/localhost.crt;
ssl_certificate_key /etc/stunnel/localhost.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;
try_files $uri $uri/ =404;
}
uwsgi7.ini:
[uwsgi]
socket = 127.0.0.1:8087
uid = kmol2019
gid = kmol2019
plugins-dir = /usr/lib/uwsgi/plugins/
plugin = python3
master = true
logto = /var/log/uwsgi/emperor.log
logfile-chown = kmol2019:kmol2019
processes = 4
threads = 2
chdir = /home/kmol2019/course_studlist
wsgi-file = /home/kmol2019/course_studlist/get_student.py
/etc/systemd/system/cmsimfly.service:
[Unit]
Description=uWSGI to serve CMSimfly
After=network.target
[Service]
User=kmol2019
Group=kmol2019
WorkingDirectory=/home/kmol2019/uwsgi_ini
ExecStart=/usr/local/bin/uwsgi --emperor /home/kmol2019/uwsgi_ini
[Install]
WantedBy=multi-user.target
簡介 <<
Previous Next >> 1a