40823108 wcm2020

  • Home
    • Site Map
    • reveal
    • blog
  • 簡介
  • Grouping
    • 1a
  • 每周進度
    • W10-W11
    • W12-W15
    • W16-W17
  • Python程式
  • Cmsimde建立網誌方法
  • SSH教學
    • SSH Key產生
    • SSH Putty設定
  • Pelican建立Blog
  • @gm帳號建立blogger
  • VirtualBOX虛擬主機
  • scite編譯器
  • 期末報告
簡介 << 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

Copyright © All rights reserved | This template is made with by Colorlib